xp-gate 0.5.1
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/adapter-common.sh +192 -0
- package/adapters/cpp.sh +76 -0
- package/adapters/dart.sh +41 -0
- package/adapters/flutter.sh +41 -0
- package/adapters/go.sh +59 -0
- package/adapters/iac.sh +189 -0
- package/adapters/java.sh +191 -0
- package/adapters/kotlin.sh +77 -0
- package/adapters/objectivec.sh +38 -0
- package/adapters/powershell.sh +138 -0
- package/adapters/python.sh +104 -0
- package/adapters/shell.sh +55 -0
- package/adapters/swift.sh +44 -0
- package/adapters/typescript.sh +61 -0
- package/bin/xp-gate.js +157 -0
- package/hooks/adapter-common.sh +192 -0
- package/hooks/pre-commit +1667 -0
- package/hooks/pre-push +395 -0
- package/lib/__tests__/detect-deps.test.js +209 -0
- package/lib/__tests__/doctor.test.js +448 -0
- package/lib/__tests__/download-skill.test.js +281 -0
- package/lib/__tests__/init.test.js +327 -0
- package/lib/__tests__/install-skill.test.js +326 -0
- package/lib/__tests__/migrate.test.js +212 -0
- package/lib/__tests__/rollback.test.js +183 -0
- package/lib/__tests__/ui-detector.test.ts +200 -0
- package/lib/__tests__/uninstall-skill.test.js +189 -0
- package/lib/__tests__/uninstall.test.js +589 -0
- package/lib/__tests__/update-skill.test.js +276 -0
- package/lib/detect-deps.js +157 -0
- package/lib/doctor.js +370 -0
- package/lib/download-skill.js +96 -0
- package/lib/init.js +367 -0
- package/lib/install-skill.js +184 -0
- package/lib/migrate.js +120 -0
- package/lib/rollback.js +78 -0
- package/lib/ui-detector.ts +99 -0
- package/lib/uninstall-skill.js +69 -0
- package/lib/uninstall.js +401 -0
- package/lib/update-skill.js +90 -0
- package/package.json +39 -0
- package/plugins/claude-code/.claude-plugin/plugin.json +21 -0
- package/plugins/claude-code/bin/delphi-review-guard.sh +68 -0
- package/plugins/claude-code/bin/xp-gate-check +47 -0
- package/plugins/claude-code/hooks/hooks.json +37 -0
- package/skills/delphi-review/.delphi-config.json.example +45 -0
- package/skills/delphi-review/AGENTS.md +54 -0
- package/skills/delphi-review/INSTALL.md +152 -0
- package/skills/delphi-review/SKILL.md +371 -0
- package/skills/delphi-review/evals/evals.json +82 -0
- package/skills/delphi-review/opencode.json.delphi.example +56 -0
- package/skills/delphi-review/references/code-walkthrough.md +486 -0
- package/skills/ralph-loop/SKILL.md +330 -0
- package/skills/ralph-loop/evals/evals.json +311 -0
- package/skills/ralph-loop/evolution-history.json +59 -0
- package/skills/ralph-loop/evolution-log.md +16 -0
- package/skills/ralph-loop/references/components/memory.md +55 -0
- package/skills/ralph-loop/references/components/middleware.md +54 -0
- package/skills/ralph-loop/references/components/skill-invocations.md +39 -0
- package/skills/ralph-loop/references/components/system-prompt.md +24 -0
- package/skills/ralph-loop/references/components/tool-descriptions.md +32 -0
- package/skills/ralph-loop/references/phase-2-build-ralph.md +89 -0
- package/skills/ralph-loop/templates/progress-log.md +36 -0
- package/skills/sprint-flow/SKILL.md +600 -0
- package/skills/sprint-flow/evals/evals.json +78 -0
- package/skills/sprint-flow/evolution-history.json +39 -0
- package/skills/sprint-flow/evolution-log.md +23 -0
- package/skills/sprint-flow/references/components/memory.md +87 -0
- package/skills/sprint-flow/references/components/middleware.md +72 -0
- package/skills/sprint-flow/references/components/skill-invocations.md +104 -0
- package/skills/sprint-flow/references/components/system-prompt.md +27 -0
- package/skills/sprint-flow/references/components/tool-descriptions.md +96 -0
- package/skills/sprint-flow/references/phase-0-think.md +115 -0
- package/skills/sprint-flow/references/phase-1-plan.md +178 -0
- package/skills/sprint-flow/references/phase-2-build.md +198 -0
- package/skills/sprint-flow/references/phase-3-review.md +213 -0
- package/skills/sprint-flow/references/phase-4-uat.md +125 -0
- package/skills/sprint-flow/references/phase-5-feedback.md +100 -0
- package/skills/sprint-flow/references/phase-6-ship.md +193 -0
- package/skills/sprint-flow/references/phase-7-land.md +140 -0
- package/skills/sprint-flow/references/phase-8-cleanup.md +192 -0
- package/skills/sprint-flow/templates/emergent-issues-template.md +120 -0
- package/skills/sprint-flow/templates/pain-document-template.md +115 -0
- package/skills/sprint-flow/templates/sprint-summary-template.md +120 -0
- package/skills/test-specification-alignment/AGENTS.md +59 -0
- package/skills/test-specification-alignment/SKILL.md +605 -0
- package/skills/test-specification-alignment/evals/evals.json +75 -0
- package/skills/test-specification-alignment/references/alignment-verification-algorithm.md +493 -0
- package/skills/test-specification-alignment/references/phase2-constraint-enforcement.md +431 -0
- package/skills/test-specification-alignment/references/specification-format.md +348 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Phase 5: FEEDBACK CAPTURE(反馈捕获)
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
记录 Emergent 发现,工程回顾(团队级),持续改进。为 Sprint 2 准备 Pain Document。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 调用 Skills
|
|
10
|
+
|
|
11
|
+
- `learn` (gstack) — 模式记录(个人级)
|
|
12
|
+
- `retro` (gstack) _(新增)_ — 周工程回顾:提交历史、工作模式、代码质量趋势(团队级)
|
|
13
|
+
- `systematic-debugging` (superpowers) _(可选)_ — 根因调试:反馈中的 bug 做根因分析
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 执行步骤
|
|
18
|
+
|
|
19
|
+
### Step 1: 调用 learn skill
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
skill(name="learn", user_message="[Emergent Issues 内容 + Sprint 总结]")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
learn 执行:
|
|
26
|
+
- 记录本次 Sprint 的 emergent 发现
|
|
27
|
+
- 转化为 CLAUDE.md 规则
|
|
28
|
+
- 更新 institutional memory
|
|
29
|
+
|
|
30
|
+
### Step 2: 工程回顾 — 调用 retro(新增 — ISSUE32)
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
skill(name="retro")
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
retro 执行:
|
|
37
|
+
- **提交历史分析**: 本次 Sprint 的 commits、工作模式
|
|
38
|
+
- **代码质量趋势**: 结合 Phase 3 的 benchmark 数据,展示质量变化
|
|
39
|
+
- **团队贡献分解**: 每人贡献比例 + praise + growth areas
|
|
40
|
+
- **改进建议**: 下次 Sprint 的改进点
|
|
41
|
+
|
|
42
|
+
输出: Retro 报告(周级工程回顾)
|
|
43
|
+
|
|
44
|
+
### Step 3: 根因调试(可选 — ISSUE32)
|
|
45
|
+
|
|
46
|
+
**IF Phase 4 发现 bug 或 Phase 3 验证失败**:
|
|
47
|
+
```
|
|
48
|
+
skill(name="systematic-debugging", user_message="[具体 bug 描述]")
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
systematic-debugging 执行 4 阶段:
|
|
52
|
+
1. Investigate(根因调查)
|
|
53
|
+
2. Analyze(分析)
|
|
54
|
+
3. Hypothesize(假设验证)
|
|
55
|
+
4. Implement(修复)
|
|
56
|
+
|
|
57
|
+
**Iron Law**: 无调查 → 不修复
|
|
58
|
+
|
|
59
|
+
### Step 4: 转化 Emergent Issues 为 Sprint 2 Pain Document
|
|
60
|
+
|
|
61
|
+
如果有 emergent issues,转化为新需求:
|
|
62
|
+
```markdown
|
|
63
|
+
# Sprint 2 Pain Document
|
|
64
|
+
|
|
65
|
+
## 来源
|
|
66
|
+
基于 Sprint 1 的 Emergent Issues
|
|
67
|
+
|
|
68
|
+
## Critical Issues (自动进入 Sprint 2)
|
|
69
|
+
| Issue | Sprint 1 描述 | Sprint 2 目标 |
|
|
70
|
+
|-------|--------------|--------------|
|
|
71
|
+
|
|
72
|
+
## Major Issues (询问用户是否纳入)
|
|
73
|
+
| Issue | Sprint 1 描述 | Sprint 2 目标 |
|
|
74
|
+
|-------|--------------|--------------|
|
|
75
|
+
|
|
76
|
+
## Minor Issues (可选纳入)
|
|
77
|
+
| Issue | Sprint 1 描述 | Sprint 2 目标 |
|
|
78
|
+
|-------|--------------|--------------|
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Step 5: 保存 Feedback Log 和 Sprint 2 Pain Document
|
|
82
|
+
|
|
83
|
+
保存到:
|
|
84
|
+
- `<project-root>/.sprint-state/phase-outputs/feedback-log.md`
|
|
85
|
+
- `<project-root>/.sprint-state/phase-outputs/sprint2-pain.md` (如有 emergent issues)
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 暂停点
|
|
90
|
+
|
|
91
|
+
**无** — Phase 5 完成后自动进入 Phase 6
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 输出
|
|
96
|
+
|
|
97
|
+
- Feedback Log (`feedback-log.md`)
|
|
98
|
+
- Retro Report(retro 输出)
|
|
99
|
+
- Sprint 2 Pain Document (`sprint2-pain.md`) — 如果有 emergent issues
|
|
100
|
+
- 进入 Phase 6 自动执行
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Phase 6: SHIP + DEPLOY(发布)
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
结构化分支完成决策、创建 PR、合并部署、监控。生成 Sprint Summary。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 调用 Skills
|
|
10
|
+
|
|
11
|
+
- **`finishing-a-development-branch`** _(新增)_ — 结构化完成流:4 选项决策(merge/PR/discard/keep)
|
|
12
|
+
- `ship` (gstack) — 创建 PR
|
|
13
|
+
- `land-and-deploy` (gstack) — 合并部署
|
|
14
|
+
- `canary` (gstack) — 监控告警
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 执行步骤
|
|
19
|
+
|
|
20
|
+
### Step 0: ⚠️ PHASE 5 硬门禁验证(不可跳过)
|
|
21
|
+
|
|
22
|
+
**必须首先验证 Phase 5 已完成**:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
if [ ! -f ".sprint-state/phase-outputs/feedback-log.md" ]; then
|
|
26
|
+
echo "[BLOCKED] Phase 5 FEEDBACK not completed. feedback-log.md not found."
|
|
27
|
+
echo "Phase 5 must execute: learn + retro → generate feedback-log.md"
|
|
28
|
+
echo "Return to Phase 5 before proceeding to SHIP."
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
echo "✅ Phase 5 FEEDBACK verified — feedback-log.md exists"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**失败**: ⚠️ BLOCK → 返回 Phase 5 执行 learn + retro
|
|
35
|
+
**通过**: 进入 Step 1
|
|
36
|
+
|
|
37
|
+
### Step 1: 最终验证
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
skill(name="verification-before-completion", user_message="最终验证: [MVP v1] 完整性")
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**验证内容**:
|
|
44
|
+
- 测试全部通过
|
|
45
|
+
- Lint 无错误
|
|
46
|
+
- 覆盖率 ≥ 80%
|
|
47
|
+
|
|
48
|
+
**失败**: ⚠️ BLOCK → 回退 Phase 2 修复
|
|
49
|
+
|
|
50
|
+
**通过**: 进入 Step 2
|
|
51
|
+
|
|
52
|
+
### Step 2: 结构化完成决策 — 调用 finishing-a-development-branch(新增 — ISSUE31)
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
skill(name="finishing-a-development-branch")
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
finishing-a-development-branch 执行 4 选项决策:
|
|
59
|
+
|
|
60
|
+
| 选项 | 行为 | 适用场景 |
|
|
61
|
+
|------|------|---------|
|
|
62
|
+
| **merge** | 直接合并到主分支 | 小功能、确信变更正确 |
|
|
63
|
+
| **PR** | 创建 PR 等待 review | 标准流程、需要团队审核 |
|
|
64
|
+
| **discard** | 删除分支、丢弃变更 | 实验失败、不再需要 |
|
|
65
|
+
| **keep** | 保留分支待后续处理 | 半成品、暂时搁置 |
|
|
66
|
+
|
|
67
|
+
**决策逻辑**:
|
|
68
|
+
```
|
|
69
|
+
IF 测试全部通过 + 用户确信 → merge → land-and-deploy
|
|
70
|
+
IF 测试全部通过 + 需要 review → PR → ship → 等待 review → land-and-deploy
|
|
71
|
+
IF 实验失败 → discard → 清理 worktree → 结束 Sprint
|
|
72
|
+
IF 半成品 → keep → 保留分支 → 结束 Sprint
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**worktree 清理**: finishing-a-development-branch 自动清理不再需要的 worktree。
|
|
76
|
+
|
|
77
|
+
### Step 3: 用户确认合并/发布
|
|
78
|
+
|
|
79
|
+
提示用户:
|
|
80
|
+
```
|
|
81
|
+
⚠️ 分支完成决策:
|
|
82
|
+
|
|
83
|
+
- [merge] → 直接合并 + 部署
|
|
84
|
+
- [PR] → PR 已创建: [URL],请确认合并
|
|
85
|
+
- [discard] → 清理分支,结束 Sprint
|
|
86
|
+
- [keep] → 保留分支,待后续处理
|
|
87
|
+
|
|
88
|
+
请确认选项:
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**discard/keep**: 进入 Step 5(清理 + 生成 Summary)
|
|
92
|
+
|
|
93
|
+
**merge/PR 确认**: 进入 Step 4
|
|
94
|
+
|
|
95
|
+
### Step 3a: 调用 ship skill(PR 路径)
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
skill(name="ship", user_message="[MVP v1 代码]")
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
ship 执行:
|
|
102
|
+
- 检测 base branch
|
|
103
|
+
- run tests
|
|
104
|
+
- review diff
|
|
105
|
+
- bump VERSION
|
|
106
|
+
- update CHANGELOG
|
|
107
|
+
- commit, push, create PR
|
|
108
|
+
|
|
109
|
+
**输出**: PR URL
|
|
110
|
+
|
|
111
|
+
⚠️ **暂停点**: PR 创建后等待用户确认合并
|
|
112
|
+
|
|
113
|
+
### Step 4: 调用 land-and-deploy(用户确认后)
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
skill(name="land-and-deploy", user_message="--pr [PR URL]")
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
执行:
|
|
120
|
+
- merge PR(或直接合并当前分支)
|
|
121
|
+
- wait for CI
|
|
122
|
+
- verify production health
|
|
123
|
+
|
|
124
|
+
**如果失败**:
|
|
125
|
+
- ⚠️ 暂停等待用户处理
|
|
126
|
+
|
|
127
|
+
**如果成功**:
|
|
128
|
+
- 自动进入 Step 5
|
|
129
|
+
|
|
130
|
+
### Step 5: 调用 canary skill
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
skill(name="canary", user_message="--url [production URL]")
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
执行:
|
|
137
|
+
- post-deploy monitoring
|
|
138
|
+
- console errors detection
|
|
139
|
+
- performance regression check
|
|
140
|
+
|
|
141
|
+
**如果发现异常**:
|
|
142
|
+
- 回退或修复
|
|
143
|
+
|
|
144
|
+
**如果正常**:
|
|
145
|
+
- 进入 Step 6
|
|
146
|
+
|
|
147
|
+
### Step 6: 生成 Sprint Summary
|
|
148
|
+
|
|
149
|
+
使用模板:`@templates/sprint-summary-template.md`
|
|
150
|
+
|
|
151
|
+
包含:
|
|
152
|
+
- Sprint ID
|
|
153
|
+
- 执行阶段统计
|
|
154
|
+
- 分支完成决策结果(merge/PR/discard/keep)
|
|
155
|
+
- emergent 发现统计
|
|
156
|
+
- Sprint 2 是否需要
|
|
157
|
+
|
|
158
|
+
### Step 7: 保存 Sprint Summary
|
|
159
|
+
|
|
160
|
+
保存到 `<project-root>/.sprint-state/phase-outputs/sprint-summary.md`
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 暂停点
|
|
165
|
+
|
|
166
|
+
| 暂停点 | 触发条件 | 用户操作 |
|
|
167
|
+
|--------|---------|---------|
|
|
168
|
+
| finishing-a-development-branch | 4 选项决策 | 用户选择 merge/PR/discard/keep |
|
|
169
|
+
| ship PR 创建(PR 路径) | PR 已创建 | 用户确认合并 |
|
|
170
|
+
| land-and-deploy 失败 | CI 或部署失败 | 用户处理问题 |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Sprint 2 提示
|
|
175
|
+
|
|
176
|
+
如果 Sprint Summary 显示有 emergent issues:
|
|
177
|
+
```
|
|
178
|
+
Sprint 完成!发现 N 个 emergent issues。
|
|
179
|
+
|
|
180
|
+
是否开始 Sprint 2?
|
|
181
|
+
- "开始 Sprint 2" → 使用 sprint2-pain.md 重新进入 Phase 0
|
|
182
|
+
- "结束" → 记录未解决的问题,结束流程
|
|
183
|
+
|
|
184
|
+
Critical issues 将自动进入 Sprint 2。
|
|
185
|
+
Major/Minor issues 需您确认是否纳入。
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 输出
|
|
191
|
+
|
|
192
|
+
- Sprint Summary (`sprint-summary.md`)
|
|
193
|
+
- Sprint 完成(或 Sprint 2 开始)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Phase 7: LAND(合并 + 部署)
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
自动合并 PR、等待 CI、执行部署、运行 Canary Health Check、失败时自动回滚。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 输入
|
|
10
|
+
|
|
11
|
+
- Phase 6 SHIP 输出的 PR URL
|
|
12
|
+
- 或 `--phase ship-only` 时手动提供 PR 编号
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 调用 Skills
|
|
17
|
+
|
|
18
|
+
- `land-and-deploy` (gstack) — 合并部署
|
|
19
|
+
- `canary` (gstack) — 监控告警
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 执行步骤
|
|
24
|
+
|
|
25
|
+
### Step 1: 合并 PR
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
gh pr merge <PR_NUMBER> --squash
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**失败**: 输出 `[ERROR] PR merge failed` → 询问用户是否重试或手动处理
|
|
32
|
+
|
|
33
|
+
**成功**: 进入 Step 2
|
|
34
|
+
|
|
35
|
+
### Step 2: 等待 CI 完成
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Poll CI checks every 10s, timeout after 10min
|
|
39
|
+
gh pr checks <PR_NUMBER> --watch --interval 10
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**超时 (10min)**: 输出 `[WARN] CI checks timed out after 10min` → 询问用户是否继续
|
|
43
|
+
|
|
44
|
+
**CI 失败**: 输出 `[ERROR] CI checks failed, aborting deployment` → BLOCK
|
|
45
|
+
|
|
46
|
+
**CI 成功**: 进入 Step 3
|
|
47
|
+
|
|
48
|
+
### Step 3: 等待 Deploy 完成
|
|
49
|
+
|
|
50
|
+
**条件**: 项目已配置部署平台(Fly.io/Vercel/Render/GitHub Actions 等)
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Poll deploy status every 10s, timeout after 10min
|
|
54
|
+
gh pr checks <PR_NUMBER> --watch --interval 10
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**无部署配置**: 跳过 Step 3-4,直接进入 Phase 8
|
|
58
|
+
|
|
59
|
+
**部署成功**: 进入 Step 4
|
|
60
|
+
|
|
61
|
+
**部署失败**: 进入 Step 5(自动回滚)
|
|
62
|
+
|
|
63
|
+
### Step 4: Canary Health Check
|
|
64
|
+
|
|
65
|
+
**健康检查端点**:
|
|
66
|
+
- 默认:项目根路径 `/`
|
|
67
|
+
- 自定义:`$HEALTH_CHECK_URL` 环境变量或 `.sprint-load-test.yaml` 中的 `health_endpoint`
|
|
68
|
+
|
|
69
|
+
**SLA 指标**:
|
|
70
|
+
| 指标 | 阈值 | 说明 |
|
|
71
|
+
|------|------|------|
|
|
72
|
+
| HTTP 响应状态 | 200 | 服务正常运行 |
|
|
73
|
+
| 错误率 | <1% | 5 分钟窗口内 5xx 错误占比 |
|
|
74
|
+
| p99 响应时间 | <2s | 99 分位响应时间 |
|
|
75
|
+
| 超时总时长 | 5min | health check 最长等待时间 |
|
|
76
|
+
| Polling 间隔 | 10s | 健康检查轮询频率 |
|
|
77
|
+
|
|
78
|
+
**实现**:
|
|
79
|
+
```bash
|
|
80
|
+
START_TIME=$(date +%s)
|
|
81
|
+
while [ $(( $(date +%s) - START_TIME )) -lt 300 ]; do
|
|
82
|
+
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_CHECK_URL" 2>/dev/null || echo "000")
|
|
83
|
+
if [ "$RESPONSE" = "200" ]; then
|
|
84
|
+
echo "✅ Canary health check passed: HTTP 200"
|
|
85
|
+
break
|
|
86
|
+
fi
|
|
87
|
+
echo "[WARN] Canary health check returned HTTP $RESPONSE, retrying in 10s..."
|
|
88
|
+
sleep 10
|
|
89
|
+
done
|
|
90
|
+
|
|
91
|
+
if [ "$RESPONSE" != "200" ]; then
|
|
92
|
+
echo "[ERROR] Canary health check failed after 5min timeout"
|
|
93
|
+
# Auto-rollback
|
|
94
|
+
LAST_MERGE_COMMIT=$(git log -1 --oneline --format="%H" 2>/dev/null)
|
|
95
|
+
git revert "$LAST_MERGE_COMMIT" --no-edit
|
|
96
|
+
echo "[ROLLBACK] Auto-reverted merge commit: $LAST_MERGE_COMMIT"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**通过**: 进入 Phase 8 CLEANUP
|
|
102
|
+
|
|
103
|
+
**失败**: 自动回滚 → 输出 `[ERROR] Deploy failed, auto-rolled back merge` → Phase 8 仍执行(清理 worktree)
|
|
104
|
+
|
|
105
|
+
### Step 5: 自动回滚(部署失败时)
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Revert the last merge commit
|
|
109
|
+
LAST_MERGE_COMMIT=$(git log -1 --oneline --format="%H" 2>/dev/null)
|
|
110
|
+
git revert "$LAST_MERGE_COMMIT" --no-edit
|
|
111
|
+
echo "[ERROR] Deploy failed, auto-rolled back merge commit: $LAST_MERGE_COMMIT"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 输出
|
|
117
|
+
|
|
118
|
+
- 部署状态: success | failure | skipped
|
|
119
|
+
- Canary 报告: SLA 指标是否达标
|
|
120
|
+
- 如果自动回滚:reverted commit hash
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 暂停点
|
|
125
|
+
|
|
126
|
+
- **CI 超时**: 用户确认是否继续等待或跳过
|
|
127
|
+
- **部署失败**: 用户确认自动回滚或手动处理
|
|
128
|
+
- **Canary 失败**: 用户确认回滚或保留状态调查
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 错误处理
|
|
133
|
+
|
|
134
|
+
| 错误场景 | 处理 |
|
|
135
|
+
|---------|------|
|
|
136
|
+
| PR 合并冲突 | 输出错误 → 询问用户是否 rebase 或手动解决 |
|
|
137
|
+
| CI 超时 (10min) | 输出警告 → 询问是否继续或跳过部署 |
|
|
138
|
+
| 部署失败 | 自动 `git revert` merge commit + 输出错误 |
|
|
139
|
+
| Canary 失败 | 自动回滚 + 输出 `[ERROR] Canary health check failed` |
|
|
140
|
+
| 无部署配置 | 跳过部署/canary,仅 merge + CI checks |
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# Phase 8: CLEANUP(清理 + 总结)
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
自动清理 worktree、更新 sprint-state.json、输出 Sprint Summary、处理 emergent issues。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 输入
|
|
10
|
+
|
|
11
|
+
- Phase 7 LAND 完成后的部署状态
|
|
12
|
+
- 或 Phase 6 Option 1(本地 Merge)后的完成状态
|
|
13
|
+
- `.sprint-state/sprint-state.json`(包含 worktree 路径信息)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 执行步骤
|
|
18
|
+
|
|
19
|
+
### Step 1: 检测 worktree 是否存在
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Read worktree path from sprint-state.json
|
|
23
|
+
WORKTREE_PATH=$(node -e "const fs=require('fs'); const state=JSON.parse(fs.readFileSync('.sprint-state/sprint-state.json','utf8')); console.log(state.isolation?.worktree_path || '')" 2>/dev/null)
|
|
24
|
+
|
|
25
|
+
if [ -z "$WORKTREE_PATH" ]; then
|
|
26
|
+
echo "[CLEANUP] No worktree path found in sprint-state.json — skipping cleanup"
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
if [ ! -d "$WORKTREE_PATH" ]; then
|
|
31
|
+
echo "[CLEANUP] Worktree already removed: $WORKTREE_PATH"
|
|
32
|
+
HAS_WORKTREE=false
|
|
33
|
+
else
|
|
34
|
+
HAS_WORKTREE=true
|
|
35
|
+
fi
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**跳过**: `--no-isolate` 路径(无 worktree 可清理)或 worktree 已不存在
|
|
39
|
+
|
|
40
|
+
**存在**: 进入 Step 2
|
|
41
|
+
|
|
42
|
+
### Step 2: 删除 worktree(带重试机制)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
MAX_RETRIES=3
|
|
46
|
+
RETRY_COUNT=0
|
|
47
|
+
REMOVED=false
|
|
48
|
+
|
|
49
|
+
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
|
|
50
|
+
if git worktree remove "$WORKTREE_PATH" 2>/dev/null; then
|
|
51
|
+
REMOVED=true
|
|
52
|
+
echo "[CLEANUP] ✅ Worktree removed: $WORKTREE_PATH"
|
|
53
|
+
break
|
|
54
|
+
else
|
|
55
|
+
RETRY_COUNT=$((RETRY_COUNT + 1))
|
|
56
|
+
if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then
|
|
57
|
+
echo "[WARN] Worktree remove failed, retry $RETRY_COUNT/$MAX_RETRIES in 1s..."
|
|
58
|
+
sleep 1
|
|
59
|
+
fi
|
|
60
|
+
fi
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
if [ "$REMOVED" = "false" ]; then
|
|
64
|
+
echo "[WARN] Failed to remove worktree after $MAX_RETRIES attempts."
|
|
65
|
+
echo "[WARN] Please manually run: git worktree remove $WORKTREE_PATH"
|
|
66
|
+
fi
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**成功**: 进入 Step 3
|
|
70
|
+
|
|
71
|
+
**失败**: 输出警告 + 手动命令提示 → 进入 Step 3
|
|
72
|
+
|
|
73
|
+
### Step 3: 检测残留目录
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
if [ -d "$WORKTREE_PATH" ]; then
|
|
77
|
+
echo "[WARN] ⚠️ Residual worktree directory detected: $WORKTREE_PATH"
|
|
78
|
+
echo "[WARN] Please manually remove it if needed"
|
|
79
|
+
else
|
|
80
|
+
echo "[CLEANUP] ✅ No residual directory detected"
|
|
81
|
+
fi
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**残留**: 输出警告
|
|
85
|
+
|
|
86
|
+
**干净**: 输出成功消息 → 进入 Step 4
|
|
87
|
+
|
|
88
|
+
### Step 4: 更新 sprint-state.json
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
node -e "
|
|
92
|
+
const fs = require('fs');
|
|
93
|
+
const statePath = '.sprint-state/sprint-state.json';
|
|
94
|
+
const state = JSON.parse(fs.readFileSync(statePath, 'utf8'));
|
|
95
|
+
state.phase = 8;
|
|
96
|
+
state.status = 'merged';
|
|
97
|
+
if (!state.metrics) state.metrics = {};
|
|
98
|
+
state.metrics.completed_at = new Date().toISOString();
|
|
99
|
+
fs.writeFileSync(statePath, JSON.stringify(state, null, 2) + '\n');
|
|
100
|
+
console.log('[CLEANUP] sprint-state.json updated → phase: 8, status: merged');
|
|
101
|
+
"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Step 5: 输出 Sprint Summary
|
|
105
|
+
|
|
106
|
+
根据 `.sprint-state/phase-outputs/sprint-summary-template.md` 生成总结:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
110
|
+
SPRINT SUMMARY
|
|
111
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
112
|
+
Sprint ID: sprint-2026-05-28-01
|
|
113
|
+
Status: merged
|
|
114
|
+
Phase: 8 (CLEANUP complete)
|
|
115
|
+
|
|
116
|
+
Timeline:
|
|
117
|
+
- Phase -1 ISOLATE: ✅
|
|
118
|
+
- Phase 0 THINK: ✅
|
|
119
|
+
- Phase 1 PLAN: ✅
|
|
120
|
+
- Phase 2 BUILD: ✅
|
|
121
|
+
- Phase 3 REVIEW: ✅
|
|
122
|
+
- Phase 4 ACCEPTANCE: ✅
|
|
123
|
+
- Phase 5 FEEDBACK: ✅
|
|
124
|
+
- Phase 6 SHIP: ✅
|
|
125
|
+
- Phase 7 LAND: ✅ (deploy: success/failure/skipped)
|
|
126
|
+
- Phase 8 CLEANUP: ✅ (worktree: clean/residual)
|
|
127
|
+
|
|
128
|
+
Emergent Issues: <N> found
|
|
129
|
+
- IF Critical → Sprint 2 auto-triggered
|
|
130
|
+
- IF Major/Minor → Ask user
|
|
131
|
+
|
|
132
|
+
Worktree cleaned: <yes/no/manual>
|
|
133
|
+
PR merged: <PR_URL>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Step 6: 处理 Emergent Issues
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Check for emergent issues file
|
|
140
|
+
if [ -f ".sprint-state/phase-outputs/emergent-issues.md" ]; then
|
|
141
|
+
ISSUE_COUNT=$(grep -c "^## " ".sprint-state/phase-outputs/emergent-issues.md" 2>/dev/null || echo "0")
|
|
142
|
+
|
|
143
|
+
if [ "$ISSUE_COUNT" -gt 0 ]; then
|
|
144
|
+
HAS_CRITICAL=$(grep -i "critical" ".sprint-state/phase-outputs/emergent-issues.md" 2>/dev/null || echo "")
|
|
145
|
+
|
|
146
|
+
if [ -n "$HAS_CRITICAL" ]; then
|
|
147
|
+
echo ""
|
|
148
|
+
echo "⚠️ Critical emergent issues detected — auto-triggering Sprint 2"
|
|
149
|
+
echo "Sprint 2 Pain Document will be generated from emergent-issues.md"
|
|
150
|
+
# Auto-trigger Sprint 2
|
|
151
|
+
else
|
|
152
|
+
echo ""
|
|
153
|
+
echo "ℹ️ $ISSUE_COUNT emergent issue(s) found — ask user about Sprint 2"
|
|
154
|
+
fi
|
|
155
|
+
else
|
|
156
|
+
echo ""
|
|
157
|
+
echo "✅ No emergent issues — sprint completed successfully"
|
|
158
|
+
fi
|
|
159
|
+
else
|
|
160
|
+
echo ""
|
|
161
|
+
echo "✅ No emergent issues — sprint completed successfully"
|
|
162
|
+
fi
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 输出
|
|
168
|
+
|
|
169
|
+
- Cleanup Report:
|
|
170
|
+
- Worktree removed: ✅ / ⚠️ residual / ❌ manual required
|
|
171
|
+
- sprint-state.json: phase 8, status merged
|
|
172
|
+
- Sprint Summary
|
|
173
|
+
- IF emergent issues with Critical → Sprint 2 auto-trigger
|
|
174
|
+
- IF emergent issues without Critical → ask user
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 暂停点
|
|
179
|
+
|
|
180
|
+
- **Worktree 手动清理**: 用户确认已手动清理或保留残留
|
|
181
|
+
- **Sprint 2 决策**: 用户确认是否开始 Sprint 2(仅 Major/Minor issues 时)
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 错误处理
|
|
186
|
+
|
|
187
|
+
| 错误场景 | 处理 |
|
|
188
|
+
|---------|------|
|
|
189
|
+
| worktree 路径不存在于 sprint-state.json | 跳过清理,输出警告 |
|
|
190
|
+
| `git worktree remove` 失败 | 重试 3 次 → 输出手动命令提示 |
|
|
191
|
+
| 残留目录检测 | 输出警告,用户决策 |
|
|
192
|
+
| sprint-state.json 更新失败 | 输出错误,不影响最终完成状态 |
|