@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
package/dist/cli.js ADDED
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { runValidateCommand } from "./commands/validate.js";
4
+ import { runInitCommand } from "./commands/init.js";
5
+ import { runFreezeCommand } from "./commands/freeze.js";
6
+ import { runContextCommand } from "./commands/context.js";
7
+ import { runDiffCommand } from "./commands/diff.js";
8
+ import { runRefreshCommand } from "./commands/refresh.js";
9
+ import { adminCommand } from "./commands/admin/index.js";
10
+ import { runPushCommand } from "./commands/push.js";
11
+ import { runPullCommand } from "./commands/pull.js";
12
+ import { runStatusCommand } from "./commands/status.js";
13
+ import { runLoginCommand } from "./commands/login.js";
14
+ import { runLogoutCommand } from "./commands/logout.js";
15
+ import { runWhoamiCommand } from "./commands/whoami.js";
16
+ import { runConfigCommand } from "./commands/config.js";
17
+ import { runMigrateYamlCommand } from "./commands/migrate-yaml.js";
18
+ import { runTeamListCommand } from "./commands/team.js";
19
+ import { runProjectListCommand } from "./commands/project.js";
20
+ import { setLocale, readLocale } from "./i18n/index.js";
21
+ import { peekLangArg } from "./i18n/peekLang.js";
22
+ import { getHelp } from "./i18n/help.js";
23
+ import { makeGroupedHelp } from "./i18n/helpFormat.js";
24
+ import { CLI_VERSION } from "./pkgVersion.js";
25
+ // parse 前 early-peek(供 help 渲染;-h 不触发 preAction)
26
+ setLocale(peekLangArg(process.argv));
27
+ const h = getHelp(readLocale());
28
+ const program = new Command("prd")
29
+ .description(h.program_desc)
30
+ .version(CLI_VERSION)
31
+ .option("--lang <code>", h.program_lang_opt)
32
+ // 必需:阻止根级 --version 截获 `freeze --version <v>` 的子命令选项
33
+ .enablePositionalOptions()
34
+ .hook("preAction", (thisCmd, actionCmd) => {
35
+ const lang = actionCmd.optsWithGlobals().lang
36
+ ?? thisCmd.opts().lang;
37
+ setLocale(lang);
38
+ })
39
+ .configureHelp(makeGroupedHelp());
40
+ program
41
+ .command("init [slug]")
42
+ .description(h.cmd.init.desc)
43
+ .option("--workspace <name>", h.cmd.init.opts.workspace)
44
+ .option("--team <slug>", h.cmd.init.opts.team)
45
+ .option("--project <slug>", h.cmd.init.opts.project)
46
+ .option("--backend <name>", h.cmd.init.opts.backend)
47
+ .action((slug, opts) => {
48
+ const code = runInitCommand({
49
+ workspace: opts.workspace,
50
+ slug,
51
+ team: opts.team,
52
+ project: opts.project,
53
+ backend: opts.backend,
54
+ }, process.cwd());
55
+ process.exit(code);
56
+ });
57
+ program
58
+ .command("freeze <slug>")
59
+ .description(h.cmd.freeze.desc)
60
+ .option("--version <version>", h.cmd.freeze.opts.version)
61
+ .option("--auto", h.cmd.freeze.opts.auto)
62
+ .action((slug, opts) => {
63
+ const code = runFreezeCommand({ feature: slug, version: opts.version, auto: opts.auto }, process.cwd());
64
+ process.exit(code);
65
+ });
66
+ program
67
+ .command("context")
68
+ .description(h.cmd.context.desc)
69
+ .requiredOption("--feature <slug>", h.cmd.context.opts.feature)
70
+ .option("--version <version>", h.cmd.context.opts.version)
71
+ .option("--working", h.cmd.context.opts.working)
72
+ .option("--include-questions", h.cmd.context.opts.includeQuestions)
73
+ .option("--out <path>", h.cmd.context.opts.out)
74
+ .action((opts) => {
75
+ const code = runContextCommand({
76
+ feature: opts.feature,
77
+ version: opts.version,
78
+ working: opts.working,
79
+ includeQuestions: opts.includeQuestions,
80
+ out: opts.out,
81
+ }, process.cwd());
82
+ process.exit(code);
83
+ });
84
+ program
85
+ .command("diff")
86
+ .description(h.cmd.diff.desc)
87
+ .requiredOption("--feature <slug>", h.cmd.diff.opts.feature)
88
+ .option("--from <ref>", h.cmd.diff.opts.from)
89
+ .option("--to <ref>", h.cmd.diff.opts.to)
90
+ .action((opts) => {
91
+ const code = runDiffCommand({ feature: opts.feature, from: opts.from, to: opts.to }, process.cwd());
92
+ process.exit(code);
93
+ });
94
+ program
95
+ .command("refresh")
96
+ .description(h.cmd.refresh.desc)
97
+ .requiredOption("-f, --feature <slug>", h.cmd.refresh.opts.feature)
98
+ .option("--new-prd <path>", h.cmd.refresh.opts.newPrd)
99
+ .option("--prd-anchor <heading>", h.cmd.refresh.opts.prdAnchor)
100
+ .option("--prd-anchor-exact", h.cmd.refresh.opts.prdAnchorExact)
101
+ .option("-o, --out <path>", h.cmd.refresh.opts.out)
102
+ .option("--format <fmt>", h.cmd.refresh.opts.format, "md")
103
+ .action((opts) => {
104
+ const code = runRefreshCommand({
105
+ feature: opts.feature,
106
+ newPrd: opts.newPrd,
107
+ prdAnchor: opts.prdAnchor,
108
+ prdAnchorExact: opts.prdAnchorExact,
109
+ out: opts.out,
110
+ format: opts.format,
111
+ }, process.cwd());
112
+ process.exit(code);
113
+ });
114
+ program
115
+ .command("validate [path]")
116
+ .description(h.cmd.validate.desc)
117
+ .option("--feature <slug>", h.cmd.validate.opts.feature)
118
+ .action((path, opts) => {
119
+ const code = runValidateCommand({ feature: opts.feature, path }, process.cwd());
120
+ process.exit(code);
121
+ });
122
+ program
123
+ .command("migrate-yaml [slug]")
124
+ .description(h.cmd["migrate-yaml"].desc)
125
+ .option("--team <slug>", h.cmd["migrate-yaml"].opts.team)
126
+ .option("--project <slug>", h.cmd["migrate-yaml"].opts.project)
127
+ .option("--non-interactive", h.cmd["migrate-yaml"].opts.nonInteractive)
128
+ .option("--backend <name>", h.cmd["migrate-yaml"].opts.backend)
129
+ .action(async (slug, opts) => {
130
+ const code = await runMigrateYamlCommand({
131
+ slug,
132
+ team: opts.team,
133
+ project: opts.project,
134
+ nonInteractive: opts.nonInteractive,
135
+ backend: opts.backend,
136
+ }, process.cwd());
137
+ process.exit(code);
138
+ });
139
+ // admin 顶层 description 走 catalog(adminCommand 内部硬编码中英混排,--lang 下不切换)
140
+ const adminCmd = adminCommand();
141
+ adminCmd.description(h.cmd.admin.desc);
142
+ program.addCommand(adminCmd);
143
+ // === T6 sync commands ===
144
+ program
145
+ .command("push <slug>")
146
+ .description(h.cmd.push.desc)
147
+ .option("--backend <name>", h.cmd.push.opts.backend)
148
+ .option("--allow-create", h.cmd.push.opts.allowCreate)
149
+ .option("--skip-frozen", h.cmd.push.opts.skipFrozen)
150
+ .action(async (slug, opts) => {
151
+ const code = await runPushCommand({
152
+ slug,
153
+ backend: opts.backend,
154
+ allowCreate: opts.allowCreate,
155
+ skipFrozen: opts.skipFrozen,
156
+ }, process.cwd());
157
+ process.exit(code);
158
+ });
159
+ program
160
+ .command("pull <slug>")
161
+ .description(h.cmd.pull.desc)
162
+ .option("--backend <name>", h.cmd.pull.opts.backend)
163
+ .option("--stash", h.cmd.pull.opts.stash)
164
+ .option("--force", h.cmd.pull.opts.force)
165
+ .action(async (slug, opts) => {
166
+ const code = await runPullCommand({ slug, backend: opts.backend, force: opts.force, stash: opts.stash }, process.cwd());
167
+ process.exit(code);
168
+ });
169
+ program
170
+ .command("status [slug]")
171
+ .description(h.cmd.status.desc)
172
+ .option("--backend <name>", h.cmd.status.opts.backend)
173
+ .action(async (slug, opts) => {
174
+ const code = await runStatusCommand({ slug, backend: opts.backend }, process.cwd());
175
+ process.exit(code);
176
+ });
177
+ program
178
+ .command("login")
179
+ .description(h.cmd.login.desc)
180
+ .option("--backend <name>", h.cmd.login.opts.backend)
181
+ .option("--url <url>", h.cmd.login.opts.url)
182
+ .option("--bootstrap", h.cmd.login.opts.bootstrap)
183
+ .option("--admin", h.cmd.login.opts.admin)
184
+ .action(async (opts) => {
185
+ const code = await runLoginCommand(opts, process.cwd());
186
+ process.exit(code);
187
+ });
188
+ program
189
+ .command("logout")
190
+ .description(h.cmd.logout.desc)
191
+ .option("--backend <name>", h.cmd.logout.opts.backend)
192
+ .action(async (opts) => {
193
+ const code = await runLogoutCommand(opts, process.cwd());
194
+ process.exit(code);
195
+ });
196
+ program
197
+ .command("whoami")
198
+ .description(h.cmd.whoami.desc)
199
+ .option("--backend <name>", h.cmd.whoami.opts.backend)
200
+ .action(async (opts) => {
201
+ const code = await runWhoamiCommand(opts, process.cwd());
202
+ process.exit(code);
203
+ });
204
+ // === UAT2-G1: user-视角只读 team/project 视图 ===
205
+ // 设计上区别于 `prd admin team/project list`(admin token + 看到全部),这里走
206
+ // ~/.prdrc backend 的 PAT,只看到自己 membership 范围内的内容。与 web TopBar
207
+ // TeamSwitcher 对齐。
208
+ const teamCmd = program
209
+ .command("team")
210
+ .description(h.cmd.team.desc);
211
+ teamCmd
212
+ .command("list")
213
+ .description(h.cmd.team.sub.list)
214
+ .option("--backend <name>", h.cmd.team.opts.backend)
215
+ .action(async (opts) => {
216
+ const code = await runTeamListCommand(opts, process.cwd());
217
+ process.exit(code);
218
+ });
219
+ const projectCmd = program
220
+ .command("project")
221
+ .description(h.cmd.project.desc);
222
+ projectCmd
223
+ .command("list")
224
+ .description(h.cmd.project.sub.list)
225
+ .requiredOption("-t, --team <slug>", h.cmd.project.opts.team)
226
+ .option("--backend <name>", h.cmd.project.opts.backend)
227
+ .action(async (opts) => {
228
+ const code = await runProjectListCommand(opts, process.cwd());
229
+ process.exit(code);
230
+ });
231
+ // `prd config <subcommand>` — sub-commands wired manually so we keep the
232
+ // run*Command (opts, cwd) -> number convention (per project lessons).
233
+ const configCmd = program
234
+ .command("config")
235
+ .description(h.cmd.config.desc);
236
+ configCmd
237
+ .command("show")
238
+ .description(h.cmd.config.sub.show)
239
+ .action(() => {
240
+ const code = runConfigCommand({ subcommand: "show" }, process.cwd());
241
+ process.exit(code);
242
+ });
243
+ configCmd
244
+ .command("set <key> <value>")
245
+ .description(h.cmd.config.sub.set)
246
+ .action((key, value) => {
247
+ const code = runConfigCommand({ subcommand: "set", key, value }, process.cwd());
248
+ process.exit(code);
249
+ });
250
+ configCmd
251
+ .command("use <backend>")
252
+ .description(h.cmd.config.sub.use)
253
+ .action((backend) => {
254
+ const code = runConfigCommand({ subcommand: "use", key: backend }, process.cwd());
255
+ process.exit(code);
256
+ });
257
+ program.parse(process.argv);
258
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared admin CLI helper: authed JSON fetch with network-error capture.
3
+ *
4
+ * Extracted in v1.11 from team / project / member / teamMember / token.ts
5
+ * (5 file 复制 ~25 行/file 同形 helper, marked for extraction in token.ts
6
+ * v0.5/v0.6 顶部 doc as a v1.9/v1.10 节点产物).
7
+ *
8
+ * Param type reuses `AdminRunOpts` from `./_authResolve.js` (same 3-field
9
+ * shape `{url; token; fetchFn?}`) — structural typing lets callers pass
10
+ * their local `RunOpts` (member.ts extends with `allProjects?` — inert).
11
+ */
12
+ import type { AdminRunOpts } from "./_authResolve.js";
13
+ export interface JsonResp {
14
+ status: number;
15
+ body: any;
16
+ networkError?: string;
17
+ }
18
+ export declare function adminJson(opts: AdminRunOpts, path: string, init?: RequestInit): Promise<JsonResp>;
@@ -0,0 +1,27 @@
1
+ export async function adminJson(opts, path, init = {}) {
2
+ const fn = opts.fetchFn ?? globalThis.fetch;
3
+ let res;
4
+ try {
5
+ res = await fn(`${opts.url}${path}`, {
6
+ ...init,
7
+ headers: {
8
+ ...(init.headers ?? {}),
9
+ Authorization: `Bearer ${opts.token}`,
10
+ },
11
+ });
12
+ }
13
+ catch (e) {
14
+ return { status: 0, body: null, networkError: e.message };
15
+ }
16
+ if (res.status === 204)
17
+ return { status: 204, body: null };
18
+ let body;
19
+ try {
20
+ body = await res.json();
21
+ }
22
+ catch {
23
+ body = null;
24
+ }
25
+ return { status: res.status, body };
26
+ }
27
+ //# sourceMappingURL=_adminJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_adminJson.js","sourceRoot":"","sources":["../../../src/commands/admin/_adminJson.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAkB,EAClB,IAAY,EACZ,OAAoB,EAAE;IAEtB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC;IAC5C,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,EAAE;YACnC,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBACvB,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;aACtC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3D,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface AdminRunOpts {
2
+ url: string;
3
+ token: string;
4
+ fetchFn?: typeof fetch;
5
+ }
6
+ export declare function resolveAdminAuth(opts?: {
7
+ backend?: string;
8
+ }, _rcPath?: string): AdminRunOpts;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * v1.3 §A.3 — shared admin auth resolver for `prd admin *` family.
3
+ *
4
+ * Consumers (6 admin command files + 1 inline site in index.ts) replace
5
+ * their bespoke `envOrExit()` / `requireEnv()` with `resolveAdminAuth(opts)`.
6
+ *
7
+ * Behavior:
8
+ * 1. loadRc() — soft-fail (missing/permissions/parse/schema doesn't exit;
9
+ * permissions failure prints a stderr warning so the user notices a
10
+ * mis-chmod'd ~/.prdrc).
11
+ * 2. resolveAdminBackend(rc, opts, env) — Phase 1 (env) then Phase 2 (rc).
12
+ * 3. On err, format via i18n key matching the reason discriminator and
13
+ * process.exit(1). On ok, strip trailing slash from URL and return
14
+ * AdminRunOpts shape.
15
+ */
16
+ import { loadRc } from "../../config/rc.js";
17
+ import { resolveAdminBackend, } from "../../config/adminBackend.js";
18
+ import { getMessages, readLocale } from "../../i18n/index.js";
19
+ import { err } from "./io.js";
20
+ export function resolveAdminAuth(opts = {}, _rcPath) {
21
+ const m = getMessages(readLocale());
22
+ const rcResult = loadRc(_rcPath);
23
+ const rc = rcResult.ok ? rcResult.rc : null;
24
+ if (!rcResult.ok && rcResult.reason === "permissions") {
25
+ err(m.rc_permissions_warning({ mode: rcResult.mode }));
26
+ }
27
+ const r = resolveAdminBackend(rc, opts, process.env);
28
+ if (!r.ok) {
29
+ err(formatAdminAuthError(m, r));
30
+ process.exit(1);
31
+ }
32
+ return {
33
+ url: r.backend.url.replace(/\/+$/, ""),
34
+ token: r.backend.token,
35
+ };
36
+ }
37
+ function formatAdminAuthError(m, r) {
38
+ switch (r.reason) {
39
+ case "env_partial":
40
+ return m.admin_auth_env_partial({
41
+ missing: r.missing,
42
+ present: r.missing === "PRDSERVER_URL" ? "PRDSERVER_ADMIN_TOKEN" : "PRDSERVER_URL",
43
+ });
44
+ case "no_admin_backend":
45
+ case "admin_backend_not_configured":
46
+ return m.admin_auth_unconfigured;
47
+ case "no_token":
48
+ return m.admin_auth_no_token({ name: r.name });
49
+ default: {
50
+ // 穷尽守卫:给 ResolveAdminBackendResult.reason 加新 case 时 TS 在此报错
51
+ const _exhaustive = r;
52
+ throw new Error(`unhandled admin auth error: ${JSON.stringify(_exhaustive)}`);
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=_authResolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_authResolve.js","sourceRoot":"","sources":["../../../src/commands/admin/_authResolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,mBAAmB,GAEpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAQ9B,MAAM,UAAU,gBAAgB,CAC9B,OAA6B,EAAE,EAC/B,OAAgB;IAEhB,MAAM,CAAC,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;QACtD,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,GAAG,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,GAAG,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,CAAiC,EACjC,CAAoD;IAEpD,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,CAAC,CAAC,sBAAsB,CAAC;gBAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,eAAe;aACnF,CAAC,CAAC;QACL,KAAK,kBAAkB,CAAC;QACxB,KAAK,8BAA8B;YACjC,OAAO,CAAC,CAAC,uBAAuB,CAAC;QACnC,KAAK,UAAU;YACb,OAAO,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC,CAAC;YACR,4DAA4D;YAC5D,MAAM,WAAW,GAAU,CAAC,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Command } from "commander";
2
+ interface AuditRunOpts {
3
+ url: string;
4
+ token: string;
5
+ fetchFn?: typeof fetch;
6
+ team?: string;
7
+ project?: string;
8
+ feature?: string;
9
+ actor?: string;
10
+ action?: string;
11
+ from?: string;
12
+ to?: string;
13
+ limit?: string;
14
+ }
15
+ /**
16
+ * `prd admin audit list` driver — pure GET against /api/admin/audit with
17
+ * query-param filters. Returns 0 + prints JSON array (or "empty" hint), or
18
+ * 1 + prints error body.
19
+ */
20
+ export declare function runAdminAuditList(opts: AuditRunOpts): Promise<number>;
21
+ export declare function adminCommand(): Command;
22
+ export {};
@@ -0,0 +1,100 @@
1
+ import { Command } from "commander";
2
+ import { adminUserCommand } from "./user.js";
3
+ import { adminTokenCommand } from "./token.js";
4
+ import { adminTeamCommand } from "./team.js";
5
+ import { adminProjectCommand } from "./project.js";
6
+ import { adminMemberCommand } from "./member.js";
7
+ import { adminTeamMemberCommand } from "./teamMember.js";
8
+ import { getMessages, readLocale } from "../../i18n/index.js";
9
+ import { out, err, errBody } from "./io.js";
10
+ import { resolveAdminAuth } from "./_authResolve.js";
11
+ /**
12
+ * `prd admin audit list` driver — pure GET against /api/admin/audit with
13
+ * query-param filters. Returns 0 + prints JSON array (or "empty" hint), or
14
+ * 1 + prints error body.
15
+ */
16
+ export async function runAdminAuditList(opts) {
17
+ const m = getMessages(readLocale());
18
+ const params = new URLSearchParams();
19
+ if (opts.team)
20
+ params.set("team", opts.team);
21
+ if (opts.project)
22
+ params.set("project", opts.project);
23
+ if (opts.feature)
24
+ params.set("feature", opts.feature);
25
+ if (opts.actor)
26
+ params.set("actor", opts.actor);
27
+ if (opts.action)
28
+ params.set("action", opts.action);
29
+ if (opts.from)
30
+ params.set("from", opts.from);
31
+ if (opts.to)
32
+ params.set("to", opts.to);
33
+ if (opts.limit)
34
+ params.set("limit", opts.limit);
35
+ const qs = params.toString();
36
+ const path = `/api/admin/audit${qs ? `?${qs}` : ""}`;
37
+ const fn = opts.fetchFn ?? globalThis.fetch;
38
+ let res;
39
+ try {
40
+ res = await fn(`${opts.url}${path}`, {
41
+ headers: { Authorization: `Bearer ${opts.token}` },
42
+ });
43
+ }
44
+ catch (e) {
45
+ err(m.admin_network_error({ message: e.message }));
46
+ return 1;
47
+ }
48
+ let body;
49
+ try {
50
+ body = await res.json();
51
+ }
52
+ catch {
53
+ body = null;
54
+ }
55
+ if (res.status === 200 && body?.ok) {
56
+ const rows = body.data;
57
+ if (rows.length === 0) {
58
+ out(m.admin_audit_list_empty);
59
+ return 0;
60
+ }
61
+ out(JSON.stringify(rows, null, 2));
62
+ return 0;
63
+ }
64
+ errBody(body, `HTTP ${res.status}`);
65
+ return 1;
66
+ }
67
+ export function adminCommand() {
68
+ const cmd = new Command("admin").description("Admin operations(读 PRDSERVER_URL/PRDSERVER_ADMIN_TOKEN env 或 ~/.prdrc admin_backends) / Admin ops");
69
+ cmd.addCommand(adminUserCommand());
70
+ cmd.addCommand(adminTokenCommand());
71
+ // v1.1 §6.1: team/project/member CRUD via /api/admin/teams/...
72
+ cmd.addCommand(adminTeamCommand());
73
+ cmd.addCommand(adminProjectCommand());
74
+ cmd.addCommand(adminMemberCommand());
75
+ cmd.addCommand(adminTeamMemberCommand()); // v1.2 §5.1
76
+ // v1.1 §6.1: read-only audit query. Pure GET — pulls audit_log rows
77
+ // filtered by the union of optional query params. Server route lives in
78
+ // routes/admin.ts (GET /api/admin/audit).
79
+ const auditCmd = new Command("audit").description("Query audit log (v1.1)");
80
+ auditCmd
81
+ .command("list")
82
+ .description("List audit rows (filterable)")
83
+ .option("--team <team>", "team slug filter")
84
+ .option("--project <project>", "project slug filter")
85
+ .option("--feature <feature>", "feature slug filter")
86
+ .option("--actor <user>", "actor name filter")
87
+ .option("--action <action>", "action filter (e.g. team_create)")
88
+ .option("--from <date>", "from date (ISO)")
89
+ .option("--to <date>", "to date (ISO)")
90
+ .option("--limit <n>", "max rows (default 100)", "100")
91
+ .option("--backend <name>", "use ~/.prdrc admin_backends entry (default: rc.default_backend)")
92
+ .action(async (opts) => {
93
+ const env = resolveAdminAuth(opts);
94
+ const code = await runAdminAuditList({ ...env, ...opts });
95
+ process.exit(code);
96
+ });
97
+ cmd.addCommand(auditCmd);
98
+ return cmd;
99
+ }
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/admin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Tiny stdout/stderr helpers shared across the admin command family.
3
+ *
4
+ * Why not just `console.log`? captureIO in tests replaces process.stdout.write
5
+ * but Node's console module may hold an older binding to the stream, so
6
+ * console.log can bypass the test capture. Writing directly to
7
+ * process.stdout/process.stderr keeps the test harness honest and matches
8
+ * the convention used by run*Command throughout the CLI.
9
+ */
10
+ export declare function out(line: string): void;
11
+ export declare function err(line: string): void;
12
+ /**
13
+ * Stringify-friendly variant for error bodies that may be objects.
14
+ */
15
+ export declare function errBody(body: unknown, fallback: string): void;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Tiny stdout/stderr helpers shared across the admin command family.
3
+ *
4
+ * Why not just `console.log`? captureIO in tests replaces process.stdout.write
5
+ * but Node's console module may hold an older binding to the stream, so
6
+ * console.log can bypass the test capture. Writing directly to
7
+ * process.stdout/process.stderr keeps the test harness honest and matches
8
+ * the convention used by run*Command throughout the CLI.
9
+ */
10
+ export function out(line) {
11
+ process.stdout.write(line.endsWith("\n") ? line : line + "\n");
12
+ }
13
+ export function err(line) {
14
+ process.stderr.write(line.endsWith("\n") ? line : line + "\n");
15
+ }
16
+ /**
17
+ * Stringify-friendly variant for error bodies that may be objects.
18
+ */
19
+ export function errBody(body, fallback) {
20
+ if (body == null) {
21
+ err(fallback);
22
+ return;
23
+ }
24
+ if (typeof body === "string") {
25
+ err(body);
26
+ return;
27
+ }
28
+ err(JSON.stringify(body));
29
+ }
30
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../../src/commands/admin/io.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa,EAAE,QAAgB;IACrD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,GAAG,CAAC,QAAQ,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,CAAC;QACV,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `prd admin member {add|list|role|remove}` — v1.1 §6.1.
3
+ *
4
+ * Project-scoped CRUD against:
5
+ * /api/admin/teams/:teamSlug/projects/:projectSlug/members
6
+ *
7
+ * Server's POST takes `user_id` (integer) per spec §4.1, but humans pass
8
+ * `--user <name>` from the CLI. We resolve name → id with a single
9
+ * GET /api/admin/users call before each mutating verb. Tradeoff: one extra
10
+ * round-trip vs. a dedicated /by-name endpoint; acceptable since admin
11
+ * commands are interactive and the user count is small.
12
+ */
13
+ import { Command } from "commander";
14
+ interface RunOpts {
15
+ url: string;
16
+ token: string;
17
+ fetchFn?: typeof fetch;
18
+ /** v1.2: batch-process all projects under the given team */
19
+ allProjects?: boolean;
20
+ }
21
+ export declare function runAdminMemberAdd(opts: RunOpts & {
22
+ team: string;
23
+ project?: string;
24
+ user: string;
25
+ role: string;
26
+ }): Promise<number>;
27
+ export declare function runAdminMemberList(opts: RunOpts & {
28
+ team: string;
29
+ project: string;
30
+ }): Promise<number>;
31
+ export declare function runAdminMemberRole(opts: RunOpts & {
32
+ team: string;
33
+ project: string;
34
+ user: string;
35
+ newRole: string;
36
+ }): Promise<number>;
37
+ export declare function runAdminMemberRemove(opts: RunOpts & {
38
+ team: string;
39
+ project?: string;
40
+ user: string;
41
+ }): Promise<number>;
42
+ export declare function adminMemberCommand(): Command;
43
+ export {};