@h-ai/cli 0.1.0-alpha.60 → 0.1.0-alpha.61
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/README.en.md +10 -0
- package/README.ja.md +10 -0
- package/README.md +10 -0
- package/dist/{chunk-P6X63D3I.js → chunk-WW2MIO6T.js} +377 -124
- package/dist/chunk-WW2MIO6T.js.map +1 -0
- package/dist/cli-config-templates-QRF6B5T4.js +5 -0
- package/dist/{cli-config-templates-EFABFSCY.js.map → cli-config-templates-QRF6B5T4.js.map} +1 -1
- package/dist/index.js +24 -5
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/templates/README.md +6 -0
- package/templates/apps/api/.gitignore.hbs +1 -0
- package/templates/apps/fullstack/.gitignore.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +8 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_ai.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +1 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +1 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +1 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_deploy.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +1 -67
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_payment.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +31 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_scheduler.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +8 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +1 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_vecdb.yml.hbs +1 -0
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +35 -23
- package/templates/base/.gitignore.hbs +1 -2
- package/templates/base/e2e/app.spec.ts.hbs +43 -1
- package/templates/base/package.json.hbs +1 -1
- package/templates/skills/hai-app-create/reference.md +10 -0
- package/templates/skills/hai-ui/reference.md +2 -0
- package/dist/chunk-P6X63D3I.js.map +0 -1
- package/dist/cli-config-templates-EFABFSCY.js +0 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/cli-config-templates.ts"],"names":[],"mappings":"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","file":"chunk-WW2MIO6T.js","sourcesContent":["/**\n * @h-ai/cli — 配置文件模板\n *\n * 为各模块生成默认配置及按需取消注释的选项;配置字段以模块 Schema 为准。\n * @module cli-config-templates\n */\n\nimport type { AiModuleConfig, CacheModuleConfig, CoreModuleConfig, DbModuleConfig, FeatureId, IamModuleConfig, ModuleConfigs, StorageModuleConfig } from '../cli-types.js'\nimport { stringify } from 'yaml'\n\n/**\n * 生成模块配置文件内容\n *\n * @param moduleKey - 拥有配置 Schema 的模块标识\n * @param configs - 用户自定义配置值\n * @returns YAML 格式的配置内容\n */\nexport function generateConfigFile(moduleKey: string, configs?: ModuleConfigs): string {\n switch (moduleKey) {\n case 'core':\n return generateCoreConfig(configs?.core)\n case 'serv':\n return generateServConfig()\n case 'db':\n return generateDbConfig(configs?.db)\n case 'cache':\n return generateCacheConfig(configs?.cache)\n case 'iam':\n return generateIamConfig(configs?.iam)\n case 'storage':\n return generateStorageConfig(configs?.storage)\n case 'ai':\n return generateAiConfig(configs?.ai)\n case 'deploy':\n return generateDeployConfig()\n case 'vecdb':\n return generateVecdbConfig()\n case 'reach':\n return generateReachConfig()\n case 'scheduler':\n return generateSchedulerConfig()\n case 'audit':\n return generateAuditConfig()\n case 'payment':\n return generatePaymentConfig()\n default:\n return `# ${moduleKey} 配置\\n`\n }\n}\n\nfunction generateCoreConfig(cfg?: CoreModuleConfig): string {\n const name = cfg?.name ?? 'my-app'\n const locale = cfg?.defaultLocale ?? 'zh-CN'\n\n return `# =============================================================================\n# 应用配置\n# =============================================================================\n\n${stringify({ name }).trim()}\nversion: 0.1.0\nenv: development\ndebug: false\n\nlogging:\n level: info\n format: json\n # context:\n # service: api\n redact:\n - password\n - token\n - secret\n\ndefaultLocale: ${locale}\n# 短 ID 生成选项;语言列表在前端 project.inlang/settings.json 中维护。\n# id:\n# prefix: app_\n# length: 21\n`\n}\n\nfunction generateServConfig(): string {\n return `# =============================================================================\n# Service / HTTP 入口配置\n# =============================================================================\n\nserver:\n host: 127.0.0.1\n port: 3000\n\nhttp:\n apiPrefix: /api/v1\n openapi:\n path: /openapi.json\n docs:\n path: /docs\n # requireAuth: true\n health:\n path: /health\n readyPath: /ready\n rpc: false\n # 启用内部 RPC 时用对象替换 false,gateway-only 必须配置网关密钥。\n # rpc:\n # prefix: /api/rpc\n # access: gateway-only # loopback | private-network | gateway-only\n # gatewayHeader: X-Gateway-Key\n # gatewaySecret: \\${HAI_SERV_HTTP_RPC_GATEWAYSECRET}\n\n# 按需开启跨域访问,生产环境填写明确的 Origin。\n# cors:\n# origin: https://app.example.com\n# nativeOrigins: capacitor://localhost,tauri://localhost\n# allowedHeaders: [Authorization, Content-Type, X-Request-Id]\n# exposedHeaders: [X-Request-Id]\n# credentials: true\n\n# 开发期默认关闭 transport;启用 @h-ai/crypto 后可按需改为对象配置\ntransport: false\n# transport:\n# keyExchangePath: /_hai/key-exchange\n# excludePaths: [/health, /ready]\n# maxClients: 10000\n`\n}\n\nfunction generateDbConfig(cfg?: DbModuleConfig): string {\n const dbType = cfg?.type ?? 'sqlite'\n const database = cfg?.database ?? (dbType === 'sqlite' ? './data/app.db' : 'hai')\n const host = cfg?.host ?? 'localhost'\n const port = cfg?.port ?? (dbType === 'postgresql' ? 5432 : 3306)\n\n const user = dbType === 'postgresql' ? 'postgres' : 'root'\n const connection = stringify({ host, port, user, password: '' }).trim()\n const networkOptions = `# url: \\${HAI_DB_URL} # 可用连接串替代 host/port/user/password\n# ssl: false # false | true | require | prefer | allow | disable,或 TLS 对象\n# pool:\n# min: 1\n# max: 10\n# idleTimeout: 30000\n# acquireTimeout: 10000\n# MySQL 专用;PostgreSQL 无需此块。\n# mysql:\n# charset: utf8mb4\n# timezone: '+08:00'`\n\n return `# =============================================================================\n# 数据库配置\n# =============================================================================\n\n# 数据库类型: sqlite | postgresql | mysql\ntype: ${dbType}\n\n# SQLite 使用文件路径,PostgreSQL/MySQL 使用数据库名称。\n${stringify({ database }).trim()}\n\n${dbType === 'sqlite'\n ? `# SQLite 驱动选项;worker 将查询移到工作线程。\n# sqlite:\n# walMode: true\n# readonly: false\n# executor: sync # sync | worker\n# workerConnectTimeoutMs: 10000\n\n# 切换到 PostgreSQL/MySQL 时修改 type、database,并取消连接项的注释。\n${stringify({ host: 'localhost', port: 5432, user: 'postgres', password: '' }).trim().split('\\n').map(line => `# ${line}`).join('\\n')}`\n : `# 网络数据库连接;凭据通过环境变量注入。\n${connection}\n# SQLite 替代方案:type: sqlite,database: ./data/app.db\n# sqlite:\n# walMode: true\n# readonly: false\n# executor: sync\n# workerConnectTimeoutMs: 10000`}\n${networkOptions}\n\n# SQL 日志按需开启;maxLength 限制 SQL / 参数输出长度。\n# operationLog:\n# read: false\n# write: false\n# maxLength: 1000\n# level: debug # trace | debug | info\n`\n}\n\nfunction generateCacheConfig(cfg?: CacheModuleConfig): string {\n const cacheType = cfg?.type ?? 'memory'\n const host = cfg?.host ?? 'localhost'\n const port = cfg?.port ?? 6379\n const connection = stringify({ host, port, password: '', keyPrefix: 'hai:' }).trim()\n\n return `# =============================================================================\n# 缓存配置\n# =============================================================================\n\n# 缓存类型: memory | redis\ntype: ${cacheType}\n\n# Redis 配置;memory 时均不生效,切换 type 后取消需要的注释。\n${cacheType === 'redis' ? connection : connection.split('\\n').map(line => `# ${line}`).join('\\n')}\n# url: redis://localhost:6379/0\n# db: 0\n# connectTimeout: 10000\n# commandTimeout: 5000\n# tls: false\n# maxRetries: 3\n# retryDelay: 50\n# readOnly: false\n# 集群与 Sentinel 二选一;普通 Redis 不需要这两块。\n# cluster:\n# - host: redis-1.internal\n# port: 6379\n# - host: redis-2.internal\n# port: 6379\n# sentinel:\n# sentinels:\n# - host: sentinel.internal\n# port: 26379\n# name: mymaster\n`\n}\n\nfunction generateIamConfig(cfg?: IamModuleConfig): string {\n const loginPassword = cfg?.loginPassword ?? true\n const loginOtp = cfg?.loginOtp ?? false\n\n return `# =============================================================================\n# IAM 配置\n# =============================================================================\n\n# 登录配置\nlogin:\n password: ${loginPassword}\n otp: ${loginOtp}\n ldap: false\n apikey: false\n\n# 注册与登录安全\nregister:\n enabled: true\n defaultEnabled: true\nsecurity:\n maxLoginAttempts: 5\n lockoutDuration: 900\n\n# LDAP 可选:安装 ldapts 后开启 login.ldap;也可在 iam.init 中注入 ldapClientFactory。\n# ldap:\n# url: ldaps://ldap.example.com:636\n# bindDn: cn=service,dc=example,dc=com\n# bindPassword: \\${HAI_IAM_LDAP_BINDPASSWORD}\n# searchBase: ou=users,dc=example,dc=com\n# searchFilter: '(uid={{username}})'\n# usernameAttribute: uid\n# emailAttribute: mail\n# displayNameAttribute: cn\n# useTls: false # ldap:// 连接可开启 STARTTLS;ldaps:// 已使用 TLS\n# connectTimeout: 5000\n# API Key 登录可选;密钥管理入口由应用按权限接入。\n# apikey:\n# maxKeysPerUser: 10\n# defaultExpirationDays: 0 # 0 表示不限制有效期\n# prefix: hai_\n# OTP 需启用 login.otp,并选择 Reach 标准模板或自定义发送回调。\n${(loginOtp ? '' : '# 保留默认策略入口,单独切换 login.otp 即可启用验证码登录。\\notp: {}\\n# 定制策略时用下方配置块替换空对象,或通过 HAI_IAM_OTP 整体覆盖。\\n') + `otp:\n email: true\n sms: true\n length: 6\n expiresIn: 300\n maxAttempts: 3\n resendInterval: 60`.split('\\n').map(line => loginOtp ? line : `# ${line}`).join('\\n')}\npasswordReset:\n enabled: true\n mode: email # phone 使用 password_reset_sms 模板\n tokenExpiresIn: 3600\n maxAttempts: 3\n # resetUrl: https://example.com/auth/reset-password\nagreements:\n showOnRegister: true\n showOnLogin: false\n # 用 | 配置 Markdown 正文;同主题同时提供 URL 时优先显示正文。\n userAgreementMarkdown: |\n # 用户协议示例\n\n 请妥善保管账户凭据,并按应用提供的功能使用服务。\n privacyPolicyMarkdown: |\n # 隐私政策示例\n\n 注册资料用于账户管理,会话信息用于身份认证。\n # userAgreementUrl: https://example.com/terms\n # privacyPolicyUrl: https://example.com/privacy\nui:\n variant: card\n # title: Account center\n # subtitle: Welcome back\n # brandTitle: Your application\n # brandText: Sign in securely\n # logoUrl: /logo.svg\n # illustrationUrl: /auth-illustration.svg\n\n# 密码策略\npassword:\n minLength: 8\n maxLength: 128\n requireUppercase: false\n requireLowercase: false\n requireNumber: false\n requireSpecialChar: false\n expirationDays: 0 # 0 表示不限制密码有效期\n\n# 会话配置\nsession:\n maxAge: 86400 # 会话超时(秒),默认 24 小时\n sliding: true # 滑动窗口(每次请求刷新过期时间)\n singleDevice: false # 单设备登录\n refreshTokenMaxAge: 604800 # refreshToken 过期(秒),默认 7 天\n\n# RBAC 配置\nrbac:\n enabled: true\n superAdminRole: super_admin\n defaultRole: user\n\n# 是否自动创建默认数据\nseedDefaultData: true\n`\n}\n\nfunction generateStorageConfig(cfg?: StorageModuleConfig): string {\n const type = cfg?.type ?? 'local'\n const local = `${stringify({ root: cfg?.localPath ?? './data/uploads' }).trim()}\n# directoryMode: 493 # 0o755\n# fileMode: 420 # 0o644`\n const s3 = `bucket: ''\nregion: us-east-1\naccessKeyId: ''\nsecretAccessKey: ''\n# endpoint: https://s3.amazonaws.com\n# forcePathStyle: false\n# prefix: ''\n# publicUrl: https://cdn.example.com`\n return `# 存储配置;HAI_STORAGE 可整体替换连接配置。\ntype: ${type}\n${type === 'local' ? local : s3}\n\n# 切换 type 后使用另一种存储的连接项。\n${(type === 'local' ? s3 : local).split('\\n').map(line => line.startsWith('#') ? line : `# ${line}`).join('\\n')}\n\n# operationLog:\n# read: false\n# write: false\n# maxLength: 1000\n# level: debug # trace | debug | info\n`\n}\n\nfunction generateAiConfig(cfg?: AiModuleConfig): string {\n const model = cfg?.model ?? 'gpt-4o-mini'\n const api = cfg?.defaultProvider === 'anthropic' ? 'anthropic' : 'chat'\n return `# =============================================================================\n# AI 配置\n# =============================================================================\n\n# LLM 配置(必填)\nllm:\n # API Key(约定环境变量 HAI_AI_LLM_APIKEY 优先)\n apiKey: ''\n # Base URL(约定环境变量 HAI_AI_LLM_BASEURL 优先)\n # baseUrl: https://api.openai.com/v1\n # 默认模型\n${stringify({ model }).trim().split('\\n').map(line => ` ${line}`).join('\\n')}\n api: ${api} # chat | responses | anthropic\n # 全局最大 Token 数(默认 4096)\n # maxTokens: 4096\n # 采样温度(0-2,默认 0.7)\n # temperature: 0.7\n # 请求超时(毫秒,默认 60000)\n # timeout: 60000\n # tempModelCacheTtl: 600000\n\n # 多模型配置(可选,用于场景路由)\n # models:\n # - id: fast\n # model: gpt-4o-mini\n # api: chat\n # apiKey: ''\n # baseUrl: https://api.openai.com/v1\n # maxTokens: 4096\n # temperature: 0.7\n # timeout: 60000\n # - id: smart\n # model: gpt-4o\n # apiKey: ''\n\n # 场景模型映射(可选)\n # scenarios:\n # default: fast\n # chat: fast\n # reasoning: smart\n # plan: smart\n # execute: fast\n # extraction: fast\n # summary: fast\n # embedding: embedding\n # rerank: rerank\n # ocr: vision\n # fast: fast\n # embedding / rerank / vision 须在 models 中声明对应厂商模型,不能只填写场景 ID。\n\n# 可选子模块:只取消需要的块的注释,模型、向量库与数据库依赖按使用场景初始化。\n# mcp:\n# server:\n# name: my-app\n# version: 1.0.0\n# capabilities:\n# tools: true\n# resources: true\n# prompts: true\n# embedding:\n# dimensions: 1536\n# batchSize: 100\n# knowledge:\n# collection: hai_ai_knowledge\n# dimension: 1536\n# enableEntityExtraction: true\n# entityBoostWeight: 0.15\n# entityTypes: [person, organization, location]\n# systemPrompt: 'Extract entities from the input.'\n# cleanOptions:\n# removeHtml: true\n# removeUrls: false\n# removeEmails: false\n# normalizeWhitespace: true\n# trim: true\n# customReplacements:\n# - pattern: '\\\\t+'\n# replacement: ' '\n# chunkOptions:\n# mode: markdown # sentence | paragraph | markdown | page | word | character | custom\n# maxSize: 1500\n# overlap: 200\n# separator: '\\\\n\\\\n' # 仅 custom 模式使用\n# markdownMinLevel: 2\n# markdownKeepTitle: true\n# memory:\n# provider: native # native | mem0\n# allowEphemeralFallback: false\n# maxEntriesPerObject: 1000\n# maxEntriesGlobal: 100000\n# systemPrompt: 'Extract useful memories from the conversation.'\n# recencyDecay: 0.95\n# embeddingEnabled: true\n# defaultTopK: 10\n# candidateMultiplier: 5\n# writebackRelatedTopK: 20\n# token:\n# tokenRatio: 0.25\n# summary:\n# systemPrompt: 'Summarize the conversation.'\n# compress:\n# defaultStrategy: hybrid # summary | sliding-window | hybrid\n# defaultMaxTokens: 0\n# preserveLastN: 4\n# retrieval:\n# sources:\n# - id: docs\n# collection: documentation\n# name: Product documentation\n# url: https://docs.example.com\n# topK: 5\n# minScore: 0.7\n# filter:\n# published: true\n# file:\n# systemPrompt: 'Extract text from the image.'\n# a2a:\n# agentCard:\n# name: my-agent\n# description: Application agent\n# url: https://agent.example.com\n# version: 1.0.0\n# skills:\n# - id: chat\n# name: Chat\n# description: General conversation\n# tags: [chat]\n# security:\n# apiKey:\n# in: header # header | query\n# name: x-api-key\n# audio:\n# inheritLlmApiKey: false\n# transcribeModel: asr\n# synthesizeModel: tts\n# maxAudioBytes: 10485760\n# maxStreamDurationMs: 300000\n# models:\n# - id: asr\n# provider: openai # openai | mimo | qwen | doubao | whisper | indextts\n# model: whisper-1\n# operations: [transcribe]\n# apiKey: ''\n# baseUrl: https://api.openai.com/v1\n# timeout: 60000\n# appKey: '' # 豆包旧版控制台 ASR 使用\n# accessKey: ''\n# resourceId: ''\n# workspaceId: '' # 百炼业务空间\n# - id: tts\n# provider: openai\n# model: tts-1\n# operations: [synthesize]\n# image:\n# generateModel: image\n# models:\n# - id: image\n# provider: openai # openai | google | qwen | seedream | pollinations\n# model: gpt-image-1\n# apiKey: ''\n# baseUrl: https://api.openai.com/v1\n# workspaceId: ''\n# timeout: 120000\n`\n}\n\n/**\n * 根据选中的功能模块生成 .env.example 内容\n *\n * @param features - 选中的功能模块列表\n * @param configs - 用户自定义配置值\n * @param includeDisabled - 是否输出所有模块的完整注释示例(fullstack 使用,默认值以 YAML 为准)\n * @returns .env.example 文件内容\n */\nexport function generateEnvExample(features: FeatureId[], configs?: ModuleConfigs, includeDisabled = false): string {\n const sections: string[] = []\n\n // 文件头\n sections.push(`# =============================================================================\n# Environment Variables\n# =============================================================================\n#\n# Copy this file to .env and fill in actual values.\n# Config files use literal defaults; matching HAI variables override YAML leaves.\n# Uncomment the matching YAML keys before using leaf overrides; HAI_<module> replaces the whole object.\n#\n# Naming convention: HAI_<config name>_<YAML path>\n# =============================================================================`)\n\n // 应用基础(始终生成)\n sections.push(`\n# =============================================================================\n# Application\n# =============================================================================\n# Environment: development | production | test\nHAI_CORE_ENV=development\n# Enable debug mode\nHAI_CORE_DEBUG=false`)\n\n // 数据库\n if (features.includes('db') || includeDisabled) {\n const dbType = configs?.db?.type ?? 'sqlite'\n const dbDatabase = configs?.db?.database ?? (dbType === 'sqlite' ? './data/app.db' : 'hai')\n const isSqlite = dbType === 'sqlite'\n sections.push(`\n# =============================================================================\n# Database (@h-ai/reldb)\n# =============================================================================\n# Database type: sqlite | postgresql | mysql\nHAI_DB_TYPE=${dbType}\n# SQLite: file path; PostgreSQL/MySQL: database name\nHAI_DB_DATABASE=${dbDatabase}${isSqlite\n ? `\n# PostgreSQL/MySQL connection (uncomment when not using sqlite)\n# HAI_DB_HOST=localhost\n# HAI_DB_PORT=5432\n# HAI_DB_USER=postgres\n# HAI_DB_PASSWORD=`\n : `\n# Connection\nHAI_DB_HOST=${configs?.db?.host ?? 'localhost'}\nHAI_DB_PORT=${configs?.db?.port ?? (dbType === 'postgresql' ? 5432 : 3306)}\nHAI_DB_USER=${dbType === 'postgresql' ? 'postgres' : 'root'}\nHAI_DB_PASSWORD=`}`)\n }\n\n // IAM / Session\n if (features.includes('iam') || includeDisabled) {\n sections.push(`\n# =============================================================================\n# IAM (@h-ai/iam)\n# =============================================================================\n# HAI_IAM_PASSWORD_MINLENGTH=8\n# HAI_IAM_SESSION_MAXAGE=86400\n# HAI_IAM_SESSION_REFRESHTOKENMAXAGE=604800\n# HAI_IAM_OTP={\"email\":true,\"sms\":true,\"length\":6,\"expiresIn\":300,\"maxAttempts\":3,\"resendInterval\":60}\n# HAI_IAM_LDAP_BINDPASSWORD= # Enable login.ldap and uncomment the ldap block first.\n# HAI_IAM_PASSWORDRESET_RESETURL=https://app.example.com/auth/reset-password\n# HAI_KIT_COOKIE_KEY= # 32-char hex for SM4-CBC cookie encryption\n`)\n }\n\n // 缓存\n if (features.includes('cache') || includeDisabled) {\n const cacheType = configs?.cache?.type ?? 'memory'\n if (cacheType === 'redis') {\n sections.push(`\n# =============================================================================\n# Cache (@h-ai/cache)\n# =============================================================================\n# Cache type: memory | redis\nHAI_CACHE_TYPE=redis\n# Redis connection\nHAI_CACHE_HOST=${configs?.cache?.host ?? 'localhost'}\nHAI_CACHE_PORT=${configs?.cache?.port ?? 6379}\nHAI_CACHE_PASSWORD=\n# HAI_CACHE_URL=redis://localhost:6379/0\n# HAI_CACHE_DB=0\n# HAI_CACHE_CONNECTTIMEOUT=10000\n# HAI_CACHE_COMMANDTIMEOUT=5000\n# HAI_CACHE_KEYPREFIX=hai:`)\n }\n else {\n sections.push(`\n# =============================================================================\n# Cache (@h-ai/cache)\n# =============================================================================\n# Cache type: memory | redis\nHAI_CACHE_TYPE=memory\n# Redis connection (uncomment when type=redis)\n# HAI_CACHE_URL=redis://localhost:6379/0\n# HAI_CACHE_HOST=localhost\n# HAI_CACHE_PORT=6379\n# HAI_CACHE_PASSWORD=\n# HAI_CACHE_DB=0\n# HAI_CACHE_CONNECTTIMEOUT=10000\n# HAI_CACHE_COMMANDTIMEOUT=5000\n# HAI_CACHE_KEYPREFIX=hai:`)\n }\n }\n\n // 存储\n if (features.includes('storage') || includeDisabled) {\n const storageType = configs?.storage?.type ?? 'local'\n if (storageType === 's3') {\n sections.push(`\n# =============================================================================\n# Storage (@h-ai/storage)\n# =============================================================================\n# Default storage provider: local | s3\nHAI_STORAGE_TYPE=s3\n# S3 / S3-compatible\nHAI_STORAGE_BUCKET=\nHAI_STORAGE_REGION=us-east-1\nHAI_STORAGE_ACCESSKEYID=\nHAI_STORAGE_SECRETACCESSKEY=\n# HAI_STORAGE_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.\n# HAI_STORAGE_FORCEPATHSTYLE=false\n# Local storage (uncomment when type=local)\n# HAI_STORAGE_ROOT=./data/uploads`)\n }\n else {\n sections.push(`\n# =============================================================================\n# Storage (@h-ai/storage)\n# =============================================================================\n# Default storage provider: local | s3\nHAI_STORAGE_TYPE=local\n# Local storage root path\nHAI_STORAGE_ROOT=${configs?.storage?.localPath ?? './data/uploads'}\n# S3 / S3-compatible (uncomment when type=s3)\n# HAI_STORAGE_BUCKET=\n# HAI_STORAGE_REGION=us-east-1\n# HAI_STORAGE_ACCESSKEYID=\n# HAI_STORAGE_SECRETACCESSKEY=\n# HAI_STORAGE_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.\n# HAI_STORAGE_FORCEPATHSTYLE=false`)\n }\n }\n\n // AI\n if (features.includes('ai') || includeDisabled) {\n sections.push(`\n# =============================================================================\n# AI (@h-ai/ai)\n# =============================================================================\n# Select chat / responses / anthropic in _ai.yml (llm.api).\nHAI_AI_LLM_APIKEY=\n# HAI_AI_LLM_BASEURL= # Custom base URL\n# Optional compatibility fallback\n# OPENAI_API_KEY=`)\n }\n\n // VecDB\n if (features.includes('vecdb') || includeDisabled) {\n sections.push(`\n# =============================================================================\n# Vector Database (@h-ai/vecdb)\n# =============================================================================\n# Backend type: lancedb | pgvector | qdrant | chroma\nHAI_VECDB_TYPE=lancedb\n# LanceDB data path\nHAI_VECDB_PATH=./data/vecdb\n# Qdrant (uncomment when type=qdrant)\n# HAI_VECDB_URL=http://localhost:6333\n# HAI_VECDB_APIKEY=\n`)\n }\n\n // Reach\n if (features.includes('reach') || includeDisabled) {\n sections.push(`\n# =============================================================================\n# Reach (@h-ai/reach)\n# =============================================================================\n# SMTP (uncomment when enabling email provider)\n# HAI_REACH_SMTP_HOST=smtp.example.com\n# HAI_REACH_SMTP_PORT=465\n# HAI_REACH_SMTP_USER=\n# HAI_REACH_SMTP_PASS=\n# HAI_REACH_SMTP_FROM=noreply@example.com\n# HAI_REACH_SMS_ACCESS_KEY=\n# HAI_REACH_SMS_SECRET_KEY=\n# HAI_REACH_API_TOKEN=\n# HAI_REACH_PROVIDERS= # JSON array replacing all providers, while retaining templates.\n`)\n }\n\n // Payment\n if (features.includes('payment') || includeDisabled) {\n sections.push(`\n# =============================================================================\n# Payment (@h-ai/payment)\n# =============================================================================\n# WeChat Pay\n# HAI_PAYMENT_WECHAT_MCHID=\n# HAI_PAYMENT_WECHAT_APIV3KEY=\n# HAI_PAYMENT_WECHAT_SERIALNO=\n# HAI_PAYMENT_WECHAT_PRIVATEKEY=\n# HAI_PAYMENT_WECHAT_PLATFORMCERT=\n# HAI_PAYMENT_WECHAT_APPID=\n# Alipay\n# HAI_PAYMENT_ALIPAY_APPID=\n# HAI_PAYMENT_ALIPAY_PRIVATEKEY=\n# HAI_PAYMENT_ALIPAY_ALIPAYPUBLICKEY=\n# Stripe\n# HAI_PAYMENT_STRIPE_SECRETKEY=\n# HAI_PAYMENT_STRIPE_WEBHOOKSECRET=\n`)\n }\n\n if (features.includes('deploy') || includeDisabled) {\n sections.push(`\n# =============================================================================\n# Deployment (@h-ai/deploy)\n# =============================================================================\n# HAI_DEPLOY_VERCEL_TOKEN=\n# HAI_DEPLOY_SSH_HOST=\n# HAI_DEPLOY_SSH_KEY=\n# HAI_DEPLOY_SSH_KNOWNHOSTSFILE=\n# HAI_DEPLOY_NEON_API_KEY=\n# HAI_DEPLOY_UPSTASH_EMAIL=\n# HAI_DEPLOY_UPSTASH_API_KEY=\n# HAI_DEPLOY_CF_ACCOUNT_ID=\n# HAI_DEPLOY_CF_API_TOKEN=\n# HAI_DEPLOY_R2_ACCESS_KEY_ID=\n# HAI_DEPLOY_R2_SECRET_ACCESS_KEY=\n# HAI_DEPLOY_RESEND_API_KEY=\n# HAI_DEPLOY_RESEND_FROM=\n# HAI_DEPLOY_ALIYUN_ACCESS_KEY_ID=\n# HAI_DEPLOY_ALIYUN_ACCESS_KEY_SECRET=\n# HAI_DEPLOY_ALIYUN_SIGN_NAME=\n`)\n }\n\n if (includeDisabled) {\n sections.push(`\n# =============================================================================\n# Service (@h-ai/serv)\n# =============================================================================\n# HOST=127.0.0.1 # HOST/PORT override _serv.yml server settings.\n# PORT=3000\n# HAI_CORS_ORIGIN=http://127.0.0.1:4173,http://localhost:4173\n# HAI_CORS_NATIVEORIGINS=http://localhost,https://localhost,http://tauri.localhost,https://tauri.localhost,tauri://localhost,capacitor://localhost\n# HAI_CORS_CREDENTIALS=true\n# HAI_SERV_HTTP_RPC_GATEWAYSECRET= # Enable the gateway-only RPC block before setting this.\n`)\n }\n\n // 测试(始终生成)\n sections.push(`\n# =============================================================================\n# Testing\n# =============================================================================\n# E2E test mode (relaxes rate limiting etc.)\n# HAI_E2E=1\n`)\n\n const content = sections.join('\\n')\n // fullstack 自动生成 .env;默认覆盖也必须注释,否则后续编辑 YAML 会被旧值悄悄覆盖。\n return includeDisabled\n ? content.split('\\n').map(line => line && !line.startsWith('#') ? `# ${line}` : line).join('\\n')\n : content\n}\n\nfunction generateDeployConfig(): string {\n return `# =============================================================================\n# 部署配置 (@h-ai/deploy)\n# =============================================================================\n# 部署平台凭证通过 ~/.hai/credentials.yml 管理\n# 环境变量引用格式: \\${VAR_NAME:default_value}\n\n# 部署平台\nprovider:\n type: vercel\n token: \\${HAI_DEPLOY_VERCEL_TOKEN}\n\n# ---------------------------------------------------------------------------\n# 方式二:docker-ssh — 将应用容器化后通过 SSH 部署到任意 Linux 主机\n# 远程主机只需具备 SSH + docker/podman + compose,本地需 docker 或 podman\n# 切换时用下方 provider 替换上面的 vercel provider\n# ---------------------------------------------------------------------------\n# provider:\n# type: docker-ssh\n# ssh:\n# host: \\${HAI_DEPLOY_SSH_HOST}\n# port: 22\n# username: deploy\n# identityFile: \\${HAI_DEPLOY_SSH_KEY} # 私钥文件路径(省略则用 ssh-agent)\n# knownHostsFile: \\${HAI_DEPLOY_SSH_KNOWNHOSTSFILE}\n# strictHostKeyChecking: true\n# connectTimeoutSeconds: 10\n# remote:\n# baseDir: /opt/hai/apps\n# runtime: auto # auto 优先 podman,其次 docker\n# expose:\n# type: port\n# containerPort: 3000\n# hostPort: 18080 # 访问地址 http://<host>:18080\n\n# 本地构建运行时(docker-ssh 使用;auto 优先 podman)\n# container:\n# runtime: auto\n\n# 基础设施服务(按需开启)\n# services:\n # PostgreSQL 数据库 (Neon)\n # db:\n # provisioner: neon\n # apiKey: \\${HAI_DEPLOY_NEON_API_KEY}\n\n # Redis 缓存 (Upstash)\n # cache:\n # provisioner: upstash\n # email: \\${HAI_DEPLOY_UPSTASH_EMAIL}\n # apiKey: \\${HAI_DEPLOY_UPSTASH_API_KEY}\n\n # S3 存储 (Cloudflare R2)\n # storage:\n # provisioner: cloudflare-r2\n # accountId: \\${HAI_DEPLOY_CF_ACCOUNT_ID}\n # apiToken: \\${HAI_DEPLOY_CF_API_TOKEN}\n # accessKeyId: \\${HAI_DEPLOY_R2_ACCESS_KEY_ID}\n # secretAccessKey: \\${HAI_DEPLOY_R2_SECRET_ACCESS_KEY}\n\n # 邮件 (Resend)\n # email:\n # provisioner: resend\n # apiKey: \\${HAI_DEPLOY_RESEND_API_KEY}\n # from: \\${HAI_DEPLOY_RESEND_FROM}\n\n # 短信 (阿里云)\n # sms:\n # provisioner: aliyun\n # accessKeyId: \\${HAI_DEPLOY_ALIYUN_ACCESS_KEY_ID}\n # accessKeySecret: \\${HAI_DEPLOY_ALIYUN_ACCESS_KEY_SECRET}\n # signName: \\${HAI_DEPLOY_ALIYUN_SIGN_NAME}\n\n# docker-ssh 说明:\n# - 应用镜像使用工程自带的 Dockerfile(adapter-node),本地构建后经 SSH 传输并 load\n# - compose 会按上方启用的 db/cache/storage 自动追加 postgres/redis/minio sidecar\n# - 若同时配置了对应云 Provisioner,则优先使用云资源,不再自建 sidecar\n`\n}\n\nfunction generateVecdbConfig(): string {\n return `# =============================================================================\n# 向量数据库配置 (@h-ai/vecdb)\n# =============================================================================\n\n# 数据库类型: lancedb | pgvector | qdrant | chroma\ntype: lancedb\n\n# LanceDB 数据目录\npath: ./data/vecdb\n\n# 距离度量: cosine | euclidean | dot\n# metric: cosine\n\n# pgvector 配置(当 type 为 pgvector 时使用)\n# type: pgvector\n# url: \\${HAI_VECDB_URL}\n# host: localhost\n# port: 5432\n# database: hai\n# user: postgres\n# password: ''\n# indexType: hnsw\n# tablePrefix: vec_\n\n# Qdrant 配置(当 type 为 qdrant 时使用)\n# type: qdrant\n# url: http://localhost:6333\n# apiKey: ''\n\n# Chroma 配置(替换 type;url 指向已有服务,path 用于本地子进程数据目录)\n# type: chroma\n# path: ./data/chroma\n# url: http://localhost:8000\n# host: localhost\n# port: 8000\n# apiKey: ''\n# serverCommand: chroma\n# startupTimeout: 30000\n\n# operationLog:\n# read: false\n# write: false\n# maxLength: 1000\n# level: debug # trace | debug | info\n`\n}\n\nfunction generateReachConfig(): string {\n return `# =============================================================================\n# 消息推送配置 (@h-ai/reach)\n# =============================================================================\n\nproviders:\n # 控制台输出(开发/测试用)\n - name: console_dev\n type: console\n\n # SMTP 邮件(按需开启)\n # - name: email\n # type: smtp\n # host: \\${HAI_REACH_SMTP_HOST:smtp.example.com}\n # port: \\${HAI_REACH_SMTP_PORT:465}\n # secure: true\n # user: \\${HAI_REACH_SMTP_USER:}\n # pass: \\${HAI_REACH_SMTP_PASS:}\n # from: \\${HAI_REACH_SMTP_FROM:noreply@example.com}\n\n # 阿里云短信(按需开启)\n # - name: sms\n # type: aliyun-sms\n # accessKeyId: \\${HAI_REACH_SMS_ACCESS_KEY}\n # accessKeySecret: \\${HAI_REACH_SMS_SECRET_KEY}\n # signName: MyApp\n # endpoint: dysmsapi.aliyuncs.com\n\n # 通用 API(按需开启;可对接应用自有投递服务)\n # - name: custom\n # type: api\n # url: https://notify.example.com/send\n # method: POST # POST | PUT\n # headers:\n # Authorization: 'Bearer \\${HAI_REACH_API_TOKEN}'\n # timeout: 10000\n\n# IAM 标准模板:保留空数组以支持 HAI_REACH_TEMPLATES 整体覆盖。\ntemplates: []\n# 开启对应 Provider 后,将空数组替换为需要的模板列表,例如:\n# templates:\n# - name: otp_email\n# provider: email\n# subject: \"Verification code\"\n# body: \"Your verification code is {code}.\"\n# - name: otp_sms\n# provider: sms\n# body: \"Your verification code is {code}.\"\n# - name: password_reset\n# provider: email\n# subject: \"Password reset\"\n# body: \"Reset your password: {resetUrl}. Expires at {expiresAt}.\"\n# - name: password_reset_sms\n# provider: sms\n# body: \"Reset your password: {resetUrl}. Expires at {expiresAt}.\"\n\n# 免打扰(可选)\n# dnd:\n# enabled: true\n# strategy: delay\n# start: \"22:00\"\n# end: \"08:00\"\n`\n}\n\nfunction generateSchedulerConfig(): string {\n return `# =============================================================================\n# 任务调度配置 (@h-ai/scheduler)\n# =============================================================================\n\n# 是否启用数据库日志(需要 @h-ai/reldb)\nenableDb: true\n\n# 检查间隔(毫秒)\ntickInterval: 1000\n\n# 锁过期时间(毫秒)\nlockExpireMs: 300000\n\n# 节点 ID 默认自动生成;多节点部署时每个实例应使用独立 ID。\n# nodeId: worker-1\n# 执行日志保留策略(启用数据库时使用)\n# maxLogs: 10000\n# retentionDays: 30\n`\n}\n\nfunction generateAuditConfig(): string {\n return `# =============================================================================\n# 审计日志配置 (@h-ai/audit)\n# =============================================================================\n\n# 用户表名(用于 JOIN 查询)\nuserTable: hai_iam_users\n\n# 用户表主键列名\nuserIdColumn: id\n\n# 用户名列名\nuserNameColumn: username\n`\n}\n\nfunction generatePaymentConfig(): string {\n return `# =============================================================================\n# 支付配置 (@h-ai/payment)\n# =============================================================================\n\n# 微信支付(按需开启)\n# wechat:\n# mchId: ''\n# apiV3Key: ''\n# serialNo: ''\n# privateKey: ''\n# platformCert: ''\n# appId: ''\n\n# 支付宝(按需开启)\n# alipay:\n# appId: ''\n# privateKey: ''\n# alipayPublicKey: ''\n# signType: RSA2\n# sandbox: false\n\n# Stripe(按需开启)\n# stripe:\n# secretKey: ''\n# webhookSecret: ''\n# webhookToleranceSeconds: 300\n`\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"cli-config-templates-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"cli-config-templates-QRF6B5T4.js"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { generateConfigFile } from './chunk-
|
|
2
|
+
import { generateConfigFile } from './chunk-WW2MIO6T.js';
|
|
3
3
|
import { cliM } from './chunk-WWG3U5ZD.js';
|
|
4
4
|
import './chunk-2H7UOFLK.js';
|
|
5
5
|
import process4 from 'process';
|
|
@@ -119,6 +119,12 @@ Handlebars2.registerHelper("json", (value) => JSON.stringify(value));
|
|
|
119
119
|
Handlebars2.registerHelper("html", (value) => Handlebars2.escapeExpression(value));
|
|
120
120
|
Handlebars2.registerHelper("yaml", (key, value) => stringify({ [key]: value }).trim());
|
|
121
121
|
Handlebars2.registerHelper("jsString", (value) => `'${JSON.stringify(value).slice(1, -1).replace(/\\"/g, '"').replace(/'/g, "\\'")}'`);
|
|
122
|
+
Handlebars2.registerHelper("moduleConfig", function(moduleKey, enabled) {
|
|
123
|
+
const content = generateConfigFile(moduleKey, this.moduleConfigs).trimEnd();
|
|
124
|
+
const configured = this.appType === "fullstack" && moduleKey === "iam" ? content.replace("seedDefaultData: true", "seedDefaultData: false") : content;
|
|
125
|
+
return enabled ? configured : `# # \u672A\u542F\u7528\uFF1A\u5B89\u88C5\u5BF9\u5E94\u6A21\u5757\u5E76\u5728\u670D\u52A1\u7AEF runtime \u4E2D\u521D\u59CB\u5316\uFF0C\u518D\u53D6\u6D88\u6240\u9700\u914D\u7F6E\u7684\u6CE8\u91CA\u3002
|
|
126
|
+
${configured.split("\n").map((line) => line ? `# ${line}` : "").join("\n")}`;
|
|
127
|
+
});
|
|
122
128
|
var TEMPLATE_SKIP_IF_EMPTY_MARKER = "@skipIfEmpty";
|
|
123
129
|
var NORMALIZED_RENDER_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".js", ".svelte", ".json", ".css"]);
|
|
124
130
|
var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
|
|
@@ -608,6 +614,7 @@ function buildTemplateContext(options) {
|
|
|
608
614
|
haiCatalogPackages,
|
|
609
615
|
appType: options.appType,
|
|
610
616
|
features: featureMap,
|
|
617
|
+
moduleConfigs: options.moduleConfigs,
|
|
611
618
|
hasUi,
|
|
612
619
|
hasI18n: !isApi && !isFullstack,
|
|
613
620
|
isCapacitorApp,
|
|
@@ -1117,7 +1124,7 @@ async function createProject(options) {
|
|
|
1117
1124
|
});
|
|
1118
1125
|
await generateFromTemplates(projectPath, context);
|
|
1119
1126
|
{
|
|
1120
|
-
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-
|
|
1127
|
+
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-QRF6B5T4.js');
|
|
1121
1128
|
const configs = resolvedOptions.moduleConfigs;
|
|
1122
1129
|
const isApiWorkspace = resolvedOptions.appType === "api";
|
|
1123
1130
|
const isFullstack = resolvedOptions.appType === "fullstack";
|
|
@@ -1126,8 +1133,10 @@ async function createProject(options) {
|
|
|
1126
1133
|
for (const featureId of resolvedOptions.features) {
|
|
1127
1134
|
const configKey = getFeatureConfigKey(featureId);
|
|
1128
1135
|
if (configKey) {
|
|
1129
|
-
const
|
|
1130
|
-
await
|
|
1136
|
+
const configPath = path2.join(configDir, `_${configKey}.yml`);
|
|
1137
|
+
if (isFullstack && await fse.pathExists(configPath))
|
|
1138
|
+
continue;
|
|
1139
|
+
await writeFile(configPath, generateConfigFile2(configKey, configs));
|
|
1131
1140
|
}
|
|
1132
1141
|
}
|
|
1133
1142
|
if (!isApiWorkspace && !isFullstack) {
|
|
@@ -1141,7 +1150,7 @@ async function createProject(options) {
|
|
|
1141
1150
|
# Service Runtime
|
|
1142
1151
|
# =============================================================================
|
|
1143
1152
|
PORT=3000
|
|
1144
|
-
` : isFullstack ? `${generateEnvExample(resolvedOptions.features, configs)}
|
|
1153
|
+
` : isFullstack ? `${generateEnvExample(resolvedOptions.features, configs, true)}
|
|
1145
1154
|
# First-start administrator password. The CLI generates a random value in .env.
|
|
1146
1155
|
HAI_ADMIN_DEFAULT_PASSWORD=
|
|
1147
1156
|
|
|
@@ -1884,6 +1893,16 @@ CLI \u5DF2\u5728\u6839\u76EE\u5F55\u751F\u6210 \`.env\`\uFF0C\u5176\u4E2D \`HAI_
|
|
|
1884
1893
|
|
|
1885
1894
|
\u5E94\u7528\u663E\u793A\u540D\u79F0\u3001\u7248\u672C\u3001\u73AF\u5883\u3001\u9ED8\u8BA4\u8BED\u8A00\u548C\u65E5\u5FD7\u8BBE\u7F6E\u6765\u81EA\u540E\u7AEF \`config/_core.yml\`\uFF0C\u524D\u7AEF\u901A\u8FC7 \`app.info\` \u83B7\u53D6\u5B89\u5168\u5143\u4FE1\u606F\u3002\u9ED8\u8BA4 SQLite\u3001\u672C\u5730\u5B58\u50A8\u4E0E\u5185\u5B58\u7F13\u5B58\u9002\u5408\u5355\u5B9E\u4F8B\uFF0C\u7BA1\u7406\u5199\u5165\u4EC5\u652F\u6301\u5355\u5199\u5B9E\u4F8B\uFF1B\u591A\u5B9E\u4F8B\u8BFB\u53D6\u53EF\u4F7F\u7528\u5171\u4EAB\u6570\u636E\u5E93\u3001Redis cache \u548C S3 \u5B58\u50A8\uFF0C\u4F46\u7BA1\u7406\u5199\u8BF7\u6C42\u987B\u7EDF\u4E00\u8DEF\u7531\u5230\u540C\u4E00\u5199\u5B9E\u4F8B\u3002\u53E6\u9700\u4F1A\u8BDD\u7C98\u6027\u8DEF\u7531\u4F7F\u8BF7\u6C42\u547D\u4E2D\u540C\u4E00\u8FDB\u7A0B\u5185\u4F20\u8F93\u79C1\u94A5\uFF0C\u670D\u52A1\u91CD\u542F\u540E\u5BA2\u6237\u7AEF\u91CD\u65B0\u534F\u5546\u3002\u751F\u4EA7\u9700\u663E\u5F0F\u914D\u7F6E\u5141\u8BB8\u7684 CORS Origin\u3002\u4E1A\u52A1\u63D0\u4EA4\u540E\u7684\u5BA1\u8BA1\u5199\u5165\u91C7\u7528\u6700\u5927\u52AA\u529B\uFF0C\u5931\u8D25\u8BB0\u5F55\u7ED3\u6784\u5316\u9519\u8BEF\u65E5\u5FD7\uFF0C\u4FDD\u7559\u5DF2\u5B8C\u6210\u4E1A\u52A1\u7684\u539F\u59CB\u7ED3\u679C\u3002
|
|
1886
1895
|
|
|
1896
|
+
## \u914D\u7F6E\u6269\u5C55
|
|
1897
|
+
|
|
1898
|
+
\u670D\u52A1\u7AEF \`packages/${name}-serv/config/\` \u59CB\u7EC8\u4FDD\u7559 core\u3001serv\u3001db\u3001cache\u3001iam\u3001storage\u3001audit\u3001reach\u3001ai\u3001vecdb\u3001payment\u3001scheduler\u3001deploy \u5171 13 \u4EFD YAML\u3002\u5DF2\u7528\u6A21\u5757\u4FDD\u7559\u5DE5\u4F5C\u9ED8\u8BA4\u503C\uFF0C\u672A\u542F\u7528\u6A21\u5757\u6574\u4EFD\u6CE8\u91CA\uFF0C\u53EF\u9009\u5B57\u6BB5\u548C\u66FF\u4EE3 Provider \u6309\u5757\u6CE8\u91CA\uFF1B\u6839 \`.env.example\` \u4E5F\u4FDD\u7559\u672A\u542F\u7528\u6A21\u5757\u7684\u51ED\u636E\u793A\u4F8B\u3002Reach \u9ED8\u8BA4\u4E3A\u5F00\u53D1\u63A7\u5236\u53F0\u901A\u77E5\uFF0C\u751F\u4EA7\u6309 \`_reach.yml\` \u6CE8\u91CA\u66FF\u6362\u4E3A SMTP\u3001\u77ED\u4FE1\u6216 API Provider\uFF0C\u5E76\u4FDD\u6301\u540D\u79F0\u552F\u4E00\u3002
|
|
1899
|
+
|
|
1900
|
+
\u81EA\u52A8\u751F\u6210\u7684 \`.env\` \u9ED8\u8BA4\u53EA\u542F\u7528\u521D\u59CB\u7BA1\u7406\u5458\u5BC6\u7801\u548C \`PUBLIC_API_BASE\`\uFF0C\u6A21\u5757\u73AF\u5883\u8986\u76D6\u4FDD\u7559\u6CE8\u91CA\uFF0CYAML \u662F\u9ED8\u8BA4\u503C\u6765\u6E90\u3002\u9700\u8981\u73AF\u5883\u8986\u76D6\u65F6\u663E\u5F0F\u53D6\u6D88\u5BF9\u5E94\u53D8\u91CF\u7684\u6CE8\u91CA\uFF1B\u7F16\u8F91 YAML \u65F6\u540C\u6B65\u6838\u5BF9\u5DF2\u6709\u8986\u76D6\u3002
|
|
1901
|
+
|
|
1902
|
+
\u6269\u5C55\u65F6\u5148\u5728\u670D\u52A1\u7AEF workspace \u5B89\u88C5\u9700\u8981\u7684\u5305\uFF0C\u5728 \`src/server/runtime.ts\` \u6309\u6A21\u5757\u516C\u5F00 Schema \u6821\u9A8C\u914D\u7F6E\u3001\u521D\u59CB\u5316\u5E76\u53CD\u5E8F\u5173\u95ED\uFF0C\u518D\u63A5\u5165 contract/procedure \u548C\u754C\u9762\u3002\u6574\u4EFD\u6CE8\u91CA\u6587\u4EF6\u5148\u53BB\u6389\u4E00\u5C42\u5916\u5C42\u6CE8\u91CA\uFF0C\u53EF\u9009\u5757\u7EE7\u7EED\u6309\u9700\u5F00\u542F\uFF1B\u914D\u7F6E\u6587\u4EF6\u5B58\u5728\u4E0D\u4EE3\u8868\u4E1A\u52A1\u529F\u80FD\u5DF2\u63A5\u5165\u3002\`crypto.init()\` \u65E0\u914D\u7F6E\u53C2\u6570\uFF0Cdatapipe \u4E3A\u7EAF\u51FD\u6570\uFF0C\u4E0D\u751F\u6210\u865A\u6784 YAML\u3002
|
|
1903
|
+
|
|
1904
|
+
\u73AF\u5883\u53D8\u91CF\u53EA\u8986\u76D6 YAML \u5DF2\u6709\u8DEF\u5F84\uFF0C\u6CE8\u91CA\u952E\u987B\u5148\u542F\u7528\uFF0C\u6216\u7528 \`HAI_DB\` / \`HAI_CACHE\` \u7B49\u6574\u4F53\u5BF9\u8C61\u8986\u76D6\u3002camelCase \u4E0D\u62C6\u8BCD\uFF0C\u4F8B\u5982 \`connectTimeout\` \u5BF9\u5E94 \`HAI_CACHE_CONNECTTIMEOUT\`\u3002\u4FEE\u6539\u914D\u7F6E\u540E\u91CD\u542F\u670D\u52A1\uFF1B\u8BED\u8A00\u5217\u8868\u5728\u5404\u524D\u7AEF/shared \u7684 \`project.inlang/settings.json\` \u4E2D\u540C\u6B65\u3002\`**/data/\` \u5FFD\u7565\u4EFB\u610F\u5C42\u7EA7\u7684\u6570\u636E\u76EE\u5F55\u53CA \`.gitkeep\`\uFF0C\u8FD0\u884C\u6570\u636E\u4E0D\u5165 Git\uFF0C\u8FD0\u884C\u65F6\u81EA\u52A8\u521B\u5EFA\u76EE\u5F55\u3002
|
|
1905
|
+
|
|
1887
1906
|
## \u5F00\u53D1\u3001\u7F16\u8BD1\u4E0E\u6253\u5305
|
|
1888
1907
|
|
|
1889
1908
|
\`\`\`bash
|