@devcxl/opencode-cabbage 0.3.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -19
- package/README.zh.md +34 -19
- package/assets/agents/dev-lifecycle.md +60 -49
- package/assets/agents/team/architect.md +8 -1
- package/assets/agents/team/developer.md +89 -0
- package/assets/agents/team/goal-verify.md +5 -1
- package/assets/agents/team/reviewer.md +6 -0
- package/assets/commands/code.md +3 -2
- package/assets/commands/design.md +3 -2
- package/assets/commands/release.md +3 -2
- package/assets/commands/requirements.md +3 -2
- package/assets/commands/review.md +3 -2
- package/assets/commands/setup.md +3 -2
- package/assets/commands/tasks.md +2 -1
- package/assets/prompts/bootstrap.md +9 -8
- package/assets/prompts/stage-contract.md +55 -0
- package/assets/skills/flow-code/SKILL.md +38 -140
- package/assets/skills/flow-design/SKILL.md +28 -79
- package/assets/skills/flow-release/SKILL.md +31 -51
- package/assets/skills/flow-requirements/SKILL.md +31 -196
- package/assets/skills/flow-review/SKILL.md +26 -123
- package/assets/skills/flow-setup/SKILL.md +40 -43
- package/assets/skills/flow-tasks/SKILL.md +23 -153
- package/assets/skills/flow-tdd/SKILL.md +30 -31
- package/dist/kernel/caller.d.ts +48 -0
- package/dist/kernel/caller.js +88 -0
- package/dist/kernel/caller.js.map +1 -0
- package/dist/kernel/context.d.ts +27 -0
- package/dist/kernel/context.js +84 -0
- package/dist/kernel/context.js.map +1 -0
- package/dist/kernel/flow.d.ts +175 -0
- package/dist/kernel/flow.js +467 -0
- package/dist/kernel/flow.js.map +1 -0
- package/dist/kernel/legacy.d.ts +19 -0
- package/dist/kernel/legacy.js +34 -0
- package/dist/kernel/legacy.js.map +1 -0
- package/dist/kernel/mutex.d.ts +8 -0
- package/dist/kernel/mutex.js +23 -0
- package/dist/kernel/mutex.js.map +1 -0
- package/dist/kernel/permission.d.ts +21 -0
- package/dist/kernel/permission.js +45 -0
- package/dist/kernel/permission.js.map +1 -0
- package/dist/kernel/profile.d.ts +35 -0
- package/dist/kernel/profile.js +147 -0
- package/dist/kernel/profile.js.map +1 -0
- package/dist/kernel/records.d.ts +103 -0
- package/dist/kernel/records.js +240 -0
- package/dist/kernel/records.js.map +1 -0
- package/dist/kernel/release.d.ts +106 -0
- package/dist/kernel/release.js +241 -0
- package/dist/kernel/release.js.map +1 -0
- package/dist/kernel/review.d.ts +34 -0
- package/dist/kernel/review.js +82 -0
- package/dist/kernel/review.js.map +1 -0
- package/dist/kernel/session-index.d.ts +45 -0
- package/dist/kernel/session-index.js +136 -0
- package/dist/kernel/session-index.js.map +1 -0
- package/dist/kernel/setup.d.ts +95 -0
- package/dist/kernel/setup.js +401 -0
- package/dist/kernel/setup.js.map +1 -0
- package/dist/kernel/slug.d.ts +23 -0
- package/dist/kernel/slug.js +67 -0
- package/dist/kernel/slug.js.map +1 -0
- package/dist/kernel/task.d.ts +213 -0
- package/dist/kernel/task.js +873 -0
- package/dist/kernel/task.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
- package/dist/{flowrun → kernel/tdd}/adapter.js +27 -26
- package/dist/kernel/tdd/adapter.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/digest.d.ts +2 -1
- package/dist/{flowrun → kernel/tdd}/digest.js +6 -4
- package/dist/kernel/tdd/digest.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
- package/dist/{flowrun → kernel/tdd}/evaluator.js +1 -1
- package/dist/kernel/tdd/evaluator.js.map +1 -0
- package/dist/kernel/tdd/evidence.d.ts +42 -0
- package/dist/kernel/tdd/evidence.js +48 -0
- package/dist/kernel/tdd/evidence.js.map +1 -0
- package/dist/{flowrun → kernel/tdd}/state.d.ts +2 -2
- package/dist/{flowrun → kernel/tdd}/state.js +1 -1
- package/dist/kernel/tdd/state.js.map +1 -0
- package/dist/kernel/types.d.ts +180 -0
- package/dist/kernel/types.js +2 -0
- package/dist/kernel/types.js.map +1 -0
- package/dist/kernel/worktree.d.ts +45 -0
- package/dist/kernel/worktree.js +156 -0
- package/dist/kernel/worktree.js.map +1 -0
- package/dist/plugin/agents.d.ts +5 -17
- package/dist/plugin/agents.js +0 -23
- package/dist/plugin/agents.js.map +1 -1
- package/dist/plugin/flow-control.d.ts +91 -0
- package/dist/plugin/flow-control.js +287 -0
- package/dist/plugin/flow-control.js.map +1 -0
- package/dist/plugin/goal.d.ts +17 -46
- package/dist/plugin/goal.js +47 -117
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/prompt-lint.js +78 -6
- package/dist/plugin/prompt-lint.js.map +1 -1
- package/dist/plugin/release-control.d.ts +39 -0
- package/dist/plugin/release-control.js +343 -0
- package/dist/plugin/release-control.js.map +1 -0
- package/dist/plugin/server.d.ts +19 -0
- package/dist/plugin/server.js +198 -320
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/setup-control.d.ts +59 -0
- package/dist/plugin/setup-control.js +111 -0
- package/dist/plugin/setup-control.js.map +1 -0
- package/dist/plugin/shell.d.ts +7 -34
- package/dist/plugin/shell.js +12 -137
- package/dist/plugin/shell.js.map +1 -1
- package/dist/plugin/skills.d.ts +1 -1
- package/dist/plugin/skills.js +1 -7
- package/dist/plugin/skills.js.map +1 -1
- package/dist/plugin/task-control.d.ts +90 -0
- package/dist/plugin/task-control.js +208 -0
- package/dist/plugin/task-control.js.map +1 -0
- package/dist/plugin/tdd-checkpoint.d.ts +128 -0
- package/dist/plugin/tdd-checkpoint.js +664 -0
- package/dist/plugin/tdd-checkpoint.js.map +1 -0
- package/dist/util/gh.d.ts +5 -0
- package/dist/util/gh.js +12 -0
- package/dist/util/gh.js.map +1 -1
- package/dist/util/paths.d.ts +6 -2
- package/dist/util/paths.js +15 -7
- package/dist/util/paths.js.map +1 -1
- package/package.json +4 -4
- package/assets/agents/team/backend.md +0 -100
- package/assets/agents/team/frontend.md +0 -98
- package/assets/commands/handoff.md +0 -4
- package/assets/commands/test.md +0 -4
- package/assets/context/CONTEXT.md +0 -41
- package/assets/skills/flow-handoff/SKILL.md +0 -76
- package/assets/skills/flow-test/SKILL.md +0 -75
- package/dist/flowrun/adapter.js.map +0 -1
- package/dist/flowrun/audit.d.ts +0 -5
- package/dist/flowrun/audit.js +0 -67
- package/dist/flowrun/audit.js.map +0 -1
- package/dist/flowrun/ci.d.ts +0 -64
- package/dist/flowrun/ci.js +0 -184
- package/dist/flowrun/ci.js.map +0 -1
- package/dist/flowrun/coverage.d.ts +0 -70
- package/dist/flowrun/coverage.js +0 -207
- package/dist/flowrun/coverage.js.map +0 -1
- package/dist/flowrun/digest.js.map +0 -1
- package/dist/flowrun/evaluator.js.map +0 -1
- package/dist/flowrun/gate.d.ts +0 -28
- package/dist/flowrun/gate.js +0 -139
- package/dist/flowrun/gate.js.map +0 -1
- package/dist/flowrun/github.d.ts +0 -24
- package/dist/flowrun/github.js +0 -154
- package/dist/flowrun/github.js.map +0 -1
- package/dist/flowrun/index.d.ts +0 -14
- package/dist/flowrun/index.js +0 -15
- package/dist/flowrun/index.js.map +0 -1
- package/dist/flowrun/merge.d.ts +0 -57
- package/dist/flowrun/merge.js +0 -180
- package/dist/flowrun/merge.js.map +0 -1
- package/dist/flowrun/migration.d.ts +0 -11
- package/dist/flowrun/migration.js +0 -276
- package/dist/flowrun/migration.js.map +0 -1
- package/dist/flowrun/resilience.d.ts +0 -18
- package/dist/flowrun/resilience.js +0 -80
- package/dist/flowrun/resilience.js.map +0 -1
- package/dist/flowrun/state.js.map +0 -1
- package/dist/flowrun/transitions.d.ts +0 -66
- package/dist/flowrun/transitions.js +0 -168
- package/dist/flowrun/transitions.js.map +0 -1
- package/dist/flowrun/types.d.ts +0 -356
- package/dist/flowrun/types.js +0 -21
- package/dist/flowrun/types.js.map +0 -1
- package/dist/flowrun/validator.d.ts +0 -19
- package/dist/flowrun/validator.js +0 -209
- package/dist/flowrun/validator.js.map +0 -1
- package/dist/plugin/broker.d.ts +0 -73
- package/dist/plugin/broker.js +0 -140
- package/dist/plugin/broker.js.map +0 -1
- package/dist/plugin/tdd-tool.d.ts +0 -62
- package/dist/plugin/tdd-tool.js +0 -336
- package/dist/plugin/tdd-tool.js.map +0 -1
|
@@ -1,249 +1,84 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flow-requirements
|
|
3
|
-
description: 渐进式需求澄清 → PRD
|
|
3
|
+
description: 渐进式需求澄清 → PRD → Flow Record(flow_control)
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# flow-requirements
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
通过渐进式需求澄清将松散想法凝固为 PRD,并用 `flow_control{op:"create-flow"}` 创建 Flow Record(Parent Issue)。
|
|
9
9
|
|
|
10
10
|
## 核心理念:战争迷雾(Fog of War)
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- 只定义**前沿**(当前可见的待决策问题)
|
|
15
|
-
- 逐个解决前沿问题,每解决一个,迷雾推开一层,新问题浮现
|
|
16
|
-
- 直到前沿推至足够远,所有关键决策已定,PRD 自然成形
|
|
17
|
-
|
|
18
|
-
## Prerequisites
|
|
19
|
-
|
|
20
|
-
- `/setup` 已完成(gh CLI 可用,docs 目录就绪)
|
|
21
|
-
|
|
22
|
-
---
|
|
12
|
+
需求澄清不是一次性穷举——只定义**前沿**(当前可见的待决策问题),逐个解决,每解决一个迷雾推开一层,直到所有关键决策已定,PRD 自然成形。
|
|
23
13
|
|
|
24
14
|
## Phase A:创建决策映射
|
|
25
15
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
### A1. 锚定核心问题
|
|
29
|
-
|
|
30
|
-
先问第一个问题,锁定需求的核心:
|
|
31
|
-
|
|
32
|
-
> "这个需求最终要解决什么问题?不做会怎样?"
|
|
33
|
-
|
|
34
|
-
不要同时问多个问题。得到回答后再继续。
|
|
35
|
-
|
|
36
|
-
### A2. 构建 Decision Map
|
|
37
|
-
|
|
38
|
-
根据回答,在 `docs/dev/decision-map.md` 创建决策映射。映射是一个紧凑的 Markdown 文件,用于追踪所有待决策问题。
|
|
39
|
-
|
|
40
|
-
**映射结构:**
|
|
41
|
-
|
|
42
|
-
```markdown
|
|
43
|
-
# Decision Map: <需求标题>
|
|
44
|
-
|
|
45
|
-
## <ticket-slug>: <问题简述>
|
|
46
|
-
|
|
47
|
-
Blocked by: <slug>, <slug> (无依赖则省略此行)
|
|
48
|
-
Status: open
|
|
49
|
-
Type: Grilling | Research | Prototype
|
|
50
|
-
|
|
51
|
-
### Question
|
|
52
|
-
<一句话描述需要决策的问题>
|
|
16
|
+
在 `docs/dev/decision-map.md` 创建映射,追踪所有待决策问题(Ticket 含 slug / Blocked by / Status / Type / Question / Answer)。初始只创建 2–4 个前沿 Ticket,不试图穷举。
|
|
53
17
|
|
|
54
|
-
|
|
55
|
-
<解决后填写>
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**规则:**
|
|
59
|
-
- `slug` 是 dash-case 短标识符,在映射内唯一,读起来像微型标题(如 `core-scenario`、`data-model`、`auth-strategy`)
|
|
60
|
-
- 初始只创建 2–4 个**前沿 Ticket**——即当前能直接开始解决的,不要试图穷举
|
|
61
|
-
- 前沿之外的问题暂时不写,等迷雾推开后再添加
|
|
62
|
-
- 有依赖关系的 Ticket,用 `Blocked by` 声明前置条件
|
|
63
|
-
|
|
64
|
-
**Ticket 类型:**
|
|
65
|
-
|
|
66
|
-
| Type | 用途 | 执行方式 |
|
|
67
|
-
|------|------|----------|
|
|
68
|
-
| **Grilling**(默认) | 需要和用户对话澄清的决策 | 见 Phase B - Grilling 方法 |
|
|
69
|
-
| **Research** | 需要查阅文档、API、代码库 | 调研 → 输出摘要 → 记录答案 |
|
|
70
|
-
| **Prototype** | 需要低保真原型来验证方案 | 创建原型 → 确认 → 记录答案 |
|
|
71
|
-
|
|
72
|
-
---
|
|
18
|
+
Ticket 类型:Grilling(与用户对话澄清)/ Research(查文档)/ Prototype(低保真验证)。
|
|
73
19
|
|
|
74
20
|
## Phase B:渐进式解决
|
|
75
21
|
|
|
76
|
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
- 解决后将 `Status` 设为 `resolved`,在 `Answer` 中记录结论
|
|
81
|
-
- 每解决一个 Ticket,检查是否有新问题浮现 → 插入新 Ticket(标注 `Blocked by`)
|
|
22
|
+
- 每次只处理**一个**已解除阻塞的 Ticket;处理前 Claim(`Status: in-progress`)
|
|
23
|
+
- Grilling 型:**一次只问一个问题**,每个问题给出推荐答案,沿决策树分支深入
|
|
24
|
+
- 追问技巧:"然后呢?"(第 3 层才触及本质)、"如果不做这个会怎样?"(验证优先级)、"谁来判断做对了?"(明确验收)
|
|
25
|
+
- 解决后 `Status: resolved` 并记录 Answer;检查是否有新问题浮现 → 追加 Ticket
|
|
82
26
|
- 循环直到所有前沿 Ticket 已 resolved
|
|
83
27
|
|
|
84
|
-
### B1. Grilling 型 Ticket 的执行方法
|
|
85
|
-
|
|
86
|
-
对 Grilling 型 Ticket,采用逐层拷问方法:
|
|
87
|
-
|
|
88
|
-
**核心原则:**
|
|
89
|
-
- **一次只问一个问题**。同时问多个问题会让人困惑。
|
|
90
|
-
- 沿决策树的每条分支逐一深入,逐个解决决策之间的依赖关系。
|
|
91
|
-
- **每个问题必须给出推荐答案**,不能只提问不表态。
|
|
92
|
-
- 得到用户反馈后再继续下一个问题。
|
|
93
|
-
|
|
94
|
-
**追问技巧:**
|
|
95
|
-
1. **"然后呢?"** — 前 2 个回答通常只是表面,追问到第 3 层才触及本质
|
|
96
|
-
2. **"如果不做这个会怎样?"** — 验证真实优先级
|
|
97
|
-
3. **"谁来判断这个做对了?"** — 明确决策者和验收标准
|
|
98
|
-
4. **"和现有功能的关系?"** — 发现隐藏的依赖和冲突
|
|
99
|
-
5. **"这个简单"或"这个以后再说"** — 标记为 out-of-scope,避免遗漏
|
|
100
|
-
|
|
101
|
-
**覆盖维度:**
|
|
102
|
-
每个 Grilling Ticket 在拷问过程中应覆盖以下维度(按需,不是每个都要问完):
|
|
103
|
-
- 用户故事与业务价值
|
|
104
|
-
- 边界条件与异常场景
|
|
105
|
-
- 验收标准(追问到可验证的程度)
|
|
106
|
-
- 技术约束(语言/框架、部署环境、性能要求)
|
|
107
|
-
- 优先级:P0(必须)/ P1(重要)/ P2(锦上添花)
|
|
108
|
-
|
|
109
|
-
**结束条件:**
|
|
110
|
-
当用户对某个决策分支的回答不再引出新问题时,该分支已澄清完毕。标记 `Status: resolved`,填写 `Answer`。
|
|
111
|
-
|
|
112
|
-
### B2. Research 型 Ticket 的执行方法
|
|
113
|
-
|
|
114
|
-
1. 明确调研目标:需要回答什么问题?
|
|
115
|
-
2. 查阅相关文档、API 参考、代码库
|
|
116
|
-
3. 输出简短摘要到 `Answer`
|
|
117
|
-
4. 标记 `Status: resolved`
|
|
118
|
-
|
|
119
|
-
### B3. Prototype 型 Ticket 的执行方法
|
|
120
|
-
|
|
121
|
-
1. 明确验证目标:这个原型要证明什么?
|
|
122
|
-
2. 创建低保真原型(提纲、草图、桩代码)
|
|
123
|
-
3. 和用户确认方案是否符合预期
|
|
124
|
-
4. 结论写入 `Answer`,标记 `Status: resolved`
|
|
125
|
-
|
|
126
|
-
### B4. 迷雾检查
|
|
127
|
-
|
|
128
|
-
每解决一个 Ticket 后,检查是否推开迷雾:
|
|
129
|
-
|
|
130
|
-
- **有新问题浮现?** → 在映射末尾追加新 Ticket,标注正确的 `Blocked by` 边
|
|
131
|
-
- **之前的决策因此变更?** → 更新或标记相关 Ticket
|
|
132
|
-
- **前沿是否已推至足够远?** → 所有关键决策已定 → 进入 Phase C
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
28
|
## Phase C:凝固为 PRD
|
|
137
29
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
### PRD 生成规则
|
|
141
|
-
|
|
142
|
-
不是凭空编写,而是从 Decision Map 的 `Answer` 中提炼:
|
|
143
|
-
|
|
144
|
-
1. 将每个 Ticket 的 `Question` + `Answer` 映射为 PRD 的对应章节
|
|
145
|
-
2. 补充:背景、非功能性需求、风险
|
|
146
|
-
3. 从 Grilling 过程中标记的 out-of-scope 项,记录到 `docs/dev/out-of-scope.md`
|
|
147
|
-
|
|
148
|
-
### PRD 文档路径
|
|
149
|
-
|
|
150
|
-
保存到 `docs/prd/<title>.md`。
|
|
151
|
-
|
|
152
|
-
### Out-of-Scope 记录
|
|
153
|
-
|
|
154
|
-
将在澄清过程中明确排除的需求记入 `docs/dev/out-of-scope.md`:
|
|
155
|
-
- 说明排除原因
|
|
156
|
-
- 便于后续回顾,避免重复讨论
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## Phase D:创建 GitHub Issue
|
|
161
|
-
|
|
162
|
-
```bash
|
|
163
|
-
mkdir -p tmp
|
|
164
|
-
gh issue create \
|
|
165
|
-
--title "<PRD Title>" \
|
|
166
|
-
--label "enhancement" \
|
|
167
|
-
--body-file docs/prd/<title>.md
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## 多会话协作
|
|
30
|
+
从 Decision Map 的 Answer 提炼为 PRD,保存到 `docs/prd/<title>.md`。
|
|
173
31
|
|
|
174
|
-
|
|
32
|
+
## Phase D:创建 Flow Record
|
|
175
33
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
3. Claim → 解决 → 迷雾检查 → 重复
|
|
179
|
-
4. 每个会话最多解决一个 Ticket,结束时输出下一步指令
|
|
34
|
+
调用 `flow_control{op:"create-flow", title:"<英文功能标题>"}` 创建 Draft Parent Issue(Flow Record)。
|
|
35
|
+
内核负责 slug 派生与校验、Profile 门禁、双 session 检查、legacy 检测——创建动作全部收敛到工具内。
|
|
180
36
|
|
|
181
|
-
|
|
37
|
+
## CONTEXT.md 术语发现
|
|
182
38
|
|
|
183
|
-
|
|
184
|
-
>
|
|
185
|
-
> 继续解决下一个已解除阻塞的 Ticket:
|
|
186
|
-
> ```
|
|
187
|
-
> /requirements ,继续推进 Decision Map(docs/dev/decision-map.md)
|
|
188
|
-
> ```
|
|
189
|
-
|
|
190
|
-
---
|
|
39
|
+
需求澄清中发现的领域术语写入根 `CONTEXT.md`(术语权威)。发现新术语或冲突时暂停提问,用户确认后由 `flow_control` 更新。
|
|
191
40
|
|
|
192
41
|
## Output
|
|
193
|
-
|
|
194
|
-
- `docs/
|
|
195
|
-
-
|
|
196
|
-
- `docs/dev/out-of-scope.md` — 排除范围记录
|
|
197
|
-
- GitHub Parent Issue
|
|
42
|
+
- `docs/dev/decision-map.md` — 决策映射(PRD 生成后可删除)
|
|
43
|
+
- `docs/prd/<title>.md` — PRD
|
|
44
|
+
- Flow Record(Parent Issue,由 flow_control 创建)
|
|
198
45
|
|
|
199
46
|
## 下一阶段
|
|
200
|
-
|
|
201
|
-
- **/design** — 基于此 PRD 进行技术设计
|
|
202
|
-
|
|
203
|
-
---
|
|
47
|
+
- **/design** — 基于 PRD 进行技术设计
|
|
204
48
|
|
|
205
49
|
## Contract
|
|
206
50
|
|
|
207
51
|
### Trigger
|
|
208
|
-
|
|
209
|
-
由 `/requirements` 命令或 `@dev-lifecycle` Phase 0 触发。
|
|
52
|
+
由 `/requirements` 命令或 `@dev-lifecycle` 触发。
|
|
210
53
|
|
|
211
54
|
### Inputs
|
|
212
|
-
|
|
213
55
|
- 用户提供的功能描述(来自消息文本)
|
|
214
56
|
|
|
215
57
|
### Preconditions
|
|
216
|
-
|
|
217
|
-
- `/setup` 已完成(gh CLI 可用,docs 目录就绪)
|
|
58
|
+
- `/setup` 已完成(Profile 已确认,gh CLI 可用)
|
|
218
59
|
|
|
219
60
|
### Procedure
|
|
220
|
-
|
|
221
61
|
1. 锚定核心问题,创建 Decision Map
|
|
222
62
|
2. 渐进式解决所有前沿 Ticket(Grilling / Research / Prototype)
|
|
223
63
|
3. 迷雾推至足够远 → 凝固为 PRD
|
|
224
|
-
4.
|
|
225
|
-
5. 创建
|
|
64
|
+
4. 记录领域术语到 CONTEXT.md
|
|
65
|
+
5. 调用 `flow_control{op:"create-flow"}` 创建 Flow Record
|
|
226
66
|
|
|
227
67
|
### Outputs
|
|
228
|
-
|
|
229
|
-
- `docs/
|
|
230
|
-
-
|
|
231
|
-
- `docs/dev/out-of-scope.md` — 排除范围记录
|
|
232
|
-
- GitHub Parent Issue
|
|
68
|
+
- `docs/dev/decision-map.md`
|
|
69
|
+
- `docs/prd/<title>.md`
|
|
70
|
+
- Flow Record(Parent Issue)
|
|
233
71
|
|
|
234
72
|
### Failure
|
|
235
|
-
|
|
236
|
-
- gh CLI 不可用 → 提示先执行 /setup
|
|
73
|
+
- Profile 未确认 → flow_control 返回 `SETUP_REQUIRED`,提示先执行 `/setup`
|
|
237
74
|
- Issue 创建失败 → 记录错误,不阻塞 PRD 写入
|
|
238
75
|
|
|
239
76
|
### Idempotency
|
|
240
|
-
|
|
241
|
-
-
|
|
242
|
-
-
|
|
243
|
-
- 如果 Parent Issue 已创建 → 追加评论而非重复创建
|
|
77
|
+
- Decision Map 已存在 → 从中断点继续
|
|
78
|
+
- PRD 文件已存在 → 更新而非覆盖
|
|
79
|
+
- Flow Record 已创建 → 绑定已有 Issue(`parent_issue_number`)而非重复创建
|
|
244
80
|
|
|
245
81
|
### Prohibited Actions
|
|
246
|
-
|
|
247
82
|
- 不跳过 Phase A 和 Phase B 直接输出 PRD
|
|
248
83
|
- 不一次问多个问题
|
|
249
|
-
-
|
|
84
|
+
- 不绕过 flow_control 手工创建 Issue(由 create-flow 完成)
|
|
@@ -1,140 +1,44 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flow-review
|
|
3
|
-
description: 双轴审查(规范 + 规格)→
|
|
3
|
+
description: 双轴审查(规范 + 规格)→ task_control submit-review / merge-task
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# flow-review
|
|
7
7
|
|
|
8
8
|
沿两条轴线审查 PR 代码:规范(是否符合编码标准)和规格(是否实现了原始需求)。
|
|
9
|
+
审查结果由 primary 通过 `task_control` 提交与合并,reviewer 本身只读。
|
|
9
10
|
|
|
10
|
-
##
|
|
11
|
-
- PR 已创建
|
|
12
|
-
- 可选的 `/test` 已完成
|
|
11
|
+
## 核心:调用 task_control
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
1. `task_control{op:"submit-review", pr_number, verdict:"approve"|"request-changes", ...}` — 发布审查结果
|
|
14
|
+
2. `task_control{op:"merge-task", pr_number, ...}` — 合并(CI + 分支保护 + 风险分级 + 高风险人类 approval)
|
|
15
|
+
3. `task_control{op:"status-task", task_id}` — 查看 Task/PR 状态
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
reviewer 只读:不直接 `gh pr review` / `gh pr merge`(写操作由 primary 经 task_control 执行)。
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
# 切换到对应分支(如非 worktree 模式)
|
|
22
|
-
git checkout feat/<task-slug>
|
|
23
|
-
|
|
24
|
-
# 或在 worktree 模式下,直接进入 worktree 目录
|
|
25
|
-
cd .worktree/<task-slug>
|
|
26
|
-
|
|
27
|
-
# 获取 PR diff 和元数据
|
|
28
|
-
gh pr diff <pr-number>
|
|
29
|
-
gh pr view <pr-number> --json title,body,files
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### 2. 阅读约束来源
|
|
33
|
-
- 检查相关 ADR(`docs/adr/`)— 确认代码是否遵循架构决策
|
|
34
|
-
- 确认规格来源:commit 消息中的 Issue 引用或 `docs/prd/` / `docs/dev/specs/`
|
|
35
|
-
|
|
36
|
-
### 3. 文档同步确认
|
|
37
|
-
确认 PR 中是否包含文档同步:
|
|
38
|
-
- 检查 PR body 是否列出已同步的文档
|
|
39
|
-
- 检查 `docs/guides/` 和 `docs/dev/guides/` 是否有相应变更
|
|
40
|
-
- 如涉及配置/API 变更但文档未同步 → 标记为阻断性问题
|
|
41
|
-
|
|
42
|
-
### 4. 双轴审查
|
|
43
|
-
并行检查两个维度:
|
|
19
|
+
## 双轴审查
|
|
44
20
|
|
|
45
21
|
**规范轴(Normative)** — 代码是否符合文档化的编码标准?
|
|
46
22
|
参考 `references/smell-baseline.md` 中的代码气味基线。
|
|
47
23
|
|
|
48
24
|
**规格轴(Specification)** — 代码是否忠实实现了需求?
|
|
49
25
|
对照 PRD(`docs/prd/`)和设计方案(`docs/dev/specs/`)验证。
|
|
50
|
-
- 如发现实现与设计偏差 → 追加到
|
|
26
|
+
- 如发现实现与设计偏差 → 追加到 changelog
|
|
51
27
|
|
|
52
28
|
**TDD Criterion Coverage** — 检查 Task 的 `acceptance_criteria` 是否被 PR 覆盖:
|
|
53
29
|
- 对照 Task frontmatter 中的 `acceptance` 数组,逐条核查
|
|
54
30
|
- 检查 PR 是否包含每条 criterion 对应的测试或验证
|
|
55
31
|
- 检查 `tdd` 配置块中的 `mode` 和 `min_cycles` 是否被遵循
|
|
56
|
-
- **明确不检查 commit order** —
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
- 文档同步已完成(`docs/guides/` 已更新或无需更新)
|
|
62
|
-
- changelog 已记录偏差(如有)
|
|
63
|
-
- CI 已通过
|
|
64
|
-
|
|
65
|
-
### 6. 发表审查意见
|
|
66
|
-
发现阻断性问题:
|
|
67
|
-
```bash
|
|
68
|
-
gh pr review <pr-number> --request-changes --body "..."
|
|
69
|
-
```
|
|
70
|
-
无问题或非阻断性建议:
|
|
71
|
-
```bash
|
|
72
|
-
gh pr review <pr-number> --approve --body "..."
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### 7. 等待 CI + 自动合并
|
|
76
|
-
```bash
|
|
77
|
-
gh pr checks <pr-number> --watch
|
|
78
|
-
gh pr merge <pr-number> --squash --delete-branch
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### 8. 关闭关联 Sub Issue
|
|
82
|
-
如果 PR body 未包含 `Closes #<num>`(或 PR 合并后 GitHub 未自动关闭),手动关闭:
|
|
83
|
-
```bash
|
|
84
|
-
gh issue close <issue-num> --comment "已完成,已合并至 main"
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### 9. 清理 Worktree
|
|
88
|
-
PR 合并后,安全清理对应的 worktree 和分支:
|
|
89
|
-
|
|
90
|
-
```bash
|
|
91
|
-
WORKTREE=".worktree/<task-slug>"
|
|
92
|
-
BRANCH="feat/<task-slug>"
|
|
93
|
-
|
|
94
|
-
# Preflight 检查
|
|
95
|
-
echo "=== Worktree 清理 Preflight ==="
|
|
96
|
-
|
|
97
|
-
# 1. 确认 PR 已合并
|
|
98
|
-
PR_NUM=<pr-number>
|
|
99
|
-
if ! gh pr view "$PR_NUM" --json merged --jq '.merged' 2>/dev/null | grep -q true; then
|
|
100
|
-
echo "ERROR: PR #$PR_NUM 未合并,跳过清理"
|
|
101
|
-
exit 1
|
|
102
|
-
fi
|
|
103
|
-
|
|
104
|
-
# 2. 确认分支已推送到远程
|
|
105
|
-
if git ls-remote --exit-code origin "$BRANCH" >/dev/null 2>&1; then
|
|
106
|
-
echo "分支 $BRANCH 已推送到远程"
|
|
107
|
-
else
|
|
108
|
-
echo "WARNING: 分支 $BRANCH 未推送到远程,但 PR 已合并,继续清理"
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
# 3. 检查 worktree 是否干净
|
|
112
|
-
if [ -d "$WORKTREE" ]; then
|
|
113
|
-
DIRTY=$(git -C "$WORKTREE" status --porcelain)
|
|
114
|
-
if [ -n "$DIRTY" ]; then
|
|
115
|
-
echo "WARNING: Worktree 有未提交变更:"
|
|
116
|
-
echo "$DIRTY"
|
|
117
|
-
echo "暂停。如需强制清理请手动执行 --force"
|
|
118
|
-
exit 1
|
|
119
|
-
fi
|
|
120
|
-
|
|
121
|
-
# 4. 全部通过 → 清理
|
|
122
|
-
git worktree remove "$WORKTREE"
|
|
123
|
-
git branch -D "$BRANCH" 2>/dev/null || true
|
|
124
|
-
echo "Worktree 已清理:$WORKTREE"
|
|
125
|
-
else
|
|
126
|
-
echo "Worktree 不存在,跳过清理"
|
|
127
|
-
fi
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
> 清理前必须验证 PR 已合并、worktree 干净。只有在所有 preflight 检查通过后才删除。
|
|
131
|
-
> 如果 PR 已合并但 worktree 仍有未提交变更,暂停并通知用户,不自动 --force。
|
|
32
|
+
- **明确不检查 commit order** — RED→GREEN 顺序是编码过程约束,reviewer 不审查 commit 历史
|
|
33
|
+
|
|
34
|
+
## 审查材料获取
|
|
35
|
+
|
|
36
|
+
代码审查必须在本地分支/worktree 中进行,禁止通过 WebFetch 或浏览器访问远程 PR 页面获取代码。
|
|
132
37
|
|
|
133
38
|
## Output
|
|
134
|
-
-
|
|
135
|
-
- PR
|
|
136
|
-
-
|
|
137
|
-
- changelog 已记录偏差(如有)
|
|
39
|
+
- 结构化审查报告(APPROVED / CHANGES_REQUESTED)
|
|
40
|
+
- PR 已合并(task_control merge-task,条件满足时)
|
|
41
|
+
- Worktree 已清理(task_control merge-task 后 preflight 销毁)
|
|
138
42
|
|
|
139
43
|
## 后续
|
|
140
44
|
- **/release** — 发布(如所有 PR 已合并)
|
|
@@ -145,26 +49,25 @@ fi
|
|
|
145
49
|
由 `/review` 命令或 `@dev-lifecycle` Phase 3 审查步骤触发。
|
|
146
50
|
|
|
147
51
|
### Inputs
|
|
148
|
-
- PR
|
|
52
|
+
- PR 编号与 Task Record(来源:`/code` 产出)
|
|
149
53
|
|
|
150
54
|
### Preconditions
|
|
151
55
|
- `/code` 已完成 → PR 已创建
|
|
152
56
|
|
|
153
57
|
### Procedure
|
|
154
|
-
1.
|
|
155
|
-
2. 双轴审查(规范轴 +
|
|
58
|
+
1. 在本地 worktree/分支获取 PR diff 与元数据
|
|
59
|
+
2. 双轴审查(规范轴 + 规格轴)+ TDD criterion coverage
|
|
156
60
|
3. 输出结构化审查报告
|
|
157
|
-
4.
|
|
158
|
-
5.
|
|
159
|
-
6. 关闭关联 Sub Issue
|
|
160
|
-
7. 安全清理 Worktree(Preflight)
|
|
61
|
+
4. primary 调用 `task_control{op:"submit-review"}` 发布结果
|
|
62
|
+
5. CI 通过后 `task_control{op:"merge-task"}` 合并(工具执行清理)
|
|
161
63
|
|
|
162
64
|
### Outputs
|
|
163
65
|
- 结构化审查报告(APPROVED / CHANGES_REQUESTED)
|
|
164
66
|
- PR 已合并(条件满足时)
|
|
67
|
+
- Worktree 已清理
|
|
165
68
|
|
|
166
69
|
### Failure
|
|
167
|
-
- Critical/High →
|
|
70
|
+
- Critical/High → request-changes
|
|
168
71
|
- Worktree 清理失败 → 记录警告,不阻塞
|
|
169
72
|
|
|
170
73
|
### Idempotency
|
|
@@ -172,6 +75,6 @@ fi
|
|
|
172
75
|
- 已审查的 PR → 更新结论
|
|
173
76
|
|
|
174
77
|
### Prohibited Actions
|
|
175
|
-
- **禁止使用 WebFetch 或任何 Web 工具获取远程 PR 代码** —
|
|
78
|
+
- **禁止使用 WebFetch 或任何 Web 工具获取远程 PR 代码** — 审查代码时必须本地读取源码文件
|
|
79
|
+
- reviewer 不直接执行 `gh pr review` / `gh pr merge`(由 task_control 完成)
|
|
176
80
|
- 不使用默认 --force 清理
|
|
177
|
-
- 不直接执行 gh pr merge(Orchestrator 执行)
|
|
@@ -1,46 +1,42 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: flow-setup
|
|
3
|
-
description:
|
|
3
|
+
description: 初始化 — 探测环境 → 生成 workflow → 确认 Profile
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# flow-setup
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
初始化阶段:探测开发环境、生成缺失的 CI/release workflow、确认 AGENTS.md Project Profile。
|
|
9
|
+
所有探测与写入由内核工具 `setup_control` 完成,本 skill 只定义流程,不复制工具实现。
|
|
9
10
|
|
|
10
|
-
##
|
|
11
|
+
## 核心:调用 setup_control
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
确保以下目录结构存在:
|
|
14
|
-
```
|
|
15
|
-
docs/
|
|
16
|
-
├── prd/ # 产品需求文档
|
|
17
|
-
├── adr/ # 架构决策记录
|
|
18
|
-
└── dev/
|
|
19
|
-
├── specs/ # 技术方案
|
|
20
|
-
├── tasks/ # DAG 任务定义
|
|
21
|
-
├── api/ # API 设计文档
|
|
22
|
-
├── db/ # 数据库设计
|
|
23
|
-
├── guides/ # 开发指南
|
|
24
|
-
└── handoff/ # 上下文交接
|
|
25
|
-
```
|
|
13
|
+
调用 `setup_control` 完成三个阶段:
|
|
26
14
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
git remote get-url origin
|
|
31
|
-
```
|
|
32
|
-
确保 gh CLI 已认证、项目已关联 GitHub 远程。
|
|
15
|
+
1. `setup_control{op:"probe"}` — 探测 git/gh/CI/Profile,输出 readiness 报告
|
|
16
|
+
2. `setup_control{op:"generate-workflows"}` — 缺失时生成 CI/release workflow 草案 + Setup PR(人工合入)
|
|
17
|
+
3. `setup_control{op:"confirm-profile"}` — 用户确认后将 Profile 区块写入根 AGENTS.md
|
|
33
18
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
19
|
+
Profile 区块格式(内核解析白名单,§9.1):
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
## Project Profile
|
|
23
|
+
|
|
24
|
+
- test command: `npm test -- run`
|
|
25
|
+
- test file patterns: `test/**/*.test.ts`
|
|
26
|
+
- implementation file patterns: `src/**/*.ts`
|
|
27
|
+
- tdd default mode: `strict`
|
|
28
|
+
- version bump rule: `breaking→major, feature→minor, fix→patch`
|
|
29
|
+
- version file: `package.json`
|
|
30
|
+
- tag format: `v{version}`
|
|
31
|
+
- release workflow: `.github/workflows/release.yml`
|
|
38
32
|
```
|
|
39
33
|
|
|
34
|
+
未确认 Profile 时 `flow_control{op:"create-flow"}` 会阻断并提示先执行 `/setup`。
|
|
35
|
+
|
|
40
36
|
## Output
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
37
|
+
- readiness 报告(development-ready / release-ready 逐项布尔)
|
|
38
|
+
- `.github/workflows/` 草案(缺失时,经 Setup PR 人工合入)
|
|
39
|
+
- 根 AGENTS.md `## Project Profile` 区块
|
|
44
40
|
|
|
45
41
|
## Contract
|
|
46
42
|
|
|
@@ -48,28 +44,29 @@ echo "setup-complete" > .opencode/opencode-cabbage/setup-complete
|
|
|
48
44
|
由 `/setup` 命令触发。首次使用插件或切换新项目时执行。
|
|
49
45
|
|
|
50
46
|
### Inputs
|
|
51
|
-
|
|
47
|
+
- 用户对 readiness 报告 / Profile 覆盖项的确认
|
|
52
48
|
|
|
53
49
|
### Preconditions
|
|
54
|
-
|
|
50
|
+
- gh CLI 已认证(宿主 `gh auth`)
|
|
55
51
|
|
|
56
52
|
### Procedure
|
|
57
|
-
1.
|
|
58
|
-
2.
|
|
59
|
-
3.
|
|
53
|
+
1. 调用 `setup_control{op:"probe"}` 读取 readiness 报告
|
|
54
|
+
2. 缺失 workflow 时调用 `setup_control{op:"generate-workflows"}` 生成草案
|
|
55
|
+
3. 用户确认后调用 `setup_control{op:"confirm-profile"}` 写入 Profile
|
|
60
56
|
|
|
61
57
|
### Outputs
|
|
62
|
-
-
|
|
63
|
-
-
|
|
58
|
+
- readiness 报告
|
|
59
|
+
- workflow 草案(可选)
|
|
60
|
+
- 根 AGENTS.md Profile 区块
|
|
64
61
|
|
|
65
62
|
### Failure
|
|
66
|
-
-
|
|
67
|
-
-
|
|
63
|
+
- gh auth 失败 → 提示用户执行 `gh auth login` 后重试
|
|
64
|
+
- workflow 生成失败 → 报告错误并停止
|
|
68
65
|
|
|
69
66
|
### Idempotency
|
|
70
|
-
-
|
|
71
|
-
- 已存在
|
|
67
|
+
- Profile 已确认 → 重复 confirm 覆盖写入(工具内读后写)
|
|
68
|
+
- workflow 已存在 → 跳过生成
|
|
72
69
|
|
|
73
70
|
### Prohibited Actions
|
|
74
|
-
-
|
|
75
|
-
-
|
|
71
|
+
- 不手工编辑 AGENTS.md Profile 区块(由 setup_control 写回)
|
|
72
|
+
- 不直接 push 或创建 Setup PR(工具内部执行)
|