@h-ai/cli 0.1.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +167 -0
  3. package/dist/chunk-2H7UOFLK.js +10 -0
  4. package/dist/chunk-2H7UOFLK.js.map +1 -0
  5. package/dist/chunk-LANIDJC7.js +659 -0
  6. package/dist/chunk-LANIDJC7.js.map +1 -0
  7. package/dist/chunk-YV7WPUI6.js +206 -0
  8. package/dist/chunk-YV7WPUI6.js.map +1 -0
  9. package/dist/config-templates-S5RI2MC6.js +5 -0
  10. package/dist/config-templates-S5RI2MC6.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +1650 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/skill-templates-N5DU5FNX.js +5 -0
  15. package/dist/skill-templates-N5DU5FNX.js.map +1 -0
  16. package/dist/src-XJ6YXNAF.js +15030 -0
  17. package/dist/src-XJ6YXNAF.js.map +1 -0
  18. package/package.json +59 -0
  19. package/templates/README.md +126 -0
  20. package/templates/apps/admin/messages/en-US.json +33 -0
  21. package/templates/apps/admin/messages/zh-CN.json +33 -0
  22. package/templates/apps/admin/src/routes/+layout.svelte.hbs +30 -0
  23. package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -0
  24. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +44 -0
  25. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +45 -0
  26. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +37 -0
  27. package/templates/apps/admin/src/routes/api/health/+server.ts +12 -0
  28. package/templates/apps/android-app/.env.hbs +3 -0
  29. package/templates/apps/android-app/capacitor.config.ts.hbs +12 -0
  30. package/templates/apps/android-app/messages/en-US.json +24 -0
  31. package/templates/apps/android-app/messages/zh-CN.json +24 -0
  32. package/templates/apps/android-app/src/lib/api.ts.hbs +30 -0
  33. package/templates/apps/android-app/src/lib/capacitor.ts +21 -0
  34. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +42 -0
  35. package/templates/apps/android-app/src/routes/+layout.ts +7 -0
  36. package/templates/apps/android-app/src/routes/+page.svelte.hbs +27 -0
  37. package/templates/apps/api/src/routes/+layout.svelte +14 -0
  38. package/templates/apps/api/src/routes/+page.svelte +11 -0
  39. package/templates/apps/api/src/routes/api/v1/health/+server.ts +14 -0
  40. package/templates/apps/api/src/routes/api/v1/items/+server.ts +37 -0
  41. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +30 -0
  42. package/templates/apps/h5/messages/en-US.json +37 -0
  43. package/templates/apps/h5/messages/zh-CN.json +37 -0
  44. package/templates/apps/h5/src/routes/+layout.svelte.hbs +57 -0
  45. package/templates/apps/h5/src/routes/+page.svelte.hbs +27 -0
  46. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +27 -0
  47. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +27 -0
  48. package/templates/apps/website/messages/en-US.json +32 -0
  49. package/templates/apps/website/messages/zh-CN.json +32 -0
  50. package/templates/apps/website/src/routes/+layout.svelte.hbs +66 -0
  51. package/templates/apps/website/src/routes/+page.svelte.hbs +33 -0
  52. package/templates/apps/website/src/routes/about/+page.svelte.hbs +27 -0
  53. package/templates/apps/website/src/routes/api/health/+server.ts +12 -0
  54. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +59 -0
  55. package/templates/apps/website/src/routes/services/+page.svelte.hbs +63 -0
  56. package/templates/base/e2e/helpers.ts +49 -0
  57. package/templates/base/package.json.hbs +67 -0
  58. package/templates/base/playwright.config.ts +32 -0
  59. package/templates/base/src/app.css +2 -0
  60. package/templates/base/src/app.d.ts.hbs +18 -0
  61. package/templates/base/src/app.html.hbs +16 -0
  62. package/templates/base/src/hooks.server.ts.hbs +123 -0
  63. package/templates/base/src/lib/server/init.ts.hbs +190 -0
  64. package/templates/base/svelte.config.js.hbs +30 -0
  65. package/templates/base/tsconfig.json +8 -0
  66. package/templates/base/vite.config.ts.hbs +27 -0
  67. package/templates/features/ai/routes/api/chat/+server.ts +26 -0
  68. package/templates/features/datapipe/routes/api/datapipe/pipeline/+server.ts +41 -0
  69. package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +21 -0
  70. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +98 -0
  71. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +124 -0
  72. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +98 -0
  73. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +114 -0
  74. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +32 -0
  75. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +15 -0
  76. package/templates/features/iam/routes-shared/api/auth/me/+server.ts +12 -0
  77. package/templates/features/iam/routes-shared/api/auth/register/+server.ts +26 -0
  78. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +30 -0
  79. package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +42 -0
  80. package/templates/features/payment/routes/api/v1/payment/query/[orderNo]/+server.ts +25 -0
  81. package/templates/features/storage/routes/api/upload/+server.ts +35 -0
  82. package/templates/features/vecdb/routes/api/vecdb/search/+server.ts +36 -0
  83. package/templates/i18n/project.inlang/settings.json +11 -0
  84. package/templates/skills/AGENTS.md +26 -0
  85. package/templates/skills/CLAUDE.md +12 -0
  86. package/templates/skills/copilot-instructions.md +61 -0
  87. package/templates/skills/hai-ai/SKILL.md +721 -0
  88. package/templates/skills/hai-api-client/SKILL.md +355 -0
  89. package/templates/skills/hai-app-create/SKILL.md +371 -0
  90. package/templates/skills/hai-app-review/SKILL.md +156 -0
  91. package/templates/skills/hai-app-tests/SKILL.md +468 -0
  92. package/templates/skills/hai-audit/SKILL.md +145 -0
  93. package/templates/skills/hai-build/SKILL.md +319 -0
  94. package/templates/skills/hai-cache/SKILL.md +190 -0
  95. package/templates/skills/hai-capacitor/SKILL.md +377 -0
  96. package/templates/skills/hai-core/SKILL.md +484 -0
  97. package/templates/skills/hai-crypto/SKILL.md +198 -0
  98. package/templates/skills/hai-datapipe/SKILL.md +220 -0
  99. package/templates/skills/hai-deploy/SKILL.md +216 -0
  100. package/templates/skills/hai-iam/SKILL.md +361 -0
  101. package/templates/skills/hai-kit/SKILL.md +484 -0
  102. package/templates/skills/hai-payment/SKILL.md +275 -0
  103. package/templates/skills/hai-reach/SKILL.md +315 -0
  104. package/templates/skills/hai-reldb/SKILL.md +465 -0
  105. package/templates/skills/hai-scheduler/SKILL.md +188 -0
  106. package/templates/skills/hai-storage/SKILL.md +276 -0
  107. package/templates/skills/hai-ui/SKILL.md +438 -0
  108. package/templates/skills/hai-vecdb/SKILL.md +279 -0
  109. package/templates/skills/opencode.json +11 -0
@@ -0,0 +1,659 @@
1
+ #!/usr/bin/env node
2
+ // src/commands/config-templates.ts
3
+ function generateConfigFile(moduleKey, configs) {
4
+ switch (moduleKey) {
5
+ case "core":
6
+ return generateCoreConfig(configs?.core);
7
+ case "db":
8
+ return generateDbConfig(configs?.db);
9
+ case "cache":
10
+ return generateCacheConfig(configs?.cache);
11
+ case "iam":
12
+ return generateIamConfig(configs?.iam);
13
+ case "storage":
14
+ return generateStorageConfig(configs?.storage);
15
+ case "ai":
16
+ return generateAiConfig(configs?.ai);
17
+ case "deploy":
18
+ return generateDeployConfig();
19
+ case "vecdb":
20
+ return generateVecdbConfig();
21
+ case "reach":
22
+ return generateReachConfig();
23
+ case "scheduler":
24
+ return generateSchedulerConfig();
25
+ case "audit":
26
+ return generateAuditConfig();
27
+ case "payment":
28
+ return generatePaymentConfig();
29
+ default:
30
+ return `# ${moduleKey} \u914D\u7F6E
31
+ `;
32
+ }
33
+ }
34
+ function generateCoreConfig(cfg) {
35
+ const name = cfg?.name ?? "my-app";
36
+ const locale = cfg?.defaultLocale ?? "zh-CN";
37
+ const supportedLocales = locale === "en-US" ? ` - en-US
38
+ - zh-CN` : ` - zh-CN
39
+ - en-US`;
40
+ return `# =============================================================================
41
+ # \u5E94\u7528\u914D\u7F6E
42
+ # =============================================================================
43
+
44
+ name: ${name}
45
+ version: 0.1.0
46
+ env: \${HAI_ENV:development}
47
+ debug: \${HAI_DEBUG:false}
48
+
49
+ defaultLocale: ${locale}
50
+ supportedLocales:
51
+ ${supportedLocales}
52
+ `;
53
+ }
54
+ function generateDbConfig(cfg) {
55
+ const dbType = cfg?.type ?? "sqlite";
56
+ const database = cfg?.database ?? (dbType === "sqlite" ? "./data/app.db" : "hai");
57
+ const host = cfg?.host ?? "localhost";
58
+ const port = cfg?.port ?? (dbType === "postgresql" ? 5432 : 3306);
59
+ if (dbType === "sqlite") {
60
+ return `# =============================================================================
61
+ # \u6570\u636E\u5E93\u914D\u7F6E
62
+ # =============================================================================
63
+
64
+ # \u6570\u636E\u5E93\u7C7B\u578B: sqlite | postgresql | mysql
65
+ type: sqlite
66
+
67
+ # SQLite \u6570\u636E\u5E93\u8DEF\u5F84
68
+ database: \${HAI_RELDB_DATABASE:${database}}
69
+
70
+ # PostgreSQL/MySQL \u914D\u7F6E\uFF08\u53EF\u9009\uFF09
71
+ # host: \${HAI_RELDB_HOST:localhost}
72
+ # port: \${HAI_RELDB_PORT:5432}
73
+ # user: \${HAI_RELDB_USER:postgres}
74
+ # password: \${HAI_RELDB_PASSWORD:}
75
+ `;
76
+ }
77
+ const user = dbType === "postgresql" ? "postgres" : "root";
78
+ return `# =============================================================================
79
+ # \u6570\u636E\u5E93\u914D\u7F6E
80
+ # =============================================================================
81
+
82
+ # \u6570\u636E\u5E93\u7C7B\u578B: sqlite | postgresql | mysql
83
+ type: ${dbType}
84
+
85
+ # \u6570\u636E\u5E93\u540D\u79F0
86
+ database: \${HAI_RELDB_DATABASE:${database}}
87
+
88
+ # \u8FDE\u63A5\u914D\u7F6E
89
+ host: \${HAI_RELDB_HOST:${host}}
90
+ port: \${HAI_RELDB_PORT:${port}}
91
+ user: \${HAI_RELDB_USER:${user}}
92
+ password: \${HAI_RELDB_PASSWORD:}
93
+ `;
94
+ }
95
+ function generateCacheConfig(cfg) {
96
+ const cacheType = cfg?.type ?? "memory";
97
+ if (cacheType === "memory") {
98
+ return `# =============================================================================
99
+ # \u7F13\u5B58\u914D\u7F6E
100
+ # =============================================================================
101
+
102
+ # \u7F13\u5B58\u7C7B\u578B: memory | redis
103
+ type: memory
104
+
105
+ # Redis \u914D\u7F6E\uFF08\u5F53 type \u4E3A redis \u65F6\u4F7F\u7528\uFF09
106
+ # url: \${HAI_CACHE_REDIS_URL:redis://localhost:6379/0}
107
+ # host: \${HAI_CACHE_REDIS_HOST:localhost}
108
+ # port: \${HAI_CACHE_REDIS_PORT:6379}
109
+ # password: \${HAI_CACHE_REDIS_PASSWORD:}
110
+ # keyPrefix: \${HAI_CACHE_KEY_PREFIX:hai:}
111
+ `;
112
+ }
113
+ const host = cfg?.host ?? "localhost";
114
+ const port = cfg?.port ?? 6379;
115
+ return `# =============================================================================
116
+ # \u7F13\u5B58\u914D\u7F6E
117
+ # =============================================================================
118
+
119
+ # \u7F13\u5B58\u7C7B\u578B: memory | redis
120
+ type: redis
121
+
122
+ # Redis \u914D\u7F6E
123
+ host: \${HAI_CACHE_REDIS_HOST:${host}}
124
+ port: \${HAI_CACHE_REDIS_PORT:${port}}
125
+ password: \${HAI_CACHE_REDIS_PASSWORD:}
126
+ keyPrefix: \${HAI_CACHE_KEY_PREFIX:hai:}
127
+ `;
128
+ }
129
+ function generateIamConfig(cfg) {
130
+ const loginPassword = cfg?.loginPassword ?? true;
131
+ const loginOtp = cfg?.loginOtp ?? false;
132
+ return `# =============================================================================
133
+ # IAM \u914D\u7F6E
134
+ # =============================================================================
135
+
136
+ # \u767B\u5F55\u914D\u7F6E
137
+ login:
138
+ password: ${loginPassword}
139
+ otp: ${loginOtp}
140
+ ldap: false
141
+
142
+ # \u5BC6\u7801\u7B56\u7565
143
+ password:
144
+ minLength: 8
145
+ maxLength: 128
146
+ requireUppercase: false
147
+ requireLowercase: false
148
+ requireNumber: false
149
+ requireSpecialChar: false
150
+
151
+ # \u4F1A\u8BDD\u914D\u7F6E
152
+ session:
153
+ maxAge: 86400 # \u4F1A\u8BDD\u8D85\u65F6\uFF08\u79D2\uFF09\uFF0C\u9ED8\u8BA4 24 \u5C0F\u65F6
154
+ sliding: true # \u6ED1\u52A8\u7A97\u53E3\uFF08\u6BCF\u6B21\u8BF7\u6C42\u5237\u65B0\u8FC7\u671F\u65F6\u95F4\uFF09
155
+ singleDevice: false # \u5355\u8BBE\u5907\u767B\u5F55
156
+ refreshTokenMaxAge: 604800 # refreshToken \u8FC7\u671F\uFF08\u79D2\uFF09\uFF0C\u9ED8\u8BA4 7 \u5929
157
+
158
+ # RBAC \u914D\u7F6E
159
+ rbac:
160
+ defaultRole: user
161
+
162
+ # \u662F\u5426\u81EA\u52A8\u521B\u5EFA\u9ED8\u8BA4\u6570\u636E
163
+ seedDefaultData: true
164
+ `;
165
+ }
166
+ function generateStorageConfig(cfg) {
167
+ const storageType = cfg?.type ?? "local";
168
+ if (storageType === "local") {
169
+ const localPath = cfg?.localPath ?? "./data/uploads";
170
+ return `# =============================================================================
171
+ # \u5B58\u50A8\u914D\u7F6E
172
+ # =============================================================================
173
+
174
+ # \u9ED8\u8BA4 Provider
175
+ defaultProvider: local
176
+
177
+ # Provider \u914D\u7F6E
178
+ providers:
179
+ local:
180
+ type: local
181
+ root: \${HAI_STORAGE_PATH:${localPath}}
182
+ maxFileSize: 10485760 # 10MB
183
+
184
+ # S3 \u914D\u7F6E\uFF08\u53EF\u9009\uFF09
185
+ # s3:
186
+ # type: s3
187
+ # bucket: \${HAI_STORAGE_S3_BUCKET}
188
+ # region: \${HAI_STORAGE_S3_REGION:us-east-1}
189
+ # accessKeyId: \${HAI_STORAGE_S3_ACCESS_KEY}
190
+ # secretAccessKey: \${HAI_STORAGE_S3_SECRET_KEY}
191
+ # endpoint: \${HAI_STORAGE_S3_ENDPOINT}
192
+ # forcePathStyle: \${HAI_STORAGE_S3_FORCE_PATH_STYLE:false}
193
+ `;
194
+ }
195
+ return `# =============================================================================
196
+ # \u5B58\u50A8\u914D\u7F6E
197
+ # =============================================================================
198
+
199
+ # \u9ED8\u8BA4 Provider
200
+ defaultProvider: s3
201
+
202
+ # Provider \u914D\u7F6E
203
+ providers:
204
+ s3:
205
+ type: s3
206
+ bucket: \${HAI_STORAGE_S3_BUCKET}
207
+ region: \${HAI_STORAGE_S3_REGION:us-east-1}
208
+ accessKeyId: \${HAI_STORAGE_S3_ACCESS_KEY}
209
+ secretAccessKey: \${HAI_STORAGE_S3_SECRET_KEY}
210
+ # endpoint: \${HAI_STORAGE_S3_ENDPOINT}
211
+ # forcePathStyle: \${HAI_STORAGE_S3_FORCE_PATH_STYLE:false}
212
+
213
+ # \u672C\u5730\u5B58\u50A8\uFF08\u53EF\u9009\uFF09
214
+ # local:
215
+ # type: local
216
+ # root: \${HAI_STORAGE_PATH:./data/uploads}
217
+ # maxFileSize: 10485760 # 10MB
218
+ `;
219
+ }
220
+ function generateAiConfig(cfg) {
221
+ const model = cfg?.model ?? "gpt-4o-mini";
222
+ return `# =============================================================================
223
+ # AI \u914D\u7F6E
224
+ # =============================================================================
225
+
226
+ # LLM \u914D\u7F6E\uFF08\u5FC5\u586B\uFF09
227
+ llm:
228
+ # API Key\uFF08\u7559\u7A7A\u65F6\u81EA\u52A8\u8BFB\u53D6 HAI_AI_LLM_API_KEY / OPENAI_API_KEY \u73AF\u5883\u53D8\u91CF\uFF09
229
+ apiKey: \${HAI_AI_LLM_API_KEY:}
230
+ # Base URL\uFF08\u7559\u7A7A\u65F6\u81EA\u52A8\u8BFB\u53D6 HAI_AI_LLM_BASE_URL / OPENAI_BASE_URL\uFF0C\u9ED8\u8BA4 https://api.openai.com/v1\uFF09
231
+ # baseUrl: \${HAI_AI_LLM_BASE_URL:}
232
+ # \u9ED8\u8BA4\u6A21\u578B
233
+ model: ${model}
234
+ # \u5168\u5C40\u6700\u5927 Token \u6570\uFF08\u9ED8\u8BA4 4096\uFF09
235
+ # maxTokens: 4096
236
+ # \u91C7\u6837\u6E29\u5EA6\uFF080-2\uFF0C\u9ED8\u8BA4 0.7\uFF09
237
+ # temperature: 0.7
238
+ # \u8BF7\u6C42\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 60000\uFF09
239
+ # timeout: 60000
240
+
241
+ # \u591A\u6A21\u578B\u914D\u7F6E\uFF08\u53EF\u9009\uFF0C\u7528\u4E8E\u573A\u666F\u8DEF\u7531\uFF09
242
+ # models:
243
+ # - id: fast
244
+ # model: gpt-4o-mini
245
+ # - id: smart
246
+ # model: gpt-4o
247
+ # apiKey: \${HAI_AI_LLM_API_KEY:}
248
+
249
+ # \u573A\u666F\u6A21\u578B\u6620\u5C04\uFF08\u53EF\u9009\uFF09
250
+ # scenarios:
251
+ # default: fast
252
+ # analysis: smart
253
+ `;
254
+ }
255
+ function generateEnvExample(features, configs) {
256
+ const sections = [];
257
+ sections.push(`# =============================================================================
258
+ # Environment Variables
259
+ # =============================================================================
260
+ #
261
+ # Copy this file to .env and fill in actual values.
262
+ # Config files in config/ reference these variables via \${VAR_NAME:default} syntax.
263
+ #
264
+ # Naming convention: HAI_<MODULE>_<SETTING>
265
+ # =============================================================================`);
266
+ sections.push(`
267
+ # =============================================================================
268
+ # Application
269
+ # =============================================================================
270
+ # Environment: development | production | test
271
+ HAI_ENV=development
272
+ # Enable debug mode
273
+ HAI_DEBUG=false`);
274
+ if (features.includes("db")) {
275
+ const dbType = configs?.db?.type ?? "sqlite";
276
+ const dbDatabase = configs?.db?.database ?? (dbType === "sqlite" ? "./data/app.db" : "hai");
277
+ const isSqlite = dbType === "sqlite";
278
+ sections.push(`
279
+ # =============================================================================
280
+ # Database (@h-ai/reldb)
281
+ # =============================================================================
282
+ # Database type: sqlite | postgresql | mysql
283
+ HAI_RELDB_TYPE=${dbType}
284
+ # SQLite: file path; PostgreSQL/MySQL: database name
285
+ HAI_RELDB_DATABASE=${dbDatabase}${isSqlite ? `
286
+ # PostgreSQL/MySQL connection (uncomment when not using sqlite)
287
+ # HAI_RELDB_HOST=localhost
288
+ # HAI_RELDB_PORT=5432
289
+ # HAI_RELDB_USER=postgres
290
+ # HAI_RELDB_PASSWORD=` : `
291
+ # Connection
292
+ HAI_RELDB_HOST=${configs?.db?.host ?? "localhost"}
293
+ HAI_RELDB_PORT=${configs?.db?.port ?? (dbType === "postgresql" ? 5432 : 3306)}
294
+ HAI_RELDB_USER=${dbType === "postgresql" ? "postgres" : "root"}
295
+ HAI_RELDB_PASSWORD=`}`);
296
+ }
297
+ if (features.includes("iam")) {
298
+ sections.push(`
299
+ # =============================================================================
300
+ # IAM (@h-ai/iam)
301
+ # =============================================================================
302
+ HAI_IAM_SESSION_SECRET=change-me-to-a-strong-random-string-min-32-chars
303
+ # HAI_IAM_PASSWORD_MIN_LENGTH=8
304
+ # HAI_IAM_SESSION_MAX_AGE=86400
305
+ # HAI_IAM_REFRESH_TOKEN_MAX_AGE=604800
306
+ # HAI_IAM_MAX_LOGIN_ATTEMPTS=5
307
+ # HAI_KIT_COOKIE_KEY= # 32-char hex for SM4-CBC cookie encryption
308
+ `);
309
+ }
310
+ if (features.includes("cache")) {
311
+ const cacheType = configs?.cache?.type ?? "memory";
312
+ if (cacheType === "redis") {
313
+ sections.push(`
314
+ # =============================================================================
315
+ # Cache (@h-ai/cache)
316
+ # =============================================================================
317
+ # Cache type: memory | redis
318
+ HAI_CACHE_TYPE=redis
319
+ # Redis connection
320
+ HAI_CACHE_REDIS_HOST=${configs?.cache?.host ?? "localhost"}
321
+ HAI_CACHE_REDIS_PORT=${configs?.cache?.port ?? 6379}
322
+ HAI_CACHE_REDIS_PASSWORD=
323
+ # HAI_CACHE_REDIS_URL=redis://localhost:6379/0
324
+ # HAI_CACHE_REDIS_DB=0
325
+ # HAI_CACHE_CONNECT_TIMEOUT=10000
326
+ # HAI_CACHE_COMMAND_TIMEOUT=5000
327
+ # HAI_CACHE_KEY_PREFIX=hai:`);
328
+ } else {
329
+ sections.push(`
330
+ # =============================================================================
331
+ # Cache (@h-ai/cache)
332
+ # =============================================================================
333
+ # Cache type: memory | redis
334
+ HAI_CACHE_TYPE=memory
335
+ # Redis connection (uncomment when type=redis)
336
+ # HAI_CACHE_REDIS_URL=redis://localhost:6379/0
337
+ # HAI_CACHE_REDIS_HOST=localhost
338
+ # HAI_CACHE_REDIS_PORT=6379
339
+ # HAI_CACHE_REDIS_PASSWORD=
340
+ # HAI_CACHE_REDIS_DB=0
341
+ # HAI_CACHE_CONNECT_TIMEOUT=10000
342
+ # HAI_CACHE_COMMAND_TIMEOUT=5000
343
+ # HAI_CACHE_KEY_PREFIX=hai:`);
344
+ }
345
+ }
346
+ if (features.includes("storage")) {
347
+ const storageType = configs?.storage?.type ?? "local";
348
+ if (storageType === "s3") {
349
+ sections.push(`
350
+ # =============================================================================
351
+ # Storage (@h-ai/storage)
352
+ # =============================================================================
353
+ # Storage type: local | s3
354
+ HAI_STORAGE_TYPE=s3
355
+ # S3 / S3-compatible
356
+ HAI_STORAGE_S3_BUCKET=
357
+ HAI_STORAGE_S3_REGION=us-east-1
358
+ HAI_STORAGE_S3_ACCESS_KEY=
359
+ HAI_STORAGE_S3_SECRET_KEY=
360
+ # HAI_STORAGE_S3_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.
361
+ # HAI_STORAGE_S3_FORCE_PATH_STYLE=false
362
+ # Local storage (uncomment when type=local)
363
+ # HAI_STORAGE_PATH=./data/uploads`);
364
+ } else {
365
+ sections.push(`
366
+ # =============================================================================
367
+ # Storage (@h-ai/storage)
368
+ # =============================================================================
369
+ # Storage type: local | s3
370
+ HAI_STORAGE_TYPE=local
371
+ # Local storage root path
372
+ HAI_STORAGE_PATH=${configs?.storage?.localPath ?? "./data/uploads"}
373
+ # S3 / S3-compatible (uncomment when type=s3)
374
+ # HAI_STORAGE_S3_BUCKET=
375
+ # HAI_STORAGE_S3_REGION=us-east-1
376
+ # HAI_STORAGE_S3_ACCESS_KEY=
377
+ # HAI_STORAGE_S3_SECRET_KEY=
378
+ # HAI_STORAGE_S3_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.
379
+ # HAI_STORAGE_S3_FORCE_PATH_STYLE=false`);
380
+ }
381
+ }
382
+ if (features.includes("ai")) {
383
+ const provider = configs?.ai?.defaultProvider ?? "openai";
384
+ if (provider === "anthropic") {
385
+ sections.push(`
386
+ # =============================================================================
387
+ # AI (@h-ai/ai)
388
+ # =============================================================================
389
+ # OpenAI-compatible API Key (Anthropic models via OpenAI-compatible proxy)
390
+ HAI_AI_LLM_API_KEY=
391
+ # HAI_AI_LLM_BASE_URL= # Custom base URL
392
+ # Optional compatibility fallback
393
+ # OPENAI_API_KEY=`);
394
+ } else if (provider === "openai") {
395
+ sections.push(`
396
+ # =============================================================================
397
+ # AI (@h-ai/ai)
398
+ # =============================================================================
399
+ # OpenAI / OpenAI-compatible
400
+ HAI_AI_LLM_API_KEY=
401
+ # HAI_AI_LLM_BASE_URL= # Custom base URL (e.g. local proxy, Azure)
402
+ # Optional compatibility fallback
403
+ # OPENAI_API_KEY=`);
404
+ } else {
405
+ sections.push(`
406
+ # =============================================================================
407
+ # AI (@h-ai/ai)
408
+ # =============================================================================
409
+ # OpenAI-compatible provider
410
+ HAI_AI_LLM_API_KEY=
411
+ # HAI_AI_LLM_BASE_URL= # Custom base URL
412
+ # Optional compatibility fallback
413
+ # OPENAI_API_KEY=`);
414
+ }
415
+ }
416
+ if (features.includes("vecdb")) {
417
+ sections.push(`
418
+ # =============================================================================
419
+ # Vector Database (@h-ai/vecdb)
420
+ # =============================================================================
421
+ # Backend type: lancedb | pgvector | qdrant
422
+ HAI_VECDB_TYPE=lancedb
423
+ # LanceDB data path
424
+ HAI_VECDB_PATH=./data/vecdb
425
+ # Qdrant (uncomment when type=qdrant)
426
+ # HAI_VECDB_QDRANT_URL=http://localhost:6333
427
+ # HAI_VECDB_QDRANT_API_KEY=
428
+ `);
429
+ }
430
+ if (features.includes("reach")) {
431
+ sections.push(`
432
+ # =============================================================================
433
+ # Reach (@h-ai/reach)
434
+ # =============================================================================
435
+ # SMTP (uncomment when enabling email provider)
436
+ # HAI_REACH_SMTP_HOST=smtp.example.com
437
+ # HAI_REACH_SMTP_PORT=465
438
+ # HAI_REACH_SMTP_USER=
439
+ # HAI_REACH_SMTP_PASS=
440
+ # HAI_REACH_SMTP_FROM=noreply@example.com
441
+ `);
442
+ }
443
+ if (features.includes("payment")) {
444
+ sections.push(`
445
+ # =============================================================================
446
+ # Payment (@h-ai/payment)
447
+ # =============================================================================
448
+ # WeChat Pay
449
+ # HAI_PAYMENT_WECHAT_MCH_ID=
450
+ # HAI_PAYMENT_WECHAT_API_V3_KEY=
451
+ # HAI_PAYMENT_WECHAT_SERIAL_NO=
452
+ # HAI_PAYMENT_WECHAT_PRIVATE_KEY=
453
+ # HAI_PAYMENT_WECHAT_APP_ID=
454
+ # Alipay
455
+ # HAI_PAYMENT_ALIPAY_APP_ID=
456
+ # HAI_PAYMENT_ALIPAY_PRIVATE_KEY=
457
+ # HAI_PAYMENT_ALIPAY_PUBLIC_KEY=
458
+ # Stripe
459
+ # HAI_PAYMENT_STRIPE_SECRET_KEY=
460
+ # HAI_PAYMENT_STRIPE_WEBHOOK_SECRET=
461
+ `);
462
+ }
463
+ sections.push(`
464
+ # =============================================================================
465
+ # Testing
466
+ # =============================================================================
467
+ # E2E test mode (relaxes rate limiting etc.)
468
+ # HAI_E2E=1
469
+ `);
470
+ return sections.join("\n");
471
+ }
472
+ function generateDeployConfig() {
473
+ return `# =============================================================================
474
+ # \u90E8\u7F72\u914D\u7F6E (@h-ai/deploy)
475
+ # =============================================================================
476
+ # \u90E8\u7F72\u5E73\u53F0\u51ED\u8BC1\u901A\u8FC7 ~/.hai/credentials.yml \u7BA1\u7406
477
+ # \u73AF\u5883\u53D8\u91CF\u5F15\u7528\u683C\u5F0F: \${VAR_NAME:default_value}
478
+
479
+ # \u90E8\u7F72\u5E73\u53F0
480
+ provider:
481
+ type: vercel
482
+ token: \${HAI_DEPLOY_VERCEL_TOKEN}
483
+
484
+ # \u57FA\u7840\u8BBE\u65BD\u670D\u52A1\uFF08\u6309\u9700\u5F00\u542F\uFF09
485
+ services:
486
+ # PostgreSQL \u6570\u636E\u5E93 (Neon)
487
+ # db:
488
+ # provisioner: neon
489
+ # apiKey: \${HAI_DEPLOY_NEON_API_KEY}
490
+
491
+ # Redis \u7F13\u5B58 (Upstash)
492
+ # cache:
493
+ # provisioner: upstash
494
+ # email: \${HAI_DEPLOY_UPSTASH_EMAIL}
495
+ # apiKey: \${HAI_DEPLOY_UPSTASH_API_KEY}
496
+
497
+ # S3 \u5B58\u50A8 (Cloudflare R2)
498
+ # storage:
499
+ # provisioner: cloudflare-r2
500
+ # accountId: \${HAI_DEPLOY_CF_ACCOUNT_ID}
501
+ # apiToken: \${HAI_DEPLOY_CF_API_TOKEN}
502
+
503
+ # \u90AE\u4EF6 (Resend)
504
+ # email:
505
+ # provisioner: resend
506
+ # apiKey: \${HAI_DEPLOY_RESEND_API_KEY}
507
+
508
+ # \u77ED\u4FE1 (\u963F\u91CC\u4E91)
509
+ # sms:
510
+ # provisioner: aliyun
511
+ # accessKeyId: \${HAI_DEPLOY_ALIYUN_ACCESS_KEY_ID}
512
+ # accessKeySecret: \${HAI_DEPLOY_ALIYUN_ACCESS_KEY_SECRET}
513
+ `;
514
+ }
515
+ function generateVecdbConfig() {
516
+ return `# =============================================================================
517
+ # \u5411\u91CF\u6570\u636E\u5E93\u914D\u7F6E (@h-ai/vecdb)
518
+ # =============================================================================
519
+
520
+ # \u6570\u636E\u5E93\u7C7B\u578B: lancedb | pgvector | qdrant
521
+ type: lancedb
522
+
523
+ # LanceDB \u6570\u636E\u76EE\u5F55
524
+ path: \${HAI_VECDB_PATH:./data/vecdb}
525
+
526
+ # \u8DDD\u79BB\u5EA6\u91CF: cosine | euclidean | dot
527
+ # metric: cosine
528
+
529
+ # pgvector \u914D\u7F6E\uFF08\u5F53 type \u4E3A pgvector \u65F6\u4F7F\u7528\uFF09
530
+ # type: pgvector
531
+ # host: \${HAI_RELDB_HOST:localhost}
532
+ # port: \${HAI_RELDB_PORT:5432}
533
+ # database: \${HAI_RELDB_DATABASE:hai}
534
+ # user: \${HAI_RELDB_USER:postgres}
535
+ # password: \${HAI_RELDB_PASSWORD:}
536
+ # indexType: hnsw
537
+ # tablePrefix: vec_
538
+
539
+ # Qdrant \u914D\u7F6E\uFF08\u5F53 type \u4E3A qdrant \u65F6\u4F7F\u7528\uFF09
540
+ # type: qdrant
541
+ # url: \${HAI_VECDB_QDRANT_URL:http://localhost:6333}
542
+ # apiKey: \${HAI_VECDB_QDRANT_API_KEY:}
543
+ `;
544
+ }
545
+ function generateReachConfig() {
546
+ return `# =============================================================================
547
+ # \u6D88\u606F\u63A8\u9001\u914D\u7F6E (@h-ai/reach)
548
+ # =============================================================================
549
+
550
+ providers:
551
+ # \u63A7\u5236\u53F0\u8F93\u51FA\uFF08\u5F00\u53D1/\u6D4B\u8BD5\u7528\uFF09
552
+ - name: console_dev
553
+ type: console
554
+
555
+ # SMTP \u90AE\u4EF6\uFF08\u6309\u9700\u5F00\u542F\uFF09
556
+ # - name: email
557
+ # type: smtp
558
+ # host: \${HAI_REACH_SMTP_HOST:smtp.example.com}
559
+ # port: \${HAI_REACH_SMTP_PORT:465}
560
+ # secure: true
561
+ # user: \${HAI_REACH_SMTP_USER:}
562
+ # pass: \${HAI_REACH_SMTP_PASS:}
563
+ # from: \${HAI_REACH_SMTP_FROM:noreply@example.com}
564
+
565
+ # \u963F\u91CC\u4E91\u77ED\u4FE1\uFF08\u6309\u9700\u5F00\u542F\uFF09
566
+ # - name: sms
567
+ # type: aliyun-sms
568
+ # accessKeyId: \${HAI_REACH_SMS_ACCESS_KEY}
569
+ # accessKeySecret: \${HAI_REACH_SMS_SECRET_KEY}
570
+ # signName: MyApp
571
+
572
+ # \u6A21\u677F\uFF08\u53EF\u9009\uFF09
573
+ # templates:
574
+ # - name: verification_code
575
+ # provider: email
576
+ # subject: "\u9A8C\u8BC1\u7801: {code}"
577
+ # body: "\u60A8\u7684\u9A8C\u8BC1\u7801\u662F {code}\uFF0C\u6709\u6548\u671F {minutes} \u5206\u949F\u3002"
578
+
579
+ # \u514D\u6253\u6270\uFF08\u53EF\u9009\uFF09
580
+ # dnd:
581
+ # enabled: true
582
+ # strategy: delay
583
+ # start: "22:00"
584
+ # end: "08:00"
585
+ `;
586
+ }
587
+ function generateSchedulerConfig() {
588
+ return `# =============================================================================
589
+ # \u4EFB\u52A1\u8C03\u5EA6\u914D\u7F6E (@h-ai/scheduler)
590
+ # =============================================================================
591
+
592
+ # \u662F\u5426\u542F\u7528\u6570\u636E\u5E93\u65E5\u5FD7\uFF08\u9700\u8981 @h-ai/reldb\uFF09
593
+ enableDb: true
594
+
595
+ # \u6267\u884C\u65E5\u5FD7\u8868\u540D
596
+ tableName: hai_scheduler_logs
597
+
598
+ # \u4EFB\u52A1\u5B9A\u4E49\u8868\u540D
599
+ taskTableName: hai_scheduler_tasks
600
+
601
+ # \u5206\u5E03\u5F0F\u9501\u8868\u540D
602
+ lockTableName: hai_scheduler_locks
603
+
604
+ # \u68C0\u67E5\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09
605
+ tickInterval: 1000
606
+
607
+ # \u9501\u8FC7\u671F\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09
608
+ lockExpireMs: 300000
609
+ `;
610
+ }
611
+ function generateAuditConfig() {
612
+ return `# =============================================================================
613
+ # \u5BA1\u8BA1\u65E5\u5FD7\u914D\u7F6E (@h-ai/audit)
614
+ # =============================================================================
615
+
616
+ # \u5BA1\u8BA1\u65E5\u5FD7\u8868\u540D
617
+ tableName: hai_audit_logs
618
+
619
+ # \u7528\u6237\u8868\u540D\uFF08\u7528\u4E8E JOIN \u67E5\u8BE2\uFF09
620
+ userTable: hai_iam_users
621
+
622
+ # \u7528\u6237\u8868\u4E3B\u952E\u5217\u540D
623
+ userIdColumn: id
624
+
625
+ # \u7528\u6237\u540D\u5217\u540D
626
+ userNameColumn: username
627
+ `;
628
+ }
629
+ function generatePaymentConfig() {
630
+ return `# =============================================================================
631
+ # \u652F\u4ED8\u914D\u7F6E (@h-ai/payment)
632
+ # =============================================================================
633
+
634
+ # \u5FAE\u4FE1\u652F\u4ED8\uFF08\u6309\u9700\u5F00\u542F\uFF09
635
+ # wechat:
636
+ # mchId: \${HAI_PAYMENT_WECHAT_MCH_ID}
637
+ # apiV3Key: \${HAI_PAYMENT_WECHAT_API_V3_KEY}
638
+ # serialNo: \${HAI_PAYMENT_WECHAT_SERIAL_NO}
639
+ # privateKey: \${HAI_PAYMENT_WECHAT_PRIVATE_KEY}
640
+ # appId: \${HAI_PAYMENT_WECHAT_APP_ID}
641
+
642
+ # \u652F\u4ED8\u5B9D\uFF08\u6309\u9700\u5F00\u542F\uFF09
643
+ # alipay:
644
+ # appId: \${HAI_PAYMENT_ALIPAY_APP_ID}
645
+ # privateKey: \${HAI_PAYMENT_ALIPAY_PRIVATE_KEY}
646
+ # alipayPublicKey: \${HAI_PAYMENT_ALIPAY_PUBLIC_KEY}
647
+ # signType: RSA2
648
+ # sandbox: false
649
+
650
+ # Stripe\uFF08\u6309\u9700\u5F00\u542F\uFF09
651
+ # stripe:
652
+ # secretKey: \${HAI_PAYMENT_STRIPE_SECRET_KEY}
653
+ # webhookSecret: \${HAI_PAYMENT_STRIPE_WEBHOOK_SECRET}
654
+ `;
655
+ }
656
+
657
+ export { generateConfigFile, generateEnvExample };
658
+ //# sourceMappingURL=chunk-LANIDJC7.js.map
659
+ //# sourceMappingURL=chunk-LANIDJC7.js.map