@prd-improve/cli 1.2.0 → 2.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 (131) hide show
  1. package/dist/api/client.js +13 -2
  2. package/dist/api/client.js.map +1 -1
  3. package/dist/changelog.d.ts +13 -7
  4. package/dist/changelog.js +12 -15
  5. package/dist/changelog.js.map +1 -1
  6. package/dist/cli.js +46 -7
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/_prdSource.d.ts +35 -0
  9. package/dist/commands/_prdSource.js +110 -0
  10. package/dist/commands/_prdSource.js.map +1 -0
  11. package/dist/commands/admin/_authResolve.js +8 -24
  12. package/dist/commands/admin/_authResolve.js.map +1 -1
  13. package/dist/commands/admin/_backendOption.d.ts +5 -0
  14. package/dist/commands/admin/_backendOption.js +6 -0
  15. package/dist/commands/admin/_backendOption.js.map +1 -0
  16. package/dist/commands/admin/index.js +3 -2
  17. package/dist/commands/admin/index.js.map +1 -1
  18. package/dist/commands/admin/member.js +5 -4
  19. package/dist/commands/admin/member.js.map +1 -1
  20. package/dist/commands/admin/project.d.ts +1 -1
  21. package/dist/commands/admin/project.js +23 -10
  22. package/dist/commands/admin/project.js.map +1 -1
  23. package/dist/commands/admin/renameOpts.d.ts +22 -0
  24. package/dist/commands/admin/renameOpts.js +6 -0
  25. package/dist/commands/admin/renameOpts.js.map +1 -0
  26. package/dist/commands/admin/team.d.ts +2 -2
  27. package/dist/commands/admin/team.js +27 -15
  28. package/dist/commands/admin/team.js.map +1 -1
  29. package/dist/commands/admin/teamMember.js +5 -4
  30. package/dist/commands/admin/teamMember.js.map +1 -1
  31. package/dist/commands/admin/token.js +4 -3
  32. package/dist/commands/admin/token.js.map +1 -1
  33. package/dist/commands/admin/user.js +32 -3
  34. package/dist/commands/admin/user.js.map +1 -1
  35. package/dist/commands/closeout.d.ts +2 -0
  36. package/dist/commands/closeout.js +60 -12
  37. package/dist/commands/closeout.js.map +1 -1
  38. package/dist/commands/completion.d.ts +7 -0
  39. package/dist/commands/completion.js +25 -0
  40. package/dist/commands/completion.js.map +1 -0
  41. package/dist/commands/config.js +42 -11
  42. package/dist/commands/config.js.map +1 -1
  43. package/dist/commands/context.js +11 -117
  44. package/dist/commands/context.js.map +1 -1
  45. package/dist/commands/export.d.ts +8 -0
  46. package/dist/commands/export.js +179 -0
  47. package/dist/commands/export.js.map +1 -0
  48. package/dist/commands/freeze.d.ts +2 -0
  49. package/dist/commands/freeze.js +63 -13
  50. package/dist/commands/freeze.js.map +1 -1
  51. package/dist/commands/init.js +3 -2
  52. package/dist/commands/init.js.map +1 -1
  53. package/dist/commands/login.d.ts +5 -0
  54. package/dist/commands/login.js +17 -4
  55. package/dist/commands/login.js.map +1 -1
  56. package/dist/commands/logout.js +4 -6
  57. package/dist/commands/logout.js.map +1 -1
  58. package/dist/commands/migrate-yaml.js +6 -0
  59. package/dist/commands/migrate-yaml.js.map +1 -1
  60. package/dist/commands/project.js +1 -1
  61. package/dist/commands/project.js.map +1 -1
  62. package/dist/commands/pull.js +1 -1
  63. package/dist/commands/pull.js.map +1 -1
  64. package/dist/commands/push.js +2 -2
  65. package/dist/commands/push.js.map +1 -1
  66. package/dist/commands/reopen.d.ts +4 -0
  67. package/dist/commands/reopen.js +76 -0
  68. package/dist/commands/reopen.js.map +1 -0
  69. package/dist/commands/resolve.d.ts +8 -0
  70. package/dist/commands/resolve.js +127 -0
  71. package/dist/commands/resolve.js.map +1 -0
  72. package/dist/commands/skill.d.ts +4 -0
  73. package/dist/commands/skill.js +16 -1
  74. package/dist/commands/skill.js.map +1 -1
  75. package/dist/commands/team.js +1 -1
  76. package/dist/commands/team.js.map +1 -1
  77. package/dist/commands/validate.d.ts +2 -0
  78. package/dist/commands/validate.js +4 -2
  79. package/dist/commands/validate.js.map +1 -1
  80. package/dist/completion/generate.d.ts +37 -0
  81. package/dist/completion/generate.js +175 -0
  82. package/dist/completion/generate.js.map +1 -0
  83. package/dist/config/rc.d.ts +31 -9
  84. package/dist/config/rc.js +85 -32
  85. package/dist/config/rc.js.map +1 -1
  86. package/dist/config/schema.d.ts +21 -8
  87. package/dist/config/schema.js +8 -5
  88. package/dist/config/schema.js.map +1 -1
  89. package/dist/diff/engine.js +2 -1
  90. package/dist/diff/engine.js.map +1 -1
  91. package/dist/i18n/en.js +61 -9
  92. package/dist/i18n/en.js.map +1 -1
  93. package/dist/i18n/help.en.d.ts +25 -0
  94. package/dist/i18n/help.en.js +25 -0
  95. package/dist/i18n/help.en.js.map +1 -1
  96. package/dist/i18n/help.zh.d.ts +25 -0
  97. package/dist/i18n/help.zh.js +25 -0
  98. package/dist/i18n/help.zh.js.map +1 -1
  99. package/dist/i18n/helpGroups.js +2 -2
  100. package/dist/i18n/helpGroups.js.map +1 -1
  101. package/dist/i18n/index.js +2 -1
  102. package/dist/i18n/index.js.map +1 -1
  103. package/dist/i18n/peekLang.d.ts +1 -0
  104. package/dist/i18n/peekLang.js +19 -0
  105. package/dist/i18n/peekLang.js.map +1 -1
  106. package/dist/i18n/zh.d.ts +138 -10
  107. package/dist/i18n/zh.js +61 -9
  108. package/dist/i18n/zh.js.map +1 -1
  109. package/dist/renderer/context-md.d.ts +13 -2
  110. package/dist/renderer/context-md.js +12 -12
  111. package/dist/renderer/context-md.js.map +1 -1
  112. package/dist/renderer/spec-md.d.ts +19 -0
  113. package/dist/renderer/spec-md.js +206 -0
  114. package/dist/renderer/spec-md.js.map +1 -0
  115. package/dist/schema/prd.js +15 -0
  116. package/dist/schema/prd.js.map +1 -1
  117. package/dist/skill/prd-improve-forge/SKILL.md +94 -7
  118. package/dist/skill/prd-improve-forge/checklists/batch-import.md +1 -0
  119. package/dist/skill/prd-improve-forge/checklists/dimensions/integration-seam.md +131 -0
  120. package/dist/skill/prd-improve-forge/checklists/dimensions/state-machine-counter.md +130 -0
  121. package/dist/skill/prd-improve-forge/examples/import-history-prds.prd.yaml +6 -1
  122. package/dist/skill/prd-improve-forge/templates/prd.yaml +8 -7
  123. package/dist/validators/references.js +2 -0
  124. package/dist/validators/references.js.map +1 -1
  125. package/dist/workspace.d.ts +8 -1
  126. package/dist/workspace.js +12 -1
  127. package/dist/workspace.js.map +1 -1
  128. package/dist/yamlPatch.d.ts +5 -0
  129. package/dist/yamlPatch.js +16 -4
  130. package/dist/yamlPatch.js.map +1 -1
  131. package/package.json +13 -12
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Static shell-completion generator (v1.32 #6). Introspects the live commander
3
+ * program tree and emits a zsh/bash completion script. Pure — no I/O.
4
+ */
5
+ import type { Command } from "commander";
6
+ export interface CompletionNode {
7
+ path: string;
8
+ commands: {
9
+ name: string;
10
+ desc: string;
11
+ }[];
12
+ options: {
13
+ long: string;
14
+ desc: string;
15
+ }[];
16
+ valueOptionLongs: string[];
17
+ }
18
+ /** Walk the program via commander's Help helpers (exact `--help` parity). */
19
+ export declare function collectNodes(program: Command): CompletionNode[];
20
+ /**
21
+ * Reference implementation of the path tokenizer. NOTE: this JS function is not
22
+ * called at completion time — `renderZsh`/`renderBash` hand-transliterate this
23
+ * exact algorithm into shell (the shell can't call back into Node at tab-time).
24
+ * It exists to (a) document the canonical algorithm and (b) be unit-tested in
25
+ * isolation. The shell transliterations are guarded by the `zsh -n`/`bash -n`
26
+ * syntax gates plus a behavioral bash test that drives the generated `_prd` for
27
+ * the `--lang en …` case; keep all three copies in sync when editing.
28
+ *
29
+ * Rebuild the active subcommand path from the words before the cursor:
30
+ * - skip an option flag; if it is a value-taking option, also skip its value;
31
+ * - descend on a word that completes a known command path;
32
+ * - stop at the first positional value / cursor word.
33
+ * Handles commander's global value-option (e.g. `--lang en`) before subcommands.
34
+ */
35
+ export declare function resolveCommandPath(tokens: string[], validPaths: Set<string>, valueOptionLongs: Set<string>): string;
36
+ export type Shell = "zsh" | "bash";
37
+ export declare function generateCompletion(program: Command, shell: Shell): string;
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Static shell-completion generator (v1.32 #6). Introspects the live commander
3
+ * program tree and emits a zsh/bash completion script. Pure — no I/O.
4
+ */
5
+ import { Help } from "commander";
6
+ /** Walk the program via commander's Help helpers (exact `--help` parity). */
7
+ export function collectNodes(program) {
8
+ const help = new Help();
9
+ const nodes = [];
10
+ const walk = (cmd, path) => {
11
+ const subcmds = help.visibleCommands(cmd);
12
+ const opts = help.visibleOptions(cmd).filter((o) => o.long);
13
+ nodes.push({
14
+ path,
15
+ commands: subcmds.map((c) => ({ name: c.name(), desc: c.description() })),
16
+ options: opts.map((o) => ({ long: o.long, desc: o.description })),
17
+ valueOptionLongs: opts
18
+ .filter((o) => o.required || o.optional)
19
+ .map((o) => o.long),
20
+ });
21
+ for (const c of subcmds) {
22
+ // Don't recurse into the implicit `help` command (no meaningful subtree).
23
+ if (c.name() === "help")
24
+ continue;
25
+ walk(c, path === "" ? c.name() : `${path} ${c.name()}`);
26
+ }
27
+ };
28
+ walk(program, "");
29
+ return nodes;
30
+ }
31
+ /**
32
+ * Reference implementation of the path tokenizer. NOTE: this JS function is not
33
+ * called at completion time — `renderZsh`/`renderBash` hand-transliterate this
34
+ * exact algorithm into shell (the shell can't call back into Node at tab-time).
35
+ * It exists to (a) document the canonical algorithm and (b) be unit-tested in
36
+ * isolation. The shell transliterations are guarded by the `zsh -n`/`bash -n`
37
+ * syntax gates plus a behavioral bash test that drives the generated `_prd` for
38
+ * the `--lang en …` case; keep all three copies in sync when editing.
39
+ *
40
+ * Rebuild the active subcommand path from the words before the cursor:
41
+ * - skip an option flag; if it is a value-taking option, also skip its value;
42
+ * - descend on a word that completes a known command path;
43
+ * - stop at the first positional value / cursor word.
44
+ * Handles commander's global value-option (e.g. `--lang en`) before subcommands.
45
+ */
46
+ export function resolveCommandPath(tokens, validPaths, valueOptionLongs) {
47
+ let path = "";
48
+ let skipNext = false;
49
+ for (const tok of tokens) {
50
+ if (skipNext) {
51
+ skipNext = false;
52
+ continue;
53
+ }
54
+ if (tok.startsWith("-")) {
55
+ if (valueOptionLongs.has(tok))
56
+ skipNext = true;
57
+ continue;
58
+ }
59
+ const cand = path === "" ? tok : `${path} ${tok}`;
60
+ if (validPaths.has(cand))
61
+ path = cand;
62
+ else
63
+ break;
64
+ }
65
+ return path;
66
+ }
67
+ export function generateCompletion(program, shell) {
68
+ if (shell !== "zsh" && shell !== "bash") {
69
+ throw new Error(`Unsupported shell: ${shell}`);
70
+ }
71
+ const nodes = collectNodes(program);
72
+ return shell === "zsh" ? renderZsh(nodes) : renderBash(nodes);
73
+ }
74
+ // Wrap an arbitrary string as a safely single-quoted shell literal.
75
+ function sq(s) {
76
+ return "'" + s.replace(/'/g, "'\\''") + "'";
77
+ }
78
+ function oneLine(s) {
79
+ return s.replace(/\s+/g, " ").trim();
80
+ }
81
+ // Union of all value-taking option longs across the tree (used by the tokenizer).
82
+ function valueOptionUnion(nodes) {
83
+ const set = new Set();
84
+ for (const n of nodes)
85
+ for (const l of n.valueOptionLongs)
86
+ set.add(l);
87
+ return [...set];
88
+ }
89
+ function nonRootPaths(nodes) {
90
+ return nodes.map((n) => n.path).filter((p) => p !== "");
91
+ }
92
+ function renderZsh(nodes) {
93
+ const vopts = valueOptionUnion(nodes).join(" ");
94
+ const paths = nonRootPaths(nodes)
95
+ .map((p) => sq(p))
96
+ .join(" ");
97
+ const branches = nodes
98
+ .map((n) => {
99
+ const cmds = n.commands.map((c) => sq(`${c.name}:${oneLine(c.desc)}`)).join(" ");
100
+ const opts = n.options.map((o) => sq(`${o.long}:${oneLine(o.desc)}`)).join(" ");
101
+ const pat = n.path === "" ? '"")' : `${sq(n.path)})`;
102
+ return ` ${pat}
103
+ cmds=(${cmds})
104
+ opts=(${opts})
105
+ ;;`;
106
+ })
107
+ .join("\n");
108
+ return `#compdef prd
109
+ # Static completion for prd — generated by \`prd completion zsh\`.
110
+ _prd() {
111
+ local -a vopts paths cmds opts
112
+ vopts=(${vopts})
113
+ paths=(${paths})
114
+ local path="" tok cand skipnext=0
115
+ local -a toks
116
+ toks=(\${words[2,$((CURRENT-1))]})
117
+ for tok in $toks; do
118
+ if (( skipnext )); then skipnext=0; continue; fi
119
+ if [[ $tok == -* ]]; then
120
+ (( \${vopts[(I)$tok]} )) && skipnext=1
121
+ continue
122
+ fi
123
+ if [[ -z $path ]]; then cand="$tok"; else cand="$path $tok"; fi
124
+ if (( \${paths[(I)$cand]} )); then path="$cand"; else break; fi
125
+ done
126
+ case "$path" in
127
+ ${branches}
128
+ esac
129
+ (( \${#cmds} )) && _describe -t commands 'command' cmds
130
+ (( \${#opts} )) && _describe -t options 'option' opts
131
+ }
132
+ compdef _prd prd 2>/dev/null
133
+ `;
134
+ }
135
+ function renderBash(nodes) {
136
+ const vopts = valueOptionUnion(nodes).join(" ");
137
+ const paths = nonRootPaths(nodes)
138
+ .map((p) => sq(p))
139
+ .join(" ");
140
+ const branches = nodes
141
+ .map((n) => {
142
+ const words = [...n.commands.map((c) => c.name), ...n.options.map((o) => o.long)].join(" ");
143
+ const pat = n.path === "" ? '"")' : `${sq(n.path)})`;
144
+ return ` ${pat} words=${sq(words)} ;;`;
145
+ })
146
+ .join("\n");
147
+ return `# Static completion for prd — generated by \`prd completion bash\`.
148
+ _prd() {
149
+ local cur tok cand path="" skipnext=0 found v p
150
+ local -a toks vopts paths
151
+ vopts=(${vopts})
152
+ paths=(${paths})
153
+ cur="\${COMP_WORDS[COMP_CWORD]}"
154
+ toks=("\${COMP_WORDS[@]:1:COMP_CWORD-1}")
155
+ for tok in "\${toks[@]}"; do
156
+ if [[ $skipnext == 1 ]]; then skipnext=0; continue; fi
157
+ if [[ $tok == -* ]]; then
158
+ for v in "\${vopts[@]}"; do [[ $tok == "$v" ]] && skipnext=1; done
159
+ continue
160
+ fi
161
+ if [[ -z $path ]]; then cand="$tok"; else cand="$path $tok"; fi
162
+ found=0
163
+ for p in "\${paths[@]}"; do [[ "$cand" == "$p" ]] && { found=1; break; }; done
164
+ if [[ $found == 1 ]]; then path="$cand"; else break; fi
165
+ done
166
+ local words=""
167
+ case "$path" in
168
+ ${branches}
169
+ esac
170
+ COMPREPLY=( $(compgen -W "$words" -- "$cur") )
171
+ }
172
+ complete -F _prd prd
173
+ `;
174
+ }
175
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/completion/generate.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import { type PrdRc, type ResolvedBackend } from "./schema.js";
2
2
  export declare const RC_PATH: string;
3
+ /** 测试隔离用:重置一次性警告守卫。 */
4
+ export declare function __resetAdminBackendsDeprecationWarning(): void;
3
5
  export type LoadRcResult = {
4
6
  ok: true;
5
7
  rc: PrdRc;
@@ -24,7 +26,9 @@ export type LoadRcResult = {
24
26
  * Load ~/.prdrc — returns typed result rather than throwing.
25
27
  * `pathOverride` exists for tests (HOME juggling is fragile in vitest workers).
26
28
  */
27
- export declare function loadRc(pathOverride?: string): LoadRcResult;
29
+ export declare function loadRc(pathOverride?: string, opts?: {
30
+ silent?: boolean;
31
+ }): LoadRcResult;
28
32
  export declare function saveRc(rc: PrdRc, pathOverride?: string): {
29
33
  ok: true;
30
34
  path: string;
@@ -33,15 +37,20 @@ export declare function saveRc(rc: PrdRc, pathOverride?: string): {
33
37
  message: string;
34
38
  };
35
39
  /**
36
- * Override precedence (design §6.9):
37
- * 1. opts.backend (CLI --backend <name>) selects from rc
38
- * 2. PRDSERVER_URL + PRDSERVER_TOKEN env (both set) ad-hoc backend
39
- * 3. PRDSERVER_BACKEND envselects from rc
40
- * 4. rc.default_backend
41
- *
42
- * `PRDSERVER_URL` alone (no token) is an explicit error — callers must
43
- * surface "rc_env_url_without_token".
40
+ * v2.0 §C2-3 懒迁移:把 deprecated `admin_backends.<name>.token` 折进
41
+ * `backends.<name>.admin_token`。纯函数(便于单测);loadRc 调它,警告渲染交 loadRc。
42
+ * - backends[name] 不存在 新建 { url: admin.url, admin_token }。
43
+ * - 存在且 url admin_token。
44
+ * - 存在但 url 异(罕见)→ 保留用户轨 url + 补 admin_token + 记 urlConflicts。
45
+ * - admin entry 无 token → 跳过。
46
+ * 折叠后 delete rc.admin_backends saveRc 不回写。
44
47
  */
48
+ export declare function foldAdminBackends(rc: PrdRc): {
49
+ rc: PrdRc;
50
+ folded: string[];
51
+ urlConflicts: string[];
52
+ };
53
+ export type BackendRole = "user" | "admin";
45
54
  export type ResolveBackendResult = {
46
55
  ok: true;
47
56
  backend: ResolvedBackend;
@@ -60,8 +69,21 @@ export type ResolveBackendResult = {
60
69
  ok: false;
61
70
  reason: "env_url_without_token";
62
71
  };
72
+ /**
73
+ * 统一 backend 解析(v2.0 §C2-2)。`role` 选 token 字段 + token env:
74
+ * user → entry.token / PRDSERVER_TOKEN
75
+ * admin → entry.admin_token / PRDSERVER_ADMIN_TOKEN
76
+ * 优先级(两轨统一,flag-first):
77
+ * 1. opts.backend → backends[name]
78
+ * 2. PRDSERVER_URL + (role token env) 都设 → ad-hoc (env)
79
+ * 3. PRDSERVER_BACKEND → backends[name]
80
+ * 4. rc.default_backend → backends[name]
81
+ * env 规则「URL 触发」:URL 设但 role-token 缺 → env_url_without_token;
82
+ * URL 没设 → 忽略 env(含游离 token)走 rc。
83
+ */
63
84
  export declare function resolveBackend(rc: PrdRc | null, opts?: {
64
85
  backend?: string;
86
+ role?: BackendRole;
65
87
  }, env?: NodeJS.ProcessEnv): ResolveBackendResult;
66
88
  /**
67
89
  * Token masking for `prd config show` / `prd whoami` output.
package/dist/config/rc.js CHANGED
@@ -14,12 +14,20 @@ import { join } from "node:path";
14
14
  import { load as yamlLoad, dump as yamlDump } from "js-yaml";
15
15
  import { PrdRcSchema, } from "./schema.js";
16
16
  import { writeFileAtomic } from "../fs/atomicWrite.js";
17
+ import { getMessages, readLocale } from "../i18n/index.js";
18
+ import * as c from "../formatter/colors.js";
17
19
  export const RC_PATH = join(homedir(), ".prdrc");
20
+ // 进程内一次性 deprecation 警告守卫(loadRc 可能被多命令多次调用)。
21
+ let adminBackendsDeprecationWarned = false;
22
+ /** 测试隔离用:重置一次性警告守卫。 */
23
+ export function __resetAdminBackendsDeprecationWarning() {
24
+ adminBackendsDeprecationWarned = false;
25
+ }
18
26
  /**
19
27
  * Load ~/.prdrc — returns typed result rather than throwing.
20
28
  * `pathOverride` exists for tests (HOME juggling is fragile in vitest workers).
21
29
  */
22
- export function loadRc(pathOverride) {
30
+ export function loadRc(pathOverride, opts) {
23
31
  const path = pathOverride ?? RC_PATH;
24
32
  if (!existsSync(path))
25
33
  return { ok: false, reason: "missing" };
@@ -67,7 +75,18 @@ export function loadRc(pathOverride) {
67
75
  .join("; "),
68
76
  };
69
77
  }
70
- return { ok: true, rc: parsed.data, path };
78
+ const { rc: folded, folded: foldedNames, urlConflicts } = foldAdminBackends(parsed.data);
79
+ if (foldedNames.length > 0 && !opts?.silent && !adminBackendsDeprecationWarned) {
80
+ // 必须在 readLocale() 之前置 true:readLocale→readRcLang→loadRc 会重入,
81
+ // 不先置位则无界递归。
82
+ adminBackendsDeprecationWarned = true;
83
+ const m = getMessages(readLocale());
84
+ process.stderr.write(c.warn(m.rc_admin_backends_deprecated) + "\n");
85
+ if (urlConflicts.length > 0) {
86
+ process.stderr.write(c.warn(m.rc_admin_backends_url_conflict({ names: urlConflicts.join(", ") })) + "\n");
87
+ }
88
+ }
89
+ return { ok: true, rc: folded, path };
71
90
  }
72
91
  export function saveRc(rc, pathOverride) {
73
92
  const path = pathOverride ?? RC_PATH;
@@ -87,48 +106,82 @@ export function saveRc(rc, pathOverride) {
87
106
  return { ok: false, message: e.message };
88
107
  }
89
108
  }
109
+ /**
110
+ * v2.0 §C2-3 — 懒迁移:把 deprecated `admin_backends.<name>.token` 折进
111
+ * `backends.<name>.admin_token`。纯函数(便于单测);loadRc 调它,警告渲染交 loadRc。
112
+ * - backends[name] 不存在 → 新建 { url: admin.url, admin_token }。
113
+ * - 存在且 url 同 → 补 admin_token。
114
+ * - 存在但 url 异(罕见)→ 保留用户轨 url + 补 admin_token + 记 urlConflicts。
115
+ * - admin entry 无 token → 跳过。
116
+ * 折叠后 delete rc.admin_backends → saveRc 不回写。
117
+ */
118
+ export function foldAdminBackends(rc) {
119
+ const adminNs = rc.admin_backends;
120
+ if (!adminNs || Object.keys(adminNs).length === 0) {
121
+ return { rc, folded: [], urlConflicts: [] };
122
+ }
123
+ const backends = { ...rc.backends };
124
+ const folded = [];
125
+ const urlConflicts = [];
126
+ for (const [name, admin] of Object.entries(adminNs)) {
127
+ if (!admin.token)
128
+ continue;
129
+ const existing = backends[name];
130
+ if (!existing) {
131
+ backends[name] = { url: admin.url, admin_token: admin.token };
132
+ }
133
+ else {
134
+ backends[name] = { ...existing, admin_token: admin.token };
135
+ if (existing.url !== admin.url)
136
+ urlConflicts.push(name);
137
+ }
138
+ folded.push(name);
139
+ }
140
+ const next = { ...rc, backends };
141
+ delete next.admin_backends;
142
+ return { rc: next, folded, urlConflicts };
143
+ }
144
+ /**
145
+ * 统一 backend 解析(v2.0 §C2-2)。`role` 选 token 字段 + token env:
146
+ * user → entry.token / PRDSERVER_TOKEN
147
+ * admin → entry.admin_token / PRDSERVER_ADMIN_TOKEN
148
+ * 优先级(两轨统一,flag-first):
149
+ * 1. opts.backend → backends[name]
150
+ * 2. PRDSERVER_URL + (role token env) 都设 → ad-hoc (env)
151
+ * 3. PRDSERVER_BACKEND → backends[name]
152
+ * 4. rc.default_backend → backends[name]
153
+ * env 规则「URL 触发」:URL 设但 role-token 缺 → env_url_without_token;
154
+ * URL 没设 → 忽略 env(含游离 token)走 rc。
155
+ */
90
156
  export function resolveBackend(rc, opts = {}, env = process.env) {
91
- // Step 1: --backend flag → select from rc
92
- if (opts.backend) {
157
+ const role = opts.role ?? "user";
158
+ const tokenEnvVar = role === "admin" ? "PRDSERVER_ADMIN_TOKEN" : "PRDSERVER_TOKEN";
159
+ const selectFromRc = (name) => {
93
160
  if (!rc)
94
161
  return { ok: false, reason: "no_backend" };
95
- const entry = rc.backends[opts.backend];
162
+ const entry = rc.backends[name];
96
163
  if (!entry)
97
- return { ok: false, reason: "unknown_name", name: opts.backend };
98
- if (!entry.token)
99
- return { ok: false, reason: "no_token", name: opts.backend };
100
- return { ok: true, backend: { name: opts.backend, url: entry.url, token: entry.token } };
101
- }
102
- // Step 2: PRDSERVER_URL + PRDSERVER_TOKEN env (both) → ad-hoc backend
164
+ return { ok: false, reason: "unknown_name", name };
165
+ const tok = role === "admin" ? entry.admin_token : entry.token;
166
+ if (!tok)
167
+ return { ok: false, reason: "no_token", name };
168
+ return { ok: true, backend: { name, url: entry.url, token: tok } };
169
+ };
170
+ if (opts.backend)
171
+ return selectFromRc(opts.backend);
103
172
  const envUrl = env.PRDSERVER_URL;
104
- const envTok = env.PRDSERVER_TOKEN;
173
+ const envTok = env[tokenEnvVar];
105
174
  if (envUrl && envTok) {
106
175
  return { ok: true, backend: { name: "(env)", url: envUrl, token: envTok } };
107
176
  }
108
- if (envUrl && !envTok) {
177
+ if (envUrl && !envTok)
109
178
  return { ok: false, reason: "env_url_without_token" };
110
- }
111
- // Step 3: PRDSERVER_BACKEND env → select from rc
112
179
  const envName = env.PRDSERVER_BACKEND;
113
- if (envName) {
114
- if (!rc)
115
- return { ok: false, reason: "no_backend" };
116
- const entry = rc.backends[envName];
117
- if (!entry)
118
- return { ok: false, reason: "unknown_name", name: envName };
119
- if (!entry.token)
120
- return { ok: false, reason: "no_token", name: envName };
121
- return { ok: true, backend: { name: envName, url: entry.url, token: entry.token } };
122
- }
123
- // Step 4: rc.default_backend
180
+ if (envName)
181
+ return selectFromRc(envName);
124
182
  if (!rc || !rc.default_backend)
125
183
  return { ok: false, reason: "no_backend" };
126
- const entry = rc.backends[rc.default_backend];
127
- if (!entry)
128
- return { ok: false, reason: "unknown_name", name: rc.default_backend };
129
- if (!entry.token)
130
- return { ok: false, reason: "no_token", name: rc.default_backend };
131
- return { ok: true, backend: { name: rc.default_backend, url: entry.url, token: entry.token } };
184
+ return selectFromRc(rc.default_backend);
132
185
  }
133
186
  /**
134
187
  * Token masking for `prd config show` / `prd whoami` output.
@@ -1 +1 @@
1
- {"version":3,"file":"rc.js","sourceRoot":"","sources":["../../src/config/rc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EACL,WAAW,GAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AASjD;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,YAAqB;IAC1C,MAAM,IAAI,GAAG,YAAY,IAAI,OAAO,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE/D,0EAA0E;IAC1E,0EAA0E;IAC1E,qBAAqB;IACrB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC;YAC7B,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;gBACjB,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;iBACxC,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;YACzE,2DAA2D;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;iBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/C,IAAI,CAAC,IAAI,CAAC;SACd,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAS,EAAE,YAAqB;IACrD,MAAM,IAAI,GAAG,YAAY,IAAI,OAAO,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,4EAA4E;QAC5E,yEAAyE;QACzE,0EAA0E;QAC1E,iCAAiC;QACjC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAmBD,MAAM,UAAU,cAAc,CAC5B,EAAgB,EAChB,OAA6B,EAAE,EAC/B,MAAyB,OAAO,CAAC,GAAG;IAEpC,0CAA0C;IAC1C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAC3F,CAAC;IAED,sEAAsE;IACtE,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC;IACnC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACxD,CAAC;IAED,iDAAiD;IACjD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACtF,CAAC;IAED,6BAA6B;IAC7B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,eAAe;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC3E,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC;IACnF,IAAI,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,CAAC;IACrF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,4DAA4D;IAC5D,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,+CAA+C;IAC/C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"rc.js","sourceRoot":"","sources":["../../src/config/rc.ts"],"names":[],"mappings":"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"}
@@ -8,18 +8,21 @@ import { z } from "zod";
8
8
  export declare const BackendEntrySchema: z.ZodObject<{
9
9
  url: z.ZodString;
10
10
  token: z.ZodOptional<z.ZodString>;
11
+ admin_token: z.ZodOptional<z.ZodString>;
11
12
  last_login_at: z.ZodOptional<z.ZodString>;
12
13
  default_team: z.ZodOptional<z.ZodString>;
13
14
  default_project: z.ZodOptional<z.ZodString>;
14
15
  }, "strip", z.ZodTypeAny, {
15
16
  url: string;
16
17
  token?: string | undefined;
18
+ admin_token?: string | undefined;
17
19
  last_login_at?: string | undefined;
18
20
  default_team?: string | undefined;
19
21
  default_project?: string | undefined;
20
22
  }, {
21
23
  url: string;
22
24
  token?: string | undefined;
25
+ admin_token?: string | undefined;
23
26
  last_login_at?: string | undefined;
24
27
  default_team?: string | undefined;
25
28
  default_project?: string | undefined;
@@ -39,37 +42,43 @@ export declare const PrdRcSchema: z.ZodObject<{
39
42
  backends: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
40
43
  url: z.ZodString;
41
44
  token: z.ZodOptional<z.ZodString>;
45
+ admin_token: z.ZodOptional<z.ZodString>;
42
46
  last_login_at: z.ZodOptional<z.ZodString>;
43
47
  default_team: z.ZodOptional<z.ZodString>;
44
48
  default_project: z.ZodOptional<z.ZodString>;
45
49
  }, "strip", z.ZodTypeAny, {
46
50
  url: string;
47
51
  token?: string | undefined;
52
+ admin_token?: string | undefined;
48
53
  last_login_at?: string | undefined;
49
54
  default_team?: string | undefined;
50
55
  default_project?: string | undefined;
51
56
  }, {
52
57
  url: string;
53
58
  token?: string | undefined;
59
+ admin_token?: string | undefined;
54
60
  last_login_at?: string | undefined;
55
61
  default_team?: string | undefined;
56
62
  default_project?: string | undefined;
57
63
  }>>>;
58
- admin_backends: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
64
+ admin_backends: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
59
65
  url: z.ZodString;
60
66
  token: z.ZodOptional<z.ZodString>;
67
+ admin_token: z.ZodOptional<z.ZodString>;
61
68
  last_login_at: z.ZodOptional<z.ZodString>;
62
69
  default_team: z.ZodOptional<z.ZodString>;
63
70
  default_project: z.ZodOptional<z.ZodString>;
64
71
  }, "strip", z.ZodTypeAny, {
65
72
  url: string;
66
73
  token?: string | undefined;
74
+ admin_token?: string | undefined;
67
75
  last_login_at?: string | undefined;
68
76
  default_team?: string | undefined;
69
77
  default_project?: string | undefined;
70
78
  }, {
71
79
  url: string;
72
80
  token?: string | undefined;
81
+ admin_token?: string | undefined;
73
82
  last_login_at?: string | undefined;
74
83
  default_team?: string | undefined;
75
84
  default_project?: string | undefined;
@@ -79,13 +88,7 @@ export declare const PrdRcSchema: z.ZodObject<{
79
88
  backends: Record<string, {
80
89
  url: string;
81
90
  token?: string | undefined;
82
- last_login_at?: string | undefined;
83
- default_team?: string | undefined;
84
- default_project?: string | undefined;
85
- }>;
86
- admin_backends: Record<string, {
87
- url: string;
88
- token?: string | undefined;
91
+ admin_token?: string | undefined;
89
92
  last_login_at?: string | undefined;
90
93
  default_team?: string | undefined;
91
94
  default_project?: string | undefined;
@@ -95,6 +98,14 @@ export declare const PrdRcSchema: z.ZodObject<{
95
98
  email?: string | undefined;
96
99
  } | undefined;
97
100
  default_backend?: string | undefined;
101
+ admin_backends?: Record<string, {
102
+ url: string;
103
+ token?: string | undefined;
104
+ admin_token?: string | undefined;
105
+ last_login_at?: string | undefined;
106
+ default_team?: string | undefined;
107
+ default_project?: string | undefined;
108
+ }> | undefined;
98
109
  lang?: string | undefined;
99
110
  }, {
100
111
  user?: {
@@ -105,6 +116,7 @@ export declare const PrdRcSchema: z.ZodObject<{
105
116
  backends?: Record<string, {
106
117
  url: string;
107
118
  token?: string | undefined;
119
+ admin_token?: string | undefined;
108
120
  last_login_at?: string | undefined;
109
121
  default_team?: string | undefined;
110
122
  default_project?: string | undefined;
@@ -112,6 +124,7 @@ export declare const PrdRcSchema: z.ZodObject<{
112
124
  admin_backends?: Record<string, {
113
125
  url: string;
114
126
  token?: string | undefined;
127
+ admin_token?: string | undefined;
115
128
  last_login_at?: string | undefined;
116
129
  default_team?: string | undefined;
117
130
  default_project?: string | undefined;
@@ -8,6 +8,9 @@ import { z } from "zod";
8
8
  export const BackendEntrySchema = z.object({
9
9
  url: z.string().url(),
10
10
  token: z.string().optional(),
11
+ // v2.0 §C2-1 — admin 轨 token,与 `token` 共享同 entry 的 `url`。
12
+ // resolveBackend(role:'admin') 读此字段。统一前是独立的 admin_backends.<name>.token。
13
+ admin_token: z.string().optional(),
11
14
  last_login_at: z.string().optional(),
12
15
  // v1.1 §6.3 — default scope for `prd init` / `prd migrate-yaml` so users
13
16
  // don't have to retype --team / --project every command. Kept optional so
@@ -25,11 +28,11 @@ export const PrdRcSchema = z.object({
25
28
  .optional(),
26
29
  default_backend: z.string().optional(),
27
30
  backends: z.record(z.string(), BackendEntrySchema).default({}),
28
- // v1.3 §A.1separate admin namespace; admin CLI reads here, never falls
29
- // back to `backends.<name>.token`. Same BackendEntry shape (url required,
30
- // token optional, last_login_at/default_team/default_project ignored for
31
- // admin track).
32
- admin_backends: z.record(z.string(), BackendEntrySchema).default({}),
31
+ // v2.0 §C2 DEPRECATED 旧的独立 admin 命名空间。仅 loadRc 读以懒迁移
32
+ // (foldAdminBackends 折进 backends.<name>.admin_token),不再是写目标。
33
+ // optional default:用 undefined 区分「缺省」与「显式空」,使折叠后 delete
34
+ // 该属性→saveRc 不回写→文件干净迁移。
35
+ admin_backends: z.record(z.string(), BackendEntrySchema).optional(),
33
36
  // v1.16 — 全局 UX 语言偏好(顶层,非 per-backend);resolveLang 优先级 config 层
34
37
  lang: z.string().optional(),
35
38
  });
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,iEAAiE;IACjE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;KACrC,CAAC;SACD,QAAQ,EAAE;IACb,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9D,0EAA0E;IAC1E,0EAA0E;IAC1E,yEAAyE;IACzE,gBAAgB;IAChB,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACpE,gEAAgE;IAChE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,0DAA0D;IAC1D,yEAAyE;IACzE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,iEAAiE;IACjE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;KACrC,CAAC;SACD,QAAQ,EAAE;IACb,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9D,uDAAuD;IACvD,6DAA6D;IAC7D,0DAA0D;IAC1D,yBAAyB;IACzB,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE;IACnE,gEAAgE;IAChE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC"}
@@ -137,6 +137,7 @@ const META_FIELDS = [
137
137
  "created_at",
138
138
  "source_materials",
139
139
  "lifecycle",
140
+ "schema_version",
140
141
  ];
141
142
  const BG_FIELDS = ["background", "goals"];
142
143
  const ENTITY_FIELDS = ["name", "description", "fields", "relations", "lifecycle_states"];
@@ -163,7 +164,7 @@ const ROLE_FIELDS = ["description", "typical_goals"];
163
164
  // ---------- 主入口 ----------
164
165
  export function diffPRDs(left, right) {
165
166
  const perModule = {};
166
- perModule.meta = diffObjectModule(left?.meta, right?.meta, "meta", "版本信息", META_FIELDS);
167
+ perModule.meta = diffObjectModule({ ...left?.meta, schema_version: left?.schema_version }, { ...right?.meta, schema_version: right?.schema_version }, "meta", "版本信息", META_FIELDS);
167
168
  perModule.background_and_goals = diffObjectModule(left?.background_and_goals, right?.background_and_goals, "background_and_goals", "背景与目标", BG_FIELDS);
168
169
  perModule.users_and_roles = diffList(left?.users_and_roles, right?.users_and_roles, {
169
170
  module_key: "users_and_roles",