test-keeperlisted
Install: claude install-skill fongzhizhi/claude-skill-lab
# test-keeper
补充与修复单元测试,核心原则:**测行为,不测实现;拒绝注水测试**。测试的价值是锁定一份不可违背的业务契约——一个从未失败过的测试,就像从未生效的合同。
## 参考规范(开始前必须加载)
按顺序读取以下两份文档,作为本次工作的唯一依据:
1. `~/.claude/rules/ts-testing.md` —— 强制规则(精简版)
2. `~/.claude/docs/ts-testing-guide.md` —— 单元测试详细指南(测试策略模型、Mock 分层决策、Vitest 实战技巧、断言规则、质量门禁)
若第二份缺失,提示用户先运行 `lab deploy docs/ts-code-guide`,不跳过规范直接动手。
## 确定审查范围
### 模式一:默认(git diff 判定模块)
```bash
git diff --name-only HEAD # 已暂存 + 未暂存的修改
git status --porcelain # 检出 untracked 新增文件
```
合并结果,过滤出 `.ts` / `.tsx` **源码**文件(排除 `.test.ts` / `.spec.ts` 测试文件本身、`node_modules/`、构建产物目录),然后归并业务模块:
- **模块 = 文件相对项目源码根(`src/`、`lib/`、`app/` 等)的首层目录**;无源码根约定时取文件所在目录
- 所有变更文件归属**同一模块** → 确认该模块,继续
- 涉及**多个模块**或无法判定 → 列出候选模块,由用户指定一个
- 无 TS 源码变更 → 告知用户并结束
### 模式二:手动指定
| 参数 | 处理方式 |
| --- | --- |
| 文件路径 | 只审查该文件及其对应测试 |
| 目录路径 | 递归处理目录下所有 `.ts` / `.tsx`(排除 `node_modules/`、构建产物) |
| 模块名 | 定位该模块源码目录,审查模块整体 |
### 定位测试文件
对目标模块,按优先级查找对应测试:
- 同目录 `xxx.test.ts` / `xxx.spec.ts`
- 模块内 `__tests__/` 目录
- 模块 / 项目 `tests/`、`test/` 目录
- vitest / jest 配置(`vitest.config.*` / `jest.config.*`)的 `include` 模式
## 分支一:无单元测试 → 启动 openspec-propose
目标模块无任何测试文件时,**自动启动 openspec-propose 编写测试方案**(无需二次确认):
1. 构造 change 描述:
- change name:`add-tests-<模块名>`(kebab-case,如 `add-tests-order-service`)
- 目标:为模块 X 补充单元测试,**参考 `~/.claude/docs/ts-testing-guide.md` 规范**——测行为不测实现、表驱动测工具、集成测流程、禁快照、锁定时间/随机数、覆盖率行 ≥80% 且重点关注 branches
- 附上源码文件清单与本模块代码类型分布(纯函数 / Store / 副作用 / UI 组件),供方案按"代码分类与测试策略"(指南第四章)选型
2. 调用 Skill 工具触发 `openspec-propo