@sfmc-bds/cli 0.2.0-beta.0 → 0.2.0-beta.10

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 (183) hide show
  1. package/dist/argv-parse.d.ts +11 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +28 -0
  4. package/dist/argv-parse.js.map +7 -0
  5. package/dist/cli-gate.d.ts +11 -0
  6. package/dist/cli-gate.d.ts.map +1 -0
  7. package/dist/cli-gate.js +46 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/command-palette.d.ts +61 -0
  10. package/dist/command-palette.d.ts.map +1 -0
  11. package/dist/command-palette.js +352 -0
  12. package/dist/command-palette.js.map +7 -0
  13. package/dist/command-surface.d.ts +85 -0
  14. package/dist/command-surface.d.ts.map +1 -0
  15. package/dist/command-surface.js +292 -0
  16. package/dist/command-surface.js.map +7 -0
  17. package/dist/commands-reload.js +2 -2
  18. package/dist/commands-reload.js.map +2 -2
  19. package/dist/commands.d.ts +1 -1
  20. package/dist/commands.d.ts.map +1 -1
  21. package/dist/commands.js +196 -21
  22. package/dist/commands.js.map +2 -2
  23. package/dist/debug-command.d.ts +5 -0
  24. package/dist/debug-command.d.ts.map +1 -0
  25. package/dist/debug-command.js +118 -0
  26. package/dist/debug-command.js.map +7 -0
  27. package/dist/help-text.d.ts +3 -0
  28. package/dist/help-text.d.ts.map +1 -0
  29. package/dist/help-text.js +160 -0
  30. package/dist/help-text.js.map +7 -0
  31. package/dist/i18n/locales/en.d.ts +103 -89
  32. package/dist/i18n/locales/en.d.ts.map +1 -1
  33. package/dist/i18n/locales/en.js +105 -91
  34. package/dist/i18n/locales/en.js.map +2 -2
  35. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  36. package/dist/i18n/locales/zh-CN.js +138 -118
  37. package/dist/i18n/locales/zh-CN.js.map +2 -2
  38. package/dist/index.d.ts +2 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -4
  41. package/dist/index.js.map +2 -2
  42. package/dist/llbot-launch.d.ts +20 -0
  43. package/dist/llbot-launch.d.ts.map +1 -0
  44. package/dist/llbot-launch.js +40 -0
  45. package/dist/llbot-launch.js.map +7 -0
  46. package/dist/log-filter.d.ts +69 -0
  47. package/dist/log-filter.d.ts.map +1 -0
  48. package/dist/log-filter.js +150 -0
  49. package/dist/log-filter.js.map +7 -0
  50. package/dist/logs.d.ts +29 -7
  51. package/dist/logs.d.ts.map +1 -1
  52. package/dist/logs.js +164 -72
  53. package/dist/logs.js.map +3 -3
  54. package/dist/main.js +55 -46
  55. package/dist/main.js.map +2 -2
  56. package/dist/module-commands.d.ts +17 -40
  57. package/dist/module-commands.d.ts.map +1 -1
  58. package/dist/module-commands.js +129 -85
  59. package/dist/module-commands.js.map +2 -2
  60. package/dist/module-pack-build.d.ts +10 -0
  61. package/dist/module-pack-build.d.ts.map +1 -0
  62. package/dist/module-pack-build.js +434 -0
  63. package/dist/module-pack-build.js.map +7 -0
  64. package/dist/module-toggle.d.ts +33 -0
  65. package/dist/module-toggle.d.ts.map +1 -0
  66. package/dist/module-toggle.js +28 -0
  67. package/dist/module-toggle.js.map +7 -0
  68. package/dist/node-service-probe.d.ts +18 -0
  69. package/dist/node-service-probe.d.ts.map +1 -0
  70. package/dist/node-service-probe.js +97 -0
  71. package/dist/node-service-probe.js.map +7 -0
  72. package/dist/pack-lifecycle.d.ts +1 -1
  73. package/dist/pack-lifecycle.d.ts.map +1 -1
  74. package/dist/pack-lifecycle.js +14 -4
  75. package/dist/pack-lifecycle.js.map +2 -2
  76. package/dist/pack-update/index.d.ts +18 -0
  77. package/dist/pack-update/index.d.ts.map +1 -0
  78. package/dist/pack-update/index.js +113 -0
  79. package/dist/pack-update/index.js.map +7 -0
  80. package/dist/registry.d.ts +7 -4
  81. package/dist/registry.d.ts.map +1 -1
  82. package/dist/registry.js +15 -3
  83. package/dist/registry.js.map +2 -2
  84. package/dist/repl-windows/format-display.d.ts +10 -0
  85. package/dist/repl-windows/format-display.d.ts.map +1 -0
  86. package/dist/repl-windows/format-display.js +57 -0
  87. package/dist/repl-windows/format-display.js.map +7 -0
  88. package/dist/repl-windows/host.d.ts +60 -0
  89. package/dist/repl-windows/host.d.ts.map +1 -0
  90. package/dist/repl-windows/host.js +179 -0
  91. package/dist/repl-windows/host.js.map +7 -0
  92. package/dist/repl-windows/index.d.ts +9 -0
  93. package/dist/repl-windows/index.d.ts.map +1 -0
  94. package/dist/repl-windows/index.js +13 -0
  95. package/dist/repl-windows/index.js.map +7 -0
  96. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  97. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  98. package/dist/repl-windows/logs-filter-window.js +77 -0
  99. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  100. package/dist/repl-windows/service-window.d.ts +4 -0
  101. package/dist/repl-windows/service-window.d.ts.map +1 -0
  102. package/dist/repl-windows/service-window.js +35 -0
  103. package/dist/repl-windows/service-window.js.map +7 -0
  104. package/dist/repl-windows/types.d.ts +56 -0
  105. package/dist/repl-windows/types.d.ts.map +1 -0
  106. package/dist/repl-windows/types.js +1 -0
  107. package/dist/repl-windows/types.js.map +7 -0
  108. package/dist/repl.d.ts +6 -9
  109. package/dist/repl.d.ts.map +1 -1
  110. package/dist/repl.js +698 -427
  111. package/dist/repl.js.map +3 -3
  112. package/dist/runtime.d.ts +6 -13
  113. package/dist/runtime.d.ts.map +1 -1
  114. package/dist/runtime.js +23 -28
  115. package/dist/runtime.js.map +2 -2
  116. package/dist/send-target.d.ts +11 -0
  117. package/dist/send-target.d.ts.map +1 -0
  118. package/dist/send-target.js +42 -0
  119. package/dist/send-target.js.map +7 -0
  120. package/dist/services.d.ts +50 -4
  121. package/dist/services.d.ts.map +1 -1
  122. package/dist/services.js +244 -20
  123. package/dist/services.js.map +2 -2
  124. package/dist/theme.js +1 -1
  125. package/dist/theme.js.map +2 -2
  126. package/dist/wizard.d.ts.map +1 -1
  127. package/dist/wizard.js +76 -16
  128. package/dist/wizard.js.map +2 -2
  129. package/dist/world-packs.d.ts +15 -0
  130. package/dist/world-packs.d.ts.map +1 -1
  131. package/dist/world-packs.js +90 -87
  132. package/dist/world-packs.js.map +2 -2
  133. package/package.json +24 -21
  134. package/scripts/module-install/check-modules.mjs +204 -0
  135. package/scripts/module-install/fetch-module.mjs +1007 -0
  136. package/scripts/module-install/install-resolver.test.mjs +48 -0
  137. package/scripts/module-install/lib/catalog.mjs +96 -0
  138. package/scripts/module-install/lib/io.mjs +37 -0
  139. package/scripts/module-install/lib/link-from.mjs +80 -0
  140. package/scripts/module-install/lib/lock.mjs +78 -0
  141. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  142. package/scripts/module-install/lib/packages.mjs +142 -0
  143. package/scripts/module-install/lib/paths.mjs +48 -0
  144. package/scripts/module-install/lib/registry-index.mjs +50 -0
  145. package/scripts/module-install/link-local.test.mjs +51 -0
  146. package/scripts/module-install/local-resolver.test.mjs +51 -0
  147. package/scripts/module-install/registry-index.test.mjs +28 -0
  148. package/dist/module-wizard.d.ts +0 -14
  149. package/dist/module-wizard.d.ts.map +0 -1
  150. package/dist/module-wizard.js +0 -313
  151. package/dist/module-wizard.js.map +0 -7
  152. package/dist/pack-update/bindings.d.ts +0 -12
  153. package/dist/pack-update/bindings.d.ts.map +0 -1
  154. package/dist/pack-update/bindings.js +0 -64
  155. package/dist/pack-update/bindings.js.map +0 -7
  156. package/dist/pack-update/config.d.ts +0 -22
  157. package/dist/pack-update/config.d.ts.map +0 -1
  158. package/dist/pack-update/config.js +0 -141
  159. package/dist/pack-update/config.js.map +0 -7
  160. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  161. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  162. package/dist/pack-update/providers/curseforge.js +0 -209
  163. package/dist/pack-update/providers/curseforge.js.map +0 -7
  164. package/dist/pack-update/providers/index.d.ts +0 -16
  165. package/dist/pack-update/providers/index.d.ts.map +0 -1
  166. package/dist/pack-update/providers/index.js +0 -37
  167. package/dist/pack-update/providers/index.js.map +0 -7
  168. package/dist/pack-update/service.d.ts +0 -21
  169. package/dist/pack-update/service.d.ts.map +0 -1
  170. package/dist/pack-update/service.js +0 -567
  171. package/dist/pack-update/service.js.map +0 -7
  172. package/dist/pack-update/types.d.ts +0 -126
  173. package/dist/pack-update/types.d.ts.map +0 -1
  174. package/dist/pack-update/types.js +0 -8
  175. package/dist/pack-update/types.js.map +0 -7
  176. package/dist/pack-update/version-policy.d.ts +0 -80
  177. package/dist/pack-update/version-policy.d.ts.map +0 -1
  178. package/dist/pack-update/version-policy.js +0 -216
  179. package/dist/pack-update/version-policy.js.map +0 -7
  180. package/dist/remote-agent.d.ts +0 -18
  181. package/dist/remote-agent.d.ts.map +0 -1
  182. package/dist/remote-agent.js +0 -196
  183. package/dist/remote-agent.js.map +0 -7
package/dist/main.js CHANGED
@@ -1,29 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
  import process from "node:process";
3
- import pkg from "../package.json" with { type: "json" };
4
- import { cmdLogs, cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from "./commands.js";
5
- import { getHelp, startRepl } from "./repl.js";
6
- import { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from "./module-commands.js";
7
- import { dispatchPacksCommand, isPacksCommand } from "./world-packs.js";
8
- import { disableRemoteAgent, enrollRemoteAgent, remoteStatus, startRemoteAgent, stopRemoteAgent } from "./remote-agent.js";
9
- import { cmdLocale } from "./locale-command.js";
3
+ import { mapPacksSubAlias, parseGlobalArgv } from "./argv-parse.js";
4
+ import { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from "./commands.js";
5
+ import { gateModuleSub, gatePacksSub, gateTopLevel } from "./cli-gate.js";
6
+ import { resolveModuleTopShorthand } from "./command-surface.js";
7
+ import { cmdDebug } from "./debug-command.js";
10
8
  import { initLocale, stripLangArgs, t } from "./i18n/index.js";
9
+ import { cmdLocale } from "./locale-command.js";
10
+ import { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from "./module-commands.js";
11
+ import { getHelp, playWelcomeAnimation, startRepl } from "./repl.js";
11
12
  import { ROOT } from "./runtime.js";
13
+ import { setArgvDaemonize } from "./services.js";
12
14
  import { c } from "./theme.js";
13
- function printVersion() {
14
- console.log(`${c.text(`\u282A\u2841\u286F\u2801`)}
15
- ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}
16
- ${c.text(`\u2877\u2847\u284E\u2801`)} ${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}
17
- ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`https://github.com/DogeLakeDev/ScriptsForMinecraftServer`)}`);
15
+ import { dispatchPacksCommand, isPacksCommand } from "./world-packs.js";
16
+ const MODE = "argv";
17
+ async function printVersion() {
18
+ await playWelcomeAnimation();
18
19
  }
19
20
  function printUsage() {
20
- console.log(`${getHelp()}`);
21
+ console.log(`${getHelp("argv")}`);
22
+ }
23
+ function deny(msg) {
24
+ console.log(msg);
25
+ process.exit(1);
21
26
  }
22
27
  async function main() {
23
28
  const stripped = stripLangArgs(process.argv.slice(2));
24
29
  initLocale({ root: ROOT, flag: stripped.lang });
25
- const args = stripped.args;
26
- if (args.length === 0) {
30
+ const { packsMode, args } = parseGlobalArgv(stripped.args);
31
+ if (args.length > 0 || packsMode) {
32
+ setArgvDaemonize(true);
33
+ }
34
+ if (args.length === 0 && !packsMode) {
27
35
  const { isRuntimeInitialized } = await import("./runtime.js");
28
36
  if (!isRuntimeInitialized()) {
29
37
  const { runWizard } = await import("./wizard.js");
@@ -33,11 +41,29 @@ async function main() {
33
41
  }
34
42
  const warn = await scanAndWarnUnknown();
35
43
  if (warn) console.log(warn);
36
- startRemoteAgent();
37
44
  await startRepl();
38
45
  return;
39
46
  }
47
+ if (packsMode) {
48
+ const [subRaw, ...subRest] = args;
49
+ const sub = mapPacksSubAlias(subRaw);
50
+ const g = gatePacksSub(sub, MODE);
51
+ if (g) deny(g);
52
+ console.log(await dispatchPacksCommand(sub, subRest));
53
+ process.exit(0);
54
+ }
40
55
  const [cmd, ...rest] = args;
56
+ if (cmd && !["--help", "-h", "--version", "-v"].includes(cmd)) {
57
+ const topGate = gateTopLevel(cmd, MODE);
58
+ if (topGate) deny(topGate);
59
+ }
60
+ const moduleSub = resolveModuleTopShorthand(cmd);
61
+ if (moduleSub) {
62
+ const g = gateModuleSub(moduleSub, MODE);
63
+ if (g) deny(g);
64
+ console.log(await dispatchModuleCommand(moduleSub, rest));
65
+ process.exit(0);
66
+ }
41
67
  switch (cmd) {
42
68
  case "--help":
43
69
  case "-h":
@@ -46,21 +72,22 @@ async function main() {
46
72
  break;
47
73
  case "--version":
48
74
  case "-v":
49
- printVersion();
75
+ await printVersion();
50
76
  break;
51
77
  case "locale":
52
78
  case "lang":
53
79
  console.log(cmdLocale(rest));
54
80
  break;
81
+ case "debug":
82
+ console.log(await cmdDebug(rest));
83
+ break;
55
84
  case "status":
56
- console.log(cmdStatus());
85
+ console.log(await cmdStatus());
57
86
  break;
58
87
  case "logs":
59
- case "log": {
60
- const out = cmdLogs(rest);
61
- if (out) console.log(out);
88
+ case "log":
89
+ deny(gateTopLevel("logs", MODE) ?? c.yellow(t("cli.replOnly", { cmd: "logs" })));
62
90
  break;
63
- }
64
91
  case "start":
65
92
  if (rest[0] === "-all" || rest[0] === "all" || rest[0] === "--all") {
66
93
  console.log(await cmdStartAll());
@@ -95,6 +122,8 @@ async function main() {
95
122
  case "packs":
96
123
  case "addon": {
97
124
  const [sub, ...subRest] = rest;
125
+ const g = gatePacksSub(sub, MODE);
126
+ if (g) deny(g);
98
127
  console.log(await dispatchPacksCommand(sub, subRest));
99
128
  break;
100
129
  }
@@ -103,38 +132,18 @@ async function main() {
103
132
  await runWizard();
104
133
  break;
105
134
  }
106
- case "remote": {
107
- const [subcommand, ...remoteArgs] = rest;
108
- if (subcommand === "enroll" && remoteArgs[0] && remoteArgs[1]) {
109
- const name = remoteArgs[2] ?? process.env.COMPUTERNAME ?? "sfmc-agent";
110
- const agentId = await enrollRemoteAgent(remoteArgs[0], remoteArgs[1], name);
111
- console.log(t("remote.enrolled", { id: agentId }));
112
- startRemoteAgent();
113
- const exit = () => {
114
- stopRemoteAgent();
115
- process.exit(0);
116
- };
117
- process.once("SIGINT", exit);
118
- process.once("SIGTERM", exit);
119
- await new Promise(() => void 0);
120
- } else if (subcommand === "status") {
121
- console.log(JSON.stringify(remoteStatus(), null, 2));
122
- } else if (subcommand === "disable") {
123
- disableRemoteAgent();
124
- console.log(t("remote.disabled"));
125
- } else {
126
- console.log(t("remote.usage"));
127
- }
128
- break;
129
- }
130
135
  default:
131
136
  if (isModuleCommand(cmd)) {
132
137
  const [sub, ...subRest] = rest;
138
+ const g = gateModuleSub(sub, MODE);
139
+ if (g) deny(g);
133
140
  console.log(await dispatchModuleCommand(sub, subRest));
134
141
  break;
135
142
  }
136
143
  if (isPacksCommand(cmd)) {
137
144
  const [sub, ...subRest] = rest;
145
+ const g = gatePacksSub(sub, MODE);
146
+ if (g) deny(g);
138
147
  console.log(await dispatchPacksCommand(sub, subRest));
139
148
  break;
140
149
  }
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 pkg from \"../package.json\" with { type: \"json\" };\nimport { cmdLogs, cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from \"./commands.js\";\nimport { getHelp, startRepl } from \"./repl.js\";\nimport { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from \"./module-commands.js\";\nimport { dispatchPacksCommand, isPacksCommand } from \"./world-packs.js\";\nimport { disableRemoteAgent, enrollRemoteAgent, remoteStatus, startRemoteAgent, stopRemoteAgent } from \"./remote-agent.js\";\nimport { cmdLocale } from \"./locale-command.js\";\nimport { initLocale, stripLangArgs, t } from \"./i18n/index.js\";\nimport { ROOT } from \"./runtime.js\";\nimport { c } from \"./theme.js\";\n\nfunction printVersion(): void {\n /* \u6B64\u524D\u6A21\u677F\u5B57\u7B26\u4E32\u672A\u5199\u5165 stdout,\u5BFC\u81F4 `sfmc --version` \u65E0\u8F93\u51FA\u3002 */\n console.log(`${c.text(`\u282A\u2841\u286F\u2801`)}\n ${c.text(`\u2812\u2801\u2803`)}${c.purple(`\u2804`)}\n ${c.text(`\u2877\u2847\u284E\u2801`)} ${c.text(`S`)}${c.dim(`cripts`)} ${c.text(`F`)}${c.dim(`or`)} ${c.text(`M`)}${c.dim(`ine`)}${c.text(`c`)}${c.dim(`raft Server`)} v${pkg.version}\n ${c.text(`\u2803\u2803\u2811\u2802`)} ${c.dim(`https://github.com/DogeLakeDev/ScriptsForMinecraftServer`)}`);\n}\n\nfunction printUsage(): void {\n console.log(`${getHelp()}`);\n}\n\nasync function main(): Promise<void> {\n const stripped = stripLangArgs(process.argv.slice(2));\n initLocale({ root: ROOT, flag: stripped.lang });\n const args = stripped.args;\n\n if (args.length === 0) {\n /* \u9996\u6B21\u8FD0\u884C:\u4EE5 runtime.json#initialized_at \u4E3A\u51C6(\u975E db_config \u662F\u5426\u5B58\u5728)\u3002\n * \u914D\u7F6E\u9AA8\u67B6\u7531 services.ensureJsonConfig \u5728\u542F\u52A8\u65F6\u521B\u5EFA,\u4E0D\u80FD\u518D\u5F53\u300C\u672A\u521D\u59CB\u5316\u300D\u4FE1\u53F7\u3002 */\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 /* Print yellow warnings for modules from outside the first-party registry.\n * Best-effort: registry unreachable \u2192 no warning, no failure. */\n const warn = await scanAndWarnUnknown();\n if (warn) console.log(warn);\n startRemoteAgent();\n await startRepl();\n return;\n }\n\n const [cmd, ...rest] = args;\n\n switch (cmd) {\n case \"--help\":\n case \"-h\":\n case \"help\":\n printUsage();\n break;\n case \"--version\":\n case \"-v\":\n printVersion();\n break;\n case \"locale\":\n case \"lang\":\n console.log(cmdLocale(rest));\n break;\n case \"status\":\n console.log(cmdStatus());\n break;\n case \"logs\":\n case \"log\": {\n const out = cmdLogs(rest);\n if (out) console.log(out);\n break;\n }\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 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 const [subcommand, ...remoteArgs] = rest;\n if (subcommand === \"enroll\" && remoteArgs[0] && remoteArgs[1]) {\n const name = remoteArgs[2] ?? process.env.COMPUTERNAME ?? \"sfmc-agent\";\n const agentId = await enrollRemoteAgent(remoteArgs[0], remoteArgs[1], name);\n console.log(t(\"remote.enrolled\", { id: agentId }));\n startRemoteAgent();\n const exit = (): void => {\n stopRemoteAgent();\n process.exit(0);\n };\n process.once(\"SIGINT\", exit);\n process.once(\"SIGTERM\", exit);\n /* keep alive so the WS loop can run; ctrl-c exits. */\n await new Promise(() => undefined);\n } else if (subcommand === \"status\") {\n console.log(JSON.stringify(remoteStatus(), null, 2));\n } else if (subcommand === \"disable\") {\n disableRemoteAgent();\n console.log(t(\"remote.disabled\"));\n } else {\n console.log(t(\"remote.usage\"));\n }\n break;\n }\n default:\n /* module/mod \u522B\u540D\u53EA\u7EF4\u62A4 MODULE_CMD_NAMES,\u907F\u514D main/repl case \u94FE\u6F02\u79FB(OCP)\u3002 */\n if (isModuleCommand(cmd)) {\n const [sub, ...subRest] = rest;\n console.log(await dispatchModuleCommand(sub, subRest));\n break;\n }\n if (isPacksCommand(cmd)) {\n const [sub, ...subRest] = rest;\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": "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",
6
6
  "names": []
7
7
  }
@@ -3,43 +3,23 @@
3
3
  * already on disk under `modules/packages/<id>/`.
4
4
  *
5
5
  * 顶层命令别名:`module` / `mod`(由 main.ts / repl.ts 共同识别)。
6
- *
7
- * Subcommands:
8
- * list List every installed module (reads each
9
- * modules/packages/<id>/sapi/manifest.json).
10
- * Marks registry-known modules with `●` and
11
- * modules from an unknown publisher with `?`.
12
- * search [id] 拉取 first-party registry 列表;带 id 则查该模块 registry info
13
- * info <id> Show one module's manifest + on-disk fingerprint
14
- * verify [id] Recompute the SHA-256 fingerprint of installed
15
- * modules (id = one; no id = all)
16
- * install <id> Wrapper around `tools/fetch-module.mjs install`.
17
- * If `--from` is omitted, the first-party registry
18
- * is consulted (Tanya7z/sfmc-modules).
19
- * `--link` 透传:dir 源用 junction/symlink(开发期)。
20
- * uninstall <id> Remove packages/<id>/ + catalog/lock via fetch-module
21
- * enable <id> POST /api/sfmc/modules/:id/enable on db-server
22
- * disable <id> POST /api/sfmc/modules/:id/disable on db-server
23
- * create 交互式脚手架(sfmc-modules/packages + 可选 link)
24
- * link [id] 无 id:交互选择;有 id:install --link(自动探测旁路 sfmc-modules)
25
- * dev link + enable + build + deploy 一键本地联调
26
- *
27
- * The CLI never connects to the network for local ops.
28
- * `search`/`install`/`uninstall` 需要网络(或本地 cache / --from)。
29
- * enable/disable go through db-server REST so module-lock.json stays consistent.
6
+ * 子命令通道门禁见 command-surface.ts(dispatch 前由 main/repl 判定)。
30
7
  */
31
- /** 顶层命令名(主名 + 短别名),供 HELP / 补全 / 分发共用。 */
8
+ import { type CommandMode } from "./command-surface.js";
9
+ import { type CliResult } from "./cli-result.js";
10
+ /** 顶层命令名(主名 + 短别名),供帮助 / 补全 / 分发共用。 */
32
11
  export declare const MODULE_CMD_NAMES: readonly ["module", "mod"];
33
12
  export type ModuleCmdName = (typeof MODULE_CMD_NAMES)[number];
34
13
  /** 判断是否为 module 顶层命令(含别名);避免 main/repl 再硬编码 case。 */
35
14
  export declare function isModuleCommand(cmd: string | undefined): cmd is ModuleCmdName;
36
- /** 染色后的 HELP 前缀,避免 HELP 硬编码 module/mod。 */
37
- export declare function paintModuleCmdAlias(paint: (name: string) => string): string;
38
- /** 对外展示与 Tab 补全用的子命令列表(不含 remove 等同义别名)。 */
39
- export declare const MODULE_SUBCOMMANDS: readonly ["list", "search", "install", "uninstall", "verify", "info", "enable", "disable", "build", "reload", "create", "link", "dev"];
40
- import { type CliResult } from "./cli-result.js";
41
- /** Usage 行主名|别名( MODULE_CMD_NAMES 同源,避免与 HELP 漂移) */
42
- export declare function moduleUsage(): string;
15
+ /** 开发者样式子命令(蓝标,非门禁)。 */
16
+ export declare const DEV_ACCENT_MODULE_SUBCOMMANDS: readonly ["build", "reload"];
17
+ /** 当前通道下可见的 module 子命令(自动补全 / usage)。 */
18
+ export declare function getVisibleModuleSubcommands(mode: CommandMode): readonly string[];
19
+ /** sub 是否为开发者蓝标(help 着色)。 */
20
+ export declare function isDeveloperSubcommand(sub: string | undefined): boolean;
21
+ /** Usage 行主名|别名(与 MODULE_CMD_NAMES 同源,避免与帮助文案漂移) */
22
+ export declare function moduleUsage(mode?: CommandMode): string;
43
23
  export declare function cmdModuleList(_args: string[]): Promise<string>;
44
24
  /**
45
25
  * Walk `modules/packages/<id>/` and print a one-line yellow warning for each
@@ -59,18 +39,15 @@ export declare function cmdModuleVerify(args: string[]): Promise<string>;
59
39
  export declare function cmdModuleEnable(args: string[]): Promise<CliResult>;
60
40
  export declare function cmdModuleDisable(args: string[]): Promise<CliResult>;
61
41
  export declare function cmdModuleInstall(args: string[]): Promise<string>;
62
- /**
63
- * `mod link [id] [--from dir:…]`
64
- * - 有 id:等价 `install <id> --link`,缺省 --from 时自动拼旁路 packages/<id>
65
- * - 无 id:进入交互选择(@clack/prompts)
66
- */
67
- export declare function cmdModuleLink(args: string[]): Promise<string>;
68
42
  export declare function cmdModuleUninstall(args: string[]): Promise<string>;
69
43
  /**
70
44
  * 统一分发 module/mod 子命令 —— CLI(`main.ts`)与 REPL(`repl.ts`)共用,
71
- * 避免两处 switch 漂移(例如原先 REPL 缺 enable/disable)。
45
+ * 避免两处 switch 漂移。
46
+ *
47
+ * 通道门禁(argv/repl)由调用方在 dispatch 前经 command-surface 判定;
48
+ * 本函数只负责子命令路由。`remove` 作为 uninstall 的同义别名保留。
72
49
  *
73
- * `remove` 作为 uninstall 的同义别名保留。
50
+ * 作者向 test/watch/publish 已迁至 VS Code 扩展与 @sfmc-bds/devkit。
74
51
  */
75
52
  export declare function dispatchModuleCommand(sub: string | undefined, args: string[]): Promise<string>;
76
53
  /** 同步枚举已安装模块 id,供 REPL Tab 补全(不读 fingerprint,尽量轻量)。 */
@@ -1 +1 @@
1
- {"version":3,"file":"module-commands.d.ts","sourceRoot":"","sources":["../src/module-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,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,CAG3E;AAED,4CAA4C;AAC5C,eAAO,MAAM,kBAAkB,YAC7B,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,EACX,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,KAAK,CACG,CAAC;AAOX,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAYvE,uDAAuD;AACvD,wBAAgB,WAAW,IAAI,MAAM,CAKpC;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;AAKD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDtE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBnE;AAKD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BxE;AAuBD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCpG;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"}
@@ -1,45 +1,48 @@
1
- const MODULE_CMD_NAMES = ["module", "mod"];
2
- function isModuleCommand(cmd) {
3
- return !!cmd && MODULE_CMD_NAMES.includes(cmd);
4
- }
5
- function paintModuleCmdAlias(paint) {
6
- return MODULE_CMD_NAMES.map((name) => paint(name)).join("/");
7
- }
8
- const MODULE_SUBCOMMANDS = [
9
- "list",
10
- "search",
11
- "install",
12
- "uninstall",
13
- "verify",
14
- "info",
15
- "enable",
16
- "disable",
17
- "build",
18
- "reload",
19
- "create",
20
- "link",
21
- "dev"
22
- ];
23
1
  import fs from "node:fs/promises";
24
- import { existsSync, readdirSync } from "node:fs";
2
+ import { existsSync, lstatSync, readdirSync } from "node:fs";
25
3
  import path from "node:path";
26
4
  import { spawn } from "node:child_process";
27
- 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";
11
+ import {
12
+ isDevAccentModuleSub,
13
+ listVisibleModuleSubs
14
+ } from "./command-surface.js";
28
15
  import { failResult, okResult } from "./cli-result.js";
29
16
  import { t } from "./i18n/index.js";
30
17
  import { c } from "./theme.js";
31
18
  import { ROOT, resolveFetchModule } from "./runtime.js";
32
19
  import { dirFingerprint } from "./module-fingerprint.js";
20
+ import {
21
+ applyLockEnabled,
22
+ finalizeToggle,
23
+ resolveToggleTarget
24
+ } from "./module-toggle.js";
33
25
  import {
34
26
  DEFAULT_REGISTRY_REPO,
35
27
  DEFAULT_REGISTRY_TAG,
36
28
  findUnknownModules,
37
29
  resolveRegistryIndex
38
30
  } from "./registry.js";
39
- function moduleUsage() {
31
+ const MODULE_CMD_NAMES = ["module", "mod"];
32
+ function isModuleCommand(cmd) {
33
+ return !!cmd && MODULE_CMD_NAMES.includes(cmd);
34
+ }
35
+ const DEV_ACCENT_MODULE_SUBCOMMANDS = ["build", "reload"];
36
+ function getVisibleModuleSubcommands(mode) {
37
+ return listVisibleModuleSubs(mode);
38
+ }
39
+ function isDeveloperSubcommand(sub) {
40
+ return isDevAccentModuleSub(sub);
41
+ }
42
+ function moduleUsage(mode = "argv") {
40
43
  return t("mod.usage", {
41
44
  cmds: MODULE_CMD_NAMES.join("|"),
42
- subs: MODULE_SUBCOMMANDS.join("|")
45
+ subs: getVisibleModuleSubcommands(mode).join("|")
43
46
  });
44
47
  }
45
48
  function modulesDir() {
@@ -148,7 +151,7 @@ async function cmdModuleSearch(args) {
148
151
  return c.red(
149
152
  `
150
153
  Registry empty or unreachable (${DEFAULT_REGISTRY_REPO}@${DEFAULT_REGISTRY_TAG}).
151
- Check network, or install with an explicit source: sfmc mod install <id> --from github:owner/repo@tag
154
+ Check network, or: mod install <id> --from github:owner/repo@tag
152
155
  `
153
156
  );
154
157
  }
@@ -250,11 +253,45 @@ async function cmdModuleVerify(args) {
250
253
  function readDbConfig() {
251
254
  return readJson(configPath(ROOT, "db_config.json")) ?? {};
252
255
  }
253
- 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) {
254
291
  const cfg = readDbConfig();
255
292
  const port = cfg.db_port ?? 3001;
256
293
  const token = cfg.http_auth || "";
257
- 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}`;
258
295
  let res;
259
296
  try {
260
297
  res = await fetch(url, {
@@ -265,9 +302,7 @@ async function postModuleToggle(id, action) {
265
302
  }
266
303
  });
267
304
  } catch (err) {
268
- return failResult(
269
- c.red(t("mod.dbUnreachable", { url, message: err.message }))
270
- );
305
+ return { ok: false, reason: "unreachable", detail: err.message };
271
306
  }
272
307
  const text = await res.text();
273
308
  let body;
@@ -278,24 +313,62 @@ async function postModuleToggle(id, action) {
278
313
  }
279
314
  if (!res.ok) {
280
315
  const err = body?.error ?? `HTTP ${res.status}`;
281
- 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 })));
331
+ }
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
+ );
282
339
  }
283
- const ok = body?.success !== false;
284
- if (ok) {
285
- const label = action === "enable" ? t("mod.action.enabled") : t("mod.action.disabled");
286
- return okResult(c.green(t("mod.toggleOk", { label, id })));
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);
287
346
  }
288
- 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}`);
289
351
  }
290
352
  async function cmdModuleEnable(args) {
291
353
  const id = args[0];
292
354
  if (!id) return failResult(c.yellow(t("mod.enable.usage")));
293
- return postModuleToggle(id, "enable");
355
+ return cmdModuleToggle(id, "enable");
294
356
  }
295
357
  async function cmdModuleDisable(args) {
296
358
  const id = args[0];
297
359
  if (!id) return failResult(c.yellow(t("mod.disable.usage")));
298
- return postModuleToggle(id, "disable");
360
+ return cmdModuleToggle(id, "disable");
361
+ }
362
+ function validateFromScheme(from) {
363
+ if (from === "local" || from.startsWith("local:") || from.startsWith("dir:") || from.startsWith("npm:") || from.startsWith("tgz:") || from.startsWith("zip:") || from.startsWith("github:")) {
364
+ return null;
365
+ }
366
+ if (existsSync(from)) {
367
+ const st = lstatSync(from);
368
+ if (st.isDirectory()) return null;
369
+ return `--from \u88F8\u8DEF\u5F84\u987B\u4E3A\u76EE\u5F55\uFF08\u6587\u4EF6\u8BF7\u7528 --from local:<tgz|zip>\uFF09: ${from}`;
370
+ }
371
+ return t("mod.fromUnknown", { value: from });
299
372
  }
300
373
  async function cmdModuleInstall(args) {
301
374
  const flags = parseFlags(args);
@@ -312,13 +385,9 @@ async function cmdModuleInstall(args) {
312
385
  if (positional.length === 0) {
313
386
  return c.yellow(t("mod.install.usage"));
314
387
  }
315
- if (flags.link && !flags.from) {
316
- const { resolveSfmcModulesRoot, packageDirForId } = await import("./sfmc-modules-root.js");
317
- const modulesRoot = resolveSfmcModulesRoot();
318
- if (!modulesRoot) {
319
- return c.red(t("mod.linkNeedsFrom"));
320
- }
321
- flags.from = positional.length === 1 ? `dir:${packageDirForId(modulesRoot, positional[0])}` : `dir:${path.join(modulesRoot, "packages")}`;
388
+ if (flags.from) {
389
+ const err = validateFromScheme(flags.from);
390
+ if (err) return c.red(err);
322
391
  }
323
392
  const fetchScript = resolveFetchModule();
324
393
  if (!fetchScript) {
@@ -347,27 +416,6 @@ async function cmdModuleInstall(args) {
347
416
  proc.on("error", (e) => resolve(c.red(`spawn failed: ${e.message}`)));
348
417
  });
349
418
  }
350
- async function cmdModuleLink(args) {
351
- const flags = parseFlags(args);
352
- const positional = [];
353
- for (let i = 0; i < args.length; i++) {
354
- if (args[i] === "--from" || args[i] === "--sha256") {
355
- i++;
356
- continue;
357
- }
358
- if (args[i]?.startsWith("--from=") || args[i]?.startsWith("--sha256=")) continue;
359
- if (args[i]?.startsWith("--")) continue;
360
- positional.push(args[i]);
361
- }
362
- if (positional.length === 0) {
363
- const { runModuleLinkWizard } = await import("./module-wizard.js");
364
- return runModuleLinkWizard();
365
- }
366
- const id = positional[0];
367
- const installArgs = [id, "--link"];
368
- if (flags.from) installArgs.push("--from", flags.from);
369
- return cmdModuleInstall(installArgs);
370
- }
371
419
  async function cmdModuleUninstall(args) {
372
420
  const id = args[0];
373
421
  if (!id) return c.yellow(t("mod.uninstall.usage"));
@@ -428,23 +476,19 @@ async function dispatchModuleCommand(sub, args) {
428
476
  case "disable":
429
477
  return (await cmdModuleDisable(args)).message;
430
478
  case "build": {
431
- const { cmdPackBuild } = await import("./pack-lifecycle.js");
432
- return (await cmdPackBuild(args)).message;
479
+ const { cmdModuleBuild } = await import("./module-pack-build.js");
480
+ return cmdModuleBuild(args);
433
481
  }
434
482
  case "reload": {
435
- const { cmdReload } = await import("./commands-reload.js");
436
- return cmdReload(args);
437
- }
438
- case "create": {
439
- const { runModuleCreateWizard } = await import("./module-wizard.js");
440
- return runModuleCreateWizard();
441
- }
442
- case "link":
443
- return cmdModuleLink(args);
444
- case "dev": {
445
- const { runModuleDevWizard } = await import("./module-wizard.js");
446
- return runModuleDevWizard();
483
+ const { cmdModuleReload } = await import("./module-pack-build.js");
484
+ return cmdModuleReload(args);
447
485
  }
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
+ );
448
492
  default:
449
493
  return c.yellow(moduleUsage());
450
494
  }
@@ -459,22 +503,22 @@ function listInstalledModuleIdsSync() {
459
503
  }
460
504
  }
461
505
  export {
506
+ DEV_ACCENT_MODULE_SUBCOMMANDS,
462
507
  MODULE_CMD_NAMES,
463
- MODULE_SUBCOMMANDS,
464
508
  cmdModuleDisable,
465
509
  cmdModuleEnable,
466
510
  cmdModuleInfo,
467
511
  cmdModuleInstall,
468
- cmdModuleLink,
469
512
  cmdModuleList,
470
513
  cmdModuleSearch,
471
514
  cmdModuleUninstall,
472
515
  cmdModuleVerify,
473
516
  dispatchModuleCommand,
517
+ getVisibleModuleSubcommands,
518
+ isDeveloperSubcommand,
474
519
  isModuleCommand,
475
520
  listInstalledModuleIdsSync,
476
521
  moduleUsage,
477
- paintModuleCmdAlias,
478
522
  scanAndWarnUnknown
479
523
  };
480
524
  //# sourceMappingURL=module-commands.js.map