@namewta/speculo 0.1.15 → 0.1.17
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/package.json +1 -1
- package/template/skills/speculo-write/SKILL.md +7 -4
- package/template/skills/speculo-write/references/asset-selection-sop.md +2 -0
- package/template/skills/speculo-write/references/authoring-quality-levers.md +61 -0
- package/template/skills/speculo-write/references/command-authoring-sop.md +1 -1
- package/template/skills/speculo-write/references/skill-authoring-sop.md +10 -0
- package/template/skills/speculo-write/references/validation-checklist.md +10 -0
- package/template/skills/speculo-write/references/workflow-authoring-sop.md +2 -0
- package/template/vendor/codebase-design/DEEPENING.md +37 -0
- package/template/vendor/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/template/vendor/codebase-design/SKILL.md +114 -0
- package/template/workflows/dev/00-INDEX.md +7 -1
- package/template/workflows/dev/01-grill-with-docs/01-grill-with-docs.md +2 -2
- package/template/workflows/dev/01-grill-with-docs/grill-decision.md +2 -2
- package/template/workflows/dev/02-prd/02-prd.md +2 -0
- package/template/workflows/dev/03-tdd/03-tdd.md +12 -6
- package/template/workflows/dev/03-tdd/mocking.md +9 -26
- package/template/workflows/dev/03-tdd/tdd-plan.md +1 -1
- package/template/workflows/dev/04-finalize/04-finalize.md +1 -0
- package/template/workflows/dev/A-improve-architecture/A-improve-architecture.md +143 -0
- package/template/workflows/dev/A-improve-architecture/HTML-REPORT.md +123 -0
- package/template/workflows/dev/D-docs-sync/D-docs-sync.md +2 -0
- package/template/workflows/dev/H-diagnose/diagnose-guide.md +1 -1
- package/template/workflows/dev/I-to-issues/I-to-issues.md +30 -18
- package/template/workflows/dev/I-to-issues/issues-slices.md +40 -14
- package/template/workflows/dev/{01-grill-with-docs → M-domain-modeling}/ADR-FORMAT.md +4 -4
- package/template/workflows/dev/{01-grill-with-docs → M-domain-modeling}/CONTEXT-FORMAT.md +4 -2
- package/template/workflows/dev/M-domain-modeling/M-domain-modeling.md +118 -0
- package/template/workflows/dev/_templates/domain-model-log-template.md +20 -0
- package/template/workflows/dev/_templates/issues-slices-template.md +20 -2
- package/template/workflows/dev/03-tdd/deep-modules.md +0 -33
- package/template/workflows/dev/03-tdd/interface-design.md +0 -31
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: dev/M-domain-modeling
|
|
3
|
+
category: dev
|
|
4
|
+
name: Domain Modeling
|
|
5
|
+
description: 主动构建与精炼项目领域模型——挑战术语、压测边界,并在决策结晶当下沉淀通用语言(CONTEXT)与架构决策(ADR)
|
|
6
|
+
keywords: [domain-modeling, context, adr, ubiquitous-language, 领域建模, 术语, 通用语言]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Domain Modeling 工作流执行指引
|
|
10
|
+
|
|
11
|
+
本工作流是 `dev/M` 入口,也是 dev 分类**领域模型的横向纪律与格式单一事实源**:在设计与讨论中*主动*构建、精炼项目领域模型,并在术语和决策结晶的当下立即沉淀。它既可独立进入(`dev/M`),也被 `dev/01`、`dev/02`、`dev/04`、`dev/D` 与 `dev/A` 在各自阶段中引用。
|
|
12
|
+
|
|
13
|
+
> **主动 vs 消费**:仅仅*读取* CONTEXT 取词汇**不是**本工作流——那是任何工作流都该有的一行习惯。本工作流用于你正在*改变*模型,而不仅是消费它时。
|
|
14
|
+
|
|
15
|
+
## 内置指引
|
|
16
|
+
|
|
17
|
+
### 何时使用
|
|
18
|
+
|
|
19
|
+
当 dev 工作流需要*改变*领域模型时使用——挑战或锐化术语、消解一词多义、记录难以逆转的架构决策、维护通用语言。典型触发:
|
|
20
|
+
|
|
21
|
+
- 用户用词与现有 CONTEXT 冲突,或同一概念出现多个词
|
|
22
|
+
- 讨论领域关系,需要用具体场景压测边界
|
|
23
|
+
- 出现「难以逆转 + 缺上下文会令人意外 + 真实权衡」的决策,值得记成 ADR
|
|
24
|
+
- 实现 / 重构 / PRD 中引入了 CONTEXT 里尚不存在的概念
|
|
25
|
+
|
|
26
|
+
### 输入
|
|
27
|
+
|
|
28
|
+
- 用户的计划、设计或当前讨论
|
|
29
|
+
- `speculo/.speculo/.config/context/CONTEXT.md`、`speculo/.speculo/.config/context/CONTEXT-MAP.md`、`speculo/.speculo/.config/adr/` 与相关代码
|
|
30
|
+
- 当前 change 目录:`speculo/.speculo/dev/<change>/`(`<change>` 必须为 `YYYY-MM-DD-<kebab-name>`,例:`2026-06-12-model-ordering`)
|
|
31
|
+
|
|
32
|
+
### 输出
|
|
33
|
+
|
|
34
|
+
- 会话沉淀记录:`speculo/.speculo/dev/<change>/domain-model-log.md`
|
|
35
|
+
- 经用户确认后更新 `speculo/.speculo/.config/context/CONTEXT.md`(或 `CONTEXT-MAP.md`)
|
|
36
|
+
- 经用户确认后在 `speculo/.speculo/.config/adr/` 新建 ADR
|
|
37
|
+
- 需要用户决策的术语 / 边界问题,每次只问一个
|
|
38
|
+
|
|
39
|
+
(`<change>` 格式:`YYYY-MM-DD-<kebab-name>`)
|
|
40
|
+
|
|
41
|
+
### 会话期间(主动纪律)
|
|
42
|
+
|
|
43
|
+
在讨论进行中持续执行,**不要批量**——在发生的当下捕获:
|
|
44
|
+
|
|
45
|
+
- **对照词汇表挑战**:用户用词与 CONTEXT 现有语言冲突时立即指出。「你的词汇表把『取消』定义为 X,但你似乎指 Y——到底是哪个?」
|
|
46
|
+
- **锐化模糊语言**:用户用含混或一词多义术语时,提出一个精确的规范术语。「你说『账户』——是指 Customer 还是 User?它们是不同的东西。」
|
|
47
|
+
- **用具体场景压测**:讨论领域关系时,发明探测边界的场景,迫使精确界定概念之间的边界。
|
|
48
|
+
- **与代码交叉引用**:用户陈述某事如何运作时,核对代码是否一致;矛盾即指出。「你的代码取消整个 Order,但你刚说支持部分取消——哪个对?」
|
|
49
|
+
- **内联沉淀**:术语一旦解决,立即按 `CONTEXT-FORMAT.md` 更新(用户确认后写 `.config/context/`);未确认的只记到 `domain-model-log.md`。
|
|
50
|
+
- **有节制地提供 ADR**:仅当「难以逆转 + 缺上下文会令人意外 + 真实权衡的结果」三条全部满足时,才按 `ADR-FORMAT.md` 提议创建 ADR;任一不满足则跳过。
|
|
51
|
+
|
|
52
|
+
> `CONTEXT.md` 必须完全不含实现细节——它是词汇表,不是 spec、草稿本或实现决策仓库。
|
|
53
|
+
|
|
54
|
+
### 渐进披露
|
|
55
|
+
|
|
56
|
+
- `CONTEXT-FORMAT.md`:撰写或更新项目术语表(CONTEXT / CONTEXT-MAP)时读取——**通用语言格式的单一事实源**。
|
|
57
|
+
- `ADR-FORMAT.md`:判断是否该写 ADR、以何种格式写时读取——**ADR 格式与判据的单一事实源**。
|
|
58
|
+
|
|
59
|
+
### 独立使用
|
|
60
|
+
|
|
61
|
+
本工作流**零硬依赖**,无需预先执行其他工作流即可独立进入(`dev/M`)。只需用户的领域讨论 + 当前 git 仓库即可启动;缺 change 目录时按下「自初始化」创建。
|
|
62
|
+
|
|
63
|
+
### 缺少 change 目录时的自初始化
|
|
64
|
+
|
|
65
|
+
若当前无对应 change 目录:
|
|
66
|
+
|
|
67
|
+
1. 从用户意图提取 `<kebab-name>`(如 `model-ordering-terms`)
|
|
68
|
+
2. 创建 `speculo/.speculo/dev/<YYYY-MM-DD>-<kebab-name>/`
|
|
69
|
+
3. 初始化 `.status.json`:
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"dev_entry": "dev/M",
|
|
73
|
+
"current_phase": "1. Model Session",
|
|
74
|
+
"phase_history": [],
|
|
75
|
+
"change_status": "active",
|
|
76
|
+
"embedded_guides": ["domain-modeling"],
|
|
77
|
+
"terms_resolved": [],
|
|
78
|
+
"adr_candidates": [],
|
|
79
|
+
"context_write_status": "none"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
4. 在 `speculo/.speculo/dev-status.json` 的 `active` 数组追加该 change 目录名
|
|
83
|
+
|
|
84
|
+
## 阶段
|
|
85
|
+
|
|
86
|
+
> **惰性创建文件**——只在需要写入时才创建。`.config/context/CONTEXT.md` 与 `.config/adr/` 由 Speculo 初始化提供;若目标项目缺失,在第一个术语 / ADR 解决时按需创建。
|
|
87
|
+
|
|
88
|
+
### 1. Model Session — 词汇与决策沉淀
|
|
89
|
+
- 规范:本入口「会话期间(主动纪律)」+ 同目录 `CONTEXT-FORMAT.md`、`ADR-FORMAT.md`
|
|
90
|
+
- 模板:`../_templates/domain-model-log-template.md`
|
|
91
|
+
- 产物:`domain-model-log.md`;经用户确认后更新 `.config/context/` 与 `.config/adr/`
|
|
92
|
+
- 完成准则:
|
|
93
|
+
- 每个被挑战 / 锐化的术语都有结论(已写入 CONTEXT 或记为 `[待确认]`)
|
|
94
|
+
- 每个 ADR 候选都已按三条判据裁决(提议创建,或显式跳过并记原因)
|
|
95
|
+
- 写入 `.config/context/` 或 `.config/adr/` 的内容均经用户确认
|
|
96
|
+
- `domain-model-log.md` 无残留 `[TODO:]`
|
|
97
|
+
|
|
98
|
+
## 依赖
|
|
99
|
+
|
|
100
|
+
- 硬依赖:无
|
|
101
|
+
- 软依赖:无。可独立进入;也被 `../01-grill-with-docs/01-grill-with-docs.md`、`../02-prd/02-prd.md`、`../04-finalize/04-finalize.md`、`../D-docs-sync/D-docs-sync.md`、`../A-improve-architecture/A-improve-architecture.md` 在其阶段中引用。
|
|
102
|
+
|
|
103
|
+
## 状态扩展字段
|
|
104
|
+
|
|
105
|
+
本工作流需在同 change 的 `.status.json` 追加:
|
|
106
|
+
|
|
107
|
+
- `dev_entry` (string) — 固定为 `dev/M`
|
|
108
|
+
- `embedded_guides` (array) — 包含 `domain-modeling`
|
|
109
|
+
- `terms_resolved` (array) — 本会话解决的术语及结论
|
|
110
|
+
- `adr_candidates` (array) — ADR 候选及裁决(`created` | `skipped` + 原因)
|
|
111
|
+
- `context_write_status` (none | logged | context-updated | adr-created) — 领域模型沉淀状态
|
|
112
|
+
|
|
113
|
+
## 完成与状态更新
|
|
114
|
+
|
|
115
|
+
- 进入 phase 时更新 `current_phase` 和 `phase_history`。
|
|
116
|
+
- 术语 / 决策沉淀后更新 `terms_resolved`、`adr_candidates`、`context_write_status`。
|
|
117
|
+
- 写 `.config/context/` 或 `.config/adr/` **前必须经用户确认**(持久化写入责任表中,这两处 AI 仅在用户确认后写入)。
|
|
118
|
+
- 本工作流不自动完成 change;嵌入其他工作流时随宿主流程推进。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
> **服务工作流:** `../M-domain-modeling/M-domain-modeling.md`
|
|
2
|
+
> **产物文件名:** `domain-model-log.md`
|
|
3
|
+
> **父目录规则:** 本模板产物写入 `YYYY-MM-DD-<kebab-name>/` change 目录内
|
|
4
|
+
|
|
5
|
+
# Domain Model Log
|
|
6
|
+
|
|
7
|
+
## 术语沉淀
|
|
8
|
+
[TODO: 逐条记录本会话挑战或锐化的术语。每条含:术语、结论(规范词 + 避免使用的别名)、是否已写入 `speculo/.speculo/.config/context/CONTEXT.md`(已写入 / `[待确认]`)。]
|
|
9
|
+
|
|
10
|
+
## 场景压测
|
|
11
|
+
[TODO: 记录用于界定边界的具体场景,以及由此确定的概念边界结论。无则写「无」。]
|
|
12
|
+
|
|
13
|
+
## 代码交叉核对
|
|
14
|
+
[TODO: 记录领域陈述与代码现实的核对结果(一致 / 矛盾及处置)。无则写「无」。]
|
|
15
|
+
|
|
16
|
+
## ADR 候选与裁决
|
|
17
|
+
[TODO: 逐条列出 ADR 候选。每条按三条判据(难以逆转 / 缺上下文会令人意外 / 真实权衡)裁决:`created`(编号 + `.config/adr/` 路径)或 `skipped`(原因)。无则写「无」。]
|
|
18
|
+
|
|
19
|
+
## 待确认
|
|
20
|
+
[TODO: 仍需用户决策的术语 / 边界 / 决策分支,每条一行。无则写「无」。]
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
> **服务工作流:** `../I-to-issues/I-to-issues.md`
|
|
2
2
|
> **产物文件名:** `slices.md`
|
|
3
3
|
> **父目录规则:** 本模板产物写入 `YYYY-MM-DD-<kebab-name>/` change 目录内
|
|
4
|
+
> **填写纪律:** 本模板遵循六段高质量 plan 纪律——当前现状 → 需读文件 → 需改文件 → 数据库表 → 实现要点 → 关键决策;标「条件段」的小节按需填写,单文件小改的最小形态为 §0(简) + §1 + §3(单切片) + §5 + §8。
|
|
4
5
|
|
|
5
6
|
# 切片计划(Vertical Slices)
|
|
6
7
|
|
|
7
|
-
> 本文件是一份可被下游直接接手的切片计划:以厚 Context(已确认决策 + 关键核实结论)开篇,
|
|
8
|
-
>
|
|
8
|
+
> 本文件是一份可被下游直接接手的切片计划:以厚 Context(已确认决策 + 当前现状 + 关键核实结论)开篇,
|
|
9
|
+
> 按依赖排序的切片展开,每切片标注需读/需改文件、实现要点与保留/不动,并以分层验证收口。
|
|
9
10
|
> 每个切片有 `<phase id="...">` 标识,供 TDD 工作流直接引用。
|
|
10
11
|
> 标「条件段」的小节按需填写;单文件小改的最小形态为 §0(简) + §1 + §3(单切片) + §5 + §8。
|
|
11
12
|
|
|
@@ -13,6 +14,7 @@
|
|
|
13
14
|
|
|
14
15
|
- **一句话战略:** [TODO: 做什么 + 为什么 + 怎么做到(新建 / 复用 / 以现有系统为基底)。]
|
|
15
16
|
- **已确认决策:** [TODO: 逐条列出与用户拍板的范围/取舍决策;有 decision-log.md 则继承其「已确认决策」段。]
|
|
17
|
+
- **当前现状:** [TODO: 逐条列出与需求不符的现有实现——文件路径:行号 + 当前值/行为 + 为什么不满足需求;独立进入时从代码库探索采集。]
|
|
16
18
|
- **关键核实结论:** [TODO: 探索确认的事实(依赖 / 唯一调用点 / 可删须留边界)。注明:行号为近似,实施时以现场代码为准。]
|
|
17
19
|
- **预期产出:** [TODO: 1–2 句,本 change 完成后的可观察结果。]
|
|
18
20
|
|
|
@@ -26,6 +28,13 @@
|
|
|
26
28
|
## 2. 架构上下文
|
|
27
29
|
[TODO: 条件段——涉及的模块与职责分工、新增模块定位、不可逾越约束;可附 ASCII 分层图与依赖方向。单文件修复可删除本节。]
|
|
28
30
|
|
|
31
|
+
## 2.5. 涉及的数据库表
|
|
32
|
+
[TODO: 条件段——若涉及 schema 变更,用 | 表 | 变更 | 表记录:
|
|
33
|
+
- 新建表:列出全部字段 + PK + UK + INDEX,注明 DDL 追加到哪个 sql 文件末尾
|
|
34
|
+
- 新增字段:字段名 类型 DEFAULT 默认值 COMMENT '注释',注明 ALTER TABLE 追加位置
|
|
35
|
+
- 字段语义调整:旧字段名 → 新语义(不变更结构)
|
|
36
|
+
- 无 schema 变更则删除本节]
|
|
37
|
+
|
|
29
38
|
## 3. 切片
|
|
30
39
|
|
|
31
40
|
### 切片 1 · [切片名称]
|
|
@@ -34,9 +43,12 @@
|
|
|
34
43
|
- **类型:** AFK | HITL
|
|
35
44
|
- **阻塞于:** 无
|
|
36
45
|
- **覆盖:** [TODO: PRD 章节 / US 编号 / 用户故事]
|
|
46
|
+
- **需阅读的文件:** [TODO: | 文件 | 目的 |;单文件小改可省略]
|
|
37
47
|
- **交付物:** [TODO: 具体文件/模块/功能;改动面宽时可用 | 文件 | 改动 | 表逐文件列出]
|
|
48
|
+
- **需修改的文件:** [TODO: | 文件 | 改动内容 |;新增文件标 **新增**,重度重构标 **重度重构**]
|
|
38
49
|
- **保留/不动:** [TODO: 本切片不能碰的代码/契约/数据;无则写「无」]
|
|
39
50
|
- **复用:** [TODO: 复用哪些现有能力]
|
|
51
|
+
- **实现要点:** [TODO: 关键技术决策、算法细节、并发控制、兜底策略(编号列表);单文件小改可省略]
|
|
40
52
|
- **验收切片:** [TODO: 可独立执行的验证命令或步骤;删除型须含残留扫描 grep 0 命中]
|
|
41
53
|
- **对齐:** [TODO: PRD FR-xxx 或 issue 引用]
|
|
42
54
|
- **ADR 引用:** [TODO: 关联的 ADR 编号,可选]
|
|
@@ -47,9 +59,12 @@
|
|
|
47
59
|
- **类型:** AFK | HITL
|
|
48
60
|
- **阻塞于:** 切片 1
|
|
49
61
|
- **覆盖:** [TODO]
|
|
62
|
+
- **需阅读的文件:** [TODO: | 文件 | 目的 |;单文件小改可省略]
|
|
50
63
|
- **交付物:** [TODO]
|
|
64
|
+
- **需修改的文件:** [TODO: | 文件 | 改动内容 |]
|
|
51
65
|
- **保留/不动:** [TODO]
|
|
52
66
|
- **复用:** [TODO]
|
|
67
|
+
- **实现要点:** [TODO]
|
|
53
68
|
- **验收切片:** [TODO]
|
|
54
69
|
- **对齐:** [TODO]
|
|
55
70
|
- **ADR 引用:** [TODO]
|
|
@@ -67,6 +82,9 @@ P1 phase1-xxx 切片名称 依赖 P0
|
|
|
67
82
|
]
|
|
68
83
|
```
|
|
69
84
|
|
|
85
|
+
## 5.5. 关键决策
|
|
86
|
+
[TODO: 汇总影响全局或跨切片的技术选型与取舍,如方案选择(工具类 vs 正则)、字段复用/新建决策、SQL 追加规则等。防止下游对同一问题反复争论。单文件小改可删除本节。]
|
|
87
|
+
|
|
70
88
|
## 6. 风险与回滚
|
|
71
89
|
[TODO: 条件段——本期涉及删除/数据迁移/外部副作用/高耦合时填:风险 / 触发条件 / 缓解 / 回滚 表;有 prd-overview.md 风险则继承细化。纯增量小改可删除本节。]
|
|
72
90
|
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# 深模块
|
|
2
|
-
|
|
3
|
-
来自《A Philosophy of Software Design》:
|
|
4
|
-
|
|
5
|
-
**深模块** = 小接口 + 大量实现
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
┌─────────────────────┐
|
|
9
|
-
│ 小接口 │ ← 方法少,参数简单
|
|
10
|
-
├─────────────────────┤
|
|
11
|
-
│ │
|
|
12
|
-
│ │
|
|
13
|
-
│ 深层实现 │ ← 复杂逻辑被隐藏
|
|
14
|
-
│ │
|
|
15
|
-
│ │
|
|
16
|
-
└─────────────────────┘
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
**浅模块** = 大接口 + 很少实现(应避免)
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
┌─────────────────────────────────┐
|
|
23
|
-
│ 大接口 │ ← 方法多,参数复杂
|
|
24
|
-
├─────────────────────────────────┤
|
|
25
|
-
│ 薄实现 │ ← 只是透传
|
|
26
|
-
└─────────────────────────────────┘
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
设计接口时,问自己:
|
|
30
|
-
|
|
31
|
-
- 能否减少方法数量?
|
|
32
|
-
- 能否简化参数?
|
|
33
|
-
- 能否把更多复杂性隐藏在里面?
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# 面向可测试性的接口设计
|
|
2
|
-
|
|
3
|
-
好的接口让测试变得自然:
|
|
4
|
-
|
|
5
|
-
1. **接受依赖,而不是自己创建**
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
// 易于测试
|
|
9
|
-
function processOrder(order, paymentGateway) {}
|
|
10
|
-
|
|
11
|
-
// 难以测试
|
|
12
|
-
function processOrder(order) {
|
|
13
|
-
const gateway = new StripeGateway();
|
|
14
|
-
}
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
2. **返回结果,而不是产生副作用**
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
20
|
-
// 易于测试
|
|
21
|
-
function calculateDiscount(cart): Discount {}
|
|
22
|
-
|
|
23
|
-
// 难以测试
|
|
24
|
-
function applyDiscount(cart): void {
|
|
25
|
-
cart.total -= discount;
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
3. **小表面积**
|
|
30
|
-
- 方法越少 = 需要的测试越少
|
|
31
|
-
- 参数越少 = 测试准备越简单
|