@h-ai/cli 0.1.0-alpha.57 → 0.1.0-alpha.59
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 +70 -21
- package/README.ja.md +70 -21
- package/README.md +70 -21
- package/dist/chunk-2H7UOFLK.js +0 -0
- package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
- package/dist/chunk-WUSFJFW5.js.map +1 -0
- package/dist/{chunk-MJGUBOAV.js → chunk-WWG3U5ZD.js} +24 -42
- package/dist/chunk-WWG3U5ZD.js.map +1 -0
- package/dist/cli-config-templates-6XA7V6CC.js +5 -0
- package/dist/{cli-config-templates-OWBEGBZQ.js.map → cli-config-templates-6XA7V6CC.js.map} +1 -1
- package/dist/{cli-skill-templates-ZYXES3NT.js → cli-skill-templates-2KDUACT6.js} +3 -3
- package/dist/{cli-skill-templates-ZYXES3NT.js.map → cli-skill-templates-2KDUACT6.js.map} +1 -1
- package/dist/index.js +192 -125
- package/dist/index.js.map +1 -1
- package/dist/{src-TBIET7YU.js → src-DUGLX4YB.js} +7270 -2119
- package/dist/src-DUGLX4YB.js.map +1 -0
- package/package.json +19 -17
- package/templates/README.md +4 -4
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +7 -0
- package/templates/apps/admin/src/routes/+page.svelte.hbs +5 -4
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +2 -2
- package/templates/apps/api/.npmrc.hbs +1 -2
- package/templates/apps/api/Dockerfile.hbs +6 -5
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
- package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
- package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
- package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
- package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
- package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
- package/templates/apps/api/e2e/api-service.spec.ts.hbs +3 -1
- package/templates/apps/api/package.json.hbs +2 -2
- package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
- package/templates/apps/api/tsconfig.base.json +0 -1
- package/templates/apps/fullstack/.dockerignore.hbs +3 -0
- package/templates/apps/fullstack/.npmrc.hbs +1 -2
- package/templates/apps/fullstack/Dockerfile.hbs +6 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +206 -16
- package/templates/apps/fullstack/package.json.hbs +2 -2
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
- package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
- package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
- package/templates/apps/fullstack/tsconfig.base.json +0 -1
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
- package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
- package/templates/apps/mobile-app/index.html.hbs +2 -2
- package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
- package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
- package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
- package/templates/base/.npmrc.hbs +1 -15
- package/templates/base/Dockerfile.hbs +9 -8
- package/templates/base/e2e/app.spec.ts.hbs +1 -0
- package/templates/base/package.json.hbs +39 -42
- package/templates/base/pnpm-workspace.yaml.hbs +26 -0
- package/templates/base/src/app.d.ts.hbs +4 -0
- package/templates/base/src/hooks.server.ts.hbs +0 -8
- package/templates/base/src/lib/server/init.ts.hbs +26 -5
- package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
- package/templates/base/tests/scaffold.test.ts.hbs +21 -1
- package/templates/base/vite.config.ts.hbs +21 -0
- package/templates/features/ai/routes/api/chat/+server.ts +6 -7
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
- package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
- package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
- package/templates/features/storage/routes/api/upload/+server.ts +10 -8
- package/templates/skills/CLAUDE.md +0 -14
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +13 -2
- package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +3 -0
- package/templates/skills/hai-api-client/SKILL.md +1 -1
- package/templates/skills/hai-app-create/SKILL.md +2 -0
- package/templates/skills/hai-app-create/development.md +21 -0
- package/templates/skills/hai-build/reference.md +4 -2
- package/templates/skills/hai-core/SKILL.md +2 -0
- package/templates/skills/hai-core/reference.md +6 -4
- package/templates/skills/hai-deploy/SKILL.md +2 -0
- package/templates/skills/hai-framework-sync/SKILL.md +5 -2
- package/templates/skills/hai-serv/SKILL.md +1 -0
- package/templates/skills/hai-serv/reference.md +3 -1
- package/templates/skills/hai-ui/SKILL.md +6 -0
- package/templates/skills/hai-ui/reference.md +7 -4
- package/templates/skills/hai-vecdb/reference.md +53 -49
- package/dist/chunk-MJGUBOAV.js.map +0 -1
- package/dist/chunk-O3ANVICQ.js.map +0 -1
- package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
- package/dist/src-TBIET7YU.js.map +0 -1
- package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
- package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
- package/templates/skills/bridges/admin/CLAUDE.md +0 -15
- package/templates/skills/bridges/api/CLAUDE.md +0 -15
- package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -9
- package/templates/skills/bridges/h5/CLAUDE.md +0 -15
- package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -15
- package/templates/skills/bridges/website/CLAUDE.md +0 -15
- package/templates/skills/claude-skill.md.hbs +0 -7
package/dist/index.js
CHANGED
|
@@ -1,24 +1,40 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { generateConfigFile } from './chunk-
|
|
3
|
-
import { cliM } from './chunk-
|
|
2
|
+
import { generateConfigFile } from './chunk-WUSFJFW5.js';
|
|
3
|
+
import { cliM } from './chunk-WWG3U5ZD.js';
|
|
4
4
|
import './chunk-2H7UOFLK.js';
|
|
5
|
-
import
|
|
6
|
-
import { core } from '@h-ai/core';
|
|
5
|
+
import process4 from 'process';
|
|
7
6
|
import { cac } from 'cac';
|
|
8
7
|
import chalk from 'chalk';
|
|
9
8
|
import path2, { resolve } from 'path';
|
|
10
9
|
import { fileURLToPath } from 'url';
|
|
10
|
+
import { wrapAnsi } from 'fast-wrap-ansi';
|
|
11
11
|
import fse from 'fs-extra';
|
|
12
|
-
import
|
|
12
|
+
import Handlebars2 from 'handlebars';
|
|
13
|
+
import { core } from '@h-ai/core';
|
|
13
14
|
import ora from 'ora';
|
|
14
15
|
import prompts from 'prompts';
|
|
15
16
|
import { Buffer } from 'buffer';
|
|
16
17
|
import { execSync, execFileSync } from 'child_process';
|
|
18
|
+
import { randomBytes } from 'crypto';
|
|
19
|
+
import { stringify, parse } from 'yaml';
|
|
17
20
|
import { existsSync, readFileSync } from 'fs';
|
|
18
|
-
import { parse } from 'yaml';
|
|
19
21
|
|
|
20
22
|
var CAMEL_CASE_SEPARATOR_REGEX = /[-_\s]+(.)?/g;
|
|
21
23
|
var LEADING_CHAR_REGEX = /^./;
|
|
24
|
+
function writeCliMessage(message) {
|
|
25
|
+
process4.stdout.write(`${message}
|
|
26
|
+
`);
|
|
27
|
+
}
|
|
28
|
+
function writeCliError(message, error) {
|
|
29
|
+
process4.stderr.write(`${message}
|
|
30
|
+
`);
|
|
31
|
+
if (error !== void 0)
|
|
32
|
+
process4.stderr.write(`${error instanceof Error ? error.message : String(error)}
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
function formatPromptDescription(description) {
|
|
36
|
+
return wrapAnsi(description, Math.max(1, (process4.stdout.columns || 80) - 32), { hard: true });
|
|
37
|
+
}
|
|
22
38
|
function toCamelCase(str) {
|
|
23
39
|
return str.replace(CAMEL_CASE_SEPARATOR_REGEX, (_, c) => c ? c.toUpperCase() : "").replace(LEADING_CHAR_REGEX, (c) => c.toLowerCase());
|
|
24
40
|
}
|
|
@@ -79,26 +95,30 @@ async function detectPackageManager(cwd) {
|
|
|
79
95
|
return "npm";
|
|
80
96
|
}
|
|
81
97
|
function registerHelpers() {
|
|
82
|
-
|
|
98
|
+
Handlebars2.registerHelper("if_eq", function(a, b, options) {
|
|
83
99
|
return a === b ? options.fn(this) : options.inverse(this);
|
|
84
100
|
});
|
|
85
|
-
|
|
101
|
+
Handlebars2.registerHelper("date", () => {
|
|
86
102
|
return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
87
103
|
});
|
|
88
|
-
|
|
104
|
+
Handlebars2.registerHelper("year", () => {
|
|
89
105
|
return (/* @__PURE__ */ new Date()).getFullYear();
|
|
90
106
|
});
|
|
91
|
-
|
|
107
|
+
Handlebars2.registerHelper("upper", (str) => {
|
|
92
108
|
return str.toUpperCase();
|
|
93
109
|
});
|
|
94
|
-
|
|
110
|
+
Handlebars2.registerHelper("lower", (str) => {
|
|
95
111
|
return str.toLowerCase();
|
|
96
112
|
});
|
|
97
113
|
}
|
|
98
114
|
registerHelpers();
|
|
99
|
-
|
|
115
|
+
Handlebars2.registerHelper("if_eq", function(a, b, options) {
|
|
100
116
|
return a === b ? options.fn(this) : options.inverse(this);
|
|
101
117
|
});
|
|
118
|
+
Handlebars2.registerHelper("json", (value) => JSON.stringify(value));
|
|
119
|
+
Handlebars2.registerHelper("html", (value) => Handlebars2.escapeExpression(value));
|
|
120
|
+
Handlebars2.registerHelper("yaml", (key, value) => stringify({ [key]: value }).trim());
|
|
121
|
+
Handlebars2.registerHelper("jsString", (value) => `'${JSON.stringify(value).slice(1, -1).replace(/\\"/g, '"').replace(/'/g, "\\'")}'`);
|
|
102
122
|
var TEMPLATE_SKIP_IF_EMPTY_MARKER = "@skipIfEmpty";
|
|
103
123
|
var NORMALIZED_RENDER_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".js", ".svelte", ".json", ".css"]);
|
|
104
124
|
var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
|
|
@@ -106,53 +126,56 @@ var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
|
|
|
106
126
|
"src/lib/server/init.ts"
|
|
107
127
|
]);
|
|
108
128
|
var VERSIONS = {
|
|
109
|
-
antfuEslintConfig: "^9.
|
|
110
|
-
capacitorSecureStorage: "^8.0.
|
|
129
|
+
antfuEslintConfig: "^9.5.1",
|
|
130
|
+
capacitorSecureStorage: "^8.0.1",
|
|
111
131
|
// UI / Icon
|
|
112
|
-
bitsUi: "^2.
|
|
113
|
-
iconifyJsonTabler: "^1.2.
|
|
132
|
+
bitsUi: "^2.19.5",
|
|
133
|
+
iconifyJsonTabler: "^1.2.42",
|
|
114
134
|
iconifyTailwind: "^1.2.3",
|
|
115
135
|
// Capacitor
|
|
116
|
-
capacitorAndroid: "^8.3
|
|
117
|
-
capacitorApp: "^8.
|
|
118
|
-
capacitorCamera: "^8.
|
|
119
|
-
capacitorCli: "^8.3
|
|
120
|
-
capacitorCore: "^8.3
|
|
121
|
-
capacitorDevice: "^8.0.
|
|
122
|
-
capacitorIos: "^8.3
|
|
136
|
+
capacitorAndroid: "^8.5.3",
|
|
137
|
+
capacitorApp: "^8.1.2",
|
|
138
|
+
capacitorCamera: "^8.2.5",
|
|
139
|
+
capacitorCli: "^8.5.3",
|
|
140
|
+
capacitorCore: "^8.5.3",
|
|
141
|
+
capacitorDevice: "^8.0.3",
|
|
142
|
+
capacitorIos: "^8.5.3",
|
|
123
143
|
capacitorPreferences: "^8.0.1",
|
|
124
|
-
capacitorPushNotifications: "^8.
|
|
125
|
-
capacitorStatusBar: "^8.0.
|
|
144
|
+
capacitorPushNotifications: "^8.1.3",
|
|
145
|
+
capacitorStatusBar: "^8.0.4",
|
|
126
146
|
// Tailwind / DaisyUI
|
|
127
|
-
daisyui: "^5.
|
|
128
|
-
tailwindcss: "^4.3.
|
|
129
|
-
tailwindcssVite: "^4.3.
|
|
147
|
+
daisyui: "^5.7.47",
|
|
148
|
+
tailwindcss: "^4.3.3",
|
|
149
|
+
tailwindcssVite: "^4.3.3",
|
|
130
150
|
// i18n
|
|
131
|
-
inlangParaglide: "^2.
|
|
132
|
-
inlangMessageFormat: "^4.
|
|
151
|
+
inlangParaglide: "^2.27.0",
|
|
152
|
+
inlangMessageFormat: "^4.5.0",
|
|
133
153
|
// Svelte / Vite
|
|
134
|
-
svelte: "^5.
|
|
135
|
-
|
|
136
|
-
|
|
154
|
+
svelte: "^5.57.2",
|
|
155
|
+
svelteKit: "^2.70.3",
|
|
156
|
+
svelteAdapterNode: "^5.5.7",
|
|
157
|
+
svelteCheck: "^4.7.6",
|
|
158
|
+
sveltePlugin: "^7.3.1",
|
|
137
159
|
// Build / Test
|
|
138
|
-
vite: "^8.
|
|
139
|
-
vitest: "^4.1.
|
|
160
|
+
vite: "^8.3.4",
|
|
161
|
+
vitest: "^4.1.11",
|
|
140
162
|
tsup: "^8.5.1",
|
|
141
163
|
rimraf: "^6.1.3",
|
|
142
164
|
// ESLint
|
|
143
|
-
eslint: "^10.
|
|
165
|
+
eslint: "^10.12.0",
|
|
144
166
|
eslintPluginFormat: "^2.0.1",
|
|
145
|
-
eslintPluginSvelte: "^3.
|
|
146
|
-
svelteEslintParser: "^1.
|
|
167
|
+
eslintPluginSvelte: "^3.23.1",
|
|
168
|
+
svelteEslintParser: "^1.9.0",
|
|
147
169
|
// Node / TS
|
|
148
|
-
nodeTypes: "^
|
|
170
|
+
nodeTypes: "^26.6.5",
|
|
171
|
+
// Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。
|
|
149
172
|
typescript: "^6.0.3",
|
|
150
173
|
// E2E
|
|
151
|
-
playwright: "^1.
|
|
174
|
+
playwright: "^1.64.0",
|
|
152
175
|
// Validation
|
|
153
|
-
zod: "^4.
|
|
176
|
+
zod: "^4.6.5",
|
|
154
177
|
// Tauri
|
|
155
|
-
tauriCli: "^2.
|
|
178
|
+
tauriCli: "^2.12.1"
|
|
156
179
|
};
|
|
157
180
|
var FRONTEND_PORTS_DEFAULT = {
|
|
158
181
|
web: 4173,
|
|
@@ -169,7 +192,7 @@ var IMPLEMENTED_FRONTENDS = ["web", "app", "desktop"];
|
|
|
169
192
|
var DEFAULT_FULLSTACK_FRONTENDS = ["web", "app", "desktop"];
|
|
170
193
|
var DEFAULT_THEMES = ["light", "dark"];
|
|
171
194
|
var DEFAULT_THEME_NAME = "light";
|
|
172
|
-
var HAI_PACKAGE_VERSION =
|
|
195
|
+
var HAI_PACKAGE_VERSION = getCliVersion();
|
|
173
196
|
var HAI_PACKAGE_SPECIFIER_CATALOG = "catalog:";
|
|
174
197
|
var HAI_CATALOG_PACKAGE_NAMES = [
|
|
175
198
|
"@h-ai/ai",
|
|
@@ -261,11 +284,20 @@ var FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [
|
|
|
261
284
|
"zod"
|
|
262
285
|
];
|
|
263
286
|
var FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [
|
|
287
|
+
"@h-ai/audit",
|
|
288
|
+
"@h-ai/cache",
|
|
264
289
|
"@h-ai/core",
|
|
265
|
-
"@h-ai/
|
|
290
|
+
"@h-ai/crypto",
|
|
291
|
+
"@h-ai/iam",
|
|
292
|
+
"@h-ai/reldb",
|
|
293
|
+
"@h-ai/serv",
|
|
294
|
+
"@h-ai/storage",
|
|
295
|
+
"zod"
|
|
266
296
|
];
|
|
267
297
|
var FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [
|
|
268
298
|
"@h-ai/api-client",
|
|
299
|
+
"@h-ai/core",
|
|
300
|
+
"@h-ai/crypto",
|
|
269
301
|
"@h-ai/ui",
|
|
270
302
|
"@inlang/paraglide-js",
|
|
271
303
|
"@inlang/plugin-message-format",
|
|
@@ -534,6 +566,9 @@ function buildTemplateContext(options) {
|
|
|
534
566
|
for (const f of options.features) {
|
|
535
567
|
featureMap[f] = true;
|
|
536
568
|
}
|
|
569
|
+
if (options.appType === "fullstack") {
|
|
570
|
+
for (const feature of ["iam", "db", "cache", "crypto", "storage", "audit"]) featureMap[feature] = true;
|
|
571
|
+
}
|
|
537
572
|
if (featureMap.iam) {
|
|
538
573
|
featureMap.db = true;
|
|
539
574
|
featureMap.cache = true;
|
|
@@ -564,6 +599,7 @@ function buildTemplateContext(options) {
|
|
|
564
599
|
}
|
|
565
600
|
return {
|
|
566
601
|
projectName: options.name,
|
|
602
|
+
versions: VERSIONS,
|
|
567
603
|
useCatalogProtocol,
|
|
568
604
|
haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,
|
|
569
605
|
haiPackageVersion: HAI_PACKAGE_VERSION,
|
|
@@ -610,6 +646,7 @@ function buildFullstackTemplateContext(projectName, frontendsInput, moduleConfig
|
|
|
610
646
|
port: portFor(target)
|
|
611
647
|
}));
|
|
612
648
|
return {
|
|
649
|
+
appName: moduleConfigs?.core?.name ?? projectName,
|
|
613
650
|
versions: VERSIONS,
|
|
614
651
|
packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),
|
|
615
652
|
contractPackageName: `${projectName}-contract`,
|
|
@@ -688,7 +725,7 @@ async function generateFromTemplates(projectPath, context) {
|
|
|
688
725
|
const appExcludes = context.hasI18n ? [] : ["messages"];
|
|
689
726
|
await copyStaticDir(appDir, projectPath, appExcludes);
|
|
690
727
|
}
|
|
691
|
-
if (!context.isApiWorkspace) {
|
|
728
|
+
if (!context.isApiWorkspace && context.appType !== "fullstack") {
|
|
692
729
|
for (const featureId of Object.keys(context.features)) {
|
|
693
730
|
if (context.isSvelteOnlyApp) {
|
|
694
731
|
continue;
|
|
@@ -742,7 +779,7 @@ async function renderDynamicFiles(templatesRoot, projectPath, context) {
|
|
|
742
779
|
await renderHbsInDir(dir, projectPath, context);
|
|
743
780
|
await copyRenderedStaticPathFiles(dir, projectPath, context);
|
|
744
781
|
}
|
|
745
|
-
if (context.isApiWorkspace) {
|
|
782
|
+
if (context.isApiWorkspace || context.appType === "fullstack") {
|
|
746
783
|
return;
|
|
747
784
|
}
|
|
748
785
|
const routesDest = path2.join(projectPath, "src", "routes");
|
|
@@ -780,7 +817,7 @@ async function renderHbsInDir(dir, destRoot, context) {
|
|
|
780
817
|
const srcPath = path2.join(dir, relPath);
|
|
781
818
|
const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, "");
|
|
782
819
|
const template = await fse.readFile(srcPath, "utf-8");
|
|
783
|
-
const compiled =
|
|
820
|
+
const compiled = Handlebars2.compile(template, { noEscape: true });
|
|
784
821
|
const rendered = compiled(context);
|
|
785
822
|
if (shouldSkipRenderedFile(template, rendered)) {
|
|
786
823
|
continue;
|
|
@@ -841,7 +878,7 @@ function shouldSkipRenderedFile(template, rendered) {
|
|
|
841
878
|
}
|
|
842
879
|
function renderOutputPath(pathTemplate, context) {
|
|
843
880
|
const normalizedTemplate = pathTemplate.split(path2.sep).join("/");
|
|
844
|
-
return
|
|
881
|
+
return Handlebars2.compile(normalizedTemplate, { noEscape: true })(context);
|
|
845
882
|
}
|
|
846
883
|
function isSafeRelativePath(relativePath) {
|
|
847
884
|
const normalized = path2.normalize(relativePath);
|
|
@@ -879,8 +916,8 @@ var APP_TYPES = {
|
|
|
879
916
|
},
|
|
880
917
|
"fullstack": {
|
|
881
918
|
name: "\u524D\u540E\u7AEF\u5206\u79BB\u5DE5\u7A0B",
|
|
882
|
-
description: "\u591A\
|
|
883
|
-
defaultFeatures: []
|
|
919
|
+
description: "\u591A\u7AEF mini \u7BA1\u7406\u7CFB\u7EDF\uFF0C\u5305\u542B\u7528\u6237\u3001\u89D2\u8272\u3001\u5BA1\u8BA1\u3001\u4E2A\u4EBA\u8BBE\u7F6E\u4E0E\u53CC\u5411\u4F20\u8F93\u52A0\u5BC6",
|
|
920
|
+
defaultFeatures: ["iam", "db", "cache", "crypto", "storage", "audit"]
|
|
884
921
|
}
|
|
885
922
|
};
|
|
886
923
|
var FRONTEND_TARGETS = {
|
|
@@ -1047,7 +1084,7 @@ async function createProject(options) {
|
|
|
1047
1084
|
try {
|
|
1048
1085
|
const resolvedOptions = await resolveOptions(options);
|
|
1049
1086
|
if (!PROJECT_NAME_REGEX.test(resolvedOptions.name)) {
|
|
1050
|
-
|
|
1087
|
+
writeCliError(chalk.red(`\u9879\u76EE\u540D\u79F0\u4E0D\u5408\u6CD5: "${resolvedOptions.name}"\uFF0C\u53EA\u80FD\u5305\u542B\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26`));
|
|
1051
1088
|
return;
|
|
1052
1089
|
}
|
|
1053
1090
|
const projectPath = path2.resolve(resolvedOptions.cwd ?? ".", resolvedOptions.name);
|
|
@@ -1059,7 +1096,7 @@ async function createProject(options) {
|
|
|
1059
1096
|
initial: false
|
|
1060
1097
|
});
|
|
1061
1098
|
if (!overwrite) {
|
|
1062
|
-
|
|
1099
|
+
writeCliMessage(chalk.yellow("\u5DF2\u53D6\u6D88"));
|
|
1063
1100
|
return;
|
|
1064
1101
|
}
|
|
1065
1102
|
await fse.remove(projectPath);
|
|
@@ -1077,20 +1114,21 @@ async function createProject(options) {
|
|
|
1077
1114
|
packageManager: resolvedOptions.packageManager
|
|
1078
1115
|
});
|
|
1079
1116
|
await generateFromTemplates(projectPath, context);
|
|
1080
|
-
|
|
1081
|
-
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-
|
|
1117
|
+
{
|
|
1118
|
+
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-6XA7V6CC.js');
|
|
1082
1119
|
const configs = resolvedOptions.moduleConfigs;
|
|
1083
1120
|
const isApiWorkspace = resolvedOptions.appType === "api";
|
|
1084
|
-
const
|
|
1121
|
+
const isFullstack = resolvedOptions.appType === "fullstack";
|
|
1122
|
+
const configDir = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, "config") : isFullstack ? path2.join(projectPath, "packages", `${resolvedOptions.name}-serv`, "config") : path2.join(projectPath, "config");
|
|
1085
1123
|
const envExamplePath = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, ".env.example") : path2.join(projectPath, ".env.example");
|
|
1086
1124
|
for (const featureId of resolvedOptions.features) {
|
|
1087
1125
|
const configKey = getFeatureConfigKey(featureId);
|
|
1088
1126
|
if (configKey) {
|
|
1089
|
-
const content = generateConfigFile2(configKey, configs);
|
|
1127
|
+
const content = isFullstack && configKey === "iam" ? generateConfigFile2(configKey, configs).replace("seedDefaultData: true", "seedDefaultData: false") : generateConfigFile2(configKey, configs);
|
|
1090
1128
|
await writeFile(path2.join(configDir, `_${configKey}.yml`), content);
|
|
1091
1129
|
}
|
|
1092
1130
|
}
|
|
1093
|
-
if (!isApiWorkspace) {
|
|
1131
|
+
if (!isApiWorkspace && !isFullstack) {
|
|
1094
1132
|
await writeFile(
|
|
1095
1133
|
path2.join(configDir, "_core.yml"),
|
|
1096
1134
|
generateConfigFile2("core", configs)
|
|
@@ -1101,10 +1139,21 @@ async function createProject(options) {
|
|
|
1101
1139
|
# Service Runtime
|
|
1102
1140
|
# =============================================================================
|
|
1103
1141
|
PORT=3000
|
|
1142
|
+
` : isFullstack ? `${generateEnvExample(resolvedOptions.features, configs)}
|
|
1143
|
+
# First-start administrator password. The CLI generates a random value in .env.
|
|
1144
|
+
HAI_ADMIN_DEFAULT_PASSWORD=
|
|
1145
|
+
|
|
1146
|
+
# Local development API. Use your public API origin for deployment/native clients.
|
|
1147
|
+
PUBLIC_API_BASE=http://127.0.0.1:3000
|
|
1104
1148
|
` : generateEnvExample(resolvedOptions.features, configs);
|
|
1105
1149
|
await writeFile(envExamplePath, envExample);
|
|
1150
|
+
if (isFullstack) {
|
|
1151
|
+
const password = `Aa1!${randomBytes(24).toString("base64url")}`;
|
|
1152
|
+
await fse.writeFile(path2.join(projectPath, ".env"), envExample.replace("HAI_ADMIN_DEFAULT_PASSWORD=\n", `HAI_ADMIN_DEFAULT_PASSWORD=${password}
|
|
1153
|
+
`), { mode: 384 });
|
|
1154
|
+
}
|
|
1106
1155
|
}
|
|
1107
|
-
const { generateSkillFiles } = await import('./cli-skill-templates-
|
|
1156
|
+
const { generateSkillFiles } = await import('./cli-skill-templates-2KDUACT6.js');
|
|
1108
1157
|
await generateSkillFiles(
|
|
1109
1158
|
projectPath,
|
|
1110
1159
|
resolvedOptions.features,
|
|
@@ -1139,19 +1188,19 @@ PORT=3000
|
|
|
1139
1188
|
printCompletionMessage(resolvedOptions);
|
|
1140
1189
|
} catch (error) {
|
|
1141
1190
|
spinner.fail();
|
|
1142
|
-
|
|
1191
|
+
writeCliError(chalk.red(cliM("cli_createFailed")), error);
|
|
1143
1192
|
throw error;
|
|
1144
1193
|
}
|
|
1145
1194
|
}
|
|
1146
1195
|
async function resolveOptions(options) {
|
|
1147
1196
|
const useDefaults = options.yes ?? false;
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1197
|
+
writeCliMessage("");
|
|
1198
|
+
writeCliMessage(chalk.bold.cyan(" \u{1F680} hai Agent Framework"));
|
|
1199
|
+
writeCliMessage(chalk.gray(" AI-Native \xB7 Configuration-Driven \xB7 Security-First"));
|
|
1200
|
+
writeCliMessage("");
|
|
1152
1201
|
const onCancel = () => {
|
|
1153
|
-
|
|
1154
|
-
|
|
1202
|
+
writeCliMessage(chalk.red("\n\u5DF2\u53D6\u6D88"));
|
|
1203
|
+
process4.exit(1);
|
|
1155
1204
|
};
|
|
1156
1205
|
let projectName = options.name;
|
|
1157
1206
|
if (!projectName && useDefaults) {
|
|
@@ -1180,8 +1229,10 @@ async function resolveOptions(options) {
|
|
|
1180
1229
|
type: "select",
|
|
1181
1230
|
name: "appType",
|
|
1182
1231
|
message: "\u5E94\u7528\u7C7B\u578B:",
|
|
1232
|
+
hint: cliM("cli_selectHint"),
|
|
1183
1233
|
choices: Object.entries(APP_TYPES).map(([key, t]) => ({
|
|
1184
|
-
title:
|
|
1234
|
+
title: t.name,
|
|
1235
|
+
description: formatPromptDescription(t.description),
|
|
1185
1236
|
value: key
|
|
1186
1237
|
})),
|
|
1187
1238
|
initial: 0
|
|
@@ -1201,8 +1252,10 @@ async function resolveOptions(options) {
|
|
|
1201
1252
|
type: "select",
|
|
1202
1253
|
name: "template",
|
|
1203
1254
|
message: "\u9009\u62E9\u6A21\u677F:",
|
|
1255
|
+
hint: cliM("cli_selectHint"),
|
|
1204
1256
|
choices: Object.values(PROJECT_TEMPLATES).map((t) => ({
|
|
1205
|
-
title:
|
|
1257
|
+
title: t.name,
|
|
1258
|
+
description: formatPromptDescription(t.description),
|
|
1206
1259
|
value: t.name
|
|
1207
1260
|
})),
|
|
1208
1261
|
initial: 1
|
|
@@ -1213,21 +1266,22 @@ async function resolveOptions(options) {
|
|
|
1213
1266
|
let selectedFeatures = [];
|
|
1214
1267
|
const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures;
|
|
1215
1268
|
if (selectedAppType === "fullstack") {
|
|
1216
|
-
selectedFeatures =
|
|
1269
|
+
selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
|
|
1217
1270
|
} else if (selectedTemplate === "custom" && !options.features && useDefaults) {
|
|
1218
1271
|
selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
|
|
1219
1272
|
} else if (selectedTemplate === "custom" && !options.features) {
|
|
1220
1273
|
const featureChoices = SELECTABLE_FEATURES.map((id) => ({
|
|
1221
|
-
title:
|
|
1274
|
+
title: FEATURES[id].name,
|
|
1275
|
+
description: formatPromptDescription(FEATURES[id].description),
|
|
1222
1276
|
value: id,
|
|
1223
1277
|
selected: appTypeDefaults.includes(id)
|
|
1224
1278
|
}));
|
|
1225
1279
|
const { features } = await prompts({
|
|
1226
1280
|
type: "multiselect",
|
|
1227
1281
|
name: "features",
|
|
1228
|
-
message: "
|
|
1282
|
+
message: cliM("cli_featuresPrompt"),
|
|
1229
1283
|
choices: featureChoices,
|
|
1230
|
-
hint: "
|
|
1284
|
+
hint: cliM("cli_multiselectHint"),
|
|
1231
1285
|
instructions: false
|
|
1232
1286
|
}, { onCancel });
|
|
1233
1287
|
selectedFeatures = features || [];
|
|
@@ -1239,7 +1293,7 @@ async function resolveOptions(options) {
|
|
|
1239
1293
|
const merged = /* @__PURE__ */ new Set([...templateFeatures, ...appTypeDefaults]);
|
|
1240
1294
|
selectedFeatures = resolveFeatureDependencies(Array.from(merged));
|
|
1241
1295
|
}
|
|
1242
|
-
const moduleConfigs = selectedAppType === "fullstack" ? options.moduleConfigs
|
|
1296
|
+
const moduleConfigs = selectedAppType === "fullstack" ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName), ...options.moduleConfigs } : options.moduleConfigs ?? (useDefaults ? buildDefaultModuleConfigs(selectedFeatures, projectName) : await promptModuleConfigs(selectedFeatures, projectName));
|
|
1243
1297
|
let addExamples = options.examples;
|
|
1244
1298
|
if (addExamples === void 0 && useDefaults) {
|
|
1245
1299
|
addExamples = true;
|
|
@@ -1362,13 +1416,14 @@ async function resolveFrontendTargets(frontends, useDefaults, onCancel) {
|
|
|
1362
1416
|
const { selectedFrontends } = await prompts({
|
|
1363
1417
|
type: "multiselect",
|
|
1364
1418
|
name: "selectedFrontends",
|
|
1365
|
-
message: "
|
|
1419
|
+
message: cliM("cli_frontendsPrompt"),
|
|
1366
1420
|
choices: Object.entries(FRONTEND_TARGETS).map(([id, target]) => ({
|
|
1367
|
-
title:
|
|
1421
|
+
title: target.name,
|
|
1422
|
+
description: formatPromptDescription(target.description),
|
|
1368
1423
|
value: id,
|
|
1369
1424
|
selected: DEFAULT_FULLSTACK_FRONTENDS2.includes(id)
|
|
1370
1425
|
})),
|
|
1371
|
-
hint: "
|
|
1426
|
+
hint: cliM("cli_multiselectHint"),
|
|
1372
1427
|
instructions: false
|
|
1373
1428
|
}, { onCancel });
|
|
1374
1429
|
return normalizeFrontendTargets(selectedFrontends ?? DEFAULT_FULLSTACK_FRONTENDS2);
|
|
@@ -1400,13 +1455,13 @@ function resolveFeatureDependencies(features) {
|
|
|
1400
1455
|
async function promptModuleConfigs(features, projectName) {
|
|
1401
1456
|
const configs = {};
|
|
1402
1457
|
const onCancel = () => {
|
|
1403
|
-
|
|
1404
|
-
|
|
1458
|
+
writeCliMessage(chalk.red("\n\u5DF2\u53D6\u6D88"));
|
|
1459
|
+
process4.exit(1);
|
|
1405
1460
|
};
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1461
|
+
writeCliMessage("");
|
|
1462
|
+
writeCliMessage(chalk.bold(" \u2699 \u6A21\u5757\u914D\u7F6E"));
|
|
1463
|
+
writeCliMessage(chalk.gray(" \u8BBE\u7F6E\u5173\u952E\u914D\u7F6E\u9879\uFF08\u56DE\u8F66\u4F7F\u7528\u9ED8\u8BA4\u503C\uFF09"));
|
|
1464
|
+
writeCliMessage("");
|
|
1410
1465
|
configs.core = await promptCoreConfig(projectName, onCancel);
|
|
1411
1466
|
if (features.includes("db")) {
|
|
1412
1467
|
configs.db = await promptDbConfig(projectName, onCancel);
|
|
@@ -1426,7 +1481,7 @@ async function promptModuleConfigs(features, projectName) {
|
|
|
1426
1481
|
return configs;
|
|
1427
1482
|
}
|
|
1428
1483
|
async function promptCoreConfig(projectName, onCancel) {
|
|
1429
|
-
|
|
1484
|
+
writeCliMessage(chalk.cyan(" [core] \u5E94\u7528\u57FA\u7840\u914D\u7F6E"));
|
|
1430
1485
|
const { defaultLocale } = await prompts({
|
|
1431
1486
|
type: "select",
|
|
1432
1487
|
name: "defaultLocale",
|
|
@@ -1440,7 +1495,7 @@ async function promptCoreConfig(projectName, onCancel) {
|
|
|
1440
1495
|
return { name: projectName, defaultLocale };
|
|
1441
1496
|
}
|
|
1442
1497
|
async function promptDbConfig(projectName, onCancel) {
|
|
1443
|
-
|
|
1498
|
+
writeCliMessage(chalk.cyan(" [db] \u6570\u636E\u5E93\u914D\u7F6E"));
|
|
1444
1499
|
const { type } = await prompts({
|
|
1445
1500
|
type: "select",
|
|
1446
1501
|
name: "type",
|
|
@@ -1469,7 +1524,7 @@ async function promptDbConfig(projectName, onCancel) {
|
|
|
1469
1524
|
return { type, host: answers.host, port: answers.port, database: answers.database };
|
|
1470
1525
|
}
|
|
1471
1526
|
async function promptCacheConfig(onCancel) {
|
|
1472
|
-
|
|
1527
|
+
writeCliMessage(chalk.cyan(" [cache] \u7F13\u5B58\u914D\u7F6E"));
|
|
1473
1528
|
const { type } = await prompts({
|
|
1474
1529
|
type: "select",
|
|
1475
1530
|
name: "type",
|
|
@@ -1489,7 +1544,7 @@ async function promptCacheConfig(onCancel) {
|
|
|
1489
1544
|
return { type, host: answers.host, port: answers.port };
|
|
1490
1545
|
}
|
|
1491
1546
|
async function promptIamConfig(onCancel) {
|
|
1492
|
-
|
|
1547
|
+
writeCliMessage(chalk.cyan(" [iam] \u8BA4\u8BC1\u6388\u6743\u914D\u7F6E"));
|
|
1493
1548
|
const answers = await prompts([
|
|
1494
1549
|
{ type: "confirm", name: "loginPassword", message: "\u542F\u7528\u5BC6\u7801\u767B\u5F55?", initial: true },
|
|
1495
1550
|
{ type: "confirm", name: "loginOtp", message: "\u542F\u7528 OTP \u9A8C\u8BC1\u7801\u767B\u5F55?", initial: false }
|
|
@@ -1497,7 +1552,7 @@ async function promptIamConfig(onCancel) {
|
|
|
1497
1552
|
return { loginPassword: answers.loginPassword, loginOtp: answers.loginOtp };
|
|
1498
1553
|
}
|
|
1499
1554
|
async function promptStorageConfig(onCancel) {
|
|
1500
|
-
|
|
1555
|
+
writeCliMessage(chalk.cyan(" [storage] \u6587\u4EF6\u5B58\u50A8\u914D\u7F6E"));
|
|
1501
1556
|
const { type } = await prompts({
|
|
1502
1557
|
type: "select",
|
|
1503
1558
|
name: "type",
|
|
@@ -1520,7 +1575,7 @@ async function promptStorageConfig(onCancel) {
|
|
|
1520
1575
|
return { type };
|
|
1521
1576
|
}
|
|
1522
1577
|
async function promptAiConfig(onCancel) {
|
|
1523
|
-
|
|
1578
|
+
writeCliMessage(chalk.cyan(" [ai] AI \u96C6\u6210\u914D\u7F6E"));
|
|
1524
1579
|
const { defaultProvider } = await prompts({
|
|
1525
1580
|
type: "select",
|
|
1526
1581
|
name: "defaultProvider",
|
|
@@ -1581,21 +1636,21 @@ function installDependencies(projectPath, pm) {
|
|
|
1581
1636
|
});
|
|
1582
1637
|
} catch (error) {
|
|
1583
1638
|
const details = formatCommandFailure(installCmd, error);
|
|
1584
|
-
throw new Error(
|
|
1639
|
+
throw new Error(`${cliM("cli_installFailed", { params: { pm } })}
|
|
1585
1640
|
${details}`);
|
|
1586
1641
|
}
|
|
1587
1642
|
}
|
|
1588
1643
|
function formatCommandFailure(command, error) {
|
|
1589
1644
|
if (!error || typeof error !== "object") {
|
|
1590
|
-
return
|
|
1645
|
+
return cliM("cli_commandLabel", { params: { command } });
|
|
1591
1646
|
}
|
|
1592
1647
|
const failure = error;
|
|
1593
1648
|
const stdout = normalizeChildOutput(failure.stdout);
|
|
1594
1649
|
const stderr = normalizeChildOutput(failure.stderr);
|
|
1595
|
-
const status = typeof failure.status === "number" ?
|
|
1596
|
-
const signal = typeof failure.signal === "string" ?
|
|
1650
|
+
const status = typeof failure.status === "number" ? cliM("cli_exitCode", { params: { code: failure.status } }) : "";
|
|
1651
|
+
const signal = typeof failure.signal === "string" ? cliM("cli_signal", { params: { signal: failure.signal } }) : "";
|
|
1597
1652
|
const output = [
|
|
1598
|
-
|
|
1653
|
+
cliM("cli_commandLabel", { params: { command } }),
|
|
1599
1654
|
status,
|
|
1600
1655
|
signal,
|
|
1601
1656
|
stderr ? `stderr:
|
|
@@ -1619,7 +1674,7 @@ function generateAiDevelopmentReadme() {
|
|
|
1619
1674
|
|
|
1620
1675
|
\u4ECE\u672C\u9879\u76EE\u6839\u76EE\u5F55\u6253\u5F00\u6240\u7528\u7F16\u7801\u5DE5\u5177\uFF0C\u5148\u8BFB\u53D6 [AGENTS.md](./AGENTS.md)\u3002Claude Code \u901A\u8FC7 [CLAUDE.md](./CLAUDE.md) \u52A0\u8F7D\u9879\u76EE\u89C4\u5219\uFF1BGitHub Copilot \u4F7F\u7528 [.github/copilot-instructions.md](./.github/copilot-instructions.md)\uFF0COpenCode \u4F7F\u7528 AGENTS.md \u548C [opencode.json](./opencode.json)\u3002
|
|
1621
1676
|
|
|
1622
|
-
Codex\u3001Cursor\u3001Copilot\u3001OpenCode \u4ECE .agents/skills/ \u53D1\u73B0\u5171\u4EAB\u6280\u80FD\uFF1BClaude Code \
|
|
1677
|
+
Codex\u3001Cursor\u3001Copilot\u3001OpenCode \u4ECE .agents/skills/ \u53D1\u73B0\u5171\u4EAB\u6280\u80FD\uFF1BClaude Code \u901A\u8FC7 CLAUDE.md \u5F15\u7528 AGENTS.md\uFF0C\u5E76\u6309\u9879\u76EE\u6307\u5F15\u8BFB\u53D6 .agents/skills/ \u7684\u540C\u4E00\u4EFD\u6B63\u6587\u3002\u666E\u901A\u65B0\u589E\u3001\u4FEE\u6539\u3001\u4FEE\u590D\u4EFB\u52A1\u4F7F\u7528 [\u5E94\u7528\u5F00\u53D1 Skill](./.agents/skills/hai-app-create/SKILL.md) \u548C [\u5F00\u53D1\u89C4\u8303\u4E0E\u6846\u67B6\u80FD\u529B\u8DEF\u7531](./.agents/skills/hai-app-create/development.md)\uFF1B\u5177\u4F53\u6A21\u5757\u518D\u6309\u9700\u8BFB\u53D6\uFF0C\u4E0D\u80FD\u628A Skill \u5DF2\u4EA4\u4ED8\u5F53\u6210\u4F9D\u8D56\u5DF2\u5B89\u88C5\u6216\u914D\u7F6E\u5DF2\u542F\u7528\u3002
|
|
1623
1678
|
|
|
1624
1679
|
\u4F18\u5148\u590D\u7528\u9002\u7528\u7684 hai-framework \u516C\u5F00 API \u4E0E\u5DF2\u6709\u4E1A\u52A1\u5B9E\u73B0\u3002\u5B8C\u6210\u65F6\u8BF4\u660E\u590D\u7528\u7684\u80FD\u529B\u3001\u76F8\u5173\u80FD\u529B\u672A\u91C7\u7528\u7684\u539F\u56E0\uFF0C\u4EE5\u53CA\u5B89\u5168\u8FB9\u754C\u548C\u7C7B\u578B\u3001\u914D\u7F6E\u3001\u6587\u6848\u3001\u8C03\u7528\u65B9\u7684\u540C\u6B65\u60C5\u51B5\u3002\u8D28\u91CF\u9A8C\u8BC1\u6309\u5F53\u524D package.json \u6267\u884C typecheck \u2192 lint \u2192 build \u2192 test\uFF1BUI\u3001\u8DEF\u7531\u4E0E\u7AEF\u5230\u7AEF\u6D41\u7A0B\u53E6\u8FD0\u884C test:e2e\uFF0C\u672A\u8FD0\u884C\u9879\u8BF4\u660E\u539F\u56E0\u3002\u5B89\u5168\u4E0E\u8D28\u91CF\u89C4\u5219\u65E2\u8981\u6309\u89C4\u8303\u5BA1\u67E5\uFF0C\u4E5F\u8981\u8FD0\u884C\u95E8\u7981\u9A8C\u8BC1\u3002
|
|
1625
1680
|
|
|
@@ -1815,6 +1870,18 @@ curl --fail http://127.0.0.1:8080/runtime-config.js
|
|
|
1815
1870
|
|
|
1816
1871
|
\u5DF2\u542F\u7528\u524D\u7AEF\uFF1A${enabledFrontends || "Web / App / Desktop"}
|
|
1817
1872
|
|
|
1873
|
+
## \u9ED8\u8BA4\u7BA1\u7406\u529F\u80FD
|
|
1874
|
+
|
|
1875
|
+
\u9ED8\u8BA4\u542F\u7528 IAM\u3001reldb\u3001cache\u3001audit\u3001storage \u548C crypto\u3002\u7BA1\u7406\u5458\u53EF\u4EE5\u7BA1\u7406\u7528\u6237\uFF08\u65B0\u589E\u3001\u7F16\u8F91\u3001\u7981\u7528\u3001\u5220\u9664\u3001\u89D2\u8272\u5206\u914D\u3001\u5934\u50CF\u4E0A\u4F20\uFF09\u3001\u67E5\u770B\u4E24\u79CD\u56FA\u5B9A\u89D2\u8272\u53CA\u4EBA\u6570\u3001\u7EF4\u62A4\u89D2\u8272\u8BF4\u660E\u3001\u5206\u9875\u7B5B\u9009\u5BA1\u8BA1\u65E5\u5FD7\uFF1B\u666E\u901A\u7528\u6237\u53EA\u80FD\u7EF4\u62A4\u4E2A\u4EBA\u8D44\u6599\u3001\u5934\u50CF\u3001\u8BED\u8A00\u3001\u4E3B\u9898\u548C\u5BC6\u7801\u3002\u5BC6\u7801\u4FEE\u6539\u540E\u5168\u90E8\u4F1A\u8BDD\u5931\u6548\uFF0C\u9700\u8981\u91CD\u65B0\u767B\u5F55\u3002
|
|
1876
|
+
|
|
1877
|
+
CLI \u5DF2\u5728\u6839\u76EE\u5F55\u751F\u6210 \`.env\`\uFF0C\u5176\u4E2D \`HAI_ADMIN_DEFAULT_PASSWORD\` \u662F\u6BCF\u4E2A\u9879\u76EE\u72EC\u7ACB\u751F\u6210\u7684\u968F\u673A\u5F3A\u5BC6\u7801\u3002\u76F4\u63A5\u8FD0\u884C \`dev\` / \`start\` \u5373\u53EF\uFF0C\u9996\u6B21\u767B\u5F55\u4F7F\u7528\u7528\u6237\u540D \`admin\` \u548C\u8BE5\u5BC6\u7801\uFF1B\u4E5F\u53EF\u901A\u8FC7\u540C\u540D\u73AF\u5883\u53D8\u91CF\u8986\u76D6\u3002\u5BC6\u7801\u987B\u6EE1\u8DB3 \`_iam.yml\` \u7B56\u7565\uFF0C\u542F\u52A8\u5931\u8D25\u4F1A\u663E\u793A\u5177\u4F53\u6821\u9A8C\u539F\u56E0\u53CA\u9519\u8BEF\u7801\u3002\`.env\` \u5DF2\u88AB Git \u548C\u5BB9\u5668\u6784\u5EFA\u5FFD\u7565\uFF0C\`.env.example\` \u4E0D\u542B\u771F\u5B9E\u5BC6\u7801\uFF1B\u90E8\u7F72\u65F6\u8BBE\u7F6E\u76EE\u6807\u73AF\u5883\u81EA\u5DF1\u7684\u5BC6\u7801\u3002\u5DF2\u6709\u7528\u6237\u65F6\u4E0D\u4F1A\u91CD\u590D\u521B\u5EFA\u7BA1\u7406\u5458\u6216\u91CD\u8BBE\u5BC6\u7801\u3002
|
|
1878
|
+
|
|
1879
|
+
\u672C\u5730\u5F00\u53D1\u9ED8\u8BA4 \`PUBLIC_API_BASE=http://127.0.0.1:3000\`\uFF0CVite \u4F7F\u7528\u540C\u6E90\u4EE3\u7406\uFF1B\u90E8\u7F72\u65F6\u6539\u4E3A\u5B9E\u9645\u516C\u7F51 API Origin\uFF0CAndroid \u6A21\u62DF\u5668\u8BBF\u95EE\u5BBF\u4E3B\u673A\u65F6\u4F7F\u7528 \`http://10.0.2.2:3000\`\u3002\u4E0D\u8981\u5C06\u5BC6\u94A5\u653E\u5165\u4EFB\u4F55 \`PUBLIC_\` \u6216 \`VITE_\` \u53D8\u91CF\u3002
|
|
1880
|
+
|
|
1881
|
+
\u6240\u6709\u4E1A\u52A1 JSON \u8BF7\u6C42\u548C\u54CD\u5E94\u9ED8\u8BA4\u901A\u8FC7 \`@h-ai/crypto\` transport \u53CC\u5411\u52A0\u5BC6\uFF08\u542B\u767B\u5F55\u3001\u5237\u65B0\u3001\u5934\u50CF\u4E0A\u4F20\uFF09\uFF1B\u524D\u7AEF\u7EDF\u4E00\u4F7F\u7528\u5171\u4EAB typed API client\u3002Web \u8BBF\u95EE\u4EE4\u724C\u4EC5\u5B58\u5185\u5B58\u3001\u5237\u65B0\u4EE4\u724C\u7531 HttpOnly Cookie \u4FDD\u5B58\uFF1B\u53D7\u4FE1\u539F\u751F\u7AEF\u4F7F\u7528\u5E73\u53F0\u5B89\u5168\u5B58\u50A8\u6216\u5185\u5B58\u3002\u5934\u50CF\u4E3A\u968F\u673A\u8DEF\u5F84\u53EA\u8BFB\u56FE\u7247\u8D44\u6E90\uFF0C\u652F\u6301 PNG/JPEG/WebP\uFF0C\u6700\u5927 512 KiB\u3002\u5065\u5EB7\u68C0\u67E5\u548C\u53EA\u8BFB\u5934\u50CF\u56FE\u7247\u53EF\u76F4\u63A5\u8BBF\u95EE\u3002
|
|
1882
|
+
|
|
1883
|
+
\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
|
|
1884
|
+
|
|
1818
1885
|
## \u5F00\u53D1\u3001\u7F16\u8BD1\u4E0E\u6253\u5305
|
|
1819
1886
|
|
|
1820
1887
|
\`\`\`bash
|
|
@@ -1864,8 +1931,6 @@ ${webRunCommand}
|
|
|
1864
1931
|
\`\`\`bash
|
|
1865
1932
|
curl --fail http://127.0.0.1:3000/health
|
|
1866
1933
|
curl --fail http://127.0.0.1:3000/ready
|
|
1867
|
-
curl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\
|
|
1868
|
-
--header "Content-Type: application/json" --data '{}'
|
|
1869
1934
|
${webTestCommands}docker stop ${containerNames}
|
|
1870
1935
|
\`\`\`
|
|
1871
1936
|
|
|
@@ -1920,33 +1985,35 @@ ${generateAiDevelopmentReadme()}## \u6587\u6863
|
|
|
1920
1985
|
`;
|
|
1921
1986
|
}
|
|
1922
1987
|
function printCompletionMessage(options) {
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1988
|
+
writeCliMessage("");
|
|
1989
|
+
writeCliMessage(chalk.green("\u2714 \u9879\u76EE\u521B\u5EFA\u6210\u529F\uFF01"));
|
|
1990
|
+
writeCliMessage("");
|
|
1926
1991
|
if (options.features.length > 0) {
|
|
1927
|
-
|
|
1992
|
+
writeCliMessage(chalk.bold("\u5DF2\u542F\u7528\u529F\u80FD:"));
|
|
1928
1993
|
for (const featureId of options.features) {
|
|
1929
1994
|
const feature = FEATURES[featureId];
|
|
1930
1995
|
if (feature) {
|
|
1931
|
-
|
|
1996
|
+
writeCliMessage(chalk.gray(` \u2022 ${feature.name} (${featureId})`));
|
|
1932
1997
|
}
|
|
1933
1998
|
}
|
|
1934
|
-
|
|
1999
|
+
writeCliMessage("");
|
|
1935
2000
|
}
|
|
1936
|
-
|
|
1937
|
-
|
|
2001
|
+
writeCliMessage("\u4E0B\u4E00\u6B65\uFF1A");
|
|
2002
|
+
writeCliMessage(chalk.cyan(` cd ${options.name}`));
|
|
2003
|
+
if (options.appType === "fullstack")
|
|
2004
|
+
writeCliMessage(chalk.cyan(cliM("cli_adminPasswordSaved")));
|
|
1938
2005
|
if (!options.install) {
|
|
1939
|
-
|
|
2006
|
+
writeCliMessage(chalk.cyan(` ${getInstallCommand(options.packageManager)}`));
|
|
1940
2007
|
}
|
|
1941
2008
|
if (options.appType === "fullstack" || options.appType === "api") {
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
2009
|
+
writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "dev")}`));
|
|
2010
|
+
writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "typecheck")}`));
|
|
2011
|
+
writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "test")}`));
|
|
2012
|
+
writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "test:e2e")}`));
|
|
1946
2013
|
} else {
|
|
1947
|
-
|
|
2014
|
+
writeCliMessage(chalk.cyan(` ${getRunCommand(options.packageManager, "dev")}`));
|
|
1948
2015
|
}
|
|
1949
|
-
|
|
2016
|
+
writeCliMessage("");
|
|
1950
2017
|
}
|
|
1951
2018
|
async function detectProject(cwd) {
|
|
1952
2019
|
const pkgPath = path2.join(cwd, "package.json");
|
|
@@ -2028,7 +2095,7 @@ async function addModule(options) {
|
|
|
2028
2095
|
core.logger.info(`\u53EF\u7528\u6A21\u5757: ${Object.keys(MODULE_MAP).join(", ")}`);
|
|
2029
2096
|
return;
|
|
2030
2097
|
}
|
|
2031
|
-
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-
|
|
2098
|
+
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-2KDUACT6.js');
|
|
2032
2099
|
if (moduleDef.packages.every((p) => project.haiPackages.includes(p))) {
|
|
2033
2100
|
const generatedFiles2 = await generateProjectAiSupport(
|
|
2034
2101
|
cwd,
|
|
@@ -2065,7 +2132,7 @@ async function addModule(options) {
|
|
|
2065
2132
|
if (!pkg.dependencies)
|
|
2066
2133
|
pkg.dependencies = {};
|
|
2067
2134
|
const existingHaiSpecifier = Object.entries(pkg.dependencies).find(([pkgName]) => pkgName.startsWith("@h-ai/"))?.[1];
|
|
2068
|
-
const depVersion = existingHaiSpecifier === "catalog:" ? "catalog:" :
|
|
2135
|
+
const depVersion = existingHaiSpecifier === "catalog:" ? "catalog:" : getCliVersion();
|
|
2069
2136
|
for (const pkgName of allPackages) {
|
|
2070
2137
|
if (!pkg.dependencies[pkgName]) {
|
|
2071
2138
|
pkg.dependencies[pkgName] = depVersion;
|
|
@@ -2136,13 +2203,13 @@ async function addModule(options) {
|
|
|
2136
2203
|
}
|
|
2137
2204
|
async function deployCommand(options) {
|
|
2138
2205
|
const spinner = ora();
|
|
2139
|
-
const cwd = options.cwd ??
|
|
2206
|
+
const cwd = options.cwd ?? process4.cwd();
|
|
2140
2207
|
const appDir = resolve(cwd, options.appDir ?? ".");
|
|
2141
2208
|
let closeDeploy = null;
|
|
2142
2209
|
try {
|
|
2143
2210
|
let deployModule;
|
|
2144
2211
|
try {
|
|
2145
|
-
deployModule = await import('./src-
|
|
2212
|
+
deployModule = await import('./src-DUGLX4YB.js');
|
|
2146
2213
|
} catch {
|
|
2147
2214
|
core.logger.error(chalk.red(cliM("cli_deploy_module_missing")));
|
|
2148
2215
|
core.logger.info(chalk.cyan(" pnpm add @h-ai/deploy"));
|
|
@@ -2212,14 +2279,14 @@ async function deployCommand(options) {
|
|
|
2212
2279
|
await closeDeploy();
|
|
2213
2280
|
} catch (error) {
|
|
2214
2281
|
core.logger.error("Failed to close deploy module", { error });
|
|
2215
|
-
|
|
2282
|
+
process4.exitCode = 1;
|
|
2216
2283
|
}
|
|
2217
2284
|
}
|
|
2218
2285
|
}
|
|
2219
2286
|
}
|
|
2220
2287
|
function interpolateEnvFallback(content) {
|
|
2221
2288
|
return content.replace(/\$\{([^:}]+)(?::([^}]*))?\}/g, (_match, key, defaultValue) => {
|
|
2222
|
-
return
|
|
2289
|
+
return process4.env[key] ?? defaultValue ?? "";
|
|
2223
2290
|
});
|
|
2224
2291
|
}
|
|
2225
2292
|
var GENERATORS = {
|
|
@@ -2563,7 +2630,7 @@ async function initProject(options) {
|
|
|
2563
2630
|
const { project, existing, missing } = result;
|
|
2564
2631
|
spinner.succeed(`\u68C0\u6D4B\u5230\u9879\u76EE: ${chalk.cyan(project.name)}`);
|
|
2565
2632
|
if (project.isHaiProject) {
|
|
2566
|
-
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-
|
|
2633
|
+
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-2KDUACT6.js');
|
|
2567
2634
|
const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {
|
|
2568
2635
|
overwriteSkills: false,
|
|
2569
2636
|
overwriteBridgeFiles: false
|
|
@@ -2667,7 +2734,7 @@ cli.command("create [name]", "\u521B\u5EFA\u65B0\u7684 hai \u9879\u76EE").option
|
|
|
2667
2734
|
cwd: options.cwd
|
|
2668
2735
|
});
|
|
2669
2736
|
} catch {
|
|
2670
|
-
|
|
2737
|
+
process4.exitCode = 1;
|
|
2671
2738
|
}
|
|
2672
2739
|
});
|
|
2673
2740
|
cli.command("add [module]", "\u5411\u73B0\u6709\u9879\u76EE\u6DFB\u52A0\u6A21\u5757").option("--no-install", "\u4E0D\u5B89\u88C5\u4F9D\u8D56").action(async (module, options) => {
|
|
@@ -2679,7 +2746,7 @@ cli.command("add [module]", "\u5411\u73B0\u6709\u9879\u76EE\u6DFB\u52A0\u6A21\u5
|
|
|
2679
2746
|
cwd: options.cwd
|
|
2680
2747
|
});
|
|
2681
2748
|
} catch {
|
|
2682
|
-
|
|
2749
|
+
process4.exit(1);
|
|
2683
2750
|
}
|
|
2684
2751
|
});
|
|
2685
2752
|
cli.command("init", "\u521D\u59CB\u5316/\u6821\u9A8C\u9879\u76EE\u914D\u7F6E").option("-f, --force", "\u5F3A\u5236\u91CD\u65B0\u751F\u6210\u914D\u7F6E").action(async (options) => {
|
|
@@ -2690,7 +2757,7 @@ cli.command("init", "\u521D\u59CB\u5316/\u6821\u9A8C\u9879\u76EE\u914D\u7F6E").o
|
|
|
2690
2757
|
cwd: options.cwd
|
|
2691
2758
|
});
|
|
2692
2759
|
} catch {
|
|
2693
|
-
|
|
2760
|
+
process4.exit(1);
|
|
2694
2761
|
}
|
|
2695
2762
|
});
|
|
2696
2763
|
cli.command("generate [type] [name]", "\u751F\u6210\u4EE3\u7801").alias("g").option("-o, --output <path>", "\u8F93\u51FA\u8DEF\u5F84").option("-f, --force", "\u8986\u76D6\u73B0\u6709\u6587\u4EF6").action(async (type, name, options) => {
|
|
@@ -2704,7 +2771,7 @@ cli.command("generate [type] [name]", "\u751F\u6210\u4EE3\u7801").alias("g").opt
|
|
|
2704
2771
|
cwd: options.cwd
|
|
2705
2772
|
});
|
|
2706
2773
|
} catch {
|
|
2707
|
-
|
|
2774
|
+
process4.exit(1);
|
|
2708
2775
|
}
|
|
2709
2776
|
});
|
|
2710
2777
|
cli.command("deploy [appDir]", "\u90E8\u7F72\u5E94\u7528\u5230\u4E91\u5E73\u53F0").option("--project-name <name>", "\u9879\u76EE\u540D\u79F0\uFF08\u9ED8\u8BA4\u4ECE package.json \u8BFB\u53D6\uFF09").option("--skip-provision", "\u8DF3\u8FC7\u57FA\u7840\u8BBE\u65BD\u5F00\u901A").option("--skip-build", "\u8DF3\u8FC7\u6784\u5EFA").action(async (appDir, options) => {
|
|
@@ -2718,7 +2785,7 @@ cli.command("deploy [appDir]", "\u90E8\u7F72\u5E94\u7528\u5230\u4E91\u5E73\u53F0
|
|
|
2718
2785
|
cwd: options.cwd
|
|
2719
2786
|
});
|
|
2720
2787
|
} catch {
|
|
2721
|
-
|
|
2788
|
+
process4.exit(1);
|
|
2722
2789
|
}
|
|
2723
2790
|
});
|
|
2724
2791
|
cli.command("g:page <name>", "\u751F\u6210\u9875\u9762").action(async (name, options) => {
|
|
@@ -2737,9 +2804,9 @@ cli.version(VERSION);
|
|
|
2737
2804
|
cli.help();
|
|
2738
2805
|
var parsed = cli.parse();
|
|
2739
2806
|
if (!cli.matchedCommand && !parsed.options.help && !parsed.options.version) {
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2807
|
+
writeCliMessage("");
|
|
2808
|
+
writeCliMessage(chalk.cyan("hai Agent Framework CLI"));
|
|
2809
|
+
writeCliMessage("");
|
|
2743
2810
|
cli.outputHelp();
|
|
2744
2811
|
}
|
|
2745
2812
|
//# sourceMappingURL=index.js.map
|