ccgx-workflow 2.4.1 → 2.5.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 (46) hide show
  1. package/README.md +134 -277
  2. package/README.zh-CN.md +134 -272
  3. package/dist/chunks/version-build.mjs +1 -1
  4. package/dist/cli.mjs +1 -1
  5. package/dist/index.d.mts +709 -16
  6. package/dist/index.d.ts +709 -16
  7. package/dist/index.mjs +1061 -30
  8. package/dist/shared/{ccgx-workflow.j1spUsik.mjs → ccgx-workflow.CdHnJLak.mjs} +106 -22
  9. package/package.json +1 -1
  10. package/templates/commands/agents/code-fixer.md +6 -6
  11. package/templates/commands/agents/phase-runner.md +46 -14
  12. package/templates/commands/agents/plan-checker.md +10 -0
  13. package/templates/commands/analyze.md +66 -25
  14. package/templates/commands/autonomous.md +428 -225
  15. package/templates/commands/cancel.md +9 -0
  16. package/templates/commands/codex-exec.md +12 -11
  17. package/templates/commands/context.md +14 -0
  18. package/templates/commands/debate.md +10 -6
  19. package/templates/commands/execute.md +76 -28
  20. package/templates/commands/optimize.md +53 -25
  21. package/templates/commands/plan.md +78 -28
  22. package/templates/commands/review.md +26 -19
  23. package/templates/commands/spec-impl.md +68 -127
  24. package/templates/commands/spec-plan.md +61 -82
  25. package/templates/commands/spec-research.md +35 -92
  26. package/templates/commands/spec-review.md +34 -119
  27. package/templates/commands/status.md +1 -0
  28. package/templates/commands/team-exec.md +45 -13
  29. package/templates/commands/team.md +64 -167
  30. package/templates/commands/test.md +56 -34
  31. package/templates/commands/verify-work.md +36 -13
  32. package/templates/commands/verify.md +35 -0
  33. package/templates/commands/workflow.md +22 -37
  34. package/templates/hooks/ccg-loop-detector.cjs +39 -8
  35. package/templates/hooks/ccg-statusline.js +142 -2
  36. package/templates/hooks/ccg-stop-gate.cjs +248 -19
  37. package/templates/hooks/ccg-subagent-context.cjs +505 -0
  38. package/templates/scripts/ccg-state-lock.cjs +510 -0
  39. package/templates/scripts/ccg-team-schedule.cjs +328 -0
  40. package/templates/scripts/ccgx-call-plugin.mjs +494 -141
  41. package/templates/scripts/invoke-model.mjs +28 -1
  42. package/templates/scripts/task-store.cjs +614 -0
  43. package/templates/skills/tools/verify-change/SKILL.md +7 -0
  44. package/templates/skills/tools/verify-module/SKILL.md +7 -0
  45. package/templates/skills/tools/verify-quality/SKILL.md +7 -0
  46. package/templates/skills/tools/verify-security/SKILL.md +8 -0
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  description: 'Agent Teams 并行实施 - 读取计划文件,spawn Builder teammates 并行写代码'
3
+ argument-hint: "[--no-regression-gate]"
3
4
  context_budget: orchestrator-15
4
5
  subagent_freshness: required
5
6
  ---
@@ -37,15 +38,17 @@ subagent_freshness: required
37
38
  ### Step 2: 解析依赖图
38
39
  1. **读取计划文件**:优先解析末尾的 `tasks:` yaml 块(machine-readable),fallback 到 Markdown 子任务列表。
39
40
  2. **抽取每个任务**:`id` / `type` / `files` / `wave` / `depends_on` / `prompt-bearing 内容(实施步骤 + 验收标准 + 文件范围)`。
40
- 3. **降级兼容(旧版 plan 文件)**:
41
- - 若任何任务缺失 `wave` 字段 → 整份计划全部归入 `wave: 1`,`depends_on: []`,全并行执行。
41
+ 3. **权威分波(ccg-team-schedule.cjs 拓扑导出)**:
42
42
  - 若任何任务缺失 `id` 字段 → 按出现顺序自动编号 `T1, T2, ...`。
43
- - 输出降级提示:`⚠️ 检测到旧版 plan(无 wave 字段),已降级为单 wave 全并行模式`。
44
- 4. **拓扑校验**:
45
- - `depends_on` 引用的 id 必须都存在
46
- - 任务自身 wave 必须严格大于其所有 `depends_on` 任务的 wave
47
- - 同 wave 内任务文件 `files` 必须零交叉
48
- - 任一校验失败终止,列出问题并要求用户修正 plan 文件
43
+ - Write 工具把抽取的任务写成临时 JSON 文件(数组,每项 `{"id","files","depends_on","wave","status"}`;`wave` 缺省可省略,`status` 来自断点续跑检测,缺省 `pending`)。
44
+ - 运行:`node ~/.claude/.ccg/scripts/ccg-team-schedule.cjs --tasks <临时JSON路径>`。
45
+ - **以脚本 stdout 的 `waves` 为权威分波**;plan 中声明的 `wave` 字段仅作交叉核对提示。`warnings`(declared/derived 不一致、文件交叉拆分)原样展示给用户。
46
+ - 脚本不存在(旧安装)→ 降级为按本文规则由 LLM 手工 Kahn 拓扑排序(无依赖 → wave 1;所有依赖均已分波 最大依赖 wave + 1;同 wave 文件交叉则把后声明的任务顺延到下一 wave)。
47
+ 4. **降级与校验**:
48
+ - (a) 任务全部无 `depends_on` 且无 `wave` wave 全并行(保留现行为)。
49
+ - (b) 有 `depends_on` 但缺 `wave` → **由 `depends_on` 拓扑导出分波**(⛔ 禁止丢弃依赖全并行),输出提示:`ℹ️ plan 缺 wave 字段,已按 depends_on 拓扑导出 M 个 wave`。
50
+ - (c) 同 wave 文件交叉 → **不终止**:自动拆分为串行子波(安全网),输出提示 `⚠️ wave N 存在文件交叉,已自动拆分串行化`。
51
+ - (d) 仅以下情况终止并要求用户修正 plan:依赖循环 / `depends_on` 引用未知 id / 重复 id(脚本 exit 1,stderr 列出问题)。
49
52
  5. **断点续跑检测**:
50
53
  - 若 `<WORKDIR>/.ccg/state.md` 已存在,读取其中各任务状态:
51
54
  * `completed` → 跳过
@@ -62,6 +65,7 @@ subagent_freshness: required
62
65
  - Wave 1: X 个并行 Builder
63
66
  - Wave 2: Y 个并行 Builder(依赖 Wave 1)
64
67
  - ...
68
+ - Wave 划分来源:ccg-team-schedule.cjs 拓扑导出(N 条 warnings)
65
69
  - 失败处理:单任务失败不阻塞同 wave,依赖该任务的下游任务自动 skipped
66
70
  - 状态文件:.ccg/state.md(每个 wave 结束自动更新)
67
71
  确认开始?
@@ -124,6 +128,16 @@ subagent_freshness: required
124
128
  ## 验收标准
125
129
  <从计划中提取>
126
130
 
131
+ ## SUMMARY 写入协议(⛔ 禁止直接 Write SUMMARY.md)
132
+ 多个 Builder 并发写同一个 `.context/<phase>/SUMMARY.md` 会互相覆盖(lost-update)。完成任务后:
133
+ 1. 用 Write 工具把 patch JSON 写到临时文件(如 `<WORKDIR>/.context/<phase>/.patch-<task.id>.json`):
134
+ `{"taskId":"<task.id>","plan":"<plan 文件路径>","keyFiles":[...],"tests":[...],"completed":false,"notes":"<一句话结果>"}`
135
+ - 必填:`taskId` / `keyFiles`(你实际创建或修改的文件)/ `completed: false` / `notes`
136
+ - **必填 `tests`**:本任务创建或修改的测试文件清单(喂给每波回归门;没有则填 `[]`)
137
+ 2. 运行:`node ~/.claude/.ccg/scripts/ccg-state-lock.cjs merge-summary --workdir <WORKDIR> --phase <phase> --patch-file <临时文件>`
138
+ (单进程内完成 锁→读→合并→原子写→释放;⛔ 禁止自行分步 acquire/release 锁)
139
+ 3. 脚本不存在(旧安装)→ 降级为直接 Write SUMMARY.md(注意:并发下有 lost-update 竞态风险)。
140
+
127
141
  完成所有步骤后,标记任务为 completed。
128
142
  失败时,明确说出失败原因,标记为 failed,不要假装完成。
129
143
  ```
@@ -138,11 +152,24 @@ subagent_freshness: required
138
152
  - 必须等到本 wave **全部 Builder** 都退出(completed 或 failed),才能进入下一 wave。
139
153
 
140
154
  5. **Wave 结束清理**:
141
- - 通过 SendMessage 给本 wave 所有 Builder 发 shutdown_request。
142
- - 更新 `.ccg/state.md`(见 Step 6 格式)。
143
- - 输出 wave 摘要:
155
+
156
+ a. 通过 SendMessage 给本 wave 所有 Builder 发 shutdown_request。
157
+
158
+ b. **每波 cross-phase 回归门(regression gate)**:
159
+ 1. **Skip 条件**(任一满足则跳过本 wave 的门,记录原因):`.context/` 下除当前 phase(plan 主名)外无 `completed: true` 的 SUMMARY.md;收集到的测试清单为空;用户传了 `--no-regression-gate`。
160
+ 2. **收集清单**:只读各前序 phase `SUMMARY.md` 的 frontmatter(维持 frontmatter-only 预算契约)——`tests` 字段非空优先用之;缺省回退到 `key_files` 中匹配测试文件名(`*.test.*` / `*.spec.*` / `__tests__/` / `*_test.go` / `test_*.py` / `tests?/` 目录)的条目。跳过 `.context/` 保留目录(jobs/debug/uat/codebase/tasks)。等价于 `collectRegressionTests()`(src/utils/phase-context.ts)。
161
+ 3. **执行**:测试命令解析优先级——package.json `scripts.test` 存在 → `npx vitest run <files>` 或 `pnpm test -- <files>`(runner 支持文件参数时按清单限定范围)> Makefile `make test` > `cargo test` > `go test ./...` > `pytest <files>`;无法限定范围则跑全量。
162
+ 4. **全过** → 输出单行 `✅ 回归门(Wave N): K 个前序 phase 测试文件通过`,并在 state.md 对应 wave 节追加 `Regression: pass (K files)`。
163
+ 5. **失败** → 输出表格(测试文件 | 来源 phase | 失败摘要首行)+ `AskUserQuestion` 三选项:
164
+ - **立即修复(推荐)**:指导本 wave 失败相关 Builder 或 spawn 单个修复 Builder,修完重跑回归门
165
+ - **继续下一 wave**:在 state.md Notes 段记录 `Regression: FAIL (accepted)`,风险自担(回归会复利)
166
+ - **中止执行**:保留 state.md 断点,终止
167
+
168
+ c. 更新 `.ccg/state.md`(见 Step 6 格式)。**写入方式**:用 Write 工具把新内容写到临时文件,然后 `node ~/.claude/.ccg/scripts/ccg-state-lock.cjs locked-write --target <WORKDIR>/.ccg/state.md --content-file <临时文件>`(锁 + 原子写)。脚本不存在(旧安装)→ 降级为直接 Write。
169
+
170
+ d. 输出 wave 摘要:
144
171
  ```
145
- ✅ Wave <N> 完成: completed=X, failed=Y, skipped=Z
172
+ ✅ Wave <N> 完成: completed=X, failed=Y, skipped=Z | 回归门: pass/FAIL/skipped
146
173
  → 进入 Wave <N+1>
147
174
  ```
148
175
 
@@ -172,7 +199,8 @@ subagent_freshness: required
172
199
  **核心契约**:Lead 不接 Builder 的全部 stdout。每个 Builder 完成任务后,**必须由 Lead 读取该任务对应的 `.context/<phase>/SUMMARY.md` 的 YAML frontmatter**——不读 body,不读 builder transcript。
173
200
 
174
201
  - `<phase>` 取计划文件主名(如 `.claude/team-plan/user-auth.md` → `user-auth`)。
175
- - frontmatter 字段(与 `/ccg:execute` 5.3 写入约定一致):`phase`, `plan`, `provides`, `affects`, `key_files`, `completed`, `completed_at`, `notes`。
202
+ - frontmatter 字段(与 `/ccg:execute` 5.3 写入约定一致):`phase`, `plan`, `provides`, `affects`, `key_files`, `tests`, `completed`, `completed_at`, `notes`(`tests` 为 P1-6 新增可选字段,喂给每波回归门;旧 SUMMARY 缺省视为 `[]`)。
203
+ - **写入侧**:Builder 通过 `ccg-state-lock.cjs merge-summary` 合并写入(见 Step 4.3 的 SUMMARY 写入协议),多 Builder 并发安全。
176
204
  - **预算硬约束**:单个 SUMMARY.md frontmatter < 200 tokens,5 个 phase 累计 < 1000 tokens 进入 orchestrator context。如某 SUMMARY 超出 200 tokens,截断 `notes` 字段并记录到 state.md 的 Notes 段。
177
205
  - **缺失处理**:若 Builder 没写 SUMMARY.md(异常退出 / 老版本 plan 文件),Lead 把对应任务标 `failed` 而非凭 builder 消息推断状态。
178
206
 
@@ -215,6 +243,8 @@ subagent_freshness: required
215
243
  - [ ] 所有可执行 wave 已按顺序跑完
216
244
  - [ ] 同 wave Builder 在单条消息内并行 spawn(已校验:消息内多 tool calls)
217
245
  - [ ] 失败任务不阻塞同 wave,下游依赖任务自动 skipped
246
+ - [ ] 每个 wave 结束已跑回归门(或显式 skip 原因已记录)
247
+ - [ ] Builder SUMMARY 写入走 merge-summary 锁协议
218
248
  - [ ] `.ccg/state.md` 反映最终状态
219
249
  - [ ] 变更摘要 + Wave 表已输出
220
250
  - [ ] Team 已清理
@@ -237,6 +267,7 @@ subagent_freshness: required
237
267
  ## Wave 1 (completed)
238
268
  - [x] T1: 用户 API (src/api/users.ts) — completed @ 10:15
239
269
  - [x] T2: 数据模型 (prisma/schema.prisma) — completed @ 10:18
270
+ Regression: pass (2 files)
240
271
 
241
272
  ## Wave 2 (in_progress)
242
273
  - [x] T3: 用户卡片组件 (src/components/UserCard.tsx) — completed @ 10:30
@@ -255,6 +286,7 @@ subagent_freshness: required
255
286
 
256
287
  **字段约定**:
257
288
  - 每个 task 一行,`[x]` = completed,`[ ]` = pending/in_progress/failed/skipped
289
+ - 每个 wave 节末尾可含一行回归门结果:`Regression: pass (K files)` / `Regression: FAIL (accepted)` / `Regression: skipped (<原因>)`
258
290
  - 行尾 `— <status> @ <时间>` 标注最新状态
259
291
  - `(builder-<id>)` 表示当前承担该任务的 Builder name
260
292
  - `(depends_on: ...)` 解释 pending 原因
@@ -159,103 +159,53 @@ Phase 8: INTEGRATION → Lead 全量验证 + 报告 + 清理
159
159
 
160
160
  **调用通道路由(CCG codeagent 退役,v2.2.0+)**
161
161
 
162
- 双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 plugin spawn:
162
+ 双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 Bash 直调 plugin 快路径:
163
163
 
164
- 1. **优先 plugin spawn**(默认):装了 `codex@openai-codex` + gemini plugin → 用 `Agent(subagent_type="codex:codex-rescue")` + `Agent(subagent_type="gemini:gemini-rescue")` 并行,主线接 ≤200 token 摘要。
164
+ 1. **优先 Bash 直调 plugin 快路径**(默认):装了 `codex@openai-codex` + gemini plugin → 用 `{{CODEX_BASH_TASK}}` / `{{GEMINI_BASH_TASK}}` 占位符 + `--prompt-file` 并行 Bash 直调(review.md 同款),绕开 sonnet wrapper silent-fallback;**仅 `gemini-ccgx` fork 走 gemini-batch 29s 快路径,上游 + repatch 仍走 companion(ACP) 慢路径**(Windows 实测 5+min 卡死风险仍在),主线 `JSON.parse(stdout).text`。
165
165
  2. **降级 codeagent-wrapper**(BC fallback):plugin 未装 → fallback Bash 调用,行为与 plugin 路径等价。
166
166
 
167
- **判定**:preflight `Bash` 跑 `node ~/.claude/.ccg/scripts/check-plugins.cjs`(解析 Claude Code 权威 `installed_plugins.json`)。exit `0` + stdout `{"codex":"<ver>","gemini":"<ver>"}` → 通道 A(plugin 默认);非 `0` → 通道 B(wrapper BC fallback)。
167
+ **判定**:preflight `Bash` 跑 `node ~/.claude/.ccg/scripts/check-plugins.cjs`(解析 Claude Code 权威 `installed_plugins.json`)。exit `0` + stdout `{"codex":"<ver>","gemini":"<ver>"}` → 通道 A(Bash 直调快路径,默认);非 `0` → 通道 B(wrapper BC fallback)。
168
168
 
169
169
  - **CRITICAL**: 必须在一条消息中同时发起两个并行调用。
170
170
 
171
- **⚠ 预备动作(spawn 前必须执行)**:`codex:codex-rescue` / `gemini:gemini-rescue` thin forwarder,不会主动 Read 路径文件。主线必须在 spawn 前先 Read 两个角色提示词文件,把**内容**直接拼入下方 Agent prompt 的 `<role>` 块。
171
+ **通道 A Bash 直调 plugin 快路径(默认)**:
172
172
 
173
- - backend role: `Read("~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/architect.md")` `${backendRole}`
174
- - frontend role: `Read("~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/architect.md")` → `${frontendRole}`
173
+ > 占位符 `{{CODEX_BASH_TASK}}` / `{{GEMINI_BASH_TASK}}` 由 install 渲染为 `node <ccgx-call-plugin.mjs 绝对路径> <vendor> --json`。LLM 只需 Write tmpfile + 追加 `--prompt-file <tmpfile>` 运行,**不写 `Agent(...)`、不内联 role 全文**。
175
174
 
176
- **通道 A plugin spawn(默认)**:
175
+ **StepWrite 两个 tmpfile**(≤2KB,让模型自己 Read 角色文件):
176
+ ```
177
+ Write({ file_path: ".context/tmp/ccg-team-arch-codex-$JOB.txt", content: <backend 架构模板> })
178
+ Write({ file_path: ".context/tmp/ccg-team-arch-gemini-$JOB.txt", content: <frontend 架构模板> })
179
+ ```
177
180
 
178
- **FIRST Agent call ({{BACKEND_PRIMARY}})**:
181
+ backend 架构模板:
179
182
  ```
180
- Agent({
181
- subagent_type: "codex:codex-rescue",
182
- description: "team Phase 2: 后端架构分析",
183
- prompt: `<role>
184
- ${backendRole}
185
- </role>
186
-
187
- <workdir>{{WORKDIR}}</workdir>
188
-
189
- <task>
190
- PRD:<PRD 内容>
191
-
192
- 请分析后端架构:
193
- - 模块边界、API 设计、数据模型
194
- - 依赖关系、关键算法选择
195
- - 实施风险与建议
196
- </task>
197
-
198
- <grounding_rules>
199
- - 引用 file:line 标注现有代码模式
200
- - 区分「现有模式已支持」vs「需要新建」
201
- - 不要捏造未观察到的依赖
202
- </grounding_rules>
203
-
204
- <structured_output_contract>
205
- Return JSON ONLY:
206
- {
207
- "module_boundaries": [{"name": "...", "responsibility": "...", "files_involved": []}],
208
- "api_design": [{"endpoint": "...", "verb": "...", "purpose": "..."}],
209
- "data_model": [{"entity": "...", "fields": [], "relations": []}],
210
- "dependencies": [{"from": "...", "to": "...", "reason": "..."}],
211
- "implementation_risks": [{"risk": "...", "mitigation": "..."}]
212
- }
213
- Return ≤200 token structured summary.
214
- </structured_output_contract>`
215
- })
183
+ # 任务:team Phase 2 后端架构分析
184
+
185
+ 工作目录:{{WORKDIR}}(你已在此)
186
+ 角色定义见 ~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/architect.md,**先用 Read 工具读取再开始**。
187
+ **必须前台执行,禁止 --background / --wait**(外层已 run_in_background,插件内再 background = 双重后台,stop-gate/status/cancel 全盲)。对文件系统零写入。
188
+
189
+ PRD:<PRD 内容>
190
+ 分析后端架构:模块边界 / API 设计 / 数据模型 / 依赖关系 / 关键算法 / 实施风险。
191
+ 引用 file:line 标注现有模式;区分「现有已支持」vs「需新建」;不捏造未观察到的依赖。
192
+ Return JSON ONLY:
193
+ { "module_boundaries": [{"name":"...","responsibility":"...","files_involved":[]}],
194
+ "api_design": [{"endpoint":"...","verb":"...","purpose":"..."}],
195
+ "data_model": [{"entity":"...","fields":[],"relations":[]}],
196
+ "dependencies": [{"from":"...","to":"...","reason":"..."}],
197
+ "implementation_risks": [{"risk":"...","mitigation":"..."}] }
216
198
  ```
217
199
 
218
- **SECOND Agent call ({{FRONTEND_PRIMARY}}) - IN THE SAME MESSAGE**:
200
+ frontend 架构模板(角色换 {{FRONTEND_PRIMARY}}/architect.md,同硬约束;分析组件拆分/状态管理/路由/UX 流程/无障碍/实施风险;JSON 字段 component_decomposition / state_management / routing / ux_flows / implementation_risks)。
201
+
202
+ **Step — 并行 Bash 直调**(同一 message,`run_in_background: true`):
219
203
  ```
220
- Agent({
221
- subagent_type: "gemini:gemini-rescue",
222
- description: "team Phase 2: 前端架构分析",
223
- prompt: `<role>
224
- ${frontendRole}
225
- </role>
226
-
227
- <workdir>{{WORKDIR}}</workdir>
228
-
229
- <task>
230
- PRD:<PRD 内容>
231
-
232
- 请分析前端架构:
233
- - 组件拆分、状态管理、路由设计
234
- - UI/UX 关键流程、无障碍考量
235
- - 实施风险与建议
236
- </task>
237
-
238
- <grounding_rules>
239
- - 引用 file:line 标注现有组件 / 设计 token
240
- - 区分「现有组件复用」vs「需新建」
241
- - 不要捏造未观察到的设计系统约定
242
- </grounding_rules>
243
-
244
- <structured_output_contract>
245
- Return JSON ONLY:
246
- {
247
- "component_decomposition": [{"component": "...", "purpose": "...", "reuses": []}],
248
- "state_management": {"approach": "...", "stores": []},
249
- "routing": [{"path": "...", "screen": "..."}],
250
- "ux_flows": [{"flow": "...", "steps": []}],
251
- "implementation_risks": [{"risk": "...", "mitigation": "..."}]
252
- }
253
- Return ≤200 token structured summary.
254
- </structured_output_contract>`
255
- })
204
+ Bash({ command: `{{CODEX_BASH_TASK}} --prompt-file .context/tmp/ccg-team-arch-codex-$JOB.txt`, description: "team Phase 2: backend arch (codex direct)", run_in_background: true })
205
+ Bash({ command: `{{GEMINI_BASH_TASK}} --prompt-file .context/tmp/ccg-team-arch-gemini-$JOB.txt`, description: "team Phase 2: frontend arch (gemini direct)", run_in_background: true })
256
206
  ```
257
207
 
258
- **通道 B — codeagent-wrapper fallback**(plugin 未装时降级,并行用 `run_in_background: true`):
208
+ **通道 B — codeagent-wrapper fallback**(plugin 未装时降级,并行用 `run_in_background: true`;wrapper 的 `ROLE_FILE:` 由 `invoke-model.mjs` 解析故保留):
259
209
 
260
210
  ```
261
211
  Bash({
@@ -275,8 +225,8 @@ Return ≤200 token structured summary.
275
225
  > ⚠️ 通道 B `codeagent-wrapper` 已标 **deprecated**,仅为不能升级 plugin 的环境保留。
276
226
 
277
227
  **事件驱动等待**:
278
- - **通道 A(plugin)**:两个 Agent message spawn,主线接 ≤200 token 摘要。Agent 完成后自动返回结果。
279
- - **通道 B(BC wrapper)**:spawn 两个 Bash bg 后说明 task-id 然后 **turn end**。引擎在每个 task 完成时自动发 `<task-notification>`,主线在通知触发的新 turn 处理结果。**不调 TaskOutput**。两个 task 都收到通知后才进下一步。
228
+ - **通道 A(Bash 直调快路径)**:spawn 两个 Bash bg 后说明 task-id 然后 **turn end**。引擎在每个 task 完成时自动发 `<task-notification>`,主线在新 turn Read stdout 后 `JSON.parse(stdout).text` 取真实输出。两个 task 都收到通知后才进下一步。
229
+ - **通道 B(BC wrapper)**:同上 bg + 事件驱动,但 parse `--progress` 行而非 `.text`。**不调 TaskOutput**。
280
230
 
281
231
  ⛔ **禁止**:调 `TaskOutput({block: true, timeout: 600000})` (旧 freeze poll 模式) / Kill task。
282
232
  ⚠️ **失败处理**:notification status=failed / exit ≠ 0 / parse 失败 → v1.7.87 标准 2-retry / 5s / 3-attempts;3 次全失败才降级单模型。
@@ -320,6 +270,7 @@ Return ≤200 token structured summary.
320
270
  - 为每个子任务分配唯一 `id`、`wave` 整数、`depends_on` 列表。
321
271
  - `wave: 1` = 无依赖、可立即开跑;`wave: N` = 所有 depends_on 必须在 wave < N。
322
272
  - 拓扑排序最大化每 wave 并行度,**同 wave 内文件零交叉**强制约束。
273
+ - exec 阶段以 `ccg-team-schedule.cjs` 拓扑导出为权威分波,plan 中的 `wave` 字段仅作交叉核对提示(详见 `/ccg:team-exec` Step 2)。
323
274
 
324
275
  4. **写入计划文件**
325
276
  - 路径:`.claude/team-plan/<任务名>-plan.md`
@@ -364,8 +315,9 @@ Return ≤200 token structured summary.
364
315
  c. **等待本 wave 全部 Dev 退出(completed 或 failed)**
365
316
  - 单 Dev 失败 → 记录到 `.ccg/state.md`,**不打断**同 wave 其他 Dev。
366
317
  - 必须等全员退出才能进入下一 wave。
318
+ - Dev 完成后 SUMMARY.md 写入必须走 merge-summary 锁协议(`ccg-state-lock.cjs`),协议细节同 `/ccg:team-exec` Step 4 第 3 点。
367
319
 
368
- d. **Wave 结束**:通过 SendMessage 给本 wave 所有 Dev 发 shutdown_request,更新 `.ccg/state.md`。
320
+ d. **Wave 结束**:通过 SendMessage 给本 wave 所有 Dev 发 shutdown_request;每波末先跑 cross-phase 回归门,再用 locked-write 更新 `.ccg/state.md`(细节同 `/ccg:team-exec` Step 4 第 5 点)。
369
321
 
370
322
  3. **失败汇报**:所有 wave 结束后,若存在 failed 任务,向用户报告并询问"重试一次 / 传给 Reviewer / 接受失败"(参考 `/ccg:team-exec` 的失败处理)。
371
323
 
@@ -408,95 +360,40 @@ Return ≤200 token structured summary.
408
360
  2. **{{BACKEND_PRIMARY}} + {{FRONTEND_PRIMARY}} 并行审查(PARALLEL)**
409
361
  - 模式与 Phase 2 相同(plugin 优先 + wrapper BC fallback),使用 reviewer prompt。
410
362
 
411
- **⚠ 预备动作(spawn 前必须执行)**:主线先 Read 角色提示词,把内容拼入 `<role>` 块。
363
+ **通道 A Bash 直调 plugin 快路径(默认)**:
412
364
 
413
- - backend role: `Read("~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/reviewer.md")` `${backendRole}`
414
- - frontend role: `Read("~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/reviewer.md")` → `${frontendRole}`
365
+ > 占位符 `{{CODEX_BASH_TASK}}` / `{{GEMINI_BASH_TASK}}` 由 install 渲染为 `node <ccgx-call-plugin.mjs 绝对路径> <vendor> --json`。LLM 只需 Write tmpfile + 追加 `--prompt-file <tmpfile>` 运行,**不写 `Agent(...)`、不内联 role 全文**,让模型自己 Read 角色 + `git diff` 读变更。
415
366
 
416
- **通道 A plugin spawn(默认)**:
367
+ **StepWrite 两个 tmpfile**(≤2KB):
368
+ ```
369
+ Write({ file_path: ".context/tmp/ccg-team-review-codex-$JOB.txt", content: <backend review 模板> })
370
+ Write({ file_path: ".context/tmp/ccg-team-review-gemini-$JOB.txt", content: <frontend review 模板> })
371
+ ```
417
372
 
418
- **FIRST Agent call ({{BACKEND_PRIMARY}})**:
373
+ backend review 模板:
419
374
  ```
420
- Agent({
421
- subagent_type: "codex:codex-rescue",
422
- description: "team Phase 6: 后端审查",
423
- prompt: `<role>
424
- ${backendRole}
425
- </role>
426
-
427
- <workdir>{{WORKDIR}}</workdir>
428
-
429
- <task>
430
- 审查以下变更(后端维度:逻辑 / 安全 / 性能 / 错误处理):
431
- <git diff 输出或变更文件列表>
432
-
433
- Read-only review. Do NOT modify any file.
434
- </task>
435
-
436
- <grounding_rules>
437
- - 每条 finding 必须含 file:line
438
- - 区分 bug(可触发失败路径)与 concern(风格/可维护性偏好)
439
- - 检查过但没问题的项放进 passed_checks
440
- </grounding_rules>
441
-
442
- <dig_deeper_nudge>
443
- - 同根因可能扩散到其他文件——抽样验证
444
- - 一条精准 Critical > 五条模糊 Warning
445
- </dig_deeper_nudge>
446
-
447
- <structured_output_contract>
448
- Return JSON ONLY:
449
- {
450
- "findings": [{"severity": "Critical|Warning|Info", "dimension": "logic|security|performance|error_handling", "file": "path", "line": N, "description": "描述", "fix_suggestion": "修复建议"}],
451
- "passed_checks": ["检查项"],
452
- "summary": "总体评估"
453
- }
454
- Return ≤200 token structured summary.
455
- </structured_output_contract>`
456
- })
375
+ # 任务:team Phase 6 后端审查
376
+
377
+ 工作目录:{{WORKDIR}}(你已在此)
378
+ 角色定义见 ~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/reviewer.md,**先用 Read 工具读取再开始**。
379
+ **必须前台执行,禁止 --background / --wait**(外层已 run_in_background,插件内再 background = 双重后台,stop-gate/status/cancel 全盲)。只读审查,不改任何文件。
380
+
381
+ 自己跑 `git diff` 看变更。沿后端维度审:逻辑 / 安全 / 性能 / 错误处理。
382
+ 每条 finding 含 file:line;区分 bug 与 concern;检查过没问题的项放 passed_checks。
383
+ Return JSON ONLY:
384
+ { "findings": [{"severity":"Critical|Warning|Info","dimension":"logic|security|performance|error_handling","file":"path","line":N,"description":"描述","fix_suggestion":"修复建议"}],
385
+ "passed_checks": ["检查项"], "summary": "总体评估" }
457
386
  ```
458
387
 
459
- **SECOND Agent call ({{FRONTEND_PRIMARY}}) - IN THE SAME MESSAGE**:
388
+ frontend review 模板(角色换 {{FRONTEND_PRIMARY}}/reviewer.md,同硬约束;维度=模式一致性/可维护性/无障碍/UX/前端安全,dimension 枚举 patterns|maintainability|accessibility|ux|frontend_security)。
389
+
390
+ **Step — 并行 Bash 直调**(同一 message,`run_in_background: true`;只读审查,加 `--no-write`):
460
391
  ```
461
- Agent({
462
- subagent_type: "gemini:gemini-rescue",
463
- description: "team Phase 6: 前端审查",
464
- prompt: `<role>
465
- ${frontendRole}
466
- </role>
467
-
468
- <workdir>{{WORKDIR}}</workdir>
469
-
470
- <task>
471
- 审查以下变更(前端维度:模式一致性 / 可维护性 / 无障碍 / UX / 前端安全):
472
- <git diff 输出或变更文件列表>
473
-
474
- Read-only review. Do NOT modify any file.
475
- </task>
476
-
477
- <grounding_rules>
478
- - 每条 finding 必须含 file:line
479
- - 检查过但没问题的项放进 passed_checks
480
- </grounding_rules>
481
-
482
- <dig_deeper_nudge>
483
- - 同模式问题可能扩散到相邻文件——抽样验证
484
- - 一条精准 Critical > 五条模糊 Warning
485
- </dig_deeper_nudge>
486
-
487
- <structured_output_contract>
488
- Return JSON ONLY:
489
- {
490
- "findings": [{"severity": "Critical|Warning|Info", "dimension": "patterns|maintainability|accessibility|ux|frontend_security", "file": "path", "line": N, "description": "描述", "fix_suggestion": "修复建议"}],
491
- "passed_checks": ["检查项"],
492
- "summary": "总体评估"
493
- }
494
- Return ≤200 token structured summary.
495
- </structured_output_contract>`
496
- })
392
+ Bash({ command: `{{CODEX_BASH_TASK}} --no-write --prompt-file .context/tmp/ccg-team-review-codex-$JOB.txt`, description: "team Phase 6: backend review (codex direct)", run_in_background: true })
393
+ Bash({ command: `{{GEMINI_BASH_TASK}} --no-write --prompt-file .context/tmp/ccg-team-review-gemini-$JOB.txt`, description: "team Phase 6: frontend review (gemini direct)", run_in_background: true })
497
394
  ```
498
395
 
499
- **通道 B — codeagent-wrapper fallback**(plugin 未装时降级):
396
+ **通道 B — codeagent-wrapper fallback**(plugin 未装时降级;wrapper 的 `ROLE_FILE:` 由 `invoke-model.mjs` 解析故保留):
500
397
 
501
398
  ```
502
399
  Bash({
@@ -516,8 +413,8 @@ Return ≤200 token structured summary.
516
413
  > ⚠️ 通道 B `codeagent-wrapper` 已标 **deprecated**,仅为不能升级 plugin 的环境保留。
517
414
 
518
415
  **事件驱动等待**:
519
- - **通道 A(plugin)**:两个 Agent message spawn,主线接 ≤200 token 摘要。
520
- - **通道 B(BC wrapper)**:spawn 两个 Bash bg 后说明 task-id 然后 **turn end**。引擎在每个 task 完成时自动发 `<task-notification>`,主线在通知触发的新 turn 处理。**不调 TaskOutput**。两个 task 都收到通知才进 step 3。
416
+ - **通道 A(Bash 直调快路径)**:spawn 两个 Bash bg 后说明 task-id 然后 **turn end**。引擎在每个 task 完成时自动发 `<task-notification>`,主线在新 turn Read stdout 后 `JSON.parse(stdout).text` 取真实输出。两个 task 都收到通知才进 step 3。
417
+ - **通道 B(BC wrapper)**:同上 bg + 事件驱动,但 parse `--progress` 行而非 `.text`。**不调 TaskOutput**。
521
418
 
522
419
  ⛔ **禁止**:调 `TaskOutput({block: true, timeout: 600000})` (旧 freeze poll 模式) / Kill task。
523
420
  ⚠️ **失败处理**:notification status=failed / exit ≠ 0 / parse 失败 → v1.7.87 标准 2-retry / 5s / 3-attempts;3 次全失败才降级单模型。
@@ -42,14 +42,14 @@ argument-hint: "<测试目标> [--role=architect|critic|implementer|tester|write
42
42
 
43
43
  ## 调用通道路由(CCG codeagent 退役)
44
44
 
45
- CCG 把双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 plugin spawn:
45
+ CCG 把双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 Bash 直调 plugin 快路径:
46
46
 
47
- 1. **优先 plugin spawn**(默认):装了 `codex@openai-codex` + `gemini@google-gemini` plugin 用 `Agent(subagent_type="codex:codex-rescue")` + `Agent(subagent_type="gemini:gemini-rescue")` 并行,主线接 ≤200 token 摘要。
47
+ 1. **优先 Bash 直调 plugin 快路径**(默认):装了 `codex@openai-codex` + gemini plugin(推荐 `gemini@gemini-ccgx` fork;或上游 `gemini@google-gemini` repatch)→ 用 `{{CODEX_BASH_TASK}}` / `{{GEMINI_BASH_TASK}}` 占位符 + `--prompt-file` 并行 Bash 直调(review.md 同款),绕开 sonnet wrapper silent-fallback;**仅 `gemini-ccgx` fork 走 gemini-batch 29s 快路径,上游 + repatch 仍走 companion(ACP) 慢路径**(Windows 实测 5+min 卡死风险仍在),主线 `JSON.parse(stdout)` 取 `.text`。
48
48
  2. **降级 codeagent-wrapper**(BC fallback):plugin 未装 → fallback 到 Bash 调用,行为与 plugin 路径等价。
49
49
 
50
- **判定**:preflight `Bash` 跑 `node ~/.claude/.ccg/scripts/check-plugins.cjs`(解析 Claude Code 权威 `installed_plugins.json`)。exit `0` + stdout `{"codex":"<ver>","gemini":"<ver>"}` → 通道 A(plugin 默认);非 `0` → 通道 B(wrapper BC fallback)。
50
+ **判定**:preflight `Bash` 跑 `node ~/.claude/.ccg/scripts/check-plugins.cjs`(解析 Claude Code 权威 `installed_plugins.json`)。exit `0` + stdout `{"codex":"<ver>","gemini":"<ver>"}` → 通道 A(Bash 直调快路径,默认);非 `0` → 通道 B(wrapper BC fallback)。
51
51
 
52
- ⚠️ Test 命令在主线 context 内,**允许** `Agent(...)`——与 subagent "禁止嵌套 spawn" 约束不冲突。
52
+ ⚠️ Test 命令在主线 context 内执行,通道 A 走 Bash 直调(不再 spawn `Agent(...)`),无嵌套 spawn 顾虑。
53
53
 
54
54
  ---
55
55
 
@@ -62,32 +62,55 @@ CCG 把双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 pl
62
62
 
63
63
  **调用语法**(双通道):
64
64
 
65
- **通道 A — plugin spawn(默认)**:
65
+ **通道 A — Bash 直调 plugin 快路径(默认,绕开 sonnet wrapper + ACP 慢路径)**:
66
+
67
+ > 占位符 `{{CODEX_BASH_TASK}}` / `{{GEMINI_BASH_TASK}}` 由 install 时渲染为
68
+ > `node <ccgx-call-plugin.mjs 绝对路径> <vendor> --json`。LLM **只需把 prompt
69
+ > 写入 tmpfile、追加 `--prompt-file <tmpfile>`、运行**,不写 `Agent(...)`。
70
+ > 这条 Bash 直调通道自动吃到 gemini-batch 29s 快路径,消除 `Agent→gemini-companion→ACP`
71
+ > 的 5+min 卡死与 sonnet wrapper silent-fallback。
66
72
 
67
73
  ```
68
- Agent({
69
- subagent_type: "<codex:codex-rescue|gemini:gemini-rescue>",
70
- description: "Test: <backend|frontend>",
71
- prompt: `ROLE_FILE: <角色提示词路径>
74
+ Step 1. 用 Write 把任务描述写到 tmpfile(≤2KB,被测代码用文件路径引用,不内联大段源码):
75
+ Write({ file_path: ".context/tmp/ccg-test-codex-$JOB.txt", content: <下方"任务描述模板"> })
76
+ Write({ 同上,gemini 版本,file_path: ".context/tmp/ccg-test-gemini-$JOB.txt" })
72
77
 
73
- <TASK>
74
- 需求:为以下代码生成测试
75
- <代码内容>
78
+ Step 2. 用 Bash 调 helper(占位符已渲染;全栈并行两个在同一 message 内 run_in_background: true,单端则 false):
79
+ Bash({ command: `{{CODEX_BASH_TASK}} --prompt-file .context/tmp/ccg-test-codex-$JOB.txt`, description: "Test: backend (codex direct)", run_in_background: true })
80
+ Bash({ command: `{{GEMINI_BASH_TASK}} --prompt-file .context/tmp/ccg-test-gemini-$JOB.txt`, description: "Test: frontend (gemini direct)", run_in_background: true })
81
+
82
+ Step 3. 等 task-notification 后 Read 各自 stdout,`JSON.parse(stdout)` 取 helper 扁平化后的 `.text` 字段。
83
+ ```
84
+
85
+ **任务描述模板**(写到 tmpfile 的内容;保持 ≤2KB):
86
+
87
+ ```
88
+ # 任务:生成测试
89
+
90
+ 工作目录:<工作目录绝对路径>(你已在此,可直接用 Bash/Read)
91
+ 角色定义见 <角色提示词路径>(codex 用 ~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md,gemini 用 {{FRONTEND_PRIMARY}}/tester.md),**先用 Read 工具读取该文件再开始**。
92
+
93
+ ## 你要做的事
94
+
95
+ 被测代码:<目标文件路径 + 符号名,自己 Read,不内联大段源码>
76
96
  需求描述:<增强后的需求(如未增强则用 $ARGUMENTS)>
77
97
  要求:
78
- 1. 使用项目现有测试框架
98
+ 1. 使用项目现有测试框架(自己 Glob/Read 配置确认)
79
99
  2. 覆盖正常路径、边界条件、异常处理
80
- </TASK>
81
100
 
82
- OUTPUT: 完整测试代码
83
- Return ≤200 token structured summary (plugin-native protocol).
84
- `
85
- })
101
+ ## 硬约束
102
+
103
+ - **必须前台执行,禁止 `--background` / `--wait`**(ccgx 编排层已用 Agent run_in_background 包裹,插件内再 background = 双重后台,stop-gate / status / cancel 全盲)。
104
+ - 对文件系统零写入,仅产出测试代码文本(落盘由主线 Claude 执行)。
105
+
106
+ ## 输出
107
+
108
+ 完整测试代码。只输出代码块,无其他文本。
86
109
  ```
87
110
 
88
- 并行**两个 Agent 在同一 message 内同时 spawn**。
111
+ **严禁**:内联大段被测源码(撞 argv ~32KB 上限);写 `Agent(subagent_type="gemini:gemini-rescue")`(走 ACP 慢路径);heredoc / `-p "..."` 内联;硬编码 plugin 路径。**唯一允许**:copy 占位符 + 追加 `--prompt-file <tmpfile>`。
89
112
 
90
- **通道 B — codeagent-wrapper fallback**(plugin 未装时降级,并行用 `run_in_background: true`):
113
+ **通道 B — codeagent-wrapper fallback**(plugin 未装时降级,并行用 `run_in_background: true`;wrapper 的 `ROLE_FILE:` 由 `invoke-model.mjs` 解析故保留):
91
114
 
92
115
  ```
93
116
  Bash({
@@ -109,7 +132,7 @@ EOF",
109
132
  })
110
133
  ```
111
134
 
112
- > ⚠️ 通道 B `codeagent-wrapper` 已标 **deprecated**。
135
+ > ⚠️ 通道 B `codeagent-wrapper` 已标 **deprecated**,仅 plugin 未装时使用。
113
136
 
114
137
  **角色提示词**:
115
138
 
@@ -131,7 +154,7 @@ EOF",
131
154
  1. 同 message 内 spawn 多个 `Bash(run_in_background: true)` 并行任务
132
155
  2. spawn 完后主线说明已启动 task-id,**直接 turn end**,**不调 TaskOutput**
133
156
  3. Claude Code 引擎在每个 task 完成时自动发 `<task-notification>` system-reminder 触发主线新 turn
134
- 4. 主线在新 turn 处理:从 `<output-file>` 路径 read stdout,按通道 schema parse 结果
157
+ 4. 主线在新 turn 处理:从 `<output-file>` 路径 read stdout,`JSON.parse(stdout)` helper 扁平化后的 `.text`(通道 A)/ `--progress` 行(通道 B)
135
158
  5. **必须等所有相关 task 都收到通知**才进入下一阶段(按 task-id 计数已收齐)
136
159
 
137
160
  ⛔ **禁止**:
@@ -164,18 +187,17 @@ EOF",
164
187
 
165
188
  `[模式:生成]`
166
189
 
167
- **⚠️ 根据代码类型必须调用对应模型**(参照上方调用规范):
168
-
169
- - **后端代码** → `Bash({ command: "...--backend {{BACKEND_PRIMARY}}...", run_in_background: false })`
170
- - ROLE_FILE: `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md`
171
- - **前端代码** → `Bash({ command: "...--backend {{FRONTEND_PRIMARY}}...", run_in_background: false })`
172
- - ROLE_FILE: `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md`
173
- - **全栈代码** → 并行调用两者:
174
- 1. `Bash({ command: "...--backend {{BACKEND_PRIMARY}}...", run_in_background: true })`
175
- - ROLE_FILE: `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md`
176
- 2. `Bash({ command: "...--backend {{FRONTEND_PRIMARY}}...", run_in_background: true })`
177
- - ROLE_FILE: `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md`
178
- 用 `TaskOutput` 等待结果
190
+ **⚠️ 根据代码类型必须调用对应模型**(参照上方调用规范,先 Write tmpfile 再 `{{CODEX_BASH_TASK}}` / `{{GEMINI_BASH_TASK}}` + `--prompt-file`):
191
+
192
+ - **后端代码** → `{{CODEX_BASH_TASK}} --prompt-file <tmpfile>`(单端 `run_in_background: false`)
193
+ - 角色:tmpfile 内写"角色定义见 `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md`,先用 Read 工具读取再开始"
194
+ - **前端代码** → `{{GEMINI_BASH_TASK}} --prompt-file <tmpfile>`(单端 `run_in_background: false`)
195
+ - 角色:tmpfile 内写"角色定义见 `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md`,先用 Read 工具读取再开始"
196
+ - **全栈代码** → 并行调用两者(同 message 内 `run_in_background: true`,事件驱动等待 task-notification,**不调 TaskOutput**):
197
+ 1. `{{CODEX_BASH_TASK}} --prompt-file <tmpfile-codex>`
198
+ - 角色:tmpfile 内写"角色定义见 `~/.claude/.ccg/prompts/{{BACKEND_PRIMARY}}/tester.md`,先用 Read 工具读取再开始"
199
+ 2. `{{GEMINI_BASH_TASK}} --prompt-file <tmpfile-gemini>`
200
+ - 角色:tmpfile 内写"角色定义见 `~/.claude/.ccg/prompts/{{FRONTEND_PRIMARY}}/tester.md`,先用 Read 工具读取再开始"
179
201
 
180
202
  OUTPUT:完整测试代码(使用项目现有测试框架,覆盖正常路径、边界条件、异常处理)
181
203