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.
- package/README.md +37 -5
- package/README.zh-CN.md +35 -5
- package/dist/cli.mjs +1 -1
- package/dist/index.mjs +2 -2
- package/dist/shared/{ccgx-workflow.WgUzkiC3.mjs → ccgx-workflow.SJPbUy5_.mjs} +17 -110
- package/package.json +2 -1
- package/templates/commands/agents/phase-runner.md +321 -321
- package/templates/commands/autonomous.md +792 -792
- package/templates/commands/cancel.md +132 -132
- package/templates/commands/debug.md +226 -226
- package/templates/commands/status.md +206 -206
- package/templates/commands/team.md +484 -0
- package/templates/hooks/ccg-session-state.cjs +510 -510
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -467
- package/templates/scripts/invoke-model.mjs +64 -0
- package/templates/skills/domains/ai/SKILL.md +35 -35
- package/templates/skills/domains/ai/agent-dev.md +242 -242
- package/templates/skills/domains/ai/llm-security.md +288 -288
- package/templates/skills/domains/ai/rag-system.md +542 -542
- package/templates/skills/domains/architecture/SKILL.md +43 -43
- package/templates/skills/domains/architecture/api-design.md +225 -225
- package/templates/skills/domains/architecture/cloud-native.md +285 -285
- package/templates/skills/domains/architecture/security-arch.md +297 -297
- package/templates/skills/domains/data-engineering/SKILL.md +208 -208
- package/templates/skills/domains/development/SKILL.md +47 -47
- package/templates/skills/domains/development/cpp.md +246 -246
- package/templates/skills/domains/development/go.md +323 -323
- package/templates/skills/domains/development/java.md +277 -277
- package/templates/skills/domains/development/python.md +288 -288
- package/templates/skills/domains/development/rust.md +313 -313
- package/templates/skills/domains/development/shell.md +313 -313
- package/templates/skills/domains/development/typescript.md +277 -277
- package/templates/skills/domains/devops/SKILL.md +40 -40
- package/templates/skills/domains/devops/database.md +217 -217
- package/templates/skills/domains/devops/devsecops.md +198 -198
- package/templates/skills/domains/devops/git-workflow.md +181 -181
- package/templates/skills/domains/devops/testing.md +283 -283
- package/templates/skills/domains/frontend-design/SKILL.md +244 -244
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -121
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -202
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -142
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -139
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -145
- package/templates/skills/domains/frontend-design/state-management.md +680 -680
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -110
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -156
- package/templates/skills/domains/infrastructure/SKILL.md +201 -201
- package/templates/skills/domains/mobile/SKILL.md +225 -225
- package/templates/skills/domains/orchestration/SKILL.md +30 -30
- package/templates/skills/domains/orchestration/multi-agent.md +228 -228
- package/templates/skills/domains/security/SKILL.md +73 -73
- package/templates/skills/domains/security/blue-team.md +436 -436
- package/templates/skills/domains/security/code-audit.md +265 -265
- package/templates/skills/domains/security/pentest.md +226 -226
- package/templates/skills/domains/security/red-team.md +374 -374
- package/templates/skills/domains/security/threat-intel.md +372 -372
- package/templates/skills/domains/security/vuln-research.md +369 -369
- package/templates/skills/tools/lib/shared.js +98 -98
- package/templates/skills/tools/override-refusal/SKILL.md +53 -53
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -226
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: '中止活跃后台任务:先写 cancel.flag(cooperative)→ grace 5s → kill-tree 强制(v4.5 P1b 升级)'
|
|
3
|
-
argument-hint: "<job-id> [--force]"
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- Read
|
|
6
|
-
- Write
|
|
7
|
-
- Bash
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Cancel - 中止活跃后台任务(v4.5 升级)
|
|
11
|
-
|
|
12
|
-
写一个**协作式**取消信号到 `.context/jobs/<job-id>/cancel.flag`,并在 grace period(默认 5s)后**强制 kill 进程树**作为兜底。后台子任务(codex:codex-rescue / phase-runner / autonomous loop)每次推进步骤前轮询 cancel.flag,发现存在则清理并退出。卡在 OS-level 不可中断 syscall 的子进程由 kill-tree fallback 兜底。
|
|
13
|
-
|
|
14
|
-
> ⚠️ v4.5 之前是**纯协作**取消(不持有 PID),v4.5 P1b 引入 supervisor + cli_pid + process_group_id 后升级为**协作 + 强制兜底**。如果 phase-runner 已通过 `ccg-phase-runner-launcher.mjs` 启动,state.json 会含 `cli_pid`,本命令在 grace period 后调用 kill-tree(POSIX:`kill -TERM -<pgid>` → `kill -KILL`;Windows:`taskkill /T /F /PID`)。
|
|
15
|
-
|
|
16
|
-
## 使用方法
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
/ccg:cancel <job-id> # 默认:cancel.flag + 5s grace + kill-tree
|
|
20
|
-
/ccg:cancel <job-id> --force # 跳过 grace,立即 kill-tree(紧急停机)
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## 工作流程
|
|
24
|
-
|
|
25
|
-
### Step 1:校验 job 存在 + 状态可取消
|
|
26
|
-
|
|
27
|
-
1. Read `.context/jobs/<job-id>/state.json`
|
|
28
|
-
2. 不存在 → "Job not found: <id>,run /ccg:status to list all jobs",退出
|
|
29
|
-
3. `status` ∈ `{done, failed, canceled}` → "Job <id> already <status>,nothing to cancel",退出(**不报错**)
|
|
30
|
-
4. `status` ∈ `{queued, running}` → 进入 Step 2
|
|
31
|
-
|
|
32
|
-
### Step 2:写 cancel.flag + 更新 state.json
|
|
33
|
-
|
|
34
|
-
1. 写文件 `.context/jobs/<job-id>/cancel.flag`,内容:
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
cancel-requested-at: <ISO timestamp>
|
|
38
|
-
requested-by: /ccg:cancel
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
v4.5+:`src/utils/jobs.ts` 的 `requestCancel` 走 `atomicWriteFileSync`(temp + rename),cancel.flag 永远不会半写。
|
|
42
|
-
|
|
43
|
-
2. 更新 state.json:把 `cancel_requested` 设为 `true`(**status 仍保持 running/queued** —— 真实 status 转 `canceled` 由子任务退出时自己写或由 Step 4 兜底写)
|
|
44
|
-
|
|
45
|
-
### Step 3:grace period(默认 5s,`--force` 跳过)
|
|
46
|
-
|
|
47
|
-
观察子任务是否自己退出:每秒 Read `state.json.status`,如果在 5s 内变成 `canceled` / `failed` / `done` → 跳过 Step 4,输出"协作取消生效"。
|
|
48
|
-
|
|
49
|
-
### Step 4:kill-tree fallback(grace 超时后)
|
|
50
|
-
|
|
51
|
-
读取 state.json 中的 `cli_pid` + `process_group_id`:
|
|
52
|
-
|
|
53
|
-
- **没有 cli_pid**(v4.5 之前的 legacy job 或非 launcher 路径):保持原有协作行为,提醒用户"无 PID 记录,请手动 `kill -9` 残留进程"。
|
|
54
|
-
- **有 cli_pid**:用 Bash 执行 kill-tree:
|
|
55
|
-
- **POSIX**: 优先 `kill -TERM -<pgid>` 走进程组(含 nested plugin 子进程);失败回退 `kill -TERM <cli_pid>`;再 grace 1s 后 `kill -KILL`。
|
|
56
|
-
- **Windows**: `taskkill /T /F /PID <cli_pid>` 杀整棵进程树(含 nested plugin)。
|
|
57
|
-
|
|
58
|
-
生成的 Bash(示例):
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
# POSIX
|
|
62
|
-
kill -TERM -42 2>/dev/null || kill -TERM 42 2>/dev/null
|
|
63
|
-
sleep 1
|
|
64
|
-
kill -0 42 2>/dev/null && (kill -KILL -42 2>/dev/null || kill -KILL 42 2>/dev/null)
|
|
65
|
-
|
|
66
|
-
# Windows
|
|
67
|
-
taskkill /T /F /PID 1234
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
- 写终态 state.json:`status=canceled`,`summary="canceled by /ccg:cancel + kill-tree fallback"`。
|
|
71
|
-
|
|
72
|
-
### Step 5:通知用户
|
|
73
|
-
|
|
74
|
-
输出(协作取消生效):
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
✓ Job <id> canceled cooperatively (status: canceled, no kill-tree needed)
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
输出(kill-tree 兜底):
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
⚠ Cooperative grace period (5s) elapsed without exit.
|
|
84
|
-
✓ Issued kill-tree on cli_pid=<N> (pgid=<M>): step1=SIGTERM, step2=SIGKILL after 1s
|
|
85
|
-
Status: canceled (forced via kill-tree)
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## 严格约束
|
|
89
|
-
|
|
90
|
-
- ✅ **协作优先**——总是先写 cancel.flag 给子进程自己退的机会,避免半写文件
|
|
91
|
-
- ✅ **强制兜底**(v4.5+ supervised job)——grace 后 kill-tree 防 hang 死循环
|
|
92
|
-
- ✅ 幂等——多次调用不报错,不重写 flag
|
|
93
|
-
- ✅ 已终态的 job 调用 cancel 也不报错(友好降级)
|
|
94
|
-
- ✅ atomic write(v4.5 P1b)——cancel.flag 永远不会半写
|
|
95
|
-
- ❌ **不要**直接把 status 改成 `canceled`——会与子任务退出时的写入产生竞态(除非 kill-tree 生效后)
|
|
96
|
-
- ❌ **不要**删除 `.context/jobs/<id>/` 目录——历史可观测性必须保留
|
|
97
|
-
|
|
98
|
-
## 子任务侧契约(开发者参考)
|
|
99
|
-
|
|
100
|
-
后台子任务必须周期性检查 cancel.flag 才能让协作路径生效(避免 kill-tree 兜底)。最小契约:
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
import { isCancelRequested, writeJobState, getJob } from '~/.claude/.ccg/utils/jobs'
|
|
104
|
-
|
|
105
|
-
// 每个推进步骤前
|
|
106
|
-
if (isCancelRequested(workdir, jobId)) {
|
|
107
|
-
const cur = getJob(workdir, jobId)!
|
|
108
|
-
writeJobState(workdir, { ...cur, status: 'canceled', summary: 'canceled by user' })
|
|
109
|
-
// optional: write result.md with "STATUS: canceled\nNOTES: aborted at <step>"
|
|
110
|
-
process.exit(0)
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
phase-runner / codex:codex-rescue / autonomous loop 全部接入此契约(v4.0 Phase 7 + v4.5 P1b)。
|
|
115
|
-
|
|
116
|
-
## 与其他命令的协作
|
|
117
|
-
|
|
118
|
-
| 时序 | 命令 | 作用 |
|
|
119
|
-
|------|------|------|
|
|
120
|
-
| t0 | `/ccg:autonomous` | spawn launcher + child;写 state.json (running, cli_pid, pgid) |
|
|
121
|
-
| t1 | `/ccg:status` | 用户看到 running 太久 |
|
|
122
|
-
| t2 | `/ccg:cancel <id>` | **本命令**——写 cancel.flag |
|
|
123
|
-
| t3a | (子任务下次轮询) | isCancelRequested → 自己写 state.json (canceled) |
|
|
124
|
-
| t3b | (grace 5s 超时, t3a 未发生) | 本命令 kill-tree → 写 state.json (canceled, forced) |
|
|
125
|
-
| t4 | `/ccg:result <id>` | 看到 canceled 摘要 |
|
|
126
|
-
|
|
127
|
-
## 实现锚点
|
|
128
|
-
|
|
129
|
-
- `src/utils/jobs.ts` 的 `requestCancel` 是后端真相源(atomic write)
|
|
130
|
-
- `src/utils/process-tree.ts` 的 `killProcessTree` 是 kill-tree 真相源(POSIX pgid + Windows taskkill)
|
|
131
|
-
- `templates/scripts/ccg-phase-runner-launcher.mjs` 的 launcher 是 cli_pid / pgid 的写入者
|
|
132
|
-
- 失败模式:见 `src/utils/__tests__/jobs.test.ts`(atomic write)+ `processTree.test.ts`(kill-tree 13 种 failure mode 覆盖)
|
|
1
|
+
---
|
|
2
|
+
description: '中止活跃后台任务:先写 cancel.flag(cooperative)→ grace 5s → kill-tree 强制(v4.5 P1b 升级)'
|
|
3
|
+
argument-hint: "<job-id> [--force]"
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Read
|
|
6
|
+
- Write
|
|
7
|
+
- Bash
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Cancel - 中止活跃后台任务(v4.5 升级)
|
|
11
|
+
|
|
12
|
+
写一个**协作式**取消信号到 `.context/jobs/<job-id>/cancel.flag`,并在 grace period(默认 5s)后**强制 kill 进程树**作为兜底。后台子任务(codex:codex-rescue / phase-runner / autonomous loop)每次推进步骤前轮询 cancel.flag,发现存在则清理并退出。卡在 OS-level 不可中断 syscall 的子进程由 kill-tree fallback 兜底。
|
|
13
|
+
|
|
14
|
+
> ⚠️ v4.5 之前是**纯协作**取消(不持有 PID),v4.5 P1b 引入 supervisor + cli_pid + process_group_id 后升级为**协作 + 强制兜底**。如果 phase-runner 已通过 `ccg-phase-runner-launcher.mjs` 启动,state.json 会含 `cli_pid`,本命令在 grace period 后调用 kill-tree(POSIX:`kill -TERM -<pgid>` → `kill -KILL`;Windows:`taskkill /T /F /PID`)。
|
|
15
|
+
|
|
16
|
+
## 使用方法
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
/ccg:cancel <job-id> # 默认:cancel.flag + 5s grace + kill-tree
|
|
20
|
+
/ccg:cancel <job-id> --force # 跳过 grace,立即 kill-tree(紧急停机)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 工作流程
|
|
24
|
+
|
|
25
|
+
### Step 1:校验 job 存在 + 状态可取消
|
|
26
|
+
|
|
27
|
+
1. Read `.context/jobs/<job-id>/state.json`
|
|
28
|
+
2. 不存在 → "Job not found: <id>,run /ccg:status to list all jobs",退出
|
|
29
|
+
3. `status` ∈ `{done, failed, canceled}` → "Job <id> already <status>,nothing to cancel",退出(**不报错**)
|
|
30
|
+
4. `status` ∈ `{queued, running}` → 进入 Step 2
|
|
31
|
+
|
|
32
|
+
### Step 2:写 cancel.flag + 更新 state.json
|
|
33
|
+
|
|
34
|
+
1. 写文件 `.context/jobs/<job-id>/cancel.flag`,内容:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
cancel-requested-at: <ISO timestamp>
|
|
38
|
+
requested-by: /ccg:cancel
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
v4.5+:`src/utils/jobs.ts` 的 `requestCancel` 走 `atomicWriteFileSync`(temp + rename),cancel.flag 永远不会半写。
|
|
42
|
+
|
|
43
|
+
2. 更新 state.json:把 `cancel_requested` 设为 `true`(**status 仍保持 running/queued** —— 真实 status 转 `canceled` 由子任务退出时自己写或由 Step 4 兜底写)
|
|
44
|
+
|
|
45
|
+
### Step 3:grace period(默认 5s,`--force` 跳过)
|
|
46
|
+
|
|
47
|
+
观察子任务是否自己退出:每秒 Read `state.json.status`,如果在 5s 内变成 `canceled` / `failed` / `done` → 跳过 Step 4,输出"协作取消生效"。
|
|
48
|
+
|
|
49
|
+
### Step 4:kill-tree fallback(grace 超时后)
|
|
50
|
+
|
|
51
|
+
读取 state.json 中的 `cli_pid` + `process_group_id`:
|
|
52
|
+
|
|
53
|
+
- **没有 cli_pid**(v4.5 之前的 legacy job 或非 launcher 路径):保持原有协作行为,提醒用户"无 PID 记录,请手动 `kill -9` 残留进程"。
|
|
54
|
+
- **有 cli_pid**:用 Bash 执行 kill-tree:
|
|
55
|
+
- **POSIX**: 优先 `kill -TERM -<pgid>` 走进程组(含 nested plugin 子进程);失败回退 `kill -TERM <cli_pid>`;再 grace 1s 后 `kill -KILL`。
|
|
56
|
+
- **Windows**: `taskkill /T /F /PID <cli_pid>` 杀整棵进程树(含 nested plugin)。
|
|
57
|
+
|
|
58
|
+
生成的 Bash(示例):
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# POSIX
|
|
62
|
+
kill -TERM -42 2>/dev/null || kill -TERM 42 2>/dev/null
|
|
63
|
+
sleep 1
|
|
64
|
+
kill -0 42 2>/dev/null && (kill -KILL -42 2>/dev/null || kill -KILL 42 2>/dev/null)
|
|
65
|
+
|
|
66
|
+
# Windows
|
|
67
|
+
taskkill /T /F /PID 1234
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- 写终态 state.json:`status=canceled`,`summary="canceled by /ccg:cancel + kill-tree fallback"`。
|
|
71
|
+
|
|
72
|
+
### Step 5:通知用户
|
|
73
|
+
|
|
74
|
+
输出(协作取消生效):
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
✓ Job <id> canceled cooperatively (status: canceled, no kill-tree needed)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
输出(kill-tree 兜底):
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
⚠ Cooperative grace period (5s) elapsed without exit.
|
|
84
|
+
✓ Issued kill-tree on cli_pid=<N> (pgid=<M>): step1=SIGTERM, step2=SIGKILL after 1s
|
|
85
|
+
Status: canceled (forced via kill-tree)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 严格约束
|
|
89
|
+
|
|
90
|
+
- ✅ **协作优先**——总是先写 cancel.flag 给子进程自己退的机会,避免半写文件
|
|
91
|
+
- ✅ **强制兜底**(v4.5+ supervised job)——grace 后 kill-tree 防 hang 死循环
|
|
92
|
+
- ✅ 幂等——多次调用不报错,不重写 flag
|
|
93
|
+
- ✅ 已终态的 job 调用 cancel 也不报错(友好降级)
|
|
94
|
+
- ✅ atomic write(v4.5 P1b)——cancel.flag 永远不会半写
|
|
95
|
+
- ❌ **不要**直接把 status 改成 `canceled`——会与子任务退出时的写入产生竞态(除非 kill-tree 生效后)
|
|
96
|
+
- ❌ **不要**删除 `.context/jobs/<id>/` 目录——历史可观测性必须保留
|
|
97
|
+
|
|
98
|
+
## 子任务侧契约(开发者参考)
|
|
99
|
+
|
|
100
|
+
后台子任务必须周期性检查 cancel.flag 才能让协作路径生效(避免 kill-tree 兜底)。最小契约:
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import { isCancelRequested, writeJobState, getJob } from '~/.claude/.ccg/utils/jobs'
|
|
104
|
+
|
|
105
|
+
// 每个推进步骤前
|
|
106
|
+
if (isCancelRequested(workdir, jobId)) {
|
|
107
|
+
const cur = getJob(workdir, jobId)!
|
|
108
|
+
writeJobState(workdir, { ...cur, status: 'canceled', summary: 'canceled by user' })
|
|
109
|
+
// optional: write result.md with "STATUS: canceled\nNOTES: aborted at <step>"
|
|
110
|
+
process.exit(0)
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
phase-runner / codex:codex-rescue / autonomous loop 全部接入此契约(v4.0 Phase 7 + v4.5 P1b)。
|
|
115
|
+
|
|
116
|
+
## 与其他命令的协作
|
|
117
|
+
|
|
118
|
+
| 时序 | 命令 | 作用 |
|
|
119
|
+
|------|------|------|
|
|
120
|
+
| t0 | `/ccg:autonomous` | spawn launcher + child;写 state.json (running, cli_pid, pgid) |
|
|
121
|
+
| t1 | `/ccg:status` | 用户看到 running 太久 |
|
|
122
|
+
| t2 | `/ccg:cancel <id>` | **本命令**——写 cancel.flag |
|
|
123
|
+
| t3a | (子任务下次轮询) | isCancelRequested → 自己写 state.json (canceled) |
|
|
124
|
+
| t3b | (grace 5s 超时, t3a 未发生) | 本命令 kill-tree → 写 state.json (canceled, forced) |
|
|
125
|
+
| t4 | `/ccg:result <id>` | 看到 canceled 摘要 |
|
|
126
|
+
|
|
127
|
+
## 实现锚点
|
|
128
|
+
|
|
129
|
+
- `src/utils/jobs.ts` 的 `requestCancel` 是后端真相源(atomic write)
|
|
130
|
+
- `src/utils/process-tree.ts` 的 `killProcessTree` 是 kill-tree 真相源(POSIX pgid + Windows taskkill)
|
|
131
|
+
- `templates/scripts/ccg-phase-runner-launcher.mjs` 的 launcher 是 cli_pid / pgid 的写入者
|
|
132
|
+
- 失败模式:见 `src/utils/__tests__/jobs.test.ts`(atomic write)+ `processTree.test.ts`(kill-tree 13 种 failure mode 覆盖)
|