@h-ai/cli 0.1.0-alpha.56 → 0.1.0-alpha.58
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 +239 -0
- package/README.ja.md +239 -0
- package/README.md +51 -1
- package/dist/chunk-2H7UOFLK.js +0 -0
- package/dist/chunk-F4IBPVZ5.js +355 -0
- package/dist/chunk-F4IBPVZ5.js.map +1 -0
- package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
- package/dist/chunk-WUSFJFW5.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-ZIWYMS4Y.js → cli-skill-templates-45CK4RQ2.js} +3 -3
- package/dist/{cli-skill-templates-ZIWYMS4Y.js.map → cli-skill-templates-45CK4RQ2.js.map} +1 -1
- package/dist/index.js +134 -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 +17 -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/.gitignore.hbs +13 -0
- package/templates/apps/api/.npmrc.hbs +1 -0
- 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 +4 -2
- package/templates/apps/api/{eslint.config.js → eslint.config.js.hbs} +6 -8
- package/templates/apps/api/package.json.hbs +3 -3
- 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/.gitignore.hbs +16 -0
- package/templates/apps/fullstack/.npmrc.hbs +1 -0
- 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/eslint.config.js.hbs +5 -8
- 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/eslint.config.js.hbs +5 -8
- 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/eslint.config.js.hbs +5 -8
- 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 +207 -17
- package/templates/apps/fullstack/{eslint.config.js → eslint.config.js.hbs} +6 -8
- package/templates/apps/fullstack/package.json.hbs +3 -3
- 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 -0
- package/templates/base/Dockerfile.hbs +9 -8
- package/templates/base/e2e/app.spec.ts.hbs +1 -0
- package/templates/base/eslint-rules.js +45 -0
- package/templates/base/eslint.config.js.hbs +6 -8
- 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/AGENTS.md +9 -8
- package/templates/skills/CLAUDE.md +0 -10
- package/templates/skills/bridges/admin/AGENTS.md +8 -0
- package/templates/skills/bridges/admin/copilot-instructions.md +2 -0
- package/templates/skills/bridges/api/AGENTS.md +8 -1
- package/templates/skills/bridges/api/copilot-instructions.md +2 -0
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +21 -4
- package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +5 -0
- package/templates/skills/bridges/h5/AGENTS.md +8 -0
- package/templates/skills/bridges/h5/copilot-instructions.md +2 -0
- package/templates/skills/bridges/mobile-app/AGENTS.md +8 -0
- package/templates/skills/bridges/mobile-app/copilot-instructions.md +2 -0
- package/templates/skills/bridges/website/AGENTS.md +8 -0
- package/templates/skills/bridges/website/copilot-instructions.md +2 -0
- package/templates/skills/copilot-instructions.md +2 -0
- package/templates/skills/hai-api-client/SKILL.md +2 -0
- package/templates/skills/hai-app-create/SKILL.md +9 -7
- package/templates/skills/hai-app-create/development.md +72 -0
- package/templates/skills/hai-app-create/reference.md +44 -32
- package/templates/skills/hai-app-review/SKILL.md +50 -144
- package/templates/skills/hai-app-tests/SKILL.md +3 -1
- package/templates/skills/hai-app-tests/reference.md +47 -27
- package/templates/skills/hai-build/SKILL.md +5 -4
- package/templates/skills/hai-build/reference.md +56 -34
- package/templates/skills/hai-ci/SKILL.md +8 -15
- package/templates/skills/hai-core/SKILL.md +2 -0
- package/templates/skills/hai-core/reference.md +6 -4
- package/templates/skills/hai-framework-sync/SKILL.md +8 -2
- package/templates/skills/hai-pr-review/SKILL.md +5 -4
- package/templates/skills/hai-reldb/SKILL.md +1 -0
- package/templates/skills/hai-reldb/reference.md +3 -0
- package/templates/skills/hai-scheduler/SKILL.md +3 -0
- package/templates/skills/hai-serv/SKILL.md +2 -0
- package/templates/skills/hai-serv/reference.md +18 -2
- package/templates/skills/hai-storage/SKILL.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-O3ANVICQ.js.map +0 -1
- package/dist/chunk-WUYLYCW2.js +0 -237
- package/dist/chunk-WUYLYCW2.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 -11
- package/templates/skills/bridges/api/CLAUDE.md +0 -11
- package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -5
- package/templates/skills/bridges/h5/CLAUDE.md +0 -11
- package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -11
- package/templates/skills/bridges/website/CLAUDE.md +0 -11
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { generateConfigFile } from './chunk-
|
|
3
|
-
import './chunk-
|
|
2
|
+
import { generateConfigFile } from './chunk-WUSFJFW5.js';
|
|
3
|
+
import { cliM } from './chunk-F4IBPVZ5.js';
|
|
4
4
|
import './chunk-2H7UOFLK.js';
|
|
5
5
|
import process3 from 'process';
|
|
6
6
|
import { core } from '@h-ai/core';
|
|
@@ -9,13 +9,14 @@ import chalk from 'chalk';
|
|
|
9
9
|
import path2, { resolve } from 'path';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
11
|
import fse from 'fs-extra';
|
|
12
|
-
import
|
|
12
|
+
import Handlebars2 from 'handlebars';
|
|
13
13
|
import ora from 'ora';
|
|
14
14
|
import prompts from 'prompts';
|
|
15
15
|
import { Buffer } from 'buffer';
|
|
16
16
|
import { execSync, execFileSync } from 'child_process';
|
|
17
|
+
import { randomBytes } from 'crypto';
|
|
18
|
+
import { stringify, parse } from 'yaml';
|
|
17
19
|
import { existsSync, readFileSync } from 'fs';
|
|
18
|
-
import { parse } from 'yaml';
|
|
19
20
|
|
|
20
21
|
var CAMEL_CASE_SEPARATOR_REGEX = /[-_\s]+(.)?/g;
|
|
21
22
|
var LEADING_CHAR_REGEX = /^./;
|
|
@@ -79,26 +80,30 @@ async function detectPackageManager(cwd) {
|
|
|
79
80
|
return "npm";
|
|
80
81
|
}
|
|
81
82
|
function registerHelpers() {
|
|
82
|
-
|
|
83
|
+
Handlebars2.registerHelper("if_eq", function(a, b, options) {
|
|
83
84
|
return a === b ? options.fn(this) : options.inverse(this);
|
|
84
85
|
});
|
|
85
|
-
|
|
86
|
+
Handlebars2.registerHelper("date", () => {
|
|
86
87
|
return (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
87
88
|
});
|
|
88
|
-
|
|
89
|
+
Handlebars2.registerHelper("year", () => {
|
|
89
90
|
return (/* @__PURE__ */ new Date()).getFullYear();
|
|
90
91
|
});
|
|
91
|
-
|
|
92
|
+
Handlebars2.registerHelper("upper", (str) => {
|
|
92
93
|
return str.toUpperCase();
|
|
93
94
|
});
|
|
94
|
-
|
|
95
|
+
Handlebars2.registerHelper("lower", (str) => {
|
|
95
96
|
return str.toLowerCase();
|
|
96
97
|
});
|
|
97
98
|
}
|
|
98
99
|
registerHelpers();
|
|
99
|
-
|
|
100
|
+
Handlebars2.registerHelper("if_eq", function(a, b, options) {
|
|
100
101
|
return a === b ? options.fn(this) : options.inverse(this);
|
|
101
102
|
});
|
|
103
|
+
Handlebars2.registerHelper("json", (value) => JSON.stringify(value));
|
|
104
|
+
Handlebars2.registerHelper("html", (value) => Handlebars2.escapeExpression(value));
|
|
105
|
+
Handlebars2.registerHelper("yaml", (key, value) => stringify({ [key]: value }).trim());
|
|
106
|
+
Handlebars2.registerHelper("jsString", (value) => `'${JSON.stringify(value).slice(1, -1).replace(/\\"/g, '"').replace(/'/g, "\\'")}'`);
|
|
102
107
|
var TEMPLATE_SKIP_IF_EMPTY_MARKER = "@skipIfEmpty";
|
|
103
108
|
var NORMALIZED_RENDER_EXTENSIONS = /* @__PURE__ */ new Set([".ts", ".js", ".svelte", ".json", ".css"]);
|
|
104
109
|
var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
|
|
@@ -106,53 +111,56 @@ var CAPACITOR_SKIPPED_SERVER_FILES = /* @__PURE__ */ new Set([
|
|
|
106
111
|
"src/lib/server/init.ts"
|
|
107
112
|
]);
|
|
108
113
|
var VERSIONS = {
|
|
109
|
-
antfuEslintConfig: "^9.
|
|
110
|
-
capacitorSecureStorage: "^8.0.
|
|
114
|
+
antfuEslintConfig: "^9.5.1",
|
|
115
|
+
capacitorSecureStorage: "^8.0.1",
|
|
111
116
|
// UI / Icon
|
|
112
|
-
bitsUi: "^2.
|
|
113
|
-
iconifyJsonTabler: "^1.2.
|
|
117
|
+
bitsUi: "^2.19.5",
|
|
118
|
+
iconifyJsonTabler: "^1.2.42",
|
|
114
119
|
iconifyTailwind: "^1.2.3",
|
|
115
120
|
// 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
|
|
121
|
+
capacitorAndroid: "^8.5.3",
|
|
122
|
+
capacitorApp: "^8.1.2",
|
|
123
|
+
capacitorCamera: "^8.2.5",
|
|
124
|
+
capacitorCli: "^8.5.3",
|
|
125
|
+
capacitorCore: "^8.5.3",
|
|
126
|
+
capacitorDevice: "^8.0.3",
|
|
127
|
+
capacitorIos: "^8.5.3",
|
|
123
128
|
capacitorPreferences: "^8.0.1",
|
|
124
|
-
capacitorPushNotifications: "^8.
|
|
125
|
-
capacitorStatusBar: "^8.0.
|
|
129
|
+
capacitorPushNotifications: "^8.1.3",
|
|
130
|
+
capacitorStatusBar: "^8.0.4",
|
|
126
131
|
// Tailwind / DaisyUI
|
|
127
|
-
daisyui: "^5.
|
|
128
|
-
tailwindcss: "^4.3.
|
|
129
|
-
tailwindcssVite: "^4.3.
|
|
132
|
+
daisyui: "^5.7.47",
|
|
133
|
+
tailwindcss: "^4.3.3",
|
|
134
|
+
tailwindcssVite: "^4.3.3",
|
|
130
135
|
// i18n
|
|
131
|
-
inlangParaglide: "^2.
|
|
132
|
-
inlangMessageFormat: "^4.
|
|
136
|
+
inlangParaglide: "^2.27.0",
|
|
137
|
+
inlangMessageFormat: "^4.5.0",
|
|
133
138
|
// Svelte / Vite
|
|
134
|
-
svelte: "^5.
|
|
135
|
-
|
|
136
|
-
|
|
139
|
+
svelte: "^5.57.2",
|
|
140
|
+
svelteKit: "^2.70.3",
|
|
141
|
+
svelteAdapterNode: "^5.5.7",
|
|
142
|
+
svelteCheck: "^4.7.6",
|
|
143
|
+
sveltePlugin: "^7.3.1",
|
|
137
144
|
// Build / Test
|
|
138
|
-
vite: "^8.
|
|
139
|
-
vitest: "^4.1.
|
|
145
|
+
vite: "^8.3.4",
|
|
146
|
+
vitest: "^4.1.11",
|
|
140
147
|
tsup: "^8.5.1",
|
|
141
148
|
rimraf: "^6.1.3",
|
|
142
149
|
// ESLint
|
|
143
|
-
eslint: "^10.
|
|
150
|
+
eslint: "^10.12.0",
|
|
144
151
|
eslintPluginFormat: "^2.0.1",
|
|
145
|
-
eslintPluginSvelte: "^3.
|
|
146
|
-
svelteEslintParser: "^1.
|
|
152
|
+
eslintPluginSvelte: "^3.23.1",
|
|
153
|
+
svelteEslintParser: "^1.9.0",
|
|
147
154
|
// Node / TS
|
|
148
|
-
nodeTypes: "^
|
|
155
|
+
nodeTypes: "^26.6.5",
|
|
156
|
+
// Svelte / ESLint / tsup 继续使用稳定的 JavaScript 编译 API。
|
|
149
157
|
typescript: "^6.0.3",
|
|
150
158
|
// E2E
|
|
151
|
-
playwright: "^1.
|
|
159
|
+
playwright: "^1.64.0",
|
|
152
160
|
// Validation
|
|
153
|
-
zod: "^4.
|
|
161
|
+
zod: "^4.6.5",
|
|
154
162
|
// Tauri
|
|
155
|
-
tauriCli: "^2.
|
|
163
|
+
tauriCli: "^2.12.1"
|
|
156
164
|
};
|
|
157
165
|
var FRONTEND_PORTS_DEFAULT = {
|
|
158
166
|
web: 4173,
|
|
@@ -261,11 +269,20 @@ var FULLSTACK_CONTRACT_CATALOG_PACKAGE_NAMES = [
|
|
|
261
269
|
"zod"
|
|
262
270
|
];
|
|
263
271
|
var FULLSTACK_SERV_CATALOG_PACKAGE_NAMES = [
|
|
272
|
+
"@h-ai/audit",
|
|
273
|
+
"@h-ai/cache",
|
|
264
274
|
"@h-ai/core",
|
|
265
|
-
"@h-ai/
|
|
275
|
+
"@h-ai/crypto",
|
|
276
|
+
"@h-ai/iam",
|
|
277
|
+
"@h-ai/reldb",
|
|
278
|
+
"@h-ai/serv",
|
|
279
|
+
"@h-ai/storage",
|
|
280
|
+
"zod"
|
|
266
281
|
];
|
|
267
282
|
var FULLSTACK_SHARED_CATALOG_PACKAGE_NAMES = [
|
|
268
283
|
"@h-ai/api-client",
|
|
284
|
+
"@h-ai/core",
|
|
285
|
+
"@h-ai/crypto",
|
|
269
286
|
"@h-ai/ui",
|
|
270
287
|
"@inlang/paraglide-js",
|
|
271
288
|
"@inlang/plugin-message-format",
|
|
@@ -534,6 +551,9 @@ function buildTemplateContext(options) {
|
|
|
534
551
|
for (const f of options.features) {
|
|
535
552
|
featureMap[f] = true;
|
|
536
553
|
}
|
|
554
|
+
if (options.appType === "fullstack") {
|
|
555
|
+
for (const feature of ["iam", "db", "cache", "crypto", "storage", "audit"]) featureMap[feature] = true;
|
|
556
|
+
}
|
|
537
557
|
if (featureMap.iam) {
|
|
538
558
|
featureMap.db = true;
|
|
539
559
|
featureMap.cache = true;
|
|
@@ -564,6 +584,7 @@ function buildTemplateContext(options) {
|
|
|
564
584
|
}
|
|
565
585
|
return {
|
|
566
586
|
projectName: options.name,
|
|
587
|
+
versions: VERSIONS,
|
|
567
588
|
useCatalogProtocol,
|
|
568
589
|
haiPackageSpecifier: useCatalogProtocol ? HAI_PACKAGE_SPECIFIER_CATALOG : HAI_PACKAGE_VERSION,
|
|
569
590
|
haiPackageVersion: HAI_PACKAGE_VERSION,
|
|
@@ -610,6 +631,7 @@ function buildFullstackTemplateContext(projectName, frontendsInput, moduleConfig
|
|
|
610
631
|
port: portFor(target)
|
|
611
632
|
}));
|
|
612
633
|
return {
|
|
634
|
+
appName: moduleConfigs?.core?.name ?? projectName,
|
|
613
635
|
versions: VERSIONS,
|
|
614
636
|
packageSpecifiers: buildFullstackPackageSpecifiers(useCatalogProtocol),
|
|
615
637
|
contractPackageName: `${projectName}-contract`,
|
|
@@ -680,13 +702,15 @@ async function generateFromTemplates(projectPath, context) {
|
|
|
680
702
|
const includeBaseTemplate = context.appType !== "fullstack" && !context.isApiWorkspace;
|
|
681
703
|
if (includeBaseTemplate) {
|
|
682
704
|
await copyStaticDir(path2.join(root, "base"), projectPath);
|
|
705
|
+
} else {
|
|
706
|
+
await fse.copy(path2.join(root, "base", "eslint-rules.js"), path2.join(projectPath, "eslint-rules.js"));
|
|
683
707
|
}
|
|
684
708
|
const appDir = path2.join(root, "apps", context.appType);
|
|
685
709
|
if (await fse.pathExists(appDir)) {
|
|
686
710
|
const appExcludes = context.hasI18n ? [] : ["messages"];
|
|
687
711
|
await copyStaticDir(appDir, projectPath, appExcludes);
|
|
688
712
|
}
|
|
689
|
-
if (!context.isApiWorkspace) {
|
|
713
|
+
if (!context.isApiWorkspace && context.appType !== "fullstack") {
|
|
690
714
|
for (const featureId of Object.keys(context.features)) {
|
|
691
715
|
if (context.isSvelteOnlyApp) {
|
|
692
716
|
continue;
|
|
@@ -740,7 +764,7 @@ async function renderDynamicFiles(templatesRoot, projectPath, context) {
|
|
|
740
764
|
await renderHbsInDir(dir, projectPath, context);
|
|
741
765
|
await copyRenderedStaticPathFiles(dir, projectPath, context);
|
|
742
766
|
}
|
|
743
|
-
if (context.isApiWorkspace) {
|
|
767
|
+
if (context.isApiWorkspace || context.appType === "fullstack") {
|
|
744
768
|
return;
|
|
745
769
|
}
|
|
746
770
|
const routesDest = path2.join(projectPath, "src", "routes");
|
|
@@ -778,7 +802,7 @@ async function renderHbsInDir(dir, destRoot, context) {
|
|
|
778
802
|
const srcPath = path2.join(dir, relPath);
|
|
779
803
|
const outRelPathTemplate = relPath.replace(HBS_SUFFIX_REGEX, "");
|
|
780
804
|
const template = await fse.readFile(srcPath, "utf-8");
|
|
781
|
-
const compiled =
|
|
805
|
+
const compiled = Handlebars2.compile(template, { noEscape: true });
|
|
782
806
|
const rendered = compiled(context);
|
|
783
807
|
if (shouldSkipRenderedFile(template, rendered)) {
|
|
784
808
|
continue;
|
|
@@ -839,7 +863,7 @@ function shouldSkipRenderedFile(template, rendered) {
|
|
|
839
863
|
}
|
|
840
864
|
function renderOutputPath(pathTemplate, context) {
|
|
841
865
|
const normalizedTemplate = pathTemplate.split(path2.sep).join("/");
|
|
842
|
-
return
|
|
866
|
+
return Handlebars2.compile(normalizedTemplate, { noEscape: true })(context);
|
|
843
867
|
}
|
|
844
868
|
function isSafeRelativePath(relativePath) {
|
|
845
869
|
const normalized = path2.normalize(relativePath);
|
|
@@ -877,8 +901,8 @@ var APP_TYPES = {
|
|
|
877
901
|
},
|
|
878
902
|
"fullstack": {
|
|
879
903
|
name: "\u524D\u540E\u7AEF\u5206\u79BB\u5DE5\u7A0B",
|
|
880
|
-
description: "\u591A\
|
|
881
|
-
defaultFeatures: []
|
|
904
|
+
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",
|
|
905
|
+
defaultFeatures: ["iam", "db", "cache", "crypto", "storage", "audit"]
|
|
882
906
|
}
|
|
883
907
|
};
|
|
884
908
|
var FRONTEND_TARGETS = {
|
|
@@ -1075,20 +1099,21 @@ async function createProject(options) {
|
|
|
1075
1099
|
packageManager: resolvedOptions.packageManager
|
|
1076
1100
|
});
|
|
1077
1101
|
await generateFromTemplates(projectPath, context);
|
|
1078
|
-
|
|
1079
|
-
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-
|
|
1102
|
+
{
|
|
1103
|
+
const { generateConfigFile: generateConfigFile2, generateEnvExample } = await import('./cli-config-templates-6XA7V6CC.js');
|
|
1080
1104
|
const configs = resolvedOptions.moduleConfigs;
|
|
1081
1105
|
const isApiWorkspace = resolvedOptions.appType === "api";
|
|
1082
|
-
const
|
|
1106
|
+
const isFullstack = resolvedOptions.appType === "fullstack";
|
|
1107
|
+
const configDir = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, "config") : isFullstack ? path2.join(projectPath, "packages", `${resolvedOptions.name}-serv`, "config") : path2.join(projectPath, "config");
|
|
1083
1108
|
const envExamplePath = isApiWorkspace ? path2.join(projectPath, "apps", `${resolvedOptions.name}-service`, ".env.example") : path2.join(projectPath, ".env.example");
|
|
1084
1109
|
for (const featureId of resolvedOptions.features) {
|
|
1085
1110
|
const configKey = getFeatureConfigKey(featureId);
|
|
1086
1111
|
if (configKey) {
|
|
1087
|
-
const content = generateConfigFile2(configKey, configs);
|
|
1112
|
+
const content = isFullstack && configKey === "iam" ? generateConfigFile2(configKey, configs).replace("seedDefaultData: true", "seedDefaultData: false") : generateConfigFile2(configKey, configs);
|
|
1088
1113
|
await writeFile(path2.join(configDir, `_${configKey}.yml`), content);
|
|
1089
1114
|
}
|
|
1090
1115
|
}
|
|
1091
|
-
if (!isApiWorkspace) {
|
|
1116
|
+
if (!isApiWorkspace && !isFullstack) {
|
|
1092
1117
|
await writeFile(
|
|
1093
1118
|
path2.join(configDir, "_core.yml"),
|
|
1094
1119
|
generateConfigFile2("core", configs)
|
|
@@ -1099,10 +1124,21 @@ async function createProject(options) {
|
|
|
1099
1124
|
# Service Runtime
|
|
1100
1125
|
# =============================================================================
|
|
1101
1126
|
PORT=3000
|
|
1127
|
+
` : isFullstack ? `${generateEnvExample(resolvedOptions.features, configs)}
|
|
1128
|
+
# First-start administrator password. The CLI generates a random value in .env.
|
|
1129
|
+
HAI_ADMIN_DEFAULT_PASSWORD=
|
|
1130
|
+
|
|
1131
|
+
# Local development API. Use your public API origin for deployment/native clients.
|
|
1132
|
+
PUBLIC_API_BASE=http://127.0.0.1:3000
|
|
1102
1133
|
` : generateEnvExample(resolvedOptions.features, configs);
|
|
1103
1134
|
await writeFile(envExamplePath, envExample);
|
|
1135
|
+
if (isFullstack) {
|
|
1136
|
+
const password = `Aa1!${randomBytes(24).toString("base64url")}`;
|
|
1137
|
+
await fse.writeFile(path2.join(projectPath, ".env"), envExample.replace("HAI_ADMIN_DEFAULT_PASSWORD=\n", `HAI_ADMIN_DEFAULT_PASSWORD=${password}
|
|
1138
|
+
`), { mode: 384 });
|
|
1139
|
+
}
|
|
1104
1140
|
}
|
|
1105
|
-
const { generateSkillFiles } = await import('./cli-skill-templates-
|
|
1141
|
+
const { generateSkillFiles } = await import('./cli-skill-templates-45CK4RQ2.js');
|
|
1106
1142
|
await generateSkillFiles(
|
|
1107
1143
|
projectPath,
|
|
1108
1144
|
resolvedOptions.features,
|
|
@@ -1211,7 +1247,7 @@ async function resolveOptions(options) {
|
|
|
1211
1247
|
let selectedFeatures = [];
|
|
1212
1248
|
const appTypeDefaults = APP_TYPES[selectedAppType].defaultFeatures;
|
|
1213
1249
|
if (selectedAppType === "fullstack") {
|
|
1214
|
-
selectedFeatures =
|
|
1250
|
+
selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
|
|
1215
1251
|
} else if (selectedTemplate === "custom" && !options.features && useDefaults) {
|
|
1216
1252
|
selectedFeatures = resolveFeatureDependencies(appTypeDefaults);
|
|
1217
1253
|
} else if (selectedTemplate === "custom" && !options.features) {
|
|
@@ -1237,7 +1273,7 @@ async function resolveOptions(options) {
|
|
|
1237
1273
|
const merged = /* @__PURE__ */ new Set([...templateFeatures, ...appTypeDefaults]);
|
|
1238
1274
|
selectedFeatures = resolveFeatureDependencies(Array.from(merged));
|
|
1239
1275
|
}
|
|
1240
|
-
const moduleConfigs = selectedAppType === "fullstack" ? options.moduleConfigs
|
|
1276
|
+
const moduleConfigs = selectedAppType === "fullstack" ? { ...buildDefaultModuleConfigs(selectedFeatures, projectName), ...options.moduleConfigs } : options.moduleConfigs ?? (useDefaults ? buildDefaultModuleConfigs(selectedFeatures, projectName) : await promptModuleConfigs(selectedFeatures, projectName));
|
|
1241
1277
|
let addExamples = options.examples;
|
|
1242
1278
|
if (addExamples === void 0 && useDefaults) {
|
|
1243
1279
|
addExamples = true;
|
|
@@ -1612,6 +1648,19 @@ function normalizeChildOutput(output) {
|
|
|
1612
1648
|
}
|
|
1613
1649
|
return "";
|
|
1614
1650
|
}
|
|
1651
|
+
function generateAiDevelopmentReadme() {
|
|
1652
|
+
return `## AI \u8F85\u52A9\u5F00\u53D1
|
|
1653
|
+
|
|
1654
|
+
\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
|
|
1655
|
+
|
|
1656
|
+
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
|
|
1657
|
+
|
|
1658
|
+
\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
|
|
1659
|
+
|
|
1660
|
+
\u5DF2\u6709 hai \u9879\u76EE\u53EF\u8FD0\u884C hai init \u8865\u9F50\u7F3A\u5931\u7684 AI \u652F\u6301\u6587\u4EF6\u4E0E\u53C2\u8003\u8D44\u6E90\uFF1B\u5DF2\u6709 AGENTS.md\u3001Skill \u548C\u81EA\u5B9A\u4E49\u89C4\u5219\u4F1A\u4FDD\u7559\uFF0C\u5347\u7EA7\u65F6\u9700\u5C06\u4E0A\u8FF0\u666E\u901A\u5F00\u53D1\u5165\u53E3\u4E0E\u89C4\u8303\u663E\u5F0F\u5408\u5E76\u5230\u65E7\u6307\u5F15\u3002
|
|
1661
|
+
|
|
1662
|
+
`;
|
|
1663
|
+
}
|
|
1615
1664
|
function generateReadme(name, appTypeLabel, pm, appType) {
|
|
1616
1665
|
const install = getInstallCommand(pm);
|
|
1617
1666
|
const isStaticImage = appType === "mobile-app";
|
|
@@ -1676,7 +1725,7 @@ docker stop ${name}
|
|
|
1676
1725
|
|
|
1677
1726
|
${runtimeNotes}
|
|
1678
1727
|
|
|
1679
|
-
## \u6587\u6863
|
|
1728
|
+
${generateAiDevelopmentReadme()}## \u6587\u6863
|
|
1680
1729
|
|
|
1681
1730
|
- [hai Agent Framework](https://github.com/hai-series/hai-framework)
|
|
1682
1731
|
- [Svelte 5](https://svelte.dev/)
|
|
@@ -1760,7 +1809,7 @@ docker stop ${name}
|
|
|
1760
1809
|
- \u5728 \`${name}-service\` \u4E2D\u6269\u5C55 procedures\u3001\u6A21\u5757\u521D\u59CB\u5316\u4E0E\u914D\u7F6E\u3002
|
|
1761
1810
|
- \u9700\u8981 IAM / storage / ai \u65F6\uFF0C\u4F18\u5148\u590D\u7528 \`@h-ai/api-contract\` \u4E0E \`@h-ai/serv/features/*\`\u3002
|
|
1762
1811
|
|
|
1763
|
-
## \u6587\u6863
|
|
1812
|
+
${generateAiDevelopmentReadme()}## \u6587\u6863
|
|
1764
1813
|
|
|
1765
1814
|
- [hai Agent Framework](https://github.com/hai-series/hai-framework)
|
|
1766
1815
|
- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)
|
|
@@ -1800,6 +1849,18 @@ curl --fail http://127.0.0.1:8080/runtime-config.js
|
|
|
1800
1849
|
|
|
1801
1850
|
\u5DF2\u542F\u7528\u524D\u7AEF\uFF1A${enabledFrontends || "Web / App / Desktop"}
|
|
1802
1851
|
|
|
1852
|
+
## \u9ED8\u8BA4\u7BA1\u7406\u529F\u80FD
|
|
1853
|
+
|
|
1854
|
+
\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
|
|
1855
|
+
|
|
1856
|
+
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
|
|
1857
|
+
|
|
1858
|
+
\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
|
|
1859
|
+
|
|
1860
|
+
\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
|
|
1861
|
+
|
|
1862
|
+
\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
|
|
1863
|
+
|
|
1803
1864
|
## \u5F00\u53D1\u3001\u7F16\u8BD1\u4E0E\u6253\u5305
|
|
1804
1865
|
|
|
1805
1866
|
\`\`\`bash
|
|
@@ -1849,8 +1910,6 @@ ${webRunCommand}
|
|
|
1849
1910
|
\`\`\`bash
|
|
1850
1911
|
curl --fail http://127.0.0.1:3000/health
|
|
1851
1912
|
curl --fail http://127.0.0.1:3000/ready
|
|
1852
|
-
curl --fail --request POST http://127.0.0.1:3000/api/v1/app/info \\
|
|
1853
|
-
--header "Content-Type: application/json" --data '{}'
|
|
1854
1913
|
${webTestCommands}docker stop ${containerNames}
|
|
1855
1914
|
\`\`\`
|
|
1856
1915
|
|
|
@@ -1892,11 +1951,12 @@ ${frontends.includes("web") ? `- Web \u4F7F\u7528\u72EC\u7ACB\u9759\u6001\u955C\
|
|
|
1892
1951
|
\`\`\`bash
|
|
1893
1952
|
${pm} typecheck
|
|
1894
1953
|
${pm} lint
|
|
1954
|
+
${pm} build
|
|
1895
1955
|
${pm} test
|
|
1896
1956
|
${pm} test:e2e
|
|
1897
1957
|
\`\`\`
|
|
1898
1958
|
|
|
1899
|
-
## \u6587\u6863
|
|
1959
|
+
${generateAiDevelopmentReadme()}## \u6587\u6863
|
|
1900
1960
|
|
|
1901
1961
|
- [hai Agent Framework](https://github.com/hai-series/hai-framework)
|
|
1902
1962
|
- [@h-ai/serv](./.agents/skills/hai-serv/SKILL.md)
|
|
@@ -1919,6 +1979,8 @@ function printCompletionMessage(options) {
|
|
|
1919
1979
|
}
|
|
1920
1980
|
core.logger.info("\u4E0B\u4E00\u6B65\uFF1A");
|
|
1921
1981
|
core.logger.info(chalk.cyan(` cd ${options.name}`));
|
|
1982
|
+
if (options.appType === "fullstack")
|
|
1983
|
+
core.logger.info(chalk.cyan(cliM("cli_adminPasswordSaved")));
|
|
1922
1984
|
if (!options.install) {
|
|
1923
1985
|
core.logger.info(chalk.cyan(` ${getInstallCommand(options.packageManager)}`));
|
|
1924
1986
|
}
|
|
@@ -2012,7 +2074,7 @@ async function addModule(options) {
|
|
|
2012
2074
|
core.logger.info(`\u53EF\u7528\u6A21\u5757: ${Object.keys(MODULE_MAP).join(", ")}`);
|
|
2013
2075
|
return;
|
|
2014
2076
|
}
|
|
2015
|
-
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-
|
|
2077
|
+
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-45CK4RQ2.js');
|
|
2016
2078
|
if (moduleDef.packages.every((p) => project.haiPackages.includes(p))) {
|
|
2017
2079
|
const generatedFiles2 = await generateProjectAiSupport(
|
|
2018
2080
|
cwd,
|
|
@@ -2118,69 +2180,6 @@ async function addModule(options) {
|
|
|
2118
2180
|
throw error;
|
|
2119
2181
|
}
|
|
2120
2182
|
}
|
|
2121
|
-
|
|
2122
|
-
// messages/en-US.json
|
|
2123
|
-
var en_US_default = {
|
|
2124
|
-
cli_invalidGenerateName: "Use a name starting with a letter, with only letters, digits, hyphens or underscores",
|
|
2125
|
-
cli_generateOutsideWorkspace: "Generated files must remain inside the workspace, including symbolic link targets",
|
|
2126
|
-
cli_generateExists: "File already exists: {path}. Use --force to overwrite it",
|
|
2127
|
-
cli_deploy_module_missing: "Deploy module not found. Install @h-ai/deploy first:",
|
|
2128
|
-
cli_deploy_load_credentials: "Loading credentials...",
|
|
2129
|
-
cli_deploy_credentials_failed: "Failed to load credentials: {message}",
|
|
2130
|
-
cli_deploy_credentials_loaded: "Loaded {count} credentials",
|
|
2131
|
-
cli_deploy_load_config: "Loading deploy config...",
|
|
2132
|
-
cli_deploy_config_missing: "Deploy config not found: {path}",
|
|
2133
|
-
cli_deploy_config_hint: "Run: hai add deploy to generate config template",
|
|
2134
|
-
cli_deploy_config_loaded: "Deploy config loaded",
|
|
2135
|
-
cli_deploy_scanning: "Scanning application...",
|
|
2136
|
-
cli_deploy_scan_failed: "Scan failed: {message}",
|
|
2137
|
-
cli_deploy_scanned: "Scanned: {name} (SvelteKit: {sveltekit}, Services: {services})",
|
|
2138
|
-
cli_deploy_none: "none",
|
|
2139
|
-
cli_deploy_initializing: "Initializing deploy module...",
|
|
2140
|
-
cli_deploy_init_failed: "Init failed: {message}",
|
|
2141
|
-
cli_deploy_initialized: "Deploy module initialized",
|
|
2142
|
-
cli_deploy_deploying: "Deploying application...",
|
|
2143
|
-
cli_deploy_failed: "Deploy failed: {message}",
|
|
2144
|
-
cli_deploy_success: "Deployment successful!",
|
|
2145
|
-
cli_deploy_url: " URL: {url}",
|
|
2146
|
-
cli_deploy_id: " ID: {id}",
|
|
2147
|
-
cli_deploy_env: " Env: {names}",
|
|
2148
|
-
cli_deploy_command_failed: "Deploy command failed"
|
|
2149
|
-
};
|
|
2150
|
-
|
|
2151
|
-
// messages/zh-CN.json
|
|
2152
|
-
var zh_CN_default = {
|
|
2153
|
-
cli_invalidGenerateName: "\u540D\u79F0\u5FC5\u987B\u4EE5\u5B57\u6BCD\u5F00\u5934\uFF0C\u4E14\u4EC5\u5305\u542B\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u77ED\u6A2A\u7EBF\u6216\u4E0B\u5212\u7EBF",
|
|
2154
|
-
cli_generateOutsideWorkspace: "\u751F\u6210\u6587\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF0C\u7B26\u53F7\u94FE\u63A5\u76EE\u6807\u4E5F\u4E0D\u5F97\u8D8A\u754C",
|
|
2155
|
-
cli_generateExists: "\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A{path}\u3002\u4F7F\u7528 --force \u624D\u53EF\u8986\u76D6",
|
|
2156
|
-
cli_deploy_module_missing: "\u672A\u627E\u5230\u90E8\u7F72\u6A21\u5757\uFF0C\u8BF7\u5148\u5B89\u88C5 @h-ai/deploy\uFF1A",
|
|
2157
|
-
cli_deploy_load_credentials: "\u6B63\u5728\u52A0\u8F7D\u51ED\u8BC1\u2026",
|
|
2158
|
-
cli_deploy_credentials_failed: "\u52A0\u8F7D\u51ED\u8BC1\u5931\u8D25\uFF1A{message}",
|
|
2159
|
-
cli_deploy_credentials_loaded: "\u5DF2\u52A0\u8F7D {count} \u9879\u51ED\u8BC1",
|
|
2160
|
-
cli_deploy_load_config: "\u6B63\u5728\u52A0\u8F7D\u90E8\u7F72\u914D\u7F6E\u2026",
|
|
2161
|
-
cli_deploy_config_missing: "\u672A\u627E\u5230\u90E8\u7F72\u914D\u7F6E\uFF1A{path}",
|
|
2162
|
-
cli_deploy_config_hint: "\u8FD0\u884C hai add deploy \u751F\u6210\u90E8\u7F72\u914D\u7F6E\u6A21\u677F",
|
|
2163
|
-
cli_deploy_config_loaded: "\u90E8\u7F72\u914D\u7F6E\u5DF2\u52A0\u8F7D",
|
|
2164
|
-
cli_deploy_scanning: "\u6B63\u5728\u626B\u63CF\u5E94\u7528\u2026",
|
|
2165
|
-
cli_deploy_scan_failed: "\u626B\u63CF\u5931\u8D25\uFF1A{message}",
|
|
2166
|
-
cli_deploy_scanned: "\u5DF2\u626B\u63CF\uFF1A{name}\uFF08SvelteKit\uFF1A{sveltekit}\uFF0C\u670D\u52A1\uFF1A{services}\uFF09",
|
|
2167
|
-
cli_deploy_none: "\u65E0",
|
|
2168
|
-
cli_deploy_initializing: "\u6B63\u5728\u521D\u59CB\u5316\u90E8\u7F72\u6A21\u5757\u2026",
|
|
2169
|
-
cli_deploy_init_failed: "\u521D\u59CB\u5316\u5931\u8D25\uFF1A{message}",
|
|
2170
|
-
cli_deploy_initialized: "\u90E8\u7F72\u6A21\u5757\u5DF2\u521D\u59CB\u5316",
|
|
2171
|
-
cli_deploy_deploying: "\u6B63\u5728\u90E8\u7F72\u5E94\u7528\u2026",
|
|
2172
|
-
cli_deploy_failed: "\u90E8\u7F72\u5931\u8D25\uFF1A{message}",
|
|
2173
|
-
cli_deploy_success: "\u90E8\u7F72\u6210\u529F\uFF01",
|
|
2174
|
-
cli_deploy_url: " \u5730\u5740\uFF1A{url}",
|
|
2175
|
-
cli_deploy_id: " \u6807\u8BC6\uFF1A{id}",
|
|
2176
|
-
cli_deploy_env: " \u73AF\u5883\u53D8\u91CF\uFF1A{names}",
|
|
2177
|
-
cli_deploy_command_failed: "\u90E8\u7F72\u547D\u4EE4\u5931\u8D25"
|
|
2178
|
-
};
|
|
2179
|
-
|
|
2180
|
-
// src/cli-i18n.ts
|
|
2181
|
-
var cliM = core.i18n.createMessageGetter({ "en-US": en_US_default, "zh-CN": zh_CN_default });
|
|
2182
|
-
|
|
2183
|
-
// src/commands/cli-deploy.ts
|
|
2184
2183
|
async function deployCommand(options) {
|
|
2185
2184
|
const spinner = ora();
|
|
2186
2185
|
const cwd = options.cwd ?? process3.cwd();
|
|
@@ -2189,7 +2188,7 @@ async function deployCommand(options) {
|
|
|
2189
2188
|
try {
|
|
2190
2189
|
let deployModule;
|
|
2191
2190
|
try {
|
|
2192
|
-
deployModule = await import('./src-
|
|
2191
|
+
deployModule = await import('./src-DUGLX4YB.js');
|
|
2193
2192
|
} catch {
|
|
2194
2193
|
core.logger.error(chalk.red(cliM("cli_deploy_module_missing")));
|
|
2195
2194
|
core.logger.info(chalk.cyan(" pnpm add @h-ai/deploy"));
|
|
@@ -2609,6 +2608,16 @@ async function initProject(options) {
|
|
|
2609
2608
|
}
|
|
2610
2609
|
const { project, existing, missing } = result;
|
|
2611
2610
|
spinner.succeed(`\u68C0\u6D4B\u5230\u9879\u76EE: ${chalk.cyan(project.name)}`);
|
|
2611
|
+
if (project.isHaiProject) {
|
|
2612
|
+
const { generateProjectAiSupport, resolveSkillNamesForPackages } = await import('./cli-skill-templates-45CK4RQ2.js');
|
|
2613
|
+
const generatedFiles = await generateProjectAiSupport(cwd, resolveSkillNamesForPackages(project.haiPackages), {
|
|
2614
|
+
overwriteSkills: false,
|
|
2615
|
+
overwriteBridgeFiles: false
|
|
2616
|
+
});
|
|
2617
|
+
for (const generatedFile of generatedFiles) {
|
|
2618
|
+
core.logger.info(chalk.gray(` + ${generatedFile}`));
|
|
2619
|
+
}
|
|
2620
|
+
}
|
|
2612
2621
|
core.logger.info("");
|
|
2613
2622
|
core.logger.info(chalk.bold("\u9879\u76EE\u72B6\u6001:"));
|
|
2614
2623
|
core.logger.info(` \u540D\u79F0: ${chalk.cyan(project.name)}`);
|