pdlc-test-setup
立测试地基(探测技术栈 → 验证并生成 test-commands.yml → 脚手架测试目录 → 接本地钩子)
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
立测试地基(探测技术栈 → 验证并生成 test-commands.yml → 脚手架测试目录 → 接本地钩子)
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
全自动 PDLC 新功能开发(串联 PRD→设计→TDD→实现→评审→发布)
全自动 Bug 修复(定位→复现→修复→测试→文档)
按设计文档和已有测试用例实现代码(带前置守卫、自检、handoff)
创建 PRD 文档(自动化生成 + 自检 + handoff)
质量闸门——跑真实 check、对照质量目标、出可核对报告,由人签字放行
代码评审 + 文档评审
| name | pdlc-test-setup |
| description | 立测试地基(探测技术栈 → 验证并生成 test-commands.yml → 脚手架测试目录 → 接本地钩子) |
给项目一键立起「客观 check」的地基:探测技术栈 → 逐条验证命令真能跑 → 写 docs/00_standards/test-commands.yml → 脚手架测试目录 → 接本地钩子。
pdlc 的命门是「checks 只认命令退出码,绝不用模型自评」——pdlc-tdd / pdlc-implement / pdlc-review
与外层循环全都从 docs/00_standards/test-commands.yml 取命令。但在此之前没有任何东西帮你把这个文件立起来,
没有它,整条客观化链路就是空的。本命令把这块地基变成 turnkey。
⛔ 本命令最重要的一条纪律:写进
test-commands.yml的每条命令,必须先被真跑过一次、亲眼看到退出码。 一条"看起来对但跑不了"的命令比留空更坏——它会让下游每个阶段都拿到假的checks, 而整个 pdlc 的可信度正建立在这些 checks 是真的之上。猜出来的命令一律不写。
--refresh:让这份 yml 跟上项目的演进项目会漂移——脚本改名、runner 换代、工具从依赖里移除、子项目增删。这份 yml 一旦过期,
下游所有 checks 就开始失真。--refresh 是重新探测 + 给出 diff,而不是从头再来:
check-commands.md 的三态判定谁还活着(跑不通 ≠ 检查没过)。git diff 复核。⚠️ 最危险的"自动修复"是把坏掉的 check 留空——闸门瞬间松了,报告还是绿的。 所以留空 / 删除 / 降阈值一律走人工确认,
--autonomous也不豁免。
从哪来的过期信号:不用你盯着——pdlc-tdd / pdlc-implement / pdlc-review 每次跑 check
时遇到"命令跑不了"都会提示,/pdlc-quality 的报告里还有专门的「配置健康度」一节。
看到提示再来 --refresh 即可。
扫描特征文件,识别语言 / 包管理器 / 测试框架:
| 特征文件 | 栈 | 典型 unit | 典型 coverage | 典型 lint |
|---|---|---|---|---|
Cargo.toml | Rust | cargo test | cargo llvm-cov --fail-under-lines <阈值> | cargo clippy -- -D warnings |
package.json | Node | pnpm test / npm test | vitest run --coverage.thresholds.lines=<阈值> | npx eslint . |
pyproject.toml / requirements.txt | Python | pytest | pytest --cov --cov-fail-under=<阈值> | ruff check . |
go.mod | Go | go test ./... | go test ./... -cover | golangci-lint run |
pom.xml / build.gradle | JVM | mvn test / ./gradlew test | jacoco check | mvn checkstyle:check |
仅 *.sh | Shell | 项目自有测试脚本 | —(通常无) | shellcheck <文件> |
多语言 / monorepo:逐个子项目探测;test-commands.yml 只能有一组命令,所以要么用能覆盖全仓的聚合命令
(如 pnpm -r test),要么与用户确认以哪个子项目为准。探测不到唯一答案时不要自己拍板(见 §1.3)。
对每个候选命令真的跑一次,按退出码归类:
| 观察到的结果 | 结论 | 动作 |
|---|---|---|
| 退出码 0 | 命令可用且当前通过 | 采纳 |
| 退出码非 0、非 127,且输出像测试/lint 报告 | 命令可用,只是当前有失败项 | 采纳(地基是"命令能跑",不是"当前全绿") |
退出码 127 / command not found / 工具未安装 | 命令不可用 | 留空,在报告里写明缺什么 |
| 无对应配置(如没配覆盖率工具) | 该项本项目暂无 | 留空 |
| 命令挂起 / 需要交互 | 不适合做自动 check | 留空,报告里说明 |
⚠️ 留空是合法且诚实的结果,与状态机里「没有检查命令可跑的阶段 →
checks: {}留空」同一条纪律。 宁可空着并在报告里提示怎么补,也不要写一条没验证过的命令。
覆盖率达标线写死在命令参数里(如 --cov-fail-under=85),不做二次解释——这样"达标"就是退出码本身,
不需要任何一方去解析百分比数字。默认阈值 85%;项目已有更高要求则沿用已有。
--autonomous 下 block,不猜)以下属判断题而非流程题,不得自动选,须写明原因交还人类:
jest 和 vitest 配置),无法判定以哪个为准探测到唯一候选且验证通过 → 属流程性确认,--autonomous 下自动采纳并在报告里留痕。
docs/00_standards/test-commands.yml以 templates/test-commands-template.yml 为骨架。这是 surface 型产物——就地编辑,不做 -v2 累积。
按栈惯例建空目录 + 一个占位说明,不生成业务测试用例:
tests/、Node src/__tests__/ 或 tests/、Python tests/、Go 同包 *_test.go、JVM src/test/java/templates/prompts/test-location.md),所以这里不必迁就任何预设结构在本地 git 钩子里跑基础 check(husky / lefthook / pre-commit / 原生 .git/hooks,按项目已有的来):
lint(快,秒级)unit(+ coverage 若已配)不新建 CI workflow:这些 check 本地秒级可得,放 CI 只会让每次迭代都烧配额。 已有 CI 的项目也不改它的触发条件——那需要项目所有者单独授权。
仅当用户要求:为当前覆盖率最低的若干核心模块补特征化测试(characterization test,锁住现有行为),
把覆盖率抬到阈值线。这不是补齐测试,只是让地基能立住。深度用例仍走 /pdlc-tdd。
test-commands.yml 里每一条非空命令,都在本次会话中被真跑过、看到过退出码test-commands.yml,其 unit 命令能定位到这些测试test-commands.yml 没有被静默覆盖--refresh 时)所有变更已在报告里列出;没有任何"让闸门变松"的改动被自动应用本命令的 handoff 输出:
✅ 测试地基已立:docs/00_standards/test-commands.yml
unit : <命令> (退出码 <N>,已验证)
coverage : <命令 | 留空> (<验证结论 | 为什么空>)
lint : <命令> (退出码 <N>,已验证)
e2e : <命令 | 留空> (<验证结论 | 为什么空>)
🪝 本地钩子:pre-commit → lint · pre-push → unit
📁 测试目录:<路径列表>
⚠️ 待人工:<留空项怎么补 / 需要拍板的选型>
👉 下一步:/pdlc-tdd <功能描述> —— 本命令只立地基,深度用例走 TDD
/pdlc-tdd(测试先行、红灯门)。目标项目: $ARGUMENTS