@dsh-enhanced/dsh-rsi-cli 0.1.48

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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -0
  3. package/bin/dsh-rsi.js +11 -0
  4. package/lib/backup.d.ts +16 -0
  5. package/lib/backup.d.ts.map +1 -0
  6. package/lib/backup.js +27 -0
  7. package/lib/backup.js.map +1 -0
  8. package/lib/diagnose.d.ts +33 -0
  9. package/lib/diagnose.d.ts.map +1 -0
  10. package/lib/diagnose.js +145 -0
  11. package/lib/diagnose.js.map +1 -0
  12. package/lib/index.d.ts +46 -0
  13. package/lib/index.d.ts.map +1 -0
  14. package/lib/index.js +592 -0
  15. package/lib/index.js.map +1 -0
  16. package/lib/install.d.ts +33 -0
  17. package/lib/install.d.ts.map +1 -0
  18. package/lib/install.js +64 -0
  19. package/lib/install.js.map +1 -0
  20. package/lib/paths.d.ts +61 -0
  21. package/lib/paths.d.ts.map +1 -0
  22. package/lib/paths.js +168 -0
  23. package/lib/paths.js.map +1 -0
  24. package/lib/process-guard.d.ts +51 -0
  25. package/lib/process-guard.d.ts.map +1 -0
  26. package/lib/process-guard.js +143 -0
  27. package/lib/process-guard.js.map +1 -0
  28. package/lib/purge.d.ts +58 -0
  29. package/lib/purge.d.ts.map +1 -0
  30. package/lib/purge.js +204 -0
  31. package/lib/purge.js.map +1 -0
  32. package/lib/run.d.ts +27 -0
  33. package/lib/run.d.ts.map +1 -0
  34. package/lib/run.js +53 -0
  35. package/lib/run.js.map +1 -0
  36. package/lib/secrets.d.ts +22 -0
  37. package/lib/secrets.d.ts.map +1 -0
  38. package/lib/secrets.js +107 -0
  39. package/lib/secrets.js.map +1 -0
  40. package/lib/services.d.ts +89 -0
  41. package/lib/services.d.ts.map +1 -0
  42. package/lib/services.js +339 -0
  43. package/lib/services.js.map +1 -0
  44. package/lib/update.d.ts +59 -0
  45. package/lib/update.d.ts.map +1 -0
  46. package/lib/update.js +160 -0
  47. package/lib/update.js.map +1 -0
  48. package/lib/version.d.ts +2 -0
  49. package/lib/version.d.ts.map +1 -0
  50. package/lib/version.js +2 -0
  51. package/lib/version.js.map +1 -0
  52. package/lib/weburl.d.ts +36 -0
  53. package/lib/weburl.d.ts.map +1 -0
  54. package/lib/weburl.js +106 -0
  55. package/lib/weburl.js.map +1 -0
  56. package/package.json +54 -0
package/lib/index.js ADDED
@@ -0,0 +1,592 @@
1
+ import { homedir } from 'node:os';
2
+ import { createInterface } from 'node:readline/promises';
3
+ import { runPurge, PurgeError } from "./purge.js";
4
+ import { collectStatus, formatStatus, formatFindings, runDoctor } from "./diagnose.js";
5
+ import { resolveDshHome } from "./paths.js";
6
+ import { runInstall } from "./install.js";
7
+ import { findRunningProfiles } from "./run.js";
8
+ import { formatSelfUpdateReport, runSelfUpdate } from "./update.js";
9
+ import { formatWebUrlResult, resolveManagedWebUrl } from "./weburl.js";
10
+ import { collectLogs, controlManagedService, formatLogs, formatServiceOutcomes, managedServiceProcessIds, resolveTargetProfiles, } from "./services.js";
11
+ import { version as VERSION } from "./version.js";
12
+ export { runPurge, PurgeError } from "./purge.js";
13
+ export { runInstall } from "./install.js";
14
+ export { collectStatus, runDoctor, formatStatus, formatFindings } from "./diagnose.js";
15
+ export { formatSelfUpdateReport, runSelfUpdate, RSI_CLI_PACKAGE } from "./update.js";
16
+ export { collectLogs, controlManagedService, formatLogs, formatServiceOutcomes, inspectManagedService, managedServiceProcessIds, resolveTargetProfiles, tailLogFile, } from "./services.js";
17
+ export { extractWebUrlFromText, formatWebUrlResult, resolveManagedWebUrl } from "./weburl.js";
18
+ export { resolveDshHome } from "./paths.js";
19
+ export { version } from "./version.js";
20
+ const HELP = `dsh-rsi — DSH enhanced 插件集合的安装 / 控制 / 诊断 / 彻底卸载工具(v${VERSION})
21
+
22
+ 用法:
23
+ dsh-rsi [全局选项] <命令> [命令参数]
24
+
25
+ 命令:
26
+ status 列出 DSH home、各 profile 与安装形态(npm/local)、host 版本、
27
+ 受管服务状态、外部凭据条目数、生命周期残留(只读)
28
+ doctor status 之外,扫描各 profile 的 host 错误日志,识别已知崩溃模式并给出建议(只读)
29
+ start 启动已注册的受管常驻服务(不改动服务定义,未注册时报错并给出指引)
30
+ stop 停止受管常驻服务(保留服务定义与 profile 数据,可再次 start)
31
+ restart 重启受管常驻服务(配置/插件变更后生效的常用方式)
32
+ logs 查看各 profile 的受管 stdout/stderr 日志尾部
33
+ web-url 解析受管服务当前有效的带 token Web 授权 URL(从 journal / host 日志取最新 dsh web 行)
34
+ update 升级全局 dsh-rsi 自身;加 --all 再升级整套插件集合(原地升级,保留数据)
35
+ install 安装/修复插件集合(薄委托到官方安装器,参数原样透传)
36
+ reinstall purge(默认先备份)后立即重新安装
37
+ purge 彻底卸载:停服 → 备份 → 删除 profile/DSH home → 清理外部凭据
38
+ version 打印 dsh-rsi 版本
39
+
40
+ 全局选项:
41
+ --dsh-home <path> 指定 DSH home(默认取 $DSH_HOME,否则 ~/.dsh;安装器经 DSH_HOME 环境变量接收)
42
+ --profile <name> 仅操作单个 profile(purge/reinstall 的 purge 阶段默认全量)
43
+ --dry-run 只打印将执行的动作,不做任何修改
44
+ --yes purge/reinstall 跳过交互确认(reinstall 时同时透传给安装器)
45
+
46
+ install / reinstall:
47
+ npm 形态(默认) 下载与本 dsh-rsi 同版本(v${VERSION})的 install-npm.sh 到临时目录执行,
48
+ 脚本内部自校验 common.sh 等资产的 SHA-256
49
+ --local <dir> local 形态:直接执行 <dir>/scripts/install/install-local.sh(checkout 安装)
50
+ 其它参数 原样透传给安装器,例如 --scenario core、--workspace、--model-route、--yes 等;
51
+ install --help 会展示安装器完整参数清单(也见 scripts/install/README.md)
52
+
53
+ update:
54
+ 不带参数 只升级全局 dsh-rsi 自身(npm install --global @dsh-enhanced/dsh-rsi-cli@latest);
55
+ 若当前仍由旧包 @dsh-enhanced/rsi-cli 安装,会在新包可用后自动卸载旧包。
56
+ --all 自身升级成功后,再把插件集合交给官方安装器 --operation upgrade 原地升级
57
+ (保留 patch、凭据、Session、Goal 等状态;不同于 reinstall 的先 purge 再装)
58
+ --version <v|tag> 指定 dsh-rsi 目标版本或 dist-tag(默认 latest)
59
+ --local <dir> --all 时走 local 形态,用该 checkout 的安装器升级
60
+ 其它参数 --all 时原样透传给安装器;通常无需再写 --scenario 或内部确认参数
61
+ 安全 已注册的 Linux 受管服务由升级事务自行停服/恢复;额外手工或测试 Host 会阻止升级。
62
+
63
+ start / stop / restart:
64
+ 不带 --profile 时作用于 DSH home 下的全部 profile;配合 --dry-run 可先看将执行的命令。
65
+ 只切换运行状态:不新建、不改写、不删除 launchd plist 或 systemd unit。
66
+ 服务尚未注册时不会隐式注册(那会绕过安装器的归属与路径校验),而是提示先执行
67
+ dsh-rsi install 或 dsh-rsi-setup。停止/注销服务并删除定义请用 purge。
68
+
69
+ logs 选项:
70
+ --lines <n> 每个日志文件显示的尾部行数(默认 200,上限 10000)
71
+ --errors-only 只显示 *-host.error.log
72
+
73
+ purge 选项:
74
+ --no-backup 删除前不生成 ~/dsh-purge-backup-<UTC时间戳>.tar.gz 备份
75
+ --keep-keychain 保留 macOS Keychain / Linux Secret Service 中的受管凭据
76
+ --remove-host 同时卸载全局 @deepseek-ai/dsh(仅限全量 purge;默认保留)
77
+
78
+ 示例:
79
+ dsh-rsi status
80
+ dsh-rsi doctor
81
+ dsh-rsi restart --profile web
82
+ dsh-rsi stop
83
+ dsh-rsi start --dry-run
84
+ dsh-rsi logs --profile web --lines 100
85
+ dsh-rsi logs --errors-only
86
+ dsh-rsi update
87
+ dsh-rsi update --dry-run
88
+ dsh-rsi update --version 0.1.38
89
+ dsh-rsi update --all --yes
90
+ dsh-rsi install --scenario core --yes
91
+ dsh-rsi install --local ~/work/github/dsh-enhanced --scenario web
92
+ dsh-rsi reinstall --yes
93
+ dsh-rsi purge --dry-run
94
+ dsh-rsi purge --profile web
95
+ dsh-rsi purge --yes --remove-host
96
+ `;
97
+ const KNOWN_COMMANDS = new Set([
98
+ 'status', 'doctor', 'start', 'stop', 'restart', 'logs', 'web-url', 'update',
99
+ 'install', 'reinstall', 'purge', 'version',
100
+ ]);
101
+ const GLOBAL_FLAGS = new Set(['--dry-run', '--yes', '--help', '-h']);
102
+ const VALUE_OPTIONS = new Set(['--dsh-home', '--profile', '--lines', '--version']);
103
+ const LOGS_FLAGS = new Set(['--errors-only']);
104
+ const UPDATE_FLAGS = new Set(['--all']);
105
+ /** logs --lines 上限,避免一次把超大日志全量打到终端。 */
106
+ const MAX_LOG_LINES = 10_000;
107
+ const DEFAULT_LOG_LINES = 200;
108
+ const PURGE_FLAGS = new Set(['--no-backup', '--keep-keychain', '--remove-host']);
109
+ /** install/reinstall 中由 rsi 自身消费、不透传给安装器的带值选项。 */
110
+ const INSTALL_VALUE_OPTIONS = new Set(['--dsh-home', '--local']);
111
+ /** 写入一个带值选项;--lines 需要范围校验,错误值必须报错而不是静默取默认。 */
112
+ function assignValueOption(result, token, value) {
113
+ if (token === '--dsh-home') {
114
+ result.dshHome = value;
115
+ return;
116
+ }
117
+ if (token === '--profile') {
118
+ result.profile = value;
119
+ return;
120
+ }
121
+ if (token === '--version') {
122
+ result.targetVersion = value;
123
+ return;
124
+ }
125
+ // --lines
126
+ if (!/^[0-9]+$/u.test(value))
127
+ throw new PurgeError(`--lines 需要一个正整数,收到:${value}`);
128
+ const parsed = Number(value);
129
+ if (parsed < 1 || parsed > MAX_LOG_LINES) {
130
+ throw new PurgeError(`--lines 需在 1..${MAX_LOG_LINES} 之间,收到:${value}`);
131
+ }
132
+ result.lines = parsed;
133
+ }
134
+ export function parseArgs(argv, env = process.env) {
135
+ const result = {
136
+ command: 'status',
137
+ dshHome: resolveDshHome(env),
138
+ dryRun: false,
139
+ yes: false,
140
+ backup: true,
141
+ keepKeychain: false,
142
+ removeHost: false,
143
+ help: false,
144
+ lines: DEFAULT_LOG_LINES,
145
+ errorsOnly: false,
146
+ all: false,
147
+ passthrough: [],
148
+ };
149
+ let commandSeen = false;
150
+ for (let i = 0; i < argv.length; i++) {
151
+ const token = argv[i];
152
+ if (!commandSeen) {
153
+ if (VALUE_OPTIONS.has(token)) {
154
+ const value = argv[++i];
155
+ if (value === undefined || value.startsWith('--'))
156
+ throw new PurgeError(`${token} 需要一个值`);
157
+ assignValueOption(result, token, value);
158
+ continue;
159
+ }
160
+ if (GLOBAL_FLAGS.has(token)) {
161
+ if (token === '--dry-run')
162
+ result.dryRun = true;
163
+ else if (token === '--yes')
164
+ result.yes = true;
165
+ else
166
+ result.help = true;
167
+ continue;
168
+ }
169
+ if (LOGS_FLAGS.has(token)) {
170
+ result.errorsOnly = true;
171
+ continue;
172
+ }
173
+ if (UPDATE_FLAGS.has(token)) {
174
+ result.all = true;
175
+ continue;
176
+ }
177
+ if (PURGE_FLAGS.has(token)) {
178
+ if (token === '--no-backup')
179
+ result.backup = false;
180
+ else if (token === '--keep-keychain')
181
+ result.keepKeychain = true;
182
+ else
183
+ result.removeHost = true;
184
+ continue;
185
+ }
186
+ if (!token.startsWith('-') && KNOWN_COMMANDS.has(token)) {
187
+ result.command = token;
188
+ commandSeen = true;
189
+ continue;
190
+ }
191
+ throw new PurgeError(`无法识别的参数:${token}(用 -h 查看用法)`);
192
+ }
193
+ // 命令之后:install/reinstall/update --all 走「消费少数 rsi 选项 + 其余透传」。
194
+ if (result.command === 'install' || result.command === 'reinstall' || result.command === 'update') {
195
+ i = consumeInstallToken(result, argv, i);
196
+ continue;
197
+ }
198
+ // 其它命令保持既有的严格解析。
199
+ if (VALUE_OPTIONS.has(token)) {
200
+ const value = argv[++i];
201
+ if (value === undefined || value.startsWith('--'))
202
+ throw new PurgeError(`${token} 需要一个值`);
203
+ assignValueOption(result, token, value);
204
+ continue;
205
+ }
206
+ if (GLOBAL_FLAGS.has(token)) {
207
+ if (token === '--dry-run')
208
+ result.dryRun = true;
209
+ else if (token === '--yes')
210
+ result.yes = true;
211
+ else
212
+ result.help = true;
213
+ continue;
214
+ }
215
+ if (LOGS_FLAGS.has(token)) {
216
+ result.errorsOnly = true;
217
+ continue;
218
+ }
219
+ if (UPDATE_FLAGS.has(token)) {
220
+ result.all = true;
221
+ continue;
222
+ }
223
+ if (PURGE_FLAGS.has(token)) {
224
+ if (token === '--no-backup')
225
+ result.backup = false;
226
+ else if (token === '--keep-keychain')
227
+ result.keepKeychain = true;
228
+ else
229
+ result.removeHost = true;
230
+ continue;
231
+ }
232
+ throw new PurgeError(`无法识别的参数:${token}(用 -h 查看用法)`);
233
+ }
234
+ return result;
235
+ }
236
+ /**
237
+ * 处理 install/reinstall 命令后的一个 token,返回新的下标。
238
+ * rsi 只消费 --dsh-home/--local(及 reinstall 的 purge 选项);
239
+ * --yes/--dry-run 在 reinstall 下「rsi 生效且同时透传」,install 下纯透传;
240
+ * 其它安装器参数(含其带值)原样进 passthrough。
241
+ */
242
+ function consumeInstallToken(result, argv, index) {
243
+ const token = argv[index];
244
+ const isReinstall = result.command === 'reinstall';
245
+ const isUpdate = result.command === 'update';
246
+ // update 自身的选项由 rsi 消费,不透传给安装器。
247
+ if (isUpdate) {
248
+ if (token === '--all') {
249
+ result.all = true;
250
+ return index;
251
+ }
252
+ if (token === '--version') {
253
+ const value = argv[index + 1];
254
+ if (value === undefined || value.startsWith('--'))
255
+ throw new PurgeError(`${token} 需要一个值`);
256
+ result.targetVersion = value;
257
+ return index + 1;
258
+ }
259
+ if (token === '--help' || token === '-h') {
260
+ result.help = true;
261
+ return index;
262
+ }
263
+ if (token === '--dry-run') {
264
+ result.dryRun = true;
265
+ result.passthrough.push(token);
266
+ return index;
267
+ }
268
+ }
269
+ if (INSTALL_VALUE_OPTIONS.has(token)) {
270
+ const value = argv[index + 1];
271
+ if (value === undefined || value.startsWith('--'))
272
+ throw new PurgeError(`${token} 需要一个值`);
273
+ if (token === '--dsh-home')
274
+ result.dshHome = value;
275
+ else
276
+ result.local = value;
277
+ return index + 1;
278
+ }
279
+ // install --help/-h 透传给安装器(薄委托展示安装器自身帮助);
280
+ // reinstall 无安装器单独可展示的语义,-h/--help 显示 rsi 帮助。
281
+ if (isReinstall && (token === '--help' || token === '-h')) {
282
+ result.help = true;
283
+ return index;
284
+ }
285
+ if (isReinstall && token === '--profile') {
286
+ const value = argv[index + 1];
287
+ if (value === undefined || value.startsWith('--'))
288
+ throw new PurgeError(`${token} 需要一个值`);
289
+ result.profile = value;
290
+ return index + 1;
291
+ }
292
+ if (isReinstall && PURGE_FLAGS.has(token)) {
293
+ if (token === '--no-backup')
294
+ result.backup = false;
295
+ else if (token === '--keep-keychain')
296
+ result.keepKeychain = true;
297
+ else
298
+ result.removeHost = true;
299
+ return index;
300
+ }
301
+ if (isReinstall && (token === '--yes' || token === '--dry-run')) {
302
+ if (token === '--yes')
303
+ result.yes = true;
304
+ else
305
+ result.dryRun = true;
306
+ result.passthrough.push(token);
307
+ return index;
308
+ }
309
+ // 其余一律透传;若下一个 token 是不带 - 的值(如 --scenario 的 core),一并透传。
310
+ result.passthrough.push(token);
311
+ const next = argv[index + 1];
312
+ if (token.startsWith('--') && next !== undefined && !next.startsWith('-')) {
313
+ result.passthrough.push(next);
314
+ return index + 1;
315
+ }
316
+ return index;
317
+ }
318
+ async function confirmPurge(args, reinstall) {
319
+ const scope = args.profile === undefined ? '整个 DSH home(全部 profile)' : `profile ${args.profile}`;
320
+ const backup = args.backup ? '会先在 ~ 生成 tar.gz 备份' : '不会备份(--no-backup)';
321
+ const host = args.removeHost ? '\n - 同时卸载全局 @deepseek-ai/dsh' : '';
322
+ const tail = reinstall
323
+ ? '\npurge 完成后将立即重新安装插件集合。'
324
+ : '';
325
+ process.stdout.write(`即将彻底删除 ${scope}:
326
+ - DSH home 内的 profile 数据与受管日志
327
+ - 生命周期事务/锁残留
328
+ - 受管常驻服务(launchd / systemd --user)
329
+ - ${backup}${args.keepKeychain ? '' : '\n - macOS Keychain / Linux Secret Service 中的受管凭据'}${host}${tail}
330
+ local checkout 源码不会被删除。输入 purge 后回车继续:`);
331
+ const reader = createInterface({ input: process.stdin, output: process.stdout });
332
+ try {
333
+ const answer = (await reader.question('')).trim();
334
+ return answer === 'purge';
335
+ }
336
+ finally {
337
+ reader.close();
338
+ }
339
+ }
340
+ function formatPurgeReport(args, report) {
341
+ const lines = [];
342
+ lines.push(args.dryRun ? '【dry-run】以下是将执行的 purge 计划,未做任何修改:' : 'purge 完成。');
343
+ if (report.backup) {
344
+ lines.push(args.dryRun
345
+ ? `备份:将生成 ${report.backup.archivePath}(tar.gz,0600)`
346
+ : `备份:${report.backup.archivePath}(${report.backup.bytes} 字节)`);
347
+ }
348
+ else {
349
+ lines.push('备份:已跳过(--no-backup)');
350
+ }
351
+ for (const profile of report.serviceProfiles)
352
+ lines.push(`服务:已停用并注销 ${profile} 的受管常驻服务`);
353
+ for (const path of report.skippedServiceFiles)
354
+ lines.push(`服务文件保留:${path}`);
355
+ if (report.terminatedPids.length > 0) {
356
+ lines.push(`残留进程:已终止 ${report.terminatedPids.length} 个(PID ${report.terminatedPids.join(", ")})`);
357
+ }
358
+ lines.push(`删除路径(${report.removedPaths.length}):`);
359
+ for (const path of report.removedPaths)
360
+ lines.push(` - ${path}`);
361
+ if (report.removedCredentials.length > 0) {
362
+ lines.push(`外部凭据条目(${report.removedCredentials.length}):`);
363
+ for (const credential of report.removedCredentials)
364
+ lines.push(` - ${credential}`);
365
+ }
366
+ else if (!args.keepKeychain) {
367
+ lines.push('外部凭据条目:无');
368
+ }
369
+ if (args.keepKeychain)
370
+ lines.push('外部凭据:已按 --keep-keychain 保留');
371
+ if (report.keptCheckouts.length > 0) {
372
+ lines.push('local checkout 源码(未删除,确认无用后可手工 rm -rf):');
373
+ for (const checkout of report.keptCheckouts)
374
+ lines.push(` + ${checkout}`);
375
+ }
376
+ if (report.hostRemoved) {
377
+ lines.push(args.dryRun
378
+ ? `全局 host:将执行 npm uninstall -g @deepseek-ai/dsh(前缀 ${report.hostPrefix ?? '未知'})`
379
+ : `全局 host:已卸载 @deepseek-ai/dsh(前缀 ${report.hostPrefix ?? '未知'})`);
380
+ }
381
+ else {
382
+ lines.push('全局 host:已保留(需要一并卸载请加 --remove-host)');
383
+ }
384
+ if (!args.dryRun) {
385
+ lines.push('');
386
+ lines.push('如需重装:dsh-rsi install(npm 形态)或 dsh-rsi install --local <checkout>(local 形态);也可重跑 install-npm.sh / install-local.sh。');
387
+ }
388
+ return lines.join('\n');
389
+ }
390
+ /** 组装 install 参数;命令位置之前的全局 --yes/--dry-run/--profile 在 install 下也补透传给安装器。 */
391
+ function buildInstallOptions(args) {
392
+ const passthrough = [...args.passthrough];
393
+ if (args.yes && !passthrough.includes('--yes'))
394
+ passthrough.push('--yes');
395
+ if (args.dryRun && !passthrough.includes('--dry-run'))
396
+ passthrough.push('--dry-run');
397
+ // --profile 既用于 reinstall 的 purge 范围,也原样透传给安装器(安装器本身接受 --profile)。
398
+ if (args.profile !== undefined && !passthrough.includes('--profile')) {
399
+ passthrough.push('--profile', args.profile);
400
+ }
401
+ return {
402
+ mode: args.local === undefined ? 'npm' : 'local',
403
+ ...(args.local === undefined ? {} : { localRepositoryRoot: args.local }),
404
+ releaseRef: `v${VERSION}`,
405
+ passthrough,
406
+ dshHome: args.dshHome,
407
+ };
408
+ }
409
+ export async function main(argv = process.argv.slice(2), env = process.env, deps = {}) {
410
+ const purge = deps.purge ?? runPurge;
411
+ const install = deps.install ?? runInstall;
412
+ const selfUpdate = deps.selfUpdate ?? runSelfUpdate;
413
+ const findRunning = deps.findRunning ?? findRunningProfiles;
414
+ const managedPids = deps.managedServicePids ?? managedServiceProcessIds;
415
+ let args;
416
+ try {
417
+ args = parseArgs(argv, env);
418
+ }
419
+ catch (error) {
420
+ process.stderr.write(`${error.message}\n`);
421
+ return 2;
422
+ }
423
+ if (args.help) {
424
+ process.stdout.write(HELP);
425
+ return 0;
426
+ }
427
+ try {
428
+ switch (args.command) {
429
+ case 'version':
430
+ process.stdout.write(`${VERSION}\n`);
431
+ return 0;
432
+ case 'status': {
433
+ const snapshot = await collectStatus(args.dshHome, homedir(), process.platform);
434
+ process.stdout.write(`${formatStatus(snapshot)}\n`);
435
+ return 0;
436
+ }
437
+ case 'doctor': {
438
+ const snapshot = await collectStatus(args.dshHome, homedir(), process.platform);
439
+ const findings = await runDoctor(args.dshHome);
440
+ process.stdout.write(`${formatStatus(snapshot)}\n\n${formatFindings(findings)}\n`);
441
+ return 0;
442
+ }
443
+ case 'start':
444
+ case 'stop':
445
+ case 'restart': {
446
+ const action = args.command;
447
+ const profiles = await resolveTargetProfiles(args.dshHome, args.profile);
448
+ if (profiles.length === 0) {
449
+ process.stderr.write(`${action}:${args.dshHome} 下没有任何 profile(先执行 dsh-rsi install)\n`);
450
+ return 1;
451
+ }
452
+ const outcomes = [];
453
+ for (const profile of profiles) {
454
+ outcomes.push(await controlManagedService(process.platform, homedir(), profile, action, undefined, args.dryRun));
455
+ }
456
+ process.stdout.write(`${formatServiceOutcomes(outcomes, action, args.dryRun)}\n`);
457
+ // 任一 profile 失败即非零退出,便于脚本判定。
458
+ return outcomes.some(outcome => outcome.errors.length > 0) ? 1 : 0;
459
+ }
460
+ case 'logs': {
461
+ const profiles = await resolveTargetProfiles(args.dshHome, args.profile);
462
+ if (profiles.length === 0) {
463
+ process.stderr.write(`logs:${args.dshHome} 下没有任何 profile\n`);
464
+ return 1;
465
+ }
466
+ const collected = await collectLogs(args.dshHome, profiles, args.lines, args.errorsOnly);
467
+ process.stdout.write(`${formatLogs(collected, args.lines)}\n`);
468
+ return 0;
469
+ }
470
+ case 'web-url': {
471
+ const profiles = await resolveTargetProfiles(args.dshHome, args.profile);
472
+ if (profiles.length === 0) {
473
+ process.stderr.write(`web-url:${args.dshHome} 下没有任何 profile\n`);
474
+ return 1;
475
+ }
476
+ const entries = [];
477
+ for (const profile of profiles) {
478
+ entries.push(await resolveManagedWebUrl(process.platform, homedir(), args.dshHome, profile));
479
+ }
480
+ process.stdout.write(`${formatWebUrlResult(entries)}\n`);
481
+ // 任一 profile 解析出错时退出 1,但仍尽量打印成功的 URL。
482
+ return entries.some(entry => entry.errors.length > 0) ? 1 : 0;
483
+ }
484
+ case 'update': {
485
+ // 先升级自身:--all 下若自身升级失败就不继续动插件集合,避免用旧版 rsi
486
+ // 的判断去驱动新一轮 cohort 升级。
487
+ const report = await selfUpdate({
488
+ ...(args.targetVersion === undefined ? {} : { selector: args.targetVersion }),
489
+ dryRun: args.dryRun,
490
+ });
491
+ process.stdout.write(`${formatSelfUpdateReport(report, args.dryRun)}\n`);
492
+ if (!args.all)
493
+ return 0;
494
+ const profiles = args.profile === undefined
495
+ ? await resolveTargetProfiles(args.dshHome)
496
+ : [args.profile];
497
+ const running = findRunning(profiles);
498
+ if (running.error !== undefined) {
499
+ throw new PurgeError(`无法确认 DSH_HOME 已静止:${running.error}`);
500
+ }
501
+ const managed = await managedPids(process.platform, homedir(), profiles);
502
+ if (managed.errors.length > 0) {
503
+ throw new PurgeError(`无法确认受管服务进程:${managed.errors.join(';')}`);
504
+ }
505
+ const managedSet = new Set(managed.pids);
506
+ const external = running.active.filter(item => !managedSet.has(item.pid));
507
+ if (external.length > 0) {
508
+ const details = external.map(item => `PID ${item.pid}`).join('、');
509
+ throw new PurgeError(`检测到目标 profile 存在非受管 Host(${details})。请停止对应手工/测试 dsh 进程后重试;`
510
+ + '已注册的受管服务无需手动停止,将由生命周期事务接管。');
511
+ }
512
+ process.stdout.write(managed.pids.length > 0
513
+ ? '\n插件集合升级:已确认除受管服务外没有其它 Host;生命周期事务将安全停服、升级并恢复。\n'
514
+ : '\n插件集合升级:已确认目标 profile 无运行中 Host,正在继承现有部署场景并原地升级。\n');
515
+ const passthrough = [...args.passthrough];
516
+ if (!passthrough.includes('--operation'))
517
+ passthrough.push('--operation', 'upgrade');
518
+ if (!passthrough.includes('--confirm-dsh-home-stopped')) {
519
+ passthrough.push('--confirm-dsh-home-stopped');
520
+ }
521
+ const releaseVersion = report.installedVersion
522
+ ?? report.resolvedVersion
523
+ ?? (/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/u.test(report.selector) ? report.selector : undefined);
524
+ if (releaseVersion === undefined) {
525
+ throw new PurgeError('无法把 dsh-rsi 目标 selector 解析为精确发布版本;为避免 CLI 与安装器版本错配,未开始插件升级。');
526
+ }
527
+ return await install({
528
+ ...buildInstallOptions(args),
529
+ releaseRef: `v${releaseVersion}`,
530
+ passthrough,
531
+ });
532
+ }
533
+ case 'install': {
534
+ return await install(buildInstallOptions(args));
535
+ }
536
+ case 'reinstall': {
537
+ if (!args.dryRun && !args.yes) {
538
+ const confirmed = await confirmPurge(args, true);
539
+ if (!confirmed) {
540
+ process.stdout.write('已取消(未输入 purge)。\n');
541
+ return 1;
542
+ }
543
+ }
544
+ const report = await purge({
545
+ dshHome: args.dshHome,
546
+ home: homedir(),
547
+ ...(args.profile === undefined ? {} : { profile: args.profile }),
548
+ backup: args.backup,
549
+ keepKeychain: args.keepKeychain,
550
+ removeHost: args.removeHost,
551
+ dryRun: args.dryRun,
552
+ assumeYes: args.yes,
553
+ });
554
+ process.stdout.write(`${formatPurgeReport(args, report)}\n\n`);
555
+ return await install(buildInstallOptions(args));
556
+ }
557
+ case 'purge': {
558
+ if (!args.dryRun && !args.yes) {
559
+ const confirmed = await confirmPurge(args, false);
560
+ if (!confirmed) {
561
+ process.stdout.write('已取消(未输入 purge)。\n');
562
+ return 1;
563
+ }
564
+ }
565
+ const report = await purge({
566
+ dshHome: args.dshHome,
567
+ home: homedir(),
568
+ ...(args.profile === undefined ? {} : { profile: args.profile }),
569
+ backup: args.backup,
570
+ keepKeychain: args.keepKeychain,
571
+ removeHost: args.removeHost,
572
+ dryRun: args.dryRun,
573
+ assumeYes: args.yes,
574
+ });
575
+ process.stdout.write(`${formatPurgeReport(args, report)}\n`);
576
+ return 0;
577
+ }
578
+ default:
579
+ process.stderr.write(`未知命令:${args.command}\n`);
580
+ return 2;
581
+ }
582
+ }
583
+ catch (error) {
584
+ if (error instanceof PurgeError) {
585
+ process.stderr.write(`${args.command} 失败:${error.message}\n`);
586
+ return 1;
587
+ }
588
+ process.stderr.write(`错误:${error.stack ?? error.message}\n`);
589
+ return 1;
590
+ }
591
+ }
592
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * install 委托的外部副作用面:下载引导脚本与 stdio inherit 执行。
3
+ * 测试注入假实现,做到不联网、不真实执行安装器。
4
+ */
5
+ export interface InstallExecutor {
6
+ download: (url: string) => Promise<string>;
7
+ runInherited: (command: string, args: readonly string[], options: {
8
+ env: NodeJS.ProcessEnv;
9
+ }) => Promise<number>;
10
+ }
11
+ export declare const defaultExecutor: InstallExecutor;
12
+ export interface RunInstallOptions {
13
+ /** npm 形态:下载该 release ref(vX.Y.Z)的 install-npm.sh;local 形态:执行 checkout 内 install-local.sh。 */
14
+ mode: 'npm' | 'local';
15
+ /** local 形态的 checkout 根目录(须含 scripts/install/install-local.sh)。 */
16
+ localRepositoryRoot?: string;
17
+ /** npm 形态拉取引导脚本的 release ref;rsi-cli 默认传与自身版本一致的 vX.Y.Z。 */
18
+ releaseRef: string;
19
+ /** 原样透传给安装器的参数。 */
20
+ passthrough: readonly string[];
21
+ /** 安装器不识别 --dsh-home,统一经 DSH_HOME 环境变量传入。 */
22
+ dshHome?: string;
23
+ executor?: InstallExecutor;
24
+ }
25
+ /**
26
+ * 薄委托:dsh-rsi 不复制任何安装逻辑。
27
+ * npm 形态只负责把与自身版本同 tag 的 install-npm.sh 拉到临时目录执行,
28
+ * common.sh 的 SHA-256 自校验由脚本自身完成;local 形态直接执行 checkout 内脚本。
29
+ * 安装器 stdio 与当前终端直连,交互提示/输出不经缓冲。
30
+ * 返回安装器退出码。
31
+ */
32
+ export declare function runInstall(options: RunInstallOptions): Promise<number>;
33
+ //# sourceMappingURL=install.d.ts.map