@h-ai/cli 0.1.0-alpha.42 → 0.1.0-alpha.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CFCXOKGV.js → chunk-U4PA632G.js} +123 -125
- package/dist/chunk-U4PA632G.js.map +1 -0
- package/dist/cli-config-templates-GSXKLGU5.js +5 -0
- package/dist/{cli-config-templates-5J5VKWWD.js.map → cli-config-templates-GSXKLGU5.js.map} +1 -1
- package/dist/index.js +2 -2
- package/package.json +2 -2
- package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +4 -2
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +3 -3
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +0 -7
- package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +18 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +20 -34
- package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +7 -2
- package/templates/apps/api/e2e/api-service.spec.ts.hbs +5 -1
- package/templates/apps/api/package.json.hbs +4 -0
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +5 -3
- package/templates/apps/fullstack/package.json.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +6 -4
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-contract.ts.hbs +6 -7
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -6
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +0 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +4 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +2 -17
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +3 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +24 -6
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +17 -19
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +8 -5
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +3 -3
- package/templates/apps/mobile-app/src/lib/api.ts.hbs +1 -2
- package/templates/base/e2e/app.spec.ts.hbs +4 -1
- package/templates/base/package.json.hbs +1 -1
- package/templates/skills/hai-ai/SKILL.md +11 -4
- package/templates/skills/hai-ai/reference.md +2 -2
- package/templates/skills/hai-api-contract/SKILL.md +34 -8
- package/templates/skills/hai-build/SKILL.md +9 -6
- package/templates/skills/hai-cache/SKILL.md +9 -6
- package/templates/skills/hai-capacitor/SKILL.md +0 -2
- package/templates/skills/hai-core/SKILL.md +15 -9
- package/templates/skills/hai-deploy/SKILL.md +3 -0
- package/templates/skills/hai-iam/SKILL.md +7 -4
- package/templates/skills/hai-payment/SKILL.md +14 -11
- package/templates/skills/hai-reach/SKILL.md +3 -0
- package/templates/skills/hai-reldb/SKILL.md +9 -6
- package/templates/skills/hai-serv/SKILL.md +46 -2
- package/templates/skills/hai-storage/SKILL.md +10 -7
- package/templates/skills/hai-vecdb/SKILL.md +8 -5
- package/dist/chunk-CFCXOKGV.js.map +0 -1
- package/dist/cli-config-templates-5J5VKWWD.js +0 -5
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-routes.ts.hbs +0 -27
|
@@ -45,8 +45,8 @@ function generateCoreConfig(cfg) {
|
|
|
45
45
|
|
|
46
46
|
name: ${name}
|
|
47
47
|
version: 0.1.0
|
|
48
|
-
env:
|
|
49
|
-
debug:
|
|
48
|
+
env: development
|
|
49
|
+
debug: false
|
|
50
50
|
|
|
51
51
|
defaultLocale: ${locale}
|
|
52
52
|
supportedLocales:
|
|
@@ -87,13 +87,13 @@ function generateDbConfig(cfg) {
|
|
|
87
87
|
type: sqlite
|
|
88
88
|
|
|
89
89
|
# SQLite \u6570\u636E\u5E93\u8DEF\u5F84
|
|
90
|
-
database:
|
|
90
|
+
database: ${database}
|
|
91
91
|
|
|
92
92
|
# PostgreSQL/MySQL \u914D\u7F6E\uFF08\u53EF\u9009\uFF09
|
|
93
|
-
# host:
|
|
94
|
-
# port:
|
|
95
|
-
# user:
|
|
96
|
-
# password:
|
|
93
|
+
# host: localhost
|
|
94
|
+
# port: 5432
|
|
95
|
+
# user: postgres
|
|
96
|
+
# password: ''
|
|
97
97
|
`;
|
|
98
98
|
}
|
|
99
99
|
const user = dbType === "postgresql" ? "postgres" : "root";
|
|
@@ -105,13 +105,13 @@ database: \${HAI_RELDB_DATABASE:${database}}
|
|
|
105
105
|
type: ${dbType}
|
|
106
106
|
|
|
107
107
|
# \u6570\u636E\u5E93\u540D\u79F0
|
|
108
|
-
database:
|
|
108
|
+
database: ${database}
|
|
109
109
|
|
|
110
110
|
# \u8FDE\u63A5\u914D\u7F6E
|
|
111
|
-
host:
|
|
112
|
-
port:
|
|
113
|
-
user:
|
|
114
|
-
password:
|
|
111
|
+
host: ${host}
|
|
112
|
+
port: ${port}
|
|
113
|
+
user: ${user}
|
|
114
|
+
password: ''
|
|
115
115
|
`;
|
|
116
116
|
}
|
|
117
117
|
function generateCacheConfig(cfg) {
|
|
@@ -125,11 +125,11 @@ function generateCacheConfig(cfg) {
|
|
|
125
125
|
type: memory
|
|
126
126
|
|
|
127
127
|
# Redis \u914D\u7F6E\uFF08\u5F53 type \u4E3A redis \u65F6\u4F7F\u7528\uFF09
|
|
128
|
-
# url:
|
|
129
|
-
# host:
|
|
130
|
-
# port:
|
|
131
|
-
# password:
|
|
132
|
-
# keyPrefix:
|
|
128
|
+
# url: redis://localhost:6379/0
|
|
129
|
+
# host: localhost
|
|
130
|
+
# port: 6379
|
|
131
|
+
# password: ''
|
|
132
|
+
# keyPrefix: 'hai:'
|
|
133
133
|
`;
|
|
134
134
|
}
|
|
135
135
|
const host = cfg?.host ?? "localhost";
|
|
@@ -142,10 +142,10 @@ type: memory
|
|
|
142
142
|
type: redis
|
|
143
143
|
|
|
144
144
|
# Redis \u914D\u7F6E
|
|
145
|
-
host:
|
|
146
|
-
port:
|
|
147
|
-
password:
|
|
148
|
-
keyPrefix:
|
|
145
|
+
host: ${host}
|
|
146
|
+
port: ${port}
|
|
147
|
+
password: ''
|
|
148
|
+
keyPrefix: 'hai:'
|
|
149
149
|
`;
|
|
150
150
|
}
|
|
151
151
|
function generateIamConfig(cfg) {
|
|
@@ -200,18 +200,18 @@ defaultProvider: local
|
|
|
200
200
|
providers:
|
|
201
201
|
local:
|
|
202
202
|
type: local
|
|
203
|
-
root:
|
|
203
|
+
root: ${localPath}
|
|
204
204
|
maxFileSize: 10485760 # 10MB
|
|
205
205
|
|
|
206
206
|
# S3 \u914D\u7F6E\uFF08\u53EF\u9009\uFF09
|
|
207
207
|
# s3:
|
|
208
208
|
# type: s3
|
|
209
|
-
# bucket:
|
|
210
|
-
# region:
|
|
211
|
-
# accessKeyId:
|
|
212
|
-
# secretAccessKey:
|
|
213
|
-
# endpoint:
|
|
214
|
-
# forcePathStyle:
|
|
209
|
+
# bucket: my-bucket
|
|
210
|
+
# region: us-east-1
|
|
211
|
+
# accessKeyId: ''
|
|
212
|
+
# secretAccessKey: ''
|
|
213
|
+
# endpoint: ''
|
|
214
|
+
# forcePathStyle: false
|
|
215
215
|
`;
|
|
216
216
|
}
|
|
217
217
|
return `# =============================================================================
|
|
@@ -225,17 +225,17 @@ defaultProvider: s3
|
|
|
225
225
|
providers:
|
|
226
226
|
s3:
|
|
227
227
|
type: s3
|
|
228
|
-
bucket:
|
|
229
|
-
region:
|
|
230
|
-
accessKeyId:
|
|
231
|
-
secretAccessKey:
|
|
232
|
-
# endpoint:
|
|
233
|
-
# forcePathStyle:
|
|
228
|
+
bucket: ''
|
|
229
|
+
region: us-east-1
|
|
230
|
+
accessKeyId: ''
|
|
231
|
+
secretAccessKey: ''
|
|
232
|
+
# endpoint: ''
|
|
233
|
+
# forcePathStyle: false
|
|
234
234
|
|
|
235
235
|
# \u672C\u5730\u5B58\u50A8\uFF08\u53EF\u9009\uFF09
|
|
236
236
|
# local:
|
|
237
237
|
# type: local
|
|
238
|
-
# root:
|
|
238
|
+
# root: ./data/uploads
|
|
239
239
|
# maxFileSize: 10485760 # 10MB
|
|
240
240
|
`;
|
|
241
241
|
}
|
|
@@ -247,10 +247,10 @@ function generateAiConfig(cfg) {
|
|
|
247
247
|
|
|
248
248
|
# LLM \u914D\u7F6E\uFF08\u5FC5\u586B\uFF09
|
|
249
249
|
llm:
|
|
250
|
-
# API Key\uFF08\
|
|
251
|
-
apiKey:
|
|
252
|
-
# Base URL\uFF08\
|
|
253
|
-
# baseUrl:
|
|
250
|
+
# API Key\uFF08\u7EA6\u5B9A\u73AF\u5883\u53D8\u91CF HAI_AI_LLM_APIKEY \u4F18\u5148\uFF09
|
|
251
|
+
apiKey: ''
|
|
252
|
+
# Base URL\uFF08\u7EA6\u5B9A\u73AF\u5883\u53D8\u91CF HAI_AI_LLM_BASEURL \u4F18\u5148\uFF09
|
|
253
|
+
# baseUrl: https://api.openai.com/v1
|
|
254
254
|
# \u9ED8\u8BA4\u6A21\u578B
|
|
255
255
|
model: ${model}
|
|
256
256
|
# \u5168\u5C40\u6700\u5927 Token \u6570\uFF08\u9ED8\u8BA4 4096\uFF09
|
|
@@ -266,7 +266,7 @@ llm:
|
|
|
266
266
|
# model: gpt-4o-mini
|
|
267
267
|
# - id: smart
|
|
268
268
|
# model: gpt-4o
|
|
269
|
-
# apiKey:
|
|
269
|
+
# apiKey: ''
|
|
270
270
|
|
|
271
271
|
# \u573A\u666F\u6A21\u578B\u6620\u5C04\uFF08\u53EF\u9009\uFF09
|
|
272
272
|
# scenarios:
|
|
@@ -281,18 +281,18 @@ function generateEnvExample(features, configs) {
|
|
|
281
281
|
# =============================================================================
|
|
282
282
|
#
|
|
283
283
|
# Copy this file to .env and fill in actual values.
|
|
284
|
-
# Config files
|
|
284
|
+
# Config files use literal defaults; matching HAI variables override YAML leaves.
|
|
285
285
|
#
|
|
286
|
-
# Naming convention: HAI_<
|
|
286
|
+
# Naming convention: HAI_<config name>_<YAML path>
|
|
287
287
|
# =============================================================================`);
|
|
288
288
|
sections.push(`
|
|
289
289
|
# =============================================================================
|
|
290
290
|
# Application
|
|
291
291
|
# =============================================================================
|
|
292
292
|
# Environment: development | production | test
|
|
293
|
-
|
|
293
|
+
HAI_CORE_ENV=development
|
|
294
294
|
# Enable debug mode
|
|
295
|
-
|
|
295
|
+
HAI_CORE_DEBUG=false`);
|
|
296
296
|
if (features.includes("db")) {
|
|
297
297
|
const dbType = configs?.db?.type ?? "sqlite";
|
|
298
298
|
const dbDatabase = configs?.db?.database ?? (dbType === "sqlite" ? "./data/app.db" : "hai");
|
|
@@ -302,30 +302,28 @@ HAI_DEBUG=false`);
|
|
|
302
302
|
# Database (@h-ai/reldb)
|
|
303
303
|
# =============================================================================
|
|
304
304
|
# Database type: sqlite | postgresql | mysql
|
|
305
|
-
|
|
305
|
+
HAI_DB_TYPE=${dbType}
|
|
306
306
|
# SQLite: file path; PostgreSQL/MySQL: database name
|
|
307
|
-
|
|
307
|
+
HAI_DB_DATABASE=${dbDatabase}${isSqlite ? `
|
|
308
308
|
# PostgreSQL/MySQL connection (uncomment when not using sqlite)
|
|
309
|
-
#
|
|
310
|
-
#
|
|
311
|
-
#
|
|
312
|
-
#
|
|
309
|
+
# HAI_DB_HOST=localhost
|
|
310
|
+
# HAI_DB_PORT=5432
|
|
311
|
+
# HAI_DB_USER=postgres
|
|
312
|
+
# HAI_DB_PASSWORD=` : `
|
|
313
313
|
# Connection
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
314
|
+
HAI_DB_HOST=${configs?.db?.host ?? "localhost"}
|
|
315
|
+
HAI_DB_PORT=${configs?.db?.port ?? (dbType === "postgresql" ? 5432 : 3306)}
|
|
316
|
+
HAI_DB_USER=${dbType === "postgresql" ? "postgres" : "root"}
|
|
317
|
+
HAI_DB_PASSWORD=`}`);
|
|
318
318
|
}
|
|
319
319
|
if (features.includes("iam")) {
|
|
320
320
|
sections.push(`
|
|
321
321
|
# =============================================================================
|
|
322
322
|
# IAM (@h-ai/iam)
|
|
323
323
|
# =============================================================================
|
|
324
|
-
|
|
325
|
-
#
|
|
326
|
-
#
|
|
327
|
-
# HAI_IAM_REFRESH_TOKEN_MAX_AGE=604800
|
|
328
|
-
# HAI_IAM_MAX_LOGIN_ATTEMPTS=5
|
|
324
|
+
# HAI_IAM_PASSWORD_MINLENGTH=8
|
|
325
|
+
# HAI_IAM_SESSION_MAXAGE=86400
|
|
326
|
+
# HAI_IAM_SESSION_REFRESHTOKENMAXAGE=604800
|
|
329
327
|
# HAI_KIT_COOKIE_KEY= # 32-char hex for SM4-CBC cookie encryption
|
|
330
328
|
`);
|
|
331
329
|
}
|
|
@@ -339,11 +337,11 @@ HAI_IAM_SESSION_SECRET=change-me-to-a-strong-random-string-min-32-chars
|
|
|
339
337
|
# Cache type: memory | redis
|
|
340
338
|
HAI_CACHE_TYPE=redis
|
|
341
339
|
# Redis connection
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
#
|
|
346
|
-
#
|
|
340
|
+
HAI_CACHE_HOST=${configs?.cache?.host ?? "localhost"}
|
|
341
|
+
HAI_CACHE_PORT=${configs?.cache?.port ?? 6379}
|
|
342
|
+
HAI_CACHE_PASSWORD=
|
|
343
|
+
# HAI_CACHE_URL=redis://localhost:6379/0
|
|
344
|
+
# HAI_CACHE_DB=0
|
|
347
345
|
# HAI_CACHE_CONNECT_TIMEOUT=10000
|
|
348
346
|
# HAI_CACHE_COMMAND_TIMEOUT=5000
|
|
349
347
|
# HAI_CACHE_KEY_PREFIX=hai:`);
|
|
@@ -355,11 +353,11 @@ HAI_CACHE_REDIS_PASSWORD=
|
|
|
355
353
|
# Cache type: memory | redis
|
|
356
354
|
HAI_CACHE_TYPE=memory
|
|
357
355
|
# Redis connection (uncomment when type=redis)
|
|
358
|
-
#
|
|
359
|
-
#
|
|
360
|
-
#
|
|
361
|
-
#
|
|
362
|
-
#
|
|
356
|
+
# HAI_CACHE_URL=redis://localhost:6379/0
|
|
357
|
+
# HAI_CACHE_HOST=localhost
|
|
358
|
+
# HAI_CACHE_PORT=6379
|
|
359
|
+
# HAI_CACHE_PASSWORD=
|
|
360
|
+
# HAI_CACHE_DB=0
|
|
363
361
|
# HAI_CACHE_CONNECT_TIMEOUT=10000
|
|
364
362
|
# HAI_CACHE_COMMAND_TIMEOUT=5000
|
|
365
363
|
# HAI_CACHE_KEY_PREFIX=hai:`);
|
|
@@ -372,33 +370,33 @@ HAI_CACHE_TYPE=memory
|
|
|
372
370
|
# =============================================================================
|
|
373
371
|
# Storage (@h-ai/storage)
|
|
374
372
|
# =============================================================================
|
|
375
|
-
#
|
|
376
|
-
|
|
373
|
+
# Default storage provider: local | s3
|
|
374
|
+
HAI_STORAGE_DEFAULTPROVIDER=s3
|
|
377
375
|
# S3 / S3-compatible
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
#
|
|
383
|
-
#
|
|
376
|
+
HAI_STORAGE_PROVIDERS_S3_BUCKET=
|
|
377
|
+
HAI_STORAGE_PROVIDERS_S3_REGION=us-east-1
|
|
378
|
+
HAI_STORAGE_PROVIDERS_S3_ACCESSKEYID=
|
|
379
|
+
HAI_STORAGE_PROVIDERS_S3_SECRETACCESSKEY=
|
|
380
|
+
# HAI_STORAGE_PROVIDERS_S3_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.
|
|
381
|
+
# HAI_STORAGE_PROVIDERS_S3_FORCEPATHSTYLE=false
|
|
384
382
|
# Local storage (uncomment when type=local)
|
|
385
|
-
#
|
|
383
|
+
# HAI_STORAGE_PROVIDERS_LOCAL_ROOT=./data/uploads`);
|
|
386
384
|
} else {
|
|
387
385
|
sections.push(`
|
|
388
386
|
# =============================================================================
|
|
389
387
|
# Storage (@h-ai/storage)
|
|
390
388
|
# =============================================================================
|
|
391
|
-
#
|
|
392
|
-
|
|
389
|
+
# Default storage provider: local | s3
|
|
390
|
+
HAI_STORAGE_DEFAULTPROVIDER=local
|
|
393
391
|
# Local storage root path
|
|
394
|
-
|
|
392
|
+
HAI_STORAGE_PROVIDERS_LOCAL_ROOT=${configs?.storage?.localPath ?? "./data/uploads"}
|
|
395
393
|
# S3 / S3-compatible (uncomment when type=s3)
|
|
396
|
-
#
|
|
397
|
-
#
|
|
398
|
-
#
|
|
399
|
-
#
|
|
400
|
-
#
|
|
401
|
-
#
|
|
394
|
+
# HAI_STORAGE_PROVIDERS_S3_BUCKET=
|
|
395
|
+
# HAI_STORAGE_PROVIDERS_S3_REGION=us-east-1
|
|
396
|
+
# HAI_STORAGE_PROVIDERS_S3_ACCESSKEYID=
|
|
397
|
+
# HAI_STORAGE_PROVIDERS_S3_SECRETACCESSKEY=
|
|
398
|
+
# HAI_STORAGE_PROVIDERS_S3_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.
|
|
399
|
+
# HAI_STORAGE_PROVIDERS_S3_FORCEPATHSTYLE=false`);
|
|
402
400
|
}
|
|
403
401
|
}
|
|
404
402
|
if (features.includes("ai")) {
|
|
@@ -409,8 +407,8 @@ HAI_STORAGE_PATH=${configs?.storage?.localPath ?? "./data/uploads"}
|
|
|
409
407
|
# AI (@h-ai/ai)
|
|
410
408
|
# =============================================================================
|
|
411
409
|
# OpenAI-compatible API Key (Anthropic models via OpenAI-compatible proxy)
|
|
412
|
-
|
|
413
|
-
#
|
|
410
|
+
HAI_AI_LLM_APIKEY=
|
|
411
|
+
# HAI_AI_LLM_BASEURL= # Custom base URL
|
|
414
412
|
# Optional compatibility fallback
|
|
415
413
|
# OPENAI_API_KEY=`);
|
|
416
414
|
} else if (provider === "openai") {
|
|
@@ -419,8 +417,8 @@ HAI_AI_LLM_API_KEY=
|
|
|
419
417
|
# AI (@h-ai/ai)
|
|
420
418
|
# =============================================================================
|
|
421
419
|
# OpenAI / OpenAI-compatible
|
|
422
|
-
|
|
423
|
-
#
|
|
420
|
+
HAI_AI_LLM_APIKEY=
|
|
421
|
+
# HAI_AI_LLM_BASEURL= # Custom base URL (e.g. local proxy, Azure)
|
|
424
422
|
# Optional compatibility fallback
|
|
425
423
|
# OPENAI_API_KEY=`);
|
|
426
424
|
} else {
|
|
@@ -429,8 +427,8 @@ HAI_AI_LLM_API_KEY=
|
|
|
429
427
|
# AI (@h-ai/ai)
|
|
430
428
|
# =============================================================================
|
|
431
429
|
# OpenAI-compatible provider
|
|
432
|
-
|
|
433
|
-
#
|
|
430
|
+
HAI_AI_LLM_APIKEY=
|
|
431
|
+
# HAI_AI_LLM_BASEURL= # Custom base URL
|
|
434
432
|
# Optional compatibility fallback
|
|
435
433
|
# OPENAI_API_KEY=`);
|
|
436
434
|
}
|
|
@@ -445,8 +443,8 @@ HAI_VECDB_TYPE=lancedb
|
|
|
445
443
|
# LanceDB data path
|
|
446
444
|
HAI_VECDB_PATH=./data/vecdb
|
|
447
445
|
# Qdrant (uncomment when type=qdrant)
|
|
448
|
-
#
|
|
449
|
-
#
|
|
446
|
+
# HAI_VECDB_URL=http://localhost:6333
|
|
447
|
+
# HAI_VECDB_APIKEY=
|
|
450
448
|
`);
|
|
451
449
|
}
|
|
452
450
|
if (features.includes("reach")) {
|
|
@@ -468,18 +466,18 @@ HAI_VECDB_PATH=./data/vecdb
|
|
|
468
466
|
# Payment (@h-ai/payment)
|
|
469
467
|
# =============================================================================
|
|
470
468
|
# WeChat Pay
|
|
471
|
-
#
|
|
472
|
-
#
|
|
473
|
-
#
|
|
474
|
-
#
|
|
475
|
-
#
|
|
469
|
+
# HAI_PAYMENT_WECHAT_MCHID=
|
|
470
|
+
# HAI_PAYMENT_WECHAT_APIV3KEY=
|
|
471
|
+
# HAI_PAYMENT_WECHAT_SERIALNO=
|
|
472
|
+
# HAI_PAYMENT_WECHAT_PRIVATEKEY=
|
|
473
|
+
# HAI_PAYMENT_WECHAT_APPID=
|
|
476
474
|
# Alipay
|
|
477
|
-
#
|
|
478
|
-
#
|
|
479
|
-
#
|
|
475
|
+
# HAI_PAYMENT_ALIPAY_APPID=
|
|
476
|
+
# HAI_PAYMENT_ALIPAY_PRIVATEKEY=
|
|
477
|
+
# HAI_PAYMENT_ALIPAY_ALIPAYPUBLICKEY=
|
|
480
478
|
# Stripe
|
|
481
|
-
#
|
|
482
|
-
#
|
|
479
|
+
# HAI_PAYMENT_STRIPE_SECRETKEY=
|
|
480
|
+
# HAI_PAYMENT_STRIPE_WEBHOOKSECRET=
|
|
483
481
|
`);
|
|
484
482
|
}
|
|
485
483
|
sections.push(`
|
|
@@ -543,25 +541,25 @@ function generateVecdbConfig() {
|
|
|
543
541
|
type: lancedb
|
|
544
542
|
|
|
545
543
|
# LanceDB \u6570\u636E\u76EE\u5F55
|
|
546
|
-
path:
|
|
544
|
+
path: ./data/vecdb
|
|
547
545
|
|
|
548
546
|
# \u8DDD\u79BB\u5EA6\u91CF: cosine | euclidean | dot
|
|
549
547
|
# metric: cosine
|
|
550
548
|
|
|
551
549
|
# pgvector \u914D\u7F6E\uFF08\u5F53 type \u4E3A pgvector \u65F6\u4F7F\u7528\uFF09
|
|
552
550
|
# type: pgvector
|
|
553
|
-
# host:
|
|
554
|
-
# port:
|
|
555
|
-
# database:
|
|
556
|
-
# user:
|
|
557
|
-
# password:
|
|
551
|
+
# host: localhost
|
|
552
|
+
# port: 5432
|
|
553
|
+
# database: hai
|
|
554
|
+
# user: postgres
|
|
555
|
+
# password: ''
|
|
558
556
|
# indexType: hnsw
|
|
559
557
|
# tablePrefix: vec_
|
|
560
558
|
|
|
561
559
|
# Qdrant \u914D\u7F6E\uFF08\u5F53 type \u4E3A qdrant \u65F6\u4F7F\u7528\uFF09
|
|
562
560
|
# type: qdrant
|
|
563
|
-
# url:
|
|
564
|
-
# apiKey:
|
|
561
|
+
# url: http://localhost:6333
|
|
562
|
+
# apiKey: ''
|
|
565
563
|
`;
|
|
566
564
|
}
|
|
567
565
|
function generateReachConfig() {
|
|
@@ -655,27 +653,27 @@ function generatePaymentConfig() {
|
|
|
655
653
|
|
|
656
654
|
# \u5FAE\u4FE1\u652F\u4ED8\uFF08\u6309\u9700\u5F00\u542F\uFF09
|
|
657
655
|
# wechat:
|
|
658
|
-
# mchId:
|
|
659
|
-
# apiV3Key:
|
|
660
|
-
# serialNo:
|
|
661
|
-
# privateKey:
|
|
662
|
-
# appId:
|
|
656
|
+
# mchId: ''
|
|
657
|
+
# apiV3Key: ''
|
|
658
|
+
# serialNo: ''
|
|
659
|
+
# privateKey: ''
|
|
660
|
+
# appId: ''
|
|
663
661
|
|
|
664
662
|
# \u652F\u4ED8\u5B9D\uFF08\u6309\u9700\u5F00\u542F\uFF09
|
|
665
663
|
# alipay:
|
|
666
|
-
# appId:
|
|
667
|
-
# privateKey:
|
|
668
|
-
# alipayPublicKey:
|
|
664
|
+
# appId: ''
|
|
665
|
+
# privateKey: ''
|
|
666
|
+
# alipayPublicKey: ''
|
|
669
667
|
# signType: RSA2
|
|
670
668
|
# sandbox: false
|
|
671
669
|
|
|
672
670
|
# Stripe\uFF08\u6309\u9700\u5F00\u542F\uFF09
|
|
673
671
|
# stripe:
|
|
674
|
-
# secretKey:
|
|
675
|
-
# webhookSecret:
|
|
672
|
+
# secretKey: ''
|
|
673
|
+
# webhookSecret: ''
|
|
676
674
|
`;
|
|
677
675
|
}
|
|
678
676
|
|
|
679
677
|
export { generateConfigFile, generateEnvExample };
|
|
680
|
-
//# sourceMappingURL=chunk-
|
|
681
|
-
//# sourceMappingURL=chunk-
|
|
678
|
+
//# sourceMappingURL=chunk-U4PA632G.js.map
|
|
679
|
+
//# sourceMappingURL=chunk-U4PA632G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/cli-config-templates.ts"],"names":[],"mappings":"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","file":"chunk-U4PA632G.js","sourcesContent":["/**\n * @h-ai/cli — 配置文件模板\n *\n * 为各模块生成默认配置文件内容。\n * @module cli-config-templates\n */\n\nimport type { AiModuleConfig, CacheModuleConfig, CoreModuleConfig, DbModuleConfig, FeatureId, IamModuleConfig, ModuleConfigs, StorageModuleConfig } from '../cli-types.js'\n\n/**\n * 生成模块配置文件内容\n *\n * @param moduleKey - 模块标识(core/serv/db/cache/iam/storage/ai)\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 const supportedLocales = locale === 'en-US'\n ? ` - en-US\\n - zh-CN`\n : ` - zh-CN\\n - en-US`\n\n return `# =============================================================================\n# 应用配置\n# =============================================================================\n\nname: ${name}\nversion: 0.1.0\nenv: development\ndebug: false\n\ndefaultLocale: ${locale}\nsupportedLocales:\n${supportedLocales}\n`\n}\n\nfunction generateServConfig(): string {\n return `# =============================================================================\n# Service / HTTP 入口配置\n# =============================================================================\n\nhttp:\n apiPrefix: /api/v1\n openapi:\n path: /openapi.json\n docs:\n path: /docs\n health:\n path: /health\n readyPath: /ready\n rpc: false\n\n# 开发期默认关闭 transport;启用 @h-ai/crypto 后可按需改为对象配置\ntransport: false\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 if (dbType === 'sqlite') {\n return `# =============================================================================\n# 数据库配置\n# =============================================================================\n\n# 数据库类型: sqlite | postgresql | mysql\ntype: sqlite\n\n# SQLite 数据库路径\ndatabase: ${database}\n\n# PostgreSQL/MySQL 配置(可选)\n# host: localhost\n# port: 5432\n# user: postgres\n# password: ''\n`\n }\n\n const user = dbType === 'postgresql' ? 'postgres' : 'root'\n\n return `# =============================================================================\n# 数据库配置\n# =============================================================================\n\n# 数据库类型: sqlite | postgresql | mysql\ntype: ${dbType}\n\n# 数据库名称\ndatabase: ${database}\n\n# 连接配置\nhost: ${host}\nport: ${port}\nuser: ${user}\npassword: ''\n`\n}\n\nfunction generateCacheConfig(cfg?: CacheModuleConfig): string {\n const cacheType = cfg?.type ?? 'memory'\n\n if (cacheType === 'memory') {\n return `# =============================================================================\n# 缓存配置\n# =============================================================================\n\n# 缓存类型: memory | redis\ntype: memory\n\n# Redis 配置(当 type 为 redis 时使用)\n# url: redis://localhost:6379/0\n# host: localhost\n# port: 6379\n# password: ''\n# keyPrefix: 'hai:'\n`\n }\n\n const host = cfg?.host ?? 'localhost'\n const port = cfg?.port ?? 6379\n\n return `# =============================================================================\n# 缓存配置\n# =============================================================================\n\n# 缓存类型: memory | redis\ntype: redis\n\n# Redis 配置\nhost: ${host}\nport: ${port}\npassword: ''\nkeyPrefix: 'hai:'\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\n# 密码策略\npassword:\n minLength: 8\n maxLength: 128\n requireUppercase: false\n requireLowercase: false\n requireNumber: false\n requireSpecialChar: false\n\n# 会话配置\nsession:\n maxAge: 86400 # 会话超时(秒),默认 24 小时\n sliding: true # 滑动窗口(每次请求刷新过期时间)\n singleDevice: false # 单设备登录\n refreshTokenMaxAge: 604800 # refreshToken 过期(秒),默认 7 天\n\n# RBAC 配置\nrbac:\n defaultRole: user\n\n# 是否自动创建默认数据\nseedDefaultData: true\n`\n}\n\nfunction generateStorageConfig(cfg?: StorageModuleConfig): string {\n const storageType = cfg?.type ?? 'local'\n\n if (storageType === 'local') {\n const localPath = cfg?.localPath ?? './data/uploads'\n return `# =============================================================================\n# 存储配置\n# =============================================================================\n\n# 默认 Provider\ndefaultProvider: local\n\n# Provider 配置\nproviders:\n local:\n type: local\n root: ${localPath}\n maxFileSize: 10485760 # 10MB\n\n # S3 配置(可选)\n # s3:\n # type: s3\n # bucket: my-bucket\n # region: us-east-1\n # accessKeyId: ''\n # secretAccessKey: ''\n # endpoint: ''\n # forcePathStyle: false\n`\n }\n\n return `# =============================================================================\n# 存储配置\n# =============================================================================\n\n# 默认 Provider\ndefaultProvider: s3\n\n# Provider 配置\nproviders:\n s3:\n type: s3\n bucket: ''\n region: us-east-1\n accessKeyId: ''\n secretAccessKey: ''\n # endpoint: ''\n # forcePathStyle: false\n\n # 本地存储(可选)\n # local:\n # type: local\n # root: ./data/uploads\n # maxFileSize: 10485760 # 10MB\n`\n}\n\nfunction generateAiConfig(cfg?: AiModuleConfig): string {\n const model = cfg?.model ?? 'gpt-4o-mini'\n\n // AIConfigSchema 结构:llm(必填)+ 可选子模块\n // LLMConfigSchema 支持顶层 apiKey/model,以及多模型 models 数组\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 model: ${model}\n # 全局最大 Token 数(默认 4096)\n # maxTokens: 4096\n # 采样温度(0-2,默认 0.7)\n # temperature: 0.7\n # 请求超时(毫秒,默认 60000)\n # timeout: 60000\n\n # 多模型配置(可选,用于场景路由)\n # models:\n # - id: fast\n # model: gpt-4o-mini\n # - id: smart\n # model: gpt-4o\n # apiKey: ''\n\n # 场景模型映射(可选)\n # scenarios:\n # default: fast\n # analysis: smart\n`\n}\n\n/**\n * 根据选中的功能模块生成 .env.example 内容\n *\n * @param features - 选中的功能模块列表\n * @param configs - 用户自定义配置值\n * @returns .env.example 文件内容\n */\nexport function generateEnvExample(features: FeatureId[], configs?: ModuleConfigs): 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#\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')) {\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')) {\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_KIT_COOKIE_KEY= # 32-char hex for SM4-CBC cookie encryption\n`)\n }\n\n // 缓存\n if (features.includes('cache')) {\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_CONNECT_TIMEOUT=10000\n# HAI_CACHE_COMMAND_TIMEOUT=5000\n# HAI_CACHE_KEY_PREFIX=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_CONNECT_TIMEOUT=10000\n# HAI_CACHE_COMMAND_TIMEOUT=5000\n# HAI_CACHE_KEY_PREFIX=hai:`)\n }\n }\n\n // 存储\n if (features.includes('storage')) {\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_DEFAULTPROVIDER=s3\n# S3 / S3-compatible\nHAI_STORAGE_PROVIDERS_S3_BUCKET=\nHAI_STORAGE_PROVIDERS_S3_REGION=us-east-1\nHAI_STORAGE_PROVIDERS_S3_ACCESSKEYID=\nHAI_STORAGE_PROVIDERS_S3_SECRETACCESSKEY=\n# HAI_STORAGE_PROVIDERS_S3_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.\n# HAI_STORAGE_PROVIDERS_S3_FORCEPATHSTYLE=false\n# Local storage (uncomment when type=local)\n# HAI_STORAGE_PROVIDERS_LOCAL_ROOT=./data/uploads`)\n }\n else {\n sections.push(`\n# =============================================================================\n# Storage (@h-ai/storage)\n# =============================================================================\n# Default storage provider: local | s3\nHAI_STORAGE_DEFAULTPROVIDER=local\n# Local storage root path\nHAI_STORAGE_PROVIDERS_LOCAL_ROOT=${configs?.storage?.localPath ?? './data/uploads'}\n# S3 / S3-compatible (uncomment when type=s3)\n# HAI_STORAGE_PROVIDERS_S3_BUCKET=\n# HAI_STORAGE_PROVIDERS_S3_REGION=us-east-1\n# HAI_STORAGE_PROVIDERS_S3_ACCESSKEYID=\n# HAI_STORAGE_PROVIDERS_S3_SECRETACCESSKEY=\n# HAI_STORAGE_PROVIDERS_S3_ENDPOINT= # Custom endpoint for MinIO / Aliyun OSS etc.\n# HAI_STORAGE_PROVIDERS_S3_FORCEPATHSTYLE=false`)\n }\n }\n\n // AI\n if (features.includes('ai')) {\n const provider = configs?.ai?.defaultProvider ?? 'openai'\n if (provider === 'anthropic') {\n sections.push(`\n# =============================================================================\n# AI (@h-ai/ai)\n# =============================================================================\n# OpenAI-compatible API Key (Anthropic models via OpenAI-compatible proxy)\nHAI_AI_LLM_APIKEY=\n# HAI_AI_LLM_BASEURL= # Custom base URL\n# Optional compatibility fallback\n# OPENAI_API_KEY=`)\n }\n else if (provider === 'openai') {\n sections.push(`\n# =============================================================================\n# AI (@h-ai/ai)\n# =============================================================================\n# OpenAI / OpenAI-compatible\nHAI_AI_LLM_APIKEY=\n# HAI_AI_LLM_BASEURL= # Custom base URL (e.g. local proxy, Azure)\n# Optional compatibility fallback\n# OPENAI_API_KEY=`)\n }\n else {\n sections.push(`\n# =============================================================================\n# AI (@h-ai/ai)\n# =============================================================================\n# OpenAI-compatible provider\nHAI_AI_LLM_APIKEY=\n# HAI_AI_LLM_BASEURL= # Custom base URL\n# Optional compatibility fallback\n# OPENAI_API_KEY=`)\n }\n }\n\n // VecDB\n if (features.includes('vecdb')) {\n sections.push(`\n# =============================================================================\n# Vector Database (@h-ai/vecdb)\n# =============================================================================\n# Backend type: lancedb | pgvector | qdrant\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')) {\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`)\n }\n\n // Payment\n if (features.includes('payment')) {\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_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 // 测试(始终生成)\n sections.push(`\n# =============================================================================\n# Testing\n# =============================================================================\n# E2E test mode (relaxes rate limiting etc.)\n# HAI_E2E=1\n`)\n\n return sections.join('\\n')\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# 基础设施服务(按需开启)\nservices:\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\n # 邮件 (Resend)\n # email:\n # provisioner: resend\n # apiKey: \\${HAI_DEPLOY_RESEND_API_KEY}\n\n # 短信 (阿里云)\n # sms:\n # provisioner: aliyun\n # accessKeyId: \\${HAI_DEPLOY_ALIYUN_ACCESS_KEY_ID}\n # accessKeySecret: \\${HAI_DEPLOY_ALIYUN_ACCESS_KEY_SECRET}\n`\n}\n\nfunction generateVecdbConfig(): string {\n return `# =============================================================================\n# 向量数据库配置 (@h-ai/vecdb)\n# =============================================================================\n\n# 数据库类型: lancedb | pgvector | qdrant\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# 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}\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\n# 模板(可选)\n# templates:\n# - name: verification_code\n# provider: email\n# subject: \"验证码: {code}\"\n# body: \"您的验证码是 {code},有效期 {minutes} 分钟。\"\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# 执行日志表名\ntableName: hai_scheduler_logs\n\n# 任务定义表名\ntaskTableName: hai_scheduler_tasks\n\n# 分布式锁表名\nlockTableName: hai_scheduler_locks\n\n# 检查间隔(毫秒)\ntickInterval: 1000\n\n# 锁过期时间(毫秒)\nlockExpireMs: 300000\n`\n}\n\nfunction generateAuditConfig(): string {\n return `# =============================================================================\n# 审计日志配置 (@h-ai/audit)\n# =============================================================================\n\n# 审计日志表名\ntableName: hai_audit_logs\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# 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`\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"cli-config-templates-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"cli-config-templates-GSXKLGU5.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-U4PA632G.js';
|
|
3
3
|
import './chunk-WUYLYCW2.js';
|
|
4
4
|
import './chunk-2H7UOFLK.js';
|
|
5
5
|
import process3 from 'process';
|
|
@@ -1076,7 +1076,7 @@ async function createProject(options) {
|
|
|
1076
1076
|
});
|
|
1077
1077
|
await generateFromTemplates(projectPath, context);
|
|
1078
1078
|
if (resolvedOptions.appType !== "fullstack") {
|
|
1079
|
-
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-
|
|
1079
|
+
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-GSXKLGU5.js');
|
|
1080
1080
|
const configs = resolvedOptions.moduleConfigs;
|
|
1081
1081
|
const isApiWorkspace = resolvedOptions.appType === "api";
|
|
1082
1082
|
const configDir = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, "config") : path2.join(projectPath, "config");
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.44",
|
|
5
5
|
"description": "Hai Framework CLI for project scaffolding and code generation.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"keywords": [
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"ora": "^9.1.0",
|
|
35
35
|
"prompts": "^2.4.2",
|
|
36
36
|
"yaml": "^2.7.0",
|
|
37
|
-
"@h-ai/core": "0.1.0-alpha.
|
|
37
|
+
"@h-ai/core": "0.1.0-alpha.44"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/fs-extra": "^11.0.4",
|
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
## 包含内容
|
|
6
6
|
|
|
7
|
-
- `app-contract.ts
|
|
8
|
-
- `app-schemas.ts
|
|
7
|
+
- `app-contract.ts`:应用级接口定义,业务 path 与一次性输出 Schema 就近内联
|
|
8
|
+
- `app-schemas.ts`:跨接口、跨层复用的输入/数据 Zod Schema
|
|
9
9
|
- `{{projectName}}-contract.ts`:工程级 contract 聚合入口
|
|
10
10
|
|
|
11
|
+
API 前缀、健康检查与跨端 Header 等传输配置位于 service 的 `config/_serv.yml`。
|
|
12
|
+
|
|
11
13
|
## 常用命令
|
|
12
14
|
|
|
13
15
|
```bash
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { apiContract } from '@h-ai/api-contract'
|
|
2
|
-
import { AppEchoInputSchema,
|
|
2
|
+
import { AppEchoInputSchema, AppEchoOutputDataSchema, AppInfoOutputDataSchema } from './app-schemas.js'
|
|
3
3
|
|
|
4
4
|
/** 应用自有 app contract。 */
|
|
5
5
|
export const appContract = {
|
|
@@ -11,7 +11,7 @@ export const appContract = {
|
|
|
11
11
|
summary: 'Get service info',
|
|
12
12
|
tags: ['app'],
|
|
13
13
|
})
|
|
14
|
-
.output(
|
|
14
|
+
.output(apiContract.haiResultSchema(AppInfoOutputDataSchema)),
|
|
15
15
|
echo: apiContract
|
|
16
16
|
.route({
|
|
17
17
|
method: 'POST',
|
|
@@ -21,7 +21,7 @@ export const appContract = {
|
|
|
21
21
|
tags: ['app'],
|
|
22
22
|
})
|
|
23
23
|
.input(AppEchoInputSchema)
|
|
24
|
-
.output(
|
|
24
|
+
.output(apiContract.haiResultSchema(AppEchoOutputDataSchema)),
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export type AppContract = typeof appContract
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { apiContract } from '@h-ai/api-contract'
|
|
2
1
|
import { z } from 'zod'
|
|
3
2
|
|
|
4
3
|
/** 服务元信息响应数据。 */
|
|
@@ -9,9 +8,6 @@ export const AppInfoOutputDataSchema = z.object({
|
|
|
9
8
|
transportEnabled: z.boolean(),
|
|
10
9
|
})
|
|
11
10
|
|
|
12
|
-
/** app.info 标准 HaiResult 输出。 */
|
|
13
|
-
export const AppInfoOutputSchema = apiContract.haiResultSchema(AppInfoOutputDataSchema)
|
|
14
|
-
|
|
15
11
|
/** 输入:单条文本消息(演示用,限制最大长度防止误用)。 */
|
|
16
12
|
export const AppEchoInputSchema = z.object({
|
|
17
13
|
message: z.string().min(1).max(2000),
|
|
@@ -25,9 +21,6 @@ export const AppEchoOutputDataSchema = z.object({
|
|
|
25
21
|
userId: z.string().optional(),
|
|
26
22
|
})
|
|
27
23
|
|
|
28
|
-
/** app.echo 标准 HaiResult 输出。 */
|
|
29
|
-
export const AppEchoOutputSchema = apiContract.haiResultSchema(AppEchoOutputDataSchema)
|
|
30
|
-
|
|
31
24
|
export type AppInfoOutputData = z.infer<typeof AppInfoOutputDataSchema>
|
|
32
25
|
export type AppEchoInput = z.infer<typeof AppEchoInputSchema>
|
|
33
26
|
export type AppEchoOutputData = z.infer<typeof AppEchoOutputDataSchema>
|