From a6936c4863e4a78eef692eb6b9a3b2562c62ec4c Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Wed, 15 Jul 2026 11:32:53 -0600 Subject: [PATCH] Manage codeowners programmatically (and regenerate) At the time of writing we have 97 (!!) packages in this monorepo, which are owned by various teams across MetaMask. However, managing codeownership via the CODEOWNERS file is tedious and error-prone. We do use Yarn constraints to ensure that each package is configured in CODEOWNERS correctly, so that helps. However, in a future commit, we would like to update the set of per-package files that are owned by Core Platform to include more than just `package.json` and `CHANGELOG`, and at the moment, we need to do that manually; Yarn constraints won't allow us to automatically apply those updates. To address this problem, this commit redefines `CODEOWNERS` as a TypeScript file (`codeowners.ts` in the root) and adds a script to generate CODEOWNERS from this file. The script also comes with a `check` command which is plugged into the lint pipeline to ensure that CODEOWNERS is always up to date. The primary "feature" of `codeowners.ts` is that it contains a configuration object which maps of teams to packages that are owned by those teams (along with some other metadata). Ideally, when a new package is added, all a team needs to do is update this map and then the appropriate codeowner rules will be automatically added to support that package. To ensure minimal changes between the current version of CODEOWNERS and the new version in this PR, we needed to make some compromises, and `codeowners.ts` is not as dynamic or simple as it could be. We plan on making further changes in the future to make it more useful. --- .github/CODEOWNERS | 472 ++++++++--------- .github/workflows/lint-build-test.yml | 7 +- codeowners.ts | 718 ++++++++++++++++++++++++++ package.json | 6 +- scripts/manage-codeowners.ts | 8 + scripts/manage-codeowners/main.ts | 108 ++++ scripts/manage-codeowners/types.ts | 32 ++ tsconfig.json | 8 +- 8 files changed, 1117 insertions(+), 242 deletions(-) create mode 100644 codeowners.ts create mode 100755 scripts/manage-codeowners.ts create mode 100644 scripts/manage-codeowners/main.ts create mode 100644 scripts/manage-codeowners/types.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 49f39f1ce08..1efface82ad 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,279 +4,279 @@ # Note: Please keep this synchronized with the `teams.json` file in the repository root. # That file is used for some automated workflows, and maps controller to owning team(s). -/.github/ @MetaMask/core-platform +/.github/ @MetaMask/core-platform ## Accounts Team -/packages/accounts-controller @MetaMask/accounts-engineers -/packages/multichain-transactions-controller @MetaMask/accounts-engineers -/packages/multichain-account-service @MetaMask/accounts-engineers -/packages/account-tree-controller @MetaMask/accounts-engineers -/packages/profile-sync-controller @MetaMask/accounts-engineers -/packages/money-account-controller @MetaMask/accounts-engineers -/packages/snap-account-service @MetaMask/accounts-engineers +/packages/accounts-controller @MetaMask/accounts-engineers +/packages/multichain-transactions-controller @MetaMask/accounts-engineers +/packages/multichain-account-service @MetaMask/accounts-engineers +/packages/account-tree-controller @MetaMask/accounts-engineers +/packages/profile-sync-controller @MetaMask/accounts-engineers +/packages/money-account-controller @MetaMask/accounts-engineers +/packages/snap-account-service @MetaMask/accounts-engineers ## Auth Team -/packages/authenticated-user-storage @MetaMask/auth-engineers +/packages/authenticated-user-storage @MetaMask/auth-engineers ## Assets Team -/packages/assets-controllers @MetaMask/metamask-assets -/packages/network-enablement-controller @MetaMask/metamask-assets -/packages/assets-controller @MetaMask/metamask-assets +/packages/assets-controllers @MetaMask/metamask-assets +/packages/network-enablement-controller @MetaMask/metamask-assets +/packages/assets-controller @MetaMask/metamask-assets ## Confirmations Team -/packages/address-book-controller @MetaMask/confirmations -/packages/approval-controller @MetaMask/confirmations -/packages/ens-controller @MetaMask/confirmations -/packages/gas-fee-controller @MetaMask/confirmations -/packages/logging-controller @MetaMask/confirmations -/packages/message-manager @MetaMask/confirmations -/packages/name-controller @MetaMask/confirmations -/packages/signature-controller @MetaMask/confirmations -/packages/transaction-controller @MetaMask/confirmations -/packages/transaction-pay-controller @MetaMask/confirmations -/packages/user-operation-controller @MetaMask/confirmations +/packages/address-book-controller @MetaMask/confirmations +/packages/approval-controller @MetaMask/confirmations +/packages/ens-controller @MetaMask/confirmations +/packages/gas-fee-controller @MetaMask/confirmations +/packages/logging-controller @MetaMask/confirmations +/packages/message-manager @MetaMask/confirmations +/packages/name-controller @MetaMask/confirmations +/packages/signature-controller @MetaMask/confirmations +/packages/transaction-controller @MetaMask/confirmations +/packages/transaction-pay-controller @MetaMask/confirmations +/packages/user-operation-controller @MetaMask/confirmations ## Transactions Team -/packages/smart-transactions-controller @MetaMask/transactions +/packages/smart-transactions-controller @MetaMask/transactions ## Delegation Team -/packages/delegation-controller @MetaMask/delegation -/packages/gator-permissions-controller @MetaMask/delegation -/packages/eip-7702-internal-rpc-middleware @MetaMask/delegation @MetaMask/core-platform +/packages/delegation-controller @MetaMask/delegation +/packages/gator-permissions-controller @MetaMask/delegation +/packages/eip-7702-internal-rpc-middleware @MetaMask/delegation @MetaMask/core-platform ## Earn Team -/packages/earn-controller @MetaMask/earn -/packages/money-account-balance-service @MetaMask/earn -/packages/money-account-api-data-service @MetaMask/earn -/packages/chomp-api-service @MetaMask/earn @MetaMask/delegation -/packages/money-account-upgrade-controller @MetaMask/earn @MetaMask/delegation +/packages/earn-controller @MetaMask/earn +/packages/money-account-balance-service @MetaMask/earn +/packages/money-account-api-data-service @MetaMask/earn +/packages/chomp-api-service @MetaMask/earn @MetaMask/delegation +/packages/money-account-upgrade-controller @MetaMask/earn @MetaMask/delegation ## Social AI Team -/packages/ai-controllers @MetaMask/social-ai -/packages/social-controllers @MetaMask/social-ai +/packages/ai-controllers @MetaMask/social-ai +/packages/social-controllers @MetaMask/social-ai ## Money Movement Team -/packages/ramps-controller @MetaMask/money-movement +/packages/ramps-controller @MetaMask/money-movement ## Networks Team -/packages/config-registry-controller @MetaMask/networks +/packages/config-registry-controller @MetaMask/networks ## Engagement Team -/packages/notification-services-controller @MetaMask/engagement +/packages/notification-services-controller @MetaMask/engagement ## Perps Team -/packages/compliance-controller @MetaMask/perps -/packages/perps-controller @MetaMask/perps +/packages/compliance-controller @MetaMask/perps +/packages/perps-controller @MetaMask/perps ## Product Safety Team -/packages/phishing-controller @MetaMask/product-safety +/packages/phishing-controller @MetaMask/product-safety ## Swaps-Bridge Team -/packages/bridge-controller @MetaMask/swaps-engineers -/packages/bridge-status-controller @MetaMask/swaps-engineers +/packages/bridge-controller @MetaMask/swaps-engineers +/packages/bridge-status-controller @MetaMask/swaps-engineers ## Mobile Platform Team -/packages/app-metadata-controller @MetaMask/mobile-platform -/packages/analytics-controller @MetaMask/mobile-platform @MetaMask/extension-platform -/packages/analytics-data-regulation-controller @MetaMask/mobile-platform @MetaMask/extension-platform -/packages/geolocation-controller @MetaMask/mobile-platform +/packages/app-metadata-controller @MetaMask/mobile-platform +/packages/analytics-controller @MetaMask/mobile-platform @MetaMask/extension-platform +/packages/analytics-data-regulation-controller @MetaMask/mobile-platform @MetaMask/extension-platform +/packages/geolocation-controller @MetaMask/mobile-platform ## Core Platform Team -/packages/base-controller @MetaMask/core-platform -/packages/base-data-service @MetaMask/core-platform -/packages/build-utils @MetaMask/core-platform -/packages/chain-agnostic-permission @MetaMask/core-platform -/packages/composable-controller @MetaMask/core-platform -/packages/connectivity-controller @MetaMask/core-platform -/packages/controller-utils @MetaMask/core-platform -/packages/eip-5792-middleware @MetaMask/core-platform -/packages/eip1193-permission-middleware @MetaMask/core-platform -/packages/eth-block-tracker @MetaMask/core-platform -/packages/eth-json-rpc-middleware @MetaMask/core-platform -/packages/eth-json-rpc-provider @MetaMask/core-platform -/packages/json-rpc-engine @MetaMask/core-platform -/packages/json-rpc-middleware-stream @MetaMask/core-platform -/packages/messenger @MetaMask/core-platform -/packages/messenger-cli @MetaMask/core-platform -/packages/multichain-api-middleware @MetaMask/core-platform -/packages/network-connection-banner-controller @MetaMask/core-platform -/packages/permission-controller @MetaMask/core-platform -/packages/permission-log-controller @MetaMask/core-platform -/packages/platform-api-docs @MetaMask/core-platform -/packages/polling-controller @MetaMask/core-platform -/packages/preferences-controller @MetaMask/core-platform -/packages/rate-limit-controller @MetaMask/core-platform -/packages/react-data-query @MetaMask/core-platform -/packages/sample-controllers @MetaMask/core-platform -/packages/selected-network-controller @MetaMask/core-platform -/packages/wallet @MetaMask/core-platform -/packages/wallet-cli @MetaMask/core-platform @MetaMask/ocap-kernel -/packages/wallet-framework-docs @MetaMask/core-platform +/packages/base-controller @MetaMask/core-platform +/packages/base-data-service @MetaMask/core-platform +/packages/build-utils @MetaMask/core-platform +/packages/chain-agnostic-permission @MetaMask/core-platform +/packages/composable-controller @MetaMask/core-platform +/packages/connectivity-controller @MetaMask/core-platform +/packages/controller-utils @MetaMask/core-platform +/packages/eip-5792-middleware @MetaMask/core-platform +/packages/eip1193-permission-middleware @MetaMask/core-platform +/packages/eth-block-tracker @MetaMask/core-platform +/packages/eth-json-rpc-middleware @MetaMask/core-platform +/packages/eth-json-rpc-provider @MetaMask/core-platform +/packages/json-rpc-engine @MetaMask/core-platform +/packages/json-rpc-middleware-stream @MetaMask/core-platform +/packages/messenger @MetaMask/core-platform +/packages/messenger-cli @MetaMask/core-platform +/packages/multichain-api-middleware @MetaMask/core-platform +/packages/network-connection-banner-controller @MetaMask/core-platform +/packages/permission-controller @MetaMask/core-platform +/packages/permission-log-controller @MetaMask/core-platform +/packages/platform-api-docs @MetaMask/core-platform +/packages/polling-controller @MetaMask/core-platform +/packages/preferences-controller @MetaMask/core-platform +/packages/rate-limit-controller @MetaMask/core-platform +/packages/react-data-query @MetaMask/core-platform +/packages/sample-controllers @MetaMask/core-platform +/packages/selected-network-controller @MetaMask/core-platform +/packages/wallet @MetaMask/core-platform +/packages/wallet-cli @MetaMask/core-platform @MetaMask/ocap-kernel +/packages/wallet-framework-docs @MetaMask/core-platform ## Web3Auth Team -/packages/seedless-onboarding-controller @MetaMask/web3auth -/packages/passkey-controller @MetaMask/web3auth -/packages/shield-controller @MetaMask/web3auth -/packages/subscription-controller @MetaMask/web3auth -/packages/claims-controller @MetaMask/web3auth +/packages/seedless-onboarding-controller @MetaMask/web3auth +/packages/passkey-controller @MetaMask/web3auth +/packages/shield-controller @MetaMask/web3auth +/packages/subscription-controller @MetaMask/web3auth +/packages/claims-controller @MetaMask/web3auth ## Joint team ownership -/packages/announcement-controller @MetaMask/core-extension-ux @MetaMask/mobile-core-ux -/packages/client-utils @MetaMask/core-extension-ux @MetaMask/mobile-core-ux -/packages/core-backend @MetaMask/core-platform @MetaMask/metamask-assets -/packages/eth-json-rpc-middleware/src/methods @MetaMask/confirmations @MetaMask/core-platform -/packages/eth-json-rpc-middleware/src/wallet.* @MetaMask/confirmations @MetaMask/core-platform -/packages/foundryup @MetaMask/mobile-platform @MetaMask/extension-platform -/packages/bitcoin-regtest-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks -/packages/java-tron-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks -/packages/local-node-utils @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks -/packages/solana-test-validator-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks -/packages/stellar-quickstart-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks -/packages/keyring-controller @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/multichain-network-controller @MetaMask/core-platform @MetaMask/accounts-engineers @MetaMask/metamask-assets -/packages/network-controller @MetaMask/core-platform @MetaMask/metamask-assets -/packages/remote-feature-flag-controller @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/sentinel-api-service @MetaMask/confirmations @MetaMask/transactions -/packages/storage-service @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/client-controller @MetaMask/core-platform @MetaMask/extension-platform @MetaMask/mobile-platform -/packages/profile-metrics-controller @MetaMask/mobile-platform @MetaMask/extension-platform +/packages/announcement-controller @MetaMask/core-extension-ux @MetaMask/mobile-core-ux +/packages/client-utils @MetaMask/core-extension-ux @MetaMask/mobile-core-ux +/packages/core-backend @MetaMask/core-platform @MetaMask/metamask-assets +/packages/eth-json-rpc-middleware/src/methods @MetaMask/confirmations @MetaMask/core-platform +/packages/eth-json-rpc-middleware/src/wallet.* @MetaMask/confirmations @MetaMask/core-platform +/packages/foundryup @MetaMask/mobile-platform @MetaMask/extension-platform +/packages/bitcoin-regtest-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks +/packages/java-tron-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks +/packages/local-node-utils @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks +/packages/solana-test-validator-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks +/packages/stellar-quickstart-up @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks +/packages/keyring-controller @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/multichain-network-controller @MetaMask/core-platform @MetaMask/accounts-engineers @MetaMask/metamask-assets +/packages/network-controller @MetaMask/core-platform @MetaMask/metamask-assets +/packages/remote-feature-flag-controller @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/sentinel-api-service @MetaMask/confirmations @MetaMask/transactions +/packages/storage-service @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/client-controller @MetaMask/core-platform @MetaMask/extension-platform @MetaMask/mobile-platform +/packages/profile-metrics-controller @MetaMask/mobile-platform @MetaMask/extension-platform ## Initialization -/packages/wallet/src/initialization/instances/accounts-controller/ @MetaMask/accounts-engineers -/packages/wallet/src/initialization/instances/address-book-controller/ @MetaMask/confirmations -/packages/wallet/src/initialization/instances/approval-controller/ @MetaMask/confirmations -/packages/wallet/src/initialization/instances/connectivity-controller/ @MetaMask/core-platform -/packages/wallet/src/initialization/instances/keyring-controller/ @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/wallet/src/initialization/instances/remote-feature-flag-controller/ @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/wallet/src/initialization/instances/storage-service/ @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/wallet/src/initialization/instances/transaction-controller/ @MetaMask/confirmations +/packages/wallet/src/initialization/instances/accounts-controller/ @MetaMask/accounts-engineers +/packages/wallet/src/initialization/instances/address-book-controller/ @MetaMask/confirmations +/packages/wallet/src/initialization/instances/approval-controller/ @MetaMask/confirmations +/packages/wallet/src/initialization/instances/connectivity-controller/ @MetaMask/core-platform +/packages/wallet/src/initialization/instances/keyring-controller/ @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/wallet/src/initialization/instances/remote-feature-flag-controller/ @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/wallet/src/initialization/instances/storage-service/ @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/wallet/src/initialization/instances/transaction-controller/ @MetaMask/confirmations ## Package Release related -/packages/account-tree-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/account-tree-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/accounts-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/analytics-controller/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/analytics-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/analytics-data-regulation-controller/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/analytics-data-regulation-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/accounts-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/address-book-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/address-book-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/announcement-controller/package.json @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform -/packages/announcement-controller/CHANGELOG.md @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform -/packages/client-utils/package.json @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform -/packages/client-utils/CHANGELOG.md @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform -/packages/approval-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/approval-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/assets-controllers/package.json @MetaMask/metamask-assets @MetaMask/core-platform -/packages/assets-controllers/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform -/packages/assets-controller/package.json @MetaMask/metamask-assets @MetaMask/core-platform -/packages/assets-controller/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform -/packages/config-registry-controller/CHANGELOG.md @MetaMask/networks @MetaMask/core-platform -/packages/config-registry-controller/package.json @MetaMask/networks @MetaMask/core-platform -/packages/delegation-controller/package.json @MetaMask/delegation @MetaMask/core-platform -/packages/delegation-controller/CHANGELOG.md @MetaMask/delegation @MetaMask/core-platform -/packages/earn-controller/package.json @MetaMask/earn @MetaMask/core-platform -/packages/earn-controller/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform -/packages/money-account-balance-service/package.json @MetaMask/earn @MetaMask/core-platform -/packages/money-account-balance-service/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform -/packages/money-account-api-data-service/package.json @MetaMask/earn @MetaMask/core-platform -/packages/money-account-api-data-service/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform -/packages/ens-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/ens-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/gas-fee-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/gas-fee-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/gator-permissions-controller/package.json @MetaMask/delegation @MetaMask/core-platform -/packages/gator-permissions-controller/CHANGELOG.md @MetaMask/delegation @MetaMask/core-platform -/packages/geolocation-controller/package.json @MetaMask/mobile-platform @MetaMask/core-platform -/packages/geolocation-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/core-platform -/packages/keyring-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/keyring-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/passkey-controller/package.json @MetaMask/web3auth @MetaMask/core-platform -/packages/passkey-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform -/packages/logging-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/logging-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/message-manager/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/message-manager/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/multichain-account-service/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/multichain-account-service/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/name-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/name-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/notification-services-controller/package.json @MetaMask/engagement @MetaMask/core-platform -/packages/notification-services-controller/CHANGELOG.md @MetaMask/engagement @MetaMask/core-platform -/packages/compliance-controller/package.json @MetaMask/perps @MetaMask/core-platform -/packages/compliance-controller/CHANGELOG.md @MetaMask/perps @MetaMask/core-platform -/packages/perps-controller/package.json @MetaMask/perps @MetaMask/core-platform -/packages/perps-controller/CHANGELOG.md @MetaMask/perps @MetaMask/core-platform -/packages/phishing-controller/package.json @MetaMask/product-safety @MetaMask/core-platform -/packages/phishing-controller/CHANGELOG.md @MetaMask/product-safety @MetaMask/core-platform -/packages/ramps-controller/package.json @MetaMask/money-movement @MetaMask/core-platform -/packages/ramps-controller/CHANGELOG.md @MetaMask/money-movement @MetaMask/core-platform -/packages/authenticated-user-storage/package.json @MetaMask/auth-engineers @MetaMask/core-platform -/packages/authenticated-user-storage/CHANGELOG.md @MetaMask/auth-engineers @MetaMask/core-platform -/packages/profile-metrics-controller/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/profile-metrics-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/profile-sync-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/profile-sync-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/signature-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/signature-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/smart-transactions-controller/package.json @MetaMask/transactions @MetaMask/core-platform -/packages/smart-transactions-controller/CHANGELOG.md @MetaMask/transactions @MetaMask/core-platform -/packages/sentinel-api-service/package.json @MetaMask/confirmations @MetaMask/transactions @MetaMask/core-platform -/packages/sentinel-api-service/CHANGELOG.md @MetaMask/confirmations @MetaMask/transactions @MetaMask/core-platform -/packages/transaction-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/transaction-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/transaction-pay-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/transaction-pay-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/user-operation-controller/package.json @MetaMask/confirmations @MetaMask/core-platform -/packages/user-operation-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform -/packages/multichain-transactions-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/multichain-transactions-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/bridge-controller/package.json @MetaMask/swaps-engineers @MetaMask/core-platform -/packages/bridge-controller/CHANGELOG.md @MetaMask/swaps-engineers @MetaMask/core-platform -/packages/remote-feature-flag-controller/package.json @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/remote-feature-flag-controller/CHANGELOG.md @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/storage-service/package.json @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/storage-service/CHANGELOG.md @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform -/packages/bridge-status-controller/package.json @MetaMask/swaps-engineers @MetaMask/core-platform -/packages/bridge-status-controller/CHANGELOG.md @MetaMask/swaps-engineers @MetaMask/core-platform -/packages/app-metadata-controller/package.json @MetaMask/mobile-platform @MetaMask/core-platform -/packages/app-metadata-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/core-platform -/packages/foundryup/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/foundryup/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform -/packages/bitcoin-regtest-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/bitcoin-regtest-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/java-tron-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/java-tron-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/local-node-utils/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/local-node-utils/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/solana-test-validator-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/solana-test-validator-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/stellar-quickstart-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/stellar-quickstart-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform -/packages/seedless-onboarding-controller/package.json @MetaMask/web3auth @MetaMask/core-platform -/packages/seedless-onboarding-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform -/packages/shield-controller/package.json @MetaMask/web3auth @MetaMask/core-platform -/packages/shield-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform -/packages/network-enablement-controller/package.json @MetaMask/metamask-assets @MetaMask/core-platform -/packages/network-enablement-controller/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform -/packages/subscription-controller/package.json @MetaMask/web3auth @MetaMask/core-platform -/packages/subscription-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform -/packages/core-backend/package.json @MetaMask/core-platform @MetaMask/metamask-assets -/packages/core-backend/CHANGELOG.md @MetaMask/core-platform @MetaMask/metamask-assets -/packages/claims-controller/package.json @MetaMask/web3auth @MetaMask/core-platform -/packages/claims-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform -/packages/ai-controllers/package.json @MetaMask/social-ai @MetaMask/core-platform -/packages/ai-controllers/CHANGELOG.md @MetaMask/social-ai @MetaMask/core-platform -/packages/client-controller/package.json @MetaMask/core-platform @MetaMask/extension-platform @MetaMask/mobile-platform -/packages/client-controller/CHANGELOG.md @MetaMask/core-platform @MetaMask/extension-platform @MetaMask/mobile-platform -/packages/social-controllers/package.json @MetaMask/social-ai @MetaMask/core-platform -/packages/social-controllers/CHANGELOG.md @MetaMask/social-ai @MetaMask/core-platform -/packages/money-account-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/money-account-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/chomp-api-service/package.json @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform -/packages/chomp-api-service/CHANGELOG.md @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform -/packages/money-account-upgrade-controller/package.json @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform -/packages/money-account-upgrade-controller/CHANGELOG.md @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform -/packages/snap-account-service/package.json @MetaMask/accounts-engineers @MetaMask/core-platform -/packages/snap-account-service/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/account-tree-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/account-tree-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/accounts-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/accounts-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/analytics-controller/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/analytics-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/analytics-data-regulation-controller/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/analytics-data-regulation-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/address-book-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/address-book-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/announcement-controller/package.json @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform +/packages/announcement-controller/CHANGELOG.md @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform +/packages/client-utils/package.json @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform +/packages/client-utils/CHANGELOG.md @MetaMask/core-extension-ux @MetaMask/mobile-core-ux @MetaMask/core-platform +/packages/approval-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/approval-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/assets-controllers/package.json @MetaMask/metamask-assets @MetaMask/core-platform +/packages/assets-controllers/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform +/packages/assets-controller/package.json @MetaMask/metamask-assets @MetaMask/core-platform +/packages/assets-controller/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform +/packages/config-registry-controller/package.json @MetaMask/networks @MetaMask/core-platform +/packages/config-registry-controller/CHANGELOG.md @MetaMask/networks @MetaMask/core-platform +/packages/delegation-controller/package.json @MetaMask/delegation @MetaMask/core-platform +/packages/delegation-controller/CHANGELOG.md @MetaMask/delegation @MetaMask/core-platform +/packages/earn-controller/package.json @MetaMask/earn @MetaMask/core-platform +/packages/earn-controller/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform +/packages/money-account-balance-service/package.json @MetaMask/earn @MetaMask/core-platform +/packages/money-account-balance-service/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform +/packages/money-account-api-data-service/package.json @MetaMask/earn @MetaMask/core-platform +/packages/money-account-api-data-service/CHANGELOG.md @MetaMask/earn @MetaMask/core-platform +/packages/ens-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/ens-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/gas-fee-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/gas-fee-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/gator-permissions-controller/package.json @MetaMask/delegation @MetaMask/core-platform +/packages/gator-permissions-controller/CHANGELOG.md @MetaMask/delegation @MetaMask/core-platform +/packages/geolocation-controller/package.json @MetaMask/mobile-platform @MetaMask/core-platform +/packages/geolocation-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/core-platform +/packages/keyring-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/keyring-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/passkey-controller/package.json @MetaMask/web3auth @MetaMask/core-platform +/packages/passkey-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform +/packages/logging-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/logging-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/message-manager/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/message-manager/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/multichain-account-service/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/multichain-account-service/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/name-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/name-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/notification-services-controller/package.json @MetaMask/engagement @MetaMask/core-platform +/packages/notification-services-controller/CHANGELOG.md @MetaMask/engagement @MetaMask/core-platform +/packages/compliance-controller/package.json @MetaMask/perps @MetaMask/core-platform +/packages/compliance-controller/CHANGELOG.md @MetaMask/perps @MetaMask/core-platform +/packages/perps-controller/package.json @MetaMask/perps @MetaMask/core-platform +/packages/perps-controller/CHANGELOG.md @MetaMask/perps @MetaMask/core-platform +/packages/phishing-controller/package.json @MetaMask/product-safety @MetaMask/core-platform +/packages/phishing-controller/CHANGELOG.md @MetaMask/product-safety @MetaMask/core-platform +/packages/ramps-controller/package.json @MetaMask/money-movement @MetaMask/core-platform +/packages/ramps-controller/CHANGELOG.md @MetaMask/money-movement @MetaMask/core-platform +/packages/authenticated-user-storage/package.json @MetaMask/auth-engineers @MetaMask/core-platform +/packages/authenticated-user-storage/CHANGELOG.md @MetaMask/auth-engineers @MetaMask/core-platform +/packages/profile-metrics-controller/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/profile-metrics-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/profile-sync-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/profile-sync-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/signature-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/signature-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/smart-transactions-controller/package.json @MetaMask/transactions @MetaMask/core-platform +/packages/smart-transactions-controller/CHANGELOG.md @MetaMask/transactions @MetaMask/core-platform +/packages/sentinel-api-service/package.json @MetaMask/confirmations @MetaMask/transactions @MetaMask/core-platform +/packages/sentinel-api-service/CHANGELOG.md @MetaMask/confirmations @MetaMask/transactions @MetaMask/core-platform +/packages/transaction-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/transaction-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/transaction-pay-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/transaction-pay-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/user-operation-controller/package.json @MetaMask/confirmations @MetaMask/core-platform +/packages/user-operation-controller/CHANGELOG.md @MetaMask/confirmations @MetaMask/core-platform +/packages/multichain-transactions-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/multichain-transactions-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/bridge-controller/package.json @MetaMask/swaps-engineers @MetaMask/core-platform +/packages/bridge-controller/CHANGELOG.md @MetaMask/swaps-engineers @MetaMask/core-platform +/packages/remote-feature-flag-controller/package.json @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/remote-feature-flag-controller/CHANGELOG.md @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/storage-service/package.json @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/storage-service/CHANGELOG.md @MetaMask/extension-platform @MetaMask/mobile-platform @MetaMask/core-platform +/packages/bridge-status-controller/package.json @MetaMask/swaps-engineers @MetaMask/core-platform +/packages/bridge-status-controller/CHANGELOG.md @MetaMask/swaps-engineers @MetaMask/core-platform +/packages/app-metadata-controller/package.json @MetaMask/mobile-platform @MetaMask/core-platform +/packages/app-metadata-controller/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/core-platform +/packages/foundryup/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/foundryup/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/core-platform +/packages/bitcoin-regtest-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/bitcoin-regtest-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/java-tron-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/java-tron-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/local-node-utils/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/local-node-utils/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/solana-test-validator-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/solana-test-validator-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/stellar-quickstart-up/package.json @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/stellar-quickstart-up/CHANGELOG.md @MetaMask/mobile-platform @MetaMask/extension-platform @MetaMask/networks @MetaMask/core-platform +/packages/seedless-onboarding-controller/package.json @MetaMask/web3auth @MetaMask/core-platform +/packages/seedless-onboarding-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform +/packages/shield-controller/package.json @MetaMask/web3auth @MetaMask/core-platform +/packages/shield-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform +/packages/network-enablement-controller/package.json @MetaMask/metamask-assets @MetaMask/core-platform +/packages/network-enablement-controller/CHANGELOG.md @MetaMask/metamask-assets @MetaMask/core-platform +/packages/subscription-controller/package.json @MetaMask/web3auth @MetaMask/core-platform +/packages/subscription-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform +/packages/core-backend/package.json @MetaMask/core-platform @MetaMask/metamask-assets +/packages/core-backend/CHANGELOG.md @MetaMask/core-platform @MetaMask/metamask-assets +/packages/claims-controller/package.json @MetaMask/web3auth @MetaMask/core-platform +/packages/claims-controller/CHANGELOG.md @MetaMask/web3auth @MetaMask/core-platform +/packages/ai-controllers/package.json @MetaMask/social-ai @MetaMask/core-platform +/packages/ai-controllers/CHANGELOG.md @MetaMask/social-ai @MetaMask/core-platform +/packages/client-controller/package.json @MetaMask/core-platform @MetaMask/extension-platform @MetaMask/mobile-platform +/packages/client-controller/CHANGELOG.md @MetaMask/core-platform @MetaMask/extension-platform @MetaMask/mobile-platform +/packages/social-controllers/package.json @MetaMask/social-ai @MetaMask/core-platform +/packages/social-controllers/CHANGELOG.md @MetaMask/social-ai @MetaMask/core-platform +/packages/money-account-controller/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/money-account-controller/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/chomp-api-service/package.json @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform +/packages/chomp-api-service/CHANGELOG.md @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform +/packages/money-account-upgrade-controller/package.json @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform +/packages/money-account-upgrade-controller/CHANGELOG.md @MetaMask/earn @MetaMask/delegation @MetaMask/core-platform +/packages/snap-account-service/package.json @MetaMask/accounts-engineers @MetaMask/core-platform +/packages/snap-account-service/CHANGELOG.md @MetaMask/accounts-engineers @MetaMask/core-platform \ No newline at end of file diff --git a/.github/workflows/lint-build-test.yml b/.github/workflows/lint-build-test.yml index 4efb1a7200d..bb9b1640744 100644 --- a/.github/workflows/lint-build-test.yml +++ b/.github/workflows/lint-build-test.yml @@ -35,14 +35,15 @@ jobs: matrix: node-version: [24.x] script: - - lint:eslint - - lint:misc:check + - codeowners:check - constraints - lint:dependencies + - lint:eslint + - lint:misc:check - lint:teams + - lint:tsconfigs:all - messenger-action-types:check - readme-content:check - - lint:tsconfigs:all steps: - name: Checkout and setup environment uses: MetaMask/action-checkout-and-setup@v3 diff --git a/codeowners.ts b/codeowners.ts new file mode 100644 index 00000000000..7020d46d5df --- /dev/null +++ b/codeowners.ts @@ -0,0 +1,718 @@ +import type { + CodeownersRule, + CodeownersSection, +} from './scripts/manage-codeowners/types'; + +/** + * Metadata about a package in the monorepo, used to generate CODEOWNERS + * rules for it. + */ +type PackageInfo = { + /** + * The GitHub team(s) that own this package's top-level directory. + */ + teams: string[]; + + /** + * The package's directory name under + * `/packages/wallet/src/initialization/instances`, used to generate its rule + * in the "Initialization" section. Omit this if the package has not been + * added to the Wallet Library yet. + */ + initializationPath?: string; +}; + +/** + * Metadata about each package in the monorepo that has a CODEOWNERS entry, + * keyed by its directory name under `/packages`. This is the single source + * of truth for which team(s) own a package, and is used to populate the + * sections in `codeownersSections` below. + */ +const PACKAGES: Record = { + 'account-tree-controller': { + teams: ['@MetaMask/accounts-engineers'], + }, + 'accounts-controller': { + teams: ['@MetaMask/accounts-engineers'], + initializationPath: 'accounts-controller', + }, + 'address-book-controller': { + teams: ['@MetaMask/confirmations'], + initializationPath: 'address-book-controller', + }, + 'ai-controllers': { + teams: ['@MetaMask/social-ai'], + }, + 'analytics-controller': { + teams: ['@MetaMask/mobile-platform', '@MetaMask/extension-platform'], + }, + 'analytics-data-regulation-controller': { + teams: ['@MetaMask/mobile-platform', '@MetaMask/extension-platform'], + }, + 'announcement-controller': { + teams: ['@MetaMask/core-extension-ux', '@MetaMask/mobile-core-ux'], + }, + 'app-metadata-controller': { + teams: ['@MetaMask/mobile-platform'], + }, + 'approval-controller': { + teams: ['@MetaMask/confirmations'], + initializationPath: 'approval-controller', + }, + 'assets-controller': { + teams: ['@MetaMask/metamask-assets'], + }, + 'assets-controllers': { + teams: ['@MetaMask/metamask-assets'], + }, + 'authenticated-user-storage': { + teams: ['@MetaMask/auth-engineers'], + }, + 'base-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'base-data-service': { + teams: ['@MetaMask/core-platform'], + }, + 'bitcoin-regtest-up': { + teams: [ + '@MetaMask/mobile-platform', + '@MetaMask/extension-platform', + '@MetaMask/networks', + ], + }, + 'bridge-controller': { + teams: ['@MetaMask/swaps-engineers'], + }, + 'bridge-status-controller': { + teams: ['@MetaMask/swaps-engineers'], + }, + 'build-utils': { + teams: ['@MetaMask/core-platform'], + }, + 'chain-agnostic-permission': { + teams: ['@MetaMask/core-platform'], + }, + 'chomp-api-service': { + teams: ['@MetaMask/earn', '@MetaMask/delegation'], + }, + 'claims-controller': { + teams: ['@MetaMask/web3auth'], + }, + 'client-controller': { + teams: [ + '@MetaMask/core-platform', + '@MetaMask/extension-platform', + '@MetaMask/mobile-platform', + ], + }, + 'client-utils': { + teams: ['@MetaMask/core-extension-ux', '@MetaMask/mobile-core-ux'], + }, + 'compliance-controller': { + teams: ['@MetaMask/perps'], + }, + 'composable-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'config-registry-controller': { + teams: ['@MetaMask/networks'], + }, + 'connectivity-controller': { + teams: ['@MetaMask/core-platform'], + initializationPath: 'connectivity-controller', + }, + 'controller-utils': { + teams: ['@MetaMask/core-platform'], + }, + 'core-backend': { + teams: ['@MetaMask/core-platform', '@MetaMask/metamask-assets'], + }, + 'delegation-controller': { + teams: ['@MetaMask/delegation'], + }, + 'earn-controller': { + teams: ['@MetaMask/earn'], + }, + 'eip-5792-middleware': { + teams: ['@MetaMask/core-platform'], + }, + 'eip-7702-internal-rpc-middleware': { + teams: ['@MetaMask/delegation', '@MetaMask/core-platform'], + }, + 'eip1193-permission-middleware': { + teams: ['@MetaMask/core-platform'], + }, + 'ens-controller': { + teams: ['@MetaMask/confirmations'], + }, + 'eth-block-tracker': { + teams: ['@MetaMask/core-platform'], + }, + 'eth-json-rpc-middleware': { + teams: ['@MetaMask/core-platform'], + }, + 'eth-json-rpc-provider': { + teams: ['@MetaMask/core-platform'], + }, + foundryup: { + teams: ['@MetaMask/mobile-platform', '@MetaMask/extension-platform'], + }, + 'gas-fee-controller': { + teams: ['@MetaMask/confirmations'], + }, + 'gator-permissions-controller': { + teams: ['@MetaMask/delegation'], + }, + 'geolocation-controller': { + teams: ['@MetaMask/mobile-platform'], + }, + 'java-tron-up': { + teams: [ + '@MetaMask/mobile-platform', + '@MetaMask/extension-platform', + '@MetaMask/networks', + ], + }, + 'json-rpc-engine': { + teams: ['@MetaMask/core-platform'], + }, + 'json-rpc-middleware-stream': { + teams: ['@MetaMask/core-platform'], + }, + 'keyring-controller': { + teams: ['@MetaMask/accounts-engineers', '@MetaMask/core-platform'], + initializationPath: 'keyring-controller', + }, + 'local-node-utils': { + teams: [ + '@MetaMask/mobile-platform', + '@MetaMask/extension-platform', + '@MetaMask/networks', + ], + }, + 'logging-controller': { + teams: ['@MetaMask/confirmations'], + }, + 'message-manager': { + teams: ['@MetaMask/confirmations'], + }, + messenger: { + teams: ['@MetaMask/core-platform'], + }, + 'messenger-cli': { + teams: ['@MetaMask/core-platform'], + }, + 'money-account-api-data-service': { + teams: ['@MetaMask/earn'], + }, + 'money-account-balance-service': { + teams: ['@MetaMask/earn'], + }, + 'money-account-controller': { + teams: ['@MetaMask/accounts-engineers'], + }, + 'money-account-upgrade-controller': { + teams: ['@MetaMask/earn', '@MetaMask/delegation'], + }, + 'multichain-account-service': { + teams: ['@MetaMask/accounts-engineers'], + }, + 'multichain-api-middleware': { + teams: ['@MetaMask/core-platform'], + }, + 'multichain-network-controller': { + teams: [ + '@MetaMask/core-platform', + '@MetaMask/accounts-engineers', + '@MetaMask/metamask-assets', + ], + }, + 'multichain-transactions-controller': { + teams: ['@MetaMask/accounts-engineers'], + }, + 'name-controller': { + teams: ['@MetaMask/confirmations'], + }, + 'network-connection-banner-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'network-controller': { + teams: ['@MetaMask/core-platform', '@MetaMask/metamask-assets'], + }, + 'network-enablement-controller': { + teams: ['@MetaMask/metamask-assets'], + }, + 'notification-services-controller': { + teams: ['@MetaMask/engagement'], + }, + 'passkey-controller': { + teams: ['@MetaMask/web3auth'], + }, + 'permission-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'permission-log-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'perps-controller': { + teams: ['@MetaMask/perps'], + }, + 'phishing-controller': { + teams: ['@MetaMask/product-safety'], + }, + 'platform-api-docs': { + teams: ['@MetaMask/core-platform'], + }, + 'polling-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'preferences-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'profile-metrics-controller': { + teams: ['@MetaMask/mobile-platform', '@MetaMask/extension-platform'], + }, + 'profile-sync-controller': { + teams: ['@MetaMask/accounts-engineers'], + }, + 'ramps-controller': { + teams: ['@MetaMask/money-movement'], + }, + 'rate-limit-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'react-data-query': { + teams: ['@MetaMask/core-platform'], + }, + 'remote-feature-flag-controller': { + teams: [ + '@MetaMask/extension-platform', + '@MetaMask/mobile-platform', + '@MetaMask/core-platform', + ], + initializationPath: 'remote-feature-flag-controller', + }, + 'sample-controllers': { + teams: ['@MetaMask/core-platform'], + }, + 'seedless-onboarding-controller': { + teams: ['@MetaMask/web3auth'], + }, + 'selected-network-controller': { + teams: ['@MetaMask/core-platform'], + }, + 'sentinel-api-service': { + teams: ['@MetaMask/confirmations', '@MetaMask/transactions'], + }, + 'shield-controller': { + teams: ['@MetaMask/web3auth'], + }, + 'signature-controller': { + teams: ['@MetaMask/confirmations'], + }, + 'smart-transactions-controller': { + teams: ['@MetaMask/transactions'], + }, + 'snap-account-service': { + teams: ['@MetaMask/accounts-engineers'], + }, + 'social-controllers': { + teams: ['@MetaMask/social-ai'], + }, + 'solana-test-validator-up': { + teams: [ + '@MetaMask/mobile-platform', + '@MetaMask/extension-platform', + '@MetaMask/networks', + ], + }, + 'stellar-quickstart-up': { + teams: [ + '@MetaMask/mobile-platform', + '@MetaMask/extension-platform', + '@MetaMask/networks', + ], + }, + 'storage-service': { + teams: [ + '@MetaMask/extension-platform', + '@MetaMask/mobile-platform', + '@MetaMask/core-platform', + ], + initializationPath: 'storage-service', + }, + 'subscription-controller': { + teams: ['@MetaMask/web3auth'], + }, + 'transaction-controller': { + teams: ['@MetaMask/confirmations'], + initializationPath: 'transaction-controller', + }, + 'transaction-pay-controller': { + teams: ['@MetaMask/confirmations'], + }, + 'user-operation-controller': { + teams: ['@MetaMask/confirmations'], + }, + wallet: { + teams: ['@MetaMask/core-platform'], + }, + 'wallet-cli': { + teams: ['@MetaMask/core-platform', '@MetaMask/ocap-kernel'], + }, + 'wallet-framework-docs': { + teams: ['@MetaMask/core-platform'], + }, +}; + +/** + * The CODEOWNERS sections, in the order they should appear in the generated + * `.github/CODEOWNERS` file. + */ +const codeownersSections: CodeownersSection[] = [ + buildFirstSection(), + ...buildTeamSections(), + buildJointTeamOwnershipSection(), + buildInitializationSection(), + buildPackageReleaseSection(), +]; + +/** + * Builds the section at the top of CODEOWNERS that is reserved for files that + * should always be owned by Core Platform. + * + * @returns The first section. + */ +function buildFirstSection(): CodeownersSection { + return { + rules: [{ pattern: '/.github/', owners: ['@MetaMask/core-platform'] }], + }; +} + +/** + * Build sections within CODEOWNERS that define teams and the packages they own. + * + * @returns The team sections. + */ +function buildTeamSections(): CodeownersSection[] { + return [ + { + title: 'Accounts Team', + rules: [ + buildRuleForPackage('accounts-controller'), + buildRuleForPackage('multichain-transactions-controller'), + buildRuleForPackage('multichain-account-service'), + buildRuleForPackage('account-tree-controller'), + buildRuleForPackage('profile-sync-controller'), + buildRuleForPackage('money-account-controller'), + buildRuleForPackage('snap-account-service'), + ], + }, + { + title: 'Auth Team', + rules: [buildRuleForPackage('authenticated-user-storage')], + }, + { + title: 'Assets Team', + rules: [ + buildRuleForPackage('assets-controllers'), + buildRuleForPackage('network-enablement-controller'), + buildRuleForPackage('assets-controller'), + ], + }, + { + title: 'Confirmations Team', + rules: [ + buildRuleForPackage('address-book-controller'), + buildRuleForPackage('approval-controller'), + buildRuleForPackage('ens-controller'), + buildRuleForPackage('gas-fee-controller'), + buildRuleForPackage('logging-controller'), + buildRuleForPackage('message-manager'), + buildRuleForPackage('name-controller'), + buildRuleForPackage('signature-controller'), + buildRuleForPackage('transaction-controller'), + buildRuleForPackage('transaction-pay-controller'), + buildRuleForPackage('user-operation-controller'), + ], + }, + { + title: 'Transactions Team', + rules: [buildRuleForPackage('smart-transactions-controller')], + }, + { + title: 'Delegation Team', + rules: [ + buildRuleForPackage('delegation-controller'), + buildRuleForPackage('gator-permissions-controller'), + buildRuleForPackage('eip-7702-internal-rpc-middleware'), + ], + }, + { + title: 'Earn Team', + rules: [ + buildRuleForPackage('earn-controller'), + buildRuleForPackage('money-account-balance-service'), + buildRuleForPackage('money-account-api-data-service'), + buildRuleForPackage('chomp-api-service'), + buildRuleForPackage('money-account-upgrade-controller'), + ], + }, + { + title: 'Social AI Team', + rules: [ + buildRuleForPackage('ai-controllers'), + buildRuleForPackage('social-controllers'), + ], + }, + { + title: 'Money Movement Team', + rules: [buildRuleForPackage('ramps-controller')], + }, + { + title: 'Networks Team', + rules: [buildRuleForPackage('config-registry-controller')], + }, + { + title: 'Engagement Team', + rules: [buildRuleForPackage('notification-services-controller')], + }, + { + title: 'Perps Team', + rules: [ + buildRuleForPackage('compliance-controller'), + buildRuleForPackage('perps-controller'), + ], + }, + { + title: 'Product Safety Team', + rules: [buildRuleForPackage('phishing-controller')], + }, + { + title: 'Swaps-Bridge Team', + rules: [ + buildRuleForPackage('bridge-controller'), + buildRuleForPackage('bridge-status-controller'), + ], + }, + { + title: 'Mobile Platform Team', + rules: [ + buildRuleForPackage('app-metadata-controller'), + buildRuleForPackage('analytics-controller'), + buildRuleForPackage('analytics-data-regulation-controller'), + buildRuleForPackage('geolocation-controller'), + ], + }, + { + title: 'Core Platform Team', + rules: [ + buildRuleForPackage('base-controller'), + buildRuleForPackage('base-data-service'), + buildRuleForPackage('build-utils'), + buildRuleForPackage('chain-agnostic-permission'), + buildRuleForPackage('composable-controller'), + buildRuleForPackage('connectivity-controller'), + buildRuleForPackage('controller-utils'), + buildRuleForPackage('eip-5792-middleware'), + buildRuleForPackage('eip1193-permission-middleware'), + buildRuleForPackage('eth-block-tracker'), + buildRuleForPackage('eth-json-rpc-middleware'), + buildRuleForPackage('eth-json-rpc-provider'), + buildRuleForPackage('json-rpc-engine'), + buildRuleForPackage('json-rpc-middleware-stream'), + buildRuleForPackage('messenger'), + buildRuleForPackage('messenger-cli'), + buildRuleForPackage('multichain-api-middleware'), + buildRuleForPackage('network-connection-banner-controller'), + buildRuleForPackage('permission-controller'), + buildRuleForPackage('permission-log-controller'), + buildRuleForPackage('platform-api-docs'), + buildRuleForPackage('polling-controller'), + buildRuleForPackage('preferences-controller'), + buildRuleForPackage('rate-limit-controller'), + buildRuleForPackage('react-data-query'), + buildRuleForPackage('sample-controllers'), + buildRuleForPackage('selected-network-controller'), + buildRuleForPackage('wallet'), + buildRuleForPackage('wallet-cli'), + buildRuleForPackage('wallet-framework-docs'), + ], + }, + { + title: 'Web3Auth Team', + rules: [ + buildRuleForPackage('seedless-onboarding-controller'), + buildRuleForPackage('passkey-controller'), + buildRuleForPackage('shield-controller'), + buildRuleForPackage('subscription-controller'), + buildRuleForPackage('claims-controller'), + ], + }, + ]; +} + +/** + * Builds the section that defines packages owned by multiple teams. + * + * @returns The "Joint team ownership" section. + */ +function buildJointTeamOwnershipSection(): CodeownersSection { + return { + title: 'Joint team ownership', + rules: [ + buildRuleForPackage('announcement-controller'), + buildRuleForPackage('client-utils'), + buildRuleForPackage('core-backend'), + { + pattern: '/packages/eth-json-rpc-middleware/src/methods', + owners: ['@MetaMask/confirmations', '@MetaMask/core-platform'], + }, + { + pattern: '/packages/eth-json-rpc-middleware/src/wallet.*', + owners: ['@MetaMask/confirmations', '@MetaMask/core-platform'], + }, + buildRuleForPackage('foundryup'), + buildRuleForPackage('bitcoin-regtest-up'), + buildRuleForPackage('java-tron-up'), + buildRuleForPackage('local-node-utils'), + buildRuleForPackage('solana-test-validator-up'), + buildRuleForPackage('stellar-quickstart-up'), + buildRuleForPackage('keyring-controller'), + buildRuleForPackage('multichain-network-controller'), + buildRuleForPackage('network-controller'), + buildRuleForPackage('remote-feature-flag-controller'), + buildRuleForPackage('sentinel-api-service'), + buildRuleForPackage('storage-service'), + buildRuleForPackage('client-controller'), + buildRuleForPackage('profile-metrics-controller'), + ], + }; +} + +/** + * Builds the section that maps initialization code for packages in `@metamask/wallet` to the + * teams that own those packages. + * + * @returns The "Initialization" section. + */ +function buildInitializationSection(): CodeownersSection { + return { + title: 'Initialization', + rules: Object.keys(PACKAGES) + .filter((name) => PACKAGES[name].initializationPath !== undefined) + .sort() + .map((name) => { + const { teams, initializationPath } = PACKAGES[name]; + return { + pattern: `/packages/wallet/src/initialization/instances/${initializationPath}/`, + owners: teams, + }; + }), + }; +} + +/** + * Builds the "Package Release related" section from all packages in `PACKAGES`. + * The Core Platform team is added to each rule's owners (if not already + * present), since that team co-owns the release process for every package. + * + * @returns The "Package Release related" CODEOWNERS section. + */ +function buildPackageReleaseSection(): CodeownersSection { + // These packages are currently not alphabetized. + const packageNames = [ + 'account-tree-controller', + 'accounts-controller', + 'analytics-controller', + 'analytics-data-regulation-controller', + 'address-book-controller', + 'announcement-controller', + 'client-utils', + 'approval-controller', + 'assets-controllers', + 'assets-controller', + 'config-registry-controller', + 'delegation-controller', + 'earn-controller', + 'money-account-balance-service', + 'money-account-api-data-service', + 'ens-controller', + 'gas-fee-controller', + 'gator-permissions-controller', + 'geolocation-controller', + 'keyring-controller', + 'passkey-controller', + 'logging-controller', + 'message-manager', + 'multichain-account-service', + 'name-controller', + 'notification-services-controller', + 'compliance-controller', + 'perps-controller', + 'phishing-controller', + 'ramps-controller', + 'authenticated-user-storage', + 'profile-metrics-controller', + 'profile-sync-controller', + 'signature-controller', + 'smart-transactions-controller', + 'sentinel-api-service', + 'transaction-controller', + 'transaction-pay-controller', + 'user-operation-controller', + 'multichain-transactions-controller', + 'bridge-controller', + 'remote-feature-flag-controller', + 'storage-service', + 'bridge-status-controller', + 'app-metadata-controller', + 'foundryup', + 'bitcoin-regtest-up', + 'java-tron-up', + 'local-node-utils', + 'solana-test-validator-up', + 'stellar-quickstart-up', + 'seedless-onboarding-controller', + 'shield-controller', + 'network-enablement-controller', + 'subscription-controller', + 'core-backend', + 'claims-controller', + 'ai-controllers', + 'client-controller', + 'social-controllers', + 'money-account-controller', + 'chomp-api-service', + 'money-account-upgrade-controller', + 'snap-account-service', + ] as const satisfies (keyof typeof PACKAGES)[]; + + return { + title: 'Package Release related', + rules: packageNames.flatMap((name) => { + const { teams } = PACKAGES[name]; + const workspacePath = `/packages/${name}`; + const owners = teams.includes('@MetaMask/core-platform') + ? teams + : [...teams, '@MetaMask/core-platform']; + return [ + { pattern: `${workspacePath}/package.json`, owners }, + { pattern: `${workspacePath}/CHANGELOG.md`, owners }, + ]; + }), + }; +} + +/** + * Builds the rule that maps a package's directory to the team(s) that own it. + * + * @param name - The package's directory name under `/packages`. + * @returns The rule for the package. + */ +function buildRuleForPackage(name: keyof typeof PACKAGES): CodeownersRule { + return { pattern: `/packages/${name}`, owners: PACKAGES[name].teams }; +} + +export default codeownersSections; diff --git a/package.json b/package.json index 452273b2a56..6ff17946b93 100644 --- a/package.json +++ b/package.json @@ -20,16 +20,18 @@ "build:types": "tsc --build tsconfig.build.json --verbose", "changelog:update": "yarn workspaces foreach --all --no-private --parallel --interlaced --verbose run changelog:update", "changelog:validate": "yarn workspaces foreach --all --no-private --parallel --interlaced --verbose run changelog:validate", + "codeowners:check": "tsx scripts/manage-codeowners.ts check", + "codeowners:generate": "tsx scripts/manage-codeowners.ts generate", "create-package": "tsx scripts/create-package", "create-release-branch": "create-release-branch --formatter oxfmt", "docs:platform-api:build": "yarn workspace @metamask/platform-api-docs cli ../.. --build --project-label Core", "docs:platform-api:dev": "yarn workspace @metamask/platform-api-docs cli ../.. --dev --project-label Core", "docs:platform-api:serve": "yarn workspace @metamask/platform-api-docs cli ../.. --serve --project-label Core", - "lint": "yarn lint:eslint && echo && yarn lint:misc --check && yarn constraints && yarn lint:dependencies && yarn lint:teams && yarn messenger-action-types:check && yarn readme-content:check && yarn lint:tsconfigs:all", + "lint": "yarn lint:eslint && echo && yarn lint:misc --check && yarn constraints && yarn lint:dependencies && yarn lint:teams && yarn messenger-action-types:check && yarn readme-content:check && yarn lint:tsconfigs:all && yarn codeowners:check", "lint:dependencies": "knip --dependencies && yarn dedupe --check", "lint:dependencies:fix": "knip --dependencies && yarn dedupe", "lint:eslint": "yarn build:only-clean && NODE_OPTIONS='--max-old-space-size=8192' yarn eslint", - "lint:fix": "yarn lint:eslint --fix --prune-suppressions && echo && yarn lint:misc --write && yarn constraints --fix && yarn lint:dependencies:fix && yarn messenger-action-types:generate && yarn readme-content:update", + "lint:fix": "yarn lint:eslint --fix --prune-suppressions && echo && yarn lint:misc --write && yarn constraints --fix && yarn lint:dependencies:fix && yarn messenger-action-types:generate && yarn readme-content:update && yarn codeowners:generate", "lint:misc": "oxfmt --ignore-path .gitignore", "lint:misc:check": "yarn lint:misc --check", "lint:teams": "tsx scripts/lint-teams-json.ts", diff --git a/scripts/manage-codeowners.ts b/scripts/manage-codeowners.ts new file mode 100755 index 00000000000..387d7776918 --- /dev/null +++ b/scripts/manage-codeowners.ts @@ -0,0 +1,8 @@ +#!/usr/bin/env yarn tsx + +import { main } from './manage-codeowners/main'; + +main().catch(function (error) { + console.error(error); + process.exitCode = 1; +}); diff --git a/scripts/manage-codeowners/main.ts b/scripts/manage-codeowners/main.ts new file mode 100644 index 00000000000..5e7e3efa7fc --- /dev/null +++ b/scripts/manage-codeowners/main.ts @@ -0,0 +1,108 @@ +import fs from 'fs'; +import * as path from 'path'; +import yargs from 'yargs'; + +import codeownersSections from '../../codeowners'; + +/** + * The path to the generated CODEOWNERS file. + */ +const CODEOWNERS_FILE_PATH = path.resolve( + __dirname, + '../../.github/CODEOWNERS', +); + +/** + * The lines that appear before the CODEOWNERS rules. + */ +const CODEOWNERS_PRELUDE = ` +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# Note: Please keep this synchronized with the \`teams.json\` file in the repository root. +# That file is used for some automated workflows, and maps controller to owning team(s). +`.trim(); + +/** + * The entrypoint to the script. + */ +export async function main(): Promise { + await yargs(process.argv.slice(2)) + .command( + 'check', + 'Check whether CODEOWNERS is up to date without writing changes.', + checkCodeowners, + ) + .command( + 'generate', + 'Generate the repository CODEOWNERS file.', + generateCodeowners, + ) + .demandCommand(1, 'Please specify either `check` or `generate`.') + .strict() + .help('help') + .usage('Manage the repository CODEOWNERS file.\nUsage: $0 ') + .parseAsync(); +} + +/** + * Generates a new version of CODEOWNERS in memory from the configuration in + * `codeowners.ts` and compares it to the existing file, printing an error if + * there are any differences or otherwise silently succeeding. + */ +async function checkCodeowners(): Promise { + const existingContent = await fs.promises.readFile( + CODEOWNERS_FILE_PATH, + 'utf8', + ); + const generatedContent = generateCodeownersFileContent(); + + if (existingContent !== generatedContent) { + console.error( + 'CODEOWNERS is out of date. Run `yarn codeowners:generate` to update it.', + ); + process.exitCode = 1; + } +} + +/** + * Generates the CODEOWNERS file on disk. + */ +async function generateCodeowners(): Promise { + await fs.promises.writeFile( + CODEOWNERS_FILE_PATH, + generateCodeownersFileContent(), + ); +} + +/** + * Generates the content of the CODEOWNERS file from the configuration in + * `codeowners.ts`. + * + * @returns The full CODEOWNERS file contents. + */ +function generateCodeownersFileContent(): string { + const sectionLines = codeownersSections.map((section) => { + const lines: string[] = []; + + // This is useful to discriminate the union. + // eslint-disable-next-line no-restricted-syntax + if ('title' in section) { + lines.push(`## ${section.title}`); + } + + const maxPatternLength = Math.max( + ...section.rules.map((rule) => rule.pattern.length), + ); + const patternLengthWithPadding = maxPatternLength + 4; + for (const rule of section.rules) { + lines.push( + rule.pattern.padEnd(patternLengthWithPadding) + rule.owners.join(' '), + ); + } + + return lines.join('\n'); + }); + + return [CODEOWNERS_PRELUDE, ...sectionLines].join('\n\n'); +} diff --git a/scripts/manage-codeowners/types.ts b/scripts/manage-codeowners/types.ts new file mode 100644 index 00000000000..d61d84f44aa --- /dev/null +++ b/scripts/manage-codeowners/types.ts @@ -0,0 +1,32 @@ +/** + * A single CODEOWNERS rule: a file pattern and the owners responsible for it. + */ +export type CodeownersRule = { + /** + * The file pattern matched by the rule. + */ + pattern: string; + + /** + * The GitHub owners assigned to the pattern. + */ + owners: string[]; +}; + +/** + * A group of CODEOWNERS rules rendered together under an optional heading. + * Sections are generally tied to the team(s) responsible for the patterns + * within them. + */ +export type CodeownersSection = { + /** + * The heading rendered above the section's rules. Omit this for rules that + * apply repository-wide and should not be grouped under a team heading. + */ + title?: string; + + /** + * The rules that belong to this section. + */ + rules: CodeownersRule[]; +}; diff --git a/tsconfig.json b/tsconfig.json index 02abeac1da9..83755477993 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -304,5 +304,11 @@ } ], "files": [], - "include": ["./docs", "./types", "./scripts", "./knip.config.ts"] + "include": [ + "./docs", + "./types", + "./scripts", + "./codeowners.ts", + "./knip.config.ts" + ] }