@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.
- package/dist/api/client.js +13 -2
- package/dist/api/client.js.map +1 -1
- package/dist/changelog.d.ts +13 -7
- package/dist/changelog.js +12 -15
- package/dist/changelog.js.map +1 -1
- package/dist/cli.js +46 -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/admin/_authResolve.js +8 -24
- package/dist/commands/admin/_authResolve.js.map +1 -1
- package/dist/commands/admin/_backendOption.d.ts +5 -0
- package/dist/commands/admin/_backendOption.js +6 -0
- package/dist/commands/admin/_backendOption.js.map +1 -0
- package/dist/commands/admin/index.js +3 -2
- package/dist/commands/admin/index.js.map +1 -1
- package/dist/commands/admin/member.js +5 -4
- package/dist/commands/admin/member.js.map +1 -1
- package/dist/commands/admin/project.d.ts +1 -1
- package/dist/commands/admin/project.js +23 -10
- package/dist/commands/admin/project.js.map +1 -1
- package/dist/commands/admin/renameOpts.d.ts +22 -0
- package/dist/commands/admin/renameOpts.js +6 -0
- package/dist/commands/admin/renameOpts.js.map +1 -0
- package/dist/commands/admin/team.d.ts +2 -2
- package/dist/commands/admin/team.js +27 -15
- package/dist/commands/admin/team.js.map +1 -1
- package/dist/commands/admin/teamMember.js +5 -4
- package/dist/commands/admin/teamMember.js.map +1 -1
- package/dist/commands/admin/token.js +4 -3
- package/dist/commands/admin/token.js.map +1 -1
- package/dist/commands/admin/user.js +32 -3
- package/dist/commands/admin/user.js.map +1 -1
- package/dist/commands/closeout.d.ts +2 -0
- package/dist/commands/closeout.js +60 -12
- package/dist/commands/closeout.js.map +1 -1
- package/dist/commands/completion.d.ts +7 -0
- package/dist/commands/completion.js +25 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.js +42 -11
- package/dist/commands/config.js.map +1 -1
- 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 +2 -0
- package/dist/commands/freeze.js +63 -13
- package/dist/commands/freeze.js.map +1 -1
- package/dist/commands/init.js +3 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +5 -0
- package/dist/commands/login.js +17 -4
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +4 -6
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/migrate-yaml.js +6 -0
- package/dist/commands/migrate-yaml.js.map +1 -1
- package/dist/commands/project.js +1 -1
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/pull.js +1 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.js +2 -2
- package/dist/commands/push.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/team.js +1 -1
- package/dist/commands/team.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/completion/generate.d.ts +37 -0
- package/dist/completion/generate.js +175 -0
- package/dist/completion/generate.js.map +1 -0
- package/dist/config/rc.d.ts +31 -9
- package/dist/config/rc.js +85 -32
- package/dist/config/rc.js.map +1 -1
- package/dist/config/schema.d.ts +21 -8
- package/dist/config/schema.js +8 -5
- package/dist/config/schema.js.map +1 -1
- package/dist/diff/engine.js +2 -1
- package/dist/diff/engine.js.map +1 -1
- package/dist/i18n/en.js +61 -9
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/help.en.d.ts +25 -0
- package/dist/i18n/help.en.js +25 -0
- package/dist/i18n/help.en.js.map +1 -1
- package/dist/i18n/help.zh.d.ts +25 -0
- package/dist/i18n/help.zh.js +25 -0
- package/dist/i18n/help.zh.js.map +1 -1
- package/dist/i18n/helpGroups.js +2 -2
- package/dist/i18n/helpGroups.js.map +1 -1
- package/dist/i18n/index.js +2 -1
- package/dist/i18n/index.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 +138 -10
- package/dist/i18n/zh.js +61 -9
- 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/prd.js +15 -0
- package/dist/schema/prd.js.map +1 -1
- package/dist/skill/prd-improve-forge/SKILL.md +94 -7
- package/dist/skill/prd-improve-forge/checklists/batch-import.md +1 -0
- 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 +6 -1
- package/dist/skill/prd-improve-forge/templates/prd.yaml +8 -7
- package/dist/validators/references.js +2 -0
- package/dist/validators/references.js.map +1 -1
- package/dist/workspace.d.ts +8 -1
- package/dist/workspace.js +12 -1
- package/dist/workspace.js.map +1 -1
- package/dist/yamlPatch.d.ts +5 -0
- package/dist/yamlPatch.js +16 -4
- package/dist/yamlPatch.js.map +1 -1
- 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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"}
|
package/dist/config/rc.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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[
|
|
162
|
+
const entry = rc.backends[name];
|
|
96
163
|
if (!entry)
|
|
97
|
-
return { ok: false, reason: "unknown_name", name
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/dist/config/rc.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"rc.js","sourceRoot":"","sources":["../../src/config/rc.ts"],"names":[],"mappings":"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"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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;
|
package/dist/config/schema.js
CHANGED
|
@@ -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
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
admin_backends: z.record(z.string(), BackendEntrySchema).
|
|
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,
|
|
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"}
|
package/dist/diff/engine.js
CHANGED
|
@@ -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",
|