pdlc-test-setup
立测试地基(探测技术栈 → 验证并生成 test-commands.yml → 脚手架测试目录 → 接本地钩子)
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
立测试地基(探测技术栈 → 验证并生成 test-commands.yml → 脚手架测试目录 → 接本地钩子)
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
全自动 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