@h-ai/cli 0.1.0-alpha5
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/LICENSE +202 -0
- package/README.md +167 -0
- package/dist/chunk-2H7UOFLK.js +10 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/chunk-LANIDJC7.js +659 -0
- package/dist/chunk-LANIDJC7.js.map +1 -0
- package/dist/chunk-YV7WPUI6.js +206 -0
- package/dist/chunk-YV7WPUI6.js.map +1 -0
- package/dist/config-templates-S5RI2MC6.js +5 -0
- package/dist/config-templates-S5RI2MC6.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1645 -0
- package/dist/index.js.map +1 -0
- package/dist/skill-templates-N5DU5FNX.js +5 -0
- package/dist/skill-templates-N5DU5FNX.js.map +1 -0
- package/dist/src-XJ6YXNAF.js +15030 -0
- package/dist/src-XJ6YXNAF.js.map +1 -0
- package/package.json +59 -0
- package/templates/README.md +126 -0
- package/templates/apps/admin/messages/en-US.json +33 -0
- package/templates/apps/admin/messages/zh-CN.json +33 -0
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +30 -0
- package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -0
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +44 -0
- package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +45 -0
- package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +37 -0
- package/templates/apps/admin/src/routes/api/health/+server.ts +12 -0
- package/templates/apps/android-app/.env.hbs +3 -0
- package/templates/apps/android-app/capacitor.config.ts.hbs +12 -0
- package/templates/apps/android-app/messages/en-US.json +24 -0
- package/templates/apps/android-app/messages/zh-CN.json +24 -0
- package/templates/apps/android-app/src/lib/api.ts.hbs +30 -0
- package/templates/apps/android-app/src/lib/capacitor.ts +21 -0
- package/templates/apps/android-app/src/routes/+layout.svelte.hbs +42 -0
- package/templates/apps/android-app/src/routes/+layout.ts +7 -0
- package/templates/apps/android-app/src/routes/+page.svelte.hbs +27 -0
- package/templates/apps/api/src/routes/+layout.svelte +14 -0
- package/templates/apps/api/src/routes/+page.svelte +11 -0
- package/templates/apps/api/src/routes/api/v1/health/+server.ts +14 -0
- package/templates/apps/api/src/routes/api/v1/items/+server.ts +37 -0
- package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +30 -0
- package/templates/apps/h5/messages/en-US.json +37 -0
- package/templates/apps/h5/messages/zh-CN.json +37 -0
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +57 -0
- package/templates/apps/h5/src/routes/+page.svelte.hbs +27 -0
- package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +27 -0
- package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +27 -0
- package/templates/apps/website/messages/en-US.json +32 -0
- package/templates/apps/website/messages/zh-CN.json +32 -0
- package/templates/apps/website/src/routes/+layout.svelte.hbs +66 -0
- package/templates/apps/website/src/routes/+page.svelte.hbs +33 -0
- package/templates/apps/website/src/routes/about/+page.svelte.hbs +27 -0
- package/templates/apps/website/src/routes/api/health/+server.ts +12 -0
- package/templates/apps/website/src/routes/contact/+page.svelte.hbs +59 -0
- package/templates/apps/website/src/routes/services/+page.svelte.hbs +63 -0
- package/templates/base/e2e/helpers.ts +49 -0
- package/templates/base/package.json.hbs +67 -0
- package/templates/base/playwright.config.ts +32 -0
- package/templates/base/src/app.css +2 -0
- package/templates/base/src/app.d.ts.hbs +18 -0
- package/templates/base/src/app.html.hbs +16 -0
- package/templates/base/src/hooks.server.ts.hbs +123 -0
- package/templates/base/src/lib/server/init.ts.hbs +190 -0
- package/templates/base/svelte.config.js.hbs +30 -0
- package/templates/base/tsconfig.json +8 -0
- package/templates/base/vite.config.ts.hbs +27 -0
- package/templates/features/ai/routes/api/chat/+server.ts +26 -0
- package/templates/features/datapipe/routes/api/datapipe/pipeline/+server.ts +41 -0
- package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +21 -0
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +98 -0
- package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +124 -0
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +98 -0
- package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +114 -0
- package/templates/features/iam/routes-shared/api/auth/login/+server.ts +32 -0
- package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +15 -0
- package/templates/features/iam/routes-shared/api/auth/me/+server.ts +12 -0
- package/templates/features/iam/routes-shared/api/auth/register/+server.ts +26 -0
- package/templates/features/payment/routes/api/v1/payment/create/+server.ts +30 -0
- package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +42 -0
- package/templates/features/payment/routes/api/v1/payment/query/[orderNo]/+server.ts +25 -0
- package/templates/features/storage/routes/api/upload/+server.ts +35 -0
- package/templates/features/vecdb/routes/api/vecdb/search/+server.ts +36 -0
- package/templates/i18n/project.inlang/settings.json +11 -0
- package/templates/skills/AGENTS.md +26 -0
- package/templates/skills/CLAUDE.md +12 -0
- package/templates/skills/copilot-instructions.md +61 -0
- package/templates/skills/hai-ai/SKILL.md +659 -0
- package/templates/skills/hai-api-client/SKILL.md +346 -0
- package/templates/skills/hai-app-create/SKILL.md +371 -0
- package/templates/skills/hai-app-review/SKILL.md +156 -0
- package/templates/skills/hai-app-tests/SKILL.md +468 -0
- package/templates/skills/hai-audit/SKILL.md +141 -0
- package/templates/skills/hai-build/SKILL.md +319 -0
- package/templates/skills/hai-cache/SKILL.md +184 -0
- package/templates/skills/hai-capacitor/SKILL.md +389 -0
- package/templates/skills/hai-core/SKILL.md +544 -0
- package/templates/skills/hai-crypto/SKILL.md +183 -0
- package/templates/skills/hai-datapipe/SKILL.md +214 -0
- package/templates/skills/hai-deploy/SKILL.md +210 -0
- package/templates/skills/hai-iam/SKILL.md +355 -0
- package/templates/skills/hai-kit/SKILL.md +319 -0
- package/templates/skills/hai-payment/SKILL.md +289 -0
- package/templates/skills/hai-reach/SKILL.md +325 -0
- package/templates/skills/hai-reldb/SKILL.md +459 -0
- package/templates/skills/hai-scheduler/SKILL.md +242 -0
- package/templates/skills/hai-storage/SKILL.md +230 -0
- package/templates/skills/hai-ui/SKILL.md +275 -0
- package/templates/skills/hai-vecdb/SKILL.md +273 -0
- package/templates/skills/opencode.json +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/commands/template-engine.ts","../src/commands/create.ts","../src/commands/add.ts","../src/commands/deploy.ts","../src/commands/generate.ts","../src/commands/init.ts","../src/index.ts"],"names":["fs","path","Handlebars","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 utils\n */\n\nimport type { TemplateContext } from './types.js'\nimport path from 'node:path'\nimport fs from 'fs-extra'\nimport Handlebars from 'handlebars'\n\n/**\n * 转换为驼峰命名\n */\nexport function toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '')\n .replace(/^./, 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 * 检测包管理器\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 template-engine\n */\n\nimport type { AppType, FeatureId, ModuleConfigs } from '../types.js'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport fse from 'fs-extra'\nimport Handlebars from 'handlebars'\n\n// =============================================================================\n// 类型\n// =============================================================================\n\n/**\n * 模板渲染上下文\n */\nexport interface TemplateContext {\n /** 项目名称 */\n projectName: string\n /** 应用类型 */\n appType: AppType\n /** 选中的 feature 集合(用于 {{#if features.xxx}}) */\n features: Record<string, boolean>\n /** 是否有 UI(非 api 类型) */\n hasUi: boolean\n /** 是否有 i18n(非 api 类型) */\n hasI18n: boolean\n /** 是否为 Capacitor 原生应用(android-app) */\n isCapacitorApp: boolean\n /** 默认语言 */\n defaultLocale: string\n /** 包管理器 */\n packageManager: string\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\n// =============================================================================\n// 路径工具\n// =============================================================================\n\n/**\n * 获取 templates/ 目录的绝对路径\n *\n * 兼容两种运行环境:\n * - 构建后:dist/template-engine.js → ../templates\n * - 测试时:src/commands/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 // 跳过 .hbs 模板文件\n if (filePath.endsWith('.hbs')) {\n return false\n }\n // 跳过排除路径\n if (excludePaths && excludePaths.length > 0) {\n const rel = path.relative(src, filePath)\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\n/**\n * 根据用户选项构建模板渲染上下文\n */\nexport function buildTemplateContext(options: {\n name: string\n appType: AppType\n features: FeatureId[]\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 isCapacitorApp = options.appType === 'android-app'\n\n return {\n projectName: options.name,\n appType: options.appType,\n features: featureMap,\n hasUi: !isApi,\n hasI18n: !isApi,\n isCapacitorApp,\n defaultLocale: options.moduleConfigs?.core?.defaultLocale ?? 'zh-CN',\n packageManager: options.packageManager,\n }\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\n // ─── ① 拷贝 base 骨架(静态文件) ───\n await copyStaticDir(path.join(root, 'base'), projectPath)\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 for (const featureId of Object.keys(context.features)) {\n if (!context.features[featureId]) {\n continue\n }\n\n // 安全校验:featureId 只允许字母、数字和连字符,防止路径遍历\n if (!/^[a-z0-9-]+$/.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 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 // ─── ④ 渲染 .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 await fse.ensureDir(path.join(projectPath, 'static'))\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 = [\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 }\n\n // ── feature 路由 → 输出到 src/routes/ ──\n const routesDest = path.join(projectPath, 'src', 'routes')\n for (const featureId of Object.keys(context.features)) {\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 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 outRelPath = relPath.replace(/\\.hbs$/, '')\n const destPath = path.join(destRoot, outRelPath)\n\n const template = await fse.readFile(srcPath, 'utf-8')\n const compiled = Handlebars.compile(template, { noEscape: true })\n const rendered = compiled(context)\n\n await fse.ensureDir(path.dirname(destPath))\n await fse.writeFile(destPath, rendered, 'utf-8')\n }\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 create\n */\n\nimport type { AppType, CreateProjectOptions, FeatureDefinition, FeatureId, ModuleConfigs, ProjectInfo } from '../types.js'\nimport { 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 '../utils.js'\nimport { buildTemplateContext, generateFromTemplates } from './template-engine.js'\n\n// =============================================================================\n// 应用类型定义\n// =============================================================================\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: '纯 API 后端服务,RESTful 路由、无 UI',\n defaultFeatures: ['db', 'cache'],\n },\n 'android-app': {\n name: 'Android 应用',\n description: 'Android 原生应用(Capacitor + SvelteKit SPA),可打包为 APK',\n defaultFeatures: ['iam', 'db', 'cache', 'crypto', 'api-client', 'capacitor'],\n },\n}\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\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 (!/^[a-z0-9-]+$/.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 moduleConfigs: resolvedOptions.moduleConfigs,\n packageManager: resolvedOptions.packageManager!,\n })\n\n // 拷贝模板 + 渲染动态文件\n await generateFromTemplates(projectPath, context)\n\n // 生成配置文件(config/*.yml)\n const { generateConfigFile } = await import('./config-templates.js')\n const configs = resolvedOptions.moduleConfigs\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(projectPath, 'config', `_${configKey}.yml`), content)\n }\n }\n // 始终生成 core 配置\n await writeFile(\n path.join(projectPath, 'config', '_core.yml'),\n generateConfigFile('core', configs),\n )\n\n // 生成 .env.example\n const { generateEnvExample } = await import('./config-templates.js')\n await writeFile(\n path.join(projectPath, '.env.example'),\n generateEnvExample(resolvedOptions.features, configs),\n )\n\n // 生成 Skill 文件\n const { generateSkillFiles } = await import('./skill-templates.js')\n await generateSkillFiles(projectPath, resolvedOptions.features, resolvedOptions.appType)\n\n // 生成 README\n const appTypeLabel = APP_TYPES[resolvedOptions.appType].name\n await writeFile(\n path.join(projectPath, 'README.md'),\n generateReadme(resolvedOptions.name, appTypeLabel, resolvedOptions.packageManager!),\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 spinner.succeed()\n }\n\n // 安装依赖\n if (resolvedOptions.install) {\n spinner.start(`安装依赖 (${resolvedOptions.packageManager})...`)\n const installCmd = getInstallCommand(resolvedOptions.packageManager!)\n execSync(installCmd, { cwd: projectPath, stdio: 'ignore' })\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 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) {\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 (!/^[a-z0-9-]+$/.test(value))\n return '项目名称只能包含小写字母、数字和连字符'\n return true\n },\n }, { onCancel })\n projectName = name\n }\n\n // 应用类型\n let resolvedAppType = options.appType\n 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 // 模板选择\n let selectedTemplate = options.template\n if (!selectedTemplate) {\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 let selectedFeatures: FeatureId[] = []\n const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures\n\n 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 = options.moduleConfigs ?? await promptModuleConfigs(selectedFeatures, projectName!)\n\n // 示例代码\n let addExamples = options.examples\n 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 = options.packageManager\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) {\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) {\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 return {\n name: projectName!,\n appType: selectedAppType,\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 verbose: options.verbose ?? false,\n cwd: options.cwd ?? '.',\n }\n}\n\n// =============================================================================\n// 功能依赖解析\n// =============================================================================\n\n/**\n * 解析功能依赖(自动补全传递依赖)\n */\nfunction resolveFeatureDependencies(features: FeatureId[]): FeatureId[] {\n const result = new Set(features)\n\n for (const featureId of features) {\n const feature = FEATURES[featureId]\n if (feature?.dependencies) {\n for (const dep of feature.dependencies) {\n result.add(dep)\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 * 生成 README\n */\nfunction generateReadme(name: string, appTypeLabel: string, pm: string): string {\n return `# ${name}\n\n基于 hai Agent Framework 构建的${appTypeLabel}应用。\n\n## 开发\n\n\\`\\`\\`bash\n${pm} install\n${pm} dev\n\\`\\`\\`\n\n## 构建\n\n\\`\\`\\`bash\n${pm} build\n${pm} preview\n\\`\\`\\`\n\n## 文档\n\n- [hai Agent Framework](https://github.com/hai-series/hai-framework)\n- [SvelteKit](https://kit.svelte.dev/)\n- [Svelte 5](https://svelte.dev/)\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(` ${options.packageManager} install`))\n }\n core.logger.info(chalk.cyan(` ${options.packageManager} dev`))\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 add\n */\n\nimport type { FeatureId, GlobalOptions } from '../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, writeFile } from '../utils.js'\nimport { generateConfigFile } from './config-templates.js'\nimport { detectProject } from './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('./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 for (const pkgName of allPackages) {\n if (!pkg.dependencies[pkgName]) {\n pkg.dependencies[pkgName] = 'workspace:*'\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 deploy\n */\n\nimport type { GlobalOptions } from '../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\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, loadCredentials, scanApp } = deployModule\n\n // 1. 加载凭证\n spinner.start('Loading credentials...')\n const credResult = loadCredentials()\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 scanApp(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 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 await deploy.close()\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 await deploy.close()\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}\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 generate\n */\n\nimport type { GenerateOptions, GeneratorType, TemplateContext } from '../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 '../utils.js'\nimport { detectProject } from './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 init\n */\n\nimport type { GlobalOptions, ProjectInfo } from '../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 '../utils.js'\nimport { generateConfigFile } from './config-templates.js'\nimport { detectProject } from './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/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 index\n */\n\nimport type { AppType, CreateProjectOptions, FeatureId, GeneratorType } from './types.js'\nimport process from 'node:process'\nimport { core } from '@h-ai/core'\nimport { cac } from 'cac'\nimport chalk from 'chalk'\nimport { addModule, createProject, deployCommand, generate, initProject } from './commands/index.js'\n\n// CLI 版本\nconst VERSION = '0.0.1'\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)')\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 .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\n await createProject({\n name: name ?? '',\n appType: options.type as AppType,\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 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"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export { generateModuleSkillFile, generateProjectAiSupport, generateSkillFiles, resolveSkillNamesForPackages } from './chunk-YV7WPUI6.js';
|
|
3
|
+
import './chunk-2H7UOFLK.js';
|
|
4
|
+
//# sourceMappingURL=skill-templates-N5DU5FNX.js.map
|
|
5
|
+
//# sourceMappingURL=skill-templates-N5DU5FNX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"skill-templates-N5DU5FNX.js"}
|