@prd-improve/cli 1.0.0 → 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.
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/skill.d.ts +8 -0
- package/dist/commands/skill.js +56 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/i18n/en.js +3 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/help.en.d.ts +11 -0
- package/dist/i18n/help.en.js +9 -0
- package/dist/i18n/help.en.js.map +1 -1
- package/dist/i18n/help.zh.d.ts +11 -0
- package/dist/i18n/help.zh.js +9 -0
- package/dist/i18n/help.zh.js.map +1 -1
- package/dist/i18n/helpGroups.js +1 -1
- package/dist/i18n/helpGroups.js.map +1 -1
- package/dist/i18n/zh.d.ts +4 -0
- package/dist/i18n/zh.js +3 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/skill/prd-improve-forge/SKILL.md +610 -0
- package/dist/skill/prd-improve-forge/checklists/batch-import.md +195 -0
- package/dist/skill/prd-improve-forge/examples/import-history-prds.prd.yaml +514 -0
- package/dist/skill/prd-improve-forge/templates/prd.yaml +287 -0
- package/package.json +2 -2
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-improve-forge
|
|
3
|
+
description: Use when user wants to write, refine, or structure a PRD for a specific feature — converting vague ideas, meeting notes, chat snippets, or legacy docs into a complete, edge-specified spec following PRD Improve schema v0.2. Differentiator from generic PRD helpers — drives multi-round boundary questioning (P0/P1/P2 priorities) via feature-type checklists and outputs structured `.prd/features/<slug>/working/prd.yaml` (not free-form Markdown), so downstream `prd validate` / `prd freeze` / `prd context` CLI commands can consume it. Triggers on Chinese phrases like '写 PRD'、'整理需求'、'规范化需求'、'把 X 整理成 PRD'、'梳理功能边界'、'会议纪要整理成需求'、'聊天记录整理成 PRD'、'把这个想法变成规格'、'帮我做需求规格化' or English equivalents. DO NOT trigger for: (a) general product strategy / OKR / roadmap discussion without a specific feature scope; (b) writing code, implementation, architecture, or technical design docs; (c) editing a single field of an already-frozen PRD (use `prd` CLI directly); (d) high-level vision documents or pitch decks. Also triggers on PRD refresh requests — when an existing .prd/features/<slug>/working/prd.yaml needs to be updated against a new PRD version. Refresh triggers '同步新版 PRD'、'重新 sync'、'基于新版 PRD 更新'、'PRD 改了'、'PRD 升级了'、'feature 升级'、'对齐 PRD'、'incorporate PRD changes' or equivalents. Skill loads existing yaml + new PRD, runs structured field-level diff via `prd refresh`, walks PM through decisions, writes patches + appends working/CHANGELOG.md. DO NOT trigger refresh for PRD 大改 / 几乎重写(→ 重跑白板模式);单字段修订(→ 直接 edit yaml 或 prd CLI);现有 yaml 不存在(→ 自动 fallback 白板模式).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# PRD Improve Forge
|
|
7
|
+
|
|
8
|
+
把一个功能从**模糊想法**推进到**可开发、可测试、可追溯**的结构化 PRD。
|
|
9
|
+
产出文件符合 PRD Improve schema v0.2,可直接被 `prd validate` / `prd freeze` / `prd context` 等 CLI 命令消费。
|
|
10
|
+
|
|
11
|
+
## 适用与不适用
|
|
12
|
+
|
|
13
|
+
**适用:**
|
|
14
|
+
- 有一个**具体功能**要写成 PRD(如"批量导入"、"审批流"、"权限管理")
|
|
15
|
+
- 已有原始材料(会议纪要、聊天片段、旧 PRD、AI 对话)要整理成规范
|
|
16
|
+
- 把一句话需求扩展成完整规格
|
|
17
|
+
|
|
18
|
+
**不适用:**
|
|
19
|
+
- 产品战略 / OKR / 路线图 —— 本 Skill 不做
|
|
20
|
+
- README / 技术设计文档 / 架构文档 —— 本 Skill 不做
|
|
21
|
+
- 没有明确功能边界的模糊讨论 —— 先引导用户聚焦到具体功能再触发
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 工作流程(严格按顺序执行)
|
|
26
|
+
|
|
27
|
+
### 第 1 步:识别模式 + 功能类型
|
|
28
|
+
|
|
29
|
+
#### 1.1 识别模式(白板 vs refresh)
|
|
30
|
+
|
|
31
|
+
按以下顺序判定:
|
|
32
|
+
|
|
33
|
+
1. **触发词 ∈ refresh 集合 + `working/prd.yaml` 存在** → refresh 模式 → 跳第 7 步
|
|
34
|
+
2. **触发词 ∈ refresh 集合 + `working/prd.yaml` 不存在** →
|
|
35
|
+
询问用户「未找到现有 yaml,确认要走白板模式从 0 生成吗?」
|
|
36
|
+
默认 fallback 白板 + 明确告知
|
|
37
|
+
3. **其他触发词** → 白板模式 → 走 1.2
|
|
38
|
+
|
|
39
|
+
**refresh 触发词集合**(5 类信号):
|
|
40
|
+
|
|
41
|
+
| 类型 | 中文 | 英文 |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| 变化 | "PRD 改了" / "PRD 变了" / "PRD 升级了" / "PRD 迭代" / "PRD 出了新版" / "新版 PRD 已经发了" | "PRD changed" / "PRD updated" / "new PRD version" |
|
|
44
|
+
| 同步 | "重新 sync" / "同步新版 PRD" / "把 PRD 同步到 yaml" / "刷新 PRD" / "重新刷一遍 PRD" | "resync PRD" / "refresh PRD" / "sync yaml with PRD" |
|
|
45
|
+
| 更新 | "基于新版 PRD 更新" / "按新版调整 yaml" / "更新已有 PRD" / "feature 升级" | "update from new PRD" / "update yaml to new PRD" |
|
|
46
|
+
| 对齐 | "重新对齐 PRD" / "yaml 跟最新 PRD 对齐" / "把 yaml 和 PRD 对齐" | "align yaml with new PRD" |
|
|
47
|
+
| 吸收 | "把这版 PRD 的变化吃进来" / "增量更新 PRD" / "吸收 PRD 变化" | "incorporate PRD changes" / "ingest PRD diff" |
|
|
48
|
+
|
|
49
|
+
**DO NOT trigger refresh**:
|
|
50
|
+
|
|
51
|
+
| 场景 | 走向 |
|
|
52
|
+
|---|---|
|
|
53
|
+
| 「写新 PRD」/「整理需求」/「梳理功能边界」 | 白板模式(v0.1) |
|
|
54
|
+
| PRD 大改 / 几乎重写(7.1 step 0 PM 自报 (c)) | 重跑白板(refresh 不适合大手术) |
|
|
55
|
+
| 单字段修订(只改 owner / 改 AC-7) | 直接 edit yaml 或用 `prd` CLI |
|
|
56
|
+
| 现有 yaml 不存在 | fallback 白板 + 明确告知 |
|
|
57
|
+
|
|
58
|
+
#### 1.2 (白板模式)识别功能主类型
|
|
59
|
+
|
|
60
|
+
从用户输入中提取特征,判定功能类型并决定加载哪份 checklist:
|
|
61
|
+
|
|
62
|
+
| 特征关键词 / 场景 | 功能类型 | checklist 文件 |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| 批量 / 批处理 / 一次性 / 成批 / 文件上传 / 数据迁移 / CSV / Excel | 批量导入 | `checklists/batch-import.md` |
|
|
65
|
+
| (规划中) 审批 / 流转 / 多级确认 | 审批流 | `checklists/approval-flow.md` |
|
|
66
|
+
| (规划中) 角色 / 权限 / 访问控制 | 权限 | `checklists/permission.md` |
|
|
67
|
+
| (规划中) 站内信 / 邮件 / 推送 / 触达 | 通知 | `checklists/notification.md` |
|
|
68
|
+
|
|
69
|
+
若识别不出或跨多类型 → 仅依赖模板自身的 [必填] 字段驱动追问,并在 open_questions 加一条"功能类型不明,可能需要定制 checklist"。
|
|
70
|
+
|
|
71
|
+
### 第 2 步:强制加载资源
|
|
72
|
+
|
|
73
|
+
**必须读完以下三份文件再开始追问:**
|
|
74
|
+
|
|
75
|
+
1. `templates/prd.yaml` — 骨架结构、字段定义、标记约定
|
|
76
|
+
2. `checklists/<type>.md` — 该类型功能的边界追问清单
|
|
77
|
+
3. `examples/import-history-prds.prd.yaml` — 金标准范例(仅参考结构,**不照抄具体值**)
|
|
78
|
+
|
|
79
|
+
**资源定位协议(跨平台路径自适应,按顺序尝试):**
|
|
80
|
+
|
|
81
|
+
1. **相对路径优先** — `templates/prd.yaml` / `checklists/<type>.md` / `examples/import-history-prds.prd.yaml`
|
|
82
|
+
(Claude Code skill 默认行为,skill 目录是工作目录)
|
|
83
|
+
2. **项目根 `.prd-skill/` 兜底** — `.prd-skill/templates/prd.yaml` 等
|
|
84
|
+
(Cursor / Codex / Antigravity 等把 SKILL.md 内容塞进 system prompt 时,子目录通常拷到项目根)
|
|
85
|
+
3. **knowledge / uploads 索引** — ChatGPT Custom GPT 把子目录上传为 knowledge,按文件名查找
|
|
86
|
+
4. **以上全失败** — **不要凭空编造**。明确告知用户"未找到 templates/prd.yaml,请确认子目录已部署到 `<候选路径列表>` 之一",停止流程
|
|
87
|
+
|
|
88
|
+
**不要凭空生成答案。** 找不到资源就告诉用户,不要假装读过。
|
|
89
|
+
|
|
90
|
+
### 第 2.5 步:长材料预处理(条件触发)
|
|
91
|
+
|
|
92
|
+
**触发条件:** 用户一次性投入 ≥ 100 行的聊天记录、会议纪要、旧 PRD 长文,或粘贴了多个文档片段。
|
|
93
|
+
|
|
94
|
+
**必须先做摘要再追问**(不要直接进入 P0 追问):
|
|
95
|
+
|
|
96
|
+
1. **摘要 5-10 条关键事实**(出处必须可追溯到原文段落,不要总结成抽象观点)
|
|
97
|
+
- 已表达的需求点
|
|
98
|
+
- 已表达的边界 / 约束
|
|
99
|
+
- 已表达的反对意见 / out_of_scope
|
|
100
|
+
- 隐含的假设 / 未定决策
|
|
101
|
+
2. **列 3-5 个关键悬而未决的点**(给追问做导航,标"你提到 X,但没说 Y,后续会细问")
|
|
102
|
+
3. **请用户校验摘要**:"以上理解是否准确?有没有漏掉关键点?"
|
|
103
|
+
4. **校验通过后**再进入第 3 步追问;校验有出入则就近修正,不要带着错误前提追问
|
|
104
|
+
|
|
105
|
+
**目的:** 长材料 token 消耗大,不预处理直接追问会出现"AI 漏看关键约束"或"用户重复回答已在材料里的事"。摘要环节让 AI 和用户对齐"已知事实",追问只补"未知边界"。
|
|
106
|
+
|
|
107
|
+
**不触发条件:** 用户只给一两句话需求 / 短材料 / 直接就是 P0 答案 → 跳过本步,直接进第 3 步。
|
|
108
|
+
|
|
109
|
+
### 第 3 步:分轮次追问
|
|
110
|
+
|
|
111
|
+
遵循 checklist 的执行协议:
|
|
112
|
+
|
|
113
|
+
- 每轮 3-5 个问题,不要一次性抛一大堆
|
|
114
|
+
- 按 P0 → P1 → P2 顺序,P0 未答完不进 P1
|
|
115
|
+
- 有选项的题给选项(`A / B / C / D / 其他`),不要开放题
|
|
116
|
+
- 每轮结束做"已确认的关键决策"摘要,让用户确认或修正
|
|
117
|
+
- 用户说"够了"或"直接生成"即停止,未答问题进 `open_questions`
|
|
118
|
+
|
|
119
|
+
**追问数量与优先级**(优先级冲突时按以下顺序让步):
|
|
120
|
+
|
|
121
|
+
1. **P0 必须问完**(checklist 中所有 P0,通常 5-10 题,跨 1-2 轮) — 不可裁剪,P0 未答完不进 P1
|
|
122
|
+
2. **P1 按预算挑选**(剩余轮次内挑 6-10 题最相关的) — 用户表现配合就多问,显疲态就跳过
|
|
123
|
+
3. **P2 仅当用户积极时问**(2-3 题点缀)— 用户说"够了"立即停止,P2 未答的全进 `open_questions` 标 `non_blocking`
|
|
124
|
+
|
|
125
|
+
**总轮数 3-5 轮**,**总题数 15-25 题**(批量导入这类中等复杂度功能的典型规模)。简单功能可少,复杂功能可多,但 **P0 完整性 > 问到 P1/P2 数量**。
|
|
126
|
+
|
|
127
|
+
不要为了凑题数把 P0 拆得过细,也不要为了少问跳过 P0。
|
|
128
|
+
|
|
129
|
+
### 第 4 步:填充 prd.yaml
|
|
130
|
+
|
|
131
|
+
以 template 为骨架,按以下规则填写:
|
|
132
|
+
|
|
133
|
+
- 顶层 key 使用**英文**(和 template 一致,不改名)
|
|
134
|
+
- value 用**中文**(ID 值保留英文前缀,如 `"EN-1"`)
|
|
135
|
+
- **保留**:每个模块头部的 `# === section | 用途 ===` 分隔块
|
|
136
|
+
- **保留**:每个字段右侧的 `-- 中文名` 标签(例如 `id: "EN-1" # -- 实体`)
|
|
137
|
+
- **可删**:完成填写后的 `[必填] / [选填] / [PM 填] / [CLI 管] / [机器读]` 任务标记注释(这些是给写作者看的脚手架,定稿后无信息量)
|
|
138
|
+
- 长文本用 YAML block style `|`(如 `background`、大段 `rule`)
|
|
139
|
+
- ID 前缀严格遵守:EN / S / R / SC / E / UI / AC / Q / DC / API / PC / SEC
|
|
140
|
+
|
|
141
|
+
**具体决策值必须来自用户**。用户没说的,放进 `open_questions`,不要代为决策。
|
|
142
|
+
|
|
143
|
+
### 第 5 步:确定并写入路径
|
|
144
|
+
|
|
145
|
+
**feature slug 规则:**
|
|
146
|
+
- 小写字母 + 数字 + 连字符
|
|
147
|
+
- 匹配正则 `^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$`
|
|
148
|
+
- 不允许 `_`、空格、中文、大写
|
|
149
|
+
- 若用户给的功能名是中文或含特殊字符,**主动问** slug 该叫什么
|
|
150
|
+
|
|
151
|
+
**输出路径:**
|
|
152
|
+
```
|
|
153
|
+
.prd/features/<feature-slug>/working/prd.yaml
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 第 6 步:收尾回报
|
|
157
|
+
|
|
158
|
+
生成完毕后告诉用户:
|
|
159
|
+
|
|
160
|
+
1. 文件路径
|
|
161
|
+
2. 模块规模(各段填了多少条)
|
|
162
|
+
3. blocking 级 open_questions 的数量和清单
|
|
163
|
+
4. 建议下一步:回答 blocking → `prd validate` → `prd freeze`
|
|
164
|
+
|
|
165
|
+
### 第 7 步:refresh 工作流
|
|
166
|
+
|
|
167
|
+
#### 7.0 问 PM 变化规模(强制,不可跳)
|
|
168
|
+
|
|
169
|
+
> "本次 PRD 变化主要属于哪类?(a) 单字段微调(1-2 处) (b) 几处协同变化(几个模块新增/删除/修改) (c) 几乎重写一半以上"
|
|
170
|
+
|
|
171
|
+
- (a) → 建议「直接 edit yaml 或 `prd` CLI 单点改」,不必走 refresh 全流程
|
|
172
|
+
- (b) → 进入 refresh,后续步骤照走
|
|
173
|
+
- (c) → 建议「重跑白板模式从头生成」,refresh 不适合大手术
|
|
174
|
+
- 用户选 (a) 或 (c) → 明确转出口,不强制走完 refresh
|
|
175
|
+
|
|
176
|
+
#### 7.1 前置检查
|
|
177
|
+
|
|
178
|
+
- `.prd/features/<slug>/working/prd.yaml` 存在 → 继续
|
|
179
|
+
- 不存在 → fallback 白板模式,明确告知用户
|
|
180
|
+
- 用户给了新 PRD?
|
|
181
|
+
- 没给 → 询问路径或让粘贴文本
|
|
182
|
+
- 给了 → 继续
|
|
183
|
+
- 新 PRD 是 markdown(.md)?
|
|
184
|
+
- 是 → `--prd-anchor` 可用
|
|
185
|
+
- 不是(docx / pdf / 粘贴文本) → 跳过 anchor,AI 读全文
|
|
186
|
+
|
|
187
|
+
#### 7.2 调 CLI 拿索引视图
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
prd refresh --feature <slug> \
|
|
191
|
+
[--new-prd <path>] \
|
|
192
|
+
[--prd-anchor <heading>] \
|
|
193
|
+
[--prd-anchor-exact]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
CLI 失败(yaml 找不到 / anchor 不命中 / 多匹配 / fs 错)→ 停止,转告 stderr。
|
|
197
|
+
|
|
198
|
+
#### 7.3 长材料预处理(复用第 2.5 步规则)
|
|
199
|
+
|
|
200
|
+
新 PRD ≥ 100 行 → 先摘 5-10 条关键事实 + 3-5 个未决点 → 请用户校验
|
|
201
|
+
短 PRD → 跳过
|
|
202
|
+
|
|
203
|
+
#### 7.4 AI 语义 diff
|
|
204
|
+
|
|
205
|
+
AI 拿「索引视图 + refers_to 反向图 + entry titles dump + 新 PRD」产字段级变化清单,**分 4 组**呈现:
|
|
206
|
+
|
|
207
|
+
- `[+]` 新增
|
|
208
|
+
- `[-]` 删除
|
|
209
|
+
- `[~]` 修改
|
|
210
|
+
- `[⚠]` 边界变更
|
|
211
|
+
|
|
212
|
+
每条变化标:
|
|
213
|
+
- yaml 字段 ID + 行号
|
|
214
|
+
- 变化前 → 变化后
|
|
215
|
+
- 推测来源(PRD 行号或段落标题)
|
|
216
|
+
- 若涉及被引用字段:附 `refers_to` 反向图警示
|
|
217
|
+
|
|
218
|
+
**7.4 末尾必须给变化规模摘要**(关联 design 6.5 O-2 关闭决策):AI 一行总结「本次变化涉及 N 个模块、共 X 处(其中 +A 新增 / -B 删除 / ~C 修改 / ⚠D 边界)」给 PM 自决是否换白板;**不用数字阈值强制阻断**。
|
|
219
|
+
|
|
220
|
+
#### 7.4.5 AI 自报覆盖盲区(防漏看关键步骤)
|
|
221
|
+
|
|
222
|
+
AI 在 7.4 完成后,**必须输出**:
|
|
223
|
+
|
|
224
|
+
1. 「本次诊断覆盖的 yaml 模块清单」—— 显式列出 AI 在 diff 时检查过哪几个模块
|
|
225
|
+
2. 「未动过的模块清单」—— 显式列出完全没改的模块,提醒 PM 复核
|
|
226
|
+
3. 「**entry titles dump cross-check**」—— 用索引视图末尾的 entry titles 全清单,逐个在新 PRD 中 grep:
|
|
227
|
+
- 全部命中 → OK 不动
|
|
228
|
+
- 完全没出现 → 候选删除,加入 `[-]` 组提示 PM
|
|
229
|
+
- 部分命中(标题变更) → `[~]` 修改组
|
|
230
|
+
|
|
231
|
+
#### 7.5 PM 逐条决策
|
|
232
|
+
|
|
233
|
+
每条:**接受 / 拒绝 / 修改文本**(三选一)
|
|
234
|
+
|
|
235
|
+
- 同类批量(如砍 12 处自动考核):可一次「批量接受 / 拒绝」
|
|
236
|
+
- **边界变更 / refers_to 断链:P0 强制逐条确认**,不可批量默认
|
|
237
|
+
- PM 填关键决策的 rationale:**边界变更 / `[⚠]` 类必填**;其他类可选填
|
|
238
|
+
|
|
239
|
+
#### 7.6 写盘 + 收尾(三步,严格顺序)
|
|
240
|
+
|
|
241
|
+
**Step 1**:内存中改完整个 yaml(parse → modify → serialize),不落盘
|
|
242
|
+
**Step 2**:内存中拼好 CHANGELOG 新段(append 到既有 [Unreleased] 末尾的字符串),不落盘
|
|
243
|
+
**Step 3**:落盘(**严格顺序:先 CHANGELOG → 后 yaml**)
|
|
244
|
+
|
|
245
|
+
1. 先写 `working/CHANGELOG.md`(metadata,失败容忍度高)
|
|
246
|
+
- 若失败:yaml 未动,可直接重试,无副作用
|
|
247
|
+
2. 再写 `working/prd.yaml`(真相源,失败影响大)
|
|
248
|
+
- 若失败:CHANGELOG 已 append 但 yaml 未生效;告知用户「yaml 写入失败,可手工 revert CHANGELOG.md 末段或忽略」
|
|
249
|
+
|
|
250
|
+
**Step 4**:跑 `prd validate` 自检
|
|
251
|
+
**Step 5**:收尾告知:
|
|
252
|
+
- N 处变化已应用 / X 处拒绝 / Y 处新 open_questions
|
|
253
|
+
- 文件路径(yaml + CHANGELOG.md)
|
|
254
|
+
- 自检结果(若新 blocking 必须明示)
|
|
255
|
+
- 下一步建议:解决 blocking → `prd freeze v1.1`
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 硬规则(8 条,违反即为 Skill 执行错误)
|
|
260
|
+
|
|
261
|
+
### 规则 1:不照抄范例的具体占位值
|
|
262
|
+
|
|
263
|
+
范例 `examples/import-history-prds.prd.yaml` 里的所有:
|
|
264
|
+
- 邮箱(`pm-alice@example.com`)
|
|
265
|
+
- 日期(`2026-04-29`、`2026-04-22`)
|
|
266
|
+
- 人名(`pm-alice`、`架构负责人`)
|
|
267
|
+
- 具体 slug(`import-history-prds`)
|
|
268
|
+
- 具体约束值(`5MB`、`50 个文件`、`正则 ^[a-z0-9]...`)
|
|
269
|
+
|
|
270
|
+
**都是演示占位值**。生成新 PRD 时:
|
|
271
|
+
- 用户提供真实值 → 用真实值
|
|
272
|
+
- 用户没提供 → 留 `""`,在 `open_questions` 加一条请用户补充
|
|
273
|
+
- **绝不照抄范例**
|
|
274
|
+
|
|
275
|
+
### 规则 2:[CLI 管] 字段留空或填固定初值
|
|
276
|
+
|
|
277
|
+
template 标 `[CLI 管]` 的字段由 CLI 维护,AI 不得手填具体运行值。
|
|
278
|
+
|
|
279
|
+
| 字段 | 生成时填什么 |
|
|
280
|
+
|---|---|
|
|
281
|
+
| `schema_version` | `"v0.2"` |
|
|
282
|
+
| `meta.team` | (PM 提供的 team slug,kebab-case,如 `prd-improve`) |
|
|
283
|
+
| `meta.lifecycle.version` | `"working"` |
|
|
284
|
+
| `meta.lifecycle.status` | `"draft"` |
|
|
285
|
+
| `meta.lifecycle.updated_at` | `""` (留空,CLI 首次写入时填充) |
|
|
286
|
+
|
|
287
|
+
其他 `[CLI 管]` 字段一律 `""` 或 `[]`。
|
|
288
|
+
|
|
289
|
+
### 规则 3:`ui_interaction` 可以整体为空
|
|
290
|
+
|
|
291
|
+
纯后台功能(API / 定时任务 / 数据同步 / 异步 worker)没有 UI,直接写:
|
|
292
|
+
|
|
293
|
+
```yaml
|
|
294
|
+
ui_interaction: []
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
**不要硬编一个"任务监控面板"凑数**。UI 是否存在由功能本身决定。
|
|
298
|
+
|
|
299
|
+
### 规则 4:写业务要求,不写技术实现选型
|
|
300
|
+
|
|
301
|
+
`data_and_api` 和 `edge_cases` 写的是**业务级约束**(任何合理实现都必须遵守),不是**技术选型**(开发可换的实现方案)。
|
|
302
|
+
|
|
303
|
+
**不得**出现(具体协议 / 算法 / 选型):
|
|
304
|
+
- `idempotency_key` 的具体哈希算法、字段拼接顺序
|
|
305
|
+
- 指数退避、重试间隔的具体公式(如"重试间隔 = 2^n × 100ms")
|
|
306
|
+
- 长轮询 / WebSocket / SSE / gRPC 等通信协议选型
|
|
307
|
+
- JWT / OAuth / 签名机制 / token 刷新策略 等具体认证协议选型
|
|
308
|
+
- 数据库 DDL、索引、分表策略
|
|
309
|
+
- 前端框架、组件库、状态管理库选型
|
|
310
|
+
|
|
311
|
+
**可以**出现(业务要求 / 业务上限 / 业务可见行为):
|
|
312
|
+
- "任务创建接口需支持幂等(同 initiator + 同文件集合 + 60 秒窗口返回同 task_id)" — 业务要求
|
|
313
|
+
- "worker 失败后重试,最多 2 次" — 业务上限,而非"如何重试"
|
|
314
|
+
- "失败文件下载链接需鉴权,链接有效期 ≤ 10 分钟" — 业务要求 + 上限,而非"用签名 URL"
|
|
315
|
+
- "列表首屏 ≤ 2s" — 业务可观察的性能指标
|
|
316
|
+
|
|
317
|
+
**判定标准**(当你拿不准时问自己):
|
|
318
|
+
- 这条约束换一种合理实现方式还成立吗?成立 → 业务约束,可写
|
|
319
|
+
- 这条约束写的是"做什么"还是"怎么做"?前者可写,后者删
|
|
320
|
+
- 业务方关心这个数字 / 行为吗?关心 → 写;只是开发实现细节 → 删
|
|
321
|
+
|
|
322
|
+
**正确改写示例:**
|
|
323
|
+
- ❌ "失败清单 CSV 用 S3 签名 URL 下载,有效期 10 分钟"
|
|
324
|
+
- ✅ "失败清单 CSV 下载链接需鉴权,有效期 ≤ 10 分钟"
|
|
325
|
+
|
|
326
|
+
### 规则 5:state_permissions 写差异化,不模板化复述
|
|
327
|
+
|
|
328
|
+
**坏例子**(每个状态都复述一遍"查看任务详情"):
|
|
329
|
+
```yaml
|
|
330
|
+
state_permissions:
|
|
331
|
+
- entity_id: "EN-1"
|
|
332
|
+
state: "pending"
|
|
333
|
+
allowed_actions:
|
|
334
|
+
- action: "查看任务详情"
|
|
335
|
+
roles: ["产品经理"]
|
|
336
|
+
- entity_id: "EN-1"
|
|
337
|
+
state: "parsing"
|
|
338
|
+
allowed_actions:
|
|
339
|
+
- action: "查看任务详情"
|
|
340
|
+
roles: ["产品经理"]
|
|
341
|
+
# ... 4 次重复 ...
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**好例子**(只写该状态差异化的权限):
|
|
345
|
+
```yaml
|
|
346
|
+
state_permissions:
|
|
347
|
+
- entity_id: "EN-1"
|
|
348
|
+
state: "pending"
|
|
349
|
+
allowed_actions:
|
|
350
|
+
- action: "取消任务"
|
|
351
|
+
roles: ["产品经理", "工作空间管理员"]
|
|
352
|
+
notes: "pending 取消无副作用"
|
|
353
|
+
- entity_id: "EN-1"
|
|
354
|
+
state: "parsing"
|
|
355
|
+
allowed_actions:
|
|
356
|
+
- action: "取消任务"
|
|
357
|
+
roles: ["产品经理", "工作空间管理员"]
|
|
358
|
+
notes: "已完成的文件保留,未处理的丢弃"
|
|
359
|
+
- entity_id: "EN-1"
|
|
360
|
+
state: "succeeded"
|
|
361
|
+
allowed_actions:
|
|
362
|
+
- action: "下载失败清单"
|
|
363
|
+
roles: ["产品经理", "工作空间管理员"]
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
**跨状态通用的权限**(如"查看详情"、"PM 只能看自己的任务")→ 放在 `data_and_api.security_constraints` 或 `business_rules` 统一声明一次。
|
|
367
|
+
|
|
368
|
+
### 规则 6:entities.fields 写业务字段,不写 DB schema
|
|
369
|
+
|
|
370
|
+
**坏例子**(通用技术字段,写了等于没写):
|
|
371
|
+
```yaml
|
|
372
|
+
fields:
|
|
373
|
+
- name: "id"
|
|
374
|
+
type: "uuid"
|
|
375
|
+
- name: "created_at"
|
|
376
|
+
type: "datetime"
|
|
377
|
+
- name: "updated_at"
|
|
378
|
+
type: "datetime"
|
|
379
|
+
- name: "deleted_at"
|
|
380
|
+
type: "datetime"
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
**好例子**(业务关键字段 + 特殊约束字段):
|
|
384
|
+
```yaml
|
|
385
|
+
fields:
|
|
386
|
+
- name: "initiator"
|
|
387
|
+
type: "reference<用户>"
|
|
388
|
+
required: true
|
|
389
|
+
notes: "发起者,影响 state_permissions 判定"
|
|
390
|
+
- name: "file_count"
|
|
391
|
+
type: "int"
|
|
392
|
+
required: true
|
|
393
|
+
notes: "本次提交文件总数,创建后不变"
|
|
394
|
+
- name: "error_code"
|
|
395
|
+
type: "string"
|
|
396
|
+
required: false
|
|
397
|
+
notes: "枚举:FILE_TOO_LARGE / ENCODING_ERROR / SLUG_CONFLICT_IN_BATCH / ..."
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**原则:**
|
|
401
|
+
- 列业务必需字段(状态、身份、计数、业务枚举)
|
|
402
|
+
- 列有特殊约束的字段(格式、上限、唯一性)
|
|
403
|
+
- 不列 `id / created_at / updated_at / deleted_at / version` 等通用字段(开发按 convention 补)
|
|
404
|
+
- 如果字段就是 `id` 但有特殊规则(如 slug 正则),则写并标注规则
|
|
405
|
+
|
|
406
|
+
### 规则 7:MVP 降级协议
|
|
407
|
+
|
|
408
|
+
用户明确说"只做最简版"、"先跑通 MVP"、"快速出第一版"、"细节先不要" 等表态时,**触发降级**:
|
|
409
|
+
|
|
410
|
+
**降级目标:** 保证 4 个核心模块完整,其他模块允许"骨架 + open_questions",不阻塞 freeze。
|
|
411
|
+
|
|
412
|
+
**核心模块(必须完整)**:
|
|
413
|
+
- `meta`(版本信息)
|
|
414
|
+
- `in_scope`(本期范围)
|
|
415
|
+
- `out_of_scope`(明确不做 — 降级时尤其重要,把砍掉的点显式记下来)
|
|
416
|
+
- `acceptance_criteria`(验收标准 — 至少覆盖 in_scope 的每条)
|
|
417
|
+
|
|
418
|
+
**其他模块降级处理**:
|
|
419
|
+
- P0 已答的事实 → 正常填入对应模块
|
|
420
|
+
- P1 / P2 未答的题 → 全部转 `open_questions`,`severity: non_blocking`,`deferred_to: "v1.1"`
|
|
421
|
+
- 整个 `scenarios` / `edge_cases` 写 1-2 条"Happy Path"占位即可,其余 → `open_questions`
|
|
422
|
+
- `state_permissions` / `business_rules` 只写 P0 答出来的,其他 → `open_questions`
|
|
423
|
+
|
|
424
|
+
**收尾时必须告知用户:**
|
|
425
|
+
|
|
426
|
+
> 已按 MVP 模式生成。核心 4 模块完整,其他模块仅占位 + open_questions(共 N 条 non_blocking)。
|
|
427
|
+
> 进入 v1.1 前需回答这些问题以补全 PRD;但本期可直接 `prd validate` 通过(blocking 数为 0)。
|
|
428
|
+
|
|
429
|
+
**禁止**降级时凭空补 P1/P2 答案,这是 skill 最容易翻车的点 —— 用户说"简化"是要少做,不是要 AI 替他做决策。
|
|
430
|
+
|
|
431
|
+
### 规则 8:refresh 模式联动改动需逐条 PM 确认
|
|
432
|
+
|
|
433
|
+
(仅 refresh 模式生效。"AI 不凭空填字段值" 已在硬规则 #1 涵盖,本规则聚焦联动)
|
|
434
|
+
|
|
435
|
+
refresh 模式下,**因 PRD 删除 / 修改 + refers_to 引用关系**而产生的"联动改动"必须经 PM 逐条确认,不可自动应用。
|
|
436
|
+
|
|
437
|
+
**不得**:
|
|
438
|
+
- 新 PRD 删了某段而 yaml 里有对应实体,AI 自动从 yaml 删
|
|
439
|
+
(必须 P0 问 PM:是真砍还是 PRD 漏写?)
|
|
440
|
+
- 因 `refers_to` 联动,AI 自动改 SC-4 / E-2(改 R-3 时被引用方必须 PM 单独确认)
|
|
441
|
+
- AI 推测出的变化跟 PRD 原文不一致(必须停下问 PM,不可自动应用)
|
|
442
|
+
|
|
443
|
+
**只可**:
|
|
444
|
+
- PRD 文本明确说的字段,应用并标 source(PRD 行号 / heading)
|
|
445
|
+
- PM 在对话中明确指示的变化(标 rationale 由 PM 提供)
|
|
446
|
+
- `refers_to` 联动仅作"提示"出现在 diff 清单中,不直接应用
|
|
447
|
+
|
|
448
|
+
**与 7.5「批量接受」的边界**:批量接受只限**同一类同一字段**的变化(如"批量接受 12 处自动考核相关字段的删除"),**不跨字段联动**;refers_to 反向图中的"被引用字段"必须单独逐条决策。
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## 未回答问题的去向
|
|
453
|
+
|
|
454
|
+
用户说"够了"或明显不愿继续答时:
|
|
455
|
+
|
|
456
|
+
| 优先级 | severity | deferred_to |
|
|
457
|
+
|---|---|---|
|
|
458
|
+
| **P0 未答** | `blocking` | `""` |
|
|
459
|
+
| **P1 未答** | `non_blocking` | `"v1.1"` 或 `""` |
|
|
460
|
+
| **P2 未答** | `non_blocking`(或可丢弃) | `"v2"` 或 `""` |
|
|
461
|
+
|
|
462
|
+
**owner 字段:**
|
|
463
|
+
- 用户明确指定 → 填真实值
|
|
464
|
+
- 用户没说 → 填 `"待指派"`,不要填 `pm-alice` 之类占位
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
## 典型对话模板
|
|
469
|
+
|
|
470
|
+
> ⚠️ 以下数字(3-4 轮、5 个问题、5 scope / 2 entities / 10 AC)**仅为本范例的实际规模**,
|
|
471
|
+
> **不是目标也不是上限**。实际轮数和模块规模按功能复杂度调整 ——
|
|
472
|
+
> 简单功能 1-2 轮就够,复杂功能 5-6 轮也合理;entities 可能只有 1 个或多达 5 个;
|
|
473
|
+
> AC 取决于场景与边界数量。**P0 完整性 > 凑出特定规模**(M5 优先级)。
|
|
474
|
+
|
|
475
|
+
### 用户输入
|
|
476
|
+
|
|
477
|
+
> 帮我把"批量导入历史 PRD 文件"整理成 PRD
|
|
478
|
+
|
|
479
|
+
> ⚠️ 当用户一次性投入 ≥ 100 行长材料(聊天记录 / 会议纪要 / 旧 PRD)时,
|
|
480
|
+
> 在"第 1 轮"前**必须先插入一轮摘要校验轮**(执行第 2.5 步):
|
|
481
|
+
> 列 5-10 条已知事实(出处可追溯到原文段落)+ 3-5 个悬而未决的关键点,
|
|
482
|
+
> 请用户确认或修正后再进 P0 追问。
|
|
483
|
+
> 短材料 / 一句话需求(下面的范例)直接从"第 1 轮 · 识别 + 基础确认"开始。
|
|
484
|
+
|
|
485
|
+
### AI 响应(短材料场景,4 轮)
|
|
486
|
+
|
|
487
|
+
**第 1 轮 · 识别 + 基础确认:**
|
|
488
|
+
|
|
489
|
+
> 这是一个批量导入类功能,我会按 PRD Improve 规范帮你整理。
|
|
490
|
+
> 大约 3-5 轮追问(每轮 3-5 个问题),先问 P0 边界,再逐步细化。
|
|
491
|
+
> 你任何时候说"够了"都可以,未回答的关键问题会记在 open_questions 里。
|
|
492
|
+
>
|
|
493
|
+
> 先确认基础项:
|
|
494
|
+
> 1. feature slug 用什么?(英文小写连字符)
|
|
495
|
+
> 2. workspace / project 叫什么?
|
|
496
|
+
> 3. 你是这个功能的 PM 负责人吗?用什么邮箱?
|
|
497
|
+
|
|
498
|
+
**第 2 轮 · P0 核心边界:**
|
|
499
|
+
|
|
500
|
+
> 接下来问 5 个最关键的:
|
|
501
|
+
> 1. 数据从哪里来?(本地上传 / URL / API / 粘贴 / 其他)
|
|
502
|
+
> 2. 支持哪些文件格式?(CSV / Excel / MD / JSON / ...)
|
|
503
|
+
> 3. 遇到重复数据如何处理?(覆盖 / 跳过 / 报错 / 让用户选)
|
|
504
|
+
> 4. 是否允许部分成功?(允许 / 不允许全量回滚 / 让用户选)
|
|
505
|
+
> 5. 同一批次里两份文件指向同一实体,怎么办?
|
|
506
|
+
|
|
507
|
+
**第 3 轮 · P0 剩余 + P1 关键:**
|
|
508
|
+
|
|
509
|
+
> 再问几个:
|
|
510
|
+
> 1. 任务进行中,用户能再发起第二个吗?
|
|
511
|
+
> 2. 浏览器关闭后回来看到什么?
|
|
512
|
+
> 3. 追加这件事本期要做吗?追文件还是追数据?
|
|
513
|
+
> 4. 失败的文件数据保留多久?
|
|
514
|
+
> 5. 哪些角色能发起导入?
|
|
515
|
+
|
|
516
|
+
**收尾:**
|
|
517
|
+
|
|
518
|
+
> 好,已经够生成完整 PRD。梳理关键决策:
|
|
519
|
+
> - [摘要已确认的决策项]
|
|
520
|
+
> - [列出 blocking 待确认问题]
|
|
521
|
+
>
|
|
522
|
+
> 确认无误就生成 `.prd/features/<slug>/working/prd.yaml`。
|
|
523
|
+
|
|
524
|
+
**生成后:**
|
|
525
|
+
|
|
526
|
+
> 生成完毕:
|
|
527
|
+
> - 路径:`.prd/features/<slug>/working/prd.yaml`
|
|
528
|
+
> - 模块规模:5 scope / 2 entities / 5 rules / 5 scenarios / 7 edge cases / 10 AC
|
|
529
|
+
> - 待确认问题:6 条(2 blocking / 4 non_blocking)
|
|
530
|
+
>
|
|
531
|
+
> 建议下一步:
|
|
532
|
+
> 1. 回答 2 条 blocking(阻塞冻结)
|
|
533
|
+
> 2. `prd validate` 校验完整性
|
|
534
|
+
> 3. 完整通过再 `prd freeze --local --version v1.0`
|
|
535
|
+
|
|
536
|
+
### refresh 模式范例(简化版,3 轮)
|
|
537
|
+
|
|
538
|
+
**用户输入**(refresh 触发):
|
|
539
|
+
> PRD 升级到 v2.6 了,帮我把 yaml sync 一下
|
|
540
|
+
|
|
541
|
+
**第 1 轮 · 前置 + step 0 + 资源**:
|
|
542
|
+
|
|
543
|
+
> 检测到 refresh 模式。先确认变化规模:
|
|
544
|
+
> (a) 单字段微调 / (b) 几处协同变化 / (c) 几乎重写一半以上 →
|
|
545
|
+
>
|
|
546
|
+
> 用户:(b)
|
|
547
|
+
>
|
|
548
|
+
> OK,进入 refresh 流程。请确认:
|
|
549
|
+
> 1. feature slug 是?(若不确定,我列举 `.prd/features/` 下的)
|
|
550
|
+
> 2. 新 PRD 文件路径?(或贴文本)
|
|
551
|
+
> 3. PRD 文件大,需要章节锚点切片吗?(可选,如 "FR-RECRUIT-004")
|
|
552
|
+
|
|
553
|
+
**第 2 轮 · 字段级 diff + 自报覆盖**:
|
|
554
|
+
|
|
555
|
+
> 调 `prd refresh --feature candidate-pipeline --new-prd prd-2.6.md` 后,共发现 17 处字段变化:
|
|
556
|
+
>
|
|
557
|
+
> [-] 删除(自动考核相关 12 处):S-3 / EN-2 / R-3-5 / SC-4 / AC-4-6 / UI-5 / DC-5-6 / E-2-4
|
|
558
|
+
> 源:PRD v2.5 → v2.6 第 5.2 节砍除
|
|
559
|
+
> ➤ 批量接受?[y/n/逐条]
|
|
560
|
+
>
|
|
561
|
+
> [~] 修改 R-7 资质校验链:加 configurable_order 字段
|
|
562
|
+
> 源:PRD 第 5.3 节
|
|
563
|
+
> ⚠ refers_to:SC-7 / AC-15 引用 R-7,需联动看
|
|
564
|
+
> ➤ 接受 / 拒绝 / 修改?
|
|
565
|
+
>
|
|
566
|
+
> [自报] 本次诊断覆盖了 8 模块(in_scope / entities / business_rules / scenarios / acceptance_criteria / state_permissions / data_and_api / open_questions),未动过 2 模块(edge_cases / ui_interaction)— PM 请复核这两个模块是否真的没变。
|
|
567
|
+
> [cross-check] entry titles 全清单逐个在新 PRD 中 grep:全部命中,无候选删除。
|
|
568
|
+
|
|
569
|
+
**第 3 轮 · 收尾**:
|
|
570
|
+
|
|
571
|
+
> 已应用 14 处 / 拒绝 2 处 / 1 处转 open_questions:
|
|
572
|
+
> - 路径:`.prd/features/candidate-pipeline/working/prd.yaml`(已修改)
|
|
573
|
+
> - 路径:`.prd/features/candidate-pipeline/working/CHANGELOG.md`(已 append 一段 [Unreleased])
|
|
574
|
+
> - `prd validate` 自检:PASS(15/15 模块 + 0 引用错 + 0 blocking)
|
|
575
|
+
>
|
|
576
|
+
> 下一步:`prd freeze v1.1` 把这版固化。
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
## 跨平台兼容
|
|
581
|
+
|
|
582
|
+
本 Skill 遵循 Claude Skill 格式。在其他 AI 工具中使用:
|
|
583
|
+
|
|
584
|
+
| 平台 | 用法 |
|
|
585
|
+
|---|---|
|
|
586
|
+
| **Claude Code / Claude.ai** | 复制 `packages/skill/prd-improve-forge/` 到 `~/.claude/skills/` |
|
|
587
|
+
| **Cursor** | SKILL.md 内容粘贴到项目 `.cursorrules`;`templates/` / `checklists/` / `examples/` 放项目根的 `.prd-skill/` |
|
|
588
|
+
| **ChatGPT / Custom GPT** | SKILL.md 作为 system prompt;三个子目录上传为 knowledge |
|
|
589
|
+
| **Codex / Antigravity** | SKILL.md 内容放 system prompt / rules;子目录放项目根 |
|
|
590
|
+
|
|
591
|
+
**核心工作流不变**:识别模式 + 类型 → 加载资源 → (长材料先摘要) → 分轮追问 / refresh diff → 严格遵守 8 条硬规则 → 输出到 `.prd/features/<slug>/working/prd.yaml`(白板)或就地更新 + CHANGELOG append(refresh)。
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
## 版本与维护
|
|
596
|
+
|
|
597
|
+
**当前版本:** SKILL.md v0.2 · 对应 schema_version v0.2(refresh mode added 2026-05-12)
|
|
598
|
+
|
|
599
|
+
**支持的 checklist 类型:**
|
|
600
|
+
- [x] `batch-import` (批量导入)
|
|
601
|
+
- [ ] `approval-flow` (审批流,规划中)
|
|
602
|
+
- [ ] `permission` (权限,规划中)
|
|
603
|
+
- [ ] `notification` (通知,规划中)
|
|
604
|
+
|
|
605
|
+
**何时需要更新本 Skill:**
|
|
606
|
+
|
|
607
|
+
1. **新功能类型出现** → 添加新 checklist 文件,本 SKILL.md 第 1 步的识别表加一行
|
|
608
|
+
2. **模板 schema 升级** → 同步升级 schema_version,检查所有 checklist 引用的字段是否还存在
|
|
609
|
+
3. **反复踩同一个坑** → 在"硬规则"段新增一条并给坏例子 / 好例子
|
|
610
|
+
4. **触发不准** → 修改 frontmatter 的 description,连续观察 2 周
|