@sfmc-bds/cli 0.1.0 → 0.2.0-beta.0

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 (138) hide show
  1. package/README.md +7 -1
  2. package/dist/cli-result.d.ts +12 -0
  3. package/dist/cli-result.d.ts.map +1 -0
  4. package/dist/cli-result.js +15 -0
  5. package/dist/cli-result.js.map +7 -0
  6. package/dist/commands-behavior-pack.d.ts +11 -42
  7. package/dist/commands-behavior-pack.d.ts.map +1 -1
  8. package/dist/commands-behavior-pack.js +40 -159
  9. package/dist/commands-behavior-pack.js.map +7 -1
  10. package/dist/commands-reload.d.ts +9 -0
  11. package/dist/commands-reload.d.ts.map +1 -0
  12. package/dist/commands-reload.js +30 -0
  13. package/dist/commands-reload.js.map +7 -0
  14. package/dist/commands.d.ts +7 -0
  15. package/dist/commands.d.ts.map +1 -1
  16. package/dist/commands.js +182 -172
  17. package/dist/commands.js.map +7 -1
  18. package/dist/i18n/index.d.ts +26 -0
  19. package/dist/i18n/index.d.ts.map +1 -0
  20. package/dist/i18n/index.js +107 -0
  21. package/dist/i18n/index.js.map +7 -0
  22. package/dist/i18n/locales/en.d.ts +381 -0
  23. package/dist/i18n/locales/en.d.ts.map +1 -0
  24. package/dist/i18n/locales/en.js +393 -0
  25. package/dist/i18n/locales/en.js.map +7 -0
  26. package/dist/i18n/locales/zh-CN.d.ts +4 -0
  27. package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
  28. package/dist/i18n/locales/zh-CN.js +379 -0
  29. package/dist/i18n/locales/zh-CN.js.map +7 -0
  30. package/dist/i18n/types.d.ts +7 -0
  31. package/dist/i18n/types.d.ts.map +1 -0
  32. package/dist/i18n/types.js +17 -0
  33. package/dist/i18n/types.js.map +7 -0
  34. package/dist/index.d.ts +5 -11
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +51 -43
  37. package/dist/index.js.map +7 -1
  38. package/dist/interactive-prompts.d.ts +8 -0
  39. package/dist/interactive-prompts.d.ts.map +1 -0
  40. package/dist/interactive-prompts.js +57 -0
  41. package/dist/interactive-prompts.js.map +7 -0
  42. package/dist/locale-command.d.ts +3 -0
  43. package/dist/locale-command.d.ts.map +1 -0
  44. package/dist/locale-command.js +19 -0
  45. package/dist/locale-command.js.map +7 -0
  46. package/dist/logs.d.ts +22 -4
  47. package/dist/logs.d.ts.map +1 -1
  48. package/dist/logs.js +208 -193
  49. package/dist/logs.js.map +7 -1
  50. package/dist/main.js +135 -173
  51. package/dist/main.js.map +7 -1
  52. package/dist/module-commands.d.ts +43 -4
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +440 -327
  55. package/dist/module-commands.js.map +7 -1
  56. package/dist/module-fingerprint.d.ts +7 -0
  57. package/dist/module-fingerprint.d.ts.map +1 -0
  58. package/dist/module-fingerprint.js +31 -0
  59. package/dist/module-fingerprint.js.map +7 -0
  60. package/dist/module-wizard.d.ts +14 -0
  61. package/dist/module-wizard.d.ts.map +1 -0
  62. package/dist/module-wizard.js +313 -0
  63. package/dist/module-wizard.js.map +7 -0
  64. package/dist/pack-lifecycle.d.ts +95 -0
  65. package/dist/pack-lifecycle.d.ts.map +1 -0
  66. package/dist/pack-lifecycle.js +634 -0
  67. package/dist/pack-lifecycle.js.map +7 -0
  68. package/dist/pack-update/bindings.d.ts +12 -0
  69. package/dist/pack-update/bindings.d.ts.map +1 -0
  70. package/dist/pack-update/bindings.js +64 -0
  71. package/dist/pack-update/bindings.js.map +7 -0
  72. package/dist/pack-update/config.d.ts +22 -0
  73. package/dist/pack-update/config.d.ts.map +1 -0
  74. package/dist/pack-update/config.js +141 -0
  75. package/dist/pack-update/config.js.map +7 -0
  76. package/dist/pack-update/providers/curseforge.d.ts +23 -0
  77. package/dist/pack-update/providers/curseforge.d.ts.map +1 -0
  78. package/dist/pack-update/providers/curseforge.js +209 -0
  79. package/dist/pack-update/providers/curseforge.js.map +7 -0
  80. package/dist/pack-update/providers/index.d.ts +16 -0
  81. package/dist/pack-update/providers/index.d.ts.map +1 -0
  82. package/dist/pack-update/providers/index.js +37 -0
  83. package/dist/pack-update/providers/index.js.map +7 -0
  84. package/dist/pack-update/service.d.ts +21 -0
  85. package/dist/pack-update/service.d.ts.map +1 -0
  86. package/dist/pack-update/service.js +567 -0
  87. package/dist/pack-update/service.js.map +7 -0
  88. package/dist/pack-update/types.d.ts +126 -0
  89. package/dist/pack-update/types.d.ts.map +1 -0
  90. package/dist/pack-update/types.js +8 -0
  91. package/dist/pack-update/types.js.map +7 -0
  92. package/dist/pack-update/version-policy.d.ts +80 -0
  93. package/dist/pack-update/version-policy.d.ts.map +1 -0
  94. package/dist/pack-update/version-policy.js +216 -0
  95. package/dist/pack-update/version-policy.js.map +7 -0
  96. package/dist/registry.d.ts +12 -4
  97. package/dist/registry.d.ts.map +1 -1
  98. package/dist/registry.js +73 -106
  99. package/dist/registry.js.map +7 -1
  100. package/dist/remote-agent.d.ts.map +1 -1
  101. package/dist/remote-agent.js +160 -176
  102. package/dist/remote-agent.js.map +7 -1
  103. package/dist/repl.d.ts +4 -0
  104. package/dist/repl.d.ts.map +1 -1
  105. package/dist/repl.js +683 -605
  106. package/dist/repl.js.map +7 -1
  107. package/dist/runtime.d.ts +40 -14
  108. package/dist/runtime.d.ts.map +1 -1
  109. package/dist/runtime.js +185 -62
  110. package/dist/runtime.js.map +7 -1
  111. package/dist/services.d.ts +2 -0
  112. package/dist/services.d.ts.map +1 -1
  113. package/dist/services.js +251 -238
  114. package/dist/services.js.map +7 -1
  115. package/dist/sfmc-modules-root.d.ts +24 -0
  116. package/dist/sfmc-modules-root.d.ts.map +1 -0
  117. package/dist/sfmc-modules-root.js +70 -0
  118. package/dist/sfmc-modules-root.js.map +7 -0
  119. package/dist/theme.d.ts +4 -0
  120. package/dist/theme.d.ts.map +1 -1
  121. package/dist/theme.js +134 -48
  122. package/dist/theme.js.map +7 -1
  123. package/dist/wizard.d.ts.map +1 -1
  124. package/dist/wizard.js +363 -438
  125. package/dist/wizard.js.map +7 -1
  126. package/dist/world-packs.d.ts +22 -0
  127. package/dist/world-packs.d.ts.map +1 -0
  128. package/dist/world-packs.js +872 -0
  129. package/dist/world-packs.js.map +7 -0
  130. package/package.json +10 -10
  131. package/dist/dispatcher.d.ts +0 -13
  132. package/dist/dispatcher.d.ts.map +0 -1
  133. package/dist/dispatcher.js +0 -23
  134. package/dist/dispatcher.js.map +0 -1
  135. package/dist/terminal.d.ts +0 -3
  136. package/dist/terminal.d.ts.map +0 -1
  137. package/dist/terminal.js +0 -178
  138. package/dist/terminal.js.map +0 -1
@@ -1 +1,7 @@
1
- {"version":3,"file":"module-commands.js","sourceRoot":"","sources":["../src/module-commands.ts"],"names":[],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/module-commands.ts"],
4
+ "sourcesContent": ["/**\n * sfmc module-commands \u2014 runtime CLI for inspecting and managing modules\n * already on disk under `modules/packages/<id>/`.\n *\n * \u9876\u5C42\u547D\u4EE4\u522B\u540D:`module` / `mod`(\u7531 main.ts / repl.ts \u5171\u540C\u8BC6\u522B)\u3002\n *\n * Subcommands:\n * list List every installed module (reads each\n * modules/packages/<id>/sapi/manifest.json).\n * Marks registry-known modules with `\u25CF` and\n * modules from an unknown publisher with `?`.\n * search [id] \u62C9\u53D6 first-party registry \u5217\u8868;\u5E26 id \u5219\u67E5\u8BE5\u6A21\u5757 registry info\n * info <id> Show one module's manifest + on-disk fingerprint\n * verify [id] Recompute the SHA-256 fingerprint of installed\n * modules (id = one; no id = all)\n * install <id> Wrapper around `tools/fetch-module.mjs install`.\n * If `--from` is omitted, the first-party registry\n * is consulted (Tanya7z/sfmc-modules).\n * `--link` \u900F\u4F20\uFF1Adir \u6E90\u7528 junction/symlink\uFF08\u5F00\u53D1\u671F\uFF09\u3002\n * uninstall <id> Remove packages/<id>/ + catalog/lock via fetch-module\n * enable <id> POST /api/sfmc/modules/:id/enable on db-server\n * disable <id> POST /api/sfmc/modules/:id/disable on db-server\n * create \u4EA4\u4E92\u5F0F\u811A\u624B\u67B6\uFF08sfmc-modules/packages + \u53EF\u9009 link\uFF09\n * link [id] \u65E0 id\uFF1A\u4EA4\u4E92\u9009\u62E9\uFF1B\u6709 id\uFF1Ainstall --link\uFF08\u81EA\u52A8\u63A2\u6D4B\u65C1\u8DEF sfmc-modules\uFF09\n * dev link + enable + build + deploy \u4E00\u952E\u672C\u5730\u8054\u8C03\n *\n * The CLI never connects to the network for local ops.\n * `search`/`install`/`uninstall` \u9700\u8981\u7F51\u7EDC(\u6216\u672C\u5730 cache / --from)\u3002\n * enable/disable go through db-server REST so module-lock.json stays consistent.\n */\n\n/** \u9876\u5C42\u547D\u4EE4\u540D(\u4E3B\u540D + \u77ED\u522B\u540D),\u4F9B HELP / \u8865\u5168 / \u5206\u53D1\u5171\u7528\u3002 */\nexport const MODULE_CMD_NAMES = [\"module\", \"mod\"] as const;\n\nexport type ModuleCmdName = (typeof MODULE_CMD_NAMES)[number];\n\n/** \u5224\u65AD\u662F\u5426\u4E3A module \u9876\u5C42\u547D\u4EE4(\u542B\u522B\u540D);\u907F\u514D main/repl \u518D\u786C\u7F16\u7801 case\u3002 */\nexport function isModuleCommand(cmd: string | undefined): cmd is ModuleCmdName {\n return !!cmd && (MODULE_CMD_NAMES as readonly string[]).includes(cmd);\n}\n\n/** \u67D3\u8272\u540E\u7684 HELP \u524D\u7F00,\u907F\u514D HELP \u786C\u7F16\u7801 module/mod\u3002 */\nexport function paintModuleCmdAlias(paint: (name: string) => string): string {\n /* \u4E0D\u53EF\u5199\u6210 .map(paint):chalk \u4F1A\u5403\u5230 (value,index,array) \u5E76\u62FC\u51FA\u4E71\u6587\u6848 */\n return MODULE_CMD_NAMES.map((name) => paint(name)).join(\"/\");\n}\n\n/** \u5BF9\u5916\u5C55\u793A\u4E0E Tab \u8865\u5168\u7528\u7684\u5B50\u547D\u4EE4\u5217\u8868(\u4E0D\u542B remove \u7B49\u540C\u4E49\u522B\u540D)\u3002 */\nexport const MODULE_SUBCOMMANDS = [\n \"list\",\n \"search\",\n \"install\",\n \"uninstall\",\n \"verify\",\n \"info\",\n \"enable\",\n \"disable\",\n \"build\",\n \"reload\",\n \"create\",\n \"link\",\n \"dev\",\n] as const;\n\nimport fs from \"node:fs/promises\";\nimport { existsSync, readdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { configPath, modulePath, readJson, type DBConfig, type ModuleLock } from \"@sfmc-bds/sdk/node/config\";\nimport { failResult, okResult, type CliResult } from \"./cli-result.js\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\nimport { ROOT, resolveFetchModule } from \"./runtime.js\";\nimport { dirFingerprint } from \"./module-fingerprint.js\";\nimport {\n DEFAULT_REGISTRY_REPO,\n DEFAULT_REGISTRY_TAG,\n findUnknownModules,\n resolveRegistryIndex,\n} from \"./registry.js\";\n\n/** Usage \u884C\u4E3B\u540D|\u522B\u540D(\u4E0E MODULE_CMD_NAMES \u540C\u6E90,\u907F\u514D\u4E0E HELP \u6F02\u79FB)\u3002 */\nexport function moduleUsage(): string {\n return t(\"mod.usage\", {\n cmds: MODULE_CMD_NAMES.join(\"|\"),\n subs: MODULE_SUBCOMMANDS.join(\"|\"),\n });\n}\n\n/** Where modules live on disk. */\nfunction modulesDir(): string {\n return path.join(ROOT, \"modules\", \"packages\");\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n} B`;\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;\n return `${(n / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction shortHash(h: string): string {\n return h.slice(0, 8) + \"\u2026\" + h.slice(-8);\n}\n\ninterface ModuleManifest {\n schemaVersion?: number;\n id?: string;\n handlers?: string[];\n routes?: Array<{ method: string; path: string; handler: string }>;\n migrations?: Array<{ name: string; version: number }>;\n notes?: string;\n}\n\ninterface InstalledModule {\n id: string;\n path: string;\n manifest: ModuleManifest | null;\n totalBytes: number;\n fileCount: number;\n fingerprint: string;\n}\n\n/** Enumerate every installed module by scanning `modules/packages/<id>/`. */\nasync function scanInstalled(): Promise<InstalledModule[]> {\n const dir = modulesDir();\n if (!existsSync(dir)) return [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const out: InstalledModule[] = [];\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const id = e.name;\n const modPath = path.join(dir, id);\n const manifestPath = path.join(modPath, \"sapi\", \"manifest.json\");\n let manifest: ModuleManifest | null = null;\n if (existsSync(manifestPath)) {\n try {\n manifest = JSON.parse(await fs.readFile(manifestPath, \"utf8\")) as ModuleManifest;\n } catch {\n /* corrupt manifest is not fatal \u2014 just skip its fields */\n }\n }\n const { totalBytes, fileCount } = await dirSize(modPath);\n const fingerprint = await dirFingerprint(modPath);\n out.push({ id, path: modPath, manifest, totalBytes, fileCount, fingerprint });\n }\n out.sort((a, b) => a.id.localeCompare(b.id));\n return out;\n}\n\nasync function dirSize(dir: string): Promise<{ totalBytes: number; fileCount: number }> {\n let totalBytes = 0;\n let fileCount = 0;\n async function walk(p: string): Promise<void> {\n for (const e of await fs.readdir(p, { withFileTypes: true })) {\n const child = path.join(p, e.name);\n if (e.isDirectory()) await walk(child);\n else if (e.isFile()) {\n const s = await fs.stat(child);\n totalBytes += s.size;\n fileCount++;\n }\n }\n }\n await walk(dir);\n return { totalBytes, fileCount };\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * list\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nexport async function cmdModuleList(_args: string[]): Promise<string> {\n const installed = await scanInstalled();\n if (installed.length === 0) {\n return c.dim(t(\"mod.noneInstalled\", { dir: modulesDir() }));\n }\n const lock =\n (readJson<ModuleLock>(modulePath(path.join(ROOT, \"modules\"), \"module-lock.json\")) ?? {\n version: 1,\n modules: {},\n }) as ModuleLock;\n const ids = installed.map((m) => m.id);\n const unknown = new Set(await findUnknownModules(ids));\n const lines: string[] = [c.bold(`\\n${t(\"mod.list.title\")}`), c.dim(` ${modulesDir()}`)];\n const header = ` ${\"id\".padEnd(24)}${\"state\".padEnd(8)}${\"files\".padEnd(8)}${\"size\".padEnd(10)}${\"fingerprint\"}`;\n lines.push(c.dim(header));\n for (const m of installed) {\n const logicalId = typeof m.manifest?.id === \"string\" && m.manifest.id ? m.manifest.id : m.id;\n const enabled = lock.modules?.[logicalId]?.enabled === true;\n const stateCol = (enabled ? c.green(\"on\") : c.dim(\"off\")).padEnd(8);\n let mark: string;\n if (!m.manifest) {\n mark = c.yellow(\"\u25CB\");\n } else if (unknown.has(m.id)) {\n mark = c.yellow(\"?\");\n } else {\n mark = enabled ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n }\n const idLabel = logicalId !== m.id ? `${m.id}(${logicalId})` : m.id;\n lines.push(\n ` ${mark} ${idLabel.padEnd(22)}${stateCol}${String(m.fileCount).padEnd(8)}${fmtBytes(m.totalBytes).padEnd(10)}${shortHash(m.fingerprint)}`\n );\n }\n lines.push(c.dim(`\\n tip: ${MODULE_CMD_NAMES[1] ?? \"mod\"} enable|disable <logicalId>`));\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Walk `modules/packages/<id>/` and print a one-line yellow warning for each\n * id that isn't in the first-party registry. Intended for the REPL startup\n * hook so users immediately see modules they installed from somewhere else.\n *\n * Best-effort: registry unreachable \u2192 no warning (no false positives).\n */\nexport async function scanAndWarnUnknown(): Promise<string> {\n const installed = await scanInstalled();\n if (installed.length === 0) return \"\";\n const unknown = await findUnknownModules(installed.map((m) => m.id));\n if (unknown.length === 0) return \"\";\n const list = unknown.map((id) => ` ${c.yellow(\"?\")} ${id}`).join(\"\\n\");\n return `${c.yellow(\"[sfmc] modules installed from unknown publisher \u2014 verify before use:\")}\\n${list}\\n`;\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * search \u2014 \u62C9\u53D6 first-party registry;\u5E26 id \u67E5\u5355\u6761 registry info\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/**\n * \u62C9\u53D6 first-party registry \u6A21\u5757\u5217\u8868;\u5E26 id \u65F6\u5C55\u793A\u8BE5\u6761\u76EE\u7684 registry info\u3002\n * \u4E0E\u672C\u5730 `info`(\u5DF2\u5B89\u88C5\u78C1\u76D8\u8BE6\u60C5)\u533A\u5206:`search` \u770B registry,`info` \u770B\u672C\u673A packages\u3002\n */\nexport async function cmdModuleSearch(args: string[]): Promise<string> {\n const query = args[0];\n const { index, stale } = await resolveRegistryIndex({ force: true });\n const ids = Object.keys(index).sort((a, b) => a.localeCompare(b));\n\n if (ids.length === 0) {\n return c.red(\n `\\nRegistry empty or unreachable (${DEFAULT_REGISTRY_REPO}@${DEFAULT_REGISTRY_TAG}).\\n` +\n `Check network, or install with an explicit source: sfmc mod install <id> --from github:owner/repo@tag\\n`\n );\n }\n\n const staleNote = stale ? c.yellow(\" (offline \u2014 showing cached index)\\n\") : \"\";\n\n /* \u65E0\u53C2\u6570:\u5217\u51FA\u5168\u90E8 */\n if (!query) {\n const installed = new Set(listInstalledModuleIdsSync());\n const lines: string[] = [\n c.bold(`\\nFirst-party registry (${DEFAULT_REGISTRY_REPO}@${DEFAULT_REGISTRY_TAG}) \u2014 ${ids.length} modules`),\n ];\n if (staleNote) lines.push(staleNote.trimEnd());\n lines.push(c.dim(` ${\"id\".padEnd(28)}${\"source\".padEnd(40)}local`));\n for (const id of ids) {\n const e = index[id]!;\n const src = `${e.repo}@${e.tag}`;\n const local = installed.has(id) ? c.green(\"\u25CF\") : c.dim(\"\u25CB\");\n lines.push(` ${local} ${id.padEnd(26)}${src.padEnd(40)}${installed.has(id) ? \"installed\" : \"\"}`);\n }\n lines.push(c.dim(`\\n tip: sfmc mod search <id> \u2192 registry info`));\n lines.push(c.dim(` sfmc mod install <id> \u2192 download + catalog sync`));\n return lines.join(\"\\n\") + \"\\n\";\n }\n\n /* \u5E26 id:\u67E5\u5355\u6761 registry info */\n const entry = index[query];\n if (!entry) {\n const hints = ids.filter((id) => id.includes(query) || query.includes(id)).slice(0, 8);\n const hintBlock =\n hints.length > 0\n ? c.dim(`\\n Did you mean:\\n`) + hints.map((h) => ` ${h}`).join(\"\\n\")\n : c.dim(`\\n Known ids: ${ids.slice(0, 12).join(\", \")}${ids.length > 12 ? \", \u2026\" : \"\"}`);\n return c.red(t(\"mod.notInRegistry\", { query })) + hintBlock + \"\\n\";\n }\n\n const installedPath = path.join(modulesDir(), query);\n const isInstalled = existsSync(installedPath);\n const lines: string[] = [c.bold(`\\n${query}`)];\n if (staleNote) lines.push(staleNote.trimEnd());\n lines.push(` registry : ${DEFAULT_REGISTRY_REPO}@${DEFAULT_REGISTRY_TAG}`);\n lines.push(` repo : ${entry.repo}`);\n lines.push(` tag : ${entry.tag}`);\n lines.push(` source : github:${entry.repo}@${entry.tag}`);\n lines.push(` github : https://github.com/${entry.repo}/tree/${entry.tag}`);\n lines.push(\n ` local : ${isInstalled ? c.green(`installed @ ${installedPath}`) : c.dim(\"not installed\")}`\n );\n\n if (!isInstalled) {\n lines.push(c.dim(`\\n install: sfmc mod install ${query}`));\n } else {\n lines.push(c.dim(`\\n details: sfmc mod info ${query}`));\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * info\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nexport async function cmdModuleInfo(args: string[]): Promise<string> {\n const id = args[0];\n if (!id) return c.yellow(t(\"mod.info.usage\"));\n const all = await scanInstalled();\n const m = all.find((x) => x.id === id);\n if (!m) return c.red(t(\"mod.notInstalledAt\", { id, path: path.join(modulesDir(), id) }));\n const lines: string[] = [c.bold(`\\n${id}`)];\n lines.push(` path : ${m.path}`);\n lines.push(` files : ${m.fileCount}`);\n lines.push(` size : ${fmtBytes(m.totalBytes)}`);\n lines.push(` fingerprint : ${m.fingerprint}`);\n if (m.manifest) {\n lines.push(` schemaVer : ${m.manifest.schemaVersion ?? \"(none)\"}`);\n lines.push(` routes : ${m.manifest.routes?.length ?? 0}`);\n if (m.manifest.routes?.length) {\n for (const r of m.manifest.routes) lines.push(c.dim(` ${r.method.padEnd(7)} ${r.path.padEnd(36)} ${r.handler}`));\n }\n lines.push(` migrations : ${m.manifest.migrations?.length ?? 0}`);\n if (m.manifest.migrations?.length) {\n for (const mg of m.manifest.migrations) lines.push(c.dim(` v${mg.version} ${mg.name}`));\n }\n if (m.manifest.notes) lines.push(` notes : ${c.dim(m.manifest.notes)}`);\n } else {\n lines.push(c.yellow(` manifest : (missing or unreadable)`));\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * verify\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nexport async function cmdModuleVerify(args: string[]): Promise<string> {\n const id = args[0];\n if (id) {\n const all = await scanInstalled();\n const m = all.find((x) => x.id === id);\n if (!m) return c.red(t(\"mod.notInstalled\", { id }));\n return c.green(t(\"mod.verifyOk\", { id, fp: m.fingerprint }));\n }\n const all = await scanInstalled();\n const lines = [c.bold(\"\\nVerifying installed modules\")];\n for (const m of all) {\n lines.push(` ${m.id.padEnd(28)} ${shortHash(m.fingerprint)}`);\n }\n if (all.length === 0) lines.push(c.dim(\" (none)\"));\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * install \u2014 shells out to tools/fetch-module.mjs\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * enable / disable \u2014 talk to db-server over loopback HTTP\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nfunction readDbConfig(): DBConfig {\n return (readJson<DBConfig>(configPath(ROOT, \"db_config.json\")) ?? {}) as DBConfig;\n}\n\nasync function postModuleToggle(id: string, action: \"enable\" | \"disable\"): Promise<CliResult> {\n const cfg = readDbConfig();\n const port = cfg.db_port ?? 3001;\n const token = cfg.http_auth || \"\";\n const url = `http://127.0.0.1:${port}/api/sfmc/modules/${encodeURIComponent(id)}/${action}`;\n let res: Response;\n try {\n res = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n },\n });\n } catch (err) {\n return failResult(\n c.red(t(\"mod.dbUnreachable\", { url, message: (err as Error).message }))\n );\n }\n const text = await res.text();\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n if (!res.ok) {\n const err = (body as { error?: string })?.error ?? `HTTP ${res.status}`;\n return failResult(c.red(t(\"mod.toggleFailed\", { action, id, err })));\n }\n const ok = (body as { success?: boolean })?.success !== false;\n if (ok) {\n const label = action === \"enable\" ? t(\"mod.action.enabled\") : t(\"mod.action.disabled\");\n return okResult(c.green(t(\"mod.toggleOk\", { label, id })));\n }\n return failResult(c.red(t(\"mod.toggleBadBody\", { action, id, text })));\n}\n\nexport async function cmdModuleEnable(args: string[]): Promise<CliResult> {\n const id = args[0];\n if (!id) return failResult(c.yellow(t(\"mod.enable.usage\")));\n return postModuleToggle(id, \"enable\");\n}\n\nexport async function cmdModuleDisable(args: string[]): Promise<CliResult> {\n const id = args[0];\n if (!id) return failResult(c.yellow(t(\"mod.disable.usage\")));\n return postModuleToggle(id, \"disable\");\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * install \u2014 shells out to tools/fetch-module.mjs\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nexport async function cmdModuleInstall(args: string[]): Promise<string> {\n // \u652F\u6301: install <id> [id2 ...] [--from ...] [--link]\n const flags = parseFlags(args);\n const positional: string[] = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--from\" || args[i] === \"--sha256\") {\n i++;\n continue;\n }\n if (args[i]?.startsWith(\"--from=\") || args[i]?.startsWith(\"--sha256=\")) continue;\n if (args[i]?.startsWith(\"--\")) continue;\n positional.push(args[i]!);\n }\n if (positional.length === 0) {\n return c.yellow(t(\"mod.install.usage\"));\n }\n\n /* --link \u65E0 --from \u65F6\uFF1A\u81EA\u52A8\u63A2\u6D4B\u65C1\u8DEF sfmc-modules\uFF08\u4E0E mod link \u4E00\u81F4\uFF09 */\n if (flags.link && !flags.from) {\n const { resolveSfmcModulesRoot, packageDirForId } = await import(\"./sfmc-modules-root.js\");\n const modulesRoot = resolveSfmcModulesRoot();\n if (!modulesRoot) {\n return c.red(t(\"mod.linkNeedsFrom\"));\n }\n flags.from =\n positional.length === 1\n ? `dir:${packageDirForId(modulesRoot, positional[0]!)}`\n : `dir:${path.join(modulesRoot, \"packages\")}`;\n }\n\n const fetchScript = resolveFetchModule();\n if (!fetchScript) {\n return c.red(t(\"mod.fetchMissing\"));\n }\n const sub = [\"install\", ...positional];\n if (flags.from) sub.push(\"--from\", flags.from);\n if (flags.sha256) sub.push(\"--sha256\", flags.sha256);\n if (flags.link) sub.push(\"--link\");\n return new Promise<string>((resolve) => {\n const proc = spawn(process.execPath, [fetchScript, ...sub], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: ROOT },\n });\n let out = \"\";\n proc.stdout?.on(\"data\", (d: Buffer) => {\n out += d.toString();\n });\n proc.stderr?.on(\"data\", (d: Buffer) => {\n out += d.toString();\n });\n proc.on(\"exit\", (code) => {\n resolve(out + (code === 0 ? \"\" : `\\n[exit ${code}]`));\n });\n proc.on(\"error\", (e) => resolve(c.red(`spawn failed: ${e.message}`)));\n });\n}\n\n/**\n * `mod link [id] [--from dir:\u2026]`\n * - \u6709 id\uFF1A\u7B49\u4EF7 `install <id> --link`\uFF0C\u7F3A\u7701 --from \u65F6\u81EA\u52A8\u62FC\u65C1\u8DEF packages/<id>\n * - \u65E0 id\uFF1A\u8FDB\u5165\u4EA4\u4E92\u9009\u62E9\uFF08@clack/prompts\uFF09\n */\nexport async function cmdModuleLink(args: string[]): Promise<string> {\n const flags = parseFlags(args);\n const positional: string[] = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--from\" || args[i] === \"--sha256\") {\n i++;\n continue;\n }\n if (args[i]?.startsWith(\"--from=\") || args[i]?.startsWith(\"--sha256=\")) continue;\n if (args[i]?.startsWith(\"--\")) continue;\n positional.push(args[i]!);\n }\n\n if (positional.length === 0) {\n const { runModuleLinkWizard } = await import(\"./module-wizard.js\");\n return runModuleLinkWizard();\n }\n\n const id = positional[0]!;\n const installArgs = [id, \"--link\"];\n if (flags.from) installArgs.push(\"--from\", flags.from);\n return cmdModuleInstall(installArgs);\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * uninstall\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nexport async function cmdModuleUninstall(args: string[]): Promise<string> {\n const id = args[0];\n if (!id) return c.yellow(t(\"mod.uninstall.usage\"));\n const fetchScript = resolveFetchModule();\n if (!fetchScript) {\n // \u56DE\u9000:\u4EC5\u5220\u76EE\u5F55(\u65E7\u884C\u4E3A)\n const target = path.join(modulesDir(), id);\n if (!existsSync(target)) return c.yellow(t(\"mod.notInstalledFolder\", { id, path: target }));\n await fs.rm(target, { recursive: true, force: true });\n return c.green(t(\"mod.removed\", { id, path: target }));\n }\n return new Promise<string>((resolve) => {\n const proc = spawn(process.execPath, [fetchScript, \"uninstall\", id], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: ROOT },\n });\n let out = \"\";\n proc.stdout?.on(\"data\", (d: Buffer) => {\n out += d.toString();\n });\n proc.stderr?.on(\"data\", (d: Buffer) => {\n out += d.toString();\n });\n proc.on(\"exit\", (code) => {\n resolve(out + (code === 0 ? \"\" : `\\n[exit ${code}]`));\n });\n proc.on(\"error\", (e) => resolve(c.red(`spawn failed: ${e.message}`)));\n });\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * CLI flag parsing\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\ninterface InstallFlags {\n from: string | null;\n sha256: string | null;\n link: boolean;\n}\n\nfunction parseFlags(args: string[]): InstallFlags {\n const flags: InstallFlags = { from: null, sha256: null, link: false };\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--from\") flags.from = args[++i] ?? null;\n else if (args[i]?.startsWith(\"--from=\")) flags.from = args[i]!.slice(\"--from=\".length);\n else if (args[i] === \"--sha256\") flags.sha256 = args[++i] ?? null;\n else if (args[i]?.startsWith(\"--sha256=\")) flags.sha256 = args[i]!.slice(\"--sha256=\".length);\n else if (args[i] === \"--link\") flags.link = true;\n }\n return flags;\n}\n\n/**\n * \u7EDF\u4E00\u5206\u53D1 module/mod \u5B50\u547D\u4EE4 \u2014\u2014 CLI(`main.ts`)\u4E0E REPL(`repl.ts`)\u5171\u7528,\n * \u907F\u514D\u4E24\u5904 switch \u6F02\u79FB(\u4F8B\u5982\u539F\u5148 REPL \u7F3A enable/disable)\u3002\n *\n * `remove` \u4F5C\u4E3A uninstall \u7684\u540C\u4E49\u522B\u540D\u4FDD\u7559\u3002\n */\nexport async function dispatchModuleCommand(sub: string | undefined, args: string[]): Promise<string> {\n switch (sub) {\n case \"list\":\n return cmdModuleList(args);\n case \"search\":\n return cmdModuleSearch(args);\n case \"install\":\n return cmdModuleInstall(args);\n case \"uninstall\":\n case \"remove\":\n return cmdModuleUninstall(args);\n case \"verify\":\n return cmdModuleVerify(args);\n case \"info\":\n return cmdModuleInfo(args);\n case \"enable\":\n return (await cmdModuleEnable(args)).message;\n case \"disable\":\n return (await cmdModuleDisable(args)).message;\n case \"build\": {\n const { cmdPackBuild } = await import(\"./pack-lifecycle.js\");\n return (await cmdPackBuild(args)).message;\n }\n case \"reload\": {\n const { cmdReload } = await import(\"./commands-reload.js\");\n return cmdReload(args);\n }\n case \"create\": {\n const { runModuleCreateWizard } = await import(\"./module-wizard.js\");\n return runModuleCreateWizard();\n }\n case \"link\":\n return cmdModuleLink(args);\n case \"dev\": {\n const { runModuleDevWizard } = await import(\"./module-wizard.js\");\n return runModuleDevWizard();\n }\n default:\n return c.yellow(moduleUsage());\n }\n}\n\n/** \u540C\u6B65\u679A\u4E3E\u5DF2\u5B89\u88C5\u6A21\u5757 id,\u4F9B REPL Tab \u8865\u5168(\u4E0D\u8BFB fingerprint,\u5C3D\u91CF\u8F7B\u91CF)\u3002 */\nexport function listInstalledModuleIdsSync(): string[] {\n const dir = modulesDir();\n if (!existsSync(dir)) return [];\n try {\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}"],
5
+ "mappings": "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",
6
+ "names": ["lines", "all"]
7
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * module-fingerprint.ts — 模块目录 canonical SHA-256
3
+ * (与原先 module-commands 内 dirFingerprint 算法一致,供 catalog / verify 共用)。
4
+ */
5
+ /** Compute the canonical SHA-256 of a module directory (POSIX `find ... | sha256sum` compatible). */
6
+ export declare function dirFingerprint(rootDir: string): Promise<string>;
7
+ //# sourceMappingURL=module-fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-fingerprint.d.ts","sourceRoot":"","sources":["../src/module-fingerprint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,qGAAqG;AACrG,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBrE"}
@@ -0,0 +1,31 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ async function dirFingerprint(rootDir) {
5
+ const hash = createHash("sha256");
6
+ const entries = [];
7
+ async function walk(rel) {
8
+ const full = path.join(rootDir, rel);
9
+ const items = await fs.readdir(full, { withFileTypes: true });
10
+ const sorted = items.sort((a, b) => a.name.localeCompare(b.name));
11
+ for (const it of sorted) {
12
+ const child = rel ? `${rel}/${it.name}` : it.name;
13
+ if (it.isDirectory()) await walk(child);
14
+ else if (it.isFile()) entries.push(child);
15
+ }
16
+ }
17
+ await walk("");
18
+ entries.sort();
19
+ for (const rel of entries) {
20
+ const data = await fs.readFile(path.join(rootDir, rel));
21
+ hash.update(rel.replaceAll("\\", "/"));
22
+ hash.update("\n");
23
+ hash.update(data);
24
+ hash.update("\n");
25
+ }
26
+ return hash.digest("hex");
27
+ }
28
+ export {
29
+ dirFingerprint
30
+ };
31
+ //# sourceMappingURL=module-fingerprint.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/module-fingerprint.ts"],
4
+ "sourcesContent": ["/**\n * module-fingerprint.ts \u2014 \u6A21\u5757\u76EE\u5F55 canonical SHA-256\n * (\u4E0E\u539F\u5148 module-commands \u5185 dirFingerprint \u7B97\u6CD5\u4E00\u81F4,\u4F9B catalog / verify \u5171\u7528)\u3002\n */\n\nimport { createHash } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\n/** Compute the canonical SHA-256 of a module directory (POSIX `find ... | sha256sum` compatible). */\nexport async function dirFingerprint(rootDir: string): Promise<string> {\n const hash = createHash(\"sha256\");\n const entries: string[] = [];\n async function walk(rel: string): Promise<void> {\n const full = path.join(rootDir, rel);\n const items = await fs.readdir(full, { withFileTypes: true });\n const sorted = items.sort((a, b) => a.name.localeCompare(b.name));\n for (const it of sorted) {\n const child = rel ? `${rel}/${it.name}` : it.name;\n if (it.isDirectory()) await walk(child);\n else if (it.isFile()) entries.push(child);\n }\n }\n await walk(\"\");\n entries.sort();\n for (const rel of entries) {\n const data = await fs.readFile(path.join(rootDir, rel));\n hash.update(rel.replaceAll(\"\\\\\", \"/\"));\n hash.update(\"\\n\");\n hash.update(data);\n hash.update(\"\\n\");\n }\n return hash.digest(\"hex\");\n}\n"],
5
+ "mappings": "AAKA,SAAS,kBAAkB;AAC3B,OAAO,QAAQ;AACf,OAAO,UAAU;AAGjB,eAAsB,eAAe,SAAkC;AACrE,QAAM,OAAO,WAAW,QAAQ;AAChC,QAAM,UAAoB,CAAC;AAC3B,iBAAe,KAAK,KAA4B;AAC9C,UAAM,OAAO,KAAK,KAAK,SAAS,GAAG;AACnC,UAAM,QAAQ,MAAM,GAAG,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAC5D,UAAM,SAAS,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAChE,eAAW,MAAM,QAAQ;AACvB,YAAM,QAAQ,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,KAAK,GAAG;AAC7C,UAAI,GAAG,YAAY,EAAG,OAAM,KAAK,KAAK;AAAA,eAC7B,GAAG,OAAO,EAAG,SAAQ,KAAK,KAAK;AAAA,IAC1C;AAAA,EACF;AACA,QAAM,KAAK,EAAE;AACb,UAAQ,KAAK;AACb,aAAW,OAAO,SAAS;AACzB,UAAM,OAAO,MAAM,GAAG,SAAS,KAAK,KAAK,SAAS,GAAG,CAAC;AACtD,SAAK,OAAO,IAAI,WAAW,MAAM,GAAG,CAAC;AACrC,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAChB,SAAK,OAAO,IAAI;AAAA,EAClB;AACA,SAAO,KAAK,OAAO,KAAK;AAC1B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * module-wizard.ts — 模块脚手架 / 本地联调交互向导
3
+ *
4
+ * 复用 @clack/prompts 与 init 向导相同依赖;薄包装 tools/new-module.mjs、fetch-module.mjs。
5
+ */
6
+ declare function isInteractive(): boolean;
7
+ /** 交互式创建模块包并可选 link / enable / build+deploy。 */
8
+ export declare function runModuleCreateWizard(): Promise<string>;
9
+ /** 从 sfmc-modules/packages 选择并 --link 安装。 */
10
+ export declare function runModuleLinkWizard(): Promise<string>;
11
+ /** 链接 + 启用 + 构建部署(本地开发一键流)。 */
12
+ export declare function runModuleDevWizard(): Promise<string>;
13
+ export { isInteractive as isModuleWizardInteractive };
14
+ //# sourceMappingURL=module-wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-wizard.d.ts","sourceRoot":"","sources":["../src/module-wizard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,iBAAS,aAAa,IAAI,OAAO,CAEhC;AAgGD,gDAAgD;AAChD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiG7D;AAED,6CAA6C;AAC7C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAsD3D;AAED,+BAA+B;AAC/B,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CA4E1D;AAED,OAAO,EAAE,aAAa,IAAI,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,313 @@
1
+ import { confirm, intro, isCancel, note, outro, select, tasks, text } from "@clack/prompts";
2
+ import { spawn } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ import path from "node:path";
5
+ import process from "node:process";
6
+ import { t } from "./i18n/index.js";
7
+ import { cmdModuleEnable } from "./module-commands.js";
8
+ import { pickDirectory, resolveUserPath } from "./interactive-prompts.js";
9
+ import { ROOT, resolveFetchModule, resolveNewModule } from "./runtime.js";
10
+ import {
11
+ listSfmcModulePackages,
12
+ packageDirForId,
13
+ persistSfmcModulesRoot,
14
+ resolveSfmcModulesRoot
15
+ } from "./sfmc-modules-root.js";
16
+ import { c } from "./theme.js";
17
+ function isInteractive() {
18
+ return Boolean(process.stdin.isTTY);
19
+ }
20
+ function cancelMessage() {
21
+ return c.dim(t("common.cancelled"));
22
+ }
23
+ function spawnTool(script, args) {
24
+ return new Promise((resolve) => {
25
+ const proc = spawn(process.execPath, [script, ...args], {
26
+ stdio: ["ignore", "pipe", "pipe"],
27
+ env: { ...process.env, SFMC_ROOT: ROOT }
28
+ });
29
+ let output = "";
30
+ proc.stdout?.on("data", (d) => {
31
+ output += d.toString();
32
+ });
33
+ proc.stderr?.on("data", (d) => {
34
+ output += d.toString();
35
+ });
36
+ proc.on("exit", (code) => resolve({ code, output }));
37
+ proc.on("error", (e) => resolve({ code: 1, output: `${output}${e.message}` }));
38
+ });
39
+ }
40
+ async function ensureSfmcModulesRoot() {
41
+ let modulesRoot = resolveSfmcModulesRoot();
42
+ if (modulesRoot) {
43
+ note(c.text(t("modwiz.sfmcModulesPath", { path: modulesRoot })), t("common.path"));
44
+ return modulesRoot;
45
+ }
46
+ const defaultGuess = path.resolve(ROOT, "..", "sfmc-modules");
47
+ const picked = await pickDirectory(t("modwiz.pickModulesRoot"), defaultGuess);
48
+ modulesRoot = resolveUserPath(picked, ROOT);
49
+ if (!existsSync(path.join(modulesRoot, "packages"))) {
50
+ outro(c.red(t("modwiz.noPackages", { path: modulesRoot })));
51
+ return null;
52
+ }
53
+ persistSfmcModulesRoot(modulesRoot);
54
+ return modulesRoot;
55
+ }
56
+ async function runFetchModuleLink(folderId, pkgPath) {
57
+ const fetchScript = resolveFetchModule();
58
+ if (!fetchScript) {
59
+ return { ok: false, output: c.red(t("modwiz.noFetch")) };
60
+ }
61
+ const fromArg = `dir:${path.resolve(pkgPath)}`;
62
+ const { code, output } = await spawnTool(fetchScript, ["install", folderId, "--from", fromArg, "--link"]);
63
+ return { ok: code === 0, output };
64
+ }
65
+ async function maybeEnableModule(folderId) {
66
+ const enable = await confirm({ message: t("modwiz.enableModule"), initialValue: true });
67
+ if (isCancel(enable) || !enable) return void 0;
68
+ return (await cmdModuleEnable([folderId])).message;
69
+ }
70
+ async function maybeBuildDeploy() {
71
+ const buildDeploy = await confirm({
72
+ message: t("modwiz.buildDeploy"),
73
+ initialValue: true
74
+ });
75
+ if (isCancel(buildDeploy) || !buildDeploy) return;
76
+ const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import("./commands-behavior-pack.js");
77
+ await tasks([
78
+ {
79
+ title: t("modwiz.task.build"),
80
+ task: async () => {
81
+ const r = await cmdBehaviorPackBuild([]);
82
+ if (!r.ok) throw new Error(r.message.trim());
83
+ return t("common.done");
84
+ }
85
+ },
86
+ {
87
+ title: t("modwiz.task.deploy"),
88
+ task: async () => {
89
+ const r = await cmdBehaviorPackDeploy([]);
90
+ if (!r.ok) throw new Error(r.message.trim());
91
+ return t("common.done");
92
+ }
93
+ }
94
+ ]);
95
+ note(c.yellow(t("modwiz.reloadHint")), t("common.hint"));
96
+ }
97
+ function validateFolderId(value) {
98
+ if (!value?.trim()) return t("common.required");
99
+ if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value.trim())) {
100
+ return t("modwiz.kebab");
101
+ }
102
+ return void 0;
103
+ }
104
+ async function runModuleCreateWizard() {
105
+ if (!isInteractive()) {
106
+ return c.yellow(t("modwiz.needTty.create"));
107
+ }
108
+ intro(c.bold(t("modwiz.createIntro")));
109
+ const modulesRoot = await ensureSfmcModulesRoot();
110
+ if (!modulesRoot) return cancelMessage();
111
+ const idRaw = await text({
112
+ message: t("modwiz.folderId"),
113
+ placeholder: "my-feature",
114
+ validate: validateFolderId
115
+ });
116
+ if (isCancel(idRaw) || !idRaw) {
117
+ outro(cancelMessage());
118
+ return cancelMessage();
119
+ }
120
+ const folderId = idRaw.trim();
121
+ const target = packageDirForId(modulesRoot, folderId);
122
+ if (existsSync(target)) {
123
+ outro(c.red(t("modwiz.dirExists", { path: target })));
124
+ return c.red(t("modwiz.dirExists", { path: target }));
125
+ }
126
+ const nameRaw = await text({
127
+ message: t("modwiz.displayName"),
128
+ initialValue: folderId,
129
+ validate: (v) => !v?.trim() ? t("common.required") : void 0
130
+ });
131
+ if (isCancel(nameRaw) || !nameRaw) {
132
+ outro(cancelMessage());
133
+ return cancelMessage();
134
+ }
135
+ const template = await select({
136
+ message: t("modwiz.template"),
137
+ options: [
138
+ { value: "minimal", label: t("modwiz.tpl.minimal"), hint: t("modwiz.tpl.minimalHint") },
139
+ { value: "db", label: t("modwiz.tpl.db"), hint: t("modwiz.tpl.dbHint") }
140
+ ]
141
+ });
142
+ if (isCancel(template)) {
143
+ outro(cancelMessage());
144
+ return cancelMessage();
145
+ }
146
+ const siblingNewModule = path.join(modulesRoot, "tools", "new-module.mjs");
147
+ const platformNewModule = resolveNewModule();
148
+ const useSibling = existsSync(siblingNewModule) && template === "minimal";
149
+ const newModuleScript = useSibling ? siblingNewModule : platformNewModule;
150
+ if (!newModuleScript) {
151
+ outro(c.red(t("modwiz.noNewModule")));
152
+ return c.red(t("modwiz.noNewModule"));
153
+ }
154
+ let scaffoldOutput = "";
155
+ try {
156
+ await tasks([
157
+ {
158
+ title: t("modwiz.genPackage", { id: folderId }),
159
+ task: async () => {
160
+ const spawnArgs = useSibling ? [folderId, nameRaw.trim()] : [folderId, "--name", nameRaw.trim(), "--root", modulesRoot, "--template", String(template)];
161
+ const { code, output } = await spawnTool(newModuleScript, spawnArgs);
162
+ scaffoldOutput = output;
163
+ if (code !== 0) throw new Error(output.trim() || `exit ${code}`);
164
+ return t("modwiz.skeletonWritten");
165
+ }
166
+ }
167
+ ]);
168
+ } catch (e) {
169
+ outro(c.red(e.message));
170
+ return c.red(e.message);
171
+ }
172
+ note(scaffoldOutput.trim() || c.green(t("modwiz.createdNote", { path: target })), t("modwiz.createIntro"));
173
+ const doLink = await confirm({
174
+ message: t("modwiz.linkAsk"),
175
+ initialValue: true
176
+ });
177
+ if (!isCancel(doLink) && doLink) {
178
+ const { ok, output } = await runFetchModuleLink(folderId, target);
179
+ note(output.trim(), ok ? t("modwiz.link") : t("modwiz.linkFailed"));
180
+ if (ok) {
181
+ const enableMsg = await maybeEnableModule(folderId);
182
+ if (enableMsg) note(enableMsg, t("modwiz.enable"));
183
+ await maybeBuildDeploy();
184
+ }
185
+ }
186
+ outro(c.green(t("modwiz.createDone", { path: target })));
187
+ return c.green(t("modwiz.moduleCreated", { id: folderId }));
188
+ }
189
+ async function runModuleLinkWizard() {
190
+ if (!isInteractive()) {
191
+ return c.yellow(t("modwiz.needTty.link"));
192
+ }
193
+ intro(c.bold(t("modwiz.linkIntro")));
194
+ const modulesRoot = await ensureSfmcModulesRoot();
195
+ if (!modulesRoot) return cancelMessage();
196
+ const packages = listSfmcModulePackages(modulesRoot);
197
+ if (packages.length === 0) {
198
+ outro(c.yellow(t("modwiz.noLinkable", { path: modulesRoot })));
199
+ return c.yellow(t("modwiz.noLinkableShort"));
200
+ }
201
+ const picked = await select({
202
+ message: t("modwiz.pickLink"),
203
+ options: packages.map((p) => ({
204
+ value: p.id,
205
+ label: p.id,
206
+ hint: `${p.name} \xB7 ${p.logicalId}`
207
+ }))
208
+ });
209
+ if (isCancel(picked)) {
210
+ outro(cancelMessage());
211
+ return cancelMessage();
212
+ }
213
+ const pkg = packages.find((p) => p.id === picked);
214
+ let linkOutput = "";
215
+ try {
216
+ await tasks([
217
+ {
218
+ title: t("modwiz.linking", { id: pkg.id }),
219
+ task: async () => {
220
+ const { ok, output } = await runFetchModuleLink(pkg.id, pkg.path);
221
+ linkOutput = output;
222
+ if (!ok) throw new Error(output.trim() || t("modwiz.linkFailed"));
223
+ return t("modwiz.linkSynced");
224
+ }
225
+ }
226
+ ]);
227
+ } catch (e) {
228
+ outro(c.red(e.message));
229
+ return c.red(e.message);
230
+ }
231
+ note(linkOutput.trim(), t("modwiz.link"));
232
+ const enableMsg = await maybeEnableModule(pkg.id);
233
+ if (enableMsg) note(enableMsg, t("modwiz.enable"));
234
+ outro(c.green(t("modwiz.linked", { id: pkg.id })));
235
+ return c.green(t("modwiz.linked", { id: pkg.id }));
236
+ }
237
+ async function runModuleDevWizard() {
238
+ if (!isInteractive()) {
239
+ return c.yellow(t("modwiz.needTty.dev"));
240
+ }
241
+ intro(c.bold(t("modwiz.devIntro")));
242
+ const modulesRoot = await ensureSfmcModulesRoot();
243
+ if (!modulesRoot) return cancelMessage();
244
+ const packages = listSfmcModulePackages(modulesRoot);
245
+ if (packages.length === 0) {
246
+ outro(c.yellow(t("modwiz.noDevPackages", { path: modulesRoot })));
247
+ return c.yellow(t("modwiz.noDevShort"));
248
+ }
249
+ const picked = await select({
250
+ message: t("modwiz.pickDev"),
251
+ options: packages.map((p) => ({
252
+ value: p.id,
253
+ label: p.id,
254
+ hint: `${p.name} \xB7 ${p.logicalId}`
255
+ }))
256
+ });
257
+ if (isCancel(picked)) {
258
+ outro(cancelMessage());
259
+ return cancelMessage();
260
+ }
261
+ const pkg = packages.find((p) => p.id === picked);
262
+ try {
263
+ await tasks([
264
+ {
265
+ title: t("modwiz.linking", { id: pkg.id }),
266
+ task: async () => {
267
+ const { ok, output } = await runFetchModuleLink(pkg.id, pkg.path);
268
+ if (!ok) throw new Error(output.trim() || t("modwiz.linkFailed"));
269
+ return output.trim().split("\n").pop() ?? "linked";
270
+ }
271
+ },
272
+ {
273
+ title: t("modwiz.enabling", { id: pkg.id }),
274
+ task: async () => {
275
+ const r = await cmdModuleEnable([pkg.id]);
276
+ if (!r.ok) throw new Error(r.message.trim());
277
+ return r.message.trim();
278
+ }
279
+ },
280
+ {
281
+ title: t("modwiz.task.build"),
282
+ task: async () => {
283
+ const { cmdBehaviorPackBuild } = await import("./commands-behavior-pack.js");
284
+ const r = await cmdBehaviorPackBuild([]);
285
+ if (!r.ok) throw new Error(r.message.trim());
286
+ return t("common.done");
287
+ }
288
+ },
289
+ {
290
+ title: t("modwiz.task.deploy"),
291
+ task: async () => {
292
+ const { cmdBehaviorPackDeploy } = await import("./commands-behavior-pack.js");
293
+ const r = await cmdBehaviorPackDeploy([]);
294
+ if (!r.ok) throw new Error(r.message.trim());
295
+ return t("common.done");
296
+ }
297
+ }
298
+ ]);
299
+ } catch (e) {
300
+ outro(c.red(e.message));
301
+ return c.red(e.message);
302
+ }
303
+ note(c.yellow(t("modwiz.devHint")), t("common.hint"));
304
+ outro(c.green(t("modwiz.devDone", { id: pkg.id })));
305
+ return c.green(t("modwiz.devReady", { id: pkg.id }));
306
+ }
307
+ export {
308
+ isInteractive as isModuleWizardInteractive,
309
+ runModuleCreateWizard,
310
+ runModuleDevWizard,
311
+ runModuleLinkWizard
312
+ };
313
+ //# sourceMappingURL=module-wizard.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/module-wizard.ts"],
4
+ "sourcesContent": ["/**\n * module-wizard.ts \u2014 \u6A21\u5757\u811A\u624B\u67B6 / \u672C\u5730\u8054\u8C03\u4EA4\u4E92\u5411\u5BFC\n *\n * \u590D\u7528 @clack/prompts \u4E0E init \u5411\u5BFC\u76F8\u540C\u4F9D\u8D56\uFF1B\u8584\u5305\u88C5 tools/new-module.mjs\u3001fetch-module.mjs\u3002\n */\n\nimport { confirm, intro, isCancel, note, outro, select, tasks, text } from \"@clack/prompts\";\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport { t } from \"./i18n/index.js\";\nimport { cmdModuleEnable } from \"./module-commands.js\";\nimport { pickDirectory, resolveUserPath } from \"./interactive-prompts.js\";\nimport { ROOT, resolveFetchModule, resolveNewModule } from \"./runtime.js\";\nimport {\n listSfmcModulePackages,\n packageDirForId,\n persistSfmcModulesRoot,\n resolveSfmcModulesRoot,\n} from \"./sfmc-modules-root.js\";\nimport { c } from \"./theme.js\";\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdin.isTTY);\n}\n\nfunction cancelMessage(): string {\n return c.dim(t(\"common.cancelled\"));\n}\n\n/** \u5B50\u8FDB\u7A0B\u6267\u884C\u5DE5\u5177\u811A\u672C\uFF1B\u7528\u53C2\u6570\u6570\u7EC4\u907F\u514D Windows \u542B # \u8DEF\u5F84\u88AB shell \u8BEF\u89E3\u6790\u3002 */\nfunction spawnTool(script: string, args: string[]): Promise<{ code: number | null; output: string }> {\n return new Promise((resolve) => {\n const proc = spawn(process.execPath, [script, ...args], {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: ROOT },\n });\n let output = \"\";\n proc.stdout?.on(\"data\", (d: Buffer) => {\n output += d.toString();\n });\n proc.stderr?.on(\"data\", (d: Buffer) => {\n output += d.toString();\n });\n proc.on(\"exit\", (code) => resolve({ code, output }));\n proc.on(\"error\", (e) => resolve({ code: 1, output: `${output}${e.message}` }));\n });\n}\n\nasync function ensureSfmcModulesRoot(): Promise<string | null> {\n let modulesRoot = resolveSfmcModulesRoot();\n if (modulesRoot) {\n note(c.text(t(\"modwiz.sfmcModulesPath\", { path: modulesRoot })), t(\"common.path\"));\n return modulesRoot;\n }\n\n const defaultGuess = path.resolve(ROOT, \"..\", \"sfmc-modules\");\n const picked = await pickDirectory(t(\"modwiz.pickModulesRoot\"), defaultGuess);\n modulesRoot = resolveUserPath(picked, ROOT);\n if (!existsSync(path.join(modulesRoot, \"packages\"))) {\n outro(c.red(t(\"modwiz.noPackages\", { path: modulesRoot })));\n return null;\n }\n persistSfmcModulesRoot(modulesRoot);\n return modulesRoot;\n}\n\nasync function runFetchModuleLink(folderId: string, pkgPath: string): Promise<{ ok: boolean; output: string }> {\n const fetchScript = resolveFetchModule();\n if (!fetchScript) {\n return { ok: false, output: c.red(t(\"modwiz.noFetch\")) };\n }\n const fromArg = `dir:${path.resolve(pkgPath)}`;\n const { code, output } = await spawnTool(fetchScript, [\"install\", folderId, \"--from\", fromArg, \"--link\"]);\n return { ok: code === 0, output };\n}\n\nasync function maybeEnableModule(folderId: string): Promise<string | undefined> {\n const enable = await confirm({ message: t(\"modwiz.enableModule\"), initialValue: true });\n if (isCancel(enable) || !enable) return undefined;\n return (await cmdModuleEnable([folderId])).message;\n}\n\nasync function maybeBuildDeploy(): Promise<void> {\n const buildDeploy = await confirm({\n message: t(\"modwiz.buildDeploy\"),\n initialValue: true,\n });\n if (isCancel(buildDeploy) || !buildDeploy) return;\n\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n await tasks([\n {\n title: t(\"modwiz.task.build\"),\n task: async () => {\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n {\n title: t(\"modwiz.task.deploy\"),\n task: async () => {\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n ]);\n note(c.yellow(t(\"modwiz.reloadHint\")), t(\"common.hint\"));\n}\n\nfunction validateFolderId(value: string | undefined): string | undefined {\n if (!value?.trim()) return t(\"common.required\");\n if (!/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value.trim())) {\n return t(\"modwiz.kebab\");\n }\n return undefined;\n}\n\n/** \u4EA4\u4E92\u5F0F\u521B\u5EFA\u6A21\u5757\u5305\u5E76\u53EF\u9009 link / enable / build+deploy\u3002 */\nexport async function runModuleCreateWizard(): Promise<string> {\n if (!isInteractive()) {\n return c.yellow(t(\"modwiz.needTty.create\"));\n }\n\n intro(c.bold(t(\"modwiz.createIntro\")));\n\n const modulesRoot = await ensureSfmcModulesRoot();\n if (!modulesRoot) return cancelMessage();\n\n const idRaw = await text({\n message: t(\"modwiz.folderId\"),\n placeholder: \"my-feature\",\n validate: validateFolderId,\n });\n if (isCancel(idRaw) || !idRaw) {\n outro(cancelMessage());\n return cancelMessage();\n }\n const folderId = idRaw.trim();\n\n const target = packageDirForId(modulesRoot, folderId);\n if (existsSync(target)) {\n outro(c.red(t(\"modwiz.dirExists\", { path: target })));\n return c.red(t(\"modwiz.dirExists\", { path: target }));\n }\n\n const nameRaw = await text({\n message: t(\"modwiz.displayName\"),\n initialValue: folderId,\n validate: (v) => (!v?.trim() ? t(\"common.required\") : undefined),\n });\n if (isCancel(nameRaw) || !nameRaw) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const template = await select({\n message: t(\"modwiz.template\"),\n options: [\n { value: \"minimal\", label: t(\"modwiz.tpl.minimal\"), hint: t(\"modwiz.tpl.minimalHint\") },\n { value: \"db\", label: t(\"modwiz.tpl.db\"), hint: t(\"modwiz.tpl.dbHint\") },\n ],\n });\n if (isCancel(template)) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const siblingNewModule = path.join(modulesRoot, \"tools\", \"new-module.mjs\");\n const platformNewModule = resolveNewModule();\n const useSibling = existsSync(siblingNewModule) && template === \"minimal\";\n const newModuleScript = useSibling ? siblingNewModule : platformNewModule;\n if (!newModuleScript) {\n outro(c.red(t(\"modwiz.noNewModule\")));\n return c.red(t(\"modwiz.noNewModule\"));\n }\n\n let scaffoldOutput = \"\";\n try {\n await tasks([\n {\n title: t(\"modwiz.genPackage\", { id: folderId }),\n task: async () => {\n const spawnArgs = useSibling\n ? [folderId, nameRaw.trim()]\n : [folderId, \"--name\", nameRaw.trim(), \"--root\", modulesRoot, \"--template\", String(template)];\n const { code, output } = await spawnTool(newModuleScript, spawnArgs);\n scaffoldOutput = output;\n if (code !== 0) throw new Error(output.trim() || `exit ${code}`);\n return t(\"modwiz.skeletonWritten\");\n },\n },\n ]);\n } catch (e) {\n outro(c.red((e as Error).message));\n return c.red((e as Error).message);\n }\n\n note(scaffoldOutput.trim() || c.green(t(\"modwiz.createdNote\", { path: target })), t(\"modwiz.createIntro\"));\n\n const doLink = await confirm({\n message: t(\"modwiz.linkAsk\"),\n initialValue: true,\n });\n if (!isCancel(doLink) && doLink) {\n const { ok, output } = await runFetchModuleLink(folderId, target);\n note(output.trim(), ok ? t(\"modwiz.link\") : t(\"modwiz.linkFailed\"));\n if (ok) {\n const enableMsg = await maybeEnableModule(folderId);\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\n await maybeBuildDeploy();\n }\n }\n\n outro(c.green(t(\"modwiz.createDone\", { path: target })));\n return c.green(t(\"modwiz.moduleCreated\", { id: folderId }));\n}\n\n/** \u4ECE sfmc-modules/packages \u9009\u62E9\u5E76 --link \u5B89\u88C5\u3002 */\nexport async function runModuleLinkWizard(): Promise<string> {\n if (!isInteractive()) {\n return c.yellow(t(\"modwiz.needTty.link\"));\n }\n\n intro(c.bold(t(\"modwiz.linkIntro\")));\n\n const modulesRoot = await ensureSfmcModulesRoot();\n if (!modulesRoot) return cancelMessage();\n\n const packages = listSfmcModulePackages(modulesRoot);\n if (packages.length === 0) {\n outro(c.yellow(t(\"modwiz.noLinkable\", { path: modulesRoot })));\n return c.yellow(t(\"modwiz.noLinkableShort\"));\n }\n\n const picked = await select({\n message: t(\"modwiz.pickLink\"),\n options: packages.map((p) => ({\n value: p.id,\n label: p.id,\n hint: `${p.name} \u00B7 ${p.logicalId}`,\n })),\n });\n if (isCancel(picked)) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const pkg = packages.find((p) => p.id === picked)!;\n let linkOutput = \"\";\n try {\n await tasks([\n {\n title: t(\"modwiz.linking\", { id: pkg.id }),\n task: async () => {\n const { ok, output } = await runFetchModuleLink(pkg.id, pkg.path);\n linkOutput = output;\n if (!ok) throw new Error(output.trim() || t(\"modwiz.linkFailed\"));\n return t(\"modwiz.linkSynced\");\n },\n },\n ]);\n } catch (e) {\n outro(c.red((e as Error).message));\n return c.red((e as Error).message);\n }\n\n note(linkOutput.trim(), t(\"modwiz.link\"));\n const enableMsg = await maybeEnableModule(pkg.id);\n if (enableMsg) note(enableMsg, t(\"modwiz.enable\"));\n\n outro(c.green(t(\"modwiz.linked\", { id: pkg.id })));\n return c.green(t(\"modwiz.linked\", { id: pkg.id }));\n}\n\n/** \u94FE\u63A5 + \u542F\u7528 + \u6784\u5EFA\u90E8\u7F72\uFF08\u672C\u5730\u5F00\u53D1\u4E00\u952E\u6D41\uFF09\u3002 */\nexport async function runModuleDevWizard(): Promise<string> {\n if (!isInteractive()) {\n return c.yellow(t(\"modwiz.needTty.dev\"));\n }\n\n intro(c.bold(t(\"modwiz.devIntro\")));\n\n const modulesRoot = await ensureSfmcModulesRoot();\n if (!modulesRoot) return cancelMessage();\n\n const packages = listSfmcModulePackages(modulesRoot);\n if (packages.length === 0) {\n outro(c.yellow(t(\"modwiz.noDevPackages\", { path: modulesRoot })));\n return c.yellow(t(\"modwiz.noDevShort\"));\n }\n\n const picked = await select({\n message: t(\"modwiz.pickDev\"),\n options: packages.map((p) => ({\n value: p.id,\n label: p.id,\n hint: `${p.name} \u00B7 ${p.logicalId}`,\n })),\n });\n if (isCancel(picked)) {\n outro(cancelMessage());\n return cancelMessage();\n }\n\n const pkg = packages.find((p) => p.id === picked)!;\n\n try {\n await tasks([\n {\n title: t(\"modwiz.linking\", { id: pkg.id }),\n task: async () => {\n const { ok, output } = await runFetchModuleLink(pkg.id, pkg.path);\n if (!ok) throw new Error(output.trim() || t(\"modwiz.linkFailed\"));\n return output.trim().split(\"\\n\").pop() ?? \"linked\";\n },\n },\n {\n title: t(\"modwiz.enabling\", { id: pkg.id }),\n task: async () => {\n const r = await cmdModuleEnable([pkg.id]);\n if (!r.ok) throw new Error(r.message.trim());\n return r.message.trim();\n },\n },\n {\n title: t(\"modwiz.task.build\"),\n task: async () => {\n const { cmdBehaviorPackBuild } = await import(\"./commands-behavior-pack.js\");\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n {\n title: t(\"modwiz.task.deploy\"),\n task: async () => {\n const { cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message.trim());\n return t(\"common.done\");\n },\n },\n ]);\n } catch (e) {\n outro(c.red((e as Error).message));\n return c.red((e as Error).message);\n }\n\n note(c.yellow(t(\"modwiz.devHint\")), t(\"common.hint\"));\n outro(c.green(t(\"modwiz.devDone\", { id: pkg.id })));\n return c.green(t(\"modwiz.devReady\", { id: pkg.id }));\n}\n\nexport { isInteractive as isModuleWizardInteractive };\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }