Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions sfmc/src/module-commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 等同义别名)。 */
Expand Down
17 changes: 9 additions & 8 deletions sfmc/src/repl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -52,19 +53,19 @@ ${c.bold("Commands")}
${c.green("remote enroll")} <url> <token> [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 <id> [--from <source>]
${paintModuleCmdAlias(c.green)} install <id> [--from <source>]
Fetch + install a module
${MODULE_HELP_LABEL} uninstall <id>
${paintModuleCmdAlias(c.green)} uninstall <id>
Remove an installed module
${MODULE_HELP_LABEL} verify [id]
${paintModuleCmdAlias(c.green)} verify [id]
Verify installed modules (SHA-256)
${MODULE_HELP_LABEL} info <id>
${paintModuleCmdAlias(c.green)} info <id>
Show one installed module's details
${MODULE_HELP_LABEL} enable|disable <id>
${paintModuleCmdAlias(c.green)} enable|disable <id>
Toggle module (needs db-server)
${c.green("version")} Show version
${c.green("help")} Show this
Expand Down Expand Up @@ -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] ?? "";
Expand Down
10 changes: 5 additions & 5 deletions tools/check-ootb.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}

Expand Down
Loading