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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/argv-parse.d.ts +13 -0
  2. package/dist/argv-parse.d.ts.map +1 -0
  3. package/dist/argv-parse.js +32 -0
  4. package/dist/argv-parse.js.map +7 -0
  5. package/dist/cli-gate.d.ts +11 -0
  6. package/dist/cli-gate.d.ts.map +1 -0
  7. package/dist/cli-gate.js +48 -0
  8. package/dist/cli-gate.js.map +7 -0
  9. package/dist/cmd-remote.d.ts +13 -0
  10. package/dist/cmd-remote.d.ts.map +1 -0
  11. package/dist/cmd-remote.js +38 -0
  12. package/dist/cmd-remote.js.map +7 -0
  13. package/dist/command-palette.d.ts +61 -0
  14. package/dist/command-palette.d.ts.map +1 -0
  15. package/dist/command-palette.js +352 -0
  16. package/dist/command-palette.js.map +7 -0
  17. package/dist/command-surface.d.ts +95 -0
  18. package/dist/command-surface.d.ts.map +1 -0
  19. package/dist/command-surface.js +324 -0
  20. package/dist/command-surface.js.map +7 -0
  21. package/dist/commands-reload.js +2 -2
  22. package/dist/commands-reload.js.map +2 -2
  23. package/dist/commands.d.ts +1 -1
  24. package/dist/commands.d.ts.map +1 -1
  25. package/dist/commands.js +79 -17
  26. package/dist/commands.js.map +2 -2
  27. package/dist/debug-command.d.ts +5 -0
  28. package/dist/debug-command.d.ts.map +1 -0
  29. package/dist/debug-command.js +118 -0
  30. package/dist/debug-command.js.map +7 -0
  31. package/dist/help-text.d.ts +3 -0
  32. package/dist/help-text.d.ts.map +1 -0
  33. package/dist/help-text.js +164 -0
  34. package/dist/help-text.js.map +7 -0
  35. package/dist/i18n/locales/en.d.ts +93 -68
  36. package/dist/i18n/locales/en.d.ts.map +1 -1
  37. package/dist/i18n/locales/en.js +97 -69
  38. package/dist/i18n/locales/en.js.map +2 -2
  39. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  40. package/dist/i18n/locales/zh-CN.js +140 -106
  41. package/dist/i18n/locales/zh-CN.js.map +2 -2
  42. package/dist/index.d.ts +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +6 -0
  45. package/dist/index.js.map +2 -2
  46. package/dist/logs.d.ts +16 -1
  47. package/dist/logs.d.ts.map +1 -1
  48. package/dist/logs.js +80 -11
  49. package/dist/logs.js.map +2 -2
  50. package/dist/main.js +58 -44
  51. package/dist/main.js.map +2 -2
  52. package/dist/module-commands.d.ts +25 -35
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +107 -65
  55. package/dist/module-commands.js.map +2 -2
  56. package/dist/module-pack-build.d.ts +10 -0
  57. package/dist/module-pack-build.d.ts.map +1 -0
  58. package/dist/module-pack-build.js +430 -0
  59. package/dist/module-pack-build.js.map +7 -0
  60. package/dist/module-publish.d.ts +69 -0
  61. package/dist/module-publish.d.ts.map +1 -0
  62. package/dist/module-publish.js +478 -0
  63. package/dist/module-publish.js.map +7 -0
  64. package/dist/module-watch.d.ts +32 -0
  65. package/dist/module-watch.d.ts.map +1 -0
  66. package/dist/module-watch.js +171 -0
  67. package/dist/module-watch.js.map +7 -0
  68. package/dist/pack-lifecycle.d.ts +1 -1
  69. package/dist/pack-lifecycle.d.ts.map +1 -1
  70. package/dist/pack-lifecycle.js +3 -3
  71. package/dist/pack-lifecycle.js.map +2 -2
  72. package/dist/pack-update/index.d.ts +18 -0
  73. package/dist/pack-update/index.d.ts.map +1 -0
  74. package/dist/pack-update/index.js +113 -0
  75. package/dist/pack-update/index.js.map +7 -0
  76. package/dist/registry.d.ts +6 -3
  77. package/dist/registry.d.ts.map +1 -1
  78. package/dist/registry.js +15 -3
  79. package/dist/registry.js.map +2 -2
  80. package/dist/remote-agent.d.ts.map +1 -1
  81. package/dist/remote-agent.js +7 -5
  82. package/dist/remote-agent.js.map +2 -2
  83. package/dist/repl-windows/format-display.d.ts +10 -0
  84. package/dist/repl-windows/format-display.d.ts.map +1 -0
  85. package/dist/repl-windows/format-display.js +57 -0
  86. package/dist/repl-windows/format-display.js.map +7 -0
  87. package/dist/repl-windows/host.d.ts +60 -0
  88. package/dist/repl-windows/host.d.ts.map +1 -0
  89. package/dist/repl-windows/host.js +179 -0
  90. package/dist/repl-windows/host.js.map +7 -0
  91. package/dist/repl-windows/index.d.ts +9 -0
  92. package/dist/repl-windows/index.d.ts.map +1 -0
  93. package/dist/repl-windows/index.js +13 -0
  94. package/dist/repl-windows/index.js.map +7 -0
  95. package/dist/repl-windows/logs-filter-window.d.ts +15 -0
  96. package/dist/repl-windows/logs-filter-window.d.ts.map +1 -0
  97. package/dist/repl-windows/logs-filter-window.js +77 -0
  98. package/dist/repl-windows/logs-filter-window.js.map +7 -0
  99. package/dist/repl-windows/service-window.d.ts +4 -0
  100. package/dist/repl-windows/service-window.d.ts.map +1 -0
  101. package/dist/repl-windows/service-window.js +28 -0
  102. package/dist/repl-windows/service-window.js.map +7 -0
  103. package/dist/repl-windows/types.d.ts +56 -0
  104. package/dist/repl-windows/types.d.ts.map +1 -0
  105. package/dist/repl-windows/types.js +1 -0
  106. package/dist/repl-windows/types.js.map +7 -0
  107. package/dist/repl.d.ts +7 -8
  108. package/dist/repl.d.ts.map +1 -1
  109. package/dist/repl.js +707 -417
  110. package/dist/repl.js.map +3 -3
  111. package/dist/runtime.d.ts +2 -0
  112. package/dist/runtime.d.ts.map +1 -1
  113. package/dist/runtime.js +4 -0
  114. package/dist/runtime.js.map +2 -2
  115. package/dist/send-target.d.ts +11 -0
  116. package/dist/send-target.d.ts.map +1 -0
  117. package/dist/send-target.js +38 -0
  118. package/dist/send-target.js.map +7 -0
  119. package/dist/services.d.ts +21 -1
  120. package/dist/services.d.ts.map +1 -1
  121. package/dist/services.js +146 -7
  122. package/dist/services.js.map +2 -2
  123. package/dist/theme.js +1 -1
  124. package/dist/theme.js.map +2 -2
  125. package/dist/wizard.d.ts.map +1 -1
  126. package/dist/wizard.js +11 -9
  127. package/dist/wizard.js.map +2 -2
  128. package/dist/world-packs.d.ts.map +1 -1
  129. package/dist/world-packs.js +6 -3
  130. package/dist/world-packs.js.map +2 -2
  131. package/package.json +5 -5
  132. package/dist/module-wizard.d.ts +0 -14
  133. package/dist/module-wizard.d.ts.map +0 -1
  134. package/dist/module-wizard.js +0 -313
  135. package/dist/module-wizard.js.map +0 -7
  136. package/dist/pack-update/bindings.d.ts +0 -12
  137. package/dist/pack-update/bindings.d.ts.map +0 -1
  138. package/dist/pack-update/bindings.js +0 -64
  139. package/dist/pack-update/bindings.js.map +0 -7
  140. package/dist/pack-update/config.d.ts +0 -22
  141. package/dist/pack-update/config.d.ts.map +0 -1
  142. package/dist/pack-update/config.js +0 -141
  143. package/dist/pack-update/config.js.map +0 -7
  144. package/dist/pack-update/providers/curseforge.d.ts +0 -23
  145. package/dist/pack-update/providers/curseforge.d.ts.map +0 -1
  146. package/dist/pack-update/providers/curseforge.js +0 -229
  147. package/dist/pack-update/providers/curseforge.js.map +0 -7
  148. package/dist/pack-update/providers/index.d.ts +0 -16
  149. package/dist/pack-update/providers/index.d.ts.map +0 -1
  150. package/dist/pack-update/providers/index.js +0 -37
  151. package/dist/pack-update/providers/index.js.map +0 -7
  152. package/dist/pack-update/service.d.ts +0 -21
  153. package/dist/pack-update/service.d.ts.map +0 -1
  154. package/dist/pack-update/service.js +0 -572
  155. package/dist/pack-update/service.js.map +0 -7
  156. package/dist/pack-update/types.d.ts +0 -126
  157. package/dist/pack-update/types.d.ts.map +0 -1
  158. package/dist/pack-update/types.js +0 -8
  159. package/dist/pack-update/types.js.map +0 -7
  160. package/dist/pack-update/version-policy.d.ts +0 -81
  161. package/dist/pack-update/version-policy.d.ts.map +0 -1
  162. package/dist/pack-update/version-policy.js +0 -210
  163. package/dist/pack-update/version-policy.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/command-palette.ts"],
4
+ "sourcesContent": ["/**\n * command-palette.ts \u2014 `/` \u547D\u4EE4\u8865\u5168\u5668\uFF08\u7C7B Windows \u7EA7\u8054\u83DC\u5355\uFF0C\u4EC5\u7531\u8F93\u5165\u6846\u5185\u5BB9\u9A71\u52A8\uFF09\n */\nimport chalk from \"chalk\";\nimport { listPaletteRoots, type PaletteNode } from \"./command-surface.js\";\nimport { t } from \"./i18n/index.js\";\nimport { visibleWidth } from \"./logs.js\";\nimport { T } from \"./theme.js\";\n\nconst PAGE = 10;\n/** \u6BCF\u5217\u56FA\u5B9A\u603B\u5BBD\uFF08\u542B\u5DE6\u8FB9\u6761 + \u6B63\u6587 + \u53F3\u4FA7 \u203A\uFF09 */\nexport const PANEL_WIDTH = 28;\nconst PANEL_GAP = \" \";\nconst MARKER_W = 1;\nconst CHEVRON_W = 1;\nconst INNER_WIDTH = PANEL_WIDTH - MARKER_W - CHEVRON_W;\n\n/** \u5C42\u7EA7\u5E95\u8272\uFF08\u533A\u5206\u591A\u7EA7\u5B50\u83DC\u5355\uFF09 */\nconst LEVEL_BG: readonly string[] = [T.surface, T.panel, \"#1a1d23\", T.subtle];\nconst LEVEL_SEL: readonly string[] = [T.surfaceHi, \"#4a5160\", \"#3a404c\", \"#5a6270\"];\n/** \u975E\u5F53\u524D\u5217\uFF1A\u6574\u4F53\u538B\u6697\u4E00\u6863 */\nconst LEVEL_BG_DIM: readonly string[] = [\"#22252c\", \"#1a1d22\", \"#14161b\", \"#2e333c\"];\nconst LEVEL_SEL_DIM: readonly string[] = [\"#2a2e36\", \"#262a32\", \"#1e2228\", \"#343a44\"];\nconst MATCH_FG = T.cyan;\n\nexport type PaletteColumn = {\n items: PaletteNode[];\n selected: number;\n scroll: number;\n};\n\nexport type PaletteView = {\n columns: PaletteColumn[];\n /** \u53EF\u5BFC\u822A\u5217 = \u6700\u53F3\u5217 */\n active: number;\n committed: string[];\n partial: string;\n trailingSpace: boolean;\n /** \u81EA\u7531\u53C2\u6570\u8F93\u5165\u4E2D\uFF1A\u4E0D\u5C55\u793A\u9762\u677F */\n hidden: boolean;\n};\n\nexport type SlashParse = {\n committed: string[];\n partial: string;\n trailingSpace: boolean;\n};\n\n/** \u89E3\u6790 `/` \u540E\u7684\u8F93\u5165 */\nexport function parseSlashLine(line: string): SlashParse {\n const body = line.startsWith(\"/\") ? line.slice(1) : line;\n const trailingSpace = body.length > 0 && /\\s$/.test(body);\n const raw = body.trim() ? body.trim().split(/\\s+/) : [];\n if (trailingSpace) return { committed: raw, partial: \"\", trailingSpace: true };\n if (raw.length === 0) return { committed: [], partial: \"\", trailingSpace: false };\n return { committed: raw.slice(0, -1), partial: raw[raw.length - 1]!, trailingSpace: false };\n}\n\nfunction descOf(n: PaletteNode): string {\n if (!n.descKey) return \"\";\n try {\n return t(n.descKey as Parameters<typeof t>[0]);\n } catch {\n return \"\";\n }\n}\n\nexport function clipPad(s: string, width: number): string {\n let out = \"\";\n for (const ch of s) {\n if (visibleWidth(out + ch) > width) break;\n out += ch;\n }\n while (visibleWidth(out) < width) out += \" \";\n return out;\n}\n\n/** \u5728 text \u4E2D\u627E query \u7684\u9996\u6B21\u51FA\u73B0\uFF08\u5FFD\u7565\u5927\u5C0F\u5199\uFF1Blabel \u5E26 / \u65F6\u4E5F\u8BD5\u53BB\u524D\u7F00\uFF09 */\nexport function findMatchRange(text: string, q: string): { start: number; end: number } | null {\n if (!q) return null;\n const lq = q.toLowerCase();\n const lower = text.toLowerCase();\n let i = lower.indexOf(lq);\n if (i >= 0) return { start: i, end: i + q.length };\n if (text.startsWith(\"/\")) {\n i = lower.slice(1).indexOf(lq);\n if (i >= 0) return { start: i + 1, end: i + 1 + q.length };\n }\n return null;\n}\n\ntype CellStyle = {\n bg: string;\n fg: string;\n match: string;\n desc: string;\n};\n\nfunction cellStyle(selected: boolean, level: number, activeCol: boolean): CellStyle {\n const i = level % LEVEL_BG.length;\n if (activeCol) {\n return {\n bg: selected ? (LEVEL_SEL[i] ?? T.surfaceHi) : (LEVEL_BG[i] ?? T.surface),\n fg: selected ? T.text : T.muted,\n match: MATCH_FG,\n desc: selected ? T.muted : T.subtle,\n };\n }\n return {\n bg: selected ? (LEVEL_SEL_DIM[i] ?? T.surface) : (LEVEL_BG_DIM[i] ?? T.panel),\n fg: selected ? T.muted : T.subtle,\n match: T.subtle,\n desc: T.subtle,\n };\n}\n\nfunction paintSeg(bg: string, fg: string, text: string): string {\n if (!text) return \"\";\n return chalk.bgHex(bg).hex(fg)(text);\n}\n\n/** \u6309\u53EF\u89C1\u5BBD\u5EA6\u622A\u65AD\u5E76\u7740\u8272\u4E00\u6BB5\u7EAF\u6587\u672C */\nfunction paintClipped(bg: string, fg: string, text: string, maxW: number): { painted: string; used: number } {\n let plain = \"\";\n let painted = \"\";\n for (const ch of text) {\n if (visibleWidth(plain + ch) > maxW) break;\n plain += ch;\n painted += paintSeg(bg, fg, ch);\n }\n return { painted, used: visibleWidth(plain) };\n}\n\n/** \u6B63\u6587\u533A\uFF1Alabel\uFF08\u53EF\u9AD8\u4EAE\u5339\u914D\uFF09+ \u63CF\u8FF0\uFF1B\u603B\u53EF\u89C1\u5BBD INNER_WIDTH */\nfunction paintInner(n: PaletteNode, query: string, style: CellStyle): string {\n const label = n.label;\n const desc = descOf(n);\n const range = findMatchRange(label, query);\n let out = \"\";\n let used = 0;\n\n for (let i = 0; i < label.length; i++) {\n const ch = label[i]!;\n const cw = visibleWidth(ch);\n if (used + cw > INNER_WIDTH) break;\n const inMatch = range !== null && i >= range.start && i < range.end;\n out += paintSeg(style.bg, inMatch ? style.match : style.fg, ch);\n used += cw;\n }\n\n if (desc && used + 1 < INNER_WIDTH) {\n out += paintSeg(style.bg, style.desc, \" \");\n used += 1;\n const room = INNER_WIDTH - used;\n const d = paintClipped(style.bg, style.desc, desc, room);\n out += d.painted;\n used += d.used;\n }\n\n if (used < INNER_WIDTH) {\n out += paintSeg(style.bg, style.fg, \" \".repeat(INNER_WIDTH - used));\n }\n return out;\n}\n\nfunction paintCell(\n n: PaletteNode,\n selected: boolean,\n level: number,\n activeCol: boolean,\n query: string\n): string {\n const style = cellStyle(selected, level, activeCol);\n const marker = selected ? \"\u258C\" : \" \";\n const hasKids = Boolean(n.children?.length);\n const chevron = hasKids ? \"\u203A\" : \" \";\n const q = activeCol ? query : \"\";\n return (\n paintSeg(style.bg, selected && activeCol ? MATCH_FG : style.fg, marker) +\n paintInner(n, q, style) +\n paintSeg(style.bg, style.fg, chevron)\n );\n}\n\nfunction blankCell(level: number, activeCol: boolean): string {\n const style = cellStyle(false, level, activeCol);\n return chalk.bgHex(style.bg)(\" \".repeat(PANEL_WIDTH));\n}\n\n/** \u5339\u914D\u6743\u91CD\uFF1A\u8D8A\u5927\u8D8A\u9760\u524D\uFF1B\u65E0\u67E5\u8BE2\u65F6\u4FDD\u6301\u539F\u5E8F\uFF08\u540C\u5206\uFF09 */\nexport function matchWeight(n: PaletteNode, q: string): number {\n if (!q) return 0;\n const lq = q.toLowerCase();\n const token = n.token.toLowerCase();\n const label = n.label.toLowerCase();\n const desc = descOf(n).toLowerCase();\n if (token === lq || label === `/${lq}` || label === lq) return 100;\n /* \u524D\u7F00\u5339\u914D\uFF1A\u8986\u76D6\u6BD4\u4F8B\u8D8A\u9AD8\u8D8A\u9760\u524D\uFF08st \u2192 start > status\uFF09 */\n if (token.startsWith(lq)) return 80 + Math.round((lq.length / Math.max(token.length, 1)) * 15);\n if (label.startsWith(lq) || label.startsWith(`/${lq}`)) {\n const base = label.startsWith(\"/\") ? label.slice(1) : label;\n return 70 + Math.round((lq.length / Math.max(base.length, 1)) * 15);\n }\n if (token.includes(lq)) return 50;\n if (label.includes(lq)) return 40;\n if (desc.includes(lq)) return 20;\n return 0;\n}\n\n/** \u6309\u6743\u91CD\u7A33\u5B9A\u6392\u5E8F\uFF1A\u5339\u914D\u9879\u7F6E\u9876\uFF0C\u4E0D\u5220\u9664\u4EFB\u4F55\u9879 */\nexport function rankItems(items: readonly PaletteNode[], q: string): PaletteNode[] {\n if (!q) return [...items];\n return items\n .map((n, i) => ({ n, i, w: matchWeight(n, q) }))\n .sort((a, b) => b.w - a.w || a.i - b.i)\n .map((x) => x.n);\n}\n\nexport function clampPaletteSelection(selected: number, len: number): number {\n if (len <= 0) return 0;\n if (selected < 0) return 0;\n if (selected >= len) return len - 1;\n return selected;\n}\n\nexport function ensurePaletteScroll(selected: number, scroll: number, len: number): number {\n let s = scroll;\n if (len <= 0) return 0;\n if (selected < s) s = selected;\n if (selected >= s + PAGE) s = selected - PAGE + 1;\n const maxScroll = Math.max(0, len - PAGE);\n if (s > maxScroll) s = maxScroll;\n if (s < 0) s = 0;\n return s;\n}\n\nfunction pageSlice(\n items: PaletteNode[],\n selected: number,\n scroll: number\n): { rows: { node: PaletteNode; index: number }[]; above: number; below: number } {\n const sel = clampPaletteSelection(selected, items.length);\n const sc = ensurePaletteScroll(sel, scroll, items.length);\n const end = Math.min(items.length, sc + PAGE);\n const rows: { node: PaletteNode; index: number }[] = [];\n for (let i = sc; i < end; i++) rows.push({ node: items[i]!, index: i });\n return { rows, above: sc, below: items.length - end };\n}\n\nfunction findRoot(token: string): PaletteNode | undefined {\n return listPaletteRoots(\"repl\").find((n) => n.token === token);\n}\n\nfunction findChild(parent: PaletteNode | undefined, token: string): PaletteNode | undefined {\n return parent?.children?.find((n) => n.token === token);\n}\n\n/**\n * \u662F\u5426\u5DF2\u8FDB\u5165\u81EA\u7531\u53C2\u6570\u5C3E\u90E8\uFF08\u5982 /send bds \u2026\uFF09\u3002\n * \u8DEF\u5F84\u843D\u5728 freeArgs \u53F6\u4E0A\uFF0C\u6216\u53F6\u4E4B\u540E\u8FD8\u6709\u65E0\u6CD5\u5339\u914D\u7684\u591A\u4F59 token\uFF0C\u5747\u89C6\u4E3A\u81EA\u7531\u8F93\u5165\u3002\n */\nfunction inFreeArgTail(committed: string[]): boolean {\n let node: PaletteNode | undefined;\n for (let i = 0; i < committed.length; i++) {\n const next = i === 0 ? findRoot(committed[i]!) : findChild(node, committed[i]!);\n if (!next) {\n return Boolean(node?.freeArgs && !node.children?.length);\n }\n node = next;\n }\n return Boolean(node?.freeArgs && !node.children?.length);\n}\n\n/**\n * \u547D\u4EE4\u8DEF\u5F84\u662F\u5426\u5DF2\u5230\u672B\u5C3E\uFF08\u65E0\u66F4\u591A\u56FA\u5B9A\u5B50\u53C2\u53EF\u9009\uFF09\u2192 \u5E94\u5173\u95ED\u9762\u677F\u3002\n * \u672B\u5C3E = \u7CBE\u786E\u5339\u914D\u5230\u65E0 children \u7684\u8282\u70B9\uFF0C\u6216\u5DF2\u8FDB\u5165 freeArgs \u6B63\u6587\u3002\n */\nexport function isCommandAtEnd(committed: string[], partial: string, trailingSpace: boolean): boolean {\n if (inFreeArgTail(committed)) return true;\n\n const path = trailingSpace ? committed : partial ? [...committed, partial] : committed;\n if (path.length === 0) return false;\n\n let node: PaletteNode | undefined;\n for (let i = 0; i < path.length; i++) {\n const next = i === 0 ? findRoot(path[i]!) : findChild(node, path[i]!);\n if (!next) return false;\n node = next;\n }\n if (!node || (node.children?.length ?? 0) > 0) return false;\n /* \u6700\u540E\u4E00\u6BB5\u5FC5\u987B\u4E0E\u8282\u70B9 token \u5B8C\u5168\u4E00\u81F4\uFF08\u534A\u8BCD\u524D\u7F00\u4E0D\u7B97\u5230\u672B\u5C3E\uFF09 */\n return path[path.length - 1] === node.token;\n}\n\n/**\n * \u4EC5\u7531\u8F93\u5165\u884C\u63A8\u5BFC\u5217\uFF1B\u5217\u5185\u59CB\u7EC8\u4FDD\u7559\u5168\u91CF\u9879\uFF0Cpartial \u53EA\u8C03\u6574\u6392\u5E8F\u6743\u91CD\u3002\n * \u5B50\u5217\u51FA\u73B0\u6761\u4EF6\uFF1A\u5DF2\u63D0\u4EA4\u4E0A\u4E00\u53C2\u6570\uFF08\u5C06\u8981\u8F93\u5165\u4E0B\u4E00\u53C2\u6570\uFF09\u3002\n */\nexport function resolvePaletteView(line: string, sels: number[], scrolls: number[]): PaletteView {\n const { committed, partial, trailingSpace } = parseSlashLine(line);\n const roots = listPaletteRoots(\"repl\");\n\n /* \u547D\u4EE4\u5DF2\u5230\u672B\u5C3E \u2192 \u7ACB\u5373\u5173\u95ED\u9762\u677F */\n if (isCommandAtEnd(committed, partial, trailingSpace)) {\n return { columns: [], active: 0, committed, partial, trailingSpace, hidden: true };\n }\n\n const columns: PaletteColumn[] = [];\n const onRoot = committed.length === 0;\n /* \u4E3B\u5217\uFF1A\u59CB\u7EC8\u5168\u91CF\uFF1B\u4EC5\u5728\u7F16\u8F91\u9996\u53C2\u65F6\u6309 partial \u63D0\u6743 */\n const mainQuery = onRoot ? partial : \"\";\n const mainItems = rankItems(roots, mainQuery);\n let mainSel = clampPaletteSelection(sels[0] ?? 0, mainItems.length);\n if (!onRoot) {\n const idx = mainItems.findIndex((n) => n.token === committed[0]);\n if (idx >= 0) mainSel = idx;\n } else if (partial) {\n /* \u6709\u534A\u8BCD\u65F6\u9ED8\u8BA4\u843D\u5728\u6743\u91CD\u6700\u9AD8\u9879\uFF08\u5217\u8868\u5934\uFF09 */\n mainSel = clampPaletteSelection(sels[0] ?? 0, mainItems.length);\n }\n columns.push({\n items: mainItems,\n selected: mainSel,\n scroll: ensurePaletteScroll(mainSel, scrolls[0] ?? 0, mainItems.length),\n });\n\n let parent: PaletteNode | undefined = onRoot ? undefined : findRoot(committed[0]!);\n for (let d = 1; parent?.children?.length && committed.length >= d; d++) {\n const pathTok = committed[d];\n const q = committed.length > d ? \"\" : trailingSpace ? \"\" : partial;\n const childItems = rankItems(parent.children, q);\n\n let sel = clampPaletteSelection(sels[d] ?? 0, childItems.length);\n if (pathTok) {\n const idx = childItems.findIndex((n) => n.token === pathTok);\n if (idx >= 0) sel = idx;\n }\n\n columns.push({\n items: childItems,\n selected: sel,\n scroll: ensurePaletteScroll(sel, scrolls[d] ?? 0, childItems.length),\n });\n\n parent = pathTok && committed.length > d ? findChild(parent, pathTok) : childItems[sel];\n\n if (committed.length === d && !trailingSpace) break;\n if (!parent?.children?.length) break;\n }\n\n return {\n columns,\n active: Math.max(0, columns.length - 1),\n committed,\n partial,\n trailingSpace,\n hidden: false,\n };\n}\n\nfunction formatColumnLines(col: PaletteColumn, level: number, activeCol: boolean, query: string): string[] {\n const lines: string[] = [];\n const style = cellStyle(false, level, activeCol);\n if (col.items.length === 0) {\n lines.push(\n paintSeg(style.bg, style.fg, \" \") +\n paintSeg(style.bg, style.fg, clipPad(t(\"repl.palette.empty\"), INNER_WIDTH)) +\n paintSeg(style.bg, style.fg, \" \")\n );\n return lines;\n }\n const { rows, above, below } = pageSlice(col.items, col.selected, col.scroll);\n if (above > 0) {\n lines.push(\n paintSeg(style.bg, style.fg, \" \") +\n paintSeg(style.bg, style.fg, clipPad(`\u2191${above}\u2026`, INNER_WIDTH)) +\n paintSeg(style.bg, style.fg, \" \")\n );\n }\n for (const { node, index } of rows) {\n lines.push(paintCell(node, index === col.selected, level, activeCol, query));\n }\n if (below > 0) {\n lines.push(\n paintSeg(style.bg, style.fg, \" \") +\n paintSeg(style.bg, style.fg, clipPad(`\u2193${below}\u2026`, INNER_WIDTH)) +\n paintSeg(style.bg, style.fg, \" \")\n );\n }\n return lines;\n}\n\nexport function formatPaletteCascadeLines(view: PaletteView, indentCols: number): string[] {\n if (view.hidden || view.columns.length === 0) return [];\n const indent = \" \".repeat(Math.max(0, indentCols));\n const colLines = view.columns.map((col, i) =>\n formatColumnLines(col, i, i === view.active, i === view.active ? view.partial : \"\")\n );\n const height = Math.max(1, ...colLines.map((l) => l.length));\n const out: string[] = [];\n for (let r = 0; r < height; r++) {\n const parts: string[] = [];\n for (let cidx = 0; cidx < view.columns.length; cidx++) {\n const activeCol = cidx === view.active;\n const cell = colLines[cidx]![r] ?? blankCell(cidx, activeCol);\n const plainW = visibleWidth(cell);\n parts.push(plainW < PANEL_WIDTH ? cell + \" \".repeat(PANEL_WIDTH - plainW) : cell);\n }\n out.push(indent + parts.join(PANEL_GAP));\n }\n return out;\n}\n\nexport function activeNode(view: PaletteView): PaletteNode | undefined {\n if (view.hidden) return undefined;\n const col = view.columns[view.active];\n if (!col || col.items.length === 0) return undefined;\n return col.items[clampPaletteSelection(col.selected, col.items.length)];\n}\n\n/** \u7070\u5B57\uFF1A\u9009\u4E2D\u9879\u76F8\u5BF9\u5F53\u524D\u534A\u8BCD\u7684\u540E\u7F00 */\nexport function paletteGhost(view: PaletteView): string {\n const node = activeNode(view);\n if (!node || view.hidden) return \"\";\n /* \u8DEF\u5F84\u5DF2\u5199\u8FC7\u672C\u5C42 \u2192 \u65E0\u7070\u5B57 */\n if (view.committed.length > view.active) return \"\";\n const p = view.partial;\n const tok = node.token;\n if (!p) return tok;\n if (tok.toLowerCase().startsWith(p.toLowerCase())) return tok.slice(p.length);\n return \"\";\n}\n\n/**\n * \u56DE\u8F66\u5199\u5165\u9009\u4E2D\u9879\uFF1B\u6709\u5B50\u53C2\u6216\u81EA\u7531\u53C2\u5219\u8865\u5C3E\u7A7A\u683C\u3002\n * \u82E5\u884C\u5DF2\u662F\u8BE5\u53F6\u8282\u70B9\u5B8C\u6574\u5185\u5BB9 \u2192 submit\u3002\n */\nexport function commitSelection(line: string, view: PaletteView): { line: string; submit: boolean } {\n if (view.hidden || view.columns.length === 0) {\n return { line, submit: true };\n }\n const node = activeNode(view);\n if (!node) return { line, submit: true };\n\n const { committed, partial, trailingSpace, active } = view;\n\n /* \u53F6\u8282\u70B9\u4E14\u8F93\u5165\u5DF2\u5B8C\u6574\u5339\u914D \u2192 \u63D0\u4EA4\u6267\u884C */\n const isLeaf = !node.children?.length && !node.freeArgs;\n if (isLeaf && !trailingSpace) {\n if (committed.length === active && partial === node.token) {\n return { line: \"/\" + [...committed, node.token].join(\" \"), submit: true };\n }\n if (committed.length === active + 1 && committed[active] === node.token && !partial) {\n return { line, submit: true };\n }\n }\n\n const tokens = committed.slice(0, active);\n tokens.push(node.token);\n let next = \"/\" + tokens.join(\" \");\n if (node.children?.length || node.freeArgs) next += \" \";\n return { line: next, submit: false };\n}\n\nexport function promptSlashColumn(prompt: string): number {\n return visibleWidth(prompt);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,95 @@
1
+ export type CommandChannel = "external" | "repl" | "both";
2
+ export type CommandMode = "argv" | "repl";
3
+ export type CommandAccent = "dev";
4
+ export type CommandSpec = {
5
+ /** 稳定 id,如 "module.install" / "send" / "debug" */
6
+ id: string;
7
+ /** 顶层命令名(module 子命令用 "module";顶层别名见 TOP_LEVEL_ALIASES) */
8
+ name: string;
9
+ /** 子命令(仅 module/packs 等) */
10
+ sub?: string;
11
+ channel: CommandChannel;
12
+ needsTty?: boolean;
13
+ /** 帮助染色;不参与 canRun */
14
+ accent?: CommandAccent;
15
+ /** 子命令同义别名(如 uninstall → remove),不是顶层别名 */
16
+ aliases?: string[];
17
+ };
18
+ export type CanRunContext = {
19
+ mode: CommandMode;
20
+ isTty: boolean;
21
+ };
22
+ export type CanRunFailReason = "externalOnly" | "replOnly" | "needTty";
23
+ export type CanRunResult = {
24
+ ok: true;
25
+ } | {
26
+ ok: false;
27
+ reason: CanRunFailReason;
28
+ };
29
+ /** 顶层命令别名 → 规范 name(DRY:勿在各 sub spec 重复写 mod/addon) */
30
+ export declare const TOP_LEVEL_ALIASES: Readonly<Record<string, string>>;
31
+ /**
32
+ * 顶层扁平短命令 → module 子命令(argv / REPL 共用,避免在 switch 里散落映射)
33
+ * 不含 enable/disable(与 packs 冲突,仍走 /module 或 /packs)
34
+ *
35
+ * 与 packs 子命令对齐:`packs i` → `packs install`(mapPacksSubAlias);
36
+ * module 顶层同样支持 `i` → `install`(见 TOP_LEVEL_ALIASES 与本表)。
37
+ */
38
+ export declare const MODULE_TOP_SHORTHAND: Readonly<Record<string, string>>;
39
+ export declare function resolveModuleTopShorthand(cmd: string | undefined): string | undefined;
40
+ export declare function resolveTopLevelName(cmd: string | undefined): string | undefined;
41
+ /** 判定当前模式下能否执行该命令(accent 不参与)。 */
42
+ export declare function canRunCommand(spec: CommandSpec, ctx: CanRunContext): CanRunResult;
43
+ /** 当前模式可见命令(help / Tab)。 */
44
+ export declare function listVisibleCommands(mode: CommandMode): CommandSpec[];
45
+ /** 顶层命令名(含别名),供 REPL COMMANDS / 补全。 */
46
+ export declare function listVisibleTopLevelNames(mode: CommandMode): string[];
47
+ /** 查找顶层命令(无 sub)的任意一条同名 spec(用于 channel 门禁)。 */
48
+ export declare function findTopLevelSpec(cmd: string | undefined): CommandSpec | undefined;
49
+ /** 查找 module 子命令 spec。 */
50
+ export declare function findModuleSubSpec(sub: string | undefined): CommandSpec | undefined;
51
+ /** 查找 packs 子命令 spec。 */
52
+ export declare function findPacksSubSpec(sub: string | undefined): CommandSpec | undefined;
53
+ /** 当前 mode 下可见的 module 子命令名(规范名,不含 remove 别名)。 */
54
+ export declare function listVisibleModuleSubs(mode: CommandMode): string[];
55
+ /** 当前 mode 下可见的 packs 子命令名。 */
56
+ export declare function listVisiblePacksSubs(mode: CommandMode): string[];
57
+ /** REPL 快速补全:层级节点(主面板 → 右侧子面板) */
58
+ export type PaletteNode = {
59
+ /** 面板内显示的标签 */
60
+ label: string;
61
+ /** 追加到命令行的 token(根节点含或不含前导逻辑由组装负责) */
62
+ token: string;
63
+ /** i18n 描述键 */
64
+ descKey?: string;
65
+ accent?: CommandAccent;
66
+ /** 固定下一参选项;回车后在右侧展开 */
67
+ children?: PaletteNode[];
68
+ /** 无 children 时仍需自由输入(回车后填入空格继续打字) */
69
+ freeArgs?: boolean;
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
+ /** 层级命令树(REPL 面板主列) */
80
+ export declare function listPaletteRoots(mode?: CommandMode): PaletteNode[];
81
+ /** 扁平列表(测试 / 旧调用);层级 UI 请用 listPaletteRoots */
82
+ export declare function listPaletteEntries(mode?: CommandMode): PaletteEntry[];
83
+ export declare function isDevAccent(spec: CommandSpec | undefined): boolean;
84
+ /** sub 是否为开发者样式命令(蓝标)。 */
85
+ export declare function isDevAccentModuleSub(sub: string | undefined): boolean;
86
+ /** stdin TTY 探测(供 main/repl 共用)。 */
87
+ export declare function isCliTty(): boolean;
88
+ /**
89
+ * 命令注册表 —— 新增命令只加此处(OCP)。
90
+ * channel:
91
+ * - both: argv + REPL(默认;面板只调度既有 dispatcher)
92
+ * - repl: 仅 REPL(如 send / quit)
93
+ */
94
+ export declare const COMMAND_SPECS: readonly CommandSpec[];
95
+ //# sourceMappingURL=command-surface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-surface.d.ts","sourceRoot":"","sources":["../src/command-surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,324 @@
1
+ import { stdin } from "node:process";
2
+ const TOP_LEVEL_ALIASES = {
3
+ mod: "module",
4
+ addon: "packs",
5
+ log: "logs",
6
+ lang: "locale",
7
+ h: "help",
8
+ "?": "help",
9
+ exit: "quit",
10
+ q: "quit",
11
+ i: "install",
12
+ remove: "uninstall"
13
+ };
14
+ const MODULE_TOP_SHORTHAND = {
15
+ i: "install",
16
+ install: "install",
17
+ uninstall: "uninstall",
18
+ search: "search",
19
+ verify: "verify"
20
+ };
21
+ function resolveModuleTopShorthand(cmd) {
22
+ if (!cmd) return void 0;
23
+ const name = resolveTopLevelName(cmd);
24
+ if (!name) return void 0;
25
+ return MODULE_TOP_SHORTHAND[name];
26
+ }
27
+ function resolveTopLevelName(cmd) {
28
+ if (!cmd) return void 0;
29
+ return TOP_LEVEL_ALIASES[cmd] ?? cmd;
30
+ }
31
+ function channelAllows(channel, mode) {
32
+ if (channel === "both") return true;
33
+ if (channel === "external") return mode === "argv";
34
+ return mode === "repl";
35
+ }
36
+ function canRunCommand(spec, ctx) {
37
+ if (!channelAllows(spec.channel, ctx.mode)) {
38
+ return { ok: false, reason: spec.channel === "external" ? "externalOnly" : "replOnly" };
39
+ }
40
+ if (spec.needsTty && !ctx.isTty) {
41
+ return { ok: false, reason: "needTty" };
42
+ }
43
+ return { ok: true };
44
+ }
45
+ function listVisibleCommands(mode) {
46
+ return COMMAND_SPECS.filter((s) => channelAllows(s.channel, mode));
47
+ }
48
+ function listVisibleTopLevelNames(mode) {
49
+ const canonical = /* @__PURE__ */ new Set();
50
+ for (const s of listVisibleCommands(mode)) {
51
+ canonical.add(s.name);
52
+ }
53
+ const out = new Set(canonical);
54
+ for (const [alias, name] of Object.entries(TOP_LEVEL_ALIASES)) {
55
+ if (canonical.has(name)) out.add(alias);
56
+ }
57
+ return [...out];
58
+ }
59
+ function findTopLevelSpec(cmd) {
60
+ const name = resolveTopLevelName(cmd);
61
+ if (!name) return void 0;
62
+ const top = COMMAND_SPECS.find((s) => !s.sub && s.name === name);
63
+ if (top) return top;
64
+ return COMMAND_SPECS.find((s) => s.name === name);
65
+ }
66
+ function findModuleSubSpec(sub) {
67
+ if (!sub) return void 0;
68
+ return COMMAND_SPECS.find(
69
+ (s) => s.name === "module" && (s.sub === sub || (s.aliases ?? []).includes(sub))
70
+ );
71
+ }
72
+ function findPacksSubSpec(sub) {
73
+ if (!sub) return void 0;
74
+ return COMMAND_SPECS.find(
75
+ (s) => s.name === "packs" && (s.sub === sub || (s.aliases ?? []).includes(sub))
76
+ );
77
+ }
78
+ function listVisibleModuleSubs(mode) {
79
+ return listVisibleCommands(mode).filter((s) => s.name === "module" && s.sub).map((s) => s.sub);
80
+ }
81
+ function listVisiblePacksSubs(mode) {
82
+ return listVisibleCommands(mode).filter((s) => s.name === "packs" && s.sub).map((s) => s.sub);
83
+ }
84
+ const NO_ARG_TOP = /* @__PURE__ */ new Set(["status", "help", "version", "quit", "init", "logs"]);
85
+ const TOP_DESC = {
86
+ status: "help.status",
87
+ logs: "help.logs",
88
+ start: "help.start",
89
+ stop: "help.stop",
90
+ restart: "help.restart",
91
+ send: "help.send",
92
+ help: "help.help",
93
+ version: "help.version",
94
+ quit: "help.quit",
95
+ init: "help.init",
96
+ update: "help.update",
97
+ locale: "help.locale",
98
+ remote: "help.remote.status",
99
+ debug: "help.debug.status",
100
+ install: "help.module.install",
101
+ uninstall: "help.module.uninstall",
102
+ search: "help.module.search",
103
+ verify: "help.module.verify",
104
+ watch: "help.module.watch",
105
+ test: "help.module.test",
106
+ publish: "help.module.publish"
107
+ };
108
+ const MODULE_DESC = {
109
+ list: "help.module.list",
110
+ info: "help.module.info",
111
+ build: "help.module.build",
112
+ reload: "help.module.reload",
113
+ search: "help.module.search",
114
+ install: "help.module.install",
115
+ uninstall: "help.module.uninstall",
116
+ verify: "help.module.verify",
117
+ enable: "help.module.toggle",
118
+ disable: "help.module.toggle"
119
+ };
120
+ const PACKS_DESC = {
121
+ list: "help.packs.list",
122
+ search: "help.packs.search",
123
+ enable: "help.packs.enable",
124
+ disable: "help.packs.disable",
125
+ doctor: "help.packs.doctor",
126
+ path: "help.packs.path",
127
+ install: "help.addon",
128
+ scan: "help.addon",
129
+ uninstall: "help.addon",
130
+ bind: "help.addon",
131
+ unbind: "help.addon",
132
+ sources: "help.addon",
133
+ check: "help.addon",
134
+ update: "help.addon",
135
+ bump: "help.addon"
136
+ };
137
+ function serviceArgNodes() {
138
+ return [
139
+ { label: "-all", token: "-all" },
140
+ ...["bds", "db", "qq", "llbot"].map((n) => ({ label: n, token: n }))
141
+ ];
142
+ }
143
+ function moduleChildNodes(mode) {
144
+ const noArg = /* @__PURE__ */ new Set(["list", "build"]);
145
+ return listVisibleModuleSubs(mode).map((sub) => {
146
+ const spec = findModuleSubSpec(sub);
147
+ const node = {
148
+ label: sub,
149
+ token: sub,
150
+ descKey: MODULE_DESC[sub] ?? "help.module.list",
151
+ freeArgs: !noArg.has(sub)
152
+ };
153
+ if (spec?.accent) node.accent = spec.accent;
154
+ return node;
155
+ });
156
+ }
157
+ function packsChildNodes(mode) {
158
+ const noArg = /* @__PURE__ */ new Set(["list", "doctor", "path", "sources"]);
159
+ return listVisiblePacksSubs(mode).map((sub) => ({
160
+ label: sub,
161
+ token: sub,
162
+ descKey: PACKS_DESC[sub] ?? "help.addon",
163
+ freeArgs: !noArg.has(sub)
164
+ }));
165
+ }
166
+ function listPaletteRoots(mode = "repl") {
167
+ const specs = listVisibleCommands(mode);
168
+ const out = [];
169
+ const seen = /* @__PURE__ */ new Set();
170
+ const skipTopShorthand = new Set(Object.keys(MODULE_TOP_SHORTHAND));
171
+ for (const s of specs) {
172
+ if (s.sub) continue;
173
+ if (s.name === "module" || s.name === "packs") continue;
174
+ if (skipTopShorthand.has(s.name)) continue;
175
+ if (seen.has(s.name)) continue;
176
+ seen.add(s.name);
177
+ const node = {
178
+ label: `/${s.name}`,
179
+ token: s.name,
180
+ descKey: TOP_DESC[s.name] ?? "help.help"
181
+ };
182
+ if (s.accent) node.accent = s.accent;
183
+ if (s.name === "start" || s.name === "stop" || s.name === "restart") {
184
+ node.children = serviceArgNodes();
185
+ } else if (s.name === "send") {
186
+ node.children = ["bds", "db", "qq", "llbot"].map((n) => ({
187
+ label: n,
188
+ token: n,
189
+ freeArgs: true
190
+ }));
191
+ } else if (!NO_ARG_TOP.has(s.name)) {
192
+ node.freeArgs = true;
193
+ }
194
+ out.push(node);
195
+ }
196
+ const moduleSubs = moduleChildNodes(mode);
197
+ if (moduleSubs.length > 0) {
198
+ out.push({
199
+ label: "/module",
200
+ token: "module",
201
+ descKey: "help.module.list",
202
+ children: moduleSubs
203
+ });
204
+ }
205
+ const packsSubs = packsChildNodes(mode);
206
+ if (packsSubs.length > 0) {
207
+ out.push({
208
+ label: "/packs",
209
+ token: "packs",
210
+ descKey: "help.addon",
211
+ children: packsSubs
212
+ });
213
+ }
214
+ return out;
215
+ }
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
+ function isDevAccent(spec) {
239
+ return spec?.accent === "dev";
240
+ }
241
+ function isDevAccentModuleSub(sub) {
242
+ return isDevAccent(findModuleSubSpec(sub));
243
+ }
244
+ function isCliTty() {
245
+ return Boolean(stdin.isTTY);
246
+ }
247
+ const COMMAND_SPECS = [
248
+ /* ─── both:服务 / 模块 / 资源包 / 配置 ─── */
249
+ { id: "status", name: "status", channel: "both" },
250
+ { id: "start", name: "start", channel: "both" },
251
+ { id: "stop", name: "stop", channel: "both" },
252
+ { id: "restart", name: "restart", channel: "both" },
253
+ { id: "logs", name: "logs", channel: "repl" },
254
+ { id: "help", name: "help", channel: "both" },
255
+ { id: "version", name: "version", channel: "both" },
256
+ { id: "init", name: "init", channel: "both", needsTty: true },
257
+ { id: "update", name: "update", channel: "both" },
258
+ { id: "locale", name: "locale", channel: "both" },
259
+ { id: "remote", name: "remote", channel: "both" },
260
+ { id: "debug", name: "debug", channel: "both", accent: "dev" },
261
+ /** 顶层扁平短命令 → module.*(少写一层 module) */
262
+ { id: "install", name: "install", channel: "both" },
263
+ { id: "uninstall", name: "uninstall", channel: "both", aliases: ["remove"] },
264
+ { id: "search", name: "search", channel: "both" },
265
+ { id: "verify", name: "verify", channel: "both" },
266
+ { id: "module.list", name: "module", sub: "list", channel: "both" },
267
+ { id: "module.info", name: "module", sub: "info", channel: "both" },
268
+ { id: "module.build", name: "module", sub: "build", channel: "both", accent: "dev" },
269
+ { id: "module.reload", name: "module", sub: "reload", channel: "both", accent: "dev" },
270
+ { id: "module.install", name: "module", sub: "install", channel: "both" },
271
+ {
272
+ id: "module.uninstall",
273
+ name: "module",
274
+ sub: "uninstall",
275
+ channel: "both",
276
+ aliases: ["remove"]
277
+ },
278
+ { id: "module.search", name: "module", sub: "search", channel: "both" },
279
+ { id: "module.verify", name: "module", sub: "verify", channel: "both" },
280
+ { id: "module.enable", name: "module", sub: "enable", channel: "both" },
281
+ { 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
+ { id: "packs.list", name: "packs", sub: "list", channel: "both" },
286
+ { id: "packs.search", name: "packs", sub: "search", channel: "both" },
287
+ { id: "packs.enable", name: "packs", sub: "enable", channel: "both" },
288
+ { id: "packs.disable", name: "packs", sub: "disable", channel: "both" },
289
+ { id: "packs.doctor", name: "packs", sub: "doctor", channel: "both" },
290
+ { id: "packs.path", name: "packs", sub: "path", channel: "both" },
291
+ { id: "packs.install", name: "packs", sub: "install", channel: "both" },
292
+ { id: "packs.scan", name: "packs", sub: "scan", channel: "both" },
293
+ { id: "packs.uninstall", name: "packs", sub: "uninstall", channel: "both" },
294
+ { id: "packs.bind", name: "packs", sub: "bind", channel: "both" },
295
+ { id: "packs.unbind", name: "packs", sub: "unbind", channel: "both" },
296
+ { id: "packs.sources", name: "packs", sub: "sources", channel: "both" },
297
+ { id: "packs.check", name: "packs", sub: "check", channel: "both" },
298
+ { id: "packs.update", name: "packs", sub: "update", channel: "both" },
299
+ { id: "packs.bump", name: "packs", sub: "bump", channel: "both" },
300
+ /* ─── repl-only ─── */
301
+ { id: "send", name: "send", channel: "repl" },
302
+ { id: "quit", name: "quit", channel: "repl" }
303
+ ];
304
+ export {
305
+ COMMAND_SPECS,
306
+ MODULE_TOP_SHORTHAND,
307
+ TOP_LEVEL_ALIASES,
308
+ canRunCommand,
309
+ findModuleSubSpec,
310
+ findPacksSubSpec,
311
+ findTopLevelSpec,
312
+ isCliTty,
313
+ isDevAccent,
314
+ isDevAccentModuleSub,
315
+ listPaletteEntries,
316
+ listPaletteRoots,
317
+ listVisibleCommands,
318
+ listVisibleModuleSubs,
319
+ listVisiblePacksSubs,
320
+ listVisibleTopLevelNames,
321
+ resolveModuleTopShorthand,
322
+ resolveTopLevelName
323
+ };
324
+ //# sourceMappingURL=command-surface.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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": "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",
6
+ "names": []
7
+ }
@@ -14,8 +14,8 @@ async function cmdReload(args) {
14
14
  parts.push(c.dim(t("reload.buildOnly")));
15
15
  return parts.join("\n") + "\n";
16
16
  }
17
- const { services } = await import("./services.js");
18
- if (!services.bds.running) {
17
+ const { isServiceRunning } = await import("./services.js");
18
+ if (!await isServiceRunning("bds")) {
19
19
  parts.push(c.yellow(t("reload.bdsNotRunning")));
20
20
  return parts.join("\n") + "\n";
21
21
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/commands-reload.ts"],
4
- "sourcesContent": ["/**\n * commands-reload.ts \u2014 \u6A21\u5757\u5F00\u53D1\u4E00\u952E\u91CD\u8F7D\n *\n * \u8BED\u4E49\uFF1Abuild \u2192 deploy \u2192\uFF08\u9ED8\u8BA4\uFF09\u5411 BDS \u63A7\u5236\u53F0\u53D1\u9001 `reload`\u3002\n * \u5165\u53E3\uFF1A`sfmc mod reload [--build-only]`\uFF08\u4E0D\u518D\u63D0\u4F9B\u9876\u5C42 `sfmc reload`\uFF09\u3002\n * `--build-only`\uFF1A\u53EA build+deploy\uFF0C\u4E0D\u5411 BDS \u53D1 reload\u3002\n */\n\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\nexport async function cmdReload(args: string[]): Promise<string> {\n const buildOnly = args.includes(\"--build-only\");\n const { cmdPackBuild, cmdPackDeploy } = await import(\"./pack-lifecycle.js\");\n\n const parts: string[] = [];\n const build = await cmdPackBuild([]);\n parts.push(build.message.trimEnd());\n if (!build.ok) return parts.join(\"\\n\") + \"\\n\";\n\n const deploy = await cmdPackDeploy([]);\n parts.push(deploy.message.trimEnd());\n if (!deploy.ok) return parts.join(\"\\n\") + \"\\n\";\n\n if (buildOnly) {\n parts.push(c.dim(t(\"reload.buildOnly\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { services } = await import(\"./services.js\");\n if (!services.bds.running) {\n parts.push(c.yellow(t(\"reload.bdsNotRunning\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { cmdSend } = await import(\"./commands.js\");\n parts.push((await cmdSend(\"bds\", \"reload\")).trimEnd());\n parts.push(c.green(t(\"reload.sent\")));\n return parts.join(\"\\n\") + \"\\n\";\n}\n"],
5
- "mappings": "AAQA,SAAS,SAAS;AAClB,SAAS,SAAS;AAElB,eAAsB,UAAU,MAAiC;AAC/D,QAAM,YAAY,KAAK,SAAS,cAAc;AAC9C,QAAM,EAAE,cAAc,cAAc,IAAI,MAAM,OAAO,qBAAqB;AAE1E,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,MAAM,aAAa,CAAC,CAAC;AACnC,QAAM,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAClC,MAAI,CAAC,MAAM,GAAI,QAAO,MAAM,KAAK,IAAI,IAAI;AAEzC,QAAM,SAAS,MAAM,cAAc,CAAC,CAAC;AACrC,QAAM,KAAK,OAAO,QAAQ,QAAQ,CAAC;AACnC,MAAI,CAAC,OAAO,GAAI,QAAO,MAAM,KAAK,IAAI,IAAI;AAE1C,MAAI,WAAW;AACb,UAAM,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACvC,WAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EAC5B;AAEA,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,eAAe;AACjD,MAAI,CAAC,SAAS,IAAI,SAAS;AACzB,UAAM,KAAK,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAC9C,WAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EAC5B;AAEA,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,eAAe;AAChD,QAAM,MAAM,MAAM,QAAQ,OAAO,QAAQ,GAAG,QAAQ,CAAC;AACrD,QAAM,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AACpC,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;",
4
+ "sourcesContent": ["/**\n * commands-reload.ts \u2014 \u6A21\u5757\u5F00\u53D1\u4E00\u952E\u91CD\u8F7D\n *\n * \u8BED\u4E49\uFF1Abuild \u2192 deploy \u2192\uFF08\u9ED8\u8BA4\uFF09\u5411 BDS \u63A7\u5236\u53F0\u53D1\u9001 `reload`\u3002\n * \u5165\u53E3\uFF1A`sfmc mod reload [--build-only]`\uFF08\u4E0D\u518D\u63D0\u4F9B\u9876\u5C42 `sfmc reload`\uFF09\u3002\n * `--build-only`\uFF1A\u53EA build+deploy\uFF0C\u4E0D\u5411 BDS \u53D1 reload\u3002\n */\n\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\nexport async function cmdReload(args: string[]): Promise<string> {\n const buildOnly = args.includes(\"--build-only\");\n const { cmdPackBuild, cmdPackDeploy } = await import(\"./pack-lifecycle.js\");\n\n const parts: string[] = [];\n const build = await cmdPackBuild([]);\n parts.push(build.message.trimEnd());\n if (!build.ok) return parts.join(\"\\n\") + \"\\n\";\n\n const deploy = await cmdPackDeploy([]);\n parts.push(deploy.message.trimEnd());\n if (!deploy.ok) return parts.join(\"\\n\") + \"\\n\";\n\n if (buildOnly) {\n parts.push(c.dim(t(\"reload.buildOnly\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { isServiceRunning } = await import(\"./services.js\");\n if (!(await isServiceRunning(\"bds\"))) {\n parts.push(c.yellow(t(\"reload.bdsNotRunning\")));\n return parts.join(\"\\n\") + \"\\n\";\n }\n\n const { cmdSend } = await import(\"./commands.js\");\n parts.push((await cmdSend(\"bds\", \"reload\")).trimEnd());\n parts.push(c.green(t(\"reload.sent\")));\n return parts.join(\"\\n\") + \"\\n\";\n}\n"],
5
+ "mappings": "AAQA,SAAS,SAAS;AAClB,SAAS,SAAS;AAElB,eAAsB,UAAU,MAAiC;AAC/D,QAAM,YAAY,KAAK,SAAS,cAAc;AAC9C,QAAM,EAAE,cAAc,cAAc,IAAI,MAAM,OAAO,qBAAqB;AAE1E,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,MAAM,aAAa,CAAC,CAAC;AACnC,QAAM,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAClC,MAAI,CAAC,MAAM,GAAI,QAAO,MAAM,KAAK,IAAI,IAAI;AAEzC,QAAM,SAAS,MAAM,cAAc,CAAC,CAAC;AACrC,QAAM,KAAK,OAAO,QAAQ,QAAQ,CAAC;AACnC,MAAI,CAAC,OAAO,GAAI,QAAO,MAAM,KAAK,IAAI,IAAI;AAE1C,MAAI,WAAW;AACb,UAAM,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACvC,WAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EAC5B;AAEA,QAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,eAAe;AACzD,MAAI,CAAE,MAAM,iBAAiB,KAAK,GAAI;AACpC,UAAM,KAAK,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC;AAC9C,WAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EAC5B;AAEA,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,eAAe;AAChD,QAAM,MAAM,MAAM,QAAQ,OAAO,QAAQ,GAAG,QAAQ,CAAC;AACrD,QAAM,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;AACpC,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  import { type ServiceName } from "./services.js";
2
- export declare function cmdStatus(): string;
2
+ export declare function cmdStatus(): Promise<string>;
3
3
  export declare function cmdLogs(args: string[], onFollow?: (serviceName: ServiceName) => void): string;
4
4
  export declare function cmdStart(raw: string): Promise<string>;
5
5
  export declare function cmdStop(raw: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAmBhF,wBAAgB,SAAS,IAAI,MAAM,CAiBlC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,CA+C7F;AAKD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe3D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAIlD;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DpE"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuD,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AA4BtG,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;AAKD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B3D;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC1D;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,CAc7D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;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"}