@sfmc-bds/cli 0.2.0-beta.9 → 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 (128) 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.d.ts.map +1 -1
  8. package/dist/command-surface.js +3 -1
  9. package/dist/command-surface.js.map +2 -2
  10. package/dist/commands.d.ts +57 -4
  11. package/dist/commands.d.ts.map +1 -1
  12. package/dist/commands.js +78 -75
  13. package/dist/commands.js.map +2 -2
  14. package/dist/directory-picker.d.ts +27 -0
  15. package/dist/directory-picker.d.ts.map +1 -0
  16. package/dist/directory-picker.js +112 -0
  17. package/dist/directory-picker.js.map +7 -0
  18. package/dist/i18n/locales/en.d.ts +25 -1
  19. package/dist/i18n/locales/en.d.ts.map +1 -1
  20. package/dist/i18n/locales/en.js +25 -1
  21. package/dist/i18n/locales/en.js.map +2 -2
  22. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  23. package/dist/i18n/locales/zh-CN.js +26 -2
  24. package/dist/i18n/locales/zh-CN.js.map +2 -2
  25. package/dist/interactive-prompts.d.ts +1 -2
  26. package/dist/interactive-prompts.d.ts.map +1 -1
  27. package/dist/interactive-prompts.js +12 -23
  28. package/dist/interactive-prompts.js.map +3 -3
  29. package/dist/llbot-launch.d.ts +3 -3
  30. package/dist/llbot-launch.js.map +1 -1
  31. package/dist/log-filter.d.ts +18 -2
  32. package/dist/log-filter.d.ts.map +1 -1
  33. package/dist/log-filter.js +54 -4
  34. package/dist/log-filter.js.map +2 -2
  35. package/dist/log-translator.d.ts +36 -0
  36. package/dist/log-translator.d.ts.map +1 -0
  37. package/dist/log-translator.js +279 -0
  38. package/dist/log-translator.js.map +7 -0
  39. package/dist/logs.d.ts +2 -0
  40. package/dist/logs.d.ts.map +1 -1
  41. package/dist/logs.js +24 -11
  42. package/dist/logs.js.map +2 -2
  43. package/dist/main.js +5 -0
  44. package/dist/main.js.map +2 -2
  45. package/dist/module-commands.d.ts.map +1 -1
  46. package/dist/module-commands.js +22 -8
  47. package/dist/module-commands.js.map +2 -2
  48. package/dist/module-fingerprint.d.ts.map +1 -1
  49. package/dist/module-fingerprint.js +1 -0
  50. package/dist/module-fingerprint.js.map +2 -2
  51. package/dist/module-pack-build.d.ts +14 -4
  52. package/dist/module-pack-build.d.ts.map +1 -1
  53. package/dist/module-pack-build.js +81 -108
  54. package/dist/module-pack-build.js.map +2 -2
  55. package/dist/module-toggle.d.ts +1 -1
  56. package/dist/module-toggle.d.ts.map +1 -1
  57. package/dist/module-toggle.js.map +1 -1
  58. package/dist/pack-lifecycle.d.ts +15 -1
  59. package/dist/pack-lifecycle.d.ts.map +1 -1
  60. package/dist/pack-lifecycle.js +242 -15
  61. package/dist/pack-lifecycle.js.map +2 -2
  62. package/dist/player-session.d.ts +13 -0
  63. package/dist/player-session.d.ts.map +1 -0
  64. package/dist/player-session.js +26 -0
  65. package/dist/player-session.js.map +7 -0
  66. package/dist/registry.d.ts +1 -1
  67. package/dist/registry.d.ts.map +1 -1
  68. package/dist/registry.js +4 -1
  69. package/dist/registry.js.map +2 -2
  70. package/dist/repl-windows/format-display.d.ts.map +1 -1
  71. package/dist/repl-windows/format-display.js +5 -1
  72. package/dist/repl-windows/format-display.js.map +2 -2
  73. package/dist/repl-windows/host.d.ts +6 -3
  74. package/dist/repl-windows/host.d.ts.map +1 -1
  75. package/dist/repl-windows/host.js +12 -6
  76. package/dist/repl-windows/host.js.map +2 -2
  77. package/dist/repl-windows/index.d.ts +1 -0
  78. package/dist/repl-windows/index.d.ts.map +1 -1
  79. package/dist/repl-windows/index.js +3 -0
  80. package/dist/repl-windows/index.js.map +2 -2
  81. package/dist/repl-windows/service-window.d.ts.map +1 -1
  82. package/dist/repl-windows/service-window.js +1 -0
  83. package/dist/repl-windows/service-window.js.map +2 -2
  84. package/dist/repl-windows/sfmc-window.d.ts +7 -0
  85. package/dist/repl-windows/sfmc-window.d.ts.map +1 -0
  86. package/dist/repl-windows/sfmc-window.js +28 -0
  87. package/dist/repl-windows/sfmc-window.js.map +7 -0
  88. package/dist/repl.d.ts.map +1 -1
  89. package/dist/repl.js +38 -13
  90. package/dist/repl.js.map +2 -2
  91. package/dist/runtime.d.ts +2 -2
  92. package/dist/runtime.d.ts.map +1 -1
  93. package/dist/runtime.js +15 -2
  94. package/dist/runtime.js.map +2 -2
  95. package/dist/send-target.d.ts +2 -0
  96. package/dist/send-target.d.ts.map +1 -1
  97. package/dist/send-target.js +6 -0
  98. package/dist/send-target.js.map +2 -2
  99. package/dist/services.d.ts +26 -1
  100. package/dist/services.d.ts.map +1 -1
  101. package/dist/services.js +179 -45
  102. package/dist/services.js.map +2 -2
  103. package/dist/sfmc-modules-root.d.ts.map +1 -1
  104. package/dist/sfmc-modules-root.js +6 -2
  105. package/dist/sfmc-modules-root.js.map +2 -2
  106. package/dist/ui-command.d.ts +6 -0
  107. package/dist/ui-command.d.ts.map +1 -0
  108. package/dist/ui-command.js +68 -0
  109. package/dist/ui-command.js.map +7 -0
  110. package/dist/wizard.d.ts.map +1 -1
  111. package/dist/wizard.js +36 -31
  112. package/dist/wizard.js.map +2 -2
  113. package/dist/world-packs.d.ts +2 -0
  114. package/dist/world-packs.d.ts.map +1 -1
  115. package/dist/world-packs.js +161 -18
  116. package/dist/world-packs.js.map +2 -2
  117. package/package.json +22 -15
  118. package/scripts/module-install/check-modules.mjs +178 -0
  119. package/scripts/module-install/fetch-module.mjs +1083 -0
  120. package/scripts/module-install/lib/catalog.mjs +96 -0
  121. package/scripts/module-install/lib/config-seeding.mjs +128 -0
  122. package/scripts/module-install/lib/io.mjs +37 -0
  123. package/scripts/module-install/lib/link-from.mjs +80 -0
  124. package/scripts/module-install/lib/lock.mjs +78 -0
  125. package/scripts/module-install/lib/npm-resolver.mjs +55 -0
  126. package/scripts/module-install/lib/packages.mjs +136 -0
  127. package/scripts/module-install/lib/paths.mjs +48 -0
  128. package/scripts/module-install/lib/registry-index.mjs +50 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sfmc-modules-root.ts"],
4
- "sourcesContent": ["import { configPath, patchJson, readJson, type RuntimeConfig } from \"@sfmc-bds/sdk/node/config\";\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { ROOT } from \"./runtime.js\";\n\nconst PACKAGES_DIRNAME = \"packages\";\n\nexport interface SfmcModulePackage {\n /** packages/ \u4E0B\u7684\u6587\u4EF6\u5939\u540D\uFF08install id\uFF09 */\n id: string;\n /** \u7EDD\u5BF9\u8DEF\u5F84 */\n path: string;\n /** manifest \u4E2D\u7684\u903B\u8F91 id\uFF0C\u7F3A\u7701\u4E3A feature-<folder> */\n logicalId: string;\n name: string;\n}\n\nfunction isSfmcModulesRoot(dir: string): boolean {\n const packagesDir = path.join(dir, PACKAGES_DIRNAME);\n return existsSync(packagesDir) && existsSync(path.join(dir, \"index.json\"));\n}\n\n/** \u81EA\u52A8\u63A2\u6D4B\u65C1\u8DEF sfmc-modules\uFF08\u4E0D\u8981\u6C42\u6839\u76EE\u5F55\u6709 package.json\uFF09\u3002 */\nexport function detectSiblingSfmcModulesRoot(): string | null {\n const sibling = path.resolve(ROOT, \"..\", \"sfmc-modules\");\n return isSfmcModulesRoot(sibling) ? sibling : null;\n}\n\n/** \u4ECE runtime.json \u8BFB\u53D6\u66FE\u4FDD\u5B58\u7684 sfmc-modules \u6839\u3002 */\nexport function readPersistedSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const runtime = readJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"));\n const saved = runtime?.sfmc_modules_root;\n if (typeof saved !== \"string\" || !saved.trim()) return null;\n const resolved = path.resolve(saved);\n return isSfmcModulesRoot(resolved) ? resolved : null;\n}\n\n/** \u5199\u5165 runtime.json\uFF0C\u4E0B\u6B21\u514D\u8F93\u8DEF\u5F84\u3002 */\nexport function persistSfmcModulesRoot(modulesRoot: string, rootDir: string = ROOT): void {\n const slash = modulesRoot.replace(/\\\\/g, \"/\");\n patchJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"), { sfmc_modules_root: slash });\n}\n\n/**\n * \u89E3\u6790 sfmc-modules \u6839\u76EE\u5F55\u3002\n * \u4F18\u5148\u7EA7\uFF1ASFMC_MODULES_ROOT \u73AF\u5883\u53D8\u91CF \u2192 runtime.json \u2192 \u65C1\u8DEF ../sfmc-modules\n */\nexport function resolveSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const fromEnv = process.env.SFMC_MODULES_ROOT;\n if (fromEnv) {\n const resolved = path.resolve(fromEnv);\n if (isSfmcModulesRoot(resolved)) return resolved;\n }\n const persisted = readPersistedSfmcModulesRoot(rootDir);\n if (persisted) return persisted;\n return detectSiblingSfmcModulesRoot();\n}\n\n/** \u679A\u4E3E sfmc-modules/packages \u4E0B\u53EF\u5B89\u88C5\u7684\u6A21\u5757\u5305\u3002 */\nexport function listSfmcModulePackages(modulesRoot: string): SfmcModulePackage[] {\n const packagesDir = path.join(modulesRoot, PACKAGES_DIRNAME);\n if (!existsSync(packagesDir)) return [];\n const out: SfmcModulePackage[] = [];\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const id = entry.name;\n const pkgPath = path.join(packagesDir, id);\n const manifestPath = path.join(pkgPath, \"sapi\", \"manifest.json\");\n let logicalId = `feature-${id}`;\n let name = id;\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n id?: string;\n name?: string;\n };\n if (manifest.id) logicalId = manifest.id;\n if (manifest.name) name = manifest.name;\n } catch {\n /* \u635F\u574F manifest \u4ECD\u5217\u51FA\u6587\u4EF6\u5939 */\n }\n }\n out.push({ id, path: pkgPath, logicalId, name });\n }\n out.sort((a, b) => a.id.localeCompare(b.id));\n return out;\n}\n\nexport function packageDirForId(modulesRoot: string, folderId: string): string {\n return path.join(modulesRoot, PACKAGES_DIRNAME, folderId);\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY,WAAW,gBAAoC;AACpE,SAAS,YAAY,aAAa,oBAAoB;AACtD,OAAO,UAAU;AACjB,SAAS,YAAY;AAErB,MAAM,mBAAmB;AAYzB,SAAS,kBAAkB,KAAsB;AAC/C,QAAM,cAAc,KAAK,KAAK,KAAK,gBAAgB;AACnD,SAAO,WAAW,WAAW,KAAK,WAAW,KAAK,KAAK,KAAK,YAAY,CAAC;AAC3E;AAGO,SAAS,+BAA8C;AAC5D,QAAM,UAAU,KAAK,QAAQ,MAAM,MAAM,cAAc;AACvD,SAAO,kBAAkB,OAAO,IAAI,UAAU;AAChD;AAGO,SAAS,6BAA6B,UAAkB,MAAqB;AAClF,QAAM,UAAU,SAAwB,WAAW,SAAS,cAAc,CAAC;AAC3E,QAAM,QAAQ,SAAS;AACvB,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAG,QAAO;AACvD,QAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,SAAO,kBAAkB,QAAQ,IAAI,WAAW;AAClD;AAGO,SAAS,uBAAuB,aAAqB,UAAkB,MAAY;AACxF,QAAM,QAAQ,YAAY,QAAQ,OAAO,GAAG;AAC5C,YAAyB,WAAW,SAAS,cAAc,GAAG,EAAE,mBAAmB,MAAM,CAAC;AAC5F;AAMO,SAAS,uBAAuB,UAAkB,MAAqB;AAC5E,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACX,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAI,kBAAkB,QAAQ,EAAG,QAAO;AAAA,EAC1C;AACA,QAAM,YAAY,6BAA6B,OAAO;AACtD,MAAI,UAAW,QAAO;AACtB,SAAO,6BAA6B;AACtC;AAGO,SAAS,uBAAuB,aAA0C;AAC/E,QAAM,cAAc,KAAK,KAAK,aAAa,gBAAgB;AAC3D,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO,CAAC;AACtC,QAAM,MAA2B,CAAC;AAClC,aAAW,SAAS,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,GAAG;AACrE,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAM,KAAK,MAAM;AACjB,UAAM,UAAU,KAAK,KAAK,aAAa,EAAE;AACzC,UAAM,eAAe,KAAK,KAAK,SAAS,QAAQ,eAAe;AAC/D,QAAI,YAAY,WAAW,EAAE;AAC7B,QAAI,OAAO;AACX,QAAI,WAAW,YAAY,GAAG;AAC5B,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAI9D,YAAI,SAAS,GAAI,aAAY,SAAS;AACtC,YAAI,SAAS,KAAM,QAAO,SAAS;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,KAAK,EAAE,IAAI,MAAM,SAAS,WAAW,KAAK,CAAC;AAAA,EACjD;AACA,MAAI,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAC3C,SAAO;AACT;AAEO,SAAS,gBAAgB,aAAqB,UAA0B;AAC7E,SAAO,KAAK,KAAK,aAAa,kBAAkB,QAAQ;AAC1D;",
4
+ "sourcesContent": ["import { configPath, patchJson, readJson, type RuntimeConfig } from \"@sfmc-bds/sdk/node/config\";\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { ROOT } from \"./runtime.js\";\n\nconst PACKAGES_DIRNAME = \"packages\";\n\nexport interface SfmcModulePackage {\n /** packages/ \u4E0B\u7684\u6587\u4EF6\u5939\u540D\uFF08install id\uFF09 */\n id: string;\n /** \u7EDD\u5BF9\u8DEF\u5F84 */\n path: string;\n /** manifest \u4E2D\u7684\u903B\u8F91 id\uFF0C\u7F3A\u7701\u4E3A feature-<folder> */\n logicalId: string;\n name: string;\n}\n\nfunction isSfmcModulesRoot(dir: string): boolean {\n const packagesDir = path.join(dir, PACKAGES_DIRNAME);\n return existsSync(packagesDir) && existsSync(path.join(dir, \"index.json\"));\n}\n\n/** \u81EA\u52A8\u63A2\u6D4B\u65C1\u8DEF sfmc-modules\uFF08\u4E0D\u8981\u6C42\u6839\u76EE\u5F55\u6709 package.json\uFF09\u3002 */\nexport function detectSiblingSfmcModulesRoot(): string | null {\n const sibling = path.resolve(ROOT, \"..\", \"sfmc-modules\");\n return isSfmcModulesRoot(sibling) ? sibling : null;\n}\n\n/** \u4ECE runtime.json \u8BFB\u53D6\u66FE\u4FDD\u5B58\u7684 sfmc-modules \u6839\u3002 */\nexport function readPersistedSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const runtime = readJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"));\n const saved = runtime?.sfmc_modules_root;\n if (typeof saved !== \"string\" || !saved.trim()) return null;\n const resolved = path.resolve(saved);\n return isSfmcModulesRoot(resolved) ? resolved : null;\n}\n\n/** \u5199\u5165 runtime.json\uFF0C\u4E0B\u6B21\u514D\u8F93\u8DEF\u5F84\u3002 */\nexport function persistSfmcModulesRoot(modulesRoot: string, rootDir: string = ROOT): void {\n const slash = modulesRoot.replace(/\\\\/g, \"/\");\n patchJson<RuntimeConfig>(configPath(rootDir, \"runtime.json\"), { sfmc_modules_root: slash });\n}\n\n/**\n * \u89E3\u6790 sfmc-modules \u6839\u76EE\u5F55\u3002\n * \u4F18\u5148\u7EA7\uFF1ASFMC_MODULES_ROOT \u73AF\u5883\u53D8\u91CF \u2192 runtime.json \u2192 \u65C1\u8DEF ../sfmc-modules\n */\nexport function resolveSfmcModulesRoot(rootDir: string = ROOT): string | null {\n const fromEnv = process.env.SFMC_MODULES_ROOT;\n if (fromEnv) {\n const resolved = path.resolve(fromEnv);\n if (isSfmcModulesRoot(resolved)) return resolved;\n }\n const persisted = readPersistedSfmcModulesRoot(rootDir);\n if (persisted) return persisted;\n return detectSiblingSfmcModulesRoot();\n}\n\n/** \u679A\u4E3E sfmc-modules/packages \u4E0B\u53EF\u5B89\u88C5\u7684\u6A21\u5757\u5305\u3002 */\nexport function listSfmcModulePackages(modulesRoot: string): SfmcModulePackage[] {\n const packagesDir = path.join(modulesRoot, PACKAGES_DIRNAME);\n if (!existsSync(packagesDir)) return [];\n const out: SfmcModulePackage[] = [];\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n const id = entry.name;\n const pkgPath = path.join(packagesDir, id);\n try {\n if (!statSync(pkgPath).isDirectory()) continue;\n } catch {\n continue;\n }\n const manifestPath = path.join(pkgPath, \"sapi\", \"manifest.json\");\n let logicalId = `feature-${id}`;\n let name = id;\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as {\n id?: string;\n name?: string;\n };\n if (manifest.id) logicalId = manifest.id;\n if (manifest.name) name = manifest.name;\n } catch {\n /* \u635F\u574F manifest \u4ECD\u5217\u51FA\u6587\u4EF6\u5939 */\n }\n }\n out.push({ id, path: pkgPath, logicalId, name });\n }\n out.sort((a, b) => a.id.localeCompare(b.id));\n return out;\n}\n\nexport function packageDirForId(modulesRoot: string, folderId: string): string {\n return path.join(modulesRoot, PACKAGES_DIRNAME, folderId);\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY,WAAW,gBAAoC;AACpE,SAAS,YAAY,aAAa,cAAc,gBAAgB;AAChE,OAAO,UAAU;AACjB,SAAS,YAAY;AAErB,MAAM,mBAAmB;AAYzB,SAAS,kBAAkB,KAAsB;AAC/C,QAAM,cAAc,KAAK,KAAK,KAAK,gBAAgB;AACnD,SAAO,WAAW,WAAW,KAAK,WAAW,KAAK,KAAK,KAAK,YAAY,CAAC;AAC3E;AAGO,SAAS,+BAA8C;AAC5D,QAAM,UAAU,KAAK,QAAQ,MAAM,MAAM,cAAc;AACvD,SAAO,kBAAkB,OAAO,IAAI,UAAU;AAChD;AAGO,SAAS,6BAA6B,UAAkB,MAAqB;AAClF,QAAM,UAAU,SAAwB,WAAW,SAAS,cAAc,CAAC;AAC3E,QAAM,QAAQ,SAAS;AACvB,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,EAAG,QAAO;AACvD,QAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,SAAO,kBAAkB,QAAQ,IAAI,WAAW;AAClD;AAGO,SAAS,uBAAuB,aAAqB,UAAkB,MAAY;AACxF,QAAM,QAAQ,YAAY,QAAQ,OAAO,GAAG;AAC5C,YAAyB,WAAW,SAAS,cAAc,GAAG,EAAE,mBAAmB,MAAM,CAAC;AAC5F;AAMO,SAAS,uBAAuB,UAAkB,MAAqB;AAC5E,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACX,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,QAAI,kBAAkB,QAAQ,EAAG,QAAO;AAAA,EAC1C;AACA,QAAM,YAAY,6BAA6B,OAAO;AACtD,MAAI,UAAW,QAAO;AACtB,SAAO,6BAA6B;AACtC;AAGO,SAAS,uBAAuB,aAA0C;AAC/E,QAAM,cAAc,KAAK,KAAK,aAAa,gBAAgB;AAC3D,MAAI,CAAC,WAAW,WAAW,EAAG,QAAO,CAAC;AACtC,QAAM,MAA2B,CAAC;AAClC,aAAW,SAAS,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,GAAG;AACrE,UAAM,KAAK,MAAM;AACjB,UAAM,UAAU,KAAK,KAAK,aAAa,EAAE;AACzC,QAAI;AACF,UAAI,CAAC,SAAS,OAAO,EAAE,YAAY,EAAG;AAAA,IACxC,QAAQ;AACN;AAAA,IACF;AACA,UAAM,eAAe,KAAK,KAAK,SAAS,QAAQ,eAAe;AAC/D,QAAI,YAAY,WAAW,EAAE;AAC7B,QAAI,OAAO;AACX,QAAI,WAAW,YAAY,GAAG;AAC5B,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAI9D,YAAI,SAAS,GAAI,aAAY,SAAS;AACtC,YAAI,SAAS,KAAM,QAAO,SAAS;AAAA,MACrC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,KAAK,EAAE,IAAI,MAAM,SAAS,WAAW,KAAK,CAAC;AAAA,EACjD;AACA,MAAI,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAC3C,SAAO;AACT;AAEO,SAAS,gBAAgB,aAAqB,UAA0B;AAC7E,SAAO,KAAK,KAAK,aAAa,kBAAkB,QAAQ;AAC1D;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,6 @@
1
+ export interface CmdUiOptions {
2
+ /** argv 模式为 true:启动后驻留进程直到 Ctrl+C;REPL 模式为 false:立即返回。 */
3
+ block: boolean;
4
+ }
5
+ export declare function cmdUi(args: string[], options: CmdUiOptions): Promise<string>;
6
+ //# sourceMappingURL=ui-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-command.d.ts","sourceRoot":"","sources":["../src/ui-command.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlF"}
@@ -0,0 +1,68 @@
1
+ import { spawn } from "node:child_process";
2
+ import {
3
+ startUiStudioServer
4
+ } from "@sfmc-bds/sdk/ui-studio";
5
+ import { t } from "./i18n/index.js";
6
+ import { c } from "./theme.js";
7
+ let running = null;
8
+ async function cmdUi(args, options) {
9
+ const [sub] = args;
10
+ switch (sub) {
11
+ case "studio":
12
+ return cmdUiStudio(options);
13
+ case "stop":
14
+ return cmdUiStop();
15
+ default:
16
+ return c.yellow(t("ui.usage"));
17
+ }
18
+ }
19
+ async function cmdUiStudio(options) {
20
+ if (running) {
21
+ return c.yellow(t("ui.studio.already", { url: running.url }));
22
+ }
23
+ let handle;
24
+ try {
25
+ handle = await startUiStudioServer();
26
+ } catch (error) {
27
+ return c.yellow(
28
+ t("ui.studio.failed", { message: error.message })
29
+ );
30
+ }
31
+ running = handle;
32
+ const started = t("ui.studio.started", { url: handle.url });
33
+ openBrowser(handle.url);
34
+ if (!options.block) {
35
+ return started;
36
+ }
37
+ console.log(started);
38
+ console.log(c.dim(t("ui.studio.hint")));
39
+ await new Promise((resolve) => {
40
+ const done = () => resolve();
41
+ process.once("SIGINT", done);
42
+ process.once("SIGTERM", done);
43
+ });
44
+ await stopRunning();
45
+ return c.dim(t("ui.studio.stopped"));
46
+ }
47
+ async function cmdUiStop() {
48
+ if (!running) return c.yellow(t("ui.studio.notRunning"));
49
+ await stopRunning();
50
+ return t("ui.studio.stopped");
51
+ }
52
+ async function stopRunning() {
53
+ const handle = running;
54
+ running = null;
55
+ if (handle) await handle.close();
56
+ }
57
+ function openBrowser(url) {
58
+ try {
59
+ const [cmd, args] = process.platform === "win32" ? ["cmd", ["/c", "start", '""', url]] : process.platform === "darwin" ? ["open", [url]] : ["xdg-open", [url]];
60
+ const child = spawn(cmd, args, { detached: true, stdio: "ignore" });
61
+ child.unref();
62
+ } catch {
63
+ }
64
+ }
65
+ export {
66
+ cmdUi
67
+ };
68
+ //# sourceMappingURL=ui-command.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui-command.ts"],
4
+ "sourcesContent": ["/**\n * ui-command.ts \u2014 sfmc ui \u547D\u4EE4\uFF1AUI Studio \u58F0\u660E\u5F0F\u754C\u9762\u53EF\u89C6\u5316\u7F16\u8F91\u5668\u3002\n *\n * - `sfmc ui studio`\uFF1A\u542F\u52A8\u672C\u5730 Studio \u670D\u52A1\u5E76\u6253\u5F00\u6D4F\u89C8\u5668\uFF1B\n * argv \u6A21\u5F0F\u4E0B\u8FDB\u7A0B\u9A7B\u7559\uFF0CCtrl+C \u505C\u6B62\uFF1BREPL \u6A21\u5F0F\u4E0B\u540E\u53F0\u8FD0\u884C\uFF0C\u7528 `/ui stop` \u505C\u6B62\u3002\n * - `sfmc ui stop`\uFF1A\u505C\u6B62\u5F53\u524D\u8FDB\u7A0B\u5185\u8FD0\u884C\u7684 Studio \u670D\u52A1\u3002\n *\n * Studio \u662F\u9879\u76EE\u5316\u7684\u7EAF\u6D4F\u89C8\u5668\u5E94\u7528\uFF1A\u5DE5\u7A0B\u5B58\u4E8E\u6D4F\u89C8\u5668 IndexedDB\uFF0C\n * \u901A\u8FC7 zip \u5BFC\u5165\u5BFC\u51FA\uFF0C\u4E0D\u4F9D\u8D56\u78C1\u76D8\u4E0A\u7684\u771F\u5B9E\u6A21\u5757\u76EE\u5F55\u3002\n * \u670D\u52A1\u5B9E\u73B0\u4E3A @sfmc-bds/sdk/ui-studio \u7684\u7EAF\u9759\u6001\u6258\u7BA1\uFF08\u9ED8\u8BA4 127.0.0.1:3003\uFF09\uFF0C\n * \u672C\u6587\u4EF6\u53EA\u8D1F\u8D23\u547D\u4EE4\u884C\u88C5\u914D\u3002\n */\nimport { spawn } from \"node:child_process\";\nimport {\n startUiStudioServer,\n type UiStudioServerHandle,\n} from \"@sfmc-bds/sdk/ui-studio\";\nimport { t } from \"./i18n/index.js\";\nimport { c } from \"./theme.js\";\n\n/** \u5F53\u524D\u8FDB\u7A0B\u5185\u8FD0\u884C\u7684 Studio \u670D\u52A1\uFF08\u540C\u4E00\u65F6\u523B\u53EA\u5141\u8BB8\u4E00\u4E2A\u5B9E\u4F8B\uFF09\u3002 */\nlet running: UiStudioServerHandle | null = null;\n\nexport interface CmdUiOptions {\n /** argv \u6A21\u5F0F\u4E3A true\uFF1A\u542F\u52A8\u540E\u9A7B\u7559\u8FDB\u7A0B\u76F4\u5230 Ctrl+C\uFF1BREPL \u6A21\u5F0F\u4E3A false\uFF1A\u7ACB\u5373\u8FD4\u56DE\u3002 */\n block: boolean;\n}\n\nexport async function cmdUi(args: string[], options: CmdUiOptions): Promise<string> {\n const [sub] = args;\n switch (sub) {\n case \"studio\":\n return cmdUiStudio(options);\n case \"stop\":\n return cmdUiStop();\n default:\n return c.yellow(t(\"ui.usage\"));\n }\n}\n\nasync function cmdUiStudio(options: CmdUiOptions): Promise<string> {\n if (running) {\n return c.yellow(t(\"ui.studio.already\", { url: running.url }));\n }\n let handle: UiStudioServerHandle;\n try {\n handle = await startUiStudioServer();\n } catch (error) {\n return c.yellow(\n t(\"ui.studio.failed\", { message: (error as Error).message }),\n );\n }\n running = handle;\n\n const started = t(\"ui.studio.started\", { url: handle.url });\n openBrowser(handle.url);\n\n if (!options.block) {\n // REPL\uFF1A\u540E\u53F0\u8FD0\u884C\uFF0C\u8FD4\u56DE\u542F\u52A8\u4FE1\u606F\u7531 REPL \u6253\u5370\u3002\n return started;\n }\n\n // argv\uFF1A\u6253\u5370\u542F\u52A8\u4FE1\u606F\u540E\u9A7B\u7559\uFF0C\u76F4\u5230 Ctrl+C / SIGTERM\u3002\n console.log(started);\n console.log(c.dim(t(\"ui.studio.hint\")));\n await new Promise<void>((resolve) => {\n const done = () => resolve();\n process.once(\"SIGINT\", done);\n process.once(\"SIGTERM\", done);\n });\n await stopRunning();\n return c.dim(t(\"ui.studio.stopped\"));\n}\n\nasync function cmdUiStop(): Promise<string> {\n if (!running) return c.yellow(t(\"ui.studio.notRunning\"));\n await stopRunning();\n return t(\"ui.studio.stopped\");\n}\n\nasync function stopRunning(): Promise<void> {\n const handle = running;\n running = null;\n if (handle) await handle.close();\n}\n\n/** \u7528\u7CFB\u7EDF\u9ED8\u8BA4\u6D4F\u89C8\u5668\u6253\u5F00\u5730\u5740\uFF1B\u5931\u8D25\u4E0D\u963B\u65AD\uFF08\u7528\u6237\u53EF\u624B\u52A8\u590D\u5236 URL\uFF09\u3002 */\nfunction openBrowser(url: string): void {\n try {\n const [cmd, args] =\n process.platform === \"win32\"\n ? [\"cmd\", [\"/c\", \"start\", '\"\"', url]]\n : process.platform === \"darwin\"\n ? [\"open\", [url]]\n : [\"xdg-open\", [url]];\n const child = spawn(cmd, args, { detached: true, stdio: \"ignore\" });\n child.unref();\n } catch {\n // \u5FFD\u7565\uFF1A\u65E0\u56FE\u5F62\u73AF\u5883\u6216\u7F3A\u5C11 xdg-open \u65F6\u4EC5\u6253\u5370 URL\u3002\n }\n}\n"],
5
+ "mappings": "AAYA,SAAS,aAAa;AACtB;AAAA,EACE;AAAA,OAEK;AACP,SAAS,SAAS;AAClB,SAAS,SAAS;AAGlB,IAAI,UAAuC;AAO3C,eAAsB,MAAM,MAAgB,SAAwC;AAClF,QAAM,CAAC,GAAG,IAAI;AACd,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,YAAY,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,UAAU;AAAA,IACnB;AACE,aAAO,EAAE,OAAO,EAAE,UAAU,CAAC;AAAA,EACjC;AACF;AAEA,eAAe,YAAY,SAAwC;AACjE,MAAI,SAAS;AACX,WAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC;AAAA,EAC9D;AACA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,oBAAoB;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP,EAAE,oBAAoB,EAAE,SAAU,MAAgB,QAAQ,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,YAAU;AAEV,QAAM,UAAU,EAAE,qBAAqB,EAAE,KAAK,OAAO,IAAI,CAAC;AAC1D,cAAY,OAAO,GAAG;AAEtB,MAAI,CAAC,QAAQ,OAAO;AAElB,WAAO;AAAA,EACT;AAGA,UAAQ,IAAI,OAAO;AACnB,UAAQ,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACtC,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,UAAM,OAAO,MAAM,QAAQ;AAC3B,YAAQ,KAAK,UAAU,IAAI;AAC3B,YAAQ,KAAK,WAAW,IAAI;AAAA,EAC9B,CAAC;AACD,QAAM,YAAY;AAClB,SAAO,EAAE,IAAI,EAAE,mBAAmB,CAAC;AACrC;AAEA,eAAe,YAA6B;AAC1C,MAAI,CAAC,QAAS,QAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC;AACvD,QAAM,YAAY;AAClB,SAAO,EAAE,mBAAmB;AAC9B;AAEA,eAAe,cAA6B;AAC1C,QAAM,SAAS;AACf,YAAU;AACV,MAAI,OAAQ,OAAM,OAAO,MAAM;AACjC;AAGA,SAAS,YAAY,KAAmB;AACtC,MAAI;AACF,UAAM,CAAC,KAAK,IAAI,IACd,QAAQ,aAAa,UACjB,CAAC,OAAO,CAAC,MAAM,SAAS,MAAM,GAAG,CAAC,IAClC,QAAQ,aAAa,WACnB,CAAC,QAAQ,CAAC,GAAG,CAAC,IACd,CAAC,YAAY,CAAC,GAAG,CAAC;AAC1B,UAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC;AAClE,UAAM,MAAM;AAAA,EACd,QAAQ;AAAA,EAER;AACF;",
6
+ "names": []
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAgHA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAoV/C"}
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAiHA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAyV/C"}
package/dist/wizard.js CHANGED
@@ -63,7 +63,7 @@ async function prepareRuntimeAssets(rootDir) {
63
63
  if (isMonorepoLayout(rootDir)) {
64
64
  const missing = missingRuntimeAssets(rootDir);
65
65
  if (missing.length > 0) {
66
- throw new Error(t("wizard.npmMissing", { list: missing.join(", ") }));
66
+ throw new Error(t("wizard.runtimeMissingAssets", { list: missing.join(", ") }));
67
67
  }
68
68
  return;
69
69
  }
@@ -251,16 +251,18 @@ async function runWizard() {
251
251
  });
252
252
  if (!isCancel(pr)) preserve = pr;
253
253
  note(c.yellow(t("wizard.updaterTip")), t("common.tips"));
254
- const catalog = readJson(modulePath(rootDir, "catalog.json")) ?? {};
254
+ const catalog = readJson(modulePath(rootDir, "catalog.json")) ?? {
255
+ version: 1,
256
+ modules: []
257
+ };
255
258
  const catalogModules = [];
256
259
  if (Array.isArray(catalog.modules)) {
257
260
  for (const m of catalog.modules) {
258
- const entry = m;
259
261
  catalogModules.push({
260
- id: String(entry.id ?? ""),
261
- name: String(entry.name ?? entry.id ?? ""),
262
- type: String(entry.type ?? "feature"),
263
- description: String(entry.description ?? "")
262
+ id: String(m.id ?? ""),
263
+ name: String(m.name ?? m.id ?? ""),
264
+ description: String(m.description ?? ""),
265
+ canDisable: m.canDisable !== false
264
266
  });
265
267
  }
266
268
  }
@@ -271,28 +273,24 @@ async function runWizard() {
271
273
  t("wizard.step4")
272
274
  );
273
275
  let selectedModules = [];
274
- const coreMd = [];
275
- const featMd = [];
276
+ const lockedMd = [];
277
+ const optionalMd = [];
276
278
  catalogModules.forEach((k) => {
277
- if (k.type === "core") {
278
- coreMd.push({
279
- value: k.id,
280
- label: `${k.name} (${k.type})`,
281
- hint: String(k.description ?? t("wizard.emptyHint")),
282
- disabled: true
283
- });
284
- } else if (k.type === "feature") {
285
- featMd.push({
286
- value: k.id,
287
- label: `${k.name} (${k.type})`,
288
- hint: String(k.description ?? t("wizard.emptyHint"))
289
- });
279
+ const option = {
280
+ value: k.id,
281
+ label: String(k.name),
282
+ hint: String(k.description ?? t("wizard.emptyHint"))
283
+ };
284
+ if (k.canDisable === false) {
285
+ lockedMd.push({ ...option, disabled: true });
286
+ } else {
287
+ optionalMd.push(option);
290
288
  }
291
289
  });
292
290
  if (catalogModules.length > 0) {
293
291
  const r = await multiselect({
294
292
  message: t("wizard.enableModules"),
295
- options: [...coreMd, ...featMd],
293
+ options: [...lockedMd, ...optionalMd],
296
294
  required: false
297
295
  });
298
296
  if (!isCancel(r)) selectedModules = r;
@@ -310,17 +308,24 @@ async function runWizard() {
310
308
  const llbotOn = qqBackend === "llbot" && !!llbotEnabled && !!llbotPath;
311
309
  const qqNotify = qqEnabled && (qqBackend === "official" || llbotOn);
312
310
  const exeName = llbotExeName();
311
+ const currentQq = readJson(configPath(rootDir, "qq_config.json")) ?? {};
313
312
  patchJson(rootDir, "qq_config.json", {
314
313
  qq_enabled: qqEnabled,
315
314
  qq_backend: qqBackend,
316
- qq_app_id: qqAppId,
317
- qq_app_secret: qqAppSecret,
318
- qq_sandbox: qqSandbox,
319
- qq_group_openid: qqGroupOpenid,
320
- llbot_enabled: llbotOn,
321
- // path = 可执行文件;cwd = 运行目录(向导选的是目录)
322
- llbot_path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : "",
323
- llbot_cwd: llbotPath ? slashPath(llbotPath) : ""
315
+ official: {
316
+ ...currentQq.official,
317
+ app_id: qqAppId,
318
+ app_secret: qqAppSecret,
319
+ sandbox: qqSandbox,
320
+ group_openid: qqGroupOpenid
321
+ },
322
+ llbot: {
323
+ ...currentQq.llbot,
324
+ enabled: llbotOn,
325
+ // path = 可执行文件;cwd = 运行目录(向导选的是目录)
326
+ path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : "",
327
+ cwd: llbotPath ? slashPath(llbotPath) : ""
328
+ }
324
329
  });
325
330
  patchJson(rootDir, "bds_updater.json", {
326
331
  bds_path: slashPath(bdsResolved),
@@ -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, 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} 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 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 /* 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 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 = qqBackend === \"llbot\" && !!llbotEnabled && !!llbotPath;\n const qqNotify = qqEnabled && (qqBackend === \"official\" || llbotOn);\n const exeName = llbotExeName();\n patchJson(rootDir, \"qq_config.json\", {\n qq_enabled: qqEnabled,\n qq_backend: qqBackend,\n qq_app_id: qqAppId,\n qq_app_secret: qqAppSecret,\n qq_sandbox: qqSandbox,\n qq_group_openid: qqGroupOpenid,\n llbot_enabled: llbotOn,\n // path = \u53EF\u6267\u884C\u6587\u4EF6\uFF1Bcwd = \u8FD0\u884C\u76EE\u5F55\uFF08\u5411\u5BFC\u9009\u7684\u662F\u76EE\u5F55\uFF09\n llbot_path: llbotPath ? slashPath(path.join(llbotPath, exeName)) : \"\",\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: 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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",
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"}