@prd-improve/cli 1.1.1 → 1.6.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/changelog.d.ts +13 -7
- package/dist/changelog.js +12 -15
- package/dist/changelog.js.map +1 -1
- package/dist/cli.js +55 -7
- package/dist/cli.js.map +1 -1
- package/dist/commands/_prdSource.d.ts +35 -0
- package/dist/commands/_prdSource.js +110 -0
- package/dist/commands/_prdSource.js.map +1 -0
- package/dist/commands/closeout.d.ts +9 -0
- package/dist/commands/closeout.js +293 -0
- package/dist/commands/closeout.js.map +1 -0
- package/dist/commands/context.js +11 -117
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/export.d.ts +8 -0
- package/dist/commands/export.js +179 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/freeze.d.ts +23 -0
- package/dist/commands/freeze.js +125 -32
- package/dist/commands/freeze.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +7 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate-yaml.js +94 -46
- package/dist/commands/migrate-yaml.js.map +1 -1
- package/dist/commands/reopen.d.ts +4 -0
- package/dist/commands/reopen.js +76 -0
- package/dist/commands/reopen.js.map +1 -0
- package/dist/commands/resolve.d.ts +8 -0
- package/dist/commands/resolve.js +127 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.js +16 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.js +4 -2
- package/dist/commands/validate.js.map +1 -1
- package/dist/i18n/en.js +71 -6
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/help.en.d.ts +30 -0
- package/dist/i18n/help.en.js +32 -2
- package/dist/i18n/help.en.js.map +1 -1
- package/dist/i18n/help.zh.d.ts +30 -0
- package/dist/i18n/help.zh.js +32 -2
- 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/peekLang.d.ts +1 -0
- package/dist/i18n/peekLang.js +19 -0
- package/dist/i18n/peekLang.js.map +1 -1
- package/dist/i18n/zh.d.ts +161 -1
- package/dist/i18n/zh.js +71 -6
- package/dist/i18n/zh.js.map +1 -1
- package/dist/renderer/context-md.d.ts +13 -2
- package/dist/renderer/context-md.js +12 -12
- package/dist/renderer/context-md.js.map +1 -1
- package/dist/renderer/spec-md.d.ts +19 -0
- package/dist/renderer/spec-md.js +206 -0
- package/dist/renderer/spec-md.js.map +1 -0
- package/dist/schema/modules.d.ts +37 -5
- package/dist/schema/modules.js +14 -1
- package/dist/schema/modules.js.map +1 -1
- package/dist/schema/prd.d.ts +93 -17
- package/dist/schema/prd.js +51 -7
- package/dist/schema/prd.js.map +1 -1
- package/dist/skill/prd-improve-forge/SKILL.md +150 -10
- package/dist/skill/prd-improve-forge/checklists/batch-import.md +2 -1
- package/dist/skill/prd-improve-forge/checklists/dimensions/integration-seam.md +131 -0
- package/dist/skill/prd-improve-forge/checklists/dimensions/state-machine-counter.md +130 -0
- package/dist/skill/prd-improve-forge/examples/import-history-prds.prd.yaml +10 -5
- package/dist/skill/prd-improve-forge/templates/prd.yaml +25 -9
- package/dist/validators/blocking.js +15 -12
- package/dist/validators/blocking.js.map +1 -1
- package/dist/validators/references.js +9 -0
- package/dist/validators/references.js.map +1 -1
- package/dist/validators/runner.js +2 -2
- package/dist/validators/runner.js.map +1 -1
- package/dist/workspace.d.ts +12 -1
- package/dist/workspace.js +12 -1
- package/dist/workspace.js.map +1 -1
- package/dist/yamlPatch.d.ts +16 -0
- package/dist/yamlPatch.js +50 -0
- package/dist/yamlPatch.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# 状态机 · 计数器 · 边界追问维度清单(正交维度)
|
|
2
|
+
|
|
3
|
+
> 本清单是「正交维度」,与功能类型清单叠加使用。
|
|
4
|
+
> 由 PRD Skill 在检测到「计数器 / 上限 / 状态机 / 生命周期」信号时自动加载。
|
|
5
|
+
> **挂载协议:只把「精选 P0(≤3 条,单条可含 2-3 个子问)」注入当轮追问;其余 P0/P1/P2 为可选补问。**
|
|
6
|
+
> 所有答案最终落到 prd.yaml 对应模块,Skill 不要凭空生成答案。
|
|
7
|
+
> **轻模式例外**:精选 P0 的硬约束落点改为 `acceptance_criteria` / `open_questions`(对应结构段在轻模式为空)。
|
|
8
|
+
> 追问执行协议(每轮 ≤3-5 题、P0 先、有选项给选项、答不上转 open_questions)沿用 batch-import.md 的「使用原则」段;本维度额外只注入精选 P0。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 触发加载条件
|
|
13
|
+
|
|
14
|
+
当功能描述中出现以下特征之一,Skill 应加载本维度清单:
|
|
15
|
+
|
|
16
|
+
- 关键词:计数器 / 次数 / 重试上限 / 配额 / 额度 / 限额 / 剩余次数 / 状态切换 / 开关 / 生命周期 / 状态机 / 流转 / 耗尽 / 达上限 / 锁定 / 冻结 / 冷却 / 倒计时。
|
|
17
|
+
- 功能里有「计数到 N 触发某行为」(N 次失败锁定、剩余 X 次、限免 3 次)。
|
|
18
|
+
- 实体有多个状态且状态间有合法 / 非法转移。
|
|
19
|
+
- 有需要 reset 的累加值。
|
|
20
|
+
- 典型功能:登录失败 N 次锁定、重试上限耗尽切降级(ai-fallback 反面教材)、限免次数、审批状态流转、订单生命周期、倒计时 / 冷却、开关 toggle。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Q 清单(按 prd.yaml 模块归类)
|
|
25
|
+
|
|
26
|
+
### 1. 计数器清单与归零
|
|
27
|
+
|
|
28
|
+
→ `entities` / `business_rules`
|
|
29
|
+
|
|
30
|
+
- **[P0]** 列出所有计数器 / 累加值:名字 / 初值 / 上限(MAX) / 单位。
|
|
31
|
+
- **[P0]** **每个计数器在每个事件上精确怎么变**——画 transition×mutation 表(事件 → +1 / -1 / reset / 不变)。别留给实现者发挥(反面教材:onRetry 该 +1、reset 还是不动,两实现者各错一种)。
|
|
32
|
+
- **[P0]** 每个计数器的 reset 触发点是什么?(成功 / 切换模式 / 跨会话 / 定时 TTL / 永不)
|
|
33
|
+
- **[P1]** 计数器在哪一层持久化?(内存 / 本地存储 / 服务端)
|
|
34
|
+
|
|
35
|
+
### 2. 上限与耗尽行为
|
|
36
|
+
|
|
37
|
+
→ `business_rules` / `scenarios` / `edge_cases`
|
|
38
|
+
|
|
39
|
+
- **[P0]** 达上限 / 耗尽时发生什么?(锁定 / 降级 / 拒绝 / 切手动 / 仅提示)
|
|
40
|
+
- **[P0]** 耗尽是「>= MAX」还是「> MAX」触发?(差一错防线)
|
|
41
|
+
- **[P1]** 耗尽后如何解除?(冷却等待 / 管理员解锁 / 自动恢复 / 永久)
|
|
42
|
+
- **[P1]** 接近上限时是否提前提示?(还剩 1 次)
|
|
43
|
+
|
|
44
|
+
### 3. 边界值
|
|
45
|
+
|
|
46
|
+
→ `edge_cases`
|
|
47
|
+
|
|
48
|
+
- **[P0]** 边界值行为:计数 = 0、= MAX-1、= MAX、= MAX+1 分别怎样?
|
|
49
|
+
- **[P1]** 计数能否为负 / 溢出?防御措施?
|
|
50
|
+
- **[P2]** 上限 N 是否可配?改 N 后存量计数怎么算?
|
|
51
|
+
|
|
52
|
+
### 4. 状态机转移
|
|
53
|
+
|
|
54
|
+
→ `entities.lifecycle_states` / `state_permissions` / `main_flow`
|
|
55
|
+
|
|
56
|
+
- **[P0]** 列出所有状态 + 合法转移表(from → to,触发事件)。
|
|
57
|
+
- **[P0]** 非法转移如何处理?(报错 / 静默忽略 / 断言不可能发生)
|
|
58
|
+
- **[P1]** 每个状态下哪些操作可用?(对齐 state_permissions)
|
|
59
|
+
- **[P1]** 是否有终态(不可再转出)?
|
|
60
|
+
|
|
61
|
+
### 5. 并发与一致性
|
|
62
|
+
|
|
63
|
+
→ `business_rules` / `edge_cases` / `data_and_api.data_constraints`
|
|
64
|
+
|
|
65
|
+
- **[P0]** 计数器 / 状态在并发下是否原子?(同时两次失败会不会丢计数)
|
|
66
|
+
- **[P1]** 多端 / 多标签页下计数与状态如何同步?
|
|
67
|
+
- **[P1]** 计数与状态是否可能不一致?(计数到 MAX 但状态没锁)如何避免?
|
|
68
|
+
|
|
69
|
+
### 6. 持久化与恢复
|
|
70
|
+
|
|
71
|
+
→ `edge_cases` / `scenarios`
|
|
72
|
+
|
|
73
|
+
- **[P0]** 刷新 / 重启 / 重新登录后,计数与状态保留还是重置?
|
|
74
|
+
- **[P1]** 跨设备是否共享?(服务端计数)
|
|
75
|
+
- **[P2]** 计数是否有过期 / TTL?(失败计数 24h 后清零)
|
|
76
|
+
|
|
77
|
+
### 7. 验收与可观测
|
|
78
|
+
|
|
79
|
+
→ `acceptance_criteria`
|
|
80
|
+
|
|
81
|
+
- **[P0]** 「连续 N 次失败触发锁定」这类规则,验收用例怎么写?(必须含恰好 N、N-1、N+1 三个点)
|
|
82
|
+
- **[P1]** 排查需要哪些日志?(每次计数变更的事件 + 前后值)
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 精选 P0(Top 3 必问)
|
|
87
|
+
|
|
88
|
+
挂载时只把这 3 条注入当轮追问;其余 P0 / P1 / P2 为可选补问。
|
|
89
|
+
|
|
90
|
+
1. **transition×mutation 表(计数器表 + 状态转移表,分开画)**:① 计数器表——每个计数器在每个事件(成功 / 失败 / 重试 / 取消 / 超时…)上 +1 / -1 / reset / 不变;② 状态转移表——每个状态 × 事件 → 目标状态(from × event → to)。两张表都写死,别留给实现者(反面教材:ai-fallback onRetry 两实现者各错一种)。
|
|
91
|
+
2. 达上限 / 耗尽 / 非法转移时的精确行为 + 触发用 `>=` 还是 `>`(差一错)。
|
|
92
|
+
3. 刷新 / 重启 / 并发下,计数与状态是否保留且一致?
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 常见答案池
|
|
97
|
+
|
|
98
|
+
| 主题 | 常见选项 |
|
|
99
|
+
|---|---|
|
|
100
|
+
| 事件对计数器 | +1 / -1 / reset 归零 / 不变 |
|
|
101
|
+
| reset 触发点 | 成功时 / 切换模式时 / 跨会话 / 定时 TTL / 永不 |
|
|
102
|
+
| 耗尽行为 | 锁定 / 降级 / 拒绝 / 切手动 / 仅提示 |
|
|
103
|
+
| 耗尽解除 | 冷却等待 / 管理员解锁 / 自动恢复 / 永久 |
|
|
104
|
+
| 计数持久化 | 仅内存 / 本地存储 / 服务端 |
|
|
105
|
+
| 非法转移 | 报错 / 静默忽略 / 断言不可能 |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Top 5 最易被漏掉的问题
|
|
110
|
+
|
|
111
|
+
本维度按挂载协议默认只注入「精选 P0(≤3)」;**一旦本维度被追问深入**(精选 P0 暴露出更多边界),这 5 个是最不该漏的补问点。届时用户答不上来转入 `open_questions`(精选 P0 相关项 `severity: blocking`,其余 `non_blocking`):
|
|
112
|
+
|
|
113
|
+
1. **重试操作该不该动计数器**——最经典(反面教材本体)。
|
|
114
|
+
2. **`>=` vs `>` 的差一错**——第 N 次还是第 N+1 次触发。
|
|
115
|
+
3. **并发下计数丢失 / 计数与状态不一致**。
|
|
116
|
+
4. **刷新 / 重启后计数是否保留**——决定持久化层。
|
|
117
|
+
5. **reset 的全部触发点**——常只想到「成功」漏了「切换 / 超时」。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 本清单的演化约定
|
|
122
|
+
|
|
123
|
+
发现新场景或遗漏时:
|
|
124
|
+
|
|
125
|
+
1. 先写入本文件对应分类,并标 P0 / P1 / P2
|
|
126
|
+
2. 若有新选项,同步更新「常见答案池」
|
|
127
|
+
3. 如果某 P1 问题频繁被用户答不上来,升级为 P0
|
|
128
|
+
4. 本清单是「正交维度」——如果发现某类状态机场景(如「审批流专项」)与通用状态机差异过大,拆出独立维度清单(如 `checklists/dimensions/approval-flow.md`)
|
|
129
|
+
|
|
130
|
+
当前版本:v0.1 · dimension(正交维度)· 与 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.
|
|
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.
|
|
29
|
+
schema_version: "v0.3" # closeout 后该文件还会多 lifecycle.shipped_at/landed_commit 与可选 as_built 区,见模板
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
meta:
|
|
@@ -49,6 +49,11 @@ meta:
|
|
|
49
49
|
url: ""
|
|
50
50
|
excerpt: "聊到了格式识别、重复 slug 冲突、失败回报等关键边界问题"
|
|
51
51
|
captured_at: "2026-04-18"
|
|
52
|
+
- type: "old_prd"
|
|
53
|
+
title: "旧版批量上传 PRD(迁移前)"
|
|
54
|
+
url: "docs/prd/legacy-import-v1.md#批量上传"
|
|
55
|
+
excerpt: "旧 PRD 已定义批量上传的基本流程,本期在其上补全失败回报与重复 slug 处理"
|
|
56
|
+
captured_at: "2026-04-10"
|
|
52
57
|
|
|
53
58
|
lifecycle:
|
|
54
59
|
version: "working"
|
|
@@ -89,7 +94,7 @@ in_scope:
|
|
|
89
94
|
summary: "PM 可通过 workspace 首页的'导入历史 PRD'按钮,打开上传面板,支持拖拽 / 多选 ≤ 50 份文件"
|
|
90
95
|
- id: "S-2"
|
|
91
96
|
name: "MD / TXT 格式解析"
|
|
92
|
-
summary: "系统能识别 .md / .markdown / .txt 三种扩展名,读取文件前 N 行作为 title / summary,生成符合 schema v0.
|
|
97
|
+
summary: "系统能识别 .md / .markdown / .txt 三种扩展名,读取文件前 N 行作为 title / summary,生成符合 schema v0.3 的 prd.yaml 骨架"
|
|
93
98
|
- id: "S-3"
|
|
94
99
|
name: "slug 自动生成"
|
|
95
100
|
summary: "从文件名或内容首个标题生成 lowercase-hyphen 格式的 feature slug,确保符合路径规范与正则要求"
|
|
@@ -200,7 +205,7 @@ main_flow:
|
|
|
200
205
|
- step: 4
|
|
201
206
|
actor: "系统"
|
|
202
207
|
trigger: "单个文件处理完成"
|
|
203
|
-
action: "若成功,按 schema v0.
|
|
208
|
+
action: "若成功,按 schema v0.3 生成 .prd/features/<slug>/working/prd.yaml 骨架(填 meta + background);若失败,记录错误码和消息"
|
|
204
209
|
outcome: "ImportFileRecord 状态终结,任务详情页实时刷新进度"
|
|
205
210
|
- step: 5
|
|
206
211
|
actor: "系统"
|
|
@@ -474,7 +479,7 @@ acceptance_criteria:
|
|
|
474
479
|
priority: "could"
|
|
475
480
|
verification_method: "手工用例"
|
|
476
481
|
|
|
477
|
-
|
|
482
|
+
# shipped 后:各题 resolution 为现状权威(正文条款保留设计时态,阅读以 resolution 优先)。
|
|
478
483
|
open_questions:
|
|
479
484
|
- id: "Q-1" # -- 待确认问题
|
|
480
485
|
question: "AI 解析用哪个模型?自托管还是调外部 API?预算限制是什么?"
|
|
@@ -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.
|
|
47
|
+
schema_version: "v0.3" # [必填][CLI 管][机器读] 骨架升级时 CLI 据此决定迁移策略;PM 不要手改
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
# =============================================================================
|
|
@@ -62,18 +63,19 @@ meta:
|
|
|
62
63
|
owner: "" # [必填][PM 填] 该功能的 PM 负责人(姓名或邮箱)
|
|
63
64
|
tags: [] # [选填][PM 填][机器读] 标签列表,用于 CLI 搜索过滤,如 ["import", "migration"]
|
|
64
65
|
created_at: "" # [必填][PM 填] PRD 首次建立日期,格式 YYYY-MM-DD
|
|
65
|
-
source_materials: # [选填][PM 填] 原始材料列表,对齐后端 source_material
|
|
66
|
+
source_materials: # [选填][PM 填] 原始材料列表,对齐后端 source_material 模型;每个条目一个对象。url 优先填 URL / 仓库相对路径 / PRD 章节锚点,避免本机绝对路径(/Users/…、C:\…)——换机 / 共享即失效
|
|
66
67
|
- type: "" # 来源类型:meeting_notes(会议纪要)/ chat(聊天摘录)/ old_prd(旧 PRD)/ ai_dialog(AI 对话)/ wiki / other
|
|
67
68
|
title: "" # 材料标题
|
|
68
|
-
url: "" # URL
|
|
69
|
+
url: "" # URL / 仓库相对路径 / PRD 章节锚点(可留空)
|
|
69
70
|
excerpt: "" # 关键摘录文本(可留空)
|
|
70
71
|
captured_at: "" # 采集日期 YYYY-MM-DD(可留空)
|
|
71
72
|
|
|
72
73
|
# --- 生命周期(由 CLI 管理,PM 不要手改)---
|
|
73
74
|
lifecycle:
|
|
74
75
|
version: "working" # [必填][CLI 管][机器读] working 代表工作稿;冻结后由 `prd freeze` 写入 v1.0 / v1.1 等
|
|
75
|
-
status: "draft" # [必填][CLI 管][机器读] draft
|
|
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
|
# =============================================================================
|
|
@@ -243,19 +245,19 @@ data_and_api:
|
|
|
243
245
|
data_constraints: # [选填][PM 填] 数据层约束列表
|
|
244
246
|
- id: "DC-1" # -- 数据约束。编号 DC-1 / DC-2 / ...
|
|
245
247
|
text: "" # 约束内容,如"单文件 ≤ 10MB"、"title 长度 1-200"
|
|
246
|
-
applies_to: [] # --
|
|
248
|
+
applies_to: [] # -- 作用对象。必须是已声明 EN-* 实体 ID;自由文本(字段名)/S-/R- 均校验失败,细节写进 text
|
|
247
249
|
api_constraints: # [选填][PM 填] 接口层约束列表
|
|
248
250
|
- id: "API-1" # -- 接口约束。编号 API-1 / API-2 / ...
|
|
249
251
|
text: "" # 约束内容:幂等性、超时时间、返回格式、错误码规约
|
|
250
|
-
applies_to: [] # --
|
|
252
|
+
applies_to: [] # -- 作用对象。必须是已声明 EN-* 实体 ID;自由文本(接口名)/S-/R- 均校验失败,细节写进 text
|
|
251
253
|
performance_constraints: # [选填][PM 填] 性能期望列表
|
|
252
254
|
- id: "PC-1" # -- 性能约束。编号 PC-1 / PC-2 / ...
|
|
253
255
|
text: "" # 约束内容,如"列表首屏 ≤ 2s"、"关键操作响应 ≤ 500ms"
|
|
254
|
-
applies_to: [] # --
|
|
256
|
+
applies_to: [] # -- 作用对象。EN-* 实体 ID 或自由说明(此项不做引用校验)
|
|
255
257
|
security_constraints: # [选填][PM 填] 权限、审计、脱敏、合规、防滥用等
|
|
256
258
|
- id: "SEC-1" # -- 安全约束。编号 SEC-1 / SEC-2 / ...
|
|
257
259
|
text: "" # 约束内容
|
|
258
|
-
applies_to: [] # --
|
|
260
|
+
applies_to: [] # -- 作用对象。必须是已声明 EN-* 实体 ID;自由文本(字段名)/S-/R- 均校验失败,细节写进 text
|
|
259
261
|
|
|
260
262
|
|
|
261
263
|
# =============================================================================
|
|
@@ -267,7 +269,7 @@ data_and_api:
|
|
|
267
269
|
acceptance_criteria:
|
|
268
270
|
- id: "AC-1" # -- 验收标准。[必填][PM 填][机器读] 编号 AC-1 / AC-2 / ... 递增
|
|
269
271
|
criterion: "" # [必填][PM 填] 验收条件,陈述性、可判断通过 / 不通过
|
|
270
|
-
priority: "must" # [必填][PM 填][机器读] must
|
|
272
|
+
priority: "must" # [必填][PM 填][机器读] launch-blocker 测试:不达标就不能发版/要回滚=must;能发版但有已知缺口=should;锦上添花可砍=could。别默认全填 must(见 SKILL.md 规则 9)。context.md 的 Must Build 清单按此过滤
|
|
271
273
|
verification_method: "" # [必填][PM 填] 如何验证:手工用例 / 演示 / 自动化测试 / 日志核查
|
|
272
274
|
refers_to: [] # -- 引用对象。[选填][PM 填][机器读] 支持 S-*(范围项)/ SC-*(场景)/ R-*(业务规则)/ E-*(异常)/ DC-*(数据约束)/ PC-*(性能约束)/ SEC-*(安全约束)的 ID 列表
|
|
273
275
|
|
|
@@ -277,6 +279,7 @@ acceptance_criteria:
|
|
|
277
279
|
# -----------------------------------------------------------------------------
|
|
278
280
|
# 用途:悬而未决的问题清单。
|
|
279
281
|
# 冻结前所有 blocking 级问题必须被回答,否则 CLI 校验会失败。
|
|
282
|
+
# shipped 后:各题 resolution 为现状权威(正文条款保留设计时态,阅读以 resolution 优先)。
|
|
280
283
|
# =============================================================================
|
|
281
284
|
open_questions:
|
|
282
285
|
- id: "Q-1" # -- 待确认问题。[必填][PM 填][机器读] 编号 Q-1 / Q-2 / ... 递增
|
|
@@ -285,3 +288,16 @@ open_questions:
|
|
|
285
288
|
deferred_to: "" # [选填][PM 填] 问题延后到哪里解决:留空 / "v1.1" / "CR-XXX" / "business-review"
|
|
286
289
|
owner: "" # [必填][PM 填] 谁负责回答(PM 姓名 / 业务方 / 技术负责人)
|
|
287
290
|
due_date: "" # [选填][PM 填] 期望回答日期,格式 YYYY-MM-DD
|
|
291
|
+
# resolution / resolved_at 由 closeout 模式拍板时写入([CLI 管]语义,白板期不填)
|
|
292
|
+
|
|
293
|
+
# =============================================================================
|
|
294
|
+
# as_built | 竣工偏差记录(可选模块,closeout 模式写入)
|
|
295
|
+
# -----------------------------------------------------------------------------
|
|
296
|
+
# 用途:交付后实施与 PRD 条款的偏差表。正文条款不改(设计决策史保留)。
|
|
297
|
+
# 白板期不填;由 closeout 模式(SKILL.md 第 8 步)核对后写入。
|
|
298
|
+
# =============================================================================
|
|
299
|
+
# as_built:
|
|
300
|
+
# - id: "AB-1" # -- 偏差。编号 AB-1 / AB-2 / ... 递增
|
|
301
|
+
# deviates_from: "AC-1" # -- 被偏离条款。引用 AC-* / R-* 等既有 ID
|
|
302
|
+
# actual: "" # 一句话竣工实况
|
|
303
|
+
# 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
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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,
|
|
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/
|
|
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 (
|
|
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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/validators/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOjD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,GAAQ;IAClD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAC;IAEpF,4BAA4B;IAC5B,MAAM,aAAa,GACjB,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,IAAI,aAAa,KAAK,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE;SACtC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAE,wBAA8C,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACpF,MAAM,CAAC,IAAI,CAAC;YACV,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACzC,4CAA4C;YAC5C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB;gBAAE,SAAS;YAC7E,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpD,iCAAiC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,MAAM;SACH,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAyB;QACnC,CAAC,CAAC,IAAI,KAAK,0BAA0B,CAAC;QACvC,gBAAsC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CACjE;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACtB,CAAC;IACF,MAAM,eAAe,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE/E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC5D,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAClC,eAAe;QACf,YAAY,EAAE,gBAAgB,CAAC,MAAM;QACrC,aAAa;QACb,MAAM;KACP,CAAC;AACJ,CAAC"}
|
package/dist/workspace.d.ts
CHANGED
|
@@ -3,14 +3,20 @@ 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
|
-
schema_version
|
|
12
|
+
/** manifest 文件自身格式轴(v1.23 起;旧文件的 schema_version 字段由 writeManifest 写回时迁移) */
|
|
13
|
+
manifest_format_version: string;
|
|
9
14
|
workspace_name: string;
|
|
10
15
|
created_at: string;
|
|
11
16
|
cli_version: string;
|
|
12
17
|
features: ManifestFeatureEntry[];
|
|
13
18
|
}
|
|
19
|
+
export declare const MANIFEST_FORMAT_VERSION = "v0.1";
|
|
14
20
|
interface ManifestRead {
|
|
15
21
|
ok: true;
|
|
16
22
|
data: Manifest;
|
|
@@ -29,4 +35,9 @@ export declare function readManifest(manifestPath: string): ManifestRead | Manif
|
|
|
29
35
|
* freeze 的 nextAutoVersion 内部仍会再过滤一次,所以收敛安全。
|
|
30
36
|
*/
|
|
31
37
|
export declare function listExistingVersions(frozenDir: string): string[];
|
|
38
|
+
/**
|
|
39
|
+
* manifest 统一写盘(v1.23 F1):确保新格式轴字段在位 + 迁移删除遗留 schema_version 键。
|
|
40
|
+
* 三写点(init/freeze/closeout)共用;throw 由调用方现有 try/catch 接住。
|
|
41
|
+
*/
|
|
42
|
+
export declare function writeManifest(manifestPath: string, data: Manifest): void;
|
|
32
43
|
export {};
|
package/dist/workspace.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* Workspace 共享 util:manifest 读取 + 版本号格式 + 已存在版本列表。
|
|
3
3
|
* 由 init / freeze / context / diff 共用,集中维护 Manifest 类型。
|
|
4
4
|
*/
|
|
5
|
-
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
5
|
+
import { existsSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
6
6
|
export const VERSION_REGEX = /^v\d+\.\d+(\.\d+)?$/;
|
|
7
|
+
export const MANIFEST_FORMAT_VERSION = "v0.1";
|
|
7
8
|
/**
|
|
8
9
|
* 读取并基本验证 .prd/manifest.json。
|
|
9
10
|
* features 必须是数组;返回的 data 类型为 Manifest,元素结构由 ManifestFeatureEntry 保证。
|
|
@@ -34,4 +35,14 @@ export function listExistingVersions(frozenDir) {
|
|
|
34
35
|
.map((d) => d.name)
|
|
35
36
|
.filter((v) => VERSION_REGEX.test(v));
|
|
36
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* manifest 统一写盘(v1.23 F1):确保新格式轴字段在位 + 迁移删除遗留 schema_version 键。
|
|
40
|
+
* 三写点(init/freeze/closeout)共用;throw 由调用方现有 try/catch 接住。
|
|
41
|
+
*/
|
|
42
|
+
export function writeManifest(manifestPath, data) {
|
|
43
|
+
const out = { ...data };
|
|
44
|
+
out.manifest_format_version = out.manifest_format_version ?? MANIFEST_FORMAT_VERSION;
|
|
45
|
+
delete out.schema_version;
|
|
46
|
+
writeFileSync(manifestPath, JSON.stringify(out, null, 2) + "\n", "utf8");
|
|
47
|
+
}
|
|
37
48
|
//# sourceMappingURL=workspace.js.map
|
package/dist/workspace.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAqBnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAU9C;;;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;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,IAAc;IAChE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAA4C,CAAC;IAClE,GAAG,CAAC,uBAAuB,GAAG,GAAG,CAAC,uBAAuB,IAAI,uBAAuB,CAAC;IACrF,OAAO,GAAG,CAAC,cAAc,CAAC;IAC1B,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface YamlEdit {
|
|
2
|
+
path: (string | number)[];
|
|
3
|
+
/** op:"delete" 时忽略(传 "" 即可) */
|
|
4
|
+
value: string;
|
|
5
|
+
/** "block" = BLOCK_LITERAL(多行决议文本);缺省 QUOTE_DOUBLE(防裸日期被解析成 Date) */
|
|
6
|
+
style?: "block";
|
|
7
|
+
/** v1.23:删除键(eemeli deleteIn);叶子不存在幂等,中间路径缺失归并 ok:false */
|
|
8
|
+
op?: "delete";
|
|
9
|
+
}
|
|
10
|
+
export declare function patchYamlText(text: string, edits: YamlEdit[]): {
|
|
11
|
+
ok: true;
|
|
12
|
+
text: string;
|
|
13
|
+
} | {
|
|
14
|
+
ok: false;
|
|
15
|
+
error: string;
|
|
16
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
* v1.22 起支持 style:'block'(resolve 决议长文本);eemeli 对不可块标量表示值(控制符等)自动降级 quoted
|
|
10
|
+
* v1.23 起支持 op:'delete'(eemeli deleteIn):叶子不存在幂等返回 ok:true,中间路径缺失归并 ok:false
|
|
11
|
+
*/
|
|
12
|
+
import { parseDocument, Scalar, isScalar } from "yaml";
|
|
13
|
+
export function patchYamlText(text, edits) {
|
|
14
|
+
let doc;
|
|
15
|
+
try {
|
|
16
|
+
doc = parseDocument(text);
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
return { ok: false, error: e.message };
|
|
20
|
+
}
|
|
21
|
+
if (doc.errors.length > 0) {
|
|
22
|
+
return { ok: false, error: doc.errors.map((e) => e.message).join("; ") };
|
|
23
|
+
}
|
|
24
|
+
for (const e of edits) {
|
|
25
|
+
if (e.op === "delete") {
|
|
26
|
+
try {
|
|
27
|
+
doc.deleteIn(e.path);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return { ok: false, error: err.message };
|
|
31
|
+
}
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const scalarType = e.style === "block" ? Scalar.BLOCK_LITERAL : Scalar.QUOTE_DOUBLE;
|
|
35
|
+
const existing = doc.getIn(e.path, true);
|
|
36
|
+
if (isScalar(existing)) {
|
|
37
|
+
// 既有 scalar 就地改值(保行内注释),按 style 选型
|
|
38
|
+
existing.value = e.value;
|
|
39
|
+
existing.type = scalarType;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// 新叶子:预建 scalar 再 setIn(setIn 裸值会存原始 JS 值,绕过样式控制)
|
|
43
|
+
const node = doc.createNode(e.value);
|
|
44
|
+
node.type = scalarType;
|
|
45
|
+
doc.setIn(e.path, node);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { ok: true, text: String(doc) };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=yamlPatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yamlPatch.js","sourceRoot":"","sources":["../src/yamlPatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAYvD,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,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;YACtD,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACpF,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvB,mCAAmC;YACnC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACzB,QAAQ,CAAC,IAAI,GAAG,UAAU,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,kDAAkD;YAClD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAW,CAAC;YAC/C,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;YACvB,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"}
|