@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,85 @@
1
+ import { Command } from "commander";
2
+ import { getMessages, readLocale } from "../../i18n/index.js";
3
+ import { resolveAdminAuth } from "./_authResolve.js";
4
+ export function adminUserCommand() {
5
+ const cmd = new Command("user").description("Manage users");
6
+ cmd
7
+ .command("list")
8
+ .description("List users")
9
+ .option("--backend <name>", "use ~/.prdrc admin_backends entry (default: rc.default_backend)")
10
+ .action(async (opts) => {
11
+ const { url, token } = resolveAdminAuth(opts);
12
+ const res = await fetch(`${url}/api/admin/users`, {
13
+ headers: { Authorization: `Bearer ${token}` },
14
+ });
15
+ const body = await res.json();
16
+ console.log(JSON.stringify(body, null, 2));
17
+ });
18
+ cmd
19
+ .command("create <name>")
20
+ .description("Create user + issue one-time token")
21
+ .option("--email <email>", "user email")
22
+ // v1.8 spec §5.1 / §5.5 — token-level admin opt-in. Default 'normal' matches
23
+ // v1.1 behavior (a fresh PAT has no server-admin power); pass --scope admin
24
+ // to mint an admin-scope PAT in the same step as user creation.
25
+ .option("--scope <scope>", "token scope: admin | normal (default: normal)", "normal")
26
+ .option("--backend <name>", "use ~/.prdrc admin_backends entry (default: rc.default_backend)")
27
+ .action(async (name, opts) => {
28
+ // Validate --scope before any network call: catches typos like
29
+ // `--scope adim` early with a friendly error rather than a server 422.
30
+ const scope = opts.scope ?? "normal";
31
+ if (scope !== "admin" && scope !== "normal") {
32
+ console.error(`Error: INVALID_ARG - --scope must be 'admin' or 'normal' (got '${scope}')`);
33
+ process.exit(1);
34
+ }
35
+ const { url, token } = resolveAdminAuth(opts);
36
+ const res = await fetch(`${url}/api/admin/users`, {
37
+ method: "POST",
38
+ headers: {
39
+ "content-type": "application/json",
40
+ Authorization: `Bearer ${token}`,
41
+ },
42
+ body: JSON.stringify({ name, email: opts.email, scope }),
43
+ });
44
+ const body = await res.json();
45
+ if (!body.ok) {
46
+ // T2-P7 (v1.7) — format error consistently as "Error: <code> - <message>"
47
+ // instead of dumping raw JSON, so script callers can grep on a stable shape.
48
+ console.error(`Error: ${body.code ?? 'UNKNOWN'} - ${body.message ?? 'no message'}`);
49
+ process.exit(1);
50
+ }
51
+ const plain = body.data.token;
52
+ // UAT F4: surface the exact commands the user must run next so the
53
+ // workflow doesn't dead-end at "OK got a token, now what?". Mirrors
54
+ // login.ts's new credential prompt — keeps the two onboarding paths
55
+ // (admin-issued PAT vs self bootstrap) symmetric.
56
+ // Use process.stdout.write so output stays under test capture (see
57
+ // packages/cli/src/commands/admin/io.ts for rationale).
58
+ process.stdout.write(`User created: ${name}\n`);
59
+ process.stdout.write(`One-time token (save now): ${plain}\n`);
60
+ const m = getMessages(readLocale());
61
+ process.stdout.write(m.admin_user_create_setup_hint({ url, token: plain, name }) + "\n");
62
+ });
63
+ cmd
64
+ .command("disable <name>")
65
+ .description("Disable a user")
66
+ .option("--backend <name>", "use ~/.prdrc admin_backends entry (default: rc.default_backend)")
67
+ .action(async (name, opts) => {
68
+ const { url, token } = resolveAdminAuth(opts);
69
+ const res = await fetch(`${url}/api/admin/users/${name}/disable`, {
70
+ method: "PATCH",
71
+ headers: { Authorization: `Bearer ${token}` },
72
+ });
73
+ if (res.status === 200) {
74
+ console.log(`Disabled ${name}`);
75
+ }
76
+ else {
77
+ const body = await res.json();
78
+ // T2-P7 (v1.7) — see user.ts:38 for rationale.
79
+ console.error(`Error: ${body.code ?? 'UNKNOWN'} - ${body.message ?? 'no message'}`);
80
+ process.exit(1);
81
+ }
82
+ });
83
+ return cmd;
84
+ }
85
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/commands/admin/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ConfigOptions {
2
+ subcommand: "show" | "set" | "use";
3
+ /** show: ignored; set: dotted key (e.g. "user.email"); use: backend name. */
4
+ key?: string;
5
+ /** set: value to assign. */
6
+ value?: string;
7
+ rcPath?: string;
8
+ }
9
+ export declare function runConfigCommand(opts: ConfigOptions, cwd: string): number;
@@ -0,0 +1,178 @@
1
+ /**
2
+ * `prd config show / set <key> <value> / use <backend>` (T6, design §6.8).
3
+ *
4
+ * Three subcommands, no backend calls. show masks tokens.
5
+ *
6
+ * Wired via the (run*Command, opts, cwd) pattern; `subcommand` discriminates.
7
+ */
8
+ import { loadRc, saveRc, maskToken } from "../config/rc.js";
9
+ import { dump as yamlDump } from "js-yaml";
10
+ import { getMessages, readLocale } from "../i18n/index.js";
11
+ import * as c from "../formatter/colors.js";
12
+ export function runConfigCommand(opts, cwd) {
13
+ void cwd;
14
+ const m = getMessages(readLocale());
15
+ // Load rc tolerantly — `config show` should still show something useful if
16
+ // rc has issues, and `config set` should refuse with a clean error.
17
+ const rcResult = loadRc(opts.rcPath);
18
+ if (!rcResult.ok) {
19
+ if (rcResult.reason === "missing") {
20
+ if (opts.subcommand === "show") {
21
+ process.stdout.write(m.config_no_rc + "\n");
22
+ return 0;
23
+ }
24
+ // set / use without an existing rc → create the file on save below.
25
+ }
26
+ else if (rcResult.reason === "permissions") {
27
+ process.stderr.write(c.warn(m.rc_chmod_warn({ mode: rcResult.mode })) + "\n");
28
+ return 1;
29
+ }
30
+ else {
31
+ // parse / schema
32
+ process.stderr.write(c.fail("✗ ") + m.rc_invalid({ message: rcResult.message }) + "\n");
33
+ return 1;
34
+ }
35
+ }
36
+ const rc = rcResult.ok ? rcResult.rc : { backends: {}, admin_backends: {} };
37
+ switch (opts.subcommand) {
38
+ case "show":
39
+ return renderShow(rc, m);
40
+ case "set":
41
+ return runSet(rc, opts, m);
42
+ case "use":
43
+ return runUse(rc, opts, m);
44
+ default:
45
+ // Defensive — Commander shouldn't allow this.
46
+ process.stderr.write(`Unknown config subcommand: ${opts.subcommand}\n`);
47
+ return 2;
48
+ }
49
+ }
50
+ function renderShow(rc, m) {
51
+ const masked = {
52
+ ...rc,
53
+ backends: Object.fromEntries(Object.entries(rc.backends ?? {}).map(([k, v]) => [
54
+ k,
55
+ { ...v, token: v.token ? maskToken(v.token) : v.token },
56
+ ])),
57
+ };
58
+ process.stdout.write(m.config_show_header + "\n");
59
+ process.stdout.write(yamlDump(masked, { lineWidth: 0, noRefs: true }));
60
+ return 0;
61
+ }
62
+ const STATIC_SETTABLE_KEYS = new Set([
63
+ "user.name",
64
+ "user.email",
65
+ "default_backend",
66
+ "lang",
67
+ ]);
68
+ // backends.<name>.<field> dotted-key matcher. <name> is the backend label;
69
+ // <field> is restricted to the writable subset of BackendEntrySchema.
70
+ // last_login_at is managed by `prd login` only — not user-settable.
71
+ // v1.1 §6.3 — default_team / default_project added so users can pin their
72
+ // favorite scope via `prd config set backends.<n>.default_team team-a`.
73
+ const BACKEND_KEY_RE = /^backends\.([a-zA-Z][a-zA-Z0-9_-]{0,31})\.(url|token|default_team|default_project)$/;
74
+ function runSet(rc, opts, m) {
75
+ if (!opts.key || opts.value === undefined) {
76
+ process.stderr.write(c.fail("✗ ") + "Usage: prd config set <key> <value>\n");
77
+ return 1;
78
+ }
79
+ const backendMatch = opts.key.match(BACKEND_KEY_RE);
80
+ if (!STATIC_SETTABLE_KEYS.has(opts.key) && !backendMatch) {
81
+ process.stderr.write(c.fail("✗ ") + m.config_set_unknown_key({ key: opts.key }) + "\n");
82
+ return 1;
83
+ }
84
+ const next = { ...rc, backends: { ...rc.backends } };
85
+ if (opts.key === "user.name") {
86
+ next.user = { ...(next.user ?? {}), name: opts.value };
87
+ }
88
+ else if (opts.key === "user.email") {
89
+ next.user = { ...(next.user ?? {}), email: opts.value };
90
+ }
91
+ else if (opts.key === "default_backend") {
92
+ if (!next.backends[opts.value]) {
93
+ process.stderr.write(c.fail("✗ ") + m.config_use_unknown_backend({ name: opts.value }) + "\n");
94
+ return 1;
95
+ }
96
+ next.default_backend = opts.value;
97
+ }
98
+ else if (opts.key === "lang") {
99
+ next.lang = opts.value;
100
+ }
101
+ else if (backendMatch) {
102
+ const [, backendName, field] = backendMatch;
103
+ if (field === "url") {
104
+ // Lightweight scheme check — full URL validation happens in
105
+ // PrdRcSchema.parse on save. Catch obvious typos early with a nicer error.
106
+ if (!/^https?:\/\//.test(opts.value)) {
107
+ process.stderr.write(c.fail("✗ ") + m.config_set_invalid_url({ value: opts.value }) + "\n");
108
+ return 1;
109
+ }
110
+ const existing = next.backends[backendName];
111
+ next.backends[backendName] = {
112
+ ...(existing ?? {}),
113
+ url: opts.value.replace(/\/+$/, ""),
114
+ };
115
+ }
116
+ else if (field === "token") {
117
+ // field === "token": refuse on entries without a URL so we never persist
118
+ // a half-formed backend that the rc schema would reject on next load.
119
+ const existing = next.backends[backendName];
120
+ if (!existing || !existing.url) {
121
+ process.stderr.write(c.fail("✗ ") +
122
+ m.config_set_backend_token_no_url({ name: backendName }) +
123
+ "\n");
124
+ return 1;
125
+ }
126
+ next.backends[backendName] = { ...existing, token: opts.value };
127
+ }
128
+ else {
129
+ // field === "default_team" | "default_project" (v1.1 §6.3). Same URL
130
+ // pre-req: refuse to write the scope hint onto a backend that does not
131
+ // yet have a URL — keeps rc validating across load/save cycles and
132
+ // avoids the user wondering why their default_team was silently
133
+ // dropped by Zod.
134
+ const existing = next.backends[backendName];
135
+ if (!existing || !existing.url) {
136
+ process.stderr.write(c.fail("✗ ") +
137
+ m.config_set_backend_token_no_url({ name: backendName }) +
138
+ "\n");
139
+ return 1;
140
+ }
141
+ next.backends[backendName] = { ...existing, [field]: opts.value };
142
+ }
143
+ // First backend lands as default for ergonomics — matches `prd login` behavior.
144
+ if (!next.default_backend)
145
+ next.default_backend = backendName;
146
+ }
147
+ const save = saveRc(next, opts.rcPath);
148
+ if (!save.ok) {
149
+ process.stderr.write(c.fail("✗ ") + `Failed to write ~/.prdrc: ${save.message}\n`);
150
+ return 1;
151
+ }
152
+ // Mask token in success message — printing the plain token to stdout would
153
+ // leak it into shell history and any pipe consumer that logs prd output.
154
+ const displayValue = backendMatch && backendMatch[2] === "token"
155
+ ? maskToken(opts.value)
156
+ : opts.value;
157
+ process.stdout.write(c.pass("✓ ") + m.config_set_success({ key: opts.key, value: displayValue }) + "\n");
158
+ return 0;
159
+ }
160
+ function runUse(rc, opts, m) {
161
+ if (!opts.key) {
162
+ process.stderr.write(c.fail("✗ ") + "Usage: prd config use <backend>\n");
163
+ return 1;
164
+ }
165
+ if (!rc.backends[opts.key]) {
166
+ process.stderr.write(c.fail("✗ ") + m.config_use_unknown_backend({ name: opts.key }) + "\n");
167
+ return 1;
168
+ }
169
+ const next = { ...rc, default_backend: opts.key };
170
+ const save = saveRc(next, opts.rcPath);
171
+ if (!save.ok) {
172
+ process.stderr.write(c.fail("✗ ") + `Failed to write ~/.prdrc: ${save.message}\n`);
173
+ return 1;
174
+ }
175
+ process.stdout.write(c.pass("✓ ") + m.config_use_success({ name: opts.key }) + "\n");
176
+ return 0;
177
+ }
178
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ContextOptions {
2
+ feature?: string;
3
+ version?: string;
4
+ working?: boolean;
5
+ includeQuestions?: boolean;
6
+ out?: string;
7
+ }
8
+ /**
9
+ * context 命令主逻辑。返回退出码,由调用方负责 process.exit。
10
+ */
11
+ export declare function runContextCommand(opts: ContextOptions, cwd: string): number;
@@ -0,0 +1,235 @@
1
+ import { existsSync, readFileSync, writeFileSync, } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ // 不复用 parser/load-yaml.ts 是刻意为之:context 需要把 fs read 错(exit 2 fs_error)
4
+ // 与 yaml parse 错(exit 2 yaml_parse_error)分别报不同 i18n key,而 loadYaml 会把两类
5
+ // 合并成单一 ok:false 结果,导致错误细分粒度丢失。
6
+ import { load as yamlLoad } from "js-yaml";
7
+ import { getMessages, readLocale } from "../i18n/index.js";
8
+ import { renderError } from "../i18n/dispatch.js";
9
+ import * as c from "../formatter/colors.js";
10
+ import { renderContext, } from "../renderer/context-md.js";
11
+ import { VERSION_REGEX, readManifest, listExistingVersions, } from "../workspace.js";
12
+ import { asyncHeadProbe } from "../sync/headProbe.js";
13
+ /**
14
+ * 解析输入源:--working / --version <v> / 默认 latest_frozen。
15
+ * 返回 yaml 路径 + frontmatter 元数据。
16
+ */
17
+ function resolveSource(opts, cwd, manifest) {
18
+ const slug = opts.feature;
19
+ const featureDir = join(cwd, ".prd/features", slug);
20
+ // --working
21
+ if (opts.working) {
22
+ const path = join(featureDir, "working/prd.yaml");
23
+ if (!existsSync(path)) {
24
+ return {
25
+ ok: false,
26
+ fail: {
27
+ errorKey: "context_working_not_found",
28
+ details: { slug },
29
+ exitCode: 1,
30
+ },
31
+ };
32
+ }
33
+ return { ok: true, src: { path, version: "working" } };
34
+ }
35
+ // --version <v>
36
+ if (typeof opts.version === "string" && opts.version !== "") {
37
+ if (!VERSION_REGEX.test(opts.version)) {
38
+ return {
39
+ ok: false,
40
+ fail: {
41
+ errorKey: "context_invalid_version",
42
+ details: { value: opts.version },
43
+ exitCode: 1,
44
+ },
45
+ };
46
+ }
47
+ const versionDir = join(featureDir, "frozen", opts.version);
48
+ const path = join(versionDir, "prd.yaml");
49
+ if (!existsSync(path)) {
50
+ const existing = listExistingVersions(join(featureDir, "frozen"));
51
+ return {
52
+ ok: false,
53
+ fail: {
54
+ errorKey: "context_version_not_found",
55
+ details: {
56
+ version: opts.version,
57
+ existing: existing.length === 0 ? "(无)" : existing.join(", "),
58
+ },
59
+ exitCode: 1,
60
+ },
61
+ };
62
+ }
63
+ const snapshot = readSnapshot(join(versionDir, "snapshot.json"));
64
+ return {
65
+ ok: true,
66
+ src: {
67
+ path,
68
+ version: opts.version,
69
+ frozenAt: snapshot.frozen_at,
70
+ sourceHash: snapshot.source_hash,
71
+ },
72
+ };
73
+ }
74
+ // 默认:从 manifest 取 latest_frozen_version
75
+ const featureEntry = manifest.features.find((f) => f.slug === slug);
76
+ if (!featureEntry || !isString(featureEntry.latest_frozen_version)) {
77
+ return {
78
+ ok: false,
79
+ fail: {
80
+ errorKey: "context_feature_not_frozen",
81
+ details: { slug },
82
+ exitCode: 1,
83
+ },
84
+ };
85
+ }
86
+ const version = featureEntry.latest_frozen_version;
87
+ const versionDir = join(featureDir, "frozen", version);
88
+ const path = join(versionDir, "prd.yaml");
89
+ if (!existsSync(path)) {
90
+ return {
91
+ ok: false,
92
+ fail: {
93
+ errorKey: "context_manifest_disk_mismatch",
94
+ details: { slug, version },
95
+ exitCode: 2,
96
+ },
97
+ };
98
+ }
99
+ const snapshot = readSnapshot(join(versionDir, "snapshot.json"));
100
+ return {
101
+ ok: true,
102
+ src: {
103
+ path,
104
+ version,
105
+ frozenAt: snapshot.frozen_at,
106
+ sourceHash: snapshot.source_hash,
107
+ },
108
+ };
109
+ }
110
+ function isString(v) {
111
+ return typeof v === "string" && v !== "";
112
+ }
113
+ function readSnapshot(snapshotPath) {
114
+ if (!existsSync(snapshotPath))
115
+ return {};
116
+ try {
117
+ const data = JSON.parse(readFileSync(snapshotPath, "utf8"));
118
+ return {
119
+ frozen_at: typeof data.frozen_at === "string" ? data.frozen_at : undefined,
120
+ source_hash: typeof data.source_hash === "string" ? data.source_hash : undefined,
121
+ };
122
+ }
123
+ catch {
124
+ return {};
125
+ }
126
+ }
127
+ /**
128
+ * context 命令主逻辑。返回退出码,由调用方负责 process.exit。
129
+ */
130
+ export function runContextCommand(opts, cwd) {
131
+ const locale = readLocale();
132
+ const m = getMessages(locale);
133
+ // 0. --feature 必填(programmatic 调用兜底;CLI 层由 Commander requiredOption 保护)
134
+ if (!opts.feature) {
135
+ process.stderr.write(c.fail("✗ ") + m.context_feature_required + "\n");
136
+ return 1;
137
+ }
138
+ // T6: HEAD probe (fire-and-forget; design §6.10).
139
+ void asyncHeadProbe(opts.feature, cwd);
140
+ // 1. --working 与 --version 互斥
141
+ if (opts.working && typeof opts.version === "string" && opts.version !== "") {
142
+ process.stderr.write(c.fail("✗ ") + m.context_working_version_conflict + "\n");
143
+ return 1;
144
+ }
145
+ // 2. workspace 已 init?(manifest.json 必须存在)
146
+ const manifestPath = join(cwd, ".prd/manifest.json");
147
+ const manifestRead = readManifest(manifestPath);
148
+ if (!manifestRead.ok) {
149
+ process.stderr.write(c.fail("✗ ") + m.context_workspace_not_init + "\n");
150
+ return 1;
151
+ }
152
+ // 3. 解析输入源
153
+ const resolved = resolveSource(opts, cwd, manifestRead.data);
154
+ if (!resolved.ok) {
155
+ process.stderr.write(c.fail("✗ ") +
156
+ renderError(m, resolved.fail.errorKey, resolved.fail.details ?? {}) +
157
+ "\n");
158
+ return resolved.fail.exitCode;
159
+ }
160
+ const { path, version, frozenAt, sourceHash } = resolved.src;
161
+ // 4. 读 + 解析 yaml
162
+ let yamlText;
163
+ try {
164
+ yamlText = readFileSync(path, "utf8");
165
+ }
166
+ catch (e) {
167
+ process.stderr.write(c.fail("✗ ") +
168
+ m.context_fs_error({
169
+ operation: `read ${path}`,
170
+ message: e.message,
171
+ }) +
172
+ "\n");
173
+ return 2;
174
+ }
175
+ let yaml;
176
+ try {
177
+ yaml = yamlLoad(yamlText);
178
+ }
179
+ catch (e) {
180
+ process.stderr.write(c.fail("✗ ") +
181
+ m.context_yaml_parse_error({
182
+ path,
183
+ message: e.message,
184
+ }) +
185
+ "\n");
186
+ return 2;
187
+ }
188
+ // 5. 渲染
189
+ const meta = {
190
+ feature: opts.feature,
191
+ version,
192
+ frozen_at: frozenAt,
193
+ source_hash: sourceHash,
194
+ schema_version: typeof yaml?.schema_version === "string" ? yaml.schema_version : "v0.1",
195
+ };
196
+ let markdown;
197
+ try {
198
+ markdown = renderContext(yaml, meta, {
199
+ includeQuestions: opts.includeQuestions === true,
200
+ });
201
+ }
202
+ catch (e) {
203
+ process.stderr.write(c.fail("✗ ") +
204
+ m.context_render_error({ message: e.message }) +
205
+ "\n");
206
+ return 2;
207
+ }
208
+ // 6. 输出:--out <path> 写文件,否则 stdout
209
+ if (typeof opts.out === "string" && opts.out !== "") {
210
+ const parent = dirname(opts.out);
211
+ if (!existsSync(parent)) {
212
+ process.stderr.write(c.fail("✗ ") + m.context_out_parent_not_exists({ dir: parent }) + "\n");
213
+ return 2;
214
+ }
215
+ try {
216
+ writeFileSync(opts.out, markdown, "utf8");
217
+ }
218
+ catch (e) {
219
+ process.stderr.write(c.fail("✗ ") +
220
+ m.context_fs_error({
221
+ operation: `write ${opts.out}`,
222
+ message: e.message,
223
+ }) +
224
+ "\n");
225
+ process.stderr.write(m.context_out_write_failed_hint + "\n");
226
+ return 2;
227
+ }
228
+ const bytes = Buffer.byteLength(markdown, "utf8");
229
+ process.stdout.write(c.pass("✓ ") + m.context_out_success({ path: opts.out, bytes }) + "\n");
230
+ return 0;
231
+ }
232
+ process.stdout.write(markdown);
233
+ return 0;
234
+ }
235
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface DiffOptions {
2
+ feature?: string;
3
+ from?: string;
4
+ to?: string;
5
+ }
6
+ export declare function runDiffCommand(opts: DiffOptions, cwd: string): number;