@namewta/speculo 0.3.0 → 0.3.2

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 (149) hide show
  1. package/README.md +1 -2
  2. package/dist/src/cli.js +40 -6
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.js +5 -0
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/skills-mirror.d.ts +38 -0
  7. package/dist/src/skills-mirror.js +160 -0
  8. package/dist/src/skills-mirror.js.map +1 -0
  9. package/package.json +3 -2
  10. package/template/canonical/README.md +7 -1
  11. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +2040 -0
  12. package/template/canonical/canonical-specdev-goal-plan.md +1379 -0
  13. package/template/canonical/canonical-specdev-grill-with-docs.md +848 -285
  14. package/template/canonical/canonical-specdev-spec.md +1061 -46
  15. package/template/canonical/canonical-specdev-tickets.md +1529 -175
  16. package/template/canonical/canonical-specdev-wayfinder.md +677 -107
  17. package/template/commands/git-repository-audit.md +682 -0
  18. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +69 -36
  19. package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +15 -0
  20. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +32 -0
  21. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +51 -51
  22. package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +64 -0
  23. package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +252 -0
  24. package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +90 -0
  25. package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +80 -0
  26. package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +107 -0
  27. package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +95 -0
  28. package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +62 -0
  29. package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +132 -0
  30. package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +116 -0
  31. package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +135 -0
  32. package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +47 -0
  33. package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +147 -0
  34. package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +92 -0
  35. package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +100 -30
  36. package/template/workflows/specdev/G-grill-with-docs/adr-format.md +22 -77
  37. package/template/workflows/specdev/G-grill-with-docs/context-format.md +27 -53
  38. package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +6 -82
  39. package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +32 -49
  40. package/template/workflows/specdev/G-grill-with-docs/log-format.md +16 -98
  41. package/template/workflows/specdev/I-implement/I-implement.md +168 -52
  42. package/template/workflows/specdev/I-implement/code-review-process.md +10 -76
  43. package/template/workflows/specdev/I-implement/codebase-design-glossary.md +12 -109
  44. package/template/workflows/specdev/I-implement/deepening.md +12 -32
  45. package/template/workflows/specdev/I-implement/design-it-twice.md +6 -41
  46. package/template/workflows/specdev/I-implement/evidence-template.md +69 -0
  47. package/template/workflows/specdev/I-implement/execution-preflight.md +20 -0
  48. package/template/workflows/specdev/I-implement/tdd-examples.md +10 -135
  49. package/template/workflows/specdev/I-implement/tdd-rules.md +12 -28
  50. package/template/workflows/specdev/I-init-setup/I-init-setup.md +81 -86
  51. package/template/workflows/specdev/I-init-setup/change-status-template.json +15 -0
  52. package/template/workflows/specdev/I-init-setup/config-template.json +26 -0
  53. package/template/workflows/specdev/I-init-setup/domain-layout-template.md +23 -0
  54. package/template/workflows/specdev/I-init-setup/status-labels-template.md +55 -0
  55. package/template/workflows/specdev/I-init-setup/status-template.json +7 -0
  56. package/template/workflows/specdev/I-init-setup/tracking-template.md +10 -0
  57. package/template/workflows/specdev/INDEX.md +165 -82
  58. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +108 -44
  59. package/template/workflows/specdev/P-goal-plan/completion-control.md +79 -0
  60. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +105 -0
  61. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +115 -0
  62. package/template/workflows/specdev/P-goal-plan/planning-modes.md +70 -0
  63. package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +103 -40
  64. package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +58 -0
  65. package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +68 -0
  66. package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +11 -0
  67. package/template/workflows/specdev/S-spec/S-spec.md +103 -49
  68. package/template/workflows/specdev/S-spec/spec-readiness.md +16 -0
  69. package/template/workflows/specdev/S-spec/spec-template.md +95 -0
  70. package/template/workflows/specdev/T-tickets/T-tickets.md +146 -133
  71. package/template/workflows/specdev/T-tickets/decomposition-rules.md +56 -0
  72. package/template/workflows/specdev/T-tickets/ticket-readiness.md +45 -0
  73. package/template/workflows/specdev/T-tickets/ticket-template.md +124 -0
  74. package/template/workflows/specdev/T-tickets/tickets-map-template.md +52 -50
  75. package/template/workflows/specdev/T-triage/T-triage.md +32 -63
  76. package/template/workflows/specdev/T-triage/triage-template.md +29 -0
  77. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +88 -155
  78. package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +50 -0
  79. package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +46 -0
  80. package/template/workflows/specdev/_state/status.json +1 -1
  81. package/template/workflows/specdev/common/README.md +47 -0
  82. package/template/workflows/specdev/common/rules/artifact-contract.md +57 -0
  83. package/template/workflows/specdev/common/rules/code-commenting-rule.md +39 -0
  84. package/template/workflows/specdev/common/rules/deviation-control.md +43 -0
  85. package/template/workflows/specdev/common/rules/evidence-and-verification.md +57 -0
  86. package/template/workflows/specdev/common/rules/path-ownership.md +35 -0
  87. package/template/workflows/specdev/common/rules/path-reference-contract.md +116 -0
  88. package/template/workflows/specdev/common/rules/planning-principles.md +57 -0
  89. package/template/workflows/specdev/common/rules/readiness-and-depth.md +51 -0
  90. package/template/workflows/specdev/common/schemas/change-status.schema.json +170 -0
  91. package/template/workflows/specdev/common/schemas/config.schema.json +54 -0
  92. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +21 -0
  93. package/template/workflows/specdev/common/schemas/spec.schema.json +16 -0
  94. package/template/workflows/specdev/common/schemas/status.schema.json +149 -0
  95. package/template/workflows/specdev/common/schemas/ticket.schema.json +130 -0
  96. package/template/workflows/specdev/common/schemas/tickets-map.schema.json +14 -0
  97. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +28 -0
  98. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +30 -0
  99. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +16 -0
  100. package/template/workflows/specdev/common/skills/research/SKILL.md +43 -0
  101. package/template/workflows/specdev/common/tools/README.md +16 -0
  102. package/template/workflows/specdev/common/tools/validate-specdev.mjs +1155 -0
  103. package/template/canonical/canonical-teach.md +0 -301
  104. package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +0 -49
  105. package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +0 -80
  106. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +0 -122
  107. package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +0 -96
  108. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +0 -51
  109. package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +0 -37
  110. package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +0 -84
  111. package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +0 -46
  112. package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +0 -51
  113. package/template/workflows/specdev/I-init-setup/domain-layout.md +0 -55
  114. package/template/workflows/specdev/I-init-setup/status-labels.md +0 -53
  115. package/template/workflows/specdev/I-init-setup/tracking-convention.md +0 -52
  116. package/template/workflows/specdev/P-goal-plan/execution-sections.md +0 -126
  117. package/template/workflows/specdev/P-goal-plan/governance-sections.md +0 -103
  118. package/template/workflows/specdev/P-goal-plan/input-validation.md +0 -94
  119. package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +0 -158
  120. package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +0 -60
  121. package/template/workflows/specdev/P-goal-plan/vision-sections.md +0 -80
  122. package/template/workflows/specdev/R-review-architecture/exploration-guide.md +0 -103
  123. package/template/workflows/specdev/R-review-architecture/html-report-template.md +0 -124
  124. package/template/workflows/specdev/T-triage/artifact-templates.md +0 -122
  125. package/template/workflows/specdev/T-triage/intake-rules.md +0 -71
  126. package/template/workflows/specdev/T-triage/routing-rules.md +0 -70
  127. package/template/workflows/specdev/T-triage/understanding-rules.md +0 -102
  128. package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
  129. package/template/workflows/specdev/_state/context/.gitkeep +0 -0
  130. package/template/workflows/specdev/_state/research/.gitkeep +0 -0
  131. package/template/workflows/specdev/common/dev-worktree/SKILL.md +0 -48
  132. package/template/workflows/specdev/common/dev-worktree/references/create.md +0 -63
  133. package/template/workflows/specdev/common/dev-worktree/references/finalize.md +0 -102
  134. package/template/workflows/specdev/common/handoff/SKILL.md +0 -42
  135. package/template/workflows/specdev/common/neat-freak/SKILL.md +0 -210
  136. package/template/workflows/specdev/common/neat-freak/references/agent-paths.md +0 -72
  137. package/template/workflows/specdev/common/neat-freak/references/governance.md +0 -88
  138. package/template/workflows/specdev/common/neat-freak/references/sync-matrix.md +0 -77
  139. package/template/workflows/specdev/common/neat-freak/references/verification.md +0 -92
  140. package/template/workflows/specdev/common/neat-freak/scripts/audit-inventory.sh +0 -106
  141. package/template/workflows/specdev/common/prototype/LOGIC.md +0 -89
  142. package/template/workflows/specdev/common/prototype/SKILL.md +0 -78
  143. package/template/workflows/specdev/common/prototype/UI.md +0 -120
  144. package/template/workflows/specdev/common/research/SKILL.md +0 -54
  145. package/template/workflows/specdev/common/resolving-merge-conflicts/SKILL.md +0 -14
  146. package/template/workflows/specdev/common/scripts/hitl-loop.template.sh +0 -41
  147. package/template/workflows/specdev/common/triage/AGENT-BRIEF.md +0 -204
  148. package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +0 -104
  149. package/template/workflows/specdev/common/triage/SKILL.md +0 -112
@@ -1,100 +1,18 @@
1
- # LOG.md 格式
2
-
3
- 设计决策日志存放在变更目录的 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>` 中。它记录设计访谈中已经确认、延后或被替代的具体结论——"当时讨论了什么、最终固定了什么行为以及对应哪个 ADR"。与 CONTEXT.md 的精炼不同,LOG.md 可以记录讨论中的具体场景、边界条件和交互细节。
4
-
5
- ## 规则
6
-
7
- - **记录每一次设计结论。** 无论大小,只要在访谈中确认、延后或被替代,都写入 LOG.md。宁可多记,不要遗漏。
8
- - **状态驱动。** 每个条目明确标记 `accepted`、`deferred` 或 `superseded`,让读者一眼知道当前有效性。
9
- - **关联 ADR。** 如果该结论同时满足 ADR 的三个条件,在 LOG 中标注 `Related: ADR-XXXX`,并在对应 ADR 条目中也关联回 LOG。
10
- - **保持可修订。** 后续决定改变既有结论时,直接更新原条目状态和正文,不要新建一条矛盾的条目。标注 `Superseded by: LOG-XXXX`。
11
- - **不堆积废弃条目。** 被替代的条目保留但标记清楚;延后(deferred)的条目保留以便后续恢复讨论。
12
- - **记录具体交互和边界。** CONTEXT.md 的精炼不同,LOG.md 可以记录讨论中的具体场景、边界条件和交互细节。
13
-
14
- ## 模板
15
-
16
- ```md
17
- # 设计决策日志
18
-
19
- 本文件记录设计访谈中已经确认、延后或被替代的具体结论。它保存"当时讨论了什么、最终固定了什么行为以及对应哪个 ADR";CONTEXT.md 是规范词汇表,ADR.md 是难以逆转的架构决策,本文件则是可持续增删改的完整设计轨迹。
20
-
21
- ## 维护规则
22
-
23
- - 每次完成一个设计问答,同步更新 LOG.md、CONTEXT.md 与 ADR.md。
24
- - 已确认结论使用 `accepted`;暂不决定使用 `deferred`;被后续决定替代使用 `superseded`。
25
- - 后续确认改变既有结论时,直接修订原日志条目,并记录替代关系,不保留互相矛盾的"现行规则"。
26
- - 日志可以记录具体交互和边界;词汇表保持精炼;ADR 只记录难以逆转、令人意外且存在真实权衡的决定。
27
-
28
- ## LOG-0001: {状态} — {问题/主题}
29
-
30
- Status: accepted
31
- Related: ADR-0001
32
-
33
- {背景:讨论了什么问题,做出了什么决定,以及为什么。可以记录具体的交互过程、边界场景和固定行为。}
34
-
35
- ## LOG-0002: {状态} — {另一问题/主题}
36
-
37
- Status: deferred
38
-
39
- {为什么暂不决定,以及后续恢复讨论时应从什么问题开始。}
40
-
41
- ## LOG-0003: {状态} — {被替代的问题/主题}
42
-
43
- Status: superseded
44
- Superseded by: LOG-0004
45
-
46
- {原决策内容,以及为什么被替代。保留作为设计演进的历史上下文。}
1
+ # LOG 格式
2
+
3
+ ```markdown
4
+ ## LOG-### — <时间> — <主题>
5
+ - **状态:** confirmed / deferred / rejected / superseded
6
+ - **问题:** 本条只记录一个决策或未知
7
+ - **事实与来源:** 代码、测试、用户确认或外部规范
8
+ - **选项:** 实质可行方案及关键差异
9
+ - **推荐:** 默认建议与理由
10
+ - **结论:**
11
+ - **原因:**
12
+ - **影响工件:** CONTEXT / ADR / Spec / Ticket / Goal Plan
13
+ - **约束或不变量:** 无 / ...
14
+ - **后续:** owner、触发条件或截止门禁
15
+ - **替代/被替代:** LOG-### / 无
47
16
  ```
48
17
 
49
- ## 状态说明
50
-
51
- - **Status: accepted**——已确认的现行结论。这是讨论后用户明确同意的决定,当前仍然有效。
52
- - **Status: deferred**——暂不决定,留待后续讨论。记录为什么暂不决定以及从什么角度恢复讨论,以便后续接续上下文。
53
- - **Status: superseded**——被后续决定替代。标注 `Superseded by: LOG-XXXX` 指向替代条目。保留原条目作为设计演进的历史上下文。
54
-
55
- ## 追加新日志
56
-
57
- 1. 读取 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`,找到最高现有编号
58
- 2. 编号加 1(从 `0001` 开始,不足四位补零)
59
- 3. 标题格式为 `## LOG-XXXX: {状态} — {问题/主题}`,必须能独立看出该条目回答了什么设计问题
60
- 4. 在文件末尾追加新条目
61
-
62
- ## 修改已有日志
63
-
64
- - **改变结论**——将原条目状态改为 `superseded`,标注 `Superseded by: LOG-XXXX`,在新条目中说明替代原因。不要直接修改原条目的结论内容——保留它让读者能看到设计是如何演进的。
65
- - **延后决定被重新讨论**——将状态从 `deferred` 改为 `accepted`,或新建条目替代原条目(原条目改为 `superseded`)。如果内容没有变化只是状态升级,可以直接改状态;如果结论发生了变化,使用替代模式。
66
- - **补充细节**——直接编辑条目正文,不改变状态。可以追加更多场景、边界条件或交互细节。
67
- - **关联 ADR**——如果后来为该日志创建了 ADR,补充 `Related: ADR-XXXX` 标注。
68
- - **不要删除**——即使结论被替代,保留条目作为设计演进的历史上下文。
69
-
70
- ## 示例:被替代的日志
71
-
72
- 以下示例展示一条日志从 accepted 变为 superseded 的全过程:
73
-
74
- 原始条目:
75
-
76
- ```md
77
- ## LOG-0005: accepted — 订单状态机使用三态模型
78
-
79
- Status: accepted
80
-
81
- 订单状态为 pending → confirmed → completed 的三态模型。
82
- ```
83
-
84
- 讨论后发现需要更细粒度,追加替代条目:
85
-
86
- ```md
87
- ## LOG-0005: superseded — 订单状态机使用三态模型
88
-
89
- Status: superseded
90
- Superseded by: LOG-0007
91
-
92
- 订单状态为 pending → confirmed → completed 的三态模型。后续讨论发现 confirmed 状态无法区分"已付款待发货"和"已发货待签收",因此改为五态模型。
93
-
94
- ## LOG-0007: accepted — 订单状态机使用五态模型
95
-
96
- Status: accepted
97
-
98
- 订单状态为 pending → paid → shipped → delivered → completed 的五态模型。
99
- 详见 LOG-0005 的讨论背景。
100
- ```
18
+ LOG 追加为主;结论变化时新增条目并引用旧编号,不删除历史。状态为 deferred 的条目必须说明它是否阻止 Spec 或 Ticket Ready。
@@ -3,88 +3,204 @@ id: specdev/implement
3
3
  type: workflow-entry
4
4
  workflow: specdev
5
5
  name: 实现
6
- description: 基于 spec tickets 实现工作——以深层模块设计原则指导架构、以 TDD 红绿循环驱动编码、以双轴审查把关质量。
7
- keywords: [实现, TDD, 代码审查, 模块设计, 重构]
6
+ description: 基于 Ready Ticket 或获批的小型 Spec 执行设计检查、TDD 红绿循环、持续验证、双轴审查、证据回写和提交。
7
+ keywords: [实现, TDD, 代码审查, 模块设计, 证据, ticket]
8
8
  ---
9
9
 
10
10
  # 实现
11
11
 
12
- 基于 spec tickets 实现工作——融合设计检查、TDD、审查、提交的完整实现流程。每一步引用内部子文件,不依赖外部 skill。
12
+ work 保留原有完整实现能力:深层模块设计检查、接缝和依赖分类、design-it-twice、TDD 红→绿垂直循环、标准轴与规范轴审查、项目级验证、提交和状态更新。治理升级增加 Ready、路径所有权、Evidence 和偏差门禁,但不把实现退化为机械照单执行。
13
13
 
14
- 在开始实现之前,读取变更的上下文与架构决策:
14
+ ## 执行模式
15
15
 
16
- - **CONTEXT.md** —— 当前变更的领域术语与概念:`<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>`
17
- - **ADR.md** —— 当前变更的架构决策记录:`<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`
18
- - **goal-plan.md** —— 如果存在目标规划文档,读取了解里程碑级约束和门禁次序:`<Path>{roots.state}/specdev/changes/{change}/goal-plan.md</Path>`
19
- - **永久 ADR** —— 已确认并提升到永久的架构决策,始终反映项目当前架构现状:`<Path>{roots.state}/specdev/adr/</Path>`
20
- - **永久 CONTEXT** —— 已确认并提升到永久的领域词汇表,始终反映项目当前领域术语现状:`<Path>{roots.state}/specdev/context/</Path>`
16
+ ### Ticket 模式(默认)
21
17
 
22
- 如果当前 change 下的 CONTEXT.md 或 ADR.md 不存在,先运行 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>` 或询问用户以建立上下文。永久 ADR 和 CONTEXT 目录可能为空——静默继续,不影响后续流程。
18
+ 读取一个 Ready Ticket:
19
+
20
+ - Ticket:`<Path>{roots.state}/specdev/changes/{change}/ticket/{ticket-file}.md</Path>`
21
+ - Tickets Map:`<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>`
22
+ - 可选 Goal Plan:`<Path>{roots.state}/specdev/changes/{change}/goal-plan.md</Path>`
23
+
24
+ Ticket 模式适用于多 Ticket、Standard/Deep、并行、迁移或需要完整证据治理的工作。
25
+
26
+ ### Direct Spec 模式(保留原能力)
27
+
28
+ 极小、局部、单一行为且不需要独立 Ticket DAG 的工作,可以在用户明确批准后直接基于:
29
+
30
+ - Spec:`<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`
31
+ - 架构决策:`<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`
32
+ - 领域上下文:`<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>`
33
+
34
+ 执行前必须从 Spec 明确提取并向用户确认一个轻量执行契约:目标、IN/OUT、可写范围、关键不变量、验证命令和验收条件。出现公共 API/schema、迁移、安全、高风险、多个独立行为或并行需求时,必须返回 `<Path>{roots.workflows}/specdev/T-tickets/T-tickets.md</Path>`,不得使用 Direct Spec 模式绕过治理。
35
+
36
+ ## 通用输入
37
+
38
+ 按存在情况读取:
39
+
40
+ - 当前 Spec:`<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`
41
+ - 当前架构决策:`<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>`
42
+ - 当前领域上下文:`<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>`
43
+ - 当前设计日志:`<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`
44
+ - 永久架构决策:`<Path>{roots.state}/specdev/adr/</Path>`
45
+ - 永久领域上下文:`<Path>{roots.state}/specdev/context/</Path>`
46
+ - 项目配置:`<Path>{roots.state}/specdev/config.json</Path>`
47
+
48
+ 当前 change 的架构决策或领域上下文缺失,且实现需要这些决定时,先运行 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>` 或请求用户建立上下文。永久目录可以为空,静默继续。
23
49
 
24
50
  ## 流程
25
51
 
26
- ### 1. 设计检查
52
+ ### 1. 执行前预检
27
53
 
28
- 在编写任何代码之前,检查当前变更涉及的模块接口设计。使用 `<Path>{roots.workflows}/specdev/I-implement/codebase-design-glossary.md</Path>` 中的术语表评估:
54
+ 加载 `<Path>{roots.workflows}/specdev/I-implement/execution-preflight.md</Path>`。
29
55
 
30
- - 要实现的代码属于哪些**模块**?
31
- - 每个模块的**接口**是什么?(类型签名、不变量、顺序约束、错误模式)
32
- - 接口的**深度**如何?调用者是否获得了足够的**杠杆效应**?
33
- - **接缝**放在哪里?是否有至少两个适配器来证明接缝是真实的?
34
- - 每个接缝处的依赖属于哪个类别?(进程内、本地可替换、远程但自有、真正的外部依赖——参见 `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>`)
56
+ Ticket 模式检查:
35
57
 
36
- 如果需要探索替代接口设计,启动 `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>` 流程。
58
+ - `ready: true`;
59
+ - 状态允许开始;
60
+ - `blocked_by` 全部 done;
61
+ - Ticket 与 Spec/ADR/Goal Plan 无冲突;
62
+ - 可写、只读、共享路径明确且无并发冲突;
63
+ - 并行执行时,Ticket 的 worktree 记录为 `active`,`base_sha` 与派单一致;
64
+ - 验证命令和 Evidence 位置可用;
65
+ - 当前代码事实没有使核心契约失效。
37
66
 
38
- 若设计检查中遇到不熟悉的库/框架 API、需要了解替代方案的技术细节或外部依赖的能力边界,先调用 `<Path>{roots.workflows}/specdev/common/research/SKILL.md</Path>` 完成探查后再继续接口评估。
67
+ Direct Spec 模式检查:
39
68
 
40
- **完成标准**:模块接口设计已检查——深度、接缝位置、适配器策略合理。每个接缝的依赖类别已分类。
69
+ - 用户已明确批准直接实现;
70
+ - 单一行为、局部、低风险、可逆;
71
+ - 轻量执行契约完整;
72
+ - 不涉及 Deep 条件;
73
+ - 可写范围和验证明确。
41
74
 
42
- ### 2. TDD 循环
75
+ 失败时停止,标记 `blocked` `deviated`,不得边做边补关键决策。
43
76
 
44
- 按照 `<Path>{roots.workflows}/specdev/I-implement/tdd-rules.md</Path>` 执行红→绿循环:
77
+ ### 2. 设计检查
45
78
 
46
- 1. 确认每个接缝的测试策略(参见 `<Path>{roots.workflows}/specdev/I-implement/tdd-examples.md</Path>` 中的示例)
47
- 2. 在接缝处编写失败的测试——通过公共接口验证行为
48
- 3. 只写足以通过测试的代码
49
- 4. 每个循环一张垂直切片,响应上一个循环的反馈
79
+ 加载:
50
80
 
51
- 循环重复直到所有 tickets 实现完成。如果审查后发现阻塞性问题(步骤 3),返回此步骤继续循环。
81
+ - `<Path>{roots.workflows}/specdev/I-implement/codebase-design-glossary.md</Path>`
82
+ - `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>`
52
83
 
53
- **完成标准**:红→绿循环完成——每个接缝一张垂直切片,测试通过公共接口验证行为。所有 tickets 实现完成。
84
+ 在写代码前检查:
54
85
 
55
- ### 3. 审查
86
+ - 目标代码属于哪些模块;
87
+ - 每个模块的接口、类型、不变量、顺序约束、错误和性能语义;
88
+ - 模块是否有足够深度,是否减少调用者认知;
89
+ - 接缝在哪里,是否有真实适配器或可替换实现;
90
+ - 依赖属于进程内、本地可替换、远程自有或真正外部依赖;
91
+ - 测试应在哪个稳定接缝观察行为;
92
+ - Ticket/Spec 已锁定的公共契约是否被保持。
56
93
 
57
- 按照 `<Path>{roots.workflows}/specdev/I-implement/code-review-process.md</Path>` 执行双轴审查:
94
+ 存在多个局部接口设计且不改变已锁定契约时,可以运行 `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>`。若方案会改变外部行为、公共接口、数据、兼容、安全或范围,返回规划工件,不使用 design-it-twice 绕过决策。
58
95
 
59
- - **标准轴** 代码是否符合编码规范?是否出现 Fowler 代码异味?
60
- - **规范轴** — 代码是否忠实地实现了 `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>` 中的要求?
96
+ 若不熟悉外部库、框架 API 或依赖能力边界,调用 `<Path>{roots.workflows}/specdev/common/skills/research/SKILL.md</Path>`。
61
97
 
62
- 如果审查发现阻塞性问题,返回步骤 2「TDD 循环」修复;否则进入提交。
98
+ **完成标准**:模块深度、接口、不变量、接缝、适配器和依赖策略已检查,局部设计与上层契约一致。
63
99
 
64
- **完成标准**:双轴审查完成——标准轴和规范轴均已通过,无阻塞性问题。
100
+ ### 3. TDD 红→绿垂直循环
65
101
 
66
- ### 4. 提交
102
+ 加载:
67
103
 
68
- 1. 运行项目自身的类型/静态检查命令——从项目脚本(package.json scripts、Makefile、CI 配置等)探测,不确定时询问用户
69
- 2. 运行项目自身的完整测试套件命令——探测方式同上
70
- 3. 将更改提交到当前分支:`git add -A && git commit -m "<描述性提交信息>"`
71
- 4. 更新 `<Path>{roots.state}/specdev/changes/{change}/</Path>` 下的状态文件
104
+ - `<Path>{roots.workflows}/specdev/I-implement/tdd-rules.md</Path>`
105
+ - `<Path>{roots.workflows}/specdev/I-implement/tdd-examples.md</Path>`
106
+ - `<Path>{roots.workflows}/specdev/common/rules/code-commenting-rule.md</Path>`
72
107
 
73
- **完成标准**:代码已提交到当前分支,类型检查和测试通过,状态文件已更新。
108
+ 对每个验收行为或关键风险:
74
109
 
75
- ---
110
+ 1. 选择公共接口或稳定接缝;
111
+ 2. 编写会因目标行为缺失而失败的测试或可重复验证;
112
+ 3. 确认失败原因正确;
113
+ 4. 只写足以通过当前测试的实现;
114
+ 5. 运行定向验证;
115
+ 6. 在保持绿色的状态下重构;
116
+ 7. 进入下一条窄垂直切片。
76
117
 
77
- ## 子文件引用
118
+ 本循环新增或修改代码注释时,使用注释规则判断信息是否应由代码表达,并同步维护受行为变更影响的既有注释。
119
+
120
+ 不得通过删除测试、放宽断言、吞错、永久跳过或只测试 Mock 调用次数来制造绿色。
121
+
122
+ ### 4. 持续验证与范围审计
123
+
124
+ - 每个安全落点运行定向验证;
125
+ - 完成前运行 Ticket 验证矩阵,或 Direct Spec 模式的轻量验证契约;
126
+ - 按 `<Path>{roots.state}/specdev/config.json</Path>` 运行适用的类型检查、lint、测试和构建;
127
+ - Worker 不运行 E2E;若用户界面交互受影响,记录场景与预期结果,交由 Lead 在集成阶段执行;
128
+ - 检查实际修改均在 `writable_paths` 或获批的 Direct Spec 可写范围内;
129
+ - shared path 只由 owner 修改;
130
+ - 越界前停止并提出 ownership change,不先改后报;
131
+ - 记录新失败、既有失败和环境失败的区别。
132
+
133
+ 证据规则见 `<Path>{roots.workflows}/specdev/common/rules/evidence-and-verification.md</Path>`。
134
+
135
+ ### 5. 双轴审查
136
+
137
+ 加载 `<Path>{roots.workflows}/specdev/I-implement/code-review-process.md</Path>`。
78
138
 
79
- 以下子文件包含各步骤的详细规则、示例和参考材料,仅在对应步骤进入时加载:
139
+ - **标准轴**:正确性、模块设计、代码异味、错误处理、安全、性能、并发、资源释放、测试质量和可维护性;
140
+ - **规范轴**:对照 `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`、Ticket 的 IN/OUT、实现契约、路径所有权、验证矩阵和 Goal Gate。
80
141
 
81
- | 文件 | 内容 | 触发条件 |
82
- |------|------|---------|
83
- | `<Path>{roots.workflows}/specdev/I-implement/codebase-design-glossary.md</Path>` | 深层模块设计的 8 个术语定义、原则、为可测试性设计 | 步骤 1「设计检查」进入时 |
84
- | `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>` | 依赖类别、接缝纪律、测试策略 | 设计检查中需要分析依赖时 |
85
- | `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>` | 并行子 Agent 探索替代接口的三步流程 | 设计检查中需要探索替代方案时 |
86
- | `<Path>{roots.workflows}/specdev/I-implement/tdd-rules.md</Path>` | 红→绿循环的完整规则、反模式、接缝测试策略 | 步骤 2「TDD 循环」进入时 |
87
- | `<Path>{roots.workflows}/specdev/I-implement/tdd-examples.md</Path>` | 好的测试 vs 坏的测试、同义反复、Mock 指南、为可 Mock 性设计 | 编写具体测试时参考 |
88
- | `<Path>{roots.workflows}/specdev/I-implement/code-review-process.md</Path>` | 双轴审查流程、12 个 Fowler 异味基线、子 Agent 提示词模板 | 步骤 3「审查」进入时 |
142
+ 标准轴同时复核步骤 3 加载的注释规则:公共 API 契约完整,内部注释只保留非显然的 Why、Invariant 和 Risk,且所有相关注释与当前行为一致。
143
+
144
+ 审查发现局部阻塞问题时回到 TDD 循环;需要改变上层契约时升级 deviation 并返回 Spec/Ticket/ADR。
145
+
146
+ ### 6. Evidence 与状态
147
+
148
+ Ticket 模式使用 `<Path>{roots.workflows}/specdev/I-implement/evidence-template.md</Path>` 写入:
149
+
150
+ ```text
151
+ <Path>{roots.state}/specdev/changes/{change}/evidence/{ticket-id}.md</Path>
152
+ ```
153
+
154
+ Direct Spec 模式写入:
155
+
156
+ ```text
157
+ <Path>{roots.state}/specdev/changes/{change}/evidence/direct-spec.md</Path>
158
+ ```
159
+
160
+ Evidence 必须包含实际修改范围、命令与结果、验收逐条映射、未运行项、偏差、残余风险和提交引用。
161
+
162
+ Ticket 状态依次为 `ready → in_progress → review → done`;阻塞使用 `blocked`,实际实现与批准契约不一致使用 `deviated`。验证无法运行或存在未批准偏差时不得标 `done`。
163
+
164
+ 同步:
165
+
166
+ - Ticket:`<Path>{roots.state}/specdev/changes/{change}/ticket/{ticket-file}.md</Path>`
167
+ - Tickets Map:`<Path>{roots.state}/specdev/changes/{change}/tickets-map.md</Path>`
168
+ - change 状态:`<Path>{roots.state}/specdev/changes/{change}/.status.json</Path>`
169
+ - 全局状态:`<Path>{roots.state}/specdev/status.json</Path>`
170
+
171
+ ### 7. 提交与返回
172
+
173
+ 1. 运行项目自身的适用验证;
174
+ 2. 仅在 `<Path>{roots.state}/specdev/config.json</Path>` 和用户授权允许时提交;
175
+ 3. 提交信息引用 Ticket ID 或 Direct Spec change;
176
+ 4. 不自动推送、合并、部署、发布或执行不可逆迁移;
177
+ 5. 返回 Ticket ID 与状态、Evidence 完整路径、`workspace_ref`、commit 或 PR 引用,以及仅在用户界面交互受影响时由 Lead 执行的待办 E2E;
178
+ 6. Direct Spec 模式返回 change、状态和 `<Path>{roots.state}/specdev/changes/{change}/evidence/direct-spec.md</Path>`。
179
+
180
+ 若由 Lead 编排,遵循 `<Path>{roots.workflows}/specdev/P-goal-plan/orchestration-protocol.md</Path>` 的 Evidence 返回协议。
181
+
182
+ ## 完成标准
183
+
184
+ - 执行前预检通过;
185
+ - 设计检查保留深层模块、接缝和依赖分类能力;
186
+ - 每个行为通过真实红→绿循环实现;
187
+ - 定向与适用回归验证完成;
188
+ - 双轴审查通过;
189
+ - Evidence 完整;
190
+ - 实际修改未超出授权路径;
191
+ - 无未批准 deviation;
192
+ - 状态已同步;
193
+ - 实现结果可通过 Evidence、状态和代码引用完整定位;
194
+ - 提交遵守用户授权。
195
+
196
+ ## 子文件引用
89
197
 
90
- 实现的产物(代码变更)直接写入仓库的源代码目录。变更追踪、spec 和 ADR 仍存放在 `<Path>{roots.state}/specdev/changes/{change}/</Path>` 下。
198
+ - 执行前预检:`<Path>{roots.workflows}/specdev/I-implement/execution-preflight.md</Path>`
199
+ - 代码库设计术语:`<Path>{roots.workflows}/specdev/I-implement/codebase-design-glossary.md</Path>`
200
+ - 深化与依赖策略:`<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>`
201
+ - Design It Twice:`<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>`
202
+ - TDD 规则:`<Path>{roots.workflows}/specdev/I-implement/tdd-rules.md</Path>`
203
+ - TDD 示例:`<Path>{roots.workflows}/specdev/I-implement/tdd-examples.md</Path>`
204
+ - 代码注释规则:`<Path>{roots.workflows}/specdev/common/rules/code-commenting-rule.md</Path>`
205
+ - 双轴审查:`<Path>{roots.workflows}/specdev/I-implement/code-review-process.md</Path>`
206
+ - Evidence 模板:`<Path>{roots.workflows}/specdev/I-implement/evidence-template.md</Path>`
@@ -1,83 +1,17 @@
1
- # 代码审查
1
+ # 双轴审查
2
2
 
3
- `HEAD` 与实现开始前的某个固定点之间的 diff 进行双轴审查:
3
+ ## 标准轴
4
4
 
5
- - **标准** — 代码是否符合此仓库已记录的编码规范?
6
- - **规范** — 代码是否忠实地实现了原始 spec?
5
+ 检查正确性、并发、资源释放、错误处理、安全、性能风险、模块深度、重复知识、测试真实性和可读性。评论必须指向具体行为风险,不做纯风格噪声。
7
6
 
8
- 两个轴以**并行子 Agent** 方式运行,以免互相污染上下文,然后本流程汇总它们的发现。
7
+ ## 契约轴
9
8
 
10
- ## 流程
9
+ 逐项核对:contract_ids、IN/REUSE/OUT、锁定决策、不变量、失败/兼容、writable_paths、验证矩阵、Deep 发布恢复和 Goal Gate。
11
10
 
12
- ### 1. 确定固定点
11
+ ## 结论
13
12
 
14
- 实现开始前的 commit SHA、分支名、tag、`main` 或合并基准。通常为开始实现前的 HEAD。如果用户未指定,请询问。
13
+ - `APPROVE`:无阻塞问题;
14
+ - `REQUEST_CHANGES`:列出阻塞问题、证据和应满足的结果;
15
+ - `ESCALATE_DEVIATION`:修复需要改变上层契约。
15
16
 
16
- 一次性捕获 diff 命令:`git diff <固定点>...HEAD`(三个点,以便与合并基准比较)。同时通过 `git log <固定点>..HEAD --oneline` 记录 commit 列表。
17
-
18
- 继续之前,确认固定点可解析(`git rev-parse <固定点>`)且 diff 非空。无效引用或空 diff 应在此处失败 — 而非在两个并行子 Agent 内部。
19
-
20
- ### 2. 识别规范来源
21
-
22
- 规范来源为当前变更的 spec 文件:
23
-
24
- `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`
25
-
26
- 如果该文件不存在,**规范**子 Agent 将跳过并报告"无可用的规范"。
27
-
28
- ### 3. 识别标准来源
29
-
30
- 仓库中所有记录代码应如何编写的文件,如 `CODING_STANDARDS.md` 或 `CONTRIBUTING.md`。
31
-
32
- 在仓库记录的任何标准之上,标准轴始终携带以下**异味基线** — 一组固定的 Fowler 代码异味(《重构》第 3 章),即使仓库没有任何记录也适用。两条规则约束它:
33
-
34
- - **仓库优先。** 已记录的仓库标准始终优先;当它认可基线可能标记的内容时,抑制该异味。
35
- - **始终是判断。** 每个异味是一个带标签的启发式("可能的 Feature Envy"),从来不是硬性违规 — 并且,与这里的任何标准一样,跳过工具链已在强制执行的内容。
36
-
37
- 每个异味读作*它是什么* → *如何修复*;将其与 diff 进行匹配:
38
-
39
- - **Mysterious Name** — 函数、变量或类型,其名称不能揭示它做什么或持有什么。→ 重命名;如果没有诚实的名称可用,说明设计不清晰。
40
- - **Duplicated Code** — 相同的逻辑形态出现在变更中的一个以上代码块或文件中。→ 提取共享形态,从两处调用。
41
- - **Feature Envy** — 一个方法过多地访问另一个对象的数据,而非自身数据。→ 将该方法移动到它所羡慕的数据上。
42
- - **Data Clumps** — 相同的几个字段或参数总是一起出现(一个等待诞生的类型)。→ 将它们捆绑成一个类型,传递该类型。
43
- - **Primitive Obsession** — 一个基本类型或字符串替代了应拥有自己类型的领域概念。→ 为该概念创建自己的小型类型。
44
- - **Repeated Switches** — 对同一类型的相同 `switch`/`if` 级联在变更中反复出现。→ 用多态替代,或使用两个位置共享的一个映射。
45
- - **Shotgun Surgery** — 一个逻辑变更迫使在 diff 中跨多个文件进行分散编辑。→ 将一起变更的内容汇聚到一个模块中。
46
- - **Divergent Change** — 一个文件或模块因多个不相关的原因被编辑。→ 拆分,使每个模块因一个原因变更。
47
- - **Speculative Generality** — 为 spec 中没有的需求添加的抽象、参数或钩子。→ 删除它;回退内联,直到真实需求出现。
48
- - **Message Chains** — 调用者不应依赖的长链式 `a.b().c().d()` 导航。→ 在第一个对象上用一个方法隐藏整个链路。
49
- - **Middle Man** — 一个类或函数大部分只是委托转发。→ 删除它,直接调用真正的目标。
50
- - **Refused Bequest** — 一个子类或实现者忽略或覆盖了其继承的大部分内容。→ 放弃继承,使用组合。
51
-
52
- ### 4. 并行启动两个子 Agent
53
-
54
- 发送一条消息,包含两个 `Agent` 工具调用。两者均使用 `general-purpose` 子 Agent。
55
-
56
- **标准子 Agent 提示词** — 包含:
57
-
58
- - 完整的 diff 命令和 commit 列表。
59
- - 在第 3 步中找到的标准来源文件列表,**加上第 3 步中的异味基线全文粘贴** — 子 Agent 没有其他途径获取它。
60
- - 任务简述:"报告 — 在相关时按文件/代码块 — (a) diff 违反已记录标准的每个地方:引用标准(文件 + 规则);以及 (b) 你发现的任何基线异味:命名并引用代码块。区分硬性违规和判断性调用 — 已记录标准的违规可以是硬性的,但基线异味始终是判断性调用,且已记录的仓库标准覆盖基线。跳过工具链已强制执行的内容。400 词以内。"
61
-
62
- **规范子 Agent 提示词** — 包含:
63
-
64
- - diff 命令和 commit 列表。
65
- - spec 的路径或已获取的内容:`<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`。
66
- - 任务简述:"报告:(a) spec 要求但缺失或不完整的需求;(b) diff 中存在但未被要求的、超出范围的行为;(c) 看起来已实现但实现方式错误的需求。每个发现引用 spec 原文。400 词以内。"
67
-
68
- 如果 spec 缺失,跳过规范子 Agent 并在最终报告中注明。
69
-
70
- ### 5. 汇总
71
-
72
- 在 `## 标准` 和 `## 规范` 标题下呈现两份报告,原文或略微整理。**不要**合并或重新排名发现 — 两个轴故意分离(见*为什么是两个轴*)。
73
-
74
- 以一行摘要结束:每个轴的发现总数,以及每个轴内_最严重的问题_(如有)。不要在轴之间选一个"赢家" — 那正是分离设计要防止的重新排名。
75
-
76
- ## 为什么是两个轴
77
-
78
- 一个变更可能通过一个轴而未通过另一个:
79
-
80
- - 代码遵循所有标准但实现了错误的东西 → **标准通过,规范未通过。**
81
- - 代码完全按 spec 要求做了,但违反了项目的约定 → **规范通过,标准未通过。**
82
-
83
- 分开报告可以防止一个轴掩盖另一个轴。
17
+ 审查者不得通过设计新功能扩大 Ticket。
@@ -1,109 +1,12 @@
1
- # 代码仓设计
2
-
3
- 设计**深层模块**:通过一个小接口承载大量行为,放置在干净的接缝处,可通过该接口进行测试。在任何设计或重构代码的地方使用这些语言和原则。目标是为调用者提供杠杆效应,为维护者提供局部性,为所有人提供可测试性。
4
-
5
- ## 术语表
6
-
7
- 严格使用以下术语 — 不要用 "component"、"service"、"API" 或 "boundary" 替代。一致的语言才是重点。
8
-
9
- **Module(模块)** — 任何具有接口和实现的东西。有意识地与规模无关:函数、类、包或跨层切片。_避免使用_:unit、component、service。
10
-
11
- **Interface(接口)** — 调用者正确使用模块所需了解的一切:类型签名,还包括不变量、顺序约束、错误模式、必需配置和性能特征。_避免使用_:API、signature(太窄 — 它们仅指类型层面的表面)。
12
-
13
- **Implementation(实现)** — 模块内部的内容,它的代码体。区别于 **Adapter(适配器)**:一个东西可以是一个小适配器加一个大实现(Postgres 仓库),也可以是一个大适配器加一个小实现(内存假实现)。当讨论接缝时用 "adapter";否则用 "implementation"。
14
-
15
- **Depth(深度)** — 接口处的杠杆效应:调用者(或测试)每学习一个单位的接口可以驱动的行为量。当大量行为隐藏在小接口后面时,模块是**深层的**;当接口几乎和实现一样复杂时,模块是**浅层的**。
16
-
17
- **Seam(接缝)** _(Michael Feathers)_ — 一个可以在不编辑该位置的情况下改变行为的地方;模块接口所在的*位置*。接缝放在哪里本身就是一个设计决策,与接缝后面放什么不同。_避免使用_:boundary(与 DDD 的有界上下文重载)。
18
-
19
- **Adapter(适配器)** — 在接缝处满足接口的具体事物。描述的是*角色*(它填充哪个槽位),而非实质(内部是什么)。
20
-
21
- **Leverage(杠杆效应)** — 调用者从深度中获得的好处:每学习一个单位的接口获得更多的能力。一个实现为 N 个调用点和 M 个测试带来回报。
22
-
23
- **Locality(局部性)** — 维护者从深度中获得的好处:变更、bug、知识和验证集中在一个地方,而非分散在调用者之间。一次修复,处处生效。
24
-
25
- ## 深层 vs 浅层
26
-
27
- **深层模块** = 小接口 + 大量实现:
28
-
29
- ```
30
- ┌─────────────────────┐
31
- │ 小接口 │ ← 少量方法,简单参数
32
- ├─────────────────────┤
33
- │ │
34
- │ 深层实现 │ ← 隐藏的复杂逻辑
35
- │ │
36
- └─────────────────────┘
37
- ```
38
-
39
- **浅层模块** = 大接口 + 少量实现(应避免):
40
-
41
- ```
42
- ┌─────────────────────────────────┐
43
- │ 大接口 │ ← 大量方法,复杂参数
44
- ├─────────────────────────────────┤
45
- │ 薄实现 │ ← 仅仅是透传
46
- └─────────────────────────────────┘
47
- ```
48
-
49
- 设计接口时,问自己:
50
-
51
- - 我能减少方法数量吗?
52
- - 我能简化参数吗?
53
- - 我能隐藏更多内部的复杂性吗?
54
-
55
- ## 原则
56
-
57
- - **深度是接口的属性,而非实现的属性。** 一个深层模块内部可以由小型、可模拟、可替换的部分组成 — 只是它们不属于接口的一部分。一个模块可以拥有**内部接缝**(对其实现私有,用于其自身测试)以及位于其接口处的**外部接缝**。
58
- - **删除测试。** 想象删除这个模块。如果复杂性消失,它就是个透传层。如果复杂性在 N 个调用者中重新出现,它就在发挥价值。
59
- - **接口就是测试表面。** 调用者和测试穿过同一个接缝。如果你想测试接口_之外_的内容,模块可能形状不对。
60
- - **一个适配器意味着假设的接缝。两个适配器意味着真实的接缝。** 除非有东西确实在接缝两侧变化,否则不要引入接缝。
61
-
62
- ## 为可测试性而设计
63
-
64
- 良好的接口使测试变得自然:
65
-
66
- 1. **接收依赖,不要创建依赖。**
67
-
68
- ```typescript
69
- // 可测试
70
- function processOrder(order, paymentGateway) {}
71
-
72
- // 难以测试
73
- function processOrder(order) {
74
- const gateway = new StripeGateway();
75
- }
76
- ```
77
-
78
- 2. **返回结果,不要产生副作用。**
79
-
80
- ```typescript
81
- // 可测试
82
- function calculateDiscount(cart): Discount {}
83
-
84
- // 难以测试
85
- function applyDiscount(cart): void {
86
- cart.total -= discount;
87
- }
88
- ```
89
-
90
- 3. **小表面积。** 更少的方法 = 更少的测试需求。更少的参数 = 更简单的测试设置。
91
-
92
- ## 关系
93
-
94
- - 一个 **Module** 恰好有一个 **Interface**(它向调用者和测试呈现的表面)。
95
- - **Depth** 是一个 **Module** 的属性,对照其 **Interface** 来度量。
96
- - 一个 **Seam** 是一个 **Module** 的 **Interface** 所在的位置。
97
- - 一个 **Adapter** 位于 **Seam** 处,满足 **Interface**。
98
- - **Depth** 为调用者产生 **Leverage**,为维护者产生 **Locality**。
99
-
100
- ## 已拒绝的框架
101
-
102
- - **深度作为实现行数与接口行数之比** (Ousterhout):奖励填充实现。我们使用深度即杠杆效应来替代。
103
- - **"Interface" 作为 TypeScript 的 `interface` 关键字或类的公开方法**:太窄 — 此处的接口包括调用者必须了解的每个事实。
104
- - **"Boundary"**:与 DDD 的有界上下文重载。说 **seam** 或 **interface**。
105
-
106
- ## 深入阅读
107
-
108
- - **给定依赖的情况下深化一个集群** — 见 `<Path>{roots.workflows}/specdev/I-implement/deepening.md</Path>`:依赖类别、接缝规程、以及替换而非分层的测试。
109
- - **探索替代接口** — 见 `<Path>{roots.workflows}/specdev/I-implement/design-it-twice.md</Path>`:启动并行子 agent,以几种截然不同的方式设计接口,然后在深度、局部性和接缝位置上进行比较。
1
+ # 代码库设计术语
2
+
3
+ - **模块**:隐藏复杂度并提供稳定接口的单元,不等于目录或类。
4
+ - **深度**:接口简单度相对于模块内部承载复杂度的杠杆。
5
+ - **接口**:调用者必须知道的全部,包括类型、不变量、顺序、错误和性能语义。
6
+ - **接缝**:可以替换、观察或验证行为的位置。
7
+ - **适配器**:把外部变化隔离在稳定接缝外的实现。
8
+ - **信息隐藏**:设计决定只存在于一个权威位置。
9
+ - **局部性**:完成一个行为所需理解和修改的范围尽可能集中。
10
+ - **时间耦合**:调用必须按隐含顺序发生;应显式化或封装。
11
+
12
+ 检查目标:减少调用者认知,而不是单纯减少行数或文件数。