@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/argv-parse.d.ts
CHANGED
|
@@ -8,6 +8,4 @@ export declare function parseGlobalArgv(raw: string[]): ParsedArgv;
|
|
|
8
8
|
export declare function mapPacksSubAlias(sub: string | undefined): string | undefined;
|
|
9
9
|
/** 是否为顶层模块短命令(install / uninstall / search …) */
|
|
10
10
|
export declare function isModuleInstallShorthand(cmd: string | undefined): boolean;
|
|
11
|
-
/** @deprecated 使用 resolveModuleTopShorthand;保留别名避免外部破坏 */
|
|
12
|
-
export declare function resolveModuleShorthandSub(cmd: string | undefined): string | undefined;
|
|
13
11
|
//# sourceMappingURL=argv-parse.d.ts.map
|
package/dist/argv-parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"argv-parse.d.ts","sourceRoot":"","sources":["../src/argv-parse.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAIF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAWzD;AAED,mBAAmB;AACnB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI5E;AAED,iDAAiD;AACjD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE
|
|
1
|
+
{"version":3,"file":"argv-parse.d.ts","sourceRoot":"","sources":["../src/argv-parse.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAIF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAWzD;AAED,mBAAmB;AACnB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI5E;AAED,iDAAiD;AACjD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzE"}
|
package/dist/argv-parse.js
CHANGED
|
@@ -20,13 +20,9 @@ function mapPacksSubAlias(sub) {
|
|
|
20
20
|
function isModuleInstallShorthand(cmd) {
|
|
21
21
|
return resolveModuleTopShorthand(cmd) !== void 0;
|
|
22
22
|
}
|
|
23
|
-
function resolveModuleShorthandSub(cmd) {
|
|
24
|
-
return resolveModuleTopShorthand(cmd);
|
|
25
|
-
}
|
|
26
23
|
export {
|
|
27
24
|
isModuleInstallShorthand,
|
|
28
25
|
mapPacksSubAlias,
|
|
29
|
-
parseGlobalArgv
|
|
30
|
-
resolveModuleShorthandSub
|
|
26
|
+
parseGlobalArgv
|
|
31
27
|
};
|
|
32
28
|
//# sourceMappingURL=argv-parse.js.map
|
package/dist/argv-parse.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/argv-parse.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * argv-parse.ts \u2014 \u5916\u90E8 CLI \u5168\u5C40\u65D7\u6807\u4E0E\u77ED\u547D\u4EE4\u9884\u89E3\u6790\uFF08DRY\uFF09\n *\n * - `-p` / `--packs`\uFF1A\u8D44\u6E90\u5305\u4E0A\u4E0B\u6587\uFF08\u517C\u5BB9\uFF1B\u5E2E\u52A9\u4F18\u5148\u63A8\u8350 `sfmc packs <sub>`\uFF09\n * - \u9876\u5C42\u6A21\u5757\u77ED\u547D\u4EE4\uFF1A\u89C1 command-surface#MODULE_TOP_SHORTHAND / resolveModuleTopShorthand\n * - packs \u4E0A\u4E0B\u6587\u4E0B `i` \u2192 `install`\n */\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\n\nexport type ParsedArgv = {\n packsMode: boolean;\n /** \u89C4\u8303\u5316\u540E\u7684\u4F4D\u7F6E\u53C2\u6570\uFF08\u5DF2\u53BB\u6389 -p/--packs\uFF09 */\n args: string[];\n};\n\nconst PACKS_FLAGS = new Set([\"-p\", \"--packs\"]);\n\nexport function parseGlobalArgv(raw: string[]): ParsedArgv {\n const args: string[] = [];\n let packsMode = false;\n for (const a of raw) {\n if (PACKS_FLAGS.has(a)) {\n packsMode = true;\n continue;\n }\n args.push(a);\n }\n return { packsMode, args };\n}\n\n/** packs \u5B50\u547D\u4EE4\u77ED\u522B\u540D */\nexport function mapPacksSubAlias(sub: string | undefined): string | undefined {\n if (!sub) return sub;\n if (sub === \"i\") return \"install\";\n return sub;\n}\n\n/** \u662F\u5426\u4E3A\u9876\u5C42\u6A21\u5757\u77ED\u547D\u4EE4\uFF08install / uninstall / search \u2026\uFF09 */\nexport function isModuleInstallShorthand(cmd: string | undefined): boolean {\n return resolveModuleTopShorthand(cmd) !== undefined;\n}\n
|
|
5
|
-
"mappings": "AAOA,SAAS,iCAAiC;AAQ1C,MAAM,cAAc,oBAAI,IAAI,CAAC,MAAM,SAAS,CAAC;AAEtC,SAAS,gBAAgB,KAA2B;AACzD,QAAM,OAAiB,CAAC;AACxB,MAAI,YAAY;AAChB,aAAW,KAAK,KAAK;AACnB,QAAI,YAAY,IAAI,CAAC,GAAG;AACtB,kBAAY;AACZ;AAAA,IACF;AACA,SAAK,KAAK,CAAC;AAAA,EACb;AACA,SAAO,EAAE,WAAW,KAAK;AAC3B;AAGO,SAAS,iBAAiB,KAA6C;AAC5E,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,IAAK,QAAO;AACxB,SAAO;AACT;AAGO,SAAS,yBAAyB,KAAkC;AACzE,SAAO,0BAA0B,GAAG,MAAM;AAC5C;
|
|
4
|
+
"sourcesContent": ["/**\n * argv-parse.ts \u2014 \u5916\u90E8 CLI \u5168\u5C40\u65D7\u6807\u4E0E\u77ED\u547D\u4EE4\u9884\u89E3\u6790\uFF08DRY\uFF09\n *\n * - `-p` / `--packs`\uFF1A\u8D44\u6E90\u5305\u4E0A\u4E0B\u6587\uFF08\u517C\u5BB9\uFF1B\u5E2E\u52A9\u4F18\u5148\u63A8\u8350 `sfmc packs <sub>`\uFF09\n * - \u9876\u5C42\u6A21\u5757\u77ED\u547D\u4EE4\uFF1A\u89C1 command-surface#MODULE_TOP_SHORTHAND / resolveModuleTopShorthand\n * - packs \u4E0A\u4E0B\u6587\u4E0B `i` \u2192 `install`\n */\nimport { resolveModuleTopShorthand } from \"./command-surface.js\";\n\nexport type ParsedArgv = {\n packsMode: boolean;\n /** \u89C4\u8303\u5316\u540E\u7684\u4F4D\u7F6E\u53C2\u6570\uFF08\u5DF2\u53BB\u6389 -p/--packs\uFF09 */\n args: string[];\n};\n\nconst PACKS_FLAGS = new Set([\"-p\", \"--packs\"]);\n\nexport function parseGlobalArgv(raw: string[]): ParsedArgv {\n const args: string[] = [];\n let packsMode = false;\n for (const a of raw) {\n if (PACKS_FLAGS.has(a)) {\n packsMode = true;\n continue;\n }\n args.push(a);\n }\n return { packsMode, args };\n}\n\n/** packs \u5B50\u547D\u4EE4\u77ED\u522B\u540D */\nexport function mapPacksSubAlias(sub: string | undefined): string | undefined {\n if (!sub) return sub;\n if (sub === \"i\") return \"install\";\n return sub;\n}\n\n/** \u662F\u5426\u4E3A\u9876\u5C42\u6A21\u5757\u77ED\u547D\u4EE4\uFF08install / uninstall / search \u2026\uFF09 */\nexport function isModuleInstallShorthand(cmd: string | undefined): boolean {\n return resolveModuleTopShorthand(cmd) !== undefined;\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,iCAAiC;AAQ1C,MAAM,cAAc,oBAAI,IAAI,CAAC,MAAM,SAAS,CAAC;AAEtC,SAAS,gBAAgB,KAA2B;AACzD,QAAM,OAAiB,CAAC;AACxB,MAAI,YAAY;AAChB,aAAW,KAAK,KAAK;AACnB,QAAI,YAAY,IAAI,CAAC,GAAG;AACtB,kBAAY;AACZ;AAAA,IACF;AACA,SAAK,KAAK,CAAC;AAAA,EACb;AACA,SAAO,EAAE,WAAW,KAAK;AAC3B;AAGO,SAAS,iBAAiB,KAA6C;AAC5E,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,IAAK,QAAO;AACxB,SAAO;AACT;AAGO,SAAS,yBAAyB,KAAkC;AACzE,SAAO,0BAA0B,GAAG,MAAM;AAC5C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cli-gate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-gate.d.ts","sourceRoot":"","sources":["../src/cli-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAI9B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"cli-gate.d.ts","sourceRoot":"","sources":["../src/cli-gate.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAI9B,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAOpF;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CAKf;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAItF;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAIvF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAItF"}
|
package/dist/cli-gate.js
CHANGED
|
@@ -9,8 +9,6 @@ import { t } from "./i18n/index.js";
|
|
|
9
9
|
import { c } from "./theme.js";
|
|
10
10
|
function formatGateFailure(reason, hintCmd) {
|
|
11
11
|
switch (reason) {
|
|
12
|
-
case "externalOnly":
|
|
13
|
-
return c.yellow(t("cli.externalOnly", { cmd: hintCmd ?? "" })) + "\n" + c.dim(t("cli.externalOnly.hint", { cmd: hintCmd || "\u2026" }));
|
|
14
12
|
case "replOnly":
|
|
15
13
|
return c.yellow(t("cli.replOnly", { cmd: hintCmd ?? "" })) + "\n" + c.dim(t("cli.replOnly.hint"));
|
|
16
14
|
case "needTty":
|
package/dist/cli-gate.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli-gate.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * cli-gate.ts \u2014 \u5C06 command-surface \u62D2\u7EDD\u539F\u56E0\u683C\u5F0F\u5316\u4E3A\u7528\u6237\u6587\u6848\uFF08DRY\uFF09\n */\nimport {\n canRunCommand,\n findModuleSubSpec,\n findPacksSubSpec,\n findTopLevelSpec,\n isCliTty,\n type CanRunFailReason,\n type CommandMode,\n type CommandSpec,\n} from \"./command-surface.js\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\nexport function formatGateFailure(reason: CanRunFailReason, hintCmd?: string): string {\n switch (reason) {\n case \"
|
|
5
|
-
"mappings": "AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,SAAS;AAClB,SAAS,SAAS;AAEX,SAAS,kBAAkB,QAA0B,SAA0B;AACpF,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,
|
|
4
|
+
"sourcesContent": ["/**\n * cli-gate.ts \u2014 \u5C06 command-surface \u62D2\u7EDD\u539F\u56E0\u683C\u5F0F\u5316\u4E3A\u7528\u6237\u6587\u6848\uFF08DRY\uFF09\n */\nimport {\n canRunCommand,\n findModuleSubSpec,\n findPacksSubSpec,\n findTopLevelSpec,\n isCliTty,\n type CanRunFailReason,\n type CommandMode,\n type CommandSpec,\n} from \"./command-surface.js\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\nexport function formatGateFailure(reason: CanRunFailReason, hintCmd?: string): string {\n switch (reason) {\n case \"replOnly\":\n return c.yellow(t(\"cli.replOnly\", { cmd: hintCmd ?? \"\" })) + \"\\n\" + c.dim(t(\"cli.replOnly.hint\"));\n case \"needTty\":\n return c.yellow(t(\"cli.needTty\", { cmd: hintCmd ?? \"\" }));\n }\n}\n\nexport function gateSpec(\n spec: CommandSpec | undefined,\n mode: CommandMode,\n hintCmd?: string\n): string | null {\n if (!spec) return null;\n const result = canRunCommand(spec, { mode, isTty: isCliTty() });\n if (result.ok) return null;\n return formatGateFailure(result.reason, hintCmd ?? spec.id);\n}\n\n/** \u9876\u5C42\u547D\u4EE4\u95E8\u7981\uFF1B\u672A\u77E5\u547D\u4EE4\u8FD4\u56DE null\uFF08\u7531\u8C03\u7528\u65B9\u62A5 unknown\uFF09\u3002 */\nexport function gateTopLevel(cmd: string | undefined, mode: CommandMode): string | null {\n const spec = findTopLevelSpec(cmd);\n if (!spec) return null;\n return gateSpec(spec, mode, cmd);\n}\n\nexport function gateModuleSub(sub: string | undefined, mode: CommandMode): string | null {\n const spec = findModuleSubSpec(sub);\n if (!spec) return null;\n return gateSpec(spec, mode, `module ${sub}`);\n}\n\nexport function gatePacksSub(sub: string | undefined, mode: CommandMode): string | null {\n const spec = findPacksSubSpec(sub);\n if (!spec) return null;\n return gateSpec(spec, mode, `packs ${sub}`);\n}\n"],
|
|
5
|
+
"mappings": "AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,SAAS;AAClB,SAAS,SAAS;AAEX,SAAS,kBAAkB,QAA0B,SAA0B;AACpF,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,GAAG,CAAC,CAAC,IAAI,OAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC;AAAA,IAClG,KAAK;AACH,aAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,GAAG,CAAC,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,SACd,MACA,MACA,SACe;AACf,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,SAAS,cAAc,MAAM,EAAE,MAAM,OAAO,SAAS,EAAE,CAAC;AAC9D,MAAI,OAAO,GAAI,QAAO;AACtB,SAAO,kBAAkB,OAAO,QAAQ,WAAW,KAAK,EAAE;AAC5D;AAGO,SAAS,aAAa,KAAyB,MAAkC;AACtF,QAAM,OAAO,iBAAiB,GAAG;AACjC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,MAAM,MAAM,GAAG;AACjC;AAEO,SAAS,cAAc,KAAyB,MAAkC;AACvF,QAAM,OAAO,kBAAkB,GAAG;AAClC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,MAAM,MAAM,UAAU,GAAG,EAAE;AAC7C;AAEO,SAAS,aAAa,KAAyB,MAAkC;AACtF,QAAM,OAAO,iBAAiB,GAAG;AACjC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,MAAM,MAAM,SAAS,GAAG,EAAE;AAC5C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type CommandChannel = "
|
|
1
|
+
export type CommandChannel = "repl" | "both";
|
|
2
2
|
export type CommandMode = "argv" | "repl";
|
|
3
3
|
export type CommandAccent = "dev";
|
|
4
4
|
export type CommandSpec = {
|
|
@@ -19,7 +19,7 @@ export type CanRunContext = {
|
|
|
19
19
|
mode: CommandMode;
|
|
20
20
|
isTty: boolean;
|
|
21
21
|
};
|
|
22
|
-
export type CanRunFailReason = "
|
|
22
|
+
export type CanRunFailReason = "replOnly" | "needTty";
|
|
23
23
|
export type CanRunResult = {
|
|
24
24
|
ok: true;
|
|
25
25
|
} | {
|
|
@@ -68,18 +68,8 @@ export type PaletteNode = {
|
|
|
68
68
|
/** 无 children 时仍需自由输入(回车后填入空格继续打字) */
|
|
69
69
|
freeArgs?: boolean;
|
|
70
70
|
};
|
|
71
|
-
/** @deprecated 兼容旧扁平条目;新逻辑用 PaletteNode */
|
|
72
|
-
export type PaletteEntry = {
|
|
73
|
-
slash: string;
|
|
74
|
-
needsArgs: boolean;
|
|
75
|
-
accent?: CommandAccent;
|
|
76
|
-
label: string;
|
|
77
|
-
descKey: string;
|
|
78
|
-
};
|
|
79
71
|
/** 层级命令树(REPL 面板主列) */
|
|
80
72
|
export declare function listPaletteRoots(mode?: CommandMode): PaletteNode[];
|
|
81
|
-
/** 扁平列表(测试 / 旧调用);层级 UI 请用 listPaletteRoots */
|
|
82
|
-
export declare function listPaletteEntries(mode?: CommandMode): PaletteEntry[];
|
|
83
73
|
export declare function isDevAccent(spec: CommandSpec | undefined): boolean;
|
|
84
74
|
/** sub 是否为开发者样式命令(蓝标)。 */
|
|
85
75
|
export declare function isDevAccentModuleSub(sub: string | undefined): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-surface.d.ts","sourceRoot":"","sources":["../src/command-surface.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command-surface.d.ts","sourceRoot":"","sources":["../src/command-surface.ts"],"names":[],"mappings":"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"}
|
package/dist/command-surface.js
CHANGED
|
@@ -30,12 +30,11 @@ function resolveTopLevelName(cmd) {
|
|
|
30
30
|
}
|
|
31
31
|
function channelAllows(channel, mode) {
|
|
32
32
|
if (channel === "both") return true;
|
|
33
|
-
if (channel === "external") return mode === "argv";
|
|
34
33
|
return mode === "repl";
|
|
35
34
|
}
|
|
36
35
|
function canRunCommand(spec, ctx) {
|
|
37
36
|
if (!channelAllows(spec.channel, ctx.mode)) {
|
|
38
|
-
return { ok: false, reason:
|
|
37
|
+
return { ok: false, reason: "replOnly" };
|
|
39
38
|
}
|
|
40
39
|
if (spec.needsTty && !ctx.isTty) {
|
|
41
40
|
return { ok: false, reason: "needTty" };
|
|
@@ -95,15 +94,11 @@ const TOP_DESC = {
|
|
|
95
94
|
init: "help.init",
|
|
96
95
|
update: "help.update",
|
|
97
96
|
locale: "help.locale",
|
|
98
|
-
remote: "help.remote.status",
|
|
99
97
|
debug: "help.debug.status",
|
|
100
98
|
install: "help.module.install",
|
|
101
99
|
uninstall: "help.module.uninstall",
|
|
102
100
|
search: "help.module.search",
|
|
103
|
-
verify: "help.module.verify"
|
|
104
|
-
watch: "help.module.watch",
|
|
105
|
-
test: "help.module.test",
|
|
106
|
-
publish: "help.module.publish"
|
|
101
|
+
verify: "help.module.verify"
|
|
107
102
|
};
|
|
108
103
|
const MODULE_DESC = {
|
|
109
104
|
list: "help.module.list",
|
|
@@ -213,28 +208,6 @@ function listPaletteRoots(mode = "repl") {
|
|
|
213
208
|
}
|
|
214
209
|
return out;
|
|
215
210
|
}
|
|
216
|
-
function listPaletteEntries(mode = "repl") {
|
|
217
|
-
const out = [];
|
|
218
|
-
const walk = (nodes, prefix) => {
|
|
219
|
-
for (const n of nodes) {
|
|
220
|
-
const path = [...prefix, n.token];
|
|
221
|
-
const slash = "/" + path.join(" ");
|
|
222
|
-
if (n.children?.length) {
|
|
223
|
-
walk(n.children, path);
|
|
224
|
-
} else {
|
|
225
|
-
out.push({
|
|
226
|
-
slash,
|
|
227
|
-
needsArgs: Boolean(n.freeArgs),
|
|
228
|
-
label: slash,
|
|
229
|
-
descKey: n.descKey ?? "help.help",
|
|
230
|
-
...n.accent ? { accent: n.accent } : {}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
};
|
|
235
|
-
walk(listPaletteRoots(mode), []);
|
|
236
|
-
return out;
|
|
237
|
-
}
|
|
238
211
|
function isDevAccent(spec) {
|
|
239
212
|
return spec?.accent === "dev";
|
|
240
213
|
}
|
|
@@ -256,7 +229,6 @@ const COMMAND_SPECS = [
|
|
|
256
229
|
{ id: "init", name: "init", channel: "both", needsTty: true },
|
|
257
230
|
{ id: "update", name: "update", channel: "both" },
|
|
258
231
|
{ id: "locale", name: "locale", channel: "both" },
|
|
259
|
-
{ id: "remote", name: "remote", channel: "both" },
|
|
260
232
|
{ id: "debug", name: "debug", channel: "both", accent: "dev" },
|
|
261
233
|
/** 顶层扁平短命令 → module.*(少写一层 module) */
|
|
262
234
|
{ id: "install", name: "install", channel: "both" },
|
|
@@ -279,9 +251,6 @@ const COMMAND_SPECS = [
|
|
|
279
251
|
{ id: "module.verify", name: "module", sub: "verify", channel: "both" },
|
|
280
252
|
{ id: "module.enable", name: "module", sub: "enable", channel: "both" },
|
|
281
253
|
{ id: "module.disable", name: "module", sub: "disable", channel: "both" },
|
|
282
|
-
{ id: "module.watch", name: "module", sub: "watch", channel: "both", accent: "dev" },
|
|
283
|
-
{ id: "module.test", name: "module", sub: "test", channel: "both", accent: "dev" },
|
|
284
|
-
{ id: "module.publish", name: "module", sub: "publish", channel: "both", accent: "dev" },
|
|
285
254
|
{ id: "packs.list", name: "packs", sub: "list", channel: "both" },
|
|
286
255
|
{ id: "packs.search", name: "packs", sub: "search", channel: "both" },
|
|
287
256
|
{ id: "packs.enable", name: "packs", sub: "enable", channel: "both" },
|
|
@@ -312,7 +281,6 @@ export {
|
|
|
312
281
|
isCliTty,
|
|
313
282
|
isDevAccent,
|
|
314
283
|
isDevAccentModuleSub,
|
|
315
|
-
listPaletteEntries,
|
|
316
284
|
listPaletteRoots,
|
|
317
285
|
listVisibleCommands,
|
|
318
286
|
listVisibleModuleSubs,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/command-surface.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * command-surface.ts \u2014 sfmc CLI \u547D\u4EE4\u901A\u9053\u6CE8\u518C\u8868\uFF08\u5355\u4E00\u6743\u5A01\uFF09\n *\n * channel:\n * - both: argv\uFF08`sfmc <cmd>`\uFF09\u4E0E REPL \u5747\u53EF\u7528\uFF08\u9ED8\u8BA4\uFF09\n * - repl: \u4EC5 REPL\uFF1Bargv \u62D2\u7EDD\uFF08\u5982 send / quit\uFF09\n * - external: \u5DF2\u5F03\u7528\uFF1B\u52FF\u65B0\u589E\uFF08\u5386\u53F2\u517C\u5BB9\u4FDD\u7559\u7C7B\u578B\uFF09\n *\n * accent: \"dev\" \u4EC5\u5F71\u54CD\u5E2E\u52A9/\u8865\u5168\u84DD\u8272\u6837\u5F0F\uFF0C\u4E0D\u53C2\u4E0E canRun\uFF08OCP/DRY\uFF09\u3002\n * \u4E1A\u52A1\u5B9E\u73B0\u4E0D\u5728\u672C\u6587\u4EF6 / \u9762\u677F\u5185\uFF1A\u5206\u53D1\u5230 commands\u3001module-commands\u3001world-packs \u7B49\u3002\n */\nimport { stdin } from \"node:process\";\n\nexport type CommandChannel = \"external\" | \"repl\" | \"both\";\nexport type CommandMode = \"argv\" | \"repl\";\nexport type CommandAccent = \"dev\";\n\nexport type CommandSpec = {\n /** \u7A33\u5B9A id\uFF0C\u5982 \"module.install\" / \"send\" / \"debug\" */\n id: string;\n /** \u9876\u5C42\u547D\u4EE4\u540D\uFF08module \u5B50\u547D\u4EE4\u7528 \"module\"\uFF1B\u9876\u5C42\u522B\u540D\u89C1 TOP_LEVEL_ALIASES\uFF09 */\n name: string;\n /** \u5B50\u547D\u4EE4\uFF08\u4EC5 module/packs \u7B49\uFF09 */\n sub?: string;\n channel: CommandChannel;\n needsTty?: boolean;\n /** \u5E2E\u52A9\u67D3\u8272\uFF1B\u4E0D\u53C2\u4E0E canRun */\n accent?: CommandAccent;\n /** \u5B50\u547D\u4EE4\u540C\u4E49\u522B\u540D\uFF08\u5982 uninstall \u2192 remove\uFF09\uFF0C\u4E0D\u662F\u9876\u5C42\u522B\u540D */\n aliases?: string[];\n};\n\nexport type CanRunContext = {\n mode: CommandMode;\n isTty: boolean;\n};\n\nexport type CanRunFailReason = \"externalOnly\" | \"replOnly\" | \"needTty\";\n\nexport type CanRunResult = { ok: true } | { ok: false; reason: CanRunFailReason };\n\n/** \u9876\u5C42\u547D\u4EE4\u522B\u540D \u2192 \u89C4\u8303 name\uFF08DRY\uFF1A\u52FF\u5728\u5404 sub spec \u91CD\u590D\u5199 mod/addon\uFF09 */\nexport const TOP_LEVEL_ALIASES: Readonly<Record<string, string>> = {\n mod: \"module\",\n addon: \"packs\",\n log: \"logs\",\n lang: \"locale\",\n h: \"help\",\n \"?\": \"help\",\n exit: \"quit\",\n q: \"quit\",\n i: \"install\",\n remove: \"uninstall\",\n};\n\n/**\n * \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module \u5B50\u547D\u4EE4\uFF08argv / REPL \u5171\u7528\uFF0C\u907F\u514D\u5728 switch \u91CC\u6563\u843D\u6620\u5C04\uFF09\n * \u4E0D\u542B enable/disable\uFF08\u4E0E packs \u51B2\u7A81\uFF0C\u4ECD\u8D70 /module \u6216 /packs\uFF09\n *\n * \u4E0E packs \u5B50\u547D\u4EE4\u5BF9\u9F50\uFF1A`packs i` \u2192 `packs install`\uFF08mapPacksSubAlias\uFF09\uFF1B\n * module \u9876\u5C42\u540C\u6837\u652F\u6301 `i` \u2192 `install`\uFF08\u89C1 TOP_LEVEL_ALIASES \u4E0E\u672C\u8868\uFF09\u3002\n */\nexport const MODULE_TOP_SHORTHAND: Readonly<Record<string, string>> = {\n i: \"install\",\n install: \"install\",\n uninstall: \"uninstall\",\n search: \"search\",\n verify: \"verify\",\n};\n\nexport function resolveModuleTopShorthand(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n return MODULE_TOP_SHORTHAND[name];\n}\n\nexport function resolveTopLevelName(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n return TOP_LEVEL_ALIASES[cmd] ?? cmd;\n}\n\nfunction channelAllows(channel: CommandChannel, mode: CommandMode): boolean {\n if (channel === \"both\") return true;\n if (channel === \"external\") return mode === \"argv\";\n return mode === \"repl\";\n}\n\n/** \u5224\u5B9A\u5F53\u524D\u6A21\u5F0F\u4E0B\u80FD\u5426\u6267\u884C\u8BE5\u547D\u4EE4\uFF08accent \u4E0D\u53C2\u4E0E\uFF09\u3002 */\nexport function canRunCommand(spec: CommandSpec, ctx: CanRunContext): CanRunResult {\n if (!channelAllows(spec.channel, ctx.mode)) {\n return { ok: false, reason: spec.channel === \"external\" ? \"externalOnly\" : \"replOnly\" };\n }\n if (spec.needsTty && !ctx.isTty) {\n return { ok: false, reason: \"needTty\" };\n }\n return { ok: true };\n}\n\n/** \u5F53\u524D\u6A21\u5F0F\u53EF\u89C1\u547D\u4EE4\uFF08help / Tab\uFF09\u3002 */\nexport function listVisibleCommands(mode: CommandMode): CommandSpec[] {\n return COMMAND_SPECS.filter((s) => channelAllows(s.channel, mode));\n}\n\n/** \u9876\u5C42\u547D\u4EE4\u540D\uFF08\u542B\u522B\u540D\uFF09\uFF0C\u4F9B REPL COMMANDS / \u8865\u5168\u3002 */\nexport function listVisibleTopLevelNames(mode: CommandMode): string[] {\n const canonical = new Set<string>();\n for (const s of listVisibleCommands(mode)) {\n canonical.add(s.name);\n }\n const out = new Set<string>(canonical);\n for (const [alias, name] of Object.entries(TOP_LEVEL_ALIASES)) {\n if (canonical.has(name)) out.add(alias);\n }\n return [...out];\n}\n\n/** \u67E5\u627E\u9876\u5C42\u547D\u4EE4\uFF08\u65E0 sub\uFF09\u7684\u4EFB\u610F\u4E00\u6761\u540C\u540D spec\uFF08\u7528\u4E8E channel \u95E8\u7981\uFF09\u3002 */\nexport function findTopLevelSpec(cmd: string | undefined): CommandSpec | undefined {\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n /* \u4F18\u5148\u65E0 sub \u7684\u9876\u5C42\u6761\u76EE\uFF1B\u5426\u5219\u53D6\u8BE5 name \u4E0B\u4EFB\u610F\u53EF\u89C1 spec \u4EE3\u8868\u901A\u9053\uFF08module/packs\uFF09 */\n const top = COMMAND_SPECS.find((s) => !s.sub && s.name === name);\n if (top) return top;\n return COMMAND_SPECS.find((s) => s.name === name);\n}\n\n/** \u67E5\u627E module \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findModuleSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find(\n (s) => s.name === \"module\" && (s.sub === sub || (s.aliases ?? []).includes(sub))\n );\n}\n\n/** \u67E5\u627E packs \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findPacksSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find(\n (s) => s.name === \"packs\" && (s.sub === sub || (s.aliases ?? []).includes(sub))\n );\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 module \u5B50\u547D\u4EE4\u540D\uFF08\u89C4\u8303\u540D\uFF0C\u4E0D\u542B remove \u522B\u540D\uFF09\u3002 */\nexport function listVisibleModuleSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"module\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 packs \u5B50\u547D\u4EE4\u540D\u3002 */\nexport function listVisiblePacksSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"packs\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** REPL \u5FEB\u901F\u8865\u5168\uFF1A\u5C42\u7EA7\u8282\u70B9\uFF08\u4E3B\u9762\u677F \u2192 \u53F3\u4FA7\u5B50\u9762\u677F\uFF09 */\nexport type PaletteNode = {\n /** \u9762\u677F\u5185\u663E\u793A\u7684\u6807\u7B7E */\n label: string;\n /** \u8FFD\u52A0\u5230\u547D\u4EE4\u884C\u7684 token\uFF08\u6839\u8282\u70B9\u542B\u6216\u4E0D\u542B\u524D\u5BFC\u903B\u8F91\u7531\u7EC4\u88C5\u8D1F\u8D23\uFF09 */\n token: string;\n /** i18n \u63CF\u8FF0\u952E */\n descKey?: string;\n accent?: CommandAccent;\n /** \u56FA\u5B9A\u4E0B\u4E00\u53C2\u9009\u9879\uFF1B\u56DE\u8F66\u540E\u5728\u53F3\u4FA7\u5C55\u5F00 */\n children?: PaletteNode[];\n /** \u65E0 children \u65F6\u4ECD\u9700\u81EA\u7531\u8F93\u5165\uFF08\u56DE\u8F66\u540E\u586B\u5165\u7A7A\u683C\u7EE7\u7EED\u6253\u5B57\uFF09 */\n freeArgs?: boolean;\n};\n\n/** @deprecated \u517C\u5BB9\u65E7\u6241\u5E73\u6761\u76EE\uFF1B\u65B0\u903B\u8F91\u7528 PaletteNode */\nexport type PaletteEntry = {\n slash: string;\n needsArgs: boolean;\n accent?: CommandAccent;\n label: string;\n descKey: string;\n};\n\nconst NO_ARG_TOP = new Set([\"status\", \"help\", \"version\", \"quit\", \"init\", \"logs\"]);\n\nconst TOP_DESC: Record<string, string> = {\n status: \"help.status\",\n logs: \"help.logs\",\n start: \"help.start\",\n stop: \"help.stop\",\n restart: \"help.restart\",\n send: \"help.send\",\n help: \"help.help\",\n version: \"help.version\",\n quit: \"help.quit\",\n init: \"help.init\",\n update: \"help.update\",\n locale: \"help.locale\",\n remote: \"help.remote.status\",\n debug: \"help.debug.status\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n search: \"help.module.search\",\n verify: \"help.module.verify\",\n watch: \"help.module.watch\",\n test: \"help.module.test\",\n publish: \"help.module.publish\",\n};\n\nconst MODULE_DESC: Record<string, string> = {\n list: \"help.module.list\",\n info: \"help.module.info\",\n build: \"help.module.build\",\n reload: \"help.module.reload\",\n search: \"help.module.search\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n verify: \"help.module.verify\",\n enable: \"help.module.toggle\",\n disable: \"help.module.toggle\",\n};\n\nconst PACKS_DESC: Record<string, string> = {\n list: \"help.packs.list\",\n search: \"help.packs.search\",\n enable: \"help.packs.enable\",\n disable: \"help.packs.disable\",\n doctor: \"help.packs.doctor\",\n path: \"help.packs.path\",\n install: \"help.addon\",\n scan: \"help.addon\",\n uninstall: \"help.addon\",\n bind: \"help.addon\",\n unbind: \"help.addon\",\n sources: \"help.addon\",\n check: \"help.addon\",\n update: \"help.addon\",\n bump: \"help.addon\",\n};\n\nfunction serviceArgNodes(): PaletteNode[] {\n return [\n { label: \"-all\", token: \"-all\" },\n ...([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({ label: n, token: n })),\n ];\n}\n\nfunction moduleChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"build\"]);\n return listVisibleModuleSubs(mode).map((sub) => {\n const spec = findModuleSubSpec(sub);\n const node: PaletteNode = {\n label: sub,\n token: sub,\n descKey: MODULE_DESC[sub] ?? \"help.module.list\",\n freeArgs: !noArg.has(sub),\n };\n if (spec?.accent) node.accent = spec.accent;\n return node;\n });\n}\n\nfunction packsChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"doctor\", \"path\", \"sources\"]);\n return listVisiblePacksSubs(mode).map((sub) => ({\n label: sub,\n token: sub,\n descKey: PACKS_DESC[sub] ?? \"help.addon\",\n freeArgs: !noArg.has(sub),\n }));\n}\n\n/** \u5C42\u7EA7\u547D\u4EE4\u6811\uFF08REPL \u9762\u677F\u4E3B\u5217\uFF09 */\nexport function listPaletteRoots(mode: CommandMode = \"repl\"): PaletteNode[] {\n const specs = listVisibleCommands(mode);\n const out: PaletteNode[] = [];\n const seen = new Set<string>();\n /** \u9762\u677F\u4E0D\u5C55\u793A\u9876\u5C42\u77ED\u547D\u4EE4\uFF0C\u7EDF\u4E00\u8D70 /module <sub>\uFF08argv \u77ED\u547D\u4EE4\u4ECD\u53EF\u7528\uFF09 */\n const skipTopShorthand = new Set(Object.keys(MODULE_TOP_SHORTHAND));\n\n for (const s of specs) {\n if (s.sub) continue;\n if (s.name === \"module\" || s.name === \"packs\") continue;\n if (skipTopShorthand.has(s.name)) continue;\n if (seen.has(s.name)) continue;\n seen.add(s.name);\n\n const node: PaletteNode = {\n label: `/${s.name}`,\n token: s.name,\n descKey: TOP_DESC[s.name] ?? \"help.help\",\n };\n if (s.accent) node.accent = s.accent;\n\n if (s.name === \"start\" || s.name === \"stop\" || s.name === \"restart\") {\n node.children = serviceArgNodes();\n } else if (s.name === \"send\") {\n node.children = ([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({\n label: n,\n token: n,\n freeArgs: true,\n }));\n } else if (!NO_ARG_TOP.has(s.name)) {\n node.freeArgs = true;\n }\n\n out.push(node);\n }\n\n const moduleSubs = moduleChildNodes(mode);\n if (moduleSubs.length > 0) {\n out.push({\n label: \"/module\",\n token: \"module\",\n descKey: \"help.module.list\",\n children: moduleSubs,\n });\n }\n\n const packsSubs = packsChildNodes(mode);\n if (packsSubs.length > 0) {\n out.push({\n label: \"/packs\",\n token: \"packs\",\n descKey: \"help.addon\",\n children: packsSubs,\n });\n }\n\n return out;\n}\n\n/** \u6241\u5E73\u5217\u8868\uFF08\u6D4B\u8BD5 / \u65E7\u8C03\u7528\uFF09\uFF1B\u5C42\u7EA7 UI \u8BF7\u7528 listPaletteRoots */\nexport function listPaletteEntries(mode: CommandMode = \"repl\"): PaletteEntry[] {\n const out: PaletteEntry[] = [];\n const walk = (nodes: PaletteNode[], prefix: string[]): void => {\n for (const n of nodes) {\n const path = [...prefix, n.token];\n const slash = \"/\" + path.join(\" \");\n if (n.children?.length) {\n walk(n.children, path);\n } else {\n out.push({\n slash,\n needsArgs: Boolean(n.freeArgs),\n label: slash,\n descKey: n.descKey ?? \"help.help\",\n ...(n.accent ? { accent: n.accent } : {}),\n });\n }\n }\n };\n walk(listPaletteRoots(mode), []);\n return out;\n}\n\nexport function isDevAccent(spec: CommandSpec | undefined): boolean {\n return spec?.accent === \"dev\";\n}\n\n/** sub \u662F\u5426\u4E3A\u5F00\u53D1\u8005\u6837\u5F0F\u547D\u4EE4\uFF08\u84DD\u6807\uFF09\u3002 */\nexport function isDevAccentModuleSub(sub: string | undefined): boolean {\n return isDevAccent(findModuleSubSpec(sub));\n}\n\n/** stdin TTY \u63A2\u6D4B\uFF08\u4F9B main/repl \u5171\u7528\uFF09\u3002 */\nexport function isCliTty(): boolean {\n return Boolean(stdin.isTTY);\n}\n\n/**\n * \u547D\u4EE4\u6CE8\u518C\u8868 \u2014\u2014 \u65B0\u589E\u547D\u4EE4\u53EA\u52A0\u6B64\u5904\uFF08OCP\uFF09\u3002\n * channel:\n * - both: argv + REPL\uFF08\u9ED8\u8BA4\uFF1B\u9762\u677F\u53EA\u8C03\u5EA6\u65E2\u6709 dispatcher\uFF09\n * - repl: \u4EC5 REPL\uFF08\u5982 send / quit\uFF09\n */\nexport const COMMAND_SPECS: readonly CommandSpec[] = [\n /* \u2500\u2500\u2500 both\uFF1A\u670D\u52A1 / \u6A21\u5757 / \u8D44\u6E90\u5305 / \u914D\u7F6E \u2500\u2500\u2500 */\n { id: \"status\", name: \"status\", channel: \"both\" },\n { id: \"start\", name: \"start\", channel: \"both\" },\n { id: \"stop\", name: \"stop\", channel: \"both\" },\n { id: \"restart\", name: \"restart\", channel: \"both\" },\n { id: \"logs\", name: \"logs\", channel: \"repl\" },\n { id: \"help\", name: \"help\", channel: \"both\" },\n { id: \"version\", name: \"version\", channel: \"both\" },\n { id: \"init\", name: \"init\", channel: \"both\", needsTty: true },\n { id: \"update\", name: \"update\", channel: \"both\" },\n { id: \"locale\", name: \"locale\", channel: \"both\" },\n { id: \"remote\", name: \"remote\", channel: \"both\" },\n { id: \"debug\", name: \"debug\", channel: \"both\", accent: \"dev\" },\n\n /** \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module.*\uFF08\u5C11\u5199\u4E00\u5C42 module\uFF09 */\n { id: \"install\", name: \"install\", channel: \"both\" },\n { id: \"uninstall\", name: \"uninstall\", channel: \"both\", aliases: [\"remove\"] },\n { id: \"search\", name: \"search\", channel: \"both\" },\n { id: \"verify\", name: \"verify\", channel: \"both\" },\n\n { id: \"module.list\", name: \"module\", sub: \"list\", channel: \"both\" },\n { id: \"module.info\", name: \"module\", sub: \"info\", channel: \"both\" },\n { id: \"module.build\", name: \"module\", sub: \"build\", channel: \"both\", accent: \"dev\" },\n { id: \"module.reload\", name: \"module\", sub: \"reload\", channel: \"both\", accent: \"dev\" },\n { id: \"module.install\", name: \"module\", sub: \"install\", channel: \"both\" },\n {\n id: \"module.uninstall\",\n name: \"module\",\n sub: \"uninstall\",\n channel: \"both\",\n aliases: [\"remove\"],\n },\n { id: \"module.search\", name: \"module\", sub: \"search\", channel: \"both\" },\n { id: \"module.verify\", name: \"module\", sub: \"verify\", channel: \"both\" },\n { id: \"module.enable\", name: \"module\", sub: \"enable\", channel: \"both\" },\n { id: \"module.disable\", name: \"module\", sub: \"disable\", channel: \"both\" },\n { id: \"module.watch\", name: \"module\", sub: \"watch\", channel: \"both\", accent: \"dev\" },\n { id: \"module.test\", name: \"module\", sub: \"test\", channel: \"both\", accent: \"dev\" },\n { id: \"module.publish\", name: \"module\", sub: \"publish\", channel: \"both\", accent: \"dev\" },\n\n { id: \"packs.list\", name: \"packs\", sub: \"list\", channel: \"both\" },\n { id: \"packs.search\", name: \"packs\", sub: \"search\", channel: \"both\" },\n { id: \"packs.enable\", name: \"packs\", sub: \"enable\", channel: \"both\" },\n { id: \"packs.disable\", name: \"packs\", sub: \"disable\", channel: \"both\" },\n { id: \"packs.doctor\", name: \"packs\", sub: \"doctor\", channel: \"both\" },\n { id: \"packs.path\", name: \"packs\", sub: \"path\", channel: \"both\" },\n { id: \"packs.install\", name: \"packs\", sub: \"install\", channel: \"both\" },\n { id: \"packs.scan\", name: \"packs\", sub: \"scan\", channel: \"both\" },\n { id: \"packs.uninstall\", name: \"packs\", sub: \"uninstall\", channel: \"both\" },\n { id: \"packs.bind\", name: \"packs\", sub: \"bind\", channel: \"both\" },\n { id: \"packs.unbind\", name: \"packs\", sub: \"unbind\", channel: \"both\" },\n { id: \"packs.sources\", name: \"packs\", sub: \"sources\", channel: \"both\" },\n { id: \"packs.check\", name: \"packs\", sub: \"check\", channel: \"both\" },\n { id: \"packs.update\", name: \"packs\", sub: \"update\", channel: \"both\" },\n { id: \"packs.bump\", name: \"packs\", sub: \"bump\", channel: \"both\" },\n\n /* \u2500\u2500\u2500 repl-only \u2500\u2500\u2500 */\n { id: \"send\", name: \"send\", channel: \"repl\" },\n { id: \"quit\", name: \"quit\", channel: \"repl\" },\n];\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * command-surface.ts \u2014 sfmc CLI \u547D\u4EE4\u901A\u9053\u6CE8\u518C\u8868\uFF08\u5355\u4E00\u6743\u5A01\uFF09\n *\n * channel:\n * - both: argv\uFF08`sfmc <cmd>`\uFF09\u4E0E REPL \u5747\u53EF\u7528\uFF08\u9ED8\u8BA4\uFF09\n * - repl: \u4EC5 REPL\uFF1Bargv \u62D2\u7EDD\uFF08\u5982 send / quit\uFF09\n *\n * accent: \"dev\" \u4EC5\u5F71\u54CD\u5E2E\u52A9/\u8865\u5168\u84DD\u8272\u6837\u5F0F\uFF0C\u4E0D\u53C2\u4E0E canRun\uFF08OCP/DRY\uFF09\u3002\n * \u4E1A\u52A1\u5B9E\u73B0\u4E0D\u5728\u672C\u6587\u4EF6 / \u9762\u677F\u5185\uFF1A\u5206\u53D1\u5230 commands\u3001module-commands\u3001world-packs \u7B49\u3002\n */\nimport { stdin } from \"node:process\";\n\nexport type CommandChannel = \"repl\" | \"both\";\nexport type CommandMode = \"argv\" | \"repl\";\nexport type CommandAccent = \"dev\";\n\nexport type CommandSpec = {\n /** \u7A33\u5B9A id\uFF0C\u5982 \"module.install\" / \"send\" / \"debug\" */\n id: string;\n /** \u9876\u5C42\u547D\u4EE4\u540D\uFF08module \u5B50\u547D\u4EE4\u7528 \"module\"\uFF1B\u9876\u5C42\u522B\u540D\u89C1 TOP_LEVEL_ALIASES\uFF09 */\n name: string;\n /** \u5B50\u547D\u4EE4\uFF08\u4EC5 module/packs \u7B49\uFF09 */\n sub?: string;\n channel: CommandChannel;\n needsTty?: boolean;\n /** \u5E2E\u52A9\u67D3\u8272\uFF1B\u4E0D\u53C2\u4E0E canRun */\n accent?: CommandAccent;\n /** \u5B50\u547D\u4EE4\u540C\u4E49\u522B\u540D\uFF08\u5982 uninstall \u2192 remove\uFF09\uFF0C\u4E0D\u662F\u9876\u5C42\u522B\u540D */\n aliases?: string[];\n};\n\nexport type CanRunContext = {\n mode: CommandMode;\n isTty: boolean;\n};\n\nexport type CanRunFailReason = \"replOnly\" | \"needTty\";\n\nexport type CanRunResult = { ok: true } | { ok: false; reason: CanRunFailReason };\n\n/** \u9876\u5C42\u547D\u4EE4\u522B\u540D \u2192 \u89C4\u8303 name\uFF08DRY\uFF1A\u52FF\u5728\u5404 sub spec \u91CD\u590D\u5199 mod/addon\uFF09 */\nexport const TOP_LEVEL_ALIASES: Readonly<Record<string, string>> = {\n mod: \"module\",\n addon: \"packs\",\n log: \"logs\",\n lang: \"locale\",\n h: \"help\",\n \"?\": \"help\",\n exit: \"quit\",\n q: \"quit\",\n i: \"install\",\n remove: \"uninstall\",\n};\n\n/**\n * \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module \u5B50\u547D\u4EE4\uFF08argv / REPL \u5171\u7528\uFF0C\u907F\u514D\u5728 switch \u91CC\u6563\u843D\u6620\u5C04\uFF09\n * \u4E0D\u542B enable/disable\uFF08\u4E0E packs \u51B2\u7A81\uFF0C\u4ECD\u8D70 /module \u6216 /packs\uFF09\n *\n * \u4E0E packs \u5B50\u547D\u4EE4\u5BF9\u9F50\uFF1A`packs i` \u2192 `packs install`\uFF08mapPacksSubAlias\uFF09\uFF1B\n * module \u9876\u5C42\u540C\u6837\u652F\u6301 `i` \u2192 `install`\uFF08\u89C1 TOP_LEVEL_ALIASES \u4E0E\u672C\u8868\uFF09\u3002\n */\nexport const MODULE_TOP_SHORTHAND: Readonly<Record<string, string>> = {\n i: \"install\",\n install: \"install\",\n uninstall: \"uninstall\",\n search: \"search\",\n verify: \"verify\",\n};\n\nexport function resolveModuleTopShorthand(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n return MODULE_TOP_SHORTHAND[name];\n}\n\nexport function resolveTopLevelName(cmd: string | undefined): string | undefined {\n if (!cmd) return undefined;\n return TOP_LEVEL_ALIASES[cmd] ?? cmd;\n}\n\nfunction channelAllows(channel: CommandChannel, mode: CommandMode): boolean {\n if (channel === \"both\") return true;\n return mode === \"repl\";\n}\n\n/** \u5224\u5B9A\u5F53\u524D\u6A21\u5F0F\u4E0B\u80FD\u5426\u6267\u884C\u8BE5\u547D\u4EE4\uFF08accent \u4E0D\u53C2\u4E0E\uFF09\u3002 */\nexport function canRunCommand(spec: CommandSpec, ctx: CanRunContext): CanRunResult {\n if (!channelAllows(spec.channel, ctx.mode)) {\n return { ok: false, reason: \"replOnly\" };\n }\n if (spec.needsTty && !ctx.isTty) {\n return { ok: false, reason: \"needTty\" };\n }\n return { ok: true };\n}\n\n/** \u5F53\u524D\u6A21\u5F0F\u53EF\u89C1\u547D\u4EE4\uFF08help / Tab\uFF09\u3002 */\nexport function listVisibleCommands(mode: CommandMode): CommandSpec[] {\n return COMMAND_SPECS.filter((s) => channelAllows(s.channel, mode));\n}\n\n/** \u9876\u5C42\u547D\u4EE4\u540D\uFF08\u542B\u522B\u540D\uFF09\uFF0C\u4F9B REPL COMMANDS / \u8865\u5168\u3002 */\nexport function listVisibleTopLevelNames(mode: CommandMode): string[] {\n const canonical = new Set<string>();\n for (const s of listVisibleCommands(mode)) {\n canonical.add(s.name);\n }\n const out = new Set<string>(canonical);\n for (const [alias, name] of Object.entries(TOP_LEVEL_ALIASES)) {\n if (canonical.has(name)) out.add(alias);\n }\n return [...out];\n}\n\n/** \u67E5\u627E\u9876\u5C42\u547D\u4EE4\uFF08\u65E0 sub\uFF09\u7684\u4EFB\u610F\u4E00\u6761\u540C\u540D spec\uFF08\u7528\u4E8E channel \u95E8\u7981\uFF09\u3002 */\nexport function findTopLevelSpec(cmd: string | undefined): CommandSpec | undefined {\n const name = resolveTopLevelName(cmd);\n if (!name) return undefined;\n /* \u4F18\u5148\u65E0 sub \u7684\u9876\u5C42\u6761\u76EE\uFF1B\u5426\u5219\u53D6\u8BE5 name \u4E0B\u4EFB\u610F\u53EF\u89C1 spec \u4EE3\u8868\u901A\u9053\uFF08module/packs\uFF09 */\n const top = COMMAND_SPECS.find((s) => !s.sub && s.name === name);\n if (top) return top;\n return COMMAND_SPECS.find((s) => s.name === name);\n}\n\n/** \u67E5\u627E module \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findModuleSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find(\n (s) => s.name === \"module\" && (s.sub === sub || (s.aliases ?? []).includes(sub))\n );\n}\n\n/** \u67E5\u627E packs \u5B50\u547D\u4EE4 spec\u3002 */\nexport function findPacksSubSpec(sub: string | undefined): CommandSpec | undefined {\n if (!sub) return undefined;\n return COMMAND_SPECS.find(\n (s) => s.name === \"packs\" && (s.sub === sub || (s.aliases ?? []).includes(sub))\n );\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 module \u5B50\u547D\u4EE4\u540D\uFF08\u89C4\u8303\u540D\uFF0C\u4E0D\u542B remove \u522B\u540D\uFF09\u3002 */\nexport function listVisibleModuleSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"module\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** \u5F53\u524D mode \u4E0B\u53EF\u89C1\u7684 packs \u5B50\u547D\u4EE4\u540D\u3002 */\nexport function listVisiblePacksSubs(mode: CommandMode): string[] {\n return listVisibleCommands(mode)\n .filter((s) => s.name === \"packs\" && s.sub)\n .map((s) => s.sub!);\n}\n\n/** REPL \u5FEB\u901F\u8865\u5168\uFF1A\u5C42\u7EA7\u8282\u70B9\uFF08\u4E3B\u9762\u677F \u2192 \u53F3\u4FA7\u5B50\u9762\u677F\uFF09 */\nexport type PaletteNode = {\n /** \u9762\u677F\u5185\u663E\u793A\u7684\u6807\u7B7E */\n label: string;\n /** \u8FFD\u52A0\u5230\u547D\u4EE4\u884C\u7684 token\uFF08\u6839\u8282\u70B9\u542B\u6216\u4E0D\u542B\u524D\u5BFC\u903B\u8F91\u7531\u7EC4\u88C5\u8D1F\u8D23\uFF09 */\n token: string;\n /** i18n \u63CF\u8FF0\u952E */\n descKey?: string;\n accent?: CommandAccent;\n /** \u56FA\u5B9A\u4E0B\u4E00\u53C2\u9009\u9879\uFF1B\u56DE\u8F66\u540E\u5728\u53F3\u4FA7\u5C55\u5F00 */\n children?: PaletteNode[];\n /** \u65E0 children \u65F6\u4ECD\u9700\u81EA\u7531\u8F93\u5165\uFF08\u56DE\u8F66\u540E\u586B\u5165\u7A7A\u683C\u7EE7\u7EED\u6253\u5B57\uFF09 */\n freeArgs?: boolean;\n};\n\nconst NO_ARG_TOP = new Set([\"status\", \"help\", \"version\", \"quit\", \"init\", \"logs\"]);\n\nconst TOP_DESC: Record<string, string> = {\n status: \"help.status\",\n logs: \"help.logs\",\n start: \"help.start\",\n stop: \"help.stop\",\n restart: \"help.restart\",\n send: \"help.send\",\n help: \"help.help\",\n version: \"help.version\",\n quit: \"help.quit\",\n init: \"help.init\",\n update: \"help.update\",\n locale: \"help.locale\",\n debug: \"help.debug.status\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n search: \"help.module.search\",\n verify: \"help.module.verify\",\n};\n\nconst MODULE_DESC: Record<string, string> = {\n list: \"help.module.list\",\n info: \"help.module.info\",\n build: \"help.module.build\",\n reload: \"help.module.reload\",\n search: \"help.module.search\",\n install: \"help.module.install\",\n uninstall: \"help.module.uninstall\",\n verify: \"help.module.verify\",\n enable: \"help.module.toggle\",\n disable: \"help.module.toggle\",\n};\n\nconst PACKS_DESC: Record<string, string> = {\n list: \"help.packs.list\",\n search: \"help.packs.search\",\n enable: \"help.packs.enable\",\n disable: \"help.packs.disable\",\n doctor: \"help.packs.doctor\",\n path: \"help.packs.path\",\n install: \"help.addon\",\n scan: \"help.addon\",\n uninstall: \"help.addon\",\n bind: \"help.addon\",\n unbind: \"help.addon\",\n sources: \"help.addon\",\n check: \"help.addon\",\n update: \"help.addon\",\n bump: \"help.addon\",\n};\n\nfunction serviceArgNodes(): PaletteNode[] {\n return [\n { label: \"-all\", token: \"-all\" },\n ...([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({ label: n, token: n })),\n ];\n}\n\nfunction moduleChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"build\"]);\n return listVisibleModuleSubs(mode).map((sub) => {\n const spec = findModuleSubSpec(sub);\n const node: PaletteNode = {\n label: sub,\n token: sub,\n descKey: MODULE_DESC[sub] ?? \"help.module.list\",\n freeArgs: !noArg.has(sub),\n };\n if (spec?.accent) node.accent = spec.accent;\n return node;\n });\n}\n\nfunction packsChildNodes(mode: CommandMode): PaletteNode[] {\n const noArg = new Set([\"list\", \"doctor\", \"path\", \"sources\"]);\n return listVisiblePacksSubs(mode).map((sub) => ({\n label: sub,\n token: sub,\n descKey: PACKS_DESC[sub] ?? \"help.addon\",\n freeArgs: !noArg.has(sub),\n }));\n}\n\n/** \u5C42\u7EA7\u547D\u4EE4\u6811\uFF08REPL \u9762\u677F\u4E3B\u5217\uFF09 */\nexport function listPaletteRoots(mode: CommandMode = \"repl\"): PaletteNode[] {\n const specs = listVisibleCommands(mode);\n const out: PaletteNode[] = [];\n const seen = new Set<string>();\n /** \u9762\u677F\u4E0D\u5C55\u793A\u9876\u5C42\u77ED\u547D\u4EE4\uFF0C\u7EDF\u4E00\u8D70 /module <sub>\uFF08argv \u77ED\u547D\u4EE4\u4ECD\u53EF\u7528\uFF09 */\n const skipTopShorthand = new Set(Object.keys(MODULE_TOP_SHORTHAND));\n\n for (const s of specs) {\n if (s.sub) continue;\n if (s.name === \"module\" || s.name === \"packs\") continue;\n if (skipTopShorthand.has(s.name)) continue;\n if (seen.has(s.name)) continue;\n seen.add(s.name);\n\n const node: PaletteNode = {\n label: `/${s.name}`,\n token: s.name,\n descKey: TOP_DESC[s.name] ?? \"help.help\",\n };\n if (s.accent) node.accent = s.accent;\n\n if (s.name === \"start\" || s.name === \"stop\" || s.name === \"restart\") {\n node.children = serviceArgNodes();\n } else if (s.name === \"send\") {\n node.children = ([\"bds\", \"db\", \"qq\", \"llbot\"] as const).map((n) => ({\n label: n,\n token: n,\n freeArgs: true,\n }));\n } else if (!NO_ARG_TOP.has(s.name)) {\n node.freeArgs = true;\n }\n\n out.push(node);\n }\n\n const moduleSubs = moduleChildNodes(mode);\n if (moduleSubs.length > 0) {\n out.push({\n label: \"/module\",\n token: \"module\",\n descKey: \"help.module.list\",\n children: moduleSubs,\n });\n }\n\n const packsSubs = packsChildNodes(mode);\n if (packsSubs.length > 0) {\n out.push({\n label: \"/packs\",\n token: \"packs\",\n descKey: \"help.addon\",\n children: packsSubs,\n });\n }\n\n return out;\n}\n\nexport function isDevAccent(spec: CommandSpec | undefined): boolean {\n return spec?.accent === \"dev\";\n}\n\n/** sub \u662F\u5426\u4E3A\u5F00\u53D1\u8005\u6837\u5F0F\u547D\u4EE4\uFF08\u84DD\u6807\uFF09\u3002 */\nexport function isDevAccentModuleSub(sub: string | undefined): boolean {\n return isDevAccent(findModuleSubSpec(sub));\n}\n\n/** stdin TTY \u63A2\u6D4B\uFF08\u4F9B main/repl \u5171\u7528\uFF09\u3002 */\nexport function isCliTty(): boolean {\n return Boolean(stdin.isTTY);\n}\n\n/**\n * \u547D\u4EE4\u6CE8\u518C\u8868 \u2014\u2014 \u65B0\u589E\u547D\u4EE4\u53EA\u52A0\u6B64\u5904\uFF08OCP\uFF09\u3002\n * channel:\n * - both: argv + REPL\uFF08\u9ED8\u8BA4\uFF1B\u9762\u677F\u53EA\u8C03\u5EA6\u65E2\u6709 dispatcher\uFF09\n * - repl: \u4EC5 REPL\uFF08\u5982 send / quit\uFF09\n */\nexport const COMMAND_SPECS: readonly CommandSpec[] = [\n /* \u2500\u2500\u2500 both\uFF1A\u670D\u52A1 / \u6A21\u5757 / \u8D44\u6E90\u5305 / \u914D\u7F6E \u2500\u2500\u2500 */\n { id: \"status\", name: \"status\", channel: \"both\" },\n { id: \"start\", name: \"start\", channel: \"both\" },\n { id: \"stop\", name: \"stop\", channel: \"both\" },\n { id: \"restart\", name: \"restart\", channel: \"both\" },\n { id: \"logs\", name: \"logs\", channel: \"repl\" },\n { id: \"help\", name: \"help\", channel: \"both\" },\n { id: \"version\", name: \"version\", channel: \"both\" },\n { id: \"init\", name: \"init\", channel: \"both\", needsTty: true },\n { id: \"update\", name: \"update\", channel: \"both\" },\n { id: \"locale\", name: \"locale\", channel: \"both\" },\n { id: \"debug\", name: \"debug\", channel: \"both\", accent: \"dev\" },\n\n /** \u9876\u5C42\u6241\u5E73\u77ED\u547D\u4EE4 \u2192 module.*\uFF08\u5C11\u5199\u4E00\u5C42 module\uFF09 */\n { id: \"install\", name: \"install\", channel: \"both\" },\n { id: \"uninstall\", name: \"uninstall\", channel: \"both\", aliases: [\"remove\"] },\n { id: \"search\", name: \"search\", channel: \"both\" },\n { id: \"verify\", name: \"verify\", channel: \"both\" },\n\n { id: \"module.list\", name: \"module\", sub: \"list\", channel: \"both\" },\n { id: \"module.info\", name: \"module\", sub: \"info\", channel: \"both\" },\n { id: \"module.build\", name: \"module\", sub: \"build\", channel: \"both\", accent: \"dev\" },\n { id: \"module.reload\", name: \"module\", sub: \"reload\", channel: \"both\", accent: \"dev\" },\n { id: \"module.install\", name: \"module\", sub: \"install\", channel: \"both\" },\n {\n id: \"module.uninstall\",\n name: \"module\",\n sub: \"uninstall\",\n channel: \"both\",\n aliases: [\"remove\"],\n },\n { id: \"module.search\", name: \"module\", sub: \"search\", channel: \"both\" },\n { id: \"module.verify\", name: \"module\", sub: \"verify\", channel: \"both\" },\n { id: \"module.enable\", name: \"module\", sub: \"enable\", channel: \"both\" },\n { id: \"module.disable\", name: \"module\", sub: \"disable\", channel: \"both\" },\n\n { id: \"packs.list\", name: \"packs\", sub: \"list\", channel: \"both\" },\n { id: \"packs.search\", name: \"packs\", sub: \"search\", channel: \"both\" },\n { id: \"packs.enable\", name: \"packs\", sub: \"enable\", channel: \"both\" },\n { id: \"packs.disable\", name: \"packs\", sub: \"disable\", channel: \"both\" },\n { id: \"packs.doctor\", name: \"packs\", sub: \"doctor\", channel: \"both\" },\n { id: \"packs.path\", name: \"packs\", sub: \"path\", channel: \"both\" },\n { id: \"packs.install\", name: \"packs\", sub: \"install\", channel: \"both\" },\n { id: \"packs.scan\", name: \"packs\", sub: \"scan\", channel: \"both\" },\n { id: \"packs.uninstall\", name: \"packs\", sub: \"uninstall\", channel: \"both\" },\n { id: \"packs.bind\", name: \"packs\", sub: \"bind\", channel: \"both\" },\n { id: \"packs.unbind\", name: \"packs\", sub: \"unbind\", channel: \"both\" },\n { id: \"packs.sources\", name: \"packs\", sub: \"sources\", channel: \"both\" },\n { id: \"packs.check\", name: \"packs\", sub: \"check\", channel: \"both\" },\n { id: \"packs.update\", name: \"packs\", sub: \"update\", channel: \"both\" },\n { id: \"packs.bump\", name: \"packs\", sub: \"bump\", channel: \"both\" },\n\n /* \u2500\u2500\u2500 repl-only \u2500\u2500\u2500 */\n { id: \"send\", name: \"send\", channel: \"repl\" },\n { id: \"quit\", name: \"quit\", channel: \"repl\" },\n];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAWA,OAAO,EAAuD,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAwDtG,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBjD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CA+C7F;AAkBD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC3D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6D1D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB3E;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB7D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CA8BnD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAIlD;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA2EpE"}
|
package/dist/commands.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { killBedrockServerByImage, probeBdsStatus, clearBdsPidFile } from "@sfmc-bds/bds-tools/process-probe";
|
|
2
|
+
import {
|
|
3
|
+
DEFAULT_QQ_CONFIG,
|
|
4
|
+
loadEnsuredConfig,
|
|
5
|
+
qqRuntimeStatusPath
|
|
6
|
+
} from "@sfmc-bds/sdk/node/config";
|
|
7
|
+
import { findNodeServicePids, killNodeServiceByScript } from "./node-service-probe.js";
|
|
2
8
|
import { pushLog as pushUnifiedLog } from "./logs.js";
|
|
3
9
|
import { t } from "./i18n/index.js";
|
|
4
10
|
import { spawnService } from "./runtime.js";
|
|
@@ -6,6 +12,7 @@ import { ROOT, SERVICE_NAMES, queryServicesRuntime, services } from "./services.
|
|
|
6
12
|
import { c, DIVIDER, highlightLogLine, padRight } from "./theme.js";
|
|
7
13
|
import { stripTaskbarOsc } from "@sfmc-bds/bds-tools/taskbar";
|
|
8
14
|
import { didUpdateDeploy } from "@sfmc-bds/bds-tools/update-result";
|
|
15
|
+
import fs from "node:fs";
|
|
9
16
|
function parseService(raw) {
|
|
10
17
|
const s = raw.toLowerCase();
|
|
11
18
|
if (SERVICE_NAMES.includes(s)) return s;
|
|
@@ -19,7 +26,32 @@ function statusLine(name, running, pid, uptime, ownership) {
|
|
|
19
26
|
else if (running && ownership === "external") owner = c.yellow(t("svc.owner.external"));
|
|
20
27
|
const pidStr = pid ? c.dim(String(pid)) : c.dim("\u2014");
|
|
21
28
|
const upStr = uptime !== "\u2014" ? c.dim(uptime) : c.dim("\u2014");
|
|
22
|
-
return ` ${dot} ${c.bold(padRight(name,
|
|
29
|
+
return ` ${dot} ${c.bold(padRight(name, 14))} ${padRight(state, 8)} ${padRight(owner, 6)} ${padRight(pidStr, 8)} ${upStr}`;
|
|
30
|
+
}
|
|
31
|
+
function qqBridgeStatusFooter() {
|
|
32
|
+
const qqCfg = loadEnsuredConfig(
|
|
33
|
+
ROOT,
|
|
34
|
+
"qq_config.json",
|
|
35
|
+
"qq_config",
|
|
36
|
+
{ ...DEFAULT_QQ_CONFIG }
|
|
37
|
+
);
|
|
38
|
+
const backend = qqCfg.qq_backend === "llbot" ? "llbot" : "official";
|
|
39
|
+
const enabled = qqCfg.qq_enabled !== false;
|
|
40
|
+
if (backend === "llbot") {
|
|
41
|
+
const group = qqCfg.qq_group_id || "\u2014";
|
|
42
|
+
const pathHint = qqCfg.llbot_path ? String(qqCfg.llbot_path) : "\u2014";
|
|
43
|
+
return `
|
|
44
|
+
${c.dim(t("svc.qq.footer.llbot", { enabled: enabled ? "on" : "off", group, path: pathHint }))}
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
const appId = String(qqCfg.qq_app_id ?? "").trim();
|
|
48
|
+
const appIdHint = appId ? appId.length > 8 ? `${appId.slice(0, 4)}\u2026${appId.slice(-4)}` : appId : "\u2014";
|
|
49
|
+
const openid = String(qqCfg.qq_group_openid ?? "").trim() || "\u2014";
|
|
50
|
+
const sandbox = qqCfg.qq_sandbox ? "sandbox" : "prod";
|
|
51
|
+
const creds = appId && String(qqCfg.qq_app_secret ?? "").trim() ? "ok" : "missing";
|
|
52
|
+
return `
|
|
53
|
+
${c.dim(t("svc.qq.footer.official", { enabled: enabled ? "on" : "off", appId: appIdHint, openid, sandbox, creds }))}
|
|
54
|
+
`;
|
|
23
55
|
}
|
|
24
56
|
async function cmdStatus() {
|
|
25
57
|
const rows = await queryServicesRuntime();
|
|
@@ -29,10 +61,10 @@ async function cmdStatus() {
|
|
|
29
61
|
const ownerH = t("svc.col.owner");
|
|
30
62
|
const pidH = t("svc.col.pid");
|
|
31
63
|
const upH = t("svc.col.uptime");
|
|
32
|
-
const header = ` ${padRight(nameH,
|
|
64
|
+
const header = ` ${padRight(nameH, 16)}${padRight(statusH, 8)}${padRight(ownerH, 6)}${padRight(pidH, 8)}${upH}`;
|
|
33
65
|
return `
|
|
34
66
|
${c.bold(t("svc.header"))}
|
|
35
|
-
` + c.dim(header) + "\n" + DIVIDER + "\n" + lines.join("\n") +
|
|
67
|
+
` + c.dim(header) + "\n" + DIVIDER + "\n" + lines.join("\n") + qqBridgeStatusFooter();
|
|
36
68
|
}
|
|
37
69
|
function cmdLogs(args, onFollow) {
|
|
38
70
|
let n = 20;
|
|
@@ -72,6 +104,16 @@ ${c.bold(t("svc.logs.header", { title: svcObj.title, count: lines.length }))}`;
|
|
|
72
104
|
}
|
|
73
105
|
const STARTING = /* @__PURE__ */ new Set();
|
|
74
106
|
const STOPPING = /* @__PURE__ */ new Set();
|
|
107
|
+
function isNodeSvc(name) {
|
|
108
|
+
return name === "db" || name === "qq";
|
|
109
|
+
}
|
|
110
|
+
function clearQqRuntimeFile() {
|
|
111
|
+
try {
|
|
112
|
+
const file = qqRuntimeStatusPath(ROOT);
|
|
113
|
+
if (fs.existsSync(file)) fs.unlinkSync(file);
|
|
114
|
+
} catch {
|
|
115
|
+
}
|
|
116
|
+
}
|
|
75
117
|
async function cmdStart(raw) {
|
|
76
118
|
const svc = parseService(raw);
|
|
77
119
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
@@ -87,11 +129,25 @@ async function cmdStart(raw) {
|
|
|
87
129
|
);
|
|
88
130
|
}
|
|
89
131
|
}
|
|
132
|
+
if (isNodeSvc(svc)) {
|
|
133
|
+
const external = await findNodeServicePids(svc);
|
|
134
|
+
if (external.length > 0) {
|
|
135
|
+
return c.yellow(
|
|
136
|
+
t("svc.alreadyRunning", { title: svcObj.title, pid: String(external.join(",")) })
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
90
140
|
if (svcObj.running) return c.yellow(t("svc.alreadyRunning", { title: svcObj.title, pid: svcObj.pid }));
|
|
91
141
|
if (STARTING.has(svc)) return c.dim(t("svc.alreadyStarting", { title: svcObj.title }));
|
|
92
142
|
STARTING.add(svc);
|
|
93
143
|
try {
|
|
94
|
-
await svcObj.start();
|
|
144
|
+
const outcome = await svcObj.start();
|
|
145
|
+
if (outcome.status === "skipped") {
|
|
146
|
+
return c.yellow(t("svc.skipped", { title: svcObj.title, reason: outcome.reason }));
|
|
147
|
+
}
|
|
148
|
+
if (outcome.status === "already") {
|
|
149
|
+
return c.yellow(t("svc.alreadyRunning", { title: svcObj.title, pid: svcObj.pid }));
|
|
150
|
+
}
|
|
95
151
|
return c.green(t("svc.started", { title: svcObj.title }));
|
|
96
152
|
} catch (e) {
|
|
97
153
|
return c.red(t("svc.startFailed", { title: svcObj.title, message: e.message }));
|
|
@@ -123,6 +179,29 @@ async function cmdStop(raw) {
|
|
|
123
179
|
}
|
|
124
180
|
}
|
|
125
181
|
}
|
|
182
|
+
if (isNodeSvc(svc)) {
|
|
183
|
+
if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
|
|
184
|
+
STOPPING.add(svc);
|
|
185
|
+
try {
|
|
186
|
+
const managed = svcObj.running;
|
|
187
|
+
if (managed) {
|
|
188
|
+
await svcObj.stop();
|
|
189
|
+
}
|
|
190
|
+
const killed = await killNodeServiceByScript(svc);
|
|
191
|
+
if (svc === "qq") clearQqRuntimeFile();
|
|
192
|
+
if (!managed && killed.length === 0) {
|
|
193
|
+
return c.yellow(t("svc.alreadyStopped", { title: svcObj.title }));
|
|
194
|
+
}
|
|
195
|
+
if (!managed && killed.length > 0) {
|
|
196
|
+
return c.dim(t("svc.stoppedExternal", { title: svcObj.title }));
|
|
197
|
+
}
|
|
198
|
+
return c.dim(t("svc.stoppedMsg", { title: svcObj.title }));
|
|
199
|
+
} catch (e) {
|
|
200
|
+
return c.red(t("svc.stopFailed", { title: svcObj.title, message: e.message }));
|
|
201
|
+
} finally {
|
|
202
|
+
STOPPING.delete(svc);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
126
205
|
if (!svcObj.running) return c.yellow(t("svc.alreadyStopped", { title: svcObj.title }));
|
|
127
206
|
if (STOPPING.has(svc)) return c.dim(t("svc.alreadyStopping", { title: svcObj.title }));
|
|
128
207
|
STOPPING.add(svc);
|
|
@@ -162,13 +241,21 @@ async function cmdSend(raw, message) {
|
|
|
162
241
|
async function cmdRestart(raw) {
|
|
163
242
|
const svc = parseService(raw);
|
|
164
243
|
if (!svc) return c.red(t("svc.unknown", { name: raw, list: SERVICE_NAMES.join(", ") }));
|
|
165
|
-
if (svc === "bds") {
|
|
166
|
-
await cmdStop(
|
|
167
|
-
|
|
244
|
+
if (svc === "bds" || isNodeSvc(svc)) {
|
|
245
|
+
const stopMsg = await cmdStop(svc);
|
|
246
|
+
const startMsg = await cmdStart(svc);
|
|
247
|
+
if (/失败|failed/i.test(stopMsg) && !/已停止|stopped|already/i.test(stopMsg)) {
|
|
248
|
+
return stopMsg;
|
|
249
|
+
}
|
|
250
|
+
if (/失败|failed/i.test(startMsg)) return startMsg;
|
|
251
|
+
return c.green(t("svc.restarted", { title: services[svc].title }));
|
|
168
252
|
}
|
|
169
253
|
const svcObj = services[svc];
|
|
170
254
|
try {
|
|
171
|
-
await svcObj.restart();
|
|
255
|
+
const outcome = await svcObj.restart();
|
|
256
|
+
if (outcome.status === "skipped") {
|
|
257
|
+
return c.yellow(t("svc.skipped", { title: svcObj.title, reason: outcome.reason }));
|
|
258
|
+
}
|
|
172
259
|
return c.green(t("svc.restarted", { title: svcObj.title }));
|
|
173
260
|
} catch (e) {
|
|
174
261
|
return c.red(t("svc.restartFailed", { title: svcObj.title, message: e.message }));
|
|
@@ -176,8 +263,34 @@ async function cmdRestart(raw) {
|
|
|
176
263
|
}
|
|
177
264
|
async function cmdStartAll() {
|
|
178
265
|
const { startAll } = await import("./services.js");
|
|
179
|
-
await startAll();
|
|
180
|
-
|
|
266
|
+
const result = await startAll();
|
|
267
|
+
const parts = [];
|
|
268
|
+
if (result.started.length > 0) {
|
|
269
|
+
parts.push(c.green(t("svc.startAll.started", { list: result.started.join(", ") })));
|
|
270
|
+
}
|
|
271
|
+
if (result.skipped.length > 0) {
|
|
272
|
+
parts.push(
|
|
273
|
+
c.dim(
|
|
274
|
+
t("svc.startAll.skipped", {
|
|
275
|
+
list: result.skipped.map((s) => `${s.name}(${s.reason})`).join("; ")
|
|
276
|
+
})
|
|
277
|
+
)
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
if (result.failed.length > 0) {
|
|
281
|
+
parts.push(
|
|
282
|
+
c.red(
|
|
283
|
+
t("svc.startAll.failed", {
|
|
284
|
+
list: result.failed.map((s) => `${s.name}: ${s.reason}`).join("; ")
|
|
285
|
+
})
|
|
286
|
+
)
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
if (parts.length === 0) return c.dim(t("svc.startAll.empty"));
|
|
290
|
+
if (result.failed.length === 0 && result.skipped.length === 0) {
|
|
291
|
+
return c.green(t("svc.allStarted"));
|
|
292
|
+
}
|
|
293
|
+
return parts.join("\n");
|
|
181
294
|
}
|
|
182
295
|
async function cmdStopAll() {
|
|
183
296
|
const { stopAll } = await import("./services.js");
|