Skip to content

feat(messenger): add generate-action-types CLI tool as subpath export#8264

Open
cryptodev-2s wants to merge 43 commits intomainfrom
feat/messenger-generate-action-types-package
Open

feat(messenger): add generate-action-types CLI tool as subpath export#8264
cryptodev-2s wants to merge 43 commits intomainfrom
feat/messenger-generate-action-types-package

Conversation

@cryptodev-2s
Copy link
Copy Markdown
Contributor

@cryptodev-2s cryptodev-2s commented Mar 20, 2026

Explanation

The script scripts/generate-method-action-types.ts generates TypeScript action type files for controllers/services that define MESSENGER_EXPOSED_METHODS. It was a monorepo-local script invoked via tsx ../../scripts/generate-method-action-types.ts from 44 packages.

This PR moves it into @metamask/messenger as a CLI tool, keeping the library lightweight while making the codegen reusable in other repositories.

What changed:

  • Add generate-action-types/ subdirectory under packages/messenger/src/ with modular source files (parse-source.ts, generate-content.ts, check.ts, fix.ts, cli.ts)
  • Add messenger-generate-action-types bin entry to @metamask/messenger
  • yargs is the only runtime dependency; @metamask/utils, typescript, and eslint are non-optional peer dependencies (required for the CLI, but provided by the consuming project). The core Messenger library remains lightweight.
  • Recursive directory search discovers controllers/services in subdirectories automatically, removing the need for per-subdirectory scripts
  • Update all 44 consuming packages to invoke the CLI via tsx ../../packages/messenger/src/generate-action-types/cli.ts
  • Delete old scripts/generate-method-action-types.ts
  • Functional tests via execa + tsx verify exact generated output for controllers and services

Working examples in external repos:

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Mostly build/tooling changes, but they touch many packages’ codegen scripts and regenerate action-type output, so CI/build consistency could break if the new CLI behavior diverges from the old script.

Overview
Introduces a new packages/messenger/src/generate-action-types CLI (published as messenger-generate-action-types) that discovers MESSENGER_EXPOSED_METHODS, generates *-method-action-types.ts, and supports --fix/--check with optional ESLint formatting.

Migrates all packages’ generate-method-action-types scripts from the deleted root scripts/generate-method-action-types.ts to the new messenger CLI, and adjusts repo config to support it (ESLint override for the new directory, Jest mapper for @metamask/utils/node, messenger deps/peers, and coverage ignore for cli.ts).

Regenerates/updates a few generated action-type files (e.g., PerpsController adds the auto-generated header, backtick type literals, and additional exposed actions; minor doc tweaks in other generated files).

Written by Cursor Bugbot for commit 16512b7. This will update automatically on new commits. Configure here.

@cryptodev-2s cryptodev-2s changed the title feat: create @metamask/messenger-generate-action-types package feat(messenger): add generate-action-types CLI tool as subpath export Mar 20, 2026
@cryptodev-2s
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@5.0.1-preview-f11c28cc2
@metamask-previews/accounts-controller@37.0.0-preview-f11c28cc2
@metamask-previews/address-book-controller@7.1.0-preview-f11c28cc2
@metamask-previews/ai-controllers@0.4.0-preview-f11c28cc2
@metamask-previews/analytics-controller@1.0.0-preview-f11c28cc2
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-f11c28cc2
@metamask-previews/announcement-controller@8.0.0-preview-f11c28cc2
@metamask-previews/app-metadata-controller@2.0.0-preview-f11c28cc2
@metamask-previews/approval-controller@9.0.0-preview-f11c28cc2
@metamask-previews/assets-controller@3.0.0-preview-f11c28cc2
@metamask-previews/assets-controllers@101.0.1-preview-f11c28cc2
@metamask-previews/base-controller@9.0.0-preview-f11c28cc2
@metamask-previews/base-data-service@0.0.0-preview-f11c28cc2
@metamask-previews/bridge-controller@69.1.1-preview-f11c28cc2
@metamask-previews/bridge-status-controller@70.0.0-preview-f11c28cc2
@metamask-previews/build-utils@3.0.4-preview-f11c28cc2
@metamask-previews/chain-agnostic-permission@1.4.0-preview-f11c28cc2
@metamask-previews/claims-controller@0.4.3-preview-f11c28cc2
@metamask-previews/client-controller@1.0.0-preview-f11c28cc2
@metamask-previews/compliance-controller@1.0.1-preview-f11c28cc2
@metamask-previews/composable-controller@12.0.0-preview-f11c28cc2
@metamask-previews/config-registry-controller@0.1.1-preview-f11c28cc2
@metamask-previews/connectivity-controller@0.1.0-preview-f11c28cc2
@metamask-previews/controller-utils@11.19.0-preview-f11c28cc2
@metamask-previews/core-backend@6.2.0-preview-f11c28cc2
@metamask-previews/delegation-controller@2.0.2-preview-f11c28cc2
@metamask-previews/earn-controller@11.1.2-preview-f11c28cc2
@metamask-previews/eip-5792-middleware@3.0.1-preview-f11c28cc2
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-f11c28cc2
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-f11c28cc2
@metamask-previews/ens-controller@19.1.0-preview-f11c28cc2
@metamask-previews/error-reporting-service@3.0.1-preview-f11c28cc2
@metamask-previews/eth-block-tracker@15.0.1-preview-f11c28cc2
@metamask-previews/eth-json-rpc-middleware@23.1.0-preview-f11c28cc2
@metamask-previews/eth-json-rpc-provider@6.0.0-preview-f11c28cc2
@metamask-previews/foundryup@1.0.1-preview-f11c28cc2
@metamask-previews/gas-fee-controller@26.1.0-preview-f11c28cc2
@metamask-previews/gator-permissions-controller@2.1.1-preview-f11c28cc2
@metamask-previews/geolocation-controller@0.1.1-preview-f11c28cc2
@metamask-previews/json-rpc-engine@10.2.3-preview-f11c28cc2
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-f11c28cc2
@metamask-previews/keyring-controller@25.1.0-preview-f11c28cc2
@metamask-previews/logging-controller@8.0.0-preview-f11c28cc2
@metamask-previews/message-manager@14.1.0-preview-f11c28cc2
@metamask-previews/messenger@0.3.0-preview-f11c28cc2
@metamask-previews/multichain-account-service@7.1.0-preview-f11c28cc2
@metamask-previews/multichain-api-middleware@1.2.7-preview-f11c28cc2
@metamask-previews/multichain-network-controller@3.0.5-preview-f11c28cc2
@metamask-previews/multichain-transactions-controller@7.0.2-preview-f11c28cc2
@metamask-previews/name-controller@9.1.0-preview-f11c28cc2
@metamask-previews/network-controller@30.0.0-preview-f11c28cc2
@metamask-previews/network-enablement-controller@5.0.0-preview-f11c28cc2
@metamask-previews/notification-services-controller@23.0.0-preview-f11c28cc2
@metamask-previews/permission-controller@12.2.1-preview-f11c28cc2
@metamask-previews/permission-log-controller@5.0.0-preview-f11c28cc2
@metamask-previews/perps-controller@1.3.0-preview-f11c28cc2
@metamask-previews/phishing-controller@17.0.0-preview-f11c28cc2
@metamask-previews/polling-controller@16.0.3-preview-f11c28cc2
@metamask-previews/preferences-controller@23.0.0-preview-f11c28cc2
@metamask-previews/profile-metrics-controller@3.1.1-preview-f11c28cc2
@metamask-previews/profile-sync-controller@28.0.0-preview-f11c28cc2
@metamask-previews/ramps-controller@12.0.0-preview-f11c28cc2
@metamask-previews/rate-limit-controller@7.0.0-preview-f11c28cc2
@metamask-previews/react-data-query@0.0.0-preview-f11c28cc2
@metamask-previews/remote-feature-flag-controller@4.1.0-preview-f11c28cc2
@metamask-previews/sample-controllers@4.0.3-preview-f11c28cc2
@metamask-previews/seedless-onboarding-controller@9.0.0-preview-f11c28cc2
@metamask-previews/selected-network-controller@26.0.3-preview-f11c28cc2
@metamask-previews/shield-controller@5.0.2-preview-f11c28cc2
@metamask-previews/signature-controller@39.1.0-preview-f11c28cc2
@metamask-previews/storage-service@1.0.0-preview-f11c28cc2
@metamask-previews/subscription-controller@6.0.2-preview-f11c28cc2
@metamask-previews/transaction-controller@63.0.0-preview-f11c28cc2
@metamask-previews/transaction-pay-controller@18.0.0-preview-f11c28cc2
@metamask-previews/user-operation-controller@41.1.0-preview-f11c28cc2

Extract `scripts/generate-method-action-types.ts` into a publishable
CLI package so it can be reused across repositories.

- Scaffold `@metamask/messenger-generate-action-types` with bin entry
- Split script into modular source files (parse, generate, check, fix)
- Use named TypeScript imports, optional ESLint peer dependency
- Update 44 consuming packages to use the new binary
- Update package template, CODEOWNERS, teams.json, eslint config
- Add ESLint config exception for Node.js module imports
- Regenerate all action type files with updated header
- Delete old `scripts/generate-method-action-types.ts`
The binary requires a build step before it can be used. Using tsx
to run the source TypeScript directly avoids this dependency.
Move the CLI tool into @metamask/messenger as a subpath export
instead of a separate package. This keeps the library lightweight
while making the codegen available via optional peer dependencies.

- Move source files to packages/messenger/src/generate-action-types/
- Add ./generate-action-types subpath export and bin entry
- typescript, yargs, eslint are optional peerDependencies
- @metamask/utils added as dependency (needed by codegen)
- Remove standalone @metamask/messenger-generate-action-types package
- Update 44 consuming packages to point to new location
- Revert CODEOWNERS, teams.json, tsconfig, README changes
- Remove unused `MethodInfo.signature` field
- Remove redundant `ControllerInfo.exposedMethods` (derivable from methods)
- Extract shared ESLint types to `types.ts`, deduplicate across check/fix
- Combine eslint/eslintStatic params into single `ESLint | null` object
- Inline single-use `capitalize()` helper
- Remove unused `Identifier` type import and `extractMethodSignature`
@cryptodev-2s cryptodev-2s force-pushed the feat/messenger-generate-action-types-package branch from 89da66f to 0202e79 Compare March 23, 2026 18:35
@cryptodev-2s cryptodev-2s self-assigned this Mar 23, 2026
@cryptodev-2s cryptodev-2s marked this pull request as ready for review March 23, 2026 18:50
@cryptodev-2s cryptodev-2s requested review from a team as code owners March 23, 2026 18:50
Per review feedback:
- yargs: moved to dependencies (runtime dep of the CLI)
- typescript, eslint, @metamask/utils: non-optional peerDependencies
  (required for the CLI to work, but provided by the consuming project)
- Removed peerDependenciesMeta (no optional peers remaining)
@cryptodev-2s cryptodev-2s requested a review from mcmire March 25, 2026 13:44
Copy link
Copy Markdown
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Almost there! Left some more comments, mostly minor.

if (hasErrors) {
console.error('\n💥 Some action type files are out of date or missing.');
console.error(
'Run `yarn generate-method-action-types --fix` to update them.',
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this command need to be updated?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That`s the root package.json script, do you prefer to rename it ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm just thinking that if people are running the CLI in a different project (not within core) then yarn generate-method-action-types won't work. They'd have to run yarn messenger-generate-action-types instead.

Maybe we can capture the name of the script in cli.ts and pass it down so we can use it here? The name of the script is usually present as the first or second item in the process.argv array.

@cryptodev-2s cryptodev-2s requested review from a team as code owners March 31, 2026 09:24
Move `@metamask/utils` from peerDependencies to dependencies in the
messenger package since it is a required runtime dependency. Also
replace `globalThis.process.exitCode` with `process.exitCode` to
fix an ESLint violation.
Apply the same ESLint fix as in fix.ts — use `process.exitCode`
directly instead of `globalThis.process.exitCode`.
Already listed under dependencies, so the devDependencies entry
is redundant.
…perps action types

Update base-data-service and phishing-controller to point their
generate-method-action-types script at the new messenger CLI.
Regenerate PerpsController action types to reflect current API.
@cryptodev-2s cryptodev-2s requested a review from a team as a code owner March 31, 2026 10:36
…ion-types tests

Replace manual mkdtemp/rm temp directory management with the
createSandbox utility from @metamask/utils/node across all 4 test
files. Add @metamask/utils/node subpath mapping to the shared
jest.config.packages.js so all packages can resolve it.
Return boolean from checkActionTypesFiles and generateAllActionTypesFiles
instead of setting process.exitCode directly. Only cli.ts now sets the
exit code, keeping the global side effect in a single location.
Replace the wrapped outputFixes/getErrorResults functions with an
eslintClass reference so callers use the static methods directly,
making it clear these are class-level operations.
@cryptodev-2s cryptodev-2s requested a review from mcmire March 31, 2026 11:40
… load failure

Add directory exclusions (node_modules, dist, .git, coverage) to the
recursive file walker to avoid traversing irrelevant trees. Also log
a warning when ESLint fails to load instead of silently skipping
formatting.
Copy link
Copy Markdown

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

console.error('\n💥 Some action type files are out of date or missing.');
console.error(
'Run `yarn generate-method-action-types --fix` to update them.',
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CLI suggests wrong fix command

Low Severity

checkActionTypesFiles always prints yarn generate-method-action-types --fix after failures. When users run the published binary messenger-generate-action-types, that command often does not exist, so the CLI points them to a non-working recovery path.

Fix in Cursor Fix in Web

@cryptodev-2s
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-16512b784
@metamask-previews/accounts-controller@37.1.1-preview-16512b784
@metamask-previews/address-book-controller@7.1.1-preview-16512b784
@metamask-previews/ai-controllers@0.6.3-preview-16512b784
@metamask-previews/analytics-controller@1.0.1-preview-16512b784
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-16512b784
@metamask-previews/announcement-controller@8.1.0-preview-16512b784
@metamask-previews/app-metadata-controller@2.0.1-preview-16512b784
@metamask-previews/approval-controller@9.0.1-preview-16512b784
@metamask-previews/assets-controller@3.2.1-preview-16512b784
@metamask-previews/assets-controllers@103.0.0-preview-16512b784
@metamask-previews/base-controller@9.0.1-preview-16512b784
@metamask-previews/base-data-service@0.1.1-preview-16512b784
@metamask-previews/bridge-controller@70.0.0-preview-16512b784
@metamask-previews/bridge-status-controller@70.0.4-preview-16512b784
@metamask-previews/build-utils@3.0.4-preview-16512b784
@metamask-previews/chain-agnostic-permission@1.5.0-preview-16512b784
@metamask-previews/claims-controller@0.5.0-preview-16512b784
@metamask-previews/client-controller@1.0.1-preview-16512b784
@metamask-previews/compliance-controller@1.0.2-preview-16512b784
@metamask-previews/composable-controller@12.0.1-preview-16512b784
@metamask-previews/config-registry-controller@0.2.0-preview-16512b784
@metamask-previews/connectivity-controller@0.2.0-preview-16512b784
@metamask-previews/controller-utils@11.20.0-preview-16512b784
@metamask-previews/core-backend@6.2.1-preview-16512b784
@metamask-previews/delegation-controller@2.1.0-preview-16512b784
@metamask-previews/earn-controller@11.2.1-preview-16512b784
@metamask-previews/eip-5792-middleware@3.0.2-preview-16512b784
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-16512b784
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-16512b784
@metamask-previews/ens-controller@19.1.1-preview-16512b784
@metamask-previews/eth-block-tracker@15.0.1-preview-16512b784
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-16512b784
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-16512b784
@metamask-previews/foundryup@1.0.1-preview-16512b784
@metamask-previews/gas-fee-controller@26.1.1-preview-16512b784
@metamask-previews/gator-permissions-controller@3.0.0-preview-16512b784
@metamask-previews/geolocation-controller@0.1.2-preview-16512b784
@metamask-previews/json-rpc-engine@10.2.4-preview-16512b784
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-16512b784
@metamask-previews/keyring-controller@25.1.1-preview-16512b784
@metamask-previews/logging-controller@8.0.1-preview-16512b784
@metamask-previews/message-manager@14.1.1-preview-16512b784
@metamask-previews/messenger@1.0.0-preview-16512b784
@metamask-previews/multichain-account-service@8.0.1-preview-16512b784
@metamask-previews/multichain-api-middleware@2.0.0-preview-16512b784
@metamask-previews/multichain-network-controller@3.0.6-preview-16512b784
@metamask-previews/multichain-transactions-controller@7.0.4-preview-16512b784
@metamask-previews/name-controller@9.1.1-preview-16512b784
@metamask-previews/network-controller@30.0.1-preview-16512b784
@metamask-previews/network-enablement-controller@5.0.1-preview-16512b784
@metamask-previews/notification-services-controller@23.0.1-preview-16512b784
@metamask-previews/permission-controller@12.3.0-preview-16512b784
@metamask-previews/permission-log-controller@5.1.0-preview-16512b784
@metamask-previews/perps-controller@2.0.0-preview-16512b784
@metamask-previews/phishing-controller@17.1.0-preview-16512b784
@metamask-previews/polling-controller@16.0.4-preview-16512b784
@metamask-previews/preferences-controller@23.1.0-preview-16512b784
@metamask-previews/profile-metrics-controller@3.1.2-preview-16512b784
@metamask-previews/profile-sync-controller@28.0.2-preview-16512b784
@metamask-previews/ramps-controller@12.1.0-preview-16512b784
@metamask-previews/rate-limit-controller@7.0.1-preview-16512b784
@metamask-previews/react-data-query@0.2.0-preview-16512b784
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-16512b784
@metamask-previews/sample-controllers@4.0.4-preview-16512b784
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-16512b784
@metamask-previews/selected-network-controller@26.1.0-preview-16512b784
@metamask-previews/shield-controller@5.1.0-preview-16512b784
@metamask-previews/signature-controller@39.1.2-preview-16512b784
@metamask-previews/social-controllers@0.0.0-preview-16512b784
@metamask-previews/storage-service@1.0.1-preview-16512b784
@metamask-previews/subscription-controller@6.1.1-preview-16512b784
@metamask-previews/transaction-controller@63.3.1-preview-16512b784
@metamask-previews/transaction-pay-controller@19.0.1-preview-16512b784
@metamask-previews/user-operation-controller@41.1.1-preview-16512b784

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants