gsd-lite 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +21 -0
- package/.claude-plugin/mcp.json +8 -0
- package/.claude-plugin/plugin.json +17 -0
- package/README.md +145 -0
- package/agents/gsd-debugger.md +92 -0
- package/agents/gsd-executor.md +86 -0
- package/agents/gsd-researcher.md +41 -0
- package/agents/gsd-reviewer.md +127 -0
- package/cli.js +37 -0
- package/commands/gsd-prd.md +154 -0
- package/commands/gsd-resume.md +216 -0
- package/commands/gsd-start.md +317 -0
- package/commands/gsd-status.md +114 -0
- package/commands/gsd-stop.md +50 -0
- package/hooks/context-monitor.js +64 -0
- package/hooks/hooks.json +19 -0
- package/install.js +151 -0
- package/package.json +51 -0
- package/references/anti-rationalization-full.md +112 -0
- package/references/git-worktrees.md +77 -0
- package/references/questioning.md +103 -0
- package/references/testing-patterns.md +110 -0
- package/src/schema.js +471 -0
- package/src/server.js +240 -0
- package/src/tools/orchestrator.js +986 -0
- package/src/tools/state.js +926 -0
- package/src/tools/verify.js +89 -0
- package/src/utils.js +73 -0
- package/uninstall.js +85 -0
- package/workflows/debugging.md +187 -0
- package/workflows/deviation-rules.md +128 -0
- package/workflows/research.md +139 -0
- package/workflows/review-cycle.md +153 -0
- package/workflows/tdd-cycle.md +154 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# 分层审查循环
|
|
2
|
+
|
|
3
|
+
> 本文档是 reviewer 内联审查策略的扩展指南,按需加载。
|
|
4
|
+
> 冲突时以 `gsd-reviewer.md` 内联规则为准。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 审查级别定义
|
|
9
|
+
|
|
10
|
+
### L0: 自审即可
|
|
11
|
+
|
|
12
|
+
**适用范围:** 配置修改、文档更新、CSS 样式、注释变更等无运行时语义变化的任务。
|
|
13
|
+
|
|
14
|
+
- executor 自审通过 → checkpoint commit = accepted
|
|
15
|
+
- **不启动 reviewer**
|
|
16
|
+
- 判定依据: 纯 docs/comment/style/config 且无运行时语义变化
|
|
17
|
+
|
|
18
|
+
### L1: 自审 + 阶段批量审查
|
|
19
|
+
|
|
20
|
+
**适用范围:** 大多数编码任务 (CRUD、UI 组件、工具函数等)。
|
|
21
|
+
|
|
22
|
+
- executor 自审 → checkpoint commit → 继续执行下一个 task
|
|
23
|
+
- phase 结束时 → 批量派发 reviewer,一次审查该 phase 所有 L1 task
|
|
24
|
+
- 批量审查通过 → 全部 accepted
|
|
25
|
+
- 批量审查发现 Critical → 返工相关 task
|
|
26
|
+
|
|
27
|
+
### L2: 即时独立审查
|
|
28
|
+
|
|
29
|
+
**适用范围:** 涉及认证、支付、数据安全、核心架构的关键任务。
|
|
30
|
+
|
|
31
|
+
- executor 完成 → 立即派发 reviewer (不等 phase 结束)
|
|
32
|
+
- reviewer 独立审查 (不信任 executor 报告)
|
|
33
|
+
- 审查通过 → accepted
|
|
34
|
+
- 审查不通过 → 立即返工
|
|
35
|
+
|
|
36
|
+
### 判定规则
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
改 auth/payment/permission/public API/DB migration/core architecture → L2
|
|
40
|
+
纯 docs/comment/style/config 且无运行时语义变化 → L0
|
|
41
|
+
其余 → L1
|
|
42
|
+
拿不准时 → 升一级处理
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 运行时重分类
|
|
46
|
+
|
|
47
|
+
planner 在计划阶段分配级别,但执行时可能发现实际影响面不同:
|
|
48
|
+
|
|
49
|
+
- executor 报告 `contract_changed: true` + 涉及 auth/payment/public API → 自动升级为 L2
|
|
50
|
+
- executor 标注 `[LEVEL-UP] 建议升级为 L2 因为 ...` → 编排器采纳
|
|
51
|
+
- **不主动降级** — planner 标了 L2 但实际很简单,仍按 L2 审查 (安全优先)
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Checkpoint ≠ Accepted 拓扑
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
L0: checkpoint commit = accepted (自审即可)
|
|
59
|
+
L1: checkpoint commit → [继续执行后续 task] → phase 批量 review → accepted
|
|
60
|
+
L2: checkpoint commit → [等待] → 即时独立 review → accepted
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
关键区别:
|
|
64
|
+
- **checkpoint** 是 executor 的"我完成了"信号
|
|
65
|
+
- **accepted** 是 reviewer 验证后的"确认合格"信号
|
|
66
|
+
- 下游 task 的依赖门槛 (`gate`) 决定它等待 checkpoint 还是 accepted
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 双阶段审查流程
|
|
71
|
+
|
|
72
|
+
### Stage 1: 规格审查 (Spec Review)
|
|
73
|
+
|
|
74
|
+
检查代码是否符合任务规格:
|
|
75
|
+
|
|
76
|
+
- [ ] 所有需求都实现了吗?
|
|
77
|
+
- [ ] 有没有多余的实现 (YAGNI)?
|
|
78
|
+
- [ ] 接口/API 是否符合计划?
|
|
79
|
+
- [ ] 测试是否覆盖了需求中的每个场景?
|
|
80
|
+
|
|
81
|
+
结果: PASS / FAIL (附具体不符合项 + 代码位置)
|
|
82
|
+
|
|
83
|
+
### HARD-GATE: 规格审查 → 质量审查
|
|
84
|
+
|
|
85
|
+
**规格审查必须通过后才能进入质量审查。**
|
|
86
|
+
不要浪费时间优化做错的代码。
|
|
87
|
+
|
|
88
|
+
### Stage 2: 质量审查 (Quality Review)
|
|
89
|
+
|
|
90
|
+
(仅在规格审查通过后执行)
|
|
91
|
+
|
|
92
|
+
检查代码质量:
|
|
93
|
+
|
|
94
|
+
- [ ] 测试覆盖是否充分?(运行测试 + 检查覆盖率)
|
|
95
|
+
- [ ] 有没有明显的 bug / 安全问题?
|
|
96
|
+
- [ ] 代码是否清晰可维护?
|
|
97
|
+
- [ ] 有无性能问题?
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 问题分级
|
|
102
|
+
|
|
103
|
+
| 级别 | 定义 | 处理方式 |
|
|
104
|
+
|------|------|----------|
|
|
105
|
+
| **Critical** | 安全漏洞 / 数据丢失 / 功能错误 | 必须修复,阻塞 accepted |
|
|
106
|
+
| **Important** | 性能问题 / 可维护性差 | 应该修复,转为后续 task 或记录为 deferred debt |
|
|
107
|
+
| **Minor** | 命名 / 风格 / 代码注释 | 建议修复,不阻塞 accepted |
|
|
108
|
+
|
|
109
|
+
判定规则:
|
|
110
|
+
- 有 Critical → 返回 FAIL,触发返工
|
|
111
|
+
- 只有 Important/Minor → 返回 PASS + 建议列表
|
|
112
|
+
- Important 必须转成后续 task 或显式记录为 deferred debt
|
|
113
|
+
- Minor 不阻塞,但必须进入 review report
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 审查报告模板
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"scope": "task | phase",
|
|
122
|
+
"scope_id": "2.3 | phase-2",
|
|
123
|
+
"review_level": "L2 | L1-batch",
|
|
124
|
+
"spec_passed": true,
|
|
125
|
+
"quality_passed": false,
|
|
126
|
+
"critical_issues": [
|
|
127
|
+
{
|
|
128
|
+
"task_id": "2.3",
|
|
129
|
+
"reason": "描述具体问题",
|
|
130
|
+
"invalidates_downstream": true
|
|
131
|
+
}
|
|
132
|
+
],
|
|
133
|
+
"important_issues": [],
|
|
134
|
+
"minor_issues": [],
|
|
135
|
+
"accepted_tasks": ["2.1", "2.2"],
|
|
136
|
+
"rework_tasks": ["2.3"],
|
|
137
|
+
"evidence": ["ev:test:phase-2", "ev:lint:phase-2"]
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 返工流程
|
|
144
|
+
|
|
145
|
+
1. reviewer 返回 rework_tasks 列表 + 具体原因
|
|
146
|
+
2. 编排器将 rework task 退回 executor,附上审查反馈
|
|
147
|
+
3. executor 修复 → 重新 checkpoint → 重新提交 review
|
|
148
|
+
4. 若返工修改了 contract → 触发下游失效传播 (`needs_revalidation`)
|
|
149
|
+
5. 若返工只改了内部实现 → 下游 task 保持现状,但需重跑验证
|
|
150
|
+
|
|
151
|
+
**L1 批量审查返工的爆炸半径:**
|
|
152
|
+
- L1 允许 checkpoint 释放下游,batch review 时如发现 Critical,可能导致多个下游 task 连锁 `needs_revalidation`
|
|
153
|
+
- 这是 L1 的已知 trade-off — 缓解方法: planner 对有共享行为依赖的 L1 task 使用 `gate: accepted`
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# TDD 循环: RED-GREEN-REFACTOR
|
|
2
|
+
|
|
3
|
+
> 本文档是 executor 内联 TDD 铁律的扩展指南,按需加载。
|
|
4
|
+
> 冲突时以 `gsd-executor.md` 内联规则为准。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 铁律 (与 executor 一致)
|
|
9
|
+
|
|
10
|
+
**NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST**
|
|
11
|
+
|
|
12
|
+
唯一例外见下方 §例外列表。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## RED: 写失败测试
|
|
17
|
+
|
|
18
|
+
1. **一次一个行为** — 每个测试只验证一个行为,不合并
|
|
19
|
+
2. **清晰命名** — `should_reject_expired_token` 而非 `test_token_3`
|
|
20
|
+
3. **写真实代码** — 测试调用真实函数/API,不是伪代码占位
|
|
21
|
+
4. **断言具体** — `expect(result.status).toBe(401)` 而非 `expect(result).toBeTruthy()`
|
|
22
|
+
5. **考虑边界** — 写完主路径测试后,立刻考虑: 空值、零值、溢出、并发
|
|
23
|
+
|
|
24
|
+
### 边界案例策略
|
|
25
|
+
|
|
26
|
+
对每个行为,系统性检查以下维度:
|
|
27
|
+
|
|
28
|
+
| 维度 | 常见边界 |
|
|
29
|
+
|------|----------|
|
|
30
|
+
| 空/null | `null`, `undefined`, `""`, `[]`, `{}` |
|
|
31
|
+
| 数值极端 | `0`, `-1`, `Number.MAX_SAFE_INTEGER`, `NaN`, `Infinity` |
|
|
32
|
+
| 字符串 | 空字符串, 超长字符串, 特殊字符, Unicode, SQL 注入模式 |
|
|
33
|
+
| 集合 | 空数组, 单元素, 重复元素, 超大集合 |
|
|
34
|
+
| 时间 | 过期时间, 未来时间, 时区边界, 闰秒 |
|
|
35
|
+
| 并发 | 重复提交, 竞态条件 |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 验证 RED: 观察测试失败
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
运行测试 → 确认测试失败 → 失败原因符合预期
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**强制步骤,不可跳过。** 不验证 RED = 你不知道测试是否真的在测你想测的东西。
|
|
46
|
+
|
|
47
|
+
检查清单:
|
|
48
|
+
- [ ] 测试运行了 (不是被跳过/过滤掉)
|
|
49
|
+
- [ ] 失败原因是"预期功能不存在",不是语法错误或配置问题
|
|
50
|
+
- [ ] 如果测试意外通过 → 你的测试写错了,或功能已存在。调查。
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## GREEN: 最小实现通过
|
|
55
|
+
|
|
56
|
+
1. **写最少的代码让测试通过** — 不多写一行
|
|
57
|
+
2. **允许"丑陋"的代码** — 这个阶段不追求优雅
|
|
58
|
+
3. **不要提前优化** — 硬编码返回值有时是合法的 GREEN 步骤
|
|
59
|
+
4. **不要偷跑下一个功能** — 只解决当前失败的测试
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 验证 GREEN: 观察测试通过
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
运行全部相关测试 → 新测试通过 → 旧测试不回归
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
检查清单:
|
|
70
|
+
- [ ] 新测试通过
|
|
71
|
+
- [ ] 已有测试没有因为新代码而失败
|
|
72
|
+
- [ ] 如果测试仍然失败 → 修复实现,不是修改测试
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## REFACTOR: 保持 GREEN 的前提下清理
|
|
77
|
+
|
|
78
|
+
1. **提取重复** — 相似代码 → 提取函数/常量
|
|
79
|
+
2. **改善命名** — 实现过程中可能用了临时名称,现在改好
|
|
80
|
+
3. **简化逻辑** — 能用更简单的方式实现吗?
|
|
81
|
+
4. **每次重构后运行测试** — GREEN 不能丢
|
|
82
|
+
|
|
83
|
+
重构不改行为:
|
|
84
|
+
- 不加新功能 (那是下一个 RED)
|
|
85
|
+
- 不改测试断言 (那说明你在改行为)
|
|
86
|
+
- 不跳过"太小的重构" (小重构积累大质量)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## TDD 例外列表 (与 executor 一致)
|
|
91
|
+
|
|
92
|
+
以下任务不需要先写失败测试:
|
|
93
|
+
|
|
94
|
+
- 配置文件修改 (`package.json`, `tsconfig`, `.env.example`)
|
|
95
|
+
- CSS / 样式 / 布局变更
|
|
96
|
+
- 数据库迁移脚本 (用迁移工具自身的验证)
|
|
97
|
+
- 纯文档 / 注释 / README
|
|
98
|
+
- CI/CD 配置
|
|
99
|
+
- 环境变量 / 部署配置
|
|
100
|
+
|
|
101
|
+
这些任务改为: **实现 → 验证生效 → checkpoint commit**
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Mock 策略: 何时 Mock vs 真实实现
|
|
106
|
+
|
|
107
|
+
### 使用 Mock 的场景
|
|
108
|
+
|
|
109
|
+
| 场景 | 理由 |
|
|
110
|
+
|------|------|
|
|
111
|
+
| 外部 API (支付、邮件、短信) | 不可控、有成本、速度慢 |
|
|
112
|
+
| 数据库 (单元测试层) | 速度 + 隔离 |
|
|
113
|
+
| 时间/随机数 | 确定性 |
|
|
114
|
+
| 文件系统 (危险操作) | 安全 |
|
|
115
|
+
|
|
116
|
+
### 不要 Mock 的场景
|
|
117
|
+
|
|
118
|
+
| 场景 | 理由 |
|
|
119
|
+
|------|------|
|
|
120
|
+
| 被测模块自身的逻辑 | Mock 自己 = 测了个寂寞 |
|
|
121
|
+
| 简单的纯函数 | 真实调用更简单也更可靠 |
|
|
122
|
+
| 核心集成路径 | 需要真实行为来验证契约 |
|
|
123
|
+
|
|
124
|
+
### Mock 原则
|
|
125
|
+
|
|
126
|
+
- **Mock 边界,不 Mock 内部** — Mock 外部依赖,不 Mock 被测模块内部方法
|
|
127
|
+
- **Mock 应可替换** — 依赖注入 > 猴子补丁
|
|
128
|
+
- **Mock 数量警报** — 一个测试超过 3 个 Mock → 代码耦合太紧,考虑重构
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 测试粒度指南
|
|
133
|
+
|
|
134
|
+
| 层级 | 范围 | 速度 | 占比建议 | 何时写 |
|
|
135
|
+
|------|------|------|----------|--------|
|
|
136
|
+
| 单元 | 单个函数/类 | 毫秒 | 70% | 每个 TDD 循环 |
|
|
137
|
+
| 集成 | 模块间交互 | 秒级 | 20% | API 端点、数据库交互 |
|
|
138
|
+
| E2E | 完整用户流程 | 十秒级 | 10% | 关键路径、冒烟测试 |
|
|
139
|
+
|
|
140
|
+
原则: **测试金字塔** — 底层多、顶层少。反模式是"冰淇淋蛋筒"(大量 E2E,少量单元)。
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 常见合理化及反驳
|
|
145
|
+
|
|
146
|
+
| 合理化借口 | 为什么是错的 | 正确做法 |
|
|
147
|
+
|------------|--------------|----------|
|
|
148
|
+
| "太简单了不需要测试" | 简单代码也会出错,而且会变复杂 | 写测试。如果真的简单,测试也很快写完 |
|
|
149
|
+
| "我先写完再测试" | 后写的测试立即通过,证明不了任何东西 | 先 RED,再 GREEN |
|
|
150
|
+
| "就这一次跳过" | 你在合理化。下次也会跳过 | 停止。回到正确流程 |
|
|
151
|
+
| "手动测试过了" | 手动 ≠ 可重复验证 | 写自动测试 |
|
|
152
|
+
| "时间不够" | 不写测试 = 以后花更多时间调试 | TDD 实际更快 |
|
|
153
|
+
| "这是原型代码" | 原型代码经常变成生产代码 | 除非确定会丢弃,否则写测试 |
|
|
154
|
+
| "改测试太麻烦" | 脆弱的测试说明设计有问题 | 重构测试 + 重构代码 |
|