[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RJ4F9HT8PT26CKNM9XE1M":3,"skill-same:01M71RJ4F9HT8PT26CKNM9XE1M":354},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":65},"01M71RJ4F9HT8PT26CKNM9XE1M","autospec-upgrade",null,"Use when the user wants to upgrade an Angular, Next.js, or React project to the latest official versions safely — by locking observable behavior before touching versions, upgrading one major at a time with official codemods, and gating completion on mutation score rather than coverage theater.","berlinguyinca\u002Fautospec","berlinguyinca","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16364?v=4","01M71R7C0SWBG05FNHQE4XQ7Y3","Gert Wohlgemuth","01M71R7C1VY5K3Q715RNDDBVGQ",3,"MIT","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"autospec","autospec upgrade","upgrade","latest","behavior","with","one","Next.js","use","at","next","react","angular","when","gating","mutation","time","project","official","coverage","2026-11-10 13:02:02",false,"---\nname: autospec-upgrade\ndescription: Use when the user wants to upgrade an Angular, Next.js, or React project to the latest official versions safely — by locking observable behavior before touching versions, upgrading one major at a time with official codemods, and gating completion on mutation score rather than coverage theater.\n---\n\n# autospec-upgrade workflow\n\nRun a behavior-locked, project-independent framework upgrade for Angular,\nNext.js, and React repos. The skill locks observable behavior before any version\nchange, upgrades one major at a time via official tooling, and gates completion\non mutation score ≥ pre-upgrade baseline — not line coverage alone.\n\n\u003C!-- autospec-block:startup-self-update SKILL_NAME=autospec-upgrade -->\n\n## Self-update mode\n\nIf the feature-request argument matches `update` after trimming and lowercasing,\nre-install the full autospec suite from `main`, show the before\u002Fafter diff if the\nharness exposes it, then stop. Do not run the upgrade workflow.\n\n## Required capabilities & harness adapter\n\n| Capability | Claude Code | OpenCode | Codex CLI | Fallback if missing |\n| --- | --- | --- | --- | --- |\n| Subagent model tier | Tier A: `opus` + ultrathink | Tier A: top-tier `task` + max reasoning | Tier A: current top GPT + `reasoning_effort=high` | Run inline, but keep the same report contract |\n\u003C!-- autospec-block:harness-adapter-core -->\n| Shell execution | Bash tool | shell tool | shell\u002Fapply_patch | Required for upgrade scripts |\n\n**Model tier:** TIER_A for behavior-lock planning and mutation-gate analysis\nbecause silent behavior drift is more expensive than extra review tokens.\n\n## Harness detection\n\nDetect the harness once at skill start:\n\n1. Claude Code: `Agent` with `subagent_type` is available.\n   - `TIER_A` = `opus` + ultrathink.\n   - `TIER_B` = `sonnet`.\n2. OpenCode: `task` tool is available.\n   - `TIER_A` = top-tier task model + high reasoning.\n   - `TIER_B` = smaller-tier task model + medium reasoning.\n3. Codex CLI: `apply_patch` is the primary edit tool.\n   - `TIER_A` = current top GPT + `reasoning_effort=high`.\n   - `TIER_B` = current cost-optimized Codex model + `reasoning_effort=medium`.\n\nPrefer a Tier A subagent for behavior-lock planning and mutation gate analysis.\nIf `TIER_A` is unavailable, silently fall back to the next available top-tier\nmodel. If delegation is unavailable, run inline.\n\n## When to use\n\n- When a project is on an outdated major version of Angular, Next.js, or React\n  and needs a safe, auditable upgrade path.\n- When the team needs behavior-locked characterization tests and a mutation\n  baseline before upgrading so regressions are detectable.\n- When official codemods exist but the project needs orchestration, resumability,\n  and a mutation-score gate rather than a manual migration.\n\n## When not to use\n\n- Do not use against Vue, Svelte, Solid, or other frameworks — detection will\n  return `unknown` and the skill exits cleanly with\n  `code_health:upgrade_unknown_stack`.\n- Do not use when the app cannot be built or its tests cannot be run — the\n  behavior-lock phase will surface this immediately as\n  `code_health:upgrade_behavior_lock_unreachable`.\n- Do not use when the goal is a one-off manual migration rather than a\n  reusable, audited, mutation-gated upgrade.\n\n## Composition map\n\nThis skill reuses existing autospec machinery. Do NOT reinvent:\n\n| Capability | Reused skill \u002F interface |\n|---|---|\n| Test authoring + coverage + self-heal | `autospec-test` (Stage 2A, `.autospec\u002Ftest.yml`, `run-gate.sh`) |\n| Playwright run + coverage report | `autospec-playwright` |\n| No-mock smoke, console\u002Fnetwork gate, proof artifacts | `autospec-qa --no-heal` |\n| Migration documentation (docs-as-tests) | `autospec-doc --full` |\n| Worktree \u002F PR-aware ladder \u002F CI-wait | `autospec-run` |\n\n## New components (genuine gaps)\n\nScripts live under `skills\u002Fautospec-upgrade\u002Fscripts\u002F` and install into\n`~\u002F.autospec\u002Fscripts\u002F`:\n\n1. **`upgrade-detect.sh`** — emit detection JSON\n   `{frameworks[], versions, package_manager, runners[], monorepo, has_tests}`.\n2. **`compute-upgrade-steps.sh`** — emit the incremental hop list; Angular\n   must never skip a major; Next\u002FReact use same one-major-at-a-time invariant.\n3. **`codemod-route.sh`** — per-framework codemod dispatch: Angular `ng update`\n   + standalone schematics; Next `npx @next\u002Fcodemod upgrade` + async-request-api;\n   React `npx codemod react\u002F19\u002Fmigration-recipe` + types-react-codemod preset-19.\n4. **`behavior-lock.sh`** — drive `autospec-test`\u002F`autospec-playwright`, capture\n   golden-master snapshots, record Stryker mutation baseline; refuse to proceed\n   until locked.\n5. **`mutation-gate.sh`** — Stryker adapter across jest\u002Fvitest\u002Fkarma;\n   `--baseline` and `--gate \u003Cthreshold>` modes; writes\n   `.autospec\u002Fmutation-proof.json`. Concrete consumer for tracker #420.\n6. **`upgrade-engine.sh`** — per-major hop loop: official codemod → build +\n   type-check → tests → behavior-lock re-verify → bounded fix-loop (default 5\n   iterations) → tag + commit.\n7. **`tag-upgrade.sh`** — create `pre-upgrade-\u003Cfw>-\u003Cver>` \u002F\n   `post-upgrade-\u003Cfw>-\u003Cver>` tags; emit structured\n   `.autospec\u002Fupgrade-report.json`.\n8. **`upgrade-orchestrator.sh`** — resumable state machine over\n   `.autospec\u002Fupgrade-state.json`; resume from the last completed checkpoint\n   after a mid-hop crash; never re-run a completed hop.\n\n## Phase contract\n\nThe orchestrator (`upgrade-orchestrator.sh`) sequences every phase over a\nsingle resumable state file: `.autospec\u002Fupgrade-state.json`. Each phase writes\nits checkpoint before the next phase starts. On restart the orchestrator reads\nthe state file and skips every already-completed phase. A fully-completed run\nis a no-op on re-invocation (idempotent). Every phase failure that cannot be\nrecovered within its bounded fix-loop stops the pipeline immediately, persists\nstate, and exits non-zero so the operator can inspect and retry.\n\nState file schema (`.autospec\u002Fupgrade-state.json`):\n\n```json\n{\n  \"current_phase\": \"phase2_complete\",\n  \"last_completed_hop\": \"angular-21\",\n  \"last_green_tag\": \"post-upgrade-angular-21\"\n}\n```\n\n`current_phase` values in order: `phase0_complete`, `phase1_complete`,\n`phase2_complete`, `phase3_complete`, `phase4_complete`, `phase5_complete`,\n`phase6_complete`. An absent or unrecognised value means \"start from Phase 0\".\n\n### Phase 0 — Detect\n\nRun `upgrade-detect.sh --root \u003Croot> --out \u003Cautospec-dir>`. Emit detection\nJSON to `\u003Cautospec-dir>\u002Fdetect.json`. Detection JSON schema:\n`{frameworks[], versions, package_manager, runners[], monorepo, has_tests}`.\n\nExplicit handling required:\n\n- **Zero tests present** — emit `has_tests: false`; Phase 1 will surface this\n  as `code_health:upgrade_behavior_lock_unreachable`.\n- **Non-npm package manager** — emit `package_manager` correctly; codemods\n  adapt per manager.\n- **Monorepo with multiple apps** — operate per-project; `monorepo: true`.\n- **Private registry** — do not block on auth; surface registry info in\n  detection JSON and continue.\n- **Unknown framework** — emit `frameworks: []`; orchestrator exits with\n  `code_health:upgrade_unknown_stack`. Never guess.\n\nOn success write checkpoint `phase0_complete` to state file.\n\n### Phase 1 — Behavior-lock (gate before any upgrade)\n\nRun `behavior-lock.sh --detect \u003Cdetect.json> --root \u003Croot> --out\n\u003Cautospec-dir>`. This phase:\n\n1. Generates characterization tests biased to E2E\u002FPlaywright golden-master\n   (refactor-robust) plus unit\u002Fintegration to the 80 % **floor**.\n2. Records the Stryker mutation **baseline** to\n   `.autospec\u002Fmutation-proof.json`.\n3. Tags `pre-upgrade-\u003Cfw>-\u003Cver>` via `tag-upgrade.sh pre`.\n\n**Hard rule:** no upgrade step in Phase 2 may run until this phase exits 0\nand the mutation baseline is recorded. If `behavior-lock.sh` exits non-zero\nthe orchestrator stops with `code_health:upgrade_behavior_lock_unreachable`\nand preserves state so the operator can fix the test surface and resume.\n\nOn success write checkpoint `phase1_complete` to state file.\n\n### Phase 2 — Incremental upgrade loop\n\nRun `upgrade-engine.sh --hops \u003Chops.json> --root \u003Croot>`. The hops file is\nproduced by `compute-upgrade-steps.sh`. For each major hop the engine:\n\n1. Checks idempotency: if `post-upgrade-\u003Cfw>-\u003Cto>` tag already exists, skip.\n2. Sets `pre-upgrade-\u003Cfw>-\u003Cto>` tag (checkpoint before the hop).\n3. Runs `codemod-route.sh \u003Cfw> \u003Cto>` (official tooling only — never\n   hand-rolls a migration that an official codemod performs).\n4. Runs: build → type-check → tests → `behavior-lock.sh` re-verify.\n5. **Bounded fix-loop** (default 5 iterations): on failure, re-run the\n   pipeline; if the bound is exceeded, stop at that hop, leave the last green\n   tag intact, and exit non-zero so the operator can inspect the failing diff.\n6. On success: sets `post-upgrade-\u003Cfw>-\u003Cto>` tag + commits.\n\nAngular must never skip a major (20→21→22, never 20→22). Next.js and React\napply the same one-major-at-a-time invariant.\n\n\"Latest\" is resolved per framework, hop by hop, from the computed steps.\n\nIf `upgrade-engine.sh` exits non-zero the orchestrator stops, persists the\ncurrent state (phase and last green tag), and surfaces the failure to the\noperator (exit non-zero). Do not silently continue to Phase 3.\n\nOn success write checkpoint `phase2_complete` (with `last_completed_hop` and\n`last_green_tag`) to state file.\n\n### Phase 3 — Best-practice migration\n\nRun `best-practice-migrate.sh --detect \u003Cdetect.json> --root \u003Croot> --out\n\u003Cautospec-dir> --versions-green`. This phase applies framework-idiomatic\nmodernisation **only after all version hops are green**:\n\n- Angular: standalone component migration (`ng generate @angular\u002Fcore:standalone`),\n  surface Signals adoption and `inject()` migration as operator follow-ups.\n- Next.js: async request API migration (`next-async-request-api` codemod),\n  surface Pages→App Router restructure as an operator follow-up.\n- React: React 19 types codemod (`types-react-codemod preset-19`), surface\n  `forwardRef` → ref-as-prop and `use()` hook as operator follow-ups.\n\nEach schematic step is gated: `behavior-lock.sh` re-verify must pass after\neach schematic. Manual structural migrations that no official schematic\nperforms are **surfaced as operator follow-ups, never attempted silently**.\n\nIf `best-practice-migrate.sh` exits non-zero the orchestrator stops and\npersists state. On success write checkpoint `phase3_complete` to state file.\n\n### Phase 4 — Verify\n\nRun `mutation-gate.sh --gate --out \u003Cautospec-dir>` then\n`autospec-qa --no-heal --root \u003Croot>`. Both must pass:\n\n- **Mutation score ≥ pre-upgrade baseline** (hard gate from\n  `.autospec\u002Fmutation-proof.json`). If the score regressed, the orchestrator\n  stops with state persisted and reports surviving mutants to the operator.\n  The `post-upgrade` tag is **withheld** until this gate passes.\n- **`autospec-qa --no-heal`**: no-mock smoke + console\u002Fnetwork gate + proof\n  artifacts. Coverage floor is checked but is never sufficient alone.\n\nIf either check exits non-zero the orchestrator stops and persists state\n(exit non-zero). On success write checkpoint `phase4_complete` to state file.\n\n### Phase 5 — Document\n\nRun `migration-doc.sh --root \u003Croot> --out \u003Croot>`. Renders the human\nmigration log from `.autospec\u002Fupgrade-report.json`:\n\n- Per-hop sections: framework, before\u002Fafter version, codemods applied,\n  manual fixes, residual risk.\n- Written to `docs\u002Fmigrations\u002F\u003Cdate>-upgrade.md`.\n- Composes `autospec-doc --full` to finalise the log.\n\nOn success write checkpoint `phase5_complete` to state file.\n\n### Phase 6 — Tag + report\n\nRun `tag-upgrade.sh post` for each framework\u002Fversion to push\n`post-upgrade-\u003Cfw>-\u003Cver>` tags (withheld until mutation gate passed in\nPhase 4). Run `tag-upgrade.sh report` to emit\u002Fappend to\n`.autospec\u002Fupgrade-report.json`.\n\nOn success write checkpoint `phase6_complete` to state file. A subsequent\nre-invocation of the orchestrator reads `phase6_complete` and exits 0\nimmediately (idempotent no-op).\n\n## Error handling\n\n- Detection ambiguous \u002F unknown framework → exit with\n  `code_health:upgrade_unknown_stack`; surface to operator; never guess.\n- Behavior-lock unreachable (app won't boot, no runnable surface) → STOP at\n  Phase 1 with `code_health:upgrade_behavior_lock_unreachable`; do not upgrade\n  blind.\n- Hop fix-loop exceeds bound → stop at that hop, leave the last green tag\n  intact, surface the failing diff for operator action.\n- Mutation gate below baseline post-upgrade → WITHHELD; report surviving\n  mutants; do not tag `post-upgrade`.\n- Mid-hop crash → resume from `.autospec\u002Fupgrade-state.json` at the last\n  completed checkpoint; never re-run a completed hop.\n\n## Output contract\n\nReturn:\n\n- Detection JSON path and detected frameworks\u002Fversions.\n- Behavior-lock status and mutation baseline recorded.\n- Per-hop upgrade log (codemod applied, build\u002Ftest result, tag created).\n- Best-practice migration log.\n- Mutation gate result (score vs baseline).\n- `autospec-qa --no-heal` verdict path.\n- Migration doc path from `autospec-doc --full`.\n- Tags pushed and `.autospec\u002Fupgrade-report.json` path.\n- Remaining risks or operator-action items.\n\n## Stop mode\n\nIf the request is exactly `stop` or `stop` plus `--\u003Cword>` flags after\nnormalization, dispatch to:\n\n```bash\nbash \"${AUTOSPEC_SCRIPTS_DIR:-$HOME\u002F.autospec\u002Fscripts}\u002Fautospec-stop.sh\" \u003Cargs>\n```\n\nPrint the helper output and stop. Do not run the upgrade workflow.\n\n## Harness-aware handoff\n\nLoop dispatch uses `lib\u002Fautospec-harness-detect.sh` to resolve the active AI\nharness and pick the canonical `\u002Fautospec --autonomous` invocation form:\n\n- Claude Code → `claude \"\u002Fautospec\" \"--autonomous\" \"$PROMPT\"`.\n- Codex CLI → `codex exec --skip-git-repo-check \"\u002Fautospec --autonomous $PROMPT\" \u003C\u002Fdev\u002Fnull` (the \u003C\u002Fdev\u002Fnull closes stdin — without it codex exec hangs on an open stdin, issue #3380).\n- OpenCode → `opencode \"\u002Fautospec\" \"--autonomous\" \"$PROMPT\"` (best-effort).\n\nDetection order: `AUTOSPEC_HANDOFF_DISPATCHER_KIND` env override → skill-mount\nprobe → PATH probe. Missing dispatcher exits 3 with\n`code_health:loop_handoff_no_dispatcher_for_harness`.\n","# autospec-upgrade workflow\n\nRun a behavior-locked, project-independent framework upgrade for Angular,\nNext.js, and React repos. The skill locks observable behavior before any version\nchange, upgrades one major at a time via official tooling, and gates completion\non mutation score ≥ pre-upgrade baseline — not line coverage alone.\n\n\u003C!-- autospec-block:startup-self-update SKILL_NAME=autospec-upgrade -->\n\n## Self-update mode\n\nIf the feature-request argument matches `update` after trimming and lowercasing,\nre-install the full autospec suite from `main`, show the before\u002Fafter diff if the\nharness exposes it, then stop. Do not run the upgrade workflow.\n\n## Required capabilities & harness adapter\n\n| Capability | Claude Code | OpenCode | Codex CLI | Fallback if missing |\n| --- | --- | --- | --- | --- |\n| Subagent model tier | Tier A: `opus` + ultrathink | Tier A: top-tier `task` + max reasoning | Tier A: current top GPT + `reasoning_effort=high` | Run inline, but keep the same report contract |\n\u003C!-- autospec-block:harness-adapter-core -->\n| Shell execution | Bash tool | shell tool | shell\u002Fapply_patch | Required for upgrade scripts |\n\n**Model tier:** TIER_A for behavior-lock planning and mutation-gate analysis\nbecause silent behavior drift is more expensive than extra review tokens.\n\n## Harness detection\n\nDetect the harness once at skill start:\n\n1. Claude Code: `Agent` with `subagent_type` is available.\n   - `TIER_A` = `opus` + ultrathink.\n   - `TIER_B` = `sonnet`.\n2. OpenCode: `task` tool is available.\n   - `TIER_A` = top-tier task model + high reasoning.\n   - `TIER_B` = smaller-tier task model + medium reasoning.\n3. Codex CLI: `apply_patch` is the primary edit tool.\n   - `TIER_A` = current top GPT + `reasoning_effort=high`.\n   - `TIER_B` = current cost-optimized Codex model + `reasoning_effort=medium`.\n\nPrefer a Tier A subagent for behavior-lock planning and mutation gate analysis.\nIf `TIER_A` is unavailable, silently fall back to the next available top-tier\nmodel. If delegation is unavailable, run inline.\n\n## When to use\n\n- When a project is on an outdated major version of Angular, Next.js, or React\n  and needs a safe, auditable upgrade path.\n- When the team needs behavior-locked characterization tests and a mutation\n  baseline before upgrading so regressions are detectable.\n- When official codemods exist but the project needs orchestration, resumability,\n  and a mutation-score gate rather than a manual migration.\n\n## When not to use\n\n- Do not use against Vue, Svelte, Solid, or other frameworks — detection will\n  return `unknown` and the skill exits cleanly with\n  `code_health:upgrade_unknown_stack`.\n- Do not use when the app cannot be built or its tests cannot be run — the\n  behavior-lock phase will surface this immediately as\n  `code_health:upgrade_behavior_lock_unreachable`.\n- Do not use when the goal is a one-off manual migration rather than a\n  reusable, audited, mutation-gated upgrade.\n\n## Composition map\n\nThis skill reuses existing autospec machinery. Do NOT reinvent:\n\n| Capability | Reused skill \u002F interface |\n|---|---|\n| Test authoring + coverage + self-heal | `autospec-test` (Stage 2A, `.autospec\u002Ftest.yml`, `run-gate.sh`) |\n| Playwright run + coverage report | `autospec-playwright` |\n| No-mock smoke, console\u002Fnetwork gate, proof artifacts | `autospec-qa --no-heal` |\n| Migration documentation (docs-as-tests) | `autospec-doc --full` |\n| Worktree \u002F PR-aware ladder \u002F CI-wait | `autospec-run` |\n\n## New components (genuine gaps)\n\nScripts live under `skills\u002Fautospec-upgrade\u002Fscripts\u002F` and install into\n`~\u002F.autospec\u002Fscripts\u002F`:\n\n1. **`upgrade-detect.sh`** — emit detection JSON\n   `{frameworks[], versions, package_manager, runners[], monorepo, has_tests}`.\n2. **`compute-upgrade-steps.sh`** — emit the incremental hop list; Angular\n   must never skip a major; Next\u002FReact use same one-major-at-a-time invariant.\n3. **`codemod-route.sh`** — per-framework codemod dispatch: Angular `ng update`\n   + standalone schematics; Next `npx @next\u002Fcodemod upgrade` + async-request-api;\n   React `npx codemod react\u002F19\u002Fmigration-recipe` + types-react-codemod preset-19.\n4. **`behavior-lock.sh`** — drive `autospec-test`\u002F`autospec-playwright`, capture\n   golden-master snapshots, record Stryker mutation baseline; refuse to proceed\n   until locked.\n5. **`mutation-gate.sh`** — Stryker adapter across jest\u002Fvitest\u002Fkarma;\n   `--baseline` and `--gate \u003Cthreshold>` modes; writes\n   `.autospec\u002Fmutation-proof.json`. Concrete consumer for tracker #420.\n6. **`upgrade-engine.sh`** — per-major hop loop: official codemod → build +\n   type-check → tests → behavior-lock re-verify → bounded fix-loop (default 5\n   iterations) → tag + commit.\n7. **`tag-upgrade.sh`** — create `pre-upgrade-\u003Cfw>-\u003Cver>` \u002F\n   `post-upgrade-\u003Cfw>-\u003Cver>` tags; emit structured\n   `.autospec\u002Fupgrade-report.json`.\n8. **`upgrade-orchestrator.sh`** — resumable state machine over\n   `.autospec\u002Fupgrade-state.json`; resume from the last completed checkpoint\n   after a mid-hop crash; never re-run a completed hop.\n\n## Phase contract\n\nThe orchestrator (`upgrade-orchestrator.sh`) sequences every phase over a\nsingle resumable state file: `.autospec\u002Fupgrade-state.json`. Each phase writes\nits checkpoint before the next phase starts. On restart the orchestrator reads\nthe state file and skips every already-completed phase. A fully-completed run\nis a no-op on re-invocation (idempotent). Every phase failure that cannot be\nrecovered within its bounded fix-loop stops the pipeline immediately, persists\nstate, and exits non-zero so the operator can inspect and retry.\n\nState file schema (`.autospec\u002Fupgrade-state.json`):\n\n```json\n{\n  \"current_phase\": \"phase2_complete\",\n  \"last_completed_hop\": \"angular-21\",\n  \"last_green_tag\": \"post-upgrade-angular-21\"\n}\n```\n\n`current_phase` values in order: `phase0_complete`, `phase1_complete`,\n`phase2_complete`, `phase3_complete`, `phase4_complete`, `phase5_complete`,\n`phase6_complete`. An absent or unrecognised value means \"start from Phase 0\".\n\n### Phase 0 — Detect\n\nRun `upgrade-detect.sh --root \u003Croot> --out \u003Cautospec-dir>`. Emit detection\nJSON to `\u003Cautospec-dir>\u002Fdetect.json`. Detection JSON schema:\n`{frameworks[], versions, package_manager, runners[], monorepo, has_tests}`.\n\nExplicit handling required:\n\n- **Zero tests present** — emit `has_tests: false`; Phase 1 will surface this\n  as `code_health:upgrade_behavior_lock_unreachable`.\n- **Non-npm package manager** — emit `package_manager` correctly; codemods\n  adapt per manager.\n- **Monorepo with multiple apps** — operate per-project; `monorepo: true`.\n- **Private registry** — do not block on auth; surface registry info in\n  detection JSON and continue.\n- **Unknown framework** — emit `frameworks: []`; orchestrator exits with\n  `code_health:upgrade_unknown_stack`. Never guess.\n\nOn success write checkpoint `phase0_complete` to state file.\n\n### Phase 1 — Behavior-lock (gate before any upgrade)\n\nRun `behavior-lock.sh --detect \u003Cdetect.json> --root \u003Croot> --out\n\u003Cautospec-dir>`. This phase:\n\n1. Generates characterization tests biased to E2E\u002FPlaywright golden-master\n   (refactor-robust) plus unit\u002Fintegration to the 80 % **floor**.\n2. Records the Stryker mutation **baseline** to\n   `.autospec\u002Fmutation-proof.json`.\n3. Tags `pre-upgrade-\u003Cfw>-\u003Cver>` via `tag-upgrade.sh pre`.\n\n**Hard rule:** no upgrade step in Phase 2 may run until this phase exits 0\nand the mutation baseline is recorded. If `behavior-lock.sh` exits non-zero\nthe orchestrator stops with `code_health:upgrade_behavior_lock_unreachable`\nand preserves state so the operator can fix the test surface and resume.\n\nOn success write checkpoint `phase1_complete` to state file.\n\n### Phase 2 — Incremental upgrade loop\n\nRun `upgrade-engine.sh --hops \u003Chops.json> --root \u003Croot>`. The hops file is\nproduced by `compute-upgrade-steps.sh`. For each major hop the engine:\n\n1. Checks idempotency: if `post-upgrade-\u003Cfw>-\u003Cto>` tag already exists, skip.\n2. Sets `pre-upgrade-\u003Cfw>-\u003Cto>` tag (checkpoint before the hop).\n3. Runs `codemod-route.sh \u003Cfw> \u003Cto>` (official tooling only — never\n   hand-rolls a migration that an official codemod performs).\n4. Runs: build → type-check → tests → `behavior-lock.sh` re-verify.\n5. **Bounded fix-loop** (default 5 iterations): on failure, re-run the\n   pipeline; if the bound is exceeded, stop at that hop, leave the last green\n   tag intact, and exit non-zero so the operator can inspect the failing diff.\n6. On success: sets `post-upgrade-\u003Cfw>-\u003Cto>` tag + commits.\n\nAngular must never skip a major (20→21→22, never 20→22). Next.js and React\napply the same one-major-at-a-time invariant.\n\n\"Latest\" is resolved per framework, hop by hop, from the computed steps.\n\nIf `upgrade-engine.sh` exits non-zero the orchestrator stops, persists the\ncurrent state (phase and last green tag), and surfaces the failure to the\noperator (exit non-zero). Do not silently continue to Phase 3.\n\nOn success write checkpoint `phase2_complete` (with `last_completed_hop` and\n`last_green_tag`) to state file.\n\n### Phase 3 — Best-practice migration\n\nRun `best-practice-migrate.sh --detect \u003Cdetect.json> --root \u003Croot> --out\n\u003Cautospec-dir> --versions-green`. This phase applies framework-idiomatic\nmodernisation **only after all version hops are green**:\n\n- Angular: standalone component migration (`ng generate @angular\u002Fcore:standalone`),\n  surface Signals adoption and `inject()` migration as operator follow-ups.\n- Next.js: async request API migration (`next-async-request-api` codemod),\n  surface Pages→App Router restructure as an operator follow-up.\n- React: React 19 types codemod (`types-react-codemod preset-19`), surface\n  `forwardRef` → ref-as-prop and `use()` hook as operator follow-ups.\n\nEach schematic step is gated: `behavior-lock.sh` re-verify must pass after\neach schematic. Manual structural migrations that no official schematic\nperforms are **surfaced as operator follow-ups, never attempted silently**.\n\nIf `best-practice-migrate.sh` exits non-zero the orchestrator stops and\npersists state. On success write checkpoint `phase3_complete` to state file.\n\n### Phase 4 — Verify\n\nRun `mutation-gate.sh --gate --out \u003Cautospec-dir>` then\n`autospec-qa --no-heal --root \u003Croot>`. Both must pass:\n\n- **Mutation score ≥ pre-upgrade baseline** (hard gate from\n  `.autospec\u002Fmutation-proof.json`). If the score regressed, the orchestrator\n  stops with state persisted and reports surviving mutants to the operator.\n  The `post-upgrade` tag is **withheld** until this gate passes.\n- **`autospec-qa --no-heal`**: no-mock smoke + console\u002Fnetwork gate + proof\n  artifacts. Coverage floor is checked but is never sufficient alone.\n\nIf either check exits non-zero the orchestrator stops and persists state\n(exit non-zero). On success write checkpoint `phase4_complete` to state file.\n\n### Phase 5 — Document\n\nRun `migration-doc.sh --root \u003Croot> --out \u003Croot>`. Renders the human\nmigration log from `.autospec\u002Fupgrade-report.json`:\n\n- Per-hop sections: framework, before\u002Fafter version, codemods applied,\n  manual fixes, residual risk.\n- Written to `docs\u002Fmigrations\u002F\u003Cdate>-upgrade.md`.\n- Composes `autospec-doc --full` to finalise the log.\n\nOn success write checkpoint `phase5_complete` to state file.\n\n### Phase 6 — Tag + report\n\nRun `tag-upgrade.sh post` for each framework\u002Fversion to push\n`post-upgrade-\u003Cfw>-\u003Cver>` tags (withheld until mutation gate passed in\nPhase 4). Run `tag-upgrade.sh report` to emit\u002Fappend to\n`.autospec\u002Fupgrade-report.json`.\n\nOn success write checkpoint `phase6_complete` to state file. A subsequent\nre-invocation of the orchestrator reads `phase6_complete` and exits 0\nimmediately (idempotent no-op).\n\n## Error handling\n\n- Detection ambiguous \u002F unknown framework → exit with\n  `code_health:upgrade_unknown_stack`; surface to operator; never guess.\n- Behavior-lock unreachable (app won't boot, no runnable surface) → STOP at\n  Phase 1 with `code_health:upgrade_behavior_lock_unreachable`; do not upgrade\n  blind.\n- Hop fix-loop exceeds bound → stop at that hop, leave the last green tag\n  intact, surface the failing diff for operator action.\n- Mutation gate below baseline post-upgrade → WITHHELD; report surviving\n  mutants; do not tag `post-upgrade`.\n- Mid-hop crash → resume from `.autospec\u002Fupgrade-state.json` at the last\n  completed checkpoint; never re-run a completed hop.\n\n## Output contract\n\nReturn:\n\n- Detection JSON path and detected frameworks\u002Fversions.\n- Behavior-lock status and mutation baseline recorded.\n- Per-hop upgrade log (codemod applied, build\u002Ftest result, tag created).\n- Best-practice migration log.\n- Mutation gate result (score vs baseline).\n- `autospec-qa --no-heal` verdict path.\n- Migration doc path from `autospec-doc --full`.\n- Tags pushed and `.autospec\u002Fupgrade-report.json` path.\n- Remaining risks or operator-action items.\n\n## Stop mode\n\nIf the request is exactly `stop` or `stop` plus `--\u003Cword>` flags after\nnormalization, dispatch to:\n\n```bash\nbash \"${AUTOSPEC_SCRIPTS_DIR:-$HOME\u002F.autospec\u002Fscripts}\u002Fautospec-stop.sh\" \u003Cargs>\n```\n\nPrint the helper output and stop. Do not run the upgrade workflow.\n\n## Harness-aware handoff\n\nLoop dispatch uses `lib\u002Fautospec-harness-detect.sh` to resolve the active AI\nharness and pick the canonical `\u002Fautospec --autonomous` invocation form:\n\n- Claude Code → `claude \"\u002Fautospec\" \"--autonomous\" \"$PROMPT\"`.\n- Codex CLI → `codex exec --skip-git-repo-check \"\u002Fautospec --autonomous $PROMPT\" \u003C\u002Fdev\u002Fnull` (the \u003C\u002Fdev\u002Fnull closes stdin — without it codex exec hangs on an open stdin, issue #3380).\n- OpenCode → `opencode \"\u002Fautospec\" \"--autonomous\" \"$PROMPT\"` (best-effort).\n\nDetection order: `AUTOSPEC_HANDOFF_DISPATCHER_KIND` env override → skill-mount\nprobe → PATH probe. Missing dispatcher exits 3 with\n`code_health:loop_handoff_no_dispatcher_for_harness`.\n",{"name":5,"description":7},"main","9e7f04357ff46ab731d4f56a4ac5ca5449c13bb0","skills\u002Fautospec-upgrade",1,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec","https:\u002F\u002Fgithub.com\u002Fberlinguyinca","Love to lead, code, cook and contribute to open source and believe that you can learn anything you set your mind too.\r\n","2026-11-11 07:09:35",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add berlinguyinca\u002Fautospec --skill autospec-upgrade",{"tool":58,"command":59},"bunx","bunx skills add berlinguyinca\u002Fautospec --skill autospec-upgrade",{"tool":61,"command":62},"pnpm","pnpm dlx skills add berlinguyinca\u002Fautospec --skill autospec-upgrade","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002FSKILL.md",true,[66,72,78,82,86,90,94,98,102,106,110,114,118,122,126,130,136,140,144,148,152,156,160,164,168,172,175,179,182,186,190,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,256,260,264,268,271,275,279,283,287,291,295,299,303,306,310,314,318,322,326,330,334,338,342,346,350],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"codex\u002Fprompt.md","REFERENCE","参考文档",13815,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fcodex\u002Fprompt.md",{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"install.sh","SCRIPT","脚本",6116,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Finstall.sh",{"path":79,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":80,"sourceHtmlUrl":81},"opencode\u002Fagent.md",14170,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fopencode\u002Fagent.md",{"path":83,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":84,"sourceHtmlUrl":85},"README.md",1586,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002FREADME.md",{"path":87,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002F.gitkeep",0,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002F.gitkeep",{"path":91,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fbehavior-lock.sh",7650,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fbehavior-lock.sh",{"path":95,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":96,"sourceHtmlUrl":97},"scripts\u002Fbest-practice-migrate.sh",10888,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fbest-practice-migrate.sh",{"path":99,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":100,"sourceHtmlUrl":101},"scripts\u002Fcodemod-route.sh",5498,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fcodemod-route.sh",{"path":103,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":104,"sourceHtmlUrl":105},"scripts\u002Fcompute-upgrade-steps.sh",2696,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fcompute-upgrade-steps.sh",{"path":107,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":108,"sourceHtmlUrl":109},"scripts\u002Fmigration-doc.sh",5742,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fmigration-doc.sh",{"path":111,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":112,"sourceHtmlUrl":113},"scripts\u002Fmutation-gate.sh",10816,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fmutation-gate.sh",{"path":115,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":116,"sourceHtmlUrl":117},"scripts\u002Ftag-upgrade.sh",8748,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Ftag-upgrade.sh",{"path":119,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":120,"sourceHtmlUrl":121},"scripts\u002Fupgrade-detect.sh",7684,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fupgrade-detect.sh",{"path":123,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":124,"sourceHtmlUrl":125},"scripts\u002Fupgrade-engine.sh",7092,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fupgrade-engine.sh",{"path":127,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":128,"sourceHtmlUrl":129},"scripts\u002Fupgrade-orchestrator.sh",10506,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Fscripts\u002Fupgrade-orchestrator.sh",{"path":131,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":134,"sourceHtmlUrl":135},"tests\u002Fbehavior-lock.bats","OTHER","其他",9433,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fbehavior-lock.bats",{"path":137,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":138,"sourceHtmlUrl":139},"tests\u002Fbest-practice-migrate.bats",10412,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fbest-practice-migrate.bats",{"path":141,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":142,"sourceHtmlUrl":143},"tests\u002Fcodemod-route-angular.bats",5271,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fcodemod-route-angular.bats",{"path":145,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":146,"sourceHtmlUrl":147},"tests\u002Fcodemod-route-next.bats",3765,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fcodemod-route-next.bats",{"path":149,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":150,"sourceHtmlUrl":151},"tests\u002Fcodemod-route-react.bats",3774,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fcodemod-route-react.bats",{"path":153,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":154,"sourceHtmlUrl":155},"tests\u002Fcompute-upgrade-steps.bats",2741,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fcompute-upgrade-steps.bats",{"path":157,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":158,"sourceHtmlUrl":159},"tests\u002Ffixtures\u002Fbest-practice\u002Fdetect-angular.json",162,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fbest-practice\u002Fdetect-angular.json",{"path":161,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":162,"sourceHtmlUrl":163},"tests\u002Ffixtures\u002Fbest-practice\u002Fdetect-next.json",156,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fbest-practice\u002Fdetect-next.json",{"path":165,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":166,"sourceHtmlUrl":167},"tests\u002Ffixtures\u002Fbest-practice\u002Fdetect-react.json",158,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fbest-practice\u002Fdetect-react.json",{"path":169,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":170,"sourceHtmlUrl":171},"tests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-angular-latest.json",137,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-angular-latest.json",{"path":173,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":170,"sourceHtmlUrl":174},"tests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-angular20.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-angular20.json",{"path":176,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":177,"sourceHtmlUrl":178},"tests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-combo.json",160,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-combo.json",{"path":180,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":162,"sourceHtmlUrl":181},"tests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-next13.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-next13.json",{"path":183,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":184,"sourceHtmlUrl":185},"tests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-react17.json",133,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fcompute-steps\u002Fdetect-react17.json",{"path":187,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":188,"sourceHtmlUrl":189},"tests\u002Ffixtures\u002Fcompute-steps\u002Ftargets.json",36,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fcompute-steps\u002Ftargets.json",{"path":191,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":88,"sourceHtmlUrl":192},"tests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fbun.lockb","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fbun.lockb",{"path":194,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":195,"sourceHtmlUrl":196},"tests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fpackage.json",220,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fpackage.json",{"path":198,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":199,"sourceHtmlUrl":200},"tests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fsrc\u002FApp.spec.tsx",27,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fsrc\u002FApp.spec.tsx",{"path":202,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":203,"sourceHtmlUrl":204},"tests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fvitest.config.ts",111,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fbun-react-vitest\u002Fvitest.config.ts",{"path":206,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":207,"sourceHtmlUrl":208},"tests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fnx.json",87,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fnx.json",{"path":210,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":211,"sourceHtmlUrl":212},"tests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fpackage-lock.json",92,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fpackage-lock.json",{"path":214,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":215,"sourceHtmlUrl":216},"tests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fpackage.json",150,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fpackage.json",{"path":218,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":219,"sourceHtmlUrl":220},"tests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fsrc\u002Fapp.test.ts",23,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fmonorepo-nx\u002Fsrc\u002Fapp.test.ts",{"path":222,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":223,"sourceHtmlUrl":224},"tests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fkarma.conf.js",82,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fkarma.conf.js",{"path":226,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":227,"sourceHtmlUrl":228},"tests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fpackage-lock.json",96,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fpackage-lock.json",{"path":230,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":231,"sourceHtmlUrl":232},"tests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fpackage.json",235,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fpackage.json",{"path":234,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":235,"sourceHtmlUrl":236},"tests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fsrc\u002Fapp.component.spec.ts",51,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fnpm-angular-karma\u002Fsrc\u002Fapp.component.spec.ts",{"path":238,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":239,"sourceHtmlUrl":240},"tests\u002Ffixtures\u002Fdetect\u002Fpnpm-next\u002Fapp\u002Fpage.test.ts",54,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fpnpm-next\u002Fapp\u002Fpage.test.ts",{"path":242,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":243,"sourceHtmlUrl":244},"tests\u002Ffixtures\u002Fdetect\u002Fpnpm-next\u002Fpackage.json",171,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fpnpm-next\u002Fpackage.json",{"path":246,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":247,"sourceHtmlUrl":248},"tests\u002Ffixtures\u002Fdetect\u002Fpnpm-next\u002Fpnpm-lock.yaml",157,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fpnpm-next\u002Fpnpm-lock.yaml",{"path":250,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":251,"sourceHtmlUrl":252},"tests\u002Ffixtures\u002Fdetect\u002Funknown-stack\u002Fpackage.json",142,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Funknown-stack\u002Fpackage.json",{"path":254,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":219,"sourceHtmlUrl":255},"tests\u002Ffixtures\u002Fdetect\u002Funknown-stack\u002Fsrc\u002FApp.spec.ts","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Funknown-stack\u002Fsrc\u002FApp.spec.ts",{"path":257,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":258,"sourceHtmlUrl":259},"tests\u002Ffixtures\u002Fdetect\u002Funknown-stack\u002Fyarn.lock",49,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Funknown-stack\u002Fyarn.lock",{"path":261,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":262,"sourceHtmlUrl":263},"tests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fjest.config.js",47,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fjest.config.js",{"path":265,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":266,"sourceHtmlUrl":267},"tests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fpackage.json",210,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fpackage.json",{"path":269,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":199,"sourceHtmlUrl":270},"tests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fsrc\u002FApp.test.tsx","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fsrc\u002FApp.test.tsx",{"path":272,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":273,"sourceHtmlUrl":274},"tests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fyarn.lock",120,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fyarn-react-jest\u002Fyarn.lock",{"path":276,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":277,"sourceHtmlUrl":278},"tests\u002Ffixtures\u002Fdetect\u002Fzero-tests\u002Fpackage.json",135,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fzero-tests\u002Fpackage.json",{"path":280,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":281,"sourceHtmlUrl":282},"tests\u002Ffixtures\u002Fdetect\u002Fzero-tests\u002Fpnpm-lock.yaml",101,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fdetect\u002Fzero-tests\u002Fpnpm-lock.yaml",{"path":284,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":285,"sourceHtmlUrl":286},"tests\u002Ffixtures\u002Fengine\u002Fhops-empty.json",12,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fengine\u002Fhops-empty.json",{"path":288,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":289,"sourceHtmlUrl":290},"tests\u002Ffixtures\u002Fengine\u002Fhops-multi.json",95,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fengine\u002Fhops-multi.json",{"path":292,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":293,"sourceHtmlUrl":294},"tests\u002Ffixtures\u002Fengine\u002Fhops-single.json",53,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fengine\u002Fhops-single.json",{"path":296,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":297,"sourceHtmlUrl":298},"tests\u002Ffixtures\u002Fmigration-doc\u002Fupgrade-report.json",748,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fmigration-doc\u002Fupgrade-report.json",{"path":300,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":301,"sourceHtmlUrl":302},"tests\u002Ffixtures\u002Fmutation-gate\u002Fdetect-jest.json",132,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fmutation-gate\u002Fdetect-jest.json",{"path":304,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":170,"sourceHtmlUrl":305},"tests\u002Ffixtures\u002Fmutation-gate\u002Fdetect-karma.json","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fmutation-gate\u002Fdetect-karma.json",{"path":307,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":308,"sourceHtmlUrl":309},"tests\u002Ffixtures\u002Fmutation-gate\u002Fdetect-vitest.json",134,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Fmutation-gate\u002Fdetect-vitest.json",{"path":311,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":312,"sourceHtmlUrl":313},"tests\u002Ffixtures\u002Ftag-upgrade\u002Fproof-failing.json",141,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Ftag-upgrade\u002Fproof-failing.json",{"path":315,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":316,"sourceHtmlUrl":317},"tests\u002Ffixtures\u002Ftag-upgrade\u002Fproof-passing.json",140,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ffixtures\u002Ftag-upgrade\u002Fproof-passing.json",{"path":319,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":320,"sourceHtmlUrl":321},"tests\u002Fhelpers\u002Fupgrade-orchestrator-mocks.bash",5424,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fhelpers\u002Fupgrade-orchestrator-mocks.bash",{"path":323,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":324,"sourceHtmlUrl":325},"tests\u002Fmigration-doc.bats",7263,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fmigration-doc.bats",{"path":327,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":328,"sourceHtmlUrl":329},"tests\u002Fmutation-gate.bats",12937,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fmutation-gate.bats",{"path":331,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":332,"sourceHtmlUrl":333},"tests\u002Fscaffold.bats",1552,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fscaffold.bats",{"path":335,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":336,"sourceHtmlUrl":337},"tests\u002Ftag-upgrade.bats",10754,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Ftag-upgrade.bats",{"path":339,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":340,"sourceHtmlUrl":341},"tests\u002Fupgrade-detect.bats",10020,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fupgrade-detect.bats",{"path":343,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":344,"sourceHtmlUrl":345},"tests\u002Fupgrade-engine.bats",13026,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fupgrade-engine.bats",{"path":347,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":348,"sourceHtmlUrl":349},"tests\u002Fupgrade-orchestrator.bats",16375,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Ftests\u002Fupgrade-orchestrator.bats",{"path":351,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":352,"sourceHtmlUrl":353},"uninstall.sh",2089,"https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-upgrade\u002Funinstall.sh",[355,368,377,386,412,439],{"skillNo":356,"name":357,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":358,"categories":359,"keywords":365,"publishedAt":39},"01M71RJHYMKPTC9AAPXWQ6F4RT","trio-pass-skill","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Flockstep-trio-pass\u002FSKILL.md",[360],{"categoryNo":361,"categoryName":362,"taxonomyType":363,"taxonomyTypeDesc":364},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[366,367],"trio","trio pass skill",{"skillNo":369,"name":370,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":371,"categories":372,"keywords":374,"publishedAt":39},"01M71RJFBQ1KAF9XM3T3Y4VMSK","duo-pass-skill","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Flockstep-duo-pass\u002FSKILL.md",[373],{"categoryNo":361,"categoryName":362,"taxonomyType":363,"taxonomyTypeDesc":364},[375,376],"duo pass skill","duo",{"skillNo":378,"name":379,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":380,"categories":381,"keywords":383,"publishedAt":39},"01M71RJDT1TB3P9TRWR6A534FB","duo-divergence-skill","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Flockstep-duo-divergence\u002FSKILL.md",[382],{"categoryNo":361,"categoryName":362,"taxonomyType":363,"taxonomyTypeDesc":364},[384,376,385],"duo divergence skill","divergence",{"skillNo":387,"name":19,"nameZh":6,"description":388,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":389,"categories":390,"keywords":394,"publishedAt":39},"01M71RJAC4NNEQSYBDSY3NZS73","Use when the user wants to ship a feature end-to-end across multiple commits — bootstraps repo if missing, brainstorms a design spec, decomposes into linked GitHub issues, or splits an existing spec into issues, then runs an autonomous implementation loop with auto-merge.","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec\u002FSKILL.md",[391],{"categoryNo":392,"categoryName":393,"taxonomyType":363,"taxonomyTypeDesc":364},"01JBSEEDCAT000000000000015","视觉设计",[19,395,396,397,398,399,400,401,32,402,403,404,405,406,407,408,409,410,411,27],"end","ship a feature","issues","design","autonomous","auto","loop","across","design spec","merge","ship","implementation loop","github issues","feature","commits","repo","missing",{"skillNo":413,"name":414,"nameZh":6,"description":415,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":416,"categories":417,"keywords":423,"publishedAt":39},"01M71RJ28FJ4PM6DXHB7T5CF8H","autospec-ui-audit","Use when a React Router application needs a deterministic whole-site route inventory before UI, UX, navigation, or evidence auditing begins.","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-ui-audit\u002FSKILL.md",[418],{"categoryNo":419,"categoryName":420,"taxonomyType":421,"taxonomyTypeDesc":422},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[424,425,426,427,19,428,429,430,27,32,431,30,432,433,434,435,436,437,438],"ui","autospec ui audit","audit","ui audit","inventory","deterministic","evidence","needs","router","route","ux","site","react router","navigation","application",{"skillNo":440,"name":441,"nameZh":6,"description":442,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":443,"categories":444,"keywords":452,"publishedAt":39},"01M71RHV8DR6K242WDMB9HZ8WW","autospec-test","Use when you want to gate every Phase 4 PR on unit + E2E test coverage against an isolated environment, auto-heal coverage gaps within a 60-minute coding budget, and block assertion-loosening rewrites before auto-merge.","https:\u002F\u002Fgithub.com\u002Fberlinguyinca\u002Fautospec\u002Fblob\u002Fmain\u002Fskills\u002Fautospec-test\u002FSKILL.md",[445,448,449],{"categoryNo":446,"categoryName":447,"taxonomyType":363,"taxonomyTypeDesc":364},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":361,"categoryName":362,"taxonomyType":363,"taxonomyTypeDesc":364},{"categoryNo":450,"categoryName":451,"taxonomyType":421,"taxonomyTypeDesc":422},"01JBSEEDCAT000000000000037","律师与法务",[453,19,454,32,400,455,456,38,457,458,27,459,460,461,462,463,404,464,465,466],"test","autospec test","e2e test","unit","environment","e2e","coverage gaps","gaps","coding","Budget","test coverage","phase","pr","you"]