@boyingliu01/xp-gate 0.8.19 → 0.8.21
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/lib/init.js +2 -2
- package/lib/install-skill.js +13 -4
- package/lib/principles.js +5 -0
- package/mock-policy/AGENTS.md +3 -3
- package/mutation/AGENTS.md +3 -3
- package/package.json +1 -1
- package/plugins/claude-code/.claude-plugin/plugin.json +1 -1
- package/plugins/claude-code/skills/delphi-review/AGENTS.md +3 -3
- package/plugins/claude-code/skills/sprint-flow/AGENTS.md +3 -3
- package/plugins/claude-code/skills/sprint-flow/SKILL.md +135 -1091
- package/plugins/claude-code/skills/sprint-flow/references/orchestration-rules.md +333 -0
- package/plugins/claude-code/skills/sprint-flow/references/phase-1-plan.md +17 -46
- package/plugins/claude-code/skills/sprint-flow/references/phase-2-build.md +4 -193
- package/plugins/claude-code/skills/sprint-flow/references/phase-3-review.md +13 -30
- package/plugins/claude-code/skills/sprint-flow/references/phase-6-ship.md +4 -181
- package/plugins/claude-code/skills/sprint-flow/references/phase-7-land.md +4 -135
- package/plugins/claude-code/skills/sprint-flow/references/phase-8-cleanup.md +4 -187
- package/plugins/claude-code/skills/sprint-flow/references/phase-minus-1-isolate.md +58 -0
- package/plugins/claude-code/skills/test-specification-alignment/AGENTS.md +3 -3
- package/plugins/opencode/package.json +1 -1
- package/plugins/opencode/skills/delphi-review/AGENTS.md +3 -3
- package/plugins/opencode/skills/sprint-flow/AGENTS.md +3 -3
- package/plugins/opencode/skills/sprint-flow/SKILL.md +135 -1091
- package/plugins/opencode/skills/sprint-flow/references/orchestration-rules.md +333 -0
- package/plugins/opencode/skills/sprint-flow/references/phase-1-plan.md +17 -46
- package/plugins/opencode/skills/sprint-flow/references/phase-2-build.md +4 -193
- package/plugins/opencode/skills/sprint-flow/references/phase-3-review.md +13 -30
- package/plugins/opencode/skills/sprint-flow/references/phase-6-ship.md +4 -181
- package/plugins/opencode/skills/sprint-flow/references/phase-7-land.md +4 -135
- package/plugins/opencode/skills/sprint-flow/references/phase-8-cleanup.md +4 -187
- package/plugins/opencode/skills/sprint-flow/references/phase-minus-1-isolate.md +58 -0
- package/plugins/opencode/skills/test-specification-alignment/AGENTS.md +3 -3
- package/plugins/qoder/bin/xp-gate-check +5 -1
- package/plugins/qoder/skills/delphi-review/AGENTS.md +3 -3
- package/plugins/qoder/skills/sprint-flow/AGENTS.md +3 -3
- package/plugins/qoder/skills/test-specification-alignment/AGENTS.md +3 -3
- package/principles/AGENTS.md +3 -3
- package/skills/delphi-review/AGENTS.md +3 -3
- package/skills/sprint-flow/AGENTS.md +3 -3
- package/skills/sprint-flow/SKILL.md +135 -1091
- package/skills/sprint-flow/references/orchestration-rules.md +333 -0
- package/skills/sprint-flow/references/phase-1-plan.md +17 -46
- package/skills/sprint-flow/references/phase-2-build.md +4 -193
- package/skills/sprint-flow/references/phase-3-review.md +13 -30
- package/skills/sprint-flow/references/phase-6-ship.md +4 -181
- package/skills/sprint-flow/references/phase-7-land.md +4 -135
- package/skills/sprint-flow/references/phase-8-cleanup.md +4 -187
- package/skills/sprint-flow/references/phase-minus-1-isolate.md +58 -0
- package/skills/test-specification-alignment/AGENTS.md +3 -3
|
@@ -78,69 +78,8 @@ workflow_steps:
|
|
|
78
78
|
- `--with-performance`: Enable load/stress testing (backend projects)
|
|
79
79
|
- `--mode <build_mode>`: Phase 2 build mode. Default = ralph-loop (REQ-level iteration, token-efficient). parallel = legacy all-at-once mode
|
|
80
80
|
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## Scope
|
|
84
|
-
|
|
85
|
-
**What this skill does**:
|
|
86
|
-
- Automates the full 7-phase development pipeline from requirement to production
|
|
87
|
-
- Integrates existing skills (brainstorming, autoplan, delphi-review, TDD, ship, etc.)
|
|
88
|
-
- Enforces quality gates and hard transitions between phases
|
|
89
|
-
- Captures emergent requirements and feedback for continuous improvement
|
|
90
|
-
|
|
91
|
-
**What this skill does NOT do**:
|
|
92
|
-
- Replace individual skills — users can still call `delphi-review`, `test-driven-development`, etc. directly
|
|
93
|
-
- Bypass quality gates or user confirmations at critical checkpoints
|
|
94
|
-
- Automatically merge to main without explicit user approval (Phase 6/7)
|
|
95
|
-
- Handle non-development tasks (bug reports, code review requests without implementation, questions)
|
|
96
|
-
|
|
97
|
-
**Applicable scenarios**:
|
|
98
|
-
- New feature development
|
|
99
|
-
- Module creation
|
|
100
|
-
- End-to-end implementation of user stories
|
|
101
|
-
- Sprint-level planning and execution
|
|
102
|
-
|
|
103
|
-
**Not applicable**:
|
|
104
|
-
- Single bug fixes (use `/investigate` or direct TDD)
|
|
105
|
-
- Code review requests (use `/review` or `delphi-review --mode code-walkthrough`)
|
|
106
|
-
- Architecture questions (use `/plan-eng-review`)
|
|
107
|
-
- Simple explanations or documentation requests
|
|
108
|
-
|
|
109
|
-
## Examples
|
|
110
|
-
|
|
111
|
-
### Example 1: Full feature sprint
|
|
112
|
-
User: `/sprint-flow "开发用户认证模块,支持登录、登出、权限检查"`
|
|
113
|
-
Expected behavior: create/verify isolated worktree, run estimate, produce design/spec, build with TDD, review, wait for manual acceptance, then prepare ship path.
|
|
114
|
-
Expected output: phase summaries, `specification.yaml`, verification evidence, and PR URL if the user chooses PR shipping.
|
|
115
|
-
|
|
116
|
-
### Example 2: Stop after planning
|
|
117
|
-
User: `/sprint-flow "开发 REST API" --stop-at plan`
|
|
118
|
-
Expected behavior: complete isolate/estimate/think/plan, produce specification and slices, then stop without implementation.
|
|
119
|
-
Expected output: phase-1 summary and clear next command to resume from build.
|
|
120
|
-
|
|
121
|
-
### Example 3: Should not trigger
|
|
122
|
-
User: "解释一下这个函数为什么报错"
|
|
123
|
-
Expected behavior: do not run sprint-flow; route to investigation/explanation instead.
|
|
124
|
-
|
|
125
81
|
# Sprint Flow Skill
|
|
126
82
|
|
|
127
|
-
## Scope
|
|
128
|
-
|
|
129
|
-
**In Scope:**
|
|
130
|
-
- Sprint 全流程编排(Phase -1 ISOLATE 到 Phase 8 CLEANUP)
|
|
131
|
-
- Git worktree 隔离与环境准备
|
|
132
|
-
- 自动规模评估与流程路由(轻量/标准/复杂)
|
|
133
|
-
- 多 Skill 串联调用(brainstorming, autoplan, delphi-review, TDD, ralph-loop 等)
|
|
134
|
-
- 关键节点暂停与用户决策
|
|
135
|
-
- 状态持久化(sprint-state.json)
|
|
136
|
-
- 多平台适配(Claude Code, OpenCode, Qoder)
|
|
137
|
-
|
|
138
|
-
**Out of Scope:**
|
|
139
|
-
- Does NOT handle internal Skill implementation (each Skill remains independent)
|
|
140
|
-
- Does NOT write business code
|
|
141
|
-
- Does NOT configure CI/CD pipelines (project's own responsibility)
|
|
142
|
-
- Does NOT deploy to production (only up to PR creation + merge)
|
|
143
|
-
|
|
144
83
|
## Security Notes
|
|
145
84
|
|
|
146
85
|
- sprint-flow **不执行任何破坏性命令**(no `rm -rf`, `git push --force`, `DROP TABLE` 等)
|
|
@@ -174,53 +113,34 @@ Expected behavior: do not run sprint-flow; route to investigation/explanation in
|
|
|
174
113
|
调用 `/sprint-flow "[需求描述]"` 后,自动执行以下流程:
|
|
175
114
|
|
|
176
115
|
```
|
|
177
|
-
Phase -1: ISOLATE →
|
|
178
|
-
|
|
179
|
-
Phase
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
Phase
|
|
184
|
-
Phase
|
|
185
|
-
|
|
186
|
-
Phase
|
|
187
|
-
|
|
188
|
-
→ test-driven-development (RED→GREEN→REFACTOR)
|
|
189
|
-
→ freeze (盲评隔离) → requesting-code-review → unfreeze
|
|
190
|
-
→ verification-before-completion → ⚠️ (验证失败超过 max 3)
|
|
191
|
-
→ MVP v1
|
|
192
|
-
Phase 3: REVIEW → delphi-review --mode code-walkthrough → test-specification-alignment
|
|
193
|
-
→ browse → ⚠️ (验证失败)
|
|
194
|
-
Phase 4: ⚠️ ⚠️ USER ACCEPTANCE → 必须人工验收 → Emergent Issues List
|
|
195
|
-
Phase 5: FEEDBACK → learn + retro(工程回顾)+ systematic-debugging(根因调试)
|
|
196
|
-
Phase 6: SHIP → finishing-a-development-branch (4 选项) → ship (PR 路径)
|
|
197
|
-
→ PR 创建完成
|
|
198
|
-
Phase 7: ⚠️ LAND → land-and-deploy → merge PR + wait CI + canary health check
|
|
199
|
-
→ deploy verification + auto-rollback on failure
|
|
200
|
-
Phase 8: CLEANUP → git worktree remove + branch delete + sprint-state.json update → status: merged
|
|
201
|
-
→ Sprint Summary → IF emergent issues → Sprint 2
|
|
116
|
+
Phase -1: ISOLATE → 保护分支检测→强制worktree
|
|
117
|
+
Phase -0.5: AUTO-ESTIMATE → 展示评估结果→用户确认路由(轻量/标准/复杂)
|
|
118
|
+
Phase 0: THINK → brainstorming → ⚠️ HARD-GATE(设计未批准→阻断)
|
|
119
|
+
Phase 1: PLAN → autoplan → delphi-review(等待APPROVED)→specification.yaml
|
|
120
|
+
Phase 2: BUILD → GITHOOKS-GATE → ralph-loop/TDD → freeze/盲评→verification
|
|
121
|
+
Phase 3: REVIEW → delphi-review --mode code-walkthrough → test-alignment → browse
|
|
122
|
+
Phase 4: ⚠️ USER ACCEPTANCE → 必须人工验收 → Emergent Issues List
|
|
123
|
+
Phase 5: FEEDBACK → learn + retro + systematic-debugging
|
|
124
|
+
Phase 6: SHIP → finishing-a-development-branch → ship(PR)
|
|
125
|
+
Phase 7: ⚠️ LAND → land-and-deploy → merge + CI + canary
|
|
126
|
+
Phase 8: CLEANUP → worktree remove + branch delete + sprint summary
|
|
202
127
|
```
|
|
203
128
|
|
|
204
129
|
---
|
|
205
130
|
|
|
206
131
|
## 暂停点设计(不是随时停,而是设计明确的暂停点)
|
|
207
132
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
| **Phase 5** | ⚠️ **必须执行,不可跳过 (HARD-GATE)** | Phase 5 完成后进入 Phase 6 | `feedback-log.md` 生成后自动继续 |
|
|
220
|
-
| Phase 6 | finishing-a-development-branch | 用户选择 4 选项 (merge/PR/discard/keep) | 确认后自动继续 |
|
|
221
|
-
| Phase 6 | ship PR 创建(PR 路径)| 用户确认合并 | 合并后自动继续 |
|
|
222
|
-
| **Phase 7** | **land-and-deploy 完成/失败** | **用户确认合并结果 / 处理部署失败** | **确认/修复后继续** |
|
|
223
|
-
| **Phase 8** | **worktree 清理完成/失败** | **用户确认清理 / 手动处理残留** | **确认后结束流程** |
|
|
133
|
+
- **Phase -1**: 保护分支强制隔离 → 输出警告或自动创建 worktree → 自动恢复
|
|
134
|
+
- **Phase -0.5**: AUTO-ESTIMATE 结果展示 → 用户确认 → 按路由继续
|
|
135
|
+
- **Phase 0**: 设计未 APPROVED (HARD-GATE) → 用户修改 → APPROVED 后继续
|
|
136
|
+
- **Phase 1**: autoplan taste_decisions → 用户确认 / delphi-review 未APPROVED → 修复→APPROVED
|
|
137
|
+
- **Phase 2**: 验证失败>max3 → 用户决策修复/放弃 / 成本超阈值 → 用户确认
|
|
138
|
+
- **Phase 3**: browse 发现问题 → 回退 Phase 2(不暂停)
|
|
139
|
+
- **Phase 4**: ⚠️ 必须人工验收 → 用户确认后继续
|
|
140
|
+
- **Phase 5**: ⚠️ 不可跳过 (HARD-GATE) → feedback-log.md 生成后自动继续
|
|
141
|
+
- **Phase 6**: finishing-a-development-branch(4选项) → 确认; ship PR → 用户确认合并
|
|
142
|
+
- **Phase 7**: land-and-deploy 完成/失败 → 用户确认合并结果/处理部署失败
|
|
143
|
+
- **Phase 8**: worktree 清理完成/失败 → 用户确认 → 结束流程
|
|
224
144
|
|
|
225
145
|
---
|
|
226
146
|
|
|
@@ -231,7 +151,7 @@ Phase 8: CLEANUP → git worktree remove + branch delete + sprint-state.json upd
|
|
|
231
151
|
| 1 | **-1** | **ISOLATE** | Detect protected branch → Create git worktree → Setup project → Validate .gitignore → Record sprint state | Worktree path |
|
|
232
152
|
| 2 | **-0.5** | **AUTO-ESTIMATE** | Analyze code structure → Count references → Assess cross-module impact → Classify (lightweight/standard/complex) | Impact assessment + flow recommendation |
|
|
233
153
|
| 3 | **0** | **THINK** | brainstorming → Generate design doc + CONTEXT.md + ADR | Design document |
|
|
234
|
-
| 4 | **1** | **PLAN** |
|
|
154
|
+
| 4 | **1** | **PLAN** | autoplan → delphi-review (mandatory; lightweight allowed) → Generate specification.yaml + slices-manifest.json | specification.yaml |
|
|
235
155
|
| 5 | **2** | **BUILD** | GITHOOKS-GATE → ralph-loop (default) or parallel → TDD → freeze → blind review → verification | MVP code |
|
|
236
156
|
| 6 | **3** | **REVIEW** | delphi-review --mode code-walkthrough → test-specification-alignment → browse QA → benchmark (optional) | Review report |
|
|
237
157
|
| 7 | **4** | **USER ACCEPT** | **Manual verification** → Capture emergent issues | Emergent issues list |
|
|
@@ -287,135 +207,37 @@ Sprint Flow: ISOLATE → AUTO-ESTIMATE → THINK → PLAN → BUILD → REVIEW
|
|
|
287
207
|
|
|
288
208
|
### Phase -1: ISOLATE(git worktree 隔离)
|
|
289
209
|
|
|
290
|
-
**执行时机**: `/sprint-flow`
|
|
291
|
-
|
|
292
|
-
**目的**: 默认在 git worktree 中隔离 sprint 工作,防止在保护分支上直接运行导致代码污染。
|
|
293
|
-
|
|
294
|
-
**AI agent 直接执行 bash 命令**(不需要调用外部 skill),步骤如下:
|
|
295
|
-
|
|
296
|
-
| 步骤 | 动作 | 说明 |
|
|
297
|
-
|------|------|------|
|
|
298
|
-
| 0 | **检测当前环境** | 运行 `git rev-parse --git-dir` 和 `git rev-parse --git-common-dir`。如果 `GIT_DIR != GIT_COMMON`:已在 worktree 中 → 输出 "Already in isolated worktree" → 进入 Phase 0 |
|
|
299
|
-
| 0.5 | **Sprint Lock 检测(Issue #144)** | 检查 `.sprint-state/sprint.lock` 是否存在: `[ -f .sprint-state/sprint.lock ]`。如果存在: 读取锁内容,检查是否 stale(超过 24 小时或 worktree 目录不存在)→ stale → 输出 `[WARN] 发现过期 sprint lock,将覆盖` → 更新锁。非 stale → 输出 `[BLOCK] 已有活跃 sprint (ID: {sprint_id}, started: {started_at})。请先完成当前 sprint 或手动删除 .sprint-state/sprint.lock` → 退出。锁不存在 → 创建锁: `echo '{"sprint_id":"sprint-YYYY-MM-DD-NN","started_at":"<ISO8601>"}' > .sprint-state/sprint.lock` |
|
|
300
|
-
| 1 | **检查保护分支** | 获取当前分支名 `git branch --show-current`。保护分支列表: `main, master, develop, trunk, mainline`。保护分支 → 强制创建 worktree。非保护分支 → 依然创建 worktree(推荐,不阻断) |
|
|
301
|
-
| 2 | **创建 worktree** | 创建目录: `mkdir -p .worktrees/sprint`。检测已有 NN 编号: `ls .worktrees/sprint/ 2>/dev/null | grep -oE '[0-9]{2}$' | sort -n | tail -1`(取最后两位数字,数值排序,取最大),NN = 结果 + 1(无结果则从 01 开始)。运行 `git worktree add .worktrees/sprint/sprint-YYYY-MM-DD-NN -b sprint/YYYY-MM-DD-NN`。**注意**: `cd` 在 AI agent 单次工具调用中不保持状态,步骤 3-6 必须通过 `workdir` 参数或 `&&` 链式命令在新 worktree 目录下执行 |
|
|
302
|
-
| 3 | **项目 setup** | 在 worktree 目录下: 检测项目类型: `package.json` → `npm install`, `go.mod` → `go mod download`, `pyproject.toml` → `pip/poetry install` |
|
|
303
|
-
| 4 | **.gitignore 校验** | 在**仓库根目录**(非 worktree)执行: `git check-ignore -q .worktrees`。如果未忽略 → 将 `.worktrees/` 添加到 `.gitignore` → `git add .gitignore` → `git commit -m 'chore: ignore .worktrees directory'` |
|
|
304
|
-
| 5 | **Sprint State 记录** | `mkdir -p .sprint-state` 在 worktree 目录下。写入 `.sprint-state/sprint-state.json`(如已存在则合并,保留原有字段),新增/更新 `isolation` 对象,设置 `phase: -1`,`status: "running"` |
|
|
305
|
-
| 6 | **基线验证** | 在 worktree 目录下: 检测测试方式(package.json 有 "test" script → `npm test`, go.mod → `go test ./...`, pyproject.toml → `pytest`)。测试失败 → 输出失败信息 → 询问用户是否继续 |
|
|
306
|
-
|
|
307
|
-
**参数处理**:
|
|
308
|
-
|
|
309
|
-
- `--no-isolate`: 跳过自动创建,输出 ⚠️ 警告 `'[WARN] 未创建 worktree 隔离,在 {branch} 分支上直接运行 sprint 有污染风险'` → 进入 Phase 0
|
|
310
|
-
- `--branch-name <name>`: 使用自定义分支名(默认自动生成 `sprint/YYYY-MM-DD-NN`),分支名中的 `/` 在 worktree 路径中自动替换为 `-`(如 `feat/user-login` → 分支名 `feat/user-login`,路径 `.worktrees/sprint/feat-user-login`)
|
|
311
|
-
- `--force`: 强制在当前分支继续(即使已是保护分支),**要求用户显式确认**: 输出 ⚠️ 警告 `'[WARN] 使用 --force 在 {branch} 分支上直接运行 sprint。此操作绕过隔离保护,请确认风险。'` → 等待用户确认("继续" / "取消") → 确认后进入 Phase 0
|
|
312
|
-
|
|
313
|
-
**参数交互规则**:
|
|
210
|
+
**执行时机**: `/sprint-flow` 启动后 → Phase 0 THINK 前。**自动执行**。
|
|
314
211
|
|
|
315
|
-
|
|
316
|
-
|---------|------|
|
|
317
|
-
| `--no-isolate` 单独 | 跳过隔离,输出警告 → Phase 0 |
|
|
318
|
-
| `--force` 单独 | 跳过隔离,要求确认 → Phase 0 |
|
|
319
|
-
| `--no-isolate` + `--branch-name` | `--branch-name` 忽略,仅 `--no-isolate` 生效 |
|
|
320
|
-
| `--force` + `--branch-name` | `--branch-name` 忽略,仅 `--force` 生效 |
|
|
321
|
-
| `--no-isolate` + `--force` | 等效,输出 `--no-isolate` 警告 → Phase 0 |
|
|
322
|
-
| `--resume-from build` + `--no-isolate` | `--resume-from` 优先,直接跳过 Phase -1 |
|
|
323
|
-
|
|
324
|
-
**错误处理和回退**:
|
|
325
|
-
| 错误场景 | 回退行为 |
|
|
326
|
-
|---------|---------|
|
|
327
|
-
| `git worktree add` 失败(沙箱/权限问题) | 输出 `[ERROR] git worktree add 失败: {error}` → `[WARN] 无法创建 worktree 隔离,将在当前目录继续。请手动设置隔离分支。` → 在当前目录继续 |
|
|
328
|
-
| `.gitignore` 自动添加失败 | 输出 `[WARN] 无法自动添加 .gitignore,请手动将 .worktrees/ 添加到 .gitignore` → 继续 |
|
|
329
|
-
| 基线测试失败 | 输出 `[FAIL] 基线测试未通过:` + 失败详情 → 询问用户 `'基线测试失败,是否继续 sprint?(y/N)'` |
|
|
330
|
-
|
|
331
|
-
**sprint-state.json isolation 对象格式**:
|
|
332
|
-
```json
|
|
333
|
-
{
|
|
334
|
-
"isolation": {
|
|
335
|
-
"worktree_path": ".worktrees/sprint/sprint-2026-05-24-01",
|
|
336
|
-
"branch": "sprint/2026-05-24-01",
|
|
337
|
-
"created_from": "main",
|
|
338
|
-
"created_from_commit": "abc123def..."
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
```
|
|
212
|
+
**详细指令**: 参见 `references/phase-minus-1-isolate.md` — 包含步骤表、参数处理、错误回退、sprint-state 格式。
|
|
342
213
|
|
|
343
|
-
|
|
214
|
+
**快速参考**:
|
|
215
|
+
1. 检测保护分支 (main/master/develop) → 自动创建 worktree `.worktrees/sprint/sprint-YYYY-MM-DD-NN`
|
|
216
|
+
2. Sprint Lock 检测(Issue #144)— stale 锁自动覆盖,非 stale 阻断
|
|
217
|
+
3. 项目 setup (`npm install`/`go mod download`/`pip install`)
|
|
218
|
+
4. `.gitignore` 校验 + Sprint State 记录 + 基线测试
|
|
219
|
+
5. **参数**: `--no-isolate` (跳过),`--branch-name <name>`,`--force` (绕过保护分支)
|
|
344
220
|
|
|
345
221
|
### Phase -0.5: AUTO-ESTIMATE(自动化规模评估与流程路由)
|
|
346
222
|
|
|
347
|
-
**执行时机**: Phase -1 ISOLATE
|
|
348
|
-
|
|
349
|
-
**目的**: 自动评估需求规模,匹配适度流程,避免小需求走重量级流程造成资源浪费。不依赖人/AI 主观判断,而是通过代码结构分析提供客观指标。
|
|
350
|
-
|
|
351
|
-
**详细指令**: 参见 `references/phase-minus-0-5-auto-estimate.md`
|
|
352
|
-
|
|
353
|
-
#### 快速参考
|
|
354
|
-
|
|
355
|
-
**步骤**:
|
|
356
|
-
1. **识别需求类型** — 删除/修改已存在代码 → 立即分析;新增功能 → brainstorming 后分析
|
|
357
|
-
2. **收集指标** — 引用计数 (`grep -rn`)、跨模块依赖 (目录分布)、循环依赖、Public API 暴露、测试文件数
|
|
358
|
-
3. **汇总评估** — 综合打分 → 轻量 / 标准 / 复杂
|
|
359
|
-
4. **输出结果** — 使用 `templates/auto-estimate-output-template.md` 标准格式
|
|
360
|
-
5. **用户确认** — 接受建议 / 修改流程 / 取消
|
|
361
|
-
6. **路由执行** — 按最终级别进入对应 Phase
|
|
223
|
+
**执行时机**: Phase -1 ISOLATE 完成后 → Phase 0 THINK 前。**自动执行**。
|
|
362
224
|
|
|
363
|
-
|
|
225
|
+
**详细指令**: 参见 `references/phase-minus-0-5-auto-estimate.md` — 包含步骤、决策表、输出格式、纠偏机制。
|
|
364
226
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
**输出模板**: `templates/auto-estimate-output-template.md`
|
|
372
|
-
**学习日志**: `templates/auto-estimate-learning-log.md`(记录用户 override,用于阈值优化)
|
|
373
|
-
|
|
374
|
-
**输出格式**:
|
|
375
|
-
```
|
|
376
|
-
+-------------------------------------------------------------+
|
|
377
|
-
| AUTO-ESTIMATE 评估结果 |
|
|
378
|
-
+-------------------------------------------------------------+
|
|
379
|
-
| 需求:{task_description} |
|
|
380
|
-
| 类型:{change_type} |
|
|
381
|
-
| |
|
|
382
|
-
| [{impact_level}] Impact: {impact_label} |
|
|
383
|
-
| |
|
|
384
|
-
| 引用:{ref_count} 处 |
|
|
385
|
-
| 跨模块:{cross_module_count} 个 ({module_list}) |
|
|
386
|
-
| 循环依赖:{circular_dep_status} |
|
|
387
|
-
| Public API:{public_api_count} 个 |
|
|
388
|
-
| |
|
|
389
|
-
| 建议流程:{recommended_flow} |
|
|
390
|
-
| |
|
|
391
|
-
| {risk_warning} |
|
|
392
|
-
| |
|
|
393
|
-
| [接受建议] [修改流程] [取消] |
|
|
394
|
-
+-------------------------------------------------------------+
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
**纠偏机制**:
|
|
398
|
-
- **接受建议**: 按推荐流程执行,记录 `user_decision: "accepted"`
|
|
399
|
-
- **修改流程**: 用户选择其他级别,记录 `override_reason` 到 `.sprint-state/auto-estimate-learning.json`
|
|
400
|
-
- **取消**: 停止本次 sprint
|
|
401
|
-
|
|
402
|
-
**⚠️ 轻量路由的特殊处理**:
|
|
403
|
-
- 轻量路由 Phase 0-3 以 reduced intensity 执行(THINK/PLAN/review 强度降低)
|
|
404
|
-
- **所有路由必须产生** `.sprint-state/delphi-reviewed.json` 且 `verdict = "APPROVED"` 才能进入 BUILD
|
|
405
|
-
- Phase 2 BUILD 仍然执行完整 TDD + 盲评 + 验证
|
|
227
|
+
**快速参考**:
|
|
228
|
+
1. 识别需求类型(删除/修改/新增/BugFix)→ 收集指标(引用计数、跨模块依赖、循环依赖)
|
|
229
|
+
2. 综合打分 → **轻量** (≤3 ref, 同模块) / **标准** (4-10 ref, 1-2 modules) / **复杂** (>10 ref 或循环依赖)
|
|
230
|
+
3. 输出评估结果(使用 `templates/auto-estimate-output-template.md`)→ 用户确认后路由至对应 Phase
|
|
231
|
+
4. **所有路由必须产生** `delphi-reviewed.json` (verdict: APPROVED) 才能进入 Phase 2 BUILD
|
|
406
232
|
|
|
407
233
|
### Phase 0: THINK(需求探索与设计)
|
|
408
|
-
- **Subagent dispatch**: orchestrator 通过 `task(category="
|
|
234
|
+
- **Subagent dispatch**: orchestrator 通过 `task(category="deep", load_skills=["brainstorming"])` 启动独立 session
|
|
409
235
|
- 输入: Phase -1 summary(worktree 路径)+ 用户原始需求
|
|
410
236
|
- 输出: 结构化设计文档 → 直接作为 Phase 1 PLAN 的输入
|
|
411
237
|
- **HARD-GATE**: 设计未批准 → 不可进入实现
|
|
412
238
|
|
|
413
239
|
### Phase 1: PLAN(共识评审)
|
|
414
|
-
-
|
|
415
|
-
- **子流程**:
|
|
416
|
-
1. **Orchestrator** 直接调用 `task(category="deep", load_skills=["autoplan"], ...)` 执行 autoplan(可交互式等待用户确认 taste_decisions)
|
|
417
|
-
2. Autoplan 完成后,将结果(设计文档 + taste_decisions 确认)传给 subagent
|
|
418
|
-
3. **Subagent** 执行 delphi-review + to-issues: `task(category="deep", load_skills=["delphi-review", "to-issues"], prompt="autoplan 结果: ...")`
|
|
240
|
+
- **Subagent dispatch**: orchestrator 通过 `task(category="deep", load_skills=["autoplan", "delphi-review", "to-issues"])` 启动独立 session
|
|
419
241
|
- 输入: phase-0-summary.md + 设计文档
|
|
420
242
|
- 输出: `specification.yaml`(含 user_stories[])+ `slices-manifest.json`
|
|
421
243
|
|
|
@@ -438,55 +260,16 @@ Sprint Flow: ISOLATE → AUTO-ESTIMATE → THINK → PLAN → BUILD → REVIEW
|
|
|
438
260
|
|
|
439
261
|
**核心原则**: 没有质量门禁的代码不可进入 BUILD 阶段。**GITHOOKS-GATE 失败 → 不可编码。**
|
|
440
262
|
|
|
441
|
-
### Phase 2: BUILD(
|
|
442
|
-
|
|
443
|
-
**⚠️ DELPHI-GATE(BUILD 入口门禁)**:
|
|
444
|
-
Phase 2 第一步必须执行 DELPHI-GATE 检查。没有 delphi-review APPROVED → 不可编码。
|
|
445
|
-
|
|
446
|
-
检查步骤:
|
|
447
|
-
1. 读取 `.sprint-state/delphi-reviewed.json`
|
|
448
|
-
2. 验证文件存在 → 不存在 → 输出 `[BLOCKED] delphi-review not APPROVED. 必须先完成 Phase 1 的 delphi-review。` → 返回 Phase 1
|
|
449
|
-
3. 验证 `verdict` 字段 == `"APPROVED"` → 不等于 → 同上 BLOCK
|
|
450
|
-
4. ✅ 通过 → 进入 BUILD 编码
|
|
451
|
-
|
|
452
|
-
**输入**: `slices-manifest.json`(由 Phase 1 `/to-issues` 生成),按 `execution_order` 逐个执行。
|
|
263
|
+
### Phase 2: BUILD(ralph-loop 默认 + TDD + 盲评 + 验证)
|
|
453
264
|
|
|
454
|
-
|
|
265
|
+
**详细指令**: 参见 `references/phase-2-build.md`。
|
|
455
266
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
| -1 | **`hooks-install`** _(githooks/scripts)_ | `githooks/verify.sh` → 缺失则 `githooks/install.sh` |
|
|
463
|
-
| 0 | **`dispatching-parallel-agents`** _(superpowers)_ | 检测可并行任务,并行分发独立子任务 |
|
|
464
|
-
| 1 | `test-driven-development` (superpowers) | RED → GREEN → REFACTOR 铁律执行 |
|
|
465
|
-
| 2 | **`executing-plans`** _(superpowers)_ | 在隔离 session 中执行计划,有 review checkpoint |
|
|
466
|
-
| 3 | `freeze` (gstack) | 锁定业务代码,盲评 agent 只能访问测试 |
|
|
467
|
-
| 4 | `requesting-code-review` (superpowers) | 独立 agent 盲评业务代码(隔离状态) |
|
|
468
|
-
| 5 | `unfreeze` (gstack) | 解锁业务代码 |
|
|
469
|
-
| 6 | `verification-before-completion` (superpowers) | 运行测试 + lint,证据优先 |
|
|
470
|
-
| 7 | 成本监控(sprint-flow 编排层) | 超阈值 BLOCK + 用户决策 |
|
|
471
|
-
|
|
472
|
-
**关键行为保留**(原 xp-consensus 17 状态机中的真实边缘情况):
|
|
473
|
-
|
|
474
|
-
| 原状态 | 新处理方案 |
|
|
475
|
-
|--------|-----------|
|
|
476
|
-
| `CIRCUIT_BREAKER_TRIGGERED` | sprint-flow 编排层监控成本,超阈值 BLOCK + 用户决策 |
|
|
477
|
-
| `ROLLBACK_TO_ROUND1` | verification-before-completion 失败 → 修复 max 3 次 → 仍失败 BLOCK |
|
|
478
|
-
| `GATE1_FAILED`/`GATE1_COMPLETE` | verification-before-completion 内置此区分 |
|
|
479
|
-
| `GATE2_RUNNING` | `cso` (gstack) — Phase 1-6 安全审计替代 |
|
|
480
|
-
| `SEALED_CODE_ISOLATION` | 保留 freeze skill 调用 |
|
|
481
|
-
|
|
482
|
-
**语言特定 TDD**:通过 `--lang` 参数选择:
|
|
483
|
-
- `springboot-tdd` / `django-tdd` / `golang-testing`
|
|
484
|
-
|
|
485
|
-
**Mock Minimization**(Phase 2 强制):
|
|
486
|
-
- 默认使用 integration-first:real DB (sqlite-in-memory), real collaborators
|
|
487
|
-
- Mock 仅用于:external services, network calls, I/O boundaries
|
|
488
|
-
- Mock 密度 > 30% 时必须添加 `// @mock-justified: <reason>` 注解(理由最少 10 字符)
|
|
489
|
-
- Phase 3 Gate M 会在 push 时验证 mock 密度
|
|
267
|
+
**快速参考**:
|
|
268
|
+
1. **DELPHI-GATE**: 验证 `.sprint-state/delphi-reviewed.json` 存在且 `verdict = "APPROVED"` → 否则 BLOCK
|
|
269
|
+
2. **输入**: `slices-manifest.json`(Phase 1 生成),按 `execution_order` 逐个执行
|
|
270
|
+
3. **模式**: 默认 `ralph-loop`(逐 REQ 迭代,token 节约 40-67%),可选 `--mode parallel`
|
|
271
|
+
4. **Skill 步骤**: hooks-install → dispatching-parallel-agents → TDD (RED/GREEN/REFACTOR) → freeze → blind-review → unfreeze → verification-before-completion → 成本监控
|
|
272
|
+
5. **Mock Minimization**: integration-first, mock 仅限 external services, 密度 > 30% 需 `@mock-justified`
|
|
490
273
|
|
|
491
274
|
### Phase 3: REVIEW + TEST(验证)
|
|
492
275
|
- **Subagent dispatch**: orchestrator 通过 `task(category="deep", load_skills=["delphi-review", "test-specification-alignment"])` 启动独立 session
|
|
@@ -512,716 +295,130 @@ Phase 2 第一步必须执行 DELPHI-GATE 检查。没有 delphi-review APPROVED
|
|
|
512
295
|
- 使用 `@templates/emergent-issues-template.md` 检查清单
|
|
513
296
|
|
|
514
297
|
### Phase 5: FEEDBACK CAPTURE(反馈获取)
|
|
515
|
-
- **Subagent
|
|
516
|
-
- 输入: phase-4-summary.md
|
|
517
|
-
-
|
|
518
|
-
- **HARD-GATE**: Phase 5 不可跳过。Phase 4 完成后 → 必须进入 Phase 5 → 完成后才能进入 Phase 6。
|
|
519
|
-
- **`learn` (gstack)** — Sprint 级复盘(**Phase 5 必须自动调用,不依赖手动触发**)
|
|
520
|
-
- **默认提炼模板**(无需用户额外输入):
|
|
521
|
-
> 提炼总结并保存可复用的经验教训,把大模型不知道、并且犯错后无法立即发现和纠正的知识保存下来。如果是对其他项目也有价值的,就保存成全局记忆,否则保存为项目记忆。
|
|
522
|
-
- ralph-loop 已在 BUILD Phase 内部实现 per-REQ learn(permanent/contextual 分类)
|
|
523
|
-
- Phase 5 额外进行 Sprint 级复盘,总结全 Phase 经验
|
|
524
|
-
- **learnings 自动注入**:`/learn export` 时自动 append 到 CLAUDE.md / AGENTS.md 末尾形成 `## Project Learnings` 章节
|
|
525
|
-
- **`retro` (gstack)** — 工程回顾:提交历史、工作模式、代码质量趋势
|
|
526
|
-
- **`systematic-debugging` (superpowers)** — 根因调试
|
|
298
|
+
- **Subagent**: `task(category="quick", load_skills=["learn", "retro", "systematic-debugging"])`
|
|
299
|
+
- 输入: phase-4-summary.md + emergent-issues.md → 输出: `feedback-log.md`
|
|
300
|
+
- **HARD-GATE**: 不可跳过。`learn` (Sprint 级复盘, 默认提炼模板) + `retro` (工程回顾) + `systematic-debugging` (根因调试)
|
|
527
301
|
|
|
528
302
|
### Phase 6: SHIP(发布准备)
|
|
529
|
-
- **Subagent dispatch**: orchestrator 通过 `task(category="quick", load_skills=["finishing-a-development-branch", "ship"])` 启动独立 session
|
|
530
|
-
- 输入: phase-5-summary.md + feedback-log.md
|
|
531
|
-
- 输出: PR URL
|
|
532
|
-
- **HARD-GATE**: Phase 5 未完成 → 不可进入 Phase 6。验证 `.sprint-state/phase-outputs/feedback-log.md` 存在。
|
|
533
|
-
- **⚠️ GITHOOKS-GATE**: 再次验证 hooks 完整性(Phase 2 的 TDD 编码已触发提交,SHIP 阶段还会再次提交)
|
|
534
|
-
- 运行 `githooks/verify.sh` → 缺失 → `githooks/install.sh` → 阻断直至修复
|
|
535
|
-
- **⚠️ VERSION-GATE**: Phase 6 提交前必须 bump VERSION 文件(与变更类型无关)
|
|
536
|
-
- 默认 bump PATCH 位(如 `0.6.0.0` → `0.6.1.0`,MICRO 重置为 0)
|
|
537
|
-
- 重大新功能 bump MINOR 位(如 `0.6.0.0` → `0.7.0.0`),Breaking change bump MAJOR 位
|
|
538
|
-
- 运行 `bash scripts/sync-version.sh` 同步到所有 package.json(root、npm-package、claude-plugin、opencode)
|
|
539
|
-
- 更新 `CHANGELOG.md` 添加本次变更记录(含变更类型说明:skill-only / code / mixed)
|
|
540
|
-
- 验证:`git diff VERSION` 确认版本号已变更,未变更 → 阻断
|
|
541
|
-
- **此规则与变更类型无关** — 纯 skill 变更(仅 .md 文件)也必须 bump PATCH,确保每次 sprint 都触发 npm 发布
|
|
542
|
-
- **📋 VERSION CHANGESET(Issue #142)**: 每次 VERSION bump 必须创建原子化的 changeset 记录,确保版本变更可追溯、可审计
|
|
543
|
-
- 在 `.sprint-state/changesets/` 目录下创建 JSON 文件,文件名格式: `changeset-{YYYYMMDDHHMMSS}.json`
|
|
544
|
-
- changeset 字段:
|
|
545
|
-
```json
|
|
546
|
-
{
|
|
547
|
-
"id": "cs_xxxxxxxx",
|
|
548
|
-
"created_at": "2026-06-07T12:00:00Z",
|
|
549
|
-
"sprint_id": "sprint-2026-06-07-01",
|
|
550
|
-
"old_version": "0.8.1.2",
|
|
551
|
-
"new_version": "0.8.2.0",
|
|
552
|
-
"change_type": "patch|minor|major",
|
|
553
|
-
"description": "brief description of changes in this bump",
|
|
554
|
-
"files_changed": ["VERSION", "CHANGELOG.md", "package.json", "src/npm-package/package.json", "plugins/claude-code/.claude-plugin/plugin.json", "plugins/opencode/package.json"],
|
|
555
|
-
"semver_note": "npm semver 3-digit: 0.8.2"
|
|
556
|
-
}
|
|
557
|
-
```
|
|
558
|
-
- changeset 创建时机:VERSION 更新后、`sync-version.sh` 执行后、commit 前
|
|
559
|
-
- changeset 随 commit 一起提交,形成版本变更的完整审计链
|
|
560
|
-
- **用途**: 回滚时通过 changeset 精确还原版本号、CI/CD 自动确定发布范围、审核时追踪每次 bump 的原因
|
|
561
|
-
- **`finishing-a-development-branch`** (superpowers) — 结构化完成流:4 选项(merge / PR / discard / keep)
|
|
562
|
-
- `ship` (gstack) — 创建 PR(PR 路径时使用)
|
|
563
|
-
- Phase 6 输出:PR URL(用于 Phase 7 输入)
|
|
564
|
-
|
|
565
|
-
### Phase 7: LAND(合并 + 部署)
|
|
566
|
-
- **Subagent dispatch**: orchestrator 通过 `task(category="deep", load_skills=["land-and-deploy"])` 启动独立 session
|
|
567
|
-
- 输入: phase-6-summary.md + PR URL
|
|
568
|
-
- 输出: 部署状态 + Canary 报告
|
|
569
|
-
- 输入:Phase 6 输出的 PR URL
|
|
570
|
-
- 调用:`land-and-deploy` skill
|
|
571
|
-
- 流程:
|
|
572
|
-
1. Merge PR(`gh pr merge --squash`)
|
|
573
|
-
2. 等待 CI 完成(poll `gh pr checks` 直到 success 或 10min timeout)
|
|
574
|
-
3. 等待 Deploy 完成(如已配置,10min timeout)
|
|
575
|
-
4. **Canary Health Check**(如已配置部署平台):
|
|
576
|
-
- 健康检查端点:项目根路径 `/` 或自定义 `/.well-known/health`
|
|
577
|
-
- SLA 指标:HTTP 200 响应 + 错误率 <1% + p99 响应 <2s
|
|
578
|
-
- 超时策略:最长 5 分钟,每 10s polling 一次
|
|
579
|
-
- 部署**失败**时的回滚:`git revert` 最后一次 merge commit + 输出 `[ERROR] Deploy failed, auto-rolled back merge`
|
|
580
|
-
- 条件跳过:无部署配置时,仅执行 merge + CI checks,跳过 deploy/canary
|
|
581
|
-
- 输出:部署状态 + Canary 报告(成功/失败/跳过)
|
|
582
303
|
|
|
583
|
-
|
|
304
|
+
**详细指令**: 参见 `references/phase-6-ship.md` — GITHOOKS-GATE / VERSION-GATE / VERSION CHANGESET (Issue #142) / changeset schema。
|
|
584
305
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
1. **检测 worktree 是否存在**: `[ -d <worktree_path> ]`
|
|
592
|
-
2. **安全清理**:
|
|
593
|
-
- **⚠️ 禁止使用通配符或递归 shell 删除命令** — 必须先列出 `isolation.worktree_path` 并确认只清理本 sprint worktree
|
|
594
|
-
- 首选 git worktree 管理命令清理该精确路径;失败时重试最多 3 次,间隔 1s
|
|
595
|
-
- 如果仍失败:输出 `[WARN] Worktree cleanup failed; list the target path and ask the user to clean it manually`
|
|
596
|
-
- ** NEVER delete arbitrary directories** — 只删除本 sprint 创建的 `isolation.worktree_path`
|
|
597
|
-
3. **残留检测**: `[ -d <worktree_path> ]` → 如果仍有残留,输出警告 `[WARN] 检测到残留目录,请手动检查:<worktree_path>`
|
|
598
|
-
4. **删除本地和远程分支**(⚠️ 必须在步骤 2 worktree remove 成功后执行):
|
|
599
|
-
- 切回主分支: `cd <repo_root> && git checkout main && git pull origin main`
|
|
600
|
-
- 删除本地分支: `git branch -D <sprint_branch>`
|
|
601
|
-
- 使用 `-D` 因为 squash merge 后 git 不认为已合并
|
|
602
|
-
- 如果分支不存在(已被其他流程删除): 静默跳过
|
|
603
|
-
- 删除远程分支: `git push origin --delete <sprint_branch>`
|
|
604
|
-
- 如果远程分支删除失败: 输出 `[WARN] Remote branch cleanup failed, please manually run: git push origin --delete <sprint_branch>`
|
|
605
|
-
5. **关闭遗留 OPEN PR**:
|
|
606
|
-
- `gh pr list --head <sprint_branch> --state open`
|
|
607
|
-
- 如果存在 OPEN PR: 关闭并评论说明该 sprint 已通过其他 PR 完成
|
|
608
|
-
6. **更新 `.sprint-state/sprint-state.json`**:
|
|
609
|
-
- `phase: 8`
|
|
610
|
-
- `status: "merged"` 或 `"completed"`
|
|
611
|
-
7. **释放 Sprint Lock(Issue #144)**:
|
|
612
|
-
- `rm -f .sprint-state/sprint.lock`
|
|
613
|
-
- 验证锁已删除: `[ ! -f .sprint-state/sprint.lock ] || echo "[WARN] sprint lock 未能删除,请手动清理"`
|
|
614
|
-
8. **输出 Cleanup Report + Sprint Summary**
|
|
615
|
-
|
|
616
|
-
**执行顺序依赖**:
|
|
617
|
-
```
|
|
618
|
-
步骤 0 (保存分支名) → 步骤 2 (worktree remove 解除分支文件占用) → 步骤 4 (branch -D 删分支引用 → push --delete 删远程)
|
|
619
|
-
```
|
|
306
|
+
**快速参考**:
|
|
307
|
+
- **Dispatch**: `task(category="quick", load_skills=["finishing-a-development-branch", "ship"])`
|
|
308
|
+
- 输入: phase-5-summary.md + feedback-log.md → 输出: PR URL
|
|
309
|
+
- **HARD-GATE**: Phase 5 未完成 → BLOCK。验证 `feedback-log.md` 存在。
|
|
310
|
+
- **GITHOOKS-GATE**: 验证 hooks 完整性,缺失则 `githooks/install.sh`
|
|
311
|
+
- **VERSION-GATE**: bump PATCH/MINOR/MAJOR → `sync-version.sh` → CHANGELOG.md → `git diff VERSION` 验证
|
|
620
312
|
|
|
621
|
-
|
|
313
|
+
### Phase 7: LAND(合并 + 部署)
|
|
622
314
|
|
|
623
|
-
|
|
315
|
+
**详细指令**: 参见 `references/phase-7-land.md` — 完整流程、SLA 指标、回滚策略。
|
|
624
316
|
|
|
625
|
-
|
|
317
|
+
**快速参考**:
|
|
318
|
+
- **Dispatch**: `task(category="deep", load_skills=["land-and-deploy"])`
|
|
319
|
+
- 输入: phase-6-summary.md + PR URL → 输出: 部署状态 + Canary 报告
|
|
320
|
+
- 流程: Merge PR → 等待 CI (10min) → 等待 Deploy (10min) → Canary Health Check (5min)
|
|
321
|
+
- **回滚**: `git revert` 最后一次 merge commit
|
|
322
|
+
- 条件跳过: 无部署配置时仅 merge + CI
|
|
626
323
|
|
|
627
|
-
|
|
324
|
+
### Phase 8: CLEANUP(安全清理 + 总结)
|
|
628
325
|
|
|
629
|
-
|
|
326
|
+
**执行时机**: Phase 7 LAND 成功后。**详细指令**: 参见 `references/phase-8-cleanup.md`。
|
|
630
327
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
| `task(category="unspecified-high")` | **高 effort 实现**:新模块、重构 | 单行修改 | 无限制 |
|
|
639
|
-
|
|
640
|
-
**关键规则**:
|
|
641
|
-
|
|
642
|
-
1. Bare `explore` agent 本质是 contextual grep,**不是研究 agent**。如果任务涉及:
|
|
643
|
-
- 3+ 个独立搜索角度
|
|
644
|
-
- 读取多个大文件(>200 行)
|
|
645
|
-
- 需要跨层分析(如"查 ralph-loop + .sprint-state/ + token 阈值 + phase transition")
|
|
646
|
-
|
|
647
|
-
→ **必须用 `task(category="deep", load_skills=[...])` 替代**
|
|
648
|
-
|
|
649
|
-
2. 如果 `explore` agent >5 分钟未返回 → cancel 并立即用 `task(category="deep")` 重试。不要等待。
|
|
650
|
-
|
|
651
|
-
3. **并行 explore 仍然是正确模式**。2-4 个窄搜索 explore agent 并行执行是高效且推荐的。问题在于给单一 explore agent 分配宽泛任务。
|
|
652
|
-
|
|
653
|
-
**issue #83 根因**:`bg_1abf2ed9` 被分配了 4 个独立搜索角度的宽泛任务(ralph-loop context + .sprint-state/ + token threshold + phase transition),bare explore agent 超时丢失 session。同批的 `bg_5ecf590d`(窄搜索 OpenCode compaction API)3m35s 正常完成。
|
|
654
|
-
|
|
655
|
-
### Phase Subagent Dispatch Matrix
|
|
656
|
-
|
|
657
|
-
| Phase | 名称 | Subagent? | Category | load_skills | 执行者 |
|
|
658
|
-
|-------|------|:---------:|----------|-------------|--------|
|
|
659
|
-
| -1 | ISOLATE | ❌ | Bash(直接执行) | 无 | orchestrator |
|
|
660
|
-
| -0.5 | AUTO-ESTIMATE | ❌ | Bash(直接执行) | 无 | orchestrator |
|
|
661
|
-
| 0 | THINK | ✅ | `unspecified-high` | `[]` | subagent |
|
|
662
|
-
| 1 | PLAN (**autoplan**) | **❌** | **orchestrator 直接执行** | `["autoplan"]` | **orchestrator** |
|
|
663
|
-
| 1 | PLAN (**delphi-review + to-issues**) | ✅ | `deep` | `["delphi-review", "to-issues"]` | **subagent(仅处理评审+切片)** |
|
|
664
|
-
| 2 | BUILD | ✅(已有) | ralph-loop | `["test-driven-development"]` | subagent |
|
|
665
|
-
| 3 | REVIEW | ✅ | `deep` | `["delphi-review", "test-specification-alignment"]` | subagent |
|
|
666
|
-
| 4 | USER ACCEPT | ❌ | **强制人工** | 无 | 用户 |
|
|
667
|
-
| 5 | FEEDBACK | ✅ | `quick` | `["learn", "retro", "systematic-debugging"]` | subagent |
|
|
668
|
-
| 6 | SHIP | ✅ | `quick` | `["finishing-a-development-branch", "ship"]` | subagent |
|
|
669
|
-
| 7 | LAND | ✅ | `deep` | `["land-and-deploy"]` | subagent |
|
|
670
|
-
| 8 | CLEANUP | ❌ | Bash(直接执行) | 无 | orchestrator |
|
|
671
|
-
|
|
672
|
-
> **#225 关键规则**: `autoplan` 是交互式 skill(可能在 taste_decisions 节点暂停等待用户输入),因此**必须由 orchestrator 直接执行**,不可 dispatch 到 subagent。只有 delphi-review 和 to-issues 这种非交互式步骤可以 dispatch 到 subagent。
|
|
673
|
-
|
|
674
|
-
**上下文隔离原则**:
|
|
675
|
-
- 每个 Subagent 在**独立 session** 中启动,不继承 orchestrator 的对话历史
|
|
676
|
-
- orchestrator session 仅接收 subagent 的最终结果摘要(~13,000 tokens/sprint)
|
|
677
|
-
- 现代模型百万 token 上下文 + 缓存命中 → 单 sprint 不会触发 overflow
|
|
678
|
-
|
|
679
|
-
### CONTEXT INHERITANCE
|
|
680
|
-
|
|
681
|
-
每个 Phase subagent 启动时,上下文仅通过以下路径继承:
|
|
682
|
-
|
|
683
|
-
| Phase | 加载来源 | 内容 |
|
|
684
|
-
|-------|---------|------|
|
|
685
|
-
| Phase -1 | 无前置(Bash 操作) | 用户原始需求 + 当前分支状态 |
|
|
686
|
-
| Phase 0 | phase--1-summary(仅路径) | 隔离环境信息(worktree 路径) |
|
|
687
|
-
| Phase 1 | phase-0-summary.md + design-doc | 设计决策 + 结构化规格 |
|
|
688
|
-
| Phase 2 | phase-1-summary.md + specification.yaml | 评审结论 + REQ 列表 |
|
|
689
|
-
| Phase 3 | phase-2-summary.md + MVP 代码 | 构建结果 |
|
|
690
|
-
| Phase 4 | — | **人工验收**。Phase 4 不产生 subagent summary,但用户验收结果记录在 `.sprint-state/phase-outputs/emergent-issues.md`(如有 emergent issues)。Phase 5 加载此文件。 |
|
|
691
|
-
| Phase 5 | phase-4-summary.md + emergent-issues.md | 验收结论 |
|
|
692
|
-
| Phase 6 | phase-5-summary.md + feedback-log.md | 复盘结论 |
|
|
693
|
-
| Phase 7 | phase-6-summary.md + PR URL | 发布准备 |
|
|
694
|
-
| Phase 8 | phase-7-summary(Bash 操作) | 部署结果 |
|
|
695
|
-
|
|
696
|
-
**隔离原则**:每个 Phase subagent 在干净上下文中启动。
|
|
697
|
-
输入仅限上表对应的摘要文件和一级产出物。
|
|
698
|
-
不包含前一 Phase 的完整对话、中间文件、失败尝试。
|
|
699
|
-
|
|
700
|
-
**特殊场景**:
|
|
701
|
-
- `--resume-from <phase>`:跳过前置 Phase,直接从指定 Phase 启动。**MUST 先执行 RESUME GATE(Issue #148)** 校验 sprint 状态、git 可达性和文件时效性,再执行 Phase Transition Gate 校验摘要文件格式。例如 `--resume-from build` 要求 `phase-1-summary.md` 和 `specification.yaml` 已存在且非 stale。
|
|
702
|
-
- `--no-isolate`:跳过 Phase -1 ISOLATE,直接在当前分支执行。Phase 0 无 `phase--1-summary` 可用,上下文继承来源为用户原始需求 + 当前 git 状态。所有后续 Phase 的 worktree enforcement 不适用(无 worktree),但仍需保持代码隔离。
|
|
703
|
-
- `next_phase_context` 中的 `{path}` 等变量占位符在实际写入时被替换为具体值。示例中的 `{path}` 应替换为实际 worktree 路径(如 `.worktrees/sprint/sprint-2026-06-01-01`)。
|
|
704
|
-
|
|
705
|
-
### PHASE TRANSITION RULES
|
|
706
|
-
|
|
707
|
-
每个 Phase subagent 完成后,必须按顺序执行以下步骤:
|
|
708
|
-
|
|
709
|
-
1. **写入 Phase 摘要**:创建 `.sprint-state/phase-outputs/phase-{N}-summary.md`
|
|
710
|
-
- 格式:YAML frontmatter + Markdown body(body ≤ 50 行)
|
|
711
|
-
- 大小限制:≤ 40,000 字符(≈ 10,000 tokens)
|
|
712
|
-
|
|
713
|
-
2. **更新 sprint-state.json**:
|
|
714
|
-
- `phase`: 当前阶段编号
|
|
715
|
-
- `outputs`: 新增当前阶段输出文件路径
|
|
716
|
-
- `phase_history`: 追加或更新当前阶段的记录
|
|
717
|
-
- Phase 开始时:追加 `{ "phase": N, "phase_name": "NAME", "status": "running", "started_at": "<ISO 8601>", "completed_at": null, "duration_seconds": null }`
|
|
718
|
-
- Phase 完成时:更新对应条目,填充 `completed_at`(ISO 8601)和 `duration_seconds`(`completed_at - started_at` 的秒数)
|
|
719
|
-
- Phase 跳过时(如轻量路由跳过 Phase 0 brainstorming):设置 `status: "skipped"`
|
|
720
|
-
|
|
721
|
-
3. **等待用户确认 checkpoint**(如适用)
|
|
722
|
-
|
|
723
|
-
4. **展示进度看板**:执行 `node scripts/render-sprint-progress.cjs` 渲染进度看板
|
|
724
|
-
- 脚本自动读取 `.sprint-state/sprint-state.json` 并输出 ASCII 进度看板
|
|
725
|
-
- 渲染规则:已完成阶段显示 ✅ + 耗时,当前阶段 🔄,待做 ⬜,跳过 ⏭️,失败 ❌
|
|
726
|
-
- 进度条:`[████▓░░░░░░] {pct}%`(已完成数/总阶段数 11)
|
|
727
|
-
- 下一步行动:根据当前阶段 + 状态,自动查找对应提示
|
|
728
|
-
- 输出物路径:列出 `outputs` 中已有的文件路径
|
|
729
|
-
- 时机:每个 Phase 完成后的 transition 阶段自动展示,用户无需请求
|
|
730
|
-
- 向后兼容:旧版 `sprint-state.json` 缺少 `phase_history` 时,从 `phase` 字段推断状态
|
|
731
|
-
|
|
732
|
-
### Phase Summary 格式(YAML Frontmatter Schema)
|
|
733
|
-
|
|
734
|
-
每个 `phase-N-summary.md` 必须包含以下 YAML frontmatter:
|
|
328
|
+
**快速参考**:
|
|
329
|
+
1. 保存分支信息 → `git worktree remove <worktree_path>`(精确路径,禁止通配符)
|
|
330
|
+
2. 删除本地分支 (`git branch -D`) + 远程分支 (`git push origin --delete`)
|
|
331
|
+
3. 关闭遗留 OPEN PR (`gh pr list --head`)
|
|
332
|
+
4. 更新 sprint-state.json (phase:8, status: merged) + 释放 Sprint Lock (Issue #144)
|
|
333
|
+
5. 输出 Cleanup Report + Sprint Summary
|
|
334
|
+
6. **IF emergent issues → Sprint 2**. **条件跳过**: `--no-isolate` 路径
|
|
735
335
|
|
|
736
|
-
```markdown
|
|
737
336
|
---
|
|
738
|
-
phase: -1
|
|
739
|
-
phase_name: ISOLATE
|
|
740
|
-
status: completed
|
|
741
|
-
outputs:
|
|
742
|
-
- path: ".worktrees/sprint/sprint-YYYY-MM-DD-NN"
|
|
743
|
-
type: directory
|
|
744
|
-
decisions:
|
|
745
|
-
- title: "Worktree isolation enabled"
|
|
746
|
-
rationale: "Prevent main branch pollution"
|
|
747
|
-
unresolved_issues: []
|
|
748
|
-
next_phase_context: "Worktree created at {path}. All subsequent edits MUST use this workdir."
|
|
749
|
-
---
|
|
750
|
-
|
|
751
|
-
## Phase Summary
|
|
752
|
-
{简明摘要,不超过 50 行}
|
|
753
|
-
```
|
|
754
|
-
|
|
755
|
-
**必填字段**: `phase`, `phase_name`, `status`, `outputs`, `decisions`, `next_phase_context`
|
|
756
|
-
**可选字段**: `unresolved_issues`
|
|
757
|
-
|
|
758
|
-
### Phase Transition Gate
|
|
759
|
-
|
|
760
|
-
Orchestrator dispatch 下一 Phase 前必须执行验证:
|
|
761
|
-
|
|
762
|
-
```bash
|
|
763
|
-
# === Phase Transition Gate ===
|
|
764
|
-
|
|
765
|
-
# 1. Phase summary file validation
|
|
766
|
-
SUMMARY=".sprint-state/phase-outputs/phase-${N}-summary.md"
|
|
767
|
-
[ -f "$SUMMARY" ] || { echo "[BLOCK] phase-${N}-summary 不存在"; exit 1; }
|
|
768
|
-
FRONTMARKERS=$(grep -c "^---" "$SUMMARY" 2>/dev/null || echo 0)
|
|
769
|
-
[ "$FRONTMARKERS" -ge 2 ] || { echo "[BLOCK] YAML frontmatter 格式不完整"; exit 1; }
|
|
770
|
-
grep -q "^phase:" "$SUMMARY" || { echo "[BLOCK] 缺少 phase 字段"; exit 1; }
|
|
771
|
-
grep -q "^phase_name:" "$SUMMARY" || { echo "[BLOCK] 缺少 phase_name 字段"; exit 1; }
|
|
772
|
-
grep -q "^status:" "$SUMMARY" || { echo "[BLOCK] 缺少 status 字段"; exit 1; }
|
|
773
|
-
grep -q "^decisions:" "$SUMMARY" || { echo "[BLOCK] 缺少 decisions 字段"; exit 1; }
|
|
774
|
-
grep -q "^outputs:" "$SUMMARY" || { echo "[BLOCK] 缺少 outputs 字段"; exit 1; }
|
|
775
|
-
grep -q "^next_phase_context:" "$SUMMARY" || { echo "[BLOCK] 缺少 next_phase_context"; exit 1; }
|
|
776
|
-
CHARS=$(wc -c < "$SUMMARY" | tr -d ' ')
|
|
777
|
-
[ "$CHARS" -le 40000 ] || { echo "[BLOCK] 摘要超出大小限制 (${CHARS}/40000 chars)"; exit 1; }
|
|
778
|
-
|
|
779
|
-
# 2. sprint-state.json enforcement check (Issue #146)
|
|
780
|
-
SPRINT_STATE=".sprint-state/sprint-state.json"
|
|
781
|
-
[ -f "$SPRINT_STATE" ] || { echo "[BLOCK] sprint-state.json 不存在"; exit 1; }
|
|
782
|
-
|
|
783
|
-
# Verify phase_history includes current phase with completed_at
|
|
784
|
-
PHASE_HISTORY_CHECK=$(grep -c "\"phase\": $N" "$SPRINT_STATE" 2>/dev/null || echo 0)
|
|
785
|
-
[ "$PHASE_HISTORY_CHECK" -gt 0 ] || {
|
|
786
|
-
echo "[BLOCK] sprint-state.json phase_history 缺少 phase $N 的记录"
|
|
787
|
-
echo "[ACTION] 在 dispatch 下一 Phase 前更新 sprint-state.json:"
|
|
788
|
-
echo " - phase: $N"
|
|
789
|
-
echo " - phase_history: 追加 {phase:N, status:completed, completed_at:<ISO8601>}"
|
|
790
|
-
echo " - outputs: 追加当前 phase 的输出文件"
|
|
791
|
-
exit 1
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
# Verify completed_at is set (not null)
|
|
795
|
-
COMPLETED_AT_VALUE=$(grep -A3 "\"phase\": $N" "$SPRINT_STATE" 2>/dev/null | grep "completed_at" | head -1 | grep -o '"[^"]*"$' | tr -d '"')
|
|
796
|
-
[ "$COMPLETED_AT_VALUE" != "null" ] && [ -n "$COMPLETED_AT_VALUE" ] || {
|
|
797
|
-
echo "[BLOCK] sprint-state.json phase $N 的 completed_at 未设置 (null)"
|
|
798
|
-
echo "[ACTION] 设置 completed_at 为当前时间 (ISO 8601):"
|
|
799
|
-
echo " date -u +%Y-%m-%dT%H:%M:%SZ"
|
|
800
|
-
exit 1
|
|
801
|
-
}
|
|
802
|
-
```
|
|
803
|
-
|
|
804
|
-
**由 orchestrator 强制执行**,不依赖 subagent 自觉遵守。
|
|
805
|
-
验证失败 → BLOCK,不可 dispatch 下一 Phase。
|
|
806
|
-
|
|
807
|
-
### RESUME GATE / --resume-from 断点校验(Issue #148)
|
|
808
|
-
|
|
809
|
-
当使用 `--resume-from <phase>` 时,在执行 Phase Transition Gate 之前,
|
|
810
|
-
orchestrator MUST 先执行以下断点校验。任何一项失败 → BLOCK,拒绝恢复。
|
|
811
|
-
|
|
812
|
-
```bash
|
|
813
|
-
SPRINT_STATE=".sprint-state/sprint-state.json"
|
|
814
|
-
[ -f "$SPRINT_STATE" ] || { echo "[BLOCK] sprint-state.json 不存在,无法恢复"; exit 1; }
|
|
815
|
-
|
|
816
|
-
# 1. Sprint ID 一致性:确认 resume 的目标 sprint 与 sprint-state.json 匹配
|
|
817
|
-
SPRINT_ID=$(grep -o '"id": "[^"]*"' "$SPRINT_STATE" | head -1 | cut -d'"' -f4)
|
|
818
|
-
CURRENT_SPRINT_ID=$(echo "$TASK_DESCRIPTION" | md5sum | head -8 2>/dev/null || echo "unknown")
|
|
819
|
-
# 实际 sprint id 由 Phase -1 生成,此处仅验证文件存在且包含 id 字段
|
|
820
|
-
[ -n "$SPRINT_ID" ] || { echo "[BLOCK] sprint-state.json 缺少 id 字段"; exit 1; }
|
|
821
|
-
|
|
822
|
-
# 2. 阶段顺序校验:--resume-from 的 phase 必须是最后已完成 phase 的后继
|
|
823
|
-
LAST_COMPLETED_PHASE=$(grep -o '"phase": [0-9]' "$SPRINT_STATE" | tail -1 | awk '{print $2}')
|
|
824
|
-
RESUME_PHASE=$((RESUME_PHASE)) # orchestrator 将 --resume-from 参数值转为整数
|
|
825
|
-
[ "$RESUME_PHASE" -gt "$LAST_COMPLETED_PHASE" ] || {
|
|
826
|
-
echo "[BLOCK] --resume-from phase ($RESUME_PHASE) 必须在最后已完成 phase ($LAST_COMPLETED_PHASE) 之后"
|
|
827
|
-
exit 1
|
|
828
|
-
}
|
|
829
|
-
|
|
830
|
-
# 3. Git 状态校验:isolation branch 仍然可达
|
|
831
|
-
ISOLATION_BRANCH=$(grep -o '"branch": "[^"]*"' "$SPRINT_STATE" | head -1 | cut -d'"' -f4)
|
|
832
|
-
ISOLATION_COMMIT=$(grep -o '"created_from_commit": "[^"]*"' "$SPRINT_STATE" | head -1 | cut -d'"' -f4)
|
|
833
|
-
if [ -n "$ISOLATION_BRANCH" ]; then
|
|
834
|
-
git rev-parse --verify "$ISOLATION_BRANCH" >/dev/null 2>&1 || {
|
|
835
|
-
echo "[BLOCK] isolation branch '$ISOLATION_BRANCH' 已不存在(可能被删除或 force push 覆盖)"
|
|
836
|
-
exit 1
|
|
837
|
-
}
|
|
838
|
-
fi
|
|
839
|
-
if [ -n "$ISOLATION_COMMIT" ]; then
|
|
840
|
-
git cat-file -e "${ISOLATION_COMMIT}^{commit}" 2>/dev/null || {
|
|
841
|
-
echo "[WARN] isolation commit $ISOLATION_COMMIT 不可达(可能被 GC 或 rebase 清理),恢复后可能状态不一致"
|
|
842
|
-
# WARN 而非 BLOCK — 可继续但有风险
|
|
843
|
-
}
|
|
844
|
-
fi
|
|
845
|
-
|
|
846
|
-
# 4. 文件时效性校验:前置摘要文件的 mtime 不晚于其生成 phase 的完成时间
|
|
847
|
-
RESUME_PREREQ_PHASE=$((RESUME_PHASE - 1))
|
|
848
|
-
PREREQ_FILE=".sprint-state/phase-outputs/phase-${RESUME_PREREQ_PHASE}-summary.md"
|
|
849
|
-
[ -f "$PREREQ_FILE" ] || { echo "[BLOCK] 前置摘要文件 ${PREREQ_FILE} 不存在"; exit 1; }
|
|
850
|
-
|
|
851
|
-
# 提取前置 phase 的完成时间
|
|
852
|
-
PREREQ_COMPLETED_AT=$(grep -A3 "\"phase\": $RESUME_PREREQ_PHASE" "$SPRINT_STATE" 2>/dev/null | grep "completed_at" | head -1 | cut -d'"' -f4)
|
|
853
|
-
if [ -n "$PREREQ_COMPLETED_AT" ] && [ "$PREREQ_COMPLETED_AT" != "null" ]; then
|
|
854
|
-
FILE_MTIME=$(stat -c %Y "$PREREQ_FILE" 2>/dev/null || stat -f %m "$PREREQ_FILE" 2>/dev/null)
|
|
855
|
-
COMPLETED_EPOCH=$(date -d "$PREREQ_COMPLETED_AT" +%s 2>/dev/null || echo "")
|
|
856
|
-
if [ -n "$FILE_MTIME" ] && [ -n "$COMPLETED_EPOCH" ]; then
|
|
857
|
-
# 容忍 60 秒时钟偏差
|
|
858
|
-
[ "$FILE_MTIME" -le $((COMPLETED_EPOCH + 60)) ] || {
|
|
859
|
-
echo "[WARN] 前置摘要文件 ${PREREQ_FILE} 在 phase $RESUME_PREREQ_PHASE 完成后被修改(mtime: $(date -d @$FILE_MTIME '+%Y-%m-%d %H:%M:%S'), completed_at: $PREREQ_COMPLETED_AT)"
|
|
860
|
-
echo "[ACTION] 继续恢复前请确认修改是预期的。输入 'confirm' 继续,其他取消:"
|
|
861
|
-
read USER_CONFIRM
|
|
862
|
-
[ "$USER_CONFIRM" = "confirm" ] || { echo "[BLOCK] 用户取消恢复"; exit 1; }
|
|
863
|
-
}
|
|
864
|
-
fi
|
|
865
|
-
fi
|
|
866
|
-
|
|
867
|
-
# 5. specification.yaml 时效性校验(仅 --resume-from build)
|
|
868
|
-
SPEC_FILE="specification.yaml"
|
|
869
|
-
if [ "$RESUME_PHASE" -ge 2 ] && [ -f "$SPEC_FILE" ]; then
|
|
870
|
-
SPEC_MTIME=$(stat -c %Y "$SPEC_FILE" 2>/dev/null || stat -f %m "$SPEC_FILE" 2>/dev/null)
|
|
871
|
-
PLAN_COMPLETED_AT=$(grep -A3 '"phase": 1' "$SPRINT_STATE" 2>/dev/null | grep "completed_at" | head -1 | cut -d'"' -f4)
|
|
872
|
-
if [ -n "$SPEC_MTIME" ] && [ -n "$PLAN_COMPLETED_AT" ] && [ "$PLAN_COMPLETED_AT" != "null" ]; then
|
|
873
|
-
PLAN_EPOCH=$(date -d "$PLAN_COMPLETED_AT" +%s 2>/dev/null || echo "")
|
|
874
|
-
if [ -n "$PLAN_EPOCH" ] && [ "$SPEC_MTIME" -gt $((PLAN_EPOCH + 60)) ]; then
|
|
875
|
-
echo "[WARN] specification.yaml 在 Plan phase 完成后被修改"
|
|
876
|
-
echo "[ACTION] 继续恢复前请确认 specification.yaml 的修改是预期的。输入 'confirm' 继续:"
|
|
877
|
-
read USER_CONFIRM
|
|
878
|
-
[ "$USER_CONFIRM" = "confirm" ] || { echo "[BLOCK] 用户取消恢复"; exit 1; }
|
|
879
|
-
fi
|
|
880
|
-
fi
|
|
881
|
-
fi
|
|
882
|
-
|
|
883
|
-
echo "✅ RESUME GATE PASSED — 断点校验通过"
|
|
884
|
-
# 继续执行 Phase Transition Gate
|
|
885
|
-
```
|
|
886
337
|
|
|
887
|
-
|
|
888
|
-
orchestrator 必须展示失败原因并建议用户启动新 Sprint 或手动修复后重试。
|
|
889
|
-
|
|
890
|
-
### WORKTREE ENFORCEMENT(Issue #84)
|
|
891
|
-
|
|
892
|
-
Phase -1 执行完毕后,**所有后续操作(Phase 0 到 Phase 8)的文件编辑、命令执行 MUST 在 worktree 目录下执行**:
|
|
893
|
-
|
|
894
|
-
- **工作目录**:所有 Bash 命令必须通过 `workdir` 参数或 `&&` 链式命令在 worktree 路径下执行
|
|
895
|
-
- **文件写入**:所有 `write`、`edit` 工具的 `filePath` 必须位于 `isolation.worktree_path` 下
|
|
896
|
-
- **验证步骤**:Phase 0 开始前,输出 `[WORKTREE] 后续所有操作将在 {worktree_path} 中进行`
|
|
897
|
-
- **例外**:`.gitignore` 校验(Phase -1 表步 4)和 `git worktree remove`(Phase 8 清理)在仓库根目录执行
|
|
898
|
-
Sprint state is persisted as JSON in `.sprint-state/sprint-state.json`:
|
|
899
|
-
```json
|
|
900
|
-
{
|
|
901
|
-
"id": "sprint-2026-04-26-01",
|
|
902
|
-
"task_description": "开发访谈机器人,支持多轮对话",
|
|
903
|
-
"phase": -1,
|
|
904
|
-
"status": "running|paused|completed",
|
|
905
|
-
"started_at": "2026-04-26T10:00:00Z",
|
|
906
|
-
"isolation": {
|
|
907
|
-
"worktree_path": ".worktrees/sprint/sprint-2026-04-26-01",
|
|
908
|
-
"branch": "sprint/2026-04-26-01",
|
|
909
|
-
"created_from": "main",
|
|
910
|
-
"created_from_commit": "abc123def..."
|
|
911
|
-
},
|
|
912
|
-
"auto_estimate": {
|
|
913
|
-
"change_type": "删除已存在代码|修改已存在代码|新增功能|Bug修复",
|
|
914
|
-
"metrics": {
|
|
915
|
-
"ref_count": 12,
|
|
916
|
-
"cross_module_count": 3,
|
|
917
|
-
"modules": ["auth", "user", "admin"],
|
|
918
|
-
"circular_dep": true,
|
|
919
|
-
"public_api_count": 5,
|
|
920
|
-
"test_file_count": 4
|
|
921
|
-
},
|
|
922
|
-
"estimated_level": "轻量|标准|复杂",
|
|
923
|
-
"recommended_flow": "轻量流程 (Phase 0-3, reduced-intensity Delphi)|标准流程 (Phase 0-4)|完整 Sprint Flow (Phase 0-8)",
|
|
924
|
-
"risk_warnings": ["循环依赖: user ↔ plane"],
|
|
925
|
-
"user_decision": "accepted|overridden|cancelled",
|
|
926
|
-
"override_reason": null
|
|
927
|
-
},
|
|
928
|
-
"phase_history": [
|
|
929
|
-
{
|
|
930
|
-
"phase": -1,
|
|
931
|
-
"phase_name": "ISOLATE",
|
|
932
|
-
"status": "completed",
|
|
933
|
-
"started_at": "2026-04-26T10:00:00Z",
|
|
934
|
-
"completed_at": "2026-04-26T10:03:00Z",
|
|
935
|
-
"duration_seconds": 180
|
|
936
|
-
}
|
|
937
|
-
],
|
|
938
|
-
"outputs": {
|
|
939
|
-
"pain_document": "docs/pain-document.md",
|
|
940
|
-
"specification": "specification.yaml",
|
|
941
|
-
"mvp": "mvp-v1/",
|
|
942
|
-
"review_report": "review-report.md"
|
|
943
|
-
},
|
|
944
|
-
"metrics": {
|
|
945
|
-
"tests_passed": 15,
|
|
946
|
-
"tests_failed": 0,
|
|
947
|
-
"coverage_pct": 85
|
|
948
|
-
}
|
|
949
|
-
}
|
|
950
|
-
```
|
|
951
|
-
|
|
952
|
-
**新增字段说明**:
|
|
953
|
-
- `task_description`: Sprint 需求描述(Phase -1 启动时写入)
|
|
954
|
-
- `started_at`: Sprint 启动时间戳(Phase -1 启动时写入,ISO 8601 格式)
|
|
955
|
-
- `phase_history`: 阶段历史数组,每个元素记录阶段的执行信息:
|
|
956
|
-
- `phase`: 阶段编号
|
|
957
|
-
- `phase_name`: 阶段名称
|
|
958
|
-
- `status`: completed / running / failed / skipped
|
|
959
|
-
- `started_at`: 阶段开始时间(ISO 8601)
|
|
960
|
-
- `completed_at`: 阶段完成时间(null 表示未完成)
|
|
961
|
-
- `duration_seconds`: 耗时秒数(null 表示未完成)
|
|
962
|
-
|
|
963
|
-
**Eval assertions check for:** `phase`, `status`, `isolation.branch`, `outputs.specification`, `metrics.coverage_pct`, `phase_history`, `task_description`.
|
|
338
|
+
## 编排层规则(Orchestration Rules)
|
|
964
339
|
|
|
965
|
-
|
|
340
|
+
全部内容: 参见 `references/orchestration-rules.md`。包含:
|
|
341
|
+
- Agent Dispatch (4 types), Phase Subagent Matrix, CONTEXT INHERITANCE
|
|
342
|
+
- Phase Transition Rules, Phase Summary schema, Phase Transition Gate, RESUME GATE
|
|
343
|
+
- WORKTREE ENFORCEMENT, Eval assertions
|
|
966
344
|
|
|
967
345
|
## 参数说明
|
|
968
346
|
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
```bash
|
|
991
|
-
/sprint-flow "继续 Sprint" --resume-from build --spec specification.yaml
|
|
992
|
-
# → 1. 执行 RESUME GATE(校验 sprint-state + git 状态 + 文件时效性)
|
|
993
|
-
# → 2. 执行 Phase Transition Gate(校验摘要文件格式)
|
|
994
|
-
# → 3. 从 Build 恢复,但必须已有 specification.yaml + .sprint-state/delphi-reviewed.json (verdict: APPROVED)
|
|
995
|
-
# 适用场景:中断恢复,使用已通过 delphi-review 的 specification.yaml
|
|
996
|
-
```
|
|
997
|
-
|
|
998
|
-
**已知限制**:
|
|
999
|
-
- `--resume-from` 校验为**尽力而为**:git commit 可被 GC 回收、文件 mtime 可被 `git checkout` 修改
|
|
1000
|
-
- 校验失败时 orchestrator 应输出完整诊断日志,建议用户启动新 Sprint 而非手动修补
|
|
1001
|
-
|
|
1002
|
-
### --phase(只执行单个阶段)
|
|
1003
|
-
|
|
1004
|
-
```bash
|
|
1005
|
-
/sprint-flow "评审代码" --phase review-only
|
|
1006
|
-
# → 只执行 Phase 3 的评审
|
|
1007
|
-
# 适用场景:单独验证某个阶段
|
|
1008
|
-
```
|
|
1009
|
-
|
|
1010
|
-
### --status(查看 Sprint 进度)
|
|
1011
|
-
|
|
1012
|
-
```bash
|
|
1013
|
-
/sprint-flow --status
|
|
1014
|
-
# → 执行 node scripts/render-sprint-progress.cjs
|
|
1015
|
-
# → 读取 .sprint-state/sprint-state.json 并渲染 ASCII 进度看板
|
|
1016
|
-
# → 不执行任何 Phase,仅展示当前状态
|
|
1017
|
-
# 适用场景:碎片时间恢复时快速查看进度、中断后确认当前阶段和下一步操作
|
|
1018
|
-
```
|
|
1019
|
-
|
|
1020
|
-
**行为规则**:
|
|
1021
|
-
- 执行 `node scripts/render-sprint-progress.cjs`(脚本自动处理所有渲染逻辑)
|
|
1022
|
-
- 如果 `sprint-state.json` 不存在 → 脚本输出 `[INFO] 未找到活跃的 Sprint。请先运行 /sprint-flow "[需求描述]" 启动新 Sprint。`
|
|
1023
|
-
- 如果 `status == "completed"` → 脚本输出完整看板 + `[INFO] Sprint 已完成。`
|
|
347
|
+
| 参数 | 作用 | 示例 |
|
|
348
|
+
|------|------|------|
|
|
349
|
+
| (无参数) | 全流程 Think → Plan → Build → Review → Ship | `/sprint-flow "开发访谈机器人"` |
|
|
350
|
+
| `--stop-at <phase>` | 执行到指定 Phase 后停止 | `--stop-at plan` |
|
|
351
|
+
| `--resume-from <phase>` | 从指定 Phase 恢复(需先执行 RESUME GATE) | `--resume-from build --spec specification.yaml` |
|
|
352
|
+
| `--phase <name>` | 只执行单个 Phase | `--phase review-only` |
|
|
353
|
+
| `--status` | 查看 Sprint 进度(只读,不执行 Phase) | `--status` |
|
|
354
|
+
| `--lang <lang>` | 指定项目语言 | `--lang springboot` / `django` / `golang` |
|
|
355
|
+
| `--type <type>` | 指定项目类型 | `--type web-nextjs` / `backend-django` |
|
|
356
|
+
| `--spec <file>` | 使用已有的 specification.yaml | `--spec path/to/spec.yaml` |
|
|
357
|
+
| `--no-isolate` | 跳过 git worktree 隔离 | `--no-isolate` |
|
|
358
|
+
| `--branch-name <name>` | 自定义分支名 | `--branch-name feat/my-feature` |
|
|
359
|
+
| `--force` | 强制在当前分支继续 | `--force` |
|
|
360
|
+
| `--with-performance` | 启用负载/压力测试 | `--with-performance` |
|
|
361
|
+
| `--mode <mode>` | 构建模式(ralph-loop / parallel) | `--mode ralph-loop` |
|
|
362
|
+
|
|
363
|
+
**`--status` 行为规则**:
|
|
364
|
+
- 执行 `node scripts/render-sprint-progress.cjs`,读取 `.sprint-state/sprint-state.json` 并渲染 ASCII 进度看板
|
|
365
|
+
- 如果 `sprint-state.json` 不存在 → `[INFO] 未找到活跃的 Sprint`
|
|
366
|
+
- 如果 `status == "completed"` → 输出完整看板 + `[INFO] Sprint 已完成。`
|
|
1024
367
|
- `--status` 可与其他参数组合:`--status --resume-from build` → 先展示状态,再提示 "将从 Phase 2 BUILD 继续"
|
|
1025
|
-
- 向后兼容:旧版 `sprint-state.json` 缺少 `phase_history`/`task_description` 时,按模板"向后兼容"规则渲染
|
|
1026
|
-
|
|
1027
|
-
### --lang(指定项目语言)
|
|
1028
368
|
|
|
1029
|
-
|
|
1030
|
-
/sprint-flow "开发用户认证模块" --lang springboot
|
|
1031
|
-
# Phase 2 自动调用 springboot-tdd + springboot-verification
|
|
369
|
+
**`--resume-from` 限制**:校验为**尽力而为**(git commit 可被 GC 回收、文件 mtime 可被 `git checkout` 修改)。校验失败时输出完整诊断日志,建议启动新 Sprint。
|
|
1032
370
|
|
|
1033
|
-
|
|
1034
|
-
# Phase 2 自动调用 django-tdd + django-verification
|
|
1035
|
-
|
|
1036
|
-
/sprint-flow "开发并发任务调度器" --lang golang
|
|
1037
|
-
# Phase 2 自动调用 golang-testing
|
|
1038
|
-
```
|
|
371
|
+
**项目类型自动检测**(按顺序检查):
|
|
1039
372
|
|
|
1040
|
-
### --type(指定项目类型)
|
|
1041
|
-
|
|
1042
|
-
```bash
|
|
1043
|
-
/sprint-flow "开发用户登录页面" --type web-nextjs
|
|
1044
|
-
/sprint-flow "开发 REST API" --type backend-django
|
|
1045
|
-
# 默认: 从项目文件自动检测
|
|
1046
|
-
```
|
|
1047
|
-
|
|
1048
|
-
自动检测逻辑(按顺序检查):
|
|
1049
|
-
|
|
1050
373
|
| 检测条件 | 类型 |
|
|
1051
374
|
|---------|------|
|
|
1052
375
|
| `package.json` + `next.config.js` | `web-nextjs` |
|
|
1053
|
-
| `package.json` + `vite.config.ts` +
|
|
1054
|
-
| `package.json` +
|
|
376
|
+
| `package.json` + `vite.config.ts` + react 依赖 | `web-react` |
|
|
377
|
+
| `package.json` + vue 依赖 | `web-vue` |
|
|
1055
378
|
| `pubspec.yaml` + `flutter:` | `mobile-flutter` |
|
|
1056
|
-
| `package.json` +
|
|
1057
|
-
| `go.mod` | `backend-go`
|
|
1058
|
-
| `pom.xml` | `backend-springboot`
|
|
1059
|
-
| `manage.py` 或 `pyproject.toml` (django) | `backend-django`
|
|
379
|
+
| `package.json` + react-native 依赖 or `ios/` + `android/` | `mobile-react-native` |
|
|
380
|
+
| `go.mod` | `backend-go` (可选 k6) |
|
|
381
|
+
| `pom.xml` | `backend-springboot` (可选 gatling) |
|
|
382
|
+
| `manage.py` 或 `pyproject.toml` (django) | `backend-django` (可选 locust) |
|
|
1060
383
|
| 无匹配 | `backend-cli` |
|
|
1061
384
|
|
|
1062
|
-
|
|
385
|
+
**项目类型 → Skill 注入映射**:
|
|
1063
386
|
|
|
1064
|
-
| Phase | Backend (default) | Web Frontend | Mobile | Load
|
|
1065
|
-
|
|
1066
|
-
|
|
|
1067
|
-
|
|
|
1068
|
-
|
|
|
1069
|
-
|
|
|
1070
|
-
|
|
|
1071
|
-
|
|
|
1072
|
-
|
|
|
1073
|
-
|
|
|
1074
|
-
| Browse | `localhost:3000` | 部署 URL + 表单/交互 | Flutter Web / RN Web
|
|
387
|
+
| Phase | Backend (default) | Web Frontend | Mobile | Load Test |
|
|
388
|
+
|-------|------------------|-------------|--------|-----------|
|
|
389
|
+
| 0 THINK | `brainstorming` | (同) | (同) | (通用) |
|
|
390
|
+
| 1 PLAN | `autoplan` + `delphi-review` | + `design-shotgun` | (同 web) | (同) |
|
|
391
|
+
| 2 BUILD | TDD + blind-review | (同 backend) | + `vercel-react-native-skills` / `flutter-review` | (同) |
|
|
392
|
+
| 3 REVIEW | `delphi-review --mode code-walkthrough` + `test-specification-alignment` + k6/locust/gatling | + `qa` + `design-review` + `benchmark` | Flutter: `flutter-test` / RN: `detox E2E` | k6/locust/gatling |
|
|
393
|
+
| 5 FEEDBACK | `learn` + `retro` | (同) | (同) | (同) |
|
|
394
|
+
| 6 SHIP | `finishing-a-development-branch` + `ship` | (同) | + platform deploy | (同) |
|
|
395
|
+
| 7 LAND | `land-and-deploy` + canary | (同) | (同) | (同) |
|
|
396
|
+
| 8 CLEANUP | worktree remove + branch delete + state update | (同) | (同) | (同) |
|
|
397
|
+
| Browse | `localhost:3000` | 部署 URL + 表单/交互 | Flutter Web / RN Web | (专用) |
|
|
1075
398
|
|
|
1076
|
-
**Mobile
|
|
1077
|
-
- **Flutter**: `flutter analyze`, `flutter test`, `flutter build`, `pub publish`
|
|
1078
|
-
- **React Native**: `metro`, `detox`, `jest`, `react-native run-ios/android`
|
|
399
|
+
**Mobile 工具链**: Flutter — `flutter analyze/test/build/pub publish`; RN — `metro/detox/jest/react-native run-ios/android`
|
|
1079
400
|
|
|
1080
401
|
---
|
|
1081
402
|
|
|
1082
403
|
## 状态管理
|
|
1083
404
|
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
```yaml
|
|
1087
|
-
Sprint State:
|
|
1088
|
-
id: sprint-YYYY-MM-DD-NN
|
|
1089
|
-
phase: [-1, 0-6] # -1=ISOLATE, 0-6=各阶段
|
|
1090
|
-
status: [pending, running, paused, completed, failed] # 统一状态
|
|
1091
|
-
pause_reason: [none, wait_isolation, wait_approved, wait_gate1, wait_uat, wait_ship, wait_user_confirm]
|
|
1092
|
-
isolation: # Phase -1 隔离信息
|
|
1093
|
-
worktree_path: .worktrees/sprint/sprint-YYYY-MM-DD-NN
|
|
1094
|
-
branch: sprint/YYYY-MM-DD-NN
|
|
1095
|
-
created_from: main
|
|
1096
|
-
created_from_commit: abc123def...
|
|
1097
|
-
|
|
1098
|
-
存储位置: <project-root>/.sprint-state/
|
|
1099
|
-
├─ sprint-state.yaml # 当前 Sprint 状态
|
|
1100
|
-
├─ sprint-state.json # 当前 Sprint 状态 (JSON 格式,同上)
|
|
1101
|
-
└─ phase-outputs/
|
|
1102
|
-
├─ pain-document.md # Phase 0 输出
|
|
1103
|
-
├─ specification.yaml # Phase 1 输出
|
|
1104
|
-
├─ mvp-v1/ # Phase 2 输出
|
|
1105
|
-
├─ review-report.md # Phase 3 输出
|
|
1106
|
-
├─ emergent-issues.md # Phase 4 输出
|
|
1107
|
-
├─ feedback-log.md # Phase 5 输出
|
|
1108
|
-
└─ sprint-summary.md # Phase 6 输出
|
|
1109
|
-
```
|
|
1110
|
-
|
|
1111
|
-
### Sprint 2 自动触发机制
|
|
405
|
+
**Sprint State**: 存储于 `<project-root>/.sprint-state/` — `sprint-state.yaml`/`.json` + `phase-outputs/` (pain-document.md / specification.yaml / mvp-v1 / review-report.md / emergent-issues.md / feedback-log.md / sprint-summary.md)
|
|
1112
406
|
|
|
1113
|
-
|
|
1114
|
-
Sprint 结束时 (Phase 6 完成):
|
|
1115
|
-
IF emergent_issues_count == 0 → sprint_completed,结束流程
|
|
1116
|
-
IF emergent_issues_count > 0 → sprint_2_needed:
|
|
1117
|
-
├─ IF emergent_issues 有 Critical → 自动启动 Sprint 2
|
|
1118
|
-
├─ IF emergent_issues 仅 Major/Minor → 询问用户
|
|
1119
|
-
└─ Sprint 2 Pain Document 自动从 emergent-issues.md 转化
|
|
1120
|
-
```
|
|
407
|
+
**Sprint 2 自动触发**: Phase 6 完成时 — `emergent_issues_count == 0` → 结束; `> 0` → Critical 自动启动 Sprint 2, Major/Minor 询问用户
|
|
1121
408
|
|
|
1122
409
|
---
|
|
1123
410
|
|
|
1124
411
|
## 使用示例
|
|
1125
412
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
# 输出:
|
|
1132
|
-
# Phase 0: brainstorming 需求探索 → 设计文档 → ⚠️ HARD-GATE: 等待用户 APPROVED
|
|
1133
|
-
# 用户 APPROVED → 自动进入 Phase 1
|
|
1134
|
-
# Phase 1: autoplan 发现 2 个 taste_decisions → ⚠️ 暂停
|
|
1135
|
-
# 用户确认决策后 → delphi-review → Round 1 REQUEST_CHANGES
|
|
1136
|
-
# 修复 → Round 2 APPROVED → specification.yaml
|
|
1137
|
-
# Phase 2: TDD + freeze + review → verification → MVP v1
|
|
1138
|
-
# Phase 3: cross-model-review APPROVED → browse QA 通过
|
|
1139
|
-
# Phase 4: ⚠️ 用户验收 → 发现 1 个 Major emergent issue
|
|
1140
|
-
# Phase 5: learn → 记录 → Sprint 2 Pain Document
|
|
1141
|
-
# Phase 6: ship → PR → 用户确认合并 → canary 监控
|
|
1142
|
-
# → Sprint Summary → 发现 emergent issue → 提示是否开始 Sprint 2
|
|
1143
|
-
```
|
|
1144
|
-
|
|
1145
|
-
### 示例 2:中断恢复
|
|
1146
|
-
|
|
1147
|
-
```bash
|
|
1148
|
-
# 第一次:执行到 Plan 后停止
|
|
1149
|
-
/sprint-flow "开发用户认证模块" --stop-at plan
|
|
1150
|
-
# → 输出 specification.yaml
|
|
1151
|
-
|
|
1152
|
-
# 第二次:三天后继续
|
|
1153
|
-
/sprint-flow "继续开发" --resume-from build --spec docs/specification.yaml
|
|
1154
|
-
# → 1. RESUME GATE:校验 sprint-state + git + 文件时效性(三天前生成的文件可能 stale)
|
|
1155
|
-
# → 2. Phase Transition Gate:校验摘要文件格式
|
|
1156
|
-
# → 3. 从 Build 入口恢复,但必须已有 specification.yaml + .sprint-state/delphi-reviewed.json (verdict: APPROVED)
|
|
1157
|
-
```
|
|
1158
|
-
|
|
1159
|
-
### 示例 3:语言特定
|
|
1160
|
-
|
|
1161
|
-
```bash
|
|
1162
|
-
/sprint-flow "开发 REST API" --lang django
|
|
1163
|
-
# Phase 2 自动调用 django-tdd + django-verification
|
|
1164
|
-
# Gate 1 包含 Django 特定的验证(migrations, linting, coverage)
|
|
1165
|
-
```
|
|
1166
|
-
|
|
1167
|
-
### 示例 4:使用 --mode parallel(旧有并行模式)
|
|
1168
|
-
|
|
1169
|
-
```bash
|
|
1170
|
-
/sprint-flow "修改单行配置" --mode parallel
|
|
1171
|
-
# 小改动可使用旧有并行模式,一次 dispatch 完成
|
|
1172
|
-
# 注意:默认 ralph-loop 模式已覆盖绝大多数场景
|
|
1173
|
-
```
|
|
1174
|
-
|
|
1175
|
-
### 示例 4b:仅验证隔离(--stop-at isolate)
|
|
1176
|
-
|
|
1177
|
-
```bash
|
|
1178
|
-
/sprint-flow "开发用户登录" --stop-at isolate
|
|
1179
|
-
# → 仅执行 Phase -1 ISOLATE
|
|
1180
|
-
# → 检测 main 分支 → 创建 worktree → setup → .gitignore → baseline
|
|
1181
|
-
# → 输出 worktree 路径 → 停止
|
|
1182
|
-
# 适用场景:手动验证隔离是否正常创建,后续手动决定是否继续
|
|
1183
|
-
```
|
|
1184
|
-
|
|
1185
|
-
### 示例 5:Worktree 隔离(默认行为)
|
|
1186
|
-
|
|
1187
|
-
```bash
|
|
1188
|
-
/sprint-flow "开发用户登录"
|
|
1189
|
-
# Phase -1 ISOLATE:
|
|
1190
|
-
# → 检测当前在 main 分支(保护分支)→ 强制创建 worktree
|
|
1191
|
-
# → mkdir -p .worktrees/sprint
|
|
1192
|
-
# → 检测已有 NN 编号(.worktrees/sprint/ | grep -oE '[0-9]{2}$' | sort -n | tail -1)
|
|
1193
|
-
# → git worktree add .worktrees/sprint/sprint-2026-05-24-01 -b sprint/2026-05-24-01
|
|
1194
|
-
# → 在 worktree 目录下:npm install → 基线测试 → .sprint-state/ 记录
|
|
1195
|
-
# → 进入 Phase 0 THINK...
|
|
1196
|
-
|
|
1197
|
-
# 跳过隔离(⚠️ 有污染风险)
|
|
1198
|
-
/sprint-flow "开发用户登录" --no-isolate
|
|
1199
|
-
# → [WARN] 未创建 worktree 隔离,在 main 分支上直接运行 sprint 有污染风险
|
|
1200
|
-
# → 直接进入 Phase 0
|
|
1201
|
-
|
|
1202
|
-
# 强制跳过(需用户确认)
|
|
1203
|
-
/sprint-flow "开发用户登录" --force
|
|
1204
|
-
# → [WARN] 使用 --force 在 main 分支上直接运行 sprint → 等待用户确认 → 确认后进入 Phase 0
|
|
1205
|
-
|
|
1206
|
-
# 自定义分支名
|
|
1207
|
-
/sprint-flow "开发用户登录" --branch-name feat/user-login
|
|
1208
|
-
# → 分支名:feat/user-login(保留 /)
|
|
1209
|
-
# → worktree 路径:.worktrees/sprint/feat-user-login(/ 替换为 -)
|
|
1210
|
-
|
|
1211
|
-
# Sprint 完成后安全清理:先列出本 sprint 的 isolation.worktree_path
|
|
1212
|
-
# 仅清理 sprint-state 中记录的精确 worktree 路径
|
|
1213
|
-
# 禁止使用通配符或递归 shell 删除命令
|
|
1214
|
-
# 如果自动清理失败,输出目标路径并要求用户手动处理
|
|
1215
|
-
```
|
|
1216
|
-
|
|
1217
|
-
---
|
|
413
|
+
| 场景 | 命令 | 说明 |
|
|
414
|
+
|------|------|------|
|
|
415
|
+
| 完整流水线 | `/sprint-flow "开发访谈机器人"` | 自动执行 11 阶段 → specification.yaml + PR URL |
|
|
416
|
+
| 规划后停止 | `/sprint-flow "开发认证模块" --stop-at plan` | 输出 specification.yaml 后停止,供评审 |
|
|
417
|
+
| 仅构建阶段 | `/sprint-flow "开发 API" --lang django --phase build-only` | 跳过隔离/规划,直接 Build |
|
|
1218
418
|
|
|
1219
419
|
## 底层 Skills 保持独立
|
|
1220
420
|
|
|
1221
|
-
所有被调用的 Skills
|
|
1222
|
-
- 用户可以直接调用 `delphi-review` 单独评审
|
|
1223
|
-
- 用户可以直接调用 `test-driven-development` 单独执行 TDD
|
|
1224
|
-
- sprint-flow 只是自动串联调用,不替代底层 Skills
|
|
421
|
+
所有被调用的 Skills 独立可用:`delphi-review` (单独评审), `test-driven-development` (TDD),sprint-flow 仅自动串联
|
|
1225
422
|
|
|
1226
423
|
---
|
|
1227
424
|
|
|
@@ -1248,68 +445,17 @@ See [Output Contract](#output-contract) below for the canonical machine-readable
|
|
|
1248
445
|
|
|
1249
446
|
## Output Contract
|
|
1250
447
|
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
**Phase Summary** (all automated Phases must output):
|
|
1254
|
-
```markdown
|
|
1255
|
-
---
|
|
1256
|
-
phase: <N>
|
|
1257
|
-
phase_name: <NAME>
|
|
1258
|
-
status: completed|paused|failed
|
|
1259
|
-
outputs:
|
|
1260
|
-
- path: "path/to/output"
|
|
1261
|
-
type: file|directory
|
|
1262
|
-
decisions:
|
|
1263
|
-
- title: "Decision title"
|
|
1264
|
-
rationale: "Rationale for decision"
|
|
1265
|
-
unresolved_issues: []
|
|
1266
|
-
next_phase_context: "Context needed by next phase"
|
|
1267
|
-
---
|
|
1268
|
-
|
|
1269
|
-
## Phase Summary
|
|
1270
|
-
Concise summary, <= 50 lines.
|
|
1271
|
-
```
|
|
1272
|
-
|
|
1273
|
-
**Sprint State JSON** (all Phases must maintain):
|
|
1274
|
-
```json
|
|
1275
|
-
{
|
|
1276
|
-
"id": "sprint-YYYY-MM-DD-NN",
|
|
1277
|
-
"phase": <N>,
|
|
1278
|
-
"status": "running|paused|completed|failed",
|
|
1279
|
-
"isolation": {
|
|
1280
|
-
"worktree_path": ".worktrees/sprint/sprint-YYYY-MM-DD-NN",
|
|
1281
|
-
"branch": "sprint/YYYY-MM-DD-NN"
|
|
1282
|
-
},
|
|
1283
|
-
"outputs": {},
|
|
1284
|
-
"metrics": {}
|
|
1285
|
-
}
|
|
1286
|
-
```
|
|
1287
|
-
|
|
1288
|
-
### Final User-Facing Output
|
|
448
|
+
**Phase Summary** (每个 Phase 必须输出 YAML frontmatter): `phase/N`, `phase_name`, `status`, `outputs[]`, `decisions[]`, `next_phase_context` + markdown body (≤50 lines)
|
|
1289
449
|
|
|
1290
|
-
|
|
1291
|
-
- Current Phase and status
|
|
1292
|
-
- Generated file paths
|
|
1293
|
-
- Passed/failed validation commands
|
|
1294
|
-
- Next user decision required (if applicable)
|
|
1295
|
-
- PR URL (Phase 6 success) or cleanup report (Phase 8 success)
|
|
1296
|
-
|
|
1297
|
-
## Security Notes
|
|
450
|
+
**Sprint State JSON**: `{id, phase, status, isolation {worktree_path, branch}, outputs, metrics}` — 存储于 `.sprint-state/sprint-state.json`
|
|
1298
451
|
|
|
1299
|
-
-
|
|
1300
|
-
- 不得使用 `--no-verify` 绕过 quality gates;hook 失败必须修复根因。
|
|
1301
|
-
- 不得自动推送、创建 PR、merge 或 deploy,除非用户请求的流程明确进入 Ship/Land 阶段并已通过前置 gate。
|
|
1302
|
-
- 不得修改、打印或提交 `.delphi-config.json`、API keys、tokens、cookies、SSH keys 等敏感信息。
|
|
1303
|
-
- Phase 7 deploy/canary 失败时必须报告失败并按配置回滚;不可静默忽略部署失败。
|
|
1304
|
-
- Phase 4 用户验收不可由模型代替;人工验收是发布安全边界。
|
|
1305
|
-
- worktree 清理只允许删除本 sprint 创建的 `isolation.worktree_path`,不得删除任意用户目录。
|
|
1306
|
-
|
|
1307
|
-
---
|
|
452
|
+
**Final User-Facing Output**: Phase/status, file paths, validation results, next user decision, PR URL or cleanup report
|
|
1308
453
|
|
|
1309
454
|
## References
|
|
1310
455
|
|
|
1311
456
|
详细指令文件位于 `@references/`:
|
|
1312
457
|
- `@references/phase-minus-1-isolate.md` — Phase -1 详细指令
|
|
458
|
+
- `@references/phase-minus-0-5-auto-estimate.md` — Phase -0.5 详细指令
|
|
1313
459
|
- `@references/phase-0-think.md` — Phase 0 详细指令
|
|
1314
460
|
- `@references/phase-1-plan.md` — Phase 1 详细指令
|
|
1315
461
|
- `@references/phase-2-build.md` — Phase 2 详细指令
|
|
@@ -1317,6 +463,8 @@ When ending or pausing, output:
|
|
|
1317
463
|
- `@references/phase-4-uat.md` — Phase 4 详细指令(人工)
|
|
1318
464
|
- `@references/phase-5-feedback.md` — Phase 5 详细指令
|
|
1319
465
|
- `@references/phase-6-ship.md` — Phase 6 详细指令
|
|
466
|
+
- `@references/phase-7-land.md` — Phase 7 详细指令
|
|
467
|
+
- `@references/phase-8-cleanup.md` — Phase 8 详细指令
|
|
1320
468
|
|
|
1321
469
|
---
|
|
1322
470
|
|
|
@@ -1330,110 +478,6 @@ When ending or pausing, output:
|
|
|
1330
478
|
|
|
1331
479
|
---
|
|
1332
480
|
|
|
1333
|
-
## Anti-Patterns
|
|
1334
|
-
|
|
1335
|
-
| ❌ 错误 | ✅ 正确 |
|
|
1336
|
-
|---|---|
|
|
1337
|
-
| 在保护分支 (main/master) 上直接执行 sprint | Phase -1 自动创建 worktree 隔离 |
|
|
1338
|
-
| 跳过 Phase 4 用户验收("赶时间") | Phase 4 是 HARD-GATE,必须人工验收 |
|
|
1339
|
-
| Phase 2 不安装 Git Hooks 就开始编码 | GITHOOKS-GATE 检查必须先于 BUILD |
|
|
1340
|
-
| 单个 subagent 处理所有 REQ | ralph-loop 逐 REQ 迭代,每个 REQ 独立上下文 |
|
|
1341
|
-
| 验证失败仍 commit | 验证不通过的代码不 commit |
|
|
1342
|
-
| 跳过 Phase 5 FEEDBACK 直接 SHIP | Phase 5 是 HARD-GATE,不可跳过 |
|
|
1343
|
-
| --force 在生产分支上运行不确认 | --force 必须等待用户显式确认风险 |
|
|
1344
|
-
| Phase 6 SHIP 后不清理 worktree/分支 | Phase 8 CLEANUP 必须执行 worktree remove + branch delete |
|
|
1345
|
-
|
|
1346
|
-
---
|
|
1347
|
-
|
|
1348
|
-
## Output Format (MANDATORY)
|
|
1349
|
-
|
|
1350
|
-
Sprint-flow orchestrator MUST output phase transition status as valid JSON:
|
|
1351
|
-
|
|
1352
|
-
```json
|
|
1353
|
-
{
|
|
1354
|
-
"skill_name": "sprint-flow",
|
|
1355
|
-
"sprint_id": "sprint-YYYY-MM-DD-NN",
|
|
1356
|
-
"current_phase": 2,
|
|
1357
|
-
"phase_name": "BUILD",
|
|
1358
|
-
"status": "running|paused|completed|failed",
|
|
1359
|
-
"isolation": {
|
|
1360
|
-
"worktree_path": ".worktrees/sprint/sprint-YYYY-MM-DD-NN",
|
|
1361
|
-
"branch": "sprint/YYYY-MM-DD-NN"
|
|
1362
|
-
},
|
|
1363
|
-
"progress": {
|
|
1364
|
-
"total_phases": 11,
|
|
1365
|
-
"completed_phases": 4,
|
|
1366
|
-
"percentage": 36,
|
|
1367
|
-
"phase_history": [
|
|
1368
|
-
{ "phase": -1, "phase_name": "ISOLATE", "status": "completed", "started_at": "2026-06-02T14:30:00Z", "completed_at": "2026-06-02T14:33:00Z", "duration_seconds": 180 },
|
|
1369
|
-
{ "phase": -0.5, "phase_name": "AUTO-ESTIMATE", "status": "completed", "started_at": "2026-06-02T14:33:00Z", "completed_at": "2026-06-02T14:34:00Z", "duration_seconds": 60 },
|
|
1370
|
-
{ "phase": 0, "phase_name": "THINK", "status": "completed", "started_at": "2026-06-02T14:34:00Z", "completed_at": "2026-06-02T14:59:00Z", "duration_seconds": 1500 },
|
|
1371
|
-
{ "phase": 1, "phase_name": "PLAN", "status": "completed", "started_at": "2026-06-02T14:59:00Z", "completed_at": "2026-06-02T15:17:00Z", "duration_seconds": 1080 },
|
|
1372
|
-
{ "phase": 2, "phase_name": "BUILD", "status": "running", "started_at": "2026-06-02T15:17:00Z", "completed_at": null, "duration_seconds": null }
|
|
1373
|
-
]
|
|
1374
|
-
},
|
|
1375
|
-
"outputs": {
|
|
1376
|
-
"specification": "specification.yaml",
|
|
1377
|
-
"mvp": "mvp-v1/"
|
|
1378
|
-
},
|
|
1379
|
-
"metrics": {
|
|
1380
|
-
"tests_passed": 15,
|
|
1381
|
-
"tests_failed": 0,
|
|
1382
|
-
"coverage_pct": 85
|
|
1383
|
-
}
|
|
1384
|
-
}
|
|
1385
|
-
```
|
|
1386
|
-
|
|
1387
|
-
**Eval assertions check for:** `phase`, `status`, `isolation.branch`, `outputs.specification`, `metrics.coverage_pct`, `progress.phase_history`.
|
|
1388
|
-
|
|
1389
|
-
---
|
|
1390
|
-
|
|
1391
|
-
## Anti-Patterns
|
|
1392
|
-
|
|
1393
|
-
| ❌ 错误 | ✅ 正确 |
|
|
1394
|
-
|---|---|
|
|
1395
|
-
| 在保护分支 (main/master) 上直接执行 sprint | Phase -1 自动创建 worktree 隔离 |
|
|
1396
|
-
| 跳过 Phase 4 用户验收("赶时间") | Phase 4 是 HARD-GATE,必须人工验收 |
|
|
1397
|
-
| Phase 2 不安装 Git Hooks 就开始编码 | GITHOOKS-GATE 检查必须先于 BUILD |
|
|
1398
|
-
| 单个 subagent 处理所有 REQ | ralph-loop 逐 REQ 迭代,每个 REQ 独立上下文 |
|
|
1399
|
-
| 验证失败仍 commit | 验证不通过的代码不 commit |
|
|
1400
|
-
| 跳过 Phase 5 FEEDBACK 直接 SHIP | Phase 5 是 HARD-GATE,不可跳过 |
|
|
1401
|
-
| --force 在生产分支上运行不确认 | --force 必须等待用户显式确认风险 |
|
|
1402
|
-
| Phase 6 SHIP 后不清理 worktree/分支 | Phase 8 CLEANUP 必须执行 worktree remove + branch delete |
|
|
1403
|
-
|
|
1404
|
-
---
|
|
1405
|
-
|
|
1406
|
-
## Output Format (MANDATORY)
|
|
1407
|
-
|
|
1408
|
-
Sprint-flow orchestrator MUST output phase transition status as valid JSON:
|
|
1409
|
-
|
|
1410
|
-
```json
|
|
1411
|
-
{
|
|
1412
|
-
"skill_name": "sprint-flow",
|
|
1413
|
-
"sprint_id": "sprint-YYYY-MM-DD-NN",
|
|
1414
|
-
"current_phase": 2,
|
|
1415
|
-
"phase_name": "BUILD",
|
|
1416
|
-
"status": "running|paused|completed|failed",
|
|
1417
|
-
"isolation": {
|
|
1418
|
-
"worktree_path": ".worktrees/sprint/sprint-YYYY-MM-DD-NN",
|
|
1419
|
-
"branch": "sprint/YYYY-MM-DD-NN"
|
|
1420
|
-
},
|
|
1421
|
-
"outputs": {
|
|
1422
|
-
"specification": "specification.yaml",
|
|
1423
|
-
"mvp": "mvp-v1/"
|
|
1424
|
-
},
|
|
1425
|
-
"metrics": {
|
|
1426
|
-
"tests_passed": 15,
|
|
1427
|
-
"tests_failed": 0,
|
|
1428
|
-
"coverage_pct": 85
|
|
1429
|
-
}
|
|
1430
|
-
}
|
|
1431
|
-
```
|
|
1432
|
-
|
|
1433
|
-
**Eval assertions check for:** `phase`, `status`, `isolation.branch`, `outputs.specification`, `metrics.coverage_pct`.
|
|
1434
|
-
|
|
1435
|
-
---
|
|
1436
|
-
|
|
1437
481
|
## 研究证据
|
|
1438
482
|
|
|
1439
483
|
| 证据 | 来源 | 应用 |
|