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.
- package/README.md +134 -277
- package/README.zh-CN.md +134 -272
- package/dist/chunks/version-build.mjs +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/index.d.mts +709 -16
- package/dist/index.d.ts +709 -16
- package/dist/index.mjs +1061 -30
- package/dist/shared/{ccgx-workflow.j1spUsik.mjs → ccgx-workflow.CdHnJLak.mjs} +106 -22
- package/package.json +1 -1
- package/templates/commands/agents/code-fixer.md +6 -6
- package/templates/commands/agents/phase-runner.md +46 -14
- package/templates/commands/agents/plan-checker.md +10 -0
- package/templates/commands/analyze.md +66 -25
- package/templates/commands/autonomous.md +428 -225
- package/templates/commands/cancel.md +9 -0
- package/templates/commands/codex-exec.md +12 -11
- package/templates/commands/context.md +14 -0
- package/templates/commands/debate.md +10 -6
- package/templates/commands/execute.md +76 -28
- package/templates/commands/optimize.md +53 -25
- package/templates/commands/plan.md +78 -28
- package/templates/commands/review.md +26 -19
- package/templates/commands/spec-impl.md +68 -127
- package/templates/commands/spec-plan.md +61 -82
- package/templates/commands/spec-research.md +35 -92
- package/templates/commands/spec-review.md +34 -119
- package/templates/commands/status.md +1 -0
- package/templates/commands/team-exec.md +45 -13
- package/templates/commands/team.md +64 -167
- package/templates/commands/test.md +56 -34
- package/templates/commands/verify-work.md +36 -13
- package/templates/commands/verify.md +35 -0
- package/templates/commands/workflow.md +22 -37
- package/templates/hooks/ccg-loop-detector.cjs +39 -8
- package/templates/hooks/ccg-statusline.js +142 -2
- package/templates/hooks/ccg-stop-gate.cjs +248 -19
- package/templates/hooks/ccg-subagent-context.cjs +505 -0
- package/templates/scripts/ccg-state-lock.cjs +510 -0
- package/templates/scripts/ccg-team-schedule.cjs +328 -0
- package/templates/scripts/ccgx-call-plugin.mjs +494 -141
- package/templates/scripts/invoke-model.mjs +28 -1
- package/templates/scripts/task-store.cjs +614 -0
- package/templates/skills/tools/verify-change/SKILL.md +7 -0
- package/templates/skills/tools/verify-module/SKILL.md +7 -0
- package/templates/skills/tools/verify-quality/SKILL.md +7 -0
- 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.
|
|
41
|
-
- 若任何任务缺失 `wave` 字段 → 整份计划全部归入 `wave: 1`,`depends_on: []`,全并行执行。
|
|
41
|
+
3. **权威分波(ccg-team-schedule.cjs 拓扑导出)**:
|
|
42
42
|
- 若任何任务缺失 `id` 字段 → 按出现顺序自动编号 `T1, T2, ...`。
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
- `
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
162
|
+
双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 Bash 直调 plugin 快路径:
|
|
163
163
|
|
|
164
|
-
1. **优先 plugin
|
|
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(
|
|
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
|
-
|
|
171
|
+
**通道 A — Bash 直调 plugin 快路径(默认)**:
|
|
172
172
|
|
|
173
|
-
|
|
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
|
-
|
|
175
|
+
**Step — Write 两个 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
|
-
|
|
181
|
+
backend 架构模板:
|
|
179
182
|
```
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
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
|
-
|
|
221
|
-
|
|
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(
|
|
279
|
-
- **通道 B(BC wrapper
|
|
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
|
|
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
|
-
|
|
363
|
+
**通道 A — Bash 直调 plugin 快路径(默认)**:
|
|
412
364
|
|
|
413
|
-
|
|
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
|
-
|
|
367
|
+
**Step — Write 两个 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
|
-
|
|
373
|
+
backend review 模板:
|
|
419
374
|
```
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
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
|
-
|
|
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
|
-
|
|
462
|
-
|
|
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(
|
|
520
|
-
- **通道 B(BC wrapper
|
|
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
|
|
45
|
+
CCG 把双模型并行通道从 `Bash(codeagent-wrapper)` **默认切换**为 Bash 直调 plugin 快路径:
|
|
46
46
|
|
|
47
|
-
1. **优先 plugin
|
|
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(
|
|
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
|
|
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
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
- **后端代码** → `
|
|
170
|
-
-
|
|
171
|
-
- **前端代码** → `
|
|
172
|
-
-
|
|
173
|
-
- **全栈代码** →
|
|
174
|
-
1. `
|
|
175
|
-
-
|
|
176
|
-
2. `
|
|
177
|
-
-
|
|
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
|
|