Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
205 commits
Select commit Hold shift + click to select a range
d3b6348
feat: Add A/B test for bridge token selector balance layout (#27690)
bfullam Mar 19, 2026
ace5c7c
test: Migrate page objects to the new framework (perf/Predict) (#27642)
cortisiko Mar 19, 2026
2da84f5
refactor: migrate ManualBackupStep1 to design system components and T…
smgv Mar 20, 2026
a82a469
fix(perps): Button flash when open a market with an open position (#…
abretonc7s Mar 20, 2026
8a3a0c5
feat: migrate RevealPrivateCredential to new design system components…
grvgoel81 Mar 20, 2026
8e46b07
chore: implement rewards version guard (#27664)
sophieqgu Mar 20, 2026
1ba34e2
fix(wallet): resolve analytics and UX regressions (#27670)
PatrykLucka Mar 20, 2026
4400225
feat: add edit gas from cancel/speed up modal (#27194)
vinistevam Mar 20, 2026
969c36d
fix: respect source amount cursor position (#27367)
bfullam Mar 20, 2026
492c13d
feat: whats happening carrousel (#27538)
zone-live Mar 20, 2026
4d25a94
feat(rewards): geo-restriction guard for campaign opt-in and RWA toke…
VGR-GIT Mar 20, 2026
fc85dc0
fix: use StackActions.push to navigate to trending token details (#27…
GeorgeGkas Mar 20, 2026
d4a78c6
refactor(AccountBackupStep1B): migrate to design system components (#…
tylerc-consensys Mar 20, 2026
5cb34da
perf: Avoid full token catalog for non-withdraw flows (#27728)
dan437 Mar 20, 2026
22f9bd9
refactor(ProtectYourWalletModal): migrate to design system components…
tylerc-consensys Mar 20, 2026
4e179e0
refactor: migrate all Ledger paths to `useHardwareWallet` (#26970)
mathieuartu Mar 20, 2026
200bb34
feat: enhance MultichainBridgeTransactionListItem to support destinat…
PatrykLucka Mar 20, 2026
4a96b6e
fix: enhance removeAbortFilter to handle late async abort events in C…
cmd-ob Mar 20, 2026
e393675
feat(rewards): add earn rewards preview and mUSD calculator route (#2…
VGR-GIT Mar 20, 2026
bf03a94
feat: switch default search engine to Brave Search (#26356)
AugmentedMode Mar 20, 2026
fbfbf17
fix(bridge): align swap token inputs with quote details (#27730)
bfullam Mar 20, 2026
ab46059
chore: remove token list item v2 flag (#27731)
juanmigdr Mar 20, 2026
89cc07c
fix: cash and token rows have different bold (#27736)
PatrykLucka Mar 20, 2026
94d5408
chore: bump `@metamask/keyring-api` from `^21.5.0` to `^21.6.0` (#27729)
danroc Mar 20, 2026
ba5d459
feat: adds skeleton loader for quote fetching (#27174)
ghgoodreau Mar 20, 2026
5ef649e
refactor(analytics): PR C1 useAnalytics for HW, recovery, onboarding …
NicolasMassart Mar 20, 2026
d86db93
docs(ButtonLink): clarify deprecation guidance (TextButton vs Tertiar…
georgewrmarshall Mar 20, 2026
5ff018e
test: add metametrics to collect qa stats (#27696)
racitores Mar 20, 2026
045a39f
perf: Speed up the creation of the token list for Predict withdraw (#…
dan437 Mar 20, 2026
eccdfba
test: add command to generate ai test plan (#27754)
cortisiko Mar 20, 2026
13baa70
refactor(card): migrate deprecated Text to design system (#27395)
georgewrmarshall Mar 20, 2026
39190c9
refactor: remove swaps-controller package (#27547)
GeorgeGkas Mar 20, 2026
b42b69e
fix: replace static hex colors with design tokens in test files (#26396)
TanayK07 Mar 20, 2026
a974cf2
refactor(card): remove cardGeolocation property and selectors (#27747)
Brunonascdev Mar 20, 2026
73198ff
refactor: simplify rampsUnifiedBuyV2 feature flag to single selector …
wachunei Mar 20, 2026
0f0a400
chore: Exempt `metamaskbotv2` from CLA check cp-7.71.0 (#27758)
Gudahtt Mar 20, 2026
5bd79a8
chore(release): Bump main version to 7.72.0 (#27711)
metamaskbot Mar 20, 2026
2bcd74c
ci: split build artifacts and fix testflight upload for runway (#27766)
tommasini Mar 20, 2026
8a03f66
fix(ramps): Preserve user-entered amount during Transak navigation re…
imyugioh Mar 21, 2026
a4173d3
test: fixes maestro type (#27727)
christopherferreira9 Mar 23, 2026
e00e8ad
fix: suppress WebView JS dialogs when browser screen loses focus (#26…
joaoloureirop Mar 23, 2026
0ec7bc6
feat: migrate Button component (transactions scope) (#27625)
kirillzyusko Mar 23, 2026
7e9748e
fix(ramp): fixes order details bug cp-7.71.0 (#27755)
georgeweiler Mar 23, 2026
c6d96b6
fix: start Ramps V2 init when remote feature flags hydrate cp-7.71.0 …
amitabh94 Mar 23, 2026
c70dee9
fix: Ensure root messenger has required function for error reporting …
FrederikBolding Mar 23, 2026
7241a74
chore: market insights arrows updated cp-7.71.0 (#27790)
zone-live Mar 23, 2026
8b60202
Merge origin/main into stable-main-7.72.0
metamaskbot Mar 23, 2026
174afa0
fix(ramps): fixes 0 ETH ramps issue when order data is not yet availa…
georgeweiler Mar 23, 2026
6239daf
chore: remove outdated confirmations documentation (#27795)
matthewwalsh0 Mar 23, 2026
4ad6e49
chore(release): sync stable to main for version 7.72.0 (#27809)
metamaskbotv2[bot] Mar 23, 2026
81ab342
fix(assets-controller): switch from metametrics to sentry for inital …
Kriys94 Mar 23, 2026
c56e9d0
chore(ci): remove release-pr-approval workflow (#27808)
Qbandev Mar 23, 2026
436bbbc
chore: stop using tokensChainsCache in confirmations (#27611)
juanmigdr Mar 23, 2026
173222b
fix(rewards): use GeolocationController for mUSD card geo check (#27746)
VGR-GIT Mar 23, 2026
12a39a6
feat: migrate TooltipModal to design system components (#27753)
GeorgeGkas Mar 23, 2026
4c5ffae
docs(perps/agentic): eval-ref vocabulary rename, HUD propagation, flo…
abretonc7s Mar 23, 2026
a6f1e3f
fix: gasless support check in hook useAutomaticGasFeeTokenSelect (#27…
jpuri Mar 23, 2026
d053b30
test: extend withdraw e2e test (#27697)
racitores Mar 23, 2026
1ed96f7
test: color-no-hex earn batch (#27151)
georgewrmarshall Mar 23, 2026
6e0f698
chore: adds market insights metric to Perps view entry point cp-7.71.…
zone-live Mar 23, 2026
a4522a3
feat(rewards): update campaigns feature flag behavior on dashboard (#…
VGR-GIT Mar 23, 2026
53f88c3
test: fix flaky TrendingTokensFullView search test (#27822)
racitores Mar 23, 2026
4a4f0ae
chore(deps): ramps-controller preview for MetaMask/core#8251 -> cp-7.…
imyugioh Mar 23, 2026
963328b
fix: swap activity fee label paid by metamask (#27268)
maxime-oe Mar 23, 2026
6d23927
refactor(analytics): C2 migrate network, accounts, and permissions to…
NicolasMassart Mar 23, 2026
ba36624
chore: consolidate source_branch and ref in build.yml (#27768)
weitingsun Mar 23, 2026
88e375e
test: color-no-hex assets batch (#27150)
georgewrmarshall Mar 23, 2026
d683173
chore: create an checkbox to upload the sourcemap in build mobile wor…
weitingsun Mar 23, 2026
4efb704
fix(ramps): improve external-browser callback redirection cp-7.71.0 (…
georgeweiler Mar 23, 2026
b14624d
test: fix ramp unified buy e2e test (#27818)
cortisiko Mar 24, 2026
7a23999
fix: ensure error messages are never empty in authentication and logi…
smgv Mar 24, 2026
1133375
chore: add stable network (#27258)
jeremy-consensys Mar 24, 2026
d2e8db6
refactor: replace native ActionSheet with BottomSheet for NFT actions…
juanmigdr Mar 24, 2026
81ce895
test: fix perf login tests (#27835)
cortisiko Mar 24, 2026
ed6585a
feat: hide Speed up and Cancel when gas is paid with alternate token …
vinistevam Mar 24, 2026
a2f8164
fix: support webcredentials cp-7.71.0 (#27741)
ieow Mar 24, 2026
1897f33
test(swap): enable Smart Transactions in swap and bridge E2E tests (#…
davibroc Mar 24, 2026
a092b62
chore: add commas to PnL (#27815)
juanmigdr Mar 24, 2026
ab4c4b7
fix: remove silent Ledger fallbacks in `useHardwareWallet` (#27056)
mathieuartu Mar 24, 2026
4371caf
feat(card): Solana Delegation (#25276)
Brunonascdev Mar 24, 2026
2898ec8
fix(perps): fix HIP-3 asset ID lookup failure from dual-cache desync …
abretonc7s Mar 24, 2026
4661cdb
fix(ramps): filter activity tab's transfer details for selected accou…
imyugioh Mar 24, 2026
d23e31c
feat: Add Perps Withdraw button into Developer Options, show new Perp…
dan437 Mar 24, 2026
79b1aa8
feat: add metrics opt In event (#27846)
grvgoel81 Mar 24, 2026
7cb69e3
fix(perps): use correct toast design for order submission based on pa…
michalconsensys Mar 24, 2026
627b357
feat: enhance TransactionsFooter to dynamically display block explore…
PatrykLucka Mar 24, 2026
f083ce9
feat(i18n): Update language display names to native forms (#27788)
PatrykLucka Mar 24, 2026
ef3a973
fix(perps): validate TP/SL prices, clear stale config, and block inva…
michalconsensys Mar 24, 2026
6ae4c95
feat: legacy-ios-feature-flag cp-7.71.0 (#27848)
ieow Mar 24, 2026
905939b
chore: remove hardware wallet dead code (#27737)
mathieuartu Mar 24, 2026
9564fd6
test: MMQA-1384: Add coverage for address collection (#27817)
racitores Mar 24, 2026
57308b4
test: color-no-hex mobile-core-ux batch (#27152)
georgewrmarshall Mar 24, 2026
9385d8c
test: color-no-hex shared-unowned batch (#27153)
georgewrmarshall Mar 24, 2026
3d613d9
refactor: migrate ChoosePassword to design system components and Tail…
smgv Mar 24, 2026
e9926e8
fix: hide speed row on network fee section on confirmation page when …
jpuri Mar 24, 2026
28733f8
feat: create Runway RC (#27662)
weitingsun Mar 24, 2026
fcdbf7e
feat(agents): add skill authoring standard (#27733)
bfullam Mar 24, 2026
4112c28
fix: improve E2E test stability for single-failure flaky tests (#27842)
cmd-ob Mar 24, 2026
5d0b9cc
feat: MUSD-542 money home screen empty state (#27831)
Matt561 Mar 24, 2026
c4b93de
fix: hardware wallet eip 7702 issue (cp-7.71.0) (#27615)
khanti42 Mar 24, 2026
4f719e6
feat(error-boundary): move ErrorBoundary above providers to catch all…
tommasini Mar 24, 2026
f92da91
feat(rewards): remove campaigns feature flag (#27863)
VGR-GIT Mar 24, 2026
75bef55
fix: disable Branch test instance and debug mode in branch.json cp-7.…
tommasini Mar 24, 2026
025e1ef
chore: update unit testing cursor rule for theme mocks (#27825)
georgewrmarshall Mar 24, 2026
9874d9c
test: add component view tests for EVM and ERC-1155 send flows (#27759)
davibroc Mar 24, 2026
0c163c9
refactor: migrate SelectSRP, and SRPList to design system (#27721)
grvgoel81 Mar 25, 2026
b256fca
chore(rewards): add image and remove status label (#27890)
sophieqgu Mar 25, 2026
72c0a94
refactor: migrate reveal-srp-ui to design system components and Tailw…
smgv Mar 25, 2026
8976694
docs(perps): add caching architecture and review anti-patterns docs (…
abretonc7s Mar 25, 2026
46e0425
feat: enable sending ERC1155 NFTs from the NFT details screen (#27800)
juanmigdr Mar 25, 2026
f09974b
fix(perps): Pill stop loss don't show up in recent activity (regressi…
abretonc7s Mar 25, 2026
6fa43af
fix(perps): reduce max order amount by 0.5% buffer to avoid insuffici…
michalconsensys Mar 25, 2026
6df8a92
fix: biometric bug with incorrect password during rehydration (#27900)
grvgoel81 Mar 25, 2026
62f6136
feat(perps): core resolver — providerCredentials, builder fee injecti…
abretonc7s Mar 25, 2026
b2ebb6d
feat: add access restricted modal and compliance UI infrastructure (#…
michalconsensys Mar 25, 2026
dbff111
feat: bump seedless onboarding controller (#27859)
grvgoel81 Mar 25, 2026
91fc0b0
Merge origin/main into stable-main-7.72.0
metamaskbot Mar 25, 2026
48892de
chore(release): sync stable to main for version 7.70.1 (#27913)
metamaskbotv2[bot] Mar 25, 2026
7ce45e9
feat(activity): Enhance incoming native transfer handling with poison…
PatrykLucka Mar 25, 2026
17260ce
test: color-no-hex small-owners batch (#27154)
georgewrmarshall Mar 25, 2026
602b027
test: add empty mocks for digest API (#27911)
christopherferreira9 Mar 25, 2026
ad3b7a5
test: add playwright assertions class (#27897)
cortisiko Mar 25, 2026
8a7bced
fix: hides perps buttons in ai insights when user has a position cp-7…
joaosantos15 Mar 25, 2026
5e444bd
feat: add test app universal link support (#27811)
baptiste-marchand Mar 25, 2026
ef5e684
feat(earn): gate Tron unstaked claim button behind remote flag (#27908)
ulissesferreira Mar 25, 2026
0b1f7be
chore: New Crowdin translations by Github Action cp-7.71.0 (#27496)
metamaskbot Mar 25, 2026
09b7f3b
feat(rewards): add Ondo leaderboard view and position component (#27917)
VGR-GIT Mar 25, 2026
776ab6a
feat: migrate Button (bridge scope) (#27535)
kirillzyusko Mar 25, 2026
88aec0c
fix(card): fix missing network issue (#27833)
Brunonascdev Mar 25, 2026
65a83ce
fix: fixes the text wrapping in the predict outcome CTA button (#27832)
ghgoodreau Mar 25, 2026
a029c8a
chore: Market Insights - feedback, require a reason for sending other…
zone-live Mar 25, 2026
09436d8
feat: migrate Button (wallet-integration scope) (#27548)
kirillzyusko Mar 25, 2026
01706bd
feat: migrate Button (confirmations scope) (#27805)
kirillzyusko Mar 25, 2026
002d91a
feat: show legacy ios login warning prompt cp-7.71.0 (#27875)
ieow Mar 25, 2026
dfdfbce
chore: visual update and animation market insights (#27914)
zone-live Mar 25, 2026
d4cdad3
feat: migrate Button (card scope) (#27752)
kirillzyusko Mar 25, 2026
8077384
fix: Fix redux store event handler leak in WCv2 (#27932)
jiexi Mar 25, 2026
bcf7f71
feat: Update musd calculator (#27949)
Montoya Mar 25, 2026
eb330c5
fix: make WCv2 session restore sequential (#27950)
jiexi Mar 25, 2026
98e65ea
fix: use pairingTopic for permission revocation in removeSession() (#…
adonesky1 Mar 25, 2026
6e7ce9b
chore: update AI insights tracking (#27851)
joaosantos15 Mar 26, 2026
ec3d218
feat: Clean up Rewards pages and add metrics (#27952)
Montoya Mar 26, 2026
37ca45a
test: Migrate page objects to unified framework (Onboarding) (#27956)
cortisiko Mar 26, 2026
99ac87f
chore: market insights, adds filled state and persist ability to the …
zone-live Mar 26, 2026
de36dee
feat(card): refactor spending limit screen (#27918)
Brunonascdev Mar 26, 2026
2cfeb08
feat: migrate Button (web3auth scope) (#27810)
kirillzyusko Mar 26, 2026
d0b494f
fix(perps): Can't create a TP/SL with 6 decimals for PUMP (#27901)
abretonc7s Mar 26, 2026
0978f3f
fix(perps): Adjust incorrect market categories (#27910)
abretonc7s Mar 26, 2026
5e7b624
refactor(analytics): C4 migrate useMetrics to useAnalytics: Simulatio…
NicolasMassart Mar 26, 2026
048febe
refactor(analytics): C5 migrate to useAnalytics in PredictGTMModal (#…
NicolasMassart Mar 26, 2026
5bc0539
fix(perps): Incorrect PnL and order size displayed in perp market pag…
abretonc7s Mar 26, 2026
3a6aaf3
chore: upgrade design-system-react-native to 0.11.0 and deprecate rep…
georgewrmarshall Mar 26, 2026
d0ed881
fix: fix charting url (#27972)
sahar-fehri Mar 26, 2026
241087f
feat: added 'View all' button in explore search (#26569)
juanmigdr Mar 26, 2026
65c4658
test(swap): add gasless swap e2e tests for ETH/USDC to MUSD with 7702…
davibroc Mar 26, 2026
31ebc2b
feat(rewards): Ondo GM portfolio position and leaderboard section (#2…
VGR-GIT Mar 26, 2026
ae5b5bb
feat(card): add balance properties on SpendingLimit Card Viewed scree…
Brunonascdev Mar 26, 2026
e390ef6
[skip ci] Bump version number to 4200
metamaskbot Mar 26, 2026
3173493
chore(runway): cherry-pick feat: add marketing event for seedless use…
runway-github[bot] Mar 27, 2026
af52013
[skip ci] Bump version number to 4212
metamaskbot Mar 27, 2026
0313b86
chore: resolve merge conflicts for stable sync into release/7.72.0
chloeYue Mar 27, 2026
5d3e496
chore: Stable sync release 7.72.0 (#28056)
chloeYue Mar 27, 2026
9275ec3
[skip ci] Bump version number to 4215
metamaskbot Mar 27, 2026
3fd454e
chore(runway): cherry-pick fix: prevent uncaught error from missing c…
runway-github[bot] Mar 30, 2026
b583970
[skip ci] Bump version number to 4228
metamaskbot Mar 30, 2026
e2479c9
chore(runway): cherry-pick fix: point DIGEST_API_URL to production en…
runway-github[bot] Mar 30, 2026
35cdb95
[skip ci] Bump version number to 4233
metamaskbot Mar 30, 2026
bb88ba5
chore(runway): cherry-pick feat: Braze SDK integration [GE-107] cp-7.…
runway-github[bot] Mar 31, 2026
d52ae9c
[skip ci] Bump version number to 4244
metamaskbot Mar 31, 2026
9037f77
chore: merge stable into release/7.72.0 for stable sync
chloeYue Mar 31, 2026
0516a30
chore: Stable sync release 7.72.0 (#28158)
chloeYue Mar 31, 2026
90ad560
[skip ci] Bump version number to 4245
metamaskbot Mar 31, 2026
6680285
chore(runway): cherry-pick fix(token-details): make sticky swap defa…
runway-github[bot] Apr 1, 2026
8008eec
[skip ci] Bump version number to 4276
metamaskbot Apr 1, 2026
3a2b439
chore(runway): cherry-pick chore: New Crowdin translations by Github …
runway-github[bot] Apr 1, 2026
0582153
[skip ci] Bump version number to 4277
metamaskbot Apr 1, 2026
b7c140a
chore(runway): cherry-pick fix: enhance useMerklBonusClaim with sessi…
runway-github[bot] Apr 1, 2026
305f6ab
[skip ci] Bump version number to 4278
metamaskbot Apr 1, 2026
d396076
chore(runway): cherry-pick fix(perps): centralize Arbitrum network ch…
runway-github[bot] Apr 1, 2026
578b839
[skip ci] Bump version number to 4281
metamaskbot Apr 1, 2026
c314db7
chore(runway): cherry-pick chore(deps): suppress xmldom CDATA seriali…
runway-github[bot] Apr 1, 2026
c4b2f94
[skip ci] Bump version number to 4284
metamaskbot Apr 1, 2026
14036f5
chore(runway): cherry-pick fix(oauth): sync marketing opt-in and anal…
runway-github[bot] Apr 1, 2026
871a63e
chore(runway): cherry-pick fix(perps): sync pending payment token and…
runway-github[bot] Apr 1, 2026
1d15fed
[skip ci] Bump version number to 4288
metamaskbot Apr 1, 2026
47a356b
chore(runway): cherry-pick feat: legacy-ios-redirect (#28283)
runway-github[bot] Apr 2, 2026
c07fbf5
[skip ci] Bump version number to 4294
metamaskbot Apr 2, 2026
31762d9
chore(runway): cherry-pick refactor(deposit): restore param-based web…
runway-github[bot] Apr 2, 2026
7c5f2a6
[skip ci] Bump version number to 4296
metamaskbot Apr 2, 2026
39190eb
chore(runway): cherry-pick fix(deposit): hydrate provider token on De…
runway-github[bot] Apr 2, 2026
1672c19
[skip ci] Bump version number to 4297
metamaskbot Apr 2, 2026
6b9cf6c
chore(runway): cherry-pick fix(deposit): align Ramp deposit order ids…
runway-github[bot] Apr 2, 2026
5681aee
[skip ci] Bump version number to 4298
metamaskbot Apr 2, 2026
30a9c5f
chore(runway): cherry-pick fix(perps): prevent rate limit exhaustion …
runway-github[bot] Apr 2, 2026
9ab7f03
[skip ci] Bump version number to 4299
metamaskbot Apr 2, 2026
2006e5f
chore(runway): cherry-pick fix: lodash audit advisory and workflow ya…
runway-github[bot] Apr 2, 2026
6d9454a
[skip ci] Bump version number to 4306
metamaskbot Apr 2, 2026
95ba0d0
chore(runway): cherry-pick fix: MUSD-562 eagerly register mUSD token …
runway-github[bot] Apr 3, 2026
dd3fdef
[skip ci] Bump version number to 4322
metamaskbot Apr 3, 2026
2a47216
[skip ci] Bump version number to 4329
metamaskbot Apr 3, 2026
007fd2a
chore(runway): cherry-pick fix: Resolve fine location max sdk to app …
runway-github[bot] Apr 3, 2026
d6f86e3
[skip ci] Bump version number to 4333
metamaskbot Apr 3, 2026
f848a59
chore(runway): cherry-pick fix: Remove Android access fine location f…
runway-github[bot] Apr 6, 2026
238d5ca
release: release-changelog/7.72.0 (#27991)
metamaskbot Apr 7, 2026
5ad0a71
chore(ci): cherry-pick xmldom 0.8.12 bump (#28424) into release/7.72.…
chloeYue Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 6 additions & 6 deletions .agents/skills/e2e-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ Step 5 → Iterate (fix → lint → run) until green

Documentation is split by **action**. Open only the reference that matches what you are doing.

| Action | File | When to open it |
| --------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| **Writing or updating a spec** | [references/writing-tests.md](references/writing-tests.md) | New spec file, spec structure, FixtureBuilder patterns, smoke/regression templates. |
| **Page Objects and selectors** | [references/page-objects.md](references/page-objects.md) | Create or update POM classes, selector/testId conventions, Matchers/Gestures/Assertions API. |
| **API and feature flag mocking** | [references/mocking.md](references/mocking.md) | testSpecificMock, setupRemoteFeatureFlagsMock, setupMockRequest, shared mock files. |
| Action | File | When to open it |
| --------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Writing or updating a spec** | [references/writing-tests.md](references/writing-tests.md) | New spec file, spec structure, FixtureBuilder patterns, smoke/regression templates. |
| **Page Objects and selectors** | [references/page-objects.md](references/page-objects.md) | Create or update POM classes, selector/testId conventions, Matchers/Gestures/Assertions API. |
| **API and feature flag mocking** | [references/mocking.md](references/mocking.md) | testSpecificMock, setupRemoteFeatureFlagsMock, setupMockRequest, shared mock files. |
| **MetaMetrics / analytics expectations** | [tests/docs/analytics-e2e.md](../../../tests/docs/analytics-e2e.md) | `analyticsExpectations` on `withFixtures`, declarative checks, presets in `tests/helpers/analytics/expectations/`. |
| **Running tests, debugging, fixing failures** | [references/running-tests.md](references/running-tests.md) | Build check, detox run commands, lint/tsc, common failures table, retry patterns, iteration loop. |
| **Running tests, debugging, fixing failures** | [references/running-tests.md](references/running-tests.md) | Build check, detox run commands, lint/tsc, common failures table, retry patterns, iteration loop. |
137 changes: 137 additions & 0 deletions .agents/skills/repo-skill-authoring/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
---
name: repo-skill-authoring
description: Create and update repo-local skills that follow the MetaMask Mobile standard. Use for new repo-local skills, skill entrypoints, or harness shims in this repository.
---

# Repo Skill Authoring

Canonical guidance for creating and updating repo-local skills in MetaMask Mobile.

## Purpose

Use this standard when the repo needs a reusable agent workflow with stable instructions, validation, or harness shims.

Do not create a skill when one of these is enough:

- `AGENTS.md` or a narrow `tests/AGENTS.md` pointer
- Existing product or engineering docs in `docs/`
- A one-off prompt that does not need to be reused

Create a skill when the work is repeated, fragile, or benefits from a shared workflow across agents.

## When To Use This vs Native Skill Creator

Use the native or harness-provided `skill-creator` guidance for general skill design principles or when creating a skill outside this repository.

Use `repo-skill-authoring` for any MetaMask Mobile repo-local skill that should live in `.agents/skills/`, `.claude/`, or other repo-owned harness folders.

If both apply, use native `skill-creator` for general design guidance, and use this skill as the source of truth for repository-specific structure, naming, and entrypoints.

## Harness Entrypoints

Use these entrypoints:

- Codex skill entrypoint: `.agents/skills/repo-skill-authoring/SKILL.md` (`$repo-skill-authoring`)
- Claude skill entrypoint: `.claude/skills/repo-skill-authoring/SKILL.md`

## Repo Skill Shape

Required shape for a repo-local skill:

```text
.agents/skills/<skill-name>/SKILL.md
.agents/skills/<skill-name>/agents/openai.yaml
```

Optional shape, when the workflow needs it:

```text
.agents/skills/<skill-name>/scripts/
.agents/skills/<skill-name>/references/
.agents/skills/<skill-name>/assets/
.claude/skills/<skill-name>/SKILL.md
```

Keep `.agents/skills/<name>/SKILL.md` as the single source of truth. Any harness-specific shim should point directly to it.

## Naming And Trigger Rules

- Skill folder names use lowercase letters, digits, and hyphens only.
- The folder name and `SKILL.md` frontmatter `name` must match exactly.
- The Codex `description` must say what the skill does and when to use it.
- Prefer names that describe the reusable workflow, not the implementation detail.
- Keep the skill focused on repo-local conventions that are not already handled by generic guidance.

## Agent Execution Standard

For agent implementation and review tasks, follow this workflow:

1. Define the user/problem shape.
- Write down the jobs the skill should handle.
- Prefer concrete trigger phrases and in-scope task examples.
2. Split the content deliberately.
- Put the canonical workflow, conventions, and examples in this `SKILL.md`.
- Add `scripts/` only when deterministic validation or repeated logic is worth the maintenance cost.
- Add `references/` only when detailed content should be loaded on demand instead of sitting in the skill body.
3. Add the skill entrypoint.
- Include frontmatter `name` and `description`.
- Keep this file readable by both agents and humans.
4. Add the minimum harness shims required.
- Add `.claude/skills/<name>/SKILL.md` when Claude needs a pointer.
- Point every shim directly back to `.agents/skills/<name>/SKILL.md`.
5. Sanity check the result.
- Confirm the skill and any shims all point to the same workflow.

Authoring principle:

- Keep the repo skill as the canonical artifact. Avoid extra pointer layers unless they materially improve discovery or ergonomics.

Required agent response sections:

1. `Implementation Checklist`
2. `Files To Add Or Modify`
3. `Validation`
4. `Assumptions`

## Minimal Examples

### Canonical Repo Skill

```md
---
name: topic
description: Create and update the repo-local topic workflow. Use for new skill content or harness shims in this repository.
---

# Topic

## Purpose

Explain when this repo-local skill is needed and when existing repo docs are enough.

## Agent Execution Standard

1. Discover current implementation.
2. Apply repo-specific workflow.
3. Confirm any shims stay aligned.
```

### Claude Skill Shim

```md
---
name: topic
summary: Create or update the repo-local topic workflow.
---

Follow `.agents/skills/topic/SKILL.md`.
```

### agents/openai.yaml

```yaml
interface:
display_name: 'Topic'
short_description: 'Create and validate the repo-local topic workflow.'
default_prompt: 'Use $topic to create or update the canonical repo-local topic workflow.'
```
4 changes: 4 additions & 0 deletions .agents/skills/repo-skill-authoring/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Repo Skill Authoring"
short_description: "Create and validate repo-local skills."
default_prompt: "Use $repo-skill-authoring to create or update the canonical repo-local skill and any necessary harness shims."
2 changes: 2 additions & 0 deletions .android.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ export MM_FOX_CODE="EXAMPLE_FOX_CODE"
export MM_BRANCH_KEY_TEST=
export MM_BRANCH_KEY_LIVE=
export METAMASK_BUILD_TYPE=
export MM_BRAZE_API_KEY_ANDROID=
export MM_BRAZE_SDK_ENDPOINT="sdk.iad-07.braze.com"
6 changes: 6 additions & 0 deletions .claude/skills/repo-skill-authoring/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
name: repo-skill-authoring
summary: Create or update repo-local skills using the repository standard.
---

Follow `.agents/skills/repo-skill-authoring/SKILL.md`.
60 changes: 60 additions & 0 deletions .cursor/rules/unit-testing-guidelines.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,66 @@ See [PR #25548](https://github.com/MetaMask/metamask-mobile/pull/25548) for refa
- **Mock all external dependencies** including APIs, services, hooks
- **Use realistic mock data** that reflects real usage

### Theme Mocking Rules

- **Prefer shared `mockTheme` from `app/util/theme`** instead of hard-coded color literals in tests.
- **Never hardcode design token hex values** in assertions or theme mocks (enforced by `@metamask/design-tokens/color-no-hex`).
- **Avoid local hex color objects** for `useTheme`, `useStyles`, or tailwind mock color functions.
- **If a test only needs a specific theme field**, derive it from `mockTheme` (or spread `mockTheme` and override minimally).

```ts
// ✅ CORRECT: use shared mockTheme for useTheme mocks
import { mockTheme } from '../../util/theme';

jest.mock('../../util/theme', () => ({
useTheme: () => mockTheme,
}));
```

```ts
// ✅ CORRECT: return { styles, theme } for useStyles mocks
import { mockTheme } from '../../util/theme';

jest.mock('../../../../../component-library/hooks', () => ({
useStyles: jest.fn((styleFn, vars) => ({
styles: styleFn({ theme: mockTheme, vars }),
theme: mockTheme,
})),
}));
```

```ts
// ✅ CORRECT: mock useTailwind with the right shape
jest.mock('@metamask/design-system-twrnc-preset', () => ({
useTailwind: () => ({
// Most components only need tw.style(...)
style: jest.fn(() => ({})),
}),
}));
```

```ts
// ✅ ALSO CORRECT: match real useTailwind() return type (callable function + helpers)
import { mockTheme } from '../../util/theme';

jest.mock('@metamask/design-system-twrnc-preset', () => ({
useTailwind: () => {
const tw = () => ({});
tw.style = jest.fn(() => ({}));
return tw;
},
}));
```

```ts
// ❌ AVOID: local hex color mocks
const mockColors = {
text: { default: '#000000' },
background: { default: '#FFFFFF' },
border: { muted: '#E5E7EB' },
};
```

```ts
// ✅ CORRECT
import { apiService } from '../services/api';
Expand Down
55 changes: 55 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,12 +181,67 @@ module.exports = {
},
{
files: [
// @MetaMask/card
'app/components/UI/Card/**/*.{js,jsx,ts,tsx}',
// @MetaMask/core-platform
'app/components/Snaps/**/*.{js,jsx,ts,tsx}',
// @MetaMask/predict
'app/components/UI/Predict/**/*.{js,jsx,ts,tsx}',
// @MetaMask/ramp
'app/components/UI/Ramp/**/*.{js,jsx,ts,tsx}',
// @MetaMask/rewards
'app/components/UI/Rewards/**/*.{js,jsx,ts,tsx}',
// @MetaMask/perps
'app/components/UI/Perps/**/*.{js,jsx,ts,tsx}',
// @MetaMask/metamask-earn
'app/components/UI/Earn/**/*.{js,jsx,ts,tsx}',
'app/components/UI/Stake/**/*.{js,jsx,ts,tsx}',
// @MetaMask/metamask-assets
'app/components/UI/Assets/**/*.{js,jsx,ts,tsx}',
'app/components/UI/Tokens/**/*.{js,jsx,ts,tsx}',
'app/components/UI/AssetOverview/**/*.{js,jsx,ts,tsx}',
'app/components/UI/Collectibles/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleContractElement/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleContractInformation/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleContractOverview/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleContracts/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleDetectionModal/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleMedia/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleModal/**/*.{js,jsx,ts,tsx}',
'app/components/UI/CollectibleOverview/**/*.{js,jsx,ts,tsx}',
'app/components/UI/ConfirmAddAsset/**/*.{js,jsx,ts,tsx}',
'app/components/UI/DeFiPositions/**/*.{js,jsx,ts,tsx}',
'app/components/UI/TokenDetails/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AddAsset/**/*.{js,jsx,ts,tsx}',
'app/components/Views/Asset/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AssetDetails/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AssetHideConfirmation/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AssetOptions/**/*.{js,jsx,ts,tsx}',
'app/components/Views/Collectible/**/*.{js,jsx,ts,tsx}',
'app/components/Views/CollectibleView/**/*.{js,jsx,ts,tsx}',
'app/components/Views/DetectedTokens/**/*.{js,jsx,ts,tsx}',
'app/components/Views/NFTAutoDetectionModal/**/*.{js,jsx,ts,tsx}',
'app/components/Views/NftDetails/**/*.{js,jsx,ts,tsx}',
// @MetaMask/mobile-core-ux
'app/components/Views/AccountActions/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AccountSelector/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AccountsMenu/**/*.{js,jsx,ts,tsx}',
'app/components/Views/AddressQRCode/**/*.{js,jsx,ts,tsx}',
'app/components/Views/EditAccountName/**/*.{js,jsx,ts,tsx}',
'app/components/Views/LockScreen/**/*.{js,jsx,ts,tsx}',
'app/components/Views/Login/**/*.{js,jsx,ts,tsx}',
'app/components/Views/MultichainTransactionsView/**/*.{js,jsx,ts,tsx}',
'app/components/Views/NetworkConnect/**/*.{js,jsx,ts,tsx}',
'app/components/Views/NetworkSelector/**/*.{js,jsx,ts,tsx}',
'app/components/Views/QRAccountDisplay/**/*.{js,jsx,ts,tsx}',
'app/components/Views/QRScanner/**/*.{js,jsx,ts,tsx}',
'app/components/Views/Settings/**/*.{js,jsx,ts,tsx}',
'app/components/Views/TermsAndConditions/**/*.{js,jsx,ts,tsx}',
'app/components/Views/UnifiedTransactionsView/**/*.{js,jsx,ts,tsx}',
'app/components/UI/MultichainTransactionListItem/**/*.{js,jsx,ts,tsx}',
'app/components/UI/TransactionActionModal/**/*.{js,jsx,ts,tsx}',
'app/components/UI/TransactionElement/**/*.{js,jsx,ts,tsx}',
'app/components/UI/Transactions/**/*.{js,jsx,ts,tsx}',
],
rules: {
'@metamask/design-tokens/color-no-hex': 'error',
Expand Down
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ app/core/Engine/messengers/earn-controller-messenger @MetaMask/metamask-earn
app/selectors/earnController @MetaMask/metamask-earn
**/Earn/** @MetaMask/metamask-earn
**/earn/** @MetaMask/metamask-earn
**/Money/** @MetaMask/metamask-earn
**/money/** @MetaMask/metamask-earn

# Rewards Team
app/core/Engine/controllers/rewards-controller @MetaMask/rewards
Expand All @@ -164,6 +166,7 @@ app/selectors/featureFlagController/rewards @MetaMask/rewards
**/rewards/** @MetaMask/rewards

# Perps Team
scripts/perps/agentic/teams/perps/ @MetaMask/perps
app/components/UI/Perps/ @MetaMask/perps
app/components/UI/WalletAction/*perps* @MetaMask/perps
app/core/Engine/controllers/perps-controller @MetaMask/perps
Expand All @@ -187,6 +190,7 @@ app/core/DeeplinkManager/handlers/legacy/handlePredictUrl.ts @MetaMask/predict
app/components/hooks/useIsOriginalNativeTokenSymbol @MetaMask/metamask-assets
app/components/hooks/useTokenBalancesController @MetaMask/metamask-assets
app/components/hooks/useTokenBalance.tsx @MetaMask/metamask-assets
app/components/hooks/useTokensData @MetaMask/metamask-assets
app/components/hooks/useSafeChains.ts @MetaMask/metamask-assets
app/components/UI/Assets @MetaMask/metamask-assets
app/components/UI/AssetOverview @MetaMask/metamask-assets
Expand Down
Loading
Loading