@prd-improve/cli 1.1.1 → 1.2.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 (48) hide show
  1. package/dist/cli.js +11 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/closeout.d.ts +7 -0
  4. package/dist/commands/closeout.js +245 -0
  5. package/dist/commands/closeout.js.map +1 -0
  6. package/dist/commands/freeze.d.ts +21 -0
  7. package/dist/commands/freeze.js +64 -21
  8. package/dist/commands/freeze.js.map +1 -1
  9. package/dist/commands/init.d.ts +1 -1
  10. package/dist/commands/init.js +4 -3
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/migrate-yaml.js +88 -46
  13. package/dist/commands/migrate-yaml.js.map +1 -1
  14. package/dist/i18n/en.js +27 -6
  15. package/dist/i18n/en.js.map +1 -1
  16. package/dist/i18n/help.en.d.ts +8 -0
  17. package/dist/i18n/help.en.js +10 -2
  18. package/dist/i18n/help.en.js.map +1 -1
  19. package/dist/i18n/help.zh.d.ts +8 -0
  20. package/dist/i18n/help.zh.js +10 -2
  21. package/dist/i18n/help.zh.js.map +1 -1
  22. package/dist/i18n/helpGroups.js +1 -1
  23. package/dist/i18n/helpGroups.js.map +1 -1
  24. package/dist/i18n/zh.d.ts +50 -1
  25. package/dist/i18n/zh.js +27 -6
  26. package/dist/i18n/zh.js.map +1 -1
  27. package/dist/schema/modules.d.ts +37 -5
  28. package/dist/schema/modules.js +14 -1
  29. package/dist/schema/modules.js.map +1 -1
  30. package/dist/schema/prd.d.ts +93 -17
  31. package/dist/schema/prd.js +36 -7
  32. package/dist/schema/prd.js.map +1 -1
  33. package/dist/skill/prd-improve-forge/SKILL.md +58 -5
  34. package/dist/skill/prd-improve-forge/checklists/batch-import.md +1 -1
  35. package/dist/skill/prd-improve-forge/examples/import-history-prds.prd.yaml +4 -4
  36. package/dist/skill/prd-improve-forge/templates/prd.yaml +17 -2
  37. package/dist/validators/blocking.js +15 -12
  38. package/dist/validators/blocking.js.map +1 -1
  39. package/dist/validators/references.js +9 -0
  40. package/dist/validators/references.js.map +1 -1
  41. package/dist/validators/runner.js +2 -2
  42. package/dist/validators/runner.js.map +1 -1
  43. package/dist/workspace.d.ts +4 -0
  44. package/dist/workspace.js.map +1 -1
  45. package/dist/yamlPatch.d.ts +11 -0
  46. package/dist/yamlPatch.js +38 -0
  47. package/dist/yamlPatch.js.map +1 -0
  48. package/package.json +1 -1
@@ -1,14 +1,18 @@
1
1
  import { z } from "zod";
2
- import { metaSchema, backgroundAndGoalsSchema, userRoleSchema, inScopeItemSchema, outOfScopeItemSchema, entitySchema, mainFlowStepSchema, statePermissionSchema, businessRuleSchema, scenarioSchema, edgeCaseSchema, uiPageSchema, dataAndApiSchema, acceptanceCriterionSchema, openQuestionSchema, slugPattern, } from "./modules.js";
2
+ import { metaSchema, backgroundAndGoalsSchema, userRoleSchema, inScopeItemSchema, outOfScopeItemSchema, entitySchema, mainFlowStepSchema, statePermissionSchema, businessRuleSchema, scenarioSchema, edgeCaseSchema, uiPageSchema, dataAndApiSchema, acceptanceCriterionSchema, openQuestionSchema, asBuiltDeviationSchema, slugPattern, } from "./modules.js";
3
3
  /**
4
- * 当前 schema 版本(v1.1 yaml meta 必带 team / project / feature 三 slug)。
5
- * 仍接受 v0.1 以支持 `prd migrate-yaml` 升级前的存量 yaml(spec §3.2 backward compat)。
4
+ * 当前 schema 版本(v0.3 起支持 lifecycle shipped 枚举 + open_questions resolution + as_built 模块)。
5
+ * 仍接受 v0.1 / v0.2 以支持存量 yaml 向后兼容(spec §3.2 backward compat)。
6
+ * v0.2 起强制 meta.team / project / feature 三 slug;v0.1 豁免。
6
7
  */
7
- export const SCHEMA_VERSION_CURRENT = "v0.2";
8
+ export const SCHEMA_VERSION_CURRENT = "v0.3";
9
+ export const SCHEMA_VERSION_V02 = "v0.2";
8
10
  export const SCHEMA_VERSION_LEGACY = "v0.1";
11
+ /** validate / runner 共用的版本白名单单一真相源(v1.21 I1:根治字面 drift)。 */
12
+ export const SCHEMA_VERSIONS_ACCEPTED = [SCHEMA_VERSION_LEGACY, SCHEMA_VERSION_V02, SCHEMA_VERSION_CURRENT];
9
13
  export const PrdSchema = z
10
14
  .object({
11
- schema_version: z.enum([SCHEMA_VERSION_LEGACY, SCHEMA_VERSION_CURRENT]),
15
+ schema_version: z.enum(SCHEMA_VERSIONS_ACCEPTED),
12
16
  meta: metaSchema,
13
17
  background_and_goals: backgroundAndGoalsSchema,
14
18
  users_and_roles: z.array(userRoleSchema),
@@ -24,11 +28,36 @@ export const PrdSchema = z
24
28
  data_and_api: dataAndApiSchema,
25
29
  acceptance_criteria: z.array(acceptanceCriterionSchema),
26
30
  open_questions: z.array(openQuestionSchema),
31
+ as_built: z.array(asBuiltDeviationSchema).optional(),
27
32
  })
28
33
  .strict()
29
34
  .superRefine((doc, ctx) => {
30
- // v0.1 keeps the legacy free-form meta(向后兼容);v0.2 起强制 slug.
31
- if (doc.schema_version !== SCHEMA_VERSION_CURRENT)
35
+ const ver = doc.schema_version;
36
+ // === 1. v0.3-only 字段/枚举值降级门(v0.1 / v0.2 文件带 v0.3 内容 → 引导 migrate) ===
37
+ if (ver !== SCHEMA_VERSION_CURRENT) {
38
+ const offend = (path) => ctx.addIssue({
39
+ code: z.ZodIssueCode.custom,
40
+ path,
41
+ message: `该字段/值属于 schema v0.3,当前文件是 ${ver}。请先运行 prd migrate-yaml 升级`,
42
+ });
43
+ if (doc.as_built !== undefined)
44
+ offend(["as_built"]);
45
+ const lc = doc.meta.lifecycle;
46
+ if (lc.shipped_at !== undefined)
47
+ offend(["meta", "lifecycle", "shipped_at"]);
48
+ if (lc.landed_commit !== undefined)
49
+ offend(["meta", "lifecycle", "landed_commit"]);
50
+ if (lc.status === "shipped")
51
+ offend(["meta", "lifecycle", "status"]);
52
+ doc.open_questions.forEach((q, i) => {
53
+ if (q.resolution !== undefined)
54
+ offend(["open_questions", i, "resolution"]);
55
+ if (q.resolved_at !== undefined)
56
+ offend(["open_questions", i, "resolved_at"]);
57
+ });
58
+ }
59
+ // === 2. slug 三件套强制(v0.2 与 v0.3 同强度;v0.1 legacy 豁免) ===
60
+ if (ver === SCHEMA_VERSION_LEGACY)
32
61
  return;
33
62
  const meta = doc.meta;
34
63
  // team 必填 + 必须是 slug
@@ -1 +1 @@
1
- {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/schema/prd.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/schema/prd.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: prd-improve-forge
3
- description: Use when the user wants to write, refine, or structure a PRD for a specific feature — turning vague ideas, meeting notes, chat snippets, or legacy docs into a complete, edge-case-specified requirements spec. Unlike generic PRD helpers, it drives multi-round boundary questioning (P0/P1/P2 priorities) through feature-type checklists and produces a structured YAML spec, not free-form Markdown. Triggers on phrases like '写 PRD'、'整理需求'、'规范化需求'、'把 X 整理成 PRD'、'梳理功能边界'、'会议纪要整理成需求'、'聊天记录整理成 PRD'、'把这个想法变成规格'、'帮我做需求规格化' or English equivalents. Also handles refresh mode — updating an existing PRD against a new or changed PRD version — triggered by '同步新版 PRD'、'重新 sync'、'基于新版 PRD 更新'、'PRD 改了'、'PRD 升级了'、'feature 升级'、'对齐 PRD'、'incorporate PRD changes' or equivalents. DO NOT trigger for: (a) general product strategy / OKR / roadmap discussion with no specific feature scope; (b) writing code, implementation, architecture, or technical design docs; (c) editing a single field of an already-finalized PRD; (d) high-level vision documents or pitch decks; (e) a near-total rewrite of an existing PRD (start a fresh PRD instead).
3
+ description: Use when the user wants to write, refine, or structure a PRD for a specific feature — turning vague ideas, meeting notes, chat snippets, or legacy docs into a complete, edge-case-specified requirements spec. Unlike generic PRD helpers, it drives multi-round boundary questioning (P0/P1/P2 priorities) through feature-type checklists and produces a structured YAML spec, not free-form Markdown. Triggers on phrases like '写 PRD'、'整理需求'、'规范化需求'、'把 X 整理成 PRD'、'梳理功能边界'、'会议纪要整理成需求'、'聊天记录整理成 PRD'、'把这个想法变成规格'、'帮我做需求规格化' or English equivalents. Also handles refresh mode — updating an existing PRD against a new or changed PRD version — triggered by '同步新版 PRD'、'重新 sync'、'基于新版 PRD 更新'、'PRD 改了'、'PRD 升级了'、'feature 升级'、'对齐 PRD'、'incorporate PRD changes' or equivalents. Also handles closeout mode — closing out a delivered feature's PRD (backfilling open-question resolutions, recording as-built deviations, marking it shipped) — triggered by '收尾'、'交付收口'、'closeout'、'上线了把 PRD 收口'、'把这个 feature 收口'、'标记 shipped' or English equivalents ('close out the PRD', 'mark it shipped', 'post-delivery wrap-up'). DO NOT trigger for: (a) general product strategy / OKR / roadmap discussion with no specific feature scope; (b) writing code, implementation, architecture, or technical design docs; (c) editing a single field of an already-finalized PRD; (d) high-level vision documents or pitch decks; (e) a near-total rewrite of an existing PRD (start a fresh PRD instead).
4
4
  ---
5
5
 
6
6
  # PRD Improve Forge
7
7
 
8
8
  把一个功能从**模糊想法**推进到**可开发、可测试、可追溯**的结构化 PRD。
9
- 产出文件符合 PRD Improve schema v0.2,可直接被 `prd validate` / `prd freeze` / `prd context` 等 CLI 命令消费。
9
+ 产出文件符合 PRD Improve schema v0.3,可直接被 `prd validate` / `prd freeze` / `prd context` 等 CLI 命令消费。
10
10
 
11
11
  ## 适用与不适用
12
12
 
@@ -30,6 +30,8 @@ description: Use when the user wants to write, refine, or structure a PRD for a
30
30
 
31
31
  按以下顺序判定:
32
32
 
33
+ 0. **触发词 ∈ closeout 集合 + `working/prd.yaml` 存在且 frozen/ 下 ≥1 版** → closeout 模式 → 跳第 8 步
34
+ (working 不存在或从未 frozen → 告知用户「该 feature 还没有可收口的 PRD」,转白板/正常流程)
33
35
  1. **触发词 ∈ refresh 集合 + `working/prd.yaml` 存在** → refresh 模式 → 跳第 7 步
34
36
  2. **触发词 ∈ refresh 集合 + `working/prd.yaml` 不存在** →
35
37
  询问用户「未找到现有 yaml,确认要走白板模式从 0 生成吗?」
@@ -55,6 +57,8 @@ description: Use when the user wants to write, refine, or structure a PRD for a
55
57
  | 单字段修订(只改 owner / 改 AC-7) | 直接 edit yaml 或用 `prd` CLI |
56
58
  | 现有 yaml 不存在 | fallback 白板 + 明确告知 |
57
59
 
60
+ **closeout 触发词集合**:"收尾" / "交付收口" / "closeout" / "上线了把 PRD 收口" / "把 X 收口" / "标记 shipped" / "close out" / "mark shipped" / "post-delivery wrap-up"
61
+
58
62
  #### 1.2 (白板模式)识别功能主类型
59
63
 
60
64
  从用户输入中提取特征,判定功能类型并决定加载哪份 checklist:
@@ -256,6 +260,53 @@ AI 在 7.4 完成后,**必须输出**:
256
260
 
257
261
  ---
258
262
 
263
+ ### 第 8 步:closeout 工作流(交付收尾)
264
+
265
+ #### 8.0 前置检查
266
+ - `.prd/features/<slug>/working/prd.yaml` 存在且 frozen/ 下 ≥1 版,否则转出
267
+ - schema_version 是 v0.3?不是 → 先引导 `prd migrate-yaml <slug>`(v0.2→v0.3 是离线纯版本号变更)
268
+ - 定位落地 merge commit:问用户;用户不确定时从 `git log --oneline --merges -10` 提候选给用户挑
269
+
270
+ #### 8.1 决议提取(证据源分级降级,不依赖特定工作流习惯)
271
+ 为每条 open_question 起草 resolution 草稿,注明来源指针。证据源按优先级:
272
+ 1. dev-log(若用户有该习惯)— 最优,含决策叙事
273
+ 2. git 考古 — commit message + frozen 版至落地 commit 的代码 diff
274
+ 3. 当前会话上下文 — closeout 紧跟实施时
275
+ 4. 全部缺位 → 退化为纯逐条问询:AI 只当记录员,逐条念 Q 问用户
276
+ 起草不出的标"未找到决议"。as-built 核对(8.3)同此分级。
277
+
278
+ #### 8.2 PM 逐条拍板(复用 7.5 范式)
279
+ 每条 Q:**采纳草稿 / 改写 / 显式 carry-over(填 deferred_to)**。
280
+ - 无论哪种,拍板即写 `resolved_at: "<今天 YYYY-MM-DD>"`(CLI 门禁的收口痕迹要求)
281
+ - 判定口径:resolution 非空 ⇒ 已决(起草期残留的 deferred_to 占位可保留,CLI 按此口径忽略);resolution 空 + deferred_to 非空 ⇒ carry-over
282
+ - carry-over 必须是 PM 显式决定,不可拿起草期 deferred_to 占位充数
283
+
284
+ #### 8.3 as-built 偏差核对
285
+ AI 先按 8.1 证据源自查偏差候选(实施与 AC/R 条款不一致处),逐条过用户,确认后写顶层 `as_built` 区:
286
+
287
+ as_built:
288
+ - id: "AB-1"
289
+ deviates_from: "AC-3" # 被偏离的条款 ID(引用校验会查存在性)
290
+ actual: "一句话竣工实况"
291
+ evidence: "dev-log/2026-06-09-xxx.md" # 建议仓库相对路径(可移植)
292
+
293
+ PRD 正文条款**不改**(设计决策史保留)——as_built 是竣工误差表,不是校对版。
294
+
295
+ #### 8.4 CHANGELOG
296
+ working/CHANGELOG.md 不存在 → 先创建(`# Changelog` + `## [Unreleased]` 骨架)。
297
+ 往 [Unreleased] 写 closeout 条目:决议数 / carry-over 数 / 偏差数 / landed commit。
298
+
299
+ #### 8.5 执行 + 收尾
300
+ 1. 写盘 working/prd.yaml(8.2/8.3 的全部改动)
301
+ 2. 跑 `prd closeout <slug> --commit <hash> --auto`
302
+ 3. 转告收口报告:竣工版号 / N 决议 / M carry-over / K 偏差 / CHANGELOG 状态
303
+ 失败时转告 stderr(CLI 已含回滚与恢复提示),不要自行重试改盘。
304
+
305
+ #### 8.6 refresh 联动(shipped 之后再迭代)
306
+ refresh 一个已 shipped 的 feature 时:working 的 `lifecycle.status` 回 `"draft"`、删除 `shipped_at` / `landed_commit` 两行(上一轮交付事实由 frozen 链 + manifest 承载,不丢)。这是 `prd freeze` shipped 守卫指引的路;CLI 的 `prd refresh` 命令是索引报告,不修改 yaml。
307
+
308
+ ---
309
+
259
310
  ## 硬规则(8 条,违反即为 Skill 执行错误)
260
311
 
261
312
  ### 规则 1:不照抄范例的具体占位值
@@ -278,11 +329,13 @@ template 标 `[CLI 管]` 的字段由 CLI 维护,AI 不得手填具体运行值
278
329
 
279
330
  | 字段 | 生成时填什么 |
280
331
  |---|---|
281
- | `schema_version` | `"v0.2"` |
332
+ | `schema_version` | `"v0.3"` |
282
333
  | `meta.team` | (PM 提供的 team slug,kebab-case,如 `prd-improve`) |
283
334
  | `meta.lifecycle.version` | `"working"` |
284
335
  | `meta.lifecycle.status` | `"draft"` |
285
336
  | `meta.lifecycle.updated_at` | `""` (留空,CLI 首次写入时填充) |
337
+ | `meta.lifecycle.shipped_at` / `landed_commit` | **不填**(closeout 收口时由 CLI 写入) |
338
+ | `open_questions[].resolution` / `resolved_at` | 白板期**不填**(closeout 模式 8.2 拍板时写) |
286
339
 
287
340
  其他 `[CLI 管]` 字段一律 `""` 或 `[]`。
288
341
 
@@ -588,13 +641,13 @@ refresh 模式下,**因 PRD 删除 / 修改 + refers_to 引用关系**而产生
588
641
  | **ChatGPT / Custom GPT** | SKILL.md 作为 system prompt;三个子目录上传为 knowledge |
589
642
  | **Codex / Antigravity** | SKILL.md 内容放 system prompt / rules;子目录放项目根 |
590
643
 
591
- **核心工作流不变**:识别模式 + 类型 → 加载资源 → (长材料先摘要) → 分轮追问 / refresh diff → 严格遵守 8 条硬规则 → 输出到 `.prd/features/<slug>/working/prd.yaml`(白板)或就地更新 + CHANGELOG append(refresh)。
644
+ **核心工作流不变**:识别模式 + 类型 → 加载资源 → (长材料先摘要) → 分轮追问 / refresh diff → 严格遵守 8 条硬规则 → 输出到 `.prd/features/<slug>/working/prd.yaml`(白板)或就地更新 + CHANGELOG append(refresh),或决议回填 + `prd closeout`(closeout)
592
645
 
593
646
  ---
594
647
 
595
648
  ## 版本与维护
596
649
 
597
- **当前版本:** SKILL.md v0.2 · 对应 schema_version v0.2(refresh mode added 2026-05-12)
650
+ **当前版本:** SKILL.md v0.3 · 对应 schema_version v0.3(closeout mode added 2026-06-12)
598
651
 
599
652
  **支持的 checklist 类型:**
600
653
  - [x] `batch-import` (批量导入)
@@ -192,4 +192,4 @@
192
192
  3. 如果某 P1 问题频繁被用户答不上来,升级为 P0
193
193
  4. 如果某类功能(如"跨系统同步")与批量导入差异过大,拆出独立 checklist(如 `checklists/cross-system-sync.md`)
194
194
 
195
- 当前版本:v0.1 · 本清单与 `templates/prd.yaml` (schema_version v0.2) 对齐
195
+ 当前版本:v0.1 · 本清单与 `templates/prd.yaml` (schema_version v0.3) 对齐
@@ -1,7 +1,7 @@
1
1
  # =============================================================================
2
2
  # 范例 PRD:批量导入历史 PRD 文件
3
3
  # -----------------------------------------------------------------------------
4
- # 这是一份完整填写的 PRD 样例,对应 templates/prd.yaml (schema_version v0.2)。
4
+ # 这是一份完整填写的 PRD 样例,对应 templates/prd.yaml (schema_version v0.3)。
5
5
  #
6
6
  # 场景:PRD Improve 团队自身的 dogfood —— PM 把散落在 Notion / 飞书 / Wiki
7
7
  # 的旧 PRD 一次性迁入 .prd/features/<slug>/ 目录,不必逐个手工重写。
@@ -26,7 +26,7 @@
26
26
  # =============================================================================
27
27
 
28
28
 
29
- schema_version: "v0.2"
29
+ schema_version: "v0.3" # closeout 后该文件还会多 lifecycle.shipped_at/landed_commit 与可选 as_built 区,见模板
30
30
 
31
31
 
32
32
  meta:
@@ -89,7 +89,7 @@ in_scope:
89
89
  summary: "PM 可通过 workspace 首页的'导入历史 PRD'按钮,打开上传面板,支持拖拽 / 多选 ≤ 50 份文件"
90
90
  - id: "S-2"
91
91
  name: "MD / TXT 格式解析"
92
- summary: "系统能识别 .md / .markdown / .txt 三种扩展名,读取文件前 N 行作为 title / summary,生成符合 schema v0.2 的 prd.yaml 骨架"
92
+ summary: "系统能识别 .md / .markdown / .txt 三种扩展名,读取文件前 N 行作为 title / summary,生成符合 schema v0.3 的 prd.yaml 骨架"
93
93
  - id: "S-3"
94
94
  name: "slug 自动生成"
95
95
  summary: "从文件名或内容首个标题生成 lowercase-hyphen 格式的 feature slug,确保符合路径规范与正则要求"
@@ -200,7 +200,7 @@ main_flow:
200
200
  - step: 4
201
201
  actor: "系统"
202
202
  trigger: "单个文件处理完成"
203
- action: "若成功,按 schema v0.2 生成 .prd/features/<slug>/working/prd.yaml 骨架(填 meta + background);若失败,记录错误码和消息"
203
+ action: "若成功,按 schema v0.3 生成 .prd/features/<slug>/working/prd.yaml 骨架(填 meta + background);若失败,记录错误码和消息"
204
204
  outcome: "ImportFileRecord 状态终结,任务详情页实时刷新进度"
205
205
  - step: 5
206
206
  actor: "系统"
@@ -35,6 +35,7 @@
35
35
  # API-* (接口约束)
36
36
  # PC-* (性能约束)
37
37
  # SEC-* (安全约束)
38
+ # AB-* (竣工偏差)
38
39
  #
39
40
  # 路径约定:
40
41
  # .prd/features/<feature-slug>/working/prd.yaml <- 工作稿(本文件)
@@ -43,7 +44,7 @@
43
44
 
44
45
 
45
46
  # 本模板自身的 schema 版本号(不是 PRD 内容版本)
46
- schema_version: "v0.2" # [必填][CLI 管][机器读] 骨架升级时 CLI 据此决定迁移策略;PM 不要手改
47
+ schema_version: "v0.3" # [必填][CLI 管][机器读] 骨架升级时 CLI 据此决定迁移策略;PM 不要手改
47
48
 
48
49
 
49
50
  # =============================================================================
@@ -72,8 +73,9 @@ meta:
72
73
  # --- 生命周期(由 CLI 管理,PM 不要手改)---
73
74
  lifecycle:
74
75
  version: "working" # [必填][CLI 管][机器读] working 代表工作稿;冻结后由 `prd freeze` 写入 v1.0 / v1.1 等
75
- status: "draft" # [必填][CLI 管][机器读] draft(起草)/ in_review(评审中)/ frozen(已冻结),由 CLI 和 Web 工作台流转
76
+ status: "draft" # [必填][CLI 管][机器读] draft(起草)/ in_review(评审中)/ frozen(已冻结)/ shipped(已交付,closeout 写入),由 CLI 和 Web 工作台流转
76
77
  updated_at: "" # [必填][CLI 管][机器读] 最后修改日期 YYYY-MM-DD,CLI 每次写操作自动刷新
78
+ # shipped_at / landed_commit 由 prd closeout 收口时写入([CLI 管]),模板不预置
77
79
 
78
80
 
79
81
  # =============================================================================
@@ -285,3 +287,16 @@ open_questions:
285
287
  deferred_to: "" # [选填][PM 填] 问题延后到哪里解决:留空 / "v1.1" / "CR-XXX" / "business-review"
286
288
  owner: "" # [必填][PM 填] 谁负责回答(PM 姓名 / 业务方 / 技术负责人)
287
289
  due_date: "" # [选填][PM 填] 期望回答日期,格式 YYYY-MM-DD
290
+ # resolution / resolved_at 由 closeout 模式拍板时写入([CLI 管]语义,白板期不填)
291
+
292
+ # =============================================================================
293
+ # as_built | 竣工偏差记录(可选模块,closeout 模式写入)
294
+ # -----------------------------------------------------------------------------
295
+ # 用途:交付后实施与 PRD 条款的偏差表。正文条款不改(设计决策史保留)。
296
+ # 白板期不填;由 closeout 模式(SKILL.md 第 8 步)核对后写入。
297
+ # =============================================================================
298
+ # as_built:
299
+ # - id: "AB-1" # -- 偏差。编号 AB-1 / AB-2 / ... 递增
300
+ # deviates_from: "AC-1" # -- 被偏离条款。引用 AC-* / R-* 等既有 ID
301
+ # actual: "" # 一句话竣工实况
302
+ # evidence: "" # dev-log / docs 指针(建议仓库相对路径)
@@ -7,18 +7,21 @@ export function validateBlocking(obj, feature) {
7
7
  return [];
8
8
  const issues = [];
9
9
  arr.forEach((q, i) => {
10
- if (q?.severity === "blocking") {
11
- issues.push({
12
- severity: "error",
13
- code: "blocking_question",
14
- feature,
15
- path: `open_questions[${i}]`,
16
- details: {
17
- id: typeof q.id === "string" ? q.id : "",
18
- question: typeof q.question === "string" ? q.question : "",
19
- },
20
- });
21
- }
10
+ if (q?.severity !== "blocking")
11
+ return;
12
+ // v0.3 已决语义:resolution 非空 = blocking 解除(v1.21 N1;v0.1/v0.2 无此字段,行为不变)
13
+ if (typeof q.resolution === "string" && q.resolution.trim() !== "")
14
+ return;
15
+ issues.push({
16
+ severity: "error",
17
+ code: "blocking_question",
18
+ feature,
19
+ path: `open_questions[${i}]`,
20
+ details: {
21
+ id: typeof q.id === "string" ? q.id : "",
22
+ question: typeof q.question === "string" ? q.question : "",
23
+ },
24
+ });
22
25
  });
23
26
  return issues;
24
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blocking.js","sourceRoot":"","sources":["../../src/validators/blocking.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,GAAY,EACZ,OAAe;IAEf,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,GAA8B,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,CAAS,EAAE,EAAE;QAChC,IAAI,CAAC,EAAE,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,mBAAmB;gBACzB,OAAO;gBACP,IAAI,EAAE,kBAAkB,CAAC,GAAG;gBAC5B,OAAO,EAAE;oBACP,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oBACxC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;iBAC3D;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"blocking.js","sourceRoot":"","sources":["../../src/validators/blocking.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,GAAY,EACZ,OAAe;IAEf,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,GAA8B,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAM,EAAE,CAAS,EAAE,EAAE;QAChC,IAAI,CAAC,EAAE,QAAQ,KAAK,UAAU;YAAE,OAAO;QACvC,sEAAsE;QACtE,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO;QAC3E,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,mBAAmB;YACzB,OAAO;YACP,IAAI,EAAE,kBAAkB,CAAC,GAAG;YAC5B,OAAO,EAAE;gBACP,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;gBACxC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;aAC3D;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -122,6 +122,15 @@ function collectRefs(data) {
122
122
  });
123
123
  });
124
124
  }
125
+ // v0.3 as_built.deviates_from(scalar,非 weakSources 数组形态 — v1.21 M5 扩展)
126
+ const ab = data.as_built;
127
+ if (Array.isArray(ab)) {
128
+ ab.forEach((item, i) => {
129
+ if (typeof item?.deviates_from === "string" && item.deviates_from !== "") {
130
+ refs.push({ path: `as_built[${i}].deviates_from`, value: item.deviates_from });
131
+ }
132
+ });
133
+ }
125
134
  return refs;
126
135
  }
127
136
  export function validateReferences(obj, feature) {
@@ -1 +1 @@
1
- {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/validators/references.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/validators/references.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { PrdSchema } from "../schema/index.js";
1
+ import { PrdSchema, SCHEMA_VERSIONS_ACCEPTED } from "../schema/prd.js";
2
2
  import { BUSINESS_MODULES } from "../types.js";
3
3
  import { validateRequiredModules } from "./required-modules.js";
4
4
  import { validateReferences } from "./references.js";
@@ -22,7 +22,7 @@ export function runValidators(obj, ctx) {
22
22
  details: { module: "schema_version" },
23
23
  });
24
24
  }
25
- else if (schemaVersion !== "v0.1" && schemaVersion !== "v0.2") {
25
+ else if (!SCHEMA_VERSIONS_ACCEPTED.includes(schemaVersion)) {
26
26
  issues.push({
27
27
  severity: "error",
28
28
  code: "unsupported_schema_version",
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/validators/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/validators/runner.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,10 @@ export interface ManifestFeatureEntry {
3
3
  slug: string;
4
4
  latest_frozen_version: string;
5
5
  frozen_at: string;
6
+ /** v1.21 closeout 交付字段(optional,upsert merge 语义保留) */
7
+ shipped_version?: string;
8
+ shipped_at?: string;
9
+ landed_commit?: string;
6
10
  }
7
11
  export interface Manifest {
8
12
  schema_version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAwBnD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAgB,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AA4BnD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QACzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAgB,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,OAAO,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface YamlEdit {
2
+ path: (string | number)[];
3
+ value: string;
4
+ }
5
+ export declare function patchYamlText(text: string, edits: YamlEdit[]): {
6
+ ok: true;
7
+ text: string;
8
+ } | {
9
+ ok: false;
10
+ error: string;
11
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 结构化 yaml 文本改写(v1.21 D3)。
3
+ * 复用 eemeli/yaml parseDocument + setIn:保留头注释 / 行内注释 / key 顺序
4
+ * (与 migrate-yaml.ts 同机制;server 端 cstPatch.ts 是更强先例)。
5
+ * 不存在的叶子路径由 setIn 创建(用于追加 shipped_at 等 optional 字段);
6
+ * 解析失败返回 ok:false,调用方决定降级或阻断。
7
+ * 值一律写成双引号 scalar:裸 `2026-06-12` 会被下游 yaml 解析成 Date
8
+ * 导致 zod "Expected string, received date";引号化与 fixture/模板风格一致。
9
+ */
10
+ import { parseDocument, Scalar, isScalar } from "yaml";
11
+ export function patchYamlText(text, edits) {
12
+ let doc;
13
+ try {
14
+ doc = parseDocument(text);
15
+ }
16
+ catch (e) {
17
+ return { ok: false, error: e.message };
18
+ }
19
+ if (doc.errors.length > 0) {
20
+ return { ok: false, error: doc.errors.map((e) => e.message).join("; ") };
21
+ }
22
+ for (const e of edits) {
23
+ const existing = doc.getIn(e.path, true);
24
+ if (isScalar(existing)) {
25
+ // 既有 scalar 就地改值(保行内注释),并强制双引号样式
26
+ existing.value = e.value;
27
+ existing.type = Scalar.QUOTE_DOUBLE;
28
+ }
29
+ else {
30
+ // 新叶子:预建双引号 scalar 再 setIn(setIn 裸值会存原始 JS 值,绕过样式控制)
31
+ const node = doc.createNode(e.value);
32
+ node.type = Scalar.QUOTE_DOUBLE;
33
+ doc.setIn(e.path, node);
34
+ }
35
+ }
36
+ return { ok: true, text: String(doc) };
37
+ }
38
+ //# sourceMappingURL=yamlPatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yamlPatch.js","sourceRoot":"","sources":["../src/yamlPatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAOvD,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,KAAiB;IAEjB,IAAI,GAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3E,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,iCAAiC;YACjC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACzB,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAW,CAAC;YAC/C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;YAChC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prd-improve/cli",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "PRD Improve CLI - validate / freeze / context for .prd/features/*.yaml",
5
5
  "license": "MIT",
6
6
  "type": "module",