--- name: feature-tdd description: 功能循环第 3 步。逐任务执行计划:写失败测试 → 实现代码 → 测试通过 → 提交。所有测试运行均派发到子会话执行。 user-invocable: false allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) --- **所有输出必须使用中文。** # feature-tdd ## 执行步骤 1. **中断检查**:调用 `interrupt-check`。 2. 加载计划文件 `docs/superpowers/plans/YYYY-MM-DD-.md`。 3. **Schema 改动优先(如果计划声明了需要)**:若 plan 标注 "本 REQ 需要 schema 改动",**第一个任务必须是写 migration 文件 + 同步更新 docs/03**: - `ls sql/migrations/V*.sql` 得最大版本号 n_max,新文件版本号 = n_max + 1 - 文件名格式 `V__.sql`,例 `V5__add_user_email.sql` - `Write` 该文件(只含 DDL:`ALTER TABLE ... ADD COLUMN ...` / `CREATE TABLE ...` 等) - **同步把新 CREATE/ALTER 反向更新到 `docs/03-数据库设计文档.md` 对应表小节**(字段表格 / 索引 / 外键 / 业务注记),保持 docs/03 仍是 schema SSoT;新增表则按 `docs-03-table-template.md` 格式追加一节 - 把 migration + docs/03 改动**一起 commit**(避免 SSoT 与 migration 分裂) - 之后的代码任务(entity / DAO / service / 测试)在此之后做;测试运行时 Spring Boot 启动会由 Flyway 自动 apply 这个新 migration(`scripts/setup-test-db.sh` 只负责清空库) 4. 按顺序处理每个(代码类)任务: a. 在 `test_file::test_name` 处编写失败测试。 b. **派发子会话**(通过 `Agent`,general-purpose)运行测试并确认失败;子会话只返回 `{command, exit_code, failing_assertion}`。主会话**不直接**运行测试。 c. 在 `impl_file` 处实现最小代码使测试通过。 d. **再次派发子会话**运行测试并确认通过。 e. 持续失败(同一测试 >10 次修复尝试)→ 调用 `interrupt-check`(中断 #1)。 f. 暂存变更并使用 `${CLAUDE_SKILL_DIR}/templates/commit-message-template.md` 提交;`scope` 匹配任务的模块,`subject` ≤50 字符,`req_id` 必填。 5. 所有任务完成后 → 交接给 `feature-verify`。 ## 护栏 - **绝不**在主会话直接运行 `mvn test` / `pnpm test` / `scripts/test.sh`,必须通过子会话。 - 每次提交必须包含 REQ-XXX-NNN 标签。 - 不要将不相关的变更合并到一次提交中。 - **禁止**在主会话直接 `mysql -e "ALTER ..."` 执行业务 DDL;所有业务 schema 变更必须走 `sql/migrations/V_n__.sql` 文件(只读查询 / 临时调试探索除外)。 ## 衔接 立即调用 `Skill(feature-verify)` 进入下一步。 ## 参考 - `${CLAUDE_SKILL_DIR}/templates/commit-message-template.md` - 原则参考:`superpowers:test-driven-development`(本插件未镜像;仅作为 TDD 原则手册参考,不做运行时 invoke — 本 skill 已把"子会话跑测试 + REQ tag commit"流程直接写死) - 守门:`interrupt-check`