[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sentry-dotagents-qa":3,"mdc--wuj97s-key":38,"related-repo-sentry-dotagents-qa":3389,"related-org-sentry-dotagents-qa":3413},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":34,"sourceUrl":36,"mdContent":37},"dotagents-qa","QA dotagents behavior with local fixtures","QA dotagents behavior changes in a Docker sandbox. Use when changes may affect dotagents install, sync, list, doctor, skill placement, agent symlinks, MCP or hook config generation, user scope, subagent runtime files, or package\u002Fruntime behavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sentry","Sentry","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsentry.png","getsentry",[13,17,20,23,24],{"name":14,"slug":15,"type":16},"QA","qa","tag",{"name":18,"slug":19,"type":16},"Local Development","local-development",{"name":21,"slug":22,"type":16},"MCP","mcp",{"name":9,"slug":8,"type":16},{"name":25,"slug":26,"type":16},"Testing","testing",205,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fdotagents","2026-07-18T05:16:07.165523",null,10,[33],"tag-production",{"repoUrl":28,"stars":27,"forks":31,"topics":35,"description":30},[33],"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fdotagents\u002Ftree\u002FHEAD\u002Fskills\u002Fdotagents-qa","---\nname: dotagents-qa\ndescription: QA dotagents behavior changes in a Docker sandbox. Use when changes may affect dotagents install, sync, list, doctor, skill placement, agent symlinks, MCP or hook config generation, user scope, subagent runtime files, or package\u002Fruntime behavior.\n---\n\n# dotagents QA\n\nDo real QA for the change in front of you. Docker is the safety boundary, not\nthe test plan: use it so dotagents cannot write to host agent config, host home\ndirectories, or host cache state while you build fixtures that prove the\nchanged behavior.\n\nAnswer the practical question: \"With this local dotagents build, does the\nchanged behavior still install, sync, and wire the expected files?\"\n\n## 1. Understand The Change\n\nStart from the diff and identify the behavior that could regress:\n\n```bash\ngit status --short\ngit diff --stat\ngit diff -- \u003Cpaths>\n```\n\nWrite down the QA target before running commands:\n- Which command path changed: `install`, `sync`, `list`, `doctor`, `add`,\n  `remove`, `mcp`, `trust`, `init`, package runtime, or scope resolution.\n- Which surfaces must be inspected: `.agents\u002Fskills`, agent skill symlinks,\n  MCP config, hook config, subagent runtime files, lockfile, gitignore, CLI\n  output, or user scope.\n- Which fixture shape proves it: checked-in example, local skills, nested\n  skills, wildcard source, specific agents, MCP entries, hooks, existing\n  broken state, user-scope state, or remote source.\n\nRead the targeted reference before running runtime-specific QA:\n- Core install\u002Fsync example: [references\u002Fcore-agentic-qa.md](references\u002Fcore-agentic-qa.md)\n- Codex custom agents and runtime caveats: [references\u002Fcodex.md](references\u002Fcodex.md)\n- Claude Code files and runtime caveats: [references\u002Fclaude.md](references\u002Fclaude.md)\n- Cursor files\u002Fruntime caveats: [references\u002Fcursor.md](references\u002Fcursor.md)\n- OpenCode files\u002Fruntime caveats: [references\u002Fopencode.md](references\u002Fopencode.md)\n\nRun focused Vitest coverage for logic bugs. Use this skill for end-to-end QA\nevidence, not as a substitute for regression tests.\n\n## 2. Enter A Docker Sandbox\n\nBuild the repo-local QA image when it is missing, when this Dockerfile changes,\nor when the repo `packageManager` pnpm version changes:\n\n```bash\ndocker build \\\n  -f skills\u002Fdotagents-qa\u002FDockerfile \\\n  -t dotagents-qa:local \\\n  skills\u002Fdotagents-qa\n```\n\nThe image installs the latest npm-published Codex, Claude Code, and OpenCode\nCLIs (`codex`, `claude`, `opencode`). Use them for version checks, help-output\nchecks, and optional isolated runtime probes. Their presence does not prove\nruntime discovery by itself; authenticated model-backed checks are still\nexplicit opt-ins.\n\nUse an interactive container so the QA steps stay change-specific:\n\n```bash\nREPO=\"$(pwd)\"\nOUT=\"$(mktemp -d \"${TMPDIR:-\u002Ftmp}\u002Fdotagents-qa.XXXXXX\")\"\ndocker run --rm -it \\\n  -v \"$REPO:\u002Fhost-repo:ro\" \\\n  -v \"$OUT:\u002Fqa-out\" \\\n  dotagents-qa:local\n```\n\nIf your tool environment is not attached to a TTY, use `-i` instead of `-it`\nand feed the same commands with a here-doc. Keep `-i`; without stdin attached,\nthe container shell will receive no script.\n\nInside the container:\n\n```bash\nset -euo pipefail\nexport CI=1\nexport HOME=\u002Fsandbox\u002Fhome\nexport DOTAGENTS_STATE_DIR=\u002Fsandbox\u002Fstate\nexport DOTAGENTS_HOME=\u002Fsandbox\u002Fuser-agents\n\nmkdir -p \"$HOME\" \"$DOTAGENTS_STATE_DIR\" \"$DOTAGENTS_HOME\" \u002Fsandbox\u002Frepo\ntar -C \u002Fhost-repo \\\n  --exclude=.git \\\n  --exclude=node_modules \\\n  --exclude=.turbo \\\n  --exclude=coverage \\\n  --exclude=core \\\n  --exclude='*.tsbuildinfo' \\\n  --exclude='packages\u002F*\u002Fdist' \\\n  -cf - . | tar -C \u002Fsandbox\u002Frepo -xf -\n\ncd \u002Fsandbox\u002Frepo\npnpm install --frozen-lockfile\npnpm build\n```\n\nRun package commands as the non-root `node` user. Root can bypass chmod-based\npermission checks, which can mask or invert filesystem regression tests.\n\nFor non-interactive QA, copy as root, then hand the repo to `node` before\nrunning package scripts:\n\n```bash\nchown -R node:node \u002Fsandbox\nsu -s \u002Fbin\u002Fbash node -c '\n  set -euo pipefail\n  export CI=1\n  export HOME=\u002Fsandbox\u002Fhome\n  export DOTAGENTS_STATE_DIR=\u002Fsandbox\u002Fstate\n  export DOTAGENTS_HOME=\u002Fsandbox\u002Fuser-agents\n  cd \u002Fsandbox\u002Frepo\n  pnpm install --frozen-lockfile\n  pnpm build\n  pnpm check\n  pnpm qa:example\n'\n```\n\nRun `pnpm check` inside Docker unless the change requires a narrower target or\nthe check is already known to be unrelated. If `build` or `check` fails, treat\nthat as a QA finding and stop before fixture work unless you are explicitly\nisolating the playbook mechanics. If skipped or bypassed, report why.\n\n## 3. Prefer The Checked-In Agentic QA\n\nUse the checked-in example QA for ordinary install\u002Fsync QA:\n\n```bash\npnpm qa:example\n```\n\nThe QA runner builds the local CLI, copies `examples\u002Ffull\u002F` to a temp project, and\nasserts:\n- `install`, `list`, `doctor --fix`, and `doctor` complete successfully\n- managed skills under `.agents\u002Fskills\u002F`\n- Claude\u002FCursor skill symlink behavior\n- MCP files for Claude, Cursor, Codex, and OpenCode\n- hook files for Claude and Cursor\n- canonical installed subagent under `.agents\u002Fagents\u002F`\n- generated subagent runtime files for Claude, Cursor, Codex, and OpenCode\n- `sync` repair after deleting representative generated files\n\nUse `node skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs all --keep` when you need\nto inspect the temp project; the script prints the retained path.\n\nFor paid Codex runtime proof of generated custom agents, run the runtime proof\noutside Docker only when the branch affects Codex custom agents or when\nreporting that Codex itself works:\n\n```bash\nnode skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs codex-runtime --keep\n```\n\nThat mode copies Codex auth\u002Fconfig into a temp `CODEX_HOME`, marks only the\ntemp example project trusted, and asserts that Codex can spawn the generated\n`.codex\u002Fagents\u002Fcode-reviewer.toml` agent. See\n[references\u002Fcodex.md](references\u002Fcodex.md) before changing or running this\npath.\n\n## 4. Build A Manual Fixture Only When Needed\n\nCreate a temp project manually only when the checked-in example does not cover\nthe changed behavior. Start from this shape and add only what the diff needs.\n\n```bash\nfixture=\u002Fsandbox\u002Ffixture\nmkdir -p \"$fixture\u002Flocal-skills\" \"$fixture\u002Flocal-agents\u002Fagents\"\nfor skill in review commit; do\n  mkdir -p \"$fixture\u002Flocal-skills\u002F$skill\"\n  printf -- \"---\\nname: %s\\ndescription: Fixture %s skill.\\n---\\n\\n%s fixture.\\n\" \\\n    \"$skill\" \"$skill\" \"$skill\" > \"$fixture\u002Flocal-skills\u002F$skill\u002FSKILL.md\"\ndone\n\ncat > \"$fixture\u002Flocal-agents\u002Fagents\u002Fcode-reviewer.md\" \u003C\u003C'EOF'\n---\nname: code-reviewer\ndescription: Review code for correctness.\n---\n\nReview the current diff and return findings with file references.\nEOF\n\ncat > \"$fixture\u002Fagents.toml\" \u003C\u003C'EOF'\nversion = 1\nagents = [\"claude\", \"cursor\", \"codex\", \"opencode\"]\n\n[[skills]]\nname = \"review\"\nsource = \"path:.\u002Flocal-skills\u002Freview\"\n\n[[skills]]\nname = \"commit\"\nsource = \"path:.\u002Flocal-skills\u002Fcommit\"\n\n[[mcp]]\nname = \"fixture\"\ncommand = \"node\"\nargs = [\"-e\", \"process.exit(0)\"]\n\n[[hooks]]\nevent = \"Stop\"\ncommand = \"echo fixture\"\n\n[[subagents]]\nname = \"code-reviewer\"\nsource = \"path:.\u002Flocal-agents\"\nEOF\n```\n\nUseful fixture changes:\n- Skill resolution: nested `skills\u002F` layouts, wildcard sources, duplicate\n  names, local paths outside `.agents`, or the exact `path:` shape touched.\n- Agent placement: include only affected agents, or include all supported\n  agents when shared config or registry behavior changed.\n- MCP and hooks: use the exact command, URL, headers, env refs, hook event, or\n  matcher affected by the diff.\n- Subagents: include a portable Markdown fixture under `agents\u002F`, assert the\n  installed canonical file in `.agents\u002Fagents\u002F`, assert generated runtime files\n  for Claude\u002FCursor\u002FCodex\u002FOpenCode, and inspect `agents.lock`.\n- Sync and doctor: pre-create broken or legacy state, then prove repair and\n  diagnostics.\n- User scope: set both `HOME` and `DOTAGENTS_HOME`, pass `--user`, and inspect\n  generated files under those temp directories; never use the host home\n  directory.\n- Package\u002Fruntime: run the built CLI as above, or pack\u002Finstall the package only\n  when the packaging path itself changed.\n- Remote sources: use `getsentry\u002Fskills`; avoid remotes for ordinary\n  install-location checks.\n\n## 5. Exercise The CLI\n\nRun the built local CLI from the fixture. Capture output and inspect generated\nfiles, not just exit codes.\n\n```bash\ncli=(node \u002Fsandbox\u002Frepo\u002Fpackages\u002Fdotagents\u002Fdist\u002Fcli\u002Findex.js)\ncd \"$fixture\"\n\n\"${cli[@]}\" install | tee \u002Fqa-out\u002Finstall.out\n\"${cli[@]}\" list | tee \u002Fqa-out\u002Flist.out\n\"${cli[@]}\" doctor --fix | tee \u002Fqa-out\u002Fdoctor-fix.out\n\"${cli[@]}\" doctor | tee \u002Fqa-out\u002Fdoctor.out\n```\n\nAssert what matters for this change. Examples:\n\n```bash\ngrep -q \"review\" \u002Fqa-out\u002Flist.out\ngrep -q \"commit\" \u002Fqa-out\u002Flist.out\ntest -f .agents\u002Fskills\u002Freview\u002FSKILL.md\ntest -f .agents\u002Fskills\u002Fcommit\u002FSKILL.md\ntest -L .claude\u002Fskills\ntest -f .mcp.json\ntest -f .cursor\u002Fmcp.json\ntest -f .codex\u002Fconfig.toml\ntest -f .opencode\u002Fopencode.jsonc\ntest -f .claude\u002Fsettings.json\ntest -f .cursor\u002Fhooks.json\ntest -f .agents\u002Fagents\u002Fcode-reviewer.md\ntest -f .claude\u002Fagents\u002Fcode-reviewer.md\ntest -f .cursor\u002Fagents\u002Fcode-reviewer.md\ntest -f .codex\u002Fagents\u002Fcode-reviewer.toml\ntest -f .opencode\u002Fagents\u002Fcode-reviewer.md\ngrep -q \"code-reviewer\" agents.lock\ngrep -q \"Generated by dotagents\" .claude\u002Fagents\u002Fcode-reviewer.md\ngrep -q \"Generated by dotagents\" .codex\u002Fagents\u002Fcode-reviewer.toml\n```\n\nFor `sync` or subagent writer changes, break the generated state in the way the\ndiff claims to repair, then verify the repair:\n\n```bash\nrm .mcp.json .claude\u002Fskills .claude\u002Fagents\u002Fcode-reviewer.md .codex\u002Fagents\u002Fcode-reviewer.toml\n\"${cli[@]}\" sync | tee \u002Fqa-out\u002Fsync.out\ntest -f .mcp.json\ntest -L .claude\u002Fskills\ntest -f .claude\u002Fagents\u002Fcode-reviewer.md\ntest -f .codex\u002Fagents\u002Fcode-reviewer.toml\n```\n\nFor user-scope changes:\n\n```bash\ncd \u002Fsandbox\n\"${cli[@]}\" --user install | tee \u002Fqa-out\u002Fuser-install.out\ntest -f \"$DOTAGENTS_HOME\u002Fagents.toml\"\ntest -d \"$DOTAGENTS_HOME\u002Fskills\"\n```\n\nCopy useful evidence before leaving the container:\n\n```bash\ncp -a \"$fixture\" \u002Fqa-out\u002Ffixture\ncp -a \"$DOTAGENTS_HOME\" \u002Fqa-out\u002Fuser-agents 2>\u002Fdev\u002Fnull || true\n```\n\n## 6. Real Agent Clients\n\nUse real clients only when discovery or registration in Claude, Cursor, Codex,\nVS Code, or OpenCode changed. Docker proves generated files and symlinks; it\ndoes not prove an installed host client notices them.\n\nKeep host-client checks isolated with explicit temp homes\u002Fconfig dirs where\nthe client supports it. If a client cannot run without reading host state, say\nso and report the Docker-generated files you inspected instead.\n\nInside the QA image, start with cheap client availability checks:\n\n```bash\ncodex --version\nclaude --version\nopencode --version\n```\n\nCodex subagents need real runtime proof before claiming Codex loaded them. Use\n`node skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs codex-runtime --keep`;\n`codex debug prompt-input` is not enough unless it visibly includes the\ngenerated agent name or instructions. Project-scoped `.codex\u002Fagents\u002F` load only\nwhen Codex trusts the project. See [references\u002Fcodex.md](references\u002Fcodex.md).\n\nClaude has no cheap dry-run skill list. If auth\u002Fnetwork\u002Fmodel cost is\nacceptable, run a minimal non-interactive prompt from the temp project;\notherwise report it as skipped.\n\n## 7. Report Evidence\n\nReport:\n- the changed behavior you targeted\n- Docker image and setup used\n- fixture shape and why it matched the diff\n- commands run\n- generated files or command output inspected\n- assertions that passed\n- `\u002Fqa-out` host path if retained for debugging\n- skipped checks and residual risk\n",{"data":39,"body":40},{"name":4,"description":6},{"type":41,"children":42},"root",[43,51,57,62,69,74,166,171,264,269,323,328,334,347,415,442,447,641,669,674,1093,1106,1118,1269,1298,1304,1309,1328,1341,1426,1439,1444,1473,1500,1506,1511,2112,2117,2239,2245,2250,2480,2485,2861,2873,3008,3013,3132,3137,3222,3228,3233,3238,3243,3284,3318,3323,3329,3334,3383],{"type":44,"tag":45,"props":46,"children":47},"element","h1",{"id":4},[48],{"type":49,"value":50},"text","dotagents QA",{"type":44,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Do real QA for the change in front of you. Docker is the safety boundary, not\nthe test plan: use it so dotagents cannot write to host agent config, host home\ndirectories, or host cache state while you build fixtures that prove the\nchanged behavior.",{"type":44,"tag":52,"props":58,"children":59},{},[60],{"type":49,"value":61},"Answer the practical question: \"With this local dotagents build, does the\nchanged behavior still install, sync, and wire the expected files?\"",{"type":44,"tag":63,"props":64,"children":66},"h2",{"id":65},"_1-understand-the-change",[67],{"type":49,"value":68},"1. Understand The Change",{"type":44,"tag":52,"props":70,"children":71},{},[72],{"type":49,"value":73},"Start from the diff and identify the behavior that could regress:",{"type":44,"tag":75,"props":76,"children":81},"pre",{"className":77,"code":78,"language":79,"meta":80,"style":80},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git status --short\ngit diff --stat\ngit diff -- \u003Cpaths>\n","bash","",[82],{"type":44,"tag":83,"props":84,"children":85},"code",{"__ignoreMap":80},[86,109,127],{"type":44,"tag":87,"props":88,"children":91},"span",{"class":89,"line":90},"line",1,[92,98,104],{"type":44,"tag":87,"props":93,"children":95},{"style":94},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[96],{"type":49,"value":97},"git",{"type":44,"tag":87,"props":99,"children":101},{"style":100},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[102],{"type":49,"value":103}," status",{"type":44,"tag":87,"props":105,"children":106},{"style":100},[107],{"type":49,"value":108}," --short\n",{"type":44,"tag":87,"props":110,"children":112},{"class":89,"line":111},2,[113,117,122],{"type":44,"tag":87,"props":114,"children":115},{"style":94},[116],{"type":49,"value":97},{"type":44,"tag":87,"props":118,"children":119},{"style":100},[120],{"type":49,"value":121}," diff",{"type":44,"tag":87,"props":123,"children":124},{"style":100},[125],{"type":49,"value":126}," --stat\n",{"type":44,"tag":87,"props":128,"children":130},{"class":89,"line":129},3,[131,135,139,144,150,155,161],{"type":44,"tag":87,"props":132,"children":133},{"style":94},[134],{"type":49,"value":97},{"type":44,"tag":87,"props":136,"children":137},{"style":100},[138],{"type":49,"value":121},{"type":44,"tag":87,"props":140,"children":141},{"style":100},[142],{"type":49,"value":143}," --",{"type":44,"tag":87,"props":145,"children":147},{"style":146},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[148],{"type":49,"value":149}," \u003C",{"type":44,"tag":87,"props":151,"children":152},{"style":100},[153],{"type":49,"value":154},"path",{"type":44,"tag":87,"props":156,"children":158},{"style":157},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[159],{"type":49,"value":160},"s",{"type":44,"tag":87,"props":162,"children":163},{"style":146},[164],{"type":49,"value":165},">\n",{"type":44,"tag":52,"props":167,"children":168},{},[169],{"type":49,"value":170},"Write down the QA target before running commands:",{"type":44,"tag":172,"props":173,"children":174},"ul",{},[175,246,259],{"type":44,"tag":176,"props":177,"children":178},"li",{},[179,181,187,189,195,196,202,203,209,210,216,218,224,225,230,231,237,238,244],{"type":49,"value":180},"Which command path changed: ",{"type":44,"tag":83,"props":182,"children":184},{"className":183},[],[185],{"type":49,"value":186},"install",{"type":49,"value":188},", ",{"type":44,"tag":83,"props":190,"children":192},{"className":191},[],[193],{"type":49,"value":194},"sync",{"type":49,"value":188},{"type":44,"tag":83,"props":197,"children":199},{"className":198},[],[200],{"type":49,"value":201},"list",{"type":49,"value":188},{"type":44,"tag":83,"props":204,"children":206},{"className":205},[],[207],{"type":49,"value":208},"doctor",{"type":49,"value":188},{"type":44,"tag":83,"props":211,"children":213},{"className":212},[],[214],{"type":49,"value":215},"add",{"type":49,"value":217},",\n",{"type":44,"tag":83,"props":219,"children":221},{"className":220},[],[222],{"type":49,"value":223},"remove",{"type":49,"value":188},{"type":44,"tag":83,"props":226,"children":228},{"className":227},[],[229],{"type":49,"value":22},{"type":49,"value":188},{"type":44,"tag":83,"props":232,"children":234},{"className":233},[],[235],{"type":49,"value":236},"trust",{"type":49,"value":188},{"type":44,"tag":83,"props":239,"children":241},{"className":240},[],[242],{"type":49,"value":243},"init",{"type":49,"value":245},", package runtime, or scope resolution.",{"type":44,"tag":176,"props":247,"children":248},{},[249,251,257],{"type":49,"value":250},"Which surfaces must be inspected: ",{"type":44,"tag":83,"props":252,"children":254},{"className":253},[],[255],{"type":49,"value":256},".agents\u002Fskills",{"type":49,"value":258},", agent skill symlinks,\nMCP config, hook config, subagent runtime files, lockfile, gitignore, CLI\noutput, or user scope.",{"type":44,"tag":176,"props":260,"children":261},{},[262],{"type":49,"value":263},"Which fixture shape proves it: checked-in example, local skills, nested\nskills, wildcard source, specific agents, MCP entries, hooks, existing\nbroken state, user-scope state, or remote source.",{"type":44,"tag":52,"props":265,"children":266},{},[267],{"type":49,"value":268},"Read the targeted reference before running runtime-specific QA:",{"type":44,"tag":172,"props":270,"children":271},{},[272,283,293,303,313],{"type":44,"tag":176,"props":273,"children":274},{},[275,277],{"type":49,"value":276},"Core install\u002Fsync example: ",{"type":44,"tag":278,"props":279,"children":281},"a",{"href":280},"references\u002Fcore-agentic-qa.md",[282],{"type":49,"value":280},{"type":44,"tag":176,"props":284,"children":285},{},[286,288],{"type":49,"value":287},"Codex custom agents and runtime caveats: ",{"type":44,"tag":278,"props":289,"children":291},{"href":290},"references\u002Fcodex.md",[292],{"type":49,"value":290},{"type":44,"tag":176,"props":294,"children":295},{},[296,298],{"type":49,"value":297},"Claude Code files and runtime caveats: ",{"type":44,"tag":278,"props":299,"children":301},{"href":300},"references\u002Fclaude.md",[302],{"type":49,"value":300},{"type":44,"tag":176,"props":304,"children":305},{},[306,308],{"type":49,"value":307},"Cursor files\u002Fruntime caveats: ",{"type":44,"tag":278,"props":309,"children":311},{"href":310},"references\u002Fcursor.md",[312],{"type":49,"value":310},{"type":44,"tag":176,"props":314,"children":315},{},[316,318],{"type":49,"value":317},"OpenCode files\u002Fruntime caveats: ",{"type":44,"tag":278,"props":319,"children":321},{"href":320},"references\u002Fopencode.md",[322],{"type":49,"value":320},{"type":44,"tag":52,"props":324,"children":325},{},[326],{"type":49,"value":327},"Run focused Vitest coverage for logic bugs. Use this skill for end-to-end QA\nevidence, not as a substitute for regression tests.",{"type":44,"tag":63,"props":329,"children":331},{"id":330},"_2-enter-a-docker-sandbox",[332],{"type":49,"value":333},"2. Enter A Docker Sandbox",{"type":44,"tag":52,"props":335,"children":336},{},[337,339,345],{"type":49,"value":338},"Build the repo-local QA image when it is missing, when this Dockerfile changes,\nor when the repo ",{"type":44,"tag":83,"props":340,"children":342},{"className":341},[],[343],{"type":49,"value":344},"packageManager",{"type":49,"value":346}," pnpm version changes:",{"type":44,"tag":75,"props":348,"children":350},{"className":77,"code":349,"language":79,"meta":80,"style":80},"docker build \\\n  -f skills\u002Fdotagents-qa\u002FDockerfile \\\n  -t dotagents-qa:local \\\n  skills\u002Fdotagents-qa\n",[351],{"type":44,"tag":83,"props":352,"children":353},{"__ignoreMap":80},[354,372,389,406],{"type":44,"tag":87,"props":355,"children":356},{"class":89,"line":90},[357,362,367],{"type":44,"tag":87,"props":358,"children":359},{"style":94},[360],{"type":49,"value":361},"docker",{"type":44,"tag":87,"props":363,"children":364},{"style":100},[365],{"type":49,"value":366}," build",{"type":44,"tag":87,"props":368,"children":369},{"style":157},[370],{"type":49,"value":371}," \\\n",{"type":44,"tag":87,"props":373,"children":374},{"class":89,"line":111},[375,380,385],{"type":44,"tag":87,"props":376,"children":377},{"style":100},[378],{"type":49,"value":379},"  -f",{"type":44,"tag":87,"props":381,"children":382},{"style":100},[383],{"type":49,"value":384}," skills\u002Fdotagents-qa\u002FDockerfile",{"type":44,"tag":87,"props":386,"children":387},{"style":157},[388],{"type":49,"value":371},{"type":44,"tag":87,"props":390,"children":391},{"class":89,"line":129},[392,397,402],{"type":44,"tag":87,"props":393,"children":394},{"style":100},[395],{"type":49,"value":396},"  -t",{"type":44,"tag":87,"props":398,"children":399},{"style":100},[400],{"type":49,"value":401}," dotagents-qa:local",{"type":44,"tag":87,"props":403,"children":404},{"style":157},[405],{"type":49,"value":371},{"type":44,"tag":87,"props":407,"children":409},{"class":89,"line":408},4,[410],{"type":44,"tag":87,"props":411,"children":412},{"style":100},[413],{"type":49,"value":414},"  skills\u002Fdotagents-qa\n",{"type":44,"tag":52,"props":416,"children":417},{},[418,420,426,427,433,434,440],{"type":49,"value":419},"The image installs the latest npm-published Codex, Claude Code, and OpenCode\nCLIs (",{"type":44,"tag":83,"props":421,"children":423},{"className":422},[],[424],{"type":49,"value":425},"codex",{"type":49,"value":188},{"type":44,"tag":83,"props":428,"children":430},{"className":429},[],[431],{"type":49,"value":432},"claude",{"type":49,"value":188},{"type":44,"tag":83,"props":435,"children":437},{"className":436},[],[438],{"type":49,"value":439},"opencode",{"type":49,"value":441},"). Use them for version checks, help-output\nchecks, and optional isolated runtime probes. Their presence does not prove\nruntime discovery by itself; authenticated model-backed checks are still\nexplicit opt-ins.",{"type":44,"tag":52,"props":443,"children":444},{},[445],{"type":49,"value":446},"Use an interactive container so the QA steps stay change-specific:",{"type":44,"tag":75,"props":448,"children":450},{"className":77,"code":449,"language":79,"meta":80,"style":80},"REPO=\"$(pwd)\"\nOUT=\"$(mktemp -d \"${TMPDIR:-\u002Ftmp}\u002Fdotagents-qa.XXXXXX\")\"\ndocker run --rm -it \\\n  -v \"$REPO:\u002Fhost-repo:ro\" \\\n  -v \"$OUT:\u002Fqa-out\" \\\n  dotagents-qa:local\n",[451],{"type":44,"tag":83,"props":452,"children":453},{"__ignoreMap":80},[454,483,544,570,602,632],{"type":44,"tag":87,"props":455,"children":456},{"class":89,"line":90},[457,462,467,472,478],{"type":44,"tag":87,"props":458,"children":459},{"style":157},[460],{"type":49,"value":461},"REPO",{"type":44,"tag":87,"props":463,"children":464},{"style":146},[465],{"type":49,"value":466},"=",{"type":44,"tag":87,"props":468,"children":469},{"style":146},[470],{"type":49,"value":471},"\"$(",{"type":44,"tag":87,"props":473,"children":475},{"style":474},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[476],{"type":49,"value":477},"pwd",{"type":44,"tag":87,"props":479,"children":480},{"style":146},[481],{"type":49,"value":482},")\"\n",{"type":44,"tag":87,"props":484,"children":485},{"class":89,"line":111},[486,491,495,499,504,509,514,519,524,529,534,539],{"type":44,"tag":87,"props":487,"children":488},{"style":157},[489],{"type":49,"value":490},"OUT",{"type":44,"tag":87,"props":492,"children":493},{"style":146},[494],{"type":49,"value":466},{"type":44,"tag":87,"props":496,"children":497},{"style":146},[498],{"type":49,"value":471},{"type":44,"tag":87,"props":500,"children":501},{"style":94},[502],{"type":49,"value":503},"mktemp",{"type":44,"tag":87,"props":505,"children":506},{"style":100},[507],{"type":49,"value":508}," -d ",{"type":44,"tag":87,"props":510,"children":511},{"style":146},[512],{"type":49,"value":513},"\"${",{"type":44,"tag":87,"props":515,"children":516},{"style":157},[517],{"type":49,"value":518},"TMPDIR",{"type":44,"tag":87,"props":520,"children":521},{"style":146},[522],{"type":49,"value":523},":-\u002F",{"type":44,"tag":87,"props":525,"children":526},{"style":157},[527],{"type":49,"value":528},"tmp",{"type":44,"tag":87,"props":530,"children":531},{"style":146},[532],{"type":49,"value":533},"}",{"type":44,"tag":87,"props":535,"children":536},{"style":100},[537],{"type":49,"value":538},"\u002Fdotagents-qa.XXXXXX",{"type":44,"tag":87,"props":540,"children":541},{"style":146},[542],{"type":49,"value":543},"\")\"\n",{"type":44,"tag":87,"props":545,"children":546},{"class":89,"line":129},[547,551,556,561,566],{"type":44,"tag":87,"props":548,"children":549},{"style":94},[550],{"type":49,"value":361},{"type":44,"tag":87,"props":552,"children":553},{"style":100},[554],{"type":49,"value":555}," run",{"type":44,"tag":87,"props":557,"children":558},{"style":100},[559],{"type":49,"value":560}," --rm",{"type":44,"tag":87,"props":562,"children":563},{"style":100},[564],{"type":49,"value":565}," -it",{"type":44,"tag":87,"props":567,"children":568},{"style":157},[569],{"type":49,"value":371},{"type":44,"tag":87,"props":571,"children":572},{"class":89,"line":408},[573,578,583,588,593,598],{"type":44,"tag":87,"props":574,"children":575},{"style":100},[576],{"type":49,"value":577},"  -v",{"type":44,"tag":87,"props":579,"children":580},{"style":146},[581],{"type":49,"value":582}," \"",{"type":44,"tag":87,"props":584,"children":585},{"style":157},[586],{"type":49,"value":587},"$REPO",{"type":44,"tag":87,"props":589,"children":590},{"style":100},[591],{"type":49,"value":592},":\u002Fhost-repo:ro",{"type":44,"tag":87,"props":594,"children":595},{"style":146},[596],{"type":49,"value":597},"\"",{"type":44,"tag":87,"props":599,"children":600},{"style":157},[601],{"type":49,"value":371},{"type":44,"tag":87,"props":603,"children":605},{"class":89,"line":604},5,[606,610,614,619,624,628],{"type":44,"tag":87,"props":607,"children":608},{"style":100},[609],{"type":49,"value":577},{"type":44,"tag":87,"props":611,"children":612},{"style":146},[613],{"type":49,"value":582},{"type":44,"tag":87,"props":615,"children":616},{"style":157},[617],{"type":49,"value":618},"$OUT",{"type":44,"tag":87,"props":620,"children":621},{"style":100},[622],{"type":49,"value":623},":\u002Fqa-out",{"type":44,"tag":87,"props":625,"children":626},{"style":146},[627],{"type":49,"value":597},{"type":44,"tag":87,"props":629,"children":630},{"style":157},[631],{"type":49,"value":371},{"type":44,"tag":87,"props":633,"children":635},{"class":89,"line":634},6,[636],{"type":44,"tag":87,"props":637,"children":638},{"style":100},[639],{"type":49,"value":640},"  dotagents-qa:local\n",{"type":44,"tag":52,"props":642,"children":643},{},[644,646,652,654,660,662,667],{"type":49,"value":645},"If your tool environment is not attached to a TTY, use ",{"type":44,"tag":83,"props":647,"children":649},{"className":648},[],[650],{"type":49,"value":651},"-i",{"type":49,"value":653}," instead of ",{"type":44,"tag":83,"props":655,"children":657},{"className":656},[],[658],{"type":49,"value":659},"-it",{"type":49,"value":661},"\nand feed the same commands with a here-doc. Keep ",{"type":44,"tag":83,"props":663,"children":665},{"className":664},[],[666],{"type":49,"value":651},{"type":49,"value":668},"; without stdin attached,\nthe container shell will receive no script.",{"type":44,"tag":52,"props":670,"children":671},{},[672],{"type":49,"value":673},"Inside the container:",{"type":44,"tag":75,"props":675,"children":677},{"className":77,"code":676,"language":79,"meta":80,"style":80},"set -euo pipefail\nexport CI=1\nexport HOME=\u002Fsandbox\u002Fhome\nexport DOTAGENTS_STATE_DIR=\u002Fsandbox\u002Fstate\nexport DOTAGENTS_HOME=\u002Fsandbox\u002Fuser-agents\n\nmkdir -p \"$HOME\" \"$DOTAGENTS_STATE_DIR\" \"$DOTAGENTS_HOME\" \u002Fsandbox\u002Frepo\ntar -C \u002Fhost-repo \\\n  --exclude=.git \\\n  --exclude=node_modules \\\n  --exclude=.turbo \\\n  --exclude=coverage \\\n  --exclude=core \\\n  --exclude='*.tsbuildinfo' \\\n  --exclude='packages\u002F*\u002Fdist' \\\n  -cf - . | tar -C \u002Fsandbox\u002Frepo -xf -\n\ncd \u002Fsandbox\u002Frepo\npnpm install --frozen-lockfile\npnpm build\n",[678],{"type":44,"tag":83,"props":679,"children":680},{"__ignoreMap":80},[681,699,723,744,765,786,795,853,876,889,901,914,927,940,967,992,1040,1048,1061,1080],{"type":44,"tag":87,"props":682,"children":683},{"class":89,"line":90},[684,689,694],{"type":44,"tag":87,"props":685,"children":686},{"style":474},[687],{"type":49,"value":688},"set",{"type":44,"tag":87,"props":690,"children":691},{"style":100},[692],{"type":49,"value":693}," -euo",{"type":44,"tag":87,"props":695,"children":696},{"style":100},[697],{"type":49,"value":698}," pipefail\n",{"type":44,"tag":87,"props":700,"children":701},{"class":89,"line":111},[702,708,713,717],{"type":44,"tag":87,"props":703,"children":705},{"style":704},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[706],{"type":49,"value":707},"export",{"type":44,"tag":87,"props":709,"children":710},{"style":157},[711],{"type":49,"value":712}," CI",{"type":44,"tag":87,"props":714,"children":715},{"style":146},[716],{"type":49,"value":466},{"type":44,"tag":87,"props":718,"children":720},{"style":719},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[721],{"type":49,"value":722},"1\n",{"type":44,"tag":87,"props":724,"children":725},{"class":89,"line":129},[726,730,735,739],{"type":44,"tag":87,"props":727,"children":728},{"style":704},[729],{"type":49,"value":707},{"type":44,"tag":87,"props":731,"children":732},{"style":157},[733],{"type":49,"value":734}," HOME",{"type":44,"tag":87,"props":736,"children":737},{"style":146},[738],{"type":49,"value":466},{"type":44,"tag":87,"props":740,"children":741},{"style":157},[742],{"type":49,"value":743},"\u002Fsandbox\u002Fhome\n",{"type":44,"tag":87,"props":745,"children":746},{"class":89,"line":408},[747,751,756,760],{"type":44,"tag":87,"props":748,"children":749},{"style":704},[750],{"type":49,"value":707},{"type":44,"tag":87,"props":752,"children":753},{"style":157},[754],{"type":49,"value":755}," DOTAGENTS_STATE_DIR",{"type":44,"tag":87,"props":757,"children":758},{"style":146},[759],{"type":49,"value":466},{"type":44,"tag":87,"props":761,"children":762},{"style":157},[763],{"type":49,"value":764},"\u002Fsandbox\u002Fstate\n",{"type":44,"tag":87,"props":766,"children":767},{"class":89,"line":604},[768,772,777,781],{"type":44,"tag":87,"props":769,"children":770},{"style":704},[771],{"type":49,"value":707},{"type":44,"tag":87,"props":773,"children":774},{"style":157},[775],{"type":49,"value":776}," DOTAGENTS_HOME",{"type":44,"tag":87,"props":778,"children":779},{"style":146},[780],{"type":49,"value":466},{"type":44,"tag":87,"props":782,"children":783},{"style":157},[784],{"type":49,"value":785},"\u002Fsandbox\u002Fuser-agents\n",{"type":44,"tag":87,"props":787,"children":788},{"class":89,"line":634},[789],{"type":44,"tag":87,"props":790,"children":792},{"emptyLinePlaceholder":791},true,[793],{"type":49,"value":794},"\n",{"type":44,"tag":87,"props":796,"children":798},{"class":89,"line":797},7,[799,804,809,813,818,822,826,831,835,839,844,848],{"type":44,"tag":87,"props":800,"children":801},{"style":94},[802],{"type":49,"value":803},"mkdir",{"type":44,"tag":87,"props":805,"children":806},{"style":100},[807],{"type":49,"value":808}," -p",{"type":44,"tag":87,"props":810,"children":811},{"style":146},[812],{"type":49,"value":582},{"type":44,"tag":87,"props":814,"children":815},{"style":157},[816],{"type":49,"value":817},"$HOME",{"type":44,"tag":87,"props":819,"children":820},{"style":146},[821],{"type":49,"value":597},{"type":44,"tag":87,"props":823,"children":824},{"style":146},[825],{"type":49,"value":582},{"type":44,"tag":87,"props":827,"children":828},{"style":157},[829],{"type":49,"value":830},"$DOTAGENTS_STATE_DIR",{"type":44,"tag":87,"props":832,"children":833},{"style":146},[834],{"type":49,"value":597},{"type":44,"tag":87,"props":836,"children":837},{"style":146},[838],{"type":49,"value":582},{"type":44,"tag":87,"props":840,"children":841},{"style":157},[842],{"type":49,"value":843},"$DOTAGENTS_HOME",{"type":44,"tag":87,"props":845,"children":846},{"style":146},[847],{"type":49,"value":597},{"type":44,"tag":87,"props":849,"children":850},{"style":100},[851],{"type":49,"value":852}," \u002Fsandbox\u002Frepo\n",{"type":44,"tag":87,"props":854,"children":856},{"class":89,"line":855},8,[857,862,867,872],{"type":44,"tag":87,"props":858,"children":859},{"style":94},[860],{"type":49,"value":861},"tar",{"type":44,"tag":87,"props":863,"children":864},{"style":100},[865],{"type":49,"value":866}," -C",{"type":44,"tag":87,"props":868,"children":869},{"style":100},[870],{"type":49,"value":871}," \u002Fhost-repo",{"type":44,"tag":87,"props":873,"children":874},{"style":157},[875],{"type":49,"value":371},{"type":44,"tag":87,"props":877,"children":879},{"class":89,"line":878},9,[880,885],{"type":44,"tag":87,"props":881,"children":882},{"style":100},[883],{"type":49,"value":884},"  --exclude=.git",{"type":44,"tag":87,"props":886,"children":887},{"style":157},[888],{"type":49,"value":371},{"type":44,"tag":87,"props":890,"children":891},{"class":89,"line":31},[892,897],{"type":44,"tag":87,"props":893,"children":894},{"style":100},[895],{"type":49,"value":896},"  --exclude=node_modules",{"type":44,"tag":87,"props":898,"children":899},{"style":157},[900],{"type":49,"value":371},{"type":44,"tag":87,"props":902,"children":904},{"class":89,"line":903},11,[905,910],{"type":44,"tag":87,"props":906,"children":907},{"style":100},[908],{"type":49,"value":909},"  --exclude=.turbo",{"type":44,"tag":87,"props":911,"children":912},{"style":157},[913],{"type":49,"value":371},{"type":44,"tag":87,"props":915,"children":917},{"class":89,"line":916},12,[918,923],{"type":44,"tag":87,"props":919,"children":920},{"style":100},[921],{"type":49,"value":922},"  --exclude=coverage",{"type":44,"tag":87,"props":924,"children":925},{"style":157},[926],{"type":49,"value":371},{"type":44,"tag":87,"props":928,"children":930},{"class":89,"line":929},13,[931,936],{"type":44,"tag":87,"props":932,"children":933},{"style":100},[934],{"type":49,"value":935},"  --exclude=core",{"type":44,"tag":87,"props":937,"children":938},{"style":157},[939],{"type":49,"value":371},{"type":44,"tag":87,"props":941,"children":943},{"class":89,"line":942},14,[944,949,954,959,963],{"type":44,"tag":87,"props":945,"children":946},{"style":100},[947],{"type":49,"value":948},"  --exclude=",{"type":44,"tag":87,"props":950,"children":951},{"style":146},[952],{"type":49,"value":953},"'",{"type":44,"tag":87,"props":955,"children":956},{"style":100},[957],{"type":49,"value":958},"*.tsbuildinfo",{"type":44,"tag":87,"props":960,"children":961},{"style":146},[962],{"type":49,"value":953},{"type":44,"tag":87,"props":964,"children":965},{"style":157},[966],{"type":49,"value":371},{"type":44,"tag":87,"props":968,"children":970},{"class":89,"line":969},15,[971,975,979,984,988],{"type":44,"tag":87,"props":972,"children":973},{"style":100},[974],{"type":49,"value":948},{"type":44,"tag":87,"props":976,"children":977},{"style":146},[978],{"type":49,"value":953},{"type":44,"tag":87,"props":980,"children":981},{"style":100},[982],{"type":49,"value":983},"packages\u002F*\u002Fdist",{"type":44,"tag":87,"props":985,"children":986},{"style":146},[987],{"type":49,"value":953},{"type":44,"tag":87,"props":989,"children":990},{"style":157},[991],{"type":49,"value":371},{"type":44,"tag":87,"props":993,"children":995},{"class":89,"line":994},16,[996,1001,1006,1011,1016,1021,1025,1030,1035],{"type":44,"tag":87,"props":997,"children":998},{"style":100},[999],{"type":49,"value":1000},"  -cf",{"type":44,"tag":87,"props":1002,"children":1003},{"style":100},[1004],{"type":49,"value":1005}," -",{"type":44,"tag":87,"props":1007,"children":1008},{"style":100},[1009],{"type":49,"value":1010}," .",{"type":44,"tag":87,"props":1012,"children":1013},{"style":146},[1014],{"type":49,"value":1015}," |",{"type":44,"tag":87,"props":1017,"children":1018},{"style":94},[1019],{"type":49,"value":1020}," tar",{"type":44,"tag":87,"props":1022,"children":1023},{"style":100},[1024],{"type":49,"value":866},{"type":44,"tag":87,"props":1026,"children":1027},{"style":100},[1028],{"type":49,"value":1029}," \u002Fsandbox\u002Frepo",{"type":44,"tag":87,"props":1031,"children":1032},{"style":100},[1033],{"type":49,"value":1034}," -xf",{"type":44,"tag":87,"props":1036,"children":1037},{"style":100},[1038],{"type":49,"value":1039}," -\n",{"type":44,"tag":87,"props":1041,"children":1043},{"class":89,"line":1042},17,[1044],{"type":44,"tag":87,"props":1045,"children":1046},{"emptyLinePlaceholder":791},[1047],{"type":49,"value":794},{"type":44,"tag":87,"props":1049,"children":1051},{"class":89,"line":1050},18,[1052,1057],{"type":44,"tag":87,"props":1053,"children":1054},{"style":474},[1055],{"type":49,"value":1056},"cd",{"type":44,"tag":87,"props":1058,"children":1059},{"style":100},[1060],{"type":49,"value":852},{"type":44,"tag":87,"props":1062,"children":1064},{"class":89,"line":1063},19,[1065,1070,1075],{"type":44,"tag":87,"props":1066,"children":1067},{"style":94},[1068],{"type":49,"value":1069},"pnpm",{"type":44,"tag":87,"props":1071,"children":1072},{"style":100},[1073],{"type":49,"value":1074}," install",{"type":44,"tag":87,"props":1076,"children":1077},{"style":100},[1078],{"type":49,"value":1079}," --frozen-lockfile\n",{"type":44,"tag":87,"props":1081,"children":1083},{"class":89,"line":1082},20,[1084,1088],{"type":44,"tag":87,"props":1085,"children":1086},{"style":94},[1087],{"type":49,"value":1069},{"type":44,"tag":87,"props":1089,"children":1090},{"style":100},[1091],{"type":49,"value":1092}," build\n",{"type":44,"tag":52,"props":1094,"children":1095},{},[1096,1098,1104],{"type":49,"value":1097},"Run package commands as the non-root ",{"type":44,"tag":83,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":49,"value":1103},"node",{"type":49,"value":1105}," user. Root can bypass chmod-based\npermission checks, which can mask or invert filesystem regression tests.",{"type":44,"tag":52,"props":1107,"children":1108},{},[1109,1111,1116],{"type":49,"value":1110},"For non-interactive QA, copy as root, then hand the repo to ",{"type":44,"tag":83,"props":1112,"children":1114},{"className":1113},[],[1115],{"type":49,"value":1103},{"type":49,"value":1117}," before\nrunning package scripts:",{"type":44,"tag":75,"props":1119,"children":1121},{"className":77,"code":1120,"language":79,"meta":80,"style":80},"chown -R node:node \u002Fsandbox\nsu -s \u002Fbin\u002Fbash node -c '\n  set -euo pipefail\n  export CI=1\n  export HOME=\u002Fsandbox\u002Fhome\n  export DOTAGENTS_STATE_DIR=\u002Fsandbox\u002Fstate\n  export DOTAGENTS_HOME=\u002Fsandbox\u002Fuser-agents\n  cd \u002Fsandbox\u002Frepo\n  pnpm install --frozen-lockfile\n  pnpm build\n  pnpm check\n  pnpm qa:example\n'\n",[1122],{"type":44,"tag":83,"props":1123,"children":1124},{"__ignoreMap":80},[1125,1148,1181,1189,1197,1205,1213,1221,1229,1237,1245,1253,1261],{"type":44,"tag":87,"props":1126,"children":1127},{"class":89,"line":90},[1128,1133,1138,1143],{"type":44,"tag":87,"props":1129,"children":1130},{"style":94},[1131],{"type":49,"value":1132},"chown",{"type":44,"tag":87,"props":1134,"children":1135},{"style":100},[1136],{"type":49,"value":1137}," -R",{"type":44,"tag":87,"props":1139,"children":1140},{"style":100},[1141],{"type":49,"value":1142}," node:node",{"type":44,"tag":87,"props":1144,"children":1145},{"style":100},[1146],{"type":49,"value":1147}," \u002Fsandbox\n",{"type":44,"tag":87,"props":1149,"children":1150},{"class":89,"line":111},[1151,1156,1161,1166,1171,1176],{"type":44,"tag":87,"props":1152,"children":1153},{"style":94},[1154],{"type":49,"value":1155},"su",{"type":44,"tag":87,"props":1157,"children":1158},{"style":100},[1159],{"type":49,"value":1160}," -s",{"type":44,"tag":87,"props":1162,"children":1163},{"style":100},[1164],{"type":49,"value":1165}," \u002Fbin\u002Fbash",{"type":44,"tag":87,"props":1167,"children":1168},{"style":100},[1169],{"type":49,"value":1170}," node",{"type":44,"tag":87,"props":1172,"children":1173},{"style":100},[1174],{"type":49,"value":1175}," -c",{"type":44,"tag":87,"props":1177,"children":1178},{"style":146},[1179],{"type":49,"value":1180}," '\n",{"type":44,"tag":87,"props":1182,"children":1183},{"class":89,"line":129},[1184],{"type":44,"tag":87,"props":1185,"children":1186},{"style":100},[1187],{"type":49,"value":1188},"  set -euo pipefail\n",{"type":44,"tag":87,"props":1190,"children":1191},{"class":89,"line":408},[1192],{"type":44,"tag":87,"props":1193,"children":1194},{"style":100},[1195],{"type":49,"value":1196},"  export CI=1\n",{"type":44,"tag":87,"props":1198,"children":1199},{"class":89,"line":604},[1200],{"type":44,"tag":87,"props":1201,"children":1202},{"style":100},[1203],{"type":49,"value":1204},"  export HOME=\u002Fsandbox\u002Fhome\n",{"type":44,"tag":87,"props":1206,"children":1207},{"class":89,"line":634},[1208],{"type":44,"tag":87,"props":1209,"children":1210},{"style":100},[1211],{"type":49,"value":1212},"  export DOTAGENTS_STATE_DIR=\u002Fsandbox\u002Fstate\n",{"type":44,"tag":87,"props":1214,"children":1215},{"class":89,"line":797},[1216],{"type":44,"tag":87,"props":1217,"children":1218},{"style":100},[1219],{"type":49,"value":1220},"  export DOTAGENTS_HOME=\u002Fsandbox\u002Fuser-agents\n",{"type":44,"tag":87,"props":1222,"children":1223},{"class":89,"line":855},[1224],{"type":44,"tag":87,"props":1225,"children":1226},{"style":100},[1227],{"type":49,"value":1228},"  cd \u002Fsandbox\u002Frepo\n",{"type":44,"tag":87,"props":1230,"children":1231},{"class":89,"line":878},[1232],{"type":44,"tag":87,"props":1233,"children":1234},{"style":100},[1235],{"type":49,"value":1236},"  pnpm install --frozen-lockfile\n",{"type":44,"tag":87,"props":1238,"children":1239},{"class":89,"line":31},[1240],{"type":44,"tag":87,"props":1241,"children":1242},{"style":100},[1243],{"type":49,"value":1244},"  pnpm build\n",{"type":44,"tag":87,"props":1246,"children":1247},{"class":89,"line":903},[1248],{"type":44,"tag":87,"props":1249,"children":1250},{"style":100},[1251],{"type":49,"value":1252},"  pnpm check\n",{"type":44,"tag":87,"props":1254,"children":1255},{"class":89,"line":916},[1256],{"type":44,"tag":87,"props":1257,"children":1258},{"style":100},[1259],{"type":49,"value":1260},"  pnpm qa:example\n",{"type":44,"tag":87,"props":1262,"children":1263},{"class":89,"line":929},[1264],{"type":44,"tag":87,"props":1265,"children":1266},{"style":146},[1267],{"type":49,"value":1268},"'\n",{"type":44,"tag":52,"props":1270,"children":1271},{},[1272,1274,1280,1282,1288,1290,1296],{"type":49,"value":1273},"Run ",{"type":44,"tag":83,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":49,"value":1279},"pnpm check",{"type":49,"value":1281}," inside Docker unless the change requires a narrower target or\nthe check is already known to be unrelated. If ",{"type":44,"tag":83,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":49,"value":1287},"build",{"type":49,"value":1289}," or ",{"type":44,"tag":83,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":49,"value":1295},"check",{"type":49,"value":1297}," fails, treat\nthat as a QA finding and stop before fixture work unless you are explicitly\nisolating the playbook mechanics. If skipped or bypassed, report why.",{"type":44,"tag":63,"props":1299,"children":1301},{"id":1300},"_3-prefer-the-checked-in-agentic-qa",[1302],{"type":49,"value":1303},"3. Prefer The Checked-In Agentic QA",{"type":44,"tag":52,"props":1305,"children":1306},{},[1307],{"type":49,"value":1308},"Use the checked-in example QA for ordinary install\u002Fsync QA:",{"type":44,"tag":75,"props":1310,"children":1312},{"className":77,"code":1311,"language":79,"meta":80,"style":80},"pnpm qa:example\n",[1313],{"type":44,"tag":83,"props":1314,"children":1315},{"__ignoreMap":80},[1316],{"type":44,"tag":87,"props":1317,"children":1318},{"class":89,"line":90},[1319,1323],{"type":44,"tag":87,"props":1320,"children":1321},{"style":94},[1322],{"type":49,"value":1069},{"type":44,"tag":87,"props":1324,"children":1325},{"style":100},[1326],{"type":49,"value":1327}," qa:example\n",{"type":44,"tag":52,"props":1329,"children":1330},{},[1331,1333,1339],{"type":49,"value":1332},"The QA runner builds the local CLI, copies ",{"type":44,"tag":83,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":49,"value":1338},"examples\u002Ffull\u002F",{"type":49,"value":1340}," to a temp project, and\nasserts:",{"type":44,"tag":172,"props":1342,"children":1343},{},[1344,1374,1385,1390,1395,1400,1411,1416],{"type":44,"tag":176,"props":1345,"children":1346},{},[1347,1352,1353,1358,1359,1365,1367,1372],{"type":44,"tag":83,"props":1348,"children":1350},{"className":1349},[],[1351],{"type":49,"value":186},{"type":49,"value":188},{"type":44,"tag":83,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":49,"value":201},{"type":49,"value":188},{"type":44,"tag":83,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":49,"value":1364},"doctor --fix",{"type":49,"value":1366},", and ",{"type":44,"tag":83,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":49,"value":208},{"type":49,"value":1373}," complete successfully",{"type":44,"tag":176,"props":1375,"children":1376},{},[1377,1379],{"type":49,"value":1378},"managed skills under ",{"type":44,"tag":83,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":49,"value":1384},".agents\u002Fskills\u002F",{"type":44,"tag":176,"props":1386,"children":1387},{},[1388],{"type":49,"value":1389},"Claude\u002FCursor skill symlink behavior",{"type":44,"tag":176,"props":1391,"children":1392},{},[1393],{"type":49,"value":1394},"MCP files for Claude, Cursor, Codex, and OpenCode",{"type":44,"tag":176,"props":1396,"children":1397},{},[1398],{"type":49,"value":1399},"hook files for Claude and Cursor",{"type":44,"tag":176,"props":1401,"children":1402},{},[1403,1405],{"type":49,"value":1404},"canonical installed subagent under ",{"type":44,"tag":83,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":49,"value":1410},".agents\u002Fagents\u002F",{"type":44,"tag":176,"props":1412,"children":1413},{},[1414],{"type":49,"value":1415},"generated subagent runtime files for Claude, Cursor, Codex, and OpenCode",{"type":44,"tag":176,"props":1417,"children":1418},{},[1419,1424],{"type":44,"tag":83,"props":1420,"children":1422},{"className":1421},[],[1423],{"type":49,"value":194},{"type":49,"value":1425}," repair after deleting representative generated files",{"type":44,"tag":52,"props":1427,"children":1428},{},[1429,1431,1437],{"type":49,"value":1430},"Use ",{"type":44,"tag":83,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":49,"value":1436},"node skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs all --keep",{"type":49,"value":1438}," when you need\nto inspect the temp project; the script prints the retained path.",{"type":44,"tag":52,"props":1440,"children":1441},{},[1442],{"type":49,"value":1443},"For paid Codex runtime proof of generated custom agents, run the runtime proof\noutside Docker only when the branch affects Codex custom agents or when\nreporting that Codex itself works:",{"type":44,"tag":75,"props":1445,"children":1447},{"className":77,"code":1446,"language":79,"meta":80,"style":80},"node skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs codex-runtime --keep\n",[1448],{"type":44,"tag":83,"props":1449,"children":1450},{"__ignoreMap":80},[1451],{"type":44,"tag":87,"props":1452,"children":1453},{"class":89,"line":90},[1454,1458,1463,1468],{"type":44,"tag":87,"props":1455,"children":1456},{"style":94},[1457],{"type":49,"value":1103},{"type":44,"tag":87,"props":1459,"children":1460},{"style":100},[1461],{"type":49,"value":1462}," skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs",{"type":44,"tag":87,"props":1464,"children":1465},{"style":100},[1466],{"type":49,"value":1467}," codex-runtime",{"type":44,"tag":87,"props":1469,"children":1470},{"style":100},[1471],{"type":49,"value":1472}," --keep\n",{"type":44,"tag":52,"props":1474,"children":1475},{},[1476,1478,1484,1486,1492,1494,1498],{"type":49,"value":1477},"That mode copies Codex auth\u002Fconfig into a temp ",{"type":44,"tag":83,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":49,"value":1483},"CODEX_HOME",{"type":49,"value":1485},", marks only the\ntemp example project trusted, and asserts that Codex can spawn the generated\n",{"type":44,"tag":83,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":49,"value":1491},".codex\u002Fagents\u002Fcode-reviewer.toml",{"type":49,"value":1493}," agent. See\n",{"type":44,"tag":278,"props":1495,"children":1496},{"href":290},[1497],{"type":49,"value":290},{"type":49,"value":1499}," before changing or running this\npath.",{"type":44,"tag":63,"props":1501,"children":1503},{"id":1502},"_4-build-a-manual-fixture-only-when-needed",[1504],{"type":49,"value":1505},"4. Build A Manual Fixture Only When Needed",{"type":44,"tag":52,"props":1507,"children":1508},{},[1509],{"type":49,"value":1510},"Create a temp project manually only when the checked-in example does not cover\nthe changed behavior. Start from this shape and add only what the diff needs.",{"type":44,"tag":75,"props":1512,"children":1514},{"className":77,"code":1513,"language":79,"meta":80,"style":80},"fixture=\u002Fsandbox\u002Ffixture\nmkdir -p \"$fixture\u002Flocal-skills\" \"$fixture\u002Flocal-agents\u002Fagents\"\nfor skill in review commit; do\n  mkdir -p \"$fixture\u002Flocal-skills\u002F$skill\"\n  printf -- \"---\\nname: %s\\ndescription: Fixture %s skill.\\n---\\n\\n%s fixture.\\n\" \\\n    \"$skill\" \"$skill\" \"$skill\" > \"$fixture\u002Flocal-skills\u002F$skill\u002FSKILL.md\"\ndone\n\ncat > \"$fixture\u002Flocal-agents\u002Fagents\u002Fcode-reviewer.md\" \u003C\u003C'EOF'\n---\nname: code-reviewer\ndescription: Review code for correctness.\n---\n\nReview the current diff and return findings with file references.\nEOF\n\ncat > \"$fixture\u002Fagents.toml\" \u003C\u003C'EOF'\nversion = 1\nagents = [\"claude\", \"cursor\", \"codex\", \"opencode\"]\n\n[[skills]]\nname = \"review\"\nsource = \"path:.\u002Flocal-skills\u002Freview\"\n\n[[skills]]\nname = \"commit\"\nsource = \"path:.\u002Flocal-skills\u002Fcommit\"\n\n[[mcp]]\nname = \"fixture\"\ncommand = \"node\"\nargs = [\"-e\", \"process.exit(0)\"]\n\n[[hooks]]\nevent = \"Stop\"\ncommand = \"echo fixture\"\n\n[[subagents]]\nname = \"code-reviewer\"\nsource = \"path:.\u002Flocal-agents\"\nEOF\n",[1515],{"type":44,"tag":83,"props":1516,"children":1517},{"__ignoreMap":80},[1518,1535,1582,1621,1655,1684,1754,1762,1769,1808,1816,1824,1832,1839,1846,1854,1862,1869,1905,1913,1921,1929,1938,1947,1956,1964,1972,1981,1990,1998,2007,2016,2025,2034,2042,2051,2060,2069,2077,2086,2095,2104],{"type":44,"tag":87,"props":1519,"children":1520},{"class":89,"line":90},[1521,1526,1530],{"type":44,"tag":87,"props":1522,"children":1523},{"style":157},[1524],{"type":49,"value":1525},"fixture",{"type":44,"tag":87,"props":1527,"children":1528},{"style":146},[1529],{"type":49,"value":466},{"type":44,"tag":87,"props":1531,"children":1532},{"style":100},[1533],{"type":49,"value":1534},"\u002Fsandbox\u002Ffixture\n",{"type":44,"tag":87,"props":1536,"children":1537},{"class":89,"line":111},[1538,1542,1546,1550,1555,1560,1564,1568,1572,1577],{"type":44,"tag":87,"props":1539,"children":1540},{"style":94},[1541],{"type":49,"value":803},{"type":44,"tag":87,"props":1543,"children":1544},{"style":100},[1545],{"type":49,"value":808},{"type":44,"tag":87,"props":1547,"children":1548},{"style":146},[1549],{"type":49,"value":582},{"type":44,"tag":87,"props":1551,"children":1552},{"style":157},[1553],{"type":49,"value":1554},"$fixture",{"type":44,"tag":87,"props":1556,"children":1557},{"style":100},[1558],{"type":49,"value":1559},"\u002Flocal-skills",{"type":44,"tag":87,"props":1561,"children":1562},{"style":146},[1563],{"type":49,"value":597},{"type":44,"tag":87,"props":1565,"children":1566},{"style":146},[1567],{"type":49,"value":582},{"type":44,"tag":87,"props":1569,"children":1570},{"style":157},[1571],{"type":49,"value":1554},{"type":44,"tag":87,"props":1573,"children":1574},{"style":100},[1575],{"type":49,"value":1576},"\u002Flocal-agents\u002Fagents",{"type":44,"tag":87,"props":1578,"children":1579},{"style":146},[1580],{"type":49,"value":1581},"\"\n",{"type":44,"tag":87,"props":1583,"children":1584},{"class":89,"line":129},[1585,1591,1596,1601,1606,1611,1616],{"type":44,"tag":87,"props":1586,"children":1588},{"style":1587},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1589],{"type":49,"value":1590},"for",{"type":44,"tag":87,"props":1592,"children":1593},{"style":157},[1594],{"type":49,"value":1595}," skill ",{"type":44,"tag":87,"props":1597,"children":1598},{"style":1587},[1599],{"type":49,"value":1600},"in",{"type":44,"tag":87,"props":1602,"children":1603},{"style":100},[1604],{"type":49,"value":1605}," review",{"type":44,"tag":87,"props":1607,"children":1608},{"style":100},[1609],{"type":49,"value":1610}," commit",{"type":44,"tag":87,"props":1612,"children":1613},{"style":146},[1614],{"type":49,"value":1615},";",{"type":44,"tag":87,"props":1617,"children":1618},{"style":1587},[1619],{"type":49,"value":1620}," do\n",{"type":44,"tag":87,"props":1622,"children":1623},{"class":89,"line":408},[1624,1629,1633,1637,1641,1646,1651],{"type":44,"tag":87,"props":1625,"children":1626},{"style":94},[1627],{"type":49,"value":1628},"  mkdir",{"type":44,"tag":87,"props":1630,"children":1631},{"style":100},[1632],{"type":49,"value":808},{"type":44,"tag":87,"props":1634,"children":1635},{"style":146},[1636],{"type":49,"value":582},{"type":44,"tag":87,"props":1638,"children":1639},{"style":157},[1640],{"type":49,"value":1554},{"type":44,"tag":87,"props":1642,"children":1643},{"style":100},[1644],{"type":49,"value":1645},"\u002Flocal-skills\u002F",{"type":44,"tag":87,"props":1647,"children":1648},{"style":157},[1649],{"type":49,"value":1650},"$skill",{"type":44,"tag":87,"props":1652,"children":1653},{"style":146},[1654],{"type":49,"value":1581},{"type":44,"tag":87,"props":1656,"children":1657},{"class":89,"line":604},[1658,1663,1667,1671,1676,1680],{"type":44,"tag":87,"props":1659,"children":1660},{"style":474},[1661],{"type":49,"value":1662},"  printf",{"type":44,"tag":87,"props":1664,"children":1665},{"style":100},[1666],{"type":49,"value":143},{"type":44,"tag":87,"props":1668,"children":1669},{"style":146},[1670],{"type":49,"value":582},{"type":44,"tag":87,"props":1672,"children":1673},{"style":100},[1674],{"type":49,"value":1675},"---\\nname: %s\\ndescription: Fixture %s skill.\\n---\\n\\n%s fixture.\\n",{"type":44,"tag":87,"props":1677,"children":1678},{"style":146},[1679],{"type":49,"value":597},{"type":44,"tag":87,"props":1681,"children":1682},{"style":157},[1683],{"type":49,"value":371},{"type":44,"tag":87,"props":1685,"children":1686},{"class":89,"line":634},[1687,1692,1696,1700,1704,1708,1712,1716,1720,1724,1729,1733,1737,1741,1745,1750],{"type":44,"tag":87,"props":1688,"children":1689},{"style":146},[1690],{"type":49,"value":1691},"    \"",{"type":44,"tag":87,"props":1693,"children":1694},{"style":157},[1695],{"type":49,"value":1650},{"type":44,"tag":87,"props":1697,"children":1698},{"style":146},[1699],{"type":49,"value":597},{"type":44,"tag":87,"props":1701,"children":1702},{"style":146},[1703],{"type":49,"value":582},{"type":44,"tag":87,"props":1705,"children":1706},{"style":157},[1707],{"type":49,"value":1650},{"type":44,"tag":87,"props":1709,"children":1710},{"style":146},[1711],{"type":49,"value":597},{"type":44,"tag":87,"props":1713,"children":1714},{"style":146},[1715],{"type":49,"value":582},{"type":44,"tag":87,"props":1717,"children":1718},{"style":157},[1719],{"type":49,"value":1650},{"type":44,"tag":87,"props":1721,"children":1722},{"style":146},[1723],{"type":49,"value":597},{"type":44,"tag":87,"props":1725,"children":1726},{"style":146},[1727],{"type":49,"value":1728}," >",{"type":44,"tag":87,"props":1730,"children":1731},{"style":146},[1732],{"type":49,"value":582},{"type":44,"tag":87,"props":1734,"children":1735},{"style":157},[1736],{"type":49,"value":1554},{"type":44,"tag":87,"props":1738,"children":1739},{"style":100},[1740],{"type":49,"value":1645},{"type":44,"tag":87,"props":1742,"children":1743},{"style":157},[1744],{"type":49,"value":1650},{"type":44,"tag":87,"props":1746,"children":1747},{"style":100},[1748],{"type":49,"value":1749},"\u002FSKILL.md",{"type":44,"tag":87,"props":1751,"children":1752},{"style":146},[1753],{"type":49,"value":1581},{"type":44,"tag":87,"props":1755,"children":1756},{"class":89,"line":797},[1757],{"type":44,"tag":87,"props":1758,"children":1759},{"style":1587},[1760],{"type":49,"value":1761},"done\n",{"type":44,"tag":87,"props":1763,"children":1764},{"class":89,"line":855},[1765],{"type":44,"tag":87,"props":1766,"children":1767},{"emptyLinePlaceholder":791},[1768],{"type":49,"value":794},{"type":44,"tag":87,"props":1770,"children":1771},{"class":89,"line":878},[1772,1777,1781,1785,1789,1794,1798,1803],{"type":44,"tag":87,"props":1773,"children":1774},{"style":94},[1775],{"type":49,"value":1776},"cat",{"type":44,"tag":87,"props":1778,"children":1779},{"style":146},[1780],{"type":49,"value":1728},{"type":44,"tag":87,"props":1782,"children":1783},{"style":146},[1784],{"type":49,"value":582},{"type":44,"tag":87,"props":1786,"children":1787},{"style":157},[1788],{"type":49,"value":1554},{"type":44,"tag":87,"props":1790,"children":1791},{"style":100},[1792],{"type":49,"value":1793},"\u002Flocal-agents\u002Fagents\u002Fcode-reviewer.md",{"type":44,"tag":87,"props":1795,"children":1796},{"style":146},[1797],{"type":49,"value":597},{"type":44,"tag":87,"props":1799,"children":1800},{"style":146},[1801],{"type":49,"value":1802}," \u003C\u003C",{"type":44,"tag":87,"props":1804,"children":1805},{"style":146},[1806],{"type":49,"value":1807},"'EOF'\n",{"type":44,"tag":87,"props":1809,"children":1810},{"class":89,"line":31},[1811],{"type":44,"tag":87,"props":1812,"children":1813},{"style":100},[1814],{"type":49,"value":1815},"---\n",{"type":44,"tag":87,"props":1817,"children":1818},{"class":89,"line":903},[1819],{"type":44,"tag":87,"props":1820,"children":1821},{"style":100},[1822],{"type":49,"value":1823},"name: code-reviewer\n",{"type":44,"tag":87,"props":1825,"children":1826},{"class":89,"line":916},[1827],{"type":44,"tag":87,"props":1828,"children":1829},{"style":100},[1830],{"type":49,"value":1831},"description: Review code for correctness.\n",{"type":44,"tag":87,"props":1833,"children":1834},{"class":89,"line":929},[1835],{"type":44,"tag":87,"props":1836,"children":1837},{"style":100},[1838],{"type":49,"value":1815},{"type":44,"tag":87,"props":1840,"children":1841},{"class":89,"line":942},[1842],{"type":44,"tag":87,"props":1843,"children":1844},{"emptyLinePlaceholder":791},[1845],{"type":49,"value":794},{"type":44,"tag":87,"props":1847,"children":1848},{"class":89,"line":969},[1849],{"type":44,"tag":87,"props":1850,"children":1851},{"style":100},[1852],{"type":49,"value":1853},"Review the current diff and return findings with file references.\n",{"type":44,"tag":87,"props":1855,"children":1856},{"class":89,"line":994},[1857],{"type":44,"tag":87,"props":1858,"children":1859},{"style":146},[1860],{"type":49,"value":1861},"EOF\n",{"type":44,"tag":87,"props":1863,"children":1864},{"class":89,"line":1042},[1865],{"type":44,"tag":87,"props":1866,"children":1867},{"emptyLinePlaceholder":791},[1868],{"type":49,"value":794},{"type":44,"tag":87,"props":1870,"children":1871},{"class":89,"line":1050},[1872,1876,1880,1884,1888,1893,1897,1901],{"type":44,"tag":87,"props":1873,"children":1874},{"style":94},[1875],{"type":49,"value":1776},{"type":44,"tag":87,"props":1877,"children":1878},{"style":146},[1879],{"type":49,"value":1728},{"type":44,"tag":87,"props":1881,"children":1882},{"style":146},[1883],{"type":49,"value":582},{"type":44,"tag":87,"props":1885,"children":1886},{"style":157},[1887],{"type":49,"value":1554},{"type":44,"tag":87,"props":1889,"children":1890},{"style":100},[1891],{"type":49,"value":1892},"\u002Fagents.toml",{"type":44,"tag":87,"props":1894,"children":1895},{"style":146},[1896],{"type":49,"value":597},{"type":44,"tag":87,"props":1898,"children":1899},{"style":146},[1900],{"type":49,"value":1802},{"type":44,"tag":87,"props":1902,"children":1903},{"style":146},[1904],{"type":49,"value":1807},{"type":44,"tag":87,"props":1906,"children":1907},{"class":89,"line":1063},[1908],{"type":44,"tag":87,"props":1909,"children":1910},{"style":100},[1911],{"type":49,"value":1912},"version = 1\n",{"type":44,"tag":87,"props":1914,"children":1915},{"class":89,"line":1082},[1916],{"type":44,"tag":87,"props":1917,"children":1918},{"style":100},[1919],{"type":49,"value":1920},"agents = [\"claude\", \"cursor\", \"codex\", \"opencode\"]\n",{"type":44,"tag":87,"props":1922,"children":1924},{"class":89,"line":1923},21,[1925],{"type":44,"tag":87,"props":1926,"children":1927},{"emptyLinePlaceholder":791},[1928],{"type":49,"value":794},{"type":44,"tag":87,"props":1930,"children":1932},{"class":89,"line":1931},22,[1933],{"type":44,"tag":87,"props":1934,"children":1935},{"style":100},[1936],{"type":49,"value":1937},"[[skills]]\n",{"type":44,"tag":87,"props":1939,"children":1941},{"class":89,"line":1940},23,[1942],{"type":44,"tag":87,"props":1943,"children":1944},{"style":100},[1945],{"type":49,"value":1946},"name = \"review\"\n",{"type":44,"tag":87,"props":1948,"children":1950},{"class":89,"line":1949},24,[1951],{"type":44,"tag":87,"props":1952,"children":1953},{"style":100},[1954],{"type":49,"value":1955},"source = \"path:.\u002Flocal-skills\u002Freview\"\n",{"type":44,"tag":87,"props":1957,"children":1959},{"class":89,"line":1958},25,[1960],{"type":44,"tag":87,"props":1961,"children":1962},{"emptyLinePlaceholder":791},[1963],{"type":49,"value":794},{"type":44,"tag":87,"props":1965,"children":1967},{"class":89,"line":1966},26,[1968],{"type":44,"tag":87,"props":1969,"children":1970},{"style":100},[1971],{"type":49,"value":1937},{"type":44,"tag":87,"props":1973,"children":1975},{"class":89,"line":1974},27,[1976],{"type":44,"tag":87,"props":1977,"children":1978},{"style":100},[1979],{"type":49,"value":1980},"name = \"commit\"\n",{"type":44,"tag":87,"props":1982,"children":1984},{"class":89,"line":1983},28,[1985],{"type":44,"tag":87,"props":1986,"children":1987},{"style":100},[1988],{"type":49,"value":1989},"source = \"path:.\u002Flocal-skills\u002Fcommit\"\n",{"type":44,"tag":87,"props":1991,"children":1993},{"class":89,"line":1992},29,[1994],{"type":44,"tag":87,"props":1995,"children":1996},{"emptyLinePlaceholder":791},[1997],{"type":49,"value":794},{"type":44,"tag":87,"props":1999,"children":2001},{"class":89,"line":2000},30,[2002],{"type":44,"tag":87,"props":2003,"children":2004},{"style":100},[2005],{"type":49,"value":2006},"[[mcp]]\n",{"type":44,"tag":87,"props":2008,"children":2010},{"class":89,"line":2009},31,[2011],{"type":44,"tag":87,"props":2012,"children":2013},{"style":100},[2014],{"type":49,"value":2015},"name = \"fixture\"\n",{"type":44,"tag":87,"props":2017,"children":2019},{"class":89,"line":2018},32,[2020],{"type":44,"tag":87,"props":2021,"children":2022},{"style":100},[2023],{"type":49,"value":2024},"command = \"node\"\n",{"type":44,"tag":87,"props":2026,"children":2028},{"class":89,"line":2027},33,[2029],{"type":44,"tag":87,"props":2030,"children":2031},{"style":100},[2032],{"type":49,"value":2033},"args = [\"-e\", \"process.exit(0)\"]\n",{"type":44,"tag":87,"props":2035,"children":2037},{"class":89,"line":2036},34,[2038],{"type":44,"tag":87,"props":2039,"children":2040},{"emptyLinePlaceholder":791},[2041],{"type":49,"value":794},{"type":44,"tag":87,"props":2043,"children":2045},{"class":89,"line":2044},35,[2046],{"type":44,"tag":87,"props":2047,"children":2048},{"style":100},[2049],{"type":49,"value":2050},"[[hooks]]\n",{"type":44,"tag":87,"props":2052,"children":2054},{"class":89,"line":2053},36,[2055],{"type":44,"tag":87,"props":2056,"children":2057},{"style":100},[2058],{"type":49,"value":2059},"event = \"Stop\"\n",{"type":44,"tag":87,"props":2061,"children":2063},{"class":89,"line":2062},37,[2064],{"type":44,"tag":87,"props":2065,"children":2066},{"style":100},[2067],{"type":49,"value":2068},"command = \"echo fixture\"\n",{"type":44,"tag":87,"props":2070,"children":2072},{"class":89,"line":2071},38,[2073],{"type":44,"tag":87,"props":2074,"children":2075},{"emptyLinePlaceholder":791},[2076],{"type":49,"value":794},{"type":44,"tag":87,"props":2078,"children":2080},{"class":89,"line":2079},39,[2081],{"type":44,"tag":87,"props":2082,"children":2083},{"style":100},[2084],{"type":49,"value":2085},"[[subagents]]\n",{"type":44,"tag":87,"props":2087,"children":2089},{"class":89,"line":2088},40,[2090],{"type":44,"tag":87,"props":2091,"children":2092},{"style":100},[2093],{"type":49,"value":2094},"name = \"code-reviewer\"\n",{"type":44,"tag":87,"props":2096,"children":2098},{"class":89,"line":2097},41,[2099],{"type":44,"tag":87,"props":2100,"children":2101},{"style":100},[2102],{"type":49,"value":2103},"source = \"path:.\u002Flocal-agents\"\n",{"type":44,"tag":87,"props":2105,"children":2107},{"class":89,"line":2106},42,[2108],{"type":44,"tag":87,"props":2109,"children":2110},{"style":146},[2111],{"type":49,"value":1861},{"type":44,"tag":52,"props":2113,"children":2114},{},[2115],{"type":49,"value":2116},"Useful fixture changes:",{"type":44,"tag":172,"props":2118,"children":2119},{},[2120,2149,2154,2159,2187,2192,2221,2226],{"type":44,"tag":176,"props":2121,"children":2122},{},[2123,2125,2131,2133,2139,2141,2147],{"type":49,"value":2124},"Skill resolution: nested ",{"type":44,"tag":83,"props":2126,"children":2128},{"className":2127},[],[2129],{"type":49,"value":2130},"skills\u002F",{"type":49,"value":2132}," layouts, wildcard sources, duplicate\nnames, local paths outside ",{"type":44,"tag":83,"props":2134,"children":2136},{"className":2135},[],[2137],{"type":49,"value":2138},".agents",{"type":49,"value":2140},", or the exact ",{"type":44,"tag":83,"props":2142,"children":2144},{"className":2143},[],[2145],{"type":49,"value":2146},"path:",{"type":49,"value":2148}," shape touched.",{"type":44,"tag":176,"props":2150,"children":2151},{},[2152],{"type":49,"value":2153},"Agent placement: include only affected agents, or include all supported\nagents when shared config or registry behavior changed.",{"type":44,"tag":176,"props":2155,"children":2156},{},[2157],{"type":49,"value":2158},"MCP and hooks: use the exact command, URL, headers, env refs, hook event, or\nmatcher affected by the diff.",{"type":44,"tag":176,"props":2160,"children":2161},{},[2162,2164,2170,2172,2177,2179,2185],{"type":49,"value":2163},"Subagents: include a portable Markdown fixture under ",{"type":44,"tag":83,"props":2165,"children":2167},{"className":2166},[],[2168],{"type":49,"value":2169},"agents\u002F",{"type":49,"value":2171},", assert the\ninstalled canonical file in ",{"type":44,"tag":83,"props":2173,"children":2175},{"className":2174},[],[2176],{"type":49,"value":1410},{"type":49,"value":2178},", assert generated runtime files\nfor Claude\u002FCursor\u002FCodex\u002FOpenCode, and inspect ",{"type":44,"tag":83,"props":2180,"children":2182},{"className":2181},[],[2183],{"type":49,"value":2184},"agents.lock",{"type":49,"value":2186},".",{"type":44,"tag":176,"props":2188,"children":2189},{},[2190],{"type":49,"value":2191},"Sync and doctor: pre-create broken or legacy state, then prove repair and\ndiagnostics.",{"type":44,"tag":176,"props":2193,"children":2194},{},[2195,2197,2203,2205,2211,2213,2219],{"type":49,"value":2196},"User scope: set both ",{"type":44,"tag":83,"props":2198,"children":2200},{"className":2199},[],[2201],{"type":49,"value":2202},"HOME",{"type":49,"value":2204}," and ",{"type":44,"tag":83,"props":2206,"children":2208},{"className":2207},[],[2209],{"type":49,"value":2210},"DOTAGENTS_HOME",{"type":49,"value":2212},", pass ",{"type":44,"tag":83,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":49,"value":2218},"--user",{"type":49,"value":2220},", and inspect\ngenerated files under those temp directories; never use the host home\ndirectory.",{"type":44,"tag":176,"props":2222,"children":2223},{},[2224],{"type":49,"value":2225},"Package\u002Fruntime: run the built CLI as above, or pack\u002Finstall the package only\nwhen the packaging path itself changed.",{"type":44,"tag":176,"props":2227,"children":2228},{},[2229,2231,2237],{"type":49,"value":2230},"Remote sources: use ",{"type":44,"tag":83,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":49,"value":2236},"getsentry\u002Fskills",{"type":49,"value":2238},"; avoid remotes for ordinary\ninstall-location checks.",{"type":44,"tag":63,"props":2240,"children":2242},{"id":2241},"_5-exercise-the-cli",[2243],{"type":49,"value":2244},"5. Exercise The CLI",{"type":44,"tag":52,"props":2246,"children":2247},{},[2248],{"type":49,"value":2249},"Run the built local CLI from the fixture. Capture output and inspect generated\nfiles, not just exit codes.",{"type":44,"tag":75,"props":2251,"children":2253},{"className":77,"code":2252,"language":79,"meta":80,"style":80},"cli=(node \u002Fsandbox\u002Frepo\u002Fpackages\u002Fdotagents\u002Fdist\u002Fcli\u002Findex.js)\ncd \"$fixture\"\n\n\"${cli[@]}\" install | tee \u002Fqa-out\u002Finstall.out\n\"${cli[@]}\" list | tee \u002Fqa-out\u002Flist.out\n\"${cli[@]}\" doctor --fix | tee \u002Fqa-out\u002Fdoctor-fix.out\n\"${cli[@]}\" doctor | tee \u002Fqa-out\u002Fdoctor.out\n",[2254],{"type":44,"tag":83,"props":2255,"children":2256},{"__ignoreMap":80},[2257,2284,2303,2310,2353,2394,2440],{"type":44,"tag":87,"props":2258,"children":2259},{"class":89,"line":90},[2260,2265,2270,2274,2279],{"type":44,"tag":87,"props":2261,"children":2262},{"style":157},[2263],{"type":49,"value":2264},"cli",{"type":44,"tag":87,"props":2266,"children":2267},{"style":146},[2268],{"type":49,"value":2269},"=(",{"type":44,"tag":87,"props":2271,"children":2272},{"style":100},[2273],{"type":49,"value":1103},{"type":44,"tag":87,"props":2275,"children":2276},{"style":100},[2277],{"type":49,"value":2278}," \u002Fsandbox\u002Frepo\u002Fpackages\u002Fdotagents\u002Fdist\u002Fcli\u002Findex.js",{"type":44,"tag":87,"props":2280,"children":2281},{"style":146},[2282],{"type":49,"value":2283},")\n",{"type":44,"tag":87,"props":2285,"children":2286},{"class":89,"line":111},[2287,2291,2295,2299],{"type":44,"tag":87,"props":2288,"children":2289},{"style":474},[2290],{"type":49,"value":1056},{"type":44,"tag":87,"props":2292,"children":2293},{"style":146},[2294],{"type":49,"value":582},{"type":44,"tag":87,"props":2296,"children":2297},{"style":157},[2298],{"type":49,"value":1554},{"type":44,"tag":87,"props":2300,"children":2301},{"style":146},[2302],{"type":49,"value":1581},{"type":44,"tag":87,"props":2304,"children":2305},{"class":89,"line":129},[2306],{"type":44,"tag":87,"props":2307,"children":2308},{"emptyLinePlaceholder":791},[2309],{"type":49,"value":794},{"type":44,"tag":87,"props":2311,"children":2312},{"class":89,"line":408},[2313,2317,2322,2326,2331,2335,2339,2343,2348],{"type":44,"tag":87,"props":2314,"children":2315},{"style":94},[2316],{"type":49,"value":597},{"type":44,"tag":87,"props":2318,"children":2319},{"style":146},[2320],{"type":49,"value":2321},"${",{"type":44,"tag":87,"props":2323,"children":2324},{"style":157},[2325],{"type":49,"value":2264},{"type":44,"tag":87,"props":2327,"children":2328},{"style":146},[2329],{"type":49,"value":2330},"[@]}",{"type":44,"tag":87,"props":2332,"children":2333},{"style":94},[2334],{"type":49,"value":597},{"type":44,"tag":87,"props":2336,"children":2337},{"style":100},[2338],{"type":49,"value":1074},{"type":44,"tag":87,"props":2340,"children":2341},{"style":146},[2342],{"type":49,"value":1015},{"type":44,"tag":87,"props":2344,"children":2345},{"style":94},[2346],{"type":49,"value":2347}," tee",{"type":44,"tag":87,"props":2349,"children":2350},{"style":100},[2351],{"type":49,"value":2352}," \u002Fqa-out\u002Finstall.out\n",{"type":44,"tag":87,"props":2354,"children":2355},{"class":89,"line":604},[2356,2360,2364,2368,2372,2376,2381,2385,2389],{"type":44,"tag":87,"props":2357,"children":2358},{"style":94},[2359],{"type":49,"value":597},{"type":44,"tag":87,"props":2361,"children":2362},{"style":146},[2363],{"type":49,"value":2321},{"type":44,"tag":87,"props":2365,"children":2366},{"style":157},[2367],{"type":49,"value":2264},{"type":44,"tag":87,"props":2369,"children":2370},{"style":146},[2371],{"type":49,"value":2330},{"type":44,"tag":87,"props":2373,"children":2374},{"style":94},[2375],{"type":49,"value":597},{"type":44,"tag":87,"props":2377,"children":2378},{"style":100},[2379],{"type":49,"value":2380}," list",{"type":44,"tag":87,"props":2382,"children":2383},{"style":146},[2384],{"type":49,"value":1015},{"type":44,"tag":87,"props":2386,"children":2387},{"style":94},[2388],{"type":49,"value":2347},{"type":44,"tag":87,"props":2390,"children":2391},{"style":100},[2392],{"type":49,"value":2393}," \u002Fqa-out\u002Flist.out\n",{"type":44,"tag":87,"props":2395,"children":2396},{"class":89,"line":634},[2397,2401,2405,2409,2413,2417,2422,2427,2431,2435],{"type":44,"tag":87,"props":2398,"children":2399},{"style":94},[2400],{"type":49,"value":597},{"type":44,"tag":87,"props":2402,"children":2403},{"style":146},[2404],{"type":49,"value":2321},{"type":44,"tag":87,"props":2406,"children":2407},{"style":157},[2408],{"type":49,"value":2264},{"type":44,"tag":87,"props":2410,"children":2411},{"style":146},[2412],{"type":49,"value":2330},{"type":44,"tag":87,"props":2414,"children":2415},{"style":94},[2416],{"type":49,"value":597},{"type":44,"tag":87,"props":2418,"children":2419},{"style":100},[2420],{"type":49,"value":2421}," doctor",{"type":44,"tag":87,"props":2423,"children":2424},{"style":100},[2425],{"type":49,"value":2426}," --fix",{"type":44,"tag":87,"props":2428,"children":2429},{"style":146},[2430],{"type":49,"value":1015},{"type":44,"tag":87,"props":2432,"children":2433},{"style":94},[2434],{"type":49,"value":2347},{"type":44,"tag":87,"props":2436,"children":2437},{"style":100},[2438],{"type":49,"value":2439}," \u002Fqa-out\u002Fdoctor-fix.out\n",{"type":44,"tag":87,"props":2441,"children":2442},{"class":89,"line":797},[2443,2447,2451,2455,2459,2463,2467,2471,2475],{"type":44,"tag":87,"props":2444,"children":2445},{"style":94},[2446],{"type":49,"value":597},{"type":44,"tag":87,"props":2448,"children":2449},{"style":146},[2450],{"type":49,"value":2321},{"type":44,"tag":87,"props":2452,"children":2453},{"style":157},[2454],{"type":49,"value":2264},{"type":44,"tag":87,"props":2456,"children":2457},{"style":146},[2458],{"type":49,"value":2330},{"type":44,"tag":87,"props":2460,"children":2461},{"style":94},[2462],{"type":49,"value":597},{"type":44,"tag":87,"props":2464,"children":2465},{"style":100},[2466],{"type":49,"value":2421},{"type":44,"tag":87,"props":2468,"children":2469},{"style":146},[2470],{"type":49,"value":1015},{"type":44,"tag":87,"props":2472,"children":2473},{"style":94},[2474],{"type":49,"value":2347},{"type":44,"tag":87,"props":2476,"children":2477},{"style":100},[2478],{"type":49,"value":2479}," \u002Fqa-out\u002Fdoctor.out\n",{"type":44,"tag":52,"props":2481,"children":2482},{},[2483],{"type":49,"value":2484},"Assert what matters for this change. Examples:",{"type":44,"tag":75,"props":2486,"children":2488},{"className":77,"code":2487,"language":79,"meta":80,"style":80},"grep -q \"review\" \u002Fqa-out\u002Flist.out\ngrep -q \"commit\" \u002Fqa-out\u002Flist.out\ntest -f .agents\u002Fskills\u002Freview\u002FSKILL.md\ntest -f .agents\u002Fskills\u002Fcommit\u002FSKILL.md\ntest -L .claude\u002Fskills\ntest -f .mcp.json\ntest -f .cursor\u002Fmcp.json\ntest -f .codex\u002Fconfig.toml\ntest -f .opencode\u002Fopencode.jsonc\ntest -f .claude\u002Fsettings.json\ntest -f .cursor\u002Fhooks.json\ntest -f .agents\u002Fagents\u002Fcode-reviewer.md\ntest -f .claude\u002Fagents\u002Fcode-reviewer.md\ntest -f .cursor\u002Fagents\u002Fcode-reviewer.md\ntest -f .codex\u002Fagents\u002Fcode-reviewer.toml\ntest -f .opencode\u002Fagents\u002Fcode-reviewer.md\ngrep -q \"code-reviewer\" agents.lock\ngrep -q \"Generated by dotagents\" .claude\u002Fagents\u002Fcode-reviewer.md\ngrep -q \"Generated by dotagents\" .codex\u002Fagents\u002Fcode-reviewer.toml\n",[2489],{"type":44,"tag":83,"props":2490,"children":2491},{"__ignoreMap":80},[2492,2522,2550,2568,2584,2601,2617,2633,2649,2665,2681,2697,2713,2729,2745,2761,2777,2806,2834],{"type":44,"tag":87,"props":2493,"children":2494},{"class":89,"line":90},[2495,2500,2505,2509,2514,2518],{"type":44,"tag":87,"props":2496,"children":2497},{"style":94},[2498],{"type":49,"value":2499},"grep",{"type":44,"tag":87,"props":2501,"children":2502},{"style":100},[2503],{"type":49,"value":2504}," -q",{"type":44,"tag":87,"props":2506,"children":2507},{"style":146},[2508],{"type":49,"value":582},{"type":44,"tag":87,"props":2510,"children":2511},{"style":100},[2512],{"type":49,"value":2513},"review",{"type":44,"tag":87,"props":2515,"children":2516},{"style":146},[2517],{"type":49,"value":597},{"type":44,"tag":87,"props":2519,"children":2520},{"style":100},[2521],{"type":49,"value":2393},{"type":44,"tag":87,"props":2523,"children":2524},{"class":89,"line":111},[2525,2529,2533,2537,2542,2546],{"type":44,"tag":87,"props":2526,"children":2527},{"style":94},[2528],{"type":49,"value":2499},{"type":44,"tag":87,"props":2530,"children":2531},{"style":100},[2532],{"type":49,"value":2504},{"type":44,"tag":87,"props":2534,"children":2535},{"style":146},[2536],{"type":49,"value":582},{"type":44,"tag":87,"props":2538,"children":2539},{"style":100},[2540],{"type":49,"value":2541},"commit",{"type":44,"tag":87,"props":2543,"children":2544},{"style":146},[2545],{"type":49,"value":597},{"type":44,"tag":87,"props":2547,"children":2548},{"style":100},[2549],{"type":49,"value":2393},{"type":44,"tag":87,"props":2551,"children":2552},{"class":89,"line":129},[2553,2558,2563],{"type":44,"tag":87,"props":2554,"children":2555},{"style":474},[2556],{"type":49,"value":2557},"test",{"type":44,"tag":87,"props":2559,"children":2560},{"style":100},[2561],{"type":49,"value":2562}," -f",{"type":44,"tag":87,"props":2564,"children":2565},{"style":100},[2566],{"type":49,"value":2567}," .agents\u002Fskills\u002Freview\u002FSKILL.md\n",{"type":44,"tag":87,"props":2569,"children":2570},{"class":89,"line":408},[2571,2575,2579],{"type":44,"tag":87,"props":2572,"children":2573},{"style":474},[2574],{"type":49,"value":2557},{"type":44,"tag":87,"props":2576,"children":2577},{"style":100},[2578],{"type":49,"value":2562},{"type":44,"tag":87,"props":2580,"children":2581},{"style":100},[2582],{"type":49,"value":2583}," .agents\u002Fskills\u002Fcommit\u002FSKILL.md\n",{"type":44,"tag":87,"props":2585,"children":2586},{"class":89,"line":604},[2587,2591,2596],{"type":44,"tag":87,"props":2588,"children":2589},{"style":474},[2590],{"type":49,"value":2557},{"type":44,"tag":87,"props":2592,"children":2593},{"style":100},[2594],{"type":49,"value":2595}," -L",{"type":44,"tag":87,"props":2597,"children":2598},{"style":100},[2599],{"type":49,"value":2600}," .claude\u002Fskills\n",{"type":44,"tag":87,"props":2602,"children":2603},{"class":89,"line":634},[2604,2608,2612],{"type":44,"tag":87,"props":2605,"children":2606},{"style":474},[2607],{"type":49,"value":2557},{"type":44,"tag":87,"props":2609,"children":2610},{"style":100},[2611],{"type":49,"value":2562},{"type":44,"tag":87,"props":2613,"children":2614},{"style":100},[2615],{"type":49,"value":2616}," .mcp.json\n",{"type":44,"tag":87,"props":2618,"children":2619},{"class":89,"line":797},[2620,2624,2628],{"type":44,"tag":87,"props":2621,"children":2622},{"style":474},[2623],{"type":49,"value":2557},{"type":44,"tag":87,"props":2625,"children":2626},{"style":100},[2627],{"type":49,"value":2562},{"type":44,"tag":87,"props":2629,"children":2630},{"style":100},[2631],{"type":49,"value":2632}," .cursor\u002Fmcp.json\n",{"type":44,"tag":87,"props":2634,"children":2635},{"class":89,"line":855},[2636,2640,2644],{"type":44,"tag":87,"props":2637,"children":2638},{"style":474},[2639],{"type":49,"value":2557},{"type":44,"tag":87,"props":2641,"children":2642},{"style":100},[2643],{"type":49,"value":2562},{"type":44,"tag":87,"props":2645,"children":2646},{"style":100},[2647],{"type":49,"value":2648}," .codex\u002Fconfig.toml\n",{"type":44,"tag":87,"props":2650,"children":2651},{"class":89,"line":878},[2652,2656,2660],{"type":44,"tag":87,"props":2653,"children":2654},{"style":474},[2655],{"type":49,"value":2557},{"type":44,"tag":87,"props":2657,"children":2658},{"style":100},[2659],{"type":49,"value":2562},{"type":44,"tag":87,"props":2661,"children":2662},{"style":100},[2663],{"type":49,"value":2664}," .opencode\u002Fopencode.jsonc\n",{"type":44,"tag":87,"props":2666,"children":2667},{"class":89,"line":31},[2668,2672,2676],{"type":44,"tag":87,"props":2669,"children":2670},{"style":474},[2671],{"type":49,"value":2557},{"type":44,"tag":87,"props":2673,"children":2674},{"style":100},[2675],{"type":49,"value":2562},{"type":44,"tag":87,"props":2677,"children":2678},{"style":100},[2679],{"type":49,"value":2680}," .claude\u002Fsettings.json\n",{"type":44,"tag":87,"props":2682,"children":2683},{"class":89,"line":903},[2684,2688,2692],{"type":44,"tag":87,"props":2685,"children":2686},{"style":474},[2687],{"type":49,"value":2557},{"type":44,"tag":87,"props":2689,"children":2690},{"style":100},[2691],{"type":49,"value":2562},{"type":44,"tag":87,"props":2693,"children":2694},{"style":100},[2695],{"type":49,"value":2696}," .cursor\u002Fhooks.json\n",{"type":44,"tag":87,"props":2698,"children":2699},{"class":89,"line":916},[2700,2704,2708],{"type":44,"tag":87,"props":2701,"children":2702},{"style":474},[2703],{"type":49,"value":2557},{"type":44,"tag":87,"props":2705,"children":2706},{"style":100},[2707],{"type":49,"value":2562},{"type":44,"tag":87,"props":2709,"children":2710},{"style":100},[2711],{"type":49,"value":2712}," .agents\u002Fagents\u002Fcode-reviewer.md\n",{"type":44,"tag":87,"props":2714,"children":2715},{"class":89,"line":929},[2716,2720,2724],{"type":44,"tag":87,"props":2717,"children":2718},{"style":474},[2719],{"type":49,"value":2557},{"type":44,"tag":87,"props":2721,"children":2722},{"style":100},[2723],{"type":49,"value":2562},{"type":44,"tag":87,"props":2725,"children":2726},{"style":100},[2727],{"type":49,"value":2728}," .claude\u002Fagents\u002Fcode-reviewer.md\n",{"type":44,"tag":87,"props":2730,"children":2731},{"class":89,"line":942},[2732,2736,2740],{"type":44,"tag":87,"props":2733,"children":2734},{"style":474},[2735],{"type":49,"value":2557},{"type":44,"tag":87,"props":2737,"children":2738},{"style":100},[2739],{"type":49,"value":2562},{"type":44,"tag":87,"props":2741,"children":2742},{"style":100},[2743],{"type":49,"value":2744}," .cursor\u002Fagents\u002Fcode-reviewer.md\n",{"type":44,"tag":87,"props":2746,"children":2747},{"class":89,"line":969},[2748,2752,2756],{"type":44,"tag":87,"props":2749,"children":2750},{"style":474},[2751],{"type":49,"value":2557},{"type":44,"tag":87,"props":2753,"children":2754},{"style":100},[2755],{"type":49,"value":2562},{"type":44,"tag":87,"props":2757,"children":2758},{"style":100},[2759],{"type":49,"value":2760}," .codex\u002Fagents\u002Fcode-reviewer.toml\n",{"type":44,"tag":87,"props":2762,"children":2763},{"class":89,"line":994},[2764,2768,2772],{"type":44,"tag":87,"props":2765,"children":2766},{"style":474},[2767],{"type":49,"value":2557},{"type":44,"tag":87,"props":2769,"children":2770},{"style":100},[2771],{"type":49,"value":2562},{"type":44,"tag":87,"props":2773,"children":2774},{"style":100},[2775],{"type":49,"value":2776}," .opencode\u002Fagents\u002Fcode-reviewer.md\n",{"type":44,"tag":87,"props":2778,"children":2779},{"class":89,"line":1042},[2780,2784,2788,2792,2797,2801],{"type":44,"tag":87,"props":2781,"children":2782},{"style":94},[2783],{"type":49,"value":2499},{"type":44,"tag":87,"props":2785,"children":2786},{"style":100},[2787],{"type":49,"value":2504},{"type":44,"tag":87,"props":2789,"children":2790},{"style":146},[2791],{"type":49,"value":582},{"type":44,"tag":87,"props":2793,"children":2794},{"style":100},[2795],{"type":49,"value":2796},"code-reviewer",{"type":44,"tag":87,"props":2798,"children":2799},{"style":146},[2800],{"type":49,"value":597},{"type":44,"tag":87,"props":2802,"children":2803},{"style":100},[2804],{"type":49,"value":2805}," agents.lock\n",{"type":44,"tag":87,"props":2807,"children":2808},{"class":89,"line":1050},[2809,2813,2817,2821,2826,2830],{"type":44,"tag":87,"props":2810,"children":2811},{"style":94},[2812],{"type":49,"value":2499},{"type":44,"tag":87,"props":2814,"children":2815},{"style":100},[2816],{"type":49,"value":2504},{"type":44,"tag":87,"props":2818,"children":2819},{"style":146},[2820],{"type":49,"value":582},{"type":44,"tag":87,"props":2822,"children":2823},{"style":100},[2824],{"type":49,"value":2825},"Generated by dotagents",{"type":44,"tag":87,"props":2827,"children":2828},{"style":146},[2829],{"type":49,"value":597},{"type":44,"tag":87,"props":2831,"children":2832},{"style":100},[2833],{"type":49,"value":2728},{"type":44,"tag":87,"props":2835,"children":2836},{"class":89,"line":1063},[2837,2841,2845,2849,2853,2857],{"type":44,"tag":87,"props":2838,"children":2839},{"style":94},[2840],{"type":49,"value":2499},{"type":44,"tag":87,"props":2842,"children":2843},{"style":100},[2844],{"type":49,"value":2504},{"type":44,"tag":87,"props":2846,"children":2847},{"style":146},[2848],{"type":49,"value":582},{"type":44,"tag":87,"props":2850,"children":2851},{"style":100},[2852],{"type":49,"value":2825},{"type":44,"tag":87,"props":2854,"children":2855},{"style":146},[2856],{"type":49,"value":597},{"type":44,"tag":87,"props":2858,"children":2859},{"style":100},[2860],{"type":49,"value":2760},{"type":44,"tag":52,"props":2862,"children":2863},{},[2864,2866,2871],{"type":49,"value":2865},"For ",{"type":44,"tag":83,"props":2867,"children":2869},{"className":2868},[],[2870],{"type":49,"value":194},{"type":49,"value":2872}," or subagent writer changes, break the generated state in the way the\ndiff claims to repair, then verify the repair:",{"type":44,"tag":75,"props":2874,"children":2876},{"className":77,"code":2875,"language":79,"meta":80,"style":80},"rm .mcp.json .claude\u002Fskills .claude\u002Fagents\u002Fcode-reviewer.md .codex\u002Fagents\u002Fcode-reviewer.toml\n\"${cli[@]}\" sync | tee \u002Fqa-out\u002Fsync.out\ntest -f .mcp.json\ntest -L .claude\u002Fskills\ntest -f .claude\u002Fagents\u002Fcode-reviewer.md\ntest -f .codex\u002Fagents\u002Fcode-reviewer.toml\n",[2877],{"type":44,"tag":83,"props":2878,"children":2879},{"__ignoreMap":80},[2880,2907,2948,2963,2978,2993],{"type":44,"tag":87,"props":2881,"children":2882},{"class":89,"line":90},[2883,2888,2893,2898,2903],{"type":44,"tag":87,"props":2884,"children":2885},{"style":94},[2886],{"type":49,"value":2887},"rm",{"type":44,"tag":87,"props":2889,"children":2890},{"style":100},[2891],{"type":49,"value":2892}," .mcp.json",{"type":44,"tag":87,"props":2894,"children":2895},{"style":100},[2896],{"type":49,"value":2897}," .claude\u002Fskills",{"type":44,"tag":87,"props":2899,"children":2900},{"style":100},[2901],{"type":49,"value":2902}," .claude\u002Fagents\u002Fcode-reviewer.md",{"type":44,"tag":87,"props":2904,"children":2905},{"style":100},[2906],{"type":49,"value":2760},{"type":44,"tag":87,"props":2908,"children":2909},{"class":89,"line":111},[2910,2914,2918,2922,2926,2930,2935,2939,2943],{"type":44,"tag":87,"props":2911,"children":2912},{"style":94},[2913],{"type":49,"value":597},{"type":44,"tag":87,"props":2915,"children":2916},{"style":146},[2917],{"type":49,"value":2321},{"type":44,"tag":87,"props":2919,"children":2920},{"style":157},[2921],{"type":49,"value":2264},{"type":44,"tag":87,"props":2923,"children":2924},{"style":146},[2925],{"type":49,"value":2330},{"type":44,"tag":87,"props":2927,"children":2928},{"style":94},[2929],{"type":49,"value":597},{"type":44,"tag":87,"props":2931,"children":2932},{"style":100},[2933],{"type":49,"value":2934}," sync",{"type":44,"tag":87,"props":2936,"children":2937},{"style":146},[2938],{"type":49,"value":1015},{"type":44,"tag":87,"props":2940,"children":2941},{"style":94},[2942],{"type":49,"value":2347},{"type":44,"tag":87,"props":2944,"children":2945},{"style":100},[2946],{"type":49,"value":2947}," \u002Fqa-out\u002Fsync.out\n",{"type":44,"tag":87,"props":2949,"children":2950},{"class":89,"line":129},[2951,2955,2959],{"type":44,"tag":87,"props":2952,"children":2953},{"style":474},[2954],{"type":49,"value":2557},{"type":44,"tag":87,"props":2956,"children":2957},{"style":100},[2958],{"type":49,"value":2562},{"type":44,"tag":87,"props":2960,"children":2961},{"style":100},[2962],{"type":49,"value":2616},{"type":44,"tag":87,"props":2964,"children":2965},{"class":89,"line":408},[2966,2970,2974],{"type":44,"tag":87,"props":2967,"children":2968},{"style":474},[2969],{"type":49,"value":2557},{"type":44,"tag":87,"props":2971,"children":2972},{"style":100},[2973],{"type":49,"value":2595},{"type":44,"tag":87,"props":2975,"children":2976},{"style":100},[2977],{"type":49,"value":2600},{"type":44,"tag":87,"props":2979,"children":2980},{"class":89,"line":604},[2981,2985,2989],{"type":44,"tag":87,"props":2982,"children":2983},{"style":474},[2984],{"type":49,"value":2557},{"type":44,"tag":87,"props":2986,"children":2987},{"style":100},[2988],{"type":49,"value":2562},{"type":44,"tag":87,"props":2990,"children":2991},{"style":100},[2992],{"type":49,"value":2728},{"type":44,"tag":87,"props":2994,"children":2995},{"class":89,"line":634},[2996,3000,3004],{"type":44,"tag":87,"props":2997,"children":2998},{"style":474},[2999],{"type":49,"value":2557},{"type":44,"tag":87,"props":3001,"children":3002},{"style":100},[3003],{"type":49,"value":2562},{"type":44,"tag":87,"props":3005,"children":3006},{"style":100},[3007],{"type":49,"value":2760},{"type":44,"tag":52,"props":3009,"children":3010},{},[3011],{"type":49,"value":3012},"For user-scope changes:",{"type":44,"tag":75,"props":3014,"children":3016},{"className":77,"code":3015,"language":79,"meta":80,"style":80},"cd \u002Fsandbox\n\"${cli[@]}\" --user install | tee \u002Fqa-out\u002Fuser-install.out\ntest -f \"$DOTAGENTS_HOME\u002Fagents.toml\"\ntest -d \"$DOTAGENTS_HOME\u002Fskills\"\n",[3017],{"type":44,"tag":83,"props":3018,"children":3019},{"__ignoreMap":80},[3020,3031,3076,3103],{"type":44,"tag":87,"props":3021,"children":3022},{"class":89,"line":90},[3023,3027],{"type":44,"tag":87,"props":3024,"children":3025},{"style":474},[3026],{"type":49,"value":1056},{"type":44,"tag":87,"props":3028,"children":3029},{"style":100},[3030],{"type":49,"value":1147},{"type":44,"tag":87,"props":3032,"children":3033},{"class":89,"line":111},[3034,3038,3042,3046,3050,3054,3059,3063,3067,3071],{"type":44,"tag":87,"props":3035,"children":3036},{"style":94},[3037],{"type":49,"value":597},{"type":44,"tag":87,"props":3039,"children":3040},{"style":146},[3041],{"type":49,"value":2321},{"type":44,"tag":87,"props":3043,"children":3044},{"style":157},[3045],{"type":49,"value":2264},{"type":44,"tag":87,"props":3047,"children":3048},{"style":146},[3049],{"type":49,"value":2330},{"type":44,"tag":87,"props":3051,"children":3052},{"style":94},[3053],{"type":49,"value":597},{"type":44,"tag":87,"props":3055,"children":3056},{"style":100},[3057],{"type":49,"value":3058}," --user",{"type":44,"tag":87,"props":3060,"children":3061},{"style":100},[3062],{"type":49,"value":1074},{"type":44,"tag":87,"props":3064,"children":3065},{"style":146},[3066],{"type":49,"value":1015},{"type":44,"tag":87,"props":3068,"children":3069},{"style":94},[3070],{"type":49,"value":2347},{"type":44,"tag":87,"props":3072,"children":3073},{"style":100},[3074],{"type":49,"value":3075}," \u002Fqa-out\u002Fuser-install.out\n",{"type":44,"tag":87,"props":3077,"children":3078},{"class":89,"line":129},[3079,3083,3087,3091,3095,3099],{"type":44,"tag":87,"props":3080,"children":3081},{"style":474},[3082],{"type":49,"value":2557},{"type":44,"tag":87,"props":3084,"children":3085},{"style":100},[3086],{"type":49,"value":2562},{"type":44,"tag":87,"props":3088,"children":3089},{"style":146},[3090],{"type":49,"value":582},{"type":44,"tag":87,"props":3092,"children":3093},{"style":157},[3094],{"type":49,"value":843},{"type":44,"tag":87,"props":3096,"children":3097},{"style":100},[3098],{"type":49,"value":1892},{"type":44,"tag":87,"props":3100,"children":3101},{"style":146},[3102],{"type":49,"value":1581},{"type":44,"tag":87,"props":3104,"children":3105},{"class":89,"line":408},[3106,3110,3115,3119,3123,3128],{"type":44,"tag":87,"props":3107,"children":3108},{"style":474},[3109],{"type":49,"value":2557},{"type":44,"tag":87,"props":3111,"children":3112},{"style":100},[3113],{"type":49,"value":3114}," -d",{"type":44,"tag":87,"props":3116,"children":3117},{"style":146},[3118],{"type":49,"value":582},{"type":44,"tag":87,"props":3120,"children":3121},{"style":157},[3122],{"type":49,"value":843},{"type":44,"tag":87,"props":3124,"children":3125},{"style":100},[3126],{"type":49,"value":3127},"\u002Fskills",{"type":44,"tag":87,"props":3129,"children":3130},{"style":146},[3131],{"type":49,"value":1581},{"type":44,"tag":52,"props":3133,"children":3134},{},[3135],{"type":49,"value":3136},"Copy useful evidence before leaving the container:",{"type":44,"tag":75,"props":3138,"children":3140},{"className":77,"code":3139,"language":79,"meta":80,"style":80},"cp -a \"$fixture\" \u002Fqa-out\u002Ffixture\ncp -a \"$DOTAGENTS_HOME\" \u002Fqa-out\u002Fuser-agents 2>\u002Fdev\u002Fnull || true\n",[3141],{"type":44,"tag":83,"props":3142,"children":3143},{"__ignoreMap":80},[3144,3174],{"type":44,"tag":87,"props":3145,"children":3146},{"class":89,"line":90},[3147,3152,3157,3161,3165,3169],{"type":44,"tag":87,"props":3148,"children":3149},{"style":94},[3150],{"type":49,"value":3151},"cp",{"type":44,"tag":87,"props":3153,"children":3154},{"style":100},[3155],{"type":49,"value":3156}," -a",{"type":44,"tag":87,"props":3158,"children":3159},{"style":146},[3160],{"type":49,"value":582},{"type":44,"tag":87,"props":3162,"children":3163},{"style":157},[3164],{"type":49,"value":1554},{"type":44,"tag":87,"props":3166,"children":3167},{"style":146},[3168],{"type":49,"value":597},{"type":44,"tag":87,"props":3170,"children":3171},{"style":100},[3172],{"type":49,"value":3173}," \u002Fqa-out\u002Ffixture\n",{"type":44,"tag":87,"props":3175,"children":3176},{"class":89,"line":111},[3177,3181,3185,3189,3193,3197,3202,3207,3212,3217],{"type":44,"tag":87,"props":3178,"children":3179},{"style":94},[3180],{"type":49,"value":3151},{"type":44,"tag":87,"props":3182,"children":3183},{"style":100},[3184],{"type":49,"value":3156},{"type":44,"tag":87,"props":3186,"children":3187},{"style":146},[3188],{"type":49,"value":582},{"type":44,"tag":87,"props":3190,"children":3191},{"style":157},[3192],{"type":49,"value":843},{"type":44,"tag":87,"props":3194,"children":3195},{"style":146},[3196],{"type":49,"value":597},{"type":44,"tag":87,"props":3198,"children":3199},{"style":100},[3200],{"type":49,"value":3201}," \u002Fqa-out\u002Fuser-agents",{"type":44,"tag":87,"props":3203,"children":3204},{"style":146},[3205],{"type":49,"value":3206}," 2>",{"type":44,"tag":87,"props":3208,"children":3209},{"style":100},[3210],{"type":49,"value":3211},"\u002Fdev\u002Fnull",{"type":44,"tag":87,"props":3213,"children":3214},{"style":146},[3215],{"type":49,"value":3216}," ||",{"type":44,"tag":87,"props":3218,"children":3219},{"style":474},[3220],{"type":49,"value":3221}," true\n",{"type":44,"tag":63,"props":3223,"children":3225},{"id":3224},"_6-real-agent-clients",[3226],{"type":49,"value":3227},"6. Real Agent Clients",{"type":44,"tag":52,"props":3229,"children":3230},{},[3231],{"type":49,"value":3232},"Use real clients only when discovery or registration in Claude, Cursor, Codex,\nVS Code, or OpenCode changed. Docker proves generated files and symlinks; it\ndoes not prove an installed host client notices them.",{"type":44,"tag":52,"props":3234,"children":3235},{},[3236],{"type":49,"value":3237},"Keep host-client checks isolated with explicit temp homes\u002Fconfig dirs where\nthe client supports it. If a client cannot run without reading host state, say\nso and report the Docker-generated files you inspected instead.",{"type":44,"tag":52,"props":3239,"children":3240},{},[3241],{"type":49,"value":3242},"Inside the QA image, start with cheap client availability checks:",{"type":44,"tag":75,"props":3244,"children":3246},{"className":77,"code":3245,"language":79,"meta":80,"style":80},"codex --version\nclaude --version\nopencode --version\n",[3247],{"type":44,"tag":83,"props":3248,"children":3249},{"__ignoreMap":80},[3250,3262,3273],{"type":44,"tag":87,"props":3251,"children":3252},{"class":89,"line":90},[3253,3257],{"type":44,"tag":87,"props":3254,"children":3255},{"style":94},[3256],{"type":49,"value":425},{"type":44,"tag":87,"props":3258,"children":3259},{"style":100},[3260],{"type":49,"value":3261}," --version\n",{"type":44,"tag":87,"props":3263,"children":3264},{"class":89,"line":111},[3265,3269],{"type":44,"tag":87,"props":3266,"children":3267},{"style":94},[3268],{"type":49,"value":432},{"type":44,"tag":87,"props":3270,"children":3271},{"style":100},[3272],{"type":49,"value":3261},{"type":44,"tag":87,"props":3274,"children":3275},{"class":89,"line":129},[3276,3280],{"type":44,"tag":87,"props":3277,"children":3278},{"style":94},[3279],{"type":49,"value":439},{"type":44,"tag":87,"props":3281,"children":3282},{"style":100},[3283],{"type":49,"value":3261},{"type":44,"tag":52,"props":3285,"children":3286},{},[3287,3289,3295,3297,3303,3305,3311,3313,3317],{"type":49,"value":3288},"Codex subagents need real runtime proof before claiming Codex loaded them. Use\n",{"type":44,"tag":83,"props":3290,"children":3292},{"className":3291},[],[3293],{"type":49,"value":3294},"node skills\u002Fdotagents-qa\u002Fscripts\u002Fqa-example.mjs codex-runtime --keep",{"type":49,"value":3296},";\n",{"type":44,"tag":83,"props":3298,"children":3300},{"className":3299},[],[3301],{"type":49,"value":3302},"codex debug prompt-input",{"type":49,"value":3304}," is not enough unless it visibly includes the\ngenerated agent name or instructions. Project-scoped ",{"type":44,"tag":83,"props":3306,"children":3308},{"className":3307},[],[3309],{"type":49,"value":3310},".codex\u002Fagents\u002F",{"type":49,"value":3312}," load only\nwhen Codex trusts the project. See ",{"type":44,"tag":278,"props":3314,"children":3315},{"href":290},[3316],{"type":49,"value":290},{"type":49,"value":2186},{"type":44,"tag":52,"props":3319,"children":3320},{},[3321],{"type":49,"value":3322},"Claude has no cheap dry-run skill list. If auth\u002Fnetwork\u002Fmodel cost is\nacceptable, run a minimal non-interactive prompt from the temp project;\notherwise report it as skipped.",{"type":44,"tag":63,"props":3324,"children":3326},{"id":3325},"_7-report-evidence",[3327],{"type":49,"value":3328},"7. Report Evidence",{"type":44,"tag":52,"props":3330,"children":3331},{},[3332],{"type":49,"value":3333},"Report:",{"type":44,"tag":172,"props":3335,"children":3336},{},[3337,3342,3347,3352,3357,3362,3367,3378],{"type":44,"tag":176,"props":3338,"children":3339},{},[3340],{"type":49,"value":3341},"the changed behavior you targeted",{"type":44,"tag":176,"props":3343,"children":3344},{},[3345],{"type":49,"value":3346},"Docker image and setup used",{"type":44,"tag":176,"props":3348,"children":3349},{},[3350],{"type":49,"value":3351},"fixture shape and why it matched the diff",{"type":44,"tag":176,"props":3353,"children":3354},{},[3355],{"type":49,"value":3356},"commands run",{"type":44,"tag":176,"props":3358,"children":3359},{},[3360],{"type":49,"value":3361},"generated files or command output inspected",{"type":44,"tag":176,"props":3363,"children":3364},{},[3365],{"type":49,"value":3366},"assertions that passed",{"type":44,"tag":176,"props":3368,"children":3369},{},[3370,3376],{"type":44,"tag":83,"props":3371,"children":3373},{"className":3372},[],[3374],{"type":49,"value":3375},"\u002Fqa-out",{"type":49,"value":3377}," host path if retained for debugging",{"type":44,"tag":176,"props":3379,"children":3380},{},[3381],{"type":49,"value":3382},"skipped checks and residual risk",{"type":44,"tag":3384,"props":3385,"children":3386},"style",{},[3387],{"type":49,"value":3388},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3390,"total":111},[3391,3405],{"slug":3392,"name":3392,"fn":3393,"description":3394,"org":3395,"tags":3396,"stars":27,"repoUrl":28,"updatedAt":3404},"dotagents","manage agent skill dependencies","Manages coding-agent skills and shared agent configuration with dotagents. Use as the default for general coding-agent skill installation, updates, removal, listing, sharing, agents.toml or agents.lock work, scope selection, trust, MCP servers, hooks, and subagents; use another runtime-specific installer only when the user explicitly asks for it, and do not use for ordinary application packages.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3397,3400,3403],{"name":3398,"slug":3399,"type":16},"Agents","agents",{"name":3401,"slug":3402,"type":16},"Operations","operations",{"name":9,"slug":8,"type":16},"2026-07-28T05:35:56.191411",{"slug":4,"name":4,"fn":5,"description":6,"org":3406,"tags":3407,"stars":27,"repoUrl":28,"updatedAt":29},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3408,3409,3410,3411,3412],{"name":18,"slug":19,"type":16},{"name":21,"slug":22,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"name":25,"slug":26,"type":16},{"items":3414,"total":3587},[3415,3438,3451,3466,3480,3497,3513,3527,3537,3546,3556,3574],{"slug":3416,"name":3416,"fn":3417,"description":3418,"org":3419,"tags":3420,"stars":3435,"repoUrl":3436,"updatedAt":3437},"xcodebuildmcp","build and test Apple apps with XcodeBuildMCP","Official skill for XcodeBuildMCP. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3421,3424,3427,3430,3431,3432],{"name":3422,"slug":3423,"type":16},"Debugging","debugging",{"name":3425,"slug":3426,"type":16},"iOS","ios",{"name":3428,"slug":3429,"type":16},"macOS","macos",{"name":9,"slug":8,"type":16},{"name":25,"slug":26,"type":16},{"name":3433,"slug":3434,"type":16},"Xcode","xcode",6176,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002FXcodeBuildMCP","2026-04-06T18:13:34.8719",{"slug":3439,"name":3439,"fn":3440,"description":3441,"org":3442,"tags":3443,"stars":3435,"repoUrl":3436,"updatedAt":3450},"xcodebuildmcp-cli","build and test Apple apps via CLI","Official skill for the XcodeBuildMCP CLI. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3444,3446,3447,3448,3449],{"name":3445,"slug":2264,"type":16},"CLI",{"name":3425,"slug":3426,"type":16},{"name":3428,"slug":3429,"type":16},{"name":25,"slug":26,"type":16},{"name":3433,"slug":3434,"type":16},"2026-04-06T18:13:36.13414",{"slug":3452,"name":3452,"fn":3453,"description":3454,"org":3455,"tags":3456,"stars":3463,"repoUrl":3464,"updatedAt":3465},"agents-md","maintain project instruction files","Creates and maintains concise AGENTS.md and CLAUDE.md project instruction files. Use when asked to create AGENTS.md, update AGENTS.md, maintain agent docs, set up CLAUDE.md, document repository agent conventions, or keep coding-agent instructions minimal and reference-backed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3457,3460],{"name":3458,"slug":3459,"type":16},"Documentation","documentation",{"name":3461,"slug":3462,"type":16},"Engineering","engineering",861,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fskills","2026-05-15T06:16:29.695991",{"slug":3467,"name":3467,"fn":3468,"description":3469,"org":3470,"tags":3471,"stars":3463,"repoUrl":3464,"updatedAt":3479},"blog-writing-guide","write and review engineering blog posts","Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions \"blog post,\" \"blog draft,\" \"write-up,\" \"announcement post,\" \"engineering post,\" \"deep dive,\" \"postmortem,\" or asks for help with technical writing for Sentry. Even if the user just says \"help me write about [feature\u002Ftopic]\" — if it sounds like it could become a Sentry blog post, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3472,3475,3476],{"name":3473,"slug":3474,"type":16},"Communications","communications",{"name":9,"slug":8,"type":16},{"name":3477,"slug":3478,"type":16},"Technical Writing","technical-writing","2026-05-15T06:16:33.38217",{"slug":3481,"name":3481,"fn":3482,"description":3483,"org":3484,"tags":3485,"stars":3463,"repoUrl":3464,"updatedAt":3496},"brand-guidelines","write copy following Sentry brand guidelines","Write copy following Sentry brand guidelines. Use when writing UI text, error messages, empty states, onboarding flows, 404 pages, documentation, marketing copy, or any user-facing content. Covers both Plain Speech (default) and Sentry Voice tones.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3486,3489,3492,3493],{"name":3487,"slug":3488,"type":16},"Branding","branding",{"name":3490,"slug":3491,"type":16},"Content Creation","content-creation",{"name":9,"slug":8,"type":16},{"name":3494,"slug":3495,"type":16},"UX Copy","ux-copy","2026-05-15T06:16:22.395707",{"slug":3498,"name":3498,"fn":3499,"description":3500,"org":3501,"tags":3502,"stars":3463,"repoUrl":3464,"updatedAt":3512},"claude-settings-audit","generate Claude Code settings permissions","Analyze a repository to generate recommended Claude Code settings.json permissions. Use when setting up a new project, auditing existing settings, or determining which read-only bash commands to allow. Detects tech stack, build tools, and monorepo structure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3503,3506,3509],{"name":3504,"slug":3505,"type":16},"Claude Code","claude-code",{"name":3507,"slug":3508,"type":16},"Configuration","configuration",{"name":3510,"slug":3511,"type":16},"Security","security","2026-05-15T06:16:44.335977",{"slug":3514,"name":3514,"fn":3515,"description":3516,"org":3517,"tags":3518,"stars":3463,"repoUrl":3464,"updatedAt":3526},"code-review","perform code reviews for Sentry projects","Perform code reviews following Sentry engineering practices. Use when reviewing pull requests, examining code changes, or providing feedback on code quality. Covers security, performance, testing, and design review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3519,3521,3522,3525],{"name":3520,"slug":3514,"type":16},"Code Review",{"name":3461,"slug":3462,"type":16},{"name":3523,"slug":3524,"type":16},"Performance","performance",{"name":3510,"slug":3511,"type":16},"2026-05-15T06:16:35.824864",{"slug":3528,"name":3528,"fn":3529,"description":3530,"org":3531,"tags":3532,"stars":3463,"repoUrl":3464,"updatedAt":3536},"code-simplifier","simplify and refine source code","Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to \"simplify code\", \"clean up code\", \"refactor for clarity\", \"improve readability\", or review recently modified code for elegance. Focuses on project-specific best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3533],{"name":3534,"slug":3535,"type":16},"Code Analysis","code-analysis","2026-05-15T06:16:32.127981",{"slug":2541,"name":2541,"fn":3538,"description":3539,"org":3540,"tags":3541,"stars":3463,"repoUrl":3464,"updatedAt":3545},"create commits with Sentry conventions","Use for every request to commit changes or draft a commit message. Creates Sentry-style conventional commits with issue references.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3542,3544],{"name":3543,"slug":97,"type":16},"Git",{"name":9,"slug":8,"type":16},"2026-07-18T05:15:10.723937",{"slug":3547,"name":3547,"fn":3548,"description":3549,"org":3550,"tags":3551,"stars":3463,"repoUrl":3464,"updatedAt":3555},"create-branch","create git branches for Sentry workflows","Create a git branch following Sentry naming conventions. Use when asked to \"create a branch\", \"new branch\", \"start a branch\", \"make a branch\", \"switch to a new branch\", or when starting new work on the default branch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3552,3553,3554],{"name":3461,"slug":3462,"type":16},{"name":3543,"slug":97,"type":16},{"name":9,"slug":8,"type":16},"2026-05-15T06:16:39.458431",{"slug":3557,"name":3557,"fn":3558,"description":3559,"org":3560,"tags":3561,"stars":3463,"repoUrl":3464,"updatedAt":3573},"django-access-review","review Django access control and IDOR","Django access control and IDOR security review. Use when reviewing Django views, DRF viewsets, ORM queries, or any Python\u002FDjango code handling user authorization. Trigger keywords: \"IDOR\", \"access control\", \"authorization\", \"Django permissions\", \"object permissions\", \"tenant isolation\", \"broken access\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3562,3565,3566,3569,3572],{"name":3563,"slug":3564,"type":16},"Access Control","access-control",{"name":3534,"slug":3535,"type":16},{"name":3567,"slug":3568,"type":16},"Django","django",{"name":3570,"slug":3571,"type":16},"Python","python",{"name":3510,"slug":3511,"type":16},"2026-05-15T06:16:43.098698",{"slug":3575,"name":3575,"fn":3576,"description":3577,"org":3578,"tags":3579,"stars":3463,"repoUrl":3464,"updatedAt":3586},"django-perf-review","review and optimize Django performance","Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[3580,3581,3584,3585],{"name":3520,"slug":3514,"type":16},{"name":3582,"slug":3583,"type":16},"Database","database",{"name":3567,"slug":3568,"type":16},{"name":3523,"slug":3524,"type":16},"2026-05-15T06:16:24.832813",88]