@h-ai/cli 0.1.0-alpha.67 → 0.1.0-alpha.68

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 (164) hide show
  1. package/README.en.md +40 -4
  2. package/README.ja.md +40 -4
  3. package/README.md +40 -4
  4. package/dist/{src-2V6VP4I5.js → chunk-FI56GONY.js} +32 -3103
  5. package/dist/chunk-FI56GONY.js.map +1 -0
  6. package/dist/chunk-MBPB37FR.js +1348 -0
  7. package/dist/chunk-MBPB37FR.js.map +1 -0
  8. package/dist/{chunk-7DSURTJ4.js → chunk-ZFNBUF77.js} +327 -199
  9. package/dist/chunk-ZFNBUF77.js.map +1 -0
  10. package/dist/cli-config-templates-W2LLPMB6.js +5 -0
  11. package/dist/{cli-config-templates-6AHNUGBN.js.map → cli-config-templates-W2LLPMB6.js.map} +1 -1
  12. package/dist/{cli-skill-templates-FC3QRKDO.js → cli-skill-templates-US5CCAJ4.js} +3 -3
  13. package/dist/{cli-skill-templates-FC3QRKDO.js.map → cli-skill-templates-US5CCAJ4.js.map} +1 -1
  14. package/dist/index.js +920 -336
  15. package/dist/index.js.map +1 -1
  16. package/dist/metafile-esm.json +1 -0
  17. package/dist/src-DSJJXM2F.js +3849 -0
  18. package/dist/src-DSJJXM2F.js.map +1 -0
  19. package/package.json +9 -8
  20. package/templates/apps/admin/messages/ja-JP.json +38 -0
  21. package/templates/apps/admin/src/routes/+layout.svelte.hbs +16 -6
  22. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +3 -3
  23. package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +2 -0
  24. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +4 -1
  25. package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +5 -1
  26. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +0 -10
  27. package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +2 -1
  28. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +24 -11
  29. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +8 -1
  30. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +68 -11
  31. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/index.ts.hbs +10 -2
  32. package/templates/apps/api/e2e/api-service.spec.ts.hbs +2 -2
  33. package/templates/apps/api/package.json.hbs +1 -1
  34. package/templates/apps/api/playwright.config.ts.hbs +15 -7
  35. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +1 -1
  36. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/ja-JP.json.hbs +7 -0
  37. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +7 -1
  38. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +1 -1
  39. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +1 -1
  40. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/ja-JP.json.hbs +7 -0
  41. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +1 -1
  42. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/ja-JP.json.hbs +12 -0
  43. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +1 -1
  44. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/ja-JP.json.hbs +7 -0
  45. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +1 -1
  46. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +19 -8
  47. package/templates/apps/fullstack/package.json.hbs +1 -1
  48. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +1 -1
  49. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +2 -0
  50. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +3 -0
  51. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +5 -2
  52. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +0 -6
  53. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +8 -0
  54. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +2 -1
  55. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +6 -0
  56. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +9 -5
  57. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +3 -2
  58. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +16 -1
  59. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +7 -3
  60. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +3 -0
  61. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +58 -7
  62. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +13 -3
  63. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +9 -4
  64. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +105 -0
  65. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +3 -3
  66. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +5 -5
  67. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +7 -7
  68. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +1 -1
  69. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +8 -8
  70. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +11 -12
  71. package/templates/apps/fullstack/playwright.config.ts.hbs +15 -6
  72. package/templates/apps/h5/messages/ja-JP.json +40 -0
  73. package/templates/apps/h5/src/routes/+layout.svelte.hbs +14 -3
  74. package/templates/apps/mobile-app/messages/ja-JP.json +36 -0
  75. package/templates/apps/mobile-app/src/App.svelte.hbs +13 -3
  76. package/templates/apps/mobile-app/src/lib/api.ts.hbs +173 -14
  77. package/templates/apps/website/messages/ja-JP.json +32 -0
  78. package/templates/apps/website/src/routes/+layout.svelte.hbs +10 -2
  79. package/templates/base/e2e/app.spec.ts.hbs +13 -8
  80. package/templates/base/package.json.hbs +4 -1
  81. package/templates/base/playwright.config.ts +15 -4
  82. package/templates/base/src/hooks.server.ts.hbs +15 -6
  83. package/templates/base/src/lib/server/init.ts.hbs +139 -30
  84. package/templates/base/vite.config.ts.hbs +2 -2
  85. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +11 -6
  86. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +18 -25
  87. package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +4 -0
  88. package/templates/i18n/project.inlang/settings.json +1 -1
  89. package/templates/shared/e2e-env.ts +98 -0
  90. package/templates/shared/run-e2e.mjs +51 -12
  91. package/templates/skills/AGENTS.md +4 -0
  92. package/templates/skills/bridges/admin/AGENTS.md +5 -1
  93. package/templates/skills/bridges/api/AGENTS.md +2 -0
  94. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +4 -0
  95. package/templates/skills/bridges/h5/AGENTS.md +5 -1
  96. package/templates/skills/bridges/mobile-app/AGENTS.md +5 -1
  97. package/templates/skills/bridges/website/AGENTS.md +5 -1
  98. package/templates/skills/hai-ai/SKILL.md +8 -2
  99. package/templates/skills/hai-ai/guide.md +134 -60
  100. package/templates/skills/hai-ai/reference.md +51 -11
  101. package/templates/skills/hai-api-client/SKILL.md +2 -0
  102. package/templates/skills/hai-api-client/reference.md +17 -5
  103. package/templates/skills/hai-api-contract/SKILL.md +1 -0
  104. package/templates/skills/hai-api-contract/reference.md +4 -2
  105. package/templates/skills/hai-app-create/SKILL.md +4 -0
  106. package/templates/skills/hai-app-create/development.md +20 -4
  107. package/templates/skills/hai-app-create/reference.md +2 -1
  108. package/templates/skills/hai-app-review/SKILL.md +6 -2
  109. package/templates/skills/hai-app-review/differential.md +34 -0
  110. package/templates/skills/hai-app-tests/SKILL.md +3 -1
  111. package/templates/skills/hai-app-tests/reference.md +4 -4
  112. package/templates/skills/hai-app-tests/validation.md +10 -3
  113. package/templates/skills/hai-audit/SKILL.md +10 -8
  114. package/templates/skills/hai-audit/reference.md +3 -0
  115. package/templates/skills/hai-build/reference.md +6 -4
  116. package/templates/skills/hai-cache/SKILL.md +9 -3
  117. package/templates/skills/hai-cache/reference.md +53 -11
  118. package/templates/skills/hai-capacitor/SKILL.md +3 -1
  119. package/templates/skills/hai-capacitor/reference.md +9 -5
  120. package/templates/skills/hai-core/SKILL.md +4 -0
  121. package/templates/skills/hai-core/reference.md +25 -5
  122. package/templates/skills/hai-crypto/SKILL.md +10 -2
  123. package/templates/skills/hai-crypto/reference.md +64 -10
  124. package/templates/skills/hai-datapipe/SKILL.md +2 -0
  125. package/templates/skills/hai-datapipe/reference.md +3 -1
  126. package/templates/skills/hai-deploy/SKILL.md +9 -4
  127. package/templates/skills/hai-deploy/middleware.md +51 -37
  128. package/templates/skills/hai-iam/SKILL.md +24 -8
  129. package/templates/skills/hai-iam/reference.md +181 -154
  130. package/templates/skills/hai-kit/SKILL.md +23 -7
  131. package/templates/skills/hai-kit/reference.md +42 -24
  132. package/templates/skills/hai-payment/SKILL.md +13 -11
  133. package/templates/skills/hai-payment/reference.md +80 -41
  134. package/templates/skills/hai-pr-review/SKILL.md +21 -88
  135. package/templates/skills/hai-reach/SKILL.md +5 -2
  136. package/templates/skills/hai-reach/reference.md +83 -22
  137. package/templates/skills/hai-reldb/SKILL.md +5 -2
  138. package/templates/skills/hai-reldb/reference.md +68 -25
  139. package/templates/skills/hai-scheduler/SKILL.md +8 -5
  140. package/templates/skills/hai-scheduler/reference.md +38 -24
  141. package/templates/skills/hai-serv/SKILL.md +23 -8
  142. package/templates/skills/hai-serv/reference.md +123 -87
  143. package/templates/skills/hai-spec-implement/SKILL.md +4 -0
  144. package/templates/skills/hai-spec-implement/evaluation.md +18 -0
  145. package/templates/skills/hai-spec-implement/handoff.md +47 -0
  146. package/templates/skills/hai-spec-implement/templates.md +5 -0
  147. package/templates/skills/hai-spec-implement/workflow.md +2 -0
  148. package/templates/skills/hai-spec-review/SKILL.md +4 -0
  149. package/templates/skills/hai-storage/SKILL.md +8 -2
  150. package/templates/skills/hai-storage/reference.md +64 -25
  151. package/templates/skills/hai-ui/SKILL.md +16 -2
  152. package/templates/skills/hai-ui/guide.md +3 -3
  153. package/templates/skills/hai-ui/reference.md +17 -6
  154. package/templates/skills/hai-ui-design/SKILL.md +31 -0
  155. package/templates/skills/hai-ui-design/patterns.md +26 -0
  156. package/templates/skills/hai-ui-review/SKILL.md +30 -0
  157. package/templates/skills/hai-ui-review/checklist.md +22 -0
  158. package/templates/skills/hai-vecdb/SKILL.md +12 -8
  159. package/templates/skills/hai-vecdb/reference.md +33 -3
  160. package/dist/chunk-7DSURTJ4.js.map +0 -1
  161. package/dist/chunk-AOQ4N657.js +0 -640
  162. package/dist/chunk-AOQ4N657.js.map +0 -1
  163. package/dist/cli-config-templates-6AHNUGBN.js +0 -5
  164. package/dist/src-2V6VP4I5.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli-utils.ts","../src/commands/cli-template-engine.ts","../src/commands/cli-create.ts","../src/commands/cli-add.ts","../src/commands/cli-build.ts","../src/commands/cli-deploy-middleware.ts","../src/commands/cli-deploy.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/cli-main.ts"],"names":["process","fs","path","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","ora","chalk","prompts","generatedFiles","pkg","execSync","resolve","relative","runtime","randomBytes","parsed","join","mkdirSync","existsSync","readFileSync","writeFileSync","previous","dirname"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/cli — 工具函数\n * @module cli-utils\n */\n\nimport type { TemplateContext } from './cli-types.js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { wrapAnsi } from 'fast-wrap-ansi'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\n\n/** CLI 交互提示直接写终端,不能交给异步 JSON 日志 transport。 */\nexport function writeCliMessage(message: string): void {\n process.stdout.write(`${message}\\n`)\n}\n\n/** 显示异常的 message,保留子命令输出;Error 的不可枚举属性不能依赖 JSON 序列化。 */\nexport function writeCliError(message: string, error?: unknown): void {\n process.stderr.write(`${message}\\n`)\n if (error && typeof error === 'object' && 'error' in error)\n error = error.error\n if (error !== undefined)\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\n/** 显式按显示宽度换行,为 prompts 的前缀和缩进预留空间,避免中文自动折行后擦除不足。 */\nexport function formatPromptDescription(description: string): string {\n return wrapAnsi(description, Math.max(1, (process.stdout.columns || 80) - 32), { hard: true })\n}\n\n/**\n * 转换为驼峰命名\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : '')\n .replace(LEADING_CHAR_REGEX, c => c.toLowerCase())\n}\n\n/**\n * 转换为帕斯卡命名\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str)\n return camel.charAt(0).toUpperCase() + camel.slice(1)\n}\n\n/**\n * 转换为短横线命名\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * 转换为下划线命名\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n\n/**\n * 创建模板上下文\n */\nexport function createTemplateContext(name: string, extra: Record<string, unknown> = {}): TemplateContext {\n return {\n camelCase: toCamelCase(name),\n pascalCase: toPascalCase(name),\n kebabCase: toKebabCase(name),\n snakeCase: toSnakeCase(name),\n ...extra,\n }\n}\n\n/**\n * 渲染模板\n */\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const compiled = Handlebars.compile(template, { noEscape: true })\n return compiled(context)\n}\n\n/**\n * 渲染模板文件\n */\nexport async function renderTemplateFile(\n templatePath: string,\n context: TemplateContext,\n): Promise<string> {\n const template = await fs.readFile(templatePath, 'utf-8')\n return renderTemplate(template, context)\n}\n\n/**\n * 写入文件(创建目录)\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf-8')\n}\n\n/**\n * 检查文件是否存在\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\n/**\n * 获取包版本\n */\nexport async function getPackageVersion(pkgPath: string): Promise<string | null> {\n try {\n const pkg = await fs.readJson(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n}\n\n/**\n * 读取 CLI 自身版本号\n *\n * 从当前模块所在目录向上查找 `@h-ai/cli` 的 package.json,\n * 兼容源码布局(src/)与打包产物布局(dist/)以及 npm 安装后的 node_modules 布局。\n * 用于生成项目时固定 `@h-ai/*` 依赖版本,避免硬编码与预发布版本漂移。\n */\nexport function getCliVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = fs.readJsonSync(path.join(dir, 'package.json')) as { name?: string, version?: string }\n if (pkg.name === '@h-ai/cli')\n return pkg.version ?? '0.0.0'\n }\n catch {\n // 当前目录无 package.json,继续向上查找\n }\n const parent = path.dirname(dir)\n if (parent === dir)\n break\n dir = parent\n }\n return '0.0.0'\n}\n\n/**\n * 检测包管理器\n */\nexport async function detectPackageManager(cwd: string): Promise<'pnpm' | 'npm' | 'yarn'> {\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n return 'npm'\n}\n\n/**\n * 格式化字节\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * 格式化时间\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * 注册 Handlebars helpers\n */\nexport function registerHelpers(): void {\n // 条件判断\n Handlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n })\n\n // 日期格式化\n Handlebars.registerHelper('date', () => {\n return new Date().toISOString().split('T')[0]\n })\n\n // 年份\n Handlebars.registerHelper('year', () => {\n return new Date().getFullYear()\n })\n\n // 大写\n Handlebars.registerHelper('upper', (str: string) => {\n return str.toUpperCase()\n })\n\n // 小写\n Handlebars.registerHelper('lower', (str: string) => {\n return str.toLowerCase()\n })\n}\n\n// 初始化时注册 helpers\nregisterHelpers()\n","/**\n * @h-ai/cli — 模板引擎\n *\n * 基于模板目录的项目生成逻辑:\n * 1. 拷贝 base 模板(骨架)\n * 2. 拷贝 apps/{type} 模板(应用类型路由)\n * 3. 叠加 features/{feat} 模板(可选功能路由,静态文件)\n * 4. 渲染 Handlebars 动态模板(base + apps + features 的 .hbs 文件)\n * 5. 拷贝 i18n 脚手架(project.inlang + messages)(当 hasI18n 为 true)\n *\n * @module cli-template-engine\n */\n\nimport type { AppType, FeatureId, FrontendTarget, ModuleConfigs } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { stringify } from 'yaml'\nimport { getCliVersion } from '../cli-utils.js'\nimport { parameterizeConfig } from './cli-config-environment.js'\nimport { generateConfigFile } from './cli-config-templates.js'\n\n// 注册自定义 Handlebars helpers\nHandlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n})\n\n// 配置中的显示名称可包含引号、空格和换行,嵌入 TS / JSON / YAML 时必须作为字面量编码。\nHandlebars.registerHelper('json', (value: unknown) => JSON.stringify(value))\nHandlebars.registerHelper('html', (value: string) => Handlebars.escapeExpression(value))\nHandlebars.registerHelper('yaml', (key: string, value: unknown) => stringify({ [key]: value }).trim())\nHandlebars.registerHelper('jsString', (value: string) => `'${JSON.stringify(value).slice(1, -1).replace(/\\\\\"/g, '\"').replace(/'/g, '\\\\\\'')}'`)\n\n// 同一份模块配置供直接渲染和 create 命令使用,避免精简配置覆盖完整模板。\n// 未选择的模块只输出注释;说明也加两层注释,整文件去掉外层后仍是合法 YAML。\nHandlebars.registerHelper('moduleConfig', function (this: TemplateContext, moduleKey: string, enabled: boolean) {\n // 文件模板自身保留结尾换行,helper 不再重复输出空行。\n const content = generateConfigFile(moduleKey, this.moduleConfigs).trimEnd()\n const configured = this.appType === 'fullstack' && moduleKey === 'iam'\n ? content.replace('HAI_IAM_SEEDDEFAULTDATA:true', 'HAI_IAM_SEEDDEFAULTDATA:false').replace('variant: card', 'variant: split')\n : content\n return enabled\n ? configured\n : `# # 未启用:安装对应模块并在服务端 runtime 中初始化,再取消所需配置的注释。\\n${configured.split('\\n').map(line => line ? `# ${line}` : '').join('\\n')}`\n})\n\nconst TEMPLATE_SKIP_IF_EMPTY_MARKER = '@skipIfEmpty'\nconst NORMALIZED_RENDER_EXTENSIONS = new Set(['.ts', '.js', '.svelte', '.json', '.css'])\n\n// Capacitor 应用为纯客户端 SPA(Svelte 5 + Vite),没有服务端运行时。\n// 服务端专属产物(hooks、server init)必须跳过,否则预渲染会因访问 url.searchParams 报错。\nconst CAPACITOR_SKIPPED_SERVER_FILES = new Set([\n 'src/hooks.server.ts',\n 'src/lib/server/init.ts',\n])\n\n// 以下版本号与生成项目的 pnpm-workspace.yaml catalog 保持一致;\n// 单包脚手架直接写具体版本,pnpm fullstack workspace 会通过 catalog: 引用这些版本。\nconst VERSIONS = {\n antfuEslintConfig: '9.5.1',\n capacitorSecureStorage: '8.0.1',\n // UI / Icon\n bitsUi: '2.19.5',\n iconifyJsonTabler: '1.2.42',\n iconifyTailwind: '1.2.3',\n // Capacitor\n capacitorAndroid: '8.5.3',\n capacitorApp: '8.1.2',\n capacitorCamera: '8.2.5',\n capacitorCli: '8.5.3',\n capacitorCore: '8.5.3',\n capacitorDevice: '8.0.3',\n capacitorIos: '8.5.3',\n capacitorPreferences: '8.0.1',\n capacitorPushNotifications: '8.1.3',\n capacitorStatusBar: '8.0.4',\n // Tailwind / DaisyUI\n daisyui: '5.7.47',\n tailwindcss: '4.3.3',\n tailwindcssVite: '4.3.3',\n // i18n\n inlangParaglide: '2.27.0',\n inlangMessageFormat: '4.5.0',\n // Svelte / Vite\n svelte: '5.57.2',\n svelteKit: '2.70.3',\n svelteAdapterNode: '5.5.7',\n svelteCheck: '4.7.6',\n sveltePlugin: '7.3.1',\n // Build / Test\n vite: '8.3.4',\n vitest: '4.1.11',\n tsup: '8.5.1',\n rimraf: '6.1.3',\n // ESLint\n eslint: '10.12.0',\n eslintPluginFormat: '2.0.1',\n eslintPluginSvelte: '3.23.1',\n svelteEslintParser: '1.9.0',\n // Node / TS\n nodeTypes: '26.6.5',\n // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。\n typescript: '6.0.3',\n // E2E\n playwright: '1.64.0',\n // Validation\n zod: '4.6.5',\n // Tauri\n tauriCli: '2.12.1',\n} as const\n\ntype ImplementedFrontendTarget = Exclude<FrontendTarget, 'miniapp'>\n\nconst FRONTEND_PORTS_DEFAULT: Record<ImplementedFrontendTarget, number> = {\n web: 4173,\n app: 5175,\n desktop: 5176,\n}\n\nconst FRONTEND_LABELS: Record<FrontendTarget, string> = {\n web: 'Web',\n app: 'App',\n miniapp: 'Miniapp',\n desktop: 'Desktop',\n}\n\nconst IMPLEMENTED_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_FULLSTACK_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_THEMES = ['light', 'dark'] as const\nconst DEFAULT_THEME_NAME = 'light'\n// 框架与模板同步发布;范围版本会把旧命名 alpha9 视为比 alpha.58 更新。\nconst HAI_PACKAGE_VERSION = getCliVersion()\nconst HAI_PACKAGE_SPECIFIER_CATALOG = 'catalog:'\ntype FullstackPackageSpecifiers = { [Key in keyof typeof VERSIONS]: string }\ntype CatalogPackageVersions = Readonly<Record<string, string>>\n\nconst HAI_CATALOG_PACKAGE_NAMES = [\n '@h-ai/ai',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/capacitor',\n '@h-ai/cli',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/datapipe',\n '@h-ai/deploy',\n '@h-ai/iam',\n '@h-ai/kit',\n '@h-ai/payment',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n '@h-ai/ui',\n '@h-ai/vecdb',\n] as const\nconst HAI_CATALOG_PACKAGES: Record<string, string> = Object.fromEntries(\n HAI_CATALOG_PACKAGE_NAMES.map(packageName => [packageName, HAI_PACKAGE_VERSION]),\n)\n\nconst FULLSTACK_EXTERNAL_CATALOG_PACKAGES: CatalogPackageVersions = {\n '@antfu/eslint-config': VERSIONS.antfuEslintConfig,\n '@aparajita/capacitor-secure-storage': VERSIONS.capacitorSecureStorage,\n '@capacitor/android': VERSIONS.capacitorAndroid,\n '@capacitor/app': VERSIONS.capacitorApp,\n '@capacitor/camera': VERSIONS.capacitorCamera,\n '@capacitor/cli': VERSIONS.capacitorCli,\n '@capacitor/core': VERSIONS.capacitorCore,\n '@capacitor/device': VERSIONS.capacitorDevice,\n '@capacitor/ios': VERSIONS.capacitorIos,\n '@capacitor/preferences': VERSIONS.capacitorPreferences,\n '@capacitor/push-notifications': VERSIONS.capacitorPushNotifications,\n '@capacitor/status-bar': VERSIONS.capacitorStatusBar,\n '@iconify-json/tabler': VERSIONS.iconifyJsonTabler,\n '@iconify/tailwind4': VERSIONS.iconifyTailwind,\n '@inlang/paraglide-js': VERSIONS.inlangParaglide,\n '@inlang/plugin-message-format': VERSIONS.inlangMessageFormat,\n '@playwright/test': VERSIONS.playwright,\n '@sveltejs/vite-plugin-svelte': VERSIONS.sveltePlugin,\n '@tailwindcss/vite': VERSIONS.tailwindcssVite,\n '@tauri-apps/cli': VERSIONS.tauriCli,\n '@types/node': VERSIONS.nodeTypes,\n 'bits-ui': VERSIONS.bitsUi,\n 'daisyui': VERSIONS.daisyui,\n 'eslint': VERSIONS.eslint,\n 'eslint-plugin-format': VERSIONS.eslintPluginFormat,\n 'eslint-plugin-svelte': VERSIONS.eslintPluginSvelte,\n 'rimraf': VERSIONS.rimraf,\n 'svelte': VERSIONS.svelte,\n 'svelte-check': VERSIONS.svelteCheck,\n 'svelte-eslint-parser': VERSIONS.svelteEslintParser,\n 'tailwindcss': VERSIONS.tailwindcss,\n 'tsup': VERSIONS.tsup,\n 'typescript': VERSIONS.typescript,\n 'vite': VERSIONS.vite,\n 'vitest': VERSIONS.vitest,\n 'zod': VERSIONS.zod,\n}\n\nconst FULLSTACK_CATALOG_PACKAGES: CatalogPackageVersions = {\n ...HAI_CATALOG_PACKAGES,\n ...FULLSTACK_EXTERNAL_CATALOG_PACKAGES,\n}\n\nconst FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@sveltejs/vite-plugin-svelte',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'rimraf',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tsup',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-contract',\n '@h-ai/core',\n 'zod',\n] as const\n\nconst FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/iam',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/serv',\n '@h-ai/storage',\n 'zod',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/ui',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n 'svelte',\n 'svelte-check',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_WEB_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@h-ai/ui',\n '@iconify-json/tabler',\n '@iconify/tailwind4',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n '@sveltejs/vite-plugin-svelte',\n '@tailwindcss/vite',\n 'bits-ui',\n 'daisyui',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tailwindcss',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_APP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@aparajita/capacitor-secure-storage',\n '@capacitor/android',\n '@capacitor/app',\n '@capacitor/camera',\n '@capacitor/cli',\n '@capacitor/core',\n '@capacitor/device',\n '@capacitor/ios',\n '@capacitor/preferences',\n '@capacitor/push-notifications',\n '@capacitor/status-bar',\n '@h-ai/capacitor',\n] as const\n\nconst FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@tauri-apps/cli',\n] as const\n\nconst API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'rimraf',\n 'tsup',\n 'typescript',\n 'vitest',\n 'zod',\n] as const\n\nfunction pickCatalogPackages(\n packageNames: readonly string[],\n availableCatalogPackages: CatalogPackageVersions,\n): Record<string, string> {\n return Object.fromEntries(\n [...new Set(packageNames)]\n .sort((left, right) => left.localeCompare(right))\n .map((packageName) => {\n const version = availableCatalogPackages[packageName]\n if (!version) {\n throw new Error(`Missing catalog version for package \"${packageName}\"`)\n }\n return [packageName, version]\n }),\n )\n}\n\nfunction buildFullstackPackageSpecifiers(useCatalogProtocol: boolean): FullstackPackageSpecifiers {\n return Object.fromEntries(\n Object.entries(VERSIONS).map(([key, version]) => [key, useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : version]),\n ) as FullstackPackageSpecifiers\n}\n\nfunction buildApiWorkspaceCatalogPackages(featureMap: Record<string, boolean>): Record<string, string> {\n const packageNames: string[] = [\n ...API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/serv',\n ]\n\n if (featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\nfunction buildAppHaiCatalogPackages(options: {\n featureMap: Record<string, boolean>\n hasUi: boolean\n isCapacitorApp: boolean\n isSvelteOnlyApp: boolean\n}): Record<string, string> {\n const packageNames: string[] = ['@h-ai/cli']\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@h-ai/api-contract', '@h-ai/capacitor', '@h-ai/ui')\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n }\n\n packageNames.push('@h-ai/core', '@h-ai/kit')\n if (options.hasUi)\n packageNames.push('@h-ai/ui')\n if (options.featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (options.featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (options.featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (options.featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (options.featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (options.featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (options.featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (options.featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (options.featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (options.featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n if (options.isCapacitorApp && !options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.isCapacitorApp && !options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n}\n\nfunction buildFullstackCatalogPackages(frontends: readonly FrontendTarget[], deploy = false): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n ...FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SERV_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES,\n ]\n\n if (frontends.includes('web'))\n packageNames.push(...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('app'))\n packageNames.push(...FULLSTACK_APP_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('desktop'))\n packageNames.push(...FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES)\n if (deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n */\nexport interface TemplateContext {\n /** 所有应用模板共用的第三方依赖版本,避免单包与 workspace 版本表漂移。 */\n versions: typeof VERSIONS\n /** 项目名称 */\n projectName: string\n /** 是否对 @h-ai/* 依赖启用 pnpm catalog 协议 */\n useCatalogProtocol: boolean\n /** @h-ai/* 依赖写入 package.json 时使用的版本说明符 */\n haiPackageSpecifier: string\n /** 生成项目时引用的 @h-ai/* 发布版本 */\n haiPackageVersion: string\n /** 生成项目时写入 pnpm-workspace.yaml 的 catalog 条目 */\n haiCatalogPackages: Record<string, string>\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 创建时指定的模块配置;配置模板需保留这些值。 */\n moduleConfigs?: ModuleConfigs\n /** 是否有 UI(非 api / fullstack 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api / fullstack 类型) */\n hasI18n: boolean\n /** 是否为 Capacitor 原生移动应用(mobile-app) */\n isCapacitorApp: boolean\n /** 是否为 API workspace(service + contract) */\n isApiWorkspace: boolean\n /** 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 */\n isSvelteOnlyApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\n /** API workspace 专用上下文 */\n api?: ApiWorkspaceTemplateContext\n /** 前后端分离工程专用上下文 */\n fullstack?: FullstackTemplateContext\n}\n\nexport interface ApiWorkspaceTemplateContext {\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servicePackageName: string\n /** Service App 工厂函数名 */\n serviceAppFactoryName: string\n /** procedures 聚合函数名 */\n serviceProceduresFactoryName: string\n}\n\nexport interface FullstackFrontendApp {\n /** 前端目标 */\n target: ImplementedFrontendTarget\n /** 包名 */\n packageName: string\n /** 展示名称 */\n label: string\n /** 本地端口 */\n port: number\n}\n\n/**\n * 国际化配置(已解析后的最终值)\n */\nexport interface FullstackI18nContext {\n baseLocale: string\n locales: readonly string[]\n}\n\n/**\n * 主题配置(已解析后的最终值)\n */\nexport interface FullstackThemeContext {\n defaultTheme: string\n themes: readonly string[]\n}\n\nexport interface FullstackTemplateContext {\n /** 显示名称来自 core 配置。 */\n appName: string\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** 原生壳 appId / bundle identifier 使用的安全短名 */\n nativeAppIdSegment: string\n /** 前端共享代码包名 */\n sharedPackageName: string\n /** 所有已选择前端 */\n selectedFrontends: readonly FrontendTarget[]\n /** 已选择前端 JSON 字面量 */\n selectedFrontendsJson: string\n /** 可运行前端应用 */\n frontendApps: readonly FullstackFrontendApp[]\n /** Playwright 默认验证前端 */\n e2eFrontend?: FullstackFrontendApp\n /** 前端选择布尔表,用于模板条件创建 */\n frontends: Record<FrontendTarget, boolean>\n /** 各前端端口(key 为 target) */\n ports: Record<ImplementedFrontendTarget, number>\n /** 是否选择小程序预留 */\n hasMiniapp: boolean\n /** i18n 配置 */\n i18n: FullstackI18nContext\n /** 主题配置 */\n theme: FullstackThemeContext\n}\n\n/**\n * feature 对应的路由目录映射\n *\n * 每个 feature 可以有:\n * - `routes-shared/` — 所有应用类型共用(如 API 端点)\n * - `routes-{appType}/` — 特定应用类型专用(如 UI 页面)\n * - `routes/` — 通用路由(任何类型都拷贝)\n */\nconst FEATURE_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['routes-shared'],\n storage: ['routes'],\n ai: ['routes'],\n payment: ['routes'],\n vecdb: ['routes'],\n datapipe: ['routes'],\n reach: ['routes'],\n scheduler: ['routes'],\n audit: ['routes'],\n}\n\n/**\n * feature 的 appType 专用路由\n */\nconst FEATURE_APP_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['admin', 'h5', 'website'],\n}\n\nconst FEATURE_ID_REGEX = /^[a-z0-9-]+$/\nconst HBS_SUFFIX_REGEX = /\\.hbs$/\nconst FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX = /^apps\\/\\{\\{projectName\\}\\}-(web|app|desktop|miniapp)\\//\nconst NON_IDENTIFIER_CHAR_REGEX = /[^a-z0-9]+/i\nconst IDENTIFIER_START_REGEX = /^[a-z_$]/i\n\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-template-engine.js → ../templates\n * - 测试时:src/commands/cli-template-engine.ts → ../../templates\n */\nfunction getTemplatesRoot(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n // 优先尝试 dist 模式(../templates),再尝试 src 模式(../../templates)\n const distPath = path.resolve(currentDir, '..', 'templates')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates')\n}\n\n// =============================================================================\n// 拷贝工具\n// =============================================================================\n\n/**\n * 拷贝目录,自动跳过 .hbs 文件(这些由 renderDynamicFiles 处理)\n *\n * @param src - 源目录\n * @param dest - 目标目录\n * @param excludePaths - 需要排除的相对路径前缀(如 'messages')\n */\nasync function copyStaticDir(src: string, dest: string, excludePaths?: string[]): Promise<void> {\n if (!(await fse.pathExists(src))) {\n return\n }\n\n await fse.copy(src, dest, {\n overwrite: true,\n filter: (filePath: string) => {\n const rel = path.relative(src, filePath)\n // 含 Handlebars 占位符的路径必须走动态渲染,避免复制出字面量目录\n if (rel.includes('{{') || rel.includes('}}')) {\n return false\n }\n // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n return !excludePaths.some(p => rel === p || rel.startsWith(`${p}${path.sep}`))\n }\n return true\n },\n })\n}\n\n/**\n * 查找目录中所有 .hbs 文件并返回相对路径\n */\nasync function findHbsFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n }\n else if (entry.name.endsWith('.hbs')) {\n results.push(path.relative(dir, fullPath))\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n/**\n * 查找位于动态路径中的静态资源。\n *\n * 普通静态文件已经由 copyStaticDir 复制;这里专门补上带 Handlebars 路径片段\n * 的资源,例如 fullstack Tauri 图标目录。\n */\nasync function findRenderedStaticPathFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n continue\n }\n\n const relPath = path.relative(dir, fullPath)\n if (!entry.name.endsWith('.hbs') && (relPath.includes('{{') || relPath.includes('}}'))) {\n results.push(relPath)\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n// =============================================================================\n// 构建上下文\n// =============================================================================\n\n/**\n * 根据用户选项构建模板渲染上下文\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\n frontends?: readonly FrontendTarget[]\n moduleConfigs?: ModuleConfigs\n packageManager: string\n deploy?: boolean\n}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = true\n }\n featureMap.deploy = options.deploy !== false\n\n // fullstack 默认交付完整 mini 管理功能,不能移除其必需模块。\n if (options.appType === 'fullstack') {\n for (const feature of ['iam', 'db', 'cache', 'crypto', 'storage', 'audit']) featureMap[feature] = true\n }\n\n // 强制补全模块硬依赖,防止调用方未经过 resolveFeatureDependencies 时遗漏依赖\n // iam 依赖 reldb(用户/角色/权限持久化)和 cache(会话/OTP 缓存),以及 crypto(密码哈希)\n if (featureMap.iam) {\n featureMap.db = true\n featureMap.cache = true\n featureMap.crypto = true\n }\n // audit / scheduler / payment 依赖 reldb\n if (featureMap.audit || featureMap.scheduler || featureMap.payment) {\n featureMap.db = true\n }\n\n const isApi = options.appType === 'api'\n const isFullstack = options.appType === 'fullstack'\n const isCapacitorApp = options.appType === 'mobile-app'\n const isSvelteOnlyApp = isCapacitorApp\n const useCatalogProtocol = options.packageManager === 'pnpm'\n const hasUi = !isApi && !isFullstack\n const selectedFrontends = options.frontends ?? DEFAULT_FULLSTACK_FRONTENDS\n let haiCatalogPackages: TemplateContext['haiCatalogPackages']\n if (isFullstack) {\n haiCatalogPackages = buildFullstackCatalogPackages(selectedFrontends, featureMap.deploy)\n }\n else if (isApi) {\n haiCatalogPackages = buildApiWorkspaceCatalogPackages(featureMap)\n }\n else {\n haiCatalogPackages = buildAppHaiCatalogPackages({\n featureMap,\n hasUi,\n isCapacitorApp,\n isSvelteOnlyApp,\n })\n }\n\n return {\n projectName: options.name,\n versions: VERSIONS,\n useCatalogProtocol,\n haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,\n haiPackageVersion: HAI_PACKAGE_VERSION,\n haiCatalogPackages,\n appType: options.appType,\n features: featureMap,\n moduleConfigs: options.moduleConfigs,\n hasUi,\n hasI18n: !isApi && !isFullstack,\n isCapacitorApp,\n isApiWorkspace: isApi,\n isSvelteOnlyApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n api: isApi\n ? buildApiWorkspaceTemplateContext(options.name, useCatalogProtocol)\n : undefined,\n fullstack: isFullstack\n ? buildFullstackTemplateContext(\n options.name,\n selectedFrontends,\n options.moduleConfigs,\n useCatalogProtocol,\n )\n : undefined,\n }\n}\n\nfunction buildApiWorkspaceTemplateContext(\n projectName: string,\n useCatalogProtocol = false,\n): ApiWorkspaceTemplateContext {\n const identifier = toIdentifier(projectName)\n const pascalName = toPascalIdentifier(identifier)\n\n return {\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${identifier}Contract`,\n servicePackageName: `${projectName}-service`,\n serviceAppFactoryName: `create${pascalName}App`,\n serviceProceduresFactoryName: `create${pascalName}Procedures`,\n }\n}\n\nfunction buildFullstackTemplateContext(\n projectName: string,\n frontendsInput: readonly FrontendTarget[],\n moduleConfigs?: ModuleConfigs,\n useCatalogProtocol = false,\n): FullstackTemplateContext {\n const selectedFrontends = [...new Set(frontendsInput.length > 0 ? frontendsInput : DEFAULT_FULLSTACK_FRONTENDS)]\n\n const portsConfig = moduleConfigs?.fullstack?.ports ?? {}\n const portFor = (target: ImplementedFrontendTarget): number =>\n portsConfig[target] ?? FRONTEND_PORTS_DEFAULT[target]\n\n const frontendApps = selectedFrontends\n .filter(isImplementedFrontend)\n .map(target => ({\n target,\n packageName: `${projectName}-${target}`,\n label: FRONTEND_LABELS[target],\n port: portFor(target),\n }))\n\n return {\n appName: moduleConfigs?.core?.name ?? projectName,\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${toIdentifier(projectName)}Contract`,\n servPackageName: `${projectName}-serv`,\n nativeAppIdSegment: toIdentifier(projectName).toLowerCase(),\n sharedPackageName: `${projectName}-shared`,\n selectedFrontends,\n selectedFrontendsJson: `[${selectedFrontends.map(f => `'${f}'`).join(', ')}]`,\n frontendApps,\n e2eFrontend: frontendApps[0],\n frontends: {\n web: selectedFrontends.includes('web'),\n app: selectedFrontends.includes('app'),\n miniapp: selectedFrontends.includes('miniapp'),\n desktop: selectedFrontends.includes('desktop'),\n },\n ports: {\n web: portFor('web'),\n app: portFor('app'),\n desktop: portFor('desktop'),\n },\n hasMiniapp: selectedFrontends.includes('miniapp'),\n i18n: resolveI18nContext(moduleConfigs),\n theme: resolveThemeContext(moduleConfigs),\n }\n}\n\nfunction resolveI18nContext(moduleConfigs?: ModuleConfigs): FullstackI18nContext {\n const coreLocale = moduleConfigs?.core?.defaultLocale ?? 'zh-CN'\n const baseLocale = moduleConfigs?.fullstack?.i18n?.baseLocale ?? coreLocale\n const fallbackLocale = baseLocale === 'en-US' ? 'zh-CN' : 'en-US'\n const requested = moduleConfigs?.fullstack?.i18n?.locales\n const locales = requested && requested.length > 0\n ? [...new Set(requested)]\n : [baseLocale, fallbackLocale]\n if (!locales.includes(baseLocale)) {\n locales.unshift(baseLocale)\n }\n return { baseLocale, locales }\n}\n\nfunction resolveThemeContext(moduleConfigs?: ModuleConfigs): FullstackThemeContext {\n const defaultTheme = moduleConfigs?.fullstack?.theme?.defaultTheme ?? DEFAULT_THEME_NAME\n const requested = moduleConfigs?.fullstack?.theme?.themes\n const themes = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...DEFAULT_THEMES]\n if (!themes.includes(defaultTheme)) {\n themes.unshift(defaultTheme)\n }\n return { defaultTheme, themes }\n}\n\nfunction isImplementedFrontend(target: FrontendTarget): target is ImplementedFrontendTarget {\n return IMPLEMENTED_FRONTENDS.includes(target)\n}\n\nfunction toIdentifier(value: string): string {\n const words = value\n .split(NON_IDENTIFIER_CHAR_REGEX)\n .filter(Boolean)\n const camel = words\n .map((word, index) => {\n const normalized = word.toLowerCase()\n return index === 0\n ? normalized\n : `${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}`\n })\n .join('')\n if (!camel)\n return 'app'\n return IDENTIFIER_START_REGEX.test(camel) ? camel : `app${camel}`\n}\n\nfunction toPascalIdentifier(value: string): string {\n if (!value)\n return 'App'\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`\n}\n\n// =============================================================================\n// 核心:生成项目\n// =============================================================================\n\n/**\n * 从模板生成项目\n *\n * 执行流程:\n * 1. 拷贝 base 静态文件\n * 2. 拷贝 apps/{appType} 路由\n * 3. 叠加选中 feature 的路由\n * 4. 渲染所有 .hbs 动态模板\n *\n * @param projectPath - 项目目标目录\n * @param context - 模板渲染上下文\n */\nexport async function generateFromTemplates(\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n const root = getTemplatesRoot()\n const includeBaseTemplate = context.appType !== 'fullstack' && !context.isApiWorkspace\n\n // ─── ① 拷贝 base 骨架(静态文件) ───\n if (includeBaseTemplate) {\n await copyStaticDir(path.join(root, 'base'), projectPath)\n }\n else {\n // API/fullstack 自有骨架,质量门禁仍复用单包模板的同一份规则。\n await fse.copy(path.join(root, 'base', 'eslint-rules.js'), path.join(projectPath, 'eslint-rules.js'))\n }\n\n // ─── ② 拷贝 apps/{appType} 路由 ───\n // messages/ 目录仅在 hasI18n 时拷贝\n const appDir = path.join(root, 'apps', context.appType)\n if (await fse.pathExists(appDir)) {\n const appExcludes = context.hasI18n ? [] : ['messages']\n await copyStaticDir(appDir, projectPath, appExcludes)\n }\n\n // ─── ③ 叠加 feature 路由 ───\n if (!context.isApiWorkspace && context.appType !== 'fullstack') {\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!FEATURE_ID_REGEX.test(featureId)) {\n continue\n }\n\n const featureDir = path.join(root, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes/)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n const routesSrc = path.join(featureDir, dirName)\n if (await fse.pathExists(routesSrc)) {\n await copyStaticDir(routesSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n const appRouteSrc = path.join(featureDir, `routes-${context.appType}`)\n if (await fse.pathExists(appRouteSrc)) {\n await copyStaticDir(appRouteSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n }\n }\n\n // ─── ④ 渲染 .hbs 动态模板 ───\n await renderDynamicFiles(root, projectPath, context)\n\n // 多包模板不继承 base;所有应用统一复制同一份 E2E 清理入口。\n await fse.copy(path.join(root, 'shared', 'run-e2e.mjs'), path.join(projectPath, 'scripts', 'run-e2e.mjs'))\n await fse.ensureDir(path.join(projectPath, 'images', 'dependencies'))\n await fse.writeFile(path.join(projectPath, 'images', 'dependencies', '.gitkeep'), '')\n await fse.copy(path.join(root, 'shared', '.gitattributes'), path.join(projectPath, '.gitattributes'))\n if (context.isSvelteOnlyApp) {\n await fse.copy(path.join(root, 'shared', 'vite-runtime-config.ts'), path.join(projectPath, 'scripts', 'vite-runtime-config.ts'))\n await fse.copy(path.join(root, 'shared', 'container-runtime-config.sh'), path.join(projectPath, 'images', 'web', '19-runtime-config.sh'))\n }\n\n if (context.isSvelteOnlyApp || context.appType === 'fullstack') {\n const navigationDir = context.appType === 'fullstack'\n ? path.join(projectPath, 'packages', `${context.projectName}-shared`, 'src', 'lib', 'navigation')\n : path.join(projectPath, 'src', 'lib', 'navigation')\n await fse.copy(path.join(root, 'shared', 'hash-router.svelte.ts'), path.join(navigationDir, 'hash-router.svelte.ts'))\n }\n\n // ─── ⑤ 拷贝 i18n 脚手架(project.inlang + messages) ───\n if (context.hasI18n) {\n const i18nDir = path.join(root, 'i18n')\n if (await fse.pathExists(i18nDir)) {\n await fse.copy(i18nDir, projectPath, { overwrite: true })\n }\n }\n\n // ─── ⑥ 确保 static 目录存在 ───\n if (includeBaseTemplate) {\n await fse.ensureDir(path.join(projectPath, 'static'))\n }\n}\n\n// =============================================================================\n// 动态模板渲染\n// =============================================================================\n\n/**\n * 渲染所有 .hbs 文件:base、apps/{appType}、以及选中 feature 的路由目录\n *\n * base / apps 的 .hbs 渲染后输出到 projectPath 根目录;\n * feature 的 .hbs 渲染后输出到 projectPath/src/routes/。\n */\nasync function renderDynamicFiles(\n templatesRoot: string,\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n // ── base + apps/{appType} → 输出到项目根 ──\n const rootDirs = context.appType === 'fullstack' || context.isApiWorkspace\n ? [path.join(templatesRoot, 'apps', context.appType)]\n : [\n path.join(templatesRoot, 'base'),\n path.join(templatesRoot, 'apps', context.appType),\n ]\n\n for (const dir of rootDirs) {\n await renderHbsInDir(dir, projectPath, context)\n await copyRenderedStaticPathFiles(dir, projectPath, context)\n }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n if (context.isApiWorkspace || context.appType === 'fullstack') {\n return\n }\n\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n const featureDir = path.join(templatesRoot, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes-shared / routes 等)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n await renderHbsInDir(path.join(featureDir, dirName), routesDest, context)\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n await renderHbsInDir(\n path.join(featureDir, `routes-${context.appType}`),\n routesDest,\n context,\n )\n }\n }\n}\n\n/**\n * 渲染指定目录下所有 .hbs 文件并输出到目标目录(去掉 .hbs 后缀)\n */\nasync function renderHbsInDir(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const hbsFiles = await findHbsFiles(dir)\n for (const relPath of hbsFiles) {\n const srcPath = path.join(dir, relPath)\n const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, '')\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n if (shouldSkipRenderedFile(template, rendered)) {\n continue\n }\n\n const outRelPath = renderOutputPath(outRelPathTemplate, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n // Capacitor SPA 跳过服务端专属文件(hooks / server init)\n if (context.isCapacitorApp && CAPACITOR_SKIPPED_SERVER_FILES.has(outRelPath.split(path.sep).join('/'))) {\n continue\n }\n\n const destPath = path.join(destRoot, outRelPath)\n const configMatch = /(?:^|[/\\\\])config[/\\\\]_([^/\\\\]+)\\.ya?ml$/.exec(outRelPath)\n const normalizedRendered = normalizeRenderedContent(configMatch ? parameterizeConfig(configMatch[1], rendered) : rendered, outRelPath)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, normalizedRendered, 'utf-8')\n }\n}\n\nasync function copyRenderedStaticPathFiles(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const staticFiles = await findRenderedStaticPathFiles(dir)\n for (const relPath of staticFiles) {\n if (!shouldCopyRenderedStaticPathFile(relPath, context)) {\n continue\n }\n\n const outRelPath = renderOutputPath(relPath, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n const srcPath = path.join(dir, relPath)\n const destPath = path.join(destRoot, outRelPath)\n await fse.ensureDir(path.dirname(destPath))\n await fse.copyFile(srcPath, destPath)\n }\n}\n\nfunction shouldCopyRenderedStaticPathFile(relPath: string, context: TemplateContext): boolean {\n if (context.appType !== 'fullstack' || !context.fullstack) {\n return true\n }\n\n const normalizedPath = relPath.split(path.sep).join('/')\n const frontendMatch = FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX.exec(normalizedPath)\n if (!frontendMatch) {\n return true\n }\n\n const target = frontendMatch[1] as FrontendTarget\n return Boolean(context.fullstack.frontends[target])\n}\n\nfunction normalizeRenderedContent(content: string, outRelPath: string): string {\n const normalizedLineEndings = content.replace(/\\r\\n/g, '\\n')\n const ext = path.extname(outRelPath)\n const normalized = NORMALIZED_RENDER_EXTENSIONS.has(ext)\n ? normalizedLineEndings.replace(/\\n{3,}/g, '\\n\\n')\n : normalizedLineEndings\n if (normalized.trim().length === 0) {\n return ''\n }\n return normalized.endsWith('\\n') ? normalized : `${normalized}\\n`\n}\n\nfunction shouldSkipRenderedFile(template: string, rendered: string): boolean {\n return template.includes(TEMPLATE_SKIP_IF_EMPTY_MARKER) && rendered.trim().length === 0\n}\n\nfunction renderOutputPath(pathTemplate: string, context: TemplateContext): string {\n const normalizedTemplate = pathTemplate.split(path.sep).join('/')\n return Handlebars.compile(normalizedTemplate, { noEscape: true })(context)\n}\n\nfunction isSafeRelativePath(relativePath: string): boolean {\n const normalized = path.normalize(relativePath)\n return !path.isAbsolute(normalized) && normalized !== '..' && !normalized.startsWith(`..${path.sep}`)\n}\n","/**\n * @h-ai/cli — 项目创建命令\n *\n * 基于模板的交互式项目创建:\n * 1. 交互式收集选项(appType / features / moduleConfigs)\n * 2. 拷贝 base 骨架 + appType 路由 + feature 路由\n * 3. 渲染动态模板(init.ts / hooks.server.ts / package.json)\n * 4. 生成配置文件、.env、Skill 文件\n *\n * @module cli-create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, FrontendTarget, ModuleConfigs, ProjectInfo } from '../cli-types.js'\nimport type { ConfigEnvironmentVariable } from './cli-config-environment.js'\nimport { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport path from 'node:path'\nimport process from 'node:process'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, formatPromptDescription, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { renderEnvironment, runtimeEnvironmentVariables } from './cli-config-environment.js'\nimport { buildTemplateContext, generateFromTemplates } from './cli-template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\n\n/** Git 远程地址校验 */\nconst RE_HTTPS_URL = /^https:\\/\\/.+/\nconst RE_GIT_SSH_URL = /^git@.+:.+/\n\n/**\n * 应用类型定义\n */\nconst APP_TYPES: Record<AppType, { name: string, description: string, defaultFeatures: FeatureId[] }> = {\n 'admin': {\n name: '管理后台',\n description: '企业级管理系统,含 IAM、数据库、完整 UI',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto'],\n },\n 'website': {\n name: '企业官网',\n description: 'SSR/SSG 企业官网,SEO 友好、响应式布局',\n defaultFeatures: ['db', 'cache'],\n },\n 'h5': {\n name: 'H5 应用',\n description: '移动端 H5 应用,触摸优化、PWA 支持',\n defaultFeatures: ['db', 'cache'],\n },\n 'api': {\n name: 'API 服务',\n description: 'typed API workspace,含 contract + service 双工程、无 UI',\n defaultFeatures: ['db', 'cache'],\n },\n 'mobile-app': {\n name: '移动应用',\n description: '移动端应用(Capacitor + Svelte 5 + Vite),可打包为 Android/iOS',\n defaultFeatures: ['api-client', 'capacitor'],\n },\n 'fullstack': {\n name: '前后端分离工程',\n description: '多端 mini 管理系统,包含用户、角色、审计、个人设置与双向传输加密',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto', 'storage', 'audit'],\n },\n}\n\nconst FRONTEND_TARGETS: Record<FrontendTarget, { name: string, description: string, implemented: boolean }> = {\n web: { name: 'Web', description: '浏览器 Web 应用', implemented: true },\n app: { name: 'App', description: '移动端 Capacitor App / H5 前端', implemented: true },\n miniapp: { name: '小程序', description: '预留目标,当前只生成说明占位', implemented: false },\n desktop: { name: '桌面端', description: 'Tauri 桌面端前端工程', implemented: true },\n}\n\nconst DEFAULT_FULLSTACK_FRONTENDS: FrontendTarget[] = ['web', 'app', 'desktop']\n\n// =============================================================================\n// 功能定义\n// =============================================================================\n\n/**\n * 功能定义\n */\nconst FEATURES: Record<string, FeatureDefinition> = {\n 'iam': {\n id: 'iam',\n name: '身份与访问管理',\n description: 'Session/JWT 会话管理、RBAC 权限控制',\n packages: ['@h-ai/iam'],\n dependencies: ['crypto', 'db', 'cache'],\n },\n 'db': {\n id: 'db',\n name: '数据库',\n description: '多数据库支持 (SQLite/PostgreSQL/MySQL)',\n packages: ['@h-ai/reldb'],\n },\n 'cache': {\n id: 'cache',\n name: '缓存',\n description: 'Redis / 内存缓存',\n packages: ['@h-ai/cache'],\n },\n 'ai': {\n id: 'ai',\n name: 'AI 集成',\n description: 'LLM 适配器、MCP 协议、技能系统、流式响应',\n packages: ['@h-ai/ai'],\n },\n 'storage': {\n id: 'storage',\n name: '文件存储',\n description: '本地存储、S3/OSS/COS 云存储',\n packages: ['@h-ai/storage'],\n },\n 'crypto': {\n id: 'crypto',\n name: '加密模块',\n description: '国密 SM2/SM3/SM4、Argon2 密码哈希',\n packages: ['@h-ai/crypto'],\n },\n 'audit': {\n id: 'audit',\n name: '审计日志',\n description: '操作审计、安全追踪',\n packages: ['@h-ai/audit'],\n dependencies: ['db'],\n },\n 'reach': {\n id: 'reach',\n name: '触达服务',\n description: '邮件、短信、微信等消息触达',\n packages: ['@h-ai/reach'],\n },\n 'payment': {\n id: 'payment',\n name: '统一支付',\n description: '微信支付、支付宝、Stripe 统一接入',\n packages: ['@h-ai/payment'],\n dependencies: ['db'],\n },\n 'vecdb': {\n id: 'vecdb',\n name: '向量数据库',\n description: '向量检索与相似度搜索(LanceDB / pgvector / Qdrant)',\n packages: ['@h-ai/vecdb'],\n },\n 'datapipe': {\n id: 'datapipe',\n name: '数据处理管道',\n description: '文本清洗、分块与可组合处理流水线',\n packages: ['@h-ai/datapipe'],\n },\n 'scheduler': {\n id: 'scheduler',\n name: '任务调度',\n description: 'Cron 任务注册、执行与日志追踪',\n packages: ['@h-ai/scheduler'],\n dependencies: ['db'],\n },\n 'deploy': {\n id: 'deploy',\n name: '自动化部署',\n description: '统一部署编排与多平台发布支持',\n packages: ['@h-ai/deploy'],\n },\n 'api-client': {\n id: 'api-client',\n name: 'HTTP 客户端',\n description: '统一 API 调用、错误处理与流式请求支持',\n packages: ['@h-ai/api-client'],\n },\n 'capacitor': {\n id: 'capacitor',\n name: '移动端能力',\n description: 'Capacitor 原生桥接能力(偏移动应用)',\n packages: ['@h-ai/capacitor'],\n },\n}\n\n/**\n * 可选择的功能列表\n */\nconst SELECTABLE_FEATURES: FeatureId[] = [\n 'iam',\n 'db',\n 'cache',\n 'ai',\n 'storage',\n 'crypto',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'api-client',\n 'capacitor',\n]\n\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]+$/\n\n// =============================================================================\n// 项目模板定义\n// =============================================================================\n\nconst PROJECT_TEMPLATES = {\n minimal: {\n name: 'minimal',\n description: '最小模板 — 仅核心功能',\n features: [] as FeatureId[],\n },\n default: {\n name: 'default',\n description: '标准模板 — IAM + 数据库 + 缓存',\n features: ['iam', 'db', 'cache', 'crypto'] as FeatureId[],\n },\n full: {\n name: 'full',\n description: '完整模板 — 所有功能',\n features: [\n 'iam',\n 'db',\n 'cache',\n 'crypto',\n 'ai',\n 'storage',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'deploy',\n 'api-client',\n 'capacitor',\n ] as FeatureId[],\n },\n custom: {\n name: 'custom',\n description: '自定义 — 选择需要的功能',\n features: [] as FeatureId[],\n },\n}\n\n// =============================================================================\n// 创建项目(主入口)\n// =============================================================================\n\n/**\n * 创建项目\n */\nexport async function createProject(options: CreateProjectOptions): Promise<void> {\n const spinner = ora()\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveOptions(options)\n\n // 安全校验:项目名必须仅含小写字母、数字和连字符,防止路径遍历\n if (!PROJECT_NAME_REGEX.test(resolvedOptions.name)) {\n writeCliError(chalk.red(`项目名称不合法: \"${resolvedOptions.name}\",只能包含小写字母、数字和连字符`))\n return\n }\n\n const projectPath = path.resolve(resolvedOptions.cwd ?? '.', resolvedOptions.name)\n\n // 检查目录是否存在\n if (await fileExists(projectPath)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `目录 ${resolvedOptions.name} 已存在,是否覆盖?`,\n initial: false,\n })\n\n if (!overwrite) {\n writeCliMessage(chalk.yellow('已取消'))\n return\n }\n\n await fse.remove(projectPath)\n }\n\n spinner.start('创建项目目录...')\n await fse.ensureDir(projectPath)\n spinner.succeed()\n\n // ─── 基于模板生成项目文件 ───\n spinner.start('生成项目文件...')\n\n const context = buildTemplateContext({\n name: resolvedOptions.name,\n appType: resolvedOptions.appType,\n features: resolvedOptions.features,\n deploy: resolvedOptions.deploy,\n frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n {\n // 生成配置文件(config/*.yml)\n const { generateConfigFile, generateEnvExample } = await import('./cli-config-templates.js')\n const configs = resolvedOptions.moduleConfigs\n const isApiWorkspace = resolvedOptions.appType === 'api'\n const isFullstack = resolvedOptions.appType === 'fullstack'\n const configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, 'config')\n : isFullstack\n ? path.join(projectPath, 'packages', `${resolvedOptions.name}-serv`, 'config')\n : path.join(projectPath, 'config')\n const envExamplePath = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, '.env.example')\n : path.join(projectPath, '.env.example')\n\n for (const featureId of resolvedOptions.features) {\n const configKey = getFeatureConfigKey(featureId)\n if (configKey) {\n const configPath = path.join(configDir, `_${configKey}.yml`)\n // fullstack 已用模块配置 helper 渲染完整配置,不能再覆盖 Reach 模板等应用默认值。\n if (isFullstack && await fse.pathExists(configPath))\n continue\n await writeFile(configPath, generateConfigFile(configKey, configs))\n }\n }\n\n if (!isApiWorkspace && !isFullstack) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n }\n\n const configContents: Record<string, string> = {}\n for (const file of await fse.readdir(configDir)) {\n if (/^_.*\\.yml$/.test(file))\n configContents[file.slice(1, -4)] = await fse.readFile(path.join(configDir, file), 'utf8')\n }\n const envFeatures: FeatureId[] = resolvedOptions.features\n const envContents = generateEnvExample(envFeatures, configs, isFullstack, configContents)\n let envExample = isApiWorkspace\n ? envContents\n : isFullstack\n ? `${envContents}\\n# First-start administrator password; must satisfy the IAM password policy.\\nHAI_ADMIN_DEFAULT_PASSWORD=\\n\\n# Public API origin; never include credentials.\\nPUBLIC_API_BASE=http://127.0.0.1:3000\\n`\n : context.isSvelteOnlyApp\n ? `${envContents}\\n# Public API URL including /api/v1; never include credentials.\\nPUBLIC_API_BASE=http://10.0.2.2:3000/api/v1\\n`\n : envContents\n\n const runtimeVariables = new Map<string, ConfigEnvironmentVariable>()\n for (const file of await fse.readdir(projectPath, { recursive: true, encoding: 'utf8' })) {\n if (!/\\.(?:ts|js|mjs|svelte|envsh)$/.test(file))\n continue\n for (const variable of runtimeEnvironmentVariables(await fse.readFile(path.join(projectPath, file), 'utf8')))\n runtimeVariables.set(variable.name, variable)\n }\n const existingNames = new Set([...envExample.matchAll(/^(?:#\\s*)?([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const runtimeExample = renderEnvironment([...runtimeVariables.values()].filter(variable => !existingNames.has(variable.name)))\n if (runtimeExample)\n envExample += `\\n# 可选运行入口(按用途注入,不进入公共默认值):\\n${runtimeExample.split('\\n').map(line => line && !line.startsWith('#') ? `# ${line}` : line).join('\\n')}\\n`\n\n await writeFile(envExamplePath, envExample)\n const envDirectory = path.dirname(envExamplePath)\n const sharedVariables = envExample.split('\\n').filter(line => /^[A-Z][A-Z0-9_]*=/.test(line))\n await writeFile(path.join(envDirectory, '.env'), `# 公共基础配置(可提交);完整字段说明见 .env.example。\\n${sharedVariables.join('\\n')}\\n`)\n for (const [mode, environment] of [['dev', 'development'], ['test', 'test'], ['prod', 'production']] as const) {\n await writeFile(path.join(envDirectory, `.env.${mode}`), `# 公共 ${mode} 环境配置;本机私有值放 .env.local,进程环境变量优先。\\nHAI_CORE_ENV=${environment}\\nHAI_CORE_DEBUG=false\\nHAI_CORE_LOGGING_LEVEL=${mode === 'test' ? 'warn' : mode === 'dev' ? 'debug' : 'info'}\\n`)\n }\n if (isFullstack) {\n // 每个项目使用独立随机密码,保证四类字符;真实凭据只写入被忽略的本地文件。\n const password = `Aa1!${randomBytes(24).toString('base64url')}`\n await fse.writeFile(path.join(projectPath, '.env.local'), `# 本机私有配置,不提交 Git。\\nHAI_ADMIN_DEFAULT_PASSWORD=${password}\\n`, { mode: 0o600 })\n }\n else {\n await writeFile(path.join(envDirectory, '.env.local'), '# 本机私有配置,不提交 Git;覆盖公共基础和环境配置。\\n')\n }\n }\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./cli-skill-templates.js')\n await generateSkillFiles(\n projectPath,\n resolvedOptions.features,\n resolvedOptions.appType,\n resolvedOptions.name,\n )\n\n // 生成 README\n const appTypeLabel = APP_TYPES[resolvedOptions.appType].name\n const readmeContent = resolvedOptions.appType === 'fullstack'\n ? generateFullstackReadme(resolvedOptions.name, resolvedOptions.packageManager!, resolvedOptions.frontends)\n : resolvedOptions.appType === 'api'\n ? generateApiWorkspaceReadme(resolvedOptions.name, resolvedOptions.packageManager!)\n : generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!, resolvedOptions.appType)\n await writeFile(\n path.join(projectPath, 'README.md'),\n resolvedOptions.deploy === false\n ? readmeContent.replace(/### 构建与部署[\\s\\S]*?(?=\\n#{2,3} |$)/, '### 构建\\n\\npnpm build\\npnpm build --target docker\\n\\n本项目创建时关闭了部署工具。\\n')\n : readmeContent,\n )\n\n spinner.succeed()\n\n // 初始化 Git\n if (resolvedOptions.git) {\n spinner.start('初始化 Git 仓库...')\n execSync('git init', { cwd: projectPath, stdio: 'ignore' })\n if (resolvedOptions.gitRemote) {\n // 使用 execFileSync + 数组参数,避免 shell 注入\n // 同时在非交互模式下补充校验(交互模式在 prompts.validate 中已校验)\n const gitRemote = resolvedOptions.gitRemote\n if (!RE_HTTPS_URL.test(gitRemote) && !RE_GIT_SSH_URL.test(gitRemote)) {\n spinner.fail()\n throw new Error(`Invalid gitRemote URL: ${gitRemote}`)\n }\n execFileSync('git', ['remote', 'add', 'origin', gitRemote], { cwd: projectPath, stdio: 'ignore' })\n }\n spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(`安装依赖 (${resolvedOptions.packageManager})...`)\n installDependencies(projectPath, resolvedOptions.packageManager!)\n spinner.succeed()\n }\n\n // 完成提示\n printCompletionMessage(resolvedOptions)\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_createFailed')), error)\n throw error\n }\n}\n\n// =============================================================================\n// 交互式选项解析\n// =============================================================================\n\n/**\n * 解析选项(交互式)\n */\nasync function resolveOptions(options: CreateProjectOptions): Promise<Required<CreateProjectOptions>> {\n const useDefaults = options.yes ?? false\n\n writeCliMessage('')\n writeCliMessage(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n writeCliMessage(chalk.gray(' AI-Native · Configuration-Driven · Security-First'))\n writeCliMessage('')\n\n const onCancel = () => {\n writeCliMessage(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n // 项目名称(逐条询问,避免 prompts 数组模式在 Windows 终端重复渲染)\n let projectName = options.name\n if (!projectName && useDefaults) {\n projectName = 'my-app'\n }\n else if (!projectName) {\n const { name } = await prompts({\n type: 'text',\n name: 'name',\n message: '项目名称:',\n initial: 'my-app',\n validate: (value: string) => {\n if (!value.trim())\n return '项目名称不能为空'\n if (!PROJECT_NAME_REGEX.test(value))\n return '项目名称只能包含小写字母、数字和连字符'\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n if (!resolvedAppType && useDefaults) {\n resolvedAppType = 'admin'\n }\n else if (!resolvedAppType) {\n const { appType } = await prompts({\n type: 'select',\n name: 'appType',\n message: '应用类型:',\n hint: cliM('cli_selectHint'),\n choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: key,\n })),\n initial: 0,\n }, { onCancel })\n resolvedAppType = appType\n }\n\n const selectedAppType = (resolvedAppType || 'admin') as AppType\n\n const selectedFrontends = selectedAppType === 'fullstack'\n ? await resolveFrontendTargets(options.frontends, useDefaults, onCancel)\n : []\n\n // 模板选择\n let selectedTemplate = options.template\n if (selectedAppType === 'fullstack') {\n selectedTemplate = selectedTemplate ?? 'custom'\n }\n else if (!selectedTemplate) {\n if (useDefaults) {\n selectedTemplate = 'default'\n }\n else {\n const { template } = await prompts({\n type: 'select',\n name: 'template',\n message: '选择模板:',\n hint: cliM('cli_selectHint'),\n choices: Object.values(PROJECT_TEMPLATES).map(t => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: t.name,\n })),\n initial: 1,\n }, { onCancel })\n selectedTemplate = template\n }\n }\n\n // 功能选择\n let selectedFeatures: FeatureId[] = []\n const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures\n\n if (selectedAppType === 'fullstack') {\n selectedFeatures = resolveFeatureDependencies(appTypeDefaults)\n }\n else if (selectedTemplate === 'custom' && !options.features && useDefaults) {\n selectedFeatures = resolveFeatureDependencies(appTypeDefaults)\n }\n else if (selectedTemplate === 'custom' && !options.features) {\n const featureChoices = SELECTABLE_FEATURES.map(id => ({\n title: FEATURES[id].name,\n description: formatPromptDescription(FEATURES[id].description),\n value: id,\n selected: appTypeDefaults.includes(id),\n }))\n\n const { features } = await prompts({\n type: 'multiselect',\n name: 'features',\n message: cliM('cli_featuresPrompt'),\n choices: featureChoices,\n hint: cliM('cli_multiselectHint'),\n instructions: false,\n }, { onCancel })\n\n selectedFeatures = features || []\n selectedFeatures = resolveFeatureDependencies(selectedFeatures)\n }\n else if (selectedTemplate === 'custom' && options.features) {\n selectedFeatures = resolveFeatureDependencies(options.features)\n }\n else {\n const templateFeatures = PROJECT_TEMPLATES[selectedTemplate as keyof typeof PROJECT_TEMPLATES]?.features || []\n const merged = new Set([...templateFeatures, ...appTypeDefaults])\n selectedFeatures = resolveFeatureDependencies(Array.from(merged))\n }\n\n selectedFeatures = selectedFeatures.filter(feature => feature !== 'deploy')\n if (options.deploy !== false)\n selectedFeatures.push('deploy')\n\n // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack'\n ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName!), ...options.moduleConfigs }\n : options.moduleConfigs ?? (useDefaults\n ? buildDefaultModuleConfigs(selectedFeatures, projectName!)\n : await promptModuleConfigs(selectedFeatures, projectName!))\n\n // 示例代码\n let addExamples = options.examples\n if (addExamples === undefined && useDefaults) {\n addExamples = true\n }\n else if (addExamples === undefined) {\n const { examples } = await prompts({\n type: 'confirm',\n name: 'examples',\n message: '是否添加示例代码?',\n initial: true,\n }, { onCancel })\n addExamples = examples\n }\n\n // 包管理器\n const detected = await detectPackageManager(options.cwd ?? '.')\n let packageManager = selectedAppType === 'fullstack' || selectedAppType === 'api'\n ? 'pnpm'\n : options.packageManager\n if (!packageManager && useDefaults) {\n packageManager = detected\n }\n if (!packageManager) {\n const { pm } = await prompts({\n type: 'select',\n name: 'pm',\n message: '包管理器:',\n choices: [\n { title: 'pnpm (推荐)', value: 'pnpm' },\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n ],\n initial: detected === 'pnpm' ? 0 : detected === 'npm' ? 1 : 2,\n }, { onCancel })\n packageManager = pm\n }\n\n // 安装依赖\n let install = options.install\n if (install === undefined && useDefaults) {\n install = true\n }\n else if (install === undefined) {\n const { doInstall } = await prompts({\n type: 'confirm',\n name: 'doInstall',\n message: '是否安装依赖?',\n initial: true,\n }, { onCancel })\n install = doInstall\n }\n\n // Git\n let git = options.git\n if (git === undefined && useDefaults) {\n git = true\n }\n else if (git === undefined) {\n const { initGit } = await prompts({\n type: 'confirm',\n name: 'initGit',\n message: '是否初始化 Git?',\n initial: true,\n }, { onCancel })\n git = initGit\n }\n\n // Git 远程仓库地址\n let gitRemote = options.gitRemote\n if (git && gitRemote === undefined && useDefaults) {\n gitRemote = ''\n }\n else if (git && gitRemote === undefined) {\n const { remote } = await prompts({\n type: 'text',\n name: 'remote',\n message: 'Git 仓库地址 (可选,回车跳过):',\n initial: '',\n validate: (value: string) => {\n if (!value.trim())\n return true\n if (RE_HTTPS_URL.test(value) || RE_GIT_SSH_URL.test(value))\n return true\n return '请输入合法的 Git 仓库地址 (https://... 或 git@...:...)'\n },\n }, { onCancel })\n gitRemote = remote?.trim() || ''\n }\n\n return {\n name: projectName!,\n appType: selectedAppType,\n frontends: selectedFrontends,\n template: (selectedTemplate ?? 'default') as 'default' | 'minimal' | 'full' | 'custom',\n features: selectedFeatures,\n deploy: options.deploy !== false,\n moduleConfigs,\n examples: addExamples ?? true,\n install: install ?? true,\n packageManager: packageManager || 'pnpm',\n git: git ?? true,\n gitRemote: gitRemote ?? '',\n yes: useDefaults,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\nfunction buildDefaultModuleConfigs(features: FeatureId[], projectName: string): ModuleConfigs {\n const configs: ModuleConfigs = {\n core: { name: projectName, defaultLocale: 'zh-CN' },\n }\n\n if (features.includes('db')) {\n configs.db = { type: 'sqlite', database: './data/app.db' }\n }\n if (features.includes('cache')) {\n configs.cache = { type: 'memory' }\n }\n if (features.includes('iam')) {\n configs.iam = { loginPassword: true, loginOtp: false }\n }\n if (features.includes('storage')) {\n configs.storage = { type: 'local', localPath: './data/uploads' }\n }\n if (features.includes('ai')) {\n configs.ai = { defaultProvider: 'openai', model: 'gpt-4o-mini' }\n }\n\n return configs\n}\n\nasync function resolveFrontendTargets(\n frontends: FrontendTarget[] | undefined,\n useDefaults: boolean,\n onCancel: () => void,\n): Promise<FrontendTarget[]> {\n if (frontends && frontends.length > 0) {\n return normalizeFrontendTargets(frontends)\n }\n if (useDefaults) {\n return DEFAULT_FULLSTACK_FRONTENDS\n }\n\n const { selectedFrontends } = await prompts({\n type: 'multiselect',\n name: 'selectedFrontends',\n message: cliM('cli_frontendsPrompt'),\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: target.name,\n description: formatPromptDescription(target.description),\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n hint: cliM('cli_multiselectHint'),\n instructions: false,\n }, { onCancel })\n\n return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS)\n}\n\nfunction normalizeFrontendTargets(frontends: FrontendTarget[]): FrontendTarget[] {\n const validTargets = new Set(Object.keys(FRONTEND_TARGETS))\n const result = frontends.filter(target => validTargets.has(target))\n return [...new Set(result.length > 0 ? result : DEFAULT_FULLSTACK_FRONTENDS)]\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 解析功能依赖(自动补全传递依赖,循环直至收敛)\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n let changed = true\n while (changed) {\n changed = false\n for (const featureId of result) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n if (!result.has(dep)) {\n result.add(dep)\n changed = true\n }\n }\n }\n }\n }\n\n return Array.from(result)\n}\n\n// =============================================================================\n// 模块配置交互\n// =============================================================================\n\n/**\n * 交互式收集模块配置\n */\nasync function promptModuleConfigs(features: FeatureId[], projectName: string): Promise<ModuleConfigs> {\n const configs: ModuleConfigs = {}\n const onCancel = () => {\n writeCliMessage(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.bold(' ⚙ 模块配置'))\n writeCliMessage(chalk.gray(' 设置关键配置项(回车使用默认值)'))\n writeCliMessage('')\n\n // core 配置(始终收集)\n configs.core = await promptCoreConfig(projectName, onCancel)\n\n if (features.includes('db')) {\n configs.db = await promptDbConfig(projectName, onCancel)\n }\n if (features.includes('cache')) {\n configs.cache = await promptCacheConfig(onCancel)\n }\n if (features.includes('iam')) {\n configs.iam = await promptIamConfig(onCancel)\n }\n if (features.includes('storage')) {\n configs.storage = await promptStorageConfig(onCancel)\n }\n if (features.includes('ai')) {\n configs.ai = await promptAiConfig(onCancel)\n }\n\n return configs\n}\n\n/**\n * 收集 core 模块配置\n */\nasync function promptCoreConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['core']> {\n writeCliMessage(chalk.cyan(' [core] 应用基础配置'))\n const { defaultLocale } = await prompts({\n type: 'select',\n name: 'defaultLocale',\n message: '默认语言:',\n choices: [\n { title: '中文 (zh-CN)', value: 'zh-CN' },\n { title: 'English (en-US)', value: 'en-US' },\n ],\n initial: 0,\n }, { onCancel })\n return { name: projectName, defaultLocale }\n}\n\n/**\n * 收集 db 模块配置\n */\nasync function promptDbConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['db']> {\n writeCliMessage(chalk.cyan(' [db] 数据库配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '数据库类型:',\n choices: [\n { title: 'SQLite (零配置,适合开发)', value: 'sqlite' },\n { title: 'PostgreSQL', value: 'postgresql' },\n { title: 'MySQL', value: 'mysql' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'sqlite') {\n const { database } = await prompts({\n type: 'text',\n name: 'database',\n message: 'SQLite 数据库路径:',\n initial: './data/app.db',\n }, { onCancel })\n return { type, database }\n }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: `${type === 'postgresql' ? 'PostgreSQL' : 'MySQL'} 主机:`, initial: 'localhost' },\n { type: 'number', name: 'port', message: '端口:', initial: type === 'postgresql' ? 5432 : 3306 },\n { type: 'text', name: 'database', message: '数据库名称:', initial: projectName },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port, database: answers.database }\n}\n\n/**\n * 收集 cache 模块配置\n */\nasync function promptCacheConfig(onCancel: () => void): Promise<ModuleConfigs['cache']> {\n writeCliMessage(chalk.cyan(' [cache] 缓存配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '缓存类型:',\n choices: [\n { title: '内存缓存 (零配置,适合开发)', value: 'memory' },\n { title: 'Redis', value: 'redis' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'memory')\n return { type }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: 'Redis 主机:', initial: 'localhost' },\n { type: 'number', name: 'port', message: 'Redis 端口:', initial: 6379 },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port }\n}\n\n/**\n * 收集 iam 模块配置\n */\nasync function promptIamConfig(onCancel: () => void): Promise<ModuleConfigs['iam']> {\n writeCliMessage(chalk.cyan(' [iam] 认证授权配置'))\n const answers = await prompts([\n { type: 'confirm', name: 'loginPassword', message: '启用密码登录?', initial: true },\n { type: 'confirm', name: 'loginOtp', message: '启用 OTP 验证码登录?', initial: false },\n ], { onCancel })\n return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp }\n}\n\n/**\n * 收集 storage 模块配置\n */\nasync function promptStorageConfig(onCancel: () => void): Promise<ModuleConfigs['storage']> {\n writeCliMessage(chalk.cyan(' [storage] 文件存储配置'))\n const { type } = await prompts({\n type: 'select',\n name: 'type',\n message: '存储类型:',\n choices: [\n { title: '本地存储 (零配置,适合开发)', value: 'local' },\n { title: 'S3 / MinIO / OSS', value: 's3' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'local') {\n const { localPath } = await prompts({\n type: 'text',\n name: 'localPath',\n message: '存储路径:',\n initial: './data/uploads',\n }, { onCancel })\n return { type, localPath }\n }\n\n return { type }\n}\n\n/**\n * 收集 ai 模块配置\n */\nasync function promptAiConfig(onCancel: () => void): Promise<ModuleConfigs['ai']> {\n writeCliMessage(chalk.cyan(' [ai] AI 集成配置'))\n const { defaultProvider } = await prompts({\n type: 'select',\n name: 'defaultProvider',\n message: 'AI Provider:',\n choices: [\n { title: 'OpenAI', value: 'openai' },\n { title: 'Anthropic (Claude)', value: 'anthropic' },\n { title: '其他 (OpenAI 兼容)', value: 'custom' },\n ],\n initial: 0,\n }, { onCancel })\n\n const defaultModel = defaultProvider === 'openai'\n ? 'gpt-4o-mini'\n : defaultProvider === 'anthropic'\n ? 'claude-3-sonnet'\n : ''\n\n const { model } = await prompts({\n type: 'text',\n name: 'model',\n message: '默认模型:',\n initial: defaultModel,\n }, { onCancel })\n\n return { defaultProvider, model }\n}\n\n// =============================================================================\n// 工具函数\n// =============================================================================\n\n/**\n * 获取功能对应的配置 key\n */\nfunction getFeatureConfigKey(featureId: FeatureId): string | null {\n const map: Record<string, string> = {\n db: 'db',\n cache: 'cache',\n iam: 'iam',\n storage: 'storage',\n ai: 'ai',\n deploy: 'deploy',\n vecdb: 'vecdb',\n reach: 'reach',\n scheduler: 'scheduler',\n audit: 'audit',\n payment: 'payment',\n }\n return map[featureId] ?? null\n}\n\n/**\n * 获取安装命令\n */\nfunction getInstallCommand(pm: 'pnpm' | 'npm' | 'yarn'): string {\n switch (pm) {\n case 'pnpm': return 'pnpm install'\n case 'yarn': return 'yarn'\n default: return 'npm install'\n }\n}\n\n/**\n * 生成运行 package.json 脚本的命令\n *\n * npm 需要 `npm run <script>`(lifecycle 脚本除外),pnpm / yarn 可直接 `<pm> <script>`。\n */\nfunction getRunCommand(pm: 'pnpm' | 'npm' | 'yarn', script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nfunction installDependencies(projectPath: string, pm: 'pnpm' | 'npm' | 'yarn'): void {\n const installCmd = getInstallCommand(pm)\n try {\n execSync(installCmd, {\n cwd: projectPath,\n stdio: 'pipe',\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n })\n }\n catch (error) {\n const details = formatCommandFailure(installCmd, error)\n throw new Error(`${cliM('cli_installFailed', { params: { pm } })}\\n${details}`)\n }\n}\n\ninterface CommandFailureLike {\n stdout?: unknown\n stderr?: unknown\n status?: number | null\n signal?: string | null\n}\n\nfunction formatCommandFailure(command: string, error: unknown): string {\n if (!error || typeof error !== 'object') {\n return cliM('cli_commandLabel', { params: { command } })\n }\n\n const failure = error as CommandFailureLike\n const stdout = normalizeChildOutput(failure.stdout)\n const stderr = normalizeChildOutput(failure.stderr)\n const status = typeof failure.status === 'number' ? cliM('cli_exitCode', { params: { code: failure.status } }) : ''\n const signal = typeof failure.signal === 'string' ? cliM('cli_signal', { params: { signal: failure.signal } }) : ''\n const output = [\n cliM('cli_commandLabel', { params: { command } }),\n status,\n signal,\n stderr ? `stderr:\\n${stderr}` : '',\n stdout ? `stdout:\\n${stdout}` : '',\n ].filter(Boolean)\n\n return output.join('\\n\\n')\n}\n\nfunction normalizeChildOutput(output: unknown): string {\n if (typeof output === 'string') {\n return output.trim()\n }\n if (Buffer.isBuffer(output)) {\n return output.toString('utf-8').trim()\n }\n return ''\n}\n\n/** 生成各类项目共用的 AI 开发入口说明。 */\nfunction generateAiDevelopmentReadme(): string {\n return `### AI 辅助开发\n\n从本项目根目录打开所用编码工具,先读取 [AGENTS.md](./AGENTS.md)。Claude Code 通过 [CLAUDE.md](./CLAUDE.md) 加载项目规则;GitHub Copilot 使用 [.github/copilot-instructions.md](./.github/copilot-instructions.md),OpenCode 使用 AGENTS.md 和 [opencode.json](./opencode.json)。\n\n生成的页面和业务规则是起点,可以按需求调整。把功能、权限和验收条件告诉 AI,再让它读取对应技能与当前安装版本的 API。\n\n普通功能开发使用 [应用开发 Skill](./.agents/skills/hai-app-create/SKILL.md)。需求文档较多时,先用 [文档审查 Skill](./.agents/skills/hai-spec-review/SKILL.md) 找出缺失和矛盾,再用 [文档实施 Skill](./.agents/skills/hai-spec-implement/SKILL.md) 维护 docs/task-list.md 与 docs/tasks/,逐项实现、测试和交付。\n\n已有项目可运行 hai init 补齐缺失的 AI 入口;它保留已有自定义内容。升级框架使用 [框架升级 Skill](./.agents/skills/hai-framework-sync/SKILL.md),同时核对依赖、配置、代码和技能。\n\n`\n}\n\n/** 生成各类工程共用的配置与命令说明,放在开发/部署章节之间。 */\nfunction generateEnvironmentReadme(): string {\n return `### 分环境配置\n\n运行参数在 \\`.env.example\\` 中逐项说明用途、枚举和范围。\\`.env\\` 为公共基础,\\`.env.dev\\` / \\`.env.test\\` / \\`.env.prod\\` 为环境覆盖,均提交 Git;\\`.env.local\\` 为本机私有覆盖,不提交 Git。优先级为进程环境 > \\`.env.local\\` > 环境文件 > \\`.env\\`。YAML 显式引用 \\`HAI_<配置名>_<路径>\\` 并保留本地回退,camelCase 不拆词。完整命令、加载优先级和 Provider 切换见 [环境配置](.agents/skills/hai-app-create/development.md#环境配置)。\n\n| 用途 | 命令 |\n| --- | --- |\n| 开发 / 测试模式 / 生产模式预览 | \\`pnpm dev\\` / \\`dev:test\\` / \\`dev:prod\\` |\n| 类型检查(check 为别名) | \\`pnpm typecheck\\` |\n| 检查 / 自动修复格式 | \\`pnpm lint\\` / \\`lint:fix\\` |\n| 源码构建 / 镜像构建 | \\`pnpm build\\` / \\`pnpm build --target docker\\` |\n| 单元测试 / 监听 / 浏览器验收 | \\`pnpm test\\` / \\`test:watch\\` / \\`test:e2e\\` |\n| Node 服务按环境启动(构建后) | \\`pnpm start\\` / \\`start:test\\` / \\`start:prod\\` |\n\nVite 客户端使用 \\`preview\\` 预览静态产物,Node 服务使用 \\`start\\`;纯 contract/shared 库只提供适用的构建和质量命令。API workspace 的环境文件位于 \\`apps/<name>-service\\`,fullstack 位于工程根。`\n}\n\n/** 生成与项目脚本一致的构建、离线交付和增量更新说明。 */\nfunction generateBuildDeploymentReadme(pm: string, appDir: string): string {\n return `### 构建与部署\n\n创建时默认包含部署工具;不需要时使用 hai create --no-deploy。\n每个镜像对应 images/ 中一个 Dockerfile,hai.build.json 用 dockerfile 指定文件。\n下载、安装和整理生产依赖复用同一份包缓存与 SQLite 驱动缓存,避免重复下载。\n默认容器用于 CPU 运行或连接远程 AI 服务,不额外下载 GPU 运行库;需要使用部署机器上的 GPU 时,自行定制镜像和容器运行参数。\n\n\\`\\`\\`sh\n${pm} build\n${pm} build --target docker\n# 构建和部署一次完成\n${pm} exec hai deploy ${appDir} --env test --build\n# 复用已有镜像;只生成完整离线包及跨平台部署脚本\n${pm} exec hai deploy ${appDir} --env prod --bundle-only\n# 只更新前端(工程存在 web 镜像时)\n${pm} build --target docker --images web\n${pm} exec hai deploy ${appDir} --env prod --services web\n\\`\\`\\`\n\n构建不读取部署环境;产物位于 .hai/build/docker/<buildId>,用 --artifact-dir 精确选择。\n应用根 package.json.version 驱动版本,同版本允许重新构建和发布;清单记录独立构建编号与校验和。\n完整离线包自动携带自建中间件镜像;准备中间件镜像需要构建机有可用 Podman/Docker,缺镜像时在打包阶段拉取。\n服务器需要 Linux、Docker/Podman、Docker Compose v2 或 podman-compose 1.6.0 及以上、sh、tar、sha256sum、awk、curl,启动阶段不联网拉取。\ntar 旁的部署目录提供 deploy.ps1(Windows)和 deploy.sh(Linux/macOS),按已保存的 SSH 参数上传、导入、启动并验证 HTTP。\n完全隔离时手工搬运 tar,独立目录解包后执行 sh apply.sh,或传入部署目录覆盖默认位置。\n部分更新要求已有成功的完整部署,保留未选服务及数据卷;失败返回非零退出码,已有部署尝试恢复选中服务。\n中间件连接齐全时使用 --skip-middleware 跳过配置向导。包中包含私有配置,不提交 Git。\n`\n}\n\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n return `# ${name}\n\n## 简介\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 核心功能清单\n\n- 开发服务器、源码编译与浏览器测试。\n- 按所选模块提供页面和服务配置。\n- 独立 Dockerfile 与镜像归档,便于交付。\n\n## 使用入门\n\n### 页面布局与路由\n\n页面统一继承根布局的 header/footer。${appType === 'mobile-app' ? '页面放 src/lib/pages/**/*.svelte,hash 路由自动发现,刷新与前进后退恢复当前页。' : '使用 SvelteKit 自动文件路由,新增 +page.svelte 无需维护路由表;刷新定位与服务端鉴权保持一致。'}\n\n### 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n### 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'paraglide:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n${generateBuildDeploymentReadme(pm, `.`)}\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n\n## 开发测试\n\n\\`\\`\\`sh\n${getRunCommand(pm, 'typecheck')}\n${getRunCommand(pm, 'lint')}\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'test')}\n${getRunCommand(pm, 'test:e2e')}\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n## 简介\n\n后端 API 工程,接口定义与服务实现分包维护,客户端可复用同一份接口类型。\n\n## 核心功能清单\n\n- 共享 contract、输入输出校验与服务 procedures。\n- 模块配置、健康检查和 HTTP 服务。\n- 独立镜像构建与离线交付。\n\n## 使用入门\n\n### 工程结构\n\n- \\`apps/${name}-contract\\`:共享 API contract、Zod schema 与类型\n- \\`apps/${name}-service\\`:后端 API service,基于 \\`@h-ai/serv\\` 暴露 HTTP 应用\n\n### 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n\n${generateBuildDeploymentReadme(pm, `apps/${name}-service`)}\n\n### 扩展建议\n\n- 在 \\`${name}-contract\\` 中维护应用级 contract,前后端共用同一份类型与路径定义。\n- 在 \\`${name}-service\\` 中扩展 procedures、模块初始化与配置。\n- 需要 IAM / storage / ai 时,优先复用 \\`@h-ai/api-contract\\` 与 \\`@h-ai/serv/features/*\\`。\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/api-contract](./.agents/skills/hai-api-contract/SKILL.md)\n- [@h-ai/api-client](./.agents/skills/hai-api-client/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[]): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n return `# ${name}\n\n## 简介\n\n前后端分离工程,API 与 Web、移动端、桌面端共享接口类型和管理界面,可按实际业务调整。\n\n## 核心功能清单\n\n- API 服务、共享界面与按需生成的客户端。\n- 用户管理、角色、审计和个人设置示例。\n- 登录、主题、语言、新手引导和帮助中心。\n- API/Web 独立 Dockerfile 与镜像归档。\n\n## 使用入门\n\n### 工程结构\n\n- \\`packages/${name}-contract\\`:前后端共享 API 契约、Zod Schema 与类型\n- \\`packages/${name}-serv\\`:后端 API Service(通过 \\`@h-ai/serv\\` 暴露最小 HTTP App 抽象,不直接暴露 Hono)\n- \\`packages/${name}-shared\\`:跨端共享 Shell、主题、语言切换、API client 与共享 messages\n- \\`apps/${name}-web\\`:Web 前端${frontends.includes('web') ? '' : '(未启用)'}\n- \\`apps/${name}-app\\`:移动端 App/H5 前端${frontends.includes('app') ? '' : '(未启用)'}\n- \\`apps/${name}-desktop\\`:桌面端前端${frontends.includes('desktop') ? '' : '(未启用)'}\n- \\`apps/${name}-miniapp\\`:小程序预留说明与本端 inlang messages${frontends.includes('miniapp') ? '(占位,不参与构建)' : '(未启用)'}\n\n已启用前端:${enabledFrontends || 'Web / App / Desktop'}\n\n### 页面布局与路由\n\nWeb/App/Desktop 共享 AppShell 的 header/footer。新增页面放 shared/src/lib/pages/**/*.svelte,由 HashRouter 自动发现并按需加载;菜单只维护入口。地址使用 #/页面路径,支持刷新、查询串与浏览器前进后退;API 权限仍由服务端校验。\n\n### 默认管理功能\n\n以下描述可运行示例的初始业务,可按实际需求调整或移除,并同步代码、数据、鉴权、界面、测试和文档。\n\n默认启用 IAM、reldb、cache、audit、storage 和 crypto。初始管理员可以管理用户(新增、编辑、禁用、删除、角色分配、头像上传)、查看 admin/user 角色及人数、维护角色说明、分页筛选审计日志;初始普通用户进入个人资料、头像、语言、主题和密码设置。默认密码修改后全部会话失效,需要重新登录;角色模型、访问范围和会话策略由业务需求决定。\n\nCLI 已在根目录生成 \\`.env.local\\`,其中 \\`HAI_ADMIN_DEFAULT_PASSWORD\\` 是每个项目独立生成的随机强密码。直接运行 \\`dev\\` / \\`start\\` 即可,首次登录使用用户名 \\`admin\\` 和该密码;也可通过同名环境变量覆盖。密码须满足 \\`_iam.yml\\` 策略,启动失败会显示具体校验原因及错误码。\\`.env.local\\` 已被 Git 和容器构建忽略,\\`.env.example\\` 不含真实密码;部署时设置目标环境自己的密码。已有用户时不会重复创建管理员或重设密码。\n\n本地开发默认 \\`PUBLIC_API_BASE=http://127.0.0.1:3000\\`,Vite 使用同源代理;部署时改为实际公网 API Origin,Android 模拟器访问宿主机时使用 \\`http://10.0.2.2:3000\\`。不要将密钥放入任何 \\`PUBLIC_\\` 或 \\`VITE_\\` 变量。\n\n所有业务 JSON 请求和响应默认通过 \\`@h-ai/crypto\\` transport 双向加密(含登录、刷新、头像上传);前端统一使用共享 typed API client。Web 访问令牌仅存内存、刷新令牌由 HttpOnly Cookie 保存;受信原生端使用平台安全存储或内存。头像为随机路径只读图片资源,支持 PNG/JPEG/WebP,最大 512 KiB。健康检查和只读头像图片可直接访问。\n\n应用显示名称、版本、环境、默认语言和日志设置来自后端 \\`config/_core.yml\\`,前端通过 \\`app.info\\` 获取安全元信息。默认 SQLite、本地存储与内存缓存适合单实例,管理写入仅支持单写实例;多实例读取可使用共享数据库、Redis cache 和 S3 存储,但管理写请求须统一路由到同一写实例。另需会话粘性路由使请求命中同一进程内传输私钥,服务重启后客户端重新协商。生产需显式配置允许的 CORS Origin。业务提交后的审计写入采用最大努力,失败记录结构化错误日志,保留已完成业务的原始结果。\n\n### 配置扩展\n\n服务端 \\`packages/${name}-serv/config/\\` 始终保留 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、deploy 共 13 份 YAML。已用模块保留工作默认值,未启用模块整份注释,可选字段和替代 Provider 按块注释;根 \\`.env.example\\` 也保留未启用模块的凭据示例。Reach 默认为开发控制台通知,生产按 \\`_reach.yml\\` 注释替换为 SMTP、短信或 API Provider,并保持名称唯一。\n\n自动生成的 \\`.env\\` 包含已启用模块的环境参数;YAML 显式引用相同变量并保留本地回退。编辑环境参数优先修改对应 \\`.env\\`;未启用模块仍保留注释。\n\n扩展时先在服务端 workspace 安装需要的包,在 \\`src/server/runtime.ts\\` 按模块公开 Schema 校验配置、初始化并反序关闭,再接入 contract/procedure 和界面。整份注释文件先去掉一层外层注释,可选块继续按需开启;配置文件存在不代表业务功能已接入。\\`crypto.init()\\` 无配置参数,datapipe 为纯函数,不生成虚构 YAML。\n\n环境变量只覆盖 YAML 已有路径,注释键须先启用,或用 \\`HAI_DB\\` / \\`HAI_CACHE\\` 等整体对象覆盖。camelCase 不拆词,例如 \\`connectTimeout\\` 对应 \\`HAI_CACHE_CONNECTTIMEOUT\\`。修改配置后重启服务;语言列表在各前端/shared 的 \\`project.inlang/settings.json\\` 中同步。\\`**/data/\\` 忽略任意层级的数据目录及 \\`.gitkeep\\`,运行数据不入 Git,运行时自动创建目录。\n\n${generateEnvironmentReadme()}\n\n### 开发与构建\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n${pm} typecheck\n${pm} build\n${pm} test\n${pm} test:e2e\n${frontends.includes('desktop') ? `${pm} build --target desktop --platform windows # Windows 主机;Linux/macOS 在对应主机构建` : ''}\n\\`\\`\\`\n\nTauri 需要目标系统的 Rust target、SDK 和打包工具。测试产生的临时工程、截图、报告、容器、镜像与进程应在 finally/teardown 中自动清理,失败也执行。\n\n${generateBuildDeploymentReadme(pm, `packages/${name}-serv`)}\n\n### i18n 与 shared 协同\n\n- shared:\\`packages/${name}-shared/project.inlang\\` + \\`messages/\\`,只放跨端共享组件文案。\n- web/app/desktop:每个应用都有自己的 \\`project.inlang\\` + \\`messages/\\`,用于本端页面与产品文案。\n- miniapp:当前是占位,但也有自己的 \\`project.inlang\\` + \\`messages/\\`,便于后续接入真实小程序框架。\n- 新增 locale 时,shared 与所有启用前端的 \\`locales\\` 必须同步;语言切换器会同时更新 shared runtime 与宿主应用 runtime。\n- \\`${pm} i18n:compile\\` 会统一编译 shared 与每个启用前端的 Paraglide 输出;各前端也可单独运行 \\`${pm} --filter ${name}-web paraglide:compile\\` 等命令。\n\n### 自定义建议\n\n- 改全局 Shell/主题/语言切换:编辑 \\`packages/${name}-shared\\`。\n- 改某个前端页面和文案:编辑共享 \\`packages/${name}-shared/src/lib/pages\\`、本端入口与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/ui](./.agents/skills/hai-ui/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\n/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions>): void {\n writeCliMessage('')\n writeCliMessage(chalk.green('✔ 项目创建成功!'))\n writeCliMessage('')\n\n // 功能摘要\n if (options.features.length > 0) {\n writeCliMessage(chalk.bold('已启用功能:'))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n writeCliMessage(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n writeCliMessage('')\n }\n\n writeCliMessage('下一步:')\n writeCliMessage(chalk.cyan(` cd ${options.name}`))\n if (options.appType === 'fullstack')\n writeCliMessage(chalk.cyan(cliM('cli_adminPasswordSaved')))\n if (!options.install) {\n writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n writeCliMessage('')\n}\n\n// =============================================================================\n// 项目检测(供 init 命令使用)\n// =============================================================================\n\n/**\n * 检测项目信息\n */\nexport async function detectProject(cwd: string): Promise<ProjectInfo | null> {\n const pkgPath = path.join(cwd, 'package.json')\n\n if (!(await fileExists(pkgPath))) {\n return null\n }\n\n try {\n const pkg = await fse.readJson(pkgPath)\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\n const haiPackages = Object.keys(deps).filter(name => name.startsWith('@h-ai/'))\n\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n isHaiProject: haiPackages.length > 0,\n haiPackages,\n }\n }\n catch {\n return null\n }\n}\n","/**\n * @h-ai/cli — 模块增量添加命令\n *\n * 向现有 hai 项目增量启用模块。\n * @module cli-add\n */\n\nimport type { FeatureId, GlobalOptions } from '../cli-types.js'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, getCliVersion, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * add 命令选项\n */\nexport interface AddModuleOptions extends GlobalOptions {\n /** 要添加的模块 */\n module?: FeatureId\n /** 是否安装依赖 */\n install?: boolean\n}\n\n// 可添加的模块与对应包\nconst MODULE_MAP: Record<string, { packages: string[], deps?: string[], configKey?: string, description: string }> = {\n // iam 依赖 crypto(password hash)/ db(user 存储)/ cache(session 缓存)\n 'iam': { packages: ['@h-ai/iam'], deps: ['crypto', 'db', 'cache'], configKey: 'iam', description: '身份与访问管理' },\n // 'db' 和 'reldb' 都映射到 @h-ai/reldb,兼容用户习惯(hai add db 和 hai add reldb 均可)\n 'db': { packages: ['@h-ai/reldb'], configKey: 'db', description: '数据库' },\n 'reldb': { packages: ['@h-ai/reldb'], configKey: 'db', description: '数据库' },\n 'cache': { packages: ['@h-ai/cache'], configKey: 'cache', description: '缓存' },\n 'ai': { packages: ['@h-ai/ai'], configKey: 'ai', description: 'AI 集成' },\n 'storage': { packages: ['@h-ai/storage'], configKey: 'storage', description: '文件存储' },\n 'crypto': { packages: ['@h-ai/crypto'], description: '加密模块' },\n 'kit': { packages: ['@h-ai/kit'], description: 'SvelteKit 集成工具' },\n 'ui': { packages: ['@h-ai/ui'], description: 'UI 组件库' },\n 'deploy': { packages: ['@h-ai/deploy'], configKey: 'deploy', description: '自动化部署' },\n 'vecdb': { packages: ['@h-ai/vecdb'], configKey: 'vecdb', description: '向量数据库' },\n 'datapipe': { packages: ['@h-ai/datapipe'], description: '数据处理管道' },\n 'reach': { packages: ['@h-ai/reach'], configKey: 'reach', description: '消息推送' },\n 'scheduler': { packages: ['@h-ai/scheduler'], deps: ['db'], configKey: 'scheduler', description: '任务调度' },\n 'audit': { packages: ['@h-ai/audit'], deps: ['db'], configKey: 'audit', description: '审计日志' },\n 'payment': { packages: ['@h-ai/payment'], configKey: 'payment', description: '支付' },\n 'capacitor': { packages: ['@h-ai/capacitor'], description: '移动端能力' },\n 'api-client': { packages: ['@h-ai/api-client'], description: 'HTTP 客户端' },\n}\n\n/**\n * 增量添加模块到现有项目\n */\nexport async function addModule(options: AddModuleOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n const project = await detectProject(cwd)\n if (!project) {\n writeCliError(chalk.red('未检测到项目(找不到 package.json)'))\n return\n }\n\n // 交互式选择模块\n let moduleName = options.module\n if (!moduleName) {\n // 过滤已安装的模块\n const installed = new Set(project.haiPackages)\n const choices = Object.entries(MODULE_MAP)\n .filter(([, def]) => !def.packages.every(p => installed.has(p)))\n .map(([key, def]) => ({\n title: `${chalk.bold(key.padEnd(10))} ${chalk.gray(def.description)}`,\n value: key,\n }))\n\n if (choices.length === 0) {\n writeCliMessage(chalk.green('所有模块已安装!'))\n return\n }\n\n const { selected } = await prompts({\n type: 'select',\n name: 'selected',\n message: '选择要添加的模块:',\n choices,\n })\n\n if (!selected)\n return\n moduleName = selected as FeatureId\n }\n\n const moduleDef = MODULE_MAP[moduleName]\n if (!moduleDef) {\n writeCliError(chalk.red(`未知模块: ${moduleName}`))\n writeCliMessage(`可用模块: ${Object.keys(MODULE_MAP).join(', ')}`)\n return\n }\n\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n\n // 检查是否已安装\n if (moduleDef.packages.every(p => project.haiPackages.includes(p))) {\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(project.haiPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n writeCliMessage(chalk.yellow(`模块 ${moduleName} 已安装,已补全 AI 支持文件`))\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n else {\n writeCliMessage(chalk.yellow(`模块 ${moduleName} 已安装`))\n }\n return\n }\n\n // 收集所有需要安装的包(含依赖模块)\n const allPackages = new Set(moduleDef.packages)\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef) {\n for (const pkg of depDef.packages) {\n allPackages.add(pkg)\n }\n }\n }\n }\n\n // 更新 package.json\n spinner.start('更新 package.json...')\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = await fse.readJson(pkgPath)\n if (!pkg.dependencies)\n pkg.dependencies = {}\n\n const existingHaiSpecifier = Object.entries(pkg.dependencies as Record<string, string>)\n .find(([pkgName]) => pkgName.startsWith('@h-ai/'))?.[1]\n\n // 已存在的 @h-ai/* 依赖若使用 catalog:,新增模块保持一致;否则固定当前 CLI 对应版本。\n const depVersion = existingHaiSpecifier === 'catalog:' ? 'catalog:' : getCliVersion()\n\n for (const pkgName of allPackages) {\n if (pkgName === '@h-ai/deploy') {\n pkg.devDependencies ??= {}\n pkg.devDependencies[pkgName] ??= depVersion\n }\n else if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = depVersion\n }\n }\n await fse.writeJson(pkgPath, pkg, { spaces: 2 })\n spinner.succeed()\n\n // 生成配置文件\n if (moduleDef.configKey) {\n const configDir = path.join(cwd, 'config')\n const configPath = path.join(configDir, `_${moduleDef.configKey}.yml`)\n if (!(await fileExists(configPath))) {\n spinner.start(`生成配置文件 config/_${moduleDef.configKey}.yml...`)\n const content = generateConfigFile(moduleDef.configKey)\n await writeFile(configPath, content)\n spinner.succeed()\n }\n else {\n writeCliMessage(chalk.gray(`配置文件已存在: config/_${moduleDef.configKey}.yml`))\n }\n }\n\n // 生成依赖模块的配置文件\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef?.configKey) {\n const depConfigPath = path.join(cwd, 'config', `_${depDef.configKey}.yml`)\n if (!(await fileExists(depConfigPath))) {\n const content = generateConfigFile(depDef.configKey)\n await writeFile(depConfigPath, content)\n writeCliMessage(chalk.gray(` + config/_${depDef.configKey}.yml (依赖)`))\n }\n }\n }\n }\n\n const skillPackages = [...project.haiPackages, ...allPackages]\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(skillPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n\n // 安装依赖\n const doInstall = options.install !== false\n if (doInstall) {\n spinner.start('安装依赖...')\n const { execSync } = await import('node:child_process')\n const pm = await detectPackageManager(cwd)\n execSync(`${pm} install`, { cwd, stdio: 'ignore' })\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(`✔ 模块 ${moduleName} 添加成功!`))\n writeCliMessage('')\n writeCliMessage('已添加的包:')\n for (const pkg of allPackages) {\n writeCliMessage(chalk.cyan(` ${pkg}`))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red('添加模块失败:'), { error })\n throw error\n }\n}\n","/** `pnpm build` 的环境无关构建入口:源码、OCI 镜像或 Tauri 安装包。 */\nimport type { DeploymentArtifact } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { spawn } from 'node:child_process'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { copyFileSync, createReadStream, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\n/**\n * 构建参数,不接受部署环境。\n * @example `await buildCommand({ target: 'docker', runtime: 'auto' })`\n */\nexport interface BuildCommandOptions extends GlobalOptions {\n /** compile 编译源码,docker 导出镜像,desktop 调用 Tauri。 */\n target?: 'compile' | 'docker' | 'desktop'\n /** 逗号分隔的应用镜像名;省略时构建全部。 */\n images?: string\n /** auto 优先使用可达的 Podman。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 容器构建网络,默认采用引擎设置;例如 rootless Podman 的 pasta。 */\n network?: string\n /** 原生安装包的目标系统,必须与构建主机相同。 */\n platform?: 'windows' | 'linux' | 'macos'\n /** Rust 目标架构,默认当前主机架构。 */\n arch?: 'x64' | 'arm64'\n /** 可信 SQLite 预编译包根地址,不包含凭据。 */\n sqlitePrebuildMirror?: string\n /** Podman 是否继承代理。 */\n httpProxy?: boolean\n}\n\n/**\n * 项目构建描述;app/web 共用 buildId。\n * @example `{ images: [{ name: 'app', dockerfile: 'images/app.Dockerfile' }], desktop: ['apps/desktop'] }`\n */\ninterface BuildConfig {\n images?: Array<{ name: 'app' | 'web', context?: string, dockerfile: string, containerPort?: number }>\n desktop?: string[]\n}\n\n/** 子进程不经过 shell;pnpm 使用当前原生或 JS 入口,兼容 Windows 路径。 */\nasync function run(command: string, args: string[], cwd: string, quiet = false): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !/^(?:HAI_|PUBLIC_|VITE_)/.test(key)))\n env.NODE_ENV = 'production'\n // Tauri 的 CI 参数只接受 true/false,兼容 CI 平台常用的 1/0 写法。\n if (env.CI === '1' || env.CI === '0')\n env.CI = env.CI === '1' ? 'true' : 'false'\n const child = spawn(command, args, { cwd, env, windowsHide: true, stdio: quiet ? 'ignore' : 'inherit', shell: false })\n child.once('error', reject)\n child.once('exit', code => code === 0 ? resolve() : reject(new Error(cliM('cli_build_failed', { params: { command, code: String(code) } }))))\n })\n}\n\n/** 使用已安装的 pnpm,不通过 Corepack 下载另一套工具链。 */\nasync function pnpm(args: string[], cwd: string): Promise<void> {\n const entry = process.env.npm_execpath\n if (entry && /(?:^|[/\\\\])pnpm(?:-native)?(?:\\.exe|\\.[cm]?js)?$/i.test(entry))\n return /\\.[cm]?js$/i.test(entry) ? run(process.execPath, [entry, ...args], cwd) : run(entry, args, cwd)\n // CLI 直接调用时从 PATH 定位原生或 JS 入口;Windows 的 .cmd 不能由无 shell spawn 执行。\n if (process.platform === 'win32') {\n const directories = (process.env.PATH ?? '').split(';')\n for (const directory of directories) {\n const executable = join(directory, 'pnpm.exe')\n if (existsSync(executable))\n return run(executable, args, cwd)\n for (const relative of ['node_modules/pnpm/bin/pnpm.cjs', 'pnpm.cjs']) {\n const candidate = join(directory, relative)\n if (existsSync(candidate))\n return run(process.execPath, [candidate, ...args], cwd)\n }\n }\n throw new Error(cliM('cli_build_use_pnpm'))\n }\n return run('pnpm', args, cwd)\n}\n\n/**\n * 构建已有项目;镜像清单仅在全部镜像导出成功后发布。\n * @example `await buildCommand({ cwd: '/workspace/demo', target: 'docker', runtime: 'auto' })`\n */\nexport async function buildCommand(options: BuildCommandOptions): Promise<void> {\n const cwd = resolve(options.cwd ?? process.cwd())\n const target = options.target ?? 'compile'\n if (!['compile', 'docker', 'desktop'].includes(target))\n throw new Error(cliM('cli_build_target_invalid'))\n if ((target !== 'docker' && (options.images !== undefined || options.runtime !== undefined || options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false))\n || (target !== 'desktop' && (options.platform !== undefined || options.arch !== undefined))) {\n throw new Error(cliM('cli_build_options_invalid'))\n }\n if (target === 'compile') {\n await pnpm(['run', 'compile'], cwd)\n return\n }\n const metadata: { version?: unknown } = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'))\n // 版本同时进入文件名和镜像标签;拒绝路径字符,保留预发布和构建元数据。\n const appVersion = metadata.version\n if (typeof appVersion !== 'string' || appVersion.length > 80 || !/^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?(?:\\+[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?$/i.test(appVersion))\n throw new Error(cliM('cli_build_version_invalid'))\n const config = JSON.parse(readFileSync(join(cwd, 'hai.build.json'), 'utf8')) as BuildConfig\n if (target === 'desktop') {\n const platforms = { win32: 'windows', linux: 'linux', darwin: 'macos' } as const\n const host = platforms[process.platform as keyof typeof platforms]\n const platform = options.platform ?? host\n const arch = options.arch ?? process.arch\n if (!platform || platform !== host || !['x64', 'arm64'].includes(arch))\n throw new Error(cliM('cli_build_native_host'))\n if (!config.desktop?.length)\n throw new Error(cliM('cli_build_desktop_missing'))\n const rustTarget = `${arch === 'x64' ? 'x86_64' : 'aarch64'}-${platform === 'windows' ? 'pc-windows-msvc' : platform === 'macos' ? 'apple-darwin' : 'unknown-linux-gnu'}`\n const bundles = platform === 'windows' ? 'nsis' : platform === 'macos' ? 'app,dmg' : 'deb,appimage'\n for (const directory of config.desktop)\n await pnpm(['exec', 'tauri', 'build', '--target', rustTarget, '--bundles', bundles, '--config', JSON.stringify({ version: appVersion })], resolve(cwd, directory))\n writeCliMessage(cliM('cli_build_native_ready', { params: { target: rustTarget } }))\n return\n }\n if (!Array.isArray(config.images) || !config.images.length || config.images.some(image => !image || typeof image !== 'object') || config.images.filter(image => image.name === 'app').length !== 1 || config.images.length > 2 || new Set(config.images.map(image => image.name)).size !== config.images.length\n || config.images.some(image => !['app', 'web'].includes(image.name) || typeof image.dockerfile !== 'string' || !image.dockerfile || 'target' in image || (image.containerPort !== undefined && (!Number.isInteger(image.containerPort) || image.containerPort < 1 || image.containerPort > 65535)))) {\n throw new Error(cliM('cli_build_images_missing'))\n }\n const selected = options.images?.split(',').map(name => name.trim())\n if (selected && (selected.some(name => !config.images!.some(image => image.name === name)) || new Set(selected).size !== selected.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n const images = config.images.filter(image => !selected || selected.includes(image.name))\n for (const image of images) {\n if (!existsSync(resolve(cwd, image.dockerfile)))\n throw new Error(cliM('cli_build_dockerfile_missing', { params: { path: image.dockerfile } }))\n }\n const candidates = options.runtime && options.runtime !== 'auto' ? [options.runtime] : ['podman', 'docker']\n if (candidates.some(runtime => !['podman', 'docker'].includes(runtime)))\n throw new Error(cliM('cli_build_runtime_missing'))\n let runtime: string | undefined\n for (const candidate of candidates) {\n try {\n await run(candidate, ['version'], cwd, true)\n runtime = candidate\n break\n }\n catch { /* 尝试下一个可达的引擎。 */ }\n }\n if (!runtime)\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.sqlitePrebuildMirror) {\n const url = new URL(options.sqlitePrebuildMirror)\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)\n throw new Error(cliM('cli_build_mirror_invalid'))\n }\n const buildId = `${appVersion}-${Date.now()}-${randomBytes(3).toString('hex')}`\n const artifact: DeploymentArtifact = { version: 3, appVersion, buildId, partial: images.length !== config.images.length, hasWeb: config.images.some(image => image.name === 'web'), images: [] }\n // 部分构建仍保留工程显式声明的端口,不用构建默认值覆盖部署配置。\n for (const image of config.images) {\n if (image.containerPort !== undefined)\n artifact[image.name === 'app' ? 'appContainerPort' : 'webContainerPort'] = image.containerPort\n }\n const parent = join(cwd, '.hai/build/docker')\n mkdirSync(parent, { recursive: true })\n const staging = mkdtempSync(join(parent, '.building-'))\n const built: string[] = []\n try {\n for (const context of new Set(images.map(image => resolve(cwd, image.context ?? '.'))))\n prepareDependencyInputs(context)\n for (const image of images) {\n if (!['app', 'web'].includes(image.name))\n throw new Error(cliM('cli_build_images_missing'))\n const context = resolve(cwd, image.context ?? '.')\n const imageRef = `localhost/hai-${basenameSafe(cwd)}-${image.name}:${buildId.toLowerCase().replaceAll('+', '_')}`\n const args = ['build', '-f', resolve(cwd, image.dockerfile), '-t', imageRef]\n if (options.network !== undefined)\n args.push('--network', options.network)\n const ignore = `${resolve(cwd, image.dockerfile)}.dockerignore`\n if (runtime === 'podman' && existsSync(ignore))\n args.push('--ignorefile', ignore)\n if (runtime === 'podman') {\n args.push('--format', 'docker', '--jobs', '1', ...(options.httpProxy === false ? ['--http-proxy=false'] : []))\n // Windows/macOS 的远程 Podman 默认读取服务端代理;显式传递预定义构建参数。\n if (options.httpProxy !== false) {\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'FTP_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'ftp_proxy', 'no_proxy']) {\n if (process.env[key])\n args.push('--build-arg', `${key}=${process.env[key]}`)\n }\n }\n }\n if (options.sqlitePrebuildMirror)\n args.push('--build-arg', `SQLITE_PREBUILD_MIRROR=${options.sqlitePrebuildMirror}`)\n built.push(imageRef)\n await run(runtime, [...args, context], cwd)\n const file = `${image.name}-${appVersion}.tar`\n await run(runtime, ['save', ...(runtime === 'podman' ? ['--format', 'docker-archive'] : []), '-o', join(staging, file), imageRef], cwd)\n const hash = createHash('sha256')\n for await (const chunk of createReadStream(join(staging, file)))\n hash.update(chunk)\n artifact.images.push({ name: image.name, file, imageRef, sha256: hash.digest('hex'), ...(image.containerPort ? { containerPort: image.containerPort } : {}) })\n }\n // 不覆盖以前成功的构建;manifest 是一次完整构建的提交点。\n const output = join(parent, buildId)\n // 文件名固定于 manifest 同层;通过构建 ID 子目录中的清单消费,latest 仅存相对路径。\n writeFileSync(join(staging, 'manifest.json'), `${JSON.stringify(artifact, null, 2)}\\n`)\n renameSync(staging, output)\n writeFileSync(join(parent, `latest-${buildId}`), `${buildId}\\n`)\n renameSync(join(parent, `latest-${buildId}`), join(parent, 'latest'))\n writeCliMessage(cliM('cli_build_ready', { params: { path: output, runtime } }))\n }\n catch (error) {\n for (const imageRef of built) {\n try {\n await run(runtime, ['image', 'rm', imageRef], cwd, true)\n }\n catch { /* 构建失败不掩盖原始错误。 */ }\n }\n throw error\n }\n finally {\n rmSync(staging, { recursive: true, force: true })\n }\n}\n\n/** 生成稳定的依赖上下文;包配置、补丁和本地归档改变才使下载层失效。 */\nfunction prepareDependencyInputs(cwd: string): void {\n const destination = join(cwd, 'images', 'dependencies')\n mkdirSync(destination, { recursive: true })\n const tracking = join(destination, '.managed.json')\n const previous: string[] = existsSync(tracking) ? JSON.parse(readFileSync(tracking, 'utf8')) : []\n const files: string[] = []\n const walk = (directory: string): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const source = join(directory, entry.name)\n if (source === destination || ['node_modules', '.git', '.hai', '.turbo', '.svelte-kit', '.pnpm-store', '.cache', 'dist', 'build', 'data', 'tmp', 'test-results', 'playwright-report'].includes(entry.name))\n continue\n if (entry.isDirectory()) {\n walk(source)\n continue\n }\n if (!entry.isFile() || !(entry.name === 'package.json' || entry.name === '.pnpmfile.cjs' || /\\.(?:tgz|patch)$/.test(entry.name)))\n continue\n const file = relative(cwd, source)\n mkdirSync(dirname(join(destination, file)), { recursive: true })\n const target = join(destination, file)\n if (!existsSync(target) || !readFileSync(source).equals(readFileSync(target)))\n copyFileSync(source, target)\n files.push(file)\n }\n }\n walk(cwd)\n for (const file of previous) {\n const target = resolve(destination, file)\n if (!files.includes(file) && !relative(destination, target).startsWith('..'))\n rmSync(target, { force: true })\n }\n const content = `${JSON.stringify(files)}\\n`\n if (!existsSync(tracking) || readFileSync(tracking, 'utf8') !== content)\n writeFileSync(tracking, content)\n}\n\n/** 将当前目录名转为安全镜像名称。 */\nfunction basenameSafe(directory: string): string {\n return directory.slice(dirname(directory).length + 1).toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/^-+/, '') || 'app'\n}\n","/** 部署向导:逐项配置实际依赖的中间件,不以文件存在代替有效连接配置。 */\nimport type { DeploymentEnvironment, MiddlewareBackend, MiddlewareField, MiddlewareMode, MiddlewareRequirement, ScanResult } from '@h-ai/deploy'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport prompts from 'prompts'\nimport { isMap, isScalar, parseDocument } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { moduleEnvironmentVariables } from './cli-config-environment.js'\n\ntype DeployModule = typeof import('@h-ai/deploy')\n\n/**\n * 展示连接配置时保留可核对的后端/地址,隐藏密码、令牌和 URL 认证部分。\n * @example `displayDeployValue('HAI_DB', '{\"type\":\"mysql\",\"password\":\"secret\"}')`\n */\nexport function displayDeployValue(name: string, value: string): string {\n if (/PASSWORD|SECRET|TOKEN|APIKEY|PRIVATEKEY|ACCESSKEY|AUTHORIZATION/i.test(name.replace(/[^a-z0-9]/gi, '')) || /(?:^|_)PASS$/i.test(name) || value.includes('PRIVATE KEY'))\n return cliM('cli_deploy_secret')\n try {\n const parsed: unknown = JSON.parse(value)\n if (parsed && typeof parsed === 'object') {\n const sanitize = (object: unknown): unknown => {\n if (Array.isArray(object))\n return object.map(sanitize)\n if (object && typeof object === 'object')\n return Object.fromEntries(Object.entries(object).map(([key, item]) => [key, /PASSWORD|SECRET|TOKEN|APIKEY|PRIVATEKEY|ACCESSKEY|AUTHORIZATION/i.test(key.replace(/[^a-z0-9]/gi, '')) || /(?:^|_)PASS$/i.test(key) ? cliM('cli_deploy_secret') : typeof item === 'string' ? displayDeployValue(key, item) : sanitize(item)]))\n return object\n }\n return JSON.stringify(sanitize(parsed))\n }\n }\n catch { /* 普通连接字符串无需 JSON 处理。 */ }\n try {\n const url = new URL(value)\n if (url.username || url.password) {\n url.username = '***'\n url.password = '***'\n }\n for (const key of url.searchParams.keys()) {\n if (/password|secret|token|key|authorization/i.test(key))\n url.searchParams.set(key, '***')\n }\n return url.toString()\n }\n catch {\n return value\n }\n}\n\n/** 凭据输入字段,名称与 deploy 公开配置 Schema 相同。 */\nconst CLOUD_FIELDS: Record<string, string[]> = {\n 'neon': ['apiKey'],\n 'upstash': ['email', 'apiKey'],\n 'cloudflare-r2': ['accountId', 'apiToken', 'accessKeyId', 'secretAccessKey'],\n 'resend': ['apiKey', 'from'],\n 'aliyun': ['accessKeyId', 'accessKeySecret', 'signName'],\n}\n\n/** 解析目标环境显式声明的配置,仅用于判断是否允许跳过。 */\nfunction targetConfig(requirement: MiddlewareRequirement, environment: DeploymentEnvironment): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const parent = environment.targetValues[requirement.envPrefix]\n if (parent) {\n try {\n Object.assign(result, JSON.parse(parent))\n }\n catch { return {} }\n }\n for (const [key, value] of Object.entries(environment.targetValues)) {\n if (key.startsWith(`${requirement.envPrefix}_`))\n result[key.slice(requirement.envPrefix.length + 1).toLowerCase()] = value\n }\n return result\n}\n\n/**\n * 只有目标文件显式声明了当前后端及必要连接项,才允许保持不变。\n * 凭据仍可来自 .env.local/进程;其他环境的配置不能让此选项出现。\n * @example `canKeepMiddleware(requirement, backend, prodEnvironment)`\n */\nexport function canKeepMiddleware(requirement: MiddlewareRequirement, backend: MiddlewareBackend, environment: DeploymentEnvironment): boolean {\n const target = targetConfig(requirement, environment)\n if (requirement.service === 'ldap' && backend.backend === 'disabled')\n return environment.targetValues.HAI_IAM_LOGIN_LDAP === 'false'\n if (requirement.service === 'ldap') {\n if (!Object.keys(target).length)\n return false\n }\n else if (target.type !== backend.backend) {\n return false\n }\n return backend.fields.filter(field => field.required && !field.secret).every((field) => {\n if ((target.url || (requirement.config.url && Object.keys(target).length)) && ['host', 'port'].includes(field.name))\n return true\n return (target[field.name] !== undefined && target[field.name] !== '') || (target[field.name.toLowerCase()] !== undefined && target[field.name.toLowerCase()] !== '')\n }) && backend.fields.filter(field => field.required && field.secret).every(field => Boolean(requirement.config[field.name] || environment.values[`${requirement.envPrefix}_${field.name.toUpperCase()}`]))\n}\n\n/** 用户取消与缺少非交互输入都必须停止,禁止使用未回答的隐含默认值。 */\nasync function ask(question: prompts.PromptObject): Promise<unknown> {\n const answer = await prompts({ ...question, name: 'value' })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return answer.value\n}\n\n/** 校验连接字段;与模块 Schema 的基础取值约束一致。 */\nfunction validateField(value: string, field: MiddlewareField): boolean | string {\n if (value === '')\n return field.required ? cliM('cli_deploy_required') : true\n if (field.kind === 'port')\n return (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'number')\n return (/^\\d+$/.test(value) && Number(value) >= (field.minimum ?? 0) && Number(value) <= (field.maximum ?? Number.MAX_SAFE_INTEGER)) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'boolean')\n return ['true', 'false'].includes(value) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'url') {\n try {\n return Boolean(new URL(value).protocol)\n }\n catch { return cliM('cli_deploy_invalid_value') }\n }\n if (field.name === 'ssl') {\n const parsed = parseDocument(value)\n const ssl: unknown = parsed.errors.length ? undefined : parsed.toJS()\n return (typeof ssl === 'boolean' || ['require', 'prefer', 'allow', 'disable'].includes(String(ssl)) || (ssl !== null && typeof ssl === 'object' && !Array.isArray(ssl))) || cliM('cli_deploy_invalid_value')\n }\n if (field.name === 'headers') {\n try {\n const headers: unknown = JSON.parse(value)\n return (headers !== null && typeof headers === 'object' && !Array.isArray(headers) && Object.values(headers).every(item => typeof item === 'string')) || cliM('cli_deploy_invalid_value')\n }\n catch {\n return cliM('cli_deploy_invalid_value')\n }\n }\n if (field.name === 'method')\n return ['POST', 'PUT'].includes(value) || cliM('cli_deploy_invalid_value')\n return true\n}\n\n/** 连接配置的声明节点必须存在,约定变量才能覆盖原 YAML 未启用的可选功能。 */\nfunction ensureConfigNode(appDir: string, requirement: MiddlewareRequirement, backend: string): void {\n if (requirement.service === 'ldap' && backend === 'disabled')\n return\n const directory = join(appDir, 'config')\n mkdirSync(directory, { recursive: true })\n const path = join(directory, `_${requirement.configName}.yml`)\n const document = parseDocument(existsSync(path) ? readFileSync(path, 'utf8') : '{}\\n')\n if (document.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (requirement.configPath.length && !document.hasIn(requirement.configPath))\n document.setIn(requirement.configPath, document.createNode(requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service, type: backend } : {}))\n if (requirement.service === 'ldap') {\n if (!document.hasIn(['login']))\n document.set('login', document.createNode({}))\n if (!document.hasIn(['login', 'ldap']))\n document.setIn(['login', 'ldap'], `\\${HAI_IAM_LOGIN_LDAP:false}`)\n }\n const content = document.toString()\n if (!existsSync(path) || readFileSync(path, 'utf8') !== content)\n writeFileSync(path, content)\n}\n\n/** 保存单个连接对象;整体覆盖可避免旧 URL 或不兼容后端字段残留。 */\nfunction connectionEnv(requirement: MiddlewareRequirement, backend: string, config: Record<string, unknown>): Record<string, string> {\n if (requirement.service === 'ldap')\n return backend === 'disabled' ? { HAI_IAM_LOGIN_LDAP: 'false' } : { HAI_IAM_LOGIN_LDAP: 'true', [requirement.envPrefix]: JSON.stringify(config) }\n return { [requirement.envPrefix]: JSON.stringify({ ...config, type: backend }) }\n}\n\n/**\n * 逐项收集处理方式、后端和连接参数;返回值用于过滤云开通器和 Compose 服务。\n * @example `await configureDeployMiddleware(module, scan, environment, config, false)`\n */\nexport async function configureDeployMiddleware(module: DeployModule, scan: ScanResult, environment: DeploymentEnvironment, config: Record<string, unknown>, yes = false): Promise<Partial<Record<string, MiddlewareMode>>> {\n const modes: Partial<Record<string, MiddlewareMode>> = {}\n const services: Record<string, unknown> = {}\n const existingServices = config.services && typeof config.services === 'object' ? config.services as Record<string, unknown> : {}\n const provider = config.provider as { type?: string } | undefined\n for (const requirement of scan.middlewares ?? []) {\n const choices = module.DEPLOY_MIDDLEWARE[requirement.service]\n const current = choices.find(item => item.backend === requirement.backend)\n if (!current)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: requirement.backend } }))\n writeCliMessage(cliM('cli_deploy_middleware', { params: { service: requirement.service, backend: current.label, purpose: module.describeMiddlewareBackend(current), source: requirement.source } }))\n const canKeep = canKeepMiddleware(requirement, current, environment)\n const mode = yes\n ? canKeep ? 'keep' : 'default'\n : await ask({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_action', { params: { service: requirement.service } }),\n choices: [\n { title: cliM('cli_deploy_default'), value: 'default' },\n { title: cliM('cli_deploy_custom'), value: 'custom' },\n ...(canKeep ? [{ title: cliM('cli_deploy_keep'), value: 'keep' }] : []),\n ],\n }) as MiddlewareMode\n modes[requirement.envPrefix] = mode\n // 同类服务可有多个 Provider;保留每项选择,聚合值仅用于选择云开通器。\n const previous = modes[requirement.service]\n modes[requirement.service] = previous === 'default' || mode === 'default' ? 'default' : previous === 'custom' || mode === 'custom' ? 'custom' : 'keep'\n if (mode === 'keep') {\n if (!canKeep)\n throw new Error(cliM('cli_deploy_missing_keep', { params: { service: requirement.service } }))\n continue\n }\n const backendName = yes ? current.backend : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_backend', { params: { service: requirement.service } }), initial: choices.indexOf(current), choices: choices.map(item => ({ title: `${item.label} — ${module.describeMiddlewareBackend(item)}`, value: item.backend })) }))\n const backend = choices.find(item => item.backend === backendName)\n if (!backend)\n throw new Error(cliM('cli_deploy_invalid_value'))\n requirement.backend = backendName\n const updates: Record<string, string> = {}\n if (mode === 'default' && backendName === 's3' && provider?.type === 'docker-ssh') {\n const container = config.container && typeof config.container === 'object' ? config.container as Record<string, unknown> : {}\n const currentEngine = container.s3Engine === 'minio' ? 'minio' : 'rustfs'\n const engine = yes ? currentEngine : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_s3_engine'), initial: currentEngine === 'rustfs' ? 0 : 1, choices: [{ title: 'RustFS', value: 'rustfs' }, { title: 'MinIO', value: 'minio' }] }))\n if (!['rustfs', 'minio'].includes(engine))\n throw new Error(cliM('cli_deploy_invalid_value'))\n config.container = { ...container, s3Engine: engine }\n updates.HAI_DEPLOY_CONTAINER_S3ENGINE = engine\n const deploymentFile = join(scan.appDir ?? '.', 'config', '_deploy.yml')\n const deployment = parseDocument(readFileSync(deploymentFile, 'utf8'))\n if (deployment.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (!deployment.hasIn(['container', 's3Engine'])) {\n const node = deployment.get('container', true)\n if (node === undefined || (isScalar(node) && node.value === null))\n deployment.set('container', deployment.createNode({}))\n else if (!isMap(node))\n throw new Error(cliM('cli_deploy_yaml_node', { params: { path: deploymentFile, field: 'container' } }))\n deployment.setIn(['container', 's3Engine'], `\\${HAI_DEPLOY_CONTAINER_S3ENGINE:rustfs}`)\n writeFileSync(deploymentFile, deployment.toString())\n }\n }\n if (mode === 'default' && provider?.type === 'vercel') {\n if (!backend.provisioner)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const prior = existingServices[requirement.service]\n const priorConfig = prior && typeof prior === 'object' ? prior as Record<string, unknown> : {}\n const cloud: Record<string, string> = { provisioner: backend.provisioner }\n for (const name of CLOUD_FIELDS[backend.provisioner]) {\n const key = `HAI_DEPLOY_SERVICES_${requirement.service.toUpperCase()}_${name.toUpperCase()}`\n const initial = String(priorConfig[name] ?? environment.values[key] ?? '')\n const label = `${backend.label} — ${cliM(`cli_deploy_cloud_input_${name}` as Parameters<typeof cliM>[0])}`\n const value = yes ? initial : String(await ask({ type: /key|token|secret/i.test(name) ? 'password' : 'text', name: 'value', message: label, initial, validate: input => Boolean(input) || cliM('cli_deploy_required') }))\n if (!value)\n throw new Error(`${label}: ${cliM('cli_deploy_required')}`)\n cloud[name] = value\n updates[key] = value\n }\n services[requirement.service] = cloud\n }\n else {\n if (mode === 'default' && (requirement.service === 'sms' || backendName === 'api'))\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const connection: Record<string, unknown> = mode === 'custom' && backendName === current.backend ? { ...requirement.config } : requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service } : {}\n for (const field of backend.fields) {\n const previous = backendName === current.backend ? requirement.config[field.name] : undefined\n const initial = previous === undefined ? field.defaultValue ?? '' : typeof previous === 'object' ? JSON.stringify(previous) : String(previous)\n const variable = `${requirement.envPrefix}_${field.name.toUpperCase()}`\n const info = moduleEnvironmentVariables(requirement.configName).find(item => item.name === variable)\n const value = mode === 'custom' && !yes ? String(await ask({ type: field.secret ? 'password' : 'text', name: 'value', message: cliM('cli_deploy_field', { params: { name: variable, description: info?.description ?? field.name, constraint: info?.constraint ?? field.kind ?? 'string' } }), initial, validate: input => validateField(String(input), field) })) : initial\n // 默认的服务端凭据由 sidecar/云开通器生成,不要求用户填写。\n if (value !== '') {\n connection[field.name] = field.kind === 'number' || field.kind === 'port' ? Number(value) : field.kind === 'boolean' ? value === 'true' : field.name === 'headers' || field.name === 'ssl' ? parseDocument(value).toJS() : value\n }\n else {\n delete connection[field.name]\n }\n }\n Object.assign(updates, connectionEnv(requirement, backendName, connection))\n }\n ensureConfigNode(scan.appDir ?? '.', requirement, backendName)\n const saved = module.saveDeploymentEnvironment(environment, updates)\n if (!saved.success)\n throw new Error(saved.error.message)\n for (const [name, value] of Object.entries(updates)) {\n writeCliMessage(cliM('cli_deploy_saved', { params: { name, value: displayDeployValue(name, value) } }))\n }\n }\n // 仅默认选项对应的云服务参与初始化/开通;custom/keep 不认证、不创建。\n config.services = Object.keys(services).length ? services : undefined\n return modes\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { DeploymentEnvironment } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { buildCommand } from './cli-build.js'\nimport { configureDeployMiddleware, displayDeployValue } from './cli-deploy-middleware.js'\n\n/** deploy 命令选项 */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 部署环境;省略时必须交互输入。 */\n env?: string\n /** 环境文件目录,默认扫描应用/workspace 根。 */\n envDir?: string\n /** 非交互模式:保留完整的目标配置,其余采用当前后端默认配置。 */\n yes?: boolean\n /** 应用目录 */\n appDir?: string\n /** 项目名称(覆盖自动检测) */\n projectName?: string\n /** 已配置完备,跳过全部中间件处理并直接部署。 */\n skipMiddleware?: boolean\n /** 已构建镜像目录。 */\n artifactDir?: string\n /** 本次更新的服务,逗号分隔。 */\n services?: string\n /** 先构建镜像。 */\n build?: boolean\n /** 本地容器引擎。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 构建阶段的网络与原生依赖设置。 */\n network?: string\n sqlitePrebuildMirror?: string\n httpProxy?: boolean\n /** 只生成 tar,手工搬运。 */\n bundleOnly?: boolean\n /** 部署 tar 输出路径。 */\n output?: string\n}\n\n/** 配置输入中的可选对象;不让未完成的配置绕过最终 Provider Schema。 */\nfunction configObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/**\n * 补齐部署目标,完整配置直接复用;本机 SSH 参数和平台 Token 只写 `.env.local`。\n * @example 首次输入主机和密钥路径后,下次执行 `hai deploy --env prod` 自动复用。\n */\nasync function configureDeployTarget(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean, bundleOnly?: boolean): Promise<void> {\n if (bundleOnly) {\n const existing = configObject(config.provider)\n if (existing.type && existing.type !== 'docker-ssh')\n throw new Error(cliM('cli_deploy_bundle_provider'))\n config.provider = { type: 'docker-ssh', remote: { runtime: 'auto' }, expose: { hostPort: 3000 }, ...existing }\n }\n const current = module.ProviderConfigSchema.safeParse(config.provider)\n if (current.success && (bundleOnly || current.data.type !== 'docker-ssh' || current.data.ssh)) {\n config.provider = current.data\n writeCliMessage(cliM('cli_deploy_target_reused', { params: { target: current.data.type === 'docker-ssh' ? current.data.ssh ? `${current.data.ssh.username}@${current.data.ssh.host}:${current.data.ssh.port}` : cliM('cli_deploy_bundle_local') : 'Vercel' } }))\n return\n }\n if (nonInteractive)\n throw new Error(cliM('cli_deploy_target_missing', { params: { fields: current.success ? 'provider.ssh' : current.error.issues.map(issue => `provider.${issue.path.join('.')}`).join(', ') } }))\n\n const original = configObject(config.provider)\n const platform = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_platform'),\n choices: [{ title: cliM('cli_deploy_target_ssh'), value: 'docker-ssh' }, { title: 'Vercel', value: 'vercel' }],\n initial: original.type === 'vercel' ? 1 : 0,\n })\n if (!platform.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n\n const input = async (name: string, initial: unknown, options: { optional?: boolean, secret?: boolean, port?: boolean } = {}): Promise<string> => {\n const answer = await prompts({\n type: options.secret ? 'password' : 'text',\n name: 'value',\n message: cliM(`cli_deploy_input${name.split('_').at(-1)}` as Parameters<typeof cliM>[0]),\n initial: options.secret ? undefined : initial === undefined ? '' : String(initial),\n validate: (value: string) => options.port\n ? (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_port_invalid')\n : options.optional || !!value.trim() || cliM('cli_deploy_invalid_value'),\n })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return String(answer.value).trim()\n }\n let provider: Record<string, unknown>\n if (platform.value === 'docker-ssh') {\n writeCliMessage(cliM('cli_deploy_target_ssh_hint'))\n const ssh = configObject(original.ssh)\n const remote = configObject(original.remote)\n const expose = configObject(original.expose)\n const host = await input('HAI_DEPLOY_PROVIDER_SSH_HOST', ssh.host)\n const port = Number(await input('HAI_DEPLOY_PROVIDER_SSH_PORT', ssh.port ?? 22, { port: true }))\n const username = await input('HAI_DEPLOY_PROVIDER_SSH_USERNAME', ssh.username)\n const identityFile = await input('HAI_DEPLOY_PROVIDER_SSH_IDENTITYFILE', ssh.identityFile, { optional: true })\n const knownHostsFile = await input('HAI_DEPLOY_PROVIDER_SSH_KNOWNHOSTSFILE', ssh.knownHostsFile, { optional: true })\n const baseDir = await input('HAI_DEPLOY_PROVIDER_REMOTE_BASEDIR', remote.baseDir || '/opt/hai/apps')\n const runtime = await prompts({ type: 'select', name: 'value', message: cliM('cli_deploy_target_runtime'), choices: ['auto', 'podman', 'docker'].map(value => ({ title: value, value })), initial: ['auto', 'podman', 'docker'].indexOf(String(remote.runtime ?? 'auto')) })\n if (!runtime.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n const hostPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_HOSTPORT', expose.hostPort || 3000, { port: true }))\n const containerPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_CONTAINERPORT', expose.containerPort || 3000, { port: true }))\n provider = {\n type: 'docker-ssh',\n ssh: { ...ssh, host, port, username, identityFile: identityFile || undefined, knownHostsFile: knownHostsFile || undefined },\n remote: { ...remote, baseDir, runtime: runtime.value },\n expose: { type: 'port', hostPort, containerPort },\n }\n }\n else {\n provider = { type: 'vercel', token: await input('HAI_DEPLOY_PROVIDER_TOKEN', undefined, { secret: true }) }\n }\n const validated = module.ProviderConfigSchema.safeParse(provider)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: JSON.stringify(validated.data) }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = validated.data\n writeCliMessage(cliM('cli_deploy_target_saved'))\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n * @example `await deployCommand({ env: 'prod', skipMiddleware: true, yes: true })`\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n let appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n let restoreProjectLogger: (() => void) | undefined\n const originalEnv = { ...process.env }\n const previousLogLevel = core.logger.getLevel()\n core.logger.setLevel('fatal')\n\n try {\n if (options.runtime && !['auto', 'podman', 'docker'].includes(options.runtime))\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.artifactDir && options.build)\n throw new Error(cliM('cli_deploy_build_artifact_conflict'))\n if (!options.build && (options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false))\n throw new Error(cliM('cli_deploy_build_options_required'))\n let selectedServices = options.services?.split(',').map(name => name.trim())\n if (selectedServices && (!selectedServices.length || selectedServices.some(name => !/^[a-z][a-z0-9-]*$/.test(name)) || new Set(selectedServices).size !== selectedServices.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n // 环境选择是第一步;取消、无 TTY 或缺文件均不能继续认证/开通资源。\n let environmentName = options.env\n if (!environmentName) {\n if (!process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n const answer = await prompts({ type: 'text', name: 'environment', message: cliM('cli_deploy_environment'), initial: 'prod' })\n environmentName = answer.environment\n if (!environmentName)\n throw new Error(cliM('cli_deploy_cancelled'))\n }\n if (!options.yes && !process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n // 全局安装的 CLI 先使用目标工程的 deploy 版本,不依赖 CLI 的开发依赖。\n const localRequire = createRequire(resolve(appDir, 'package.json'))\n try {\n const { core: projectCore } = await import(pathToFileURL(localRequire.resolve('@h-ai/core')).href) as typeof import('@h-ai/core')\n if (projectCore !== core) {\n const level = projectCore.logger.getLevel()\n projectCore.logger.setLevel('fatal')\n restoreProjectLogger = () => projectCore.logger.setLevel(level)\n }\n }\n catch { /* 未安装项目依赖时,由 deploy 导入错误统一提示。 */ }\n let localModule: string | undefined\n try {\n localModule = localRequire.resolve('@h-ai/deploy')\n }\n catch { /* 源码仓库或直接模块测试可使用 CLI 本身可解析的安装。 */ }\n deployModule = localModule ? await import(pathToFileURL(localModule).href) : await import('@h-ai/deploy')\n }\n catch {\n writeCliError(chalk.red(cliM('cli_deploy_module_missing')))\n writeCliMessage(chalk.cyan(' pnpm add -D @h-ai/deploy'))\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n\n const { deploy } = deployModule\n\n const scanResult = await deploy.scan(appDir, { environment: environmentName, envDir: options.envDir ? resolve(cwd, options.envDir) : undefined })\n if (!scanResult.success)\n throw new Error(cliM('cli_deploy_scan_failed', { params: { message: scanResult.error.message } }))\n const scan = scanResult.data\n appDir = scan.appDir ?? appDir\n let buildRoot = appDir\n while (!existsSync(resolve(buildRoot, 'hai.build.json')) && dirname(buildRoot) !== buildRoot)\n buildRoot = dirname(buildRoot)\n const buildFile = resolve(buildRoot, 'hai.build.json')\n const buildConfig: { images?: Array<{ name: string }> } = existsSync(buildFile) ? JSON.parse(readFileSync(buildFile, 'utf8')) : {}\n const names = [...(buildConfig.images?.map(image => image.name) ?? ['app', 'web']), ...(scan.middlewares ?? []).filter(item => !['sqlite', 'local', 'memory', 'disabled', 'console', 'lancedb'].includes(item.backend)).map(item => item.service)]\n const available = [...new Set(names)]\n if (selectedServices?.some(name => !available.includes(name)))\n throw new Error(cliM('cli_deploy_services_invalid', { params: { services: available.join(', ') } }))\n const environment = deployModule.loadDeploymentEnvironment({ environment: environmentName, envDir: scan.envDir ?? appDir })\n if (!environment.success)\n throw new Error(environment.error.message)\n Object.assign(process.env, environment.data.values)\n\n // 1. 加载凭证\n spinner.start(cliM('cli_deploy_load_credentials'))\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n throw new Error(cliM('cli_deploy_credentials_failed', { params: { message: credResult.error.message } }))\n }\n spinner.succeed(cliM('cli_deploy_credentials_loaded', { params: { count: credResult.data.length } }))\n\n // 2. 读取部署配置\n spinner.start(cliM('cli_deploy_load_config'))\n const configPath = resolve(appDir, 'config', '_deploy.yml')\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(cliM('cli_deploy_config_missing', { params: { path: configPath } })))\n writeCliMessage(chalk.cyan(cliM('cli_deploy_config_hint')))\n throw new Error(cliM('cli_deploy_config_missing', { params: { path: configPath } }))\n }\n\n const loadedConfig = deployModule.loadDeploymentConfig('deploy', configPath, process.env)\n if (!loadedConfig.success)\n throw new Error(loadedConfig.error.message)\n const deployConfig = loadedConfig.data\n spinner.succeed(cliM('cli_deploy_config_loaded'))\n if (!options.build && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n let artifactDirectory = options.artifactDir ? resolve(cwd, options.artifactDir) : resolve(buildRoot, '.hai/build/docker')\n if (existsSync(resolve(artifactDirectory, 'latest'))) {\n const pointer = readFileSync(resolve(artifactDirectory, 'latest'), 'utf8').trim()\n if (!/^[a-z0-9][\\w.+-]*$/i.test(pointer))\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n artifactDirectory = resolve(artifactDirectory, pointer)\n }\n if (existsSync(resolve(artifactDirectory, 'manifest.json'))) {\n try {\n const artifact = await deployModule.readDeploymentArtifact(artifactDirectory)\n if (artifact.partial)\n selectedServices = artifact.images.map(image => image.name)\n }\n catch {\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n }\n }\n }\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes, options.bundleOnly)\n if (configObject(deployConfig.provider).type !== 'docker-ssh' && (selectedServices || options.build))\n throw new Error(cliM('cli_deploy_bundle_provider'))\n\n if (!options.yes && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n if (existsSync(buildFile)) {\n if (available.length > 1) {\n const choice = await prompts({ type: 'multiselect', name: 'value', message: cliM('cli_deploy_choose_services'), choices: available.map(name => ({ title: name, value: name, selected: true })), min: 1 })\n if (!Array.isArray(choice.value) || choice.value.length === 0)\n throw new Error(cliM('cli_deploy_cancelled'))\n if (choice.value.length !== available.length)\n selectedServices = choice.value\n }\n }\n }\n\n spinner.succeed(cliM('cli_deploy_scanned', { params: { name: scan.appName, sveltekit: String(scan.isSvelteKit), services: scan.requiredServices.join(', ') || cliM('cli_deploy_none') } }))\n\n if (options.build) {\n if (!existsSync(buildFile))\n throw new Error(cliM('cli_build_images_missing'))\n const imageNames = selectedServices?.filter(name => ['app', 'web'].includes(name))\n if (!selectedServices || imageNames?.length) {\n writeCliMessage(cliM('cli_deploy_build_started'))\n await buildCommand({ cwd: buildRoot, target: 'docker', images: imageNames?.join(','), runtime: options.runtime, network: options.network, sqlitePrebuildMirror: options.sqlitePrebuildMirror, httpProxy: options.httpProxy })\n }\n }\n if (selectedServices)\n writeCliMessage(cliM('cli_deploy_services', { params: { services: selectedServices.join(', ') } }))\n let skipMiddleware = options.skipMiddleware || selectedServices?.every(name => ['app', 'web'].includes(name))\n if (!skipMiddleware && !options.yes && scan.requiredServices.length) {\n const action = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_middleware_plan'),\n choices: [{ title: cliM('cli_deploy_middleware_configure'), value: 'configure' }, { title: cliM('cli_deploy_middleware_skip'), value: 'skip' }],\n })\n if (!action.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n skipMiddleware = action.value === 'skip'\n }\n if (skipMiddleware)\n writeCliMessage(cliM('cli_deploy_middleware_skipped'))\n const serviceModes = skipMiddleware\n ? Object.fromEntries(scan.requiredServices.map(service => [service, 'keep' as const]))\n : await configureDeployMiddleware(deployModule, { ...scan, middlewares: scan.middlewares?.filter(item => !selectedServices || selectedServices.includes(item.service)) }, environment.data, deployConfig, options.yes)\n if (skipMiddleware)\n deployConfig.services = undefined\n // 刚写入文件的值不能被本次命令之前注入的快照覆盖;保留用户原有进程变量优先级。\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const refreshed = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!refreshed.success)\n throw new Error(refreshed.error.message)\n Object.assign(process.env, refreshed.data.values)\n\n // 4. 初始化 deploy 模块\n spinner.start(cliM('cli_deploy_initializing'))\n const validatedConfig = deployModule.DeployConfigSchema.safeParse(deployConfig)\n if (!validatedConfig.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: configPath, fields: validatedConfig.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n const initResult = await deploy.init(validatedConfig.data)\n if (!initResult.success) {\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: initResult.error.message } }))\n }\n closeDeploy = () => deploy.close()\n spinner.succeed(cliM('cli_deploy_initialized'))\n\n // 5. 执行部署\n spinner.start(cliM('cli_deploy_deploying'))\n const deployResult = await deploy.deployApp(appDir, {\n projectName: options.projectName,\n selectedServices,\n runtime: options.runtime,\n onProgress: stage => writeCliMessage(cliM(`cli_deploy_stage_${stage}`)),\n skipMiddleware,\n artifactDir: options.artifactDir ? resolve(cwd, options.artifactDir) : undefined,\n bundleOnly: options.bundleOnly,\n output: options.output ? resolve(cwd, options.output) : undefined,\n environment: environment.data.environment,\n envDir: environment.data.envDir,\n serviceModes,\n })\n\n if (!deployResult.success) {\n if (deployResult.error.ext?.recovery) {\n writeCliMessage(deployResult.error.suggestion ?? cliM('cli_deploy_command_failed'))\n }\n throw new Error(cliM('cli_deploy_failed', { params: { message: deployResult.error.message } }))\n }\n\n spinner.succeed(chalk.green(cliM(deployResult.data.status === 'packaged' ? 'cli_deploy_bundle_ready' : 'cli_deploy_success')))\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const completedEnvironment = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!completedEnvironment.success)\n throw new Error(completedEnvironment.error.message)\n for (const requirement of scan.middlewares ?? []) {\n if ((serviceModes[requirement.envPrefix] ?? serviceModes[requirement.service]) === 'keep')\n continue\n const value = completedEnvironment.data.values[requirement.envPrefix]\n if (value !== undefined)\n writeCliMessage(cliM('cli_deploy_saved', { params: { name: requirement.envPrefix, value: displayDeployValue(requirement.envPrefix, value) } }))\n }\n writeCliMessage('')\n if (deployResult.data.bundlePath)\n writeCliMessage(cliM('cli_deploy_bundle_path', { params: { path: deployResult.data.bundlePath } }))\n if (deployResult.data.status === 'packaged')\n writeCliMessage(deployResult.data.instructions ?? '')\n else\n writeCliMessage(chalk.cyan(cliM('cli_deploy_url', { params: { url: deployResult.data.url } })))\n writeCliMessage(chalk.gray(cliM('cli_deploy_id', { params: { id: deployResult.data.deploymentId } })))\n if (deployResult.data.envVarsSet.length > 0) {\n writeCliMessage(chalk.gray(cliM('cli_deploy_env', { params: { names: deployResult.data.envVarsSet.join(', ') } })))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(chalk.red(cliM('cli_deploy_command_failed')))\n writeCliError(error instanceof Error ? error.message : String(error))\n throw error\n }\n finally {\n if (closeDeploy) {\n try {\n await closeDeploy()\n }\n catch (error) {\n writeCliError('Failed to close deploy module', error)\n process.exitCode = 1\n }\n }\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n core.logger.setLevel(previousLogLevel)\n restoreProjectLogger?.()\n }\n}\n","/**\n * @h-ai/cli — 代码生成命令\n * @module cli-generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../cli-types.js'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { createTemplateContext, writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * 生成器配置\n */\nconst GENERATORS: Record<GeneratorType, {\n description: string\n defaultPath: string\n generate: (context: TemplateContext, outputDir: string) => Promise<Array<{ path: string, content: string }>>\n}> = {\n page: {\n description: 'SvelteKit 页面',\n defaultPath: 'src/routes',\n generate: generatePage,\n },\n component: {\n description: 'Svelte 组件',\n defaultPath: 'src/lib/components',\n generate: generateComponent,\n },\n api: {\n description: 'API 端点',\n defaultPath: 'src/routes/api',\n generate: generateApi,\n },\n model: {\n description: '数据模型',\n defaultPath: 'src/lib/models',\n generate: generateModel,\n },\n migration: {\n description: '数据库迁移',\n defaultPath: 'migrations',\n generate: generateMigration,\n },\n}\n\n/**\n * 生成代码\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检查是否在 hai 项目中\n const project = await detectProject(cwd)\n\n if (!project?.isHaiProject) {\n writeCliMessage(chalk.yellow('警告: 当前目录不是 hai 项目'))\n }\n\n // 交互式获取选项\n const resolvedOptions = await resolveGenerateOptions(options)\n const generator = GENERATORS[resolvedOptions.type]\n\n if (!generator) {\n throw new Error(`未知的生成器类型: ${resolvedOptions.type}`)\n }\n\n // 名称会同时进入路径、标识符与源码字符串,禁止路径片段和代码字符。\n if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i.test(resolvedOptions.name))\n throw new Error(cliM('cli_invalidGenerateName'))\n\n const outputDir = path.resolve(cwd, resolvedOptions.output || generator.defaultPath)\n\n // 安全校验:输出路径必须在当前工作目录内,防止路径遍历\n const resolvedCwd = path.resolve(cwd)\n if (!outputDir.startsWith(resolvedCwd + path.sep) && outputDir !== resolvedCwd) {\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n }\n\n const context = createTemplateContext(resolvedOptions.name, {\n projectName: project?.name,\n })\n\n spinner.start(`生成 ${generator.description}...`)\n\n const files = await generator.generate(context, outputDir)\n const realCwd = await fse.realpath(resolvedCwd)\n // 先检查全部目标,再落盘,避免页面的第二个文件冲突时已覆盖第一个。\n for (const file of files) {\n if (!resolvedOptions.force && await fse.pathExists(file.path))\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n let ancestor = file.path\n while (!await fse.pathExists(ancestor))\n ancestor = path.dirname(ancestor)\n const realAncestor = await fse.realpath(ancestor)\n const relative = path.relative(realCwd, realAncestor)\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n }\n for (const file of files) {\n await fse.ensureDir(path.dirname(file.path))\n await fse.writeFile(file.path, file.content, { encoding: 'utf-8', flag: resolvedOptions.force ? 'w' : 'wx' })\n }\n\n spinner.succeed()\n\n writeCliMessage('')\n writeCliMessage(chalk.green('✔ 生成完成!'))\n writeCliMessage('')\n writeCliMessage('创建的文件:')\n files.forEach((file) => {\n writeCliMessage(chalk.cyan(` ${path.relative(cwd, file.path)}`))\n })\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red('生成失败:'), { error })\n throw error\n }\n}\n\n/**\n * 解析生成选项\n */\nasync function resolveGenerateOptions(options: GenerateOptions): Promise<Required<GenerateOptions>> {\n const questions: prompts.PromptObject[] = []\n\n if (!options.type) {\n questions.push({\n type: 'select',\n name: 'type',\n message: '选择生成类型:',\n choices: Object.entries(GENERATORS).map(([key, value]) => ({\n title: `${key} - ${value.description}`,\n value: key,\n })),\n })\n }\n\n if (!options.name) {\n questions.push({\n type: 'text',\n name: 'name',\n message: '名称:',\n validate: (value: string) => {\n if (!value.trim())\n return '名称不能为空'\n return true\n },\n })\n }\n\n const answers = questions.length > 0 ? await prompts(questions) : {}\n\n return {\n type: options.type || answers.type,\n name: options.name || answers.name,\n output: options.output ?? '',\n force: options.force ?? false,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\n/**\n * 生成页面\n */\nasync function generatePage(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<!-- ${context.pascalCase} 页面 -->\n<svelte:head>\n <title>${context.pascalCase}</title>\n</svelte:head>\n\n<div class='container mx-auto p-4'>\n <h1 class='text-2xl font-bold mb-4'>${context.pascalCase}</h1>\n\n <!-- 页面内容 -->\n</div>\n`\n\n const pagePath = path.join(pageDir, '+page.svelte')\n files.push({ path: pagePath, content: pageContent })\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { Actions, PageServerLoad } from './$types'\n\nexport const load: PageServerLoad = async () => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async () => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // Component.svelte\n const componentContent = `<script lang='ts'>\n import type { Snippet } from 'svelte'\n\n /**\n * ${context.pascalCase} 组件\n */\n\n interface Props {\n /** 自定义 class */\n class?: string\n /** 子内容(Svelte 5 snippet) */\n children?: Snippet\n }\n\n const { class: className = '', children }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n {@render children?.()}\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n files.push({ path: componentPath, content: componentContent })\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const apiDir = path.join(outputDir, context.kebabCase)\n\n // +server.ts\n const serverContent = `/**\n * ${context.pascalCase} API\n */\nimport type { RequestHandler } from './$types'\nimport { kit } from '@h-ai/kit'\nimport { z } from 'zod'\n\n/** 示例输入;添加业务逻辑前扩展字段和约束。 */\nconst InputSchema = z.object({\n /** 业务名称(非空) */\n name: z.string().min(1),\n})\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = kit.handler(async ({ locals }) => {\n return kit.response.ok({ items: [] }, locals.requestId)\n})\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = kit.handler(async ({ request, locals }) => {\n const body = await kit.validate.body(request, InputSchema)\n // 校验通过后再执行业务操作;示例仅回传数据,不执行写入。\n return kit.response.ok(body, locals.requestId)\n})\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // model.ts\n const modelContent = `/**\n * ${context.pascalCase} 模型\n */\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} Schema\n */\nexport const ${context.camelCase}Schema = z.object({\n /** 记录唯一标识 */\n id: z.string(),\n /** 显示名称 */\n name: z.string().min(1),\n /** 创建时间 */\n createdAt: z.date(),\n /** 最后修改时间 */\n updatedAt: z.date(),\n})\n\n/**\n * 创建 ${context.pascalCase} Schema\n */\nexport const create${context.pascalCase}Schema = ${context.camelCase}Schema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n})\n\n/**\n * 更新 ${context.pascalCase} Schema\n */\nexport const update${context.pascalCase}Schema = create${context.pascalCase}Schema.partial()\n\n/**\n * ${context.pascalCase} 类型\n */\nexport type ${context.pascalCase} = z.infer<typeof ${context.camelCase}Schema>\nexport type Create${context.pascalCase} = z.infer<typeof create${context.pascalCase}Schema>\nexport type Update${context.pascalCase} = z.infer<typeof update${context.pascalCase}Schema>\n`\n\n const modelPath = path.join(outputDir, `${context.kebabCase}.ts`)\n files.push({ path: modelPath, content: modelContent })\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport { reldb } from '@h-ai/reldb'\n\n/** 升级:调用前初始化 reldb,调用方必须检查返回的 HaiResult。 */\nexport function up() {\n return reldb.ddl.createTable('hai_app_${context.snakeCase}', {\n id: { type: 'TEXT', primaryKey: true },\n name: { type: 'TEXT', notNull: true },\n created_at: { type: 'TIMESTAMP', notNull: true },\n updated_at: { type: 'TIMESTAMP', notNull: true },\n })\n}\n\n/** 回滚会删除整张表;由应用确认数据可删除后显式调用。 */\nexport function down() {\n return reldb.ddl.dropTable('hai_app_${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n files.push({ path: migrationPath, content: migrationContent })\n\n return files\n}\n","/**\n * @h-ai/cli — 项目初始化/校验命令\n *\n * 校验现有项目配置完整性,补全缺失的配置文件。\n * @module cli-init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../cli-types.js'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { fileExists, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * init 命令选项\n */\nexport interface InitOptions extends GlobalOptions {\n /** 强制重新生成配置 */\n force?: boolean\n}\n\n/**\n * 模块到配置文件的映射\n */\nconst MODULE_CONFIG_MAP: Record<string, { configKey: string, label: string }> = {\n '@h-ai/core': { configKey: 'core', label: 'Core' },\n '@h-ai/serv': { configKey: 'serv', label: 'Service' },\n '@h-ai/reldb': { configKey: 'db', label: 'Database' },\n '@h-ai/cache': { configKey: 'cache', label: 'Cache' },\n '@h-ai/iam': { configKey: 'iam', label: 'IAM' },\n '@h-ai/storage': { configKey: 'storage', label: 'Storage' },\n '@h-ai/ai': { configKey: 'ai', label: 'AI' },\n '@h-ai/vecdb': { configKey: 'vecdb', label: 'VecDB' },\n '@h-ai/reach': { configKey: 'reach', label: 'Reach' },\n '@h-ai/scheduler': { configKey: 'scheduler', label: 'Scheduler' },\n '@h-ai/audit': { configKey: 'audit', label: 'Audit' },\n '@h-ai/payment': { configKey: 'payment', label: 'Payment' },\n '@h-ai/deploy': { configKey: 'deploy', label: 'Deploy' },\n}\n\n/**\n * 校验结果\n */\ninterface ValidationResult {\n /** 已存在的配置 */\n existing: string[]\n /** 缺失的配置 */\n missing: Array<{ pkg: string, configKey: string, label: string }>\n /** 项目信息 */\n project: ProjectInfo\n}\n\n/**\n * 校验项目配置完整性\n */\nasync function validateProject(cwd: string): Promise<ValidationResult | null> {\n const project = await detectProject(cwd)\n if (!project) {\n return null\n }\n\n const existing: string[] = []\n const missing: ValidationResult['missing'] = []\n\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n if (await fileExists(configPath)) {\n existing.push(mapping.configKey)\n }\n else {\n missing.push({ pkg, configKey: mapping.configKey, label: mapping.label })\n }\n }\n\n return { existing, missing, project }\n}\n\n/**\n * 初始化/校验项目配置\n */\nexport async function initProject(options: InitOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n spinner.start('检测项目...')\n const result = await validateProject(cwd)\n\n if (!result) {\n spinner.fail(chalk.red('未检测到项目(找不到 package.json)'))\n return\n }\n\n const { project, existing, missing } = result\n spinner.succeed(`检测到项目: ${chalk.cyan(project.name)}`)\n\n // 即使配置齐备,也补全新增 AI 参考资源;已有项目规则与 Skill 不覆盖。\n if (project.isHaiProject) {\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(` + ${generatedFile}`))\n }\n }\n\n // 显示项目状态\n writeCliMessage('')\n writeCliMessage(chalk.bold('项目状态:'))\n writeCliMessage(` 名称: ${chalk.cyan(project.name)}`)\n writeCliMessage(` 版本: ${project.version}`)\n writeCliMessage(` 已安装模块: ${project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray('无')}`)\n writeCliMessage('')\n\n // 显示配置状态\n if (existing.length > 0) {\n writeCliMessage(chalk.bold('已有配置:'))\n for (const key of existing) {\n writeCliMessage(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n writeCliMessage('')\n writeCliMessage(chalk.green('✔ 所有配置文件已就绪!'))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n writeCliMessage('')\n writeCliMessage(chalk.bold('缺失配置:'))\n for (const item of missing) {\n writeCliMessage(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n writeCliMessage('')\n\n spinner.start('生成缺失配置文件...')\n let generated = 0\n for (const item of missing) {\n const configPath = path.join(cwd, 'config', `_${item.configKey}.yml`)\n const content = generateConfigFile(item.configKey)\n await writeFile(configPath, content)\n generated++\n }\n spinner.succeed(`已生成 ${generated} 个配置文件`)\n }\n\n // 强制模式:重新生成所有配置\n if (options.force && existing.length > 0) {\n writeCliMessage('')\n spinner.start('强制重新生成所有配置文件...')\n let regenerated = 0\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n const content = generateConfigFile(mapping.configKey)\n await writeFile(configPath, content)\n regenerated++\n }\n spinner.succeed(`已重新生成 ${regenerated} 个配置文件`)\n }\n\n // 检查 core 配置(始终需要)\n const coreConfigPath = path.join(cwd, 'config', '_core.yml')\n if (!(await fileExists(coreConfigPath))) {\n spinner.start('生成核心配置 config/_core.yml...')\n const content = generateConfigFile('core')\n await writeFile(coreConfigPath, content)\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green('✔ 项目配置初始化完成!'))\n writeCliMessage('')\n writeCliMessage(chalk.gray('下一步:'))\n writeCliMessage(chalk.gray(' 1. 编辑 config/ 中的配置文件'))\n writeCliMessage(chalk.gray(' 2. 运行 pnpm dev 启动开发服务'))\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red('初始化失败:'), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 主入口\n *\n * hai Agent Framework CLI\n * @module cli-main\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, FrontendTarget, GeneratorType } from './cli-types.js'\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { cliM } from './cli-i18n.js'\nimport { getCliVersion, writeCliMessage } from './cli-utils.js'\nimport { addModule, buildCommand, createProject, deployCommand, generate, initProject } from './commands/cli-commands.js'\n\n// CLI 版本(从 package.json 动态读取,避免硬编码与 npm 发布版本不一致)\nconst VERSION = getCliVersion()\n\n// 创建 CLI\nconst cli = cac('hai')\n\n// 全局选项\ncli.option('-v, --verbose', cliM('cli_help_verbose'))\ncli.option('-C, --cwd <path>', cliM('cli_help_cwd'))\n\n// 创建项目命令\ncli\n .command('create [name]', cliM('cli_help_create'))\n .option('--type <type>', cliM('cli_help_appType'))\n .option('--frontends <targets>', cliM('cli_help_frontends'))\n .option('-t, --template <template>', cliM('cli_help_template'))\n .option('-f, --features <features>', cliM('cli_help_features'))\n .option('--examples', cliM('cli_help_examples'))\n .option('--no-examples', cliM('cli_help_noExamples'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .option('--no-deploy', cliM('cli_help_noDeploy'))\n .option('-p, --package-manager <pm>', cliM('cli_help_packageManager'))\n .option('--no-git', cliM('cli_help_noGit'))\n .option('--git-remote <url>', cliM('cli_help_gitRemote'))\n .option('-y, --yes', cliM('cli_help_yes'))\n .action(async (name: string | undefined, options: Record<string, unknown>) => {\n try {\n // 解析功能列表\n const features = typeof options.features === 'string'\n ? options.features.split(',').map(f => f.trim()) as CreateProjectOptions['features']\n : undefined\n const frontends = typeof options.frontends === 'string'\n ? options.frontends.split(',').map(f => f.trim()).filter(Boolean) as FrontendTarget[]\n : undefined\n\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\n frontends,\n template: options.template as CreateProjectOptions['template'],\n features,\n deploy: options.deploy as boolean,\n examples: options.examples as boolean,\n install: options.install as boolean,\n packageManager: options.packageManager as CreateProjectOptions['packageManager'],\n git: options.git as boolean,\n gitRemote: options.gitRemote as string,\n yes: options.yes as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n // 保留自然退出,让终端/管道中的失败详情写完。\n process.exitCode = 1\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', cliM('cli_help_add'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .action(async (module: string | undefined, options: Record<string, unknown>) => {\n try {\n await addModule({\n module: module as FeatureId,\n install: options.install as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 初始化/校验配置\ncli\n .command('init', cliM('cli_help_init'))\n .option('-f, --force', cliM('cli_help_forceConfig'))\n .action(async (options: Record<string, unknown>) => {\n try {\n await initProject({\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 代码生成命令\ncli\n .command('generate [type] [name]', cliM('cli_help_generate'))\n .alias('g')\n .option('-o, --output <path>', cliM('cli_help_output'))\n .option('-f, --force', cliM('cli_help_force'))\n .action(async (type: string | undefined, name: string | undefined, options: Record<string, unknown>) => {\n try {\n await generate({\n type: type as GeneratorType,\n name: name ?? '',\n output: options.output as string,\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 构建与部署分别执行;构建不读取部署环境配置。\ncli\n .command('build', cliM('cli_help_build'))\n .option('--target <target>', cliM('cli_help_target'))\n .option('--images <names>', cliM('cli_help_images'))\n .option('--runtime <runtime>', cliM('cli_help_buildRuntime'))\n .option('--network <network>', cliM('cli_help_buildNetwork'))\n .option('--platform <platform>', cliM('cli_help_platform'))\n .option('--arch <arch>', cliM('cli_help_arch'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_sqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_noHttpProxy'))\n .action(async (options: Parameters<typeof buildCommand>[0]) => {\n try {\n await buildCommand(options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 部署命令\ncli\n .command('deploy [appDir]', cliM('cli_help_deploy'))\n .option('--env <environment>', cliM('cli_help_environment'))\n .option('--env-dir <path>', cliM('cli_help_envDir'))\n .option('-y, --yes', cliM('cli_help_deployYes'))\n .option('--project-name <name>', cliM('cli_help_projectName'))\n .option('--skip-middleware', cliM('cli_help_skipMiddleware'))\n .option('--artifact-dir <path>', cliM('cli_help_artifactDir'))\n .option('--services <names>', cliM('cli_help_services'))\n .option('--build', cliM('cli_help_deployBuild'))\n .option('--network <network>', cliM('cli_help_deployNetwork'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_deploySqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_deployNoProxy'))\n .option('--runtime <runtime>', cliM('cli_help_deployRuntime'))\n .option('--bundle-only', cliM('cli_help_bundleOnly'))\n .option('--output <path>', cliM('cli_help_bundleOutput'))\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n env: options.env as string,\n envDir: options.envDir as string,\n yes: options.yes as boolean,\n projectName: options.projectName as string,\n skipMiddleware: options.skipMiddleware as boolean,\n artifactDir: options.artifactDir as string,\n services: options.services as string,\n build: options.build as boolean,\n network: options.network as string,\n sqlitePrebuildMirror: options.sqlitePrebuildMirror as string,\n httpProxy: options.httpProxy as boolean,\n runtime: options.runtime as 'auto' | 'podman' | 'docker',\n bundleOnly: options.bundleOnly as boolean,\n output: options.output as string,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exitCode = 1\n }\n })\n\n// 快捷生成命令\ncli\n .command('g:page <name>', cliM('cli_help_generatePage'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'page', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:component <name>', cliM('cli_help_generateComponent'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'component', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:api <name>', cliM('cli_help_generateApi'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'api', name, cwd: options.cwd as string })\n })\n\ncli\n .command('g:model <name>', cliM('cli_help_generateModel'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'model', name, cwd: options.cwd as string })\n })\n\n// 版本和帮助\ncli.version(VERSION, '-V, --version')\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n writeCliMessage('')\n writeCliMessage(chalk.cyan('hai Agent Framework CLI'))\n writeCliMessage('')\n cli.outputHelp()\n}\n"]}
1
+ {"version":3,"sources":["../src/cli-utils.ts","../src/commands/cli-template-engine.ts","../src/commands/cli-create.ts","../src/commands/cli-add.ts","../src/commands/cli-build.ts","../../reldb/src/reldb-config.ts","../src/commands/cli-deploy-middleware.ts","../src/commands/cli-deploy.ts","../src/commands/cli-generate-serv.ts","../src/commands/cli-generate-target.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/cli-main.ts"],"names":["process","fs","path","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","generateProductionEnvironment","ora","chalk","prompts","generatedFiles","pkg","execSync","resolve","relative","runtime","randomBytes","parsed","join","mkdirSync","existsSync","readFileSync","writeFileSync","previous","provider","dirname","name"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/cli — 工具函数\n * @module cli-utils\n */\n\nimport type { TemplateContext } from './cli-types.js'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { wrapAnsi } from 'fast-wrap-ansi'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\n\n/**\n * CLI 交互提示直接写终端,不能交给异步 JSON 日志 transport。\n * @param message - 已完成本地化的终端文案。\n * @example 模块内部上下文\n * ```ts\n * writeCliMessage('hai --help') // 调用方先完成用户文案的本地化。\n * ```\n */\nexport function writeCliMessage(message: string): void {\n process.stdout.write(`${message}\\n`)\n}\n\n/**\n * 显示异常的 message,保留子命令输出;Error 的不可枚举属性不能依赖 JSON 序列化。\n * @param message - 已完成本地化的终端文案。\n * @param error - 可选原始错误或包装对象,用于提取诊断信息。\n * @example 模块内部上下文\n * ```ts\n * writeCliError('Build failed', new Error('The compile command exited with code 1'))\n * ```\n */\nexport function writeCliError(message: string, error?: unknown): void {\n process.stderr.write(`${message}\\n`)\n if (error && typeof error === 'object' && 'error' in error)\n error = error.error\n if (error !== undefined)\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n}\n\n/**\n * 显式按显示宽度换行,为 prompts 的前缀和缩进预留空间,避免中文自动折行后擦除不足。\n * @param description - 需按终端显示宽度折行的描述。\n * @returns 为提示前缀预留显示宽度后的文本。\n * @example 模块内部上下文\n * ```ts\n * const description = formatPromptDescription('Redis stores shared sessions across application instances.')\n * ```\n */\nexport function formatPromptDescription(description: string): string {\n return wrapAnsi(description, Math.max(1, (process.stdout.columns || 80) - 32), { hard: true })\n}\n\n/**\n * 转换为驼峰命名\n * @param str - 待转换的名称。\n * @returns 首字母小写的驼峰名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toCamelCase('order-item') // orderItem\n * ```\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : '')\n .replace(LEADING_CHAR_REGEX, c => c.toLowerCase())\n}\n\n/**\n * 转换为帕斯卡命名\n * @param str - 待转换的名称。\n * @returns 首字母大写的名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toPascalCase('order-item') // OrderItem\n * ```\n */\nexport function toPascalCase(str: string): string {\n const camel = toCamelCase(str)\n return camel.charAt(0).toUpperCase() + camel.slice(1)\n}\n\n/**\n * 转换为短横线命名\n * @param str - 待转换的名称。\n * @returns 小写连字符名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toKebabCase('orderItem') // order-item\n * ```\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\n/**\n * 转换为下划线命名\n * @param str - 待转换的名称。\n * @returns 小写下划线名称。\n * @example 模块内部上下文\n * ```ts\n * const name = toSnakeCase('orderItem') // order_item\n * ```\n */\nexport function toSnakeCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase()\n}\n\n/**\n * 创建模板上下文\n * @param name - 生成对象名称;用于派生四种大小写形式。\n * @param extra - 附加模板字段;同名字段会覆盖自动生成的名称。\n * @returns 四种名称及附加数据组成的模板对象。\n * @example 模块内部上下文\n * ```ts\n * const context = createTemplateContext('order-item', { projectName: 'shop' })\n * const filename = `${context.kebabCase}.ts`\n * ```\n */\nexport function createTemplateContext(name: string, extra: Record<string, unknown> = {}): TemplateContext {\n return {\n camelCase: toCamelCase(name),\n pascalCase: toPascalCase(name),\n kebabCase: toKebabCase(name),\n snakeCase: toSnakeCase(name),\n ...extra,\n }\n}\n\n/**\n * 渲染模板\n * @param template - 可信 Handlebars 模板文本;不自动转义为目标语言字面量。\n * @param context - 已解析的模板上下文。\n * @returns 不进行 HTML 转义的渲染文本。\n * @example 模块内部上下文\n * ```ts\n * const source = renderTemplate('export interface {{pascalCase}} {}', createTemplateContext('order-item'))\n * ```\n */\nexport function renderTemplate(template: string, context: TemplateContext): string {\n const compiled = Handlebars.compile(template, { noEscape: true })\n return compiled(context)\n}\n\n/**\n * 渲染模板文件\n * @param templatePath - 可信模板文件路径。\n * @param context - 已解析的模板上下文。\n * @returns 读取模板后渲染得到的文本。\n * @example 模块内部上下文\n * ```ts\n * // 使用当前项目中已存在的可信模板文件;读取失败向调用方抛出。\n * const source = await renderTemplateFile(path.join(process.cwd(), 'templates/model.hbs'), createTemplateContext('order-item'))\n * ```\n */\nexport async function renderTemplateFile(\n templatePath: string,\n context: TemplateContext,\n): Promise<string> {\n const template = await fs.readFile(templatePath, 'utf-8')\n return renderTemplate(template, context)\n}\n\n/**\n * 写入文件(创建目录)\n * @param filePath - 已由调用方校验的目标文件路径。\n * @param content - 待渲染、解析或写入的完整文本。\n * @returns 父目录创建及文件写入完成。\n * @example 模块内部上下文\n * ```ts\n * // 覆盖目标文件;调用方负责先验证目标路径与覆盖权限。\n * await writeFile(path.join(process.cwd(), 'src/lib/models/order-item.ts'), 'export interface OrderItem { id: string }\\n')\n * ```\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath))\n await fs.writeFile(filePath, content, 'utf-8')\n}\n\n/**\n * 检查文件是否存在\n * @param filePath - 已由调用方校验的目标文件路径。\n * @returns 可访问时为 true;访问失败时为 false。\n * @example 模块内部上下文\n * ```ts\n * const hasManifest = await fileExists(path.join(process.cwd(), 'package.json'))\n * ```\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n }\n catch {\n return false\n }\n}\n\n/**\n * 获取包版本\n * @param pkgPath - package.json 文件路径。\n * @returns 读取的版本号;读取或解析失败时为 null。\n * @example 模块内部上下文\n * ```ts\n * const version = await getPackageVersion(path.join(process.cwd(), 'package.json'))\n * if (version === null) writeCliError('Cannot read package version')\n * ```\n */\nexport async function getPackageVersion(pkgPath: string): Promise<string | null> {\n try {\n const pkg = await fs.readJson(pkgPath)\n return pkg.version\n }\n catch {\n return null\n }\n}\n\n/**\n * 读取 CLI 自身版本号\n *\n * 从当前模块所在目录向上查找 `@h-ai/cli` 的 package.json,\n * 兼容源码布局(src/)与打包产物布局(dist/)以及 npm 安装后的 node_modules 布局。\n * 用于生成项目时固定 `@h-ai/*` 依赖版本,避免硬编码与预发布版本漂移。\n * @returns CLI 自身版本;在限定父目录中找不到时为 0.0.0。\n * @example 模块内部上下文\n * ```ts\n * const version = getCliVersion() // 从 CLI 自身 package.json 查找,不读取目标应用版本。\n * ```\n */\nexport function getCliVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n try {\n const pkg = fs.readJsonSync(path.join(dir, 'package.json')) as { name?: string, version?: string }\n if (pkg.name === '@h-ai/cli')\n return pkg.version ?? '0.0.0'\n }\n catch {\n // 当前目录无 package.json,继续向上查找\n }\n const parent = path.dirname(dir)\n if (parent === dir)\n break\n dir = parent\n }\n return '0.0.0'\n}\n\n/**\n * 检测包管理器\n * @param cwd - 项目所在目录。\n * @returns 优先 pnpm,其次 yarn,否则 npm。\n * @example 模块内部上下文\n * ```ts\n * const manager = await detectPackageManager(process.cwd()) // pnpm-lock 优先于 yarn.lock;均不存在时使用 npm。\n * ```\n */\nexport async function detectPackageManager(cwd: string): Promise<'pnpm' | 'npm' | 'yarn'> {\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm'\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn'\n }\n return 'npm'\n}\n\n/**\n * 格式化字节\n * @param bytes - 字节数,以 1024 为单位递进。\n * @returns 最多以 GB 表示且保留一位小数的大小。\n * @example 模块内部上下文\n * ```ts\n * const size = formatBytes(1536) // 1.5 KB(1024 进制,保留一位小数)\n * ```\n */\nexport function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB']\n let size = bytes\n let unitIndex = 0\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024\n unitIndex++\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`\n}\n\n/**\n * 格式化时间\n * @param ms - 耗时,单位毫秒。\n * @returns 小于一秒使用 ms,其余使用两位小数秒。\n * @example 模块内部上下文\n * ```ts\n * const elapsed = formatDuration(1250) // 1.25s;小于 1000 使用 ms。\n * ```\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`\n }\n return `${(ms / 1000).toFixed(2)}s`\n}\n\n/**\n * 注册 Handlebars helpers\n * @example 模块内部上下文\n * ```ts\n * registerHelpers()\n * const source = renderTemplate('{{upper camelCase}}', createTemplateContext('order-item')) // ORDERITEM\n * ```\n */\nexport function registerHelpers(): void {\n // 条件判断\n Handlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n })\n\n // 日期格式化\n Handlebars.registerHelper('date', () => {\n return new Date().toISOString().split('T')[0]\n })\n\n // 年份\n Handlebars.registerHelper('year', () => {\n return new Date().getFullYear()\n })\n\n // 大写\n Handlebars.registerHelper('upper', (str: string) => {\n return str.toUpperCase()\n })\n\n // 小写\n Handlebars.registerHelper('lower', (str: string) => {\n return str.toLowerCase()\n })\n}\n\n// 初始化时注册 helpers\nregisterHelpers()\n","/**\n * @h-ai/cli — 模板引擎\n *\n * 基于模板目录的项目生成逻辑:\n * 1. 拷贝 base 模板(骨架)\n * 2. 拷贝 apps/{type} 模板(应用类型路由)\n * 3. 叠加 features/{feat} 模板(可选功能路由,静态文件)\n * 4. 渲染 Handlebars 动态模板(base + apps + features 的 .hbs 文件)\n * 5. 拷贝 i18n 脚手架(project.inlang + messages)(当 hasI18n 为 true)\n *\n * @module cli-template-engine\n */\n\nimport type { AppType, FeatureId, FrontendTarget, ModuleConfigs } from '../cli-types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\nimport { stringify } from 'yaml'\nimport { getCliVersion } from '../cli-utils.js'\nimport { parameterizeConfig } from './cli-config-environment.js'\nimport { generateConfigFile } from './cli-config-templates.js'\n\n// 注册自定义 Handlebars helpers\nHandlebars.registerHelper('if_eq', function (this: unknown, a: unknown, b: unknown, options: Handlebars.HelperOptions) {\n return a === b ? options.fn(this) : options.inverse(this)\n})\n\n// 配置中的显示名称可包含引号、空格和换行,嵌入 TS / JSON / YAML 时必须作为字面量编码。\nHandlebars.registerHelper('json', (value: unknown) => JSON.stringify(value))\nHandlebars.registerHelper('html', (value: string) => Handlebars.escapeExpression(value))\nHandlebars.registerHelper('yaml', (key: string, value: unknown) => stringify({ [key]: value }).trim())\nHandlebars.registerHelper('jsString', (value: string) => `'${JSON.stringify(value).slice(1, -1).replace(/\\\\\"/g, '\"').replace(/'/g, '\\\\\\'')}'`)\n\n// 同一份模块配置供直接渲染和 create 命令使用,避免精简配置覆盖完整模板。\n// 未选择的模块只输出注释;说明也加两层注释,整文件去掉外层后仍是合法 YAML。\nHandlebars.registerHelper('moduleConfig', function (this: TemplateContext, moduleKey: string, enabled: boolean) {\n // 文件模板自身保留结尾换行,helper 不再重复输出空行。\n const content = generateConfigFile(moduleKey, this.moduleConfigs).trimEnd()\n const configured = this.appType === 'fullstack' && moduleKey === 'iam'\n ? content.replace('HAI_IAM_SEEDDEFAULTDATA:true', 'HAI_IAM_SEEDDEFAULTDATA:false').replace('variant: card', 'variant: split')\n : content\n return enabled\n ? configured\n : `# # 未启用:安装对应模块并在服务端 runtime 中初始化,再取消所需配置的注释。\\n${configured.split('\\n').map(line => line ? `# ${line}` : '').join('\\n')}`\n})\n\nconst TEMPLATE_SKIP_IF_EMPTY_MARKER = '@skipIfEmpty'\nconst NORMALIZED_RENDER_EXTENSIONS = new Set(['.ts', '.js', '.svelte', '.json', '.css'])\n\n// Capacitor 应用为纯客户端 SPA(Svelte 5 + Vite),没有服务端运行时。\n// 服务端专属产物(hooks、server init)必须跳过,否则预渲染会因访问 url.searchParams 报错。\nconst CAPACITOR_SKIPPED_SERVER_FILES = new Set([\n 'src/hooks.server.ts',\n 'src/lib/server/init.ts',\n])\n\n// 以下版本号与生成项目的 pnpm-workspace.yaml catalog 保持一致;\n// 单包脚手架直接写具体版本,pnpm fullstack workspace 会通过 catalog: 引用这些版本。\nconst VERSIONS = {\n antfuEslintConfig: '9.5.1',\n capacitorSecureStorage: '8.0.1',\n // UI / Icon\n bitsUi: '2.19.5',\n iconifyJsonTabler: '1.2.42',\n iconifyTailwind: '1.2.3',\n // Capacitor\n capacitorAndroid: '8.5.3',\n capacitorApp: '8.1.2',\n capacitorCamera: '8.2.5',\n capacitorCli: '8.5.3',\n capacitorCore: '8.5.3',\n capacitorDevice: '8.0.3',\n capacitorIos: '8.5.3',\n capacitorPreferences: '8.0.1',\n capacitorPushNotifications: '8.1.3',\n capacitorStatusBar: '8.0.4',\n // Tailwind / DaisyUI\n daisyui: '5.7.47',\n tailwindcss: '4.3.3',\n tailwindcssVite: '4.3.3',\n // i18n\n inlangParaglide: '2.27.0',\n inlangMessageFormat: '4.5.0',\n // Svelte / Vite\n svelte: '5.57.2',\n svelteKit: '2.70.3',\n svelteAdapterNode: '5.5.7',\n svelteCheck: '4.7.6',\n sveltePlugin: '7.3.1',\n // Build / Test\n vite: '8.3.4',\n vitest: '4.1.11',\n tsup: '8.5.1',\n rimraf: '6.1.3',\n // ESLint\n eslint: '10.12.0',\n eslintPluginFormat: '2.0.1',\n eslintPluginSvelte: '3.23.1',\n svelteEslintParser: '1.9.0',\n // Node / TS\n nodeTypes: '26.6.5',\n // Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。\n typescript: '6.0.3',\n // E2E\n playwright: '1.64.0',\n // Validation\n zod: '4.6.5',\n // Tauri\n tauriCli: '2.12.1',\n} as const\n\n/**\n * 有真实可构建入口的前端目标;miniapp 只生成占位,不进入可启动应用列表。\n * @example 模块内部上下文\n * ```ts\n * const target: ImplementedFrontendTarget = 'web'\n * const port = FRONTEND_PORTS_DEFAULT[target]\n * ```\n */\ntype ImplementedFrontendTarget = Exclude<FrontendTarget, 'miniapp'>\n\nconst FRONTEND_PORTS_DEFAULT: Record<ImplementedFrontendTarget, number> = {\n web: 4173,\n app: 5175,\n desktop: 5176,\n}\n\nconst FRONTEND_LABELS: Record<FrontendTarget, string> = {\n web: 'Web',\n app: 'App',\n miniapp: 'Miniapp',\n desktop: 'Desktop',\n}\n\nconst IMPLEMENTED_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_FULLSTACK_FRONTENDS: readonly FrontendTarget[] = ['web', 'app', 'desktop']\nconst DEFAULT_THEMES = ['light', 'dark'] as const\nconst DEFAULT_THEME_NAME = 'light'\n// 框架与模板同步发布;范围版本会把旧命名 alpha9 视为比 alpha.58 更新。\nconst HAI_PACKAGE_VERSION = getCliVersion()\nconst HAI_PACKAGE_SPECIFIER_CATALOG = 'catalog:'\n/**\n * 模板版本表各键对应的依赖说明符;pnpm 使用 catalog:,其他包管理器使用受测版本。\n * @example 模块内部上下文\n * ```ts\n * const specifiers: FullstackPackageSpecifiers = buildFullstackPackageSpecifiers(true)\n * const version = specifiers.svelte // catalog:\n * ```\n */\ntype FullstackPackageSpecifiers = { [Key in keyof typeof VERSIONS]: string }\n/**\n * 写入 pnpm workspace catalog 的包名与具体版本;不把 catalog: 再嵌套为版本值。\n * @example 模块内部上下文\n * ```ts\n * const catalog: CatalogPackageVersions = { '@h-ai/core': getCliVersion(), svelte: VERSIONS.svelte }\n * ```\n */\ntype CatalogPackageVersions = Readonly<Record<string, string>>\n\nconst HAI_CATALOG_PACKAGE_NAMES = [\n '@h-ai/ai',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/capacitor',\n '@h-ai/cli',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/datapipe',\n '@h-ai/deploy',\n '@h-ai/iam',\n '@h-ai/kit',\n '@h-ai/payment',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/scheduler',\n '@h-ai/serv',\n '@h-ai/storage',\n '@h-ai/ui',\n '@h-ai/vecdb',\n] as const\nconst HAI_CATALOG_PACKAGES: Record<string, string> = Object.fromEntries(\n HAI_CATALOG_PACKAGE_NAMES.map(packageName => [packageName, HAI_PACKAGE_VERSION]),\n)\n\nconst FULLSTACK_EXTERNAL_CATALOG_PACKAGES: CatalogPackageVersions = {\n '@antfu/eslint-config': VERSIONS.antfuEslintConfig,\n '@aparajita/capacitor-secure-storage': VERSIONS.capacitorSecureStorage,\n '@capacitor/android': VERSIONS.capacitorAndroid,\n '@capacitor/app': VERSIONS.capacitorApp,\n '@capacitor/camera': VERSIONS.capacitorCamera,\n '@capacitor/cli': VERSIONS.capacitorCli,\n '@capacitor/core': VERSIONS.capacitorCore,\n '@capacitor/device': VERSIONS.capacitorDevice,\n '@capacitor/ios': VERSIONS.capacitorIos,\n '@capacitor/preferences': VERSIONS.capacitorPreferences,\n '@capacitor/push-notifications': VERSIONS.capacitorPushNotifications,\n '@capacitor/status-bar': VERSIONS.capacitorStatusBar,\n '@iconify-json/tabler': VERSIONS.iconifyJsonTabler,\n '@iconify/tailwind4': VERSIONS.iconifyTailwind,\n '@inlang/paraglide-js': VERSIONS.inlangParaglide,\n '@inlang/plugin-message-format': VERSIONS.inlangMessageFormat,\n '@playwright/test': VERSIONS.playwright,\n '@sveltejs/vite-plugin-svelte': VERSIONS.sveltePlugin,\n '@tailwindcss/vite': VERSIONS.tailwindcssVite,\n '@tauri-apps/cli': VERSIONS.tauriCli,\n '@types/node': VERSIONS.nodeTypes,\n 'bits-ui': VERSIONS.bitsUi,\n 'daisyui': VERSIONS.daisyui,\n 'eslint': VERSIONS.eslint,\n 'eslint-plugin-format': VERSIONS.eslintPluginFormat,\n 'eslint-plugin-svelte': VERSIONS.eslintPluginSvelte,\n 'rimraf': VERSIONS.rimraf,\n 'svelte': VERSIONS.svelte,\n 'svelte-check': VERSIONS.svelteCheck,\n 'svelte-eslint-parser': VERSIONS.svelteEslintParser,\n 'tailwindcss': VERSIONS.tailwindcss,\n 'tsup': VERSIONS.tsup,\n 'typescript': VERSIONS.typescript,\n 'vite': VERSIONS.vite,\n 'vitest': VERSIONS.vitest,\n 'zod': VERSIONS.zod,\n}\n\nconst FULLSTACK_CATALOG_PACKAGES: CatalogPackageVersions = {\n ...HAI_CATALOG_PACKAGES,\n ...FULLSTACK_EXTERNAL_CATALOG_PACKAGES,\n}\n\nconst FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@sveltejs/vite-plugin-svelte',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'rimraf',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tsup',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-contract',\n '@h-ai/core',\n 'zod',\n] as const\n\nconst FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [\n '@h-ai/audit',\n '@h-ai/cache',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/iam',\n '@h-ai/reach',\n '@h-ai/reldb',\n '@h-ai/serv',\n '@h-ai/storage',\n 'zod',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/crypto',\n '@h-ai/ui',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n 'svelte',\n 'svelte-check',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_WEB_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@h-ai/ui',\n '@iconify-json/tabler',\n '@iconify/tailwind4',\n '@inlang/paraglide-js',\n '@inlang/plugin-message-format',\n '@sveltejs/vite-plugin-svelte',\n '@tailwindcss/vite',\n 'bits-ui',\n 'daisyui',\n 'eslint',\n 'eslint-plugin-format',\n 'eslint-plugin-svelte',\n 'svelte',\n 'svelte-check',\n 'svelte-eslint-parser',\n 'tailwindcss',\n 'typescript',\n 'vite',\n 'vitest',\n] as const\n\nconst FULLSTACK_APP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@aparajita/capacitor-secure-storage',\n '@capacitor/android',\n '@capacitor/app',\n '@capacitor/camera',\n '@capacitor/cli',\n '@capacitor/core',\n '@capacitor/device',\n '@capacitor/ios',\n '@capacitor/preferences',\n '@capacitor/push-notifications',\n '@capacitor/status-bar',\n '@h-ai/capacitor',\n] as const\n\nconst FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES = [\n ...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES,\n '@tauri-apps/cli',\n] as const\n\nconst API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES = [\n '@antfu/eslint-config',\n '@playwright/test',\n '@types/node',\n 'eslint',\n 'eslint-plugin-format',\n 'rimraf',\n 'tsup',\n 'typescript',\n 'vitest',\n 'zod',\n] as const\n\nfunction pickCatalogPackages(\n packageNames: readonly string[],\n availableCatalogPackages: CatalogPackageVersions,\n): Record<string, string> {\n return Object.fromEntries(\n [...new Set(packageNames)]\n .sort((left, right) => left.localeCompare(right))\n .map((packageName) => {\n const version = availableCatalogPackages[packageName]\n if (!version) {\n throw new Error(`Missing catalog version for package \"${packageName}\"`)\n }\n return [packageName, version]\n }),\n )\n}\n\nfunction buildFullstackPackageSpecifiers(useCatalogProtocol: boolean): FullstackPackageSpecifiers {\n return Object.fromEntries(\n Object.entries(VERSIONS).map(([key, version]) => [key, useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : version]),\n ) as FullstackPackageSpecifiers\n}\n\nfunction buildApiWorkspaceCatalogPackages(featureMap: Record<string, boolean>): Record<string, string> {\n const packageNames: string[] = [\n ...API_WORKSPACE_EXTERNAL_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n '@h-ai/api-client',\n '@h-ai/api-contract',\n '@h-ai/core',\n '@h-ai/serv',\n ]\n\n if (featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\nfunction buildAppHaiCatalogPackages(options: {\n featureMap: Record<string, boolean>\n hasUi: boolean\n isCapacitorApp: boolean\n isSvelteOnlyApp: boolean\n}): Record<string, string> {\n const packageNames: string[] = ['@h-ai/cli']\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@h-ai/api-contract', '@h-ai/capacitor', '@h-ai/ui')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n }\n\n packageNames.push('@h-ai/core', '@h-ai/kit')\n if (options.hasUi)\n packageNames.push('@h-ai/ui')\n if (options.featureMap.db)\n packageNames.push('@h-ai/reldb')\n if (options.featureMap.cache)\n packageNames.push('@h-ai/cache')\n if (options.featureMap.iam)\n packageNames.push('@h-ai/iam')\n if (options.featureMap.crypto)\n packageNames.push('@h-ai/crypto')\n if (options.featureMap.storage)\n packageNames.push('@h-ai/storage')\n if (options.featureMap.ai)\n packageNames.push('@h-ai/ai')\n if (options.featureMap.audit)\n packageNames.push('@h-ai/audit')\n if (options.featureMap.reach)\n packageNames.push('@h-ai/reach')\n if (options.featureMap.payment)\n packageNames.push('@h-ai/payment')\n if (options.featureMap.vecdb)\n packageNames.push('@h-ai/vecdb')\n if (options.featureMap.datapipe)\n packageNames.push('@h-ai/datapipe')\n if (options.featureMap.scheduler)\n packageNames.push('@h-ai/scheduler')\n if (options.featureMap.deploy)\n packageNames.push('@h-ai/deploy')\n if (options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n if (options.isCapacitorApp && !options.featureMap['api-client'])\n packageNames.push('@h-ai/api-client')\n if (options.isCapacitorApp && !options.featureMap.capacitor)\n packageNames.push('@h-ai/capacitor')\n\n return pickCatalogPackages(packageNames, HAI_CATALOG_PACKAGES)\n}\n\nfunction buildFullstackCatalogPackages(frontends: readonly FrontendTarget[], deploy = false, features: Record<string, boolean> = {}): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\n '@h-ai/cli',\n ...FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SERV_CATALOG_PACKAGE_NAMES,\n ...FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES,\n ]\n\n if (frontends.includes('web'))\n packageNames.push(...FULLSTACK_WEB_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('app'))\n packageNames.push(...FULLSTACK_APP_CATALOG_PACKAGE_NAMES)\n if (frontends.includes('desktop'))\n packageNames.push(...FULLSTACK_DESKTOP_CATALOG_PACKAGE_NAMES)\n if (deploy)\n packageNames.push('@h-ai/deploy')\n if (features.ai)\n packageNames.push('@h-ai/ai')\n if (features.vecdb)\n packageNames.push('@h-ai/vecdb')\n\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n * @example 模块内部上下文\n * ```ts\n * const context: TemplateContext = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * const dbEnabled = context.features.db // AI 补齐 db/vecdb。\n * ```\n */\nexport interface TemplateContext {\n /** 所有应用模板共用的第三方依赖版本,避免单包与 workspace 版本表漂移。 */\n versions: typeof VERSIONS\n /** 项目名称 */\n projectName: string\n /** 是否对 @h-ai/* 依赖启用 pnpm catalog 协议 */\n useCatalogProtocol: boolean\n /** @h-ai/* 依赖写入 package.json 时使用的版本说明符 */\n haiPackageSpecifier: string\n /** 生成项目时引用的 @h-ai/* 发布版本 */\n haiPackageVersion: string\n /** 生成项目时写入 pnpm-workspace.yaml 的 catalog 条目 */\n haiCatalogPackages: Record<string, string>\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 创建时指定的模块配置;配置模板需保留这些值。 */\n moduleConfigs?: ModuleConfigs\n /** 是否有 UI(非 api / fullstack 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api / fullstack 类型) */\n hasI18n: boolean\n /** 是否为 Capacitor 原生移动应用(mobile-app) */\n isCapacitorApp: boolean\n /** 是否为 API workspace(service + contract) */\n isApiWorkspace: boolean\n /** 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 */\n isSvelteOnlyApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\n /** API workspace 专用上下文 */\n api?: ApiWorkspaceTemplateContext\n /** 前后端分离工程专用上下文 */\n fullstack?: FullstackTemplateContext\n}\n\n/**\n * API workspace 的 contract/service 包命名及真实工厂标识,用于让生成入口与消费者一致。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'api', features: [], packageManager: 'pnpm' })\n * if (context.api) {\n * const api: ApiWorkspaceTemplateContext = context.api\n * const contractPackage = api.contractPackageName\n * }\n * ```\n */\nexport interface ApiWorkspaceTemplateContext {\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servicePackageName: string\n /** Service App 工厂函数名 */\n serviceAppFactoryName: string\n /** procedures 聚合函数名 */\n serviceProceduresFactoryName: string\n}\n\n/**\n * 已实现目标对应的应用信息;miniapp 不会被列为可启动前端。\n * @example 模块内部上下文\n * ```ts\n * const app: FullstackFrontendApp = { target: 'web', packageName: 'shop-web', label: 'Web', port: 4173 }\n * ```\n */\nexport interface FullstackFrontendApp {\n /** 前端目标 */\n target: ImplementedFrontendTarget\n /** 包名 */\n packageName: string\n /** 展示名称 */\n label: string\n /** 本地端口 */\n port: number\n}\n\n/**\n * 国际化配置(已解析后的最终值)\n * @example 模块内部上下文\n * ```ts\n * const i18n: FullstackI18nContext = { baseLocale: 'zh-CN', locales: ['zh-CN', 'en-US'] }\n * const includesBase = i18n.locales.includes(i18n.baseLocale)\n * ```\n */\nexport interface FullstackI18nContext {\n baseLocale: string\n locales: readonly string[]\n}\n\n/**\n * 主题配置(已解析后的最终值)\n * @example 模块内部上下文\n * ```ts\n * const theme: FullstackThemeContext = { defaultTheme: 'light', themes: ['light', 'dark'] }\n * const includesDefault = theme.themes.includes(theme.defaultTheme)\n * ```\n */\nexport interface FullstackThemeContext {\n defaultTheme: string\n themes: readonly string[]\n}\n\n/**\n * 前后端分离工程最终模板数据;前端列表、共享主题/语言与端口按默认值和选项统一解析;语言及主题缺省项会补齐。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * if (context.fullstack) {\n * const fullstack: FullstackTemplateContext = context.fullstack\n * const appNames = fullstack.frontendApps.map(app => app.packageName)\n * }\n * ```\n */\nexport interface FullstackTemplateContext {\n /** 显示名称来自 core 配置。 */\n appName: string\n /** 依赖版本集合 */\n versions: typeof VERSIONS\n /** 写入 package.json 的依赖说明符(pnpm 时为 catalog:) */\n packageSpecifiers: FullstackPackageSpecifiers\n /** 共享 contract 包名 */\n contractPackageName: string\n /** 共享 contract 导出变量名 */\n contractExportName: string\n /** 后端 service 包名 */\n servPackageName: string\n /** 原生壳 appId / bundle identifier 使用的安全短名 */\n nativeAppIdSegment: string\n /** 前端共享代码包名 */\n sharedPackageName: string\n /** 所有已选择前端 */\n selectedFrontends: readonly FrontendTarget[]\n /** 已选择前端 JSON 字面量 */\n selectedFrontendsJson: string\n /** 可运行前端应用 */\n frontendApps: readonly FullstackFrontendApp[]\n /** Playwright 默认验证前端 */\n e2eFrontend?: FullstackFrontendApp\n /** 前端选择布尔表,用于模板条件创建 */\n frontends: Record<FrontendTarget, boolean>\n /** 各前端端口(key 为 target) */\n ports: Record<ImplementedFrontendTarget, number>\n /** 是否选择小程序预留 */\n hasMiniapp: boolean\n /** i18n 配置 */\n i18n: FullstackI18nContext\n /** 主题配置 */\n theme: FullstackThemeContext\n}\n\n/**\n * feature 对应的路由目录映射\n *\n * 每个 feature 可以有:\n * - `routes-shared/` — 所有应用类型共用(如 API 端点)\n * - `routes-{appType}/` — 特定应用类型专用(如 UI 页面)\n * - `routes/` — 通用路由(任何类型都拷贝)\n */\nconst FEATURE_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['routes-shared'],\n storage: ['routes'],\n ai: ['routes'],\n payment: ['routes'],\n vecdb: ['routes'],\n datapipe: ['routes'],\n reach: ['routes'],\n scheduler: ['routes'],\n audit: ['routes'],\n}\n\n/**\n * feature 的 appType 专用路由\n */\nconst FEATURE_APP_ROUTE_DIRS: Record<string, string[]> = {\n iam: ['admin', 'h5', 'website'],\n}\n\nconst FEATURE_ID_REGEX = /^[a-z0-9-]+$/\nconst HBS_SUFFIX_REGEX = /\\.hbs$/\nconst FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX = /^apps\\/\\{\\{projectName\\}\\}-(web|app|desktop|miniapp)\\//\nconst NON_IDENTIFIER_CHAR_REGEX = /[^a-z0-9]+/i\nconst IDENTIFIER_START_REGEX = /^[a-z_$]/i\n\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/cli-template-engine.js → ../templates\n * - 测试时:src/commands/cli-template-engine.ts → ../../templates\n */\nfunction getTemplatesRoot(): string {\n const currentDir = path.dirname(fileURLToPath(import.meta.url))\n // 优先尝试 dist 模式(../templates),再尝试 src 模式(../../templates)\n const distPath = path.resolve(currentDir, '..', 'templates')\n if (fse.pathExistsSync(distPath)) {\n return distPath\n }\n return path.resolve(currentDir, '..', '..', 'templates')\n}\n\n// =============================================================================\n// 拷贝工具\n// =============================================================================\n\n/**\n * 拷贝目录,自动跳过 .hbs 文件(这些由 renderDynamicFiles 处理)\n *\n * @param src - 源目录\n * @param dest - 目标目录\n * @param excludePaths - 需要排除的相对路径前缀(如 'messages')\n */\nasync function copyStaticDir(src: string, dest: string, excludePaths?: string[]): Promise<void> {\n if (!(await fse.pathExists(src))) {\n return\n }\n\n await fse.copy(src, dest, {\n overwrite: true,\n filter: (filePath: string) => {\n const rel = path.relative(src, filePath)\n // 含 Handlebars 占位符的路径必须走动态渲染,避免复制出字面量目录\n if (rel.includes('{{') || rel.includes('}}')) {\n return false\n }\n // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n return !excludePaths.some(p => rel === p || rel.startsWith(`${p}${path.sep}`))\n }\n return true\n },\n })\n}\n\n/**\n * 查找目录中所有 .hbs 文件并返回相对路径\n */\nasync function findHbsFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n }\n else if (entry.name.endsWith('.hbs')) {\n results.push(path.relative(dir, fullPath))\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n/**\n * 查找位于动态路径中的静态资源。\n *\n * 普通静态文件已经由 copyStaticDir 复制;这里专门补上带 Handlebars 路径片段\n * 的资源,例如 fullstack Tauri 图标目录。\n */\nasync function findRenderedStaticPathFiles(dir: string): Promise<string[]> {\n if (!(await fse.pathExists(dir))) {\n return []\n }\n\n const results: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fse.readdir(current, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(fullPath)\n continue\n }\n\n const relPath = path.relative(dir, fullPath)\n if (!entry.name.endsWith('.hbs') && (relPath.includes('{{') || relPath.includes('}}'))) {\n results.push(relPath)\n }\n }\n }\n\n await walk(dir)\n return results\n}\n\n// =============================================================================\n// 构建上下文\n// =============================================================================\n\n/**\n * 根据用户选项构建模板渲染上下文\n * 纯上下文构建,不创建文件、不安装依赖;始终补齐应用骨架及功能的硬依赖。\n * 不执行创建命令的交互输入校验;直接调用者仍须验证用户输入。\n * @param options - 工程类型、启用功能、包管理器与模块默认值。\n * @param options.name - 新工程名称。\n * @param options.appType - 应用骨架类型。\n * @param options.features - 启用的功能,函数补齐硬依赖。\n * @param options.frontends - fullstack 前端目标;省略使用默认目标。\n * @param options.moduleConfigs - 用户指定模块、语言、主题和端口。\n * @param options.packageManager - pnpm 使用 catalog,其他管理器使用具体版本。\n * @param options.deploy - 默认 true;false 明确关闭部署开发依赖。\n * @returns 已补硬依赖与默认值的模板上下文。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'fullstack', features: ['ai'], frontends: ['web'], packageManager: 'pnpm' })\n * const usesSharedAi = context.features.db && context.features.vecdb\n * ```\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\n frontends?: readonly FrontendTarget[]\n moduleConfigs?: ModuleConfigs\n packageManager: string\n deploy?: boolean\n}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = true\n }\n featureMap.deploy = options.deploy !== false\n\n // fullstack 默认交付完整 mini 管理功能,不能移除其必需模块。\n if (options.appType === 'fullstack') {\n for (const feature of ['iam', 'db', 'cache', 'crypto', 'storage', 'audit']) featureMap[feature] = true\n }\n\n // 强制补全模块硬依赖,防止调用方未经过 resolveFeatureDependencies 时遗漏依赖\n // iam 依赖 reldb(用户/角色/权限持久化)和 cache(会话/OTP 缓存),以及 crypto(密码哈希)\n if (featureMap.iam) {\n featureMap.db = true\n featureMap.cache = true\n featureMap.crypto = true\n }\n // audit / scheduler / payment 依赖 reldb\n if (featureMap.audit || featureMap.scheduler || featureMap.payment || featureMap.crypto) {\n featureMap.db = true\n }\n // AI 的共享会话、记忆和知识依赖持久关系库与向量库。\n if (featureMap.ai) {\n featureMap.db = true\n featureMap.vecdb = true\n }\n\n const isApi = options.appType === 'api'\n const isFullstack = options.appType === 'fullstack'\n const isCapacitorApp = options.appType === 'mobile-app'\n const isSvelteOnlyApp = isCapacitorApp\n const useCatalogProtocol = options.packageManager === 'pnpm'\n const hasUi = !isApi && !isFullstack\n const selectedFrontends = options.frontends ?? DEFAULT_FULLSTACK_FRONTENDS\n let haiCatalogPackages: TemplateContext['haiCatalogPackages']\n if (isFullstack) {\n haiCatalogPackages = buildFullstackCatalogPackages(selectedFrontends, featureMap.deploy, featureMap)\n }\n else if (isApi) {\n haiCatalogPackages = buildApiWorkspaceCatalogPackages(featureMap)\n }\n else {\n haiCatalogPackages = buildAppHaiCatalogPackages({\n featureMap,\n hasUi,\n isCapacitorApp,\n isSvelteOnlyApp,\n })\n }\n\n return {\n projectName: options.name,\n versions: VERSIONS,\n useCatalogProtocol,\n haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,\n haiPackageVersion: HAI_PACKAGE_VERSION,\n haiCatalogPackages,\n appType: options.appType,\n features: featureMap,\n moduleConfigs: options.moduleConfigs,\n hasUi,\n hasI18n: !isApi && !isFullstack,\n isCapacitorApp,\n isApiWorkspace: isApi,\n isSvelteOnlyApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n api: isApi\n ? buildApiWorkspaceTemplateContext(options.name, useCatalogProtocol)\n : undefined,\n fullstack: isFullstack\n ? buildFullstackTemplateContext(\n options.name,\n selectedFrontends,\n options.moduleConfigs,\n useCatalogProtocol,\n )\n : undefined,\n }\n}\n\nfunction buildApiWorkspaceTemplateContext(\n projectName: string,\n useCatalogProtocol = false,\n): ApiWorkspaceTemplateContext {\n const identifier = toIdentifier(projectName)\n const pascalName = toPascalIdentifier(identifier)\n\n return {\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${identifier}Contract`,\n servicePackageName: `${projectName}-service`,\n serviceAppFactoryName: `create${pascalName}App`,\n serviceProceduresFactoryName: `create${pascalName}Procedures`,\n }\n}\n\nfunction buildFullstackTemplateContext(\n projectName: string,\n frontendsInput: readonly FrontendTarget[],\n moduleConfigs?: ModuleConfigs,\n useCatalogProtocol = false,\n): FullstackTemplateContext {\n const selectedFrontends = [...new Set(frontendsInput.length > 0 ? frontendsInput : DEFAULT_FULLSTACK_FRONTENDS)]\n\n const portsConfig = moduleConfigs?.fullstack?.ports ?? {}\n const portFor = (target: ImplementedFrontendTarget): number =>\n portsConfig[target] ?? FRONTEND_PORTS_DEFAULT[target]\n\n const frontendApps = selectedFrontends\n .filter(isImplementedFrontend)\n .map(target => ({\n target,\n packageName: `${projectName}-${target}`,\n label: FRONTEND_LABELS[target],\n port: portFor(target),\n }))\n\n return {\n appName: moduleConfigs?.core?.name ?? projectName,\n versions: VERSIONS,\n packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),\n contractPackageName: `${projectName}-contract`,\n contractExportName: `${toIdentifier(projectName)}Contract`,\n servPackageName: `${projectName}-serv`,\n nativeAppIdSegment: toIdentifier(projectName).toLowerCase(),\n sharedPackageName: `${projectName}-shared`,\n selectedFrontends,\n selectedFrontendsJson: `[${selectedFrontends.map(f => `'${f}'`).join(', ')}]`,\n frontendApps,\n e2eFrontend: frontendApps[0],\n frontends: {\n web: selectedFrontends.includes('web'),\n app: selectedFrontends.includes('app'),\n miniapp: selectedFrontends.includes('miniapp'),\n desktop: selectedFrontends.includes('desktop'),\n },\n ports: {\n web: portFor('web'),\n app: portFor('app'),\n desktop: portFor('desktop'),\n },\n hasMiniapp: selectedFrontends.includes('miniapp'),\n i18n: resolveI18nContext(moduleConfigs),\n theme: resolveThemeContext(moduleConfigs),\n }\n}\n\n/**\n * 按用户配置、core 默认语言与框架回退语言解析列表;去重并补入基础语言,不执行 locale 名称合法性校验。\n * @param moduleConfigs - 创建选项中的模块配置。\n * @returns 至少包含基础语言的最终 i18n 数据。\n * @example 模块内部上下文\n * ```ts\n * const i18n = resolveI18nContext({ fullstack: { i18n: { baseLocale: 'en-US', locales: ['zh-CN'] } } })\n * const base = i18n.locales[0] // en-US 会补在首位。\n * ```\n */\nfunction resolveI18nContext(moduleConfigs?: ModuleConfigs): FullstackI18nContext {\n const coreLocale = moduleConfigs?.core?.defaultLocale ?? 'zh-CN'\n const baseLocale = moduleConfigs?.fullstack?.i18n?.baseLocale ?? coreLocale\n const requested = moduleConfigs?.fullstack?.i18n?.locales\n const locales = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...new Set([baseLocale, 'zh-CN', 'en-US', 'ja-JP'])]\n if (!locales.includes(baseLocale)) {\n locales.unshift(baseLocale)\n }\n return { baseLocale, locales }\n}\n\n/**\n * 去重主题列表并确保默认主题可选;未配置时使用 light/dark,不验证主题名是否已安装。\n * @param moduleConfigs - 创建选项中的模块配置。\n * @returns 包含默认主题的最终主题数据。\n * @example 模块内部上下文\n * ```ts\n * const theme = resolveThemeContext({ fullstack: { theme: { defaultTheme: 'dark', themes: ['light'] } } })\n * const first = theme.themes[0] // dark\n * ```\n */\nfunction resolveThemeContext(moduleConfigs?: ModuleConfigs): FullstackThemeContext {\n const defaultTheme = moduleConfigs?.fullstack?.theme?.defaultTheme ?? DEFAULT_THEME_NAME\n const requested = moduleConfigs?.fullstack?.theme?.themes\n const themes = requested && requested.length > 0\n ? [...new Set(requested)]\n : [...DEFAULT_THEMES]\n if (!themes.includes(defaultTheme)) {\n themes.unshift(defaultTheme)\n }\n return { defaultTheme, themes }\n}\n\nfunction isImplementedFrontend(target: FrontendTarget): target is ImplementedFrontendTarget {\n return IMPLEMENTED_FRONTENDS.includes(target)\n}\n\nfunction toIdentifier(value: string): string {\n const words = value\n .split(NON_IDENTIFIER_CHAR_REGEX)\n .filter(Boolean)\n const camel = words\n .map((word, index) => {\n const normalized = word.toLowerCase()\n return index === 0\n ? normalized\n : `${normalized.charAt(0).toUpperCase()}${normalized.slice(1)}`\n })\n .join('')\n if (!camel)\n return 'app'\n return IDENTIFIER_START_REGEX.test(camel) ? camel : `app${camel}`\n}\n\nfunction toPascalIdentifier(value: string): string {\n if (!value)\n return 'App'\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`\n}\n\n// =============================================================================\n// 核心:生成项目\n// =============================================================================\n\n/**\n * 从模板生成项目\n *\n * 执行流程:\n * 1. 拷贝 base 静态文件\n * 2. 拷贝 apps/{appType} 路由\n * 3. 叠加选中 feature 的路由\n * 4. 渲染所有 .hbs 动态模板\n *\n * 将模板骨架、功能路由与共享脚本写入指定目录;不会安装依赖或初始化 Git。\n * @param projectPath - 项目目标目录\n * @param context - 模板渲染上下文\n * @throws Error - 模板读取、渲染、路径校验或文件写入失败。\n * @returns 模板文件与共享脚本写入完成。\n * @example 模块内部上下文\n * ```ts\n * const context = buildTemplateContext({ name: 'shop', appType: 'api', features: ['ai'], packageManager: 'pnpm' })\n * // 目标为新工程目录;调用方先检查目录与选项。\n * await generateFromTemplates(path.resolve('shop'), context)\n * ```\n */\nexport async function generateFromTemplates(\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n const root = getTemplatesRoot()\n const includeBaseTemplate = context.appType !== 'fullstack' && !context.isApiWorkspace\n\n // ─── ① 拷贝 base 骨架(静态文件) ───\n if (includeBaseTemplate) {\n await copyStaticDir(path.join(root, 'base'), projectPath)\n }\n else {\n // API/fullstack 自有骨架,质量门禁仍复用单包模板的同一份规则。\n await fse.copy(path.join(root, 'base', 'eslint-rules.js'), path.join(projectPath, 'eslint-rules.js'))\n }\n\n // ─── ② 拷贝 apps/{appType} 路由 ───\n // messages/ 目录仅在 hasI18n 时拷贝\n const appDir = path.join(root, 'apps', context.appType)\n if (await fse.pathExists(appDir)) {\n const appExcludes = context.hasI18n ? [] : ['messages']\n await copyStaticDir(appDir, projectPath, appExcludes)\n }\n\n // ─── ③ 叠加 feature 路由 ───\n if (!context.isApiWorkspace && context.appType !== 'fullstack') {\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!FEATURE_ID_REGEX.test(featureId)) {\n continue\n }\n\n const featureDir = path.join(root, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes/)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n const routesSrc = path.join(featureDir, dirName)\n if (await fse.pathExists(routesSrc)) {\n await copyStaticDir(routesSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n const appRouteSrc = path.join(featureDir, `routes-${context.appType}`)\n if (await fse.pathExists(appRouteSrc)) {\n await copyStaticDir(appRouteSrc, path.join(projectPath, 'src', 'routes'))\n }\n }\n }\n }\n\n // ─── ④ 渲染 .hbs 动态模板 ───\n await renderDynamicFiles(root, projectPath, context)\n\n // 多包模板不继承 base;所有应用统一复制同一份 E2E 清理入口。\n await fse.copy(path.join(root, 'shared', 'run-e2e.mjs'), path.join(projectPath, 'scripts', 'run-e2e.mjs'))\n await fse.copy(path.join(root, 'shared', 'e2e-env.ts'), path.join(projectPath, 'scripts', 'e2e-env.ts'))\n await fse.ensureDir(path.join(projectPath, 'images', 'dependencies'))\n await fse.writeFile(path.join(projectPath, 'images', 'dependencies', '.gitkeep'), '')\n await fse.copy(path.join(root, 'shared', '.gitattributes'), path.join(projectPath, '.gitattributes'))\n if (context.isSvelteOnlyApp) {\n await fse.copy(path.join(root, 'shared', 'vite-runtime-config.ts'), path.join(projectPath, 'scripts', 'vite-runtime-config.ts'))\n await fse.copy(path.join(root, 'shared', 'container-runtime-config.sh'), path.join(projectPath, 'images', 'web', '19-runtime-config.sh'))\n }\n\n if (context.isSvelteOnlyApp || context.appType === 'fullstack') {\n const navigationDir = context.appType === 'fullstack'\n ? path.join(projectPath, 'packages', `${context.projectName}-shared`, 'src', 'lib', 'navigation')\n : path.join(projectPath, 'src', 'lib', 'navigation')\n await fse.copy(path.join(root, 'shared', 'hash-router.svelte.ts'), path.join(navigationDir, 'hash-router.svelte.ts'))\n }\n\n // ─── ⑤ 拷贝 i18n 脚手架(project.inlang + messages) ───\n if (context.hasI18n) {\n const i18nDir = path.join(root, 'i18n')\n if (await fse.pathExists(i18nDir)) {\n await fse.copy(i18nDir, projectPath, { overwrite: true })\n const settingsPath = path.join(projectPath, 'project.inlang', 'settings.json')\n const settings = await fse.readJson(settingsPath)\n await fse.writeJson(settingsPath, { ...settings, baseLocale: context.defaultLocale }, { spaces: 2 })\n }\n }\n\n // ─── ⑥ 确保 static 目录存在 ───\n if (includeBaseTemplate) {\n await fse.ensureDir(path.join(projectPath, 'static'))\n }\n}\n\n// =============================================================================\n// 动态模板渲染\n// =============================================================================\n\n/**\n * 渲染所有 .hbs 文件:base、apps/{appType}、以及选中 feature 的路由目录\n *\n * base / apps 的 .hbs 渲染后输出到 projectPath 根目录;\n * feature 的 .hbs 渲染后输出到 projectPath/src/routes/。\n */\nasync function renderDynamicFiles(\n templatesRoot: string,\n projectPath: string,\n context: TemplateContext,\n): Promise<void> {\n // ── base + apps/{appType} → 输出到项目根 ──\n const rootDirs = context.appType === 'fullstack' || context.isApiWorkspace\n ? [path.join(templatesRoot, 'apps', context.appType)]\n : [\n path.join(templatesRoot, 'base'),\n path.join(templatesRoot, 'apps', context.appType),\n ]\n\n for (const dir of rootDirs) {\n await renderHbsInDir(dir, projectPath, context)\n await copyRenderedStaticPathFiles(dir, projectPath, context)\n }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n if (context.isApiWorkspace || context.appType === 'fullstack') {\n return\n }\n\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\n if (context.isSvelteOnlyApp) {\n continue\n }\n\n if (!context.features[featureId]) {\n continue\n }\n\n const featureDir = path.join(templatesRoot, 'features', featureId)\n if (!(await fse.pathExists(featureDir))) {\n continue\n }\n\n // 通用路由(routes-shared / routes 等)\n const sharedDirs = FEATURE_ROUTE_DIRS[featureId] || []\n for (const dirName of sharedDirs) {\n // Capacitor SPA 无服务端运行时,跳过服务端 API 路由(routes-shared)\n if (context.isCapacitorApp && dirName === 'routes-shared') {\n continue\n }\n await renderHbsInDir(path.join(featureDir, dirName), routesDest, context)\n }\n\n // appType 专用路由(routes-{appType})\n const appSpecificTypes = FEATURE_APP_ROUTE_DIRS[featureId] || []\n if (appSpecificTypes.includes(context.appType)) {\n await renderHbsInDir(\n path.join(featureDir, `routes-${context.appType}`),\n routesDest,\n context,\n )\n }\n }\n}\n\n/**\n * 渲染指定目录下所有 .hbs 文件并输出到目标目录(去掉 .hbs 后缀)\n */\nasync function renderHbsInDir(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const hbsFiles = await findHbsFiles(dir)\n for (const relPath of hbsFiles) {\n const srcPath = path.join(dir, relPath)\n const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, '')\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n if (shouldSkipRenderedFile(template, rendered)) {\n continue\n }\n\n const outRelPath = renderOutputPath(outRelPathTemplate, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n // Capacitor SPA 跳过服务端专属文件(hooks / server init)\n if (context.isCapacitorApp && CAPACITOR_SKIPPED_SERVER_FILES.has(outRelPath.split(path.sep).join('/'))) {\n continue\n }\n\n const destPath = path.join(destRoot, outRelPath)\n const configMatch = /(?:^|[/\\\\])config[/\\\\]_([^/\\\\]+)\\.ya?ml$/.exec(outRelPath)\n const normalizedRendered = normalizeRenderedContent(configMatch ? parameterizeConfig(configMatch[1], rendered) : rendered, outRelPath)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, normalizedRendered, 'utf-8')\n }\n}\n\nasync function copyRenderedStaticPathFiles(\n dir: string,\n destRoot: string,\n context: TemplateContext,\n): Promise<void> {\n const staticFiles = await findRenderedStaticPathFiles(dir)\n for (const relPath of staticFiles) {\n if (!shouldCopyRenderedStaticPathFile(relPath, context)) {\n continue\n }\n\n const outRelPath = renderOutputPath(relPath, context)\n if (!isSafeRelativePath(outRelPath)) {\n continue\n }\n\n const srcPath = path.join(dir, relPath)\n const destPath = path.join(destRoot, outRelPath)\n await fse.ensureDir(path.dirname(destPath))\n await fse.copyFile(srcPath, destPath)\n }\n}\n\nfunction shouldCopyRenderedStaticPathFile(relPath: string, context: TemplateContext): boolean {\n if (context.appType !== 'fullstack' || !context.fullstack) {\n return true\n }\n\n const normalizedPath = relPath.split(path.sep).join('/')\n const frontendMatch = FULLSTACK_FRONTEND_TEMPLATE_PATH_REGEX.exec(normalizedPath)\n if (!frontendMatch) {\n return true\n }\n\n const target = frontendMatch[1] as FrontendTarget\n return Boolean(context.fullstack.frontends[target])\n}\n\nfunction normalizeRenderedContent(content: string, outRelPath: string): string {\n const normalizedLineEndings = content.replace(/\\r\\n/g, '\\n')\n const ext = path.extname(outRelPath)\n const normalized = NORMALIZED_RENDER_EXTENSIONS.has(ext)\n ? normalizedLineEndings.replace(/\\n{3,}/g, '\\n\\n')\n : normalizedLineEndings\n if (normalized.trim().length === 0) {\n return ''\n }\n return normalized.endsWith('\\n') ? normalized : `${normalized}\\n`\n}\n\nfunction shouldSkipRenderedFile(template: string, rendered: string): boolean {\n return template.includes(TEMPLATE_SKIP_IF_EMPTY_MARKER) && rendered.trim().length === 0\n}\n\nfunction renderOutputPath(pathTemplate: string, context: TemplateContext): string {\n const normalizedTemplate = pathTemplate.split(path.sep).join('/')\n return Handlebars.compile(normalizedTemplate, { noEscape: true })(context)\n}\n\n/**\n * 渲染后的输出路径只允许根内相对路径,拒绝绝对路径与任意 .. 段;不能替代已有目录的 realpath 检查。\n * @param relativePath - 模板渲染后的相对输出路径。\n * @returns 路径符合模板输出边界时为 true。\n * @example 模块内部上下文\n * ```ts\n * const valid = isSafeRelativePath('src/server/orders.ts')\n * const escaped = isSafeRelativePath('../outside.ts') // false\n * ```\n */\nfunction isSafeRelativePath(relativePath: string): boolean {\n const normalized = path.normalize(relativePath)\n return !path.isAbsolute(normalized) && normalized !== '..' && !normalized.startsWith(`..${path.sep}`)\n}\n","/**\n * @h-ai/cli — 项目创建命令\n *\n * 基于模板的交互式项目创建:\n * 1. 交互式收集选项(appType / features / moduleConfigs)\n * 2. 拷贝 base 骨架 + appType 路由 + feature 路由\n * 3. 渲染动态模板(init.ts / hooks.server.ts / package.json)\n * 4. 生成配置文件、.env、Skill 文件\n *\n * @module cli-create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, FrontendTarget, ModuleConfigs, ProjectInfo } from '../cli-types.js'\nimport type { ConfigEnvironmentVariable } from './cli-config-environment.js'\nimport { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport { createECDH, randomBytes } from 'node:crypto'\nimport path from 'node:path'\nimport process from 'node:process'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, formatPromptDescription, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { renderEnvironment, runtimeEnvironmentVariables } from './cli-config-environment.js'\nimport { buildTemplateContext, generateFromTemplates } from './cli-template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\n\n/** Git 远程地址校验 */\nconst RE_HTTPS_URL = /^https:\\/\\/.+/\nconst RE_GIT_SSH_URL = /^git@.+:.+/\n\n/**\n * 应用类型定义;展示字段延迟读取当前 locale,避免模块首次导入时固定语言。\n */\nconst APP_TYPES: Record<AppType, { name: string, description: string, defaultFeatures: FeatureId[] }> = {\n 'admin': {\n get name() { return cliM('cli_appAdminName') },\n get description() { return cliM('cli_appAdminDescription') },\n defaultFeatures: ['iam', 'db', 'cache', 'crypto'],\n },\n 'website': {\n get name() { return cliM('cli_appWebsiteName') },\n get description() { return cliM('cli_appWebsiteDescription') },\n defaultFeatures: ['db', 'cache'],\n },\n 'h5': {\n get name() { return cliM('cli_appH5Name') },\n get description() { return cliM('cli_appH5Description') },\n defaultFeatures: ['db', 'cache'],\n },\n 'api': {\n get name() { return cliM('cli_appApiName') },\n get description() { return cliM('cli_appApiDescription') },\n defaultFeatures: ['db', 'cache'],\n },\n 'mobile-app': {\n get name() { return cliM('cli_appMobileName') },\n get description() { return cliM('cli_appMobileDescription') },\n defaultFeatures: ['api-client', 'capacitor'],\n },\n 'fullstack': {\n get name() { return cliM('cli_appFullstackName') },\n get description() { return cliM('cli_appFullstackDescription') },\n defaultFeatures: ['iam', 'db', 'cache', 'crypto', 'storage', 'audit'],\n },\n}\n\nconst FRONTEND_TARGETS: Record<FrontendTarget, { name: string, description: string, implemented: boolean }> = {\n web: { name: 'Web', get description() { return cliM('cli_frontendWebDescription') }, implemented: true },\n app: { name: 'App', get description() { return cliM('cli_frontendAppDescription') }, implemented: true },\n miniapp: {\n get name() { return cliM('cli_frontendMiniappName') },\n get description() { return cliM('cli_frontendMiniappDescription') },\n implemented: false,\n },\n desktop: {\n get name() { return cliM('cli_frontendDesktopName') },\n get description() { return cliM('cli_frontendDesktopDescription') },\n implemented: true,\n },\n}\n\nconst DEFAULT_FULLSTACK_FRONTENDS: FrontendTarget[] = ['web', 'app', 'desktop']\n\n// =============================================================================\n// 功能定义\n// =============================================================================\n\n/**\n * 功能定义\n */\nconst FEATURES: Record<string, FeatureDefinition> = {\n 'iam': {\n id: 'iam',\n get name() { return cliM('cli_featureIamName') },\n get description() { return cliM('cli_featureIamDescription') },\n packages: ['@h-ai/iam'],\n dependencies: ['crypto', 'db', 'cache'],\n },\n 'db': {\n id: 'db',\n get name() { return cliM('cli_featureDbName') },\n get description() { return cliM('cli_featureDbDescription') },\n packages: ['@h-ai/reldb'],\n },\n 'cache': {\n id: 'cache',\n get name() { return cliM('cli_featureCacheName') },\n get description() { return cliM('cli_featureCacheDescription') },\n packages: ['@h-ai/cache'],\n },\n 'ai': {\n id: 'ai',\n get name() { return cliM('cli_featureAiName') },\n get description() { return cliM('cli_featureAiDescription') },\n packages: ['@h-ai/ai'],\n dependencies: ['db', 'vecdb'],\n },\n 'storage': {\n id: 'storage',\n get name() { return cliM('cli_featureStorageName') },\n get description() { return cliM('cli_featureStorageDescription') },\n packages: ['@h-ai/storage'],\n },\n 'crypto': {\n id: 'crypto',\n get name() { return cliM('cli_featureCryptoName') },\n get description() { return cliM('cli_featureCryptoDescription') },\n packages: ['@h-ai/crypto'],\n dependencies: ['db'],\n },\n 'audit': {\n id: 'audit',\n get name() { return cliM('cli_featureAuditName') },\n get description() { return cliM('cli_featureAuditDescription') },\n packages: ['@h-ai/audit'],\n dependencies: ['db'],\n },\n 'reach': {\n id: 'reach',\n get name() { return cliM('cli_featureReachName') },\n get description() { return cliM('cli_featureReachDescription') },\n packages: ['@h-ai/reach'],\n },\n 'payment': {\n id: 'payment',\n get name() { return cliM('cli_featurePaymentName') },\n get description() { return cliM('cli_featurePaymentDescription') },\n packages: ['@h-ai/payment'],\n dependencies: ['db'],\n },\n 'vecdb': {\n id: 'vecdb',\n get name() { return cliM('cli_featureVecdbName') },\n get description() { return cliM('cli_featureVecdbDescription') },\n packages: ['@h-ai/vecdb'],\n },\n 'datapipe': {\n id: 'datapipe',\n get name() { return cliM('cli_featureDatapipeName') },\n get description() { return cliM('cli_featureDatapipeDescription') },\n packages: ['@h-ai/datapipe'],\n },\n 'scheduler': {\n id: 'scheduler',\n get name() { return cliM('cli_featureSchedulerName') },\n get description() { return cliM('cli_featureSchedulerDescription') },\n packages: ['@h-ai/scheduler'],\n dependencies: ['db'],\n },\n 'deploy': {\n id: 'deploy',\n get name() { return cliM('cli_featureDeployName') },\n get description() { return cliM('cli_featureDeployDescription') },\n packages: ['@h-ai/deploy'],\n },\n 'api-client': {\n id: 'api-client',\n get name() { return cliM('cli_featureApiClientName') },\n get description() { return cliM('cli_featureApiClientDescription') },\n packages: ['@h-ai/api-client'],\n },\n 'capacitor': {\n id: 'capacitor',\n get name() { return cliM('cli_featureCapacitorName') },\n get description() { return cliM('cli_featureCapacitorDescription') },\n packages: ['@h-ai/capacitor'],\n },\n}\n\n/**\n * 可选择的功能列表\n */\nconst SELECTABLE_FEATURES: FeatureId[] = [\n 'iam',\n 'db',\n 'cache',\n 'ai',\n 'storage',\n 'crypto',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'api-client',\n 'capacitor',\n]\n\nconst PROJECT_NAME_REGEX = /^[a-z0-9-]+$/\n\n// =============================================================================\n// 项目模板定义\n// =============================================================================\n\nconst PROJECT_TEMPLATES = {\n minimal: {\n name: 'minimal',\n get description() { return cliM('cli_templateMinimalDescription') },\n features: [] as FeatureId[],\n },\n default: {\n name: 'default',\n get description() { return cliM('cli_templateDefaultDescription') },\n features: ['iam', 'db', 'cache', 'crypto'] as FeatureId[],\n },\n full: {\n name: 'full',\n get description() { return cliM('cli_templateFullDescription') },\n features: [\n 'iam',\n 'db',\n 'cache',\n 'crypto',\n 'ai',\n 'storage',\n 'audit',\n 'reach',\n 'payment',\n 'vecdb',\n 'datapipe',\n 'scheduler',\n 'deploy',\n 'api-client',\n 'capacitor',\n ] as FeatureId[],\n },\n custom: {\n name: 'custom',\n get description() { return cliM('cli_templateCustomDescription') },\n features: [] as FeatureId[],\n },\n}\n\n// =============================================================================\n// 创建项目(主入口)\n// =============================================================================\n\n/**\n * 创建项目\n * 按应用类型生成工程并补齐功能硬依赖;--no-install 不安装依赖,--no-git 不初始化仓库。\n * @throws Error - 选项、目标目录、模板生成、依赖安装或 Git 初始化失败。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 生成及所选安装/Git 步骤完成。\n * @example 模块内部上下文\n * ```ts\n * // 在当前目录创建新的 shop 子目录;目标必须不存在或为空。\n * await createProject({ cwd: process.cwd(), name: 'shop', appType: 'api', features: ['ai'], packageManager: 'pnpm', yes: true, install: false, git: false, deploy: false })\n * // 对应 hai create shop --type api --features ai -y --no-install --no-git --no-deploy。\n * ```\n */\nexport async function createProject(options: CreateProjectOptions): Promise<void> {\n const spinner = ora()\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveOptions(options)\n\n // 安全校验:项目名必须仅含小写字母、数字和连字符,防止路径遍历\n if (!PROJECT_NAME_REGEX.test(resolvedOptions.name))\n throw new Error(cliM('cli_createInvalidName', { params: { name: resolvedOptions.name } }))\n\n const projectPath = path.resolve(resolvedOptions.cwd ?? '.', resolvedOptions.name)\n\n // 检查目录是否存在\n if (await fileExists(projectPath)) {\n const { overwrite } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'overwrite',\n message: cliM('cli_createOverwrite', { params: { name: resolvedOptions.name } }),\n initial: false,\n })\n\n if (!overwrite) {\n writeCliMessage(chalk.yellow(cliM('cli_cancelled')))\n return\n }\n\n await fse.remove(projectPath)\n }\n\n spinner.start(cliM('cli_createDirectory'))\n await fse.ensureDir(projectPath)\n spinner.succeed()\n\n // ─── 基于模板生成项目文件 ───\n spinner.start(cliM('cli_createFiles'))\n\n const context = buildTemplateContext({\n name: resolvedOptions.name,\n appType: resolvedOptions.appType,\n features: resolvedOptions.features,\n deploy: resolvedOptions.deploy,\n frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n {\n // 生成配置文件(config/*.yml)\n const { generateConfigFile, generateEnvExample, generateProductionEnvironment } = await import('./cli-config-templates.js')\n const configs = resolvedOptions.moduleConfigs\n const isApiWorkspace = resolvedOptions.appType === 'api'\n const isFullstack = resolvedOptions.appType === 'fullstack'\n const configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, 'config')\n : isFullstack\n ? path.join(projectPath, 'packages', `${resolvedOptions.name}-serv`, 'config')\n : path.join(projectPath, 'config')\n const envExamplePath = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, '.env.example')\n : path.join(projectPath, '.env.example')\n\n for (const featureId of resolvedOptions.features) {\n const configKey = getFeatureConfigKey(featureId)\n if (configKey) {\n const configPath = path.join(configDir, `_${configKey}.yml`)\n // fullstack 已用模块配置 helper 渲染完整配置,不能再覆盖 Reach 模板等应用默认值。\n if (isFullstack && await fse.pathExists(configPath))\n continue\n await writeFile(configPath, generateConfigFile(configKey, configs))\n }\n }\n\n if (!isApiWorkspace && !isFullstack) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n }\n\n const configContents: Record<string, string> = {}\n for (const file of await fse.readdir(configDir)) {\n if (/^_.*\\.yml$/.test(file))\n configContents[file.slice(1, -4)] = await fse.readFile(path.join(configDir, file), 'utf8')\n }\n const envFeatures: FeatureId[] = isFullstack ? [...new Set<FeatureId>([...resolvedOptions.features, 'reach'])] : resolvedOptions.features\n const envContents = generateEnvExample(envFeatures, configs, isFullstack, configContents)\n let envExample = isApiWorkspace\n ? envContents\n : isFullstack\n ? `${envContents}\\n# First-start administrator password; must satisfy the IAM password policy.\\nHAI_ADMIN_DEFAULT_PASSWORD=\\n\\n# Public API origin; never include credentials.\\nPUBLIC_API_BASE=http://127.0.0.1:3000\\n`\n : context.isSvelteOnlyApp\n ? `${envContents}\\n# Public API URL including /api/v1; never include credentials.\\nPUBLIC_API_BASE=http://10.0.2.2:3000/api/v1\\n`\n : envContents\n\n const runtimeVariables = new Map<string, ConfigEnvironmentVariable>()\n for (const file of await fse.readdir(projectPath, { recursive: true, encoding: 'utf8' })) {\n if (!/\\.(?:ts|js|mjs|svelte|envsh)$/.test(file))\n continue\n for (const variable of runtimeEnvironmentVariables(await fse.readFile(path.join(projectPath, file), 'utf8')))\n runtimeVariables.set(variable.name, variable)\n }\n const existingNames = new Set([...envExample.matchAll(/^(?:#\\s*)?([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const runtimeExample = renderEnvironment([...runtimeVariables.values()].filter(variable => !existingNames.has(variable.name)))\n if (runtimeExample)\n envExample += `\\n# 可选运行入口(按用途注入,不进入公共默认值):\\n${runtimeExample.split('\\n').map(line => line && !line.startsWith('#') ? `# ${line}` : line).join('\\n')}\\n`\n\n await writeFile(envExamplePath, envExample)\n const envDirectory = path.dirname(envExamplePath)\n const sharedVariables = envExample.split('\\n').filter(line => /^[A-Z][A-Z0-9_]*=/.test(line))\n await writeFile(path.join(envDirectory, '.env'), `# 公共基础配置(可提交);完整字段说明见 .env.example。\\n${sharedVariables.join('\\n')}\\n`)\n for (const [mode, environment] of [['dev', 'development'], ['test', 'test'], ['prod', 'production']] as const) {\n const values = mode === 'prod'\n ? generateProductionEnvironment(envFeatures, configs)\n : `# 公共 ${mode} 环境配置;本机私有值放 .env.local,进程环境变量优先。\\nHAI_CORE_ENV=${environment}\\nHAI_CORE_LOGGING_LEVEL=${mode === 'test' ? 'warn' : 'debug'}\\n`\n await writeFile(path.join(envDirectory, `.env.${mode}`), values)\n }\n const privateEntries: string[] = []\n if (isFullstack) {\n // 每个项目使用独立随机密码,保证四类字符;真实凭据只写入被忽略的本地文件。\n const password = `Aa1!${randomBytes(24).toString('base64url')}`\n privateEntries.push(`HAI_ADMIN_DEFAULT_PASSWORD=${password}`)\n }\n if (isFullstack || (isApiWorkspace && resolvedOptions.features.includes('crypto'))) {\n // 仅在项目创建时生成一次本机开发 Secret;运行时禁止隐式生成,部署时由 Secret Manager 分发。\n const key = createECDH('SM2')\n key.generateKeys()\n const id = `bootstrap-${randomBytes(6).toString('hex')}`\n const ring = { activeKeyId: id, keys: { [id]: { publicKey: key.getPublicKey('hex'), privateKey: key.getPrivateKey('hex').padStart(64, '0') } } }\n privateEntries.push(`HAI_CRYPTO_TRANSPORT_SERVERKEYRING='${JSON.stringify(ring)}'`)\n }\n await fse.writeFile(path.join(envDirectory, '.env.local'), `# 本机私有配置,不提交 Git;部署凭据由目标环境单独提供。\\n${privateEntries.join('\\n')}\\n`, { mode: 0o600 })\n }\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./cli-skill-templates.js')\n await generateSkillFiles(\n projectPath,\n resolvedOptions.features,\n resolvedOptions.appType,\n resolvedOptions.name,\n )\n\n // 生成 README\n const appTypeLabel = cliM(`cli_app${({ 'admin': 'Admin', 'website': 'Website', 'h5': 'H5', 'api': 'Api', 'mobile-app': 'Mobile', 'fullstack': 'Fullstack' } as const)[resolvedOptions.appType]}Name`, { locale: 'zh-CN' })\n const readmeContent = resolvedOptions.appType === 'fullstack'\n ? generateFullstackReadme(resolvedOptions.name, resolvedOptions.packageManager!, resolvedOptions.frontends)\n : resolvedOptions.appType === 'api'\n ? generateApiWorkspaceReadme(resolvedOptions.name, resolvedOptions.packageManager!)\n : generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!, resolvedOptions.appType)\n await writeFile(\n path.join(projectPath, 'README.md'),\n resolvedOptions.deploy === false\n ? readmeContent.replace(/### 构建与部署[\\s\\S]*?(?=\\n#{2,3} |$)/, '### 构建\\n\\npnpm build\\npnpm build --target docker\\n\\n本项目创建时关闭了部署工具。\\n')\n : readmeContent,\n )\n\n spinner.succeed()\n\n // 初始化 Git\n if (resolvedOptions.git) {\n spinner.start(cliM('cli_createGit'))\n execSync('git init', { cwd: projectPath, stdio: 'ignore' })\n if (resolvedOptions.gitRemote) {\n // 使用 execFileSync + 数组参数,避免 shell 注入\n // 同时在非交互模式下补充校验(交互模式在 prompts.validate 中已校验)\n const gitRemote = resolvedOptions.gitRemote\n if (!RE_HTTPS_URL.test(gitRemote) && !RE_GIT_SSH_URL.test(gitRemote)) {\n spinner.fail()\n throw new Error(cliM('cli_createRemoteFailure', { params: { remote: gitRemote } }))\n }\n execFileSync('git', ['remote', 'add', 'origin', gitRemote], { cwd: projectPath, stdio: 'ignore' })\n }\n spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(cliM('cli_createInstall', { params: { manager: resolvedOptions.packageManager } }))\n installDependencies(projectPath, resolvedOptions.packageManager!)\n spinner.succeed()\n }\n\n // 完成提示\n printCompletionMessage(resolvedOptions)\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_createFailed')), error)\n throw error\n }\n}\n\n// =============================================================================\n// 交互式选项解析\n// =============================================================================\n\n/**\n * 解析选项(交互式)\n */\nasync function resolveOptions(options: CreateProjectOptions): Promise<Required<CreateProjectOptions>> {\n const useDefaults = options.yes ?? false\n\n writeCliMessage('')\n writeCliMessage(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n writeCliMessage(chalk.gray(cliM('cli_createTagline')))\n writeCliMessage('')\n\n const onCancel = () => {\n writeCliMessage(chalk.red(cliM('cli_cancelledLine')))\n process.exit(1)\n }\n\n // 项目名称(逐条询问,避免 prompts 数组模式在 Windows 终端重复渲染)\n let projectName = options.name\n if (!projectName && useDefaults) {\n projectName = 'my-app'\n }\n else if (!projectName) {\n const { name } = await prompts({\n type: 'text',\n name: 'name',\n message: cliM('cli_createNamePrompt'),\n initial: 'my-app',\n validate: (value: string) => {\n if (!value.trim())\n return cliM('cli_createNameRequired')\n if (!PROJECT_NAME_REGEX.test(value))\n return cliM('cli_createNamePattern')\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n if (!resolvedAppType && useDefaults) {\n resolvedAppType = 'admin'\n }\n else if (!resolvedAppType) {\n const { appType } = await prompts({\n type: 'select',\n name: 'appType',\n message: cliM('cli_createTypePrompt'),\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: key,\n })),\n initial: 0,\n }, { onCancel })\n resolvedAppType = appType\n }\n\n const selectedAppType = (resolvedAppType || 'admin') as AppType\n\n const selectedFrontends = selectedAppType === 'fullstack'\n ? await resolveFrontendTargets(options.frontends, useDefaults, onCancel)\n : []\n\n // 模板选择\n let selectedTemplate = options.template\n if (selectedAppType === 'fullstack') {\n selectedTemplate = selectedTemplate ?? 'custom'\n }\n else if (!selectedTemplate) {\n if (useDefaults) {\n selectedTemplate = 'default'\n }\n else {\n const { template } = await prompts({\n type: 'select',\n name: 'template',\n message: cliM('cli_createTemplatePrompt'),\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n choices: Object.values(PROJECT_TEMPLATES).map(t => ({\n title: t.name,\n description: formatPromptDescription(t.description),\n value: t.name,\n })),\n initial: 1,\n }, { onCancel })\n selectedTemplate = template\n }\n }\n\n // 功能选择\n let selectedFeatures: FeatureId[] = []\n const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures\n\n if (selectedAppType === 'fullstack') {\n selectedFeatures = resolveFeatureDependencies([...appTypeDefaults, ...(options.features ?? [])])\n }\n else if (options.features) {\n selectedFeatures = resolveFeatureDependencies(options.features)\n }\n else if (selectedTemplate === 'custom' && !options.features && useDefaults) {\n selectedFeatures = resolveFeatureDependencies(appTypeDefaults)\n }\n else if (selectedTemplate === 'custom' && !options.features) {\n const featureChoices = SELECTABLE_FEATURES.map(id => ({\n title: FEATURES[id].name,\n description: formatPromptDescription(FEATURES[id].description),\n value: id,\n selected: appTypeDefaults.includes(id),\n }))\n\n const { features } = await prompts({\n type: 'multiselect',\n name: 'features',\n message: cliM('cli_featuresPrompt'),\n choices: featureChoices,\n hint: `\\n${formatPromptDescription(cliM('cli_multiselectHint'))}`,\n instructions: false,\n }, { onCancel })\n\n selectedFeatures = features || []\n selectedFeatures = resolveFeatureDependencies(selectedFeatures)\n }\n else {\n const templateFeatures = PROJECT_TEMPLATES[selectedTemplate as keyof typeof PROJECT_TEMPLATES]?.features || []\n const merged = new Set([...templateFeatures, ...appTypeDefaults])\n selectedFeatures = resolveFeatureDependencies(Array.from(merged))\n }\n\n selectedFeatures = selectedFeatures.filter(feature => feature !== 'deploy')\n if (options.deploy !== false)\n selectedFeatures.push('deploy')\n\n // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack'\n ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName!), ...options.moduleConfigs }\n : options.moduleConfigs ?? (useDefaults\n ? buildDefaultModuleConfigs(selectedFeatures, projectName!)\n : await promptModuleConfigs(selectedFeatures, projectName!))\n\n // 示例代码\n let addExamples = options.examples\n if (addExamples === undefined && useDefaults) {\n addExamples = true\n }\n else if (addExamples === undefined) {\n const { examples } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'examples',\n message: cliM('cli_createExamplesPrompt'),\n initial: true,\n }, { onCancel })\n addExamples = examples\n }\n\n // 包管理器\n const detected = await detectPackageManager(options.cwd ?? '.')\n let packageManager = selectedAppType === 'fullstack' || selectedAppType === 'api'\n ? 'pnpm'\n : options.packageManager\n if (!packageManager && useDefaults) {\n packageManager = detected\n }\n if (!packageManager) {\n const { pm } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'pm',\n message: cliM('cli_createManagerPrompt'),\n choices: [\n { title: cliM('cli_createPnpmRecommended'), value: 'pnpm' },\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n ],\n initial: detected === 'pnpm' ? 0 : detected === 'npm' ? 1 : 2,\n }, { onCancel })\n packageManager = pm\n }\n\n // 安装依赖\n let install = options.install\n if (install === undefined && useDefaults) {\n install = true\n }\n else if (install === undefined) {\n const { doInstall } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'doInstall',\n message: cliM('cli_createInstallPrompt'),\n initial: true,\n }, { onCancel })\n install = doInstall\n }\n\n // Git\n let git = options.git\n if (git === undefined && useDefaults) {\n git = true\n }\n else if (git === undefined) {\n const { initGit } = await prompts({\n type: 'confirm',\n active: cliM('cli_yes'),\n inactive: cliM('cli_no'),\n name: 'initGit',\n message: cliM('cli_createGitPrompt'),\n initial: true,\n }, { onCancel })\n git = initGit\n }\n\n // Git 远程仓库地址\n let gitRemote = options.gitRemote\n if (git && gitRemote === undefined && useDefaults) {\n gitRemote = ''\n }\n else if (git && gitRemote === undefined) {\n const { remote } = await prompts({\n type: 'text',\n name: 'remote',\n message: cliM('cli_createRemotePrompt'),\n initial: '',\n validate: (value: string) => {\n if (!value.trim())\n return true\n if (RE_HTTPS_URL.test(value) || RE_GIT_SSH_URL.test(value))\n return true\n return cliM('cli_createRemoteInvalid')\n },\n }, { onCancel })\n gitRemote = remote?.trim() || ''\n }\n\n return {\n name: projectName!,\n appType: selectedAppType,\n frontends: selectedFrontends,\n template: (selectedTemplate ?? 'default') as 'default' | 'minimal' | 'full' | 'custom',\n features: selectedFeatures,\n deploy: options.deploy !== false,\n moduleConfigs,\n examples: addExamples ?? true,\n install: install ?? true,\n packageManager: packageManager || 'pnpm',\n git: git ?? true,\n gitRemote: gitRemote ?? '',\n yes: useDefaults,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\nfunction buildDefaultModuleConfigs(features: FeatureId[], projectName: string): ModuleConfigs {\n const configs: ModuleConfigs = {\n core: { name: projectName, defaultLocale: 'zh-CN' },\n }\n\n if (features.includes('db')) {\n configs.db = { type: 'sqlite', database: './data/app.db' }\n }\n if (features.includes('cache')) {\n configs.cache = { type: 'memory' }\n }\n if (features.includes('iam')) {\n configs.iam = { loginPassword: true, loginOtp: false }\n }\n if (features.includes('storage')) {\n configs.storage = { type: 'local', localPath: './data/uploads' }\n }\n if (features.includes('ai')) {\n configs.ai = { defaultProvider: 'openai', model: 'gpt-4o-mini' }\n }\n\n return configs\n}\n\nasync function resolveFrontendTargets(\n frontends: FrontendTarget[] | undefined,\n useDefaults: boolean,\n onCancel: () => void,\n): Promise<FrontendTarget[]> {\n if (frontends && frontends.length > 0) {\n return normalizeFrontendTargets(frontends)\n }\n if (useDefaults) {\n return DEFAULT_FULLSTACK_FRONTENDS\n }\n\n const { selectedFrontends } = await prompts({\n type: 'multiselect',\n name: 'selectedFrontends',\n message: cliM('cli_frontendsPrompt'),\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: target.name,\n description: formatPromptDescription(target.description),\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n // 独立行显示帮助,避免宽字符让 prompts 按字符数清除时遗留折行。\n hint: `\\n${formatPromptDescription(cliM('cli_multiselectHint'))}`,\n instructions: false,\n }, { onCancel })\n\n return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS)\n}\n\nfunction normalizeFrontendTargets(frontends: FrontendTarget[]): FrontendTarget[] {\n const validTargets = new Set(Object.keys(FRONTEND_TARGETS))\n const result = frontends.filter(target => validTargets.has(target))\n return [...new Set(result.length > 0 ? result : DEFAULT_FULLSTACK_FRONTENDS)]\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 迭代展开功能硬依赖直到集合稳定,避免仅处理一层依赖导致初始化缺项;保留输入顺序并去重。\n * @param features - 调用方选择的功能。\n * @returns 包含传递硬依赖的功能列表。\n * @example 模块内部上下文\n * ```ts\n * const features = resolveFeatureDependencies(['iam', 'ai'])\n * const complete = ['db', 'cache', 'crypto', 'vecdb'].every(feature => features.some(selected => selected === feature))\n * ```\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n let changed = true\n while (changed) {\n changed = false\n for (const featureId of result) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n if (!result.has(dep)) {\n result.add(dep)\n changed = true\n }\n }\n }\n }\n }\n\n return Array.from(result)\n}\n\n// =============================================================================\n// 模块配置交互\n// =============================================================================\n\n/**\n * 交互式收集模块配置\n */\nasync function promptModuleConfigs(features: FeatureId[], projectName: string): Promise<ModuleConfigs> {\n const configs: ModuleConfigs = {}\n const onCancel = () => {\n writeCliMessage(chalk.red(cliM('cli_cancelledLine')))\n process.exit(1)\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_createModuleConfig')))\n writeCliMessage(chalk.gray(cliM('cli_createModuleConfigHint')))\n writeCliMessage('')\n\n // core 配置(始终收集)\n configs.core = await promptCoreConfig(projectName, onCancel)\n\n if (features.includes('db')) {\n configs.db = await promptDbConfig(projectName, onCancel)\n }\n if (features.includes('cache')) {\n configs.cache = await promptCacheConfig(onCancel)\n }\n if (features.includes('iam')) {\n configs.iam = await promptIamConfig(onCancel)\n }\n if (features.includes('storage')) {\n configs.storage = await promptStorageConfig(onCancel)\n }\n if (features.includes('ai')) {\n configs.ai = await promptAiConfig(onCancel)\n }\n\n return configs\n}\n\n/**\n * 收集 core 模块配置\n */\nasync function promptCoreConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['core']> {\n writeCliMessage(chalk.cyan(cliM('cli_createCoreConfig')))\n const { defaultLocale } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'defaultLocale',\n message: cliM('cli_createLocalePrompt'),\n choices: [\n { title: cliM('cli_createChineseLocale'), value: 'zh-CN' },\n { title: cliM('cli_createEnglishLocale'), value: 'en-US' },\n { title: cliM('cli_createJapaneseLocale'), value: 'ja-JP' },\n ],\n initial: 0,\n }, { onCancel })\n return { name: projectName, defaultLocale }\n}\n\n/**\n * 收集 db 模块配置\n */\nasync function promptDbConfig(projectName: string, onCancel: () => void): Promise<ModuleConfigs['db']> {\n writeCliMessage(chalk.cyan(cliM('cli_createDbConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createDbTypePrompt'),\n choices: [\n { title: cliM('cli_createSqliteOption'), value: 'sqlite' },\n { title: 'PostgreSQL', value: 'postgresql' },\n { title: 'MySQL', value: 'mysql' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'sqlite') {\n const { database } = await prompts({\n type: 'text',\n name: 'database',\n message: cliM('cli_createSqlitePathPrompt'),\n initial: './data/app.db',\n }, { onCancel })\n return { type, database }\n }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: cliM('cli_createDbHostPrompt', { params: { backend: type === 'postgresql' ? 'PostgreSQL' : 'MySQL' } }), initial: 'localhost' },\n { type: 'number', name: 'port', message: cliM('cli_createPortPrompt'), initial: type === 'postgresql' ? 5432 : 3306 },\n { type: 'text', name: 'database', message: cliM('cli_createDatabasePrompt'), initial: projectName },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port, database: answers.database }\n}\n\n/**\n * 收集 cache 模块配置\n */\nasync function promptCacheConfig(onCancel: () => void): Promise<ModuleConfigs['cache']> {\n writeCliMessage(chalk.cyan(cliM('cli_createCacheConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createCacheTypePrompt'),\n choices: [\n { title: cliM('cli_createMemoryOption'), value: 'memory' },\n { title: 'Redis', value: 'redis' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'memory')\n return { type }\n\n const answers = await prompts([\n { type: 'text', name: 'host', message: cliM('cli_createRedisHostPrompt'), initial: 'localhost' },\n { type: 'number', name: 'port', message: cliM('cli_createRedisPortPrompt'), initial: 6379 },\n ], { onCancel })\n\n return { type, host: answers.host, port: answers.port }\n}\n\n/**\n * 收集 iam 模块配置\n */\nasync function promptIamConfig(onCancel: () => void): Promise<ModuleConfigs['iam']> {\n writeCliMessage(chalk.cyan(cliM('cli_createIamConfig')))\n const answers = await prompts([\n { type: 'confirm', active: cliM('cli_yes'), inactive: cliM('cli_no'), name: 'loginPassword', message: cliM('cli_createPasswordPrompt'), initial: true },\n { type: 'confirm', active: cliM('cli_yes'), inactive: cliM('cli_no'), name: 'loginOtp', message: cliM('cli_createOtpPrompt'), initial: false },\n ], { onCancel })\n return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp }\n}\n\n/**\n * 收集 storage 模块配置\n */\nasync function promptStorageConfig(onCancel: () => void): Promise<ModuleConfigs['storage']> {\n writeCliMessage(chalk.cyan(cliM('cli_createStorageConfig')))\n const { type } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'type',\n message: cliM('cli_createStorageTypePrompt'),\n choices: [\n { title: cliM('cli_createLocalStorageOption'), value: 'local' },\n { title: 'S3 / MinIO / OSS', value: 's3' },\n ],\n initial: 0,\n }, { onCancel })\n\n if (type === 'local') {\n const { localPath } = await prompts({\n type: 'text',\n name: 'localPath',\n message: cliM('cli_createStoragePathPrompt'),\n initial: './data/uploads',\n }, { onCancel })\n return { type, localPath }\n }\n\n return { type }\n}\n\n/**\n * 收集 ai 模块配置\n */\nasync function promptAiConfig(onCancel: () => void): Promise<ModuleConfigs['ai']> {\n writeCliMessage(chalk.cyan(cliM('cli_createAiConfig')))\n const { defaultProvider } = await prompts({\n type: 'select',\n hint: `\\n${formatPromptDescription(cliM('cli_selectHint'))}`,\n name: 'defaultProvider',\n message: cliM('cli_createProviderPrompt'),\n choices: [\n { title: 'OpenAI', value: 'openai' },\n { title: 'Anthropic (Claude)', value: 'anthropic' },\n { title: cliM('cli_createCompatibleAiOption'), value: 'custom' },\n ],\n initial: 0,\n }, { onCancel })\n\n const defaultModel = defaultProvider === 'openai'\n ? 'gpt-4o-mini'\n : defaultProvider === 'anthropic'\n ? 'claude-3-sonnet'\n : ''\n\n const { model } = await prompts({\n type: 'text',\n name: 'model',\n message: cliM('cli_createModelPrompt'),\n initial: defaultModel,\n }, { onCancel })\n\n return { defaultProvider, model }\n}\n\n// =============================================================================\n// 工具函数\n// =============================================================================\n\n/**\n * 获取功能对应的配置 key\n */\nfunction getFeatureConfigKey(featureId: FeatureId): string | null {\n const map: Record<string, string> = {\n db: 'db',\n cache: 'cache',\n iam: 'iam',\n storage: 'storage',\n ai: 'ai',\n deploy: 'deploy',\n vecdb: 'vecdb',\n reach: 'reach',\n scheduler: 'scheduler',\n audit: 'audit',\n payment: 'payment',\n }\n return map[featureId] ?? null\n}\n\n/**\n * 获取安装命令\n */\nfunction getInstallCommand(pm: 'pnpm' | 'npm' | 'yarn'): string {\n switch (pm) {\n case 'pnpm': return 'pnpm install'\n case 'yarn': return 'yarn'\n default: return 'npm install'\n }\n}\n\n/**\n * 生成运行 package.json 脚本的命令\n *\n * npm 需要 `npm run <script>`(lifecycle 脚本除外),pnpm / yarn 可直接 `<pm> <script>`。\n */\nfunction getRunCommand(pm: 'pnpm' | 'npm' | 'yarn', script: string): string {\n return pm === 'npm' ? `npm run ${script}` : `${pm} ${script}`\n}\n\nfunction installDependencies(projectPath: string, pm: 'pnpm' | 'npm' | 'yarn'): void {\n const installCmd = getInstallCommand(pm)\n try {\n execSync(installCmd, {\n cwd: projectPath,\n stdio: 'pipe',\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n })\n }\n catch (error) {\n const details = formatCommandFailure(installCmd, error)\n throw new Error(`${cliM('cli_installFailed', { params: { pm } })}\\n${details}`)\n }\n}\n\n/**\n * 同步子命令异常中可读取的诊断字段;输出可能为 Buffer 或字符串,因此先以 unknown 接收并规范化。\n * @example 模块内部上下文\n * ```ts\n * const failure: CommandFailureLike = { status: 1, signal: null, stderr: Buffer.from('Install failed'), stdout: '' }\n * const details = formatCommandFailure('pnpm install', failure)\n * ```\n */\ninterface CommandFailureLike {\n stdout?: unknown\n stderr?: unknown\n status?: number | null\n signal?: string | null\n}\n\nfunction formatCommandFailure(command: string, error: unknown): string {\n if (!error || typeof error !== 'object') {\n return cliM('cli_commandLabel', { params: { command } })\n }\n\n const failure = error as CommandFailureLike\n const stdout = normalizeChildOutput(failure.stdout)\n const stderr = normalizeChildOutput(failure.stderr)\n const status = typeof failure.status === 'number' ? cliM('cli_exitCode', { params: { code: failure.status } }) : ''\n const signal = typeof failure.signal === 'string' ? cliM('cli_signal', { params: { signal: failure.signal } }) : ''\n const output = [\n cliM('cli_commandLabel', { params: { command } }),\n status,\n signal,\n stderr ? `stderr:\\n${stderr}` : '',\n stdout ? `stdout:\\n${stdout}` : '',\n ].filter(Boolean)\n\n return output.join('\\n\\n')\n}\n\nfunction normalizeChildOutput(output: unknown): string {\n if (typeof output === 'string') {\n return output.trim()\n }\n if (Buffer.isBuffer(output)) {\n return output.toString('utf-8').trim()\n }\n return ''\n}\n\n/** 生成各类项目共用的 AI 开发入口说明。 */\nfunction generateAiDevelopmentReadme(): string {\n return `### AI 辅助开发\n\n从本项目根目录打开所用编码工具,先读取 [AGENTS.md](./AGENTS.md)。Claude Code 通过 [CLAUDE.md](./CLAUDE.md) 加载项目规则;GitHub Copilot 使用 [.github/copilot-instructions.md](./.github/copilot-instructions.md),OpenCode 使用 AGENTS.md 和 [opencode.json](./opencode.json)。\n\n生成的页面和业务规则是起点,可以按需求调整。把功能、权限和验收条件告诉 AI,再让它读取对应技能与当前安装版本的 API。\n\n普通功能开发使用 [应用开发 Skill](./.agents/skills/hai-app-create/SKILL.md)。需求文档较多时,先用 [文档审查 Skill](./.agents/skills/hai-spec-review/SKILL.md) 找出缺失和矛盾,再用 [文档实施 Skill](./.agents/skills/hai-spec-implement/SKILL.md) 维护 docs/task-list.md 与 docs/tasks/,逐项实现、测试和交付。\n\n已有项目可运行 hai init 补齐缺失的 AI 入口;它保留已有自定义内容。升级框架使用 [框架升级 Skill](./.agents/skills/hai-framework-sync/SKILL.md),同时核对依赖、配置、代码和技能。\n\n`\n}\n\n/** 生成各类工程共用的配置与命令说明,放在开发/部署章节之间。 */\nfunction generateEnvironmentReadme(): string {\n return `### 分环境配置\n\n运行参数在 \\`.env.example\\` 中逐项说明用途、枚举和范围。\\`.env\\` 为公共基础,\\`.env.dev\\` / \\`.env.test\\` / \\`.env.prod\\` 为环境覆盖,均提交 Git;\\`.env.local\\` 为本机私有覆盖,不提交 Git。优先级为进程环境 > \\`.env.local\\` > 环境文件 > \\`.env\\`。YAML 显式引用 \\`HAI_<配置名>_<路径>\\` 并保留本地回退,camelCase 不拆词。完整命令、加载优先级和 Provider 切换见 [环境配置](.agents/skills/hai-app-create/development.md#环境配置)。\n\n生产 .env.prod 按已启用模块选择共享 PostgreSQL(明确选择 MySQL 时保留)、Redis、S3、Qdrant,默认使用 Compose 内部服务名 db/cache/storage/vecdb。密码、S3 凭据、模型 Key 与受保护 Qdrant 的 Key 只由私有环境注入;容器外运行覆盖内部连接地址。生产 Reach 必须注入真实 HAI_REACH_PROVIDERS JSON,公共空数组会拒绝启动。AI 自动补全 db+vecdb 依赖,并在二者就绪后初始化,失败逆序清理。\n\n| 用途 | 命令 |\n| --- | --- |\n| 开发 / 测试模式 / 生产模式预览 | \\`pnpm dev\\` / \\`dev:test\\` / \\`dev:prod\\` |\n| 类型检查(check 为别名) | \\`pnpm typecheck\\` |\n| 检查 / 自动修复格式 | \\`pnpm lint\\` / \\`lint:fix\\` |\n| 源码构建 / 镜像构建 | \\`pnpm build\\` / \\`pnpm build --target docker\\` |\n| 单元测试 / 监听 / 浏览器验收 | \\`pnpm test\\` / \\`test:watch\\` / \\`test:e2e\\` |\n| Node 服务按环境启动(构建后) | \\`pnpm start\\` / \\`start:test\\` / \\`start:prod\\` |\n\nVite 客户端使用 \\`preview\\` 预览静态产物,Node 服务使用 \\`start\\`;纯 contract/shared 库只提供适用的构建和质量命令。API workspace 的环境文件位于 \\`apps/<name>-service\\`,fullstack 位于工程根。`\n}\n\n/** 生成与项目脚本一致的构建、离线交付和增量更新说明。 */\nfunction generateBuildDeploymentReadme(pm: string, appDir: string): string {\n return `### 构建与部署\n\n创建时默认包含部署工具;不需要时使用 hai create --no-deploy。\n每个镜像对应 images/ 中一个 Dockerfile,hai.build.json 用 dockerfile 指定文件。\n下载、安装和整理生产依赖复用同一份包缓存与 SQLite 驱动缓存,避免重复下载。\n默认容器用于 CPU 运行或连接远程 AI 服务,不额外下载 GPU 运行库;需要使用部署机器上的 GPU 时,自行定制镜像和容器运行参数。\n\n\\`\\`\\`sh\n${pm} build\n${pm} build --target docker\n# 构建和部署一次完成\n${pm} exec hai deploy ${appDir} --env test --build\n# 复用已有镜像;只生成完整离线包及跨平台部署脚本\n${pm} exec hai deploy ${appDir} --env prod --bundle-only\n# 只更新前端(工程存在 web 镜像时)\n${pm} build --target docker --images web\n${pm} exec hai deploy ${appDir} --env prod --services web\n\\`\\`\\`\n\n构建不读取部署环境;产物位于 .hai/build/docker/<buildId>,用 --artifact-dir 精确选择。\n应用根 package.json.version 驱动版本,同版本允许重新构建和发布;清单记录独立构建编号与校验和。\n完整离线包自动携带自建中间件镜像;准备中间件镜像需要构建机有可用 Podman/Docker,缺镜像时在打包阶段拉取。\n服务器需要 Linux、Docker/Podman、Docker Compose v2 或 podman-compose 1.6.0 及以上、sh、tar、sha256sum、awk、curl、util-linux flock 和支持 flock 的文件系统,启动阶段不联网拉取。\n固定 .deploy.lock 内核锁覆盖部署及恢复;禁止删除或替换,所有持有进程退出或重启后自动释放。强杀后须核对结果文件、current 和容器状态,再用新包恢复。\ntar 旁的部署目录提供 deploy.ps1(Windows)和 deploy.sh(Linux/macOS),按已保存的 SSH 参数上传、导入、启动并验证 HTTP。\n完全隔离时手工搬运 tar,独立目录解包后执行 sh apply.sh,或传入部署目录覆盖默认位置。\n部分更新要求已有成功的完整部署,保留未选服务及数据卷;失败返回非零退出码,已有部署尝试恢复选中服务。\n中间件连接齐全时使用 --skip-middleware 跳过配置向导。包中包含私有配置,不提交 Git。\n`\n}\n\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n return `# ${name}\n\n## 简介\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 核心功能清单\n\n- 开发服务器、源码编译与浏览器测试。\n- 按所选模块提供页面和服务配置。\n- 独立 Dockerfile 与镜像归档,便于交付。\n\n## 使用入门\n\n### 页面布局与路由\n\n页面统一继承根布局的 header/footer。${appType === 'mobile-app' ? '页面放 src/lib/pages/**/*.svelte,hash 路由自动发现,刷新与前进后退恢复当前页。' : '使用 SvelteKit 自动文件路由,新增 +page.svelte 无需维护路由表;刷新定位与服务端鉴权保持一致。'}${appType === 'mobile-app' ? '\\n\\n选择 IAM 或 crypto 的移动客户端默认启用加密 transport,先初始化 crypto,再初始化 typed API client;结束时按相反顺序关闭。仅明确连接匹配的明文 API 时设置 PUBLIC_API_TRANSPORT=off;PUBLIC_API_KEY_EXCHANGE_PATH 仅覆盖公开协商子路径。握手失败不会退回明文,服务端私钥不进入客户端。未选择 crypto 的客户端保留明文 API 模式。' : ''}\n\n### 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n### 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'paraglide:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n${generateBuildDeploymentReadme(pm, `.`)}\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n\n## 开发测试\n\n\\`\\`\\`sh\n${getRunCommand(pm, 'typecheck')}\n${getRunCommand(pm, 'lint')}\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'test')}\n${getRunCommand(pm, 'test:e2e')}\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n## 简介\n\n后端 API 工程,接口定义与服务实现分包维护,客户端可复用同一份接口类型。\n\n## 核心功能清单\n\n- 共享 contract、输入输出校验与服务 procedures。\n- 模块配置、健康检查和 HTTP 服务。\n- 独立镜像构建与离线交付。\n\n## 使用入门\n\n### 工程结构\n\n- \\`apps/${name}-contract\\`:共享 API contract、Zod schema 与类型\n- \\`apps/${name}-service\\`:后端 API service,基于 \\`@h-ai/serv\\` 暴露 HTTP 应用\n\n### 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n${generateEnvironmentReadme()}\n\n\n${generateBuildDeploymentReadme(pm, `apps/${name}-service`)}\n\n### 扩展建议\n\n- 在 \\`${name}-contract\\` 中维护应用级 contract,前后端共用同一份类型与路径定义。\n- 在 \\`${name}-service\\` 中扩展 procedures、模块初始化与配置。\n- 需要 IAM / storage / ai 时,优先复用 \\`@h-ai/api-contract\\` 与 \\`@h-ai/serv/features/*\\`。\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/api-contract](./.agents/skills/hai-api-contract/SKILL.md)\n- [@h-ai/api-client](./.agents/skills/hai-api-client/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[]): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n return `# ${name}\n\n## 简介\n\n前后端分离工程,API 与 Web、移动端、桌面端共享接口类型和管理界面,可按实际业务调整。\n\n## 核心功能清单\n\n- API 服务、共享界面与按需生成的客户端。\n- 用户管理、角色、审计和个人设置示例。\n- 登录、主题、语言、新手引导和帮助中心。\n- API/Web 独立 Dockerfile 与镜像归档。\n\n## 使用入门\n\n### 工程结构\n\n- \\`packages/${name}-contract\\`:前后端共享 API 契约、Zod Schema 与类型\n- \\`packages/${name}-serv\\`:后端 API Service(通过 \\`@h-ai/serv\\` 暴露最小 HTTP App 抽象,不直接暴露 Hono)\n- \\`packages/${name}-shared\\`:跨端共享 Shell、主题、语言切换、API client 与共享 messages\n- \\`apps/${name}-web\\`:Web 前端${frontends.includes('web') ? '' : '(未启用)'}\n- \\`apps/${name}-app\\`:移动端 App/H5 前端${frontends.includes('app') ? '' : '(未启用)'}\n- \\`apps/${name}-desktop\\`:桌面端前端${frontends.includes('desktop') ? '' : '(未启用)'}\n- \\`apps/${name}-miniapp\\`:小程序预留说明与本端 inlang messages${frontends.includes('miniapp') ? '(占位,不参与构建)' : '(未启用)'}\n\n已启用前端:${enabledFrontends || 'Web / App / Desktop'}\n\n### 页面布局与路由\n\nWeb/App/Desktop 共享 AppShell 的 header/footer。新增页面放 shared/src/lib/pages/**/*.svelte,由 HashRouter 自动发现并按需加载;菜单只维护入口。地址使用 #/页面路径,支持刷新、查询串与浏览器前进后退;API 权限仍由服务端校验。\n\n### 默认管理功能\n\n以下描述可运行示例的初始业务,可按实际需求调整或移除,并同步代码、数据、鉴权、界面、测试和文档。\n\n默认启用 IAM、reldb、cache、audit、storage 和 crypto。初始管理员可以管理用户(新增、编辑、禁用、删除、角色分配、头像上传)、查看 admin/user 角色及人数、维护角色说明、分页筛选审计日志;初始普通用户进入个人资料、头像、语言、主题和密码设置。默认密码修改后全部会话失效,需要重新登录;角色模型、访问范围和会话策略由业务需求决定。\n\nCLI 已在根目录生成 \\`.env.local\\`,其中 \\`HAI_ADMIN_DEFAULT_PASSWORD\\` 是每个项目独立生成的随机强密码。直接运行 \\`dev\\` / \\`start\\` 即可,首次登录使用用户名 \\`admin\\` 和该密码;也可通过同名环境变量覆盖。密码须满足 \\`_iam.yml\\` 策略,启动失败会显示具体校验原因及错误码。\\`.env.local\\` 已被 Git 和容器构建忽略,\\`.env.example\\` 不含真实密码;部署时设置目标环境自己的密码。已有用户时不会重复创建管理员或重设密码。\n\n本地开发默认 \\`PUBLIC_API_BASE=http://127.0.0.1:3000\\`,Vite 使用同源代理;部署时改为实际公网 API Origin,Android 模拟器访问宿主机时使用 \\`http://10.0.2.2:3000\\`。不要将密钥放入任何 \\`PUBLIC_\\` 或 \\`VITE_\\` 变量。\n\n服务端版本化传输密钥环在创建时一次性写入被忽略的 \\`.env.local\\`,变量为 \\`HAI_CRYPTO_TRANSPORT_SERVERKEYRING\\`;运行时不生成密钥。部署由 Secret Manager 向所有节点分发同一受管 ring,配合共享 registry。私钥不进入公开配置、PUBLIC_/VITE_ 或日志。\n\n所有业务 JSON 请求和响应默认通过 \\`@h-ai/crypto\\` transport 双向加密(含登录、刷新、头像上传);前端统一使用共享 typed API client。Web 访问令牌仅存内存、刷新令牌由 HttpOnly Cookie 保存;受信原生端使用平台安全存储或内存。头像为随机路径只读图片资源,支持 PNG/JPEG/WebP,最大 512 KiB。健康检查和只读头像图片可直接访问。\n\n应用显示名称、版本、环境、默认语言和日志设置来自后端 \\`config/_core.yml\\`,前端通过 \\`app.info\\` 获取安全元信息。开发默认 SQLite、本地存储与内存缓存;生产启动拒绝这些本地 Provider,必须将所有节点连接到同一共享数据库、Redis 与 S3。传输必须在所有节点注入相同受管版本化密钥环与共享 registry,无需会话粘性;重启读取原 ring,轮换先分发新旧版本再切 activeKeyId。生产需显式配置允许的 CORS Origin。业务提交后的审计写入采用最大努力,失败记录结构化错误日志,保留已完成业务的原始结果。\n\n### 配置扩展\n\n服务端 \\`packages/${name}-serv/config/\\` 始终保留 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、deploy 共 13 份 YAML。已用模块保留工作默认值,未启用模块整份注释,可选字段和替代 Provider 按块注释;根 \\`.env.example\\` 也保留未启用模块的凭据示例。Reach 默认为开发控制台通知,生产按 \\`_reach.yml\\` 注释替换为 SMTP、短信或 API Provider,并保持名称唯一。\n\n自动生成的 \\`.env\\` 包含已启用模块的环境参数;YAML 显式引用相同变量并保留本地回退。编辑环境参数优先修改对应 \\`.env\\`;未启用模块仍保留注释。\n\n扩展时先在服务端 workspace 安装需要的包,在 \\`src/server/runtime.ts\\` 按模块公开 Schema 校验配置、初始化并反序关闭,再接入 contract/procedure 和界面。整份注释文件先去掉一层外层注释,可选块继续按需开启;配置文件存在不代表业务功能已接入。\\`crypto.init()\\` 无配置参数,datapipe 为纯函数,不生成虚构 YAML。\n\n环境变量只覆盖 YAML 已有路径,注释键须先启用,或用 \\`HAI_DB\\` / \\`HAI_CACHE\\` 等整体对象覆盖。camelCase 不拆词,例如 \\`connectTimeout\\` 对应 \\`HAI_CACHE_CONNECTTIMEOUT\\`。修改配置后重启服务;语言列表在各前端/shared 的 \\`project.inlang/settings.json\\` 中同步。\\`**/data/\\` 忽略任意层级的数据目录及 \\`.gitkeep\\`,运行数据不入 Git,运行时自动创建目录。\n\n${generateEnvironmentReadme()}\n\n### 开发与构建\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n${pm} typecheck\n${pm} build\n${pm} test\n${pm} test:e2e\n${frontends.includes('desktop') ? `${pm} build --target desktop --platform windows # Windows 主机;Linux/macOS 在对应主机构建` : ''}\n\\`\\`\\`\n\nTauri 需要目标系统的 Rust target、SDK 和打包工具。测试产生的临时工程、截图、报告、容器、镜像与进程应在 finally/teardown 中自动清理,失败也执行。\n\n${generateBuildDeploymentReadme(pm, `packages/${name}-serv`)}\n\n### i18n 与 shared 协同\n\n- shared:\\`packages/${name}-shared/project.inlang\\` + \\`messages/\\`,只放跨端共享组件文案。\n- web/app/desktop:每个应用都有自己的 \\`project.inlang\\` + \\`messages/\\`,用于本端页面与产品文案。\n- miniapp:当前是占位,但也有自己的 \\`project.inlang\\` + \\`messages/\\`,便于后续接入真实小程序框架。\n- 新增 locale 时,shared 与所有启用前端的 \\`locales\\` 必须同步;语言切换器会同时更新 shared runtime 与宿主应用 runtime。\n- \\`${pm} i18n:compile\\` 会统一编译 shared 与每个启用前端的 Paraglide 输出;各前端也可单独运行 \\`${pm} --filter ${name}-web paraglide:compile\\` 等命令。\n\n### 自定义建议\n\n- 改全局 Shell/主题/语言切换:编辑 \\`packages/${name}-shared\\`。\n- 改某个前端页面和文案:编辑共享 \\`packages/${name}-shared/src/lib/pages\\`、本端入口与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n\n${generateAiDevelopmentReadme()}### 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)\n- [@h-ai/ui](./.agents/skills/hai-ui/SKILL.md)\n\n## 开发测试\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 许可证\n\nApache-2.0\n`\n}\n\n/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions>): void {\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_createSuccess')))\n writeCliMessage('')\n\n // 功能摘要\n if (options.features.length > 0) {\n writeCliMessage(chalk.bold(cliM('cli_createFeatures')))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n writeCliMessage(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n writeCliMessage('')\n }\n\n writeCliMessage(cliM('cli_nextSteps'))\n writeCliMessage(chalk.cyan(` cd ${options.name}`))\n if (options.appType === 'fullstack')\n writeCliMessage(chalk.cyan(cliM('cli_adminPasswordSaved')))\n if (!options.install) {\n writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n writeCliMessage('')\n}\n\n// =============================================================================\n// 项目检测(供 init 命令使用)\n// =============================================================================\n\n/**\n * 检测项目信息\n * 缺少或无法解析 package.json 时返回 null;isHaiProject 仅表示依赖中含 @h-ai/*,不是业务配置验证。\n * @param cwd - 项目所在目录。\n * @returns 解析后的项目信息,文件缺失或解析失败时为 null。\n * @example 模块内部上下文\n * ```ts\n * const project = await detectProject(process.cwd())\n * if (project && project.isHaiProject) writeCliMessage(project.haiPackages.join(', '))\n * ```\n */\nexport async function detectProject(cwd: string): Promise<ProjectInfo | null> {\n const pkgPath = path.join(cwd, 'package.json')\n\n if (!(await fileExists(pkgPath))) {\n return null\n }\n\n try {\n const pkg = await fse.readJson(pkgPath)\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n\n const haiPackages = Object.keys(deps).filter(name => name.startsWith('@h-ai/'))\n\n return {\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n isHaiProject: haiPackages.length > 0,\n haiPackages,\n }\n }\n catch {\n return null\n }\n}\n","/**\n * @h-ai/cli — 模块增量添加命令\n *\n * 向现有 hai 项目增量启用模块。\n * @module cli-add\n */\n\nimport type { FeatureId, GlobalOptions } from '../cli-types.js'\nimport path from 'node:path'\nimport { parseEnv } from 'node:util'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { detectPackageManager, fileExists, getCliVersion, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile, generateProductionEnvironment } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * add 命令选项\n * 省略 module 时交互选择;install=false 只写项目依赖/配置与支持文件,不安装依赖。\n * @example 模块内部上下文\n * ```ts\n * const options: AddModuleOptions = { cwd: '/workspace/shop', module: 'ai', install: false }\n * ```\n */\nexport interface AddModuleOptions extends GlobalOptions {\n /** 要添加的模块 */\n module?: FeatureId\n /** 是否安装依赖 */\n install?: boolean\n}\n\n// 可添加的模块与对应包\nconst MODULE_MAP: Record<string, { packages: string[], deps?: string[], configKey?: string, description: string }> = {\n // iam 依赖 crypto(password hash)/ db(user 存储)/ cache(session 缓存)\n 'iam': { packages: ['@h-ai/iam'], deps: ['crypto', 'db', 'cache'], configKey: 'iam', get description() { return cliM('cli_featureIamName') } },\n // 'db' 和 'reldb' 都映射到 @h-ai/reldb,兼容用户习惯(hai add db 和 hai add reldb 均可)\n 'db': { packages: ['@h-ai/reldb'], configKey: 'db', get description() { return cliM('cli_featureDbName') } },\n 'reldb': { packages: ['@h-ai/reldb'], configKey: 'db', get description() { return cliM('cli_featureDbName') } },\n 'cache': { packages: ['@h-ai/cache'], configKey: 'cache', get description() { return cliM('cli_featureCacheName') } },\n 'ai': { packages: ['@h-ai/ai'], deps: ['db', 'vecdb'], configKey: 'ai', get description() { return cliM('cli_featureAiName') } },\n 'storage': { packages: ['@h-ai/storage'], configKey: 'storage', get description() { return cliM('cli_featureStorageName') } },\n 'crypto': { packages: ['@h-ai/crypto'], deps: ['db'], get description() { return cliM('cli_featureCryptoName') } },\n 'kit': { packages: ['@h-ai/kit'], get description() { return cliM('cli_featureKitName') } },\n 'ui': { packages: ['@h-ai/ui'], get description() { return cliM('cli_featureUiName') } },\n 'deploy': { packages: ['@h-ai/deploy'], configKey: 'deploy', get description() { return cliM('cli_featureDeployName') } },\n 'vecdb': { packages: ['@h-ai/vecdb'], configKey: 'vecdb', get description() { return cliM('cli_featureVecdbName') } },\n 'datapipe': { packages: ['@h-ai/datapipe'], get description() { return cliM('cli_featureDatapipeName') } },\n 'reach': { packages: ['@h-ai/reach'], configKey: 'reach', get description() { return cliM('cli_featureReachName') } },\n 'scheduler': { packages: ['@h-ai/scheduler'], deps: ['db'], configKey: 'scheduler', get description() { return cliM('cli_featureSchedulerName') } },\n 'audit': { packages: ['@h-ai/audit'], deps: ['db'], configKey: 'audit', get description() { return cliM('cli_featureAuditName') } },\n 'payment': { packages: ['@h-ai/payment'], configKey: 'payment', get description() { return cliM('cli_featurePaymentName') } },\n 'capacitor': { packages: ['@h-ai/capacitor'], get description() { return cliM('cli_featureCapacitorName') } },\n 'api-client': { packages: ['@h-ai/api-client'], get description() { return cliM('cli_featureApiClientName') } },\n}\n\n/**\n * 增量添加模块到现有项目\n * 写入失败与安装失败会抛出异常;未检测到项目、未知或已安装模块等分支打印诊断后返回。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 依赖/配置与支持文件处理结束;部分诊断分支打印提示后直接返回。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前目录是要修改的现有 hai 项目。\n * await addModule({ cwd: process.cwd(), module: 'ai', install: false })\n * // 然后自行安装依赖,并在应用启动链路初始化新增模块;此命令不修改业务启动代码。\n * ```\n */\nexport async function addModule(options: AddModuleOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n const project = await detectProject(cwd)\n if (!project) {\n writeCliError(chalk.red(cliM('cli_projectNotFound')))\n return\n }\n\n // 交互式选择模块\n let moduleName = options.module\n if (!moduleName) {\n // 过滤已安装的模块\n const installed = new Set(project.haiPackages)\n const choices = Object.entries(MODULE_MAP)\n .filter(([, def]) => !def.packages.every(p => installed.has(p)))\n .map(([key, def]) => ({\n title: `${chalk.bold(key.padEnd(10))} ${chalk.gray(def.description)}`,\n value: key,\n }))\n\n if (choices.length === 0) {\n writeCliMessage(chalk.green(cliM('cli_addAllInstalled')))\n return\n }\n\n const { selected } = await prompts({\n type: 'select',\n hint: cliM('cli_selectHint'),\n name: 'selected',\n message: cliM('cli_addModulePrompt'),\n choices,\n })\n\n if (!selected)\n return\n moduleName = selected as FeatureId\n }\n\n const moduleDef = MODULE_MAP[moduleName]\n if (!moduleDef) {\n writeCliError(chalk.red(cliM('cli_addUnknownModule', { params: { module: moduleName } })))\n writeCliMessage(cliM('cli_addAvailableModules', { params: { modules: Object.keys(MODULE_MAP).join(', ') } }))\n return\n }\n\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n\n // 检查是否已安装\n if (moduleDef.packages.every(p => project.haiPackages.includes(p))) {\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(project.haiPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n writeCliMessage(chalk.yellow(cliM('cli_addSupportCompleted', { params: { module: moduleName } })))\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(cliM('cli_addSupportFile', { params: { file: generatedFile } })))\n }\n }\n else {\n writeCliMessage(chalk.yellow(cliM('cli_addAlreadyInstalled', { params: { module: moduleName } })))\n }\n return\n }\n\n // 收集所有需要安装的包(含依赖模块)\n const allPackages = new Set(moduleDef.packages)\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef) {\n for (const pkg of depDef.packages) {\n allPackages.add(pkg)\n }\n }\n }\n }\n\n // 更新 package.json\n spinner.start(cliM('cli_addUpdateManifest'))\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = await fse.readJson(pkgPath)\n if (!pkg.dependencies)\n pkg.dependencies = {}\n\n const existingHaiSpecifier = Object.entries(pkg.dependencies as Record<string, string>)\n .find(([pkgName]) => pkgName.startsWith('@h-ai/'))?.[1]\n\n // 已存在的 @h-ai/* 依赖若使用 catalog:,新增模块保持一致;否则固定当前 CLI 对应版本。\n const depVersion = existingHaiSpecifier === 'catalog:' ? 'catalog:' : getCliVersion()\n\n for (const pkgName of allPackages) {\n if (pkgName === '@h-ai/deploy') {\n pkg.devDependencies ??= {}\n pkg.devDependencies[pkgName] ??= depVersion\n }\n else if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = depVersion\n }\n }\n await fse.writeJson(pkgPath, pkg, { spaces: 2 })\n spinner.succeed()\n\n // 生成配置文件\n if (moduleDef.configKey) {\n const configDir = path.join(cwd, 'config')\n const configPath = path.join(configDir, `_${moduleDef.configKey}.yml`)\n if (!(await fileExists(configPath))) {\n spinner.start(cliM('cli_addConfig', { params: { config: moduleDef.configKey } }))\n const content = generateConfigFile(moduleDef.configKey)\n await writeFile(configPath, content)\n spinner.succeed()\n }\n else {\n writeCliMessage(chalk.gray(cliM('cli_addConfigExists', { params: { config: moduleDef.configKey } })))\n }\n }\n\n // 生成依赖模块的配置文件\n if (moduleDef.deps) {\n for (const dep of moduleDef.deps) {\n const depDef = MODULE_MAP[dep]\n if (depDef?.configKey) {\n const depConfigPath = path.join(cwd, 'config', `_${depDef.configKey}.yml`)\n if (!(await fileExists(depConfigPath))) {\n const content = generateConfigFile(depDef.configKey)\n await writeFile(depConfigPath, content)\n writeCliMessage(chalk.gray(cliM('cli_addDependencyConfig', { params: { config: depDef.configKey } })))\n }\n }\n }\n }\n\n const skillPackages = [...project.haiPackages, ...allPackages]\n const generatedFiles = await generateProjectAiSupport(\n cwd,\n resolveSkillNamesForPackages(skillPackages),\n {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n },\n )\n if (generatedFiles.length > 0) {\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(cliM('cli_addSupportFile', { params: { file: generatedFile } })))\n }\n }\n\n // 安装依赖\n const productionPath = path.join(cwd, '.env.prod')\n const previousProduction = await fileExists(productionPath) ? await fse.readFile(productionPath, 'utf8') : ''\n const configured = new Set([...previousProduction.matchAll(/^([A-Z][A-Z0-9_]*)=/gm)].map(match => match[1]))\n const previousValues = parseEnv(previousProduction)\n const production = generateProductionEnvironment([moduleName, ...(moduleDef.deps ?? [])] as FeatureId[], previousValues.HAI_DB_TYPE === 'mysql' ? { db: { type: 'mysql', database: previousValues.HAI_DB_DATABASE } } : undefined)\n .split('\\n')\n .filter(line => !/^[A-Z][A-Z0-9_]*=/.test(line) || !configured.has(line.split('=')[0]))\n await writeFile(productionPath, `${previousProduction.trimEnd()}\\n\\n${production.join('\\n')}`)\n\n const doInstall = options.install !== false\n if (doInstall) {\n spinner.start(cliM('cli_addInstall'))\n const { execSync } = await import('node:child_process')\n const pm = await detectPackageManager(cwd)\n execSync(`${pm} install`, { cwd, stdio: 'ignore' })\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_addSuccess', { params: { module: moduleName } })))\n writeCliMessage('')\n writeCliMessage(cliM('cli_addPackages'))\n for (const pkg of allPackages) {\n writeCliMessage(chalk.cyan(` ${pkg}`))\n }\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_addFailed')), { error })\n throw error\n }\n}\n","/** `pnpm build` 的环境无关构建入口:源码、OCI 镜像或 Tauri 安装包。 */\nimport type { DeploymentArtifact } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { spawn } from 'node:child_process'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { copyFileSync, createReadStream, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs'\nimport { dirname, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\n\n/**\n * 构建参数,不接受部署环境。\n * 对应 hai build --target docker --images app,web --runtime podman --no-http-proxy;镜像参数仅用于 docker,platform/arch 仅用于 desktop。\n * @example 模块内部上下文\n * ```ts\n * const options: BuildCommandOptions = { cwd: '/workspace/shop', target: 'docker', images: 'app,web', runtime: 'podman', httpProxy: false }\n * ```\n */\nexport interface BuildCommandOptions extends GlobalOptions {\n /** compile 编译源码,docker 导出镜像,desktop 调用 Tauri。 */\n target?: 'compile' | 'docker' | 'desktop'\n /** 逗号分隔的应用镜像名;省略时构建全部。 */\n images?: string\n /** auto 优先使用可达的 Podman。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 容器构建网络,默认采用引擎设置;例如 rootless Podman 的 pasta。 */\n network?: string\n /** 原生安装包的目标系统,必须与构建主机相同。 */\n platform?: 'windows' | 'linux' | 'macos'\n /** Rust 目标架构,默认当前主机架构。 */\n arch?: 'x64' | 'arm64'\n /** 可信 SQLite 预编译包根地址,不包含凭据。 */\n sqlitePrebuildMirror?: string\n /** Podman 是否继承代理。 */\n httpProxy?: boolean\n}\n\n/**\n * 项目构建描述;app/web 共用 buildId。\n * 从 hai.build.json 读取;镜像名称为 app/web,构建命令还会校验唯一性与路径边界。\n * @example 模块内部上下文\n * ```ts\n * const config: BuildConfig = { images: [{ name: 'app', context: '.', dockerfile: 'images/app.Dockerfile', containerPort: 3000 }], desktop: ['apps/shop-desktop'] }\n * ```\n */\ninterface BuildConfig {\n images?: Array<{ name: 'app' | 'web', context?: string, dockerfile: string, containerPort?: number }>\n desktop?: string[]\n}\n\n/** 子进程不经过 shell;pnpm 使用当前原生或 JS 入口,兼容 Windows 路径。 */\nasync function run(command: string, args: string[], cwd: string, quiet = false): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const env = Object.fromEntries(Object.entries(process.env).filter(([key]) => !/^(?:HAI_|PUBLIC_|VITE_)/.test(key)))\n env.NODE_ENV = 'production'\n // Tauri 的 CI 参数只接受 true/false,兼容 CI 平台常用的 1/0 写法。\n if (env.CI === '1' || env.CI === '0')\n env.CI = env.CI === '1' ? 'true' : 'false'\n const child = spawn(command, args, { cwd, env, windowsHide: true, stdio: quiet ? 'ignore' : 'inherit', shell: false })\n child.once('error', reject)\n child.once('exit', code => code === 0 ? resolve() : reject(new Error(cliM('cli_build_failed', { params: { command, code: String(code) } }))))\n })\n}\n\n/** 使用已安装的 pnpm,不通过 Corepack 下载另一套工具链。 */\nasync function pnpm(args: string[], cwd: string): Promise<void> {\n const entry = process.env.npm_execpath\n if (entry && /(?:^|[/\\\\])pnpm(?:-native)?(?:\\.exe|\\.[cm]?js)?$/i.test(entry))\n return /\\.[cm]?js$/i.test(entry) ? run(process.execPath, [entry, ...args], cwd) : run(entry, args, cwd)\n // CLI 直接调用时从 PATH 定位原生或 JS 入口;Windows 的 .cmd 不能由无 shell spawn 执行。\n if (process.platform === 'win32') {\n const directories = (process.env.PATH ?? '').split(';')\n for (const directory of directories) {\n const executable = join(directory, 'pnpm.exe')\n if (existsSync(executable))\n return run(executable, args, cwd)\n for (const relative of ['node_modules/pnpm/bin/pnpm.cjs', 'pnpm.cjs']) {\n const candidate = join(directory, relative)\n if (existsSync(candidate))\n return run(process.execPath, [candidate, ...args], cwd)\n }\n }\n throw new Error(cliM('cli_build_use_pnpm'))\n }\n return run('pnpm', args, cwd)\n}\n\n/**\n * 构建已有项目;镜像清单仅在全部镜像导出成功后发布。\n * compile 调用项目 compile 脚本;docker 发布完整产物清单后才更新 latest;desktop 仅允许当前主机对应平台。\n * @throws Error - 参数、构建配置、运行时探测或子进程执行失败。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 所选目标构建完成;失败时抛出异常。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前项目已有 compile 脚本及已安装依赖。\n * await buildCommand({ cwd: process.cwd(), target: 'compile' })\n * // 等价命令:hai build --target compile;失败抛出异常。\n * ```\n */\nexport async function buildCommand(options: BuildCommandOptions): Promise<void> {\n const cwd = resolve(options.cwd ?? process.cwd())\n const target = options.target ?? 'compile'\n if (!['compile', 'docker', 'desktop'].includes(target))\n throw new Error(cliM('cli_build_target_invalid'))\n if ((target !== 'docker' && (options.images !== undefined || options.runtime !== undefined || options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false))\n || (target !== 'desktop' && (options.platform !== undefined || options.arch !== undefined))) {\n throw new Error(cliM('cli_build_options_invalid'))\n }\n if (target === 'compile') {\n await pnpm(['run', 'compile'], cwd)\n return\n }\n const metadata: { version?: unknown } = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'))\n // 版本同时进入文件名和镜像标签;拒绝路径字符,保留预发布和构建元数据。\n const appVersion = metadata.version\n if (typeof appVersion !== 'string' || appVersion.length > 80 || !/^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?(?:\\+[0-9a-z-]+(?:\\.[0-9a-z-]+)*)?$/i.test(appVersion))\n throw new Error(cliM('cli_build_version_invalid'))\n const config = JSON.parse(readFileSync(join(cwd, 'hai.build.json'), 'utf8')) as BuildConfig\n if (target === 'desktop') {\n const platforms = { win32: 'windows', linux: 'linux', darwin: 'macos' } as const\n const host = platforms[process.platform as keyof typeof platforms]\n const platform = options.platform ?? host\n const arch = options.arch ?? process.arch\n if (!platform || platform !== host || !['x64', 'arm64'].includes(arch))\n throw new Error(cliM('cli_build_native_host'))\n if (!config.desktop?.length)\n throw new Error(cliM('cli_build_desktop_missing'))\n const rustTarget = `${arch === 'x64' ? 'x86_64' : 'aarch64'}-${platform === 'windows' ? 'pc-windows-msvc' : platform === 'macos' ? 'apple-darwin' : 'unknown-linux-gnu'}`\n const bundles = platform === 'windows' ? 'nsis' : platform === 'macos' ? 'app,dmg' : 'deb,appimage'\n for (const directory of config.desktop)\n await pnpm(['exec', 'tauri', 'build', '--target', rustTarget, '--bundles', bundles, '--config', JSON.stringify({ version: appVersion })], resolve(cwd, directory))\n writeCliMessage(cliM('cli_build_native_ready', { params: { target: rustTarget } }))\n return\n }\n if (!Array.isArray(config.images) || !config.images.length || config.images.some(image => !image || typeof image !== 'object') || config.images.filter(image => image.name === 'app').length !== 1 || config.images.length > 2 || new Set(config.images.map(image => image.name)).size !== config.images.length\n || config.images.some(image => !['app', 'web'].includes(image.name) || typeof image.dockerfile !== 'string' || !image.dockerfile || 'target' in image || (image.containerPort !== undefined && (!Number.isInteger(image.containerPort) || image.containerPort < 1 || image.containerPort > 65535)))) {\n throw new Error(cliM('cli_build_images_missing'))\n }\n const selected = options.images?.split(',').map(name => name.trim())\n if (selected && (selected.some(name => !config.images!.some(image => image.name === name)) || new Set(selected).size !== selected.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n const images = config.images.filter(image => !selected || selected.includes(image.name))\n for (const image of images) {\n if (!existsSync(resolve(cwd, image.dockerfile)))\n throw new Error(cliM('cli_build_dockerfile_missing', { params: { path: image.dockerfile } }))\n }\n const candidates = options.runtime && options.runtime !== 'auto' ? [options.runtime] : ['podman', 'docker']\n if (candidates.some(runtime => !['podman', 'docker'].includes(runtime)))\n throw new Error(cliM('cli_build_runtime_missing'))\n let runtime: string | undefined\n for (const candidate of candidates) {\n try {\n await run(candidate, ['version'], cwd, true)\n runtime = candidate\n break\n }\n catch { /* 尝试下一个可达的引擎。 */ }\n }\n if (!runtime)\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.sqlitePrebuildMirror) {\n const url = new URL(options.sqlitePrebuildMirror)\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)\n throw new Error(cliM('cli_build_mirror_invalid'))\n }\n const buildId = `${appVersion}-${Date.now()}-${randomBytes(3).toString('hex')}`\n const artifact: DeploymentArtifact = { version: 3, appVersion, buildId, partial: images.length !== config.images.length, hasWeb: config.images.some(image => image.name === 'web'), images: [] }\n // 部分构建仍保留工程显式声明的端口,不用构建默认值覆盖部署配置。\n for (const image of config.images) {\n if (image.containerPort !== undefined)\n artifact[image.name === 'app' ? 'appContainerPort' : 'webContainerPort'] = image.containerPort\n }\n const parent = join(cwd, '.hai/build/docker')\n mkdirSync(parent, { recursive: true })\n const staging = mkdtempSync(join(parent, '.building-'))\n const built: string[] = []\n try {\n for (const context of new Set(images.map(image => resolve(cwd, image.context ?? '.'))))\n prepareDependencyInputs(context)\n for (const image of images) {\n if (!['app', 'web'].includes(image.name))\n throw new Error(cliM('cli_build_images_missing'))\n const context = resolve(cwd, image.context ?? '.')\n const imageRef = `localhost/hai-${basenameSafe(cwd)}-${image.name}:${buildId.toLowerCase().replaceAll('+', '_')}`\n const args = ['build', '-f', resolve(cwd, image.dockerfile), '-t', imageRef]\n if (options.network !== undefined)\n args.push('--network', options.network)\n const ignore = `${resolve(cwd, image.dockerfile)}.dockerignore`\n if (runtime === 'podman' && existsSync(ignore))\n args.push('--ignorefile', ignore)\n if (runtime === 'podman') {\n args.push('--format', 'docker', '--jobs', '1', ...(options.httpProxy === false ? ['--http-proxy=false'] : []))\n // Windows/macOS 的远程 Podman 默认读取服务端代理;显式传递预定义构建参数。\n if (options.httpProxy !== false) {\n for (const key of ['HTTP_PROXY', 'HTTPS_PROXY', 'FTP_PROXY', 'NO_PROXY', 'http_proxy', 'https_proxy', 'ftp_proxy', 'no_proxy']) {\n if (process.env[key])\n args.push('--build-arg', `${key}=${process.env[key]}`)\n }\n }\n }\n if (options.sqlitePrebuildMirror)\n args.push('--build-arg', `SQLITE_PREBUILD_MIRROR=${options.sqlitePrebuildMirror}`)\n built.push(imageRef)\n await run(runtime, [...args, context], cwd)\n const file = `${image.name}-${appVersion}.tar`\n await run(runtime, ['save', ...(runtime === 'podman' ? ['--format', 'docker-archive'] : []), '-o', join(staging, file), imageRef], cwd)\n const hash = createHash('sha256')\n for await (const chunk of createReadStream(join(staging, file)))\n hash.update(chunk)\n artifact.images.push({ name: image.name, file, imageRef, sha256: hash.digest('hex'), ...(image.containerPort ? { containerPort: image.containerPort } : {}) })\n }\n // 不覆盖以前成功的构建;manifest 是一次完整构建的提交点。\n const output = join(parent, buildId)\n // 文件名固定于 manifest 同层;通过构建 ID 子目录中的清单消费,latest 仅存相对路径。\n writeFileSync(join(staging, 'manifest.json'), `${JSON.stringify(artifact, null, 2)}\\n`)\n renameSync(staging, output)\n writeFileSync(join(parent, `latest-${buildId}`), `${buildId}\\n`)\n renameSync(join(parent, `latest-${buildId}`), join(parent, 'latest'))\n writeCliMessage(cliM('cli_build_ready', { params: { path: output, runtime } }))\n }\n catch (error) {\n for (const imageRef of built) {\n try {\n await run(runtime, ['image', 'rm', imageRef], cwd, true)\n }\n catch { /* 构建失败不掩盖原始错误。 */ }\n }\n throw error\n }\n finally {\n rmSync(staging, { recursive: true, force: true })\n }\n}\n\n/** 生成稳定的依赖上下文;包配置、补丁和本地归档改变才使下载层失效。 */\nfunction prepareDependencyInputs(cwd: string): void {\n const destination = join(cwd, 'images', 'dependencies')\n mkdirSync(destination, { recursive: true })\n const tracking = join(destination, '.managed.json')\n const previous: string[] = existsSync(tracking) ? JSON.parse(readFileSync(tracking, 'utf8')) : []\n const files: string[] = []\n const walk = (directory: string): void => {\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const source = join(directory, entry.name)\n if (source === destination || ['node_modules', '.git', '.hai', '.turbo', '.svelte-kit', '.pnpm-store', '.cache', 'dist', 'build', 'data', 'tmp', 'test-results', 'playwright-report'].includes(entry.name))\n continue\n if (entry.isDirectory()) {\n walk(source)\n continue\n }\n if (!entry.isFile() || !(entry.name === 'package.json' || entry.name === '.pnpmfile.cjs' || /\\.(?:tgz|patch)$/.test(entry.name)))\n continue\n const file = relative(cwd, source)\n mkdirSync(dirname(join(destination, file)), { recursive: true })\n const target = join(destination, file)\n if (!existsSync(target) || !readFileSync(source).equals(readFileSync(target)))\n copyFileSync(source, target)\n files.push(file)\n }\n }\n walk(cwd)\n for (const file of previous) {\n const target = resolve(destination, file)\n if (!files.includes(file) && !relative(destination, target).startsWith('..'))\n rmSync(target, { force: true })\n }\n const content = `${JSON.stringify(files)}\\n`\n if (!existsSync(tracking) || readFileSync(tracking, 'utf8') !== content)\n writeFileSync(tracking, content)\n}\n\n/** 将当前目录名转为安全镜像名称。 */\nfunction basenameSafe(directory: string): string {\n return directory.slice(dirname(directory).length + 1).toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/^-+/, '') || 'app'\n}\n","/**\n * @h-ai/reldb — 数据库配置 Schema\n *\n * 本文件定义数据库模块的配置结构,使用 Zod 进行运行时校验。\n * @module reldb-config\n */\n\nimport { z } from 'zod'\n// ─── 数据库配置 Schema ───\n\n/**\n * 数据库类型枚举\n *\n * 支持的数据库类型:\n * - `sqlite` - SQLite 嵌入式数据库(使用 better-sqlite3)\n * - `postgresql` - PostgreSQL 数据库(使用 pg)\n * - `mysql` - MySQL 数据库(使用 mysql2)\n * @example\n * ```ts\n * import { ReldbTypeSchema } from '@h-ai/reldb/schemas'\n *\n * const value = ReldbTypeSchema.parse('postgresql')\n * void value\n * ```\n */\nexport const ReldbTypeSchema = z.enum(['sqlite', 'postgresql', 'mysql'])\n\n/**\n * 数据库类型\n * @example\n * ```ts\n * import type { DbType } from '@h-ai/reldb/schemas'\n *\n * const value: DbType = 'postgresql'\n * void value\n * ```\n */\nexport type DbType = z.infer<typeof ReldbTypeSchema>\n\n/**\n * ReldbOperationLogConfigSchema 的数据约束与操作契约。\n * @example\n * ```ts\n * import { ReldbOperationLogConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = ReldbOperationLogConfigSchema.parse({ read: false, write: true, maxLength: 100, level: 'debug' })\n * void value\n * ```\n */\nexport const ReldbOperationLogConfigSchema = z.object({\n read: z.boolean().default(false),\n write: z.boolean().default(false),\n /** 安全数量摘要的最大字符数;0 表示省略摘要,永不记录 SQL 原文或参数值。 */\n maxLength: z.number().int().min(0).default(1000),\n level: z.enum(['info', 'debug', 'trace']).default('debug'),\n})\n\n/**\n * ReldbOperationLogConfig 的数据约束与操作契约。\n * @example\n * ```ts\n * import { ReldbOperationLogConfigSchema, type ReldbOperationLogConfig } from '@h-ai/reldb/schemas'\n *\n * const value: ReldbOperationLogConfig = ReldbOperationLogConfigSchema.parse({ read: false, write: true, maxLength: 100, level: 'debug' })\n * void value\n * ```\n */\nexport type ReldbOperationLogConfig = z.infer<typeof ReldbOperationLogConfigSchema>\n\nconst OperationLogConfigFieldSchema = {\n operationLog: ReldbOperationLogConfigSchema.optional(),\n}\n\n/**\n * PostgreSQL 连接池配置 Schema\n *\n * min 是已建立连接的保留下限,不主动预建连接。\n * MySQL 使用独立的 MysqlPoolConfigSchema;SQLite 不使用连接池。\n * @example\n * ```ts\n * import { PoolConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = PoolConfigSchema.parse({ max: 10, acquireTimeout: 5000 })\n * void value\n * ```\n */\nexport const PoolConfigSchema = z.object({\n /** PostgreSQL 已建立连接的最小保留数(默认 1,不主动预建) */\n min: z.number().int().min(0).default(1),\n /** 最大连接数(默认 10) */\n max: z.number().int().min(1).default(10),\n /** PostgreSQL 空闲连接超时,毫秒(默认 30000;0 禁用) */\n idleTimeout: z.number().int().min(0).default(30000),\n /** 获取连接超时,毫秒(默认10000);PostgreSQL >=0,0禁用;MySQL排队+建连总期限为1–2147483647 */\n acquireTimeout: z.number().int().min(0).default(10000),\n})\n\n/**\n * PostgreSQL 连接池配置类型。\n * @example\n * ```ts\n * import { PoolConfigSchema, type PoolConfig } from '@h-ai/reldb/schemas'\n *\n * const value: PoolConfig = PoolConfigSchema.parse({ max: 10, acquireTimeout: 5000 })\n * void value\n * ```\n */\nexport type PoolConfig = z.infer<typeof PoolConfigSchema>\n\n/**\n * MySQL 连接池配置:有界 FIFO 等待,拒绝没有可靠驱动语义的 min/idleTimeout。\n *\n * acquireTimeout 覆盖排队和建立连接,不是 SQL 执行时限。驱动建连也使用此值作为 connectTimeout。\n * 空闲连接由 mysql2/服务端管理;本模块不承诺最小保留数或可配置的空闲回收期限。\n * @example\n * ```ts\n * import { MysqlPoolConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlPoolConfigSchema.parse({ max: 10, acquireTimeout: 5000, queueLimit: 100 })\n * void value\n * ```\n */\nexport const MysqlPoolConfigSchema = z.object({\n /** 最大连接数(默认 10) */\n max: z.number().int().min(1).default(10),\n /** 获取连接超时,毫秒(默认10000);PostgreSQL >=0,0禁用;MySQL排队+建连总期限为1–2147483647 */\n acquireTimeout: z.number().int().min(1).max(2147483647).default(10000),\n /** MySQL 等待队列最大请求数(默认 1000;正整数,不支持无限队列) */\n queueLimit: z.number().int().min(1).default(1000),\n}).strict()\n\n/**\n * MySQL 解析后的连接池配置。\n * @example\n * ```ts\n * import { MysqlPoolConfigSchema, type MysqlPoolConfig } from '@h-ai/reldb/schemas'\n *\n * const value: MysqlPoolConfig = MysqlPoolConfigSchema.parse({ max: 10, acquireTimeout: 5000, queueLimit: 100 })\n * void value\n * ```\n */\nexport type MysqlPoolConfig = z.infer<typeof MysqlPoolConfigSchema>\n\n/**\n * PostgreSQL SSL 配置 Schema\n *\n * 支持多种配置方式:\n * - `true/false` - 简单开关\n * - `'require'/'prefer'/'allow'/'disable'` - SSL 模式\n * - 自定义对象 - 详细 SSL 配置\n * @example\n * ```ts\n * import { SslConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = SslConfigSchema.parse({ rejectUnauthorized: true })\n * void value\n * ```\n */\nexport const SslConfigSchema = z.union([\n z.boolean(),\n z.enum(['require', 'prefer', 'allow', 'disable']),\n z.record(z.string(), z.unknown()),\n])\n\n/**\n * PostgreSQL SSL 配置类型\n * @example\n * ```ts\n * import { SslConfigSchema, type SslConfig } from '@h-ai/reldb/schemas'\n *\n * const value: SslConfig = SslConfigSchema.parse({ rejectUnauthorized: true })\n * void value\n * ```\n */\nexport type SslConfig = z.infer<typeof SslConfigSchema>\n\n/**\n * MySQL TLS 配置;空对象默认校验证书链和 DNS 主机身份,只接收明确支持的 PEM 字段。\n *\n * cert/key 必须成对。verifyIdentity 在当前驱动仅支持 DNS 主机,不能宣称验证 IP 身份。\n * 显式关闭验证会记录风险日志;本模块不提供任意 TLS 参数或回调透传。\n * @example\n * ```ts\n * import { MysqlSslConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlSslConfigSchema.parse({ rejectUnauthorized: true, verifyIdentity: true })\n * void value\n * ```\n */\nexport const MysqlSslConfigSchema = z.union([\n z.literal(false),\n z.object({\n /** MySQL 是否校验证书链(默认 true);false 明确放弃服务端认证 */\n rejectUnauthorized: z.boolean().default(true),\n /** MySQL 是否验证 DNS 主机身份(默认 true);仅证书链验证开启时有效 */\n verifyIdentity: z.boolean().default(true),\n /** MySQL 信任的 CA,PEM 内容;省略时使用 Node 信任库 */\n ca: z.string().min(1).optional(),\n /** MySQL 客户端证书,PEM 内容;必须同时提供 key */\n cert: z.string().min(1).optional(),\n /** MySQL 客户端私钥,PEM 内容;必须同时提供 cert */\n key: z.string().min(1).optional(),\n }).strict().refine(ssl => Boolean(ssl.cert) === Boolean(ssl.key), { path: ['key'] }),\n])\n\n/**\n * SQLite 特定选项 Schema\n * @example\n * ```ts\n * import { SqliteOptionsSchema } from '@h-ai/reldb/schemas'\n *\n * const value = SqliteOptionsSchema.parse({ walMode: true, executor: 'worker' })\n * void value\n * ```\n */\nexport const SqliteOptionsSchema = z.object({\n /** 是否启用 WAL 模式(默认 true),可提高并发读写性能 */\n walMode: z.boolean().default(true),\n /** 是否只读模式(默认 false) */\n readonly: z.boolean().default(false),\n /**\n * 执行方式(默认 sync)。\n *\n * - `sync`:主线程直接执行 better-sqlite3(同步阻塞主线程事件循环)。\n * - `worker`:在专用 worker 线程持有唯一连接执行,把阻塞移出主线程。\n * 注意 WAL 只改善数据库锁并发,无法避免 better-sqlite3 同步调用占用调用线程。\n */\n executor: z.enum(['sync', 'worker']).default('sync'),\n /** worker 执行方式下等待连接打开的超时(毫秒,默认 10000) */\n workerConnectTimeoutMs: z.number().int().positive().default(10_000),\n})\n\n/**\n * MySQL 特定选项 Schema\n * @example\n * ```ts\n * import { MysqlOptionsSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlOptionsSchema.parse({ charset: 'utf8mb4' })\n * void value\n * ```\n */\nexport const MysqlOptionsSchema = z.object({\n /** 字符集(默认 utf8mb4),推荐使用 utf8mb4 支持完整 Unicode */\n charset: z.string().default('utf8mb4'),\n}).strict()\n\n// ─── 网络数据库共享字段 ───\n\nconst NetworkConfigSchema = z.object({\n /**\n * 连接字符串(可选)\n * 如果提供 url,将优先使用,忽略 host/port 等字段\n */\n url: z.string().optional(),\n\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n\n /**\n * 数据库端口\n * - PostgreSQL 默认 5432\n * - MySQL 默认 3306\n */\n port: z.number().int().min(1).max(65535).optional(),\n\n /** 数据库名称 */\n database: z.string(),\n\n /** 数据库用户名 */\n user: z.string().optional(),\n\n /** 数据库密码 */\n password: z.string().optional(),\n\n /** SSL/TLS 连接配置 */\n ssl: SslConfigSchema.optional(),\n\n /** 连接池配置 */\n pool: PoolConfigSchema.optional(),\n})\n\n// ─── 各数据库类型配置 Schema ───\n\n/**\n * SQLite 配置 Schema\n * @example\n * ```ts\n * import { SqliteConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = SqliteConfigSchema.parse({ type: 'sqlite', database: './data/app.db' })\n * void value\n * ```\n */\nexport const SqliteConfigSchema = z.object({\n type: z.literal('sqlite'),\n /** 数据库文件路径(如 './data.db')或 ':memory:'(内存数据库) */\n database: z.string(),\n /** SQLite 特定选项 */\n sqlite: SqliteOptionsSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * PostgreSQL 配置 Schema\n * @example\n * ```ts\n * import { PostgresqlConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = PostgresqlConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db', pool: { max: 10 } })\n * void value\n * ```\n */\nexport const PostgresqlConfigSchema = NetworkConfigSchema.extend({\n type: z.literal('postgresql'),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * MySQL 配置 Schema\n * @example\n * ```ts\n * import { MysqlConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = MysqlConfigSchema.parse({ type: 'mysql', database: 'app', host: 'db', pool: { max: 10, queueLimit: 100 } })\n * void value\n * ```\n */\nexport const MysqlConfigSchema = NetworkConfigSchema.extend({\n type: z.literal('mysql'),\n /** 网络数据库URL;MySQL空串表示使用分字段,非空仅mysql://且拒绝query/fragment,优先于host/port/database/user/password */\n url: z.union([z.literal('').transform(() => undefined), z.url({ protocol: /^mysql$/ }).refine(value => !value.includes('?') && !value.includes('#'))]).optional(),\n /** 数据库:SQLite文件路径或:memory:;PostgreSQL必填名称;MySQL无URL时必填,URL模式从URL读取 */\n database: z.string().min(1).optional(),\n /** TLS:PostgreSQL使用其模式;MySQL仅false或严格对象,空对象默认校验证书链和DNS身份 */\n ssl: MysqlSslConfigSchema.optional(),\n /** 连接池配置:PostgreSQL支持min/idleTimeout;MySQL仅max/acquireTimeout/queueLimit,拒绝其他字段 */\n pool: MysqlPoolConfigSchema.optional(),\n /** MySQL 特定选项 */\n mysql: MysqlOptionsSchema.optional(),\n ...OperationLogConfigFieldSchema,\n}).refine(config => Boolean(config.url) || Boolean(config.database), { path: ['database'] })\n\n/**\n * 统一数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同数据库类型的配置。\n * @example\n * ```ts\n * import { ReldbConfigSchema } from '@h-ai/reldb/schemas'\n *\n * const value = ReldbConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db' })\n * void value\n * ```\n */\nexport const ReldbConfigSchema = z.discriminatedUnion('type', [\n SqliteConfigSchema,\n PostgresqlConfigSchema,\n MysqlConfigSchema,\n])\n\n/**\n * 数据库配置类型(判别联合体)\n * @example\n * ```ts\n * import { ReldbConfigSchema, type ReldbConfig } from '@h-ai/reldb/schemas'\n *\n * const value: ReldbConfig = ReldbConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db' })\n * void value\n * ```\n */\nexport type ReldbConfig = z.infer<typeof ReldbConfigSchema>\n\n/**\n * SQLite 配置类型\n * @example\n * ```ts\n * import { SqliteConfigSchema, type SqliteConfig } from '@h-ai/reldb/schemas'\n *\n * const value: SqliteConfig = SqliteConfigSchema.parse({ type: 'sqlite', database: './data/app.db' })\n * void value\n * ```\n */\nexport type SqliteConfig = z.infer<typeof SqliteConfigSchema>\n\n/**\n * PostgreSQL 配置类型\n * @example\n * ```ts\n * import { PostgresqlConfigSchema, type PostgresqlConfig } from '@h-ai/reldb/schemas'\n *\n * const value: PostgresqlConfig = PostgresqlConfigSchema.parse({ type: 'postgresql', database: 'app', host: 'db', pool: { max: 10 } })\n * void value\n * ```\n */\nexport type PostgresqlConfig = z.infer<typeof PostgresqlConfigSchema>\n\n/**\n * MySQL 配置类型\n * @example\n * ```ts\n * import { MysqlConfigSchema, type MysqlConfig } from '@h-ai/reldb/schemas'\n *\n * const value: MysqlConfig = MysqlConfigSchema.parse({ type: 'mysql', database: 'app', host: 'db', pool: { max: 10, queueLimit: 100 } })\n * void value\n * ```\n */\nexport type MysqlConfig = z.infer<typeof MysqlConfigSchema>\n\n/**\n * 数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 reldb.init)更适合接收 ReldbConfigInput。\n * @example\n * ```ts\n * import type { ReldbConfigInput } from '@h-ai/reldb/schemas'\n *\n * const value: ReldbConfigInput = { type: 'postgresql', host: 'db', database: 'app' }\n * void value\n * ```\n */\nexport type ReldbConfigInput = z.input<typeof ReldbConfigSchema>\n","/** 部署向导:逐项配置实际依赖的中间件,不以文件存在代替有效连接配置。 */\nimport type { DeploymentEnvironment, MiddlewareBackend, MiddlewareField, MiddlewareMode, MiddlewareRequirement, ScanResult } from '@h-ai/deploy'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { MysqlSslConfigSchema, ReldbConfigSchema, SslConfigSchema } from '@h-ai/reldb/schemas'\nimport prompts from 'prompts'\nimport { isMap, isScalar, parseDocument } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliMessage } from '../cli-utils.js'\nimport { moduleEnvironmentVariables } from './cli-config-environment.js'\n\n/**\n * 部署包的真实运行时命名空间类型,仅供向导依赖注入,不重新仿造部署 API。\n * @example 模块内部上下文\n * ```ts\n * const module: DeployModule = await import('@h-ai/deploy')\n * const backends = module.DEPLOY_MIDDLEWARE.db\n * ```\n */\ntype DeployModule = typeof import('@h-ai/deploy')\n\n/** 凭据输入字段,名称与 deploy 公开配置 Schema 相同。 */\nconst CLOUD_FIELDS: Record<string, string[]> = {\n 'neon': ['apiKey'],\n 'upstash': ['email', 'apiKey'],\n 'cloudflare-r2': ['accountId', 'apiToken', 'accessKeyId', 'secretAccessKey'],\n 'resend': ['apiKey', 'from'],\n 'aliyun': ['accessKeyId', 'accessKeySecret', 'signName'],\n}\n\n/** 解析目标环境显式声明的配置,仅用于判断是否允许跳过。 */\nfunction targetConfig(requirement: MiddlewareRequirement, environment: DeploymentEnvironment): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const parent = environment.targetValues[requirement.envPrefix]\n if (parent) {\n try {\n Object.assign(result, JSON.parse(parent))\n }\n catch { return {} }\n }\n for (const [key, value] of Object.entries(environment.targetValues)) {\n if (key.startsWith(`${requirement.envPrefix}_`))\n result[key.slice(requirement.envPrefix.length + 1).toLowerCase()] = value\n }\n return result\n}\n\n/**\n * 只有目标文件显式声明了当前后端及必要连接项,才允许保持不变。\n * 凭据仍可来自 .env.local/进程;其他环境的配置不能让此选项出现。\n * @param requirement - 扫描出的实际中间件需求。\n * @param backend - 部署目录中选定的后端。\n * @param environment - 已合并变量与目标文件显式值的环境快照。\n * @returns 仅当目标文件明确声明后端与必要连接项时为 true。\n * @example 模块内部上下文\n * ```ts\n * const module = await import('@h-ai/deploy')\n * const requirement: MiddlewareRequirement = { service: 'db', backend: 'postgresql', source: '@h-ai/reldb', configName: 'db', configPath: [], envPrefix: 'HAI_DB', config: { host: 'db', port: 5432, database: 'shop' } }\n * const environment: DeploymentEnvironment = { environment: 'prod', envDir: '/workspace/shop', values: {}, targetValues: { HAI_DB_TYPE: 'postgresql', HAI_DB_HOST: 'db', HAI_DB_PORT: '5432', HAI_DB_DATABASE: 'shop' } }\n * const backend = module.DEPLOY_MIDDLEWARE.db.find(item => item.backend === 'postgresql')\n * if (backend) {\n * const keep = canKeepMiddleware(requirement, backend, environment)\n * }\n * ```\n */\nexport function canKeepMiddleware(requirement: MiddlewareRequirement, backend: MiddlewareBackend, environment: DeploymentEnvironment): boolean {\n const target = targetConfig(requirement, environment)\n if (requirement.service === 'ldap' && backend.backend === 'disabled')\n return environment.targetValues.HAI_IAM_LOGIN_LDAP === 'false'\n if (requirement.service === 'ldap') {\n if (!Object.keys(target).length)\n return false\n }\n else if (target.type !== backend.backend) {\n return false\n }\n return backend.fields.filter(field => field.required && !field.secret).every((field) => {\n if ((target.url || (requirement.config.url && Object.keys(target).length)) && ['host', 'port'].includes(field.name))\n return true\n return (target[field.name] !== undefined && target[field.name] !== '') || (target[field.name.toLowerCase()] !== undefined && target[field.name.toLowerCase()] !== '')\n }) && backend.fields.filter(field => field.required && field.secret).every(field => Boolean(requirement.config[field.name] || environment.values[`${requirement.envPrefix}_${field.name.toUpperCase()}`]))\n}\n\n/** 用户取消与缺少非交互输入都必须停止,禁止使用未回答的隐含默认值。 */\nasync function ask(question: prompts.PromptObject): Promise<unknown> {\n const answer = await prompts({ ...question, name: 'value' })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return answer.value\n}\n\n/** 校验连接字段;数据库 TLS 复用所选后端的真实公开 Schema。 */\nfunction validateField(value: string, field: MiddlewareField, backend: string): boolean | string {\n if (value === '')\n return field.required ? cliM('cli_deploy_required') : true\n if (field.kind === 'port')\n return (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'number')\n return (/^\\d+$/.test(value) && Number(value) >= (field.minimum ?? 0) && Number(value) <= (field.maximum ?? Number.MAX_SAFE_INTEGER)) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'boolean')\n return ['true', 'false'].includes(value) || cliM('cli_deploy_invalid_value')\n if (field.kind === 'url') {\n try {\n return Boolean(new URL(value).protocol)\n }\n catch { return cliM('cli_deploy_invalid_value') }\n }\n if (field.name === 'ssl') {\n const parsed = parseDocument(value)\n const schema = backend === 'mysql' ? MysqlSslConfigSchema : SslConfigSchema\n return (parsed.errors.length === 0 && schema.safeParse(parsed.toJS()).success) || cliM('cli_deploy_invalid_value')\n }\n if (field.name === 'headers') {\n try {\n const headers: unknown = JSON.parse(value)\n return (headers !== null && typeof headers === 'object' && !Array.isArray(headers) && Object.values(headers).every(item => typeof item === 'string')) || cliM('cli_deploy_invalid_value')\n }\n catch {\n return cliM('cli_deploy_invalid_value')\n }\n }\n if (field.name === 'method')\n return ['POST', 'PUT'].includes(value) || cliM('cli_deploy_invalid_value')\n return true\n}\n\n/** 连接配置的声明节点必须存在,约定变量才能覆盖原 YAML 未启用的可选功能。 */\nfunction ensureConfigNode(appDir: string, requirement: MiddlewareRequirement, backend: string): void {\n if (requirement.service === 'ldap' && backend === 'disabled')\n return\n const directory = join(appDir, 'config')\n mkdirSync(directory, { recursive: true })\n const path = join(directory, `_${requirement.configName}.yml`)\n const document = parseDocument(existsSync(path) ? readFileSync(path, 'utf8') : '{}\\n')\n if (document.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (requirement.configPath.length && !document.hasIn(requirement.configPath))\n document.setIn(requirement.configPath, document.createNode(requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service, type: backend } : {}))\n if (requirement.service === 'ldap') {\n if (!document.hasIn(['login']))\n document.set('login', document.createNode({}))\n if (!document.hasIn(['login', 'ldap']))\n document.setIn(['login', 'ldap'], `\\${HAI_IAM_LOGIN_LDAP:false}`)\n }\n const content = document.toString()\n if (!existsSync(path) || readFileSync(path, 'utf8') !== content)\n writeFileSync(path, content)\n}\n\n/** 保存单个连接对象;整体覆盖可避免旧 URL 或不兼容后端字段残留。 */\nfunction connectionEnv(requirement: MiddlewareRequirement, backend: string, config: Record<string, unknown>): Record<string, string> {\n if (requirement.service === 'ldap')\n return backend === 'disabled' ? { HAI_IAM_LOGIN_LDAP: 'false' } : { HAI_IAM_LOGIN_LDAP: 'true', [requirement.envPrefix]: JSON.stringify(config) }\n return { [requirement.envPrefix]: JSON.stringify({ ...config, type: backend }) }\n}\n\n/**\n * 逐项收集处理方式、后端和连接参数;返回值用于过滤云开通器和 Compose 服务。\n * 会持久化公共连接信息与私有凭据;yes 仅跳过已可确定的选择,缺少必要输入仍抛错。\n * @throws Error - 用户取消、必要非交互输入缺失、字段校验或配置持久化失败。\n * @param module - 实际加载的 @h-ai/deploy 运行时命名空间。\n * @param scan - 扫描得到的应用和中间件需求。\n * @param environment - 已合并变量与目标文件显式值的环境快照。\n * @param config - 正在补齐的部署配置对象。\n * @param yes - 非交互模式;不能绕过必需输入缺失。\n * @returns 每项中间件的最终处理模式。\n * @example 模块内部上下文\n * ```ts\n * const module: DeployModule = await import('@h-ai/deploy')\n * const result = await module.deploy.scan(process.cwd(), { environment: 'prod' })\n * if (!result.success) throw new Error(result.error.message)\n * const environment = module.loadDeploymentEnvironment({ environment: 'prod', envDir: process.cwd() })\n * if (!environment.success) throw new Error(environment.error.message)\n * const modes = await configureDeployMiddleware(module, result.data, environment.data, {}, true)\n * ```\n */\nexport async function configureDeployMiddleware(module: DeployModule, scan: ScanResult, environment: DeploymentEnvironment, config: Record<string, unknown>, yes = false): Promise<Partial<Record<string, MiddlewareMode>>> {\n const modes: Partial<Record<string, MiddlewareMode>> = {}\n const services: Record<string, unknown> = {}\n const existingServices = config.services && typeof config.services === 'object' ? config.services as Record<string, unknown> : {}\n const provider = config.provider as { type?: string } | undefined\n for (const requirement of scan.middlewares ?? []) {\n const choices = module.DEPLOY_MIDDLEWARE[requirement.service]\n const current = choices.find(item => item.backend === requirement.backend)\n if (!current)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: requirement.backend } }))\n writeCliMessage(cliM('cli_deploy_middleware', { params: { service: requirement.service, backend: current.label, purpose: module.describeMiddlewareBackend(current), source: requirement.source } }))\n const canKeep = canKeepMiddleware(requirement, current, environment)\n const mode = yes\n ? canKeep ? 'keep' : 'default'\n : await ask({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_action', { params: { service: requirement.service } }),\n choices: [\n { title: cliM('cli_deploy_default'), value: 'default' },\n { title: cliM('cli_deploy_custom'), value: 'custom' },\n ...(canKeep ? [{ title: cliM('cli_deploy_keep'), value: 'keep' }] : []),\n ],\n }) as MiddlewareMode\n modes[requirement.envPrefix] = mode\n // 同类服务可有多个 Provider;保留每项选择,聚合值仅用于选择云开通器。\n const previous = modes[requirement.service]\n modes[requirement.service] = previous === 'default' || mode === 'default' ? 'default' : previous === 'custom' || mode === 'custom' ? 'custom' : 'keep'\n if (mode === 'keep') {\n if (!canKeep)\n throw new Error(cliM('cli_deploy_missing_keep', { params: { service: requirement.service } }))\n continue\n }\n const backendName = yes ? current.backend : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_backend', { params: { service: requirement.service } }), initial: choices.indexOf(current), choices: choices.map(item => ({ title: `${item.label} — ${module.describeMiddlewareBackend(item)}`, value: item.backend })) }))\n const backend = choices.find(item => item.backend === backendName)\n if (!backend)\n throw new Error(cliM('cli_deploy_invalid_value'))\n requirement.backend = backendName\n const updates: Record<string, string> = {}\n if (mode === 'default' && backendName === 's3' && provider?.type === 'docker-ssh') {\n const container = config.container && typeof config.container === 'object' ? config.container as Record<string, unknown> : {}\n const currentEngine = container.s3Engine === 'minio' ? 'minio' : 'rustfs'\n const engine = yes ? currentEngine : String(await ask({ type: 'select', name: 'value', message: cliM('cli_deploy_s3_engine'), initial: currentEngine === 'rustfs' ? 0 : 1, choices: [{ title: 'RustFS', value: 'rustfs' }, { title: 'MinIO', value: 'minio' }] }))\n if (!['rustfs', 'minio'].includes(engine))\n throw new Error(cliM('cli_deploy_invalid_value'))\n config.container = { ...container, s3Engine: engine }\n updates.HAI_DEPLOY_CONTAINER_S3ENGINE = engine\n const deploymentFile = join(scan.appDir ?? '.', 'config', '_deploy.yml')\n const deployment = parseDocument(readFileSync(deploymentFile, 'utf8'))\n if (deployment.errors.length)\n throw new Error(cliM('cli_deploy_invalid_value'))\n if (!deployment.hasIn(['container', 's3Engine'])) {\n const node = deployment.get('container', true)\n if (node === undefined || (isScalar(node) && node.value === null))\n deployment.set('container', deployment.createNode({}))\n else if (!isMap(node))\n throw new Error(cliM('cli_deploy_yaml_node', { params: { path: deploymentFile, field: 'container' } }))\n deployment.setIn(['container', 's3Engine'], `\\${HAI_DEPLOY_CONTAINER_S3ENGINE:rustfs}`)\n writeFileSync(deploymentFile, deployment.toString())\n }\n }\n if (mode === 'default' && provider?.type === 'vercel') {\n if (!backend.provisioner)\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const prior = existingServices[requirement.service]\n const priorConfig = prior && typeof prior === 'object' ? prior as Record<string, unknown> : {}\n const cloud: Record<string, string> = { provisioner: backend.provisioner }\n for (const name of CLOUD_FIELDS[backend.provisioner]) {\n const key = `HAI_DEPLOY_SERVICES_${requirement.service.toUpperCase()}_${name.toUpperCase()}`\n const initial = String(priorConfig[name] ?? environment.values[key] ?? '')\n const label = `${backend.label} — ${cliM(`cli_deploy_cloud_input_${name}` as Parameters<typeof cliM>[0])}`\n const value = yes ? initial : String(await ask({ type: /key|token|secret/i.test(name) ? 'password' : 'text', name: 'value', message: label, initial, validate: input => Boolean(input) || cliM('cli_deploy_required') }))\n if (!value)\n throw new Error(`${label}: ${cliM('cli_deploy_required')}`)\n cloud[name] = value\n updates[key] = value\n }\n services[requirement.service] = cloud\n }\n else {\n if (mode === 'default' && ['aliyun-sms', 'api'].includes(backendName))\n throw new Error(cliM('cli_deploy_cloud_unsupported', { params: { backend: backend.label } }))\n const connection: Record<string, unknown> = mode === 'custom' && backendName === current.backend ? { ...requirement.config } : requirement.configName === 'reach' ? { name: requirement.config.name ?? requirement.service } : {}\n for (const field of backend.fields) {\n const previous = backendName === current.backend ? requirement.config[field.name] : undefined\n const initial = previous === undefined ? field.defaultValue ?? '' : typeof previous === 'object' ? JSON.stringify(previous) : String(previous)\n const variable = `${requirement.envPrefix}_${field.name.toUpperCase()}`\n const info = moduleEnvironmentVariables(requirement.configName).find(item => item.name === variable)\n const value = mode === 'custom' && !yes ? String(await ask({ type: field.secret ? 'password' : 'text', name: 'value', message: cliM('cli_deploy_field', { params: { description: info?.description ?? field.name, constraint: info?.constraint ?? field.kind ?? 'string' } }), initial, validate: input => validateField(String(input), field, backendName) })) : initial\n // TLS 交互返回值与非交互值保存前再次校验,不依赖 prompts UI 曾调用 validate。\n if (field.name === 'ssl' && validateField(value, field, backendName) !== true)\n throw new Error(cliM('cli_deploy_invalid_value'))\n // 默认的服务端凭据由 sidecar/云开通器生成,不要求用户填写。\n if (value !== '') {\n connection[field.name] = field.kind === 'number' || field.kind === 'port' ? Number(value) : field.kind === 'boolean' ? value === 'true' : field.name === 'headers' || field.name === 'ssl' ? parseDocument(value).toJS() : value\n }\n else {\n delete connection[field.name]\n }\n }\n if (requirement.service === 'db') {\n const validated = ReldbConfigSchema.safeParse({ ...connection, type: backendName })\n if (!validated.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: join(scan.appDir ?? '.', 'config', '_db.yml'), fields: validated.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n }\n Object.assign(updates, connectionEnv(requirement, backendName, connection))\n }\n ensureConfigNode(scan.appDir ?? '.', requirement, backendName)\n const saved = module.saveDeploymentEnvironment(environment, updates)\n if (!saved.success)\n throw new Error(saved.error.message)\n writeCliMessage(cliM('cli_deploy_saved', { params: { service: requirement.service } }))\n }\n // 仅默认选项对应的云服务参与初始化/开通;custom/keep 不认证、不创建。\n config.services = Object.keys(services).length ? services : undefined\n return modes\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { DeploymentEnvironment } from '@h-ai/deploy'\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, resolve } from 'node:path'\nimport process from 'node:process'\nimport { pathToFileURL } from 'node:url'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { buildCommand } from './cli-build.js'\nimport { configureDeployMiddleware } from './cli-deploy-middleware.js'\n\n/**\n * deploy 命令选项\n * 构建与部署分离;bundleOnly 只打包,不表示服务已上线。SSH 中断后的远端状态需按部署 ID 与结果文件核对。\n * @example 模块内部上下文\n * ```ts\n * const options: DeployCommandOptions = { cwd: '/workspace/shop', appDir: 'packages/shop-serv', env: 'prod', yes: true, bundleOnly: true, output: '.hai/shop.tar' }\n * ```\n */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 部署环境;省略时必须交互输入。 */\n env?: string\n /** 环境文件目录,默认扫描应用/workspace 根。 */\n envDir?: string\n /** 非交互模式:保留完整的目标配置,其余采用当前后端默认配置。 */\n yes?: boolean\n /** 应用目录 */\n appDir?: string\n /** 项目名称(覆盖自动检测) */\n projectName?: string\n /** 已配置完备,跳过全部中间件处理并直接部署。 */\n skipMiddleware?: boolean\n /** 已构建镜像目录。 */\n artifactDir?: string\n /** 本次更新的服务,逗号分隔。 */\n services?: string\n /** 先构建镜像。 */\n build?: boolean\n /** 本地容器引擎。 */\n runtime?: 'auto' | 'podman' | 'docker'\n /** 构建阶段的网络与原生依赖设置。 */\n network?: string\n sqlitePrebuildMirror?: string\n httpProxy?: boolean\n /** 只生成 tar,手工搬运。 */\n bundleOnly?: boolean\n /** 部署 tar 输出路径。 */\n output?: string\n}\n\n/** 配置输入中的可选对象;不让未完成的配置绕过最终 Provider Schema。 */\nfunction configObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/**\n * 补齐部署目标,完整配置直接复用;本机 SSH 参数和平台 Token 只写 `.env.local`。\n * @example 首次输入主机和密钥路径后,下次执行 `hai deploy --env prod` 自动复用。\n */\nasync function configureDeployTarget(module: typeof import('@h-ai/deploy'), config: Record<string, unknown>, environment: DeploymentEnvironment, nonInteractive?: boolean, bundleOnly?: boolean): Promise<void> {\n if (bundleOnly) {\n const existing = configObject(config.provider)\n if (existing.type && existing.type !== 'docker-ssh')\n throw new Error(cliM('cli_deploy_bundle_provider'))\n config.provider = { type: 'docker-ssh', remote: { runtime: 'auto' }, expose: { hostPort: 3000 }, ...existing }\n const candidate = module.ProviderConfigSchema.safeParse(config.provider)\n // 仅打包不依赖 SSH;未填写完整的连接由交付目录中的目标文件补齐。\n if (!candidate.success && candidate.error.issues.some(issue => issue.path[0] === 'ssh')) {\n const provider = configObject(config.provider)\n delete provider.ssh\n }\n }\n const current = module.ProviderConfigSchema.safeParse(config.provider)\n if (current.success && (bundleOnly || current.data.type !== 'docker-ssh' || current.data.ssh)) {\n config.provider = current.data\n writeCliMessage(bundleOnly\n ? cliM('cli_deploy_bundle_target')\n : cliM('cli_deploy_target_reused', { params: { target: current.data.type === 'docker-ssh' && current.data.ssh ? `${current.data.ssh.username}@${current.data.ssh.host}:${current.data.ssh.port}` : 'Vercel' } }))\n return\n }\n if (nonInteractive || bundleOnly)\n throw new Error(cliM('cli_deploy_target_missing', { params: { fields: current.success ? 'provider.ssh' : current.error.issues.map(issue => `provider.${issue.path.join('.')}`).join(', ') } }))\n\n const original = configObject(config.provider)\n const platform = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_target_platform'),\n choices: [{ title: cliM('cli_deploy_target_ssh'), value: 'docker-ssh' }, { title: 'Vercel', value: 'vercel' }],\n initial: original.type === 'vercel' ? 1 : 0,\n })\n if (!platform.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n\n const input = async (name: string, initial: unknown, options: { optional?: boolean, secret?: boolean, port?: boolean } = {}): Promise<string> => {\n const answer = await prompts({\n type: options.secret ? 'password' : 'text',\n name: 'value',\n message: cliM(`cli_deploy_input${name.split('_').at(-1)}` as Parameters<typeof cliM>[0]),\n initial: options.secret ? undefined : initial === undefined ? '' : String(initial),\n validate: (value: string) => options.port\n ? (/^\\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535) || cliM('cli_deploy_port_invalid')\n : options.optional || !!value.trim() || cliM('cli_deploy_invalid_value'),\n })\n if (answer.value === undefined)\n throw new Error(cliM('cli_deploy_cancelled'))\n return String(answer.value).trim()\n }\n let provider: Record<string, unknown>\n if (platform.value === 'docker-ssh') {\n writeCliMessage(cliM('cli_deploy_target_ssh_hint'))\n const ssh = configObject(original.ssh)\n const remote = configObject(original.remote)\n const expose = configObject(original.expose)\n const host = await input('HAI_DEPLOY_PROVIDER_SSH_HOST', ssh.host)\n const port = Number(await input('HAI_DEPLOY_PROVIDER_SSH_PORT', ssh.port ?? 22, { port: true }))\n const username = await input('HAI_DEPLOY_PROVIDER_SSH_USERNAME', ssh.username)\n const identityFile = await input('HAI_DEPLOY_PROVIDER_SSH_IDENTITYFILE', ssh.identityFile, { optional: true })\n const knownHostsFile = await input('HAI_DEPLOY_PROVIDER_SSH_KNOWNHOSTSFILE', ssh.knownHostsFile, { optional: true })\n const baseDir = await input('HAI_DEPLOY_PROVIDER_REMOTE_BASEDIR', remote.baseDir || '/opt/hai/apps')\n const runtime = await prompts({ type: 'select', name: 'value', message: cliM('cli_deploy_target_runtime'), choices: ['auto', 'podman', 'docker'].map(value => ({ title: value, value })), initial: ['auto', 'podman', 'docker'].indexOf(String(remote.runtime ?? 'auto')) })\n if (!runtime.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n const hostPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_HOSTPORT', expose.hostPort || 3000, { port: true }))\n const containerPort = Number(await input('HAI_DEPLOY_PROVIDER_EXPOSE_CONTAINERPORT', expose.containerPort || 3000, { port: true }))\n provider = {\n type: 'docker-ssh',\n ssh: { ...ssh, host, port, username, identityFile: identityFile || undefined, knownHostsFile: knownHostsFile || undefined },\n remote: { ...remote, baseDir, runtime: runtime.value },\n expose: { type: 'port', hostPort, containerPort },\n }\n }\n else {\n provider = { type: 'vercel', token: await input('HAI_DEPLOY_PROVIDER_TOKEN', undefined, { secret: true }) }\n }\n const validated = module.ProviderConfigSchema.safeParse(provider)\n if (!validated.success)\n throw new Error(cliM('cli_deploy_invalid_value'))\n const saved = module.saveDeploymentEnvironment(environment, { HAI_DEPLOY_PROVIDER: JSON.stringify(validated.data) }, { private: true })\n if (!saved.success)\n throw new Error(saved.error.message)\n config.provider = validated.data\n writeCliMessage(cliM('cli_deploy_target_saved'))\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n * 显式加载目标环境、配置中间件并检查 HaiResult;退出时恢复原进程环境并关闭部署模块。\n * @throws Error - 扫描、配置、构建、打包或部署失败;SSH 本地终止不等于远端部署已停止。\n * @returns 部署或仅打包流程结束;具体模式见 bundleOnly。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前工程已构建镜像产物,且有 config/_deploy.yml 与生产公共/私有环境。\n * await deployCommand({ cwd: process.cwd(), env: 'prod', yes: true, bundleOnly: true, output: '.hai/shop.tar' })\n * // 等价:hai deploy --env prod --yes --bundle-only --output .hai/shop.tar。\n * ```\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n let appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n let restoreProjectLogger: (() => void) | undefined\n const originalEnv = { ...process.env }\n const previousLogLevel = core.logger.getLevel()\n core.logger.setLevel('fatal')\n\n try {\n if (options.runtime && !['auto', 'podman', 'docker'].includes(options.runtime))\n throw new Error(cliM('cli_build_runtime_missing'))\n if (options.artifactDir && options.build)\n throw new Error(cliM('cli_deploy_build_artifact_conflict'))\n if (!options.build && (options.network !== undefined || options.sqlitePrebuildMirror !== undefined || options.httpProxy === false))\n throw new Error(cliM('cli_deploy_build_options_required'))\n let selectedServices = options.services?.split(',').map(name => name.trim())\n if (selectedServices && (!selectedServices.length || selectedServices.some(name => !/^[a-z][a-z0-9-]*$/.test(name)) || new Set(selectedServices).size !== selectedServices.length))\n throw new Error(cliM('cli_build_selection_invalid'))\n // 环境选择是第一步;取消、无 TTY 或缺文件均不能继续认证/开通资源。\n let environmentName = options.env\n if (!environmentName) {\n if (!process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n const answer = await prompts({ type: 'text', name: 'environment', message: cliM('cli_deploy_environment'), initial: 'prod' })\n environmentName = answer.environment\n if (!environmentName)\n throw new Error(cliM('cli_deploy_cancelled'))\n }\n if (!options.yes && !process.stdin.isTTY)\n throw new Error(cliM('cli_deploy_environment_hint'))\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n // 全局安装的 CLI 先使用目标工程的 deploy 版本,不依赖 CLI 的开发依赖。\n const localRequire = createRequire(resolve(appDir, 'package.json'))\n try {\n const { core: projectCore } = await import(pathToFileURL(localRequire.resolve('@h-ai/core')).href) as typeof import('@h-ai/core')\n if (projectCore !== core) {\n const level = projectCore.logger.getLevel()\n projectCore.logger.setLevel('fatal')\n restoreProjectLogger = () => projectCore.logger.setLevel(level)\n }\n }\n catch { /* 未安装项目依赖时,由 deploy 导入错误统一提示。 */ }\n let localModule: string | undefined\n try {\n localModule = localRequire.resolve('@h-ai/deploy')\n }\n catch { /* 源码仓库或直接模块测试可使用 CLI 本身可解析的安装。 */ }\n deployModule = localModule ? await import(pathToFileURL(localModule).href) : await import('@h-ai/deploy')\n }\n catch {\n writeCliError(chalk.red(cliM('cli_deploy_module_missing')))\n writeCliMessage(chalk.cyan(' pnpm add -D @h-ai/deploy'))\n throw new Error(cliM('cli_deploy_module_missing'))\n }\n\n const { deploy } = deployModule\n\n const scanResult = await deploy.scan(appDir, { environment: environmentName, envDir: options.envDir ? resolve(cwd, options.envDir) : undefined })\n if (!scanResult.success)\n throw new Error(cliM('cli_deploy_scan_failed', { params: { message: scanResult.error.message } }))\n const scan = scanResult.data\n appDir = scan.appDir ?? appDir\n let buildRoot = appDir\n while (!existsSync(resolve(buildRoot, 'hai.build.json')) && dirname(buildRoot) !== buildRoot)\n buildRoot = dirname(buildRoot)\n const buildFile = resolve(buildRoot, 'hai.build.json')\n const buildConfig: { images?: Array<{ name: string }> } = existsSync(buildFile) ? JSON.parse(readFileSync(buildFile, 'utf8')) : {}\n const names = [...(buildConfig.images?.map(image => image.name) ?? ['app', 'web']), ...(scan.middlewares ?? []).filter(item => !['sqlite', 'local', 'memory', 'disabled', 'console', 'lancedb'].includes(item.backend)).map(item => item.service)]\n const available = [...new Set(names)]\n if (selectedServices?.some(name => !available.includes(name)))\n throw new Error(cliM('cli_deploy_services_invalid', { params: { services: available.join(', ') } }))\n const environment = deployModule.loadDeploymentEnvironment({ environment: environmentName, envDir: scan.envDir ?? appDir })\n if (!environment.success)\n throw new Error(environment.error.message)\n Object.assign(process.env, environment.data.values)\n\n // 1. 加载凭证\n spinner.start(cliM('cli_deploy_load_credentials'))\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n throw new Error(cliM('cli_deploy_credentials_failed', { params: { message: credResult.error.message } }))\n }\n spinner.succeed(cliM('cli_deploy_credentials_loaded', { params: { count: credResult.data.length } }))\n\n // 2. 读取部署配置\n spinner.start(cliM('cli_deploy_load_config'))\n const configPath = resolve(appDir, 'config', '_deploy.yml')\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(cliM('cli_deploy_config_missing', { params: { path: configPath } })))\n writeCliMessage(chalk.cyan(cliM('cli_deploy_config_hint')))\n throw new Error(cliM('cli_deploy_config_missing', { params: { path: configPath } }))\n }\n\n const loadedConfig = deployModule.loadDeploymentConfig('deploy', configPath, process.env)\n if (!loadedConfig.success)\n throw new Error(loadedConfig.error.message)\n const deployConfig = loadedConfig.data\n spinner.succeed(cliM('cli_deploy_config_loaded'))\n if (!options.build && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n let artifactDirectory = options.artifactDir ? resolve(cwd, options.artifactDir) : resolve(buildRoot, '.hai/build/docker')\n if (existsSync(resolve(artifactDirectory, 'latest'))) {\n const pointer = readFileSync(resolve(artifactDirectory, 'latest'), 'utf8').trim()\n if (!/^[a-z0-9][\\w.+-]*$/i.test(pointer))\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n artifactDirectory = resolve(artifactDirectory, pointer)\n }\n if (existsSync(resolve(artifactDirectory, 'manifest.json'))) {\n try {\n const artifact = await deployModule.readDeploymentArtifact(artifactDirectory)\n if (artifact.partial)\n selectedServices = artifact.images.map(image => image.name)\n }\n catch {\n throw new Error(cliM('cli_deploy_artifact_invalid'))\n }\n }\n }\n await configureDeployTarget(deployModule, deployConfig, environment.data, options.yes, options.bundleOnly)\n if (configObject(deployConfig.provider).type !== 'docker-ssh' && (selectedServices || options.build))\n throw new Error(cliM('cli_deploy_bundle_provider'))\n\n if (!options.yes && !selectedServices && configObject(deployConfig.provider).type === 'docker-ssh') {\n if (existsSync(buildFile)) {\n if (available.length > 1) {\n const choice = await prompts({ type: 'multiselect', name: 'value', message: cliM('cli_deploy_choose_services'), choices: available.map(name => ({ title: name, value: name, selected: true })), min: 1 })\n if (!Array.isArray(choice.value) || choice.value.length === 0)\n throw new Error(cliM('cli_deploy_cancelled'))\n if (choice.value.length !== available.length)\n selectedServices = choice.value\n }\n }\n }\n\n spinner.succeed(cliM('cli_deploy_scanned', { params: { name: scan.appName, sveltekit: String(scan.isSvelteKit), services: scan.requiredServices.join(', ') || cliM('cli_deploy_none') } }))\n\n if (options.build) {\n if (!existsSync(buildFile))\n throw new Error(cliM('cli_build_images_missing'))\n const imageNames = selectedServices?.filter(name => ['app', 'web'].includes(name))\n if (!selectedServices || imageNames?.length) {\n writeCliMessage(cliM('cli_deploy_build_started'))\n await buildCommand({ cwd: buildRoot, target: 'docker', images: imageNames?.join(','), runtime: options.runtime, network: options.network, sqlitePrebuildMirror: options.sqlitePrebuildMirror, httpProxy: options.httpProxy })\n }\n }\n if (selectedServices)\n writeCliMessage(cliM('cli_deploy_services', { params: { services: selectedServices.join(', ') } }))\n let skipMiddleware = options.skipMiddleware || selectedServices?.every(name => ['app', 'web'].includes(name))\n if (!skipMiddleware && !options.yes && scan.requiredServices.length) {\n const action = await prompts({\n type: 'select',\n name: 'value',\n message: cliM('cli_deploy_middleware_plan'),\n choices: [{ title: cliM('cli_deploy_middleware_configure'), value: 'configure' }, { title: cliM('cli_deploy_middleware_skip'), value: 'skip' }],\n })\n if (!action.value)\n throw new Error(cliM('cli_deploy_cancelled'))\n skipMiddleware = action.value === 'skip'\n }\n if (skipMiddleware)\n writeCliMessage(cliM('cli_deploy_middleware_skipped'))\n const serviceModes = skipMiddleware\n ? Object.fromEntries(scan.requiredServices.map(service => [service, 'keep' as const]))\n : await configureDeployMiddleware(deployModule, { ...scan, middlewares: scan.middlewares?.filter(item => !selectedServices || selectedServices.includes(item.service)) }, environment.data, deployConfig, options.yes)\n if (skipMiddleware)\n deployConfig.services = undefined\n // 刚写入文件的值不能被本次命令之前注入的快照覆盖;保留用户原有进程变量优先级。\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n const refreshed = deployModule.loadDeploymentEnvironment({ environment: environment.data.environment, envDir: environment.data.envDir })\n if (!refreshed.success)\n throw new Error(refreshed.error.message)\n Object.assign(process.env, refreshed.data.values)\n\n // 4. 初始化 deploy 模块\n spinner.start(cliM('cli_deploy_initializing'))\n const validatedConfig = deployModule.DeployConfigSchema.safeParse(deployConfig)\n if (!validatedConfig.success)\n throw new Error(cliM('cli_deploy_config_invalid', { params: { path: configPath, fields: validatedConfig.error.issues.map(issue => issue.path.join('.')).join(', ') } }))\n const initResult = await deploy.init(validatedConfig.data)\n if (!initResult.success) {\n throw new Error(cliM('cli_deploy_init_failed', { params: { message: initResult.error.message } }))\n }\n closeDeploy = () => deploy.close()\n spinner.succeed(cliM('cli_deploy_initialized'))\n\n // 5. 执行部署\n spinner.start(cliM('cli_deploy_deploying'))\n const deployResult = await deploy.deployApp(appDir, {\n projectName: options.projectName,\n selectedServices,\n runtime: options.runtime,\n onProgress: stage => writeCliMessage(cliM(`cli_deploy_stage_${stage}`)),\n skipMiddleware,\n artifactDir: options.artifactDir ? resolve(cwd, options.artifactDir) : undefined,\n bundleOnly: options.bundleOnly,\n output: options.output ? resolve(cwd, options.output) : undefined,\n environment: environment.data.environment,\n envDir: environment.data.envDir,\n serviceModes,\n })\n\n if (!deployResult.success) {\n const execution = deployModule.getDeployCommandState(deployResult.error)\n if (execution) {\n const localKey = execution.localTermination === 'not-started' ? 'cli_deploy_local_not_started' : execution.localTermination === 'confirmed' ? 'cli_deploy_local_confirmed' : 'cli_deploy_local_unknown'\n writeCliMessage(cliM(localKey))\n if (execution.remoteExecution)\n writeCliMessage(cliM(execution.remoteExecution === 'finished' ? 'cli_deploy_remote_finished' : 'cli_deploy_remote_unknown'))\n if (execution.deploymentId && execution.resultFile)\n writeCliMessage(cliM('cli_deploy_result_check', { params: { id: execution.deploymentId, path: execution.resultFile } }))\n }\n if (deployResult.error.ext?.recovery) {\n writeCliMessage(deployResult.error.suggestion ?? cliM('cli_deploy_command_failed'))\n }\n throw new Error(cliM('cli_deploy_failed', { params: { message: deployResult.error.message } }))\n }\n\n spinner.succeed(chalk.green(cliM(deployResult.data.status === 'packaged' ? 'cli_deploy_bundle_ready' : 'cli_deploy_success')))\n writeCliMessage('')\n if (deployResult.data.bundlePath && (deployResult.data.status !== 'packaged' || !deployResult.data.instructions))\n writeCliMessage(cliM('cli_deploy_bundle_path', { params: { path: deployResult.data.bundlePath } }))\n if (deployResult.data.status === 'packaged')\n writeCliMessage(deployResult.data.instructions ?? '')\n else\n writeCliMessage(chalk.cyan(cliM('cli_deploy_url', { params: { url: deployResult.data.url } })))\n writeCliMessage(chalk.gray(cliM('cli_deploy_id', { params: { id: deployResult.data.deploymentId } })))\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(chalk.red(cliM('cli_deploy_command_failed')))\n writeCliError(error instanceof Error ? error.message : String(error))\n throw error\n }\n finally {\n if (closeDeploy) {\n try {\n await closeDeploy()\n }\n catch (error) {\n writeCliError('Failed to close deploy module', error)\n process.exitCode = 1\n }\n }\n for (const key of Object.keys(process.env)) {\n if (originalEnv[key] === undefined)\n delete process.env[key]\n }\n Object.assign(process.env, originalEnv)\n core.logger.setLevel(previousLogLevel)\n restoreProjectLogger?.()\n }\n}\n","import type { TemplateContext } from '../cli-types.js'\nimport type { GenerateTarget } from './cli-generate-target.js'\nimport path from 'node:path'\nimport fse from 'fs-extra'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 一批经过预检后统一写入的生成文件。\n * 普通生成文件不携带 previousContent;已有聚合入口必须携带原内容,用于提交前检测并发修改。\n * @example 模块内部上下文\n * ```ts\n * const file: GeneratedFile = { path: path.resolve('src/server/procedures/orders.ts'), content: 'export const orderName = \\'orders\\'\\n' }\n * ```\n */\nexport interface GeneratedFile {\n /** 输出文件的绝对路径。 */\n path: string\n /** 写入后的完整源码。 */\n content: string\n /** 仅聚合文件编辑携带原内容;写入前校验文件没有被其他操作修改。 */\n previousContent?: string\n}\n\n/**\n * 只在唯一生成标记前插入一项;import 保持组内相对顺序,重复完整行保持原文。\n * @param source - 现有聚合文件的完整内容。\n * @param marker - 模板约定的唯一标记。\n * @param entry - 待插入的完整 import/export 或对象项。\n * @returns 更新后的完整文件内容;标记重复或缺失时抛错。\n * @example 模块内部上下文\n * ```ts\n * const marker = '// @hai-generator:contracts:entries'\n * const source = appendAt(`const contracts = {\\n${marker}\\n}`, marker, ' orders: ordersContract,')\n * ```\n */\nfunction appendAt(source: string, marker: string, entry: string): string {\n if (source.split(marker).length !== 2)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n if (source.split(/\\r?\\n/).some(line => line.trim() === entry.trim()))\n return source\n // 模板的相对 import 均为单行;插在同组正确位置,避免增量生成破坏排序门禁。\n const moduleName = /^import .+ from ['\"](.+)['\"]$/.exec(entry)?.[1]\n if (moduleName) {\n for (const match of source.matchAll(/^import (?!type\\b)[^\\r\\n]+ from ['\"](\\.[^'\"]+)['\"]\\r?$/gm)) {\n if (match[1]!.localeCompare(moduleName) > 0)\n return `${source.slice(0, match.index)}${entry}\\n${source.slice(match.index)}`\n }\n }\n return source.replace(marker, `${entry}\\n${marker}`)\n}\n\n/**\n * 沿服务端依赖图生成 contract 与 procedure,并接入模板已有的聚合入口。\n * @param context - 已通过标识符校验的名称。\n * @param target - 解析后的后端 workspace 与共享 contract 包。\n * @returns 新源码及现有入口的完整修改计划,不在本函数落盘。\n * @throws Error - contract 包不唯一或入口不再具有可识别的生成标记。\n * @example 模块内部上下文\n * ```ts\n * // 前提:在 CLI 生成的 fullstack 根执行;后端包为 shop-serv。\n * const { resolveGenerateTarget } = await import('./cli-generate-target.js')\n * const { createTemplateContext } = await import('../cli-utils.js')\n * const target = await resolveGenerateTarget({ cwd: process.cwd(), type: 'api', name: 'orders', workspace: 'shop-serv' })\n * const files = await generateServApi(createTemplateContext('orders'), target)\n * // 这里只返回计划;由 generate 统一预检、写入与失败回滚。\n * ```\n */\nexport async function generateServApi(context: TemplateContext, target: GenerateTarget): Promise<GeneratedFile[]> {\n const contracts = target.packages.filter(pkg => pkg.dependencies['@h-ai/api-contract'] && pkg.dependencies.zod && pkg.name in target.target.dependencies)\n if (contracts.length !== 1)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const contract = contracts[0]!\n const contractSources = await fse.readdir(path.join(contract.directory, 'src'))\n const aggregators: Array<{ path: string, content: string }> = []\n for (const name of contractSources.filter(name => name.endsWith('.ts'))) {\n const file = path.join(contract.directory, 'src', name)\n const content = await fse.readFile(file, 'utf8')\n if (content.includes('// @hai-generator:contracts:entries'))\n aggregators.push({ path: file, content })\n }\n if (aggregators.length !== 1)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const aggregator = aggregators[0]!\n const contractIndex = path.join(contract.directory, 'src/index.ts')\n const procedureIndex = path.join(target.target.directory, 'src/server/procedures/index.ts')\n const indexSource = await fse.readFile(contractIndex, 'utf8')\n const procedureSource = await fse.readFile(procedureIndex, 'utf8')\n const contractName = `${context.camelCase}Contract`\n const factoryName = `create${context.pascalCase}Procedures`\n const domainMarker = `// @hai-generator:domain ${context.camelCase}`\n const contractFile = path.join(contract.directory, 'src', `${context.kebabCase}-contract.ts`)\n const procedureFile = path.join(target.target.directory, 'src/server/procedures', `${context.kebabCase}-procedures.ts`)\n const importLine = `import { ${contractName} } from './${context.kebabCase}-contract.js'`\n const entryLine = ` ${context.camelCase}: ${contractName},`\n const factoryImport = `import { ${factoryName} } from './${context.kebabCase}-procedures.js'`\n const domainProperty = new RegExp(`^\\\\s*(?:${context.camelCase}|['\"]${context.camelCase}['\"]):`, 'm')\n if (domainProperty.test(aggregator.content) || domainProperty.test(procedureSource)) {\n for (const file of [contractFile, procedureFile]) {\n if (!await fse.pathExists(file) || !(await fse.readFile(file, 'utf8')).includes(domainMarker))\n throw new Error(cliM('cli_generateDomainExists', { params: { name: context.camelCase } }))\n }\n }\n const contractContent = `${domainMarker}\nimport { apiContract } from '@h-ai/api-contract'\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} 示例契约:GET 列表与 POST 校验回显,不执行持久写入。\n * @example client.${context.camelCase}.create({ name: 'Example' })\n */\nexport const ${contractName} = {\n list: apiContract\n .route({ method: 'GET', path: '/${context.kebabCase}', operationId: '${context.camelCase}.list', tags: ['${context.kebabCase}'] })\n .output(apiContract.haiResultSchema(z.object({ items: z.array(z.object({ name: z.string() })) }))),\n create: apiContract\n .route({ method: 'POST', path: '/${context.kebabCase}', operationId: '${context.camelCase}.create', tags: ['${context.kebabCase}'] })\n .input(z.object({ name: z.string().min(1) }))\n .output(apiContract.haiResultSchema(z.object({ name: z.string() }))),\n}\n`\n const procedureContent = `${domainMarker}\nimport type { ServContext } from '@h-ai/serv'\nimport { ok } from '@h-ai/core'\nimport { serv } from '@h-ai/serv'\nimport { ${contractName} } from '${contract.name}'\n\n/**\n * 创建 ${context.pascalCase} 示例过程;新增持久写入前接入授权与业务服务。\n * @returns 与共享契约一致的公开过程;示例不访问用户数据。\n * @example const procedures = { ${context.camelCase}: ${factoryName}() }\n */\nexport function ${factoryName}() {\n return serv\n .implement(${contractName})\n .context<ServContext>()\n .route('list', () => ok({ items: [] }))\n .route('create', ({ input }) => ok({ name: input.name }))\n .build()\n}\n`\n return [\n { path: contractFile, content: contractContent },\n { path: procedureFile, content: procedureContent },\n { path: aggregator.path, previousContent: aggregator.content, content: appendAt(appendAt(aggregator.content, '// @hai-generator:contracts:imports', importLine), ' // @hai-generator:contracts:entries', entryLine) },\n { path: contractIndex, previousContent: indexSource, content: appendAt(indexSource, '// @hai-generator:contracts:exports', `export * from './${context.kebabCase}-contract.js'`) },\n { path: procedureIndex, previousContent: procedureSource, content: appendAt(appendAt(procedureSource, '// @hai-generator:procedures:imports', factoryImport), ' // @hai-generator:procedures:entries', ` ${context.camelCase}: ${factoryName}(),`) },\n ]\n}\n","import type { GenerateOptions } from '../cli-types.js'\nimport { glob } from 'node:fs/promises'\nimport path from 'node:path'\nimport fse from 'fs-extra'\nimport { parse } from 'yaml'\nimport { cliM } from '../cli-i18n.js'\n\n/**\n * 生成目标与实际 workspace 清单;根目录同时作为跨包输出的安全边界。\n * @example 模块内部上下文\n * ```ts\n * const pkg: GeneratePackage = { directory: path.resolve('apps/shop'), name: 'shop', dependencies: { '@sveltejs/kit': '^2' } }\n * const target: GenerateTarget = { root: path.resolve('.'), target: pkg, packages: [pkg] }\n * ```\n */\nexport interface GenerateTarget {\n /** 真实工作区根路径。 */\n root: string\n /** 当前命令选中的应用包。 */\n target: GeneratePackage\n /** 工作区中可消费的包;仅包含根目录内的真实路径。 */\n packages: GeneratePackage[]\n}\n\n/**\n * 生成器实际使用的 package.json 字段。\n * @example 模块内部上下文\n * ```ts\n * const pkg: GeneratePackage = { directory: path.resolve('packages/shop-serv'), name: 'shop-serv', dependencies: { '@h-ai/serv': '*' } }\n * const architecture = generateArchitecture(pkg) // serv\n * ```\n */\nexport interface GeneratePackage {\n /** 包的绝对真实目录。 */\n directory: string\n /** package.json.name,缺省使用目录名。 */\n name: string\n /** 运行依赖和开发依赖的合并视图。 */\n dependencies: Record<string, string>\n}\n\n/**\n * 以 path.relative 检查真实路径包含关系,拒绝同名前缀的兄弟目录;调用方先解析符号链接。\n * @param root - 允许输出的真实根目录。\n * @param file - 已解析的绝对目标或现存祖先目录。\n * @returns 目标等于根目录或位于根目录内时为 true。\n * @example 模块内部上下文\n * ```ts\n * const root = path.resolve('shop')\n * const valid = isInside(root, path.join(root, 'src/orders.ts')) // true\n * const sibling = isInside(root, `${root}-other/orders.ts`) // false\n * ```\n */\nfunction isInside(root: string, file: string): boolean {\n const relative = path.relative(root, file)\n return relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)\n}\n\n/** 只读取生成器需要的已校验包字段,不执行应用配置。 */\nasync function readPackage(directory: string): Promise<GeneratePackage | undefined> {\n if (!await fse.pathExists(path.join(directory, 'package.json')))\n return undefined\n const value: unknown = await fse.readJson(path.join(directory, 'package.json'))\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n const dependencies: Record<string, string> = {}\n for (const key of ['dependencies', 'devDependencies']) {\n const entries = key in value ? Reflect.get(value, key) : undefined\n if (entries && typeof entries === 'object' && !Array.isArray(entries)) {\n for (const [name, version] of Object.entries(entries)) {\n if (typeof version === 'string')\n dependencies[name] = version\n }\n }\n }\n const name = 'name' in value && typeof value.name === 'string' ? value.name : path.basename(directory)\n if (!/^(?:@[\\w.-]+\\/)?[\\w.-]+$/.test(name))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n return { directory, name, dependencies }\n}\n\n/**\n * 按实际依赖辨认路由能力;纯 Vite 不具备 SvelteKit 的文件路由。\n * @param pkg - 已校验的包清单。\n * @returns 应用实际安装的框架类型。\n * @example 模块内部上下文\n * ```ts\n * const architecture = generateArchitecture({ directory: path.resolve('.'), name: 'shop-serv', dependencies: { '@h-ai/serv': '*' } }) // serv\n * ```\n */\nexport function generateArchitecture(pkg: GeneratePackage): 'sveltekit' | 'serv' | 'svelte' | 'other' {\n if (pkg.dependencies['@sveltejs/kit'])\n return 'sveltekit'\n if (pkg.dependencies['@h-ai/serv'])\n return 'serv'\n return pkg.dependencies.svelte ? 'svelte' : 'other'\n}\n\n/**\n * 从当前包或 pnpm 工作区解析唯一可消费的目标;歧义要求显式 --workspace。\n * @param options - 命令选项;workspace 可为包名或根目录内相对路径。\n * @returns 目标包及受信路径边界。\n * @throws Error - 项目类型未知、包不存在、路径越界或存在多个适用包。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前 fullstack 工程中存在 shop-serv 后端包。\n * const target = await resolveGenerateTarget({ cwd: process.cwd(), type: 'api', name: 'orders', workspace: 'shop-serv' })\n * const serviceDirectory = target.target.directory\n * ```\n */\nexport async function resolveGenerateTarget(options: GenerateOptions): Promise<GenerateTarget> {\n const cwd = await fse.realpath(path.resolve(options.cwd ?? '.'))\n let root = cwd\n for (let current = cwd; ; current = path.dirname(current)) {\n if (await fse.pathExists(path.join(current, 'pnpm-workspace.yaml'))) {\n root = current\n break\n }\n if (path.dirname(current) === current)\n break\n }\n const packages: GeneratePackage[] = []\n const addPackage = async (directory: string) => {\n if (!isInside(root, directory))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const real = await fse.realpath(directory)\n if (!isInside(root, real))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const pkg = await readPackage(real)\n if (pkg && !packages.some(value => value.directory === real))\n packages.push(pkg)\n }\n await addPackage(root)\n if (await fse.pathExists(path.join(root, 'pnpm-workspace.yaml'))) {\n const workspace: unknown = parse(await fse.readFile(path.join(root, 'pnpm-workspace.yaml'), 'utf8'))\n const patterns = workspace && typeof workspace === 'object' && 'packages' in workspace && Array.isArray(workspace.packages) ? workspace.packages : []\n for (const pattern of patterns) {\n if (typeof pattern !== 'string' || pattern.startsWith('!') || pattern.split(/[\\\\/]/).includes('..') || path.isAbsolute(pattern))\n throw new Error(cliM('cli_generateUnsupportedProject'))\n for await (const manifest of glob(`${pattern}/package.json`, { cwd: root, exclude: ['**/node_modules/**'] }))\n await addPackage(path.dirname(path.resolve(root, manifest)))\n }\n }\n if (cwd !== root)\n await addPackage(cwd)\n const selected = options.workspace\n ? packages.filter(pkg => pkg.name === options.workspace || pkg.directory === path.resolve(root, options.workspace!))\n : packages.filter(pkg => pkg.directory === cwd)\n const applicable = (pkg: GeneratePackage) => {\n const architecture = generateArchitecture(pkg)\n return options.type === 'api'\n ? architecture === 'serv' || (architecture === 'sveltekit' && Boolean(pkg.dependencies['@h-ai/kit']) && Boolean(pkg.dependencies.zod))\n : options.type === 'page'\n ? architecture === 'sveltekit'\n : options.type === 'component'\n ? ['sveltekit', 'svelte'].includes(architecture)\n : Object.keys(pkg.dependencies).some(name => name.startsWith('@h-ai/'))\n }\n const candidates = options.workspace || (selected.length === 1 && (cwd !== root || applicable(selected[0]!))) ? selected.filter(applicable) : packages.filter(applicable)\n if (candidates.length !== 1)\n throw new Error(cliM(candidates.length > 1 ? 'cli_generateAmbiguousWorkspace' : 'cli_generateUnsupportedProject'))\n const target = candidates[0]!\n if (generateArchitecture(target) === 'sveltekit' && (options.type === 'page' || options.type === 'api')) {\n // 不执行应用 JS 配置;明确使用 kit.files 定制布局时拒绝猜测默认路由目录。\n for (const name of ['svelte.config.js', 'svelte.config.mjs', 'svelte.config.cjs', 'svelte.config.ts']) {\n const configFile = path.join(target.directory, name)\n if (await fse.pathExists(configFile) && /\\bfiles\\s*[:.[(]/.test(await fse.readFile(configFile, 'utf8')))\n throw new Error(cliM('cli_generateCustomRoutes'))\n }\n }\n return { root, target, packages }\n}\n","/**\n * @h-ai/cli — 代码生成命令\n * @module cli-generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../cli-types.js'\nimport type { GeneratedFile } from './cli-generate-serv.js'\nimport { randomUUID } from 'node:crypto'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { cliM } from '../cli-i18n.js'\nimport { createTemplateContext, writeCliError, writeCliMessage } from '../cli-utils.js'\nimport { generateServApi } from './cli-generate-serv.js'\nimport { generateArchitecture, resolveGenerateTarget } from './cli-generate-target.js'\n\n/**\n * 生成器配置\n */\nconst GENERATORS: Record<GeneratorType, {\n description: () => string\n defaultPath: string\n generate: (context: TemplateContext, outputDir: string) => Promise<Array<{ path: string, content: string }>>\n}> = {\n page: {\n description: () => cliM('cli_generatePageDescription'),\n defaultPath: 'src/routes',\n generate: generatePage,\n },\n component: {\n description: () => cliM('cli_generateComponentDescription'),\n defaultPath: 'src/lib/components',\n generate: generateComponent,\n },\n api: {\n description: () => cliM('cli_generateApiDescription'),\n defaultPath: 'src/routes/api',\n generate: generateApi,\n },\n model: {\n description: () => cliM('cli_generateModelDescription'),\n defaultPath: 'src/lib/models',\n generate: generateModel,\n },\n migration: {\n description: () => cliM('cli_generateMigrationDescription'),\n defaultPath: 'migrations',\n generate: generateMigration,\n },\n}\n\n/**\n * 按实际应用/workspace 架构生成代码,并在文件写入失败时回滚本次修改。\n * @param options - 生成类型、名称、workspace 及覆盖选项。\n * @returns 文件生成并接入已有路由入口后完成。\n * @throws Error | AggregateError - 架构不支持、路径/覆盖冲突,或写入及回滚失败。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前工程是 CLI 创建的 fullstack,shop-serv 含可识别的聚合标记。\n * await generate({ cwd: process.cwd(), workspace: 'shop-serv', type: 'api', name: 'orders' })\n * // 等价:hai g api orders --workspace shop-serv;不支持纯 Vite 文件路由时会拒绝。\n * ```\n */\nexport async function generate(options: GenerateOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 交互式获取选项\n const resolvedOptions = await resolveGenerateOptions(options)\n const generator = GENERATORS[resolvedOptions.type]\n\n // 名称会同时进入路径、标识符与源码字符串,禁止路径片段和代码字符。\n if (!/^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/i.test(resolvedOptions.name))\n throw new Error(cliM('cli_invalidGenerateName'))\n\n const target = await resolveGenerateTarget(resolvedOptions)\n const architecture = generateArchitecture(target.target)\n const outputDir = path.resolve(target.target.directory, resolvedOptions.output || generator.defaultPath)\n // 文件路由必须在真实应用的路由目录内,不能生成不会被消费的“页面”。\n if (['page', 'api'].includes(resolvedOptions.type) && architecture === 'sveltekit') {\n const routes = path.join(target.target.directory, 'src/routes')\n if (!outputDir.startsWith(routes + path.sep) && outputDir !== routes)\n throw new Error(cliM('cli_generateInvalidRouteOutput'))\n }\n if (resolvedOptions.type === 'api' && architecture === 'serv' && resolvedOptions.output)\n throw new Error(cliM('cli_generateInvalidRouteOutput'))\n const relativeOutput = path.relative(target.root, outputDir)\n if (relativeOutput === '..' || relativeOutput.startsWith(`..${path.sep}`) || path.isAbsolute(relativeOutput))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n\n const context = createTemplateContext(resolvedOptions.name, {\n projectName: target.target.name,\n })\n\n spinner.start(cliM('cli_generateProgress', { params: { description: generator.description() } }))\n\n const files = resolvedOptions.type === 'api' && architecture === 'serv'\n ? await generateServApi(context, target)\n : await generator.generate(context, outputDir)\n await writeGeneratedFiles(files, target.root, resolvedOptions.force)\n\n spinner.succeed(cliM('cli_generateComplete'))\n\n writeCliMessage('')\n writeCliMessage(cliM('cli_generateFiles'))\n files.forEach((file) => {\n writeCliMessage(chalk.cyan(` ${path.relative(cwd, file.path)}`))\n })\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail(cliM('cli_generateFailed'))\n writeCliError(cliM('cli_generateFailureDetail'), { error })\n if (error instanceof AggregateError) {\n for (const cause of error.errors)\n writeCliError(cliM('cli_generateFailureDetail'), { error: cause })\n }\n throw error\n }\n}\n\n/**\n * 解析生成选项\n */\nasync function resolveGenerateOptions(options: GenerateOptions): Promise<Required<GenerateOptions>> {\n const questions: prompts.PromptObject<'type' | 'name'>[] = []\n\n if (!options.type) {\n questions.push({\n type: 'select',\n name: 'type',\n message: cliM('cli_generateTypePrompt'),\n choices: Object.entries(GENERATORS).map(([key, value]) => ({\n title: `${key} - ${value.description()}`,\n value: key,\n })),\n })\n }\n\n if (!options.name) {\n questions.push({\n type: 'text',\n name: 'name',\n message: cliM('cli_generateNamePrompt'),\n validate: (value: string) => {\n if (!value.trim())\n return cliM('cli_generateNameRequired')\n return true\n },\n })\n }\n\n const answers = questions.length > 0\n ? await prompts<'type' | 'name'>(questions, { onCancel: () => { throw new Error(cliM('cli_generateCancelled')) } })\n : {}\n const type: unknown = options.type || ('type' in answers ? answers.type : undefined)\n const name: unknown = options.name || ('name' in answers ? answers.name : undefined)\n if (!isGeneratorType(type))\n throw new Error(cliM('cli_generateUnknownType', { params: { type: String(type ?? '') } }))\n if (typeof name !== 'string' || !name.trim())\n throw new Error(cliM('cli_generateNameRequired'))\n\n return {\n type,\n name,\n output: options.output ?? '',\n force: options.force ?? false,\n verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n workspace: options.workspace ?? '',\n }\n}\n\n/** 校验真实生成类型,避免未识别参数或对象原型成员绕过提示。 */\nfunction isGeneratorType(value: unknown): value is GeneratorType {\n return typeof value === 'string' && Object.hasOwn(GENERATORS, value)\n}\n\n/**\n * 先校验全部路径与覆盖条件,再暂存并逐个提交;失败时只回滚仍等于本次内容的文件,保留外部并发修改。\n * @param files - 生成文件计划;聚合入口必须携带原内容。\n * @param root - 已解析的真实 workspace 根目录。\n * @param force - 仅允许覆盖普通生成文件,不绕过聚合入口的原内容检查。\n * @returns 所有文件提交及临时文件清理完成。\n * @example 模块内部上下文\n * ```ts\n * const root = await fse.realpath(process.cwd())\n * const file = path.join(root, 'src/lib/models/order-item.ts')\n * await writeGeneratedFiles([{ path: file, content: 'export interface OrderItem { id: string }\\n' }], root, false)\n * ```\n */\nasync function writeGeneratedFiles(files: GeneratedFile[], root: string, force: boolean): Promise<void> {\n if (new Set(files.map(file => path.resolve(file.path))).size !== files.length)\n throw new Error(cliM('cli_generateUnsupportedAggregator'))\n const previous = new Map<string, string | undefined>()\n const stages = new Map<string, string>()\n const written: GeneratedFile[] = []\n const failures: unknown[] = []\n for (const file of files) {\n const relativeFile = path.relative(root, file.path)\n if (relativeFile === '..' || relativeFile.startsWith(`..${path.sep}`) || path.isAbsolute(relativeFile))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n let ancestor = file.path\n while (!await fse.pathExists(ancestor))\n ancestor = path.dirname(ancestor)\n const relative = path.relative(root, await fse.realpath(ancestor))\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(cliM('cli_generateOutsideWorkspace'))\n const content = await fse.pathExists(file.path) ? await fse.readFile(file.path, 'utf8') : undefined\n if (file.previousContent !== undefined ? content !== file.previousContent : content !== undefined && !force)\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n previous.set(file.path, content)\n }\n try {\n for (const file of files) {\n await fse.ensureDir(path.dirname(file.path))\n const stage = path.join(path.dirname(file.path), `.${path.basename(file.path)}.${randomUUID()}.tmp`)\n stages.set(file.path, stage)\n await fse.writeFile(stage, file.content, { encoding: 'utf8', flag: 'wx' })\n }\n for (const file of files) {\n const current = await fse.pathExists(file.path) ? await fse.readFile(file.path, 'utf8') : undefined\n if (current !== previous.get(file.path))\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n await fse.rename(stages.get(file.path)!, file.path)\n written.push(file)\n }\n }\n catch (error) {\n failures.push(error)\n for (const file of written.reverse()) {\n try {\n if (await fse.readFile(file.path, 'utf8') !== file.content)\n throw new Error(cliM('cli_generateExists', { params: { path: file.path } }))\n const original = previous.get(file.path)\n if (original === undefined)\n await fse.unlink(file.path)\n else\n await fse.writeFile(file.path, original, 'utf8')\n }\n catch (rollbackError) {\n failures.push(rollbackError)\n }\n }\n }\n finally {\n for (const stage of stages.values()) {\n try {\n await fse.unlink(stage)\n }\n catch (error) {\n // 已提交的 stage 被 rename 移走;其余清理失败逐项保留,不遮盖主错误。\n if (!error || typeof error !== 'object' || !('code' in error) || error.code !== 'ENOENT')\n failures.push(error)\n }\n }\n }\n if (failures.length > 1)\n throw new AggregateError(failures, cliM('cli_generateRollbackFailed'))\n if (failures.length === 1)\n throw failures[0]\n}\n\n/**\n * 生成页面\n */\nasync function generatePage(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<!-- ${context.pascalCase} 页面 -->\n<svelte:head>\n <title>${context.pascalCase}</title>\n</svelte:head>\n\n<div class='container mx-auto p-4'>\n <h1 class='text-2xl font-bold mb-4'>${context.pascalCase}</h1>\n\n <!-- 页面内容 -->\n</div>\n`\n\n const pagePath = path.join(pageDir, '+page.svelte')\n files.push({ path: pagePath, content: pageContent })\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { Actions, PageServerLoad } from './$types'\n\nexport const load: PageServerLoad = async () => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async () => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // Component.svelte\n const componentContent = `<script lang='ts'>\n import type { Snippet } from 'svelte'\n\n /**\n * ${context.pascalCase} 组件\n */\n\n interface Props {\n /** 自定义 class */\n class?: string\n /** 子内容(Svelte 5 snippet) */\n children?: Snippet\n }\n\n const { class: className = '', children }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n {@render children?.()}\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n files.push({ path: componentPath, content: componentContent })\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const apiDir = path.join(outputDir, context.kebabCase)\n\n // +server.ts\n const serverContent = `/**\n * ${context.pascalCase} API\n */\nimport type { RequestHandler } from './$types'\nimport { kit } from '@h-ai/kit'\nimport { z } from 'zod'\n\n/** 示例输入;添加业务逻辑前扩展字段和约束。 */\nconst InputSchema = z.object({\n /** 业务名称(非空) */\n name: z.string().min(1),\n})\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = kit.handler(async ({ locals }) => {\n return kit.response.ok({ items: [] }, locals.requestId)\n})\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = kit.handler(async ({ request, locals }) => {\n const body = await kit.validate.body(request, InputSchema)\n // 校验通过后再执行业务操作;示例仅回传数据,不执行写入。\n return kit.response.ok(body, locals.requestId)\n})\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n files.push({ path: serverPath, content: serverContent })\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n\n // model.ts\n const modelContent = `/**\n * ${context.pascalCase} 模型\n */\nimport { z } from 'zod'\n\n/**\n * ${context.pascalCase} Schema\n */\nexport const ${context.camelCase}Schema = z.object({\n /** 记录唯一标识 */\n id: z.string(),\n /** 显示名称 */\n name: z.string().min(1),\n /** 创建时间 */\n createdAt: z.date(),\n /** 最后修改时间 */\n updatedAt: z.date(),\n})\n\n/**\n * 创建 ${context.pascalCase} Schema\n */\nexport const create${context.pascalCase}Schema = ${context.camelCase}Schema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n})\n\n/**\n * 更新 ${context.pascalCase} Schema\n */\nexport const update${context.pascalCase}Schema = create${context.pascalCase}Schema.partial()\n\n/**\n * ${context.pascalCase} 类型\n */\nexport type ${context.pascalCase} = z.infer<typeof ${context.camelCase}Schema>\nexport type Create${context.pascalCase} = z.infer<typeof create${context.pascalCase}Schema>\nexport type Update${context.pascalCase} = z.infer<typeof update${context.pascalCase}Schema>\n`\n\n const modelPath = path.join(outputDir, `${context.kebabCase}.ts`)\n files.push({ path: modelPath, content: modelContent })\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n context: TemplateContext,\n outputDir: string,\n): Promise<Array<{ path: string, content: string }>> {\n const files: Array<{ path: string, content: string }> = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport { reldb } from '@h-ai/reldb'\n\n/** 升级:调用前初始化 reldb,调用方必须检查返回的 HaiResult。 */\nexport function up() {\n return reldb.ddl.createTable('hai_app_${context.snakeCase}', {\n id: { type: 'TEXT', primaryKey: true },\n name: { type: 'TEXT', notNull: true },\n created_at: { type: 'TIMESTAMP', notNull: true },\n updated_at: { type: 'TIMESTAMP', notNull: true },\n })\n}\n\n/** 回滚会删除整张表;由应用确认数据可删除后显式调用。 */\nexport function down() {\n return reldb.ddl.dropTable('hai_app_${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n files.push({ path: migrationPath, content: migrationContent })\n\n return files\n}\n","/**\n * @h-ai/cli — 项目初始化/校验命令\n *\n * 校验现有项目配置完整性,补全缺失的配置文件。\n * @module cli-init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../cli-types.js'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { cliM } from '../cli-i18n.js'\nimport { fileExists, writeCliError, writeCliMessage, writeFile } from '../cli-utils.js'\nimport { generateConfigFile } from './cli-config-templates.js'\nimport { detectProject } from './cli-create.js'\n\n/**\n * init 命令选项\n * @example 模块内部上下文\n * ```ts\n * const options: InitOptions = { cwd: '/workspace/shop', force: false } // force=true 会覆盖已有模块 YAML。\n * ```\n */\nexport interface InitOptions extends GlobalOptions {\n /** 强制重新生成配置 */\n force?: boolean\n}\n\n/**\n * 模块到配置文件的映射\n */\nconst MODULE_CONFIG_MAP: Record<string, { configKey: string, label: string }> = {\n '@h-ai/core': { configKey: 'core', get label() { return cliM('cli_coreLabel') } },\n '@h-ai/serv': { configKey: 'serv', get label() { return cliM('cli_serviceLabel') } },\n '@h-ai/reldb': { configKey: 'db', get label() { return cliM('cli_featureDbName') } },\n '@h-ai/cache': { configKey: 'cache', get label() { return cliM('cli_featureCacheName') } },\n '@h-ai/iam': { configKey: 'iam', get label() { return cliM('cli_featureIamName') } },\n '@h-ai/storage': { configKey: 'storage', get label() { return cliM('cli_featureStorageName') } },\n '@h-ai/ai': { configKey: 'ai', get label() { return cliM('cli_featureAiName') } },\n '@h-ai/vecdb': { configKey: 'vecdb', get label() { return cliM('cli_featureVecdbName') } },\n '@h-ai/reach': { configKey: 'reach', get label() { return cliM('cli_featureReachName') } },\n '@h-ai/scheduler': { configKey: 'scheduler', get label() { return cliM('cli_featureSchedulerName') } },\n '@h-ai/audit': { configKey: 'audit', get label() { return cliM('cli_featureAuditName') } },\n '@h-ai/payment': { configKey: 'payment', get label() { return cliM('cli_featurePaymentName') } },\n '@h-ai/deploy': { configKey: 'deploy', get label() { return cliM('cli_featureDeployName') } },\n}\n\n/**\n * 校验结果\n * 项目包声明与配置文件存在性的检查结果;不表示连接可用或配置已通过模块 Schema。\n * @example 模块内部上下文\n * ```ts\n * const validation: ValidationResult = { existing: ['core'], missing: [{ pkg: '@h-ai/reldb', configKey: 'db', label: 'Database' }], project: { name: 'shop', version: '1.0.0', isHaiProject: true, haiPackages: ['@h-ai/core', '@h-ai/reldb'] } }\n * ```\n */\ninterface ValidationResult {\n /** 已存在的配置 */\n existing: string[]\n /** 缺失的配置 */\n missing: Array<{ pkg: string, configKey: string, label: string }>\n /** 项目信息 */\n project: ProjectInfo\n}\n\n/**\n * 校验项目配置完整性\n */\nasync function validateProject(cwd: string): Promise<ValidationResult | null> {\n const project = await detectProject(cwd)\n if (!project) {\n return null\n }\n\n const existing: string[] = []\n const missing: ValidationResult['missing'] = []\n\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n if (await fileExists(configPath)) {\n existing.push(mapping.configKey)\n }\n else {\n missing.push({ pkg, configKey: mapping.configKey, label: mapping.label })\n }\n }\n\n return { existing, missing, project }\n}\n\n/**\n * 初始化/校验项目配置\n * force=true 会重新生成已安装模块的配置;文件操作失败抛错,未检测到项目时打印提示并返回。\n * @param options - 命令参数;对应命令的工作目录、非交互与可选功能。\n * @returns 缺失配置补齐或 force 模式覆盖完成。\n * @example 模块内部上下文\n * ```ts\n * // 前提:当前目录已有 hai 项目的 package.json。\n * await initProject({ cwd: process.cwd(), force: false }) // 等价 hai init;只补缺失配置。\n * ```\n */\nexport async function initProject(options: InitOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? '.'\n\n try {\n // 检测项目\n spinner.start(cliM('cli_initDetecting'))\n const result = await validateProject(cwd)\n\n if (!result) {\n spinner.fail(chalk.red(cliM('cli_projectNotFound')))\n return\n }\n\n const { project, existing, missing } = result\n spinner.succeed(cliM('cli_initDetected', { params: { name: chalk.cyan(project.name) } }))\n\n // 即使配置齐备,也补全新增 AI 参考资源;已有项目规则与 Skill 不覆盖。\n if (project.isHaiProject) {\n const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates.js')\n const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {\n overwriteSkills: false,\n overwriteBridgeFiles: false,\n })\n for (const generatedFile of generatedFiles) {\n writeCliMessage(chalk.gray(` + ${generatedFile}`))\n }\n }\n\n // 显示项目状态\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_initStatus')))\n writeCliMessage(cliM('cli_initName', { params: { name: chalk.cyan(project.name) } }))\n writeCliMessage(cliM('cli_initVersion', { params: { version: project.version } }))\n writeCliMessage(cliM('cli_initModules', { params: { modules: project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray(cliM('cli_none')) } }))\n writeCliMessage('')\n\n // 显示配置状态\n if (existing.length > 0) {\n writeCliMessage(chalk.bold(cliM('cli_initExisting')))\n for (const key of existing) {\n writeCliMessage(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_initReady')))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n writeCliMessage('')\n writeCliMessage(chalk.bold(cliM('cli_initMissing')))\n for (const item of missing) {\n writeCliMessage(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n writeCliMessage('')\n\n spinner.start(cliM('cli_initGenerating'))\n let generated = 0\n for (const item of missing) {\n const configPath = path.join(cwd, 'config', `_${item.configKey}.yml`)\n const content = generateConfigFile(item.configKey)\n await writeFile(configPath, content)\n generated++\n }\n spinner.succeed(cliM('cli_initGenerated', { params: { count: generated } }))\n }\n\n // 强制模式:重新生成所有配置\n if (options.force && existing.length > 0) {\n writeCliMessage('')\n spinner.start(cliM('cli_initRegenerating'))\n let regenerated = 0\n for (const pkg of project.haiPackages) {\n const mapping = MODULE_CONFIG_MAP[pkg]\n if (!mapping)\n continue\n const configPath = path.join(cwd, 'config', `_${mapping.configKey}.yml`)\n const content = generateConfigFile(mapping.configKey)\n await writeFile(configPath, content)\n regenerated++\n }\n spinner.succeed(cliM('cli_initRegenerated', { params: { count: regenerated } }))\n }\n\n // 检查 core 配置(始终需要)\n const coreConfigPath = path.join(cwd, 'config', '_core.yml')\n if (!(await fileExists(coreConfigPath))) {\n spinner.start(cliM('cli_initCore'))\n const content = generateConfigFile('core')\n await writeFile(coreConfigPath, content)\n spinner.succeed()\n }\n\n writeCliMessage('')\n writeCliMessage(chalk.green(cliM('cli_initSuccess')))\n writeCliMessage('')\n writeCliMessage(chalk.gray(cliM('cli_nextSteps')))\n writeCliMessage(chalk.gray(cliM('cli_initEditConfig')))\n writeCliMessage(chalk.gray(cliM('cli_initStartDev')))\n writeCliMessage('')\n }\n catch (error) {\n spinner.fail()\n writeCliError(chalk.red(cliM('cli_initFailed')), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 主入口\n *\n * hai Agent Framework CLI\n * @module cli-main\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, FrontendTarget, GeneratorType } from './cli-types.js'\nimport process from 'node:process'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { cliM } from './cli-i18n.js'\nimport { getCliVersion, writeCliMessage } from './cli-utils.js'\nimport { addModule, buildCommand, createProject, deployCommand, generate, initProject } from './commands/cli-commands.js'\n\n// CLI 版本(从 package.json 动态读取,避免硬编码与 npm 发布版本不一致)\nconst VERSION = getCliVersion()\n\n// 创建 CLI\nconst cli = cac('hai')\n\n// 全局选项\ncli.option('-v, --verbose', cliM('cli_help_verbose'))\ncli.option('-C, --cwd <path>', cliM('cli_help_cwd'))\n\n// 创建项目命令\ncli\n .command('create [name]', cliM('cli_help_create'))\n .option('--type <type>', cliM('cli_help_appType'))\n .option('--frontends <targets>', cliM('cli_help_frontends'))\n .option('-t, --template <template>', cliM('cli_help_template'))\n .option('-f, --features <features>', cliM('cli_help_features'))\n .option('--examples', cliM('cli_help_examples'))\n .option('--no-examples', cliM('cli_help_noExamples'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .option('--no-deploy', cliM('cli_help_noDeploy'))\n .option('-p, --package-manager <pm>', cliM('cli_help_packageManager'))\n .option('--no-git', cliM('cli_help_noGit'))\n .option('--git-remote <url>', cliM('cli_help_gitRemote'))\n .option('-y, --yes', cliM('cli_help_yes'))\n .action(async (name: string | undefined, options: Record<string, unknown>) => {\n try {\n // 解析功能列表\n const features = typeof options.features === 'string'\n ? options.features.split(',').map(f => f.trim()) as CreateProjectOptions['features']\n : undefined\n const frontends = typeof options.frontends === 'string'\n ? options.frontends.split(',').map(f => f.trim()).filter(Boolean) as FrontendTarget[]\n : undefined\n\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\n frontends,\n template: options.template as CreateProjectOptions['template'],\n features,\n deploy: options.deploy as boolean,\n examples: options.examples as boolean,\n install: options.install as boolean,\n packageManager: options.packageManager as CreateProjectOptions['packageManager'],\n git: options.git as boolean,\n gitRemote: options.gitRemote as string,\n yes: options.yes as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n // 保留自然退出,让终端/管道中的失败详情写完。\n process.exitCode = 1\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', cliM('cli_help_add'))\n .option('--no-install', cliM('cli_help_noInstall'))\n .action(async (module: string | undefined, options: Record<string, unknown>) => {\n try {\n await addModule({\n module: module as FeatureId,\n install: options.install as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 初始化/校验配置\ncli\n .command('init', cliM('cli_help_init'))\n .option('-f, --force', cliM('cli_help_forceConfig'))\n .action(async (options: Record<string, unknown>) => {\n try {\n await initProject({\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 代码生成命令\ncli\n .command('generate [type] [name]', cliM('cli_help_generate'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .alias('g')\n .option('-o, --output <path>', cliM('cli_help_output'))\n .option('-f, --force', cliM('cli_help_force'))\n .action(async (type: string | undefined, name: string | undefined, options: Record<string, unknown>) => {\n try {\n await generate({\n type: type as GeneratorType,\n name: name ?? '',\n output: options.output as string,\n ...(options.workspace ? { workspace: String(options.workspace) } : {}),\n force: options.force as boolean,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exit(1)\n }\n })\n\n// 构建与部署分别执行;构建不读取部署环境配置。\ncli\n .command('build', cliM('cli_help_build'))\n .option('--target <target>', cliM('cli_help_target'))\n .option('--images <names>', cliM('cli_help_images'))\n .option('--runtime <runtime>', cliM('cli_help_buildRuntime'))\n .option('--network <network>', cliM('cli_help_buildNetwork'))\n .option('--platform <platform>', cliM('cli_help_platform'))\n .option('--arch <arch>', cliM('cli_help_arch'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_sqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_noHttpProxy'))\n .action(async (options: Parameters<typeof buildCommand>[0]) => {\n try {\n await buildCommand(options)\n }\n catch (error) {\n writeCliMessage(error instanceof Error ? error.message : String(error))\n process.exitCode = 1\n }\n })\n\n// 部署命令\ncli\n .command('deploy [appDir]', cliM('cli_help_deploy'))\n .option('--env <environment>', cliM('cli_help_environment'))\n .option('--env-dir <path>', cliM('cli_help_envDir'))\n .option('-y, --yes', cliM('cli_help_deployYes'))\n .option('--project-name <name>', cliM('cli_help_projectName'))\n .option('--skip-middleware', cliM('cli_help_skipMiddleware'))\n .option('--artifact-dir <path>', cliM('cli_help_artifactDir'))\n .option('--services <names>', cliM('cli_help_services'))\n .option('--build', cliM('cli_help_deployBuild'))\n .option('--network <network>', cliM('cli_help_deployNetwork'))\n .option('--sqlite-prebuild-mirror <url>', cliM('cli_help_deploySqliteMirror'))\n .option('--no-http-proxy', cliM('cli_help_deployNoProxy'))\n .option('--runtime <runtime>', cliM('cli_help_deployRuntime'))\n .option('--bundle-only', cliM('cli_help_bundleOnly'))\n .option('--output <path>', cliM('cli_help_bundleOutput'))\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n env: options.env as string,\n envDir: options.envDir as string,\n yes: options.yes as boolean,\n projectName: options.projectName as string,\n skipMiddleware: options.skipMiddleware as boolean,\n artifactDir: options.artifactDir as string,\n services: options.services as string,\n build: options.build as boolean,\n network: options.network as string,\n sqlitePrebuildMirror: options.sqlitePrebuildMirror as string,\n httpProxy: options.httpProxy as boolean,\n runtime: options.runtime as 'auto' | 'podman' | 'docker',\n bundleOnly: options.bundleOnly as boolean,\n output: options.output as string,\n verbose: options.verbose as boolean,\n cwd: options.cwd as string,\n })\n }\n catch {\n process.exitCode = 1\n }\n })\n\n// 快捷生成命令\ncli\n .command('g:page <name>', cliM('cli_help_generatePage'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'page', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:component <name>', cliM('cli_help_generateComponent'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'component', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:api <name>', cliM('cli_help_generateApi'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'api', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\ncli\n .command('g:model <name>', cliM('cli_help_generateModel'))\n .option('-w, --workspace <name>', cliM('cli_help_workspace'))\n .action(async (name: string, options: Record<string, unknown>) => {\n await generate({ type: 'model', name, cwd: options.cwd as string, ...(options.workspace ? { workspace: String(options.workspace) } : {}) })\n })\n\n// 版本和帮助\ncli.version(VERSION, '-V, --version')\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n writeCliMessage('')\n writeCliMessage(chalk.cyan('hai Agent Framework CLI'))\n writeCliMessage('')\n cli.outputHelp()\n}\n"]}