@prd-improve/cli 1.0.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 (209) hide show
  1. package/README.md +38 -0
  2. package/dist/anchor-slicer.d.ts +18 -0
  3. package/dist/anchor-slicer.js +114 -0
  4. package/dist/anchor-slicer.js.map +1 -0
  5. package/dist/api/client.d.ts +68 -0
  6. package/dist/api/client.js +175 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/changelog.d.ts +9 -0
  9. package/dist/changelog.js +34 -0
  10. package/dist/changelog.js.map +1 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +258 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/admin/_adminJson.d.ts +18 -0
  15. package/dist/commands/admin/_adminJson.js +27 -0
  16. package/dist/commands/admin/_adminJson.js.map +1 -0
  17. package/dist/commands/admin/_authResolve.d.ts +8 -0
  18. package/dist/commands/admin/_authResolve.js +56 -0
  19. package/dist/commands/admin/_authResolve.js.map +1 -0
  20. package/dist/commands/admin/index.d.ts +22 -0
  21. package/dist/commands/admin/index.js +100 -0
  22. package/dist/commands/admin/index.js.map +1 -0
  23. package/dist/commands/admin/io.d.ts +15 -0
  24. package/dist/commands/admin/io.js +30 -0
  25. package/dist/commands/admin/io.js.map +1 -0
  26. package/dist/commands/admin/member.d.ts +43 -0
  27. package/dist/commands/admin/member.js +362 -0
  28. package/dist/commands/admin/member.js.map +1 -0
  29. package/dist/commands/admin/project.d.ts +40 -0
  30. package/dist/commands/admin/project.js +182 -0
  31. package/dist/commands/admin/project.js.map +1 -0
  32. package/dist/commands/admin/team.d.ts +31 -0
  33. package/dist/commands/admin/team.js +157 -0
  34. package/dist/commands/admin/team.js.map +1 -0
  35. package/dist/commands/admin/teamMember.d.ts +33 -0
  36. package/dist/commands/admin/teamMember.js +262 -0
  37. package/dist/commands/admin/teamMember.js.map +1 -0
  38. package/dist/commands/admin/token.d.ts +29 -0
  39. package/dist/commands/admin/token.js +125 -0
  40. package/dist/commands/admin/token.js.map +1 -0
  41. package/dist/commands/admin/user.d.ts +2 -0
  42. package/dist/commands/admin/user.js +85 -0
  43. package/dist/commands/admin/user.js.map +1 -0
  44. package/dist/commands/config.d.ts +9 -0
  45. package/dist/commands/config.js +178 -0
  46. package/dist/commands/config.js.map +1 -0
  47. package/dist/commands/context.d.ts +11 -0
  48. package/dist/commands/context.js +235 -0
  49. package/dist/commands/context.js.map +1 -0
  50. package/dist/commands/diff.d.ts +6 -0
  51. package/dist/commands/diff.js +208 -0
  52. package/dist/commands/diff.js.map +1 -0
  53. package/dist/commands/freeze.d.ts +10 -0
  54. package/dist/commands/freeze.js +269 -0
  55. package/dist/commands/freeze.js.map +1 -0
  56. package/dist/commands/init.d.ts +24 -0
  57. package/dist/commands/init.js +229 -0
  58. package/dist/commands/init.js.map +1 -0
  59. package/dist/commands/login.d.ts +26 -0
  60. package/dist/commands/login.js +241 -0
  61. package/dist/commands/login.js.map +1 -0
  62. package/dist/commands/logout.d.ts +6 -0
  63. package/dist/commands/logout.js +75 -0
  64. package/dist/commands/logout.js.map +1 -0
  65. package/dist/commands/migrate-yaml.d.ts +17 -0
  66. package/dist/commands/migrate-yaml.js +288 -0
  67. package/dist/commands/migrate-yaml.js.map +1 -0
  68. package/dist/commands/project.d.ts +7 -0
  69. package/dist/commands/project.js +87 -0
  70. package/dist/commands/project.js.map +1 -0
  71. package/dist/commands/pull.d.ts +16 -0
  72. package/dist/commands/pull.js +197 -0
  73. package/dist/commands/pull.js.map +1 -0
  74. package/dist/commands/push.d.ts +9 -0
  75. package/dist/commands/push.js +392 -0
  76. package/dist/commands/push.js.map +1 -0
  77. package/dist/commands/refresh.d.ts +9 -0
  78. package/dist/commands/refresh.js +123 -0
  79. package/dist/commands/refresh.js.map +1 -0
  80. package/dist/commands/status.d.ts +7 -0
  81. package/dist/commands/status.js +190 -0
  82. package/dist/commands/status.js.map +1 -0
  83. package/dist/commands/team.d.ts +6 -0
  84. package/dist/commands/team.js +84 -0
  85. package/dist/commands/team.js.map +1 -0
  86. package/dist/commands/validate.d.ts +5 -0
  87. package/dist/commands/validate.js +129 -0
  88. package/dist/commands/validate.js.map +1 -0
  89. package/dist/commands/whoami.d.ts +6 -0
  90. package/dist/commands/whoami.js +81 -0
  91. package/dist/commands/whoami.js.map +1 -0
  92. package/dist/config/adminBackend.d.ts +43 -0
  93. package/dist/config/adminBackend.js +33 -0
  94. package/dist/config/adminBackend.js.map +1 -0
  95. package/dist/config/rc.d.ts +70 -0
  96. package/dist/config/rc.js +148 -0
  97. package/dist/config/rc.js.map +1 -0
  98. package/dist/config/schema.d.ts +132 -0
  99. package/dist/config/schema.js +36 -0
  100. package/dist/config/schema.js.map +1 -0
  101. package/dist/diff/engine.d.ts +35 -0
  102. package/dist/diff/engine.js +305 -0
  103. package/dist/diff/engine.js.map +1 -0
  104. package/dist/diff/render.d.ts +18 -0
  105. package/dist/diff/render.js +129 -0
  106. package/dist/diff/render.js.map +1 -0
  107. package/dist/formatter/colors.d.ts +17 -0
  108. package/dist/formatter/colors.js +35 -0
  109. package/dist/formatter/colors.js.map +1 -0
  110. package/dist/formatter/human.d.ts +7 -0
  111. package/dist/formatter/human.js +70 -0
  112. package/dist/formatter/human.js.map +1 -0
  113. package/dist/fs/atomicWrite.d.ts +7 -0
  114. package/dist/fs/atomicWrite.js +37 -0
  115. package/dist/fs/atomicWrite.js.map +1 -0
  116. package/dist/i18n/dispatch.d.ts +19 -0
  117. package/dist/i18n/dispatch.js +27 -0
  118. package/dist/i18n/dispatch.js.map +1 -0
  119. package/dist/i18n/en.d.ts +3 -0
  120. package/dist/i18n/en.js +275 -0
  121. package/dist/i18n/en.js.map +1 -0
  122. package/dist/i18n/help.d.ts +3 -0
  123. package/dist/i18n/help.en.d.ts +149 -0
  124. package/dist/i18n/help.en.js +150 -0
  125. package/dist/i18n/help.en.js.map +1 -0
  126. package/dist/i18n/help.js +7 -0
  127. package/dist/i18n/help.js.map +1 -0
  128. package/dist/i18n/help.zh.d.ts +149 -0
  129. package/dist/i18n/help.zh.js +150 -0
  130. package/dist/i18n/help.zh.js.map +1 -0
  131. package/dist/i18n/helpFormat.d.ts +7 -0
  132. package/dist/i18n/helpFormat.js +51 -0
  133. package/dist/i18n/helpFormat.js.map +1 -0
  134. package/dist/i18n/helpGroups.d.ts +3 -0
  135. package/dist/i18n/helpGroups.js +11 -0
  136. package/dist/i18n/helpGroups.js.map +1 -0
  137. package/dist/i18n/index.d.ts +16 -0
  138. package/dist/i18n/index.js +46 -0
  139. package/dist/i18n/index.js.map +1 -0
  140. package/dist/i18n/peekLang.d.ts +1 -0
  141. package/dist/i18n/peekLang.js +16 -0
  142. package/dist/i18n/peekLang.js.map +1 -0
  143. package/dist/i18n/zh.d.ts +680 -0
  144. package/dist/i18n/zh.js +288 -0
  145. package/dist/i18n/zh.js.map +1 -0
  146. package/dist/parser/discover.d.ts +2 -0
  147. package/dist/parser/discover.js +69 -0
  148. package/dist/parser/discover.js.map +1 -0
  149. package/dist/parser/load-yaml.d.ts +11 -0
  150. package/dist/parser/load-yaml.js +25 -0
  151. package/dist/parser/load-yaml.js.map +1 -0
  152. package/dist/pkgVersion.d.ts +9 -0
  153. package/dist/pkgVersion.js +22 -0
  154. package/dist/pkgVersion.js.map +1 -0
  155. package/dist/renderer/context-md.d.ts +27 -0
  156. package/dist/renderer/context-md.js +444 -0
  157. package/dist/renderer/context-md.js.map +1 -0
  158. package/dist/renderer/refresh-md.d.ts +18 -0
  159. package/dist/renderer/refresh-md.js +93 -0
  160. package/dist/renderer/refresh-md.js.map +1 -0
  161. package/dist/schema/index.d.ts +2 -0
  162. package/dist/schema/index.js +3 -0
  163. package/dist/schema/index.js.map +1 -0
  164. package/dist/schema/modules.d.ts +461 -0
  165. package/dist/schema/modules.js +184 -0
  166. package/dist/schema/modules.js.map +1 -0
  167. package/dist/schema/prd.d.ts +1018 -0
  168. package/dist/schema/prd.js +65 -0
  169. package/dist/schema/prd.js.map +1 -0
  170. package/dist/sync/cliRcHelpers.d.ts +25 -0
  171. package/dist/sync/cliRcHelpers.js +62 -0
  172. package/dist/sync/cliRcHelpers.js.map +1 -0
  173. package/dist/sync/conflicts.d.ts +7 -0
  174. package/dist/sync/conflicts.js +72 -0
  175. package/dist/sync/conflicts.js.map +1 -0
  176. package/dist/sync/headProbe.d.ts +1 -0
  177. package/dist/sync/headProbe.js +95 -0
  178. package/dist/sync/headProbe.js.map +1 -0
  179. package/dist/sync/normalize.d.ts +10 -0
  180. package/dist/sync/normalize.js +13 -0
  181. package/dist/sync/normalize.js.map +1 -0
  182. package/dist/sync/syncJson.d.ts +18 -0
  183. package/dist/sync/syncJson.js +42 -0
  184. package/dist/sync/syncJson.js.map +1 -0
  185. package/dist/types.d.ts +70 -0
  186. package/dist/types.js +21 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/validators/blocking.d.ts +2 -0
  189. package/dist/validators/blocking.js +25 -0
  190. package/dist/validators/blocking.js.map +1 -0
  191. package/dist/validators/duplicate-ids.d.ts +2 -0
  192. package/dist/validators/duplicate-ids.js +58 -0
  193. package/dist/validators/duplicate-ids.js.map +1 -0
  194. package/dist/validators/references.d.ts +5 -0
  195. package/dist/validators/references.js +165 -0
  196. package/dist/validators/references.js.map +1 -0
  197. package/dist/validators/required-modules.d.ts +8 -0
  198. package/dist/validators/required-modules.js +59 -0
  199. package/dist/validators/required-modules.js.map +1 -0
  200. package/dist/validators/runner.d.ts +11 -0
  201. package/dist/validators/runner.js +73 -0
  202. package/dist/validators/runner.js.map +1 -0
  203. package/dist/workspace.d.ts +32 -0
  204. package/dist/workspace.js +37 -0
  205. package/dist/workspace.js.map +1 -0
  206. package/dist/yaml-indexer.d.ts +15 -0
  207. package/dist/yaml-indexer.js +112 -0
  208. package/dist/yaml-indexer.js.map +1 -0
  209. package/package.json +50 -0
@@ -0,0 +1,288 @@
1
+ export default {
2
+ // === status labels (双语保持一致,标签不翻译) ===
3
+ status_pass: "[PASS]",
4
+ status_fail: "[FAIL]",
5
+ status_skip: "[SKIP]",
6
+ // === validator codes (key === ValidationIssue.code) ===
7
+ missing_required_module: (d) => `缺少必填模块:${d.module}`,
8
+ module_must_be_non_empty: (d) => `必填模块为空:${d.module}`,
9
+ reference_not_found: (d) => `引用错误:${d.path} 引用了不存在的 ID "${d.reference}"`,
10
+ reference_wrong_type: (d) => `引用类型错误:${d.path} = "${d.value}",应为 ${d.expected_prefix}- 前缀`,
11
+ duplicate_id: (d) => `重复 ID:${d.id}(首次出现于 ${d.first_seen_path})`,
12
+ blocking_question: (d) => `阻塞问题:${d.id}(${d.question})`,
13
+ unsupported_schema_version: (d) => `不支持的 schema 版本:${d.got}(支持 v0.1 / v0.2)`,
14
+ schema_violation: (d) => `模式校验失败:${d.path} - ${d.message}`,
15
+ yaml_parse_error: (d) => `YAML 解析失败:${d.message}`,
16
+ out_of_scope_empty_warning: "out_of_scope 为空数组,强烈建议显式列出本期不做的事项",
17
+ // === report ===
18
+ validating: (d) => `正在校验 ${d.pattern} ...`,
19
+ feature_pass_summary: (d) => `${d.complete} / ${d.total} 个必填业务模块完成,schema_version=${d.schema_version},无引用错误,无阻塞问题。`,
20
+ feature_fail_summary: (d) => `${d.complete} / ${d.total} 个必填业务模块完成,发现 ${d.refs} 处引用错误,有 ${d.blocks} 个阻塞问题。`,
21
+ feature_skip_reason_no_yaml: "未找到 working/prd.yaml,已跳过。",
22
+ summary_line: (d) => `汇总:${d.passed} 通过,${d.failed} 失败,${d.skipped} 跳过。`,
23
+ exit_code_line: (d) => `退出码:${d.code}`,
24
+ // === fatal errors ===
25
+ prd_dir_not_found: '未找到 .prd 目录。请先在项目根运行 "prd init" 创建目录(init 命令二期提供)。',
26
+ feature_not_found: (d) => `未找到 feature:${d.slug}。请检查 .prd/features/${d.slug}/ 是否存在。`,
27
+ path_not_found: (d) => `路径不存在:${d.path}`,
28
+ // === init command ===
29
+ init_success_manifest: (d) => `已创建 .prd/manifest.json (workspace=${d.workspace})`,
30
+ init_success_features: "已创建 .prd/features/",
31
+ init_next_step: "下一步:在 .prd/features/<slug>/working/ 下创建 prd.yaml,然后 prd validate",
32
+ init_already_exists: (d) => `.prd/ 已存在(workspace=${d.workspace},created_at=${d.created_at})。如需重新初始化,请先 rm -rf .prd/`,
33
+ init_already_exists_corrupt: `.prd/ 已存在但 manifest.json 缺失或损坏,无法识别。如要重新初始化,请先 rm -rf .prd/`,
34
+ init_invalid_workspace_empty: (d) => `workspace 名称无效:"${d.value}"。不能为空`,
35
+ init_invalid_workspace_too_long: (d) => `workspace 名称无效:"${d.value}"。超过 64 字符`,
36
+ init_invalid_workspace_invalid_char: (d) => `workspace 名称无效:"${d.value}"。不能含控制字符或 / \\ : * ? " < > |`,
37
+ init_fs_error: (d) => `创建 .prd 失败(${d.operation}):${d.message}`,
38
+ // === freeze command ===
39
+ freeze_prevalidating: (d) => `正在校验 ${d.slug}...`,
40
+ freeze_prevalidate_pass: "[PASS] 全部通过,准备冻结。",
41
+ freeze_prevalidate_fail: "校验未通过,无法冻结。请先解决上述问题,再运行 prd freeze。",
42
+ freeze_success_yaml: (d) => `已创建 .prd/features/${d.slug}/frozen/${d.version}/prd.yaml`,
43
+ freeze_success_snapshot: (d) => `已创建 .prd/features/${d.slug}/frozen/${d.version}/snapshot.json`,
44
+ freeze_success_manifest: (d) => `已更新 .prd/manifest.json (features[${d.slug}].latest_frozen_version=${d.version})`,
45
+ freeze_success_summary: (d) => `${d.slug} ${d.version} 已冻结。`,
46
+ freeze_version_exists: (d) => `frozen/${d.version}/ 已存在(frozen_at=${d.frozen_at})。冻结版不可被覆盖。如需新版本,请用 --version <new> 或 --auto`,
47
+ freeze_feature_required: "请指定 feature slug:prd freeze <slug>",
48
+ freeze_version_or_auto_required: "请指定 --version <vX.Y[.Z]> 或 --auto",
49
+ freeze_version_auto_conflict: "--version 与 --auto 互斥,只能用一个",
50
+ freeze_invalid_version: (d) => `版本号格式无效:"${d.value}"。正则:^v\\d+\\.\\d+(\\.\\d+)?$,如 v1.0 / v1.0.1`,
51
+ freeze_working_not_found: (d) => `feature ${d.slug} 的 working/prd.yaml 不存在,无可冻结内容`,
52
+ freeze_workspace_not_init: "workspace 未初始化,请先运行 prd init",
53
+ freeze_fs_error: (d) => `freeze 失败(${d.operation}):${d.message}`,
54
+ freeze_partial_recovery_hint: (d) => `已写入部分文件,该 frozen 版本不完整。请运行: rm -rf ${d.dir} 后重试`,
55
+ // === context command ===
56
+ context_feature_required: "请指定 --feature <slug>",
57
+ context_workspace_not_init: "workspace 未初始化,请先运行 prd init",
58
+ context_feature_not_frozen: (d) => `feature ${d.slug} 未冻结过。请先运行 prd freeze ${d.slug} --version <v>`,
59
+ context_version_not_found: (d) => `frozen/${d.version}/ 不存在。已存在的版本:${d.existing}`,
60
+ context_working_not_found: (d) => `feature ${d.slug} 的 working/prd.yaml 不存在`,
61
+ context_working_version_conflict: "--working 与 --version 互斥,只能用一个",
62
+ context_invalid_version: (d) => `版本号格式无效:"${d.value}"。正则:^v\\d+\\.\\d+(\\.\\d+)?$,如 v1.0 / v1.0.1`,
63
+ context_manifest_disk_mismatch: (d) => `manifest 与磁盘不一致:features[${d.slug}].latest_frozen_version=${d.version},但 frozen/${d.version}/prd.yaml 不存在`,
64
+ context_out_parent_not_exists: (d) => `输出目录不存在:${d.dir}(请先创建)`,
65
+ context_out_success: (d) => `已写入 ${d.path} (${d.bytes} 字节)`,
66
+ context_yaml_parse_error: (d) => `${d.path} 解析失败:${d.message}`,
67
+ context_fs_error: (d) => `context 失败(${d.operation}):${d.message}`,
68
+ context_render_error: (d) => `渲染失败:${d.message}`,
69
+ context_out_write_failed_hint: "请检查目标路径是否可写,以及父目录是否存在",
70
+ // === validate command ===
71
+ validate_manifest_corrupt_warning: "⚠ .prd/manifest.json 损坏或不合法,虽已校验 yaml 但 workspace 可能异常",
72
+ // === diff command ===
73
+ diff_feature_required: "请指定 --feature <slug>",
74
+ diff_workspace_not_init: "workspace 未初始化,请先运行 prd init",
75
+ diff_feature_not_frozen_default: (d) => `feature ${d.slug} 未冻结过,无法默认对比 latest_frozen。请先 prd freeze 或显式 --from working`,
76
+ diff_invalid_ref: (d) => `无效 ref:"${d.value}"。需为 "working" 或 vX.Y[.Z] 格式`,
77
+ diff_version_not_found: (d) => `frozen/${d.version}/ 不存在。已存在的版本:${d.existing}`,
78
+ diff_working_not_found: (d) => `feature ${d.slug} 的 working/prd.yaml 不存在`,
79
+ diff_manifest_disk_mismatch: (d) => `manifest 与磁盘不一致:features[${d.slug}].latest_frozen_version=${d.version},但 frozen/${d.version}/prd.yaml 不存在`,
80
+ diff_yaml_parse_error: (d) => `${d.path} 解析失败:${d.message}`,
81
+ diff_fs_error: (d) => `diff 失败(${d.operation}):${d.message}`,
82
+ diff_header: (d) => `对比 ${d.from} vs ${d.to}`,
83
+ diff_summary: (d) => `变化总览:${d.added} 新增 / ${d.modified} 修改 / ${d.removed} 删除 / ${d.unchanged} 模块未变`,
84
+ diff_no_changes: "无变化。",
85
+ diff_section_added: (d) => `## 新增(${d.count})`,
86
+ diff_section_modified: (d) => `## 修改(${d.count})`,
87
+ diff_section_removed: (d) => `## 删除(${d.count})`,
88
+ diff_before_label: "之前",
89
+ diff_after_label: "现在",
90
+ // === refresh command(主流程 + 错误)===
91
+ refresh_started: (d) => `准备 refresh 上下文:${d.feature}`,
92
+ refresh_loaded_yaml: (d) => `加载 yaml(${d.lines} 行)`,
93
+ refresh_yaml_not_found: (d) => `feature 「${d.feature}」 的 working/prd.yaml 不存在(${d.path}),运行 prd init 或检查 slug`,
94
+ refresh_new_prd_not_found: (d) => `新 PRD 文件不存在:${d.path}`,
95
+ refresh_indexed_entries: (d) => `索引完成(${d.count} 条 entries + refers_to 反向图)`,
96
+ refresh_anchor_not_found: (d) => `锚点 「${d.anchor}」 在 PRD 中未找到任何 heading`,
97
+ refresh_anchor_multiple_matches: (d) => `锚点 「${d.anchor}」 命中 ${d.count} 处 heading,无法判定唯一切片`,
98
+ refresh_anchor_candidates_hint: (d) => `候选位置:\n${d.lines}`,
99
+ refresh_prd_not_markdown: (d) => `--prd-anchor 仅支持 markdown PRD(.md / .markdown),当前文件:${d.path}`,
100
+ refresh_output_written: (d) => `✓ 输出已写入 ${d.path}`,
101
+ refresh_section_reverse_graph_heading: () => "## refers_to 反向图(全表)",
102
+ refresh_section_entry_titles_heading: () => "## All entry titles(for PRD cross-check)",
103
+ refresh_section_entry_titles_usage: () => `> 用法:AI 在 7.4 步逐个标题在新 PRD 中 grep,完全没出现的 → 候选删除`,
104
+ refresh_section_prd_slice_heading: (d) => `## New PRD Section · ${d.anchor}(锚点切片)`,
105
+ // === freeze CHANGELOG.md 联动 ===
106
+ freeze_changelog_copied: (d) => `CHANGELOG.md 复制到 ${d.path}`,
107
+ freeze_changelog_unreleased_promoted: (d) => `working CHANGELOG.md 中 [Unreleased] 已 promote 为 [${d.version}]`,
108
+ freeze_changelog_new_unreleased_inserted: () => `working CHANGELOG.md 顶部新增空 [Unreleased] 段`,
109
+ freeze_changelog_copy_failed: (d) => `CHANGELOG.md 复制失败:${d.message}`,
110
+ freeze_changelog_rewrite_failed: (d) => `working CHANGELOG.md 改写失败:${d.message}`,
111
+ freeze_changelog_recovery_sed_hint: (d) => `恢复命令:sed -i '' 's/^## \\[Unreleased\\]$/## [${d.version}] - ${d.frozenAt}/' working/CHANGELOG.md 后手工补 [Unreleased] 段`,
112
+ // === sync commands (T6: push / pull / status / login / logout / whoami / config)===
113
+ // 通用 backend / rc
114
+ backend_not_configured: "未配置 backend(~/.prdrc 不存在或 default_backend 未指定)。请运行 `prd login --url <url>` 配置",
115
+ backend_unknown: (d) => `~/.prdrc 中没有名为 "${d.name}" 的 backend`,
116
+ rc_invalid: (d) => `~/.prdrc 格式无效:${d.message}`,
117
+ rc_chmod_warn: (d) => `⚠ ~/.prdrc 权限过宽(${d.mode}),已忽略。请运行 chmod 600 ~/.prdrc 后重试`,
118
+ rc_env_url_without_token: "PRDSERVER_URL 已设但 PRDSERVER_TOKEN 未设。请同时设置或都不设",
119
+ rc_token_masked: "****",
120
+ rc_saved: (d) => `已写入 ${d.path}`,
121
+ // push
122
+ push_working_not_found: (d) => `feature ${d.slug} 的 working/prd.yaml 不存在(${d.path})`,
123
+ // v1.1 Q1 boundary — `prd push --allow-create` 不会自动建 yaml(yaml 是
124
+ // single source of truth)。yaml 缺失时给到具体可执行的 `prd init` 提示。
125
+ push_allow_create_needs_yaml: (d) => `yaml 不存在(${d.path});--allow-create 不会自动建 yaml。请先跑:\n prd init ${d.slug} --team <team> --project <project>`,
126
+ push_no_sync_needs_allow_create: "本地无 sync.json,backend 也无此 feature。如需创建,请加 --allow-create",
127
+ push_remote_exists_needs_pull: (d) => `backend 已有更新版本(remote=${d.remote},本地 base=${d.base})。请先 prd pull 后再 push`,
128
+ push_remote_not_found_no_create: (d) => `backend 没有 ${d.slug}。如需创建,请加 --allow-create`,
129
+ push_local_validate_failed: "本地 working/prd.yaml 校验未通过,无法 push。请先解决 validate 报错",
130
+ push_success: (d) => `已 push ${d.slug} → backend(version=${d.version})`,
131
+ push_409_conflict: (d) => `推送失败:backend 已被他人更新。冲突快照已存至 ${d.dir}`,
132
+ push_409_conflict_hint: (d) => `查看 ${d.dir}/README.md 了解后续合并步骤`,
133
+ push_frozen_sync_start: "同步本地 frozen 版本到 backend ...",
134
+ push_frozen_sync_skipped: (d) => `已跳过 frozen 同步(--skip-frozen),本地共 ${d.count} 个 frozen 版本`,
135
+ push_frozen_sync_uploaded: (d) => ` ✓ 上传 frozen ${d.version}`,
136
+ push_frozen_sync_already: (d) => ` · ${d.version} 已存在(hash 一致)`,
137
+ push_frozen_sync_warn: (d) => ` ⚠ frozen ${d.version} 同步失败(已忽略):${d.message}`,
138
+ push_frozen_sync_hash_conflict: (d) => `frozen ${d.version} 与 backend 同名版本 hash 不一致,违反"frozen 不可改写"红线。请人工核对 frozen/${d.version}/prd.yaml 与 backend 版本`,
139
+ push_network_error: (d) => `网络错误:${d.message}`,
140
+ push_no_access: (d) => `项目 ${d.team}/${d.project} 不存在或你无权访问 — 请联系 admin 添加 membership(也可让 admin 跑 \`prd admin team-member add --team ${d.team}\` 一次 cover 全 team)`,
141
+ // pull
142
+ pull_refuse_dirty: (d) => `本地 ${d.path} 有未提交改动(相对上次 pull/push)。请先 prd push 或 prd diff 检查;加 --stash 把本地存到 .prd/.conflicts/ 再 fast-forward,或加 --force 强制覆盖丢弃`,
143
+ pull_force_overwrote: (d) => `--force:已覆盖本地 ${d.slug} working/prd.yaml`,
144
+ pull_stash_success: (d) => `--stash:本地编辑已存到 ${d.dir}(看 README.md 重 apply),working/ 已 fast-forward 到 remote`,
145
+ pull_success: (d) => `已 pull ${d.slug} ← backend(version=${d.version})`,
146
+ pull_remote_not_found: (d) => `backend 没有 feature ${d.slug}`,
147
+ pull_backend_url_changed: (d) => `sync.json 记录的 backend (${d.old}) 与当前 backend (${d.current}) 不同,请显式确认后重 pull`,
148
+ pull_already_up_to_date: (d) => `· ${d.slug} 已是最新(version=${d.version},无变更)`,
149
+ pull_scope_unresolvable: (d) => `无法解析 ${d.slug} 的 team/project:本地 working/prd.yaml 不存在,sync.json 未记录 scope。请加 --team <T> --project <P> 显式指定,或先 prd init 生成 yaml`,
150
+ api_v0_gone_hint: "API v0 已废,本地 yaml 仍是 v0.1。请运行 prd migrate-yaml 升 schema 到 v0.2 后重试",
151
+ // status
152
+ status_header_local: "本地状态",
153
+ status_header_remote: "远端状态",
154
+ status_state_synced: "synced",
155
+ status_state_ahead: "ahead",
156
+ status_state_stale: "stale",
157
+ status_state_untracked: "untracked",
158
+ status_state_unknown: "unknown",
159
+ status_state_remote_only: "remote-only",
160
+ status_no_features: "(此 workspace 暂无 features)",
161
+ status_no_backend_hint: "未配置 backend,只展示本地视角。配置 backend 请运行 prd login",
162
+ status_legend: "图例:↑ ahead(本地比远端新)/ ⊘ untracked(本地有,backend 无)/ ⚠ stale(远端比本地新)/ ? unknown(远端探测超时)",
163
+ // login
164
+ login_prompt_url: "Backend URL: ",
165
+ login_prompt_name: "Your name: ",
166
+ login_prompt_email: "Your email (optional, press Enter to skip): ",
167
+ login_prompt_credential_admin: "Admin token (from your team admin): ",
168
+ login_prompt_credential_bootstrap: "Bootstrap secret (from your team admin): ",
169
+ login_success: (d) => `已登录:${d.name} → ${d.url}`,
170
+ login_invalid_credential: "凭据无效。请向管理员核对你的 admin token / bootstrap secret",
171
+ login_bootstrap_disabled: "此 backend 未启用 bootstrap 登录,请管理员先为你创建账号",
172
+ login_user_exists_confirm: (d) => `用户 ${d.name} 已存在,重新颁发 token 会让旧 token 立即失效。继续? [y/N]: `,
173
+ login_aborted: "已取消",
174
+ // logout
175
+ logout_success: (d) => `已登出 ${d.backend}`,
176
+ logout_no_session: "未找到当前 session(可能已过期)",
177
+ logout_no_token: "当前 backend 没有 token,无需 logout",
178
+ // whoami
179
+ whoami_backend: (d) => `Backend: ${d.url} (${d.name})`,
180
+ whoami_user: (d) => `User: ${d.name} (${d.email})`,
181
+ whoami_token: (d) => `Token: ${d.masked} (label: ${d.label}, last used: ${d.last_used})`,
182
+ whoami_token_no_label: (d) => `Token: ${d.masked} (last used: ${d.last_used})`,
183
+ whoami_no_backend: "未配置 backend。运行 prd login --url <url> 后再 whoami",
184
+ whoami_unauth: "Token 已失效或被吊销。请重新 prd login",
185
+ // config
186
+ config_show_header: "~/.prdrc:",
187
+ config_no_rc: "~/.prdrc 不存在",
188
+ config_set_success: (d) => `已更新 ${d.key} = ${d.value}`,
189
+ config_use_success: (d) => `default_backend → ${d.name}`,
190
+ config_set_unknown_key: (d) => `不支持的配置项 "${d.key}"。支持:user.name / user.email / default_backend / backends.<name>.url / backends.<name>.token`,
191
+ config_use_unknown_backend: (d) => `~/.prdrc 没有 backend "${d.name}"`,
192
+ config_set_backend_token_no_url: (d) => `backend "${d.name}" 需先设 URL 才能设 token。请先执行:prd config set backends.${d.name}.url <url>`,
193
+ config_set_invalid_url: (d) => `URL "${d.value}" 不合法。必须以 http:// 或 https:// 开头`,
194
+ config_set_invalid_backend_name: (d) => `backend 名称 "${d.name}" 不合法。必须匹配 [a-zA-Z][a-zA-Z0-9_-]{0,31}`,
195
+ // headProbe wiring
196
+ head_probe_drift_warn: (d) => `⚠ ${d.slug}: backend 已有 ${d.remote},本地 base ${d.base}。建议 prd pull 后再继续`,
197
+ // === v1.1 / F4 / F5: login + admin user 引导 + init next-step ===
198
+ login_credential_prompt: "凭据(创建新账号用 admin_token / bootstrap_secret;若你已有 PAT 请退出此命令改用 `prd config set backends.<n>.token <pat>`): ",
199
+ admin_user_create_setup_hint: (d) => `\n运行以下命令装载此 token:\n prd config set backends.default.url ${d.url}\n prd config set backends.default.token ${d.token}\n prd config set user.name ${d.name}`,
200
+ init_next_step_complete: "\n下一步完整链:\n prd validate\n prd freeze <slug> --auto\n prd push --allow-create <slug>",
201
+ // === v1.1 §6.1: prd admin team ===
202
+ admin_auth_unconfigured: "错误: admin backend 未配置。\n\n设置环境变量(per-shell,临时):\n export PRDSERVER_URL=https://your-server.example.com\n export PRDSERVER_ADMIN_TOKEN=prd_pat_...\n\n或在 ~/.prdrc 中加入(持久化,chmod 600):\n admin_backends:\n <backend-name>:\n url: https://your-server.example.com\n token: prd_pat_elevated...\n\n然后重试命令。",
203
+ admin_auth_env_partial: (d) => `错误: admin auth 环境变量缺一个。设了 ${d.present} 但未设 ${d.missing}。要么补上 ${d.missing},要么两个都不设(转走 ~/.prdrc 的 admin_backends)。`,
204
+ admin_auth_no_token: (d) => `错误: ~/.prdrc 的 admin_backends.${d.name} 存在但 token 字段为空。补上 token,或改用 PRDSERVER_URL + PRDSERVER_ADMIN_TOKEN 环境变量。`,
205
+ rc_permissions_warning: (d) => `警告: ~/.prdrc 文件权限为 ${d.mode},预期 600。修复: chmod 600 ~/.prdrc`,
206
+ admin_network_error: (d) => `网络错误:${d.message}`,
207
+ // v1.9 §5.2 prd admin token issue
208
+ admin_token_issue_success: (d) => `✓ 已为用户 ${d.user} 签发 token: ${d.token}`,
209
+ admin_token_issue_scope: (d) => ` 权限范围:${d.scope}`,
210
+ admin_token_issue_invalid_scope: (d) => `--scope 必须为 'admin' 或 'normal'(收到 '${d.scope}')`,
211
+ admin_token_issue_user_not_found: (d) => `用户 "${d.user}" 不存在或已禁用`,
212
+ admin_token_list_empty: "(暂无 token)",
213
+ admin_token_revoke_success: (d) => `✓ 已撤销 token ${d.id}`,
214
+ admin_token_revoke_not_found: (d) => `Token ${d.id} 不存在或已撤销`,
215
+ admin_team_create_success: (d) => `✓ Team 已创建:${d.slug}`,
216
+ admin_team_already_exists: (d) => `Team "${d.slug}" 已存在`,
217
+ admin_team_list_empty: "(暂无 team)",
218
+ admin_team_rename_success: (d) => `✓ Team 已重命名:${d.slug} → ${d.new_slug}`,
219
+ admin_team_delete_success: (d) => `✓ Team 已删除:${d.slug}`,
220
+ admin_team_not_found: (d) => `Team "${d.slug}" 不存在`,
221
+ admin_team_has_projects: (d) => `Team "${d.slug}" 仍有 project,删除前请先迁移或删除子 project`,
222
+ admin_rewrite_yaml_not_impl: "⚠ --rewrite-yaml-in 暂未实现(v1.2 polish);CLI 签名已对齐 spec,本次未改 yaml",
223
+ // === v1.1 §6.1: prd admin project ===
224
+ admin_project_create_success: (d) => `✓ Project 已创建:${d.team}/${d.slug}`,
225
+ admin_project_already_exists: (d) => `Project "${d.team}/${d.slug}" 已存在`,
226
+ admin_project_list_empty: (d) => `(team ${d.team} 暂无 project)`,
227
+ admin_project_rename_success: (d) => `✓ Project 已重命名:${d.team}/${d.slug} → ${d.team}/${d.new_slug}`,
228
+ admin_project_delete_success: (d) => `✓ Project 已删除:${d.team}/${d.slug}`,
229
+ admin_project_not_found: (d) => `Project "${d.team}/${d.slug}" 不存在`,
230
+ admin_project_has_features: (d) => `Project "${d.team}/${d.slug}" 仍有 feature,删除前请先清空`,
231
+ // === v1.1 §6.1: prd admin member ===
232
+ admin_member_add_success: (d) => `✓ 已添加成员 ${d.user} → ${d.team}/${d.project} (role=${d.role})`,
233
+ admin_member_already_exists: (d) => `${d.user} 已是 ${d.team}/${d.project} 的成员`,
234
+ admin_member_user_not_found: (d) => `用户 "${d.user}" 不存在(请先 prd admin user create ${d.user})`,
235
+ admin_member_list_empty: (d) => `(${d.team}/${d.project} 暂无成员)`,
236
+ admin_member_role_success: (d) => `✓ 已更新角色 ${d.user} @ ${d.team}/${d.project} → ${d.new_role}`,
237
+ admin_member_remove_success: (d) => `✓ 已移除成员 ${d.user} from ${d.team}/${d.project}`,
238
+ admin_member_not_found: (d) => `${d.user} 不是 ${d.team}/${d.project} 的成员`,
239
+ admin_member_last_admin: (d) => `不能移除/降级 ${d.team}/${d.project} 的最后一个 admin`,
240
+ admin_member_invalid_role: (d) => `role "${d.role}" 不合法(请用 admin / editor / viewer)`,
241
+ // === v1.2 §5.2: prd admin member --all-projects ===
242
+ admin_member_all_projects_help: "对 team 下所有 project 执行此操作(与 --project 互斥)",
243
+ admin_member_all_projects_summary: (d) => d.role
244
+ ? `✓ --all-projects 完成:${d.n} 个 project 已处理(team=${d.team} user=${d.user} role=${d.role})`
245
+ : `✓ --all-projects 完成:${d.n} 个 project 已处理(team=${d.team} user=${d.user})`,
246
+ // === v1.2 §5.1: prd admin team-member ===
247
+ admin_team_member_add_success: (d) => `✓ 已添加 team-level membership ${d.user} → ${d.team} (role=${d.role})`,
248
+ admin_team_member_already_exists: (d) => `${d.user} 已是 ${d.team} 的 team-level 成员;改 role 请用 \`prd admin team-member update\``,
249
+ admin_team_member_user_not_found: (d) => `用户 "${d.user}" 不存在(请先 prd admin user create ${d.user})`,
250
+ admin_team_member_team_not_found: (d) => `Team "${d.team}" 不存在(请先 prd admin team create ${d.team})`,
251
+ admin_team_member_list_empty: "(暂无 team-level membership)",
252
+ admin_team_member_update_success: (d) => `✓ 已更新角色 ${d.user} @ ${d.team} → ${d.new_role}`,
253
+ admin_team_member_remove_success: (d) => `✓ 已移除 team-level membership ${d.user} @ ${d.team}`,
254
+ admin_team_member_not_found: (d) => `${d.user} 不是 ${d.team} 的 team-level 成员(仅 project-level?试用 \`prd admin member\`)`,
255
+ // === v1.1 §6.1: prd admin audit list ===
256
+ admin_audit_list_empty: "(未匹配到 audit row)",
257
+ // === v1.1 §5.2: prd migrate-yaml ===
258
+ migrate_yaml_workspace_not_init: "未找到 .prd 目录,请先在项目根运行 prd init",
259
+ migrate_yaml_feature_yaml_missing: (d) => `未找到 ${d.slug} 的 working/prd.yaml(${d.path})`,
260
+ migrate_yaml_already_v02: (d) => `· ${d.slug}: 已是 v0.2,无需升级`,
261
+ migrate_yaml_unknown_schema: (d) => `${d.slug}: 不支持的 schema 版本 "${d.got}"(只支持 v0.1 升级)`,
262
+ migrate_yaml_parse_error: (d) => `${d.slug}: YAML 解析失败 — ${d.message}`,
263
+ migrate_yaml_prompt_confirm: (d) => `v1.1 要求 yaml 加 meta.team + meta.project 字段。当前 backend 配置:default_team=${d.team} / default_project=${d.project}。是否使用? [Y/n]: `,
264
+ migrate_yaml_prompt_team: "请输入 team slug(可用 `prd admin team list` 列出): ",
265
+ migrate_yaml_prompt_project: "请输入 project slug(可用 `prd admin project list --team <T>` 列出): ",
266
+ migrate_yaml_server_miss: (d) => `server 无此 team/project(${d.team}/${d.project}),请联系 admin 创建或换名称。yaml 未修改`,
267
+ migrate_yaml_server_network_error: (d) => `校验 server 端 team/project 失败(网络错误):${d.message}。yaml 未修改`,
268
+ migrate_yaml_written: (d) => `✓ ${d.slug} 已升级 v0.1 → v0.2(team=${d.team}, project=${d.project})`,
269
+ migrate_yaml_batch_summary: (d) => `批量升级完成:${d.upgraded} 成功 / ${d.skipped} 跳过(已是 v0.2)/ ${d.failed} 失败`,
270
+ migrate_yaml_batch_no_features: "(此 workspace 暂无 feature yaml,无需升级)",
271
+ migrate_yaml_skipped_user_no: "已取消(请用 --team / --project 显式指定或确认 .prdrc 默认值后重试)",
272
+ migrate_yaml_non_interactive_missing_flags: "--non-interactive 模式要求显式 --team <slug> --project <slug>(.prdrc 默认值仅在交互模式生效)",
273
+ // === v1.1 §6.3: init --team / --project ===
274
+ init_team_project_required: "必须指定 --team <slug> 和 --project <slug>,或在 .prdrc backends.<n> 下设 default_team / default_project",
275
+ init_success_yaml: (d) => `已创建 ${d.path}(meta.team / meta.project 已填入)`,
276
+ // === UAT2-G1: prd team list / prd project list (user 视角,走 ~/.prdrc PAT)===
277
+ team_list_header_slug: "SLUG",
278
+ team_list_header_name: "NAME",
279
+ team_list_header_memberships: "MEMBERSHIPS",
280
+ team_list_empty: "无 team(你不属于任何 project)",
281
+ project_list_header_slug: "SLUG",
282
+ project_list_header_name: "NAME",
283
+ project_list_header_role: "ROLE",
284
+ project_list_header_features: "FEATURES",
285
+ project_list_empty: (d) => `team ${d.team} 下无 project(你在此 team 没有 project membership)`,
286
+ project_list_team_required: "请指定 --team <slug>(可先运行 prd team list 查可见 team)",
287
+ };
288
+ //# sourceMappingURL=zh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh.js","sourceRoot":"","sources":["../../src/i18n/zh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { DiscoverInput, DiscoverOutput } from "../types.js";
2
+ export declare function discover(input: DiscoverInput, cwd: string): DiscoverOutput;
@@ -0,0 +1,69 @@
1
+ import { existsSync, readdirSync, statSync } from "node:fs";
2
+ import { join, isAbsolute, basename, dirname } from "node:path";
3
+ export function discover(input, cwd) {
4
+ const prdDir = join(cwd, ".prd");
5
+ const featuresDir = join(prdDir, "features");
6
+ if (input.kind === "single_path") {
7
+ const abs = isAbsolute(input.path) ? input.path : join(cwd, input.path);
8
+ if (!existsSync(abs)) {
9
+ return {
10
+ targets: [],
11
+ fatal: { code: "path_not_found", details: { path: input.path } },
12
+ };
13
+ }
14
+ // Infer feature slug from path: .prd/features/<slug>/working/prd.yaml
15
+ // Fall back to grandparent directory name if not in standard layout.
16
+ const feature = inferSlugFromPath(abs);
17
+ return { targets: [{ feature, filePath: abs, exists: true }] };
18
+ }
19
+ if (!existsSync(featuresDir)) {
20
+ return {
21
+ targets: [],
22
+ fatal: { code: "prd_dir_not_found", details: {} },
23
+ };
24
+ }
25
+ if (input.kind === "single_feature") {
26
+ const dir = join(featuresDir, input.slug);
27
+ if (!existsSync(dir)) {
28
+ return {
29
+ targets: [],
30
+ fatal: {
31
+ code: "feature_not_found",
32
+ details: { slug: input.slug },
33
+ },
34
+ };
35
+ }
36
+ const filePath = join(dir, "working/prd.yaml");
37
+ return {
38
+ targets: [
39
+ { feature: input.slug, filePath, exists: existsSync(filePath) },
40
+ ],
41
+ };
42
+ }
43
+ // scan_all: enumerate all directories under features/
44
+ const slugs = readdirSync(featuresDir).filter((name) => {
45
+ const stat = statSync(join(featuresDir, name));
46
+ return stat.isDirectory();
47
+ });
48
+ const targets = slugs.map((slug) => {
49
+ const filePath = join(featuresDir, slug, "working/prd.yaml");
50
+ return { feature: slug, filePath, exists: existsSync(filePath) };
51
+ });
52
+ return { targets };
53
+ }
54
+ /**
55
+ * Infer the feature slug from a file path.
56
+ * Standard layout: .../features/<slug>/working/prd.yaml
57
+ * Falls back to the grandparent directory name if not in standard layout.
58
+ */
59
+ function inferSlugFromPath(absPath) {
60
+ // Split on both Unix and Windows separators
61
+ const parts = absPath.split(/[\\/]+/);
62
+ const idx = parts.lastIndexOf("features");
63
+ if (idx >= 0 && idx + 1 < parts.length) {
64
+ return parts[idx + 1];
65
+ }
66
+ // Fallback: two levels up from the file
67
+ return basename(dirname(dirname(absPath))) || "unknown";
68
+ }
69
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/parser/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type LoadResult = {
2
+ ok: true;
3
+ value: unknown;
4
+ } | {
5
+ ok: false;
6
+ error: {
7
+ kind: "io" | "parse";
8
+ message: string;
9
+ };
10
+ };
11
+ export declare function loadYaml(filePath: string): LoadResult;
@@ -0,0 +1,25 @@
1
+ import { readFileSync } from "node:fs";
2
+ import yaml from "js-yaml";
3
+ export function loadYaml(filePath) {
4
+ let text;
5
+ try {
6
+ text = readFileSync(filePath, "utf8");
7
+ }
8
+ catch (e) {
9
+ return {
10
+ ok: false,
11
+ error: { kind: "io", message: e.message },
12
+ };
13
+ }
14
+ try {
15
+ const value = yaml.load(text);
16
+ return { ok: true, value };
17
+ }
18
+ catch (e) {
19
+ return {
20
+ ok: false,
21
+ error: { kind: "parse", message: e.message },
22
+ };
23
+ }
24
+ }
25
+ //# sourceMappingURL=load-yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-yaml.js","sourceRoot":"","sources":["../../src/parser/load-yaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,SAAS,CAAC;AAM3B,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE;SACrD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE;SACxD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI 工具版本 = 自身 package.json 的 version,运行时读一次。
3
+ * 单一真相源:bump package 版本后 `prd --version` / manifest cli_version 自动跟随,
4
+ * 杜绝 v1.17 之前 cli.ts 硬编码字面与 package.json drift 的 bug。
5
+ * 路径:dist/pkgVersion.js → ../package.json = packages/cli/package.json
6
+ * (npm 隐式始终打包 package.json,不靠 files 字段;published 亦成立)。
7
+ * 写法对齐 server health.ts(commit 960ec15)既有 pattern。
8
+ */
9
+ export declare const CLI_VERSION: string;
@@ -0,0 +1,22 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ /**
5
+ * CLI 工具版本 = 自身 package.json 的 version,运行时读一次。
6
+ * 单一真相源:bump package 版本后 `prd --version` / manifest cli_version 自动跟随,
7
+ * 杜绝 v1.17 之前 cli.ts 硬编码字面与 package.json drift 的 bug。
8
+ * 路径:dist/pkgVersion.js → ../package.json = packages/cli/package.json
9
+ * (npm 隐式始终打包 package.json,不靠 files 字段;published 亦成立)。
10
+ * 写法对齐 server health.ts(commit 960ec15)既有 pattern。
11
+ */
12
+ export const CLI_VERSION = (() => {
13
+ try {
14
+ const here = dirname(fileURLToPath(import.meta.url));
15
+ const pkg = JSON.parse(readFileSync(join(here, "../package.json"), "utf8"));
16
+ return pkg.version ?? "0.0.0";
17
+ }
18
+ catch {
19
+ return "0.0.0";
20
+ }
21
+ })();
22
+ //# sourceMappingURL=pkgVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkgVersion.js","sourceRoot":"","sources":["../src/pkgVersion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAC5B,CAAC;QAC1B,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Pure function:把 PRD yaml AST 渲染成 markdown 字符串(含 frontmatter)。
3
+ * 不读文件、不写文件、不依赖环境。可独立单测。
4
+ */
5
+ import { z } from "zod";
6
+ import { PrdSchema } from "../schema/prd.js";
7
+ /**
8
+ * z.input 比 z.infer 更宽松 —— 允许字段 optional / missing,
9
+ * 与 renderer "宽容渲染 partial yaml" 的契约对齐。
10
+ * renderer 内部仍用 isNonEmptyString / isNonEmptyArray 守卫处理运行时 type 异常。
11
+ *
12
+ * Partial<> wraps the top-level keys so callers can pass incomplete yaml objects;
13
+ * each module renderer's runtime guards handle the actual field-level leniency.
14
+ */
15
+ type PrdInput = Partial<z.input<typeof PrdSchema>>;
16
+ export interface ContextMeta {
17
+ feature: string;
18
+ version: string;
19
+ frozen_at?: string;
20
+ source_hash?: string;
21
+ schema_version: string;
22
+ }
23
+ export interface RenderOptions {
24
+ includeQuestions: boolean;
25
+ }
26
+ export declare function renderContext(yaml: PrdInput, meta: ContextMeta, opts: RenderOptions): string;
27
+ export {};