ccgx-workflow 1.0.0 → 1.0.1

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 (60) hide show
  1. package/README.md +37 -5
  2. package/README.zh-CN.md +35 -5
  3. package/dist/cli.mjs +1 -1
  4. package/dist/index.mjs +2 -2
  5. package/dist/shared/{ccgx-workflow.WgUzkiC3.mjs → ccgx-workflow.SJPbUy5_.mjs} +17 -110
  6. package/package.json +2 -1
  7. package/templates/commands/agents/phase-runner.md +321 -321
  8. package/templates/commands/autonomous.md +792 -792
  9. package/templates/commands/cancel.md +132 -132
  10. package/templates/commands/debug.md +226 -226
  11. package/templates/commands/status.md +206 -206
  12. package/templates/commands/team.md +484 -0
  13. package/templates/hooks/ccg-session-state.cjs +510 -510
  14. package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -467
  15. package/templates/scripts/invoke-model.mjs +64 -0
  16. package/templates/skills/domains/ai/SKILL.md +35 -35
  17. package/templates/skills/domains/ai/agent-dev.md +242 -242
  18. package/templates/skills/domains/ai/llm-security.md +288 -288
  19. package/templates/skills/domains/ai/rag-system.md +542 -542
  20. package/templates/skills/domains/architecture/SKILL.md +43 -43
  21. package/templates/skills/domains/architecture/api-design.md +225 -225
  22. package/templates/skills/domains/architecture/cloud-native.md +285 -285
  23. package/templates/skills/domains/architecture/security-arch.md +297 -297
  24. package/templates/skills/domains/data-engineering/SKILL.md +208 -208
  25. package/templates/skills/domains/development/SKILL.md +47 -47
  26. package/templates/skills/domains/development/cpp.md +246 -246
  27. package/templates/skills/domains/development/go.md +323 -323
  28. package/templates/skills/domains/development/java.md +277 -277
  29. package/templates/skills/domains/development/python.md +288 -288
  30. package/templates/skills/domains/development/rust.md +313 -313
  31. package/templates/skills/domains/development/shell.md +313 -313
  32. package/templates/skills/domains/development/typescript.md +277 -277
  33. package/templates/skills/domains/devops/SKILL.md +40 -40
  34. package/templates/skills/domains/devops/database.md +217 -217
  35. package/templates/skills/domains/devops/devsecops.md +198 -198
  36. package/templates/skills/domains/devops/git-workflow.md +181 -181
  37. package/templates/skills/domains/devops/testing.md +283 -283
  38. package/templates/skills/domains/frontend-design/SKILL.md +244 -244
  39. package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -121
  40. package/templates/skills/domains/frontend-design/component-patterns.md +202 -202
  41. package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -142
  42. package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -139
  43. package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -145
  44. package/templates/skills/domains/frontend-design/state-management.md +680 -680
  45. package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -110
  46. package/templates/skills/domains/frontend-design/ux-principles.md +156 -156
  47. package/templates/skills/domains/infrastructure/SKILL.md +201 -201
  48. package/templates/skills/domains/mobile/SKILL.md +225 -225
  49. package/templates/skills/domains/orchestration/SKILL.md +30 -30
  50. package/templates/skills/domains/orchestration/multi-agent.md +228 -228
  51. package/templates/skills/domains/security/SKILL.md +73 -73
  52. package/templates/skills/domains/security/blue-team.md +436 -436
  53. package/templates/skills/domains/security/code-audit.md +265 -265
  54. package/templates/skills/domains/security/pentest.md +226 -226
  55. package/templates/skills/domains/security/red-team.md +374 -374
  56. package/templates/skills/domains/security/threat-intel.md +372 -372
  57. package/templates/skills/domains/security/vuln-research.md +369 -369
  58. package/templates/skills/tools/lib/shared.js +98 -98
  59. package/templates/skills/tools/override-refusal/SKILL.md +53 -53
  60. package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -226
@@ -1,206 +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 升级"。
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 升级"。