diff --git a/sfmc/src/module-commands.ts b/sfmc/src/module-commands.ts index 3f3c0954..778f4612 100644 --- a/sfmc/src/module-commands.ts +++ b/sfmc/src/module-commands.ts @@ -28,12 +28,20 @@ /** 顶层命令名(主名 + 短别名),供 HELP / 补全 / 分发共用。 */ export const MODULE_CMD_NAMES = ["module", "mod"] as const; -/** HELP 行首标签,如 `module/mod`(与 MODULE_CMD_NAMES 同源,避免两处漂移)。 */ -export const MODULE_CMD_LABEL = MODULE_CMD_NAMES.join("/"); +export type ModuleCmdName = (typeof MODULE_CMD_NAMES)[number]; -/** 是否为 module 顶层命令(含短别名)。新增别名只改 MODULE_CMD_NAMES。 */ -export function isModuleCommand(name: string | undefined): boolean { - return !!name && (MODULE_CMD_NAMES as readonly string[]).includes(name); +/** HELP 中主名+别名展示串(权威来源 MODULE_CMD_NAMES),如 "module/mod"。 */ +export const MODULE_CMD_ALIAS_LABEL = MODULE_CMD_NAMES.join("/"); + +/** 判断是否为 module 顶层命令(含别名);避免 main/repl 再硬编码 case。 */ +export function isModuleCommand(cmd: string | undefined): cmd is ModuleCmdName { + return !!cmd && (MODULE_CMD_NAMES as readonly string[]).includes(cmd); +} + +/** 染色后的 HELP 前缀,避免 HELP 硬编码 module/mod。 */ +export function paintModuleCmdAlias(paint: (name: string) => string): string { + /* 不可写成 .map(paint):chalk 会吃到 (value,index,array) 并拼出乱文案 */ + return MODULE_CMD_NAMES.map((name) => paint(name)).join("/"); } /** 对外展示与 Tab 补全用的子命令列表(不含 remove 等同义别名)。 */ diff --git a/sfmc/src/repl.ts b/sfmc/src/repl.ts index 34685c12..dffc1c7d 100644 --- a/sfmc/src/repl.ts +++ b/sfmc/src/repl.ts @@ -8,6 +8,7 @@ import { listInstalledModuleIdsSync, MODULE_CMD_NAMES, MODULE_SUBCOMMANDS, + paintModuleCmdAlias, } from "./module-commands.js"; import { listRegistryModuleIdsSync } from "./registry.js"; import { disableRemoteAgent, enrollRemoteAgent, remoteStatus, startRemoteAgent } from "./remote-agent.js"; @@ -52,19 +53,19 @@ ${c.bold("Commands")} ${c.green("remote enroll")} [name] Enroll this supervisor with a controller ${c.green("remote disable")} Disable + disconnect remote agent - ${MODULE_HELP_LABEL} list + ${paintModuleCmdAlias(c.green)} list List installed modules - ${MODULE_HELP_LABEL} search [id] + ${paintModuleCmdAlias(c.green)} search [id] Fetch registry list / show one module's registry info - ${MODULE_HELP_LABEL} install [--from ] + ${paintModuleCmdAlias(c.green)} install [--from ] Fetch + install a module - ${MODULE_HELP_LABEL} uninstall + ${paintModuleCmdAlias(c.green)} uninstall Remove an installed module - ${MODULE_HELP_LABEL} verify [id] + ${paintModuleCmdAlias(c.green)} verify [id] Verify installed modules (SHA-256) - ${MODULE_HELP_LABEL} info + ${paintModuleCmdAlias(c.green)} info Show one installed module's details - ${MODULE_HELP_LABEL} enable|disable + ${paintModuleCmdAlias(c.green)} enable|disable Toggle module (needs db-server) ${c.green("version")} Show version ${c.green("help")} Show this @@ -158,7 +159,7 @@ function getCompletions(parsed: ParsedLine): string[] { if (argIndex === 0) return ["status", "enroll", "disable"].filter(sw); return []; default: { - /* module/mod 等别名统一走 MODULE_CMD_NAMES,避免 case 链与权威源漂移。 */ + /* 与 MODULE_CMD_NAMES 对齐,新增别名无需再改 case(OCP/DRY) */ if (!isModuleCommand(cmd)) return []; if (argIndex === 0) return [...MODULE_SUBCOMMANDS].filter(sw); const verb = words[0] ?? ""; diff --git a/tools/check-ootb.mjs b/tools/check-ootb.mjs index afc0c5d3..05589522 100755 --- a/tools/check-ootb.mjs +++ b/tools/check-ootb.mjs @@ -162,12 +162,12 @@ async function main() { console.log("[ootb] WARN: sfmc/dist/main.js 缺失 — 跳过 CLI 检查"); } else { const r = runSync(process.execPath, [SFMC_DIST, "--help"], { cwd: ROOT }); - /* HELP 现为 "module/mod list"(别名同行);兼容旧 "module list" / 裸 "mod list"。 */ - const helpText = String(r.stdout || "") + String(r.stderr || ""); - const hasModule = - /\bmodule(\/\S+)?\s+(list|install)\b/.test(helpText) || /\bmod\s+(list|install)\b/.test(helpText); + /* 剥离 ANSI;接受 module list / module/mod list / module|mod list + * (与 MODULE_CMD_NAMES / HELP 展示对齐,避免别名改动再次打红) */ + const helpText = (r.stdout + r.stderr).replace(/\u001b\[[0-9;]*m/g, ""); + const hasModule = /module(?:\s*[|/]\s*mod)?\s+(list|install)\b/.test(helpText); if (r.status === 0 && hasModule) pass("sfmc CLI module 子命令已注册"); - else fail("sfmc CLI module 子命令已注册", (r.stderr || r.stdout || `exit ${r.status}`).trim()); + else fail("sfmc CLI module 子命令已注册", helpText.trim().slice(0, 800)); } }