@sfmc-bds/cli 0.2.0-beta.8 → 0.2.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 (149) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +4 -5
  3. package/dist/bds-runtime-version.d.ts +3 -0
  4. package/dist/bds-runtime-version.d.ts.map +1 -0
  5. package/dist/bds-runtime-version.js +15 -0
  6. package/dist/bds-runtime-version.js.map +7 -0
  7. package/dist/command-surface.js +3 -3
  8. package/dist/command-surface.js.map +2 -2
  9. package/dist/commands.d.ts +57 -4
  10. package/dist/commands.d.ts.map +1 -1
  11. package/dist/commands.js +184 -68
  12. package/dist/commands.js.map +2 -2
  13. package/dist/directory-picker.d.ts +27 -0
  14. package/dist/directory-picker.d.ts.map +1 -0
  15. package/dist/directory-picker.js +112 -0
  16. package/dist/directory-picker.js.map +7 -0
  17. package/dist/help-text.d.ts.map +1 -1
  18. package/dist/help-text.js +1 -5
  19. package/dist/help-text.js.map +2 -2
  20. package/dist/i18n/locales/en.d.ts +49 -14
  21. package/dist/i18n/locales/en.d.ts.map +1 -1
  22. package/dist/i18n/locales/en.js +49 -15
  23. package/dist/i18n/locales/en.js.map +2 -2
  24. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  25. package/dist/i18n/locales/zh-CN.js +50 -16
  26. package/dist/i18n/locales/zh-CN.js.map +2 -2
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +2 -2
  31. package/dist/interactive-prompts.d.ts +1 -2
  32. package/dist/interactive-prompts.d.ts.map +1 -1
  33. package/dist/interactive-prompts.js +12 -23
  34. package/dist/interactive-prompts.js.map +3 -3
  35. package/dist/llbot-launch.d.ts +20 -0
  36. package/dist/llbot-launch.d.ts.map +1 -0
  37. package/dist/llbot-launch.js +40 -0
  38. package/dist/llbot-launch.js.map +7 -0
  39. package/dist/log-filter.d.ts +18 -2
  40. package/dist/log-filter.d.ts.map +1 -1
  41. package/dist/log-filter.js +54 -4
  42. package/dist/log-filter.js.map +2 -2
  43. package/dist/log-translator.d.ts +36 -0
  44. package/dist/log-translator.d.ts.map +1 -0
  45. package/dist/log-translator.js +279 -0
  46. package/dist/log-translator.js.map +7 -0
  47. package/dist/logs.d.ts +2 -0
  48. package/dist/logs.d.ts.map +1 -1
  49. package/dist/logs.js +24 -11
  50. package/dist/logs.js.map +2 -2
  51. package/dist/main.js +9 -6
  52. package/dist/main.js.map +2 -2
  53. package/dist/module-commands.d.ts.map +1 -1
  54. package/dist/module-commands.js +22 -8
  55. package/dist/module-commands.js.map +2 -2
  56. package/dist/module-fingerprint.d.ts.map +1 -1
  57. package/dist/module-fingerprint.js +1 -0
  58. package/dist/module-fingerprint.js.map +2 -2
  59. package/dist/module-pack-build.d.ts +14 -4
  60. package/dist/module-pack-build.d.ts.map +1 -1
  61. package/dist/module-pack-build.js +81 -108
  62. package/dist/module-pack-build.js.map +2 -2
  63. package/dist/module-toggle.d.ts +1 -1
  64. package/dist/module-toggle.d.ts.map +1 -1
  65. package/dist/module-toggle.js.map +1 -1
  66. package/dist/node-service-probe.d.ts +18 -0
  67. package/dist/node-service-probe.d.ts.map +1 -0
  68. package/dist/node-service-probe.js +97 -0
  69. package/dist/node-service-probe.js.map +7 -0
  70. package/dist/pack-lifecycle.d.ts +15 -1
  71. package/dist/pack-lifecycle.d.ts.map +1 -1
  72. package/dist/pack-lifecycle.js +249 -16
  73. package/dist/pack-lifecycle.js.map +2 -2
  74. package/dist/player-session.d.ts +13 -0
  75. package/dist/player-session.d.ts.map +1 -0
  76. package/dist/player-session.js +26 -0
  77. package/dist/player-session.js.map +7 -0
  78. package/dist/registry.d.ts +1 -1
  79. package/dist/registry.d.ts.map +1 -1
  80. package/dist/registry.js +4 -1
  81. package/dist/registry.js.map +2 -2
  82. package/dist/repl-windows/format-display.d.ts.map +1 -1
  83. package/dist/repl-windows/format-display.js +5 -1
  84. package/dist/repl-windows/format-display.js.map +2 -2
  85. package/dist/repl-windows/host.d.ts +6 -3
  86. package/dist/repl-windows/host.d.ts.map +1 -1
  87. package/dist/repl-windows/host.js +12 -6
  88. package/dist/repl-windows/host.js.map +2 -2
  89. package/dist/repl-windows/index.d.ts +1 -0
  90. package/dist/repl-windows/index.d.ts.map +1 -1
  91. package/dist/repl-windows/index.js +3 -0
  92. package/dist/repl-windows/index.js.map +2 -2
  93. package/dist/repl-windows/service-window.d.ts +1 -1
  94. package/dist/repl-windows/service-window.d.ts.map +1 -1
  95. package/dist/repl-windows/service-window.js +9 -1
  96. package/dist/repl-windows/service-window.js.map +2 -2
  97. package/dist/repl-windows/sfmc-window.d.ts +7 -0
  98. package/dist/repl-windows/sfmc-window.d.ts.map +1 -0
  99. package/dist/repl-windows/sfmc-window.js +28 -0
  100. package/dist/repl-windows/sfmc-window.js.map +7 -0
  101. package/dist/repl.d.ts.map +1 -1
  102. package/dist/repl.js +37 -22
  103. package/dist/repl.js.map +2 -2
  104. package/dist/runtime.d.ts +2 -2
  105. package/dist/runtime.d.ts.map +1 -1
  106. package/dist/runtime.js +15 -2
  107. package/dist/runtime.js.map +2 -2
  108. package/dist/send-target.d.ts +2 -0
  109. package/dist/send-target.d.ts.map +1 -1
  110. package/dist/send-target.js +12 -2
  111. package/dist/send-target.js.map +2 -2
  112. package/dist/services.d.ts +58 -5
  113. package/dist/services.d.ts.map +1 -1
  114. package/dist/services.js +273 -50
  115. package/dist/services.js.map +2 -2
  116. package/dist/sfmc-modules-root.d.ts.map +1 -1
  117. package/dist/sfmc-modules-root.js +6 -2
  118. package/dist/sfmc-modules-root.js.map +2 -2
  119. package/dist/ui-command.d.ts +6 -0
  120. package/dist/ui-command.d.ts.map +1 -0
  121. package/dist/ui-command.js +68 -0
  122. package/dist/ui-command.js.map +7 -0
  123. package/dist/wizard.d.ts.map +1 -1
  124. package/dist/wizard.js +95 -32
  125. package/dist/wizard.js.map +2 -2
  126. package/dist/world-packs.d.ts +2 -0
  127. package/dist/world-packs.d.ts.map +1 -1
  128. package/dist/world-packs.js +161 -18
  129. package/dist/world-packs.js.map +2 -2
  130. package/package.json +21 -15
  131. package/scripts/module-install/check-modules.mjs +178 -0
  132. package/scripts/module-install/fetch-module.mjs +1083 -0
  133. package/scripts/module-install/lib/catalog.mjs +96 -0
  134. package/scripts/module-install/lib/config-seeding.mjs +128 -0
  135. package/scripts/module-install/lib/io.mjs +37 -0
  136. package/scripts/module-install/lib/link-from.mjs +80 -0
  137. package/scripts/module-install/lib/lock.mjs +78 -0
  138. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  139. package/scripts/module-install/lib/packages.mjs +136 -0
  140. package/scripts/module-install/lib/paths.mjs +48 -0
  141. package/scripts/module-install/lib/registry-index.mjs +50 -0
  142. package/dist/cmd-remote.d.ts +0 -13
  143. package/dist/cmd-remote.d.ts.map +0 -1
  144. package/dist/cmd-remote.js +0 -38
  145. package/dist/cmd-remote.js.map +0 -7
  146. package/dist/remote-agent.d.ts +0 -18
  147. package/dist/remote-agent.d.ts.map +0 -1
  148. package/dist/remote-agent.js +0 -198
  149. package/dist/remote-agent.js.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/wizard.ts"],
4
- "sourcesContent": ["import { confirm, intro, isCancel, multiselect, note, outro, select, tasks, text } from \"@clack/prompts\";\nimport {\n configPath,\n ensureCoreConfigs,\n modulePath,\n patchJson as patchConfig,\n readJson,\n withConfigSchema,\n writeJson,\n type Catalog,\n type ConfigName,\n type ModuleLock,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ensureDirectory, pickDirectory } from \"./interactive-prompts.js\";\nimport { persistLocale, t, type Locale } from \"./i18n/index.js\";\nimport { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveFetchModule, spawnService } from \"./runtime.js\";\nimport { ensurePackUpdateConfigFile } from \"./pack-update/index.js\";\nimport { c } from \"./theme.js\";\n\n/** Shallow-merge write for top-level configs. Delegates to SDK; do not mkdir+writeFileSync here. */\nfunction patchJson<T extends object>(rootDir: string, name: ConfigName, updates: Partial<T>): void {\n patchConfig<T>(configPath(rootDir, name), updates);\n}\n\nasync function waitForHealth(port: number, ms = 15000): Promise<boolean> {\n const t = Date.now();\n while (Date.now() - t < ms) {\n try {\n if ((await fetch(`http://127.0.0.1:${port}/api/health`)).ok) return true;\n } catch {\n /* retry */\n }\n await new Promise((r) => setTimeout(r, 300));\n }\n return false;\n}\n\n/** \u8FD0\u884C\u65F6\u5FC5\u9700\u76EE\u5F55\u63A2\u6D4B(configs / modules) */\nconst RUNTIME_DIRS = [\n { target: \"configs\", npmTarget: \"configs\" },\n { target: \"modules\", npmTarget: \"modules\" },\n] as const;\n\nfunction missingRuntimeAssets(rootDir: string): string[] {\n return RUNTIME_DIRS.flatMap(({ target, npmTarget }) => {\n const directory = path.join(rootDir, npmTarget);\n try {\n return fs.statSync(directory).isDirectory() && fs.readdirSync(directory).length > 0 ? [] : [target];\n } catch {\n return [target];\n }\n });\n}\n\nasync function runBdsUpdate(rootDir: string, channel: string): Promise<{ code: number | null; output: string }> {\n const child = spawnService(\"update\", [`--channel=${channel}`, \"--force\", \"--no-start\"], {\n cwd: rootDir,\n stdio: \"pipe\",\n });\n const output: string[] = [];\n child.stdout?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n child.stderr?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n\n return new Promise((resolve) => {\n child.once(\"error\", (error) => resolve({ code: null, output: `${output.join(\"\")}${error.message}` }));\n child.once(\"close\", (code) => resolve({ code, output: output.join(\"\") }));\n });\n}\n\nasync function prepareRuntimeAssets(rootDir: string): Promise<void> {\n /* monorepo \u5E03\u5C40\uFF1Aconfigs/ modules/ \u5E94\u7531 npm \u5DE5\u4F5C\u533A\u5DF2\u63D0\u4F9B */\n if (isMonorepoLayout(rootDir)) {\n const missing = missingRuntimeAssets(rootDir);\n if (missing.length > 0) {\n throw new Error(t(\"wizard.npmMissing\", { list: missing.join(\", \") }));\n }\n return;\n }\n\n seedNpmRuntimeLayout(rootDir);\n}\n\n/** \u975E monorepo \u7684 npm \u5B89\u88C5\u5E03\u5C40\uFF1Aensure \u914D\u7F6E\u9AA8\u67B6 + \u7A7A modules */\nfunction seedNpmRuntimeLayout(rootDir: string): void {\n ensureCoreConfigs(rootDir, [\"db_config\", \"qq_config\", \"bds_updater\", \"permissions\"]);\n /* pack-update \u7684 ensure \u4F7F\u7528 runtime ROOT\uFF1Bnpm \u5E03\u5C40\u4E0B\u5E94\u4E0E rootDir \u4E00\u81F4 */\n if (path.resolve(rootDir) === path.resolve(ROOT)) {\n ensurePackUpdateConfigFile();\n }\n\n const modulesRoot = path.join(rootDir, \"modules\");\n const packagesDir = path.join(modulesRoot, \"packages\");\n fs.mkdirSync(packagesDir, { recursive: true });\n\n const catalogPath = path.join(modulesRoot, \"catalog.json\");\n if (!fs.existsSync(catalogPath)) {\n writeJson(\n catalogPath,\n withConfigSchema({ version: 1, modules: [] }, \"module_catalog\", \"modules\")\n );\n }\n const lockPath = path.join(modulesRoot, \"module-lock.json\");\n if (!fs.existsSync(lockPath)) {\n writeJson(lockPath, { version: 1, modules: {} });\n }\n}\n\nexport async function runWizard(): Promise<void> {\n intro(c.bold(t(\"wizard.intro\")));\n\n const langPick = await select({\n message: t(\"locale.wizard\"),\n options: [\n { value: \"zh-CN\", label: t(\"locale.opt.zh\") },\n { value: \"en\", label: t(\"locale.opt.en\") },\n ],\n initialValue: \"zh-CN\",\n });\n if (!isCancel(langPick)) {\n persistLocale(ROOT, langPick as Locale);\n }\n\n // Already initialized only when runtime.json#initialized_at is set (empty db_config skeleton does not count).\n if (isRuntimeInitialized()) {\n const r = await confirm({ message: t(\"wizard.rerun\"), initialValue: false });\n if (isCancel(r) || !r) {\n outro(c.dim(t(\"wizard.skipped\")));\n return;\n }\n }\n // Step 1: Runtime Environment\uFF08\u53EA\u64AD\u79CD configs/modules\uFF0C\u4E0D\u5199 initialized_at\u3001\u4E0D\u5EFA data/\uFF09\n const rootDir = ROOT;\n note(c.text(t(\"wizard.runtimeRoot\", { root: rootDir })), t(\"wizard.step1\"));\n\n try {\n await prepareRuntimeAssets(rootDir);\n } catch (error) {\n outro(c.red(t(\"wizard.prepFailed\", { message: (error as Error).message })));\n return;\n }\n\n // Step 2: External runtime paths\n note(c.text(t(\"wizard.step2Note\")), t(\"wizard.step2\"));\n\n const bdsResolved = await pickDirectory(t(\"wizard.bdsDir\"), path.join(rootDir, \"BDS\"));\n if (!ensureDirectory(bdsResolved)) {\n outro(c.red(t(\"wizard.cannotCreateBds\", { dir: bdsResolved })));\n return;\n }\n\n let llbotPath: string | undefined;\n const llbotEnabled = await confirm({ message: t(\"wizard.enableLlbot\"), initialValue: false });\n if (!isCancel(llbotEnabled) && llbotEnabled) {\n const picked = await pickDirectory(t(\"wizard.llbotDir\"), path.join(rootDir, \"LLBOT\"));\n if (ensureDirectory(picked)) {\n llbotPath = picked;\n } else {\n llbotPath = path.join(rootDir, \"LLBOT\");\n note(c.text(t(\"wizard.usingDefault\", { path: llbotPath })), t(\"common.tips\"));\n }\n }\n\n const dbDirInput = await pickDirectory(t(\"wizard.dbDir\"), path.join(rootDir, \"data\"));\n const dbDir = ensureDirectory(dbDirInput) ? dbDirInput : path.join(rootDir, \"data\");\n if (dbDir !== dbDirInput) {\n note(c.text(t(\"wizard.usingDefault\", { path: dbDir })), t(\"common.tips\"));\n }\n const dbPortRaw = await text({\n message: t(\"wizard.dbPort\"),\n initialValue: \"3001\",\n validate: (v: any): any => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 1024 || n > 65535) return t(\"wizard.portRange\");\n if (v.length === 0) return t(\"wizard.valueRequired\");\n },\n });\n const dbPort = isCancel(dbPortRaw) ? 3001 : parseInt(dbPortRaw as string, 10);\n\n // Step 3: BDS environment\n const bdsExe = path.join(bdsResolved, \"bedrock_server.exe\");\n const bdsExists = fs.existsSync(bdsExe);\n\n note(\n bdsExists\n ? c.green(t(\"wizard.bdsFound\", { path: bdsResolved }))\n : c.yellow(t(\"wizard.bdsNotFound\", { path: bdsResolved })),\n t(\"wizard.step3\")\n );\n\n const EULA = await confirm({\n message: t(\"wizard.eula\"),\n initialValue: false,\n });\n if (isCancel(EULA) || !EULA) {\n outro(c.yellow(t(\"wizard.disagreed\")));\n return;\n }\n\n let downloadBds = false;\n let bdsChannel = \"release\";\n let backupDir = path.join(path.dirname(bdsResolved), \"backups\");\n let preserve: string[] = [];\n\n if (!bdsExists) {\n const d = await confirm({ message: t(\"wizard.downloadBds\"), initialValue: true });\n if (!isCancel(d) && d) {\n const ch = await select({\n message: t(\"wizard.selectChannel\"),\n options: [\n { value: \"release\", label: t(\"wizard.channel.release\"), hint: t(\"wizard.channel.releaseHint\") },\n { value: \"preview\", label: t(\"wizard.channel.preview\"), hint: t(\"wizard.channel.previewHint\") },\n ],\n });\n if (!isCancel(ch)) {\n bdsChannel = ch as string;\n downloadBds = true;\n }\n if (!ensureDirectory(backupDir)) {\n outro(c.red(t(\"wizard.cannotCreateBackup\", { dir: backupDir })));\n return;\n }\n }\n }\n\n backupDir = await pickDirectory(t(\"wizard.backupDir\"), backupDir);\n const preserveOptions = [\n { value: \"server.properties\", label: \"server.properties\", hint: t(\"wizard.preserve.serverProps\") },\n { value: \"whitelist.json\", label: \"whitelist.json\" },\n { value: \"permissions.json\", label: \"permissions.json\" },\n { value: \"allowlist.json\", label: \"allowlist.json\" },\n { value: \"worlds\", label: \"worlds/\", hint: t(\"wizard.preserve.worlds\") },\n { value: \"config\", label: \"config/\", hint: t(\"wizard.preserve.config\") },\n ] as const;\n const pr = await multiselect({\n message: t(\"wizard.preserve\"),\n options: [...preserveOptions],\n initialValues: preserveOptions.map((o) => o.value),\n required: false,\n });\n if (!isCancel(pr)) preserve = pr as string[];\n note(c.yellow(t(\"wizard.updaterTip\")), t(\"common.tips\"));\n\n // Step 4: Module initialization\n const catalog = readJson<Catalog>(modulePath(rootDir, \"catalog.json\")) ?? {};\n const catalogModules: Array<{ id: string; name?: string; type?: string; description?: string }> = [];\n if (Array.isArray(catalog.modules)) {\n for (const m of catalog.modules) {\n const entry = m as Record<string, unknown>;\n catalogModules.push({\n id: String(entry.id ?? \"\"),\n name: String(entry.name ?? entry.id ?? \"\"),\n type: String(entry.type ?? \"feature\"),\n description: String(entry.description ?? \"\"),\n });\n }\n }\n\n note(\n c.text(\n catalogModules.length > 0\n ? t(\"wizard.modulesFound\", { count: catalogModules.length })\n : t(\"wizard.modulesNone\")\n ),\n t(\"wizard.step4\")\n );\n\n let selectedModules: string[] = [];\n const coreMd: any[] = [];\n const featMd: any[] = [];\n catalogModules.forEach((k) => {\n if (k.type === \"core\") {\n coreMd.push({\n value: k.id,\n label: `${k.name} (${k.type})`,\n hint: String(k.description ?? t(\"wizard.emptyHint\")),\n disabled: true,\n });\n } else if (k.type === \"feature\") {\n featMd.push({\n value: k.id,\n label: `${k.name} (${k.type})`,\n hint: String(k.description ?? t(\"wizard.emptyHint\")),\n });\n }\n });\n if (catalogModules.length > 0) {\n const r = await multiselect({\n message: t(\"wizard.enableModules\"),\n options: [...coreMd, ...featMd],\n required: false,\n });\n if (!isCancel(r)) selectedModules = r as string[];\n }\n\n const wizardTasks = [\n {\n title: t(\"wizard.updatingConfigs\"),\n task: () => {\n const slashPath = (value: string) => value.replace(/\\\\/g, \"/\");\n patchJson(rootDir, \"db_config.json\", {\n db_port: dbPort,\n dbDir: slashPath(path.relative(rootDir, path.join(dbDir, \"sfmc_data.db\"))),\n modulesDir: \"modules\",\n });\n\n const llbotOn = !!llbotEnabled && !!llbotPath;\n patchJson(rootDir, \"qq_config.json\", {\n llbot_enabled: llbotOn,\n llbot_path: llbotPath ? slashPath(llbotPath) : \"\",\n llbot_cwd: llbotPath ? slashPath(llbotPath) : \"\",\n });\n patchJson(rootDir, \"bds_updater.json\", {\n bds_path: slashPath(bdsResolved),\n channel: bdsChannel,\n backup_dir: slashPath(backupDir),\n preserve,\n qq_notify: llbotOn,\n });\n /* \u8DEF\u5F84\u9009\u5B9A\u540E\u518D\u6807\u8BB0\u5DF2\u521D\u59CB\u5316\uFF0C\u907F\u514D\u534A\u9014\u53D6\u6D88\u4ECD\u7559\u4E0B data/ \u8BED\u4E49 */\n patchJson(rootDir, \"runtime.json\", {\n runtime_root: rootDir,\n initialized_at: new Date().toISOString(),\n locale: isCancel(langPick) ? undefined : (langPick as string),\n });\n return t(\"wizard.configsUpdated\");\n },\n },\n {\n title: t(\"wizard.updatingModules\"),\n task: async (): Promise<string> => {\n const lock = readJson<ModuleLock>(modulePath(rootDir, \"module-lock.json\")) ?? {\n version: 1,\n modules: {},\n };\n if (!lock.modules) lock.modules = {};\n const now = Date.now();\n for (const id of selectedModules) lock.modules[id] = { enabled: true, updatedAt: now };\n writeJson(modulePath(rootDir, \"module-lock.json\"), lock);\n return t(\"wizard.modulesUpdated\");\n },\n },\n {\n title: t(\"wizard.initDb\"),\n task: async (): Promise<string> => {\n const child = spawnService(\"db\", [], {\n cwd: rootDir,\n stdio: \"ignore\",\n env: { ...process.env, DB_PORT: String(dbPort) },\n });\n if (!(await waitForHealth(dbPort))) {\n child.kill(\"SIGTERM\");\n return t(\"wizard.dbTimeout\");\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 3000).unref();\n return t(\"wizard.dbOk\");\n },\n },\n ];\n if (downloadBds) {\n wizardTasks.push({\n title: t(\"wizard.downloadingBds\"),\n task: async (): Promise<string> => {\n const result = await runBdsUpdate(rootDir, bdsChannel);\n if (result.code !== 0) {\n return t(\"wizard.downloadFail\");\n }\n return t(\"wizard.bdsDownloaded\");\n },\n });\n }\n try {\n await tasks(wizardTasks);\n } catch (e) {\n outro(c.red(t(\"common.error\", { message: (e as Error).message })));\n return;\n }\n\n /* install \u2192 build \u2192 deploy chain */\n await runInstallBuildDeploy(rootDir, selectedModules, bdsResolved);\n\n outro(c.green(t(\"wizard.done\")));\n}\n\nasync function runInstallBuildDeploy(rootDir: string, selectedModules: string[], bdsResolved: string): Promise<void> {\n if (selectedModules.length > 0) {\n const fetchScript = resolveFetchModule();\n if (fetchScript) {\n const installT = [\n {\n title: t(\"wizard.installing\", { count: selectedModules.length }),\n task: async (): Promise<string> => {\n execFileSync(process.execPath, [fetchScript, \"install\", ...selectedModules], {\n cwd: rootDir,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: rootDir },\n });\n return t(\"wizard.installed\", { count: selectedModules.length });\n },\n },\n ];\n try {\n await tasks(installT);\n } catch (e) {\n note(c.yellow(t(\"wizard.installFailed\", { message: (e as Error).message })));\n }\n } else {\n note(c.yellow(t(\"wizard.fetchMissing\", { list: selectedModules.join(\", \") })));\n }\n } else {\n note(c.dim(t(\"wizard.noModulesSelected\")));\n }\n\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n const buildT = [\n {\n title: t(\"wizard.buildingBp\"),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(buildT);\n } catch (e) {\n note(c.yellow(t(\"wizard.buildFailed\", { message: (e as Error).message })));\n return;\n }\n\n const deployT = [\n {\n title: t(\"wizard.deploying\", { path: bdsResolved }),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(deployT);\n note(c.green(t(\"wizard.restartBds\")));\n } catch (e) {\n note(c.yellow(t(\"wizard.deployFailed\", { message: (e as Error).message })));\n }\n void rootDir;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { confirm, intro, isCancel, multiselect, note, outro, password, select, tasks, text } from \"@clack/prompts\";\nimport {\n configPath,\n ensureCoreConfigs,\n modulePath,\n patchJson as patchConfig,\n readJson,\n withConfigSchema,\n writeJson,\n type Catalog,\n type ConfigName,\n type ModuleLock,\n type QQBridgeConfig,\n} from \"@sfmc-bds/sdk/node/config\";\nimport { bdsExePath } from \"@sfmc-bds/bds-tools/host-platform\";\nimport { execFileSync } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { ensureDirectory, pickDirectory } from \"./interactive-prompts.js\";\nimport { persistLocale, t, type Locale } from \"./i18n/index.js\";\nimport { llbotExeName } from \"./llbot-launch.js\";\nimport { ROOT, isMonorepoLayout, isRuntimeInitialized, resolveFetchModule, spawnService } from \"./runtime.js\";\nimport { ensurePackUpdateConfigFile } from \"./pack-update/index.js\";\nimport { c } from \"./theme.js\";\n\n/** Shallow-merge write for top-level configs. Delegates to SDK; do not mkdir+writeFileSync here. */\nfunction patchJson<T extends object>(rootDir: string, name: ConfigName, updates: Partial<T>): void {\n patchConfig<T>(configPath(rootDir, name), updates);\n}\n\nasync function waitForHealth(port: number, ms = 15000): Promise<boolean> {\n const t = Date.now();\n while (Date.now() - t < ms) {\n try {\n if ((await fetch(`http://127.0.0.1:${port}/api/health`)).ok) return true;\n } catch {\n /* retry */\n }\n await new Promise((r) => setTimeout(r, 300));\n }\n return false;\n}\n\n/** \u8FD0\u884C\u65F6\u5FC5\u9700\u76EE\u5F55\u63A2\u6D4B(configs / modules) */\nconst RUNTIME_DIRS = [\n { target: \"configs\", npmTarget: \"configs\" },\n { target: \"modules\", npmTarget: \"modules\" },\n] as const;\n\nfunction missingRuntimeAssets(rootDir: string): string[] {\n return RUNTIME_DIRS.flatMap(({ target, npmTarget }) => {\n const directory = path.join(rootDir, npmTarget);\n try {\n return fs.statSync(directory).isDirectory() && fs.readdirSync(directory).length > 0 ? [] : [target];\n } catch {\n return [target];\n }\n });\n}\n\nasync function runBdsUpdate(rootDir: string, channel: string): Promise<{ code: number | null; output: string }> {\n const child = spawnService(\"update\", [`--channel=${channel}`, \"--force\", \"--no-start\"], {\n cwd: rootDir,\n stdio: \"pipe\",\n });\n const output: string[] = [];\n child.stdout?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n child.stderr?.on(\"data\", (data: Buffer) => output.push(data.toString()));\n\n return new Promise((resolve) => {\n child.once(\"error\", (error) => resolve({ code: null, output: `${output.join(\"\")}${error.message}` }));\n child.once(\"close\", (code) => resolve({ code, output: output.join(\"\") }));\n });\n}\n\nasync function prepareRuntimeAssets(rootDir: string): Promise<void> {\n /* monorepo \u5E03\u5C40\uFF1Aconfigs/ modules/ \u5E94\u7531 pnpm workspace \u63D0\u4F9B */\n if (isMonorepoLayout(rootDir)) {\n const missing = missingRuntimeAssets(rootDir);\n if (missing.length > 0) {\n throw new Error(t(\"wizard.runtimeMissingAssets\", { list: missing.join(\", \") }));\n }\n return;\n }\n\n seedNpmRuntimeLayout(rootDir);\n}\n\n/** \u975E monorepo \u7684 npm \u5B89\u88C5\u5E03\u5C40\uFF1Aensure \u914D\u7F6E\u9AA8\u67B6 + \u7A7A modules */\nfunction seedNpmRuntimeLayout(rootDir: string): void {\n ensureCoreConfigs(rootDir, [\"db_config\", \"qq_config\", \"bds_updater\", \"permissions\"]);\n /* pack-update \u7684 ensure \u4F7F\u7528 runtime ROOT\uFF1Bnpm \u5E03\u5C40\u4E0B\u5E94\u4E0E rootDir \u4E00\u81F4 */\n if (path.resolve(rootDir) === path.resolve(ROOT)) {\n ensurePackUpdateConfigFile();\n }\n\n const modulesRoot = path.join(rootDir, \"modules\");\n const packagesDir = path.join(modulesRoot, \"packages\");\n fs.mkdirSync(packagesDir, { recursive: true });\n\n const catalogPath = path.join(modulesRoot, \"catalog.json\");\n if (!fs.existsSync(catalogPath)) {\n writeJson(\n catalogPath,\n withConfigSchema({ version: 1, modules: [] }, \"module_catalog\", \"modules\")\n );\n }\n const lockPath = path.join(modulesRoot, \"module-lock.json\");\n if (!fs.existsSync(lockPath)) {\n writeJson(lockPath, { version: 1, modules: {} });\n }\n}\n\nexport async function runWizard(): Promise<void> {\n intro(c.bold(t(\"wizard.intro\")));\n\n const langPick = await select({\n message: t(\"locale.wizard\"),\n options: [\n { value: \"zh-CN\", label: t(\"locale.opt.zh\") },\n { value: \"en\", label: t(\"locale.opt.en\") },\n ],\n initialValue: \"zh-CN\",\n });\n if (!isCancel(langPick)) {\n persistLocale(ROOT, langPick as Locale);\n }\n\n // Already initialized only when runtime.json#initialized_at is set (empty db_config skeleton does not count).\n if (isRuntimeInitialized()) {\n const r = await confirm({ message: t(\"wizard.rerun\"), initialValue: false });\n if (isCancel(r) || !r) {\n outro(c.dim(t(\"wizard.skipped\")));\n return;\n }\n }\n // Step 1: Runtime Environment\uFF08\u53EA\u64AD\u79CD configs/modules\uFF0C\u4E0D\u5199 initialized_at\u3001\u4E0D\u5EFA data/\uFF09\n const rootDir = ROOT;\n note(c.text(t(\"wizard.runtimeRoot\", { root: rootDir })), t(\"wizard.step1\"));\n\n try {\n await prepareRuntimeAssets(rootDir);\n } catch (error) {\n outro(c.red(t(\"wizard.prepFailed\", { message: (error as Error).message })));\n return;\n }\n\n // Step 2: External runtime paths\n note(c.text(t(\"wizard.step2Note\")), t(\"wizard.step2\"));\n\n const bdsResolved = await pickDirectory(t(\"wizard.bdsDir\"), path.join(rootDir, \"BDS\"));\n if (!ensureDirectory(bdsResolved)) {\n outro(c.red(t(\"wizard.cannotCreateBds\", { dir: bdsResolved })));\n return;\n }\n\n /* QQ \u6865\uFF1A\u9009\u540E\u7AEF \u2192 official \u51ED\u636E / llbot \u8DEF\u5F84\uFF1B\u7981\u7528\u5219 qq_enabled=false */\n const qqBackendPick = await select({\n message: t(\"wizard.qqBackend\"),\n options: [\n { value: \"official\", label: t(\"wizard.qqBackend.official\"), hint: t(\"wizard.qqBackend.officialHint\") },\n { value: \"llbot\", label: t(\"wizard.qqBackend.llbot\"), hint: t(\"wizard.qqBackend.llbotHint\") },\n { value: \"disabled\", label: t(\"wizard.qqBackend.disabled\"), hint: t(\"wizard.qqBackend.disabledHint\") },\n ],\n initialValue: \"official\",\n });\n const qqBackendChoice =\n isCancel(qqBackendPick) || !qqBackendPick ? \"official\" : String(qqBackendPick);\n\n let qqEnabled = true;\n let qqBackend: \"official\" | \"llbot\" = \"official\";\n let qqAppId = \"\";\n let qqAppSecret = \"\";\n let qqSandbox = false;\n let qqGroupOpenid = \"\";\n let llbotPath: string | undefined;\n let llbotEnabled = false;\n\n if (qqBackendChoice === \"disabled\") {\n qqEnabled = false;\n } else if (qqBackendChoice === \"llbot\") {\n qqBackend = \"llbot\";\n llbotEnabled = true;\n const picked = await pickDirectory(t(\"wizard.llbotDir\"), path.join(rootDir, \"LLBOT\"));\n if (ensureDirectory(picked)) {\n llbotPath = picked;\n } else {\n llbotPath = path.join(rootDir, \"LLBOT\");\n note(c.text(t(\"wizard.usingDefault\", { path: llbotPath })), t(\"common.tips\"));\n }\n } else {\n qqBackend = \"official\";\n const appIdRaw = await text({\n message: t(\"wizard.qqAppId\"),\n placeholder: \"102xxxxx\",\n validate: (v: any): any => {\n if (!String(v ?? \"\").trim()) return t(\"wizard.valueRequired\");\n },\n });\n if (!isCancel(appIdRaw)) qqAppId = String(appIdRaw).trim();\n\n const secretRaw = await password({\n message: t(\"wizard.qqAppSecret\"),\n validate: (v: any): any => {\n if (!String(v ?? \"\").trim()) return t(\"wizard.valueRequired\");\n },\n });\n if (!isCancel(secretRaw)) qqAppSecret = String(secretRaw).trim();\n\n const sandboxPick = await confirm({\n message: t(\"wizard.qqSandbox\"),\n initialValue: false,\n });\n if (!isCancel(sandboxPick)) qqSandbox = !!sandboxPick;\n\n const openidRaw = await text({\n message: t(\"wizard.qqGroupOpenid\"),\n placeholder: t(\"wizard.qqGroupOpenidHint\"),\n });\n if (!isCancel(openidRaw)) qqGroupOpenid = String(openidRaw).trim();\n }\n\n const dbDirInput = await pickDirectory(t(\"wizard.dbDir\"), path.join(rootDir, \"data\"));\n const dbDir = ensureDirectory(dbDirInput) ? dbDirInput : path.join(rootDir, \"data\");\n if (dbDir !== dbDirInput) {\n note(c.text(t(\"wizard.usingDefault\", { path: dbDir })), t(\"common.tips\"));\n }\n const dbPortRaw = await text({\n message: t(\"wizard.dbPort\"),\n initialValue: \"3001\",\n validate: (v: any): any => {\n const n = parseInt(v, 10);\n if (isNaN(n) || n < 1024 || n > 65535) return t(\"wizard.portRange\");\n if (v.length === 0) return t(\"wizard.valueRequired\");\n },\n });\n const dbPort = isCancel(dbPortRaw) ? 3001 : parseInt(dbPortRaw as string, 10);\n\n // Step 3: BDS environment\n const bdsExe = bdsExePath(bdsResolved);\n const bdsExists = fs.existsSync(bdsExe);\n\n note(\n bdsExists\n ? c.green(t(\"wizard.bdsFound\", { path: bdsResolved }))\n : c.yellow(t(\"wizard.bdsNotFound\", { path: bdsResolved })),\n t(\"wizard.step3\")\n );\n\n const EULA = await confirm({\n message: t(\"wizard.eula\"),\n initialValue: false,\n });\n if (isCancel(EULA) || !EULA) {\n outro(c.yellow(t(\"wizard.disagreed\")));\n return;\n }\n\n let downloadBds = false;\n let bdsChannel = \"release\";\n let backupDir = path.join(path.dirname(bdsResolved), \"backups\");\n let preserve: string[] = [];\n\n if (!bdsExists) {\n const d = await confirm({ message: t(\"wizard.downloadBds\"), initialValue: true });\n if (!isCancel(d) && d) {\n const ch = await select({\n message: t(\"wizard.selectChannel\"),\n options: [\n { value: \"release\", label: t(\"wizard.channel.release\"), hint: t(\"wizard.channel.releaseHint\") },\n { value: \"preview\", label: t(\"wizard.channel.preview\"), hint: t(\"wizard.channel.previewHint\") },\n ],\n });\n if (!isCancel(ch)) {\n bdsChannel = ch as string;\n downloadBds = true;\n }\n if (!ensureDirectory(backupDir)) {\n outro(c.red(t(\"wizard.cannotCreateBackup\", { dir: backupDir })));\n return;\n }\n }\n }\n\n backupDir = await pickDirectory(t(\"wizard.backupDir\"), backupDir);\n const preserveOptions = [\n { value: \"server.properties\", label: \"server.properties\", hint: t(\"wizard.preserve.serverProps\") },\n { value: \"whitelist.json\", label: \"whitelist.json\" },\n { value: \"permissions.json\", label: \"permissions.json\" },\n { value: \"allowlist.json\", label: \"allowlist.json\" },\n { value: \"worlds\", label: \"worlds/\", hint: t(\"wizard.preserve.worlds\") },\n { value: \"config\", label: \"config/\", hint: t(\"wizard.preserve.config\") },\n ] as const;\n const pr = await multiselect({\n message: t(\"wizard.preserve\"),\n options: [...preserveOptions],\n initialValues: preserveOptions.map((o) => o.value),\n required: false,\n });\n if (!isCancel(pr)) preserve = pr as string[];\n note(c.yellow(t(\"wizard.updaterTip\")), t(\"common.tips\"));\n\n // Step 4: Module initialization\n const catalog = readJson<Catalog>(modulePath(rootDir, \"catalog.json\")) ?? {\n version: 1,\n modules: [],\n };\n const catalogModules: Array<{ id: string; name?: string; description?: string; canDisable?: boolean }> = [];\n if (Array.isArray(catalog.modules)) {\n for (const m of catalog.modules) {\n catalogModules.push({\n id: String(m.id ?? \"\"),\n name: String(m.name ?? m.id ?? \"\"),\n description: String(m.description ?? \"\"),\n canDisable: m.canDisable !== false,\n });\n }\n }\n\n note(\n c.text(\n catalogModules.length > 0\n ? t(\"wizard.modulesFound\", { count: catalogModules.length })\n : t(\"wizard.modulesNone\")\n ),\n t(\"wizard.step4\")\n );\n\n let selectedModules: string[] = [];\n const lockedMd: any[] = [];\n const optionalMd: any[] = [];\n catalogModules.forEach((k) => {\n const option = {\n value: k.id,\n label: String(k.name),\n hint: String(k.description ?? t(\"wizard.emptyHint\")),\n };\n if (k.canDisable === false) {\n lockedMd.push({ ...option, disabled: true });\n } else {\n optionalMd.push(option);\n }\n });\n if (catalogModules.length > 0) {\n const r = await multiselect({\n message: t(\"wizard.enableModules\"),\n options: [...lockedMd, ...optionalMd],\n required: false,\n });\n if (!isCancel(r)) selectedModules = r as string[];\n }\n\n const wizardTasks = [\n {\n title: t(\"wizard.updatingConfigs\"),\n task: () => {\n const slashPath = (value: string) => value.replace(/\\\\/g, \"/\");\n patchJson(rootDir, \"db_config.json\", {\n db_port: dbPort,\n dbDir: slashPath(path.relative(rootDir, path.join(dbDir, \"sfmc_data.db\"))),\n modulesDir: \"modules\",\n });\n\n const llbotOn = qqBackend === \"llbot\" && !!llbotEnabled && !!llbotPath;\n const qqNotify = qqEnabled && (qqBackend === \"official\" || llbotOn);\n const exeName = llbotExeName();\n const currentQq = readJson<QQBridgeConfig>(configPath(rootDir, \"qq_config.json\")) ?? {};\n patchJson(rootDir, \"qq_config.json\", {\n qq_enabled: qqEnabled,\n qq_backend: qqBackend,\n official: {\n ...currentQq.official,\n app_id: qqAppId,\n app_secret: qqAppSecret,\n sandbox: qqSandbox,\n group_openid: qqGroupOpenid,\n },\n llbot: {\n ...currentQq.llbot,\n enabled: llbotOn,\n // path = \u53EF\u6267\u884C\u6587\u4EF6\uFF1Bcwd = \u8FD0\u884C\u76EE\u5F55\uFF08\u5411\u5BFC\u9009\u7684\u662F\u76EE\u5F55\uFF09\n path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : \"\",\n cwd: llbotPath ? slashPath(llbotPath) : \"\",\n },\n });\n patchJson(rootDir, \"bds_updater.json\", {\n bds_path: slashPath(bdsResolved),\n channel: bdsChannel,\n backup_dir: slashPath(backupDir),\n preserve,\n qq_notify: qqNotify,\n });\n /* \u8DEF\u5F84\u9009\u5B9A\u540E\u518D\u6807\u8BB0\u5DF2\u521D\u59CB\u5316\uFF0C\u907F\u514D\u534A\u9014\u53D6\u6D88\u4ECD\u7559\u4E0B data/ \u8BED\u4E49 */\n patchJson(rootDir, \"runtime.json\", {\n runtime_root: rootDir,\n initialized_at: new Date().toISOString(),\n locale: isCancel(langPick) ? undefined : (langPick as string),\n });\n return t(\"wizard.configsUpdated\");\n },\n },\n {\n title: t(\"wizard.updatingModules\"),\n task: async (): Promise<string> => {\n const lock = readJson<ModuleLock>(modulePath(rootDir, \"module-lock.json\")) ?? {\n version: 1,\n modules: {},\n };\n if (!lock.modules) lock.modules = {};\n const now = Date.now();\n for (const id of selectedModules) lock.modules[id] = { enabled: true, updatedAt: now };\n writeJson(modulePath(rootDir, \"module-lock.json\"), lock);\n return t(\"wizard.modulesUpdated\");\n },\n },\n {\n title: t(\"wizard.initDb\"),\n task: async (): Promise<string> => {\n const child = spawnService(\"db\", [], {\n cwd: rootDir,\n stdio: \"ignore\",\n env: { ...process.env, DB_PORT: String(dbPort) },\n });\n if (!(await waitForHealth(dbPort))) {\n child.kill(\"SIGTERM\");\n return t(\"wizard.dbTimeout\");\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), 3000).unref();\n return t(\"wizard.dbOk\");\n },\n },\n ];\n if (downloadBds) {\n wizardTasks.push({\n title: t(\"wizard.downloadingBds\"),\n task: async (): Promise<string> => {\n const result = await runBdsUpdate(rootDir, bdsChannel);\n if (result.code !== 0) {\n return t(\"wizard.downloadFail\");\n }\n return t(\"wizard.bdsDownloaded\");\n },\n });\n }\n try {\n await tasks(wizardTasks);\n } catch (e) {\n outro(c.red(t(\"common.error\", { message: (e as Error).message })));\n return;\n }\n\n /* install \u2192 build \u2192 deploy chain */\n await runInstallBuildDeploy(rootDir, selectedModules, bdsResolved);\n\n outro(c.green(t(\"wizard.done\")));\n}\n\nasync function runInstallBuildDeploy(rootDir: string, selectedModules: string[], bdsResolved: string): Promise<void> {\n if (selectedModules.length > 0) {\n const fetchScript = resolveFetchModule();\n if (fetchScript) {\n const installT = [\n {\n title: t(\"wizard.installing\", { count: selectedModules.length }),\n task: async (): Promise<string> => {\n execFileSync(process.execPath, [fetchScript, \"install\", ...selectedModules], {\n cwd: rootDir,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, SFMC_ROOT: rootDir },\n });\n return t(\"wizard.installed\", { count: selectedModules.length });\n },\n },\n ];\n try {\n await tasks(installT);\n } catch (e) {\n note(c.yellow(t(\"wizard.installFailed\", { message: (e as Error).message })));\n }\n } else {\n note(c.yellow(t(\"wizard.fetchMissing\", { list: selectedModules.join(\", \") })));\n }\n } else {\n note(c.dim(t(\"wizard.noModulesSelected\")));\n }\n\n const { cmdBehaviorPackBuild, cmdBehaviorPackDeploy } = await import(\"./commands-behavior-pack.js\");\n const buildT = [\n {\n title: t(\"wizard.buildingBp\"),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackBuild([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(buildT);\n } catch (e) {\n note(c.yellow(t(\"wizard.buildFailed\", { message: (e as Error).message })));\n return;\n }\n\n const deployT = [\n {\n title: t(\"wizard.deploying\", { path: bdsResolved }),\n task: async (): Promise<string> => {\n const r = await cmdBehaviorPackDeploy([]);\n if (!r.ok) throw new Error(r.message);\n return r.message;\n },\n },\n ];\n try {\n await tasks(deployT);\n note(c.green(t(\"wizard.restartBds\")));\n } catch (e) {\n note(c.yellow(t(\"wizard.deployFailed\", { message: (e as Error).message })));\n }\n void rootDir;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["t"]
7
7
  }
@@ -32,6 +32,8 @@ export declare function scanAndInstallInbox(opts?: {
32
32
  skipped: number;
33
33
  failed: number;
34
34
  }>;
35
+ /** 未绑定来源的占位符只用于内部语义,不应作为重复的列表列展示。 */
36
+ export declare function shouldDisplayPackSourceLabel(sourceLabel: string): boolean;
35
37
  export declare function dispatchPacksCommand(sub: string | undefined, args: string[]): Promise<string>;
36
38
  export declare function packsUsage(): string;
37
39
  //# sourceMappingURL=world-packs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"AAKA,OAAO,EAcL,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAuBzC,eAAO,MAAM,eAAe,YAAI,OAAO,EAAE,OAAO,CAAU,CAAC;AAC3D,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,CACA,CAAC;AAcX,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,IAAI,MAAM,CAErE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA4ED,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,GAAG,OAAO,CAGzF;AAqED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,GAAG,EAAE,MAAM,EAAE,GAEX;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgB1C;AAmND;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiJlE;AAqHD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8PnG;AAED,wBAAgB,UAAU,IAAI,MAAM,CAuBnC"}
1
+ {"version":3,"file":"world-packs.d.ts","sourceRoot":"","sources":["../src/world-packs.ts"],"names":[],"mappings":"AAKA,OAAO,EAkBL,KAAK,kBAAkB,EAExB,MAAM,iCAAiC,CAAC;AAuBzC,eAAO,MAAM,eAAe,YAAI,OAAO,EAAE,OAAO,CAAU,CAAC;AAC3D,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,CACA,CAAC;AAcX,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,IAAI,MAAM,CAErE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA4ED,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,GAAG,OAAO,CAGzF;AAqED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,GAAG,EAAE,MAAM,EAAE,GAEX;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;CAAE,GAChD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgB1C;AAmND;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAiJlE;AAgBD,qCAAqC;AACrC,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEzE;AAyRD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8PnG;AAED,wBAAgB,UAAU,IAAI,MAAM,CAuBnC"}
@@ -1,6 +1,9 @@
1
1
  import { confirm, isCancel, multiselect } from "@clack/prompts";
2
2
  import {
3
+ KNOWN_EXPERIMENTS,
3
4
  bumpPackPatchVersion,
5
+ checkWorldExperimentsDiagnosis,
6
+ checkWorldScriptPermissions,
4
7
  disableInstalledPack,
5
8
  enableInstalledPack,
6
9
  findInstalledPackById,
@@ -10,6 +13,7 @@ import {
10
13
  listWorldEnableListResult,
11
14
  readPackDependencyUuids,
12
15
  readPackManifestInfo,
16
+ repairWorldPacksWiring,
13
17
  resolvePackRoots,
14
18
  uninstallInstalledPack,
15
19
  worldPackParentDir
@@ -17,7 +21,7 @@ import {
17
21
  import crypto from "node:crypto";
18
22
  import fs from "node:fs";
19
23
  import path from "node:path";
20
- import { t } from "./i18n/index.js";
24
+ import { getLocale, t } from "./i18n/index.js";
21
25
  import { pushLog } from "./logs.js";
22
26
  import { BP_NAME, RP_NAME, resolveBdsContext } from "./pack-lifecycle.js";
23
27
  import {
@@ -499,6 +503,9 @@ function filterPacks(packs, kind, search) {
499
503
  }
500
504
  return list;
501
505
  }
506
+ function shouldDisplayPackSourceLabel(sourceLabel) {
507
+ return sourceLabel !== "src=-";
508
+ }
502
509
  function formatPackList(packs) {
503
510
  if (packs.length === 0) return c.dim(t("packs.listEmpty"));
504
511
  const lines = [];
@@ -509,7 +516,8 @@ function formatPackList(packs) {
509
516
  for (const p of bp) {
510
517
  const en = p.enabled ? c.green(t("packs.list.on")) : c.dim(t("packs.list.off"));
511
518
  const src = bindingLabelForUuid(p.uuid);
512
- lines.push(` [${en}] ${p.folderName} ${p.name} v${fmtVer(p.version)} ${c.dim(p.uuid)} ${c.dim(src)}`);
519
+ const sourceColumn = shouldDisplayPackSourceLabel(src) ? ` ${c.dim(src)}` : "";
520
+ lines.push(` [${en}] ${p.folderName} ${p.name} v${fmtVer(p.version)} ${c.dim(p.uuid)}${sourceColumn}`);
513
521
  }
514
522
  }
515
523
  if (rp.length) {
@@ -542,10 +550,123 @@ function parseListFlags(args) {
542
550
  function hasFlag(args, name) {
543
551
  return args.includes(name);
544
552
  }
545
- async function cmdDoctor() {
553
+ function formatExperimentsStatus(levelName, knownExperiments) {
554
+ const isZh = getLocale() === "zh-CN";
555
+ const lines = [t("packs.doctor.experimentsStatus", { level: levelName })];
556
+ for (const exp of KNOWN_EXPERIMENTS) {
557
+ const on = !!knownExperiments[exp.id];
558
+ const marker = on ? c.green("\u25CF") : c.dim("\u25CB");
559
+ const stateText = on ? c.green(isZh ? "\u5DF2\u5F00\u542F" : "enabled") : c.dim(isZh ? "\u672A\u5F00\u542F" : "disabled");
560
+ const nameStr = isZh ? `${exp.nameZh} (${exp.nameEn})` : exp.nameEn;
561
+ lines.push(` ${marker} ${nameStr}: ${stateText}`);
562
+ }
563
+ return lines.join("\n");
564
+ }
565
+ async function cmdDoctor(args = []) {
566
+ const isFix = hasFlag(args, "--fix") || hasFlag(args, "-y") || hasFlag(args, "fix");
567
+ const isExperimentsOnly = hasFlag(args, "--experiments") || hasFlag(args, "experiments");
568
+ const isAllExperiments = hasFlag(args, "--all-experiments") || hasFlag(args, "--all-exp");
569
+ const expArg = args.find((a) => a.startsWith("--experiments="));
546
570
  const { bdsRoot, levelName } = resolveBdsContext();
547
571
  const packs = listInstalledWorldPacks(bdsRoot, levelName);
572
+ const expDiag = checkWorldExperimentsDiagnosis(bdsRoot, levelName, packs);
573
+ if (isExperimentsOnly && !isFix && !isAllExperiments && !expArg) {
574
+ if (!expDiag.levelDatExists || !expDiag.experimentsInfo) {
575
+ return c.yellow(`level.dat not found for world \u300C${levelName}\u300D: ${expDiag.levelDatPath}`);
576
+ }
577
+ const statusText = formatExperimentsStatus(levelName, expDiag.experimentsInfo.knownExperiments);
578
+ return `${statusText}
579
+
580
+ ${c.cyan(t("packs.doctor.experimentsFixPrompt"))}`;
581
+ }
582
+ let requestedExperiments = void 0;
583
+ if (isAllExperiments || expArg === "--experiments=all") {
584
+ requestedExperiments = "all";
585
+ } else if (expArg) {
586
+ const rawList = expArg.slice("--experiments=".length).split(",").map((s) => s.trim()).filter(Boolean);
587
+ if (rawList.length > 0) {
588
+ requestedExperiments = rawList;
589
+ }
590
+ }
591
+ if (isFix || requestedExperiments !== void 0) {
592
+ const shouldFixBeta = !expDiag.betaApis.hasBetaApis && expDiag.betaApis.requiringPacks.length > 0;
593
+ const repRes = await repairWorldPacksWiring(bdsRoot, levelName, {
594
+ fixBetaApis: shouldFixBeta,
595
+ ...requestedExperiments !== void 0 ? { enableExperiments: requestedExperiments } : {}
596
+ });
597
+ const fixLogs = [];
598
+ if (repRes.experimentsResult?.attempted) {
599
+ if (repRes.experimentsResult.changed) {
600
+ const isZh = getLocale() === "zh-CN";
601
+ const enabledNames = repRes.experimentsResult.enabled.map((id) => {
602
+ const def = KNOWN_EXPERIMENTS.find((x) => x.id === id);
603
+ return def ? isZh ? def.nameZh : def.nameEn : id;
604
+ }).join(", ");
605
+ fixLogs.push(
606
+ c.green(
607
+ t("packs.doctor.experimentsFixed", {
608
+ level: levelName,
609
+ list: enabledNames || "all",
610
+ backup: repRes.experimentsResult.backupPath ?? "level.dat.bak"
611
+ })
612
+ )
613
+ );
614
+ } else if (repRes.experimentsResult.error) {
615
+ fixLogs.push(
616
+ c.red(t("packs.doctor.experimentsFailed", { level: levelName, error: repRes.experimentsResult.error }))
617
+ );
618
+ } else {
619
+ fixLogs.push(c.dim(t("packs.doctor.experimentsAlreadyOn", { level: levelName })));
620
+ }
621
+ } else if (repRes.betaApisResult?.attempted) {
622
+ if (repRes.betaApisResult.changed) {
623
+ fixLogs.push(
624
+ c.green(
625
+ t("packs.doctor.betaApisFixed", {
626
+ level: levelName,
627
+ backup: repRes.betaApisResult.backupPath ?? "level.dat.bak"
628
+ })
629
+ )
630
+ );
631
+ } else if (repRes.betaApisResult.error) {
632
+ fixLogs.push(c.red(t("packs.doctor.betaApisFailed", { level: levelName, error: repRes.betaApisResult.error })));
633
+ } else {
634
+ fixLogs.push(c.dim(t("packs.doctor.betaApisAlreadyOn", { level: levelName })));
635
+ }
636
+ }
637
+ for (const g of repRes.cleanedGhostPacks) {
638
+ fixLogs.push(c.green(t("packs.doctor.ghostPackCleaned", { kind: g.kind, uuid: g.uuid })));
639
+ }
640
+ for (const s of repRes.syncedVersions) {
641
+ fixLogs.push(
642
+ c.green(
643
+ t("packs.doctor.versionSynced", {
644
+ kind: s.kind,
645
+ folder: s.folder,
646
+ listVer: s.listVer,
647
+ diskVer: s.diskVer
648
+ })
649
+ )
650
+ );
651
+ }
652
+ if (repRes.fixedPermissions && repRes.fixedPermissions.length > 0) {
653
+ fixLogs.push(
654
+ c.green(
655
+ t("packs.doctor.permissionsFixed", {
656
+ perms: repRes.fixedPermissions.map((x) => `${x.packName} (${x.moduleName})`).join(", ")
657
+ })
658
+ )
659
+ );
660
+ }
661
+ const totalHealed = (repRes.experimentsResult?.changed ? 1 : 0) + (!repRes.experimentsResult && repRes.betaApisResult?.changed ? 1 : 0) + repRes.cleanedGhostPacks.length + repRes.syncedVersions.length + (repRes.fixedPermissions?.length ?? 0);
662
+ if (totalHealed > 0) {
663
+ return fixLogs.map((x) => ` - ${x}`).join("\n") + "\n" + c.green(t("packs.doctor.fixedSummary", { count: totalHealed }));
664
+ } else if (fixLogs.length > 0) {
665
+ return fixLogs.map((x) => ` - ${x}`).join("\n");
666
+ }
667
+ }
548
668
  const issues = [];
669
+ let fixableCount = 0;
549
670
  for (const kind of ["behavior", "resource"]) {
550
671
  const snap = listWorldEnableListResult(bdsRoot, levelName, kind);
551
672
  if (snap.parseFailedFile) {
@@ -556,6 +677,7 @@ async function cmdDoctor() {
556
677
  const p = byUuid.get(e.pack_id);
557
678
  if (!p) {
558
679
  issues.push(t("packs.doctor.missingDir", { kind, uuid: e.pack_id }));
680
+ fixableCount++;
559
681
  continue;
560
682
  }
561
683
  const ev = e.version;
@@ -568,25 +690,45 @@ async function cmdDoctor() {
568
690
  diskVer: fmtVer(p.version)
569
691
  })
570
692
  );
693
+ fixableCount++;
571
694
  }
572
695
  }
573
696
  }
574
- for (const p of packs) {
575
- if (!p.enabled) {
576
- issues.push(
577
- t("packs.doctor.notEnabled", {
578
- kind: p.kind === "resource" ? "RP" : "BP",
579
- folder: p.folderName,
580
- uuid: p.uuid
581
- })
582
- );
583
- }
697
+ if (expDiag.betaApis.requiringPacks.length > 0 && !expDiag.betaApis.hasBetaApis) {
698
+ const packLines = expDiag.betaApis.requiringPacks.map((rp) => {
699
+ const depStr = rp.betaDependencies.map((d) => `${d.module_name ?? d.uuid}@${d.version ?? ""}`).join(", ");
700
+ const name = !rp.pack.name || rp.pack.name.startsWith("pack.") || rp.pack.name === "pack" ? rp.pack.folderName : `${rp.pack.name} (${rp.pack.folderName})`;
701
+ return ` * ${name} (v${fmtVer(rp.pack.version)}) -> \u4F9D\u8D56 ${depStr}`;
702
+ }).join("\n");
703
+ issues.push(t("packs.doctor.betaApisMissing", { level: levelName, packs: packLines }));
704
+ fixableCount++;
584
705
  }
585
- if (issues.length === 0) return c.green(t("packs.doctor.ok"));
586
- return t("packs.doctor.found", {
706
+ const permDiag = checkWorldScriptPermissions(bdsRoot, levelName, packs);
707
+ if (permDiag.missingPermissions.length > 0) {
708
+ const list = permDiag.missingPermissions.map((m) => {
709
+ const name = !m.pack.name || m.pack.name.startsWith("pack.") || m.pack.name === "pack" ? m.pack.folderName : `${m.pack.name} (${m.pack.folderName})`;
710
+ return ` * ${name} -> \u4F9D\u8D56\u6A21\u5757 ${m.moduleName}`;
711
+ }).join("\n");
712
+ issues.push(t("packs.doctor.permissionsMissing", { list }));
713
+ fixableCount++;
714
+ }
715
+ let expStatusSection = "";
716
+ if (expDiag.levelDatExists && expDiag.experimentsInfo) {
717
+ expStatusSection = "\n\n" + formatExperimentsStatus(levelName, expDiag.experimentsInfo.knownExperiments);
718
+ }
719
+ if (issues.length === 0) {
720
+ return c.green(t("packs.doctor.ok")) + expStatusSection;
721
+ }
722
+ let res = t("packs.doctor.found", {
587
723
  count: issues.length,
588
724
  list: issues.map((x) => ` - ${x}`).join("\n")
589
725
  });
726
+ res += expStatusSection;
727
+ if (fixableCount > 0 && !isFix) {
728
+ res += "\n\n " + c.cyan(t("packs.doctor.fixPrompt"));
729
+ res += "\n " + c.dim(t("packs.doctor.experimentsFixPrompt"));
730
+ }
731
+ return res;
590
732
  }
591
733
  async function dispatchPacksCommand(sub, args) {
592
734
  const verb = (sub ?? "").toLowerCase();
@@ -815,7 +957,7 @@ async function dispatchPacksCommand(sub, args) {
815
957
  );
816
958
  }
817
959
  case "doctor":
818
- return await cmdDoctor();
960
+ return await cmdDoctor(args);
819
961
  case "path": {
820
962
  ensureInboxLayout();
821
963
  const { bdsRoot, levelName } = resolveBdsContext();
@@ -852,7 +994,7 @@ function packsUsage() {
852
994
  ${c.green("packs bump")} <id> ${t("packs.usage.bump")}
853
995
  ${c.green("packs install")} [path|--inbox] [--force]
854
996
  ${c.green("packs scan")} [--force] [--dry-run]
855
- ${c.green("packs doctor")}
997
+ ${c.green("packs doctor")} [--fix] [--all-experiments] [--experiments]
856
998
  ${c.green("packs path")}
857
999
 
858
1000
  ${t("packs.usage.inbox", { path: packsInboxDir() })}
@@ -870,6 +1012,7 @@ export {
870
1012
  packsInboxDir,
871
1013
  packsUsage,
872
1014
  resolveUninstallTargets,
873
- scanAndInstallInbox
1015
+ scanAndInstallInbox,
1016
+ shouldDisplayPackSourceLabel
874
1017
  };
875
1018
  //# sourceMappingURL=world-packs.js.map