dev-playbooks-cn 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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -0
  3. package/bin/devbooks.js +987 -0
  4. package/package.json +43 -0
  5. package/skills/Skills/344/275/277/347/224/250/350/257/264/346/230/216.md +446 -0
  6. package/skills/Skill/345/274/200/345/217/221/346/214/207/345/215/227.md +248 -0
  7. package/skills/_shared/context-detection-template.md +315 -0
  8. package/skills/_shared/mcp-enhancement-template.md +144 -0
  9. package/skills/_shared/references//351/200/232/347/224/250/345/256/210/351/227/250/345/215/217/350/256/256.md +114 -0
  10. package/skills/_template/config-discovery-template.md +126 -0
  11. package/skills/devbooks-brownfield-bootstrap/SKILL.md +167 -0
  12. package/skills/devbooks-brownfield-bootstrap/references//344/273/243/347/240/201/345/257/274/350/210/252/347/255/226/347/225/245.md +203 -0
  13. package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226.md +96 -0
  14. package/skills/devbooks-brownfield-bootstrap/references//345/255/230/351/207/217/351/241/271/347/233/256/345/210/235/345/247/213/345/214/226/346/217/220/347/244/272/350/257/215.md +115 -0
  15. package/skills/devbooks-brownfield-bootstrap/references//346/234/257/350/257/255/350/241/250/346/250/241/346/235/277.md +42 -0
  16. package/skills/devbooks-brownfield-bootstrap/scripts/cod-update.sh +357 -0
  17. package/skills/devbooks-brownfield-bootstrap/templates/project-profile-template.md +172 -0
  18. package/skills/devbooks-c4-map/SKILL.md +151 -0
  19. package/skills/devbooks-c4-map/references/C4/346/236/266/346/236/204/345/234/260/345/233/276/346/217/220/347/244/272/350/257/215.md +33 -0
  20. package/skills/devbooks-c4-map/references//345/210/206/345/261/202/347/272/246/346/235/237/346/243/200/346/237/245/346/270/205/345/215/225.md +185 -0
  21. package/skills/devbooks-code-review/SKILL.md +175 -0
  22. package/skills/devbooks-code-review/references/PR/346/250/241/346/235/277/344/270/216/346/214/207/345/215/227.md +321 -0
  23. package/skills/devbooks-code-review/references//344/273/243/347/240/201/350/257/204/345/256/241/346/217/220/347/244/272/350/257/215.md +100 -0
  24. package/skills/devbooks-code-review/references//345/235/217/345/221/263/351/201/223/351/200/237/346/237/245/350/241/250.md +495 -0
  25. package/skills/devbooks-code-review/references//350/265/204/346/272/220/347/256/241/347/220/206/345/256/241/346/237/245/346/270/205/345/215/225.md +311 -0
  26. package/skills/devbooks-coder/SKILL.md +219 -0
  27. package/skills/devbooks-coder/references//344/273/243/347/240/201/345/256/236/347/216/260/346/217/220/347/244/272/350/257/215.md +70 -0
  28. package/skills/devbooks-coder/references//344/275/216/351/243/216/351/231/251/346/224/271/345/212/250/346/212/200/346/234/257.md +275 -0
  29. package/skills/devbooks-coder/references//346/227/245/345/277/227/350/247/204/350/214/203.md +329 -0
  30. package/skills/devbooks-coder/references//347/274/226/347/240/201/351/243/216/346/240/274/347/273/206/345/210/231.md +351 -0
  31. package/skills/devbooks-coder/references//351/224/231/350/257/257/347/240/201/350/247/204/350/214/203.md +463 -0
  32. package/skills/devbooks-delivery-workflow/SKILL.md +217 -0
  33. package/skills/devbooks-delivery-workflow/references//344/272/244/344/273/230/351/252/214/346/224/266/345/267/245/344/275/234/346/265/201.md +256 -0
  34. package/skills/devbooks-delivery-workflow/references//345/216/237/345/236/213-/347/224/237/344/272/247/345/217/214/350/275/250/346/250/241/345/274/217.md +168 -0
  35. package/skills/devbooks-delivery-workflow/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +133 -0
  36. package/skills/devbooks-delivery-workflow/scripts/ac-trace-check.sh +330 -0
  37. package/skills/devbooks-delivery-workflow/scripts/audit-scope.sh +262 -0
  38. package/skills/devbooks-delivery-workflow/scripts/change-check.sh +1040 -0
  39. package/skills/devbooks-delivery-workflow/scripts/change-codemod-scaffold.sh +135 -0
  40. package/skills/devbooks-delivery-workflow/scripts/change-evidence.sh +152 -0
  41. package/skills/devbooks-delivery-workflow/scripts/change-scaffold.sh +442 -0
  42. package/skills/devbooks-delivery-workflow/scripts/change-spec-delta-scaffold.sh +136 -0
  43. package/skills/devbooks-delivery-workflow/scripts/constitution-check.sh +237 -0
  44. package/skills/devbooks-delivery-workflow/scripts/env-match-check.sh +128 -0
  45. package/skills/devbooks-delivery-workflow/scripts/fitness-check.sh +387 -0
  46. package/skills/devbooks-delivery-workflow/scripts/guardrail-check.sh +519 -0
  47. package/skills/devbooks-delivery-workflow/scripts/handoff-check.sh +141 -0
  48. package/skills/devbooks-delivery-workflow/scripts/hygiene-check.sh +340 -0
  49. package/skills/devbooks-delivery-workflow/scripts/migrate-from-openspec.sh +385 -0
  50. package/skills/devbooks-delivery-workflow/scripts/migrate-to-v2-gates.sh +202 -0
  51. package/skills/devbooks-delivery-workflow/scripts/progress-dashboard.sh +319 -0
  52. package/skills/devbooks-delivery-workflow/scripts/prototype-promote.sh +341 -0
  53. package/skills/devbooks-delivery-workflow/scripts/spec-preview.sh +203 -0
  54. package/skills/devbooks-delivery-workflow/scripts/spec-promote.sh +118 -0
  55. package/skills/devbooks-delivery-workflow/scripts/spec-rollback.sh +124 -0
  56. package/skills/devbooks-delivery-workflow/scripts/spec-stage.sh +117 -0
  57. package/skills/devbooks-delivery-workflow/scripts/verify-all.sh +78 -0
  58. package/skills/devbooks-delivery-workflow/scripts/verify-npm-package.sh +123 -0
  59. package/skills/devbooks-delivery-workflow/scripts/verify-openspec-free.sh +81 -0
  60. package/skills/devbooks-delivery-workflow/scripts/verify-slash-commands.sh +146 -0
  61. package/skills/devbooks-delivery-workflow/templates/handoff.md +50 -0
  62. package/skills/devbooks-design-backport/SKILL.md +73 -0
  63. package/skills/devbooks-design-backport/references//345/233/236/345/206/231/350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +196 -0
  64. package/skills/devbooks-design-doc/SKILL.md +121 -0
  65. package/skills/devbooks-design-doc/references//345/276/256/346/234/215/345/212/241/350/256/276/350/256/241/346/270/205/345/215/225.md +149 -0
  66. package/skills/devbooks-design-doc/references//350/256/276/350/256/241/346/226/207/346/241/243/346/217/220/347/244/272/350/257/215.md +189 -0
  67. package/skills/devbooks-design-doc/references//351/232/220/347/247/201/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +240 -0
  68. package/skills/devbooks-entropy-monitor/SKILL.md +188 -0
  69. package/skills/devbooks-entropy-monitor/references//347/206/265/345/272/246/351/207/217/346/226/271/346/263/225/350/256/272.md +223 -0
  70. package/skills/devbooks-entropy-monitor/scripts/entropy-measure.sh +449 -0
  71. package/skills/devbooks-entropy-monitor/scripts/entropy-report.sh +303 -0
  72. package/skills/devbooks-entropy-monitor/templates/thresholds.json +99 -0
  73. package/skills/devbooks-federation/SKILL.md +264 -0
  74. package/skills/devbooks-federation/scripts/federation-check.sh +144 -0
  75. package/skills/devbooks-federation/templates/federation.yaml +89 -0
  76. package/skills/devbooks-impact-analysis/SKILL.md +135 -0
  77. package/skills/devbooks-impact-analysis/references//345/275/261/345/223/215/345/210/206/346/236/220/346/217/220/347/244/272/350/257/215.md +82 -0
  78. package/skills/devbooks-impact-analysis/scripts/graph-cache.sh +214 -0
  79. package/skills/devbooks-implementation-plan/SKILL.md +83 -0
  80. package/skills/devbooks-implementation-plan/references//347/274/226/347/240/201/350/256/241/345/210/222/346/217/220/347/244/272/350/257/215.md +99 -0
  81. package/skills/devbooks-index-bootstrap/SKILL.md +240 -0
  82. package/skills/devbooks-proposal-author/SKILL.md +83 -0
  83. 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 +66 -0
  84. package/skills/devbooks-proposal-challenger/SKILL.md +86 -0
  85. package/skills/devbooks-proposal-challenger/references//344/274/246/347/220/206/344/270/216/345/220/210/350/247/204/346/243/200/346/237/245/346/270/205/345/215/225.md +176 -0
  86. package/skills/devbooks-proposal-challenger/references//346/217/220/346/241/210/350/264/250/347/226/221/346/217/220/347/244/272/350/257/215.md +57 -0
  87. package/skills/devbooks-proposal-debate-workflow/SKILL.md +78 -0
  88. 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 +24 -0
  89. 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 +35 -0
  90. package/skills/devbooks-proposal-debate-workflow/scripts/proposal-debate-check.sh +102 -0
  91. package/skills/devbooks-proposal-judge/SKILL.md +78 -0
  92. package/skills/devbooks-proposal-judge/references//346/217/220/346/241/210/350/243/201/345/206/263/346/217/220/347/244/272/350/257/215.md +37 -0
  93. package/skills/devbooks-router/SKILL.md +346 -0
  94. package/skills/devbooks-spec-contract/SKILL.md +191 -0
  95. package/skills/devbooks-spec-contract/references/API/350/256/276/350/256/241/346/214/207/345/215/227.md +349 -0
  96. package/skills/devbooks-spec-contract/references//345/245/221/347/272/246/344/270/216/346/225/260/346/215/256/345/256/232/344/271/211/346/217/220/347/244/272/350/257/215.md +85 -0
  97. package/skills/devbooks-spec-contract/references//350/247/204/346/240/274/345/217/230/346/233/264/346/217/220/347/244/272/350/257/215.md +63 -0
  98. package/skills/devbooks-spec-contract/references//351/232/220/345/274/217/345/217/230/346/233/264/346/243/200/346/265/213/346/217/220/347/244/272/350/257/215.md +183 -0
  99. package/skills/devbooks-spec-contract/scripts/implicit-change-detect.sh +378 -0
  100. package/skills/devbooks-spec-gardener/SKILL.md +72 -0
  101. package/skills/devbooks-spec-gardener/references//350/247/204/346/240/274/345/233/255/344/270/201/346/217/220/347/244/272/350/257/215.md +41 -0
  102. package/skills/devbooks-test-owner/SKILL.md +172 -0
  103. package/skills/devbooks-test-owner/references//345/217/230/346/233/264/351/252/214/350/257/201/344/270/216/350/277/275/346/272/257/346/250/241/346/235/277.md +228 -0
  104. package/skills/devbooks-test-owner/references//345/274/202/346/255/245/347/263/273/347/273/237/346/265/213/350/257/225/347/255/226/347/225/245.md +316 -0
  105. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/344/273/243/347/240/201/346/217/220/347/244/272/350/257/215.md +208 -0
  106. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/345/210/206/345/261/202/347/255/226/347/225/245.md +281 -0
  107. package/skills/devbooks-test-owner/references//346/265/213/350/257/225/351/251/261/345/212/250.md +394 -0
  108. package/skills/devbooks-test-owner/references//350/247/243/344/276/235/350/265/226/346/212/200/346/234/257/351/200/237/346/237/245/350/241/250.md +432 -0
  109. package/skills/devbooks-test-reviewer/SKILL.md +189 -0
  110. package/templates/.devbooks/config.yaml +88 -0
  111. package/templates/claude-commands/devbooks/apply.md +38 -0
  112. package/templates/claude-commands/devbooks/archive.md +33 -0
  113. package/templates/claude-commands/devbooks/backport.md +19 -0
  114. package/templates/claude-commands/devbooks/bootstrap.md +19 -0
  115. package/templates/claude-commands/devbooks/c4.md +19 -0
  116. package/templates/claude-commands/devbooks/challenger.md +19 -0
  117. package/templates/claude-commands/devbooks/code.md +19 -0
  118. package/templates/claude-commands/devbooks/debate.md +19 -0
  119. package/templates/claude-commands/devbooks/delivery.md +19 -0
  120. package/templates/claude-commands/devbooks/design.md +19 -0
  121. package/templates/claude-commands/devbooks/entropy.md +19 -0
  122. package/templates/claude-commands/devbooks/federation.md +19 -0
  123. package/templates/claude-commands/devbooks/gardener.md +19 -0
  124. package/templates/claude-commands/devbooks/impact.md +19 -0
  125. package/templates/claude-commands/devbooks/index.md +19 -0
  126. package/templates/claude-commands/devbooks/judge.md +19 -0
  127. package/templates/claude-commands/devbooks/plan.md +19 -0
  128. package/templates/claude-commands/devbooks/proposal.md +19 -0
  129. package/templates/claude-commands/devbooks/quick.md +42 -0
  130. package/templates/claude-commands/devbooks/review.md +19 -0
  131. package/templates/claude-commands/devbooks/router.md +19 -0
  132. package/templates/claude-commands/devbooks/spec.md +19 -0
  133. package/templates/claude-commands/devbooks/test-review.md +19 -0
  134. package/templates/claude-commands/devbooks/test.md +19 -0
  135. package/templates/dev-playbooks/README.md +458 -0
  136. package/templates/dev-playbooks/changes/.gitkeep +1 -0
  137. package/templates/dev-playbooks/constitution.md +116 -0
  138. package/templates/dev-playbooks/project.md +96 -0
  139. package/templates/dev-playbooks/scripts/.gitkeep +1 -0
  140. package/templates/dev-playbooks/specs/_meta/anti-patterns/.gitkeep +2 -0
  141. package/templates/dev-playbooks/specs/_meta/glossary.md +47 -0
  142. package/templates/dev-playbooks/specs/_meta/project-profile.md +79 -0
  143. package/templates/dev-playbooks/specs/architecture/fitness-rules.md +95 -0
@@ -0,0 +1,96 @@
1
+ # 存量项目:初始化(项目画像 + 基线规格)工作流
2
+
3
+ 适用场景:你在一个已存在的项目里引入“规格化上下文协议”,但 `<truth-root>/` 为空或几乎为空。
4
+
5
+ 目标:一次性补齐“项目画像与约定 + 现状规格基线”,使后续变更能像“从一开始就按协议开发”一样稳定运行。
6
+
7
+ 核心原则:
8
+ - **不要一次性写全系统**:先覆盖“对外面”(API/CLI/事件/配置/Schema),再逐步补内核。
9
+ - **证据优先**:每条规格都要能指向代码/测试/日志/运行方式;不确定就写 `TBD` + 验证计划。
10
+ - **先固化现状,再讨论重构**:基线阶段尽量不引入行为变化;避免“边补 specs 边改行为”导致真理源漂移。
11
+
12
+ ---
13
+
14
+ ## Step 0:确定基线范围(强制)
15
+
16
+ 做三选一(只选一个,避免失控):
17
+ - A) **对外契约优先**:API/事件/Schema/配置格式(最推荐)
18
+ - B) **关键链路优先**:登录/支付/下单/编译发布等 1–3 条核心业务链路
19
+ - C) **模块边界优先**:依赖方向/分层/禁止循环(配合 C4 + fitness tests)
20
+
21
+ 输出(写进 `<change-root>/<baseline-id>/proposal.md`):
22
+ - In / Out
23
+ - 风险与已知未知(<=5 条)
24
+ - “本次基线不做什么”(Non-goals)
25
+
26
+ ---
27
+
28
+ ## Step 0.5:一次性产出(推荐做法)
29
+
30
+ 直接使用一条提示词完成“项目画像 + 基线规格 + verification 草案”:
31
+ - 本 Skill 的 `references/9 存量项目初始化提示词.md`
32
+
33
+ 该提示词会同时产出:
34
+ - `<truth-root>/_meta/project-profile.md`(技术栈/命令/约定/闸门/契约入口)
35
+ - `<truth-root>/_meta/glossary.md`(可选:统一语言表)
36
+ - `<change-root>/<baseline-id>/...`(proposal/design/specs delta/verification)
37
+
38
+ ---
39
+
40
+ ## Step 1:盘点能力(Capability Inventory)
41
+
42
+ 把存量系统按 MECE 聚类成 3–8 个 capabilities(示例):
43
+ - `auth`、`billing`、`search`、`sync`、`config`、`observability`
44
+
45
+ 每个 capability 至少给出:
46
+ - 对外入口(API/CLI/事件/topic)
47
+ - 核心数据/Schema
48
+ - 依赖方向(调用谁/被谁调用)
49
+
50
+ 产物位置(推荐):
51
+ - `<change-root>/<baseline-id>/design.md`(可选,但强烈建议有一页“现状总结”)
52
+
53
+ ---
54
+
55
+ ## Step 2:写基线 spec deltas(只用 ADDED)
56
+
57
+ 在 `<change-root>/<baseline-id>/specs/<capability>/spec.md` 写**现状规格**:
58
+ - 优先只用“新增/ADDED”类 section(具体标题以 `<truth-root>/_meta/project-profile.md` 的格式约定为准)
59
+ - 每条 Requirement/需求 至少 1 个 Scenario/场景
60
+ - Requirement/Scenario 必须是“可观察”的(输入/输出/错误语义/不变量)
61
+
62
+ 注意:
63
+ - 发现不确定:写 `TBD`,并把验证动作加入 `verification.md` 的计划区(不要臆测补齐)。
64
+ - 发现明显 bug:不要在基线阶段顺手修;另起一个 change 做修复(避免基线混入行为变化)。
65
+
66
+ ---
67
+
68
+ ## Step 3:补最小验证锚点(建议)
69
+
70
+ 目标不是“全测覆盖”,而是给未来演进留抓手:
71
+ - 对外契约:优先 contract tests(schema shape / backward compatibility)
72
+ - 关键链路:最小 smoke/integration
73
+ - 结构红线:fitness tests(分层/禁止循环/禁止越界依赖)
74
+ - 若预计会做重构/迁移:优先加 Snapshot/Golden Master 作为行为指纹
75
+
76
+ 产物位置:
77
+ - `<change-root>/<baseline-id>/verification.md`(计划 + 追溯矩阵 + MANUAL-*)
78
+ - `tests/**`(按仓库惯例)
79
+ - `contracts/**`(如果你维护契约库)
80
+
81
+ ---
82
+
83
+ ## Step 4:合并进当前真理源(<truth-root>/)
84
+
85
+ 把基线 change 的 `<truth-root>/**` 合并进 `<truth-root>/**`:
86
+ - 若你的上下文协议提供 archive/merge 命令:用命令完成合并
87
+ - 否则:人工合并也可以,但要保持“变更包 -> 当前真理”的单向合并语义
88
+
89
+ ---
90
+
91
+ ## 完成判据(DoD)
92
+
93
+ - `<truth-root>/` 至少包含 1–3 个核心 capabilities 的 spec.md
94
+ - 每个 spec 至少 3–10 条 Requirements(现状级别即可)
95
+ - 至少 1 类锚点落地(contract 或 smoke 或 fitness 任选其一)
96
+ - 未覆盖部分明确写了 Non-goals + 后续补齐计划
@@ -0,0 +1,115 @@
1
+ # 存量项目初始化提示词
2
+
3
+ > **角色设定**:你是遗留系统现代化领域的**最强大脑**——融合了 Michael Feathers(遗留代码处理)、Sam Newman(单体到微服务迁移)、Martin Fowler(重构与演进式架构)的智慧。你的基线分析必须达到这些大师级专家的水准。
4
+
5
+ 最高指示(优先级最高):
6
+ - 在执行本提示词前,先阅读 `_shared/references/通用守门协议.md` 并遵循其中所有协议。
7
+
8
+ 目录根(强制):
9
+ - 在写任何文件前,必须先确定 `<truth-root>` 与 `<change-root>` 的实际路径;禁止猜测。
10
+ - 若存在 `dev-playbooks/project.md`(或目录 `dev-playbooks/`):视为 DevBooks 项目,默认:
11
+ - `<truth-root>` = `dev-playbooks/specs`
12
+ - `<change-root>` = `dev-playbooks/changes`
13
+ - 必须先阅读 `dev-playbooks/project.md`(如存在)并遵循其中说明。
14
+ - 否则:必须先询问用户确认 `<truth-root>` 与 `<change-root>`;用户未确认不得落盘。
15
+
16
+ 你是“存量项目初始化负责人(Brownfield Bootstrapper)”。你的任务是在**存量项目**中,当 `<truth-root>/` 为空或缺失时,一次性补齐:
17
+ 1) 项目画像与约定(技术栈/命令/边界/闸门/契约入口)
18
+ 2) 现状规格基线(baseline specs,以 ADDED 为主)
19
+
20
+ 最终效果:后续任何变更都能像“项目从一开始就按规格化流程开发”一样,有稳定真理源、稳定落点与可验证锚点。
21
+
22
+ 输入材料(由我提供):
23
+ - 代码库(只读分析,允许运行只读命令)
24
+ - 现有对外资料(如有):README/接口文档/部署说明/配置说明
25
+ - 现有 tests(如有)
26
+ - 我指定的基线范围(对外契约优先/关键链路优先/模块边界优先)
27
+
28
+ 产物目标(目录约定,协议无关):
29
+ - 项目画像(当前真理的一部分):
30
+ - `<truth-root>/_meta/project-profile.md`
31
+ - 统一语言表(可选但推荐):
32
+ - `<truth-root>/_meta/glossary.md`
33
+ - 变更包:`<change-root>/<baseline-id>/`
34
+ - `proposal.md`:基线范围、为什么先做基线、In/Out、风险与未知
35
+ - `design.md`(可选但推荐):现状盘点(capability inventory)与边界/依赖方向
36
+ - `<truth-root>/<capability>/spec.md`:基线 spec deltas(只用 ADDED Requirements)
37
+ - `verification.md`:最小验证锚点计划 + 追溯矩阵 + MANUAL-*
38
+ - 当前真理源:`<truth-root>/`(本阶段先不直接写入;由后续“归档/合并”动作把基线变更合并进去)
39
+
40
+ 硬约束(必须遵守):
41
+ 1) **只写现状,不做重构**:本次初始化不引入行为变化建议,不输出实现计划。
42
+ 2) **基线 delta 以 ADDED 为主**:当 `<truth-root>/` 为空时,优先只写 ADDED,避免 MODIFIED/RENAMED/REMOVED(这些通常要求已有当前真理)。
43
+ 3) **delta 格式必须匹配项目所用协议的校验器**:
44
+ - 先在仓库里查找“delta 标题/场景标题”的既有模板或约定(例如搜索 `ADDED Requirements`/`新增需求`/`Scenario:`/`场景:`)
45
+ - 若仍不确定:不要臆测;在 `<truth-root>/_meta/project-profile.md` 标注 `TBD` 并给出验证动作(例如运行协议的 validate 命令)
46
+ 4) **证据优先**:任何不确定的地方必须标注 `TBD`,并在 `verification.md` 写清验证动作;禁止臆测补齐。
47
+ 5) **MECE 聚类**:capability 控制在 3–8 个;每个 capability 的 Requirements 控制在 3–15 条(先薄后厚)。
48
+ 6) **每条 Requirement 至少 1 个 Scenario**,并尽量在 Scenario 末尾补一行 Evidence(指向代码入口/测试/命令/日志关键字)。
49
+ 7) **遗留安全网优先**:若后续计划涉及重构/迁移,`verification.md` 中优先加入 Snapshot/Golden Master 测试策略。
50
+
51
+ `<truth-root>/_meta/project-profile.md` 写作要求(必须遵守):
52
+ 1) 只写你能从仓库证据推导出的结论;不确定必须标注 `TBD` 并给出验证动作(命令/文件路径/下一步)。
53
+ 2) 不改业务代码、不改 tests、不引入依赖;你只产出文档。
54
+ 3) `docs/` 只用于对外说明;本文件属于开发/代理协作的内部真理源,必须放在 `<truth-root>/`。
55
+ 4) 不要把零散建议写成“强制规范”;强制约定必须对应现有事实或现有 CI/工具约束。
56
+ 5) 必须包含“规格/变更包格式约定”:记录本项目 delta spec 的标题与场景标题写法(用于后续所有 spec delta 提示词保持一致)。
57
+
58
+ `<truth-root>/_meta/project-profile.md` 推荐结构(建议严格遵循):
59
+ 1) 项目概览
60
+ - 目标用户/使用场景(从 README/代码推断)
61
+ - 主要能力清单(3–10 条,按 MECE 聚类)
62
+ 2) 技术栈与运行时
63
+ - 语言/版本、主要框架、包管理/构建工具
64
+ - 关键依赖与基础设施(DB/缓存/队列/第三方)
65
+ 3) **Bounded Contexts(限界上下文)**(新增,必填)
66
+ - 识别项目中的业务边界(每个 Context 是一个自治的业务领域)
67
+ - 每个 Context 列出:
68
+ - 名称与职责(1-2 句话)
69
+ - 包含的核心 Entity(标注 `@Entity`)
70
+ - 与其他 Context 的关系(上游/下游/共享/隔离)
71
+ - 若存在外部系统集成:标注 ACL(Anti-Corruption Layer)位置
72
+ - 示例:
73
+ ```
74
+ | Context | 职责 | 核心 Entity | 上游依赖 | 下游消费者 | ACL |
75
+ |---------|------|-------------|----------|------------|-----|
76
+ | 订单 | 处理交易生命周期 | Order, OrderItem | 商品, 用户 | 支付, 物流 | 支付网关适配器 |
77
+ | 商品 | 管理商品目录 | Product, Category | - | 订单, 搜索 | - |
78
+ ```
79
+ 4) 仓库结构与模块边界(约定)
80
+ - 目录树的"职责解释"(只解释顶层与关键目录)
81
+ - 依赖方向/分层(如果看得出来)
82
+ 5) 开发与调试(本地)
83
+ - 如何运行/如何测试/如何构建(给出命令;未知则写 TBD)
84
+ - 关键配置与环境变量(列出名称与用途;敏感值不写)
85
+ 6) 质量闸门(DoD 对齐)
86
+ - tests 分层(unit/contract/integration/e2e)是否存在、如何跑
87
+ - 静态检查(lint/typecheck/build)是否存在、如何跑
88
+ - 安全与合规(SAST/secret scan)是否存在、如何跑
89
+ 7) 对外契约与数据定义(现状)
90
+ - API/事件/Schema/配置格式的入口位置(文件夹/文件名/生成方式)
91
+ 8) 规格与变更包格式约定(强制)
92
+ - spec delta 的 section 标题(例如 `## ADDED Requirements`/`## 新增需求` 等)
93
+ - scenario 标题写法(例如 `#### Scenario:`/`#### 场景:` 等)
94
+ - Requirement 标题写法(例如 `### Requirement:`/`### 需求:` 等)
95
+ 9) 已知风险与高频坑(只收高 ROI)
96
+ - 只记录"跨模块一致性/隐性约束/易漏同步点"
97
+ - 每条必须给出"预防锚点"(测试/静态检查/检查清单)
98
+ 10) Open Questions(<=5)
99
+
100
+ 输出要求(按顺序):
101
+ 1) 先输出你将创建/更新的文件路径清单(只列路径)
102
+ 2) 输出 `<truth-root>/_meta/project-profile.md` 内容(Markdown)
103
+ 2.1) 若能从仓库识别稳定术语:输出 `<truth-root>/_meta/glossary.md` 草案
104
+ 3) 输出 `proposal.md` 内容(Markdown)
105
+ 4) 输出 `design.md` 内容(若你认为必要;否则输出“不需要”的理由)
106
+ 5) 对每个 capability 输出 `<change-root>/<baseline-id>/specs/<capability>/spec.md` 的 delta 内容(优先只包含 ADDED Requirements)
107
+ 6) 输出 `verification.md` 草案(至少包含:主线计划区、追溯矩阵、MANUAL-*)
108
+ 7) 最后给出一个“合并建议”:如何把本基线变更合并进 `<truth-root>/`(如果你知道项目使用的协议命令,可以顺带给出命令;不知道就给出人工合并步骤)
109
+
110
+ 现在开始执行,不要输出额外解释。
111
+
112
+ 注意事项:
113
+ - 本文档中的 `<truth-root>` 与 `<change-root>` 是**占位符**,实际取值必须来自项目的上下文协议/指路牌。
114
+ - DevBooks 项目默认取值:`dev-playbooks/specs` 与 `dev-playbooks/changes`。
115
+ - 只有在用户明确确认时才允许使用默认 `specs/` 与 `changes/`。
@@ -0,0 +1,42 @@
1
+ # glossary.md 模板(真理源元信息)
2
+
3
+ > 推荐路径:`<truth-root>/_meta/glossary.md`
4
+ >
5
+ > 目标:统一业务语言,避免同义不同名导致的规格与代码漂移。
6
+
7
+ ---
8
+ owner: `<role/agent>`
9
+ last_verified: `YYYY-MM-DD`
10
+ status: `Active | Deprecated | Draft`
11
+ freshness_check: `3 Months`
12
+ ---
13
+
14
+ ## 术语表(Ubiquitous Language)
15
+
16
+ | 术语(中文) | 术语(英文) | 代码名/实体 | 定义(业务含义) | 同义词(允许) | 禁用词(避免) | 备注/例子 |
17
+ |---|---|---|---|---|---|---|
18
+ | 订单 | Order | Order | 用户完成支付后生成的交易记录 | 订单单 | Deal/Trade | 示例:订单号、订单状态 |
19
+ | 客户 | Customer | Customer | 与平台发生交易的自然人/企业 | 用户 | Account | 示例:客户等级、客户画像 |
20
+
21
+ ## 领域建模术语(Domain Modeling Terms)
22
+
23
+ > 以下术语用于 `design.md` 的领域模型章节,帮助区分不同类型的对象。
24
+
25
+ | 术语 | 定义 | 识别标准 | 示例 |
26
+ |------|------|----------|------|
27
+ | **Entity(实体)** | 有唯一标识、可变状态、需要跟踪生命周期的对象 | ① 有业务意义的 ID ② 状态可变 ③ 需要持久化 | Order、Customer、Product |
28
+ | **Value Object(值对象)** | 无唯一标识、不可变、描述性的对象 | ① 无 ID ② 不可变 ③ 可自由复制/共享 | Address、Money、DateRange、Email |
29
+ | **Invariant(固定规则)** | 必须始终成立的业务约束,任何操作都不能破坏 | ① 跨属性约束 ② 违反即数据错误 | `订单总额 = SUM(明细金额)`、`库存 >= 0` |
30
+ | **Business Rule(业务规则)** | 可配置/可变的业务策略,违反时有明确的处理逻辑 | ① 可能随业务调整 ② 违反有处理路径 | `会员折扣率`、`超时自动取消` |
31
+ | **ACL(Anti-Corruption Layer)** | 隔离外部系统模型与内部模型的适配层 | ① 外部 API 调用入口 ② 模型转换逻辑 | 支付网关适配器、第三方物流接口 |
32
+ | **Bounded Context(限界上下文)** | 自治的业务领域边界,内部使用统一术语 | ① 独立部署/演进 ② 术语边界清晰 | 订单上下文、商品上下文、用户上下文 |
33
+
34
+ ## 使用规则
35
+
36
+ - 设计/规格/测试/代码必须使用此表中的术语;禁止自创新词
37
+ - 若需要新增术语,先更新本文件,再产出 design/spec/tests
38
+ - **Entity vs Value Object 判断**:
39
+ - 问"这个对象需要唯一标识吗?" → 是则 Entity,否则 Value Object
40
+ - 问"这个对象的状态会变化吗?" → 是则 Entity,否则 Value Object
41
+ - 问"两个对象所有属性相同时是否等价?" → 是则 Value Object,否则 Entity
42
+ - **Invariant 标注**:在 `design.md` 中以 `[Invariant]` 前缀标注,在代码中应有对应断言
@@ -0,0 +1,357 @@
1
+ #!/bin/bash
2
+ # DevBooks COD 模型增量更新脚本
3
+ # 用途:持久化并增量更新代码地图产物(模块依赖图、热点、领域概念)
4
+
5
+ set -e
6
+
7
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
8
+
9
+ # 颜色输出
10
+ RED='\033[0;31m'
11
+ GREEN='\033[0;32m'
12
+ YELLOW='\033[1;33m'
13
+ BLUE='\033[0;34m'
14
+ NC='\033[0m'
15
+
16
+ echo_info() { echo -e "${GREEN}[COD]${NC} $1"; }
17
+ echo_warn() { echo -e "${YELLOW}[COD]${NC} $1"; }
18
+ echo_error() { echo -e "${RED}[COD]${NC} $1"; }
19
+
20
+ # 参数解析
21
+ PROJECT_ROOT="."
22
+ TRUTH_ROOT=""
23
+ FORCE=false
24
+ QUIET=false
25
+
26
+ while [[ $# -gt 0 ]]; do
27
+ case $1 in
28
+ --project-root) PROJECT_ROOT="$2"; shift 2 ;;
29
+ --truth-root) TRUTH_ROOT="$2"; shift 2 ;;
30
+ --force) FORCE=true; shift ;;
31
+ --quiet) QUIET=true; shift ;;
32
+ -h|--help)
33
+ echo "用法: cod-update.sh [options]"
34
+ echo ""
35
+ echo "Options:"
36
+ echo " --project-root <dir> 项目根目录 (默认: .)"
37
+ echo " --truth-root <dir> 真理目录 (自动检测)"
38
+ echo " --force 强制全量更新"
39
+ echo " --quiet 静默模式"
40
+ exit 0
41
+ ;;
42
+ *) echo_error "未知参数: $1"; exit 1 ;;
43
+ esac
44
+ done
45
+
46
+ cd "$PROJECT_ROOT"
47
+
48
+ # 自动检测 truth-root
49
+ if [ -z "$TRUTH_ROOT" ]; then
50
+ if [ -f "dev-playbooks/project.md" ]; then
51
+ TRUTH_ROOT="dev-playbooks/specs"
52
+ elif [ -f ".devbooks/config.yaml" ]; then
53
+ TRUTH_ROOT=$(grep 'truth_root:' .devbooks/config.yaml | awk '{print $2}' | tr -d '"' || echo "specs")
54
+ else
55
+ TRUTH_ROOT="specs"
56
+ fi
57
+ fi
58
+
59
+ # 确保目录存在
60
+ mkdir -p "$TRUTH_ROOT/architecture"
61
+ mkdir -p "$TRUTH_ROOT/_meta"
62
+ mkdir -p ".devbooks/cache/cod"
63
+
64
+ # 缓存文件路径
65
+ CACHE_DIR=".devbooks/cache/cod"
66
+ HASH_FILE="$CACHE_DIR/source-hash.txt"
67
+ ARCHITECTURE_CACHE="$CACHE_DIR/architecture.json"
68
+ HOTSPOTS_CACHE="$CACHE_DIR/hotspots.json"
69
+ CONCEPTS_CACHE="$CACHE_DIR/concepts.json"
70
+
71
+ # 计算源文件 hash(用于检测变更)
72
+ calculate_source_hash() {
73
+ # 只计算源代码文件的 hash,忽略 node_modules 等
74
+ find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \
75
+ -o -name "*.py" -o -name "*.go" -o -name "*.rs" -o -name "*.java" \) \
76
+ ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/build/*" \
77
+ -exec md5sum {} \; 2>/dev/null | sort | md5sum | cut -d' ' -f1
78
+ }
79
+
80
+ # 检查是否需要更新
81
+ needs_update() {
82
+ if [ "$FORCE" = true ]; then
83
+ return 0
84
+ fi
85
+
86
+ if [ ! -f "$HASH_FILE" ]; then
87
+ return 0
88
+ fi
89
+
90
+ local old_hash=$(cat "$HASH_FILE")
91
+ local new_hash=$(calculate_source_hash)
92
+
93
+ if [ "$old_hash" != "$new_hash" ]; then
94
+ return 0
95
+ fi
96
+
97
+ # 检查产物是否存在
98
+ if [ ! -f "$TRUTH_ROOT/architecture/module-graph.md" ]; then
99
+ return 0
100
+ fi
101
+
102
+ return 1
103
+ }
104
+
105
+ # 使用 CKB MCP 获取架构(如果可用)
106
+ fetch_architecture_via_mcp() {
107
+ # 检查 CKB 是否可用(通过检查 index.scip)
108
+ if [ ! -f "index.scip" ]; then
109
+ echo_warn "SCIP 索引不存在,跳过图基架构分析"
110
+ return 1
111
+ fi
112
+
113
+ # 这里无法直接调用 MCP,但可以检查缓存
114
+ if [ -f "$ARCHITECTURE_CACHE" ]; then
115
+ local cache_age=$(( ($(date +%s) - $(stat -f%m "$ARCHITECTURE_CACHE" 2>/dev/null || stat -c%Y "$ARCHITECTURE_CACHE" 2>/dev/null)) ))
116
+ if [ $cache_age -lt 3600 ]; then # 1小时内的缓存有效
117
+ echo_info "使用缓存的架构数据"
118
+ return 0
119
+ fi
120
+ fi
121
+
122
+ return 1
123
+ }
124
+
125
+ # 基于文件系统生成模块依赖图(降级方案)
126
+ generate_module_graph_fallback() {
127
+ local output="$TRUTH_ROOT/architecture/module-graph.md"
128
+ local temp_file=$(mktemp)
129
+
130
+ echo_info "生成模块依赖图(文件系统分析)..."
131
+
132
+ cat > "$temp_file" << 'EOF'
133
+ # 模块依赖图
134
+
135
+ > 自动生成于 $(date +%Y-%m-%d),基于文件系统分析
136
+
137
+ ## 目录结构
138
+
139
+ ```
140
+ EOF
141
+
142
+ # 生成目录树
143
+ if command -v tree &> /dev/null; then
144
+ tree -d -L 3 -I 'node_modules|.git|dist|build|__pycache__|.venv|vendor' >> "$temp_file" 2>/dev/null || true
145
+ else
146
+ find . -type d -maxdepth 3 \
147
+ ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" \
148
+ ! -path "*/build/*" ! -path "*/__pycache__/*" ! -path "*/.venv/*" \
149
+ 2>/dev/null | head -50 >> "$temp_file"
150
+ fi
151
+
152
+ echo '```' >> "$temp_file"
153
+ echo "" >> "$temp_file"
154
+
155
+ # 分析导入关系
156
+ echo "## 主要依赖关系" >> "$temp_file"
157
+ echo "" >> "$temp_file"
158
+ echo "| 模块 | 依赖数 | 被依赖数 |" >> "$temp_file"
159
+ echo "|------|--------|----------|" >> "$temp_file"
160
+
161
+ # TypeScript/JavaScript 项目
162
+ if [ -f "package.json" ]; then
163
+ for dir in src lib app; do
164
+ if [ -d "$dir" ]; then
165
+ local import_count=$(grep -r "^import\|^from" "$dir" 2>/dev/null | wc -l || echo 0)
166
+ local export_count=$(grep -r "^export" "$dir" 2>/dev/null | wc -l || echo 0)
167
+ echo "| \`$dir/\` | $import_count | $export_count |" >> "$temp_file"
168
+ fi
169
+ done
170
+ fi
171
+
172
+ # Python 项目
173
+ if [ -f "pyproject.toml" ] || [ -f "setup.py" ]; then
174
+ for dir in src lib app; do
175
+ if [ -d "$dir" ]; then
176
+ local import_count=$(grep -r "^import\|^from" "$dir" --include="*.py" 2>/dev/null | wc -l || echo 0)
177
+ echo "| \`$dir/\` | $import_count | - |" >> "$temp_file"
178
+ fi
179
+ done
180
+ fi
181
+
182
+ echo "" >> "$temp_file"
183
+ echo "---" >> "$temp_file"
184
+ echo "" >> "$temp_file"
185
+ echo "> 提示:运行 \`devbooks-index-bootstrap\` 生成 SCIP 索引以获得更精确的依赖分析" >> "$temp_file"
186
+
187
+ # 只在内容变化时更新
188
+ if [ -f "$output" ]; then
189
+ if ! diff -q "$temp_file" "$output" > /dev/null 2>&1; then
190
+ mv "$temp_file" "$output"
191
+ echo_info "模块依赖图已更新: $output"
192
+ else
193
+ rm "$temp_file"
194
+ [ "$QUIET" = false ] && echo_info "模块依赖图无变化"
195
+ fi
196
+ else
197
+ mv "$temp_file" "$output"
198
+ echo_info "模块依赖图已创建: $output"
199
+ fi
200
+ }
201
+
202
+ # 生成热点文件报告
203
+ generate_hotspots() {
204
+ local output="$TRUTH_ROOT/architecture/hotspots.md"
205
+ local temp_file=$(mktemp)
206
+
207
+ echo_info "生成技术债热点..."
208
+
209
+ cat > "$temp_file" << EOF
210
+ # 技术债热点
211
+
212
+ > 自动生成于 $(date +%Y-%m-%d)
213
+ > 热点分数 = 变更频率 × 复杂度估算
214
+
215
+ ## 高频变更文件(近 30 天)
216
+
217
+ | 文件 | 变更次数 | 行数 | 风险等级 |
218
+ |------|----------|------|----------|
219
+ EOF
220
+
221
+ # 使用 Git 历史分析
222
+ if [ -d ".git" ]; then
223
+ git log --since="30 days ago" --name-only --pretty=format: 2>/dev/null | \
224
+ grep -v '^$' | \
225
+ grep -v 'node_modules\|dist\|build\|\.lock\|package-lock' | \
226
+ sort | uniq -c | sort -rn | head -15 | \
227
+ while read count file; do
228
+ if [ -f "$file" ]; then
229
+ local lines=$(wc -l < "$file" 2>/dev/null || echo 0)
230
+ local risk="🟢 Normal"
231
+ if [ $count -gt 10 ] && [ $lines -gt 300 ]; then
232
+ risk="🔴 Critical"
233
+ elif [ $count -gt 5 ] && [ $lines -gt 200 ]; then
234
+ risk="🟡 High"
235
+ fi
236
+ echo "| \`$file\` | $count | $lines | $risk |"
237
+ fi
238
+ done >> "$temp_file"
239
+ else
240
+ echo "| (无 Git 历史) | - | - | - |" >> "$temp_file"
241
+ fi
242
+
243
+ echo "" >> "$temp_file"
244
+ echo "## 大文件(潜在复杂度)" >> "$temp_file"
245
+ echo "" >> "$temp_file"
246
+ echo "| 文件 | 行数 |" >> "$temp_file"
247
+ echo "|------|------|" >> "$temp_file"
248
+
249
+ find . -type f \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.py" -o -name "*.go" \) \
250
+ ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" \
251
+ -exec wc -l {} \; 2>/dev/null | \
252
+ sort -rn | head -10 | \
253
+ while read lines file; do
254
+ echo "| \`$file\` | $lines |"
255
+ done >> "$temp_file"
256
+
257
+ # 只在内容变化时更新
258
+ if [ -f "$output" ]; then
259
+ # 比较时忽略日期行
260
+ if ! diff <(tail -n +4 "$temp_file") <(tail -n +4 "$output") > /dev/null 2>&1; then
261
+ mv "$temp_file" "$output"
262
+ echo_info "热点报告已更新: $output"
263
+ else
264
+ rm "$temp_file"
265
+ [ "$QUIET" = false ] && echo_info "热点报告无变化"
266
+ fi
267
+ else
268
+ mv "$temp_file" "$output"
269
+ echo_info "热点报告已创建: $output"
270
+ fi
271
+ }
272
+
273
+ # 生成领域概念(基于命名分析)
274
+ generate_key_concepts() {
275
+ local output="$TRUTH_ROOT/_meta/key-concepts.md"
276
+ local temp_file=$(mktemp)
277
+
278
+ echo_info "生成领域概念..."
279
+
280
+ cat > "$temp_file" << EOF
281
+ # 领域概念(Key Concepts)
282
+
283
+ > 自动生成于 $(date +%Y-%m-%d)
284
+ > 基于代码命名模式分析
285
+
286
+ ## 核心类/接口
287
+
288
+ | 概念 | 出现次数 | 典型位置 |
289
+ |------|----------|----------|
290
+ EOF
291
+
292
+ # 提取 PascalCase 命名(类名)
293
+ grep -rho '\b[A-Z][a-z]*[A-Z][a-zA-Z]*\b' \
294
+ --include="*.ts" --include="*.tsx" --include="*.js" --include="*.py" --include="*.go" \
295
+ . 2>/dev/null | \
296
+ grep -v 'node_modules\|dist\|build' | \
297
+ sort | uniq -c | sort -rn | head -15 | \
298
+ while read count name; do
299
+ local location=$(grep -rl "\b$name\b" --include="*.ts" --include="*.py" . 2>/dev/null | head -1 || echo "-")
300
+ echo "| \`$name\` | $count | \`$location\` |"
301
+ done >> "$temp_file"
302
+
303
+ echo "" >> "$temp_file"
304
+ echo "## 常见动词(操作)" >> "$temp_file"
305
+ echo "" >> "$temp_file"
306
+ echo "| 动词 | 出现次数 |" >> "$temp_file"
307
+ echo "|------|----------|" >> "$temp_file"
308
+
309
+ # 提取函数名中的动词
310
+ grep -rho '\b\(get\|set\|create\|update\|delete\|fetch\|save\|load\|process\|handle\|validate\)[A-Za-z]*\b' \
311
+ --include="*.ts" --include="*.js" --include="*.py" \
312
+ . 2>/dev/null | \
313
+ grep -v 'node_modules' | \
314
+ sed 's/[A-Z]/ /g' | awk '{print tolower($1)}' | \
315
+ sort | uniq -c | sort -rn | head -10 | \
316
+ while read count verb; do
317
+ echo "| \`$verb\` | $count |"
318
+ done >> "$temp_file"
319
+
320
+ # 只在内容变化时更新
321
+ if [ -f "$output" ]; then
322
+ if ! diff <(tail -n +4 "$temp_file") <(tail -n +4 "$output") > /dev/null 2>&1; then
323
+ mv "$temp_file" "$output"
324
+ echo_info "领域概念已更新: $output"
325
+ else
326
+ rm "$temp_file"
327
+ [ "$QUIET" = false ] && echo_info "领域概念无变化"
328
+ fi
329
+ else
330
+ mv "$temp_file" "$output"
331
+ echo_info "领域概念已创建: $output"
332
+ fi
333
+ }
334
+
335
+ # 主流程
336
+ main() {
337
+ if needs_update; then
338
+ echo_info "检测到代码变更,更新 COD 产物..."
339
+
340
+ # 尝试使用 MCP,否则降级
341
+ if ! fetch_architecture_via_mcp; then
342
+ generate_module_graph_fallback
343
+ fi
344
+
345
+ generate_hotspots
346
+ generate_key_concepts
347
+
348
+ # 保存新的 hash
349
+ calculate_source_hash > "$HASH_FILE"
350
+
351
+ echo_info "COD 产物更新完成"
352
+ else
353
+ [ "$QUIET" = false ] && echo_info "代码无变更,跳过更新"
354
+ fi
355
+ }
356
+
357
+ main