@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.
- package/dist/argv-parse.d.ts +0 -2
- package/dist/argv-parse.d.ts.map +1 -1
- package/dist/argv-parse.js +1 -5
- package/dist/argv-parse.js.map +2 -2
- package/dist/cli-gate.d.ts.map +1 -1
- package/dist/cli-gate.js +0 -2
- package/dist/cli-gate.js.map +2 -2
- package/dist/command-surface.d.ts +2 -12
- package/dist/command-surface.d.ts.map +1 -1
- package/dist/command-surface.js +2 -34
- package/dist/command-surface.js.map +2 -2
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +123 -10
- package/dist/commands.js.map +2 -2
- package/dist/help-text.d.ts.map +1 -1
- package/dist/help-text.js +1 -5
- package/dist/help-text.js.map +2 -2
- package/dist/i18n/locales/en.d.ts +27 -38
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +27 -41
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
- package/dist/i18n/locales/zh-CN.js +27 -41
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +2 -2
- package/dist/llbot-launch.d.ts +20 -0
- package/dist/llbot-launch.d.ts.map +1 -0
- package/dist/llbot-launch.js +40 -0
- package/dist/llbot-launch.js.map +7 -0
- package/dist/main.js +7 -12
- package/dist/main.js.map +2 -2
- package/dist/module-commands.d.ts +5 -18
- package/dist/module-commands.d.ts.map +1 -1
- package/dist/module-commands.js +89 -87
- package/dist/module-commands.js.map +2 -2
- package/dist/module-pack-build.d.ts.map +1 -1
- package/dist/module-pack-build.js +4 -0
- package/dist/module-pack-build.js.map +2 -2
- package/dist/module-toggle.d.ts +33 -0
- package/dist/module-toggle.d.ts.map +1 -0
- package/dist/module-toggle.js +28 -0
- package/dist/module-toggle.js.map +7 -0
- package/dist/node-service-probe.d.ts +18 -0
- package/dist/node-service-probe.d.ts.map +1 -0
- package/dist/node-service-probe.js +97 -0
- package/dist/node-service-probe.js.map +7 -0
- package/dist/pack-lifecycle.d.ts.map +1 -1
- package/dist/pack-lifecycle.js +11 -1
- package/dist/pack-lifecycle.js.map +2 -2
- package/dist/repl-windows/service-window.d.ts +1 -1
- package/dist/repl-windows/service-window.d.ts.map +1 -1
- package/dist/repl-windows/service-window.js +8 -1
- package/dist/repl-windows/service-window.js.map +2 -2
- package/dist/repl.d.ts +0 -2
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +0 -19
- package/dist/repl.js.map +2 -2
- package/dist/runtime.d.ts +4 -13
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +15 -27
- package/dist/runtime.js.map +2 -2
- package/dist/send-target.d.ts.map +1 -1
- package/dist/send-target.js +6 -2
- package/dist/send-target.js.map +2 -2
- package/dist/services.d.ts +32 -6
- package/dist/services.d.ts.map +1 -1
- package/dist/services.js +101 -16
- package/dist/services.js.map +2 -2
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +65 -7
- package/dist/wizard.js.map +2 -2
- package/package.json +7 -8
- package/dist/cmd-remote.d.ts +0 -13
- package/dist/cmd-remote.d.ts.map +0 -1
- package/dist/cmd-remote.js +0 -38
- package/dist/cmd-remote.js.map +0 -7
- package/dist/module-publish.d.ts +0 -69
- package/dist/module-publish.d.ts.map +0 -1
- package/dist/module-publish.js +0 -478
- package/dist/module-publish.js.map +0 -7
- package/dist/module-watch.d.ts +0 -32
- package/dist/module-watch.d.ts.map +0 -1
- package/dist/module-watch.js +0 -171
- package/dist/module-watch.js.map +0 -7
- package/dist/remote-agent.d.ts +0 -18
- package/dist/remote-agent.d.ts.map +0 -1
- package/dist/remote-agent.js +0 -198
- 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
|
|
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
|
|
5
|
-
"mappings": "AAkBA,SAAS,MAAM,kBAAkB,sBAAsB,sBAAsB,oBAAoB,cAAc,wBAAwC;AAEvJ;AAAA,EACE;AAAA,
|
|
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 =
|
|
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 {
|
|
5
|
-
"mappings": ";AACA,OAAO,aAAa;AACpB
|
|
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
|
-
/** 顶层命令名(主名 + 短别名)
|
|
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
|
|
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
|
-
* 通道门禁(
|
|
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;
|
|
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"}
|
package/dist/module-commands.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 "
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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
|