dev-playbooks-cn 1.0.20 → 1.2.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 +41 -62
- package/bin/devbooks.js +228 -0
- package/package.json +1 -1
- package/skills/Skills/344/275/277/347/224/250/350/257/264/346/230/216.md +8 -73
- package/skills/_shared/mcp-enhancement-template.md +1 -4
- package/skills/_shared/references//345/201/217/347/246/273/346/243/200/346/265/213/344/270/216/350/267/257/347/224/261/345/215/217/350/256/256.md +199 -0
- package/skills/_shared/workflow-next-steps.md +111 -0
- package/skills/devbooks-brownfield-bootstrap/SKILL.md +2 -2
- package/skills/devbooks-brownfield-bootstrap/scripts/cod-update.sh +1 -1
- package/skills/devbooks-code-review/SKILL.md +34 -1
- package/skills/devbooks-coder/SKILL.md +103 -2
- package/skills/devbooks-delivery-workflow/SKILL.md +2 -2
- package/skills/devbooks-design-backport/SKILL.md +1 -1
- package/skills/devbooks-design-doc/SKILL.md +38 -1
- package/skills/devbooks-docs-sync/SKILL.md +338 -0
- package/skills/devbooks-entropy-monitor/SKILL.md +1 -1
- package/skills/devbooks-impact-analysis/SKILL.md +2 -2
- package/skills/devbooks-implementation-plan/SKILL.md +43 -1
- package/skills/devbooks-proposal-author/SKILL.md +41 -1
- package/skills/devbooks-proposal-author/references//346/217/220/346/241/210/346/222/260/345/206/231/346/217/220/347/244/272/350/257/215.md +10 -0
- package/skills/devbooks-proposal-challenger/SKILL.md +1 -1
- package/skills/devbooks-proposal-judge/SKILL.md +1 -1
- package/skills/devbooks-router/SKILL.md +45 -14
- package/skills/devbooks-spec-contract/SKILL.md +36 -2
- package/skills/devbooks-spec-gardener/SKILL.md +1 -1
- package/skills/devbooks-test-owner/SKILL.md +204 -1
- package/skills/devbooks-test-reviewer/SKILL.md +27 -1
- package/templates/claude-agents/devbooks-coder.md +21 -0
- package/templates/claude-agents/devbooks-explorer.md +21 -0
- package/templates/claude-agents/devbooks-reviewer.md +21 -0
- package/templates/claude-agents/devbooks-test-owner.md +21 -0
- package/templates/dev-playbooks/README.md +4 -14
- package/templates/dev-playbooks/docs/DevBooks/351/205/215/347/275/256/346/214/207/345/215/227.md +1 -14
- package/skills/devbooks-federation/SKILL.md +0 -264
- package/skills/devbooks-federation/scripts/federation-check.sh +0 -144
- package/skills/devbooks-federation/templates/federation.yaml +0 -89
- package/skills/devbooks-index-bootstrap/SKILL.md +0 -240
- package/skills/devbooks-proposal-debate-workflow/SKILL.md +0 -78
- package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/345/267/245/344/275/234/346/265/201.md +0 -24
- package/skills/devbooks-proposal-debate-workflow/references//346/217/220/346/241/210/345/257/271/350/276/251/346/250/241/346/235/277.md +0 -35
- package/skills/devbooks-proposal-debate-workflow/scripts/proposal-debate-check.sh +0 -102
package/README.md
CHANGED
|
@@ -27,22 +27,7 @@ AI 编码助手很强大,但往往**不可预测**:
|
|
|
27
27
|
- **基于证据的完成**:完成由测试/构建/证据定义,而非 AI 自我评估
|
|
28
28
|
- **强制角色隔离**:Test Owner 与 Coder 必须在独立对话中工作
|
|
29
29
|
- **多重质量闸门**:Green 证据检查、任务完成率、角色边界检查
|
|
30
|
-
- **
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## DevBooks 对比一览
|
|
35
|
-
|
|
36
|
-
| 维度 | DevBooks | OpenSpec | spec-kit | 无规格 |
|
|
37
|
-
|------|----------|----------|----------|--------|
|
|
38
|
-
| 规格驱动工作流 | 是 | 是 | 是 | 否 |
|
|
39
|
-
| 变更产物的可追溯性 | 变更包集中存档(proposal/design/spec/tasks/verification/evidence) | 主要以变更目录/文件组织为主 | 以文档+任务编排为主 | 无 |
|
|
40
|
-
| 角色与职责边界 | **强制隔离**(Test Owner / Coder) | 约定为主(不强制) | 约定为主(不强制) | 无 |
|
|
41
|
-
| 完成判据(DoD) | **证据驱动 + 闸门**(测试/构建/审计) | 人工定义/人工检查 | 人工定义/人工检查 | 常依赖主观判断 |
|
|
42
|
-
| 代码质量保障 | 守门 + 指标(熵度量/热点)+ Review 角色 | 依赖外部工具/人工 review | 依赖外部工具/人工 review | 不稳定 |
|
|
43
|
-
| 影响面分析 | CKB 图基能力(可降级 Grep) | 文本搜索/人工推导 | 文本搜索/人工推导 | 容易漏改 |
|
|
44
|
-
| 存量项目起步 | 自动生成基线规格/术语表/最小验证锚点 | 手动补齐 | 有限 | - |
|
|
45
|
-
| 自动化覆盖面 | 21 个 Skills(提案→实现→归档闭环) | 3 个核心命令 | 工具包(偏 0→1) | - |
|
|
30
|
+
- **18 个 Skills**:覆盖提案、设计、评审、熵度量等完整工作流
|
|
46
31
|
|
|
47
32
|
---
|
|
48
33
|
|
|
@@ -174,7 +159,6 @@ DevBooks 使用两个目录根:
|
|
|
174
159
|
| `devbooks-impact-analysis` | 跨模块影响分析 |
|
|
175
160
|
| `devbooks-proposal-challenger` | 质疑和挑战提案 |
|
|
176
161
|
| `devbooks-proposal-judge` | 裁决提案 |
|
|
177
|
-
| `devbooks-proposal-debate-workflow` | 三角对辩(Author/Challenger/Judge) |
|
|
178
162
|
| `devbooks-design-doc` | 创建设计文档 |
|
|
179
163
|
| `devbooks-spec-contract` | 定义规格与契约 |
|
|
180
164
|
| `devbooks-implementation-plan` | 创建实现计划 |
|
|
@@ -206,9 +190,7 @@ DevBooks 使用两个目录根:
|
|
|
206
190
|
| Skill | 说明 |
|
|
207
191
|
|-------|------|
|
|
208
192
|
| `devbooks-entropy-monitor` | 系统熵度量 |
|
|
209
|
-
| `devbooks-federation` | 跨仓库联邦分析 |
|
|
210
193
|
| `devbooks-brownfield-bootstrap` | 存量项目初始化 |
|
|
211
|
-
| `devbooks-index-bootstrap` | 生成 SCIP 索引 |
|
|
212
194
|
|
|
213
195
|
---
|
|
214
196
|
|
|
@@ -216,54 +198,55 @@ DevBooks 使用两个目录根:
|
|
|
216
198
|
|
|
217
199
|
### vs. OpenSpec
|
|
218
200
|
|
|
219
|
-
[OpenSpec](https://github.com/Fission-AI/OpenSpec) 是轻量级规格驱动框架,用三个核心命令(proposal/apply/archive)对齐人与 AI
|
|
220
|
-
|
|
221
|
-
**DevBooks 新增:**
|
|
222
|
-
- **角色隔离**:Test Owner 与 Coder 硬边界(必须独立对话)
|
|
223
|
-
- **质量闸门**:5+ 验证闸门拦截伪完成
|
|
224
|
-
- **21 个 Skills**:覆盖提案、对辩、评审、熵度量、联邦分析
|
|
225
|
-
- **基于证据的完成**:测试/构建定义"完成",而非 AI 自评
|
|
201
|
+
[OpenSpec](https://github.com/Fission-AI/OpenSpec) 是轻量级规格驱动框架,用三个核心命令(proposal/apply/archive)对齐人与 AI。
|
|
226
202
|
|
|
227
|
-
|
|
203
|
+
**OpenSpec 的局限**:
|
|
204
|
+
- 缺乏角色隔离,AI 可能自我验证"已完成"
|
|
205
|
+
- 无质量闸门,伪完成难以拦截
|
|
206
|
+
- 只有 3 个命令,复杂变更覆盖不足
|
|
228
207
|
|
|
229
|
-
|
|
208
|
+
**DevBooks 解决方案**:
|
|
209
|
+
- **强制角色隔离**:Test Owner 与 Coder 必须独立对话,杜绝自我验证
|
|
210
|
+
- **5+ 质量闸门**:Green 证据检查、任务完成率、角色边界检查
|
|
211
|
+
- **18 个 Skills**:覆盖提案→实现→归档完整闭环
|
|
230
212
|
|
|
231
213
|
### vs. spec-kit
|
|
232
214
|
|
|
233
|
-
[GitHub spec-kit](https://github.com/github/spec-kit) 提供规格驱动开发工具包,有 constitution
|
|
234
|
-
|
|
235
|
-
**DevBooks 新增:**
|
|
236
|
-
- **存量优先**:自动为现有代码库生成基线规格
|
|
237
|
-
- **角色隔离**:测试编写与实现强制分离
|
|
238
|
-
- **质量闸门**:运行时验证,不只是工作流引导
|
|
239
|
-
- **原型模式**:安全实验不污染主 src/
|
|
215
|
+
[GitHub spec-kit](https://github.com/github/spec-kit) 提供规格驱动开发工具包,有 constitution 文件和结构化规划。
|
|
240
216
|
|
|
241
|
-
|
|
217
|
+
**spec-kit 的局限**:
|
|
218
|
+
- 偏向 0→1 绿地项目,存量项目支持有限
|
|
219
|
+
- 无强制角色隔离,测试与实现可能混淆
|
|
220
|
+
- 依赖人工检查,缺乏运行时验证
|
|
242
221
|
|
|
243
|
-
|
|
222
|
+
**DevBooks 解决方案**:
|
|
223
|
+
- **存量优先**:`devbooks-brownfield-bootstrap` 自动生成基线规格
|
|
224
|
+
- **强制角色隔离**:测试编写与实现物理分离
|
|
225
|
+
- **运行时闸门**:自动验证,不依赖人工检查
|
|
244
226
|
|
|
245
227
|
### vs. Kiro.dev
|
|
246
228
|
|
|
247
|
-
[Kiro](https://kiro.dev/) 是 AWS 的代理式 IDE
|
|
229
|
+
[Kiro](https://kiro.dev/) 是 AWS 的代理式 IDE,用三阶段工作流(需求、设计、任务)。
|
|
248
230
|
|
|
249
|
-
**
|
|
250
|
-
-
|
|
251
|
-
-
|
|
252
|
-
-
|
|
231
|
+
**Kiro 的局限**:
|
|
232
|
+
- 规格与实现产物分开存储,追溯困难
|
|
233
|
+
- 无强制角色隔离
|
|
234
|
+
- 依赖特定 IDE 环境
|
|
253
235
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
236
|
+
**DevBooks 解决方案**:
|
|
237
|
+
- **变更包**:proposal/design/spec/plan/verification/evidence 集中存储,完整追溯
|
|
238
|
+
- **强制角色隔离**:Test Owner 与 Coder 硬边界
|
|
239
|
+
- **工具无关**:支持 Claude Code、Codex CLI、Cursor 等多种工具
|
|
257
240
|
|
|
258
241
|
### vs. 无规格
|
|
259
242
|
|
|
260
243
|
没有规格时,AI 从模糊提示生成代码,导致不可预测的输出、范围蔓延和"幻觉式完成"。
|
|
261
244
|
|
|
262
245
|
**DevBooks 带来:**
|
|
263
|
-
-
|
|
264
|
-
-
|
|
265
|
-
-
|
|
266
|
-
-
|
|
246
|
+
- 实现前商定规格,范围清晰可控
|
|
247
|
+
- 质量闸门验证真实完成
|
|
248
|
+
- 角色隔离防止自我验证
|
|
249
|
+
- 每个变更的完整证据链
|
|
267
250
|
|
|
268
251
|
---
|
|
269
252
|
|
|
@@ -349,12 +332,6 @@ DevBooks 跟踪四维系统熵:
|
|
|
349
332
|
|
|
350
333
|
</details>
|
|
351
334
|
|
|
352
|
-
<details>
|
|
353
|
-
<summary><strong>跨仓库联邦</strong></summary>
|
|
354
|
-
|
|
355
|
-
多仓库分析用 `devbooks-federation`,分析跨仓库边界的契约和依赖,支持协调变更。
|
|
356
|
-
|
|
357
|
-
</details>
|
|
358
335
|
|
|
359
336
|
<details>
|
|
360
337
|
<summary><strong>MCP 自动检测</strong></summary>
|
|
@@ -380,19 +357,21 @@ DevBooks Skills 支持 MCP(Model Context Protocol)优雅降级:在没有 M
|
|
|
380
357
|
- 超时/失败 → 静默降级到基础模式,不阻塞执行
|
|
381
358
|
- 无需手动选择"基础/增强"模式
|
|
382
359
|
|
|
383
|
-
如需启用增强能力:按 `docs/推荐MCP.md` 配置 CKB
|
|
360
|
+
如需启用增强能力:按 `docs/推荐MCP.md` 配置 CKB,并手动生成 `index.scip`。
|
|
384
361
|
|
|
385
362
|
</details>
|
|
386
363
|
|
|
387
364
|
<details>
|
|
388
|
-
<summary><strong
|
|
365
|
+
<summary><strong>提案审查流程</strong></summary>
|
|
366
|
+
|
|
367
|
+
严格提案审查使用独立对话的 Challenger 和 Judge:
|
|
389
368
|
|
|
390
|
-
|
|
369
|
+
三个角色(必须独立对话):
|
|
370
|
+
1. **Author**:创建并捍卫提案(使用 `devbooks-proposal-author`)
|
|
371
|
+
2. **Challenger**:质疑假设、发现缺口、识别风险(使用 `devbooks-proposal-challenger`)
|
|
372
|
+
3. **Judge**:做最终决定、记录理由(使用 `devbooks-proposal-judge`)
|
|
391
373
|
|
|
392
|
-
|
|
393
|
-
1. **Author**:创建并捍卫提案
|
|
394
|
-
2. **Challenger**:质疑假设、发现缺口、识别风险
|
|
395
|
-
3. **Judge**:做最终决定、记录理由
|
|
374
|
+
**重要**:三个角色必须在**独立对话**中工作,以避免角色混淆和自我验证。
|
|
396
375
|
|
|
397
376
|
决定结果:`Approved`、`Revise`、`Rejected`
|
|
398
377
|
|
package/bin/devbooks.js
CHANGED
|
@@ -305,6 +305,160 @@ function getCliVersion() {
|
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
307
|
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// 自动更新 .gitignore 和 .npmignore
|
|
310
|
+
// ============================================================================
|
|
311
|
+
|
|
312
|
+
const IGNORE_MARKERS = {
|
|
313
|
+
start: '# DevBooks managed - DO NOT EDIT',
|
|
314
|
+
end: '# End DevBooks managed'
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* 获取需要添加到 .gitignore 的条目
|
|
319
|
+
* @param {string[]} toolIds - 选择的 AI 工具 ID
|
|
320
|
+
* @returns {string[]} - 需要忽略的条目
|
|
321
|
+
*/
|
|
322
|
+
function getGitIgnoreEntries(toolIds) {
|
|
323
|
+
const entries = [
|
|
324
|
+
'# DevBooks 本地配置(包含用户偏好,不应提交)',
|
|
325
|
+
'.devbooks/'
|
|
326
|
+
];
|
|
327
|
+
|
|
328
|
+
// 根据选择的工具添加对应的 AI 工具目录
|
|
329
|
+
for (const toolId of toolIds) {
|
|
330
|
+
const tool = AI_TOOLS.find(t => t.id === toolId);
|
|
331
|
+
if (!tool) continue;
|
|
332
|
+
|
|
333
|
+
// 添加 slash 命令目录
|
|
334
|
+
if (tool.slashDir) {
|
|
335
|
+
const topDir = tool.slashDir.split('/')[0];
|
|
336
|
+
if (!entries.includes(topDir + '/')) {
|
|
337
|
+
entries.push(`${topDir}/`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// 添加 rules 目录
|
|
342
|
+
if (tool.rulesDir) {
|
|
343
|
+
const topDir = tool.rulesDir.split('/')[0];
|
|
344
|
+
if (!entries.includes(topDir + '/')) {
|
|
345
|
+
entries.push(`${topDir}/`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// 添加 agents 目录(如 .github/instructions 等)
|
|
350
|
+
if (tool.instructionsDir) {
|
|
351
|
+
const topDir = tool.instructionsDir.split('/')[0];
|
|
352
|
+
if (topDir !== '.github') { // .github 目录通常需要保留
|
|
353
|
+
if (!entries.includes(topDir + '/')) {
|
|
354
|
+
entries.push(`${topDir}/`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return entries;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* 获取需要添加到 .npmignore 的条目
|
|
365
|
+
* @returns {string[]} - 需要忽略的条目
|
|
366
|
+
*/
|
|
367
|
+
function getNpmIgnoreEntries() {
|
|
368
|
+
return [
|
|
369
|
+
'# DevBooks 开发文档(运行时不需要)',
|
|
370
|
+
'dev-playbooks/',
|
|
371
|
+
'.devbooks/',
|
|
372
|
+
'',
|
|
373
|
+
'# AI 工具配置目录',
|
|
374
|
+
'.claude/',
|
|
375
|
+
'.cursor/',
|
|
376
|
+
'.windsurf/',
|
|
377
|
+
'.gemini/',
|
|
378
|
+
'.agent/',
|
|
379
|
+
'.opencode/',
|
|
380
|
+
'.continue/',
|
|
381
|
+
'.qoder/',
|
|
382
|
+
'.github/instructions/',
|
|
383
|
+
'.github/copilot-instructions.md',
|
|
384
|
+
'',
|
|
385
|
+
'# DevBooks 指令文件',
|
|
386
|
+
'CLAUDE.md',
|
|
387
|
+
'AGENTS.md',
|
|
388
|
+
'GEMINI.md'
|
|
389
|
+
];
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* 更新 ignore 文件,保留用户自定义内容
|
|
394
|
+
* @param {string} filePath - ignore 文件路径
|
|
395
|
+
* @param {string[]} entries - 需要添加的条目
|
|
396
|
+
* @returns {object} - { updated: boolean, action: 'created' | 'updated' | 'unchanged' }
|
|
397
|
+
*/
|
|
398
|
+
function updateIgnoreFile(filePath, entries) {
|
|
399
|
+
const managedBlock = [
|
|
400
|
+
IGNORE_MARKERS.start,
|
|
401
|
+
...entries,
|
|
402
|
+
IGNORE_MARKERS.end
|
|
403
|
+
].join('\n');
|
|
404
|
+
|
|
405
|
+
if (!fs.existsSync(filePath)) {
|
|
406
|
+
// 文件不存在,创建新文件
|
|
407
|
+
fs.writeFileSync(filePath, managedBlock + '\n');
|
|
408
|
+
return { updated: true, action: 'created' };
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
412
|
+
const startIdx = content.indexOf(IGNORE_MARKERS.start);
|
|
413
|
+
const endIdx = content.indexOf(IGNORE_MARKERS.end);
|
|
414
|
+
|
|
415
|
+
if (startIdx !== -1 && endIdx !== -1 && startIdx < endIdx) {
|
|
416
|
+
// 已有托管块,更新它
|
|
417
|
+
const before = content.slice(0, startIdx);
|
|
418
|
+
const after = content.slice(endIdx + IGNORE_MARKERS.end.length);
|
|
419
|
+
const newContent = before + managedBlock + after;
|
|
420
|
+
|
|
421
|
+
if (newContent !== content) {
|
|
422
|
+
fs.writeFileSync(filePath, newContent);
|
|
423
|
+
return { updated: true, action: 'updated' };
|
|
424
|
+
}
|
|
425
|
+
return { updated: false, action: 'unchanged' };
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// 没有托管块,追加到文件末尾
|
|
429
|
+
const newContent = content.trimEnd() + '\n\n' + managedBlock + '\n';
|
|
430
|
+
fs.writeFileSync(filePath, newContent);
|
|
431
|
+
return { updated: true, action: 'updated' };
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* 设置项目的 ignore 文件
|
|
436
|
+
* @param {string[]} toolIds - 选择的 AI 工具 ID
|
|
437
|
+
* @param {string} projectDir - 项目目录
|
|
438
|
+
* @returns {object[]} - 结果数组
|
|
439
|
+
*/
|
|
440
|
+
function setupIgnoreFiles(toolIds, projectDir) {
|
|
441
|
+
const results = [];
|
|
442
|
+
|
|
443
|
+
// 更新 .gitignore
|
|
444
|
+
const gitIgnorePath = path.join(projectDir, '.gitignore');
|
|
445
|
+
const gitIgnoreEntries = getGitIgnoreEntries(toolIds);
|
|
446
|
+
const gitResult = updateIgnoreFile(gitIgnorePath, gitIgnoreEntries);
|
|
447
|
+
if (gitResult.updated) {
|
|
448
|
+
results.push({ file: '.gitignore', action: gitResult.action });
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// 更新 .npmignore
|
|
452
|
+
const npmIgnorePath = path.join(projectDir, '.npmignore');
|
|
453
|
+
const npmIgnoreEntries = getNpmIgnoreEntries();
|
|
454
|
+
const npmResult = updateIgnoreFile(npmIgnorePath, npmIgnoreEntries);
|
|
455
|
+
if (npmResult.updated) {
|
|
456
|
+
results.push({ file: '.npmignore', action: npmResult.action });
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
return results;
|
|
460
|
+
}
|
|
461
|
+
|
|
308
462
|
function showVersion() {
|
|
309
463
|
console.log(`${CLI_COMMAND} v${getCliVersion()}`);
|
|
310
464
|
}
|
|
@@ -458,6 +612,52 @@ function installSkills(toolIds, update = false) {
|
|
|
458
612
|
return results;
|
|
459
613
|
}
|
|
460
614
|
|
|
615
|
+
// ============================================================================
|
|
616
|
+
// 安装 Claude Code 自定义子代理(解决内置子代理无法访问 Skills 的问题)
|
|
617
|
+
// ============================================================================
|
|
618
|
+
|
|
619
|
+
function installClaudeAgents(toolIds, projectDir, update = false) {
|
|
620
|
+
const results = [];
|
|
621
|
+
|
|
622
|
+
// 只有 Claude Code 需要安装自定义子代理
|
|
623
|
+
if (!toolIds.includes('claude')) return results;
|
|
624
|
+
|
|
625
|
+
const agentsSrcDir = path.join(__dirname, '..', 'templates', 'claude-agents');
|
|
626
|
+
const agentsDestDir = path.join(projectDir, '.claude', 'agents');
|
|
627
|
+
|
|
628
|
+
if (!fs.existsSync(agentsSrcDir)) return results;
|
|
629
|
+
|
|
630
|
+
const agentFiles = fs.readdirSync(agentsSrcDir)
|
|
631
|
+
.filter(name => name.endsWith('.md'));
|
|
632
|
+
|
|
633
|
+
if (agentFiles.length === 0) return results;
|
|
634
|
+
|
|
635
|
+
fs.mkdirSync(agentsDestDir, { recursive: true });
|
|
636
|
+
|
|
637
|
+
let installedCount = 0;
|
|
638
|
+
for (const agentFile of agentFiles) {
|
|
639
|
+
const srcPath = path.join(agentsSrcDir, agentFile);
|
|
640
|
+
const destPath = path.join(agentsDestDir, agentFile);
|
|
641
|
+
|
|
642
|
+
if (fs.existsSync(destPath) && !update) continue;
|
|
643
|
+
|
|
644
|
+
fs.copyFileSync(srcPath, destPath);
|
|
645
|
+
installedCount++;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
if (installedCount > 0) {
|
|
649
|
+
results.push({
|
|
650
|
+
tool: 'Claude Code',
|
|
651
|
+
type: 'agents',
|
|
652
|
+
count: installedCount,
|
|
653
|
+
total: agentFiles.length,
|
|
654
|
+
path: agentsDestDir
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
return results;
|
|
659
|
+
}
|
|
660
|
+
|
|
461
661
|
// ============================================================================
|
|
462
662
|
// 安装 Rules(Cursor, Windsurf, Gemini, Antigravity, OpenCode, Continue)
|
|
463
663
|
// ============================================================================
|
|
@@ -853,6 +1053,14 @@ async function initCommand(projectDir, options) {
|
|
|
853
1053
|
console.log(chalk.gray(` └ ${result.tool}: ${result.note}`));
|
|
854
1054
|
}
|
|
855
1055
|
}
|
|
1056
|
+
|
|
1057
|
+
// 安装 Claude Code 自定义子代理(解决内置子代理无法访问 Skills 的问题)
|
|
1058
|
+
const agentsResults = installClaudeAgents(fullSupportTools, projectDir);
|
|
1059
|
+
for (const result of agentsResults) {
|
|
1060
|
+
if (result.count > 0) {
|
|
1061
|
+
console.log(chalk.gray(` └ ${result.tool}: ${result.count} 个自定义子代理 → ${result.path}`));
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
856
1064
|
}
|
|
857
1065
|
|
|
858
1066
|
// 安装 Rules(Rules 类似系统的工具)
|
|
@@ -880,6 +1088,18 @@ async function initCommand(projectDir, options) {
|
|
|
880
1088
|
console.log(chalk.gray(` └ ${result.tool}: ${path.relative(projectDir, result.path)}`));
|
|
881
1089
|
}
|
|
882
1090
|
|
|
1091
|
+
// 设置 ignore 文件
|
|
1092
|
+
const ignoreSpinner = ora('配置 ignore 文件...').start();
|
|
1093
|
+
const ignoreResults = setupIgnoreFiles(selectedTools, projectDir);
|
|
1094
|
+
if (ignoreResults.length > 0) {
|
|
1095
|
+
ignoreSpinner.succeed('ignore 文件已配置');
|
|
1096
|
+
for (const result of ignoreResults) {
|
|
1097
|
+
console.log(chalk.gray(` └ ${result.file}: ${result.action === 'created' ? '已创建' : '已更新'}`));
|
|
1098
|
+
}
|
|
1099
|
+
} else {
|
|
1100
|
+
ignoreSpinner.succeed('ignore 文件无需更新');
|
|
1101
|
+
}
|
|
1102
|
+
|
|
883
1103
|
// 完成
|
|
884
1104
|
console.log();
|
|
885
1105
|
console.log(chalk.green('══════════════════════════════════════'));
|
|
@@ -946,6 +1166,14 @@ async function updateCommand(projectDir) {
|
|
|
946
1166
|
}
|
|
947
1167
|
}
|
|
948
1168
|
|
|
1169
|
+
// 更新 Claude Code 自定义子代理(项目目录)
|
|
1170
|
+
const agentsResults = installClaudeAgents(configuredTools, projectDir, true);
|
|
1171
|
+
for (const result of agentsResults) {
|
|
1172
|
+
if (result.count > 0) {
|
|
1173
|
+
console.log(chalk.green('✓') + ` ${result.tool}: 更新了 ${result.count} 个自定义子代理`);
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
|
|
949
1177
|
// 更新 Rules(项目目录)
|
|
950
1178
|
const rulesTools = configuredTools.filter(id => {
|
|
951
1179
|
const tool = AI_TOOLS.find(t => t.id === id);
|
package/package.json
CHANGED
|
@@ -115,26 +115,6 @@
|
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
118
|
-
## `devbooks-proposal-debate-workflow`(Proposal Debate Workflow)
|
|
119
|
-
|
|
120
|
-
- 作用:把“提案-质疑-裁决”跑成一套三角对辩流程(Author/Challenger/Judge 角色隔离),并确保 Decision Log 状态明确。
|
|
121
|
-
- 使用场景:
|
|
122
|
-
- 你想强制三角色对抗来提高提案质量
|
|
123
|
-
- 团队里经常“风险没说清就开工”
|
|
124
|
-
- 使用话术:
|
|
125
|
-
```text
|
|
126
|
-
你现在是 Proposal Debate Orchestrator。请点名使用 `devbooks-proposal-debate-workflow`。
|
|
127
|
-
先读:`dev-playbooks/project.md`
|
|
128
|
-
约束:Author/Challenger/Judge 必须独立对话/独立实例;如果我无法提供独立对话,你就停止并说明原因。
|
|
129
|
-
目标:最终 `dev-playbooks/changes/<change-id>/proposal.md` 的 Decision Log 状态必须为 Approved/Revise/Rejected(禁止 Pending)。
|
|
130
|
-
请你按工作流逐步告诉我:每一个独立对话里我要复制粘贴的指令是什么,以及每一步需要我把什么结果贴回当前对话。
|
|
131
|
-
|
|
132
|
-
我的需求是:
|
|
133
|
-
<一句话需求 + 背景 + 约束>
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
118
|
## `devbooks-design-doc`(Design Owner / Design Doc)
|
|
139
119
|
|
|
140
120
|
- 作用:产出 `design.md`,只写 What/Constraints + AC-xxx(禁止写实现步骤),作为测试与计划的黄金真理。
|
|
@@ -364,61 +344,16 @@
|
|
|
364
344
|
|
|
365
345
|
---
|
|
366
346
|
|
|
367
|
-
## `devbooks-
|
|
347
|
+
## `devbooks-test-reviewer`(Test Reviewer)【新】
|
|
368
348
|
|
|
369
|
-
-
|
|
370
|
-
- **触发条件**:
|
|
371
|
-
- 用户说"初始化索引/建立代码图谱/激活图分析"
|
|
372
|
-
- `mcp__ckb__getStatus` 返回 SCIP 后端 `healthy: false`
|
|
373
|
-
- 进入新项目且 `index.scip` 不存在
|
|
349
|
+
- 作用:以 Test Reviewer 角色评审 tests/ 测试质量(覆盖、边界、可读性、可维护性),只输出评审意见,不修改代码。
|
|
374
350
|
- 使用场景:
|
|
375
|
-
-
|
|
376
|
-
-
|
|
377
|
-
- CKB MCP 工具报错"SCIP 后端不可用"
|
|
351
|
+
- Test Owner 完成测试后,需要独立评审测试质量
|
|
352
|
+
- 想发现测试覆盖盲区、边界条件遗漏、测试可维护性问题
|
|
378
353
|
- 使用话术:
|
|
379
354
|
```text
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
- 手动生成索引(无需 Skill):
|
|
385
|
-
```bash
|
|
386
|
-
# TypeScript/JavaScript
|
|
387
|
-
npm install -g @anthropic-ai/scip-typescript
|
|
388
|
-
scip-typescript index --output index.scip
|
|
389
|
-
|
|
390
|
-
# Python
|
|
391
|
-
pip install scip-python
|
|
392
|
-
scip-python index . --output index.scip
|
|
393
|
-
|
|
394
|
-
# Go
|
|
395
|
-
go install github.com/sourcegraph/scip-go@latest
|
|
396
|
-
scip-go --output index.scip
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
## `devbooks-federation`(Federation Analyst)【新】
|
|
402
|
-
|
|
403
|
-
- 作用:跨仓库联邦分析与契约同步。检测契约变更、分析跨仓库影响、通知下游消费者。
|
|
404
|
-
- **触发条件**:
|
|
405
|
-
- 用户说"跨仓库影响/联邦分析/契约同步/上下游依赖/多仓库"
|
|
406
|
-
- 变更涉及 `federation.yaml` 中定义的契约文件
|
|
407
|
-
- 使用场景:
|
|
408
|
-
- 多仓库项目,需要分析变更对下游的影响
|
|
409
|
-
- 对外 API/契约变更,需要通知消费者
|
|
410
|
-
- 想建立跨仓库的影响追溯
|
|
411
|
-
- 前置条件:
|
|
412
|
-
- 项目根目录存在 `.devbooks/federation.yaml`(从 `skills/devbooks-federation/templates/federation.yaml` 复制)
|
|
413
|
-
- 使用话术:
|
|
414
|
-
```text
|
|
415
|
-
请点名使用 `devbooks-federation`。
|
|
416
|
-
目标:分析本次变更的跨仓库影响,检测契约变更,生成影响报告。
|
|
417
|
-
项目根目录:$(pwd)
|
|
418
|
-
变更文件:<变更的文件列表>
|
|
419
|
-
```
|
|
420
|
-
- 脚本支持:
|
|
421
|
-
```bash
|
|
422
|
-
# 检查联邦契约变更
|
|
423
|
-
bash ~/.claude/skills/devbooks-federation/scripts/federation-check.sh --project-root "$(pwd)"
|
|
355
|
+
你现在是 Test Reviewer。请点名使用 `devbooks-test-reviewer`。
|
|
356
|
+
请只做测试质量评审(覆盖率/边界条件/可读性/可维护性),不修改代码。
|
|
357
|
+
输入:`tests/**` + `dev-playbooks/changes/<change-id>/verification.md`(如有)
|
|
358
|
+
输出:覆盖盲区 / 边界条件遗漏 / 可维护性风险 / 改进建议。
|
|
424
359
|
```
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
|
|
49
49
|
```
|
|
50
50
|
⚠️ CKB 不可用(超时或未配置),使用基础模式执行。
|
|
51
|
-
|
|
51
|
+
如需启用增强功能,请手动生成 SCIP 索引。
|
|
52
52
|
```
|
|
53
53
|
```
|
|
54
54
|
|
|
@@ -65,7 +65,6 @@
|
|
|
65
65
|
- devbooks-proposal-author(纯文档生成)
|
|
66
66
|
- devbooks-proposal-challenger(纯评审)
|
|
67
67
|
- devbooks-proposal-judge(纯裁决)
|
|
68
|
-
- devbooks-proposal-debate-workflow(流程编排)
|
|
69
68
|
- devbooks-design-backport(文档回写)
|
|
70
69
|
- devbooks-spec-gardener(文件整理)
|
|
71
70
|
- devbooks-test-reviewer(测试评审)
|
|
@@ -88,8 +87,6 @@
|
|
|
88
87
|
| devbooks-code-review | mcp__ckb__getHotspots | 热点文件高亮 |
|
|
89
88
|
| devbooks-impact-analysis | mcp__ckb__analyzeImpact, findReferences | 精确影响分析 |
|
|
90
89
|
| devbooks-brownfield-bootstrap | mcp__ckb__* | COD 模型生成 |
|
|
91
|
-
| devbooks-index-bootstrap | mcp__ckb__getStatus | 索引状态检测 |
|
|
92
|
-
| devbooks-federation | mcp__ckb__*, mcp__github__* | 跨仓库分析 |
|
|
93
90
|
| devbooks-router | mcp__ckb__getStatus | 索引可用性检测 |
|
|
94
91
|
| devbooks-spec-contract | mcp__ckb__findReferences | 引用检测 |
|
|
95
92
|
| devbooks-entropy-monitor | mcp__ckb__getHotspots | 热点趋势分析 |
|