ccgx-workflow 1.0.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/LICENSE +22 -0
- package/README.md +469 -0
- package/README.zh-CN.md +466 -0
- package/bin/ccg.mjs +2 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.mjs +173 -0
- package/dist/index.d.mts +1774 -0
- package/dist/index.d.ts +1774 -0
- package/dist/index.mjs +2029 -0
- package/dist/shared/ccgx-workflow.WgUzkiC3.mjs +5248 -0
- package/package.json +129 -0
- package/templates/commands/agents/assumptions-analyzer.md +129 -0
- package/templates/commands/agents/code-fixer.md +292 -0
- package/templates/commands/agents/codebase-mapper.md +152 -0
- package/templates/commands/agents/debug-session-manager.md +247 -0
- package/templates/commands/agents/debugger.md +111 -0
- package/templates/commands/agents/eval-auditor.md +171 -0
- package/templates/commands/agents/framework-selector.md +152 -0
- package/templates/commands/agents/get-current-datetime.md +29 -0
- package/templates/commands/agents/init-architect.md +114 -0
- package/templates/commands/agents/integration-checker.md +163 -0
- package/templates/commands/agents/interface-auditor.md +170 -0
- package/templates/commands/agents/nyquist-auditor.md +131 -0
- package/templates/commands/agents/pattern-mapper.md +111 -0
- package/templates/commands/agents/phase-runner.md +321 -0
- package/templates/commands/agents/plan-checker.md +255 -0
- package/templates/commands/agents/planner.md +320 -0
- package/templates/commands/agents/team-architect.md +186 -0
- package/templates/commands/agents/team-qa.md +121 -0
- package/templates/commands/agents/team-reviewer.md +157 -0
- package/templates/commands/agents/ui-ux-designer.md +573 -0
- package/templates/commands/agents/verifier.md +274 -0
- package/templates/commands/analyze.md +210 -0
- package/templates/commands/autonomous.md +792 -0
- package/templates/commands/cancel.md +132 -0
- package/templates/commands/clean-branches.md +117 -0
- package/templates/commands/codex-exec.md +404 -0
- package/templates/commands/commit.md +151 -0
- package/templates/commands/context.md +332 -0
- package/templates/commands/debate.md +165 -0
- package/templates/commands/debug.md +226 -0
- package/templates/commands/enhance.md +64 -0
- package/templates/commands/execute.md +380 -0
- package/templates/commands/init.md +123 -0
- package/templates/commands/optimize.md +217 -0
- package/templates/commands/plan.md +373 -0
- package/templates/commands/result.md +106 -0
- package/templates/commands/review.md +338 -0
- package/templates/commands/rollback.md +116 -0
- package/templates/commands/spec-impl.md +139 -0
- package/templates/commands/spec-init.md +101 -0
- package/templates/commands/spec-plan.md +210 -0
- package/templates/commands/spec-research.md +152 -0
- package/templates/commands/spec-review.md +120 -0
- package/templates/commands/status.md +206 -0
- package/templates/commands/team-exec.md +265 -0
- package/templates/commands/test.md +236 -0
- package/templates/commands/verify-work.md +338 -0
- package/templates/commands/verify.md +66 -0
- package/templates/commands/workflow.md +190 -0
- package/templates/commands/worktree.md +128 -0
- package/templates/hooks/ccg-context-monitor.js +159 -0
- package/templates/hooks/ccg-session-state.cjs +510 -0
- package/templates/hooks/ccg-statusline.js +142 -0
- package/templates/output-styles/abyss-command.md +56 -0
- package/templates/output-styles/abyss-concise.md +89 -0
- package/templates/output-styles/abyss-cultivator.md +302 -0
- package/templates/output-styles/abyss-ritual.md +70 -0
- package/templates/output-styles/engineer-professional.md +89 -0
- package/templates/output-styles/laowang-engineer.md +127 -0
- package/templates/output-styles/nekomata-engineer.md +120 -0
- package/templates/output-styles/ojousama-engineer.md +121 -0
- package/templates/prompts/claude/analyzer.md +59 -0
- package/templates/prompts/claude/architect.md +54 -0
- package/templates/prompts/claude/debugger.md +71 -0
- package/templates/prompts/claude/optimizer.md +73 -0
- package/templates/prompts/claude/reviewer.md +63 -0
- package/templates/prompts/claude/tester.md +69 -0
- package/templates/prompts/codex/analyzer.md +58 -0
- package/templates/prompts/codex/architect.md +54 -0
- package/templates/prompts/codex/debugger.md +74 -0
- package/templates/prompts/codex/optimizer.md +81 -0
- package/templates/prompts/codex/reviewer.md +73 -0
- package/templates/prompts/codex/tester.md +62 -0
- package/templates/prompts/gemini/analyzer.md +61 -0
- package/templates/prompts/gemini/architect.md +55 -0
- package/templates/prompts/gemini/debugger.md +78 -0
- package/templates/prompts/gemini/frontend.md +64 -0
- package/templates/prompts/gemini/optimizer.md +84 -0
- package/templates/prompts/gemini/reviewer.md +80 -0
- package/templates/prompts/gemini/tester.md +68 -0
- package/templates/rules/ccg-skill-routing.md +83 -0
- package/templates/rules/ccg-skills.md +71 -0
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -0
- package/templates/scripts/invoke-model.mjs +949 -0
- package/templates/scripts/repatch-gemini-plugin.mjs +194 -0
- package/templates/skills/SKILL.md +92 -0
- package/templates/skills/domains/ai/SKILL.md +35 -0
- package/templates/skills/domains/ai/agent-dev.md +242 -0
- package/templates/skills/domains/ai/llm-security.md +288 -0
- package/templates/skills/domains/ai/prompt-and-eval.md +279 -0
- package/templates/skills/domains/ai/rag-system.md +542 -0
- package/templates/skills/domains/architecture/SKILL.md +43 -0
- package/templates/skills/domains/architecture/api-design.md +225 -0
- package/templates/skills/domains/architecture/caching.md +299 -0
- package/templates/skills/domains/architecture/cloud-native.md +285 -0
- package/templates/skills/domains/architecture/message-queue.md +329 -0
- package/templates/skills/domains/architecture/security-arch.md +297 -0
- package/templates/skills/domains/data-engineering/SKILL.md +208 -0
- package/templates/skills/domains/development/SKILL.md +47 -0
- package/templates/skills/domains/development/cpp.md +246 -0
- package/templates/skills/domains/development/go.md +323 -0
- package/templates/skills/domains/development/java.md +277 -0
- package/templates/skills/domains/development/python.md +288 -0
- package/templates/skills/domains/development/rust.md +313 -0
- package/templates/skills/domains/development/shell.md +313 -0
- package/templates/skills/domains/development/typescript.md +277 -0
- package/templates/skills/domains/devops/SKILL.md +40 -0
- package/templates/skills/domains/devops/cost-optimization.md +272 -0
- package/templates/skills/domains/devops/database.md +217 -0
- package/templates/skills/domains/devops/devsecops.md +198 -0
- package/templates/skills/domains/devops/git-workflow.md +181 -0
- package/templates/skills/domains/devops/observability.md +280 -0
- package/templates/skills/domains/devops/performance.md +336 -0
- package/templates/skills/domains/devops/testing.md +283 -0
- package/templates/skills/domains/frontend-design/SKILL.md +244 -0
- package/templates/skills/domains/frontend-design/agents/openai.yaml +4 -0
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -0
- package/templates/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -0
- package/templates/skills/domains/frontend-design/engineering.md +287 -0
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -0
- package/templates/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -0
- package/templates/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -0
- package/templates/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
- package/templates/skills/domains/frontend-design/reference/color-and-contrast.md +132 -0
- package/templates/skills/domains/frontend-design/reference/interaction-design.md +195 -0
- package/templates/skills/domains/frontend-design/reference/motion-design.md +99 -0
- package/templates/skills/domains/frontend-design/reference/responsive-design.md +114 -0
- package/templates/skills/domains/frontend-design/reference/spatial-design.md +100 -0
- package/templates/skills/domains/frontend-design/reference/typography.md +133 -0
- package/templates/skills/domains/frontend-design/reference/ux-writing.md +107 -0
- package/templates/skills/domains/frontend-design/state-management.md +680 -0
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -0
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -0
- package/templates/skills/domains/infrastructure/SKILL.md +201 -0
- package/templates/skills/domains/mobile/SKILL.md +225 -0
- package/templates/skills/domains/orchestration/SKILL.md +30 -0
- package/templates/skills/domains/orchestration/multi-agent.md +263 -0
- package/templates/skills/domains/security/SKILL.md +73 -0
- package/templates/skills/domains/security/blue-team.md +436 -0
- package/templates/skills/domains/security/code-audit.md +265 -0
- package/templates/skills/domains/security/pentest.md +226 -0
- package/templates/skills/domains/security/red-team.md +374 -0
- package/templates/skills/domains/security/threat-intel.md +372 -0
- package/templates/skills/domains/security/vuln-research.md +369 -0
- package/templates/skills/impeccable/adapt/SKILL.md +201 -0
- package/templates/skills/impeccable/animate/SKILL.md +176 -0
- package/templates/skills/impeccable/arrange/SKILL.md +126 -0
- package/templates/skills/impeccable/audit/SKILL.md +149 -0
- package/templates/skills/impeccable/bolder/SKILL.md +118 -0
- package/templates/skills/impeccable/clarify/SKILL.md +185 -0
- package/templates/skills/impeccable/colorize/SKILL.md +144 -0
- package/templates/skills/impeccable/critique/SKILL.md +203 -0
- package/templates/skills/impeccable/critique/reference/cognitive-load.md +106 -0
- package/templates/skills/impeccable/critique/reference/heuristics-scoring.md +234 -0
- package/templates/skills/impeccable/critique/reference/personas.md +178 -0
- package/templates/skills/impeccable/delight/SKILL.md +305 -0
- package/templates/skills/impeccable/distill/SKILL.md +123 -0
- package/templates/skills/impeccable/extract/SKILL.md +94 -0
- package/templates/skills/impeccable/harden/SKILL.md +357 -0
- package/templates/skills/impeccable/normalize/SKILL.md +72 -0
- package/templates/skills/impeccable/onboard/SKILL.md +248 -0
- package/templates/skills/impeccable/optimize/SKILL.md +268 -0
- package/templates/skills/impeccable/overdrive/SKILL.md +143 -0
- package/templates/skills/impeccable/polish/SKILL.md +205 -0
- package/templates/skills/impeccable/quieter/SKILL.md +104 -0
- package/templates/skills/impeccable/teach-impeccable/SKILL.md +72 -0
- package/templates/skills/impeccable/typeset/SKILL.md +117 -0
- package/templates/skills/orchestration/multi-agent/SKILL.md +533 -0
- package/templates/skills/run_skill.js +129 -0
- package/templates/skills/scrapling/SKILL.md +98 -0
- package/templates/skills/scrapling/references/api-quick-ref.md +127 -0
- package/templates/skills/scrapling/references/cookie-vault.md +56 -0
- package/templates/skills/scrapling/references/maintenance.md +79 -0
- package/templates/skills/scrapling/references/site-patterns.md +86 -0
- package/templates/skills/scrapling/references/troubleshooting.md +95 -0
- package/templates/skills/scrapling/templates/basic_fetch.py +19 -0
- package/templates/skills/scrapling/templates/parse_only.py +15 -0
- package/templates/skills/scrapling/templates/session_login.py +19 -0
- package/templates/skills/scrapling/templates/stealth_cloudflare.py +28 -0
- package/templates/skills/tools/extract-learnings/SKILL.md +77 -0
- package/templates/skills/tools/forensics/SKILL.md +89 -0
- package/templates/skills/tools/gen-docs/SKILL.md +116 -0
- package/templates/skills/tools/gen-docs/scripts/doc_generator.js +435 -0
- package/templates/skills/tools/health/SKILL.md +121 -0
- package/templates/skills/tools/lib/shared.js +98 -0
- package/templates/skills/tools/map-codebase/SKILL.md +118 -0
- package/templates/skills/tools/override-refusal/SKILL.md +53 -0
- package/templates/skills/tools/override-refusal/agents/openai.yaml +4 -0
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -0
- package/templates/skills/tools/verify-change/SKILL.md +143 -0
- package/templates/skills/tools/verify-change/scripts/change_analyzer.js +289 -0
- package/templates/skills/tools/verify-module/SKILL.md +130 -0
- package/templates/skills/tools/verify-module/scripts/module_scanner.js +171 -0
- package/templates/skills/tools/verify-quality/SKILL.md +163 -0
- package/templates/skills/tools/verify-quality/scripts/quality_checker.js +337 -0
- package/templates/skills/tools/verify-security/SKILL.md +146 -0
- package/templates/skills/tools/verify-security/scripts/security_scanner.js +283 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: '后台任务观测:列表 / 单查 / 阻塞等待 / dashboard / tail 流式 / 卡点检测 / 单 phase cancel(v4.5 P7 升级)'
|
|
3
|
+
argument-hint: "[<job-id>] [--wait --timeout-ms <ms>] [--tail <job-id>] [--cancel <phase-id>]"
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Read
|
|
6
|
+
- Bash
|
|
7
|
+
- Glob
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Status — 后台任务观测(v4.5 dashboard + tail)
|
|
11
|
+
|
|
12
|
+
CCG v4.5 起 phase-runner 走 Bash subprocess(`claude -p --output-format stream-json ...`),stream 落盘到 `<workdir>/.context/jobs/<job-id>/progress.jsonl`。失去 sidechain inline UI 后,本命令是用户**唯一**的微观干预入口,必须复刻这四个长跑场景:
|
|
13
|
+
|
|
14
|
+
| 场景 | 模式 |
|
|
15
|
+
|------|------|
|
|
16
|
+
| 早上查岗 | `/ccg:status` 无参数 → dashboard |
|
|
17
|
+
| 死循环 debug | tail 模式自动叠加 stuck warnings |
|
|
18
|
+
| 单 phase cancel | `--cancel <phase-id>` 写 `cancel.flag` + grace-kill |
|
|
19
|
+
| 实时 tool call | `--tail <job-id>` 单行覆写 |
|
|
20
|
+
|
|
21
|
+
## 状态文件契约
|
|
22
|
+
|
|
23
|
+
| 文件 | 写者 | 内容 |
|
|
24
|
+
|------|------|------|
|
|
25
|
+
| `state.json` | 主线 / phase-runner | `{ task_id, kind, status, phase_id, started_at, last_update, summary, cancel_requested }` |
|
|
26
|
+
| `progress.jsonl` | phase-runner Bash subprocess | stream-json ndjson(D6) |
|
|
27
|
+
| `result.md` | phase-runner | ≤ 200 token 摘要 |
|
|
28
|
+
| `cancel.flag` | `/ccg:cancel` 或 `/ccg:status --cancel` | 协作退出哨兵 |
|
|
29
|
+
|
|
30
|
+
## 使用方法
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
/ccg:status # 模式 A:列表 / dashboard
|
|
34
|
+
/ccg:status <job-id> # 模式 B:单查详情
|
|
35
|
+
/ccg:status <job-id> --wait --timeout-ms <ms> # 模式 C:阻塞等待
|
|
36
|
+
/ccg:status --tail <job-id> # 模式 D:流式 tail(v4.5 新增)
|
|
37
|
+
/ccg:status --cancel <phase-id> # 模式 E:单 phase 协作 cancel(v4.5 新增)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 模式 A:Dashboard(无参数)
|
|
41
|
+
|
|
42
|
+
聚合所有 active job + 多 phase ASCII 进度条:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
[JOB: ccg-nightly-run]
|
|
46
|
+
Phase 1 (Setup) [====================] 100% (4m 12s) ✅
|
|
47
|
+
Phase 2 (Refactor) [==========> ] 50% (2m 35s) 🤖 codex-rescue
|
|
48
|
+
Phase 3 (Tests) [ ] 0% (queued)
|
|
49
|
+
|
|
50
|
+
[JOB: phase-07-async-1730] ⚠ stuck warning
|
|
51
|
+
Phase 7 (Status v2) [============> ] 60% (12m 04s) 🛠️ edit_file
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
实施:
|
|
55
|
+
|
|
56
|
+
1. `Bash`: `ls -d .context/jobs/*/ 2>/dev/null` 找所有 job 目录
|
|
57
|
+
2. 对每个 job 读 `state.json`(按 `started_at` DESC)
|
|
58
|
+
3. 用 helper 解析 progress(**用 Node 调 ts 帮手** —— 见下方"参考实现"):
|
|
59
|
+
- 进度估算:phase status `done`=100% / `failed`=100% / `running`=50% / `queued`=0%
|
|
60
|
+
- elapsed = `last_update - started_at`
|
|
61
|
+
- stuck 警告:调 `detectStuck(jsonl)` 看是否非空
|
|
62
|
+
4. 用 ASCII-7 安全字符渲染进度条(`=` / `>` / 空格),**禁用 unicode block char**(Windows cmd cp936 不支持)
|
|
63
|
+
|
|
64
|
+
## 模式 B:单 job 详情
|
|
65
|
+
|
|
66
|
+
1. Read `.context/jobs/<job-id>/state.json` pretty-print
|
|
67
|
+
2. 如存在 `result.md`,附在末尾
|
|
68
|
+
3. 如存在 `cancel.flag`,标 `⚠ Cancel requested at: <flag-content-first-line>`
|
|
69
|
+
4. 调 `detectStuck(progressJsonl)`,有 warning 显眼输出
|
|
70
|
+
5. 不存在 → "Job not found: <id>"
|
|
71
|
+
|
|
72
|
+
## 模式 C:阻塞等待(`--wait --timeout-ms <ms>`)
|
|
73
|
+
|
|
74
|
+
1. 解析 `--timeout-ms`(默认 60_000,上限 600_000)
|
|
75
|
+
2. 每 2 秒轮询 `state.json.status` ∈ `{done, failed, canceled}`
|
|
76
|
+
3. 终态 → 切到模式 B
|
|
77
|
+
4. 超时 → "⏱ Timeout after <X>s — job still in <status>,retry with longer --timeout-ms 或 /ccg:cancel <id>"
|
|
78
|
+
5. 超时退出码 0(不视为失败)
|
|
79
|
+
|
|
80
|
+
## 模式 D:Tail 流式(v4.5 新增)
|
|
81
|
+
|
|
82
|
+
`/ccg:status --tail <job-id>` 持续读 `progress.jsonl`,单行覆写:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
[Phase 2] 08:15:22 🤖 Analyzing auth logic...
|
|
86
|
+
[Phase 2] 08:15:30 🛠️ Running tool: read_file (src/auth/oauth.ts)
|
|
87
|
+
[Phase 2] 08:15:32 🔗 Hook: PreToolUse
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**事件过滤**(renderEvent 内置):
|
|
91
|
+
|
|
92
|
+
| 丢弃 | 保留 |
|
|
93
|
+
|------|------|
|
|
94
|
+
| `system/init` | `tool_use` |
|
|
95
|
+
| `content_block_delta`(逐 token) | `hook_started` |
|
|
96
|
+
| `message_start/delta/stop` | `assistant`(短摘要 ≤ 80 字) |
|
|
97
|
+
| `stream_event` | `rate_limit_event` |
|
|
98
|
+
| | `result/success` `result/error*` |
|
|
99
|
+
|
|
100
|
+
**渲染契约**:
|
|
101
|
+
|
|
102
|
+
| 类型 | 输出 |
|
|
103
|
+
|------|------|
|
|
104
|
+
| `tool_use` | `🛠️ Running tool: <name> (<args summary>)` |
|
|
105
|
+
| `assistant` 文本 | `🤖 <第一段非空文本 ≤ 80 字>` |
|
|
106
|
+
| `hook_started` | `🔗 Hook: <name>` |
|
|
107
|
+
| `rate_limit_event` | `⚠️ Rate limit hit (retrying...)` |
|
|
108
|
+
| `result/success` | `✅ Phase <N> completed` |
|
|
109
|
+
|
|
110
|
+
实施(Bash 轮询 + Node renderer):
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# 启动后每 1s 读一次新行,调 renderJsonl 转单行
|
|
114
|
+
JOBID="$1"
|
|
115
|
+
PROGRESS=".context/jobs/${JOBID}/progress.jsonl"
|
|
116
|
+
LAST_OFFSET=0
|
|
117
|
+
while true; do
|
|
118
|
+
if [ -f "$PROGRESS" ]; then
|
|
119
|
+
SIZE=$(wc -c < "$PROGRESS")
|
|
120
|
+
if [ "$SIZE" -gt "$LAST_OFFSET" ]; then
|
|
121
|
+
tail -c +$((LAST_OFFSET+1)) "$PROGRESS" | node -e '...renderJsonl from stdin...'
|
|
122
|
+
LAST_OFFSET=$SIZE
|
|
123
|
+
fi
|
|
124
|
+
fi
|
|
125
|
+
STATUS=$(node -e "console.log(JSON.parse(require('fs').readFileSync('.context/jobs/${JOBID}/state.json')).status)")
|
|
126
|
+
case "$STATUS" in done|failed|canceled) break ;; esac
|
|
127
|
+
sleep 1
|
|
128
|
+
done
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
每次 tail 前调 `detectStuck` 注入 banner(loop / slow-tool / stalled 三类警告)。
|
|
132
|
+
|
|
133
|
+
## 模式 E:单 phase 协作 cancel(v4.5 新增)
|
|
134
|
+
|
|
135
|
+
`/ccg:status --cancel <phase-id>` 流程:
|
|
136
|
+
|
|
137
|
+
1. 校验 `phase-id` 存在某个 job 下:扫所有 `state.json.phase_id`
|
|
138
|
+
2. 写 `.context/jobs/<job-id>/cancel.flag` —— 内容 `phase=<phase-id>\nrequested-at=<iso>`
|
|
139
|
+
3. 翻 `state.cancel_requested=true`
|
|
140
|
+
4. **5 秒 grace 等待** —— 给 phase-runner 子进程读 cancel.flag 优雅退出
|
|
141
|
+
5. 5s 后子进程仍 running → 调用 `killProcessTree({ pid: state.cli_pid, pgid: state.process_group_id, graceMs: 5000 })`(来自 `src/utils/process-tree.ts`,v4.5 P1b 已落地,P1f wired)
|
|
142
|
+
6. 输出最终结果:`canceled gracefully` / `force-killed pid=N` / `not found`
|
|
143
|
+
|
|
144
|
+
**实施样板**(主线 LLM 用 Bash + node -e 调用 helper):
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# Step 5: kill-tree on POSIX/Windows
|
|
148
|
+
PID=$(node -e "console.log(JSON.parse(require('fs').readFileSync('.context/jobs/${JOBID}/state.json')).cli_pid || '')")
|
|
149
|
+
if [ -n "$PID" ]; then
|
|
150
|
+
node -e "
|
|
151
|
+
const { killProcessTree } = require('~/.claude/.ccg/dist/index.mjs');
|
|
152
|
+
killProcessTree({ pid: ${PID}, graceMs: 5000 }).then(r => {
|
|
153
|
+
console.log(JSON.stringify(r));
|
|
154
|
+
});
|
|
155
|
+
"
|
|
156
|
+
fi
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Windows: `taskkill /T /F /PID <pid>` 内置;POSIX: SIGTERM 进程组 → 5s grace → SIGKILL(详见 `src/utils/process-tree.ts` `killProcessTree()`)。
|
|
160
|
+
|
|
161
|
+
## 严格约束
|
|
162
|
+
|
|
163
|
+
- ✅ **只读**——本命令绝不修改 `state.json` / `result.md` / `progress.jsonl`(cancel 例外只写 cancel.flag)
|
|
164
|
+
- ✅ 列表视图按 `started_at` DESC(最新优先)
|
|
165
|
+
- ✅ ASCII-7 only 进度条(cp936 安全);emoji 用 utf-8(Windows Terminal / PowerShell / WSL 均支持,cmd 退化为 `?` 不影响功能)
|
|
166
|
+
- ❌ 不轮询 `result.md` 内容;判定终态只看 `state.json.status`
|
|
167
|
+
- ❌ 不调用 `pnpm test` / `git status` 等副作用命令
|
|
168
|
+
- ❌ tail 模式不要无限阻塞——5 分钟无新事件 + 无 stalled detector 触发时退出,提示用户用 `--wait` 替代
|
|
169
|
+
- ❌ 阻塞等待 `--wait` 不要 sleep > 600s
|
|
170
|
+
|
|
171
|
+
## 与其他命令的协作
|
|
172
|
+
|
|
173
|
+
| 命令 | 作用 |
|
|
174
|
+
|------|------|
|
|
175
|
+
| `/ccg:result <id>` | job 终态后取走 `result.md` 摘要回主线 |
|
|
176
|
+
| `/ccg:cancel <id>` | **整个 job** cancel(与本命令 `--cancel <phase-id>` 区分:phase 级 vs job 级) |
|
|
177
|
+
| `/ccg:autonomous` / `phase-runner` | 启动 job,写 `state.json` 初始记录 + progress.jsonl |
|
|
178
|
+
|
|
179
|
+
## 参考实现
|
|
180
|
+
|
|
181
|
+
helper 路径(dist 安装位置):
|
|
182
|
+
|
|
183
|
+
```javascript
|
|
184
|
+
// 解析 progress.jsonl → 渲染行
|
|
185
|
+
const { renderJsonl, progressBar, formatElapsed } = require('~/.claude/.ccg/dist/index.mjs')
|
|
186
|
+
|
|
187
|
+
// 卡点检测
|
|
188
|
+
const { detectStuck, hasStuckWarning } = require('~/.claude/.ccg/dist/index.mjs')
|
|
189
|
+
|
|
190
|
+
// 已有 v4.0 helper
|
|
191
|
+
const { listJobs, getJob, requestCancel } = require('~/.claude/.ccg/dist/index.mjs')
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
源码真相:
|
|
195
|
+
- `src/utils/jobs.ts` — `listJobs / getJob / requestCancel`
|
|
196
|
+
- `src/utils/stream-renderer.ts`(v4.5 P7) — `renderJsonl / renderEvent / progressBar / formatElapsed`
|
|
197
|
+
- `src/utils/stuck-detector.ts`(v4.5 P7) — `detectStuck / hasStuckWarning`
|
|
198
|
+
- `src/utils/process-tree.ts`(v4.5 P1b 落地 + P1f wired) — `killProcessTree / sampleProcessRssMb / writeDegradedFlag / readDegradedFlag / reconcileStaleJobs`
|
|
199
|
+
|
|
200
|
+
v4.x 暂未把 `dist/` 暴露给命令模板,主线 LLM 走 Bash + Read 等价行为:
|
|
201
|
+
|
|
202
|
+
- dashboard:调 `node -e` 读各 state.json + 简单进度推断 + `=`/`>`/空格手动拼字符串
|
|
203
|
+
- tail:调 `node -e` 解析 ndjson + 走 `renderEvent` 等价 switch(TS helper 是真相源)
|
|
204
|
+
- cancel:直接 `echo > cancel.flag` + sleep 5 + 调 process-tree(Phase 2 ready 后)
|
|
205
|
+
|
|
206
|
+
升级路径见 `.ccg-migration/v4.4-to-v4.5.md` § "/ccg:status v2 升级"。
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 'Agent Teams 并行实施 - 读取计划文件,spawn Builder teammates 并行写代码'
|
|
3
|
+
context_budget: orchestrator-15
|
|
4
|
+
subagent_freshness: required
|
|
5
|
+
---
|
|
6
|
+
<!-- CCG:TEAM:EXEC:START -->
|
|
7
|
+
**Core Philosophy**
|
|
8
|
+
- 实施是纯机械执行——所有决策已在 team-plan 阶段完成。
|
|
9
|
+
- Lead 不写代码,只做编排和汇总。
|
|
10
|
+
- 调度模式 = **wave-based 依赖图调度**:
|
|
11
|
+
* 同一 wave 内任务文件零交叉,Builder 并行 spawn
|
|
12
|
+
* 跨 wave 严格顺序,上一 wave 全部退出后才进入下一 wave
|
|
13
|
+
* 失败的任务不阻塞同 wave 其他任务,但会让下游 wave 中依赖它的任务被 skipped
|
|
14
|
+
- 每个 wave 结束写 `.ccg/state.md`,支持断点续跑。
|
|
15
|
+
|
|
16
|
+
**Guardrails**
|
|
17
|
+
- **前置条件**:`.claude/team-plan/` 下必须有计划文件。没有则终止,提示先运行 `/ccg:team-plan`。
|
|
18
|
+
- **Agent Teams 必须启用**:需要 `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1`。
|
|
19
|
+
- Lead 绝不直接修改产品代码。
|
|
20
|
+
- 每个 Builder 只能修改分配给它的文件。
|
|
21
|
+
- 同一 wave 内的多个 Agent 调用**必须在一条消息内同时发出**(多 tool calls 并行 spawn)。
|
|
22
|
+
|
|
23
|
+
**Steps**
|
|
24
|
+
|
|
25
|
+
### Step 1: 前置检查
|
|
26
|
+
- 检测 Agent Teams 是否可用。
|
|
27
|
+
- 若不可用,输出启用指引后终止:
|
|
28
|
+
```
|
|
29
|
+
⚠️ Agent Teams 未启用。请先配置:
|
|
30
|
+
在 settings.json 中添加:
|
|
31
|
+
{ "env": { "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" } }
|
|
32
|
+
```
|
|
33
|
+
- 读取 `.claude/team-plan/` 下最新的计划文件。
|
|
34
|
+
- 若无计划文件,提示:`请先运行 /ccg:team-plan <任务描述> 生成计划`,终止。
|
|
35
|
+
- 通过 Bash `pwd` 获取 WORKDIR 绝对路径。
|
|
36
|
+
|
|
37
|
+
### Step 2: 解析依赖图
|
|
38
|
+
1. **读取计划文件**:优先解析末尾的 `tasks:` yaml 块(machine-readable),fallback 到 Markdown 子任务列表。
|
|
39
|
+
2. **抽取每个任务**:`id` / `type` / `files` / `wave` / `depends_on` / `prompt-bearing 内容(实施步骤 + 验收标准 + 文件范围)`。
|
|
40
|
+
3. **降级兼容(旧版 plan 文件)**:
|
|
41
|
+
- 若任何任务缺失 `wave` 字段 → 整份计划全部归入 `wave: 1`,`depends_on: []`,全并行执行。
|
|
42
|
+
- 若任何任务缺失 `id` 字段 → 按出现顺序自动编号 `T1, T2, ...`。
|
|
43
|
+
- 输出降级提示:`⚠️ 检测到旧版 plan(无 wave 字段),已降级为单 wave 全并行模式`。
|
|
44
|
+
4. **拓扑校验**:
|
|
45
|
+
- `depends_on` 引用的 id 必须都存在
|
|
46
|
+
- 任务自身 wave 必须严格大于其所有 `depends_on` 任务的 wave
|
|
47
|
+
- 同 wave 内任务文件 `files` 必须零交叉
|
|
48
|
+
- 任一校验失败 → 终止,列出问题并要求用户修正 plan 文件
|
|
49
|
+
5. **断点续跑检测**:
|
|
50
|
+
- 若 `<WORKDIR>/.ccg/state.md` 已存在,读取其中各任务状态:
|
|
51
|
+
* `completed` → 跳过
|
|
52
|
+
* `failed` / `skipped` → 询问用户是重跑还是保留
|
|
53
|
+
* `in_progress` / `pending` → 重新调度
|
|
54
|
+
- 若不存在,初始化新的 state.md(见 Step 6)。
|
|
55
|
+
|
|
56
|
+
### Step 3: 用户确认 + 创建 Team
|
|
57
|
+
- 向用户展示:
|
|
58
|
+
```
|
|
59
|
+
📋 即将进行 wave-based 并行实施:
|
|
60
|
+
- 总子任务:N 个(已完成 K,待执行 N-K)
|
|
61
|
+
- 总 Wave 数:M 个
|
|
62
|
+
- Wave 1: X 个并行 Builder
|
|
63
|
+
- Wave 2: Y 个并行 Builder(依赖 Wave 1)
|
|
64
|
+
- ...
|
|
65
|
+
- 失败处理:单任务失败不阻塞同 wave,依赖该任务的下游任务自动 skipped
|
|
66
|
+
- 状态文件:.ccg/state.md(每个 wave 结束自动更新)
|
|
67
|
+
确认开始?
|
|
68
|
+
```
|
|
69
|
+
- 用 `AskUserQuestion` 等待确认。
|
|
70
|
+
- 调用 TeamCreate 创建 team,team_name 设为 `<plan-id>-team`。
|
|
71
|
+
- 为所有"待执行"的子任务一次性调用 TaskCreate(注意:不是分 wave 创建,是一次创建完)。
|
|
72
|
+
- 用 TaskUpdate 的 `addBlockedBy` 把每个任务的 `depends_on` 转为 task 依赖(让 Claude Code 任务板自带依赖可视化)。
|
|
73
|
+
|
|
74
|
+
### Step 4: Wave 调度主循环
|
|
75
|
+
|
|
76
|
+
**对 wave = 1, 2, ..., M 依次执行:**
|
|
77
|
+
|
|
78
|
+
1. **决定本 wave 的可执行任务集合**:
|
|
79
|
+
- 收集所有 `wave == 当前 wave 号` 的任务
|
|
80
|
+
- 排除:状态为 `completed` 的任务
|
|
81
|
+
- 排除:任何一个 `depends_on` 任务状态为 `failed` 或 `skipped` 的任务 → 标记为 `skipped`,并在状态文件中说明原因("upstream T2 failed")
|
|
82
|
+
- 剩下的就是本 wave 真正要 spawn 的任务
|
|
83
|
+
|
|
84
|
+
2. **如果本 wave 可执行任务为空** → 直接进入下一 wave。
|
|
85
|
+
|
|
86
|
+
3. **⛔ 一条消息内并行 spawn 所有 Builder**:
|
|
87
|
+
- 你必须在**同一条 assistant message 中发起多个 Agent 工具调用**,每个待执行任务对应一个 Agent 调用。
|
|
88
|
+
- 例:本 wave 有 3 个任务 → 这条消息包含 3 个 Agent tool calls,三个 Builder 同时启动。
|
|
89
|
+
- 禁止串行(spawn builder-1 → 等结果 → spawn builder-2)。
|
|
90
|
+
- 每个 Agent 调用必须包含:
|
|
91
|
+
* **team_name**: Step 3 创建的 team name
|
|
92
|
+
* **name**: `"builder-<task-id>"`(如 `builder-T1`、`builder-T3`)
|
|
93
|
+
* **model**: `"sonnet"`
|
|
94
|
+
* **prompt**: 见下方模板
|
|
95
|
+
- spawn 后立即对每个 Task 调用 TaskUpdate 设 owner、status="in_progress"。
|
|
96
|
+
|
|
97
|
+
**Builder spawn prompt 模板**:
|
|
98
|
+
```
|
|
99
|
+
你是 Builder,负责实施一个子任务。严格按照以下指令执行。
|
|
100
|
+
|
|
101
|
+
## 你的任务 ID
|
|
102
|
+
<task.id>
|
|
103
|
+
|
|
104
|
+
## 你的任务
|
|
105
|
+
<从计划文件中提取该任务的完整实施步骤、验收标准、上下文>
|
|
106
|
+
|
|
107
|
+
## 工作目录
|
|
108
|
+
<WORKDIR>
|
|
109
|
+
|
|
110
|
+
## 文件范围约束(⛔ 硬性规则)
|
|
111
|
+
你只能创建或修改以下文件:
|
|
112
|
+
<task.files>
|
|
113
|
+
严禁修改任何其他文件。违反此规则等于任务失败。
|
|
114
|
+
|
|
115
|
+
## 上游依赖产物(仅供参考,不要修改)
|
|
116
|
+
<列出 depends_on 中已 completed 任务实际产出的文件,让 Builder 知道接口形态>
|
|
117
|
+
|
|
118
|
+
## 实施要求
|
|
119
|
+
1. 严格按照实施步骤执行
|
|
120
|
+
2. 代码必须符合项目现有规范和模式
|
|
121
|
+
3. 完成后运行相关的 lint/typecheck 验证(如果项目有配置)
|
|
122
|
+
4. 代码应自解释,非必要不加注释
|
|
123
|
+
|
|
124
|
+
## 验收标准
|
|
125
|
+
<从计划中提取>
|
|
126
|
+
|
|
127
|
+
完成所有步骤后,标记任务为 completed。
|
|
128
|
+
失败时,明确说出失败原因,标记为 failed,不要假装完成。
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
4. **等待本 wave 全部 Builder 退出**:
|
|
132
|
+
- teammates 完成 task 后会自动发消息,无需轮询。
|
|
133
|
+
- 进入 **delegate 模式**:除了接消息和回复,不做任何其他事。
|
|
134
|
+
- 如某个 Builder 发消息求助 → 通过 SendMessage 回复指导,不替它写代码。
|
|
135
|
+
- 单 Builder 失败:
|
|
136
|
+
* 记录失败原因到 state.md
|
|
137
|
+
* **不打断**同 wave 其他 Builder 继续工作
|
|
138
|
+
- 必须等到本 wave **全部 Builder** 都退出(completed 或 failed),才能进入下一 wave。
|
|
139
|
+
|
|
140
|
+
5. **Wave 结束清理**:
|
|
141
|
+
- 通过 SendMessage 给本 wave 所有 Builder 发 shutdown_request。
|
|
142
|
+
- 更新 `.ccg/state.md`(见 Step 6 格式)。
|
|
143
|
+
- 输出 wave 摘要:
|
|
144
|
+
```
|
|
145
|
+
✅ Wave <N> 完成: completed=X, failed=Y, skipped=Z
|
|
146
|
+
→ 进入 Wave <N+1>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Step 5: 失败处理选项
|
|
150
|
+
|
|
151
|
+
当某个 wave 出现 `failed` 任务时,所有后续 wave 调度结束后(**不在 wave 中途打断**),向用户报告:
|
|
152
|
+
|
|
153
|
+
```markdown
|
|
154
|
+
## ⚠️ 实施完成(含失败任务)
|
|
155
|
+
|
|
156
|
+
### 失败任务
|
|
157
|
+
- T2: 用户 API(src/api/users.ts)
|
|
158
|
+
- 失败原因:<Builder 报告的失败信息>
|
|
159
|
+
- 修改的文件:<git status 列出>
|
|
160
|
+
- 影响下游:T4(已 skipped)、T7(已 skipped)
|
|
161
|
+
|
|
162
|
+
### 选项
|
|
163
|
+
1. **重试一次**:将失败任务重置为 pending,重新走 wave 调度(依赖它的 skipped 任务也会重新进入待执行)
|
|
164
|
+
2. **传给 Reviewer**:用 `/ccg:team-review` 让双模型审查失败原因和修改的文件
|
|
165
|
+
3. **接受失败**:保留 state.md,跳出执行
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
用 `AskUserQuestion` 让用户选择。**重试**最多再走一轮 wave 调度,第二次仍失败则强制选 2/3。
|
|
169
|
+
|
|
170
|
+
### Step 5.5: Frontmatter-only Summary 读取(v4.0 Phase 2 状态机)
|
|
171
|
+
|
|
172
|
+
**核心契约**:Lead 不接 Builder 的全部 stdout。每个 Builder 完成任务后,**必须由 Lead 读取该任务对应的 `.context/<phase>/SUMMARY.md` 的 YAML frontmatter**——不读 body,不读 builder transcript。
|
|
173
|
+
|
|
174
|
+
- `<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`。
|
|
176
|
+
- **预算硬约束**:单个 SUMMARY.md frontmatter < 200 tokens,5 个 phase 累计 < 1000 tokens 进入 orchestrator context。如某 SUMMARY 超出 200 tokens,截断 `notes` 字段并记录到 state.md 的 Notes 段。
|
|
177
|
+
- **缺失处理**:若 Builder 没写 SUMMARY.md(异常退出 / 老版本 plan 文件),Lead 把对应任务标 `failed` 而非凭 builder 消息推断状态。
|
|
178
|
+
|
|
179
|
+
读取实现(推荐用 `src/utils/phase-context.ts` 暴露的 `readSummaryFrontmatter()`,等价于 Read SUMMARY.md 后只取 `---...---` 之间的内容)。
|
|
180
|
+
|
|
181
|
+
### Step 6: 汇总 + 清理
|
|
182
|
+
|
|
183
|
+
1. **汇总报告**:
|
|
184
|
+
```markdown
|
|
185
|
+
## ✅ Team 并行实施完成
|
|
186
|
+
|
|
187
|
+
### Wave 执行摘要
|
|
188
|
+
| Wave | 总任务 | completed | failed | skipped | 实际并行度 |
|
|
189
|
+
|------|--------|-----------|--------|---------|-----------|
|
|
190
|
+
| 1 | 2 | 2 | 0 | 0 | 2 |
|
|
191
|
+
| 2 | 3 | 2 | 1 | 0 | 3 |
|
|
192
|
+
| 3 | 1 | 0 | 0 | 1 | 0 |
|
|
193
|
+
|
|
194
|
+
### 任务详情
|
|
195
|
+
| Task ID | 名称 | 状态 | 修改文件 |
|
|
196
|
+
|---------|------|------|----------|
|
|
197
|
+
| T1 | 用户 API | ✅ completed | src/api/users.ts |
|
|
198
|
+
| T2 | 数据模型 | ✅ completed | prisma/schema.prisma |
|
|
199
|
+
| T3 | 用户卡片 | ✅ completed | src/components/UserCard.tsx |
|
|
200
|
+
| T4 | 用户列表 | ❌ failed | (失败原因) |
|
|
201
|
+
| T5 | 用户编辑 | ⏭ skipped | (依赖 T4) |
|
|
202
|
+
|
|
203
|
+
### 后续建议
|
|
204
|
+
1. 运行完整测试:`npm test` / `pnpm test`
|
|
205
|
+
2. 检查模块间集成
|
|
206
|
+
3. 提交代码:`git add -A && git commit`
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
2. **清理 Team**:通过 SendMessage shutdown 剩余 teammates,TeamDelete 清理 team。
|
|
210
|
+
|
|
211
|
+
3. **保留 state.md**:不要删除 `.ccg/state.md`——下次再跑同一 plan 时它就是断点。仅在所有任务全部 completed 时才清理。
|
|
212
|
+
|
|
213
|
+
**Exit Criteria**
|
|
214
|
+
- [ ] 依赖图解析完成(含旧版降级路径)
|
|
215
|
+
- [ ] 所有可执行 wave 已按顺序跑完
|
|
216
|
+
- [ ] 同 wave Builder 在单条消息内并行 spawn(已校验:消息内多 tool calls)
|
|
217
|
+
- [ ] 失败任务不阻塞同 wave,下游依赖任务自动 skipped
|
|
218
|
+
- [ ] `.ccg/state.md` 反映最终状态
|
|
219
|
+
- [ ] 变更摘要 + Wave 表已输出
|
|
220
|
+
- [ ] Team 已清理
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 状态文件格式
|
|
225
|
+
|
|
226
|
+
每个 wave 结束后,team-exec 都要重写 `<WORKDIR>/.ccg/state.md`。格式如下(user-readable + 可被下次 team-exec 重新解析):
|
|
227
|
+
|
|
228
|
+
```markdown
|
|
229
|
+
# CCG Team Execution State
|
|
230
|
+
|
|
231
|
+
**Plan**: .claude/team-plan/<plan-id>.md
|
|
232
|
+
**Team**: <team_name>
|
|
233
|
+
**Started**: 2026-05-03 10:00
|
|
234
|
+
**Last Updated**: 2026-05-03 10:42
|
|
235
|
+
**Current Wave**: 2 / 3
|
|
236
|
+
|
|
237
|
+
## Wave 1 (completed)
|
|
238
|
+
- [x] T1: 用户 API (src/api/users.ts) — completed @ 10:15
|
|
239
|
+
- [x] T2: 数据模型 (prisma/schema.prisma) — completed @ 10:18
|
|
240
|
+
|
|
241
|
+
## Wave 2 (in_progress)
|
|
242
|
+
- [x] T3: 用户卡片组件 (src/components/UserCard.tsx) — completed @ 10:30
|
|
243
|
+
- [ ] T4: 用户列表页 (src/pages/UserList.tsx) — in_progress (builder-T4)
|
|
244
|
+
- [ ] T5: 用户编辑表单 (src/pages/UserEdit.tsx) — pending (depends_on: T4)
|
|
245
|
+
|
|
246
|
+
## Wave 3 (pending)
|
|
247
|
+
- [ ] T6: E2E 测试 (tests/e2e/users.spec.ts) — pending (depends_on: T4, T5)
|
|
248
|
+
|
|
249
|
+
## Failed Tasks
|
|
250
|
+
(无)
|
|
251
|
+
|
|
252
|
+
## Skipped Tasks
|
|
253
|
+
(无)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**字段约定**:
|
|
257
|
+
- 每个 task 一行,`[x]` = completed,`[ ]` = pending/in_progress/failed/skipped
|
|
258
|
+
- 行尾 `— <status> @ <时间>` 标注最新状态
|
|
259
|
+
- `(builder-<id>)` 表示当前承担该任务的 Builder name
|
|
260
|
+
- `(depends_on: ...)` 解释 pending 原因
|
|
261
|
+
- Failed/Skipped 任务集中在末尾两个 section 罗列,含失败原因或跳过原因
|
|
262
|
+
|
|
263
|
+
**重跑入口约定**:下次 `/ccg:team-exec` 启动时,Step 2 检测到 state.md → 跳过所有 `[x]` 任务,从最早的 `[ ]` 任务所在的 wave 开始重新调度。
|
|
264
|
+
|
|
265
|
+
<!-- CCG:TEAM:EXEC:END -->
|