Skip to content

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

Merged
cryptodev-2s merged 44 commits intomainfrom
feat/messenger-generate-action-types-package
Apr 1, 2026
Merged

feat(messenger): add generate-action-types CLI tool as subpath export#8264
cryptodev-2s merged 44 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 it touches many packages and changes the action-type generation pipeline; failures would surface as broken scripts or mismatched generated files across the monorepo.

Overview
Adds a new @metamask/messenger codegen CLI (messenger-generate-action-types) that discovers controllers/services with MESSENGER_EXPOSED_METHODS and supports --fix and --check workflows, including optional ESLint formatting and extensive unit/functional tests.

Migrates dozens of packages’ generate-method-action-types scripts to call the new CLI entrypoint, deletes the legacy scripts/generate-method-action-types.ts, and updates generated *-method-action-types.ts outputs (header/JSDoc normalization and some regenerated action unions). Also updates repo config to support the new tooling (ESLint rule exception for the generator folder and Jest module mapping for @metamask/utils/node).

Written by Cursor Bugbot for commit ca19d18. 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
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

@cryptodev-2s cryptodev-2s enabled auto-merge April 1, 2026 09:25
Allow consumers on TypeScript 5.x beyond 5.3 while keeping devDependency pinned.
@cryptodev-2s cryptodev-2s requested a review from Mrtenz April 1, 2026 09:29
@cryptodev-2s cryptodev-2s added this pull request to the merge queue Apr 1, 2026
Merged via the queue into main with commit 7f0ee6b Apr 1, 2026
332 checks passed
@cryptodev-2s cryptodev-2s deleted the feat/messenger-generate-action-types-package branch April 1, 2026 09:56
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.

5 participants