flower-trellis 0.2.4 → 0.2.5-beta.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.
- package/README.md +27 -3
- package/enhancements/0.6/.agents/skills/trellis-extract-prd/SKILL.md +106 -63
- package/enhancements/0.6/.agents/skills/trellis-plan-version/SKILL.md +147 -25
- package/enhancements/0.6/.agents/skills/trellis-push/SKILL.md +279 -169
- package/enhancements/0.6/.agents/skills/trellis-route/SKILL.md +179 -75
- package/enhancements/0.6/.agents/skills/trellis-verify-task/SKILL.md +154 -5
- package/enhancements/0.6/.claude/skills/trellis-extract-prd/SKILL.md +106 -63
- package/enhancements/0.6/.claude/skills/trellis-plan-version/SKILL.md +147 -25
- package/enhancements/0.6/.claude/skills/trellis-push/SKILL.md +279 -169
- package/enhancements/0.6/.claude/skills/trellis-route/SKILL.md +179 -75
- package/enhancements/0.6/.claude/skills/trellis-verify-task/SKILL.md +154 -5
- package/enhancements/0.6/overrides/workflow-states/in_progress-inline.md +1 -1
- package/enhancements/0.6/overrides/workflow.md +9 -3
- package/enhancements/MANIFEST.json +2 -2
- package/package.json +1 -1
- package/src/lib/update-check.js +142 -36
|
@@ -1,34 +1,39 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: trellis-extract-prd
|
|
3
|
-
description: "Extract a
|
|
3
|
+
description: "Extract a cohesive task PRD faithfully from a source requirements document, optionally using version task/wave planning as task boundary context; preserve UI copy verbatim and annotate source positions."
|
|
4
4
|
---
|
|
5
5
|
# Extract PRD — 基于原始需求文档
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
从原始需求文档中提取指定需求或版本规划中的 task 候选,结构化为 `prd.md`。**正文必须有据可依,禁止自行发挥**;仅允许在「本任务 TL;DR」与「本任务范围」两块做结论性提炼(且必须能在原文或已确认版本规划中找到依据)。
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## 核心原则
|
|
12
12
|
|
|
13
13
|
1. **原文优先** — 「来源需求原文」「Requirements 索引」「Acceptance Criteria 索引」三节必须引用或指向原始文档原文,不得改写语义
|
|
14
|
-
2.
|
|
15
|
-
3.
|
|
16
|
-
4.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
2. **版本规划约束 task 边界** — 如果存在 `doc/<版本>/任务拆分与waves.md` 或用户提供的版本规划产物,单 task PRD 的 Scope 必须落在该产物中对应 task 候选的范围内
|
|
15
|
+
3. **task 必须内聚** — 单 task PRD 应代表一个可开发、可自测、可验收的闭环;不能把不相关需求塞进来,也不能把一个闭环拆成页面 / 接口 / 字段碎片
|
|
16
|
+
4. **wave 是归属,不是 task** — wave 用来说明本 task 属于哪个版本提测 / 交付批次;不要把 wave 当成 `task.py` 状态或独立任务目录
|
|
17
|
+
5. **文案原封不动** — 原始文档中出现的用户可见文案(按钮文字、提示语、Toast、弹窗内容、表头、placeholder 等)必须**逐字引用**,禁止改写、缩略或意译
|
|
18
|
+
6. **标注出处** — 每条需求 / AC 标注来源位置(文档行号、章节编号或页码)
|
|
19
|
+
7. **允许提炼的两个例外** — 「本任务 TL;DR」与「本任务范围」允许做结论性总结,但必须能在原文、版本规划或用户确认中找到依据
|
|
20
|
+
8. **完整提取** — 该 task 候选 / 需求单元下的所有内容全部提取,不跳不漏
|
|
21
|
+
9. **去重** — 同一条款在 PRD 中只应完整出现一次;Requirements / AC / 关联需求等其他节均以指针形式引用,不复述原文
|
|
22
|
+
10. **散射追踪是参考,不是清单** — 散射追踪成果仅用于知会关联,不得误读为工作范围;必须明确标注「本任务实现」列
|
|
23
23
|
|
|
24
24
|
---
|
|
25
25
|
|
|
26
26
|
## 输入
|
|
27
27
|
|
|
28
28
|
用户需提供:
|
|
29
|
-
-
|
|
29
|
+
- **需要提取的需求**(编号、名称、功能描述,或版本规划中的 Task ID)
|
|
30
30
|
- **原始需求文档路径**(如未指定,在 `doc/` 下查找)
|
|
31
31
|
|
|
32
|
+
可选输入:
|
|
33
|
+
- **版本规划产物路径**(默认尝试 `doc/<版本>/任务拆分与waves.md`)
|
|
34
|
+
- **Task ID / task 候选名称**
|
|
35
|
+
- **Wave ID / wave 名称**
|
|
36
|
+
|
|
32
37
|
---
|
|
33
38
|
|
|
34
39
|
## 执行步骤
|
|
@@ -43,18 +48,42 @@ description: "Extract a single requirement faithfully from a source requirements
|
|
|
43
48
|
|
|
44
49
|
> **不要假设文档有特定格式**,先读再判断。
|
|
45
50
|
|
|
51
|
+
### Step 1.5: 查找版本规划产物(如有)
|
|
52
|
+
|
|
53
|
+
如果用户提供了版本号、版本规划路径、Task ID、Wave ID,或默认路径 `doc/<版本>/任务拆分与waves.md` 存在,则读取版本规划产物。
|
|
54
|
+
|
|
55
|
+
从版本规划产物中提取:
|
|
56
|
+
- Task ID / task 名称
|
|
57
|
+
- 所属 wave id / 名称
|
|
58
|
+
- ✅ 本 task 范围
|
|
59
|
+
- ❌ 相关但不在本 task 范围
|
|
60
|
+
- 来源需求位置
|
|
61
|
+
- 散射组归属
|
|
62
|
+
- 依赖 task
|
|
63
|
+
- 可验收结果 / 可提测性
|
|
64
|
+
|
|
65
|
+
如果版本规划产物存在但找不到用户指定的 task 候选:
|
|
66
|
+
- 不要猜测映射
|
|
67
|
+
- 明确列出候选 task,让用户选择
|
|
68
|
+
|
|
69
|
+
如果版本规划产物不存在:
|
|
70
|
+
- 按原始需求文档继续提取
|
|
71
|
+
- 不要编造 wave / Task ID
|
|
72
|
+
- 仍需遵守“task 必须内聚”的原则
|
|
73
|
+
|
|
46
74
|
### Step 2: 定位并完整提取
|
|
47
75
|
|
|
48
|
-
|
|
76
|
+
在文档中定位用户指定的需求或 task 候选对应的来源需求,完整读取相关内容。
|
|
49
77
|
|
|
50
78
|
提取时注意:
|
|
51
79
|
- 保留原始的编号、层级、表格结构
|
|
52
80
|
- 不要跳过任何子节(即使看起来不重要)
|
|
53
81
|
- 记录提取的起止位置(行号或章节号)
|
|
82
|
+
- 如果版本规划已确认 task 边界,只提取该 task 范围内的来源内容;关联但不在范围的内容放入「关联需求」或「不在范围」
|
|
54
83
|
|
|
55
84
|
### Step 3: 识别变更性质(关键一步)
|
|
56
85
|
|
|
57
|
-
|
|
86
|
+
判断本次任务属于哪一类,并记录依据(来源文档的哪一行 / 章节明示):
|
|
58
87
|
|
|
59
88
|
| 类别 | 典型信号 |
|
|
60
89
|
|------|---------|
|
|
@@ -63,44 +92,46 @@ description: "Extract a single requirement faithfully from a source requirements
|
|
|
63
92
|
| **修复** | 原文描述"修复/纠正"某行为 |
|
|
64
93
|
| **重构** | 改实现不改行为 |
|
|
65
94
|
|
|
66
|
-
> **局部变更是最容易被写偏的情况**:原文的 User Story 通常描述的是**整个功能**(历史 + 变更),不是本任务的变更点。
|
|
95
|
+
> **局部变更是最容易被写偏的情况**:原文的 User Story 通常描述的是**整个功能**(历史 + 变更),不是本任务的变更点。TL;DR 必须只写变更点,不要写全功能。
|
|
67
96
|
|
|
68
97
|
### Step 4: 散射追踪
|
|
69
98
|
|
|
70
|
-
|
|
99
|
+
提取目标 task 中涉及的关键实体(字段名、功能点、业务概念),在全文中搜索这些关键词,检查是否在其他需求单元中也有相关内容:
|
|
71
100
|
|
|
72
|
-
-
|
|
101
|
+
- 同一字段在不同页面 / 模块的展示、编辑、导出规则
|
|
73
102
|
- 同一业务规则在不同入口的复用
|
|
74
103
|
- 跨需求的依赖或约束
|
|
75
104
|
|
|
76
|
-
|
|
105
|
+
对每一条散射发现,必须立刻判定:
|
|
77
106
|
- ✅ 属于本任务实现?
|
|
78
|
-
- ❌
|
|
107
|
+
- ❌ 不属于本任务?(由哪个 task / wave 实现,或 N/A)
|
|
79
108
|
|
|
80
109
|
将发现记录到 PRD 的「关联需求」表,表头必须含「本任务实现」列。
|
|
81
110
|
|
|
82
111
|
### Step 5: 生成 PRD
|
|
83
112
|
|
|
84
|
-
PRD
|
|
113
|
+
PRD 的结构按下列顺序组织:
|
|
85
114
|
|
|
86
115
|
```markdown
|
|
87
|
-
#
|
|
116
|
+
# <Task ID> <任务名称>
|
|
88
117
|
|
|
89
118
|
> 来源:<文档名>,<位置范围>
|
|
119
|
+
> 版本规划:<doc/<版本>/任务拆分与waves.md;无则 N/A>
|
|
120
|
+
> 所属 Wave:<Wave ID / 名称;无则 N/A>
|
|
90
121
|
> 变更性质:新增 / 局部变更 / 修复 / 重构
|
|
91
122
|
> 优先级:P?
|
|
92
123
|
|
|
93
124
|
## 本任务(TL;DR)
|
|
94
125
|
- **做什么**:<一句话,≤30 字,只写本任务要改动的行为>
|
|
95
126
|
- **为什么**:<一句话,变更动机 / 触发来源>
|
|
96
|
-
-
|
|
127
|
+
- **所属 Wave**:<wave id + name;没有版本规划时写 N/A>
|
|
97
128
|
|
|
98
129
|
## 本任务范围(Scope)
|
|
99
130
|
- ✅ **本任务实现**:
|
|
100
131
|
- <条目 1,一句一条>
|
|
101
132
|
- <条目 2>
|
|
102
133
|
- ❌ **相关但不在本任务范围**:
|
|
103
|
-
- <条目> —
|
|
134
|
+
- <条目> — 归属:<Task ID / Wave / 独立任务 / N/A 原因>
|
|
104
135
|
|
|
105
136
|
## 来源需求原文
|
|
106
137
|
<按原始文档的子结构组织,使用 blockquote 或分级标题忠实摘录>
|
|
@@ -108,33 +139,24 @@ PRD 的结构**按下列顺序**组织(顺序有意为之——让读者打开
|
|
|
108
139
|
|
|
109
140
|
## Requirements(索引)
|
|
110
141
|
- [<编号>] <一句话摘要> — 详见「来源需求原文」§<编号> / <原文位置>
|
|
111
|
-
- ...
|
|
112
142
|
|
|
113
143
|
## Acceptance Criteria(索引)
|
|
114
144
|
- [ ] [<编号>] <一句话摘要> — 详见「来源需求原文」§<编号> / <原文位置>
|
|
115
|
-
- ...
|
|
116
145
|
|
|
117
146
|
## 关联需求(⚠️ 上下文参考,非本任务范围)
|
|
118
147
|
| 需求单元 | 关联内容 | 本任务实现 | 归属 / 位置 |
|
|
119
148
|
|---------|---------|-----------|-------------|
|
|
120
|
-
| REQ-xxx | ... | ❌ | 已实现于 commit xxx |
|
|
121
149
|
|
|
122
150
|
## Out of Scope
|
|
123
|
-
-
|
|
151
|
+
- <原始文档或版本规划中明确排除的内容>
|
|
124
152
|
|
|
125
153
|
## Technical Notes
|
|
126
154
|
- 原始文档路径、提取范围、提取时间
|
|
155
|
+
- 版本规划产物路径、Task ID、Wave ID(如有)
|
|
127
156
|
- 关键文件路径(用于 task.json `relatedFiles`)
|
|
128
|
-
- 其他对实现者有用的上下文
|
|
129
157
|
```
|
|
130
158
|
|
|
131
|
-
|
|
132
|
-
> - 「本任务 TL;DR」和「本任务范围」放在最前面,读者不必翻到文末去找"本任务到底做什么"
|
|
133
|
-
> - 「Requirements」「Acceptance Criteria」改为**索引式**,只写编号 + 一句话摘要 + 原文指针,**不复述原文内容**(原文已经在「来源需求原文」一节完整出现过一次)
|
|
134
|
-
> - 「关联需求」表头增加「本任务实现」列,小节标题明确写⚠️提示
|
|
135
|
-
> - 散射追踪成果归入「关联需求」,不得混入「Requirements」或「Scope ✅」
|
|
136
|
-
|
|
137
|
-
### Step 6: 创建 task.json
|
|
159
|
+
### Step 6: 创建 / 更新 task.json
|
|
138
160
|
|
|
139
161
|
PRD 写入后,调用框架脚本创建 `task.json`,使任务目录完整可用:
|
|
140
162
|
|
|
@@ -145,45 +167,66 @@ python3 .trellis/scripts/task.py create "<PRD标题>" \
|
|
|
145
167
|
--description "<TL;DR「做什么」一句话>"
|
|
146
168
|
```
|
|
147
169
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
170
|
+
创建完成后,根据 PRD 中的分析补充 `task.json` 中的字段:
|
|
171
|
+
- `dev_type`:`frontend` / `backend` / `fullstack`
|
|
172
|
+
- `relatedFiles`:PRD Technical Notes 中识别的关键文件路径
|
|
173
|
+
- `meta.version_plan`:版本规划产物路径(如有)
|
|
174
|
+
- `meta.wave`:所属 wave id / 名称 / 可提测性(如有)
|
|
175
|
+
- `meta.source_requirements`:来源需求编号和位置(如有)
|
|
176
|
+
|
|
177
|
+
`meta` 示例:
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"meta": {
|
|
182
|
+
"version_plan": "doc/v1.2/任务拆分与waves.md",
|
|
183
|
+
"wave": {
|
|
184
|
+
"id": "wave-1",
|
|
185
|
+
"name": "核心链路首批提测",
|
|
186
|
+
"testability": "independent"
|
|
187
|
+
},
|
|
188
|
+
"source_requirements": [
|
|
189
|
+
{
|
|
190
|
+
"id": "REQ-001",
|
|
191
|
+
"location": "doc/v1.2/需求清单.md:42"
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
156
197
|
|
|
157
198
|
### Step 7: 自检
|
|
158
199
|
|
|
159
200
|
| 检查项 | 方法 |
|
|
160
201
|
|--------|------|
|
|
161
|
-
| **首屏可读性** | 只看 PRD 前 30 行,能否回答"做什么 / 不做什么 / 为什么
|
|
162
|
-
| **去重** |
|
|
163
|
-
| **Scope 分离** |
|
|
164
|
-
| **关联需求列完整** |
|
|
165
|
-
| **原文完整性** |
|
|
202
|
+
| **首屏可读性** | 只看 PRD 前 30 行,能否回答"做什么 / 不做什么 / 为什么 / 属于哪个 wave" |
|
|
203
|
+
| **去重** | 同一条款是否只在「来源需求原文」一节完整出现 |
|
|
204
|
+
| **Scope 分离** | 散射追踪发现的相关但不做条款是否全部落在非范围或关联需求中 |
|
|
205
|
+
| **关联需求列完整** | 「关联需求」表每一行的「本任务实现」列是否都填写 |
|
|
206
|
+
| **原文完整性** | 原始文档中该 task 范围内的所有子节是否都出现 |
|
|
166
207
|
| **AC 可追溯** | 每条 AC 索引是否都标注了来源位置 |
|
|
167
|
-
| **无自行发挥** | Requirements
|
|
168
|
-
| **文案逐字一致** |
|
|
208
|
+
| **无自行发挥** | Requirements 索引中是否有任何一条找不到原文或版本规划依据 |
|
|
209
|
+
| **文案逐字一致** | UI 文案是否与原始文档完全一致 |
|
|
169
210
|
| **散射完整** | 至少对 2-3 个关键实体做过全文搜索 |
|
|
170
|
-
|
|
|
211
|
+
| **任务边界匹配** | 如存在版本规划产物,Scope 是否严格落在 task 候选范围内 |
|
|
212
|
+
| **Wave 匹配** | PRD / `task.json.meta` 的 wave 是否与版本规划一致 |
|
|
171
213
|
|
|
172
214
|
---
|
|
173
215
|
|
|
174
216
|
## 反模式
|
|
175
217
|
|
|
176
|
-
- ❌
|
|
218
|
+
- ❌ 用自己的话改写需求原文
|
|
177
219
|
- ❌ 需求条目没有标注来源位置
|
|
178
|
-
- ❌
|
|
179
|
-
- ❌
|
|
220
|
+
- ❌ 添加原始文档或版本规划中没有的业务规则 / 验收标准
|
|
221
|
+
- ❌ 跳过某些子节不提取
|
|
180
222
|
- ❌ 不做散射追踪
|
|
181
|
-
- ❌
|
|
182
|
-
- ❌
|
|
183
|
-
- ❌
|
|
184
|
-
- ❌
|
|
185
|
-
- ❌
|
|
186
|
-
- ❌
|
|
223
|
+
- ❌ TL;DR 写成整个功能的 User Story(局部变更时必须只写变更点)
|
|
224
|
+
- ❌ Requirements / AC 小节复述原文内容
|
|
225
|
+
- ❌ 散射追踪结果混入 Scope ✅ 或 Requirements
|
|
226
|
+
- ❌ 有版本规划产物却忽略 task 候选边界,直接按原始需求整段提取成过大的任务
|
|
227
|
+
- ❌ 把一个内聚 task 拆成页面 / 接口 / 字段碎片
|
|
228
|
+
- ❌ 未找到版本规划产物时自行编造 wave id 或 Task ID
|
|
229
|
+
- ❌ 把 wave 当成独立 task 目录或 `task.py` 状态
|
|
187
230
|
|
|
188
231
|
---
|
|
189
232
|
|
|
@@ -191,7 +234,7 @@ python3 .trellis/scripts/task.py create "<PRD标题>" \
|
|
|
191
234
|
|
|
192
235
|
| 入口 | 形态 | 职责 | 时机 |
|
|
193
236
|
|------|------|------|------|
|
|
194
|
-
| `trellis-plan-version` | skill | 版本级需求扫描 +
|
|
237
|
+
| `trellis-plan-version` | skill | 版本级需求扫描 + 内聚 task 拆分 + wave 编排 | 版本规划阶段 |
|
|
195
238
|
| `trellis-brainstorm` | skill(上游) | 对话式需求发现(**无原始文档时**) | 需求模糊时 |
|
|
196
|
-
| `trellis-extract-prd` | skill(本技能) |
|
|
197
|
-
| `trellis-verify-task` | skill |
|
|
239
|
+
| `trellis-extract-prd` | skill(本技能) | 基于原始文档严格提取单个内聚 task 的 PRD;如有版本规划,则绑定 Task ID / Wave / 来源需求 | 任务开发前、有正式需求文档时 |
|
|
240
|
+
| `trellis-verify-task` | skill | 校验任务三件套准确性 + 覆盖度 + 跨层一致性;如有版本规划,则追加版本需求 -> task -> wave 对照 | PRD / Design / Implement 生成后 |
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: trellis-plan-version
|
|
3
|
-
description: "Generate a version development plan from a source requirements doc: requirements list, effort estimate, and team assignment."
|
|
3
|
+
description: "Generate a version development plan from a source requirements doc: requirements list, cohesive task candidates, waves, effort estimate, and team assignment."
|
|
4
4
|
---
|
|
5
|
-
# 版本开发计划 —
|
|
5
|
+
# 版本开发计划 — 从需求文档到内聚 Task 与 Waves
|
|
6
6
|
|
|
7
|
-
从原始需求文档出发,生成版本开发计划(需求清单 + 工时评估 +
|
|
7
|
+
从原始需求文档出发,生成版本开发计划(需求清单 + 内聚 task 候选 + waves + 工时评估 + 人员分工),内置覆盖度校验,确保不遗漏需求,并让版本结果能按批次提测 / 分批交付。
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
## 核心原则
|
|
12
12
|
|
|
13
|
-
1. **需求文档是唯一真相** —
|
|
14
|
-
2. **先扫后拆** —
|
|
15
|
-
3.
|
|
13
|
+
1. **需求文档是唯一真相** — 需求清单必须从文档全文提取,不能只看目录 / 总表
|
|
14
|
+
2. **先扫后拆** — 先完成覆盖度扫描,确认无遗漏后再拆 task、排 wave、评估工时和分工
|
|
15
|
+
3. **task 必须内聚** — 可以拆多个 task,但每个 task 必须是可开发、可自测、可验收的闭环,不能按章节 / 页面 / 接口机械碎拆
|
|
16
|
+
4. **wave 是版本级批次** — wave 组织 task 的分批提测 / 分批交付,不是 `task.py` 状态,也不强制一个 wave 一个 task
|
|
17
|
+
5. **可追溯** — 每个需求条目必须能追到 task,每个 task 必须能追到 wave 或明确标记为跨 wave 支撑项
|
|
16
18
|
|
|
17
19
|
---
|
|
18
20
|
|
|
@@ -23,6 +25,11 @@ description: "Generate a version development plan from a source requirements doc
|
|
|
23
25
|
- **版本号或迭代标识**
|
|
24
26
|
- **开发团队信息**(人数、角色分工模式)
|
|
25
27
|
|
|
28
|
+
可选输入:
|
|
29
|
+
- **产物目录**:默认 `doc/<版本>/`;如果用户显式指定路径,以用户指定路径为准
|
|
30
|
+
- **提测策略偏好**:例如先核心链路、先低风险模块、先后端基础能力等
|
|
31
|
+
- **拆分偏好**:例如“尽量少拆 task”“按团队并行拆”“允许 child task”
|
|
32
|
+
|
|
26
33
|
---
|
|
27
34
|
|
|
28
35
|
## 执行步骤
|
|
@@ -57,15 +64,17 @@ description: "Generate a version development plan from a source requirements doc
|
|
|
57
64
|
- 变更类型:整体新增 / 局部变更 / 字段级嵌入
|
|
58
65
|
|
|
59
66
|
> **[!] 关键:必须识别出「字段级嵌入变更」。**
|
|
60
|
-
>
|
|
67
|
+
> 有些需求单元整体是旧版本的,但内部某个字段 / 段落属于新版本变更。
|
|
61
68
|
> 仅看需求单元标题会遗漏这类变更。
|
|
62
69
|
|
|
63
70
|
#### 1.3 识别散射型变更
|
|
64
71
|
|
|
65
72
|
检查是否有同一功能点散布在多个需求单元中:
|
|
66
|
-
-
|
|
73
|
+
- 同一字段在不同页面的展示 / 编辑 / 导出
|
|
67
74
|
- 同一业务规则在不同入口的复用
|
|
68
|
-
-
|
|
75
|
+
- 同一权限、校验、状态流转、历史数据处理在多个模块重复出现
|
|
76
|
+
|
|
77
|
+
记录每组散射变更,后续 task 拆分和 wave 编排时必须显式处理。
|
|
69
78
|
|
|
70
79
|
### Step 2: 输出需求清单 — 覆盖度确认
|
|
71
80
|
|
|
@@ -86,8 +95,8 @@ description: "Generate a version development plan from a source requirements doc
|
|
|
86
95
|
|
|
87
96
|
### 散射型变更(同一功能点跨多个需求单元)
|
|
88
97
|
|
|
89
|
-
| 功能点 | 涉及的需求单元 | 建议处理 |
|
|
90
|
-
|
|
98
|
+
| 散射组 | 功能点 | 涉及的需求单元 | 建议处理 |
|
|
99
|
+
|--------|--------|--------------|---------|
|
|
91
100
|
|
|
92
101
|
### 需求总表 vs 全文扫描差异
|
|
93
102
|
|
|
@@ -99,42 +108,155 @@ description: "Generate a version development plan from a source requirements doc
|
|
|
99
108
|
|
|
100
109
|
**等待用户确认后再继续。**
|
|
101
110
|
|
|
102
|
-
### Step 3:
|
|
111
|
+
### Step 3: Task 拆分 — 生成内聚 task 候选
|
|
112
|
+
|
|
113
|
+
基于已确认的需求清单,先生成内聚 task 候选。task 可以有多个,但禁止碎拆。
|
|
114
|
+
|
|
115
|
+
#### 3.1 合并为同一个 task 的信号
|
|
116
|
+
|
|
117
|
+
优先合并为同一个 task:
|
|
118
|
+
- 属于同一个可验收业务闭环,例如页面 + 接口 + 状态流转 + 导出完整闭环
|
|
119
|
+
- 同一字段、规则、权限、校验或导出链路在多个入口复用
|
|
120
|
+
- 同一散射组内的变更如果拆开会导致重复改同一批文件或难以独立验收
|
|
121
|
+
- 强依赖同一份数据模型、接口契约或迁移脚本
|
|
122
|
+
- 拆开后任一 task 只剩半成品,无法说明自己的验收结果
|
|
123
|
+
|
|
124
|
+
#### 3.2 拆成多个 task 的信号
|
|
125
|
+
|
|
126
|
+
可以拆成多个 task:
|
|
127
|
+
- 每个 task 都能独立开发、独立自测、说明验收结果
|
|
128
|
+
- 只有弱依赖,前置 task 提供稳定接口 / 数据后即可并行
|
|
129
|
+
- 技术层差异明显,例如基础迁移、后端契约、前端体验可分阶段完成
|
|
130
|
+
- 风险等级不同,需要先交付低风险或核心链路
|
|
131
|
+
- 多人并行开发时,边界清晰且交集可控
|
|
132
|
+
|
|
133
|
+
#### 3.3 每个 task 候选必须写清
|
|
134
|
+
|
|
135
|
+
- task id / 标题
|
|
136
|
+
- ✅ 本 task 范围
|
|
137
|
+
- ❌ 相关但不在本 task 范围
|
|
138
|
+
- 来源需求位置
|
|
139
|
+
- 散射组归属
|
|
140
|
+
- 依赖 task
|
|
141
|
+
- 建议主要 wave
|
|
142
|
+
- 可验收结果 / 可提测性
|
|
143
|
+
- 风险 / 开放问题
|
|
144
|
+
|
|
145
|
+
#### 3.4 反碎拆检查
|
|
103
146
|
|
|
104
|
-
|
|
147
|
+
输出 task 候选后,必须自检:
|
|
148
|
+
- 有没有 task 只对应一个孤立字段、按钮、接口或页面小块?
|
|
149
|
+
- 有没有一个业务闭环被拆成多个互相等待的 task?
|
|
150
|
+
- 有没有同一散射组被拆到不同 task 且没有理由?
|
|
151
|
+
- 有没有 task 完成后无法说明“验收什么”?
|
|
152
|
+
|
|
153
|
+
这些情况必须合并或解释理由。
|
|
154
|
+
|
|
155
|
+
### Step 4: Wave 编排 — 分批提测 / 交付
|
|
156
|
+
|
|
157
|
+
基于 task 候选编排 waves。wave 是版本级批次,用于组织 task 的提测 / 交付顺序。
|
|
158
|
+
|
|
159
|
+
#### 4.1 Wave 准则
|
|
160
|
+
|
|
161
|
+
一个 wave 必须写清:
|
|
162
|
+
- wave id / 名称
|
|
163
|
+
- 目标:这一批完成后测试能验什么
|
|
164
|
+
- 包含 task
|
|
165
|
+
- 提测范围
|
|
166
|
+
- 前置条件:依赖哪些 task / 外部系统 / 数据准备
|
|
167
|
+
- 完成条件:哪些验收项通过才算完成
|
|
168
|
+
- 可提测性:可独立提测 / 依赖后续 wave / 仅前置能力
|
|
169
|
+
|
|
170
|
+
> 如果一批只包含基础设施、迁移、公共组件或接口契约,不能直接标成“可独立提测 wave”。应作为后续 wave 的前置依赖,或并入首个能形成业务验收闭环的 wave。
|
|
171
|
+
|
|
172
|
+
#### 4.2 输出 task / wave 拆分结果
|
|
173
|
+
|
|
174
|
+
```markdown
|
|
175
|
+
## <版本> 任务拆分与 Waves
|
|
105
176
|
|
|
106
|
-
|
|
177
|
+
### 拆分原则
|
|
178
|
+
- <为什么这样合并 / 拆分 task>
|
|
179
|
+
|
|
180
|
+
### Task 候选列表
|
|
181
|
+
|
|
182
|
+
| Task ID | Task 名称 | 本 task 范围 | 不在范围 | 来源需求 | 散射组 | 依赖 | 主要 Wave | 可验收结果 | 风险 |
|
|
183
|
+
|---------|-----------|-------------|----------|----------|--------|------|-----------|------------|------|
|
|
184
|
+
|
|
185
|
+
### Wave 计划
|
|
186
|
+
|
|
187
|
+
| Wave | 目标 | 包含 task | 提测范围 | 前置条件 | 完成条件 | 可独立提测 |
|
|
188
|
+
|------|------|-----------|----------|----------|----------|------------|
|
|
189
|
+
|
|
190
|
+
### 需求 -> Task -> Wave 覆盖矩阵
|
|
191
|
+
|
|
192
|
+
| 需求条目 | 来源位置 | 覆盖 task | 所属 wave | 状态 |
|
|
193
|
+
|----------|----------|-----------|-----------|------|
|
|
194
|
+
|
|
195
|
+
### 依赖关系
|
|
196
|
+
|
|
197
|
+
| Task | 依赖 | 被谁依赖 | 说明 |
|
|
198
|
+
|------|------|----------|------|
|
|
199
|
+
|
|
200
|
+
### 争议 / 待确认
|
|
201
|
+
|
|
202
|
+
- <需要用户确认的拆分争议、提测顺序或范围边界>
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**等待用户确认 task / wave 拆分后再继续工时评估。**
|
|
206
|
+
|
|
207
|
+
### Step 5: 工时评估
|
|
208
|
+
|
|
209
|
+
基于确认后的 task / wave 拆分评估工时,而不是只按原始需求单元评估。
|
|
210
|
+
|
|
211
|
+
输出表格的列结构**根据项目实际的角色分工来定**(如前端 / 后端 / 全栈 / 测试等),不要预设。
|
|
107
212
|
|
|
108
213
|
评估原则:
|
|
109
214
|
- 如有 AI 编程辅助,标注基准(AI 辅助 vs 纯人工)
|
|
110
215
|
- 复用关系明确标注
|
|
111
216
|
- 优先级以需求文档为准
|
|
217
|
+
- task 的依赖和 wave 的提测顺序必须影响排期
|
|
218
|
+
- 半成品 / 前置能力 task 必须说明它服务哪个 wave
|
|
112
219
|
|
|
113
|
-
### Step
|
|
220
|
+
### Step 6: 人员分工
|
|
114
221
|
|
|
115
|
-
|
|
222
|
+
按模块边界、复用链和 wave 提测边界分工,遵循:
|
|
116
223
|
- 复用链归同一人
|
|
117
|
-
-
|
|
118
|
-
-
|
|
224
|
+
- 散射型变更归同一人或同一小组
|
|
225
|
+
- 同一 wave 的关键路径要清楚
|
|
226
|
+
- 尽量无交集;有交集时明确接口 / 数据 / 文案 / 测试责任边界
|
|
119
227
|
|
|
120
228
|
输出分工表和排期建议。
|
|
121
229
|
|
|
122
|
-
### Step
|
|
230
|
+
### Step 7: 生成产物文件
|
|
123
231
|
|
|
124
|
-
|
|
232
|
+
默认在 `doc/<版本>/` 目录下生成:
|
|
125
233
|
|
|
126
|
-
```
|
|
234
|
+
```text
|
|
127
235
|
doc/
|
|
128
|
-
|
|
129
|
-
├──
|
|
236
|
+
└── <版本>/
|
|
237
|
+
├── 需求清单.md
|
|
238
|
+
├── 任务拆分与waves.md
|
|
239
|
+
└── 开发计划-工时评估.md
|
|
130
240
|
```
|
|
131
241
|
|
|
242
|
+
如果用户显式指定产物路径,以用户指定路径为准;后续 `trellis-extract-prd` / `trellis-verify-task` 必须引用这个显式路径。
|
|
243
|
+
|
|
244
|
+
`任务拆分与waves.md` 是后续单 task PRD 的版本级来源:
|
|
245
|
+
- `trellis-extract-prd` 从其中读取 task 候选、wave、来源需求位置和边界
|
|
246
|
+
- `trellis-verify-task` 用它检查“版本需求 -> task -> wave”的覆盖和边界一致性
|
|
247
|
+
|
|
132
248
|
---
|
|
133
249
|
|
|
134
250
|
## 反模式
|
|
135
251
|
|
|
136
252
|
- ❌ 只从需求总表提取需求(会漏掉嵌入式变更)
|
|
137
|
-
- ❌
|
|
138
|
-
- ❌
|
|
253
|
+
- ❌ 跳过覆盖度确认直接做 task 拆分或工时评估
|
|
254
|
+
- ❌ 按文档章节机械拆 task
|
|
255
|
+
- ❌ 按页面 / 接口 / 字段碎拆 task,导致一个可验收闭环散落多处
|
|
256
|
+
- ❌ 为避免碎拆而整个版本只建一个过大的 task,导致边界和并行开发失控
|
|
257
|
+
- ❌ 散射型变更分给不同 task 且没有统一归组理由
|
|
258
|
+
- ❌ wave 只按日期、人员或模块排序,没有可提测目标和完成条件
|
|
259
|
+
- ❌ 把只有基础设施 / 迁移 / 公共组件的半成品批次标成可提测 wave
|
|
260
|
+
- ❌ 生成 task / wave 拆分后不等待用户确认,直接做工时评估或创建 task
|
|
139
261
|
- ❌ 假设文档有特定格式或特定的角色分工模式
|
|
140
262
|
- ❌ 当多个来源的优先级冲突时不明确说明以哪个为准
|