You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Install a base skill set by default. Skills marked base: true in frontmatter install on every automatic postinstall regardless of domain selection, so a fresh clone lands a useful set with no configuration. yarn skills is unchanged and still installs every domain. Opt out with SKILLS_AUTO_UPDATE=0. (#135)
Lint rules for base skills: a base: true skill cannot also be experimental, and its description must be long enough to self-trigger (BASE_DESCRIPTION_MIN). Both are errors, so CI fails rather than warning invisibly. (#135)
Validate --domain / SKILLS_DOMAINS against the domains that actually exist. A typo previously installed the base set and exited 0, which reads as success. (#135)
Add swaps-cpu-profile-audit skill for MetaMask Mobile: parse a recorded Hermes / React Native Release Profiler .cpuprofile and audit slow frames in swaps/bridge. (#123)
Add opt-in stale project skill pruning via --prune-stale and SKILLS_PRUNE_STALE=1.
Changed
Mobile testing guidance now defaults to the component-view layer, and the Appium local-run playbook moved into mobile-testing. (#70, #54)
Component-view testing guidance gained flakiness and assertion patterns, now requires awaiting async-gated content, and bans nested findBy inside waitFor. (#109, #115, #132)
Extension testing guidance clarifies where integration tests belong. (#134)
The Extension UI skill is now an MMDS gateway. (#138)
Breaking: frontmatter key mandatory renamed to base. Update any skill still using mandatory:. (#135)
Breaking:postinstall now syncs by default. It previously required SKILLS_AUTO_UPDATE=1; the opt-out is now SKILLS_AUTO_UPDATE=0. An explicitly empty SKILLS_AUTO_UPDATE= keeps its old meaning (off) rather than being read as unset. (#135)
base: truthiness is consistent across all four implementations. The linter alone accepted on/off, so base: on linted clean while the installer skipped the skill. (#135)
Rewrite CONTRIBUTING.md and skill template for MetaMask/skills layout.
swaps-cpu-profile-audit now audits the whole capture instead of swaps-owned files only: non-swaps frames that ran while the user was on a swaps screen are classified by their relation to the swaps call stacks (called by swaps, hosts the swaps screen, or concurrent with it), bucketed into named context areas, and reported alongside swaps rows. Every reported row carries an Owned by swaps column, and fix depth is gated on it. New --context-min-pct and --swaps-only analyzer flags.
swaps-cpu-profile-audit reports swaps-owned areas, non-swaps areas on the swaps path, and non-swaps areas running concurrently as separate tables, so the per-area swaps detail is no longer diluted by context rows. The swaps table gained an inclusive-time column, and the report explains that self time on a leaf means a screen can trigger heavy work while showing ~0 ms of its own. Non-swaps rows in the fix table are now capped to the few that matter.
Harden validate script and review-pr skill security (#64)
tools/sync now execs the tools/install that shipped beside it in the pinned package, instead of preferring $METAMASK_SKILLS_DIR/tools/install. That path defaults to the .skills-cache clone tracking origin/main with no tag or commit pin, so an automatic postinstall could execute unreviewed shell from whatever was on main at that moment — bypassing lockfile pinning and release gating. The cache still supplies domains/ content; it no longer supplies executable code. (#135)
Cap the delegated sync subprocess so a stalled child cannot hang yarn install indefinitely, and report an ETIMEDOUT explicitly rather than returning a bare exit 1. (#135)
Append -oBatchMode=yes to any existing GIT_SSH_COMMAND instead of replacing it. GIT_TERMINAL_PROMPT/GIT_ASKPASS cover HTTPS only — ssh reads /dev/tty directly — but overwriting the variable would break a custom key, an agent, or a ProxyCommand on the private overlay clone these guards exist to protect. (#135)
A saved SKILLS_DOMAINS= (written by the old picker for the "all" choice) is no longer read as "no saved selection". Those engineers were silently dropped to base-only, and because pruning is off by default their other skills stayed on disk and went stale rather than visibly disappearing. (#135)
.skills.local readers strip inline comments consistently. The Bash side kept the # comment tail while the JS side stripped it, so a documented SKILLS_DOMAINS=perps # my choice resolved to the domain perps#mychoice. (#135)
--select with no valid entries now installs the base set instead of every domain. An empty result resolved to all, so mistyping the numbers did the opposite of narrowing the selection. (#135)
Preserve METAMASK_SKILLS_DIR and CONSENSYS_SKILLS_DIR entries when sync --save rewrites .skills.local.