ccbot-cli 2.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/bin/adapters/claude.js +150 -0
  3. package/bin/adapters/codex.js +439 -0
  4. package/bin/install.js +583 -349
  5. package/bin/lib/ccline.js +82 -0
  6. package/bin/lib/utils.js +87 -34
  7. package/bin/uninstall.js +48 -0
  8. package/config/AGENTS.md +630 -0
  9. package/config/CLAUDE.md +229 -20
  10. package/config/ccline/config.toml +161 -0
  11. package/config/codex-config.example.toml +22 -0
  12. package/config/settings.example.json +32 -0
  13. package/output-styles/abyss-cultivator.md +399 -0
  14. package/package.json +14 -5
  15. package/skills/SKILL.md +159 -0
  16. package/skills/domains/ai/SKILL.md +34 -0
  17. package/skills/domains/ai/agent-dev.md +242 -0
  18. package/skills/domains/ai/llm-security.md +288 -0
  19. package/skills/domains/ai/prompt-and-eval.md +279 -0
  20. package/skills/domains/ai/rag-system.md +542 -0
  21. package/skills/domains/architecture/SKILL.md +42 -0
  22. package/skills/domains/architecture/api-design.md +225 -0
  23. package/skills/domains/architecture/caching.md +299 -0
  24. package/skills/domains/architecture/cloud-native.md +285 -0
  25. package/skills/domains/architecture/message-queue.md +329 -0
  26. package/skills/domains/architecture/security-arch.md +297 -0
  27. package/skills/domains/data-engineering/SKILL.md +207 -0
  28. package/skills/domains/development/SKILL.md +46 -0
  29. package/skills/domains/development/cpp.md +246 -0
  30. package/skills/domains/development/go.md +323 -0
  31. package/skills/domains/development/java.md +277 -0
  32. package/skills/domains/development/python.md +288 -0
  33. package/skills/domains/development/rust.md +313 -0
  34. package/skills/domains/development/shell.md +313 -0
  35. package/skills/domains/development/typescript.md +277 -0
  36. package/skills/domains/devops/SKILL.md +39 -0
  37. package/skills/domains/devops/cost-optimization.md +272 -0
  38. package/skills/domains/devops/database.md +217 -0
  39. package/skills/domains/devops/devsecops.md +198 -0
  40. package/skills/domains/devops/git-workflow.md +181 -0
  41. package/skills/domains/devops/observability.md +280 -0
  42. package/skills/domains/devops/performance.md +336 -0
  43. package/skills/domains/devops/testing.md +283 -0
  44. package/skills/domains/frontend-design/SKILL.md +38 -0
  45. package/skills/domains/frontend-design/claymorphism/SKILL.md +119 -0
  46. package/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
  47. package/skills/domains/frontend-design/component-patterns.md +202 -0
  48. package/skills/domains/frontend-design/engineering.md +287 -0
  49. package/skills/domains/frontend-design/glassmorphism/SKILL.md +140 -0
  50. package/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
  51. package/skills/domains/frontend-design/liquid-glass/SKILL.md +137 -0
  52. package/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
  53. package/skills/domains/frontend-design/neubrutalism/SKILL.md +143 -0
  54. package/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
  55. package/skills/domains/frontend-design/state-management.md +680 -0
  56. package/skills/domains/frontend-design/ui-aesthetics.md +110 -0
  57. package/skills/domains/frontend-design/ux-principles.md +156 -0
  58. package/skills/domains/infrastructure/SKILL.md +200 -0
  59. package/skills/domains/mobile/SKILL.md +224 -0
  60. package/skills/domains/orchestration/SKILL.md +29 -0
  61. package/skills/domains/orchestration/multi-agent.md +263 -0
  62. package/skills/domains/security/SKILL.md +54 -0
  63. package/skills/domains/security/blue-team.md +436 -0
  64. package/skills/domains/security/code-audit.md +265 -0
  65. package/skills/domains/security/pentest.md +226 -0
  66. package/skills/domains/security/red-team.md +375 -0
  67. package/skills/domains/security/threat-intel.md +372 -0
  68. package/skills/domains/security/vuln-research.md +369 -0
  69. package/skills/orchestration/multi-agent/SKILL.md +493 -0
  70. package/skills/run_skill.js +129 -0
  71. package/skills/tools/gen-docs/SKILL.md +116 -0
  72. package/skills/tools/gen-docs/scripts/doc_generator.js +435 -0
  73. package/skills/tools/lib/shared.js +98 -0
  74. package/skills/tools/verify-change/SKILL.md +140 -0
  75. package/skills/tools/verify-change/scripts/change_analyzer.js +289 -0
  76. package/skills/tools/verify-module/SKILL.md +127 -0
  77. package/skills/tools/verify-module/scripts/module_scanner.js +171 -0
  78. package/skills/tools/verify-quality/SKILL.md +160 -0
  79. package/skills/tools/verify-quality/scripts/quality_checker.js +337 -0
  80. package/skills/tools/verify-security/SKILL.md +143 -0
  81. package/skills/tools/verify-security/scripts/security_scanner.js +283 -0
  82. package/bin/lib/registry.js +0 -61
  83. package/config/.claudeignore +0 -11
@@ -0,0 +1,493 @@
1
+ ---
2
+ name: multi-agent
3
+ description: 天罗秘典·多Agent协同。融合蚁群仿生设计,定义Agent角色、生命周期、信息素通信、任务分解、冲突解决。当需要多Agent并行协作时路由到此。
4
+ license: MIT
5
+ user-invocable: false
6
+ disable-model-invocation: false
7
+ ---
8
+
9
+ # 🕸 天罗秘典 · 多 Agent 协同(蚁群仿生版)
10
+
11
+ > 参考蚁群仿生架构:侦察→工作→审查→修复→完成,信息素间接通信,自适应并发。
12
+
13
+ ---
14
+
15
+ ## 蚁群生命周期
16
+
17
+ 所有多 Agent 协同任务遵循统一生命周期:
18
+
19
+ ```
20
+ 目标 → 侦察(Scout) → 任务池 → 工蚁(Worker)并行执行 → 兵蚁(Soldier)审查 → 修复(如需) → 完成
21
+ │ │
22
+ │ 信息素衰减(过时信息自动失效) │ 子任务自动产生
23
+ └───────────────────────────┘
24
+ ```
25
+
26
+ ### 阶段定义
27
+
28
+ | 阶段 | 角色 | 动作 | 产出 |
29
+ |------|------|------|------|
30
+ | 🔍 侦察 | Scout | 探索代码库,标记关键文件和依赖 | 任务池 + 依赖图 |
31
+ | ⚒️ 工作 | Worker | 并行执行任务,可产生子任务 | 代码变更 + 进度信息素 |
32
+ | 🛡️ 审查 | Soldier | 审查所有变更,发现问题 | 修复任务 / 通过 |
33
+ | 🔧 修复 | Worker | 执行审查产生的修复任务 | 修复后的代码 |
34
+ | ✅ 完成 | Lead | 汇总报告,统一 commit | 最终交付 |
35
+
36
+ ---
37
+
38
+ ## Codex 原生协同协议(强化)
39
+
40
+ 在 Codex CLI 中,TeamCreate/Task 抽象统一映射到以下原生动作:
41
+
42
+ | 协同意图 | Codex 动作 | 约束 |
43
+ |---------|------------|------|
44
+ | 创建团队/子任务 | `spawn_agent` | 明确角色、文件所有权、完成定义 |
45
+ | 下发任务/追问 | `send_input` | 单条消息只包含一个目标动作 |
46
+ | 等待完成 | `wait` | 优先长等待,避免忙轮询 |
47
+ | 长耗时命令 | `awaiter` agent | 测试/构建/监控必须用 awaiter |
48
+ | 代码探索 | `explorer` agent | 探索结果视为权威,不重复检索 |
49
+ | 执行改动 | `worker` agent | 明确“只改分配文件” |
50
+ | 收尾回收 | `close_agent` | 任务结束必须关闭子 Agent |
51
+
52
+ ### 执行顺序(不可跳步)
53
+
54
+ ```
55
+ 1. 拆解任务 + 文件锁定矩阵
56
+ 2. spawn explorer/worker/awaiter
57
+ 3. 并行执行 + wait 收敛
58
+ 4. reviewer 审查 + 必要修复
59
+ 5. 汇总结果 + close_agent 全量回收
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 何时启用多 Agent
65
+
66
+ ### TeamCreate vs Task(subagent) 决策树
67
+
68
+ ```
69
+ 收到任务 → 评估规模
70
+
71
+ ├─ 涉及 ≥3 个独立文件/模块? → TeamCreate
72
+ ├─ 需要 ≥2 个并行工作流? → TeamCreate
73
+ ├─ 总步骤 >10 步? → TeamCreate
74
+ ├─ 魔尊明确要求并行/团队? → TeamCreate
75
+
76
+ ├─ 单一探索/搜索任务? → explorer agent
77
+ ├─ 单文件独立操作? → worker agent
78
+ └─ 简单查询/单步操作? → 直接执行
79
+ ```
80
+
81
+ **铁律**:当犹豫时,优先 TeamCreate。多 Agent 并行效率远高于串行 subagent。
82
+
83
+ 满足**任意 1 条**即启用 TeamCreate:
84
+
85
+ | 条件 | 说明 | 示例 |
86
+ |------|------|------|
87
+ | 多文件独立变更 | ≥3 个无交叉依赖的文件 | 6 个新秘典各自独立 |
88
+ | 可并行子任务 | ≥2 个无数据依赖的工作流 | 前端+后端+文档 |
89
+ | 复杂度高 | 单 Agent 需 >10 步 | 全栈重构 |
90
+ | 时间紧迫 | 劫钟催命,需加速 | 紧急修复多服务 |
91
+
92
+ ---
93
+
94
+ ## 角色体系(蚁群映射)
95
+
96
+ | 角色 | 蚁群映射 | 道语 | 职责 | 工具权限 | 模型建议 |
97
+ |------|----------|------|------|----------|----------|
98
+ | 主修 (Lead) | 蚁后 Queen | 天罗主修 | 任务分解、调度、汇总 | `spawn_agent/send_input/wait/close_agent` | 当前模型 |
99
+ | 斥候 (Scout) | 侦察蚁 Scout | 天罗斥候 | 只读探索,标记关键文件 | `explorer` + Read/Grep/Glob(只读) | haiku(快速低成本) |
100
+ | 道侣 (Worker) | 工蚁 Worker | 天罗道侣 | 执行任务,可产生子任务 | `worker` + Read/Write/Edit/Bash | sonnet/当前模型 |
101
+ | 护法 (Soldier) | 兵蚁 Soldier | 天罗护法 | 审查质量,发现问题 | `worker`(审查模式) + Read/Grep/Glob(只读) | sonnet |
102
+ | 走卒 (Drone) | 无人蚁 Drone | 天罗走卒 | 简单 bash 命令,零 LLM 成本 | Bash(仅此一个) | 无(execSync) |
103
+
104
+ ### 角色使用时机
105
+
106
+ ```
107
+ 需要了解代码库结构? → 派 Scout(agent_type=explorer)
108
+ 需要修改代码? → 派 Worker(agent_type=worker)
109
+ 需要审查变更? → 派 Soldier(agent_type=worker,审查提示词)
110
+ 需要长耗时命令? → 派 awaiter(agent_type=awaiter)
111
+ 需要短命令? → 直接 Bash(Drone 等价)
112
+ ```
113
+
114
+ ---
115
+
116
+ ## 信息素系统(Stigmergy)
117
+
118
+ 蚁群通过信息素间接通信,而非直接对话。在 Claude Code 中,用 **TaskCreate metadata** 模拟信息素:
119
+
120
+ ### 信息素类型
121
+
122
+ | 类型 | 释放者 | 含义 | 用途 |
123
+ |------|--------|------|------|
124
+ | `discovery` | Scout | 发现的代码结构、关键文件 | 帮助 Worker 快速定位 |
125
+ | `progress` | Worker | 完成的变更、修改的文件 | 帮助后续 Worker 避免冲突 |
126
+ | `warning` | Soldier | 质量问题、冲突风险 | 降低相关任务优先级 |
127
+ | `completion` | Worker | 任务完成标记 | 强化成功路径 |
128
+ | `repellent` | 任意 | 失败路径标记(负信息素) | 阻止后续 Agent 走同一条死路 |
129
+
130
+ ### 实现方式
131
+
132
+ ```
133
+ # Scout 完成后,在 TaskUpdate 的 metadata 中记录发现
134
+ TaskUpdate(taskId, metadata: {
135
+ pheromone: "discovery",
136
+ files: ["src/auth.ts", "src/middleware.ts"],
137
+ content: "认证模块依赖 middleware,需先改 middleware"
138
+ })
139
+
140
+ # Worker 失败后,释放负信息素
141
+ TaskUpdate(taskId, metadata: {
142
+ pheromone: "repellent",
143
+ files: ["src/legacy.ts"],
144
+ content: "此文件有循环依赖,直接修改会崩溃"
145
+ })
146
+ ```
147
+
148
+ ### 信息素决策规则
149
+
150
+ | 规则 | 说明 |
151
+ |------|------|
152
+ | **正强化** | discovery/completion 信息素的文件 → 优先分配 |
153
+ | **负惩罚** | warning 信息素的文件 → 降低优先级 |
154
+ | **强负惩罚** | repellent 信息素的文件 → 避免分配,需主修评估 |
155
+ | **ε-greedy** | 90% 按信息素强度选任务,10% 随机选 → 避免全挤同一条路 |
156
+
157
+ ---
158
+
159
+ ## 自适应并发
160
+
161
+ 根据任务数量和复杂度动态调整 Agent 数量:
162
+
163
+ ```
164
+ 任务数 1-2 → 1-2 个 Worker(直接 Task subagent)
165
+ 任务数 3-5 → TeamCreate, 2-3 个 Worker
166
+ 任务数 6-10 → TeamCreate, 3-5 个 Worker
167
+ 任务数 >10 → TeamCreate, 5-7 个 Worker(上限)
168
+ ```
169
+
170
+ ### 过载保护
171
+
172
+ | 信号 | 动作 |
173
+ |------|------|
174
+ | Agent 连续失败 ≥2 次 | 减少并发,释放 repellent 信息素 |
175
+ | 429 限流 | 暂停派发,等待恢复后继续 |
176
+ | 所有任务完成 | 立即进入审查阶段 |
177
+ | 子任务膨胀 >30 | 停止产生新子任务,先完成现有 |
178
+
179
+ ---
180
+
181
+ ## TeamCreate 最佳实践
182
+
183
+ ### 命名规范
184
+
185
+ ```yaml
186
+ team_name: "{项目}-{任务类型}" # 如 "abyss-skill-expansion"
187
+ agent_type: "{角色}" # 如 "lead", "developer", "reviewer"
188
+ description: "一句话说明团队目标"
189
+ ```
190
+
191
+ ---
192
+
193
+ ## 任务分解策略
194
+
195
+ ### 按文件拆分(首选)
196
+
197
+ 每个 Agent 负责独立的文件集合,零交叉:
198
+
199
+ ```
200
+ Agent-A: [file1.md, file2.md] — 互不干涉
201
+ Agent-B: [file3.md, file4.md] — 互不干涉
202
+ Agent-C: [file5.md] — 互不干涉
203
+ ```
204
+
205
+ ### 按模块拆分
206
+
207
+ 每个 Agent 负责一个功能模块:
208
+
209
+ ```
210
+ Agent-前端: src/components/
211
+ Agent-后端: src/api/
212
+ Agent-基础: src/lib/
213
+ ```
214
+
215
+ ### 按流水线拆分(蚁群生命周期)
216
+
217
+ ```
218
+ Scout(侦察) → Worker(执行) → Soldier(审查) → Worker(修复) → Lead(汇总)
219
+ ```
220
+
221
+ ### 依赖感知调度
222
+
223
+ 分配任务前,分析文件依赖关系:
224
+
225
+ ```
226
+ 文件A import 文件B?
227
+ ├─ 是 → B 的任务必须先完成,A 的任务标记 blocked
228
+ └─ 否 → 可并行
229
+ ```
230
+
231
+ **依赖深度优先**:被更多文件依赖的(底层模块)优先处理。
232
+
233
+ ---
234
+
235
+ ## 并行 vs 串行决策
236
+
237
+ ```
238
+ 子任务A 和 B 是否共享文件?
239
+ ├─ 否 → 并行执行
240
+ └─ 是 → 是否写同一文件?
241
+ ├─ 否(一读一写)→ 先写后读,串行
242
+ └─ 是(都写)→ 严格串行,或拆分文件区域
243
+ ```
244
+
245
+ ---
246
+
247
+ ## Agent 角色模板
248
+
249
+ ### 主修(Lead / Queen)启动模板
250
+
251
+ ```
252
+ 你是天罗主修(蚁后),负责协调多 Agent 协同任务。
253
+
254
+ 生命周期:
255
+ 1. 侦察阶段:派 Scout 探索代码库
256
+ 2. 工作阶段:根据侦察结果分配 Worker 并行执行
257
+ 3. 审查阶段:派 Soldier 审查所有变更
258
+ 4. 修复阶段:如有问题,派 Worker 修复
259
+ 5. 汇总阶段:收集结果,统一 commit
260
+
261
+ 铁律:
262
+ - 每个文件只能分配给一个 Agent
263
+ - 独立任务必须并行启动
264
+ - 关注信息素:discovery 优先分配,repellent 避免分配
265
+ - 收到所有道侣完成消息后才能进入审查
266
+ - 所有子 Agent 完成后必须 close_agent 回收
267
+ ```
268
+
269
+ ### 斥候(Scout)启动模板
270
+
271
+ ```
272
+ 你是天罗斥候(侦察蚁),负责探索代码库。
273
+
274
+ 职责:
275
+ 1. 快速扫描项目结构和关键文件
276
+ 2. 识别文件间的依赖关系
277
+ 3. 标记需要修改的文件和潜在风险
278
+ 4. 输出发现(discovery 信息素)
279
+
280
+ 限制:只读操作,不修改任何文件。
281
+ ```
282
+
283
+ ### 道侣(Worker)启动模板
284
+
285
+ ```
286
+ 你是天罗道侣(工蚁),负责执行分配的子任务。
287
+
288
+ 职责:
289
+ 1. 严格按照分配的文件列表操作
290
+ 2. 不触碰未分配的文件
291
+ 3. 完成后通过 SendMessage 报告主修
292
+ 4. 遇阻时立即报告,不自行扩大范围
293
+
294
+ 报告格式:
295
+ - 完成:列出创建/修改的文件 + 行数
296
+ - 阻塞:说明原因 + 建议方案(释放 warning 信息素)
297
+ ```
298
+
299
+ ### 护法(Soldier)启动模板
300
+
301
+ ```
302
+ 你是天罗护法(兵蚁),负责审查所有变更。
303
+
304
+ 职责:
305
+ 1. 审查所有 Worker 的变更
306
+ 2. 检查代码质量、安全性、一致性
307
+ 3. 发现问题则生成修复任务
308
+ 4. 无问题则确认通过
309
+
310
+ 输出:
311
+ - 通过:确认所有变更合格
312
+ - 问题:列出问题 + 修复建议(释放 warning 信息素)
313
+ ```
314
+
315
+ ---
316
+
317
+ ## 强约束提示词模板(可直接复用)
318
+
319
+ ### Worker 指令模板(Codex)
320
+
321
+ ```text
322
+ 你是执行 Agent,当前任务只允许修改以下文件:
323
+ {owned_files}
324
+
325
+ 硬性约束:
326
+ 1) 不得修改未分配文件。
327
+ 2) 若必须跨文件修改,先报告阻塞,不得自行扩域。
328
+ 3) 完成后返回:改动文件、验证命令、风险点。
329
+ 4) 若失败,返回最小复现与替代方案。
330
+ ```
331
+
332
+ ### Reviewer 指令模板(Codex)
333
+
334
+ ```text
335
+ 你是审查 Agent,只读模式。
336
+ 请按“正确性 > 安全性 > 回归风险 > 风格”输出问题清单。
337
+ 若无问题,明确写“no findings”。
338
+ ```
339
+
340
+ ### Lead 汇总模板(Codex)
341
+
342
+ ```text
343
+ 汇总每个子 Agent 的结果,给出:
344
+ 1) 已完成项
345
+ 2) 阻塞项
346
+ 3) 剩余风险
347
+ 4) 下一步(可执行命令)
348
+ ```
349
+
350
+ ---
351
+
352
+ ## 通信协议
353
+
354
+ ### SendMessage 规范
355
+
356
+ | 类型 | 用途 | 格式 |
357
+ |------|------|------|
358
+ | message | 点对点通信 | `{type: "message", recipient: "agent-name", content: "...", summary: "5字摘要"}` |
359
+ | broadcast | 全体通知 | `{type: "broadcast", content: "...", summary: "5字摘要"}` |
360
+ | shutdown_request | 请求关闭 | `{type: "shutdown_request", recipient: "agent-name", content: "原因"}` |
361
+
362
+ ### 通信时机
363
+
364
+ | 事件 | 发送者 | 接收者 | 内容 |
365
+ |------|--------|--------|------|
366
+ | 侦察完成 | Scout | 主修 | 文件清单 + 依赖图 + discovery 信息素 |
367
+ | 任务分配 | 主修 | 道侣 | 文件列表 + 要求 + 相关信息素 |
368
+ | 任务完成 | 道侣 | 主修 | 文件清单 + 验证结果 |
369
+ | 遇阻报告 | 道侣 | 主修 | 阻塞原因 + warning/repellent 信息素 |
370
+ | 审查完成 | 护法 | 主修 | 通过/问题列表 |
371
+ | 汇总指令 | 主修 | 全体 | broadcast 进入汇总阶段 |
372
+
373
+ ---
374
+
375
+ ## 文件锁定与冲突避免
376
+
377
+ ### 黄金规则
378
+
379
+ ```
380
+ 每个文件在同一时刻只能被一个 Agent 修改。
381
+ 违反此规则 = 道基裂痕 +1。
382
+ ```
383
+
384
+ ### 锁定策略
385
+
386
+ 1. **分配时锁定** — 主修分配任务时明确文件归属
387
+ 2. **声明式锁定** — 道侣开始前声明要操作的文件
388
+ 3. **冲突检测** — 主修检查文件分配无重叠后才启动
389
+ 4. **依赖感知** — 文件 A import 文件 B,则 A 和 B 不可同时修改
390
+
391
+ ### 冲突解决
392
+
393
+ | 冲突类型 | 解决方案 |
394
+ |----------|----------|
395
+ | 两个 Agent 需写同一文件 | 串行执行,先完成的先写 |
396
+ | 写入内容矛盾 | 主修裁决,以业务逻辑为准 |
397
+ | 依赖文件未就绪 | 标记 blocked,主修协调优先级 |
398
+ | 循环依赖 | 释放 repellent 信息素,主修手动拆解 |
399
+
400
+ ---
401
+
402
+ ## 状态共享
403
+
404
+ ### TaskCreate/TaskUpdate 规范
405
+
406
+ ```
407
+ TaskCreate: 主修创建总任务 + 子任务
408
+ TaskUpdate: 道侣更新子任务状态 + metadata(信息素)
409
+ TaskList: 主修查看全局进度
410
+ TaskGet: 查看任务详情 + 信息素
411
+ ```
412
+
413
+ ### 状态流转
414
+
415
+ ```
416
+ pending → in_progress → completed
417
+ → blocked (需等待依赖)
418
+ ```
419
+
420
+ ---
421
+
422
+ ## 错误处理与容错
423
+
424
+ ### 单 Agent 失败
425
+
426
+ ```
427
+ 道侣失败 → 释放 repellent 信息素 → 报告主修 → 主修评估影响
428
+ ├─ 可重试 → 同一道侣重试(≤2次)
429
+ ├─ 需换策略 → 主修调整方案后重新分配(参考 repellent 避开死路)
430
+ └─ 不可恢复 → 主修接管该子任务
431
+ ```
432
+
433
+ ### 通信超时
434
+
435
+ ```
436
+ 道侣无响应 → 主修等待 30s → 再次发送 → 仍无响应 → 标记异常,重新分配
437
+ ```
438
+
439
+ ### 降级策略
440
+
441
+ ```
442
+ 多 Agent 协同失败 → 降级为单 Agent 串行执行
443
+ 宁可慢,不可错。
444
+ ```
445
+
446
+ ---
447
+
448
+ ## 结果汇总模式
449
+
450
+ ### 汇总流程(蚁群版)
451
+
452
+ ```
453
+ 1. 收集所有道侣完成报告
454
+ 2. 派护法审查所有变更(可选,变更 >3 个文件时建议)
455
+ 3. 如有修复任务,派道侣修复
456
+ 4. 验证文件完整性(所有预期文件存在)
457
+ 5. 验证内容一致性(交叉引用正确)
458
+ 6. 统一 git add + commit
459
+ 7. 输出汇总报告
460
+ ```
461
+
462
+ ### 统一 Commit 规范
463
+
464
+ ```bash
465
+ # 主修负责最终 commit,道侣不单独 commit
466
+ git add -A
467
+ git commit -m "feat: {任务描述}
468
+
469
+ Co-authored-by: Agent-A
470
+ Co-authored-by: Agent-B"
471
+ ```
472
+
473
+ ### 汇总报告模板
474
+
475
+ ```
476
+ 🕸 天罗收阵!
477
+
478
+ 【阵法】{团队名称}
479
+ 【阵员】{Agent数量} 道侣 + {Scout数} 斥候 + {Soldier数} 护法
480
+ 【生命周期】侦察 → 工作 → 审查 → 完成
481
+ 【信息素】
482
+ - discovery: {数量} 条
483
+ - completion: {数量} 条
484
+ - warning: {数量} 条
485
+ - repellent: {数量} 条
486
+ 【战果】
487
+ - Agent-A: {文件数} 文件,{行数} 行
488
+ - Agent-B: {文件数} 文件,{行数} 行
489
+ 【验证】全部文件存在 ✓ | 交叉引用正确 ✓
490
+ 【耗时】{总时间}
491
+ ```
492
+
493
+ ---
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Skills 运行入口
4
+ * 跨平台统一调用各 skill 脚本
5
+ *
6
+ * 用法:
7
+ * node run_skill.js <skill_name> [args...]
8
+ *
9
+ * 示例:
10
+ * node run_skill.js verify-module ./my-project -v
11
+ * node run_skill.js verify-security ./src --json
12
+ * node run_skill.js verify-change --mode staged
13
+ * node run_skill.js verify-quality ./src
14
+ * node run_skill.js gen-docs ./new-module --force
15
+ */
16
+
17
+ const { spawn } = require('child_process');
18
+ const { readdirSync, statSync, writeFileSync, unlinkSync, closeSync, openSync } = require('fs');
19
+ const { join, resolve } = require('path');
20
+ const { createHash } = require('crypto');
21
+ const { tmpdir } = require('os');
22
+
23
+ const IS_WIN = process.platform === 'win32';
24
+
25
+ function getSkillsDir() {
26
+ const override = process.env.SAGE_SKILLS_DIR;
27
+ if (override) return resolve(override);
28
+ return __dirname;
29
+ }
30
+
31
+ function discoverSkills(skillsDir) {
32
+ const found = {};
33
+ const toolsDir = join(skillsDir, 'tools');
34
+ let entries;
35
+ try { entries = readdirSync(toolsDir).sort(); } catch { return found; }
36
+
37
+ for (const name of entries) {
38
+ const scriptsDir = join(toolsDir, name, 'scripts');
39
+ let scripts;
40
+ try { scripts = readdirSync(scriptsDir); } catch { continue; }
41
+ const jsFile = scripts.find(f => f.endsWith('.js'));
42
+ if (jsFile) found[name] = join(scriptsDir, jsFile);
43
+ }
44
+ return found;
45
+ }
46
+
47
+ function getScriptPath(skillName) {
48
+ const available = discoverSkills(getSkillsDir());
49
+ if (!(skillName in available)) {
50
+ const names = Object.keys(available).join(', ') || '(无)';
51
+ console.error(`错误: 未知的 skill '${skillName}'`);
52
+ console.error(`可用的 skills: ${names}`);
53
+ process.exit(1);
54
+ }
55
+ return available[skillName];
56
+ }
57
+
58
+ function sleepMs(ms) {
59
+ const end = Date.now() + ms;
60
+ while (Date.now() < end) { /* busy wait */ }
61
+ }
62
+
63
+ function acquireTargetLock(args) {
64
+ const target = args.find(a => !a.startsWith('-')) || process.cwd();
65
+ const hash = createHash('md5').update(resolve(target)).digest('hex').slice(0, 12);
66
+ const lockPath = join(tmpdir(), `sage_skill_${hash}.lock`);
67
+
68
+ const deadline = Date.now() + 30000;
69
+ let first = true;
70
+ while (true) {
71
+ try {
72
+ const fd = openSync(lockPath, 'wx');
73
+ return { fd, lockPath };
74
+ } catch (e) {
75
+ if (e.code !== 'EEXIST') return { fd: null, lockPath: null };
76
+ if (first) { console.log(`⏳ 等待锁释放: ${target}`); first = false; }
77
+ if (Date.now() >= deadline) { console.error(`⏳ 等待锁超时: ${target}`); process.exit(1); }
78
+ sleepMs(200);
79
+ }
80
+ }
81
+ }
82
+
83
+ function releaseLock({ fd, lockPath }) {
84
+ if (fd !== null) {
85
+ try { closeSync(fd); } catch {}
86
+ }
87
+ if (lockPath) {
88
+ try { unlinkSync(lockPath); } catch {}
89
+ }
90
+ }
91
+
92
+ function main() {
93
+ const args = process.argv.slice(2);
94
+
95
+ if (args.length === 0 || args[0] === '-h' || args[0] === '--help') {
96
+ console.log(__filename.split('/').pop() + ' <skill_name> [args...]');
97
+ process.exit(args.length === 0 ? 1 : 0);
98
+ }
99
+
100
+ const skillName = args[0];
101
+ const scriptPath = getScriptPath(skillName);
102
+ const scriptArgs = args.slice(1);
103
+
104
+ const lock = acquireTargetLock(scriptArgs);
105
+
106
+ const child = spawn(process.execPath, [scriptPath, ...scriptArgs], {
107
+ stdio: 'inherit',
108
+ });
109
+
110
+ child.on('close', (code) => {
111
+ releaseLock(lock);
112
+ process.exit(code || 0);
113
+ });
114
+
115
+ child.on('error', (err) => {
116
+ console.error(`执行错误: ${err.message}`);
117
+ releaseLock(lock);
118
+ process.exit(1);
119
+ });
120
+
121
+ process.on('SIGINT', () => {
122
+ console.log('\n已取消');
123
+ child.kill('SIGINT');
124
+ releaseLock(lock);
125
+ process.exit(130);
126
+ });
127
+ }
128
+
129
+ main();