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

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 (163) hide show
  1. package/dist/argv-parse.d.ts +13 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +32 -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 +48 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/cmd-remote.d.ts +13 -0
  10. package/dist/cmd-remote.d.ts.map +1 -0
  11. package/dist/cmd-remote.js +38 -0
  12. package/dist/cmd-remote.js.map +7 -0
  13. package/dist/command-palette.d.ts +61 -0
  14. package/dist/command-palette.d.ts.map +1 -0
  15. package/dist/command-palette.js +352 -0
  16. package/dist/command-palette.js.map +7 -0
  17. package/dist/command-surface.d.ts +95 -0
  18. package/dist/command-surface.d.ts.map +1 -0
  19. package/dist/command-surface.js +324 -0
  20. package/dist/command-surface.js.map +7 -0
  21. package/dist/commands-reload.js +2 -2
  22. package/dist/commands-reload.js.map +2 -2
  23. package/dist/commands.d.ts +1 -1
  24. package/dist/commands.d.ts.map +1 -1
  25. package/dist/commands.js +79 -17
  26. package/dist/commands.js.map +2 -2
  27. package/dist/debug-command.d.ts +5 -0
  28. package/dist/debug-command.d.ts.map +1 -0
  29. package/dist/debug-command.js +118 -0
  30. package/dist/debug-command.js.map +7 -0
  31. package/dist/help-text.d.ts +3 -0
  32. package/dist/help-text.d.ts.map +1 -0
  33. package/dist/help-text.js +164 -0
  34. package/dist/help-text.js.map +7 -0
  35. package/dist/i18n/locales/en.d.ts +93 -68
  36. package/dist/i18n/locales/en.d.ts.map +1 -1
  37. package/dist/i18n/locales/en.js +97 -69
  38. package/dist/i18n/locales/en.js.map +2 -2
  39. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  40. package/dist/i18n/locales/zh-CN.js +140 -106
  41. package/dist/i18n/locales/zh-CN.js.map +2 -2
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +2 -2
  46. package/dist/logs.d.ts +16 -1
  47. package/dist/logs.d.ts.map +1 -1
  48. package/dist/logs.js +80 -11
  49. package/dist/logs.js.map +2 -2
  50. package/dist/main.js +58 -44
  51. package/dist/main.js.map +2 -2
  52. package/dist/module-commands.d.ts +25 -35
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +107 -65
  55. package/dist/module-commands.js.map +2 -2
  56. package/dist/module-pack-build.d.ts +10 -0
  57. package/dist/module-pack-build.d.ts.map +1 -0
  58. package/dist/module-pack-build.js +430 -0
  59. package/dist/module-pack-build.js.map +7 -0
  60. package/dist/module-publish.d.ts +69 -0
  61. package/dist/module-publish.d.ts.map +1 -0
  62. package/dist/module-publish.js +478 -0
  63. package/dist/module-publish.js.map +7 -0
  64. package/dist/module-watch.d.ts +32 -0
  65. package/dist/module-watch.d.ts.map +1 -0
  66. package/dist/module-watch.js +171 -0
  67. package/dist/module-watch.js.map +7 -0
  68. package/dist/pack-lifecycle.d.ts +1 -1
  69. package/dist/pack-lifecycle.d.ts.map +1 -1
  70. package/dist/pack-lifecycle.js +3 -3
  71. package/dist/pack-lifecycle.js.map +2 -2
  72. package/dist/pack-update/index.d.ts +18 -0
  73. package/dist/pack-update/index.d.ts.map +1 -0
  74. package/dist/pack-update/index.js +113 -0
  75. package/dist/pack-update/index.js.map +7 -0
  76. package/dist/registry.d.ts +6 -3
  77. package/dist/registry.d.ts.map +1 -1
  78. package/dist/registry.js +15 -3
  79. package/dist/registry.js.map +2 -2
  80. package/dist/remote-agent.d.ts.map +1 -1
  81. package/dist/remote-agent.js +7 -5
  82. package/dist/remote-agent.js.map +2 -2
  83. package/dist/repl-windows/format-display.d.ts +10 -0
  84. package/dist/repl-windows/format-display.d.ts.map +1 -0
  85. package/dist/repl-windows/format-display.js +57 -0
  86. package/dist/repl-windows/format-display.js.map +7 -0
  87. package/dist/repl-windows/host.d.ts +60 -0
  88. package/dist/repl-windows/host.d.ts.map +1 -0
  89. package/dist/repl-windows/host.js +179 -0
  90. package/dist/repl-windows/host.js.map +7 -0
  91. package/dist/repl-windows/index.d.ts +9 -0
  92. package/dist/repl-windows/index.d.ts.map +1 -0
  93. package/dist/repl-windows/index.js +13 -0
  94. package/dist/repl-windows/index.js.map +7 -0
  95. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  96. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  97. package/dist/repl-windows/logs-filter-window.js +77 -0
  98. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  99. package/dist/repl-windows/service-window.d.ts +4 -0
  100. package/dist/repl-windows/service-window.d.ts.map +1 -0
  101. package/dist/repl-windows/service-window.js +28 -0
  102. package/dist/repl-windows/service-window.js.map +7 -0
  103. package/dist/repl-windows/types.d.ts +56 -0
  104. package/dist/repl-windows/types.d.ts.map +1 -0
  105. package/dist/repl-windows/types.js +1 -0
  106. package/dist/repl-windows/types.js.map +7 -0
  107. package/dist/repl.d.ts +7 -8
  108. package/dist/repl.d.ts.map +1 -1
  109. package/dist/repl.js +707 -417
  110. package/dist/repl.js.map +3 -3
  111. package/dist/runtime.d.ts +2 -0
  112. package/dist/runtime.d.ts.map +1 -1
  113. package/dist/runtime.js +4 -0
  114. package/dist/runtime.js.map +2 -2
  115. package/dist/send-target.d.ts +11 -0
  116. package/dist/send-target.d.ts.map +1 -0
  117. package/dist/send-target.js +38 -0
  118. package/dist/send-target.js.map +7 -0
  119. package/dist/services.d.ts +21 -1
  120. package/dist/services.d.ts.map +1 -1
  121. package/dist/services.js +146 -7
  122. package/dist/services.js.map +2 -2
  123. package/dist/theme.js +1 -1
  124. package/dist/theme.js.map +2 -2
  125. package/dist/wizard.d.ts.map +1 -1
  126. package/dist/wizard.js +11 -9
  127. package/dist/wizard.js.map +2 -2
  128. package/dist/world-packs.d.ts.map +1 -1
  129. package/dist/world-packs.js +6 -3
  130. package/dist/world-packs.js.map +2 -2
  131. package/package.json +5 -5
  132. package/dist/module-wizard.d.ts +0 -14
  133. package/dist/module-wizard.d.ts.map +0 -1
  134. package/dist/module-wizard.js +0 -313
  135. package/dist/module-wizard.js.map +0 -7
  136. package/dist/pack-update/bindings.d.ts +0 -12
  137. package/dist/pack-update/bindings.d.ts.map +0 -1
  138. package/dist/pack-update/bindings.js +0 -64
  139. package/dist/pack-update/bindings.js.map +0 -7
  140. package/dist/pack-update/config.d.ts +0 -22
  141. package/dist/pack-update/config.d.ts.map +0 -1
  142. package/dist/pack-update/config.js +0 -141
  143. package/dist/pack-update/config.js.map +0 -7
  144. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  145. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  146. package/dist/pack-update/providers/curseforge.js +0 -229
  147. package/dist/pack-update/providers/curseforge.js.map +0 -7
  148. package/dist/pack-update/providers/index.d.ts +0 -16
  149. package/dist/pack-update/providers/index.d.ts.map +0 -1
  150. package/dist/pack-update/providers/index.js +0 -37
  151. package/dist/pack-update/providers/index.js.map +0 -7
  152. package/dist/pack-update/service.d.ts +0 -21
  153. package/dist/pack-update/service.d.ts.map +0 -1
  154. package/dist/pack-update/service.js +0 -572
  155. package/dist/pack-update/service.js.map +0 -7
  156. package/dist/pack-update/types.d.ts +0 -126
  157. package/dist/pack-update/types.d.ts.map +0 -1
  158. package/dist/pack-update/types.js +0 -8
  159. package/dist/pack-update/types.js.map +0 -7
  160. package/dist/pack-update/version-policy.d.ts +0 -81
  161. package/dist/pack-update/version-policy.d.ts.map +0 -1
  162. package/dist/pack-update/version-policy.js +0 -210
  163. package/dist/pack-update/version-policy.js.map +0 -7
package/dist/main.js CHANGED
@@ -1,29 +1,38 @@
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 {
4
+ mapPacksSubAlias,
5
+ parseGlobalArgv,
6
+ resolveModuleShorthandSub
7
+ } from "./argv-parse.js";
8
+ import { cmdRemote } from "./cmd-remote.js";
9
+ import { cmdRestart, cmdStart, cmdStartAll, cmdStatus, cmdStop, cmdStopAll, cmdUpdate } from "./commands.js";
10
+ import { gateModuleSub, gatePacksSub, gateTopLevel } from "./cli-gate.js";
11
+ import { cmdDebug } from "./debug-command.js";
10
12
  import { initLocale, stripLangArgs, t } from "./i18n/index.js";
13
+ import { cmdLocale } from "./locale-command.js";
14
+ import { dispatchModuleCommand, isModuleCommand, scanAndWarnUnknown } from "./module-commands.js";
15
+ import { startRemoteAgent } from "./remote-agent.js";
16
+ import { getHelp, playWelcomeAnimation, startRepl } from "./repl.js";
11
17
  import { ROOT } from "./runtime.js";
12
18
  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`)}`);
19
+ import { dispatchPacksCommand, isPacksCommand } from "./world-packs.js";
20
+ const MODE = "argv";
21
+ async function printVersion() {
22
+ await playWelcomeAnimation();
18
23
  }
19
24
  function printUsage() {
20
- console.log(`${getHelp()}`);
25
+ console.log(`${getHelp("argv")}`);
26
+ }
27
+ function deny(msg) {
28
+ console.log(msg);
29
+ process.exit(1);
21
30
  }
22
31
  async function main() {
23
32
  const stripped = stripLangArgs(process.argv.slice(2));
24
33
  initLocale({ root: ROOT, flag: stripped.lang });
25
- const args = stripped.args;
26
- if (args.length === 0) {
34
+ const { packsMode, args } = parseGlobalArgv(stripped.args);
35
+ if (args.length === 0 && !packsMode) {
27
36
  const { isRuntimeInitialized } = await import("./runtime.js");
28
37
  if (!isRuntimeInitialized()) {
29
38
  const { runWizard } = await import("./wizard.js");
@@ -37,7 +46,26 @@ async function main() {
37
46
  await startRepl();
38
47
  return;
39
48
  }
49
+ if (packsMode) {
50
+ const [subRaw, ...subRest] = args;
51
+ const sub = mapPacksSubAlias(subRaw);
52
+ const g = gatePacksSub(sub, MODE);
53
+ if (g) deny(g);
54
+ console.log(await dispatchPacksCommand(sub, subRest));
55
+ process.exit(0);
56
+ }
40
57
  const [cmd, ...rest] = args;
58
+ if (cmd && !["--help", "-h", "--version", "-v"].includes(cmd)) {
59
+ const topGate = gateTopLevel(cmd, MODE);
60
+ if (topGate) deny(topGate);
61
+ }
62
+ const moduleSub = resolveModuleShorthandSub(cmd);
63
+ if (moduleSub) {
64
+ const g = gateModuleSub(moduleSub, MODE);
65
+ if (g) deny(g);
66
+ console.log(await dispatchModuleCommand(moduleSub, rest));
67
+ process.exit(0);
68
+ }
41
69
  switch (cmd) {
42
70
  case "--help":
43
71
  case "-h":
@@ -46,21 +74,22 @@ async function main() {
46
74
  break;
47
75
  case "--version":
48
76
  case "-v":
49
- printVersion();
77
+ await printVersion();
50
78
  break;
51
79
  case "locale":
52
80
  case "lang":
53
81
  console.log(cmdLocale(rest));
54
82
  break;
83
+ case "debug":
84
+ console.log(await cmdDebug(rest));
85
+ break;
55
86
  case "status":
56
- console.log(cmdStatus());
87
+ console.log(await cmdStatus());
57
88
  break;
58
89
  case "logs":
59
- case "log": {
60
- const out = cmdLogs(rest);
61
- if (out) console.log(out);
90
+ case "log":
91
+ deny(gateTopLevel("logs", MODE) ?? c.yellow(t("cli.replOnly", { cmd: "logs" })));
62
92
  break;
63
- }
64
93
  case "start":
65
94
  if (rest[0] === "-all" || rest[0] === "all" || rest[0] === "--all") {
66
95
  console.log(await cmdStartAll());
@@ -95,6 +124,8 @@ async function main() {
95
124
  case "packs":
96
125
  case "addon": {
97
126
  const [sub, ...subRest] = rest;
127
+ const g = gatePacksSub(sub, MODE);
128
+ if (g) deny(g);
98
129
  console.log(await dispatchPacksCommand(sub, subRest));
99
130
  break;
100
131
  }
@@ -103,38 +134,21 @@ async function main() {
103
134
  await runWizard();
104
135
  break;
105
136
  }
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
- }
137
+ case "remote":
138
+ console.log(await cmdRemote(rest, { daemonAfterEnroll: true }));
128
139
  break;
129
- }
130
140
  default:
131
141
  if (isModuleCommand(cmd)) {
132
142
  const [sub, ...subRest] = rest;
143
+ const g = gateModuleSub(sub, MODE);
144
+ if (g) deny(g);
133
145
  console.log(await dispatchModuleCommand(sub, subRest));
134
146
  break;
135
147
  }
136
148
  if (isPacksCommand(cmd)) {
137
149
  const [sub, ...subRest] = rest;
150
+ const g = gatePacksSub(sub, MODE);
151
+ if (g) deny(g);
138
152
  console.log(await dispatchPacksCommand(sub, subRest));
139
153
  break;
140
154
  }
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 {\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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",
6
6
  "names": []
7
7
  }
@@ -3,31 +3,10 @@
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
  */
8
+ import { type CommandMode } from "./command-surface.js";
9
+ import { type CliResult } from "./cli-result.js";
31
10
  /** 顶层命令名(主名 + 短别名),供 HELP / 补全 / 分发共用。 */
32
11
  export declare const MODULE_CMD_NAMES: readonly ["module", "mod"];
33
12
  export type ModuleCmdName = (typeof MODULE_CMD_NAMES)[number];
@@ -35,11 +14,21 @@ export type ModuleCmdName = (typeof MODULE_CMD_NAMES)[number];
35
14
  export declare function isModuleCommand(cmd: string | undefined): cmd is ModuleCmdName;
36
15
  /** 染色后的 HELP 前缀,避免 HELP 硬编码 module/mod。 */
37
16
  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";
17
+ /** @deprecated 使用 listVisibleModuleSubs(mode);保留全集供调试。 */
18
+ export declare const ALL_MODULE_SUBCOMMANDS: readonly ["list", "search", "install", "uninstall", "verify", "info", "enable", "disable", "build", "reload"];
19
+ /** 开发者样式子命令(蓝标,非门禁)。 */
20
+ 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
+ /** 当前通道下可见的 module 子命令(自动补全 / usage)。 */
27
+ export declare function getVisibleModuleSubcommands(mode: CommandMode): readonly string[];
28
+ /** sub 是否为开发者蓝标(help 着色)。 */
29
+ export declare function isDeveloperSubcommand(sub: string | undefined): boolean;
41
30
  /** Usage 行主名|别名(与 MODULE_CMD_NAMES 同源,避免与 HELP 漂移)。 */
42
- export declare function moduleUsage(): string;
31
+ export declare function moduleUsage(mode?: CommandMode): string;
43
32
  export declare function cmdModuleList(_args: string[]): Promise<string>;
44
33
  /**
45
34
  * Walk `modules/packages/<id>/` and print a one-line yellow warning for each
@@ -59,18 +48,19 @@ export declare function cmdModuleVerify(args: string[]): Promise<string>;
59
48
  export declare function cmdModuleEnable(args: string[]): Promise<CliResult>;
60
49
  export declare function cmdModuleDisable(args: string[]): Promise<CliResult>;
61
50
  export declare function cmdModuleInstall(args: string[]): Promise<string>;
51
+ export declare function cmdModuleUninstall(args: string[]): Promise<string>;
62
52
  /**
63
- * `mod link [id] [--from dir:…]`
64
- * - id:等价 `install <id> --link`,缺省 --from 时自动拼旁路 packages/<id>
65
- * - id:进入交互选择(@clack/prompts)
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 等)。
66
56
  */
67
- export declare function cmdModuleLink(args: string[]): Promise<string>;
68
- export declare function cmdModuleUninstall(args: string[]): Promise<string>;
57
+ export declare function cmdModuleTest(args: string[]): Promise<string>;
69
58
  /**
70
59
  * 统一分发 module/mod 子命令 —— CLI(`main.ts`)与 REPL(`repl.ts`)共用,
71
- * 避免两处 switch 漂移(例如原先 REPL 缺 enable/disable)。
60
+ * 避免两处 switch 漂移。
72
61
  *
73
- * `remove` 作为 uninstall 的同义别名保留。
62
+ * 通道门禁(external/repl)由调用方在 dispatch 前经 command-surface 判定;
63
+ * 本函数只负责子命令路由。`remove` 作为 uninstall 的同义别名保留。
74
64
  */
75
65
  export declare function dispatchModuleCommand(sub: string | undefined, args: string[]): Promise<string>;
76
66
  /** 同步枚举已安装模块 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;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,3 +1,23 @@
1
+ import fs from "node:fs/promises";
2
+ import { existsSync, lstatSync, readdirSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { spawn } from "node:child_process";
5
+ import { configPath, modulePath, readJson } from "@sfmc-bds/sdk/node/config";
6
+ import {
7
+ isDevAccentModuleSub,
8
+ listVisibleModuleSubs
9
+ } from "./command-surface.js";
10
+ import { failResult, okResult } from "./cli-result.js";
11
+ import { t } from "./i18n/index.js";
12
+ import { c } from "./theme.js";
13
+ import { ROOT, resolveFetchModule } from "./runtime.js";
14
+ import { dirFingerprint } from "./module-fingerprint.js";
15
+ import {
16
+ DEFAULT_REGISTRY_REPO,
17
+ DEFAULT_REGISTRY_TAG,
18
+ findUnknownModules,
19
+ resolveRegistryIndex
20
+ } from "./registry.js";
1
21
  const MODULE_CMD_NAMES = ["module", "mod"];
2
22
  function isModuleCommand(cmd) {
3
23
  return !!cmd && MODULE_CMD_NAMES.includes(cmd);
@@ -5,7 +25,7 @@ function isModuleCommand(cmd) {
5
25
  function paintModuleCmdAlias(paint) {
6
26
  return MODULE_CMD_NAMES.map((name) => paint(name)).join("/");
7
27
  }
8
- const MODULE_SUBCOMMANDS = [
28
+ const ALL_MODULE_SUBCOMMANDS = [
9
29
  "list",
10
30
  "search",
11
31
  "install",
@@ -15,31 +35,21 @@ const MODULE_SUBCOMMANDS = [
15
35
  "enable",
16
36
  "disable",
17
37
  "build",
18
- "reload",
19
- "create",
20
- "link",
21
- "dev"
38
+ "reload"
22
39
  ];
23
- import fs from "node:fs/promises";
24
- import { existsSync, readdirSync } from "node:fs";
25
- import path from "node:path";
26
- import { spawn } from "node:child_process";
27
- import { configPath, modulePath, readJson } from "@sfmc-bds/sdk/node/config";
28
- import { failResult, okResult } from "./cli-result.js";
29
- import { t } from "./i18n/index.js";
30
- import { c } from "./theme.js";
31
- import { ROOT, resolveFetchModule } from "./runtime.js";
32
- import { dirFingerprint } from "./module-fingerprint.js";
33
- import {
34
- DEFAULT_REGISTRY_REPO,
35
- DEFAULT_REGISTRY_TAG,
36
- findUnknownModules,
37
- resolveRegistryIndex
38
- } from "./registry.js";
39
- function moduleUsage() {
40
+ const DEV_ACCENT_MODULE_SUBCOMMANDS = ["build", "reload"];
41
+ const MODULE_SUBCOMMANDS = ALL_MODULE_SUBCOMMANDS;
42
+ const DEV_MODULE_SUBCOMMANDS = DEV_ACCENT_MODULE_SUBCOMMANDS;
43
+ function getVisibleModuleSubcommands(mode) {
44
+ return listVisibleModuleSubs(mode);
45
+ }
46
+ function isDeveloperSubcommand(sub) {
47
+ return isDevAccentModuleSub(sub);
48
+ }
49
+ function moduleUsage(mode = "argv") {
40
50
  return t("mod.usage", {
41
51
  cmds: MODULE_CMD_NAMES.join("|"),
42
- subs: MODULE_SUBCOMMANDS.join("|")
52
+ subs: getVisibleModuleSubcommands(mode).join("|")
43
53
  });
44
54
  }
45
55
  function modulesDir() {
@@ -148,7 +158,7 @@ async function cmdModuleSearch(args) {
148
158
  return c.red(
149
159
  `
150
160
  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
161
+ Check network, or: mod install <id> --from github:owner/repo@tag
152
162
  `
153
163
  );
154
164
  }
@@ -297,6 +307,17 @@ async function cmdModuleDisable(args) {
297
307
  if (!id) return failResult(c.yellow(t("mod.disable.usage")));
298
308
  return postModuleToggle(id, "disable");
299
309
  }
310
+ function validateFromScheme(from) {
311
+ if (from === "local" || from.startsWith("local:") || from.startsWith("dir:") || from.startsWith("npm:") || from.startsWith("tgz:") || from.startsWith("zip:") || from.startsWith("github:")) {
312
+ return null;
313
+ }
314
+ if (existsSync(from)) {
315
+ const st = lstatSync(from);
316
+ if (st.isDirectory()) return null;
317
+ return `--from \u88F8\u8DEF\u5F84\u987B\u4E3A\u76EE\u5F55\uFF08\u6587\u4EF6\u8BF7\u7528 --from local:<tgz|zip>\uFF09: ${from}`;
318
+ }
319
+ return t("mod.fromUnknown", { value: from });
320
+ }
300
321
  async function cmdModuleInstall(args) {
301
322
  const flags = parseFlags(args);
302
323
  const positional = [];
@@ -312,13 +333,9 @@ async function cmdModuleInstall(args) {
312
333
  if (positional.length === 0) {
313
334
  return c.yellow(t("mod.install.usage"));
314
335
  }
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")}`;
336
+ if (flags.from) {
337
+ const err = validateFromScheme(flags.from);
338
+ if (err) return c.red(err);
322
339
  }
323
340
  const fetchScript = resolveFetchModule();
324
341
  if (!fetchScript) {
@@ -347,27 +364,6 @@ async function cmdModuleInstall(args) {
347
364
  proc.on("error", (e) => resolve(c.red(`spawn failed: ${e.message}`)));
348
365
  });
349
366
  }
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
367
  async function cmdModuleUninstall(args) {
372
368
  const id = args[0];
373
369
  if (!id) return c.yellow(t("mod.uninstall.usage"));
@@ -408,6 +404,46 @@ function parseFlags(args) {
408
404
  }
409
405
  return flags;
410
406
  }
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
+ }
411
447
  async function dispatchModuleCommand(sub, args) {
412
448
  switch (sub) {
413
449
  case "list":
@@ -428,22 +464,23 @@ async function dispatchModuleCommand(sub, args) {
428
464
  case "disable":
429
465
  return (await cmdModuleDisable(args)).message;
430
466
  case "build": {
431
- const { cmdPackBuild } = await import("./pack-lifecycle.js");
432
- return (await cmdPackBuild(args)).message;
467
+ const { cmdModuleBuild } = await import("./module-pack-build.js");
468
+ return cmdModuleBuild(args);
433
469
  }
434
470
  case "reload": {
435
- const { cmdReload } = await import("./commands-reload.js");
436
- return cmdReload(args);
471
+ const { cmdModuleReload } = await import("./module-pack-build.js");
472
+ return cmdModuleReload(args);
473
+ }
474
+ case "watch": {
475
+ const { cmdModuleWatch } = await import("./module-watch.js");
476
+ return cmdModuleWatch(args);
437
477
  }
438
- case "create": {
439
- const { runModuleCreateWizard } = await import("./module-wizard.js");
440
- return runModuleCreateWizard();
478
+ case "test": {
479
+ return cmdModuleTest(args);
441
480
  }
442
- case "link":
443
- return cmdModuleLink(args);
444
- case "dev": {
445
- const { runModuleDevWizard } = await import("./module-wizard.js");
446
- return runModuleDevWizard();
481
+ case "publish": {
482
+ const { cmdModulePublish } = await import("./module-publish.js");
483
+ return cmdModulePublish(args);
447
484
  }
448
485
  default:
449
486
  return c.yellow(moduleUsage());
@@ -459,18 +496,23 @@ function listInstalledModuleIdsSync() {
459
496
  }
460
497
  }
461
498
  export {
499
+ ALL_MODULE_SUBCOMMANDS,
500
+ DEV_ACCENT_MODULE_SUBCOMMANDS,
501
+ DEV_MODULE_SUBCOMMANDS,
462
502
  MODULE_CMD_NAMES,
463
503
  MODULE_SUBCOMMANDS,
464
504
  cmdModuleDisable,
465
505
  cmdModuleEnable,
466
506
  cmdModuleInfo,
467
507
  cmdModuleInstall,
468
- cmdModuleLink,
469
508
  cmdModuleList,
470
509
  cmdModuleSearch,
510
+ cmdModuleTest,
471
511
  cmdModuleUninstall,
472
512
  cmdModuleVerify,
473
513
  dispatchModuleCommand,
514
+ getVisibleModuleSubcommands,
515
+ isDeveloperSubcommand,
474
516
  isModuleCommand,
475
517
  listInstalledModuleIdsSync,
476
518
  moduleUsage,