--- name: test-gate description: 打里程碑 tag 前的硬闸门。后端阶段子会话跑 scripts/test.sh,前端阶段跑前端测试命令;绿则进入 module-report,红则停下并按失败类型引导用户。 user-invocable: false allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *) Bash(git branch *) --- **所有输出必须使用中文。** # test-gate 模块(后端阶段)或整个前端阶段所有功能完成后的硬闸门。按当前分支自动推断 `phase`: - `module-*` 分支 → `phase=backend`:子会话跑 `./scripts/test.sh`(含本模块新增 + 已合并模块回归) - `frontend-phase` 分支 → `phase=frontend`:子会话跑前端测试命令(vitest + playwright) 按模板渲染证据并 commit 到当前分支。绿色继续,红色停下。 ## 执行步骤 ### 步骤 0:推断 phase 与目标命令 `git branch --show-current`: - `module-` → `phase=backend`,`phase_id=`,`command=./scripts/test.sh` - `frontend-phase` → `phase=frontend`,`phase_id=frontend-phase`;命令从 `docs/04-技术规范.md § 零 frontend.test_command` / `frontend.e2e_command` 拼接(缺失则 `pnpm test:ci && pnpm e2e:ci`) - 其它分支 → 硬停打印 `test-gate 仅在 module-* 或 frontend-phase 分支可调用,当前 [ERP-HALT]` 1. 派发 Agent 子会话(general-purpose)运行上述 `command`,子会话只返回结构化 JSON(不输出描述文字): ```json { "command": "", "exit_code": , "passed": , "failed": , "stdout_excerpt": "<最后 30 行,含 FAIL 摘要>" } ``` 2. 按 `${CLAUDE_SKILL_DIR}/templates/test-gate-result-template.md` 渲染证据,写入 `docs/superpowers/module-reports/-test-gate.md`(后端:`-test-gate.md`;前端:`frontend-phase-test-gate.md`)。 3. Commit evidence 到当前分支(保证证据随里程碑 merge 进默认分支可审计): ```bash git add docs/superpowers/module-reports/-test-gate.md git commit -m "chore(): add local test-gate evidence" ``` 4. **`exit_code = 0`** → **同一 turn 内立即** `Skill(module-report)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 5. **失败** → 打印以下横幅并停止,不调用下游 skill;不自动重试、不自动修复(失败分类需人工判断): ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [test-gate] ⚠️ 未通过 (phase=) [ERP-HALT] 失败清单: <子会话 JSON 的 failed 摘要> 详细证据: docs/superpowers/module-reports/-test-gate.md 按失败类型选恢复路径: ① 测试脆弱(偶发 flakey)→ 重跑 /erp-workflow:coding-start (module-start / frontend-start 幂等:reviews 已全 approve 会跳过功能循环,直接重跑本闸门) ② 真有回归 后端:rm docs/superpowers/reviews/*-.md → 重跑 /erp-workflow:coding-start(module-start 视该 REQ 未完成,重走功能循环) 前端:rm docs/superpowers/reviews/*-FE-.md → 重跑 /erp-workflow:coding-start(frontend-start 视该 FE 未完成,重走功能循环) ③ 环境/依赖问题(DB 连不上 / 外部 API 失败 / 证书失效 / Playwright 浏览器未装) → Skill(interrupt-check) 追加 Blocker 到任一 plan 文件 → 修复环境 → 重跑 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` ## 护栏 - **绝不**在主会话直接执行 `./scripts/test.sh` / `pnpm test` / `pnpm e2e`,必须通过子会话 - 本闸门是里程碑 tag 前唯一的硬测试门:红色时**绝不**跳过直接进入 `module-report` / `milestone-tag` ## 参考 - `${CLAUDE_SKILL_DIR}/templates/test-gate-result-template.md` - 上游:`module-start`(后端阶段 REQ 全 approve 后派发到此);`frontend-start`(前端阶段 FE 全 approve 后派发到此) - 下游:`module-report`(绿色时;后端 + 前端共用,phase 由当前分支推断)