sdd-workflow 1.1.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 (41) hide show
  1. package/README.md +226 -0
  2. package/bin/sdd-init.js +59 -0
  3. package/package.json +30 -0
  4. package/src/installer.js +558 -0
  5. package/templates/skills/sdd-constitution/SKILL.md +128 -0
  6. package/templates/skills/sdd-implement/SKILL.md +153 -0
  7. package/templates/skills/sdd-init/SKILL.md +302 -0
  8. package/templates/skills/sdd-plan/SKILL.md +226 -0
  9. package/templates/skills/sdd-review/SKILL.md +498 -0
  10. package/templates/skills/sdd-run/SKILL.md +439 -0
  11. package/templates/skills/sdd-specify/SKILL.md +280 -0
  12. package/templates/skills/sdd-split/SKILL.md +432 -0
  13. package/templates/skills/sdd-tasks/SKILL.md +199 -0
  14. package/templates/skills/sdd-testcases/SKILL.md +235 -0
  15. package/templates/specify/README.md +179 -0
  16. package/templates/specify/scripts/create-feature.sh +144 -0
  17. package/templates/specify/templates/constitution-template.md +74 -0
  18. package/templates/specify/templates/plan-modular-template/README.md +98 -0
  19. package/templates/specify/templates/plan-modular-template/architecture.md +127 -0
  20. package/templates/specify/templates/plan-modular-template/backend-api.md +191 -0
  21. package/templates/specify/templates/plan-modular-template/backend-impl.md +134 -0
  22. package/templates/specify/templates/plan-modular-template/changelog.md +34 -0
  23. package/templates/specify/templates/plan-modular-template/data-model.md +130 -0
  24. package/templates/specify/templates/plan-modular-template/frontend-api.md +126 -0
  25. package/templates/specify/templates/plan-modular-template/frontend-impl.md +108 -0
  26. package/templates/specify/templates/plan-modular-template/performance.md +112 -0
  27. package/templates/specify/templates/plan-modular-template/security.md +85 -0
  28. package/templates/specify/templates/plan-template.md +190 -0
  29. package/templates/specify/templates/requirements/metadata-template.json +12 -0
  30. package/templates/specify/templates/requirements/original-template.md +26 -0
  31. package/templates/specify/templates/spec-modular-template/README.md +69 -0
  32. package/templates/specify/templates/spec-modular-template/acceptance-criteria.md +49 -0
  33. package/templates/specify/templates/spec-modular-template/changelog.md +27 -0
  34. package/templates/specify/templates/spec-modular-template/constraints.md +125 -0
  35. package/templates/specify/templates/spec-modular-template/overview.md +60 -0
  36. package/templates/specify/templates/spec-modular-template/user-stories.md +59 -0
  37. package/templates/specify/templates/spec-template.md +214 -0
  38. package/templates/specify/templates/tasks-modular-template/README.md +79 -0
  39. package/templates/specify/templates/tasks-template.md +232 -0
  40. package/templates/specify/templates/testcases-template.md +434 -0
  41. package/templates/teams/sdd-development-team.md +318 -0
@@ -0,0 +1,280 @@
1
+ ---
2
+ name: sdd-specify
3
+ description: 创建功能规格文档(Specification)- 定义功能需求、用户故事和验收标准。支持从知识库链接获取原始需求文档。
4
+ invocable: true
5
+ ---
6
+
7
+ # SDD Specify - 功能规格生成器
8
+
9
+ 创建功能规格文档,定义功能需求、用户故事和验收标准。支持从知识库链接自动获取原始需求文档。
10
+
11
+ ## ⚠️ 核心原则:Spec 只描述 What,不描述 How
12
+
13
+ > **Spec 是需求文档,不是技术设计文档。** 它回答"系统应该做什么",而不是"系统如何实现"。
14
+ > 技术实现细节(SQL、代码、文件路径、架构图)属于 plan.md,不属于 spec.md。
15
+
16
+ ### 内容边界
17
+
18
+ #### ✅ spec 中应该包含的内容
19
+ - **业务需求**:用户需要什么、为什么需要
20
+ - **用户故事**:角色、目标、价值
21
+ - **验收标准**:Given-When-Then 格式的行为描述
22
+ - **功能点列表**:功能名称、描述、优先级
23
+ - **界面需求**:页面布局示意(简单 ASCII 即可)、交互流程(用户视角)
24
+ - **数据需求**:业务实体、字段含义、业务规则(不含SQL/DDL)
25
+ - **接口需求**:接口名称、用途、输入输出概述(不含代码实现)
26
+ - **非功能需求**:性能、安全、兼容性的业务指标
27
+ - **边界条件**:异常场景和处理策略(业务层面)
28
+ - **术语表**:业务术语定义
29
+
30
+ #### ❌ spec 中不应该包含的内容(这些属于 plan.md / tasks.md)
31
+ - ~~SQL 查询语句或 DDL~~
32
+ - ~~代码片段(任何语言的代码)~~
33
+ - ~~具体文件路径~~(如 `src/pages/xxx/CreateModal.jsx`)
34
+ - ~~类名、方法名~~(如 `findEarliestSubTaskId()`、`getSubSoftTask()`)
35
+ - ~~代码调用链路~~(如 Controller → Service → Repository)
36
+ - ~~数据库表的字段级定义~~(如 column type、index)
37
+ - ~~修改清单汇总~~(哪些文件需要改)
38
+ - ~~架构图中的代码级细节~~
39
+ - ~~状态管理变量名、组件内部状态~~
40
+
41
+ ### 反面示例
42
+
43
+ | 问题 | spec 中写了什么 | 应该写什么 |
44
+ |------|-----------------|------------|
45
+ | SQL 出现在 spec | `SELECT ... FROM ... WHERE ...` | "通过关联关系查找相关记录" |
46
+ | 代码调用链 | `Controller → ServiceImpl → Repository.findById()` | "系统查找指定记录" |
47
+ | 文件路径 | `src/.../CreateModal.jsx` | "配置页面" |
48
+ | 方法名 | `getUserProfile()` | "获取用户信息" |
49
+ | 修改清单 | 7个文件的修改列表 | ~~(删除,移到 plan/tasks)~~ |
50
+
51
+ ### 关联模块的正确写法
52
+
53
+ **❌ 错误**(太具体):
54
+ ```
55
+ | 前端组件 | src/pages/admin/.../CreateModal.jsx | 配置弹窗 |
56
+ | 后端Service | application/.../AutoQuoteServiceImpl.java | 自动引用 |
57
+ ```
58
+
59
+ **✅ 正确**(模块级别):
60
+ ```
61
+ | 前端 | 自动引用配置页面 | 配置创建/编辑 |
62
+ | 后端 | 自动引用模块 | 自动引用执行逻辑 |
63
+ | 数据 | 条件配置存储 | 复用现有条件表 |
64
+ ```
65
+
66
+ ## 知识库链接识别
67
+
68
+ 如果项目配置了知识库 MCP(如 Confluence),自动识别知识库链接并获取文档内容:
69
+
70
+ - 检测 URL 中的知识库域名
71
+ - 使用对应 MCP 工具获取页面内容
72
+
73
+ ## 执行步骤
74
+
75
+ ### 1. 解析用户输入
76
+ 从用户输入中提取:
77
+ - 功能名称
78
+ - 功能描述
79
+ - 业务背景(如果有)
80
+ - **知识库链接**(如果有)
81
+
82
+ ### 2. 获取知识库原始需求文档(如果有链接)
83
+
84
+ #### 2.1 使用MCP工具获取文档
85
+ 如果检测到知识库链接,使用已配置的知识库 MCP 工具获取文档详情:
86
+
87
+ 可用工具(如果项目配置了 Confluence MCP):
88
+ - `mcp__kb-knowledge__confluence_search`: 搜索文档
89
+ - `mcp__kb-knowledge__confluence_get_page`: 获取页面内容
90
+ - `mcp__kb-knowledge__confluence_get_page_children`: 获取子页面
91
+
92
+ #### 2.2 保存原始需求文档
93
+ 将获取的文档保存到功能目录:
94
+
95
+ ```
96
+ .specify/specs/{feature_id}-{feature-name}/
97
+ ├── requirements/ # 原始需求文档目录
98
+ │ ├── original.md # 知识库原始需求(Markdown格式)
99
+ │ └── metadata.json # 文档元数据(来源、更新时间等)
100
+ ├── spec.md # 功能规格
101
+ └── contracts/ # API契约(可选)
102
+ ```
103
+
104
+ #### 2.3 元数据文件格式 (metadata.json)
105
+ ```json
106
+ {
107
+ "source": "confluence",
108
+ "source_url": "https://知识库URL",
109
+ "page_id": "123456789",
110
+ "title": "XXX功能需求文档",
111
+ "author": "作者名",
112
+ "last_updated": "2026-03-19T12:00:00Z",
113
+ "fetched_at": "2026-03-19T14:30:00Z"
114
+ }
115
+ ```
116
+
117
+ ### 3. 读取相关文档
118
+
119
+ #### 3.1 必读文档
120
+ - `.specify/memory/constitution.md` - 项目宪法
121
+ - `CLAUDE.md` - 项目配置
122
+
123
+ #### 3.2 可选文档(如果存在)
124
+ - 相关模块的现有规格文档
125
+ - API文档
126
+ - 数据库设计文档
127
+ - **刚获取的知识库原始需求文档**(如果有)
128
+
129
+ ### 4. 分析现有代码(如果涉及现有模块)
130
+
131
+ 根据 CLAUDE.md 和 constitution.md 中的项目结构信息,定位并分析相关代码:
132
+ - 前端: 分析项目前端源码目录(参考 CLAUDE.md 项目结构)
133
+ - 后端: 分析项目后端目录(参考 CLAUDE.md 项目结构)
134
+ - 数据库: 使用项目配置的数据库连接查看相关表结构
135
+
136
+ ### 5. 生成规格文档
137
+
138
+ 基于模板 `.specify/templates/spec-template.md` 生成文档,包括:
139
+
140
+ #### 核心内容:
141
+ 1. **需求追溯**(如果有知识库来源)
142
+ - 原始需求链接
143
+ - 需求版本信息
144
+
145
+ 2. **功能概述**
146
+ - 功能名称和描述
147
+ - 业务背景
148
+ - 关联模块
149
+
150
+ 3. **用户故事**(至少2个)
151
+ - 格式: 作为[角色],我希望[目标],以便于[价值]
152
+ - 每个故事包含验收标准(Gherkin格式)
153
+
154
+ 4. **功能需求**
155
+ - 核心功能列表(带优先级)
156
+ - 界面需求
157
+ - 数据需求
158
+ - 接口需求
159
+
160
+ 5. **非功能需求**
161
+ - 性能要求
162
+ - 安全要求
163
+ - 兼容性
164
+
165
+ 6. **验收标准**
166
+ - 功能验收
167
+ - 质量验收
168
+ - 文档验收
169
+
170
+ 7. **功能分组与完成定义**(SDD v2 新增)
171
+
172
+ > **受 Harness Planner 启发**: 将功能按交付批次分组,每组定义明确的"完成定义"(Definition of Done)。
173
+ > 完成定义来源于验收标准,但更聚焦于**可端到端验证的用户可见行为**。
174
+ > 这为下游的 Phase Contract(阶段合约)和 Review(评审)提供评判基准。
175
+
176
+ 格式示例:
177
+ ```markdown
178
+ ## 功能分组与完成定义
179
+
180
+ ### Group A: 核心查询功能
181
+ - 包含功能: US-1, US-2, US-3
182
+ - 完成定义:
183
+ - [ ] 用户可以通过列表页查询 XXX 数据
184
+ - [ ] 支持按 YYY 条件筛选
185
+ - [ ] 查询结果分页展示,每页默认 20 条
186
+ - [ ] 无数据时显示空状态提示
187
+
188
+ ### Group B: 详情与对比功能
189
+ - 包含功能: US-4, US-5, US-6
190
+ - 完成定义:
191
+ - [ ] 点击列表项可查看详情
192
+ - [ ] 支持 2-4 个实例同时对比
193
+ - [ ] 对比结果以表格形式展示差异字段
194
+ ```
195
+
196
+ **设计原则**:
197
+ - 分组粒度:每组对应一个可独立交付和评审的功能切片
198
+ - 完成定义:使用业务语言描述可验证的用户行为,不涉及技术实现
199
+ - 完成定义的条目数量:每组 3-8 项,太多应拆分,太少应合并
200
+ - 优先级:按 Group 顺序隐含优先级,Group A 最重要
201
+
202
+ ### 6. 创建功能目录
203
+ ```
204
+ .specify/specs/{feature_id}-{feature-name}/
205
+ ├── requirements/ # 原始需求文档(如果有知识库来源)
206
+ │ ├── original.md # 原始需求
207
+ │ └── metadata.json # 文档元数据
208
+ ├── spec.md # 功能规格
209
+ └── contracts/ # API契约(可选)
210
+ ```
211
+
212
+ 命名规则:
213
+ - feature_id: **三位数字编号,从 001 自增**(001, 002, 003...)。自动扫描 `.specify/specs/` 下已有目录,取最大编号 + 1
214
+ - feature-name: 英文小写,中划线分隔,简短概括功能
215
+ - 完整目录格式: `{feature_id}-{feature-name}/`(如 `001-user-auth/`, `002-data-export/`)
216
+
217
+ ### 7. 保存文档
218
+ 保存到: `.specify/specs/{feature_id}-{feature-name}/spec.md`
219
+
220
+ ### 8. 检测文档大小
221
+
222
+ spec.md 超过 500 行时,自动执行 `/sdd-split spec {feature_id} --auto` 拆分(在 sdd-run 中)或提示用户使用 `/sdd-split spec {feature_id}`(手动模式下)。
223
+
224
+ ### 9. 交互确认
225
+ 向用户展示生成的文档大纲,询问是否需要补充或修改。
226
+
227
+ ## 输出示例
228
+
229
+ ### 有知识库链接时:
230
+ ```
231
+ 📥 检测到知识库链接
232
+
233
+ 正在获取文档...
234
+ ✅ 文档已获取并保存: .specify/specs/001-auto-quote/requirements/original.md
235
+
236
+ 📄 需求来源信息:
237
+ - 标题: 软件任务自动引用功能需求文档
238
+ - 作者: 产品经理A
239
+ - 最后更新: 2026-03-18
240
+
241
+ ✅ 功能规格已生成: .specify/specs/001-auto-quote/spec.md
242
+
243
+ 📋 文档大纲:
244
+ 1. 需求追溯
245
+ 2. 功能概述
246
+ 3. 用户故事
247
+ 4. 功能需求
248
+ 5. 非功能需求
249
+ 6. 验收标准
250
+
251
+ 请检查文档内容,如需补充请告诉我具体内容。
252
+ ```
253
+
254
+ ### 无知识库链接时:
255
+ ```
256
+ ✅ 功能规格已生成: .specify/specs/001-user-authentication/spec.md
257
+
258
+ 📋 文档大纲:
259
+ 1. 功能概述
260
+ 2. 用户故事
261
+ 3. 功能需求
262
+ 4. 非功能需求
263
+ 5. 验收标准
264
+
265
+ 请检查文档内容,如需补充请告诉我具体内容。
266
+ ```
267
+
268
+ ## 注意事项
269
+
270
+ 1. **需求聚焦**: Spec 只描述 What(做什么),不描述 How(怎么做)。所有技术实现细节留给 plan.md
271
+ 2. **业务术语**: 使用项目业务领域的标准术语,不使用代码术语
272
+ 3. **优先级**: 合理设置功能优先级(P0/P1/P2)
273
+ 4. **验收标准**: 确保可测试、可验证,用 Given-When-Then 描述行为
274
+ 5. **关联模块**: 只标注模块名称和业务功能,不标注文件路径或类名
275
+ 6. **数据需求**: 描述业务实体和字段含义,不写 SQL/DDL
276
+ 7. **接口需求**: 描述接口用途和输入输出,不写代码实现
277
+ 8. **知识库文档格式**: 知识库文档可能使用富文本格式,需要转换为 Markdown
278
+ 9. **渐进式披露**: 原始需求保存后,可按需加载详细内容
279
+ 10. **禁止修改清单**: 不在 spec 中列出需要修改的文件清单,这属于 plan/tasks
280
+ 11. **接收反馈**: 当下游阶段(testcases/plan/implement)触发反馈回 spec 时,必须修正源头并在变更记录中登记 CR
@@ -0,0 +1,432 @@
1
+ ---
2
+ name: sdd-split
3
+ description: 将大型 SDD 文档拆分为模块化结构,支持 spec/plan/tasks 三种文档类型。支持 --auto 模式跳过确认。
4
+ invocable: true
5
+ ---
6
+
7
+ # SDD Split - 文档拆分工具
8
+
9
+ 将现有的大型 SDD 文档拆分为模块化结构,支持渐进式加载。
10
+
11
+ ## 使用模式
12
+
13
+ ### 手动模式(默认)
14
+ 用户主动调用,拆分前需要确认。
15
+
16
+ ```bash
17
+ /sdd-split spec {feature_id}
18
+ /sdd-split plan {feature_id}
19
+ /sdd-split tasks {feature_id}
20
+ ```
21
+
22
+ ### 自动模式(--auto)
23
+ 由 sdd-run 或其他自动化流程调用,跳过确认直接执行。
24
+
25
+ ```bash
26
+ /sdd-split spec {feature_id} --auto
27
+ /sdd-split plan {feature_id} --auto
28
+ /sdd-split tasks {feature_id} --auto
29
+ ```
30
+
31
+ 自动模式行为差异:
32
+ - 跳过确认步骤
33
+ - 直接执行拆分
34
+ - 输出简要日志而非完整报告
35
+
36
+ ## 功能概述
37
+
38
+ 将单个大文件(spec.md、plan.md、tasks.md)拆分为多个小文件,提高加载效率和维护性。
39
+
40
+ ## 支持的文档类型
41
+
42
+ 1. **spec.md** - 功能规格文档
43
+ 2. **plan.md** - 技术实现计划
44
+ 3. **tasks.md** - 任务分解文档
45
+
46
+ ## 拆分阈值
47
+
48
+ | 文档类型 | 拆分阈值 | 说明 |
49
+ |---------|---------|------|
50
+ | spec.md | 500 行 | 超过此行数建议拆分 |
51
+ | plan.md | 1000 行 | 超过此行数建议拆分 |
52
+ | tasks.md | 800 行 | 超过此行数建议拆分 |
53
+
54
+ ## 执行步骤
55
+
56
+ ### 1. 解析参数
57
+
58
+ - 提取文档类型(spec/plan/tasks)、feature_id、是否 --auto 模式
59
+ - 如果未指定文档类型,报错提示
60
+
61
+ ### 2. 验证前置条件
62
+
63
+ - 检查文档是否存在
64
+ - 检查文档行数是否超过阈值
65
+ - 检查是否已经拆分(存在对应的子目录)
66
+
67
+ 如果行数未超过阈值且非 --auto 模式:提示用户文档较小无需拆分,结束。
68
+
69
+ ### 3. 确认拆分(手动模式)
70
+
71
+ 仅在**非 --auto** 模式下执行此步骤:
72
+
73
+ ```
74
+ 📄 正在分析文档: .specify/specs/{feature_id}/{doc_type}.md
75
+ 📊 文档行数: {N} 行
76
+ ✅ 超过拆分阈值 ({threshold} 行),建议拆分
77
+
78
+ 🔍 识别到以下章节:
79
+ 1. {章节1} ({N} 行)
80
+ 2. {章节2} ({N} 行)
81
+ ...
82
+
83
+ ❓ 是否确认拆分?(y/n)
84
+ ```
85
+
86
+ **--auto 模式**:跳过此步骤,直接执行拆分。
87
+
88
+ ### 4. 读取原文档
89
+
90
+ 使用 Read 工具读取完整文档内容。
91
+
92
+ ### 5. 分析文档结构
93
+
94
+ 根据文档类型,识别章节结构:
95
+
96
+ #### Spec 文档结构识别
97
+
98
+ ```markdown
99
+ ## 1. 功能概述 → overview.md
100
+ ## 2. 用户故事 → user-stories.md
101
+ ## 3. 验收标准 → acceptance-criteria.md (从用户故事中提取)
102
+ ## 4. 约束条件 → constraints.md
103
+ ## 变更记录 → changelog.md
104
+ ```
105
+
106
+ #### Plan 文档结构识别
107
+
108
+ ```markdown
109
+ ## 1. 架构设计 → architecture.md
110
+ ## 2. 数据模型 → data-model.md
111
+ ## 3. API设计 → backend-api.md
112
+ ## 4. 后端实现 → backend-impl.md
113
+ ## 5. 前端API → frontend-api.md
114
+ ## 6. 前端实现 → frontend-impl.md
115
+ ## 7. 安全性设计 → security.md
116
+ ## 8. 性能优化 → performance.md
117
+ ## 变更记录 → changelog.md
118
+ ```
119
+
120
+ #### Tasks 文档结构识别
121
+
122
+ ```markdown
123
+ ## Phase 0: 准备工作 → phase-0-preparation.md
124
+ ## Phase 1: 后端开发 → phase-1-backend.md
125
+ ## Phase 2: 前端开发 → phase-2-frontend.md
126
+ ## Phase 3: 测试验收 → phase-3-testing.md
127
+ ## Phase N: ... → phase-N-*.md
128
+ ## 任务依赖关系 → dependencies.md
129
+ ## 检查点 → checkpoints.md
130
+ ## 实现记录 → implementation-notes.md
131
+ ```
132
+
133
+ ### 6. 提取章节内容
134
+
135
+ 使用正则表达式提取各章节内容:
136
+
137
+ ```python
138
+ # 识别一级标题
139
+ pattern = r'^## (.+)$'
140
+
141
+ # 提取章节内容(从当前标题到下一个同级标题)
142
+ def extract_section(content, start_title, end_title=None):
143
+ # 实现逻辑
144
+ pass
145
+ ```
146
+
147
+ ### 7. 生成子文档
148
+
149
+ 为每个章节创建独立的 Markdown 文件:
150
+
151
+ **文件命名规则**:
152
+ - Spec: `overview.md`, `user-stories.md`, `acceptance-criteria.md`, `constraints.md`, `changelog.md`
153
+ - Plan: `architecture.md`, `data-model.md`, `backend-api.md`, `backend-impl.md`, `frontend-api.md`, `frontend-impl.md`, `security.md`, `performance.md`, `changelog.md`
154
+ - Tasks: `phase-0-preparation.md`, `phase-1-backend.md`, `phase-2-frontend.md`, `phase-3-testing.md`, `dependencies.md`, `checkpoints.md`, `implementation-notes.md`
155
+
156
+ **文件内容格式**:
157
+
158
+ ```markdown
159
+ # {章节标题}
160
+
161
+ > {章节说明}
162
+
163
+ {章节内容}
164
+
165
+ ---
166
+
167
+ 返回 [{type}索引](./README.md)
168
+ ```
169
+
170
+ ### 8. 生成 README.md 索引
171
+
172
+ 根据文档类型,使用对应的模板生成 README.md:
173
+
174
+ - Spec: `.specify/templates/spec-modular-template/README.md`
175
+ - Plan: `.specify/templates/plan-modular-template/README.md`
176
+ - Tasks: 参考 `{feature_id}/tasks/README.md`
177
+
178
+ **替换模板变量**:
179
+ - `{功能名称}`: 从原文档标题提取
180
+ - `{version}`: 从原文档提取
181
+ - `{create_date}`: 从原文档提取
182
+ - `{update_date}`: 当前日期
183
+ - 其他变量根据实际内容填充
184
+
185
+ ### 9. 更新主索引文件
186
+
187
+ 将原文档(spec.md/plan.md/tasks.md)转换为索引文件:
188
+
189
+ ```markdown
190
+ # {功能名称} - {文档类型}
191
+
192
+ > **文档已拆分为模块化结构,请查看 [{type}/README.md](./{type}/README.md) 获取完整索引。**
193
+
194
+ ## 快速导航
195
+
196
+ | 模块 | 状态 | 文档 |
197
+ |------|------|------|
198
+ | 模块1 | ✅ 已完成 | [链接](./{type}/module1.md) |
199
+ | 模块2 | ⏳ 进行中 | [链接](./{type}/module2.md) |
200
+
201
+ ## 核心信息
202
+
203
+ [保留最关键的概览信息,约 50-100 行]
204
+
205
+ ## 详细内容
206
+
207
+ 请查看 [{type}/README.md](./{type}/README.md) 获取完整文档。
208
+ ```
209
+
210
+ ### 10. 备份原文档
211
+
212
+ 将原文档重命名为 `{name}.md.backup`:
213
+
214
+ ```bash
215
+ mv spec.md spec.md.backup
216
+ mv plan.md plan.md.backup
217
+ mv tasks.md tasks.md.backup
218
+ ```
219
+
220
+ ### 11. 验证拆分结果
221
+
222
+ - 检查所有子文档是否创建成功
223
+ - 检查 README.md 是否生成
224
+ - 检查索引文件是否更新
225
+ - 检查链接是否正确
226
+
227
+ ### 12. 输出摘要
228
+
229
+ **手动模式**:向用户展示完整拆分结果。
230
+
231
+ **--auto 模式**:输出简要日志。
232
+
233
+ ```
234
+ ✅ 文档拆分完成: .specify/specs/{feature_id}/spec/
235
+
236
+ 📊 拆分结果:
237
+ ┌─────────────────┬──────────┬──────────┐
238
+ │ 文件 │ 行数 │ 大小 │
239
+ ├─────────────────┼──────────┼──────────┤
240
+ │ README.md │ 100 │ 5KB │
241
+ │ overview.md │ 150 │ 8KB │
242
+ │ user-stories.md │ 200 │ 10KB │
243
+ │ ... │ ... │ ... │
244
+ ├─────────────────┼──────────┼──────────┤
245
+ │ 总计 │ 614 │ 30KB │
246
+ └─────────────────┴──────────┴──────────┘
247
+
248
+ 📁 目录结构:
249
+ spec/
250
+ ├── README.md
251
+ ├── overview.md
252
+ ├── user-stories.md
253
+ ├── acceptance-criteria.md
254
+ ├── constraints.md
255
+ └── changelog.md
256
+
257
+ 💾 原文档已备份: spec.md.backup
258
+
259
+ ✅ 拆分完成!现在可以按需加载各个模块。
260
+ ```
261
+
262
+ ## 实现细节
263
+
264
+ ### 章节识别算法
265
+
266
+ ```python
267
+ def identify_sections(content, doc_type):
268
+ """
269
+ 识别文档章节结构
270
+
271
+ Args:
272
+ content: 文档内容
273
+ doc_type: 文档类型 (spec/plan/tasks)
274
+
275
+ Returns:
276
+ List[Section]: 章节列表
277
+ """
278
+ sections = []
279
+ lines = content.split('\n')
280
+
281
+ current_section = None
282
+ current_content = []
283
+
284
+ for line in lines:
285
+ # 识别一级标题 (## 标题)
286
+ if line.startswith('## '):
287
+ # 保存上一个章节
288
+ if current_section:
289
+ sections.append({
290
+ 'title': current_section,
291
+ 'content': '\n'.join(current_content)
292
+ })
293
+
294
+ # 开始新章节
295
+ current_section = line[3:].strip()
296
+ current_content = [line]
297
+ else:
298
+ if current_section:
299
+ current_content.append(line)
300
+
301
+ # 保存最后一个章节
302
+ if current_section:
303
+ sections.append({
304
+ 'title': current_section,
305
+ 'content': '\n'.join(current_content)
306
+ })
307
+
308
+ return sections
309
+ ```
310
+
311
+ ### 文件名映射
312
+
313
+ ```python
314
+ def get_filename(section_title, doc_type):
315
+ """
316
+ 根据章节标题生成文件名
317
+
318
+ Args:
319
+ section_title: 章节标题
320
+ doc_type: 文档类型
321
+
322
+ Returns:
323
+ str: 文件名
324
+ """
325
+ # Spec 映射
326
+ spec_mapping = {
327
+ '功能概述': 'overview.md',
328
+ '用户故事': 'user-stories.md',
329
+ '验收标准': 'acceptance-criteria.md',
330
+ '约束条件': 'constraints.md',
331
+ '变更记录': 'changelog.md'
332
+ }
333
+
334
+ # Plan 映射
335
+ plan_mapping = {
336
+ '架构设计': 'architecture.md',
337
+ '数据模型': 'data-model.md',
338
+ 'API设计': 'backend-api.md',
339
+ '后端实现': 'backend-impl.md',
340
+ '前端API': 'frontend-api.md',
341
+ '前端实现': 'frontend-impl.md',
342
+ '安全性': 'security.md',
343
+ '性能优化': 'performance.md',
344
+ '变更记录': 'changelog.md'
345
+ }
346
+
347
+ # Tasks 映射
348
+ if doc_type == 'tasks':
349
+ # Phase 0, Phase 1, Phase 2...
350
+ if 'Phase' in section_title:
351
+ phase_num = extract_phase_number(section_title)
352
+ phase_name = extract_phase_name(section_title)
353
+ return f'phase-{phase_num}-{phase_name}.md'
354
+ elif '依赖' in section_title:
355
+ return 'dependencies.md'
356
+ elif '检查点' in section_title:
357
+ return 'checkpoints.md'
358
+ elif '实现' in section_title:
359
+ return 'implementation-notes.md'
360
+
361
+ # 使用映射表
362
+ mapping = spec_mapping if doc_type == 'spec' else plan_mapping
363
+
364
+ for key, filename in mapping.items():
365
+ if key in section_title:
366
+ return filename
367
+
368
+ # 默认:转换为小写,替换空格为连字符
369
+ return section_title.lower().replace(' ', '-') + '.md'
370
+ ```
371
+
372
+ ## 注意事项
373
+
374
+ 1. **备份原文档**:拆分前必须备份原文档,防止数据丢失
375
+ 2. **验证完整性**:拆分后验证所有内容是否完整
376
+ 3. **链接更新**:确保所有内部链接正确指向新文件
377
+ 4. **保留格式**:保留原文档的 Markdown 格式和代码块
378
+ 5. **模式区分**: 手动模式需用户确认;--auto 模式跳过确认直接执行
379
+
380
+ ## 错误处理
381
+
382
+ 1. **文档不存在**:提示用户文档路径不正确
383
+ 2. **已经拆分**:提示用户文档已经拆分,是否重新拆分
384
+ 3. **行数不足**:提示用户文档行数未达到拆分阈值
385
+ 4. **章节识别失败**:提示用户文档结构不符合规范
386
+
387
+ ## 示例
388
+
389
+ ### 拆分 Spec 文档
390
+
391
+ ```bash
392
+ /sdd-split spec {feature_id}
393
+ ```
394
+
395
+ **输出**:
396
+
397
+ ```
398
+ 📄 正在分析文档: .specify/specs/{feature_id}/spec.md
399
+ 📊 文档行数: 614 行
400
+ ✅ 超过拆分阈值 (500 行),建议拆分
401
+
402
+ 🔍 识别到以下章节:
403
+ 1. 功能概述 (150 行)
404
+ 2. 用户故事 (300 行)
405
+ 3. 约束条件 (100 行)
406
+ 4. 变更记录 (64 行)
407
+
408
+ ❓ 是否确认拆分?(y/n)
409
+ ```
410
+
411
+ 用户确认后:
412
+
413
+ ```
414
+ ✅ 开始拆分...
415
+ 📁 创建目录: spec/
416
+ 📝 生成 README.md
417
+ 📝 生成 overview.md
418
+ 📝 生成 user-stories.md
419
+ 📝 生成 constraints.md
420
+ 📝 生成 changelog.md
421
+ 📝 更新 spec.md (索引文件)
422
+ 💾 备份原文档: spec.md.backup
423
+
424
+ ✅ 拆分完成!
425
+ ```
426
+
427
+ ---
428
+
429
+ ## 相关文档
430
+
431
+ - [SDD 规范](../../templates/README.md)
432
+ - [模块化模板](../../templates/spec-modular-template/)