@namewta/speculo 0.2.2 → 0.2.6
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 +11 -15
- package/dist/src/index.js +72 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/migrate.js +8 -8
- package/dist/src/migrate.js.map +1 -1
- package/dist/src/workflows.js +2 -2
- package/dist/src/workflows.js.map +1 -1
- package/package.json +1 -1
- package/template/.speculo/README.md +3 -3
- package/template/AGENTS.md +4 -0
- package/template/CLAUDE.md +3 -0
- package/template/canonical/README.md +114 -0
- package/template/canonical/canonical-domain-modeling.md +289 -0
- package/template/canonical/canonical-skill-example.md +608 -0
- package/template/canonical/canonical-teach.md +296 -0
- package/template/commands/archive-and-consolidate.md +49 -0
- package/template/commands/docs-sync.md +2 -2
- package/template/commands/retro.md +9 -7
- package/template/commands/status.md +2 -2
- package/template/skills/archive-and-consolidate/SKILL.md +179 -0
- package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +34 -0
- package/template/skills/archive-and-consolidate/assets/cleanup-candidate-template.md +69 -0
- package/template/skills/archive-and-consolidate/assets/consolidation-plan-template.md +67 -0
- package/template/skills/archive-and-consolidate/references/archive-rules.md +48 -0
- package/template/skills/archive-and-consolidate/references/cleanup-rules.md +73 -0
- package/template/skills/archive-and-consolidate/references/consolidation-rules.md +70 -0
- package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +50 -0
- package/template/skills/docs-sync/SKILL.md +1 -1
- package/template/skills/docs-sync/references/readme-contract.md +2 -0
- package/template/skills/docs-sync/references/readme-writing-guide.md +294 -0
- package/template/skills/docs-sync/references/workflow-scope-contract.md +3 -3
- package/template/skills/speculo-retro/SKILL.md +1 -1
- package/template/skills/speculo-retro/references/issue-drafting-sop.md +1 -1
- package/template/skills/worktree-isolation/references/merge-and-cleanup.md +2 -2
- package/template/vendor/README.md +3 -3
- package/template/vendor/khazix-skills/neat-freak/SKILL.md +210 -0
- package/template/vendor/khazix-skills/neat-freak/references/agent-paths.md +72 -0
- package/template/vendor/khazix-skills/neat-freak/references/governance.md +88 -0
- package/template/vendor/khazix-skills/neat-freak/references/sync-matrix.md +77 -0
- package/template/vendor/khazix-skills/neat-freak/references/verification.md +92 -0
- package/template/vendor/khazix-skills/neat-freak/scripts/audit-inventory.sh +106 -0
- package/template/workflows/person/INDEX.md +12 -0
- package/template/workflows/person/M-mao-zedong-cognitive-os/M-mao-zedong-cognitive-os.md +73 -74
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +85 -0
- package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +37 -0
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +84 -0
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +46 -0
- package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +51 -0
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +54 -0
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +77 -0
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +63 -0
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +93 -0
- package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +54 -0
- package/template/workflows/specdev/G-grill-with-docs/log-format.md +99 -0
- package/template/workflows/specdev/I-implement/I-implement.md +85 -0
- package/template/workflows/specdev/I-implement/code-review-process.md +83 -0
- package/template/workflows/specdev/I-implement/codebase-design-glossary.md +109 -0
- package/template/workflows/specdev/I-implement/deepening.md +37 -0
- package/template/workflows/specdev/I-implement/design-it-twice.md +44 -0
- package/template/workflows/specdev/I-implement/tdd-examples.md +139 -0
- package/template/workflows/specdev/I-implement/tdd-rules.md +31 -0
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +132 -0
- package/template/workflows/specdev/I-init-setup/domain-layout.md +90 -0
- package/template/workflows/specdev/I-init-setup/status-labels.md +54 -0
- package/template/workflows/specdev/I-init-setup/tracking-convention.md +58 -0
- package/template/workflows/specdev/INDEX.md +81 -0
- package/template/workflows/specdev/S-spec/S-spec.md +91 -0
- package/template/workflows/specdev/T-tickets/T-tickets.md +241 -0
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +209 -0
- package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
- package/template/workflows/specdev/_state/archive/.gitkeep +0 -0
- package/template/workflows/specdev/_state/changes/.gitkeep +0 -0
- package/template/workflows/specdev/_state/context/.gitkeep +0 -0
- package/template/workflows/{matt-pocock → specdev}/_state/status.json +1 -1
- package/template/commands/finalize.md +0 -37
- package/template/commands/knowledge-prune.md +0 -20
- package/template/skills/change-lifecycle/SKILL.md +0 -25
- package/template/skills/change-lifecycle/assets/completion-summary-template.md +0 -25
- package/template/skills/change-lifecycle/assets/completion-verification-template.md +0 -29
- package/template/skills/change-lifecycle/references/completion-gate.md +0 -19
- package/template/skills/change-lifecycle/references/finalize-archive.md +0 -32
- package/template/skills/knowledge-prune/SKILL.md +0 -29
- package/template/skills/knowledge-prune/references/audit-rules.md +0 -24
- package/template/skills/runtime-context/SKILL.md +0 -54
- package/template/skills/runtime-context/references/path-resolution.md +0 -41
- package/template/workflows/matt-pocock/PERSISTENCE.md +0 -80
- package/template/workflows/matt-pocock/WORKFLOW.md +0 -103
- package/template/workflows/matt-pocock/_state/archive/.gitkeep +0 -1
- package/template/workflows/matt-pocock/_state/changes/.gitkeep +0 -1
- package/template/workflows/matt-pocock/atomic-skills/ask-matt.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/claude-handoff.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/code-review.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/codebase-design.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/diagnosing-bugs.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/domain-modeling.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/grill-me.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/grill-with-docs.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/grilling.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/handoff.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/implement.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/improve-codebase-architecture.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/loop-me.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/prototype.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/research.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/resolving-merge-conflicts.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/setup-matt-pocock-skills.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/tdd.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/teach.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/to-spec.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/to-tickets.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/triage.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/wayfinder.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/wizard.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-beats.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-fragments.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-great-skills.md +0 -21
- package/template/workflows/matt-pocock/atomic-skills/writing-shape.md +0 -20
- package/template/workflows/matt-pocock/routes/architecture.md +0 -24
- package/template/workflows/matt-pocock/routes/diagnose.md +0 -22
- package/template/workflows/matt-pocock/routes/experimental.md +0 -18
- package/template/workflows/matt-pocock/routes/idea-to-delivery.md +0 -63
- package/template/workflows/matt-pocock/routes/merge-conflicts.md +0 -19
- package/template/workflows/matt-pocock/routes/productivity.md +0 -25
- package/template/workflows/matt-pocock/routes/research-prototype.md +0 -20
- package/template/workflows/matt-pocock/routes/review.md +0 -19
- package/template/workflows/matt-pocock/routes/setup.md +0 -42
- package/template/workflows/matt-pocock/routes/triage.md +0 -25
- package/template/workflows/matt-pocock/routes/wayfinder.md +0 -27
- package/template/workflows/person/PERSISTENCE.md +0 -56
- package/template/workflows/person/WORKFLOW.md +0 -50
- package/template/workflows/person/_state/.config/LESSONS.md +0 -3
- package/template/workflows/person/_state/.config/RULES.md +0 -3
- package/template/workflows/person/_state/.config/context/.gitkeep +0 -1
- package/template/workflows/person/_templates/mao-consultation-output-template.md +0 -55
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: specdev/init-setup
|
|
3
|
+
type: workflow-entry
|
|
4
|
+
workflow: specdev
|
|
5
|
+
name: 初始化设置
|
|
6
|
+
description: 为 specdev workflow 配置变更追踪、领域文档布局、状态标签和语言偏好。首次使用其他 specdev works 前运行一次。
|
|
7
|
+
keywords: [初始化, 配置, 设置, setup]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 初始化设置
|
|
11
|
+
|
|
12
|
+
为 specdev workflow 搭建本地持久化配置——变更追踪约定、领域文档布局、状态标签映射和交互语言偏好。这是一个提示驱动的入口,先探索,展示发现结果,与用户确认,然后写入。
|
|
13
|
+
|
|
14
|
+
所有配置产物写入 `<Path>{roots.state}/specdev/</Path>` 下:
|
|
15
|
+
|
|
16
|
+
- **变更追踪约定** → `<Path>{roots.state}/specdev/.config/tracking.md</Path>` —— 变更以本地 markdown 目录形式管理
|
|
17
|
+
- **领域文档布局** → `<Path>{roots.state}/specdev/.config/domain-layout.md</Path>` —— 三文件模型(ADR/LOG/CONTEXT)的读写规则
|
|
18
|
+
- **状态标签映射** → `<Path>{roots.state}/specdev/.config/status-labels.md</Path>` —— 五个标准 triage 角色的标签字符串
|
|
19
|
+
- **语言与配置** → `<Path>{roots.state}/specdev/config.json</Path>` —— 交互语言、报告语言和持久化设置
|
|
20
|
+
|
|
21
|
+
首次使用 specdev 的任意 work 之前运行一次。之后可直接编辑 `<Path>{roots.state}/specdev/.config/</Path>` 下的文件进行调整,无需重新运行。
|
|
22
|
+
|
|
23
|
+
## 流程
|
|
24
|
+
|
|
25
|
+
### 1. 探索
|
|
26
|
+
|
|
27
|
+
查看当前仓库以了解 specdev 的初始配置状态。读取已有内容;不要假设:
|
|
28
|
+
|
|
29
|
+
- `<Path>{roots.state}/specdev/config.json</Path>` —— 全局配置文件是否已存在?若存在,读取其内容
|
|
30
|
+
- `<Path>{roots.state}/specdev/.config/tracking.md</Path>` —— 变更追踪约定是否已配置?
|
|
31
|
+
- `<Path>{roots.state}/specdev/.config/domain-layout.md</Path>` —— 领域文档布局是否已配置?
|
|
32
|
+
- `<Path>{roots.state}/specdev/.config/status-labels.md</Path>` —— 状态标签映射是否已配置?
|
|
33
|
+
- `<Path>{roots.state}/specdev/status.json</Path>` —— 当前是否有活跃变更?
|
|
34
|
+
- `<Path>{roots.state}/specdev/changes/</Path>` —— 已有哪些变更目录?
|
|
35
|
+
- `<Path>{roots.state}/specdev/archive/</Path>` —— 归档了哪些历史变更?
|
|
36
|
+
|
|
37
|
+
总结已存在的和缺失的内容。
|
|
38
|
+
|
|
39
|
+
**完成标准**:当前 `<Path>{roots.state}/specdev/</Path>` 和已有配置已摸底,已存在的和缺失的内容已明确。
|
|
40
|
+
|
|
41
|
+
然后进入配置阶段——**逐项**引导用户完成四项决策:展示一节,获得用户回答,然后进入下一节。不要一次抛出全部四项。每个配置阶段之前,简短解释它是什么、specdev 的 works 为什么需要它、选择不同会有什么变化。
|
|
42
|
+
|
|
43
|
+
### 2. 变更追踪
|
|
44
|
+
|
|
45
|
+
specdev 的变更追踪使用**本地 markdown** 作为唯一选项。变更以目录形式存放在 `<Path>{roots.state}/specdev/changes/<YYYY-MM-DD>-<topic>/</Path>` 下,通过 `<Path>{roots.state}/specdev/status.json</Path>` 的 `active` 数组追踪当前活跃变更。
|
|
46
|
+
|
|
47
|
+
变更追踪是 specdev 记录工作进度的地方。当你运行 `S-spec`、`I-implement`、`G-grill-with-docs` 等 work 时,它们会将产物写入当前变更目录。与 GitHub Issues 或 Jira 不同,本地 markdown 方式让所有工作产物(需求文档、设计决策、实现记录)与代码存放在同一仓库中,无需网络连接,且完全由 git 版本控制。
|
|
48
|
+
|
|
49
|
+
确认用户理解此约定后,将详细规则写入 `<Path>{roots.state}/specdev/.config/tracking.md</Path>`。
|
|
50
|
+
|
|
51
|
+
详细约定参见 `<Path>{roots.workflows}/specdev/I-init-setup/tracking-convention.md</Path>`。
|
|
52
|
+
|
|
53
|
+
**完成标准**:变更追踪约定已确认并写入 `<Path>{roots.state}/specdev/.config/tracking.md</Path>`。
|
|
54
|
+
|
|
55
|
+
### 3. 领域文档布局
|
|
56
|
+
|
|
57
|
+
specdev 使用**单上下文**布局。每个变更目录 `<Path>{roots.state}/specdev/changes/{change}/</Path>` 下维护三个文件:
|
|
58
|
+
|
|
59
|
+
- **CONTEXT.md** —— 项目领域术语与概念
|
|
60
|
+
- **ADR.md** —— 架构决策记录(本变更相关的决策)
|
|
61
|
+
- **LOG.md** —— 设计决策日志(按时间顺序记录每次设计调整)
|
|
62
|
+
|
|
63
|
+
部分 specdev work(如 `G-grill-with-docs`、`I-implement`)在探索代码库时会读取 CONTEXT.md 了解项目的领域语言,以及 ADR.md 了解过去的架构决策。单上下文意味着整个 specdev workflow 共享一套术语和决策记录,所有变更目录下的三文件模型均遵循相同约定。
|
|
64
|
+
|
|
65
|
+
确认用户理解此布局后,将消费方规则写入 `<Path>{roots.state}/specdev/.config/domain-layout.md</Path>`。
|
|
66
|
+
|
|
67
|
+
详细约定参见 `<Path>{roots.workflows}/specdev/I-init-setup/domain-layout.md</Path>`。
|
|
68
|
+
|
|
69
|
+
**完成标准**:领域文档布局已确认——三文件(ADR/LOG/CONTEXT)持久化到 `<Path>{roots.state}/specdev/changes/{change}/</Path>`,消费方规则已写入。
|
|
70
|
+
|
|
71
|
+
### 4. 状态标签
|
|
72
|
+
|
|
73
|
+
specdev 使用五个标准状态角色来追踪工作项的生命周期:
|
|
74
|
+
|
|
75
|
+
| 角色 | 默认标签 | 含义 |
|
|
76
|
+
|------|---------|------|
|
|
77
|
+
| `needs-triage` | `needs-triage` | 需要评估 |
|
|
78
|
+
| `needs-info` | `needs-info` | 等待补充信息 |
|
|
79
|
+
| `ready-for-agent` | `ready-for-agent` | 可执行(agent 无需额外人工上下文即可领取) |
|
|
80
|
+
| `ready-for-human` | `ready-for-human` | 需人工处理 |
|
|
81
|
+
| `wontfix` | `wontfix` | 不处理 |
|
|
82
|
+
|
|
83
|
+
当 `T-tickets`、`W-wayfinder` 等 work 处理工作项时,它们会将工作项移过一个状态机——需要评估、等待补充、可供 agent 领取、需人工处理、或不予处理。状态标签是这些状态在持久化文件中的字符串表示。默认每个角色的标签等于其名称,如果你的项目已有不同命名习惯,可以在此映射。
|
|
84
|
+
|
|
85
|
+
确认用户是否接受默认标签,或需要覆盖为自定义字符串。将映射写入 `<Path>{roots.state}/specdev/.config/status-labels.md</Path>`。
|
|
86
|
+
|
|
87
|
+
详细约定参见 `<Path>{roots.workflows}/specdev/I-init-setup/status-labels.md</Path>`。
|
|
88
|
+
|
|
89
|
+
**完成标准**:状态标签映射已确认并写入 `<Path>{roots.state}/specdev/.config/status-labels.md</Path>`。
|
|
90
|
+
|
|
91
|
+
### 5. 语言与配置
|
|
92
|
+
|
|
93
|
+
询问用户两项语言偏好:
|
|
94
|
+
|
|
95
|
+
- **交互语言** —— specdev 与用户交互时使用的语言。选项:`zh-CN`(简体中文)、`en`(英文)。默认:`zh-CN`。
|
|
96
|
+
- **报告语言** —— AI 生成产物(Markdown 文档、issue 正文、报告)的默认语言。默认与交互语言相同。
|
|
97
|
+
|
|
98
|
+
specdev 使用 `<Path>{roots.state}/specdev/config.json</Path>` 存储全局配置。所有 specdev works 在启动时读取此文件以自动选择交互语言和确认策略,无需每次手动指定。
|
|
99
|
+
|
|
100
|
+
将配置写入 `<Path>{roots.state}/specdev/config.json</Path>`:
|
|
101
|
+
|
|
102
|
+
```jsonc
|
|
103
|
+
{
|
|
104
|
+
"schema_version": 1,
|
|
105
|
+
"language": "<用户选择的交互语言>",
|
|
106
|
+
"persistence": {
|
|
107
|
+
"root_override": null
|
|
108
|
+
},
|
|
109
|
+
"defaults": {
|
|
110
|
+
"confirm_before_external_write": true,
|
|
111
|
+
"report_language": "<用户选择的报告语言>"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
如果 `<Path>{roots.state}/specdev/config.json</Path>` 已存在,仅更新用户本次修改的字段,保留其他现有值。
|
|
117
|
+
|
|
118
|
+
**完成标准**:语言偏好和配置已写入 `<Path>{roots.state}/specdev/config.json</Path>`。
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
配置完成后,提醒用户可以直接编辑 `<Path>{roots.state}/specdev/.config/</Path>` 下的文件进行调整。只有在需要从头重新配置时才需重新运行本入口。
|
|
123
|
+
|
|
124
|
+
## 子文件引用
|
|
125
|
+
|
|
126
|
+
以下子文件包含各配置阶段的详细约定和消费方规则,仅在对应步骤进入时加载:
|
|
127
|
+
|
|
128
|
+
| 文件 | 内容 | 触发条件 |
|
|
129
|
+
|------|------|---------|
|
|
130
|
+
| `<Path>{roots.workflows}/specdev/I-init-setup/tracking-convention.md</Path>` | 本地 markdown 变更追踪的读写约定 | 步骤 2「变更追踪」进入时 |
|
|
131
|
+
| `<Path>{roots.workflows}/specdev/I-init-setup/domain-layout.md</Path>` | 单上下文三文件模型的路径解析和消费方规则 | 步骤 3「领域文档布局」进入时 |
|
|
132
|
+
| `<Path>{roots.workflows}/specdev/I-init-setup/status-labels.md</Path>` | 五个标准状态角色的标签字符串映射 | 步骤 4「状态标签」进入时 |
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# 领域文档布局
|
|
2
|
+
|
|
3
|
+
specdev 各 work 在探索代码库时应如何使用该仓库的领域文档。
|
|
4
|
+
|
|
5
|
+
## 布局:单上下文
|
|
6
|
+
|
|
7
|
+
specdev 使用单上下文布局——整个 workflow 共享一套领域术语和架构决策。每个变更目录 `changes/<change>/` 下维护三文件模型:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
{state_root}/changes/<change>/
|
|
11
|
+
├── CONTEXT.md ← 项目领域术语与概念
|
|
12
|
+
├── ADR.md ← 本变更相关的架构决策记录
|
|
13
|
+
└── LOG.md ← 设计决策日志(按时间顺序记录每次设计调整)
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- **CONTEXT.md** —— 定义项目特有的领域概念和术语表。各 work 在输出中引用领域概念时以本文档为准。
|
|
17
|
+
- **ADR.md** —— 记录本变更范围内的架构决策(格式:`## ADR-NNNN: 标题`)。如果变更跨多个上下文,决策记录在触发该决策的变更目录下。
|
|
18
|
+
- **LOG.md** —— 按时间倒序记录每次设计调整、决策变更及其原因。格式:`## YYYY-MM-DD HH:MM — 标题`,每次记录包含:**决策**(做什么)、**原因**(为什么)、**影响**(影响哪些 work/文件)。
|
|
19
|
+
|
|
20
|
+
> 与 vendor 技能(如 domain-modeling)描述的通用仓库布局不同,specdev 将所有领域文档限定在 `changes/<change>/` 目录内。当 vendor skill 指示"在仓库根目录创建 CONTEXT.md"时,specdev 的适配层将其翻译为写入 `{state_root}/changes/<change>/CONTEXT.md`。
|
|
21
|
+
|
|
22
|
+
## 路径解析规则
|
|
23
|
+
|
|
24
|
+
**本文件描述的路径均为相对于 `{state_root}` 的逻辑路径。** 实际写入时由 Speculo persistence 层映射到 `{roots.state}/specdev/` 命名空间下。
|
|
25
|
+
|
|
26
|
+
- `CONTEXT.md` → `{state_root}/changes/<current_change>/CONTEXT.md`
|
|
27
|
+
- `ADR.md` → `{state_root}/changes/<current_change>/ADR.md`
|
|
28
|
+
- `LOG.md` → `{state_root}/changes/<current_change>/LOG.md`
|
|
29
|
+
- `{state_root}` 由 runtime-context 解析为 `{roots.state}/specdev/`
|
|
30
|
+
- `<current_change>` 由 `status.json` 的 `active` 数组确定(取第一个活跃变更)
|
|
31
|
+
|
|
32
|
+
## 在探索之前
|
|
33
|
+
|
|
34
|
+
当 specdev work 需要领域上下文时,按以下顺序读取:
|
|
35
|
+
|
|
36
|
+
1. **`CONTEXT.md`**(位于当前变更目录内)—— 项目领域语言,由 `G-grill-with-docs` 或 `I-implement` 在探索代码库时创建或更新
|
|
37
|
+
2. **`ADR.md`**(位于当前变更目录内)—— 涉及当前变更的架构决策,由 `G-grill-with-docs` 在讨论架构时更新
|
|
38
|
+
3. **`LOG.md`**(位于当前变更目录内)—— 设计决策历史,由各 work 在设计调整时追加记录
|
|
39
|
+
|
|
40
|
+
如果这些文件都不存在,静默继续。不要标记它们的缺失或预先建议创建。`G-grill-with-docs` 和 `I-implement` 在领域知识或决策实际被确定时延迟创建它们。
|
|
41
|
+
|
|
42
|
+
## 使用术语表的词汇
|
|
43
|
+
|
|
44
|
+
输出中命名领域概念时,使用 `CONTEXT.md` 中定义的术语,不偏离到术语表明确避免的同义词。如果需要的新概念尚未在术语表中,记录到 `CONTEXT.md` 并通知用户。
|
|
45
|
+
|
|
46
|
+
如果 `CONTEXT.md` 不存在,在首次需要时由当前 work 创建骨架:
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
# CONTEXT — <change 主题>
|
|
50
|
+
|
|
51
|
+
## 领域术语
|
|
52
|
+
|
|
53
|
+
| 术语 | 定义 | 别名 / 避免使用 |
|
|
54
|
+
|------|------|----------------|
|
|
55
|
+
| ... | ... | ... |
|
|
56
|
+
|
|
57
|
+
## 边界上下文
|
|
58
|
+
|
|
59
|
+
<!-- 如有多个子域,在此划分边界 -->
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 标记 ADR 冲突
|
|
63
|
+
|
|
64
|
+
如果输出与现有 ADR 矛盾,明确提出而不是默默覆盖:
|
|
65
|
+
|
|
66
|
+
> _与 `<Path>{roots.state}/specdev/changes/<change>/ADR.md</Path>` 中的 ADR-NNNN 矛盾 — 但值得重新讨论,因为……_
|
|
67
|
+
|
|
68
|
+
同时将冲突记录追加到 `LOG.md`:
|
|
69
|
+
|
|
70
|
+
```markdown
|
|
71
|
+
## YYYY-MM-DD HH:MM — ADR 冲突标记
|
|
72
|
+
|
|
73
|
+
- **冲突**: 当前建议与 ADR-NNNN 矛盾
|
|
74
|
+
- **原因**: <重新讨论的理由>
|
|
75
|
+
- **影响**: 如采纳新方案,需更新 ADR.md 并记录迁移路径
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 写入 LOG.md
|
|
79
|
+
|
|
80
|
+
每次设计调整或决策变更时,在 `LOG.md` 顶部追加一条记录(时间倒序):
|
|
81
|
+
|
|
82
|
+
```markdown
|
|
83
|
+
## YYYY-MM-DD HH:MM — <简短标题>
|
|
84
|
+
|
|
85
|
+
- **决策**: <做了什么设计决定>
|
|
86
|
+
- **原因**: <为什么做这个决定>
|
|
87
|
+
- **影响**: <影响哪些 work、哪些文件、哪些后续步骤>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`LOG.md` 不同于 `ADR.md`:ADR 记录的是相对稳定的架构决策,LOG 记录的是日常设计调整的过程脉络。如果某条 LOG 记录具有长期参考价值,提取为 ADR。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# 状态标签
|
|
2
|
+
|
|
3
|
+
specdev 各 work 使用五种规范的状态角色来追踪工作项的生命周期。本文件将这些角色映射到持久化文件中使用的实际标签字符串。
|
|
4
|
+
|
|
5
|
+
| 角色 | 标签 | 含义 |
|
|
6
|
+
|------|------|------|
|
|
7
|
+
| `needs-triage` | `needs-triage` | 需要评估 —— 维护者需要判断此工作项的性质、优先级和归属 |
|
|
8
|
+
| `needs-info` | `needs-info` | 等待补充信息 —— 工作项描述不足,等待报告者或需求方提供更多上下文 |
|
|
9
|
+
| `ready-for-agent` | `ready-for-agent` | 可执行 —— 已完整定义,agent 无需额外人工上下文即可领取并开始工作 |
|
|
10
|
+
| `ready-for-human` | `ready-for-human` | 需人工处理 —— 工作项需要人工判断、审批或执行,不适合 agent 自动处理 |
|
|
11
|
+
| `wontfix` | `wontfix` | 不处理 —— 经评估后决定不予处理,保留记录以供追溯 |
|
|
12
|
+
|
|
13
|
+
## 使用方式
|
|
14
|
+
|
|
15
|
+
当 work 提及某个角色(例如"标记为需要评估"、"应用 ready-for-agent 状态")时,使用此表中对应的标签字符串写入持久化文件。
|
|
16
|
+
|
|
17
|
+
标签字符串写入位置取决于具体 work:
|
|
18
|
+
|
|
19
|
+
- **T-tickets** —— 写入工作项文件(`tickets/NN-<slug>.md`)顶部的 `Status:` 行
|
|
20
|
+
- **W-wayfinder** —— 写入 `wayfinder/map.md` 中工作项的状态标记
|
|
21
|
+
- **其他 work** —— 在变更目录的相应产物文件中以 frontmatter 或元数据行形式记录
|
|
22
|
+
|
|
23
|
+
## 状态流转
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
needs-triage ──→ needs-info ──→ needs-triage ──→ ready-for-agent
|
|
27
|
+
│ │
|
|
28
|
+
│ ├──→ ready-for-human
|
|
29
|
+
│ │
|
|
30
|
+
└──────────────────→ wontfix ←──────────────────┘
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- `needs-triage` → `needs-info`:评估后发现信息不足,退回补充
|
|
34
|
+
- `needs-triage` → `ready-for-agent`:已完整定义,可供 agent 执行
|
|
35
|
+
- `needs-triage` → `ready-for-human`:需要人工处理
|
|
36
|
+
- `needs-triage` → `wontfix`:决定不予处理
|
|
37
|
+
- `needs-info` → `needs-triage`:补充信息后重新评估
|
|
38
|
+
- `ready-for-agent` → `wontfix`:执行过程中发现不再适用
|
|
39
|
+
|
|
40
|
+
## 自定义标签
|
|
41
|
+
|
|
42
|
+
如果你的项目已有不同的标签命名习惯(例如使用 `bug:triage` 而不是 `needs-triage`),编辑右侧的"标签"列以匹配你实际使用的字符串。左侧的"角色"列不变——各 work 通过角色名引用状态,不直接依赖标签字符串。
|
|
43
|
+
|
|
44
|
+
例如,如果你的项目使用中文标签:
|
|
45
|
+
|
|
46
|
+
| 角色 | 标签 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| `needs-triage` | `待评估` |
|
|
49
|
+
| `needs-info` | `待补充` |
|
|
50
|
+
| `ready-for-agent` | `可执行` |
|
|
51
|
+
| `ready-for-human` | `需人工` |
|
|
52
|
+
| `wontfix` | `不处理` |
|
|
53
|
+
|
|
54
|
+
确保标签字符串在实际使用位置(tickets 文件、wayfinder 地图等)保持一致。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 变更追踪:本地 Markdown
|
|
2
|
+
|
|
3
|
+
specdev workflow 的变更以 markdown 目录形式存储在 `{roots.state}/specdev/changes/` 中。
|
|
4
|
+
|
|
5
|
+
## 约定
|
|
6
|
+
|
|
7
|
+
- 每个变更一个目录:`{roots.state}/specdev/changes/<YYYY-MM-DD>-<topic>/`
|
|
8
|
+
- 例如:`changes/2026-07-21-add-auth-layer/`
|
|
9
|
+
- 当前活跃变更通过 `{roots.state}/specdev/status.json` 的 `active` 数组追踪
|
|
10
|
+
- 归档变更移至:`{roots.state}/specdev/archive/YYYY-MM/<change>/`
|
|
11
|
+
- 例如:`archive/2026-07/2026-07-21-add-auth-layer/`
|
|
12
|
+
- 变更目录内的工作产物由各 work 定义,典型结构:
|
|
13
|
+
```
|
|
14
|
+
changes/<YYYY-MM-DD>-<topic>/
|
|
15
|
+
├── CONTEXT.md ← 领域术语与概念(由 domain-modeling 或 G-grill-with-docs 创建/更新)
|
|
16
|
+
├── ADR.md ← 架构决策记录(由 G-grill-with-docs 或 I-implement 创建/更新)
|
|
17
|
+
├── LOG.md ← 设计决策日志(按时间顺序记录每次设计调整)
|
|
18
|
+
├── spec.md ← 需求规格(由 S-spec 创建)
|
|
19
|
+
├── tickets/ ← 工作项(由 T-tickets 创建)
|
|
20
|
+
│ └── NN-<slug>.md
|
|
21
|
+
└── wayfinder/ ← 路线图(由 W-wayfinder 创建)
|
|
22
|
+
└── map.md
|
|
23
|
+
```
|
|
24
|
+
- `status.json` 结构:
|
|
25
|
+
```jsonc
|
|
26
|
+
{
|
|
27
|
+
"schema_version": 1,
|
|
28
|
+
"workflow": "specdev",
|
|
29
|
+
"active": [
|
|
30
|
+
"2026-07-21-add-auth-layer"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 当 work 说"发布到变更目录"时
|
|
36
|
+
|
|
37
|
+
在 `{roots.state}/specdev/changes/<change>/` 下创建或更新指定文件。如果变更目录尚未加入 `active` 数组,将其追加到 `status.json` 的 `active` 中。
|
|
38
|
+
|
|
39
|
+
例如:`S-spec` 说"将规格发布到变更目录" → 写入 `<Path>{roots.state}/specdev/changes/<change>/spec.md</Path>`。
|
|
40
|
+
|
|
41
|
+
## 当 work 说"获取当前变更"时
|
|
42
|
+
|
|
43
|
+
读取 `<Path>{roots.state}/specdev/status.json</Path>` 的 `active` 数组,获取当前活跃变更列表。如果存在多个活跃变更,提示用户选择目标变更。如果无活跃变更,提示用户先运行 `S-spec` 或 `I-init-setup` 创建变更。
|
|
44
|
+
|
|
45
|
+
## 当 work 说"归档变更"时
|
|
46
|
+
|
|
47
|
+
将变更目录从 `{roots.state}/specdev/changes/<change>/` 移动到 `{roots.state}/specdev/archive/YYYY-MM/<change>/`(YYYY-MM 取变更日期中的年月),并从 `status.json` 的 `active` 数组中移除。
|
|
48
|
+
|
|
49
|
+
## Wayfinding 操作
|
|
50
|
+
|
|
51
|
+
供 `W-wayfinder` 使用。**地图**是一个文件,每个工作项有一个**子**文件。
|
|
52
|
+
|
|
53
|
+
- **地图**:`{roots.state}/specdev/changes/<change>/wayfinder/map.md` —— Notes / Decisions-so-far / Fog 正文。
|
|
54
|
+
- **子工单**:`{roots.state}/specdev/changes/<change>/tickets/NN-<slug>.md`,从 `01` 开始编号,正文中包含问题。`Type:` 行记录工单类型(`research` / `prototype` / `grilling` / `task`);`Status:` 行记录 `claimed` / `resolved`。
|
|
55
|
+
- **阻塞**:顶部附近的 `Blocked by: NN, NN` 行。当其列出的每个文件都处于 `resolved` 状态时,工单解除阻塞。
|
|
56
|
+
- **前沿**:扫描 `tickets/` 中处于开放、未阻塞且未认领状态的文件;按编号取第一个。
|
|
57
|
+
- **认领**:设置 `Status: claimed` 并在任何工作开始前保存。
|
|
58
|
+
- **解决**:在 `## Answer` 标题下追加答案,设置 `Status: resolved`,然后将上下文指针(gist + 链接)追加到 `map.md` 中地图的 Decisions-so-far 中。
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: specdev
|
|
3
|
+
type: workflow
|
|
4
|
+
workflow: specdev
|
|
5
|
+
name: SpecDev Workflow
|
|
6
|
+
description: 软件研发全流程——从初始化设置、设计访谈(带 ADR/LOG/CONTEXT)、spec 编写、ticket 拆分、寻路到 TDD 实现与双轴审查
|
|
7
|
+
keywords: [specdev, 软件研发, 设计, spec, tickets, 寻路, TDD, 实现, 审查]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# SpecDev Workflow
|
|
11
|
+
|
|
12
|
+
本文件是 `specdev` 的唯一入口——包含运行时根、持久化约定、启动协议、状态字段、路径分配、副作用边界以及 work 条目索引。
|
|
13
|
+
|
|
14
|
+
## 运行时根
|
|
15
|
+
|
|
16
|
+
- **workflow 根**(`{roots.workflows}`)解析为 `<Path>{roots.workflows}/specdev/</Path>`,指向 work 入口和子文件所在目录
|
|
17
|
+
- **state 根**(`{roots.state}`)解析为 `<Path>{roots.state}/specdev/</Path>`,指向持久化状态和变更产物所在目录
|
|
18
|
+
|
|
19
|
+
## 持久化约定
|
|
20
|
+
|
|
21
|
+
在 state 根下维护以下结构:
|
|
22
|
+
|
|
23
|
+
| 名称 | 路径 | 说明 |
|
|
24
|
+
|------|------|------|
|
|
25
|
+
| 状态索引 | `<Path>{roots.state}/specdev/status.json</Path>` | workflow 全局状态 |
|
|
26
|
+
| 活跃变更 | `<Path>{roots.state}/specdev/changes/</Path>` | 进行中的 change 产物(ADR、LOG、CONTEXT、spec、tickets、map 等) |
|
|
27
|
+
| 永久 ADR | `<Path>{roots.state}/specdev/adr/</Path>` | changes 中经确认后的 ADR 提升至此,始终反映当前架构决策现状 |
|
|
28
|
+
| 永久词汇表 | `<Path>{roots.state}/specdev/context/</Path>` | changes 中经确认后的 CONTEXT 提升至此,始终反映当前领域术语现状 |
|
|
29
|
+
| 变更归档 | `<Path>{roots.state}/specdev/archive/</Path>` | 已完成并归档的历史 change,按 YYYY-MM/<change>/ 组织 |
|
|
30
|
+
|
|
31
|
+
`status.json`、`changes/`、`archive/` 为固定骨架,由 `speculo init` 创建。`adr/` 和 `context/` 为确认后创建——当 changes 中的 ADR、CONTEXT 经确认符合当前现状后,提升到这两个目录,始终保持与项目当前状态一致。
|
|
32
|
+
|
|
33
|
+
## 启动协议
|
|
34
|
+
|
|
35
|
+
1. **解析运行时** — 解析 workspace 配置和 workflow/state roots。已解析时复用。
|
|
36
|
+
2. **选择 change** — 读取 `<Path>{roots.state}/specdev/status.json</Path>`:
|
|
37
|
+
- 用户指定 → 直接使用
|
|
38
|
+
- 唯一活跃 change → 直接使用
|
|
39
|
+
- 无活跃 → 创建 `changes/<YYYY-MM-DD>-<kebab-topic>/`,注册到 `active` 数组
|
|
40
|
+
- 多个候选 → 先消歧
|
|
41
|
+
|
|
42
|
+
## 状态字段
|
|
43
|
+
|
|
44
|
+
`<Path>{roots.state}/specdev/status.json</Path>` 包含以下字段:
|
|
45
|
+
|
|
46
|
+
- **`schema_version`**(数字)— 状态 schema 版本号,当前为 1
|
|
47
|
+
- **`workflow`**(字符串)— workflow 标识,固定为 `"specdev"`
|
|
48
|
+
- **`active`**(字符串数组)— 当前活跃 change 的目录名列表,每个元素为 `"YYYY-MM-DD-<topic>"` 格式。空数组表示无活跃 change
|
|
49
|
+
- **`current_work`**(字符串或 null)— 当前正在执行的 work id,如 `"specdev/grill-with-docs"`。无正在执行的 work 时为 null
|
|
50
|
+
- **`work_history`**(对象数组)— work 调用记录,每条包含:
|
|
51
|
+
- `work_id` — work 标识
|
|
52
|
+
- `started_at` — 开始时间(ISO 8601)
|
|
53
|
+
- `completed_at` — 完成时间(ISO 8601),未完成时为 null
|
|
54
|
+
- `result` — 完成结果,如 `"completed"`、`"aborted"`
|
|
55
|
+
- `artifacts` — 产物的项目相对路径列表
|
|
56
|
+
|
|
57
|
+
## 路径分配
|
|
58
|
+
|
|
59
|
+
1. 产物写入当前 change 目录(`<Path>{roots.state}/specdev/changes/{change}/</Path>`)
|
|
60
|
+
2. 领域文档(ADR.md、LOG.md、CONTEXT.md)由 `G-grill-with-docs` 维护
|
|
61
|
+
3. Spec、tickets、map 等产物由对应 work 写入当前 change 目录
|
|
62
|
+
4. 项目代码、测试写入项目相对路径,验证指针记录到 change
|
|
63
|
+
5. 所有引用使用 `<Path>{roots.workflows}/specdev/...</Path>` 或 `<Path>{roots.state}/specdev/...</Path>` 格式,不引用外部
|
|
64
|
+
|
|
65
|
+
## 副作用边界
|
|
66
|
+
|
|
67
|
+
确认前不得执行:提交代码、合并/删除 worktree、发布/部署。结果记录到 `<Path>{roots.state}/specdev/changes/{change}/LOG.md</Path>`。敏感值不得写入。
|
|
68
|
+
|
|
69
|
+
## Work 条目
|
|
70
|
+
|
|
71
|
+
<!-- AUTO-INDEX-START -->
|
|
72
|
+
|
|
73
|
+
- **D-diagnose-bugs** — 诊断:针对疑难 bug 建立诊断循环——构建紧凑反馈回路、复现最小化、可证伪假设排名、插桩定位根因,确认后移交 I-implement 修复。
|
|
74
|
+
- **G-grill-with-docs** — 设计访谈(带文档):无情访谈打磨设计,同时持续产出 ADR.md、LOG.md 和 CONTEXT.md 三个领域文档。在设计讨论中捕获术语定义、记录架构决策、保存完整设计轨迹。
|
|
75
|
+
- **I-implement** — 实现:基于 spec 或 tickets 实现工作——以深层模块设计原则指导架构、以 TDD 红绿循环驱动编码、以双轴审查把关质量。
|
|
76
|
+
- **I-init-setup** — 初始化设置:为 specdev workflow 配置变更追踪、领域文档布局、状态标签和语言偏好。首次使用其他 specdev works 前运行一次。
|
|
77
|
+
- **S-spec** — 编写 Spec:将当前对话综合为一份完整的 spec 文档,包含问题陈述、解决方案、用户故事、实现决策和测试决策,持久化到变更目录。
|
|
78
|
+
- **T-tickets** — 拆分 Tickets:将 spec 或计划拆分为一组曳光弹式垂直切片 tickets,每个声明阻塞边,持久化到变更目录。支持宽重构的扩展-收缩排序。
|
|
79
|
+
- **W-wayfinder** — 寻路:为超出单次会话容量的大块工作绘制共享地图,逐个解决调查 tickets 直到通往目标的路径清晰可见。支持研究和决策型 ticket 类型。
|
|
80
|
+
|
|
81
|
+
<!-- AUTO-INDEX-END -->
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: specdev/spec
|
|
3
|
+
type: workflow-entry
|
|
4
|
+
workflow: specdev
|
|
5
|
+
name: 编写 Spec
|
|
6
|
+
description: 将当前对话综合为一份完整的 spec 文档,包含问题陈述、解决方案、用户故事、实现决策和测试决策,持久化到变更目录。
|
|
7
|
+
keywords: [spec, 规范, 需求, PRD, 用户故事]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# 编写 Spec
|
|
11
|
+
|
|
12
|
+
此 work 读取当前对话上下文和代码库理解,产出一份 spec(你可能也称之为 PRD)。不要访谈用户 —— 仅综合你已经知道的内容。
|
|
13
|
+
|
|
14
|
+
## 流程
|
|
15
|
+
|
|
16
|
+
### 1. 探索代码库
|
|
17
|
+
|
|
18
|
+
探索仓库以了解代码库的当前状态(如果尚未这样做)。在整个 spec 中使用项目的领域词汇表,并尊重所涉及区域的任何 ADR。
|
|
19
|
+
|
|
20
|
+
先读取 `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>` 了解项目的领域词汇表——使用其中的术语定义,不要自创名称。
|
|
21
|
+
|
|
22
|
+
再读取 `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>` 了解已做出的架构决策——不要与已有决策冲突。如果 spec 涉及与某 ADR 相同或相邻的区域,在实现决策中引用该 ADR。
|
|
23
|
+
|
|
24
|
+
`{change}` 为当前活跃变更的目录名,格式为 `<YYYY-MM-DD>-<topic>`。如果尚未创建变更目录,先运行 `<Path>{roots.workflows}/specdev/G-grill-with-docs/G-grill-with-docs.md</Path>` 的启动变更阶段初始化 CONTEXT.md 和 ADR.md。
|
|
25
|
+
|
|
26
|
+
**完成标准**:代码库当前状态已理解,领域词汇表和 ADR 已纳入考量。
|
|
27
|
+
|
|
28
|
+
### 2. 草拟接缝
|
|
29
|
+
|
|
30
|
+
草拟你将用于测试该功能的接缝(seam)。接缝是你可以插入测试以验证行为的位置——API 端点、CLI 命令、UI 交互点、事件回调等。
|
|
31
|
+
|
|
32
|
+
**接缝规则:**
|
|
33
|
+
|
|
34
|
+
- 优先使用现有接缝而不是新建。查看代码库中已有的测试,了解项目如何注入测试。
|
|
35
|
+
- 使用尽可能高层的接缝。UI 测试 > API 测试 > 单元测试,按此优先级选择。
|
|
36
|
+
- 如果需要新接缝,在尽可能高的层级提出。代码库中的接缝越少越好 —— 理想数量是 1 个。
|
|
37
|
+
- 每个接缝描述:接缝位置(什么模块/组件)、接缝类型(E2E、API、单元)、何时触发、如何验证。
|
|
38
|
+
|
|
39
|
+
**与用户确认这些接缝是否符合他们的期望。** 展示草拟的接缝列表,询问:
|
|
40
|
+
- 接缝层级是否合适?(太高可能遗漏细节,太低可能过于脆弱)
|
|
41
|
+
- 是否有遗漏的接缝?
|
|
42
|
+
- 现有接缝是否已足够,无需新增?
|
|
43
|
+
|
|
44
|
+
**完成标准**:测试接缝已草拟并经用户确认。
|
|
45
|
+
|
|
46
|
+
### 3. 编写 spec
|
|
47
|
+
|
|
48
|
+
按以下模板编写完整 spec,写入 `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>`。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
**问题陈述** —— 从用户视角描述用户面临的问题。不要描述技术问题——描述用户遇到的困境、无法完成的任务、或当前流程中的痛点。一两段即可,但必须具体到让读者理解"为什么需要这个功能"。
|
|
53
|
+
|
|
54
|
+
**解决方案** —— 从用户视角描述问题的解决方案。描述用户将如何与新功能交互、他们的体验将如何改变。不要写实现细节——写用户能做什么、看到什么。一两段即可。
|
|
55
|
+
|
|
56
|
+
**用户故事** —— 一个详细的、编号的用户故事列表。每个用户故事格式为:
|
|
57
|
+
|
|
58
|
+
> 作为 <角色>,我希望 <功能>,以便 <收益>
|
|
59
|
+
|
|
60
|
+
例如:*作为手机银行客户,我希望查看账户余额,以便做出更明智的消费决策。*
|
|
61
|
+
|
|
62
|
+
用户故事列表应极其详尽,涵盖该功能的所有方面。覆盖以下维度:
|
|
63
|
+
- 主要流程(happy path)—— 用户最常走的路径
|
|
64
|
+
- 边界情况 —— 空数据、极限值、并发操作
|
|
65
|
+
- 错误处理 —— 用户犯错时发生什么
|
|
66
|
+
- 权限与角色 —— 不同角色的不同体验
|
|
67
|
+
- 状态转换 —— 数据从创建到归档的每个状态变化
|
|
68
|
+
|
|
69
|
+
**实现决策** —— 已做出的实现决策列表。可包含:将构建/修改的模块、这些模块将被修改的接口、开发者的技术澄清、架构决策、Schema 变更、API 契约、具体交互。不要包含具体文件路径或代码片段——它们可能很快过时。
|
|
70
|
+
|
|
71
|
+
例外:如果原型产生了一个代码片段,它比文字更精确地编码了一个决策(状态机、reducer、schema、类型结构),将其内联在相关决策中,并简要注明来自原型。精简到富含决策的部分 —— 不是可运行的演示,只是关键部分。
|
|
72
|
+
|
|
73
|
+
**测试决策** —— 已做出的测试决策列表。包含:什么构成好测试的描述(只测试外部行为,不测试实现细节)、哪些模块将被测试、测试的先例(即代码库中类似类型的测试)。
|
|
74
|
+
|
|
75
|
+
**超出范围** —— 描述此 spec 超出范围的内容。明确说出**不做什么**与说出做什么同样重要。对于每个超出范围的条目,简要说明原因(是后续版本的规划、还是技术上不可行、还是与产品愿景不符)。
|
|
76
|
+
|
|
77
|
+
**补充说明** —— 关于该功能的任何补充说明。可包含:已知风险或不确定性、依赖的外部系统或团队、需要进一步调研的领域、迁移或废弃计划。
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
写入后,不要做额外的 triage 或标签操作——spec.md 的地位由其在变更目录中的存在本身决定。
|
|
82
|
+
|
|
83
|
+
**完成标准**:spec.md 已写入变更目录——问题陈述、解决方案、用户故事、实现决策、测试决策、超出范围、补充说明各章节齐全,无残留 `[TODO:]`。
|
|
84
|
+
|
|
85
|
+
## 子文件引用
|
|
86
|
+
|
|
87
|
+
本入口为单文件 work,所有内容均已内联。以下引用仅在其他 work 需要读取 spec 时使用:
|
|
88
|
+
|
|
89
|
+
- `<Path>{roots.state}/specdev/changes/{change}/spec.md</Path>` —— 编写的 spec 产物
|
|
90
|
+
- `<Path>{roots.state}/specdev/changes/{change}/CONTEXT.md</Path>` —— 领域词汇表(阅读用)
|
|
91
|
+
- `<Path>{roots.state}/specdev/changes/{change}/ADR.md</Path>` —— 架构决策记录(阅读用)
|