@sfmc-bds/cli 0.2.0-beta.7 → 0.2.0-beta.9

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 (91) hide show
  1. package/dist/argv-parse.d.ts +0 -2
  2. package/dist/argv-parse.d.ts.map +1 -1
  3. package/dist/argv-parse.js +1 -5
  4. package/dist/argv-parse.js.map +2 -2
  5. package/dist/cli-gate.d.ts.map +1 -1
  6. package/dist/cli-gate.js +0 -2
  7. package/dist/cli-gate.js.map +2 -2
  8. package/dist/command-surface.d.ts +2 -12
  9. package/dist/command-surface.d.ts.map +1 -1
  10. package/dist/command-surface.js +2 -34
  11. package/dist/command-surface.js.map +2 -2
  12. package/dist/commands.d.ts.map +1 -1
  13. package/dist/commands.js +123 -10
  14. package/dist/commands.js.map +2 -2
  15. package/dist/help-text.d.ts.map +1 -1
  16. package/dist/help-text.js +1 -5
  17. package/dist/help-text.js.map +2 -2
  18. package/dist/i18n/locales/en.d.ts +27 -38
  19. package/dist/i18n/locales/en.d.ts.map +1 -1
  20. package/dist/i18n/locales/en.js +27 -41
  21. package/dist/i18n/locales/en.js.map +2 -2
  22. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  23. package/dist/i18n/locales/zh-CN.js +27 -41
  24. package/dist/i18n/locales/zh-CN.js.map +2 -2
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -4
  28. package/dist/index.js.map +2 -2
  29. package/dist/llbot-launch.d.ts +20 -0
  30. package/dist/llbot-launch.d.ts.map +1 -0
  31. package/dist/llbot-launch.js +40 -0
  32. package/dist/llbot-launch.js.map +7 -0
  33. package/dist/main.js +7 -12
  34. package/dist/main.js.map +2 -2
  35. package/dist/module-commands.d.ts +5 -18
  36. package/dist/module-commands.d.ts.map +1 -1
  37. package/dist/module-commands.js +89 -87
  38. package/dist/module-commands.js.map +2 -2
  39. package/dist/module-pack-build.d.ts.map +1 -1
  40. package/dist/module-pack-build.js +4 -0
  41. package/dist/module-pack-build.js.map +2 -2
  42. package/dist/module-toggle.d.ts +33 -0
  43. package/dist/module-toggle.d.ts.map +1 -0
  44. package/dist/module-toggle.js +28 -0
  45. package/dist/module-toggle.js.map +7 -0
  46. package/dist/node-service-probe.d.ts +18 -0
  47. package/dist/node-service-probe.d.ts.map +1 -0
  48. package/dist/node-service-probe.js +97 -0
  49. package/dist/node-service-probe.js.map +7 -0
  50. package/dist/pack-lifecycle.d.ts.map +1 -1
  51. package/dist/pack-lifecycle.js +11 -1
  52. package/dist/pack-lifecycle.js.map +2 -2
  53. package/dist/repl-windows/service-window.d.ts +1 -1
  54. package/dist/repl-windows/service-window.d.ts.map +1 -1
  55. package/dist/repl-windows/service-window.js +8 -1
  56. package/dist/repl-windows/service-window.js.map +2 -2
  57. package/dist/repl.d.ts +0 -2
  58. package/dist/repl.d.ts.map +1 -1
  59. package/dist/repl.js +0 -19
  60. package/dist/repl.js.map +2 -2
  61. package/dist/runtime.d.ts +4 -13
  62. package/dist/runtime.d.ts.map +1 -1
  63. package/dist/runtime.js +15 -27
  64. package/dist/runtime.js.map +2 -2
  65. package/dist/send-target.d.ts.map +1 -1
  66. package/dist/send-target.js +6 -2
  67. package/dist/send-target.js.map +2 -2
  68. package/dist/services.d.ts +32 -6
  69. package/dist/services.d.ts.map +1 -1
  70. package/dist/services.js +101 -16
  71. package/dist/services.js.map +2 -2
  72. package/dist/wizard.d.ts.map +1 -1
  73. package/dist/wizard.js +65 -7
  74. package/dist/wizard.js.map +2 -2
  75. package/package.json +7 -8
  76. package/dist/cmd-remote.d.ts +0 -13
  77. package/dist/cmd-remote.d.ts.map +0 -1
  78. package/dist/cmd-remote.js +0 -38
  79. package/dist/cmd-remote.js.map +0 -7
  80. package/dist/module-publish.d.ts +0 -69
  81. package/dist/module-publish.d.ts.map +0 -1
  82. package/dist/module-publish.js +0 -478
  83. package/dist/module-publish.js.map +0 -7
  84. package/dist/module-watch.d.ts +0 -32
  85. package/dist/module-watch.d.ts.map +0 -1
  86. package/dist/module-watch.js +0 -171
  87. package/dist/module-watch.js.map +0 -7
  88. package/dist/remote-agent.d.ts +0 -18
  89. package/dist/remote-agent.d.ts.map +0 -1
  90. package/dist/remote-agent.js +0 -198
  91. package/dist/remote-agent.js.map +0 -7
package/dist/index.js CHANGED
@@ -1,24 +1,23 @@
1
1
  import { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveServiceScript, resolveFetchModule, spawnService, spawnServiceSync } from "./runtime.js";
2
2
  import {
3
3
  SERVICE_NAMES,
4
+ getQqBackendMode,
4
5
  refreshServices,
5
6
  startAll,
6
7
  stopAll,
7
8
  forceStopAll,
8
9
  queryServicesRuntime,
9
- serviceStatus,
10
10
  isServiceRunning,
11
11
  onServiceStateChange,
12
12
  services,
13
13
  START_ORDER
14
14
  } from "./services.js";
15
15
  import { pushLog, onLog, getAllLogs, getRecentLogs } from "./logs.js";
16
- import { startRepl, getHelp, HELP } from "./repl.js";
16
+ import { startRepl, getHelp } from "./repl.js";
17
17
  import { t, getLocale, setLocale, initLocale } from "./i18n/index.js";
18
18
  import { runWizard } from "./wizard.js";
19
19
  import { cmdModuleList, cmdModuleInstall, cmdModuleUninstall, cmdModuleVerify, cmdModuleInfo } from "./module-commands.js";
20
20
  export {
21
- HELP,
22
21
  ROOT,
23
22
  SERVICE_NAMES,
24
23
  START_ORDER,
@@ -31,6 +30,7 @@ export {
31
30
  getAllLogs,
32
31
  getHelp,
33
32
  getLocale,
33
+ getQqBackendMode,
34
34
  getRecentLogs,
35
35
  initLocale,
36
36
  isMonorepoLayout,
@@ -44,7 +44,6 @@ export {
44
44
  resolveFetchModule,
45
45
  resolveServiceScript,
46
46
  runWizard,
47
- serviceStatus,
48
47
  services,
49
48
  setLocale,
50
49
  spawnService,
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["/**\n * sfmc/ public runtime surface (Stage J \u2014 minimum entry design)\n *\n * This is the clean API that downstream callers (CLI commands,\n * external scripts, CI tooling) consume to manage the runtime stack\n * without re-implementing process lifecycle logic.\n *\n * Design:\n * - Single process tree. sfmc/ does not spawn itself recursively \u2014 it spawns\n * the actual services (db-server, qq-bridge, bds-tools, BDS).\n * - `ROOT` from runtime.ts describes the deployment root so callers\n * can adapt (path lookup, config dir).\n * - Service lifecycle goes through ServiceRegistry (start/stop/restart/status).\n *\n * Re-exports are deliberately thin: each item is a stable contract. Internal\n * helpers (LogLine buffers, child-process piping) are NOT re-exported.\n */\n\nexport { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveServiceScript, resolveFetchModule, spawnService, spawnServiceSync, type ServiceId } from \"./runtime.js\";\n\nexport {\n SERVICE_NAMES,\n type ServiceName,\n type ServiceStatus,\n type ServiceStateEvent,\n refreshServices,\n startAll,\n stopAll,\n forceStopAll,\n queryServicesRuntime,\n serviceStatus,\n isServiceRunning,\n onServiceStateChange,\n services,\n START_ORDER,\n} from \"./services.js\";\n\nexport { pushLog, onLog, getAllLogs, getRecentLogs, type UnifiedLog, type LogLevel, type LogSource } from \"./logs.js\";\n\nexport { startRepl, getHelp, HELP } from \"./repl.js\";\nexport { t, getLocale, setLocale, initLocale, type Locale } from \"./i18n/index.js\";\nexport { runWizard } from \"./wizard.js\";\nexport { cmdModuleList, cmdModuleInstall, cmdModuleUninstall, cmdModuleVerify, cmdModuleInfo } from \"./module-commands.js\";\n"],
5
- "mappings": "AAkBA,SAAS,MAAM,kBAAkB,sBAAsB,sBAAsB,oBAAoB,cAAc,wBAAwC;AAEvJ;AAAA,EACE;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,SAAS,OAAO,YAAY,qBAAqE;AAE1G,SAAS,WAAW,SAAS,YAAY;AACzC,SAAS,GAAG,WAAW,WAAW,kBAA+B;AACjE,SAAS,iBAAiB;AAC1B,SAAS,eAAe,kBAAkB,oBAAoB,iBAAiB,qBAAqB;",
4
+ "sourcesContent": ["/**\n * sfmc/ public runtime surface (Stage J \u2014 minimum entry design)\n *\n * This is the clean API that downstream callers (CLI commands,\n * external scripts, CI tooling) consume to manage the runtime stack\n * without re-implementing process lifecycle logic.\n *\n * Design:\n * - Single process tree. sfmc/ does not spawn itself recursively \u2014 it spawns\n * the actual services (db-server, qq-bridge, bds-tools, BDS).\n * - `ROOT` from runtime.ts describes the deployment root so callers\n * can adapt (path lookup, config dir).\n * - Service lifecycle goes through ServiceRegistry (start/stop/restart/status).\n *\n * Re-exports are deliberately thin: each item is a stable contract. Internal\n * helpers (LogLine buffers, child-process piping) are NOT re-exported.\n */\n\nexport { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveServiceScript, resolveFetchModule, spawnService, spawnServiceSync, type ServiceId } from \"./runtime.js\";\n\nexport {\n SERVICE_NAMES,\n type ServiceName,\n type ServiceStatus,\n type ServiceStateEvent,\n type StartAllResult,\n type StartOutcome,\n getQqBackendMode,\n refreshServices,\n startAll,\n stopAll,\n forceStopAll,\n queryServicesRuntime,\n isServiceRunning,\n onServiceStateChange,\n services,\n START_ORDER,\n} from \"./services.js\";\n\nexport { pushLog, onLog, getAllLogs, getRecentLogs, type UnifiedLog, type LogLevel, type LogSource } from \"./logs.js\";\n\nexport { startRepl, getHelp } from \"./repl.js\";\nexport { t, getLocale, setLocale, initLocale, type Locale } from \"./i18n/index.js\";\nexport { runWizard } from \"./wizard.js\";\nexport { cmdModuleList, cmdModuleInstall, cmdModuleUninstall, cmdModuleVerify, cmdModuleInfo } from \"./module-commands.js\";\n"],
5
+ "mappings": "AAkBA,SAAS,MAAM,kBAAkB,sBAAsB,sBAAsB,oBAAoB,cAAc,wBAAwC;AAEvJ;AAAA,EACE;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,SAAS,OAAO,YAAY,qBAAqE;AAE1G,SAAS,WAAW,eAAe;AACnC,SAAS,GAAG,WAAW,WAAW,kBAA+B;AACjE,SAAS,iBAAiB;AAC1B,SAAS,eAAe,kBAAkB,oBAAoB,iBAAiB,qBAAqB;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * llbot-launch.ts — 解析 LLBot 可执行文件与工作目录
3
+ *
4
+ * 历史向导曾把 llbot_path 写成「目录」;schema 语义是可执行文件。
5
+ * 此处兼容二者,避免 spawn 目录导致 ENOENT。
6
+ */
7
+ export declare function defaultLlbotDir(platform?: NodeJS.Platform): string;
8
+ export declare function llbotExeName(platform?: NodeJS.Platform): string;
9
+ export type LlbotLaunch = {
10
+ /** spawn 用的可执行文件绝对/规范化路径 */
11
+ exe: string;
12
+ /** 工作目录 */
13
+ cwd: string;
14
+ };
15
+ /**
16
+ * @param pathRaw qq_config.llbot_path(可为 exe 或目录)
17
+ * @param cwdRaw qq_config.llbot_cwd(目录;可空)
18
+ */
19
+ export declare function resolveLlbotLaunch(pathRaw: unknown, cwdRaw: unknown): LlbotLaunch;
20
+ //# sourceMappingURL=llbot-launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llbot-launch.d.ts","sourceRoot":"","sources":["../src/llbot-launch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wBAAgB,eAAe,CAAC,QAAQ,kBAAmB,GAAG,MAAM,CAEnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,kBAAmB,GAAG,MAAM,CAEhE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,CA+BjF"}
@@ -0,0 +1,40 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ function defaultLlbotDir(platform = process.platform) {
5
+ return platform === "win32" ? "D:\\LLBot-CLI-win-x64" : path.join(os.homedir(), "LLBot");
6
+ }
7
+ function llbotExeName(platform = process.platform) {
8
+ return platform === "win32" ? "llbot.exe" : "llbot";
9
+ }
10
+ function resolveLlbotLaunch(pathRaw, cwdRaw) {
11
+ const exeName = llbotExeName();
12
+ const raw = String(pathRaw ?? "").trim();
13
+ const cwdHint = String(cwdRaw ?? "").trim();
14
+ const looksLikeDir = (p) => {
15
+ try {
16
+ if (fs.existsSync(p) && fs.statSync(p).isDirectory()) return true;
17
+ } catch {
18
+ }
19
+ const base = path.basename(p);
20
+ if (/^llbot(\.exe)?$/i.test(base)) return false;
21
+ return !path.extname(p);
22
+ };
23
+ if (!raw) {
24
+ const cwd2 = cwdHint || defaultLlbotDir();
25
+ return { exe: path.join(cwd2, exeName), cwd: cwd2 };
26
+ }
27
+ if (looksLikeDir(raw)) {
28
+ const cwd2 = raw;
29
+ return { exe: path.join(cwd2, exeName), cwd: cwdHint || cwd2 };
30
+ }
31
+ const exe = raw;
32
+ const cwd = cwdHint || path.dirname(exe) || defaultLlbotDir();
33
+ return { exe, cwd };
34
+ }
35
+ export {
36
+ defaultLlbotDir,
37
+ llbotExeName,
38
+ resolveLlbotLaunch
39
+ };
40
+ //# sourceMappingURL=llbot-launch.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/llbot-launch.ts"],
4
+ "sourcesContent": ["/**\n * llbot-launch.ts \u2014 \u89E3\u6790 LLBot \u53EF\u6267\u884C\u6587\u4EF6\u4E0E\u5DE5\u4F5C\u76EE\u5F55\n *\n * \u5386\u53F2\u5411\u5BFC\u66FE\u628A llbot_path \u5199\u6210\u300C\u76EE\u5F55\u300D\uFF1Bschema \u8BED\u4E49\u662F\u53EF\u6267\u884C\u6587\u4EF6\u3002\n * \u6B64\u5904\u517C\u5BB9\u4E8C\u8005\uFF0C\u907F\u514D spawn \u76EE\u5F55\u5BFC\u81F4 ENOENT\u3002\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport function defaultLlbotDir(platform = process.platform): string {\n return platform === \"win32\" ? \"D:\\\\LLBot-CLI-win-x64\" : path.join(os.homedir(), \"LLBot\");\n}\n\nexport function llbotExeName(platform = process.platform): string {\n return platform === \"win32\" ? \"llbot.exe\" : \"llbot\";\n}\n\nexport type LlbotLaunch = {\n /** spawn \u7528\u7684\u53EF\u6267\u884C\u6587\u4EF6\u7EDD\u5BF9/\u89C4\u8303\u5316\u8DEF\u5F84 */\n exe: string;\n /** \u5DE5\u4F5C\u76EE\u5F55 */\n cwd: string;\n};\n\n/**\n * @param pathRaw qq_config.llbot_path\uFF08\u53EF\u4E3A exe \u6216\u76EE\u5F55\uFF09\n * @param cwdRaw qq_config.llbot_cwd\uFF08\u76EE\u5F55\uFF1B\u53EF\u7A7A\uFF09\n */\nexport function resolveLlbotLaunch(pathRaw: unknown, cwdRaw: unknown): LlbotLaunch {\n const exeName = llbotExeName();\n const raw = String(pathRaw ?? \"\").trim();\n const cwdHint = String(cwdRaw ?? \"\").trim();\n\n const looksLikeDir = (p: string): boolean => {\n try {\n if (fs.existsSync(p) && fs.statSync(p).isDirectory()) return true;\n } catch {\n /* ignore */\n }\n // \u5C1A\u4E0D\u5B58\u5728\u65F6\uFF1A\u65E0\u6269\u5C55\u540D\u4E14\u4E0D\u4EE5 exe \u540D\u7ED3\u5C3E \u2192 \u6309\u76EE\u5F55\u5904\u7406\n const base = path.basename(p);\n if (/^llbot(\\.exe)?$/i.test(base)) return false;\n return !path.extname(p);\n };\n\n if (!raw) {\n const cwd = cwdHint || defaultLlbotDir();\n return { exe: path.join(cwd, exeName), cwd };\n }\n\n if (looksLikeDir(raw)) {\n const cwd = raw;\n return { exe: path.join(cwd, exeName), cwd: cwdHint || cwd };\n }\n\n // \u660E\u786E\u662F\u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84\n const exe = raw;\n const cwd = cwdHint || path.dirname(exe) || defaultLlbotDir();\n return { exe, cwd };\n}\n"],
5
+ "mappings": "AAOA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,SAAS,gBAAgB,WAAW,QAAQ,UAAkB;AACnE,SAAO,aAAa,UAAU,0BAA0B,KAAK,KAAK,GAAG,QAAQ,GAAG,OAAO;AACzF;AAEO,SAAS,aAAa,WAAW,QAAQ,UAAkB;AAChE,SAAO,aAAa,UAAU,cAAc;AAC9C;AAaO,SAAS,mBAAmB,SAAkB,QAA8B;AACjF,QAAM,UAAU,aAAa;AAC7B,QAAM,MAAM,OAAO,WAAW,EAAE,EAAE,KAAK;AACvC,QAAM,UAAU,OAAO,UAAU,EAAE,EAAE,KAAK;AAE1C,QAAM,eAAe,CAAC,MAAuB;AAC3C,QAAI;AACF,UAAI,GAAG,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,YAAY,EAAG,QAAO;AAAA,IAC/D,QAAQ;AAAA,IAER;AAEA,UAAM,OAAO,KAAK,SAAS,CAAC;AAC5B,QAAI,mBAAmB,KAAK,IAAI,EAAG,QAAO;AAC1C,WAAO,CAAC,KAAK,QAAQ,CAAC;AAAA,EACxB;AAEA,MAAI,CAAC,KAAK;AACR,UAAMA,OAAM,WAAW,gBAAgB;AACvC,WAAO,EAAE,KAAK,KAAK,KAAKA,MAAK,OAAO,GAAG,KAAAA,KAAI;AAAA,EAC7C;AAEA,MAAI,aAAa,GAAG,GAAG;AACrB,UAAMA,OAAM;AACZ,WAAO,EAAE,KAAK,KAAK,KAAKA,MAAK,OAAO,GAAG,KAAK,WAAWA,KAAI;AAAA,EAC7D;AAGA,QAAM,MAAM;AACZ,QAAM,MAAM,WAAW,KAAK,QAAQ,GAAG,KAAK,gBAAgB;AAC5D,SAAO,EAAE,KAAK,IAAI;AACpB;",
6
+ "names": ["cwd"]
7
+ }
package/dist/main.js CHANGED
@@ -1,20 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import process from "node:process";
3
- import {
4
- mapPacksSubAlias,
5
- parseGlobalArgv,
6
- resolveModuleShorthandSub
7
- } from "./argv-parse.js";
8
- import { cmdRemote } from "./cmd-remote.js";
3
+ import { mapPacksSubAlias, parseGlobalArgv } from "./argv-parse.js";
9
4
  import { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from "./commands.js";
10
5
  import { gateModuleSub, gatePacksSub, gateTopLevel } from "./cli-gate.js";
6
+ import { resolveModuleTopShorthand } from "./command-surface.js";
11
7
  import { cmdDebug } from "./debug-command.js";
12
8
  import { initLocale, stripLangArgs, t } from "./i18n/index.js";
13
9
  import { cmdLocale } from "./locale-command.js";
14
10
  import { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from "./module-commands.js";
15
- import { startRemoteAgent } from "./remote-agent.js";
16
11
  import { getHelp, playWelcomeAnimation, startRepl } from "./repl.js";
17
12
  import { ROOT } from "./runtime.js";
13
+ import { setArgvDaemonize } from "./services.js";
18
14
  import { c } from "./theme.js";
19
15
  import { dispatchPacksCommand, isPacksCommand } from "./world-packs.js";
20
16
  const MODE = "argv";
@@ -32,6 +28,9 @@ async function main() {
32
28
  const stripped = stripLangArgs(process.argv.slice(2));
33
29
  initLocale({ root: ROOT, flag: stripped.lang });
34
30
  const { packsMode, args } = parseGlobalArgv(stripped.args);
31
+ if (args.length > 0 || packsMode) {
32
+ setArgvDaemonize(true);
33
+ }
35
34
  if (args.length === 0 && !packsMode) {
36
35
  const { isRuntimeInitialized } = await import("./runtime.js");
37
36
  if (!isRuntimeInitialized()) {
@@ -42,7 +41,6 @@ async function main() {
42
41
  }
43
42
  const warn = await scanAndWarnUnknown();
44
43
  if (warn) console.log(warn);
45
- startRemoteAgent();
46
44
  await startRepl();
47
45
  return;
48
46
  }
@@ -59,7 +57,7 @@ async function main() {
59
57
  const topGate = gateTopLevel(cmd, MODE);
60
58
  if (topGate) deny(topGate);
61
59
  }
62
- const moduleSub = resolveModuleShorthandSub(cmd);
60
+ const moduleSub = resolveModuleTopShorthand(cmd);
63
61
  if (moduleSub) {
64
62
  const g = gateModuleSub(moduleSub, MODE);
65
63
  if (g) deny(g);
@@ -134,9 +132,6 @@ async function main() {
134
132
  await runWizard();
135
133
  break;
136
134
  }
137
- case "remote":
138
- console.log(await cmdRemote(rest, { daemonAfterEnroll: true }));
139
- break;
140
135
  default:
141
136
  if (isModuleCommand(cmd)) {
142
137
  const [sub, ...subRest] = rest;
package/dist/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\nimport process from \"node:process\";\nimport {\n mapPacksSubAlias,\n parseGlobalArgv,\n resolveModuleShorthandSub,\n} from \"./argv-parse.js\";\nimport { cmdRemote } from \"./cmd-remote.js\";\nimport { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { initLocale, stripLangArgs, t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from \"./module-commands.js\";\nimport { startRemoteAgent } from \"./remote-agent.js\";\nimport { getHelp, playWelcomeAnimation, startRepl } from \"./repl.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst MODE = \"argv\" as const;\n\nasync function printVersion(): Promise<void> {\n await playWelcomeAnimation();\n}\n\nfunction printUsage(): void {\n console.log(`${getHelp(\"argv\")}`);\n}\n\nfunction deny(msg: string): never {\n console.log(msg);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n const stripped = stripLangArgs(process.argv.slice(2));\n initLocale({ root: ROOT, flag: stripped.lang });\n const { packsMode, args } = parseGlobalArgv(stripped.args);\n\n if (args.length === 0 && !packsMode) {\n const { isRuntimeInitialized } = await import(\"./runtime.js\");\n if (!isRuntimeInitialized()) {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n const { refreshServices } = await import(\"./services.js\");\n refreshServices();\n }\n const warn = await scanAndWarnUnknown();\n if (warn) console.log(warn);\n startRemoteAgent();\n await startRepl();\n return;\n }\n\n if (packsMode) {\n const [subRaw, ...subRest] = args;\n const sub = mapPacksSubAlias(subRaw);\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n process.exit(0);\n }\n\n const [cmd, ...rest] = args;\n\n if (cmd && ![\"--help\", \"-h\", \"--version\", \"-v\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, MODE);\n if (topGate) deny(topGate);\n }\n\n const moduleSub = resolveModuleShorthandSub(cmd);\n if (moduleSub) {\n const g = gateModuleSub(moduleSub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(moduleSub, rest));\n process.exit(0);\n }\n\n switch (cmd) {\n case \"--help\":\n case \"-h\":\n case \"help\":\n printUsage();\n break;\n case \"--version\":\n case \"-v\":\n await printVersion();\n break;\n case \"locale\":\n case \"lang\":\n console.log(cmdLocale(rest));\n break;\n case \"debug\":\n console.log(await cmdDebug(rest));\n break;\n case \"status\":\n console.log(await cmdStatus());\n break;\n case \"logs\":\n case \"log\":\n /* channel=repl\uFF1A\u6B63\u5E38\u7531 gateTopLevel \u62E6\u622A\uFF1B\u6B64\u5904\u515C\u5E95 */\n deny(gateTopLevel(\"logs\", MODE) ?? c.yellow(t(\"cli.replOnly\", { cmd: \"logs\" })));\n break;\n case \"start\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdStart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.start.usage\")));\n }\n break;\n case \"stop\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStopAll());\n } else if (rest[0]) {\n console.log(await cmdStop(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.stop.usage\")));\n }\n break;\n case \"restart\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n await cmdStopAll();\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdRestart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.restart.usage\")));\n }\n break;\n case \"update\":\n console.log(await cmdUpdate(rest));\n break;\n case \"packs\":\n case \"addon\": {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n case \"init\": {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n break;\n }\n case \"remote\":\n console.log(await cmdRemote(rest, { daemonAfterEnroll: true }));\n break;\n default:\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gateModuleSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(sub, subRest));\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n console.log(c.red(t(\"common.unknownCommand\", { cmd: cmd ?? \"\" })));\n printUsage();\n process.exit(1);\n }\n process.exit(0);\n}\n\nmain().catch((err) => {\n console.error(c.red(err?.message ? t(\"common.error\", { message: err.message }) : t(\"common.fatal\")));\n process.exit(1);\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["#!/usr/bin/env node\nimport process from \"node:process\";\nimport { mapPacksSubAlias, parseGlobalArgv } from \"./argv-parse.js\";\nimport { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { gateModuleSub, gatePacksSub, gateTopLevel } from \"./cli-gate.js\";\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\nimport { cmdDebug } from \"./debug-command.js\";\nimport { initLocale, stripLangArgs, t } from \"./i18n/index.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from \"./module-commands.js\";\nimport { getHelp, playWelcomeAnimation, startRepl } from \"./repl.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { setArgvDaemonize } from \"./services.js\";\nimport { c } from \"./theme.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\n\nconst MODE = \"argv\" as const;\n\nasync function printVersion(): Promise<void> {\n await playWelcomeAnimation();\n}\n\nfunction printUsage(): void {\n console.log(`${getHelp(\"argv\")}`);\n}\n\nfunction deny(msg: string): never {\n console.log(msg);\n process.exit(1);\n}\n\nasync function main(): Promise<void> {\n const stripped = stripLangArgs(process.argv.slice(2));\n initLocale({ root: ROOT, flag: stripped.lang });\n const { packsMode, args } = parseGlobalArgv(stripped.args);\n\n if (args.length > 0 || packsMode) {\n setArgvDaemonize(true);\n }\n\n if (args.length === 0 && !packsMode) {\n const { isRuntimeInitialized } = await import(\"./runtime.js\");\n if (!isRuntimeInitialized()) {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n const { refreshServices } = await import(\"./services.js\");\n refreshServices();\n }\n const warn = await scanAndWarnUnknown();\n if (warn) console.log(warn);\n await startRepl();\n return;\n }\n\n if (packsMode) {\n const [subRaw, ...subRest] = args;\n const sub = mapPacksSubAlias(subRaw);\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n process.exit(0);\n }\n\n const [cmd, ...rest] = args;\n\n if (cmd && ![\"--help\", \"-h\", \"--version\", \"-v\"].includes(cmd)) {\n const topGate = gateTopLevel(cmd, MODE);\n if (topGate) deny(topGate);\n }\n\n const moduleSub = resolveModuleTopShorthand(cmd);\n if (moduleSub) {\n const g = gateModuleSub(moduleSub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(moduleSub, rest));\n process.exit(0);\n }\n\n switch (cmd) {\n case \"--help\":\n case \"-h\":\n case \"help\":\n printUsage();\n break;\n case \"--version\":\n case \"-v\":\n await printVersion();\n break;\n case \"locale\":\n case \"lang\":\n console.log(cmdLocale(rest));\n break;\n case \"debug\":\n console.log(await cmdDebug(rest));\n break;\n case \"status\":\n console.log(await cmdStatus());\n break;\n case \"logs\":\n case \"log\":\n /* channel=repl\uFF1A\u6B63\u5E38\u7531 gateTopLevel \u62E6\u622A\uFF1B\u6B64\u5904\u515C\u5E95 */\n deny(gateTopLevel(\"logs\", MODE) ?? c.yellow(t(\"cli.replOnly\", { cmd: \"logs\" })));\n break;\n case \"start\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdStart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.start.usage\")));\n }\n break;\n case \"stop\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n console.log(await cmdStopAll());\n } else if (rest[0]) {\n console.log(await cmdStop(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.stop.usage\")));\n }\n break;\n case \"restart\":\n if (rest[0] === \"-all\" || rest[0] === \"all\" || rest[0] === \"--all\") {\n await cmdStopAll();\n console.log(await cmdStartAll());\n } else if (rest[0]) {\n console.log(await cmdRestart(rest[0]));\n } else {\n console.log(c.yellow(t(\"svc.restart.usage\")));\n }\n break;\n case \"update\":\n console.log(await cmdUpdate(rest));\n break;\n case \"packs\":\n case \"addon\": {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n case \"init\": {\n const { runWizard } = await import(\"./wizard.js\");\n await runWizard();\n break;\n }\n default:\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gateModuleSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchModuleCommand(sub, subRest));\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = rest;\n const g = gatePacksSub(sub, MODE);\n if (g) deny(g);\n console.log(await dispatchPacksCommand(sub, subRest));\n break;\n }\n console.log(c.red(t(\"common.unknownCommand\", { cmd: cmd ?? \"\" })));\n printUsage();\n process.exit(1);\n }\n process.exit(0);\n}\n\nmain().catch((err) => {\n console.error(c.red(err?.message ? t(\"common.error\", { message: err.message }) : t(\"common.fatal\")));\n process.exit(1);\n});\n"],
5
+ "mappings": ";AACA,OAAO,aAAa;AACpB,SAAS,kBAAkB,uBAAuB;AAClD,SAAS,YAAY,UAAU,aAAa,WAAW,SAAS,YAAY,iBAAiB;AAC7F,SAAS,eAAe,cAAc,oBAAoB;AAC1D,SAAS,iCAAiC;AAC1C,SAAS,gBAAgB;AACzB,SAAS,YAAY,eAAe,SAAS;AAC7C,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB,iBAAiB,0BAA0B;AAC3E,SAAS,SAAS,sBAAsB,iBAAiB;AACzD,SAAS,YAAY;AACrB,SAAS,wBAAwB;AACjC,SAAS,SAAS;AAClB,SAAS,sBAAsB,sBAAsB;AAErD,MAAM,OAAO;AAEb,eAAe,eAA8B;AAC3C,QAAM,qBAAqB;AAC7B;AAEA,SAAS,aAAmB;AAC1B,UAAQ,IAAI,GAAG,QAAQ,MAAM,CAAC,EAAE;AAClC;AAEA,SAAS,KAAK,KAAoB;AAChC,UAAQ,IAAI,GAAG;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,eAAe,OAAsB;AACnC,QAAM,WAAW,cAAc,QAAQ,KAAK,MAAM,CAAC,CAAC;AACpD,aAAW,EAAE,MAAM,MAAM,MAAM,SAAS,KAAK,CAAC;AAC9C,QAAM,EAAE,WAAW,KAAK,IAAI,gBAAgB,SAAS,IAAI;AAEzD,MAAI,KAAK,SAAS,KAAK,WAAW;AAChC,qBAAiB,IAAI;AAAA,EACvB;AAEA,MAAI,KAAK,WAAW,KAAK,CAAC,WAAW;AACnC,UAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,cAAc;AAC5D,QAAI,CAAC,qBAAqB,GAAG;AAC3B,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAa;AAChD,YAAM,UAAU;AAChB,YAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,eAAe;AACxD,sBAAgB;AAAA,IAClB;AACA,UAAM,OAAO,MAAM,mBAAmB;AACtC,QAAI,KAAM,SAAQ,IAAI,IAAI;AAC1B,UAAM,UAAU;AAChB;AAAA,EACF;AAEA,MAAI,WAAW;AACb,UAAM,CAAC,QAAQ,GAAG,OAAO,IAAI;AAC7B,UAAM,MAAM,iBAAiB,MAAM;AACnC,UAAM,IAAI,aAAa,KAAK,IAAI;AAChC,QAAI,EAAG,MAAK,CAAC;AACb,YAAQ,IAAI,MAAM,qBAAqB,KAAK,OAAO,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AAEvB,MAAI,OAAO,CAAC,CAAC,UAAU,MAAM,aAAa,IAAI,EAAE,SAAS,GAAG,GAAG;AAC7D,UAAM,UAAU,aAAa,KAAK,IAAI;AACtC,QAAI,QAAS,MAAK,OAAO;AAAA,EAC3B;AAEA,QAAM,YAAY,0BAA0B,GAAG;AAC/C,MAAI,WAAW;AACb,UAAM,IAAI,cAAc,WAAW,IAAI;AACvC,QAAI,EAAG,MAAK,CAAC;AACb,YAAQ,IAAI,MAAM,sBAAsB,WAAW,IAAI,CAAC;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,YAAM,aAAa;AACnB;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,IAAI,UAAU,IAAI,CAAC;AAC3B;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,MAAM,SAAS,IAAI,CAAC;AAChC;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,MAAM,UAAU,CAAC;AAC7B;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAEH,WAAK,aAAa,QAAQ,IAAI,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC;AAC/E;AAAA,IACF,KAAK;AACH,UAAI,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,SAAS;AAClE,gBAAQ,IAAI,MAAM,YAAY,CAAC;AAAA,MACjC,WAAW,KAAK,CAAC,GAAG;AAClB,gBAAQ,IAAI,MAAM,SAAS,KAAK,CAAC,CAAC,CAAC;AAAA,MACrC,OAAO;AACL,gBAAQ,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAAA,MAC5C;AACA;AAAA,IACF,KAAK;AACH,UAAI,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,SAAS;AAClE,gBAAQ,IAAI,MAAM,WAAW,CAAC;AAAA,MAChC,WAAW,KAAK,CAAC,GAAG;AAClB,gBAAQ,IAAI,MAAM,QAAQ,KAAK,CAAC,CAAC,CAAC;AAAA,MACpC,OAAO;AACL,gBAAQ,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAAA,MAC3C;AACA;AAAA,IACF,KAAK;AACH,UAAI,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,SAAS;AAClE,cAAM,WAAW;AACjB,gBAAQ,IAAI,MAAM,YAAY,CAAC;AAAA,MACjC,WAAW,KAAK,CAAC,GAAG;AAClB,gBAAQ,IAAI,MAAM,WAAW,KAAK,CAAC,CAAC,CAAC;AAAA,MACvC,OAAO;AACL,gBAAQ,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;AAAA,MAC9C;AACA;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,MAAM,UAAU,IAAI,CAAC;AACjC;AAAA,IACF,KAAK;AAAA,IACL,KAAK,SAAS;AACZ,YAAM,CAAC,KAAK,GAAG,OAAO,IAAI;AAC1B,YAAM,IAAI,aAAa,KAAK,IAAI;AAChC,UAAI,EAAG,MAAK,CAAC;AACb,cAAQ,IAAI,MAAM,qBAAqB,KAAK,OAAO,CAAC;AACpD;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,EAAE,UAAU,IAAI,MAAM,OAAO,aAAa;AAChD,YAAM,UAAU;AAChB;AAAA,IACF;AAAA,IACA;AACE,UAAI,gBAAgB,GAAG,GAAG;AACxB,cAAM,CAAC,KAAK,GAAG,OAAO,IAAI;AAC1B,cAAM,IAAI,cAAc,KAAK,IAAI;AACjC,YAAI,EAAG,MAAK,CAAC;AACb,gBAAQ,IAAI,MAAM,sBAAsB,KAAK,OAAO,CAAC;AACrD;AAAA,MACF;AACA,UAAI,eAAe,GAAG,GAAG;AACvB,cAAM,CAAC,KAAK,GAAG,OAAO,IAAI;AAC1B,cAAM,IAAI,aAAa,KAAK,IAAI;AAChC,YAAI,EAAG,MAAK,CAAC;AACb,gBAAQ,IAAI,MAAM,qBAAqB,KAAK,OAAO,CAAC;AACpD;AAAA,MACF;AACA,cAAQ,IAAI,EAAE,IAAI,EAAE,yBAAyB,EAAE,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC;AACjE,iBAAW;AACX,cAAQ,KAAK,CAAC;AAAA,EAClB;AACA,UAAQ,KAAK,CAAC;AAChB;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,gBAAgB,EAAE,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AACnG,UAAQ,KAAK,CAAC;AAChB,CAAC;",
6
6
  "names": []
7
7
  }
@@ -7,27 +7,18 @@
7
7
  */
8
8
  import { type CommandMode } from "./command-surface.js";
9
9
  import { type CliResult } from "./cli-result.js";
10
- /** 顶层命令名(主名 + 短别名),供 HELP / 补全 / 分发共用。 */
10
+ /** 顶层命令名(主名 + 短别名),供帮助 / 补全 / 分发共用。 */
11
11
  export declare const MODULE_CMD_NAMES: readonly ["module", "mod"];
12
12
  export type ModuleCmdName = (typeof MODULE_CMD_NAMES)[number];
13
13
  /** 判断是否为 module 顶层命令(含别名);避免 main/repl 再硬编码 case。 */
14
14
  export declare function isModuleCommand(cmd: string | undefined): cmd is ModuleCmdName;
15
- /** 染色后的 HELP 前缀,避免 HELP 硬编码 module/mod。 */
16
- export declare function paintModuleCmdAlias(paint: (name: string) => string): string;
17
- /** @deprecated 使用 listVisibleModuleSubs(mode);保留全集供调试。 */
18
- export declare const ALL_MODULE_SUBCOMMANDS: readonly ["list", "search", "install", "uninstall", "verify", "info", "enable", "disable", "build", "reload"];
19
15
  /** 开发者样式子命令(蓝标,非门禁)。 */
20
16
  export declare const DEV_ACCENT_MODULE_SUBCOMMANDS: readonly ["build", "reload"];
21
- /** @deprecated 使用 ALL_MODULE_SUBCOMMANDS 或 listVisibleModuleSubs。 */
22
- export declare const MODULE_SUBCOMMANDS: readonly ["list", "search", "install", "uninstall", "verify", "info", "enable", "disable", "build", "reload"];
23
- /** @deprecated 使用 DEV_ACCENT_MODULE_SUBCOMMANDS / isDevAccentModuleSub。 */
24
- export declare const DEV_MODULE_SUBCOMMANDS: readonly ["build", "reload"];
25
- export type ModuleSubcommand = (typeof ALL_MODULE_SUBCOMMANDS)[number];
26
17
  /** 当前通道下可见的 module 子命令(自动补全 / usage)。 */
27
18
  export declare function getVisibleModuleSubcommands(mode: CommandMode): readonly string[];
28
19
  /** sub 是否为开发者蓝标(help 着色)。 */
29
20
  export declare function isDeveloperSubcommand(sub: string | undefined): boolean;
30
- /** Usage 行主名|别名(与 MODULE_CMD_NAMES 同源,避免与 HELP 漂移)。 */
21
+ /** Usage 行主名|别名(与 MODULE_CMD_NAMES 同源,避免与帮助文案漂移)。 */
31
22
  export declare function moduleUsage(mode?: CommandMode): string;
32
23
  export declare function cmdModuleList(_args: string[]): Promise<string>;
33
24
  /**
@@ -49,18 +40,14 @@ export declare function cmdModuleEnable(args: string[]): Promise<CliResult>;
49
40
  export declare function cmdModuleDisable(args: string[]): Promise<CliResult>;
50
41
  export declare function cmdModuleInstall(args: string[]): Promise<string>;
51
42
  export declare function cmdModuleUninstall(args: string[]): Promise<string>;
52
- /**
53
- * `sfmc mod test` — 委托模块仓的 test runner(node --test + @sfmc-bds/sdk/testing)。
54
- * 解析 --from local[:path] 规则与 watch 一致;缺省 cwd。
55
- * 透传 npm test:让模块仓的 `scripts.test` 自己决定怎么跑(node --test / tsx / vitest 等)。
56
- */
57
- export declare function cmdModuleTest(args: string[]): Promise<string>;
58
43
  /**
59
44
  * 统一分发 module/mod 子命令 —— CLI(`main.ts`)与 REPL(`repl.ts`)共用,
60
45
  * 避免两处 switch 漂移。
61
46
  *
62
- * 通道门禁(external/repl)由调用方在 dispatch 前经 command-surface 判定;
47
+ * 通道门禁(argv/repl)由调用方在 dispatch 前经 command-surface 判定;
63
48
  * 本函数只负责子命令路由。`remove` 作为 uninstall 的同义别名保留。
49
+ *
50
+ * 作者向 test/watch/publish 已迁至 VS Code 扩展与 @sfmc-bds/devkit。
64
51
  */
65
52
  export declare function dispatchModuleCommand(sub: string | undefined, args: string[]): Promise<string>;
66
53
  /** 同步枚举已安装模块 id,供 REPL Tab 补全(不读 fingerprint,尽量轻量)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"module-commands.d.ts","sourceRoot":"","sources":["../src/module-commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAYvE,0CAA0C;AAC1C,eAAO,MAAM,gBAAgB,YAAI,QAAQ,EAAE,KAAK,CAAU,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,IAAI,aAAa,CAE7E;AAED,2CAA2C;AAC3C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAE3E;AAED,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,YACjC,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,CACA,CAAC;AAEX,wBAAwB;AACxB,eAAO,MAAM,6BAA6B,YAAI,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE1E,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,+GAAyB,CAAC;AAEzD,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,8BAAgC,CAAC;AAEpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,yCAAyC;AACzC,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,MAAM,EAAE,CAEhF;AAED,6BAA6B;AAC7B,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAK9D;AAmFD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCpE;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAO1D;AAKD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DrE;AAKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BnE;AAKD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAerE;AAkDD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAIxE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAIzE;AAqCD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDtE;AAKD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxE;AAuBD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA2CnE;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCpG;AAED,uDAAuD;AACvD,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAWrD"}
1
+ {"version":3,"file":"module-commands.d.ts","sourceRoot":"","sources":["../src/module-commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAmBvE,uCAAuC;AACvC,eAAO,MAAM,gBAAgB,YAAI,QAAQ,EAAE,KAAK,CAAU,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,IAAI,aAAa,CAE7E;AAED,wBAAwB;AACxB,eAAO,MAAM,6BAA6B,YAAI,OAAO,EAAE,QAAQ,CAAU,CAAC;AAE1E,yCAAyC;AACzC,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,MAAM,EAAE,CAEhF;AAED,6BAA6B;AAC7B,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,IAAI,GAAE,WAAoB,GAAG,MAAM,CAK9D;AAmFD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCpE;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAO1D;AAKD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DrE;AAKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BnE;AAKD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAerE;AAqHD,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAIxE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAIzE;AAqCD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDtE;AAKD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxE;AAuBD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCpG;AAED,uDAAuD;AACvD,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAWrD"}
@@ -2,7 +2,12 @@ import fs from "node:fs/promises";
2
2
  import { existsSync, lstatSync, readdirSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { spawn } from "node:child_process";
5
- import { configPath, modulePath, readJson } from "@sfmc-bds/sdk/node/config";
5
+ import {
6
+ configPath,
7
+ modulePath,
8
+ readJson,
9
+ writeJson
10
+ } from "@sfmc-bds/sdk/node/config";
6
11
  import {
7
12
  isDevAccentModuleSub,
8
13
  listVisibleModuleSubs
@@ -12,6 +17,11 @@ import { t } from "./i18n/index.js";
12
17
  import { c } from "./theme.js";
13
18
  import { ROOT, resolveFetchModule } from "./runtime.js";
14
19
  import { dirFingerprint } from "./module-fingerprint.js";
20
+ import {
21
+ applyLockEnabled,
22
+ finalizeToggle,
23
+ resolveToggleTarget
24
+ } from "./module-toggle.js";
15
25
  import {
16
26
  DEFAULT_REGISTRY_REPO,
17
27
  DEFAULT_REGISTRY_TAG,
@@ -22,24 +32,7 @@ const MODULE_CMD_NAMES = ["module", "mod"];
22
32
  function isModuleCommand(cmd) {
23
33
  return !!cmd && MODULE_CMD_NAMES.includes(cmd);
24
34
  }
25
- function paintModuleCmdAlias(paint) {
26
- return MODULE_CMD_NAMES.map((name) => paint(name)).join("/");
27
- }
28
- const ALL_MODULE_SUBCOMMANDS = [
29
- "list",
30
- "search",
31
- "install",
32
- "uninstall",
33
- "verify",
34
- "info",
35
- "enable",
36
- "disable",
37
- "build",
38
- "reload"
39
- ];
40
35
  const DEV_ACCENT_MODULE_SUBCOMMANDS = ["build", "reload"];
41
- const MODULE_SUBCOMMANDS = ALL_MODULE_SUBCOMMANDS;
42
- const DEV_MODULE_SUBCOMMANDS = DEV_ACCENT_MODULE_SUBCOMMANDS;
43
36
  function getVisibleModuleSubcommands(mode) {
44
37
  return listVisibleModuleSubs(mode);
45
38
  }
@@ -260,11 +253,45 @@ async function cmdModuleVerify(args) {
260
253
  function readDbConfig() {
261
254
  return readJson(configPath(ROOT, "db_config.json")) ?? {};
262
255
  }
263
- async function postModuleToggle(id, action) {
256
+ function moduleLockPath() {
257
+ return modulePath(path.join(ROOT, "modules"), "module-lock.json");
258
+ }
259
+ function catalogPathOnDisk() {
260
+ return modulePath(path.join(ROOT, "modules"), "catalog.json");
261
+ }
262
+ function buildToggleCandidates(installed) {
263
+ const catalog = readJson(catalogPathOnDisk()) ?? {};
264
+ const rows = Array.isArray(catalog.modules) ? catalog.modules : [];
265
+ const byLogical = /* @__PURE__ */ new Map();
266
+ for (const raw of rows) {
267
+ if (!raw || typeof raw !== "object") continue;
268
+ const id = String(raw.id || "").trim();
269
+ if (id) byLogical.set(id, raw);
270
+ }
271
+ return installed.map((m) => {
272
+ const logicalId = typeof m.manifest?.id === "string" && m.manifest.id ? m.manifest.id : m.id;
273
+ const raw = byLogical.get(logicalId);
274
+ const configKeyRaw = raw ? String(raw.configKey || raw.config_key || "").trim() : "";
275
+ const canDisable = raw ? raw.canDisable !== false : true;
276
+ const out = { logicalId, folderId: m.id, canDisable };
277
+ if (configKeyRaw) out.configKey = configKeyRaw;
278
+ return out;
279
+ });
280
+ }
281
+ function writeLocalModuleEnabled(logicalId, enabled) {
282
+ const lockPath = moduleLockPath();
283
+ const lock = readJson(lockPath) ?? {
284
+ version: 1,
285
+ modules: {}
286
+ };
287
+ applyLockEnabled(lock, logicalId, enabled);
288
+ writeJson(lockPath, lock);
289
+ }
290
+ async function notifyDbToggle(logicalId, action) {
264
291
  const cfg = readDbConfig();
265
292
  const port = cfg.db_port ?? 3001;
266
293
  const token = cfg.http_auth || "";
267
- const url = `http://127.0.0.1:${port}/api/sfmc/modules/${encodeURIComponent(id)}/${action}`;
294
+ const url = `http://127.0.0.1:${port}/api/sfmc/modules/${encodeURIComponent(logicalId)}/${action}`;
268
295
  let res;
269
296
  try {
270
297
  res = await fetch(url, {
@@ -275,9 +302,7 @@ async function postModuleToggle(id, action) {
275
302
  }
276
303
  });
277
304
  } catch (err) {
278
- return failResult(
279
- c.red(t("mod.dbUnreachable", { url, message: err.message }))
280
- );
305
+ return { ok: false, reason: "unreachable", detail: err.message };
281
306
  }
282
307
  const text = await res.text();
283
308
  let body;
@@ -288,24 +313,51 @@ async function postModuleToggle(id, action) {
288
313
  }
289
314
  if (!res.ok) {
290
315
  const err = body?.error ?? `HTTP ${res.status}`;
291
- return failResult(c.red(t("mod.toggleFailed", { action, id, err })));
316
+ return { ok: false, reason: "http", detail: err };
317
+ }
318
+ if (body?.success === false) {
319
+ return { ok: false, reason: "http", detail: text };
320
+ }
321
+ return { ok: true };
322
+ }
323
+ async function cmdModuleToggle(query, action) {
324
+ const installed = await scanInstalled();
325
+ const target = resolveToggleTarget(query, buildToggleCandidates(installed));
326
+ if (!target) {
327
+ return failResult(c.red(t("mod.notInstalled", { id: query })));
328
+ }
329
+ if (action === "disable" && !target.canDisable) {
330
+ return failResult(c.red(t("mod.cannotDisable", { id: target.logicalId })));
292
331
  }
293
- const ok = body?.success !== false;
294
- if (ok) {
295
- const label = action === "enable" ? t("mod.action.enabled") : t("mod.action.disabled");
296
- return okResult(c.green(t("mod.toggleOk", { label, id })));
332
+ const enabled = action === "enable";
333
+ try {
334
+ writeLocalModuleEnabled(target.logicalId, enabled);
335
+ } catch (err) {
336
+ return failResult(
337
+ c.red(t("mod.toggleLockFailed", { id: target.logicalId, message: err.message }))
338
+ );
339
+ }
340
+ const notify = await notifyDbToggle(target.logicalId, action);
341
+ const fin = finalizeToggle(true, notify);
342
+ const label = action === "enable" ? t("mod.action.enabled") : t("mod.action.disabled");
343
+ const head = c.green(t("mod.toggleOk", { label, id: target.logicalId }));
344
+ if (!fin.warnNotify) {
345
+ return okResult(head);
297
346
  }
298
- return failResult(c.red(t("mod.toggleBadBody", { action, id, text })));
347
+ const detail = notify.ok === false ? notify.detail ?? notify.reason : "";
348
+ const warn = c.yellow(t("mod.toggleDbSkipped", { detail }));
349
+ return okResult(`${head}
350
+ ${warn}`);
299
351
  }
300
352
  async function cmdModuleEnable(args) {
301
353
  const id = args[0];
302
354
  if (!id) return failResult(c.yellow(t("mod.enable.usage")));
303
- return postModuleToggle(id, "enable");
355
+ return cmdModuleToggle(id, "enable");
304
356
  }
305
357
  async function cmdModuleDisable(args) {
306
358
  const id = args[0];
307
359
  if (!id) return failResult(c.yellow(t("mod.disable.usage")));
308
- return postModuleToggle(id, "disable");
360
+ return cmdModuleToggle(id, "disable");
309
361
  }
310
362
  function validateFromScheme(from) {
311
363
  if (from === "local" || from.startsWith("local:") || from.startsWith("dir:") || from.startsWith("npm:") || from.startsWith("tgz:") || from.startsWith("zip:") || from.startsWith("github:")) {
@@ -404,46 +456,6 @@ function parseFlags(args) {
404
456
  }
405
457
  return flags;
406
458
  }
407
- async function cmdModuleTest(args) {
408
- let fromRaw = null;
409
- const passthrough = [];
410
- for (let i = 0; i < args.length; i++) {
411
- const a = args[i];
412
- if (a === "--from") {
413
- fromRaw = args[++i] ?? null;
414
- } else if (a?.startsWith("--from=")) {
415
- fromRaw = a.slice("--from=".length);
416
- } else if (a === "--help" || a === "-h") {
417
- return c.dim("\u7528\u6CD5: mod test [--from local[:<path>]] [-- <args>]\n \u900F\u4F20\u7ED9\u6A21\u5757\u4ED3\u7684 npm test\u3002");
418
- } else {
419
- passthrough.push(a);
420
- }
421
- }
422
- const { resolveLocalModuleRoot } = await import("./module-watch.js");
423
- const cwd = resolveLocalModuleRoot({ from: fromRaw, cwd: process.cwd() });
424
- if (!existsSync(cwd)) {
425
- return c.red(`[mod test] \u8DEF\u5F84\u4E0D\u5B58\u5728: ${cwd}`);
426
- }
427
- if (!existsSync(path.join(cwd, "package.json"))) {
428
- return c.yellow(`[mod test] \u672A\u627E\u5230 package.json: ${cwd}
429
- \u63D0\u793A\uFF1A\u8FDB\u5165\u6A21\u5757\u4ED3\u6839\u76EE\u5F55\uFF0C\u6216\u7528 --from local:<path> \u6307\u5411\u3002`);
430
- }
431
- const isWin = process.platform === "win32";
432
- const cmd = isWin ? "cmd.exe" : "npm";
433
- const subArgs = isWin ? ["/c", "npm", "test", "--", ...passthrough] : ["test", "--", ...passthrough];
434
- return new Promise((resolve) => {
435
- const proc = spawn(cmd, subArgs, {
436
- cwd,
437
- stdio: "inherit",
438
- env: process.env
439
- });
440
- proc.on("exit", (code) => {
441
- resolve(code === 0 ? "" : `
442
- [mod test] exit ${code}`);
443
- });
444
- proc.on("error", (e) => resolve(c.red(`[mod test] spawn failed: ${e.message}`)));
445
- });
446
- }
447
459
  async function dispatchModuleCommand(sub, args) {
448
460
  switch (sub) {
449
461
  case "list":
@@ -471,17 +483,12 @@ async function dispatchModuleCommand(sub, args) {
471
483
  const { cmdModuleReload } = await import("./module-pack-build.js");
472
484
  return cmdModuleReload(args);
473
485
  }
474
- case "watch": {
475
- const { cmdModuleWatch } = await import("./module-watch.js");
476
- return cmdModuleWatch(args);
477
- }
478
- case "test": {
479
- return cmdModuleTest(args);
480
- }
481
- case "publish": {
482
- const { cmdModulePublish } = await import("./module-publish.js");
483
- return cmdModulePublish(args);
484
- }
486
+ case "test":
487
+ case "watch":
488
+ case "publish":
489
+ return c.yellow(
490
+ `[mod ${sub}] \u5DF2\u79FB\u81F3 VS Code/Cursor \u6269\u5C55\u300CSFMC Module\u300D\u4E0E @sfmc-bds/devkit\uFF1B\u8FD0\u7EF4\u8BF7\u7528 mod build|reload|install\u3002`
491
+ );
485
492
  default:
486
493
  return c.yellow(moduleUsage());
487
494
  }
@@ -496,18 +503,14 @@ function listInstalledModuleIdsSync() {
496
503
  }
497
504
  }
498
505
  export {
499
- ALL_MODULE_SUBCOMMANDS,
500
506
  DEV_ACCENT_MODULE_SUBCOMMANDS,
501
- DEV_MODULE_SUBCOMMANDS,
502
507
  MODULE_CMD_NAMES,
503
- MODULE_SUBCOMMANDS,
504
508
  cmdModuleDisable,
505
509
  cmdModuleEnable,
506
510
  cmdModuleInfo,
507
511
  cmdModuleInstall,
508
512
  cmdModuleList,
509
513
  cmdModuleSearch,
510
- cmdModuleTest,
511
514
  cmdModuleUninstall,
512
515
  cmdModuleVerify,
513
516
  dispatchModuleCommand,
@@ -516,7 +519,6 @@ export {
516
519
  isModuleCommand,
517
520
  listInstalledModuleIdsSync,
518
521
  moduleUsage,
519
- paintModuleCmdAlias,
520
522
  scanAndWarnUnknown
521
523
  };
522
524
  //# sourceMappingURL=module-commands.js.map