@h-ai/cli 0.1.0-alpha.51 → 0.1.0-alpha.53
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.
- package/dist/index.js +125 -22
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/templates/apps/api/Dockerfile.hbs +6 -3
- package/templates/apps/api/apps/{{projectName}}-service/data/.gitkeep.hbs +1 -0
- package/templates/apps/fullstack/.dockerignore.hbs +2 -0
- package/templates/apps/fullstack/Dockerfile.hbs +23 -36
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +2 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/public/runtime-config.js.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +27 -0
- package/templates/apps/fullstack/docker/19-runtime-config.envsh.hbs +5 -0
- package/templates/apps/fullstack/docker/nginx.conf.hbs +6 -0
- package/templates/apps/fullstack/docker/runtime-config.js.template.hbs +3 -0
- package/templates/apps/fullstack/package.json.hbs +2 -4
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +3 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +9 -1
- package/templates/base/.gitignore.hbs +2 -1
- package/templates/base/Dockerfile.hbs +10 -4
- package/templates/base/package.json.hbs +1 -1
- package/templates/skills/hai-ai/SKILL.md +4 -0
- package/templates/skills/hai-app-create/SKILL.md +3 -1
- package/templates/apps/fullstack/docker/fullstack-server.mjs.hbs +0 -194
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-deploy.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/cli-main.ts"],"names":["fs","path","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","process","ora","core","chalk","prompts","generatedFiles","pkg","execSync"],"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 { fileURLToPath } from 'node:url'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\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 { getCliVersion } from '../cli-utils.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\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.0.0',\n capacitorSecureStorage: '^8.0.0',\n // UI / Icon\n bitsUi: '^2.18.1',\n iconifyJsonTabler: '^1.2.35',\n iconifyTailwind: '^1.2.3',\n // Capacitor\n capacitorAndroid: '^8.3.4',\n capacitorApp: '^8.0.1',\n capacitorCamera: '^8.0.1',\n capacitorCli: '^8.3.4',\n capacitorCore: '^8.3.4',\n capacitorDevice: '^8.0.1',\n capacitorIos: '^8.3.4',\n capacitorPreferences: '^8.0.1',\n capacitorPushNotifications: '^8.0.1',\n capacitorStatusBar: '^8.0.1',\n // Tailwind / DaisyUI\n daisyui: '^5.5.20',\n tailwindcss: '^4.3.0',\n tailwindcssVite: '^4.3.0',\n // i18n\n inlangParaglide: '^2.18.1',\n inlangMessageFormat: '^4.4.0',\n // Svelte / Vite\n svelte: '^5.55.9',\n svelteCheck: '^4.4.8',\n sveltePlugin: '^7.1.2',\n // Build / Test\n vite: '^8.0.14',\n vitest: '^4.1.7',\n tsup: '^8.5.1',\n rimraf: '^6.1.3',\n // ESLint\n eslint: '^10.4.0',\n eslintPluginFormat: '^2.0.1',\n eslintPluginSvelte: '^3.17.1',\n svelteEslintParser: '^1.6.1',\n // Node / TS\n nodeTypes: '^25.9.1',\n typescript: '^6.0.3',\n // E2E\n playwright: '^1.60.0',\n // Validation\n zod: '^4.4.3',\n // Tauri\n tauriCli: '^2.10.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'\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/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/core',\n '@h-ai/serv',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\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/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[] = []\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@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[]): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\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\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n */\nexport interface TemplateContext {\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 /** 是否有 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 /** 依赖版本集合 */\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'],\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}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = 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)\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 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 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 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\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) {\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 // ─── ⑤ 拷贝 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) {\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 normalizedRendered = normalizeRenderedContent(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 { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, writeFile } from '../cli-utils.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: '多包工作区,包含 contract、serv、Web/App/Desktop 前端',\n defaultFeatures: [],\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 'deploy',\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 core.logger.error(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 core.logger.info(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 frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n if (resolvedOptions.appType !== 'fullstack') {\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 configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, '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 content = generateConfigFile(configKey, configs)\n await writeFile(path.join(configDir, `_${configKey}.yml`), content)\n }\n }\n\n if (!isApiWorkspace) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n }\n\n const envExample = isApiWorkspace\n ? `${generateEnvExample(resolvedOptions.features, configs)}\\n# =============================================================================\\n# Service Runtime\\n# =============================================================================\\nPORT=3000\\n`\n : generateEnvExample(resolvedOptions.features, configs)\n\n await writeFile(envExamplePath, envExample)\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 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 core.logger.error(chalk.red('创建项目失败:'), { 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 core.logger.info('', {})\n core.logger.info(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n core.logger.info(chalk.gray(' AI-Native · Configuration-Driven · Security-First'))\n core.logger.info('', {})\n\n const onCancel = () => {\n core.logger.info(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 choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: `${chalk.bold(t.name.padEnd(10))} ${chalk.gray(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 choices: Object.values(PROJECT_TEMPLATES).map(t => ({\n title: `${chalk.bold(t.name.padEnd(10))} ${chalk.gray(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 = []\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: `${chalk.bold(FEATURES[id].name.padEnd(10))} ${chalk.gray(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: '选择功能 (空格选择,回车确认):',\n choices: featureChoices,\n hint: '- 空格选择,回车确认',\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 // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack'\n ? 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 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: '选择前端目标 (空格选择,回车确认):',\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: `${chalk.bold(target.name.padEnd(8))} ${chalk.gray(target.description)}`,\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n hint: '- 小程序当前为预留占位,不生成可运行工程',\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 core.logger.info(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n core.logger.info('')\n core.logger.info(chalk.bold(' ⚙ 模块配置'))\n core.logger.info(chalk.gray(' 设置关键配置项(回车使用默认值)'))\n core.logger.info('')\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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info(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(`安装依赖失败(${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 `命令: ${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' ? `退出码: ${failure.status}` : ''\n const signal = typeof failure.signal === 'string' ? `信号: ${failure.signal}` : ''\n const output = [\n `命令: ${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/**\n * 生成 README\n */\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n const isStaticImage = appType === 'mobile-app'\n const containerPort = isStaticImage ? 8080 : 3000\n const runtimeOptions = isStaticImage\n ? ''\n : ` --env-file .env --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly --mount type=volume,source=${name}-data,target=/app/data`\n const embeddedData = isStaticImage\n ? ''\n : `\n如需把当前 \\`data/\\`(例如预置 SQLite 文件)固化为镜像初始快照:\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'docker:build:data')}\n\\`\\`\\`\n\n运行后产生的新数据仍应写入 \\`/app/data\\` volume;配置文件可挂载到 \\`/app/config\\`,YAML 中的 \\`\\${ENV_NAME:default}\\` 可由 \\`--env-file\\` 或 \\`-e\\` 覆盖。\n`\n return `# ${name}\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n## 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'i18n:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n## Docker\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'docker:build')}\ndocker run --rm -p ${containerPort}:${containerPort}${runtimeOptions} ${name}:latest\n\\`\\`\\`\n${embeddedData}\n\n## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n基于 hai Agent Framework 构建的 typed API workspace。\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## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## Docker\n\n\\`\\`\\`bash\n${pm} docker:build\ndocker run --rm -p 3000:3000 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n\\`\\`\\`\n\n- 配置默认来自 \\`apps/${name}-service/config\\`;运行时可只读挂载到 \\`/app/config\\` 覆盖,并用 YAML 的 \\`\\${ENV_NAME:default}\\` 占位符接收环境变量。\n- 将 SQLite/本地存储文件放在 \\`apps/${name}-service/data\\` 后运行 \\`${pm} docker:build:data\\`,可把该目录作为镜像初始数据;生产写入仍建议使用 \\`/app/data\\` volume。\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## 文档\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\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基于 hai Agent Framework 构建的前后端分离多包工程。\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\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\n# 一键编译:类型检查 + 全工作区构建\n${pm} compile\n\n# 一键打包:Web build、App Capacitor sync、Desktop Tauri build(按启用前端执行)\n${pm} package\n\n# 部署入口:默认执行 package,可替换为团队自己的 CI/CD 发布脚本\n${pm} deploy\n\\`\\`\\`\n\n## Docker\n\n默认镜像把 Web 与 API Service 合并为同源入口,外部端口为 8080:\n\n\\`\\`\\`bash\n${pm} docker:build\ndocker run --rm -p 8080:8080 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/service/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/service/data \\\\\n ${name}:latest\n\\`\\`\\`\n\n- 配置默认来自 \\`packages/${name}-serv/config\\`,也可挂载到 \\`/app/service/config\\`;YAML 中的 \\`\\${ENV_NAME:default}\\` 可由 \\`--env-file\\` 或 \\`-e\\` 注入。\n- 将预置 SQLite/本地存储放入 \\`packages/${name}-serv/data\\` 后运行 \\`${pm} docker:build:data\\`,可生成带初始数据的镜像;持久化写入仍应使用 volume。\n- \\`HAI_WEB_PORT\\` 控制合并镜像的 Web 端口,\\`HAI_SERV_PORT\\` 控制容器内 Service 端口。\n- 需要拆分部署时,使用 \\`${pm} docker:build:service\\`${frontends.includes('web') ? ` 与 \\`${pm} docker:build:web -- --build-arg PUBLIC_API_BASE=https://api.example.com\\`` : ''}。\n\n前端单独交付命令:\n\n- Web:\\`${pm} --filter ${name}-web build\\` / \\`${pm} --filter ${name}-web package\\`\n- App:\\`${pm} --filter ${name}-app package\\`,Android/iOS 可用 \\`cap:build:android:debug\\` / \\`cap:build:android:release\\` / \\`cap:build:ios\\`\n- Desktop:\\`${pm} --filter ${name}-desktop tauri:dev\\` / \\`${pm} --filter ${name}-desktop package\\`\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- 改某个前端页面和文案:编辑对应 \\`apps/${name}-*/src/routes\\` 与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 文档\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/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions>): void {\n core.logger.info('', {})\n core.logger.info(chalk.green('✔ 项目创建成功!'))\n core.logger.info('', {})\n\n // 功能摘要\n if (options.features.length > 0) {\n core.logger.info(chalk.bold('已启用功能:'))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n core.logger.info(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n core.logger.info('', {})\n }\n\n core.logger.info('下一步:')\n core.logger.info(chalk.cyan(` cd ${options.name}`))\n if (!options.install) {\n core.logger.info(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n core.logger.info('', {})\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 { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, getCliVersion, 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 core.logger.error(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 core.logger.info(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 core.logger.error(chalk.red(`未知模块: ${moduleName}`))\n core.logger.info(`可用模块: ${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 core.logger.info(chalk.yellow(`模块 ${moduleName} 已安装,已补全 AI 支持文件`))\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n else {\n core.logger.info(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 (!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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info('')\n core.logger.info(chalk.green(`✔ 模块 ${moduleName} 添加成功!`))\n core.logger.info('')\n core.logger.info('已添加的包:')\n for (const pkg of allPackages) {\n core.logger.info(chalk.cyan(` ${pkg}`))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('添加模块失败:'), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { parse } from 'yaml'\n\n/** deploy 命令选项 */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 应用目录 */\n appDir?: string\n /** 项目名称(覆盖自动检测) */\n projectName?: string\n /** 跳过基础设施开通 */\n skipProvision?: boolean\n /** 跳过构建 */\n skipBuild?: boolean\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n const appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n\n try {\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n deployModule = await import('@h-ai/deploy')\n }\n catch {\n core.logger.error(chalk.red('Deploy module not found. Install @h-ai/deploy first:'))\n core.logger.info(chalk.cyan(' pnpm add @h-ai/deploy'))\n return\n }\n\n const { deploy } = deployModule\n\n // 1. 加载凭证\n spinner.start('Loading credentials...')\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n spinner.fail(chalk.red(`Failed to load credentials: ${credResult.error.message}`))\n return\n }\n spinner.succeed(`Loaded ${credResult.data.length} credentials`)\n\n // 2. 读取部署配置\n spinner.start('Loading deploy config...')\n const configPath = resolve(appDir, 'config', '_deploy.yml')\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(`Deploy config not found: ${configPath}`))\n core.logger.info(chalk.cyan(' Run: hai add deploy to generate config template'))\n return\n }\n\n const configContent = readFileSync(configPath, 'utf-8')\n const rawConfig = interpolateEnvFallback(configContent)\n const deployConfig = parse(rawConfig)\n spinner.succeed('Deploy config loaded')\n\n // 3. 扫描应用\n spinner.start('Scanning application...')\n const scanResult = await deploy.scan(appDir)\n if (!scanResult.success) {\n spinner.fail(chalk.red(`Scan failed: ${scanResult.error.message}`))\n return\n }\n const scan = scanResult.data\n spinner.succeed(`Scanned: ${scan.appName} (SvelteKit: ${scan.isSvelteKit}, Services: ${scan.requiredServices.join(', ') || 'none'})`)\n\n // 4. 初始化 deploy 模块\n spinner.start('Initializing deploy module...')\n const initResult = await deploy.init(deployConfig)\n if (!initResult.success) {\n spinner.fail(chalk.red(`Init failed: ${initResult.error.message}`))\n return\n }\n closeDeploy = () => deploy.close()\n spinner.succeed('Deploy module initialized')\n\n // 5. 执行部署\n spinner.start('Deploying application...')\n const deployResult = await deploy.deployApp(appDir, {\n projectName: options.projectName,\n skipProvision: options.skipProvision,\n skipBuild: options.skipBuild,\n })\n\n if (!deployResult.success) {\n spinner.fail(chalk.red(`Deploy failed: ${deployResult.error.message}`))\n return\n }\n\n spinner.succeed(chalk.green('Deployment successful!'))\n core.logger.info('')\n core.logger.info(chalk.cyan(` URL: ${deployResult.data.url}`))\n core.logger.info(chalk.gray(` ID: ${deployResult.data.deploymentId}`))\n if (deployResult.data.envVarsSet.length > 0) {\n core.logger.info(chalk.gray(` Env: ${deployResult.data.envVarsSet.join(', ')}`))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail(chalk.red('Deploy command failed'))\n core.logger.error(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 core.logger.error('Failed to close deploy module', { error })\n }\n }\n }\n}\n\n/**\n * 简易环境变量插值(fallback,当 core.config.interpolateEnv 不可用时)\n *\n * @param content - 包含 ${VAR:default} 的字符串\n * @returns 插值后的字符串\n */\nfunction interpolateEnvFallback(content: string): string {\n return content.replace(/\\$\\{([^:}]+)(?::([^}]*))?\\}/g, (_match, key: string, defaultValue?: string) => {\n return process.env[key] ?? defaultValue ?? ''\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 { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { createTemplateContext, writeFile } 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: (name: string, context: TemplateContext, outputDir: string) => Promise<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 core.logger.warn(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 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 core.logger.error(chalk.red(`输出路径 \"${resolvedOptions.output}\" 超出工作目录范围`))\n return\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(resolvedOptions.name, context, outputDir)\n\n spinner.succeed()\n\n core.logger.info('', {})\n core.logger.info(chalk.green('✔ 生成完成!'))\n core.logger.info('', {})\n core.logger.info('创建的文件:')\n files.forEach((file) => {\n core.logger.info(chalk.cyan(` ${path.relative(cwd, file)}`))\n })\n core.logger.info('', {})\n }\n catch (error) {\n spinner.fail()\n core.logger.error(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 _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: string[] = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<script lang=\"ts\">\n /**\n * ${context.pascalCase} 页面\n */\n</script>\n\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 await writeFile(pagePath, pageContent)\n files.push(pagePath)\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { PageServerLoad, Actions } from './$types'\n\nexport const load: PageServerLoad = async ({ locals }) => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async ({ request, locals }) => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n await writeFile(serverPath, serverContent)\n files.push(serverPath)\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: string[] = []\n\n // Component.svelte\n const componentContent = `<script lang=\"ts\">\n /**\n * ${context.pascalCase} 组件\n */\n \n interface Props {\n /** 自定义 class */\n class?: string\n }\n \n let { class: className = '' }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n <slot />\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n await writeFile(componentPath, componentContent)\n files.push(componentPath)\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: 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'\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = async ({ locals }) => {\n try {\n const { requestId } = locals\n \n return kit.response.ok({ message: 'Hello from ${context.kebabCase}' }, requestId)\n }\n catch (error) {\n return kit.response.internalError()\n }\n}\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = async ({ request, locals }) => {\n try {\n const { requestId } = locals\n const body = await request.json()\n \n // 处理请求\n \n return kit.response.ok({ success: true }, requestId)\n }\n catch (error) {\n return kit.response.internalError()\n }\n}\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n await writeFile(serverPath, serverContent)\n files.push(serverPath)\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: 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 id: z.string(),\n name: z.string().min(1),\n createdAt: z.date(),\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 await writeFile(modelPath, modelContent)\n files.push(modelPath)\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: string[] = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport type { MigrationFn } from '@h-ai/reldb'\n\nexport const up: MigrationFn = async (db) => {\n // 升级逻辑\n await db.run(\\`\n CREATE TABLE IF NOT EXISTS ${context.snakeCase} (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n \\`)\n}\n\nexport const down: MigrationFn = async (db) => {\n // 回滚逻辑\n await db.run('DROP TABLE IF EXISTS ${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n await writeFile(migrationPath, migrationContent)\n files.push(migrationPath)\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 { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { fileExists, 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 // 显示项目状态\n core.logger.info('')\n core.logger.info(chalk.bold('项目状态:'))\n core.logger.info(` 名称: ${chalk.cyan(project.name)}`)\n core.logger.info(` 版本: ${project.version}`)\n core.logger.info(` 已安装模块: ${project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray('无')}`)\n core.logger.info('')\n\n // 显示配置状态\n if (existing.length > 0) {\n core.logger.info(chalk.bold('已有配置:'))\n for (const key of existing) {\n core.logger.info(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n core.logger.info('')\n core.logger.info(chalk.green('✔ 所有配置文件已就绪!'))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n core.logger.info('')\n core.logger.info(chalk.bold('缺失配置:'))\n for (const item of missing) {\n core.logger.info(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n core.logger.info('')\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 core.logger.info('')\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 core.logger.info('')\n core.logger.info(chalk.green('✔ 项目配置初始化完成!'))\n core.logger.info('')\n core.logger.info(chalk.gray('下一步:'))\n core.logger.info(chalk.gray(' 1. 编辑 config/ 中的配置文件'))\n core.logger.info(chalk.gray(' 2. 运行 pnpm dev 启动开发服务'))\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(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 { core } from '@h-ai/core'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { getCliVersion } from './cli-utils.js'\nimport { addModule, 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', '显示详细输出')\ncli.option('-C, --cwd <path>', '工作目录')\n\n// 创建项目命令\ncli\n .command('create [name]', '创建新的 hai 项目')\n .option('--type <type>', '应用类型 (admin, website, h5, api, mobile-app, fullstack)')\n .option('--frontends <targets>', '前后端分离工程前端目标 (逗号分隔: web,app,miniapp,desktop)')\n .option('-t, --template <template>', '项目模板 (minimal, default, full, custom)')\n .option('-f, --features <features>', '功能列表 (逗号分隔: iam,db,cache,ai,storage,crypto)')\n .option('--examples', '添加示例代码')\n .option('--no-examples', '不添加示例代码')\n .option('--no-install', '不安装依赖')\n .option('-p, --package-manager <pm>', '包管理器 (pnpm, npm, yarn)')\n .option('--no-git', '不初始化 Git')\n .option('--git-remote <url>', 'Git 远程仓库地址')\n .option('-y, --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 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 process.exit(1)\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', '向现有项目添加模块')\n .option('--no-install', '不安装依赖')\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', '初始化/校验项目配置')\n .option('-f, --force', '强制重新生成配置')\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]', '生成代码')\n .alias('g')\n .option('-o, --output <path>', '输出路径')\n .option('-f, --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('deploy [appDir]', '部署应用到云平台')\n .option('--project-name <name>', '项目名称(默认从 package.json 读取)')\n .option('--skip-provision', '跳过基础设施开通')\n .option('--skip-build', '跳过构建')\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n projectName: options.projectName as string,\n skipProvision: options.skipProvision as boolean,\n skipBuild: options.skipBuild 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('g:page <name>', '生成页面')\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>', '生成组件')\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>', '生成 API')\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>', '生成数据模型')\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)\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n core.logger.info('', {})\n core.logger.info(chalk.cyan('hai Agent Framework CLI'))\n core.logger.info('', {})\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-deploy.ts","../src/commands/cli-generate.ts","../src/commands/cli-init.ts","../src/cli-main.ts"],"names":["fs","path","Handlebars","fileURLToPath","DEFAULT_FULLSTACK_FRONTENDS","fse","generateConfigFile","process","ora","core","chalk","prompts","generatedFiles","pkg","execSync"],"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 { fileURLToPath } from 'node:url'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\nconst CAMEL_CASE_SEPARATOR_REGEX = /[-_\\s]+(.)?/g\nconst LEADING_CHAR_REGEX = /^./\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 { getCliVersion } from '../cli-utils.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\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.0.0',\n capacitorSecureStorage: '^8.0.0',\n // UI / Icon\n bitsUi: '^2.18.1',\n iconifyJsonTabler: '^1.2.35',\n iconifyTailwind: '^1.2.3',\n // Capacitor\n capacitorAndroid: '^8.3.4',\n capacitorApp: '^8.0.1',\n capacitorCamera: '^8.0.1',\n capacitorCli: '^8.3.4',\n capacitorCore: '^8.3.4',\n capacitorDevice: '^8.0.1',\n capacitorIos: '^8.3.4',\n capacitorPreferences: '^8.0.1',\n capacitorPushNotifications: '^8.0.1',\n capacitorStatusBar: '^8.0.1',\n // Tailwind / DaisyUI\n daisyui: '^5.5.20',\n tailwindcss: '^4.3.0',\n tailwindcssVite: '^4.3.0',\n // i18n\n inlangParaglide: '^2.18.1',\n inlangMessageFormat: '^4.4.0',\n // Svelte / Vite\n svelte: '^5.55.9',\n svelteCheck: '^4.4.8',\n sveltePlugin: '^7.1.2',\n // Build / Test\n vite: '^8.0.14',\n vitest: '^4.1.7',\n tsup: '^8.5.1',\n rimraf: '^6.1.3',\n // ESLint\n eslint: '^10.4.0',\n eslintPluginFormat: '^2.0.1',\n eslintPluginSvelte: '^3.17.1',\n svelteEslintParser: '^1.6.1',\n // Node / TS\n nodeTypes: '^25.9.1',\n typescript: '^6.0.3',\n // E2E\n playwright: '^1.60.0',\n // Validation\n zod: '^4.4.3',\n // Tauri\n tauriCli: '^2.10.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'\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/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/core',\n '@h-ai/serv',\n] as const\n\nconst FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [\n '@h-ai/api-client',\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/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[] = []\n\n if (options.isSvelteOnlyApp) {\n packageNames.push('@h-ai/api-client', '@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[]): Record<string, string> {\n const packageNames: string[] = [\n ...FULLSTACK_ROOT_CATALOG_PACKAGE_NAMES,\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\n return pickCatalogPackages(packageNames, FULLSTACK_CATALOG_PACKAGES)\n}\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n */\nexport interface TemplateContext {\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 /** 是否有 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 /** 依赖版本集合 */\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'],\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}): TemplateContext {\n const featureMap: Record<string, boolean> = {}\n for (const f of options.features) {\n featureMap[f] = 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)\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 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 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 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\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) {\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 // ─── ⑤ 拷贝 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) {\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 normalizedRendered = normalizeRenderedContent(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 { Buffer } from 'node:buffer'\nimport { execFileSync, execSync } from 'node:child_process'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, writeFile } from '../cli-utils.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: '多包工作区,包含 contract、serv、Web/App/Desktop 前端',\n defaultFeatures: [],\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 'deploy',\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 core.logger.error(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 core.logger.info(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 frontends: resolvedOptions.frontends,\n moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n if (resolvedOptions.appType !== 'fullstack') {\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 configDir = isApiWorkspace\n ? path.join(projectPath, 'apps', `${resolvedOptions.name}-service`, '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 content = generateConfigFile(configKey, configs)\n await writeFile(path.join(configDir, `_${configKey}.yml`), content)\n }\n }\n\n if (!isApiWorkspace) {\n // 始终生成 core 配置\n await writeFile(\n path.join(configDir, '_core.yml'),\n generateConfigFile('core', configs),\n )\n }\n\n const envExample = isApiWorkspace\n ? `${generateEnvExample(resolvedOptions.features, configs)}\\n# =============================================================================\\n# Service Runtime\\n# =============================================================================\\nPORT=3000\\n`\n : generateEnvExample(resolvedOptions.features, configs)\n\n await writeFile(envExamplePath, envExample)\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 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 core.logger.error(chalk.red('创建项目失败:'), { 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 core.logger.info('', {})\n core.logger.info(chalk.bold.cyan(' 🚀 hai Agent Framework'))\n core.logger.info(chalk.gray(' AI-Native · Configuration-Driven · Security-First'))\n core.logger.info('', {})\n\n const onCancel = () => {\n core.logger.info(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 choices: Object.entries(APP_TYPES).map(([key, t]) => ({\n title: `${chalk.bold(t.name.padEnd(10))} ${chalk.gray(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 choices: Object.values(PROJECT_TEMPLATES).map(t => ({\n title: `${chalk.bold(t.name.padEnd(10))} ${chalk.gray(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 = []\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: `${chalk.bold(FEATURES[id].name.padEnd(10))} ${chalk.gray(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: '选择功能 (空格选择,回车确认):',\n choices: featureChoices,\n hint: '- 空格选择,回车确认',\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 // 模块配置\n const moduleConfigs = selectedAppType === 'fullstack'\n ? 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 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: '选择前端目标 (空格选择,回车确认):',\n choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({\n title: `${chalk.bold(target.name.padEnd(8))} ${chalk.gray(target.description)}`,\n value: id,\n selected: DEFAULT_FULLSTACK_FRONTENDS.includes(id as FrontendTarget),\n })),\n hint: '- 小程序当前为预留占位,不生成可运行工程',\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 core.logger.info(chalk.red('\\n已取消'))\n process.exit(1)\n }\n\n core.logger.info('')\n core.logger.info(chalk.bold(' ⚙ 模块配置'))\n core.logger.info(chalk.gray(' 设置关键配置项(回车使用默认值)'))\n core.logger.info('')\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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info(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(`安装依赖失败(${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 `命令: ${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' ? `退出码: ${failure.status}` : ''\n const signal = typeof failure.signal === 'string' ? `信号: ${failure.signal}` : ''\n const output = [\n `命令: ${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/**\n * 生成 README\n */\nfunction generateReadme(name: string, appTypeLabel: string, pm: 'pnpm' | 'npm' | 'yarn', appType: AppType): string {\n const install = getInstallCommand(pm)\n const isStaticImage = appType === 'mobile-app'\n const containerPort = isStaticImage ? 8080 : 3000\n const runtimeOptions = isStaticImage\n ? ''\n : ` --env-file .env --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly --mount type=volume,source=${name}-data,target=/app/data`\n const embeddedDataBuild = isStaticImage\n ? ''\n : `\n# 带 data/ 初始数据构建(二选一)\n${getRunCommand(pm, 'docker:build:data')}\n${getRunCommand(pm, 'podman:build:data')}`\n const runtimeNotes = isStaticImage\n ? '- 该模板生成静态 Web 镜像,不包含可写数据库目录。'\n : `以上三个运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n- 带数据构建会把当前 \\`data/\\`(例如预置 SQLite 文件)固化为镜像初始快照;运行后产生的新数据仍应写入 \\`/app/data\\` volume。`\n const testPath = isStaticImage ? '/health' : '/'\n return `# ${name}\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 开发\n\n\\`\\`\\`bash\n${install}\n${getRunCommand(pm, 'dev')}\n\\`\\`\\`\n\n## 构建\n\n\\`\\`\\`bash\n${getRunCommand(pm, 'build')}\n${getRunCommand(pm, 'i18n:compile')}\n${getRunCommand(pm, 'preview')}\n\\`\\`\\`\n\n## 容器运行\n\n### 构建镜像\n\n\\`\\`\\`bash\n# 普通构建(二选一)\n${getRunCommand(pm, 'docker:build')}\n${getRunCommand(pm, 'podman:build')}${embeddedDataBuild}\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# Docker;使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p ${containerPort}:${containerPort}${runtimeOptions} ${name}:latest\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:${containerPort}${testPath}\ndocker stop ${name}\n\\`\\`\\`\n\n${runtimeNotes}\n\n## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [Svelte 5](https://svelte.dev/)\n`\n}\n\nfunction generateApiWorkspaceReadme(name: string, pm: 'pnpm' | 'npm' | 'yarn'): string {\n return `# ${name}\n\n基于 hai Agent Framework 构建的 typed API workspace。\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## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} build\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 容器运行\n\n### 构建镜像\n\n\\`\\`\\`bash\n# 普通构建(二选一)\n${pm} docker:build\n${pm} podman:build\n\n# 将 apps/${name}-service/data 作为镜像初始数据构建(二选一)\n${pm} docker:build:data\n${pm} podman:build:data\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# 使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p 3000:3000 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:3000/health\ncurl --fail http://127.0.0.1:3000/ready\ncurl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\\\\n --header \"Content-Type: application/json\" --data '{}'\ndocker stop ${name}\n\\`\\`\\`\n\n- 配置默认来自 \\`apps/${name}-service/config\\`;运行时可只读挂载到 \\`/app/config\\` 覆盖,并用 YAML 的 \\`\\${ENV_NAME:default}\\` 占位符接收环境变量。\n- 带数据构建会把 \\`apps/${name}-service/data\\` 固化为镜像初始数据;生产写入仍建议使用 \\`/app/data\\` volume。\n\n以上三个运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\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## 文档\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\nfunction generateFullstackReadme(name: string, pm: string, frontends: FrontendTarget[]): string {\n const enabledFrontends = frontends.map(target => FRONTEND_TARGETS[target].name).join(' / ')\n const webBuildCommands = frontends.includes('web')\n ? `\n# Web 静态镜像(二选一)\n${pm} docker:build:web\n${pm} podman:build:web`\n : ''\n const webRunCommand = frontends.includes('web')\n ? `\n\n# Web;PUBLIC_API_BASE 在容器启动时注入,不需要重新构建镜像\ndocker run --rm -d --name ${name}-web -p 8080:8080 \\\\\n -e PUBLIC_API_BASE=https://api.example.com \\\\\n ${name}-web:latest`\n : ''\n const webTestCommands = frontends.includes('web')\n ? `curl --fail http://127.0.0.1:8080/health\ncurl --fail http://127.0.0.1:8080/runtime-config.js\n`\n : ''\n const containerNames = frontends.includes('web') ? `${name} ${name}-web` : name\n return `# ${name}\n\n基于 hai Agent Framework 构建的前后端分离多包工程。\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\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\n# 一键编译:类型检查 + 全工作区构建\n${pm} compile\n\n# 一键打包:Web build、App Capacitor sync、Desktop Tauri build(按启用前端执行)\n${pm} package\n\n# 部署入口:默认执行 package,可替换为团队自己的 CI/CD 发布脚本\n${pm} deploy\n\\`\\`\\`\n\n## 容器运行\n\n默认镜像直接运行 API Service,外部端口为 3000。\n\n### 构建镜像\n\n\\`\\`\\`bash\n# Service 普通构建(二选一)\n${pm} docker:build\n${pm} podman:build\n\n# 将 packages/${name}-serv/data 作为镜像初始数据构建(二选一)\n${pm} docker:build:data\n${pm} podman:build:data\n${webBuildCommands}\n\\`\\`\\`\n\n### 运行镜像\n\n\\`\\`\\`bash\n# Service;使用 Podman 时将 docker 替换为 podman\ndocker run --rm -d --name ${name} -p 3000:3000 --env-file .env \\\\\n --mount type=bind,source=/absolute/path/to/config,target=/app/config,readonly \\\\\n --mount type=volume,source=${name}-data,target=/app/data \\\\\n ${name}:latest\n${webRunCommand}\n\\`\\`\\`\n\n### 测试镜像\n\n\\`\\`\\`bash\ncurl --fail http://127.0.0.1:3000/health\ncurl --fail http://127.0.0.1:3000/ready\ncurl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\\\\n --header \"Content-Type: application/json\" --data '{}'\n${webTestCommands}docker stop ${containerNames}\n\\`\\`\\`\n\n- 配置默认来自 \\`packages/${name}-serv/config\\`,也可挂载到 \\`/app/config\\`;YAML 中的 \\`\\${ENV_NAME:default}\\` 可由 \\`--env-file\\` 或 \\`-e\\` 注入。\n- 带数据构建会把 \\`packages/${name}-serv/data\\` 固化为镜像初始数据;持久化写入仍应使用 volume。\n- Service 由 \\`@h-ai/serv\\` 直接对外监听,不额外启动 Web 转发层。\n${frontends.includes('web') ? `- Web 使用独立静态镜像并支持一次构建、多环境部署;构建只需运行 \\`${pm} docker:build:web\\`,启动容器时通过 \\`-e PUBLIC_API_BASE=https://api.example.com\\` 指向 Service 对外地址。未设置时默认使用 Web 页面自身 origin。` : ''}\n\n以上三个 Service 运行时参数均可按需删除:\n\n| 参数 | 用途 | 可选性 |\n| --- | --- | --- |\n| \\`--env-file .env\\` | 批量传入环境变量;也可改用多个 \\`-e NAME=value\\`。 | 可选;删除后使用镜像和 YAML 默认值。 |\n| \\`--mount type=bind,...target=/app/config,readonly\\` | 用宿主机配置目录覆盖镜像内 \\`/app/config\\`;必须把 \\`source\\` 改成真实绝对路径,\\`readonly\\` 防止容器修改配置。 | 可选;删除后使用镜像自带配置。 |\n| \\`--mount type=volume,...target=/app/data\\` | 创建或复用 named volume,持久化 SQLite 和本地存储。 | 可选但生产环境建议保留;删除后数据只写入容器层,使用 \\`--rm\\` 删除容器时会丢失。 |\n\n前端单独交付命令:\n\n- Web:\\`${pm} --filter ${name}-web build\\` / \\`${pm} --filter ${name}-web package\\`\n- App:\\`${pm} --filter ${name}-app package\\`,Android/iOS 可用 \\`cap:build:android:debug\\` / \\`cap:build:android:release\\` / \\`cap:build:ios\\`\n- Desktop:\\`${pm} --filter ${name}-desktop tauri:dev\\` / \\`${pm} --filter ${name}-desktop package\\`\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- 改某个前端页面和文案:编辑对应 \\`apps/${name}-*/src/routes\\` 与 \\`apps/${name}-*/messages\\`。\n- 改主题列表:调整脚手架配置中的 \\`fullstack.theme.themes\\`,或直接编辑各端 \\`src/app.css\\` 的 daisyUI \\`themes\\`。\n\n## 质量门禁\n\n\\`\\`\\`bash\n${pm} typecheck\n${pm} lint\n${pm} test\n${pm} test:e2e\n\\`\\`\\`\n\n## 文档\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/**\n * 打印完成提示\n */\nfunction printCompletionMessage(options: Required<CreateProjectOptions>): void {\n core.logger.info('', {})\n core.logger.info(chalk.green('✔ 项目创建成功!'))\n core.logger.info('', {})\n\n // 功能摘要\n if (options.features.length > 0) {\n core.logger.info(chalk.bold('已启用功能:'))\n for (const featureId of options.features) {\n const feature = FEATURES[featureId]\n if (feature) {\n core.logger.info(chalk.gray(` • ${feature.name} (${featureId})`))\n }\n }\n core.logger.info('', {})\n }\n\n core.logger.info('下一步:')\n core.logger.info(chalk.cyan(` cd ${options.name}`))\n if (!options.install) {\n core.logger.info(chalk.cyan(` ${getInstallCommand(options.packageManager)}`))\n }\n if (options.appType === 'fullstack' || options.appType === 'api') {\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'typecheck')}`))\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'test')}`))\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'test:e2e')}`))\n }\n else {\n core.logger.info(chalk.cyan(` ${getRunCommand(options.packageManager, 'dev')}`))\n }\n core.logger.info('', {})\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 { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport fse from 'fs-extra'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { detectPackageManager, fileExists, getCliVersion, 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 core.logger.error(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 core.logger.info(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 core.logger.error(chalk.red(`未知模块: ${moduleName}`))\n core.logger.info(`可用模块: ${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 core.logger.info(chalk.yellow(`模块 ${moduleName} 已安装,已补全 AI 支持文件`))\n for (const generatedFile of generatedFiles) {\n core.logger.info(chalk.gray(` + ${generatedFile} (AI support)`))\n }\n }\n else {\n core.logger.info(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 (!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 core.logger.info(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 core.logger.info(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 core.logger.info(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 core.logger.info('')\n core.logger.info(chalk.green(`✔ 模块 ${moduleName} 添加成功!`))\n core.logger.info('')\n core.logger.info('已添加的包:')\n for (const pkg of allPackages) {\n core.logger.info(chalk.cyan(` ${pkg}`))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(chalk.red('添加模块失败:'), { error })\n throw error\n }\n}\n","/**\n * @h-ai/cli — 部署命令\n *\n * 使用: hai deploy [appDir]\n * @module cli-deploy\n */\n\nimport type { GlobalOptions } from '../cli-types.js'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { parse } from 'yaml'\n\n/** deploy 命令选项 */\nexport interface DeployCommandOptions extends GlobalOptions {\n /** 应用目录 */\n appDir?: string\n /** 项目名称(覆盖自动检测) */\n projectName?: string\n /** 跳过基础设施开通 */\n skipProvision?: boolean\n /** 跳过构建 */\n skipBuild?: boolean\n}\n\n/**\n * 执行部署命令\n *\n * @param options - 部署选项\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const spinner = ora()\n const cwd = options.cwd ?? process.cwd()\n const appDir = resolve(cwd, options.appDir ?? '.')\n let closeDeploy: (() => Promise<void>) | null = null\n\n try {\n // 动态导入 @h-ai/deploy(允许 CLI 在未安装 deploy 时仍可使用其他命令)\n let deployModule: typeof import('@h-ai/deploy')\n try {\n deployModule = await import('@h-ai/deploy')\n }\n catch {\n core.logger.error(chalk.red('Deploy module not found. Install @h-ai/deploy first:'))\n core.logger.info(chalk.cyan(' pnpm add @h-ai/deploy'))\n return\n }\n\n const { deploy } = deployModule\n\n // 1. 加载凭证\n spinner.start('Loading credentials...')\n const credResult = deploy.credentials.load()\n if (!credResult.success) {\n spinner.fail(chalk.red(`Failed to load credentials: ${credResult.error.message}`))\n return\n }\n spinner.succeed(`Loaded ${credResult.data.length} credentials`)\n\n // 2. 读取部署配置\n spinner.start('Loading deploy config...')\n const configPath = resolve(appDir, 'config', '_deploy.yml')\n if (!existsSync(configPath)) {\n spinner.fail(chalk.red(`Deploy config not found: ${configPath}`))\n core.logger.info(chalk.cyan(' Run: hai add deploy to generate config template'))\n return\n }\n\n const configContent = readFileSync(configPath, 'utf-8')\n const rawConfig = interpolateEnvFallback(configContent)\n const deployConfig = parse(rawConfig)\n spinner.succeed('Deploy config loaded')\n\n // 3. 扫描应用\n spinner.start('Scanning application...')\n const scanResult = await deploy.scan(appDir)\n if (!scanResult.success) {\n spinner.fail(chalk.red(`Scan failed: ${scanResult.error.message}`))\n return\n }\n const scan = scanResult.data\n spinner.succeed(`Scanned: ${scan.appName} (SvelteKit: ${scan.isSvelteKit}, Services: ${scan.requiredServices.join(', ') || 'none'})`)\n\n // 4. 初始化 deploy 模块\n spinner.start('Initializing deploy module...')\n const initResult = await deploy.init(deployConfig)\n if (!initResult.success) {\n spinner.fail(chalk.red(`Init failed: ${initResult.error.message}`))\n return\n }\n closeDeploy = () => deploy.close()\n spinner.succeed('Deploy module initialized')\n\n // 5. 执行部署\n spinner.start('Deploying application...')\n const deployResult = await deploy.deployApp(appDir, {\n projectName: options.projectName,\n skipProvision: options.skipProvision,\n skipBuild: options.skipBuild,\n })\n\n if (!deployResult.success) {\n spinner.fail(chalk.red(`Deploy failed: ${deployResult.error.message}`))\n return\n }\n\n spinner.succeed(chalk.green('Deployment successful!'))\n core.logger.info('')\n core.logger.info(chalk.cyan(` URL: ${deployResult.data.url}`))\n core.logger.info(chalk.gray(` ID: ${deployResult.data.deploymentId}`))\n if (deployResult.data.envVarsSet.length > 0) {\n core.logger.info(chalk.gray(` Env: ${deployResult.data.envVarsSet.join(', ')}`))\n }\n core.logger.info('')\n }\n catch (error) {\n spinner.fail(chalk.red('Deploy command failed'))\n core.logger.error(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 core.logger.error('Failed to close deploy module', { error })\n }\n }\n }\n}\n\n/**\n * 简易环境变量插值(fallback,当 core.config.interpolateEnv 不可用时)\n *\n * @param content - 包含 ${VAR:default} 的字符串\n * @returns 插值后的字符串\n */\nfunction interpolateEnvFallback(content: string): string {\n return content.replace(/\\$\\{([^:}]+)(?::([^}]*))?\\}/g, (_match, key: string, defaultValue?: string) => {\n return process.env[key] ?? defaultValue ?? ''\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 { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport prompts from 'prompts'\nimport { createTemplateContext, writeFile } 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: (name: string, context: TemplateContext, outputDir: string) => Promise<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 core.logger.warn(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 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 core.logger.error(chalk.red(`输出路径 \"${resolvedOptions.output}\" 超出工作目录范围`))\n return\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(resolvedOptions.name, context, outputDir)\n\n spinner.succeed()\n\n core.logger.info('', {})\n core.logger.info(chalk.green('✔ 生成完成!'))\n core.logger.info('', {})\n core.logger.info('创建的文件:')\n files.forEach((file) => {\n core.logger.info(chalk.cyan(` ${path.relative(cwd, file)}`))\n })\n core.logger.info('', {})\n }\n catch (error) {\n spinner.fail()\n core.logger.error(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 _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: string[] = []\n const pageDir = path.join(outputDir, context.kebabCase)\n\n // +page.svelte\n const pageContent = `<script lang=\"ts\">\n /**\n * ${context.pascalCase} 页面\n */\n</script>\n\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 await writeFile(pagePath, pageContent)\n files.push(pagePath)\n\n // +page.server.ts\n const serverContent = `/**\n * ${context.pascalCase} 页面服务端\n */\nimport type { PageServerLoad, Actions } from './$types'\n\nexport const load: PageServerLoad = async ({ locals }) => {\n return {\n // 页面数据\n }\n}\n\nexport const actions: Actions = {\n default: async ({ request, locals }) => {\n // 表单处理\n },\n}\n`\n\n const serverPath = path.join(pageDir, '+page.server.ts')\n await writeFile(serverPath, serverContent)\n files.push(serverPath)\n\n return files\n}\n\n/**\n * 生成组件\n */\nasync function generateComponent(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: string[] = []\n\n // Component.svelte\n const componentContent = `<script lang=\"ts\">\n /**\n * ${context.pascalCase} 组件\n */\n \n interface Props {\n /** 自定义 class */\n class?: string\n }\n \n let { class: className = '' }: Props = $props()\n</script>\n\n<div class={className}>\n <!-- 组件内容 -->\n <slot />\n</div>\n`\n\n const componentPath = path.join(outputDir, `${context.pascalCase}.svelte`)\n await writeFile(componentPath, componentContent)\n files.push(componentPath)\n\n return files\n}\n\n/**\n * 生成 API 端点\n */\nasync function generateApi(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: 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'\n\n/**\n * GET ${context.kebabCase}\n */\nexport const GET: RequestHandler = async ({ locals }) => {\n try {\n const { requestId } = locals\n \n return kit.response.ok({ message: 'Hello from ${context.kebabCase}' }, requestId)\n }\n catch (error) {\n return kit.response.internalError()\n }\n}\n\n/**\n * POST ${context.kebabCase}\n */\nexport const POST: RequestHandler = async ({ request, locals }) => {\n try {\n const { requestId } = locals\n const body = await request.json()\n \n // 处理请求\n \n return kit.response.ok({ success: true }, requestId)\n }\n catch (error) {\n return kit.response.internalError()\n }\n}\n`\n\n const serverPath = path.join(apiDir, '+server.ts')\n await writeFile(serverPath, serverContent)\n files.push(serverPath)\n\n return files\n}\n\n/**\n * 生成数据模型\n */\nasync function generateModel(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: 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 id: z.string(),\n name: z.string().min(1),\n createdAt: z.date(),\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 await writeFile(modelPath, modelContent)\n files.push(modelPath)\n\n return files\n}\n\n/**\n * 生成迁移\n */\nasync function generateMigration(\n _name: string,\n context: TemplateContext,\n outputDir: string,\n): Promise<string[]> {\n const files: string[] = []\n const timestamp = Date.now()\n\n // migration.ts\n const migrationContent = `/**\n * 迁移: ${context.pascalCase}\n * 时间: ${new Date().toISOString()}\n */\nimport type { MigrationFn } from '@h-ai/reldb'\n\nexport const up: MigrationFn = async (db) => {\n // 升级逻辑\n await db.run(\\`\n CREATE TABLE IF NOT EXISTS ${context.snakeCase} (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n \\`)\n}\n\nexport const down: MigrationFn = async (db) => {\n // 回滚逻辑\n await db.run('DROP TABLE IF EXISTS ${context.snakeCase}')\n}\n`\n\n const migrationPath = path.join(outputDir, `${timestamp}_${context.snakeCase}.ts`)\n await writeFile(migrationPath, migrationContent)\n files.push(migrationPath)\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 { core } from '@h-ai/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { fileExists, 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 // 显示项目状态\n core.logger.info('')\n core.logger.info(chalk.bold('项目状态:'))\n core.logger.info(` 名称: ${chalk.cyan(project.name)}`)\n core.logger.info(` 版本: ${project.version}`)\n core.logger.info(` 已安装模块: ${project.haiPackages.length > 0 ? project.haiPackages.map(p => chalk.cyan(p)).join(', ') : chalk.gray('无')}`)\n core.logger.info('')\n\n // 显示配置状态\n if (existing.length > 0) {\n core.logger.info(chalk.bold('已有配置:'))\n for (const key of existing) {\n core.logger.info(chalk.green(` ✔ config/_${key}.yml`))\n }\n }\n\n // 无缺失配置\n if (missing.length === 0 && !options.force) {\n core.logger.info('')\n core.logger.info(chalk.green('✔ 所有配置文件已就绪!'))\n return\n }\n\n // 补全缺失配置\n if (missing.length > 0) {\n core.logger.info('')\n core.logger.info(chalk.bold('缺失配置:'))\n for (const item of missing) {\n core.logger.info(chalk.yellow(` ✘ config/_${item.configKey}.yml (${item.label})`))\n }\n core.logger.info('')\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 core.logger.info('')\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 core.logger.info('')\n core.logger.info(chalk.green('✔ 项目配置初始化完成!'))\n core.logger.info('')\n core.logger.info(chalk.gray('下一步:'))\n core.logger.info(chalk.gray(' 1. 编辑 config/ 中的配置文件'))\n core.logger.info(chalk.gray(' 2. 运行 pnpm dev 启动开发服务'))\n core.logger.info('')\n }\n catch (error) {\n spinner.fail()\n core.logger.error(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 { core } from '@h-ai/core'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { getCliVersion } from './cli-utils.js'\nimport { addModule, 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', '显示详细输出')\ncli.option('-C, --cwd <path>', '工作目录')\n\n// 创建项目命令\ncli\n .command('create [name]', '创建新的 hai 项目')\n .option('--type <type>', '应用类型 (admin, website, h5, api, mobile-app, fullstack)')\n .option('--frontends <targets>', '前后端分离工程前端目标 (逗号分隔: web,app,miniapp,desktop)')\n .option('-t, --template <template>', '项目模板 (minimal, default, full, custom)')\n .option('-f, --features <features>', '功能列表 (逗号分隔: iam,db,cache,ai,storage,crypto)')\n .option('--examples', '添加示例代码')\n .option('--no-examples', '不添加示例代码')\n .option('--no-install', '不安装依赖')\n .option('-p, --package-manager <pm>', '包管理器 (pnpm, npm, yarn)')\n .option('--no-git', '不初始化 Git')\n .option('--git-remote <url>', 'Git 远程仓库地址')\n .option('-y, --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 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 process.exit(1)\n }\n })\n\n// 增量添加模块\ncli\n .command('add [module]', '向现有项目添加模块')\n .option('--no-install', '不安装依赖')\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', '初始化/校验项目配置')\n .option('-f, --force', '强制重新生成配置')\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]', '生成代码')\n .alias('g')\n .option('-o, --output <path>', '输出路径')\n .option('-f, --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('deploy [appDir]', '部署应用到云平台')\n .option('--project-name <name>', '项目名称(默认从 package.json 读取)')\n .option('--skip-provision', '跳过基础设施开通')\n .option('--skip-build', '跳过构建')\n .action(async (appDir: string | undefined, options: Record<string, unknown>) => {\n try {\n await deployCommand({\n appDir,\n projectName: options.projectName as string,\n skipProvision: options.skipProvision as boolean,\n skipBuild: options.skipBuild 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('g:page <name>', '生成页面')\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>', '生成组件')\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>', '生成 API')\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>', '生成数据模型')\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)\ncli.help()\n\n// 解析参数\nconst parsed = cli.parse()\n\n// 无命令且未请求帮助/版本时显示帮助\nif (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {\n core.logger.info('', {})\n core.logger.info(chalk.cyan('hai Agent Framework CLI'))\n core.logger.info('', {})\n cli.outputHelp()\n}\n"]}
|