@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.
Files changed (179) hide show
  1. package/README.md +34 -19
  2. package/README.zh.md +34 -19
  3. package/assets/agents/dev-lifecycle.md +60 -49
  4. package/assets/agents/team/architect.md +8 -1
  5. package/assets/agents/team/developer.md +89 -0
  6. package/assets/agents/team/goal-verify.md +5 -1
  7. package/assets/agents/team/reviewer.md +6 -0
  8. package/assets/commands/code.md +3 -2
  9. package/assets/commands/design.md +3 -2
  10. package/assets/commands/release.md +3 -2
  11. package/assets/commands/requirements.md +3 -2
  12. package/assets/commands/review.md +3 -2
  13. package/assets/commands/setup.md +3 -2
  14. package/assets/commands/tasks.md +2 -1
  15. package/assets/prompts/bootstrap.md +9 -8
  16. package/assets/prompts/stage-contract.md +55 -0
  17. package/assets/skills/flow-code/SKILL.md +38 -140
  18. package/assets/skills/flow-design/SKILL.md +28 -79
  19. package/assets/skills/flow-release/SKILL.md +31 -51
  20. package/assets/skills/flow-requirements/SKILL.md +31 -196
  21. package/assets/skills/flow-review/SKILL.md +26 -123
  22. package/assets/skills/flow-setup/SKILL.md +40 -43
  23. package/assets/skills/flow-tasks/SKILL.md +23 -153
  24. package/assets/skills/flow-tdd/SKILL.md +30 -31
  25. package/dist/kernel/caller.d.ts +48 -0
  26. package/dist/kernel/caller.js +88 -0
  27. package/dist/kernel/caller.js.map +1 -0
  28. package/dist/kernel/context.d.ts +27 -0
  29. package/dist/kernel/context.js +84 -0
  30. package/dist/kernel/context.js.map +1 -0
  31. package/dist/kernel/flow.d.ts +175 -0
  32. package/dist/kernel/flow.js +467 -0
  33. package/dist/kernel/flow.js.map +1 -0
  34. package/dist/kernel/legacy.d.ts +19 -0
  35. package/dist/kernel/legacy.js +34 -0
  36. package/dist/kernel/legacy.js.map +1 -0
  37. package/dist/kernel/mutex.d.ts +8 -0
  38. package/dist/kernel/mutex.js +23 -0
  39. package/dist/kernel/mutex.js.map +1 -0
  40. package/dist/kernel/permission.d.ts +21 -0
  41. package/dist/kernel/permission.js +45 -0
  42. package/dist/kernel/permission.js.map +1 -0
  43. package/dist/kernel/profile.d.ts +35 -0
  44. package/dist/kernel/profile.js +147 -0
  45. package/dist/kernel/profile.js.map +1 -0
  46. package/dist/kernel/records.d.ts +103 -0
  47. package/dist/kernel/records.js +240 -0
  48. package/dist/kernel/records.js.map +1 -0
  49. package/dist/kernel/release.d.ts +106 -0
  50. package/dist/kernel/release.js +241 -0
  51. package/dist/kernel/release.js.map +1 -0
  52. package/dist/kernel/review.d.ts +34 -0
  53. package/dist/kernel/review.js +82 -0
  54. package/dist/kernel/review.js.map +1 -0
  55. package/dist/kernel/session-index.d.ts +45 -0
  56. package/dist/kernel/session-index.js +136 -0
  57. package/dist/kernel/session-index.js.map +1 -0
  58. package/dist/kernel/setup.d.ts +95 -0
  59. package/dist/kernel/setup.js +401 -0
  60. package/dist/kernel/setup.js.map +1 -0
  61. package/dist/kernel/slug.d.ts +23 -0
  62. package/dist/kernel/slug.js +67 -0
  63. package/dist/kernel/slug.js.map +1 -0
  64. package/dist/kernel/task.d.ts +213 -0
  65. package/dist/kernel/task.js +873 -0
  66. package/dist/kernel/task.js.map +1 -0
  67. package/dist/{flowrun → kernel/tdd}/adapter.d.ts +1 -1
  68. package/dist/{flowrun → kernel/tdd}/adapter.js +27 -26
  69. package/dist/kernel/tdd/adapter.js.map +1 -0
  70. package/dist/{flowrun → kernel/tdd}/digest.d.ts +2 -1
  71. package/dist/{flowrun → kernel/tdd}/digest.js +6 -4
  72. package/dist/kernel/tdd/digest.js.map +1 -0
  73. package/dist/{flowrun → kernel/tdd}/evaluator.d.ts +1 -1
  74. package/dist/{flowrun → kernel/tdd}/evaluator.js +1 -1
  75. package/dist/kernel/tdd/evaluator.js.map +1 -0
  76. package/dist/kernel/tdd/evidence.d.ts +42 -0
  77. package/dist/kernel/tdd/evidence.js +48 -0
  78. package/dist/kernel/tdd/evidence.js.map +1 -0
  79. package/dist/{flowrun → kernel/tdd}/state.d.ts +2 -2
  80. package/dist/{flowrun → kernel/tdd}/state.js +1 -1
  81. package/dist/kernel/tdd/state.js.map +1 -0
  82. package/dist/kernel/types.d.ts +180 -0
  83. package/dist/kernel/types.js +2 -0
  84. package/dist/kernel/types.js.map +1 -0
  85. package/dist/kernel/worktree.d.ts +45 -0
  86. package/dist/kernel/worktree.js +156 -0
  87. package/dist/kernel/worktree.js.map +1 -0
  88. package/dist/plugin/agents.d.ts +5 -17
  89. package/dist/plugin/agents.js +0 -23
  90. package/dist/plugin/agents.js.map +1 -1
  91. package/dist/plugin/flow-control.d.ts +91 -0
  92. package/dist/plugin/flow-control.js +287 -0
  93. package/dist/plugin/flow-control.js.map +1 -0
  94. package/dist/plugin/goal.d.ts +17 -46
  95. package/dist/plugin/goal.js +47 -117
  96. package/dist/plugin/goal.js.map +1 -1
  97. package/dist/plugin/prompt-lint.js +78 -6
  98. package/dist/plugin/prompt-lint.js.map +1 -1
  99. package/dist/plugin/release-control.d.ts +39 -0
  100. package/dist/plugin/release-control.js +343 -0
  101. package/dist/plugin/release-control.js.map +1 -0
  102. package/dist/plugin/server.d.ts +19 -0
  103. package/dist/plugin/server.js +198 -320
  104. package/dist/plugin/server.js.map +1 -1
  105. package/dist/plugin/setup-control.d.ts +59 -0
  106. package/dist/plugin/setup-control.js +111 -0
  107. package/dist/plugin/setup-control.js.map +1 -0
  108. package/dist/plugin/shell.d.ts +7 -34
  109. package/dist/plugin/shell.js +12 -137
  110. package/dist/plugin/shell.js.map +1 -1
  111. package/dist/plugin/skills.d.ts +1 -1
  112. package/dist/plugin/skills.js +1 -7
  113. package/dist/plugin/skills.js.map +1 -1
  114. package/dist/plugin/task-control.d.ts +90 -0
  115. package/dist/plugin/task-control.js +208 -0
  116. package/dist/plugin/task-control.js.map +1 -0
  117. package/dist/plugin/tdd-checkpoint.d.ts +128 -0
  118. package/dist/plugin/tdd-checkpoint.js +664 -0
  119. package/dist/plugin/tdd-checkpoint.js.map +1 -0
  120. package/dist/util/gh.d.ts +5 -0
  121. package/dist/util/gh.js +12 -0
  122. package/dist/util/gh.js.map +1 -1
  123. package/dist/util/paths.d.ts +6 -2
  124. package/dist/util/paths.js +15 -7
  125. package/dist/util/paths.js.map +1 -1
  126. package/package.json +4 -4
  127. package/assets/agents/team/backend.md +0 -100
  128. package/assets/agents/team/frontend.md +0 -98
  129. package/assets/commands/handoff.md +0 -4
  130. package/assets/commands/test.md +0 -4
  131. package/assets/context/CONTEXT.md +0 -41
  132. package/assets/skills/flow-handoff/SKILL.md +0 -76
  133. package/assets/skills/flow-test/SKILL.md +0 -75
  134. package/dist/flowrun/adapter.js.map +0 -1
  135. package/dist/flowrun/audit.d.ts +0 -5
  136. package/dist/flowrun/audit.js +0 -67
  137. package/dist/flowrun/audit.js.map +0 -1
  138. package/dist/flowrun/ci.d.ts +0 -64
  139. package/dist/flowrun/ci.js +0 -184
  140. package/dist/flowrun/ci.js.map +0 -1
  141. package/dist/flowrun/coverage.d.ts +0 -70
  142. package/dist/flowrun/coverage.js +0 -207
  143. package/dist/flowrun/coverage.js.map +0 -1
  144. package/dist/flowrun/digest.js.map +0 -1
  145. package/dist/flowrun/evaluator.js.map +0 -1
  146. package/dist/flowrun/gate.d.ts +0 -28
  147. package/dist/flowrun/gate.js +0 -139
  148. package/dist/flowrun/gate.js.map +0 -1
  149. package/dist/flowrun/github.d.ts +0 -24
  150. package/dist/flowrun/github.js +0 -154
  151. package/dist/flowrun/github.js.map +0 -1
  152. package/dist/flowrun/index.d.ts +0 -14
  153. package/dist/flowrun/index.js +0 -15
  154. package/dist/flowrun/index.js.map +0 -1
  155. package/dist/flowrun/merge.d.ts +0 -57
  156. package/dist/flowrun/merge.js +0 -180
  157. package/dist/flowrun/merge.js.map +0 -1
  158. package/dist/flowrun/migration.d.ts +0 -11
  159. package/dist/flowrun/migration.js +0 -276
  160. package/dist/flowrun/migration.js.map +0 -1
  161. package/dist/flowrun/resilience.d.ts +0 -18
  162. package/dist/flowrun/resilience.js +0 -80
  163. package/dist/flowrun/resilience.js.map +0 -1
  164. package/dist/flowrun/state.js.map +0 -1
  165. package/dist/flowrun/transitions.d.ts +0 -66
  166. package/dist/flowrun/transitions.js +0 -168
  167. package/dist/flowrun/transitions.js.map +0 -1
  168. package/dist/flowrun/types.d.ts +0 -356
  169. package/dist/flowrun/types.js +0 -21
  170. package/dist/flowrun/types.js.map +0 -1
  171. package/dist/flowrun/validator.d.ts +0 -19
  172. package/dist/flowrun/validator.js +0 -209
  173. package/dist/flowrun/validator.js.map +0 -1
  174. package/dist/plugin/broker.d.ts +0 -73
  175. package/dist/plugin/broker.js +0 -140
  176. package/dist/plugin/broker.js.map +0 -1
  177. package/dist/plugin/tdd-tool.d.ts +0 -62
  178. package/dist/plugin/tdd-tool.js +0 -336
  179. package/dist/plugin/tdd-tool.js.map +0 -1
@@ -1,249 +1,84 @@
1
1
  ---
2
2
  name: flow-requirements
3
- description: 渐进式需求澄清 → PRD 输出 → GitHub Issue 创建
3
+ description: 渐进式需求澄清 → PRD → Flow Record(flow_control)
4
4
  ---
5
5
 
6
6
  # flow-requirements
7
7
 
8
- 通过 Decision Map 驱动的渐进式需求澄清,将松散想法逐步凝固为 PRD 并创建 GitHub Issue。
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
- ### Answer
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
- - 每次只处理**一个**已解除阻塞的 Ticket(`Status: open` 且所有 `Blocked by` 的 Ticket 已 `resolved`)
78
- - 处理前先 **Claim**:将 `Status` 设为 `in-progress`,保存映射
79
- - 根据 Ticket 的 `Type` 选择执行方式
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
- 当所有前沿 Ticket 均已 `resolved`,且没有新的关键问题浮现时,将 Decision Map 凝固为 PRD。
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
- 如果需求澄清跨越多个会话,Decision Map 已持久化在 `docs/dev/decision-map.md`。后续会话:
32
+ ## Phase D:创建 Flow Record
175
33
 
176
- 1. 加载整个映射作为上下文
177
- 2. 找到第一个 `Status: open` 且已解除阻塞的 Ticket
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
- **会话结束时的 Handoff 格式:**
37
+ ## CONTEXT.md 术语发现
182
38
 
183
- > **Next steps** — N 个 Ticket 已解除阻塞: `<slug>`, `<slug>`
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/dev/decision-map.md` — 决策映射(需求阶段临时文件,PRD 生成后可删除)
195
- - `docs/prd/<title>.md` — PRD 文档
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. 记录 Out of Scope
225
- 5. 创建 Parent GitHub Issue
64
+ 4. 记录领域术语到 CONTEXT.md
65
+ 5. 调用 `flow_control{op:"create-flow"}` 创建 Flow Record
226
66
 
227
67
  ### Outputs
228
-
229
- - `docs/dev/decision-map.md` — 决策映射
230
- - `docs/prd/<title>.md` — PRD 文档
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
- - 如果 Decision Map 已存在 → 从中断点继续,不重新创建
242
- - 如果 PRD 文件已存在 → 更新而非覆盖
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
- - 不省略 Out of Scope 记录
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
- ## Prerequisites
11
- - PR 已创建
12
- - 可选的 `/test` 已完成
11
+ ## 核心:调用 task_control
13
12
 
14
- ## Workflow
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
- ### 1. 获取审查材料
17
+ reviewer 只读:不直接 `gh pr review` / `gh pr merge`(写操作由 primary 经 task_control 执行)。
17
18
 
18
- **代码审查必须在本地分支/worktree 中进行,禁止通过 WebFetch 或浏览器访问远程 PR 页面获取代码。**
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
- - 如发现实现与设计偏差 → 追加到 `docs/dev/changelog/<YYYY-MM-DD-NNN-slug>.md`
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** — TDD cycle 的 RED→GREEN 顺序是编码过程约束,
57
- reviewer 不审查 commit 历史是否呈现 RED-first 模式
58
-
59
- ### 5. 合并前检查
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
- - PR 已审查
135
- - PR 已合并(条件满足时)
136
- - 关联 Sub Issue 已关闭
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 编号(来源:`/code` 产出)
52
+ - PR 编号与 Task Record(来源:`/code` 产出)
149
53
 
150
54
  ### Preconditions
151
55
  - `/code` 已完成 → PR 已创建
152
56
 
153
57
  ### Procedure
154
- 1. 获取 PR diff 和元数据
155
- 2. 双轴审查(规范轴 + 规格轴)
58
+ 1. 在本地 worktree/分支获取 PR diff 与元数据
59
+ 2. 双轴审查(规范轴 + 规格轴)+ TDD criterion coverage
156
60
  3. 输出结构化审查报告
157
- 4. 编排器发布审查结果
158
- 5. 等待 CI 通过后合并
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 → Request Changes
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 代码** — 审查代码时必须在已 checkout 的本地分支或 worktree 中直接读取源码文件
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
- ## Workflow
11
+ ## 核心:调用 setup_control
11
12
 
12
- ### 1. 创建文档目录
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
- ### 2. 验证环境
28
- ```bash
29
- gh auth status
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
- ### 3. 完成标记
35
- ```bash
36
- mkdir -p .opencode/opencode-cabbage
37
- echo "setup-complete" > .opencode/opencode-cabbage/setup-complete
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
- - `docs/` 目录已就绪
42
- - 开发环境已验证
43
- - 可开始 `/requirements`
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. 创建 docs 目录结构
58
- 2. 验证 gh CLI 和 GitHub 远程
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
- - `docs/` 目录树(prd, adr, dev/specs, dev/tasks, dev/api, dev/db, dev/guides, dev/handoff)
63
- - `.opencode/opencode-cabbage/setup-complete` 标记文件
58
+ - readiness 报告
59
+ - workflow 草案(可选)
60
+ - 根 AGENTS.md Profile 区块
64
61
 
65
62
  ### Failure
66
- - 目录创建失败 → 报告错误并退出
67
- - gh auth 失败 → 提示用户执行 `gh auth login`
63
+ - gh auth 失败 → 提示用户执行 `gh auth login` 后重试
64
+ - workflow 生成失败 → 报告错误并停止
68
65
 
69
66
  ### Idempotency
70
- - 已存在的目录跳过
71
- - 已存在 `setup-complete` 标记则跳过全部步骤
67
+ - Profile 已确认 → 重复 confirm 覆盖写入(工具内读后写)
68
+ - workflow 已存在 → 跳过生成
72
69
 
73
70
  ### Prohibited Actions
74
- - 不删除已有目录或文件
75
- - 不修改项目代码
71
+ - 不手工编辑 AGENTS.md Profile 区块(由 setup_control 写回)
72
+ - 不直接 push 或创建 Setup PR(工具内部执行)