gsd-lite 0.3.2 → 0.3.6
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 +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/agents/debugger.md +6 -6
- package/agents/researcher.md +9 -0
- package/commands/prd.md +7 -142
- package/commands/resume.md +16 -7
- package/commands/start.md +16 -156
- package/commands/stop.md +2 -1
- package/hooks/context-monitor.js +2 -2
- package/hooks/gsd-context-monitor.cjs +35 -26
- package/hooks/gsd-session-init.cjs +1 -1
- package/hooks/gsd-statusline.cjs +44 -20
- package/package.json +1 -1
- package/references/evidence-spec.md +166 -0
- package/references/execution-loop.md +162 -0
- package/references/review-classification.md +84 -0
- package/references/state-diagram.md +218 -0
- package/src/schema.js +132 -28
- package/src/server.js +7 -0
- package/src/tools/orchestrator.js +55 -11
- package/src/tools/state.js +100 -54
- package/src/tools/verify.js +1 -1
- package/src/utils.js +21 -4
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"name": "gsd",
|
|
14
14
|
"source": "./",
|
|
15
15
|
"description": "AI orchestration tool — GSD management shell + Superpowers quality core. 5 commands, 4 agents, 5 workflows, MCP server, context monitoring.",
|
|
16
|
-
"version": "0.3.
|
|
16
|
+
"version": "0.3.6",
|
|
17
17
|
"keywords": ["orchestration", "mcp", "tdd", "task-management"],
|
|
18
18
|
"category": "Development workflows"
|
|
19
19
|
}
|
package/agents/debugger.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debugger
|
|
3
3
|
description: Systematic debugging with root cause analysis
|
|
4
|
-
tools: Read,
|
|
4
|
+
tools: Read, Bash, Grep, Glob
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<role>
|
|
@@ -54,11 +54,11 @@ Phase 3 假设测试:
|
|
|
54
54
|
2. 最小变更测试 (一次只改一个变量)
|
|
55
55
|
3. 验证: 有效 → Phase 4 / 无效 → 新假设
|
|
56
56
|
|
|
57
|
-
Phase 4
|
|
58
|
-
1.
|
|
59
|
-
2.
|
|
60
|
-
3.
|
|
61
|
-
→ 3
|
|
57
|
+
Phase 4 修复方向建议:
|
|
58
|
+
1. 提出修复方案 (针对根因,不是症状)
|
|
59
|
+
2. 建议失败测试用例 (供 executor 实现)
|
|
60
|
+
3. 评估修复影响范围 (哪些下游可能受影响)
|
|
61
|
+
→ 3 次修复方向均被 executor 验证无效 → 停止。标记 architecture_concern: true。报告给编排器。
|
|
62
62
|
</four_phases>
|
|
63
63
|
|
|
64
64
|
<result_contract>
|
package/agents/researcher.md
CHANGED
|
@@ -39,3 +39,12 @@ tools: Read, Write, Bash, WebSearch, WebFetch, mcp__plugin_context7_context7__*
|
|
|
39
39
|
```
|
|
40
40
|
</result_contract>
|
|
41
41
|
</research_output>
|
|
42
|
+
|
|
43
|
+
<uncertainty_handling>
|
|
44
|
+
## 遇到不确定性时
|
|
45
|
+
子代理不能直接与用户交互。遇到不确定性时:
|
|
46
|
+
1. 来源冲突 → 报告双方立场及置信度,让编排器决定。在 result 中标注 "[DECISION] 选择了X因为Y"
|
|
47
|
+
2. 所有来源不可用 (Context7 + WebSearch + 官方文档均失败) → 返回 "[BLOCKED] 需要: 研究来源不可用,请提供替代信息或缩小范围"
|
|
48
|
+
3. 研究范围过广无法收敛 → 返回 "[BLOCKED] 需要: 研究范围过广,请指定重点领域"
|
|
49
|
+
4. 发现结论与已有 decisions 矛盾 → 在 result 中标注冲突,让编排器决定是否更新 decision
|
|
50
|
+
</uncertainty_handling>
|
package/commands/prd.md
CHANGED
|
@@ -100,12 +100,16 @@ argument-hint: File path to requirements doc, or inline description text
|
|
|
100
100
|
|
|
101
101
|
→ 自审修正后再展示给用户
|
|
102
102
|
|
|
103
|
+
<HARD-GATE id="plan-confirmation">
|
|
103
104
|
## STEP 9: 展示计划,等待用户确认
|
|
104
105
|
|
|
105
106
|
- 展示完整分阶段计划
|
|
106
107
|
- 用户指出问题 → 调整 → 再展示
|
|
107
108
|
- 用户确认 → 继续
|
|
108
109
|
|
|
110
|
+
⛔ 不得在用户确认前执行 STEP 10-12。未确认 = 不写文件、不执行代码。
|
|
111
|
+
</HARD-GATE>
|
|
112
|
+
|
|
109
113
|
## STEP 10: 生成文档
|
|
110
114
|
|
|
111
115
|
- 创建 .gsd/ 目录
|
|
@@ -126,149 +130,10 @@ argument-hint: File path to requirements doc, or inline description text
|
|
|
126
130
|
进入执行主循环。phase = 管理边界,task = 执行边界。
|
|
127
131
|
|
|
128
132
|
<execution_loop>
|
|
133
|
+
参考 `references/execution-loop.md` 获取完整 9 步执行循环规范 (11.1-11.9) 及依赖门槛语义。
|
|
129
134
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
for each pending phase:
|
|
134
|
-
加载 phase 计划 + todo DAG
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### 11.2 — 选择 runnable task
|
|
138
|
-
|
|
139
|
-
选择条件:
|
|
140
|
-
- `lifecycle` 属于 `{pending, needs_revalidation}`
|
|
141
|
-
- `requires` 中每个依赖都满足对应 gate
|
|
142
|
-
- 不被 unresolved blocker 阻塞
|
|
143
|
-
- 未超过 retry 上限
|
|
144
|
-
|
|
145
|
-
如果 0 个 runnable task 且 phase 未完成:
|
|
146
|
-
```
|
|
147
|
-
├── 全部 blocked → workflow_mode = awaiting_user,展示所有 blocker
|
|
148
|
-
└── 全部等待 review → 触发 batch review (L1) 或等待 L2 review 完成
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### 11.3 — 构建 executor 上下文 + 串行派发
|
|
152
|
-
|
|
153
|
-
executor 上下文传递协议 (orchestrator → executor):
|
|
154
|
-
```
|
|
155
|
-
├── task_spec: 从 phases/*.md 提取当前 task 的规格段落
|
|
156
|
-
├── research_decisions: 从 research_basis 引用的 decision 摘要
|
|
157
|
-
├── predecessor_outputs: 前置依赖 task 的 files_changed + checkpoint_commit
|
|
158
|
-
├── project_conventions: CLAUDE.md 路径 (executor 自行读取)
|
|
159
|
-
├── workflows: 需加载的工作流文件路径 (如 tdd-cycle.md)
|
|
160
|
-
└── constraints: retry_count / level / review_required
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
派发 `executor` 子代理执行单个 task。
|
|
164
|
-
|
|
165
|
-
### 11.4 — 处理 executor 结果
|
|
166
|
-
|
|
167
|
-
严格按 agent result contract 处理:
|
|
168
|
-
```
|
|
169
|
-
├── checkpointed → 写入 checkpoint commit + evidence refs → 进入审查 (11.5)
|
|
170
|
-
├── blocked → 写入 blocked_reason / unblock_condition
|
|
171
|
-
│ → 编排器检查 decisions 数组,能自动回答则重新派发
|
|
172
|
-
│ → 不能回答 → workflow_mode = awaiting_user,向用户转达
|
|
173
|
-
├── failed → retry_count + 1
|
|
174
|
-
│ → 未超限 → 重新派发 executor
|
|
175
|
-
│ → 超限 (3次) 或返回 [FAILED] 且错误指纹重复
|
|
176
|
-
│ 或修复尝试未收敛 → 触发 debugger (见下方)
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
**Debugger 触发流程:**
|
|
180
|
-
1. 编排器派发 `debugger` 子代理,传入: 错误信息 + executor 修复尝试记录 + 相关代码路径
|
|
181
|
-
2. debugger 返回: 根因分析 + 修复方向建议
|
|
182
|
-
3. 编排器决定:
|
|
183
|
-
- 带修复方向重新派发 executor
|
|
184
|
-
- 标记 task failed
|
|
185
|
-
- 标记 phase failed
|
|
186
|
-
|
|
187
|
-
**Decisions 累积:**
|
|
188
|
-
- executor 返回 `[DECISION]` → 编排器追加到 `state.json` 的 `decisions` 数组
|
|
189
|
-
- 每条 decision 记录: `id` / `task` / `summary` / `phase`
|
|
190
|
-
- decisions 跨 task、跨 phase、跨 `/clear` + `/gsd:resume` 持久保留
|
|
191
|
-
- 编排器收到 `[BLOCKED]` 时,先查 `decisions` 数组尝试自动回答
|
|
192
|
-
|
|
193
|
-
### 11.5 — 分层审查
|
|
194
|
-
|
|
195
|
-
```
|
|
196
|
-
├── L0: checkpoint commit 后可直接 accepted (无需 reviewer)
|
|
197
|
-
├── L1: phase 结束后批量 reviewer 审查
|
|
198
|
-
│ → 派发 reviewer 子代理,scope = phase
|
|
199
|
-
└── L2: checkpoint commit 后立即独立审查
|
|
200
|
-
→ 派发 reviewer 子代理,scope = task
|
|
201
|
-
→ 未 accepted 前不释放其下游依赖
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
**审查级别运行时重分类:**
|
|
205
|
-
- executor 报告 `contract_changed: true` + 涉及 auth/payment/public API → 自动升级为 L2
|
|
206
|
-
- executor 标注 `[LEVEL-UP]` → 编排器采纳
|
|
207
|
-
- 不主动降级 (安全优先)
|
|
208
|
-
|
|
209
|
-
### 11.6 — 处理 reviewer 结果
|
|
210
|
-
|
|
211
|
-
```
|
|
212
|
-
├── 无 Critical → 更新 accepted 状态 + evidence refs
|
|
213
|
-
└── 有 Critical → 标记返工 task + 失效传播 → 重新审查 (最多 3 轮)
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
**返工失效传播规则:**
|
|
217
|
-
- 返工修改了 contract / schema / shared behavior:
|
|
218
|
-
→ 所有直接和间接依赖 task → `needs_revalidation`
|
|
219
|
-
→ 清空其旧 `evidence_refs`
|
|
220
|
-
→ 已 accepted 则退回到 `checkpointed` 或 `pending_review`
|
|
221
|
-
- 返工只影响局部实现、外部契约未变:
|
|
222
|
-
→ 下游 task 保持现状
|
|
223
|
-
→ 但受影响验证范围必须重跑并刷新 evidence
|
|
224
|
-
- 触发判定: `contract_changed` (executor 运行时报告) 是主触发源
|
|
225
|
-
`invalidate_downstream_on_change` (planner 静态标记) 是预判辅助
|
|
226
|
-
→ executor 报告 `contract_changed: true` → 一定传播
|
|
227
|
-
→ planner 标记但 executor 报告 false → 不传播 (以运行时实际为准)
|
|
228
|
-
|
|
229
|
-
### 11.7 — Phase handoff gate
|
|
230
|
-
|
|
231
|
-
<HARD-GATE id="phase-handoff">
|
|
232
|
-
所有条件必须满足才能进入下一 phase:
|
|
233
|
-
- [ ] 所有 required task = `accepted`
|
|
234
|
-
- [ ] required review = `passed`
|
|
235
|
-
- [ ] critical issues = 0
|
|
236
|
-
- [ ] tests/lint/typecheck 满足计划验证条件
|
|
237
|
-
- [ ] 方向校验: 当前阶段产出是否仍与 plan.md 中的项目目标一致?
|
|
238
|
-
|
|
239
|
-
→ 全部满足 → 自动进入下一阶段
|
|
240
|
-
→ 任一不满足 → 标注问题,尝试修复,3 次失败停止
|
|
241
|
-
→ 方向漂移 → workflow_mode = awaiting_user,展示偏差让用户决定
|
|
242
|
-
</HARD-GATE>
|
|
243
|
-
|
|
244
|
-
### 11.8 — 批量更新 state.json
|
|
245
|
-
|
|
246
|
-
阶段完成后,编排器批量更新 state.json:
|
|
247
|
-
- 更新 phase lifecycle → `accepted`
|
|
248
|
-
- 更新 phase_handoff 信息
|
|
249
|
-
- 归档旧 phase 的 evidence (只保留当前 phase 和上一 phase)
|
|
250
|
-
- 推进 `current_phase` 到下一个 pending phase
|
|
251
|
-
|
|
252
|
-
**规则:** 只有编排器写 state.json,避免并发竞态。
|
|
253
|
-
|
|
254
|
-
### 11.9 — 上下文检查
|
|
255
|
-
|
|
256
|
-
每次派发子代理前和阶段切换时检查上下文健康度:
|
|
257
|
-
|
|
258
|
-
```
|
|
259
|
-
remaining < 35%:
|
|
260
|
-
1. 保存完整状态到 state.json
|
|
261
|
-
2. workflow_mode = awaiting_clear
|
|
262
|
-
3. 输出: "上下文剩余 <35%,已保存进度。请执行 /clear 然后 /gsd:resume 继续"
|
|
263
|
-
4. 停止执行
|
|
264
|
-
|
|
265
|
-
remaining < 25%:
|
|
266
|
-
1. 紧急保存状态到 state.json
|
|
267
|
-
2. workflow_mode = awaiting_clear
|
|
268
|
-
3. 输出: "上下文即将耗尽,已保存进度。请立即执行 /clear 然后 /gsd:resume"
|
|
269
|
-
4. 立即停止
|
|
270
|
-
```
|
|
271
|
-
|
|
135
|
+
编排器必须严格按照该参考文档中的步骤顺序执行:
|
|
136
|
+
加载 phase → 选择 task → 构建上下文 → 派发 executor → 处理结果 → 审查 → phase handoff → 批量更新 → 上下文检查
|
|
272
137
|
</execution_loop>
|
|
273
138
|
|
|
274
139
|
## STEP 12 — 全部完成
|
package/commands/resume.md
CHANGED
|
@@ -35,17 +35,18 @@ description: Resume project execution from saved state with workspace validation
|
|
|
35
35
|
- 不一致 → 覆写 `workflow_mode = reconcile_workspace`
|
|
36
36
|
|
|
37
37
|
2. **计划版本校验:**
|
|
38
|
-
- 如果本地 plan.md 或 phases/*.md
|
|
38
|
+
- 如果本地 plan.md 或 phases/*.md 被手动修改 (mtime > last_session)
|
|
39
39
|
- → 覆写 `workflow_mode = replan_required`
|
|
40
40
|
|
|
41
|
-
3.
|
|
41
|
+
3. **方向漂移校验:**
|
|
42
|
+
- 如果当前或任何未完成 phase 的 `phase_handoff.direction_ok === false`
|
|
43
|
+
- → 覆写 `workflow_mode = awaiting_user`
|
|
44
|
+
|
|
45
|
+
4. **研究过期校验:**
|
|
42
46
|
- 如果 `research.expires_at` 已过期 (早于当前时间)
|
|
47
|
+
- 或 research.decision_index 中有条目的 expires_at 已过期
|
|
43
48
|
- → 覆写 `workflow_mode = research_refresh_needed`
|
|
44
49
|
|
|
45
|
-
4. **工作区冲突校验:**
|
|
46
|
-
- 运行 `git status` 检查是否存在冲突或脏工作区
|
|
47
|
-
- 存在未解决的合并冲突 → 覆写 `workflow_mode = awaiting_user`
|
|
48
|
-
|
|
49
50
|
5. **全部通过:**
|
|
50
51
|
- 保持原 `workflow_mode` 不变
|
|
51
52
|
|
|
@@ -68,7 +69,7 @@ description: Resume project execution from saved state with workspace validation
|
|
|
68
69
|
- requires 中每个依赖都满足对应 gate
|
|
69
70
|
- 未超过 retry 上限
|
|
70
71
|
- 构建 executor 上下文 → 派发 executor 子代理
|
|
71
|
-
- 继续自动执行主路径 (按
|
|
72
|
+
- 继续自动执行主路径 (按 references/execution-loop.md 执行循环)
|
|
72
73
|
|
|
73
74
|
---
|
|
74
75
|
|
|
@@ -176,6 +177,14 @@ description: Resume project execution from saved state with workspace validation
|
|
|
176
177
|
|
|
177
178
|
---
|
|
178
179
|
|
|
180
|
+
### `planning` — 计划中断
|
|
181
|
+
|
|
182
|
+
- 计划编制过程中被中断
|
|
183
|
+
- 告知用户: "项目仍在计划阶段。请运行 /gsd:start 或 /gsd:prd 重新启动计划流程"
|
|
184
|
+
- 不自动执行
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
179
188
|
### `failed` — 已失败
|
|
180
189
|
|
|
181
190
|
- 展示失败信息:
|
package/commands/start.md
CHANGED
|
@@ -30,7 +30,7 @@ argument-hint: Optional feature or project description
|
|
|
30
30
|
## STEP 4 — 需求追问
|
|
31
31
|
|
|
32
32
|
用户回答后,跟进追问直到需求清晰:
|
|
33
|
-
- 使用 `references/questioning.md
|
|
33
|
+
- 使用 Read 工具读取 `references/questioning.md`,按其中的技巧进行提问 (挑战模糊、具象化、发现边界)
|
|
34
34
|
- 每个问题提供选项,标识 ⭐ 推荐选项
|
|
35
35
|
- 多轮对话直到需求清晰 (通常 2-4 轮)
|
|
36
36
|
- 每轮最多 3-5 个问题,避免过度追问
|
|
@@ -113,12 +113,17 @@ argument-hint: Optional feature or project description
|
|
|
113
113
|
|
|
114
114
|
→ 自审修正后再展示给用户。
|
|
115
115
|
|
|
116
|
+
<HARD-GATE id="plan-confirmation">
|
|
116
117
|
## STEP 9 — 用户确认计划
|
|
117
118
|
|
|
118
119
|
展示计划给用户,等待确认:
|
|
119
120
|
- 用户指出问题 → 调整计划 → 重新展示
|
|
120
121
|
- 用户确认 → 继续
|
|
121
122
|
|
|
123
|
+
⛔ 不得在用户确认前执行 STEP 10-12。未确认 = 不写文件、不执行代码。
|
|
124
|
+
</HARD-GATE>
|
|
125
|
+
|
|
126
|
+
<HARD-GATE id="docs-written">
|
|
122
127
|
## STEP 10 — 生成文档
|
|
123
128
|
|
|
124
129
|
1. 创建 `.gsd/` 目录
|
|
@@ -141,169 +146,24 @@ argument-hint: Optional feature or project description
|
|
|
141
146
|
- `phases/*.md` 是 task 规格的唯一 source of truth
|
|
142
147
|
- `plan.md` 不包含 task 级细节,避免与 `phases/*.md` 重复
|
|
143
148
|
|
|
149
|
+
□ state.json 已写入且包含所有 canonical fields
|
|
150
|
+
□ plan.md 已写入
|
|
151
|
+
□ phases/*.md 已写入 (每个 phase 一个文件)
|
|
152
|
+
□ 所有 task 都有 lifecycle / level / requires / review_required
|
|
153
|
+
→ 全部满足才可继续
|
|
154
|
+
</HARD-GATE>
|
|
155
|
+
|
|
144
156
|
## STEP 11 — 自动执行主路径
|
|
145
157
|
|
|
146
158
|
进入执行主循环。phase = 管理边界,task = 执行边界。
|
|
147
159
|
|
|
148
160
|
<execution_loop>
|
|
161
|
+
参考 `references/execution-loop.md` 获取完整 9 步执行循环规范 (11.1-11.9) 及依赖门槛语义。
|
|
149
162
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
```
|
|
153
|
-
for each pending phase:
|
|
154
|
-
加载 phase 计划 + todo DAG
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### 11.2 — 选择 runnable task
|
|
158
|
-
|
|
159
|
-
选择条件:
|
|
160
|
-
- `lifecycle` 属于 `{pending, needs_revalidation}`
|
|
161
|
-
- `requires` 中每个依赖都满足对应 gate
|
|
162
|
-
- 不被 unresolved blocker 阻塞
|
|
163
|
-
- 未超过 retry 上限
|
|
164
|
-
|
|
165
|
-
如果 0 个 runnable task 且 phase 未完成:
|
|
166
|
-
```
|
|
167
|
-
├── 全部 blocked → workflow_mode = awaiting_user,展示所有 blocker
|
|
168
|
-
└── 全部等待 review → 触发 batch review (L1) 或等待 L2 review 完成
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### 11.3 — 构建 executor 上下文 + 串行派发
|
|
172
|
-
|
|
173
|
-
executor 上下文传递协议 (orchestrator → executor):
|
|
174
|
-
```
|
|
175
|
-
├── task_spec: 从 phases/*.md 提取当前 task 的规格段落
|
|
176
|
-
├── research_decisions: 从 research_basis 引用的 decision 摘要
|
|
177
|
-
├── predecessor_outputs: 前置依赖 task 的 files_changed + checkpoint_commit
|
|
178
|
-
├── project_conventions: CLAUDE.md 路径 (executor 自行读取)
|
|
179
|
-
├── workflows: 需加载的工作流文件路径 (如 tdd-cycle.md)
|
|
180
|
-
└── constraints: retry_count / level / review_required
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
派发 `executor` 子代理执行单个 task。
|
|
184
|
-
|
|
185
|
-
### 11.4 — 处理 executor 结果
|
|
186
|
-
|
|
187
|
-
严格按 agent result contract 处理:
|
|
188
|
-
```
|
|
189
|
-
├── checkpointed → 写入 checkpoint commit + evidence refs → 进入审查 (11.5)
|
|
190
|
-
├── blocked → 写入 blocked_reason / unblock_condition
|
|
191
|
-
│ → 编排器检查 decisions 数组,能自动回答则重新派发
|
|
192
|
-
│ → 不能回答 → workflow_mode = awaiting_user,向用户转达
|
|
193
|
-
├── failed → retry_count + 1
|
|
194
|
-
│ → 未超限 → 重新派发 executor
|
|
195
|
-
│ → 超限 (3次) 或返回 [FAILED] 且错误指纹重复
|
|
196
|
-
│ 或修复尝试未收敛 → 触发 debugger (见下方)
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Debugger 触发流程:**
|
|
200
|
-
1. 编排器派发 `debugger` 子代理,传入: 错误信息 + executor 修复尝试记录 + 相关代码路径
|
|
201
|
-
2. debugger 返回: 根因分析 + 修复方向建议
|
|
202
|
-
3. 编排器决定:
|
|
203
|
-
- 带修复方向重新派发 executor
|
|
204
|
-
- 标记 task failed
|
|
205
|
-
- 标记 phase failed
|
|
206
|
-
|
|
207
|
-
**Decisions 累积:**
|
|
208
|
-
- executor 返回 `[DECISION]` → 编排器追加到 `state.json` 的 `decisions` 数组
|
|
209
|
-
- 每条 decision 记录: `id` / `task` / `summary` / `phase`
|
|
210
|
-
- decisions 跨 task、跨 phase、跨 `/clear` + `/gsd:resume` 持久保留
|
|
211
|
-
- 编排器收到 `[BLOCKED]` 时,先查 `decisions` 数组尝试自动回答
|
|
212
|
-
|
|
213
|
-
### 11.5 — 分层审查
|
|
214
|
-
|
|
215
|
-
```
|
|
216
|
-
├── L0: checkpoint commit 后可直接 accepted (无需 reviewer)
|
|
217
|
-
├── L1: phase 结束后批量 reviewer 审查
|
|
218
|
-
│ → 派发 reviewer 子代理,scope = phase
|
|
219
|
-
└── L2: checkpoint commit 后立即独立审查
|
|
220
|
-
→ 派发 reviewer 子代理,scope = task
|
|
221
|
-
→ 未 accepted 前不释放其下游依赖
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**审查级别运行时重分类:**
|
|
225
|
-
- executor 报告 `contract_changed: true` + 涉及 auth/payment/public API → 自动升级为 L2
|
|
226
|
-
- executor 标注 `[LEVEL-UP]` → 编排器采纳
|
|
227
|
-
- 不主动降级 (安全优先)
|
|
228
|
-
|
|
229
|
-
### 11.6 — 处理 reviewer 结果
|
|
230
|
-
|
|
231
|
-
```
|
|
232
|
-
├── 无 Critical → 更新 accepted 状态 + evidence refs
|
|
233
|
-
└── 有 Critical → 标记返工 task + 失效传播 → 重新审查 (最多 3 轮)
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
**返工失效传播规则:**
|
|
237
|
-
- 返工修改了 contract / schema / shared behavior:
|
|
238
|
-
→ 所有直接和间接依赖 task → `needs_revalidation`
|
|
239
|
-
→ 清空其旧 `evidence_refs`
|
|
240
|
-
→ 已 accepted 则退回到 `checkpointed` 或 `pending_review`
|
|
241
|
-
- 返工只影响局部实现、外部契约未变:
|
|
242
|
-
→ 下游 task 保持现状
|
|
243
|
-
→ 但受影响验证范围必须重跑并刷新 evidence
|
|
244
|
-
- 触发判定: `contract_changed` (executor 运行时报告) 是主触发源
|
|
245
|
-
`invalidate_downstream_on_change` (planner 静态标记) 是预判辅助
|
|
246
|
-
→ executor 报告 `contract_changed: true` → 一定传播
|
|
247
|
-
→ planner 标记但 executor 报告 false → 不传播 (以运行时实际为准)
|
|
248
|
-
|
|
249
|
-
### 11.7 — Phase handoff gate
|
|
250
|
-
|
|
251
|
-
<HARD-GATE id="phase-handoff">
|
|
252
|
-
所有条件必须满足才能进入下一 phase:
|
|
253
|
-
- [ ] 所有 required task = `accepted`
|
|
254
|
-
- [ ] required review = `passed`
|
|
255
|
-
- [ ] critical issues = 0
|
|
256
|
-
- [ ] tests/lint/typecheck 满足计划验证条件
|
|
257
|
-
- [ ] 方向校验: 当前阶段产出是否仍与 plan.md 中的项目目标一致?
|
|
258
|
-
|
|
259
|
-
→ 全部满足 → 自动进入下一阶段
|
|
260
|
-
→ 任一不满足 → 标注问题,尝试修复,3 次失败停止
|
|
261
|
-
→ 方向漂移 → workflow_mode = awaiting_user,展示偏差让用户决定
|
|
262
|
-
</HARD-GATE>
|
|
263
|
-
|
|
264
|
-
### 11.8 — 批量更新 state.json
|
|
265
|
-
|
|
266
|
-
阶段完成后,编排器批量更新 state.json:
|
|
267
|
-
- 更新 phase lifecycle → `accepted`
|
|
268
|
-
- 更新 phase_handoff 信息
|
|
269
|
-
- 归档旧 phase 的 evidence (只保留当前 phase 和上一 phase)
|
|
270
|
-
- 推进 `current_phase` 到下一个 pending phase
|
|
271
|
-
|
|
272
|
-
**规则:** 只有编排器写 state.json,避免并发竞态。
|
|
273
|
-
|
|
274
|
-
### 11.9 — 上下文检查
|
|
275
|
-
|
|
276
|
-
每次派发子代理前和阶段切换时检查上下文健康度:
|
|
277
|
-
|
|
278
|
-
```
|
|
279
|
-
remaining < 35%:
|
|
280
|
-
1. 保存完整状态到 state.json
|
|
281
|
-
2. workflow_mode = awaiting_clear
|
|
282
|
-
3. 输出: "上下文剩余 <35%,已保存进度。请执行 /clear 然后 /gsd:resume 继续"
|
|
283
|
-
4. 停止执行
|
|
284
|
-
|
|
285
|
-
remaining < 25%:
|
|
286
|
-
1. 紧急保存状态到 state.json
|
|
287
|
-
2. workflow_mode = awaiting_clear
|
|
288
|
-
3. 输出: "上下文即将耗尽,已保存进度。请立即执行 /clear 然后 /gsd:resume"
|
|
289
|
-
4. 立即停止
|
|
290
|
-
```
|
|
291
|
-
|
|
163
|
+
编排器必须严格按照该参考文档中的步骤顺序执行:
|
|
164
|
+
加载 phase → 选择 task → 构建上下文 → 派发 executor → 处理结果 → 审查 → phase handoff → 批量更新 → 上下文检查
|
|
292
165
|
</execution_loop>
|
|
293
166
|
|
|
294
|
-
### 依赖门槛语义 (Gate-aware dependencies)
|
|
295
|
-
|
|
296
|
-
```json
|
|
297
|
-
{ "kind": "task", "id": "2.2", "gate": "checkpoint" } // 低风险内部串接
|
|
298
|
-
{ "kind": "task", "id": "2.3", "gate": "accepted" } // 默认安全门槛
|
|
299
|
-
{ "kind": "phase", "id": 2, "gate": "phase_complete" } // 跨 phase 依赖
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
- `checkpoint` — 允许依赖未独立验收的实现检查点;只适合低风险内部串接
|
|
303
|
-
- `accepted` — 默认安全门槛;适合共享行为、公共接口、L2 风险任务
|
|
304
|
-
- `phase_complete` — 跨 phase 依赖;只有 phase handoff 完成后才释放
|
|
305
|
-
- 默认值: 如果 planner 没显式放宽,则依赖按 `accepted` 处理
|
|
306
|
-
|
|
307
167
|
## STEP 12 — 最终报告
|
|
308
168
|
|
|
309
169
|
全部 phase 完成后,输出最终报告:
|
package/commands/stop.md
CHANGED
|
@@ -11,8 +11,9 @@ description: Save current state and pause project execution
|
|
|
11
11
|
|
|
12
12
|
## STEP 1: 保存完整状态
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
读取 `.gsd/state.json`:
|
|
15
15
|
- 如果文件不存在 → 告知用户 "未找到 GSD 项目状态,无需停止",停止
|
|
16
|
+
- 如果 `workflow_mode` 已是 `completed` 或 `failed` → 告知用户 "项目已终结 ({workflow_mode}),无需停止",停止
|
|
16
17
|
|
|
17
18
|
确保以下信息已保存到 state.json:
|
|
18
19
|
- `current_phase` / `current_task` — 当前执行位置
|
package/hooks/context-monitor.js
CHANGED
|
@@ -31,10 +31,10 @@ export function postToolUse(basePath) {
|
|
|
31
31
|
const gsdDir = join(basePath || process.cwd(), '.gsd');
|
|
32
32
|
const health = parseInt(readFileSync(join(gsdDir, '.context-health'), 'utf-8'), 10);
|
|
33
33
|
|
|
34
|
-
if (health
|
|
34
|
+
if (health <= 25) {
|
|
35
35
|
return `🛑 CONTEXT EMERGENCY (${health}% remaining): Save state NOW. Set workflow_mode = awaiting_clear. Tell user to /clear then /gsd:resume.`;
|
|
36
36
|
}
|
|
37
|
-
if (health
|
|
37
|
+
if (health <= 35) {
|
|
38
38
|
return `⚠️ CONTEXT LOW (${health}% remaining): Complete current task, save state, set workflow_mode = awaiting_clear. Tell user to /clear then /gsd:resume.`;
|
|
39
39
|
}
|
|
40
40
|
} catch (err) {
|
|
@@ -9,7 +9,10 @@
|
|
|
9
9
|
// 3. When remaining context drops below thresholds, injects a warning
|
|
10
10
|
// via hookSpecificOutput.additionalContext
|
|
11
11
|
//
|
|
12
|
-
//
|
|
12
|
+
// Only active when GSD project is running (has_gsd = true in bridge file).
|
|
13
|
+
// Non-GSD sessions exit early — Claude's auto-compaction handles context.
|
|
14
|
+
//
|
|
15
|
+
// Thresholds (GSD sessions only):
|
|
13
16
|
// WARNING (remaining <= 35%): Agent should wrap up current task
|
|
14
17
|
// CRITICAL (remaining <= 25%): Agent must stop and save state
|
|
15
18
|
//
|
|
@@ -33,11 +36,13 @@ process.stdin.on('end', () => {
|
|
|
33
36
|
clearTimeout(stdinTimeout);
|
|
34
37
|
try {
|
|
35
38
|
const data = JSON.parse(input);
|
|
36
|
-
const
|
|
39
|
+
const rawSessionId = data.session_id;
|
|
37
40
|
|
|
38
|
-
if (!
|
|
41
|
+
if (!rawSessionId) {
|
|
39
42
|
process.exit(0);
|
|
40
43
|
}
|
|
44
|
+
const sessionId = String(rawSessionId).replace(/[^a-zA-Z0-9_-]/g, '');
|
|
45
|
+
if (!sessionId) process.exit(0);
|
|
41
46
|
|
|
42
47
|
const tmpDir = os.tmpdir();
|
|
43
48
|
const metricsPath = path.join(tmpDir, `gsd-ctx-${sessionId}.json`);
|
|
@@ -56,20 +61,25 @@ process.stdin.on('end', () => {
|
|
|
56
61
|
process.exit(0);
|
|
57
62
|
}
|
|
58
63
|
|
|
59
|
-
// Ignore stale metrics
|
|
64
|
+
// Ignore stale metrics (treat missing timestamp as stale)
|
|
60
65
|
const now = Math.floor(Date.now() / 1000);
|
|
61
|
-
|
|
66
|
+
const metricAge = now - (metrics.timestamp || 0);
|
|
67
|
+
if (metricAge > STALE_SECONDS) {
|
|
68
|
+
process.exit(0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Non-GSD sessions: don't interfere — let Claude's auto-compaction handle it
|
|
72
|
+
const isGsdActive = metrics.has_gsd === true;
|
|
73
|
+
if (!isGsdActive) {
|
|
62
74
|
process.exit(0);
|
|
63
75
|
}
|
|
64
76
|
|
|
65
77
|
// Debounce logic
|
|
66
78
|
const warnPath = path.join(tmpDir, `gsd-ctx-${sessionId}-warned.json`);
|
|
67
79
|
let warnData = { callsSinceWarn: 0, lastLevel: null };
|
|
68
|
-
let firstWarn = true;
|
|
69
80
|
|
|
70
81
|
try {
|
|
71
82
|
warnData = JSON.parse(fs.readFileSync(warnPath, 'utf8'));
|
|
72
|
-
firstWarn = false;
|
|
73
83
|
} catch {
|
|
74
84
|
// No prior warning state — first warning this session
|
|
75
85
|
}
|
|
@@ -79,35 +89,33 @@ process.stdin.on('end', () => {
|
|
|
79
89
|
const isCritical = remaining <= CRITICAL_THRESHOLD;
|
|
80
90
|
const currentLevel = isCritical ? 'critical' : 'warning';
|
|
81
91
|
|
|
82
|
-
//
|
|
92
|
+
// Atomic debounce state write helper
|
|
93
|
+
const writeWarnData = (data) => {
|
|
94
|
+
const tmpFile = warnPath + `.${process.pid}-${Date.now()}.tmp`;
|
|
95
|
+
fs.writeFileSync(tmpFile, JSON.stringify(data));
|
|
96
|
+
fs.renameSync(tmpFile, warnPath);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Severity escalation bypasses debounce (lastLevel null = first warning, always fire)
|
|
83
100
|
const severityEscalated = currentLevel === 'critical' && warnData.lastLevel === 'warning';
|
|
84
|
-
if (
|
|
85
|
-
|
|
101
|
+
if (warnData.lastLevel !== null && warnData.callsSinceWarn < DEBOUNCE_CALLS && !severityEscalated) {
|
|
102
|
+
writeWarnData(warnData);
|
|
86
103
|
process.exit(0);
|
|
87
104
|
}
|
|
88
105
|
|
|
89
106
|
// Reset debounce
|
|
90
107
|
warnData.callsSinceWarn = 0;
|
|
91
108
|
warnData.lastLevel = currentLevel;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
// Use bridge data to avoid extra filesystem check
|
|
95
|
-
const isGsdActive = metrics.has_gsd === true;
|
|
109
|
+
writeWarnData(warnData);
|
|
96
110
|
|
|
97
111
|
let message;
|
|
98
112
|
if (isCritical) {
|
|
99
|
-
message =
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
+ 'set workflow_mode = awaiting_clear via gsd-state-update, and tell user to /clear then /gsd:resume.'
|
|
103
|
-
: `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. `
|
|
104
|
-
+ 'Context is nearly exhausted. Inform the user that context is low and ask how they want to proceed.';
|
|
113
|
+
message = `CONTEXT CRITICAL: Usage at ${usedPct}%. Remaining: ${remaining}%. `
|
|
114
|
+
+ 'Context is nearly exhausted. Complete current task checkpoint immediately, '
|
|
115
|
+
+ 'set workflow_mode = awaiting_clear via gsd-state-update, and tell user to /clear then /gsd:resume.';
|
|
105
116
|
} else {
|
|
106
|
-
message =
|
|
107
|
-
|
|
108
|
-
+ 'Context is getting limited. Avoid starting new complex work. Complete current task then save state.'
|
|
109
|
-
: `CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. `
|
|
110
|
-
+ 'Be aware that context is getting limited. Avoid unnecessary exploration or starting new complex work.';
|
|
117
|
+
message = `CONTEXT WARNING: Usage at ${usedPct}%. Remaining: ${remaining}%. `
|
|
118
|
+
+ 'Context is getting limited. Avoid starting new complex work. Complete current task then save state.';
|
|
111
119
|
}
|
|
112
120
|
|
|
113
121
|
const output = {
|
|
@@ -118,7 +126,8 @@ process.stdin.on('end', () => {
|
|
|
118
126
|
};
|
|
119
127
|
|
|
120
128
|
process.stdout.write(JSON.stringify(output));
|
|
121
|
-
} catch {
|
|
129
|
+
} catch (e) {
|
|
130
|
+
if (process.env.GSD_DEBUG) process.stderr.write(`gsd-context-monitor: ${e.message}\n`);
|
|
122
131
|
process.exit(0);
|
|
123
132
|
}
|
|
124
133
|
});
|
|
@@ -53,7 +53,7 @@ try {
|
|
|
53
53
|
};
|
|
54
54
|
|
|
55
55
|
// Atomic write to avoid corruption
|
|
56
|
-
const tmpPath = settingsPath +
|
|
56
|
+
const tmpPath = settingsPath + `.gsd-tmp-${process.pid}`;
|
|
57
57
|
fs.writeFileSync(tmpPath, JSON.stringify(settings, null, 2) + '\n');
|
|
58
58
|
fs.renameSync(tmpPath, settingsPath);
|
|
59
59
|
} catch {
|