@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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h-ai/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.0-alpha.
|
|
4
|
+
"version": "0.1.0-alpha.58",
|
|
5
5
|
"description": "Hai Framework CLI for project scaffolding and code generation.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"keywords": [
|
|
@@ -27,36 +27,36 @@
|
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
29
|
"engines": {
|
|
30
|
-
"node": "
|
|
30
|
+
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
33
|
+
"@h-ai/core": "0.1.0-alpha.58",
|
|
34
|
+
"cac": "^7.0.1",
|
|
35
|
+
"chalk": "^6.0.1",
|
|
36
|
+
"fs-extra": "^11.4.1",
|
|
37
|
+
"handlebars": "^4.7.10",
|
|
38
|
+
"ora": "^9.4.1",
|
|
38
39
|
"prompts": "^2.4.2",
|
|
39
|
-
"yaml": "^2.
|
|
40
|
-
"@h-ai/core": "0.1.0-alpha.56"
|
|
40
|
+
"yaml": "^2.9.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
+
"@h-ai/cache": "0.1.0-alpha.58",
|
|
44
|
+
"@h-ai/deploy": "0.1.0-alpha.58",
|
|
45
|
+
"@h-ai/reach": "0.1.0-alpha.58",
|
|
46
|
+
"@h-ai/reldb": "0.1.0-alpha.58",
|
|
47
|
+
"@h-ai/storage": "0.1.0-alpha.58",
|
|
43
48
|
"@types/fs-extra": "^11.0.4",
|
|
44
|
-
"@types/node": "^
|
|
49
|
+
"@types/node": "^26.6.5",
|
|
45
50
|
"@types/prompts": "^2.4.9",
|
|
46
51
|
"rimraf": "^6.1.3",
|
|
47
52
|
"tsup": "^8.5.1",
|
|
48
53
|
"typescript": "^6.0.3",
|
|
49
|
-
"vitest": "^4.1.
|
|
50
|
-
"@h-ai/cache": "0.1.0-alpha.56",
|
|
51
|
-
"@h-ai/deploy": "0.1.0-alpha.56",
|
|
52
|
-
"@h-ai/reach": "0.1.0-alpha.56",
|
|
53
|
-
"@h-ai/reldb": "0.1.0-alpha.56",
|
|
54
|
-
"@h-ai/storage": "0.1.0-alpha.56"
|
|
54
|
+
"vitest": "^4.1.11"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"build": "tsup",
|
|
58
58
|
"dev": "tsup --watch",
|
|
59
|
-
"typecheck": "
|
|
59
|
+
"typecheck": "node ../../scripts/typecheck.mjs --noEmit",
|
|
60
60
|
"lint": "eslint .",
|
|
61
61
|
"lint:fix": "eslint . --fix",
|
|
62
62
|
"test": "vitest run",
|
package/templates/README.md
CHANGED
|
@@ -57,7 +57,7 @@ templates/
|
|
|
57
57
|
│ └── settings.json # Paraglide 项目配置
|
|
58
58
|
│
|
|
59
59
|
└── skills/ # AI Skill 与各 appType 桥接指引
|
|
60
|
-
└── bridges/ # admin / api / website / h5 / mobile-app / fullstack 专属 AGENTS/Copilot
|
|
60
|
+
└── bridges/ # admin / api / website / h5 / mobile-app / fullstack 专属 AGENTS/Copilot
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
## AI Skill 模板(Single Source of Truth)
|
|
@@ -66,12 +66,12 @@ templates/
|
|
|
66
66
|
|
|
67
67
|
- `hai create` 会把 `templates/skills/` 下所有 `hai-*` Skill 目录复制到 `.agents/skills/<skill>/`,再按 appType 排除互斥项(例如 fullstack 不复制 `hai-kit`;admin / website / h5 不复制 `hai-serv`、`hai-api-contract`、`hai-api-client`、`hai-capacitor`;mobile-app 不复制 `hai-core`、`hai-kit`、`hai-serv`、`hai-api-contract`)
|
|
68
68
|
- `bridges/<appType>/copilot-instructions.md` 会复制到 `.github/copilot-instructions.md`;没有专属文件时回退到通用桥接文件
|
|
69
|
-
- `bridges/<appType>/AGENTS.md
|
|
69
|
+
- `bridges/<appType>/AGENTS.md` 会复制到项目根目录,确保不同样板工程使用自己的 AI 指引;通用 `CLAUDE.md` 仅包含 `@AGENTS.md`
|
|
70
70
|
- `opencode.json` 会复制到项目根目录
|
|
71
71
|
- `templates/skills/AGENTS.md`、`CLAUDE.md`、`copilot-instructions.md` 与 `opencode.json` 不是多余副本:它们是 generic fallback,主要服务于缺少 appType 上下文时的桥接复制与 `hai add` 回填 AI 支持
|
|
72
72
|
- `opencode.json` 使用 OpenCode 的 `instructions` 配置复用 `.github/copilot-instructions.md`;`.agents/skills/` 由 OpenCode 原生发现,不再写入过期的 `skills.paths`
|
|
73
|
-
- `CLAUDE.md`
|
|
74
|
-
- `hai add` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/`
|
|
73
|
+
- `CLAUDE.md` 通过 `@AGENTS.md` 复用共享规范,Claude Code 按其中的任务导航读取 `.agents/skills/` 正文与参考。CLI 不生成 `.claude/` 技能副本;此模式不提供 Claude 原生技能自动发现或 `/skill` 命令。依据:[Claude Code 项目指引](https://code.claude.com/docs/en/memory)、[原生 skills](https://code.claude.com/docs/en/skills)
|
|
74
|
+
- `hai add` / `hai init` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/` 或 `.claude/`
|
|
75
75
|
|
|
76
76
|
## 文件类型说明
|
|
77
77
|
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
import type { Snippet } from 'svelte'
|
|
7
7
|
{{#if hasI18n}}
|
|
8
8
|
import { browser } from '$app/environment'
|
|
9
|
+
{{/if}}
|
|
10
|
+
import { page } from '$app/state'
|
|
11
|
+
{{#if hasI18n}}
|
|
9
12
|
import { getLocale } from '$lib/paraglide/runtime.js'
|
|
10
13
|
import { setGlobalLocale } from '@h-ai/ui'
|
|
11
14
|
{{/if}}
|
|
@@ -25,6 +28,10 @@
|
|
|
25
28
|
{{/if}}
|
|
26
29
|
</script>
|
|
27
30
|
|
|
31
|
+
<svelte:head>
|
|
32
|
+
<title>{page.data.appConfig.name}</title>
|
|
33
|
+
</svelte:head>
|
|
34
|
+
|
|
28
35
|
<div class='min-h-screen bg-base-200'>
|
|
29
36
|
{@render children()}
|
|
30
37
|
</div>
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* 管理后台首页 — 入口导航
|
|
5
5
|
*/
|
|
6
6
|
import { resolve } from '$app/paths'
|
|
7
|
+
import { page } from '$app/state'
|
|
7
8
|
{{#if hasI18n}}
|
|
8
9
|
import * as m from '$lib/paraglide/messages'
|
|
9
10
|
{{/if}}
|
|
@@ -12,9 +13,9 @@
|
|
|
12
13
|
|
|
13
14
|
<svelte:head>
|
|
14
15
|
{{#if hasI18n}}
|
|
15
|
-
<title>{
|
|
16
|
+
<title>{page.data.appConfig.name}</title>
|
|
16
17
|
{{else}}
|
|
17
|
-
<title
|
|
18
|
+
<title>{page.data.appConfig.name}</title>
|
|
18
19
|
{{/if}}
|
|
19
20
|
</svelte:head>
|
|
20
21
|
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
{m.page_home_badge()}
|
|
28
29
|
</Badge>
|
|
29
30
|
</div>
|
|
30
|
-
<h1 class='mt-4 text-4xl font-black tracking-tight'>{
|
|
31
|
+
<h1 class='mt-4 text-4xl font-black tracking-tight'>{page.data.appConfig.name}</h1>
|
|
31
32
|
<p class='mt-3 text-base-content/60'>{m.page_home_subtitle()}</p>
|
|
32
33
|
<div class='mt-8 flex flex-wrap gap-3 justify-center'>
|
|
33
34
|
<a href={resolve('/admin', {})} class='btn btn-primary'>
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
由 hai 驱动
|
|
43
44
|
</Badge>
|
|
44
45
|
</div>
|
|
45
|
-
<h1 class='mt-4 text-4xl font-black tracking-tight'
|
|
46
|
+
<h1 class='mt-4 text-4xl font-black tracking-tight'>{page.data.appConfig.name}</h1>
|
|
46
47
|
<p class='mt-3 text-base-content/60'>基于 hai Agent Framework 构建</p>
|
|
47
48
|
<div class='mt-8 flex flex-wrap gap-3 justify-center'>
|
|
48
49
|
<a href={resolve('/admin', {})} class='btn btn-primary'>
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
<div class='flex items-center gap-2 px-2 mb-6 text-xl font-bold'>
|
|
42
42
|
<span class='icon-[tabler--cube] size-6 text-primary'></span>
|
|
43
43
|
{{#if hasI18n}}
|
|
44
|
-
{
|
|
44
|
+
{page.data.appConfig.name}
|
|
45
45
|
{{else}}
|
|
46
|
-
|
|
46
|
+
{page.data.appConfig.name}
|
|
47
47
|
{{/if}}
|
|
48
48
|
</div>
|
|
49
49
|
<ul class='gap-1'>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 注册表与认证可配置在此;pnpm 专属设置统一位于 pnpm-workspace.yaml。
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
# syntax=docker/dockerfile:1.7
|
|
2
|
-
FROM node:
|
|
2
|
+
FROM node:24-bookworm-slim AS build
|
|
3
3
|
|
|
4
4
|
ENV PNPM_HOME=/pnpm
|
|
5
5
|
ENV PATH=$PNPM_HOME:$PATH
|
|
6
6
|
ENV CI=true
|
|
7
7
|
WORKDIR /workspace
|
|
8
8
|
|
|
9
|
-
RUN corepack enable && corepack prepare pnpm@
|
|
9
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate
|
|
10
10
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
11
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
11
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
12
12
|
COPY . .
|
|
13
13
|
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
14
14
|
RUN pnpm build
|
|
15
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm --filter {{api.servicePackageName}} --prod
|
|
15
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm pm deploy --filter {{api.servicePackageName}} --prod /prod/app
|
|
16
16
|
|
|
17
|
-
FROM node:
|
|
17
|
+
FROM node:24-bookworm-slim AS runtime-base
|
|
18
18
|
|
|
19
19
|
ENV NODE_ENV=production
|
|
20
|
+
ENV HAI_CORE_ENV=production
|
|
20
21
|
ENV HOST=0.0.0.0
|
|
21
22
|
ENV PORT=3000
|
|
22
23
|
WORKDIR /app
|
|
@@ -4,6 +4,8 @@ import { z } from 'zod'
|
|
|
4
4
|
export const AppInfoOutputDataSchema = z.object({
|
|
5
5
|
name: z.string(),
|
|
6
6
|
version: z.string(),
|
|
7
|
+
env: z.enum(['development', 'production', 'test', 'staging']),
|
|
8
|
+
defaultLocale: z.string(),
|
|
7
9
|
uptimeMs: z.number().int().nonnegative(),
|
|
8
10
|
transportEnabled: z.boolean(),
|
|
9
11
|
})
|
|
@@ -7,6 +7,14 @@ version: 0.1.0
|
|
|
7
7
|
env: ${HAI_ENV:development}
|
|
8
8
|
debug: ${HAI_DEBUG:false}
|
|
9
9
|
|
|
10
|
+
logging:
|
|
11
|
+
level: info
|
|
12
|
+
format: json
|
|
13
|
+
redact:
|
|
14
|
+
- password
|
|
15
|
+
- token
|
|
16
|
+
- secret
|
|
17
|
+
|
|
10
18
|
defaultLocale: {{defaultLocale}}
|
|
11
19
|
supportedLocales:
|
|
12
20
|
{{#if_eq defaultLocale 'en-US'}} - en-US
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
1
2
|
import type { ServConfig } from '@h-ai/serv'
|
|
2
3
|
import { core } from '@h-ai/core'
|
|
3
4
|
{{#if features.crypto}}import { crypto } from '@h-ai/crypto'
|
|
4
5
|
{{/if}}{{#if features.iam}}import { iam } from '@h-ai/iam'
|
|
5
6
|
{{/if}}import { serv } from '@h-ai/serv'
|
|
6
7
|
import { {{api.contractExportName}} } from '{{api.contractPackageName}}'
|
|
7
|
-
import pkg from '../package.json' with { type: 'json' }
|
|
8
8
|
import { {{api.serviceProceduresFactoryName}} } from './server/procedures/index.js'
|
|
9
9
|
|
|
10
10
|
const startedAt = Date.now()
|
|
@@ -14,15 +14,12 @@ interface CreateApiServiceAppOptions {
|
|
|
14
14
|
refreshCookie?: 'enabled' | 'disabled'
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
interface AppCoreConfig {
|
|
18
|
-
readonly env?: string
|
|
19
|
-
}
|
|
20
17
|
/** 创建 API Service HTTP 应用。 */
|
|
21
18
|
export function {{api.serviceAppFactoryName}}(_options: CreateApiServiceAppOptions = {}) {
|
|
22
19
|
const servConfig = core.config.getOrThrow<ServConfig>('serv')
|
|
23
|
-
const coreConfig = core.config.
|
|
20
|
+
const coreConfig = core.config.getOrThrow<CoreConfig>('core')
|
|
24
21
|
const security = serv.createRuntimeSecurityPolicy({
|
|
25
|
-
environment: coreConfig
|
|
22
|
+
environment: coreConfig.env,
|
|
26
23
|
corsOrigin: servConfig.cors.origin,
|
|
27
24
|
nativeOrigins: servConfig.cors.nativeOrigins,
|
|
28
25
|
})
|
|
@@ -46,8 +43,10 @@ export function {{api.serviceAppFactoryName}}(_options: CreateApiServiceAppOptio
|
|
|
46
43
|
procedures: {{api.serviceProceduresFactoryName}}({
|
|
47
44
|
app: {
|
|
48
45
|
info: {
|
|
49
|
-
name:
|
|
50
|
-
version:
|
|
46
|
+
name: coreConfig.name,
|
|
47
|
+
version: coreConfig.version,
|
|
48
|
+
env: coreConfig.env,
|
|
49
|
+
defaultLocale: coreConfig.defaultLocale,
|
|
51
50
|
transportEnabled: transport !== undefined,
|
|
52
51
|
},
|
|
53
52
|
startedAt,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
1
2
|
import type { ServConfig } from '@h-ai/serv'
|
|
2
3
|
import process from 'node:process'
|
|
3
4
|
import { core } from '@h-ai/core'
|
|
@@ -5,10 +6,10 @@ import { serv } from '@h-ai/serv'
|
|
|
5
6
|
import { {{api.serviceAppFactoryName}} } from './app.js'
|
|
6
7
|
import { closeApp, initApp } from './lib/server/init.js'
|
|
7
8
|
|
|
8
|
-
const logger = core.logger.child({ app: '{{api.servicePackageName}}', scope: 'entrypoint' })
|
|
9
|
-
|
|
10
9
|
async function main(): Promise<void> {
|
|
11
10
|
await initApp()
|
|
11
|
+
const config = core.config.getOrThrow<CoreConfig>('core')
|
|
12
|
+
const logger = core.logger.child({ app: config.name, scope: 'entrypoint' })
|
|
12
13
|
|
|
13
14
|
// host/port 来自 config/_serv.yml 的 server(HOST/PORT 环境变量高于配置文件)。
|
|
14
15
|
const { server } = core.config.getOrThrow<ServConfig>('serv')
|
|
@@ -21,6 +22,6 @@ async function main(): Promise<void> {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
main().catch((error: unknown) => {
|
|
24
|
-
logger.error('API service failed to start', { error })
|
|
25
|
+
core.logger.error('API service failed to start', { error })
|
|
25
26
|
process.exitCode = 1
|
|
26
27
|
})
|
package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs
CHANGED
|
@@ -8,6 +8,8 @@ export interface AppProcedureDeps {
|
|
|
8
8
|
readonly info: {
|
|
9
9
|
readonly name: string
|
|
10
10
|
readonly version: string
|
|
11
|
+
readonly env: AppInfoOutputData['env']
|
|
12
|
+
readonly defaultLocale: string
|
|
11
13
|
readonly transportEnabled: boolean
|
|
12
14
|
}
|
|
13
15
|
readonly startedAt: number
|
|
@@ -22,6 +24,8 @@ export function createAppProcedures(deps: AppProcedureDeps) {
|
|
|
22
24
|
const data: AppInfoOutputData = {
|
|
23
25
|
name: deps.info.name,
|
|
24
26
|
version: deps.info.version,
|
|
27
|
+
env: deps.info.env,
|
|
28
|
+
defaultLocale: deps.info.defaultLocale,
|
|
25
29
|
transportEnabled: deps.info.transportEnabled,
|
|
26
30
|
uptimeMs: Math.max(0, Date.now() - deps.startedAt),
|
|
27
31
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CoreConfig } from '@h-ai/core'
|
|
1
2
|
import type { ServConfig } from '@h-ai/serv'
|
|
2
3
|
import type { AddressInfo } from 'node:net'
|
|
3
4
|
import { mkdtempSync, rmSync } from 'node:fs'
|
|
@@ -130,7 +131,8 @@ describe('{{api.servicePackageName}}', () => {
|
|
|
130
131
|
|
|
131
132
|
expect(result.success).toBe(true)
|
|
132
133
|
if (result.success) {
|
|
133
|
-
|
|
134
|
+
const config = core.config.getOrThrow<CoreConfig>('core')
|
|
135
|
+
expect(result.data).toMatchObject({ name: config.name, version: config.version, env: config.env, defaultLocale: config.defaultLocale })
|
|
134
136
|
expect(typeof result.data.transportEnabled).toBe('boolean')
|
|
135
137
|
}
|
|
136
138
|
})
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { expect, test } from '@playwright/test'
|
|
2
1
|
import { apiContract } from '@h-ai/api-contract'
|
|
2
|
+
import { expect, test } from '@playwright/test'
|
|
3
3
|
import { {{api.contractExportName}} } from '{{api.contractPackageName}}'
|
|
4
4
|
|
|
5
5
|
const API_PREFIX = '/api/v1'
|
|
@@ -17,6 +17,8 @@ test('service app.info endpoint returns HaiResult', async ({ request }) => {
|
|
|
17
17
|
|
|
18
18
|
expect(response.status()).toBe(200)
|
|
19
19
|
expect(body.success).toBe(true)
|
|
20
|
-
expect(body.data.name).
|
|
20
|
+
expect(body.data.name).toBe(process.env.HAI_CORE_NAME ?? '{{projectName}} API Service')
|
|
21
|
+
expect(body.data.version).toBe(process.env.HAI_CORE_VERSION ?? '0.1.0')
|
|
22
|
+
expect(body.data.env).toBe(process.env.HAI_CORE_ENV ?? 'development')
|
|
21
23
|
expect(typeof body.data.transportEnabled).toBe('boolean')
|
|
22
24
|
})
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import antfu from '@antfu/eslint-config'
|
|
1
|
+
import antfu, { GLOB_SRC } from '@antfu/eslint-config'
|
|
2
|
+
import { haiQualityConfig } from './eslint-rules.js'
|
|
2
3
|
|
|
3
4
|
export default antfu({
|
|
5
|
+
// unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
|
|
6
|
+
typescript: { files: [GLOB_SRC] },
|
|
4
7
|
formatters: true,
|
|
5
8
|
ignores: [
|
|
6
9
|
'**/dist/**',
|
|
7
10
|
'**/node_modules/**',
|
|
8
11
|
'**/.agents/**',
|
|
12
|
+
'**/.claude/**',
|
|
9
13
|
'**/.github/**',
|
|
10
14
|
'**/AGENTS.md',
|
|
11
15
|
'**/CLAUDE.md',
|
|
@@ -13,13 +17,7 @@ export default antfu({
|
|
|
13
17
|
'**/opencode.json',
|
|
14
18
|
'**/package.json',
|
|
15
19
|
],
|
|
16
|
-
}, {
|
|
17
|
-
files: ['**/*.js', '**/*.mjs', '**/*.ts'],
|
|
18
|
-
rules: {
|
|
19
|
-
'no-console': 'error',
|
|
20
|
-
'ts/no-explicit-any': 'error',
|
|
21
|
-
},
|
|
22
|
-
}, {
|
|
20
|
+
}, haiQualityConfig, {
|
|
23
21
|
files: ['**/tsconfig.json', '**/tsconfig.*.json'],
|
|
24
22
|
rules: {
|
|
25
23
|
'jsonc/sort-keys': 'off',
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"engines": { "node": "
|
|
2
|
+
"engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
|
|
3
3
|
"name": "{{projectName}}",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"version": "0.1.0",
|
|
6
6
|
"private": true,
|
|
7
|
-
"packageManager": "pnpm@
|
|
7
|
+
"packageManager": "pnpm@12.11.2",
|
|
8
8
|
"description": "Typed hai API workspace with separated contract and service packages.",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"dev": "pnpm --filter {{api.servicePackageName}} dev",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"podman:build": "podman build --format docker --jobs=1 --target runtime -t {{projectName}}:latest .",
|
|
16
16
|
"podman:build:data": "podman build --format docker --jobs=1 --target runtime-with-data --build-context embedded-data=./apps/{{projectName}}-service/data -t {{projectName}}:latest .",
|
|
17
17
|
"typecheck": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present typecheck",
|
|
18
|
-
"lint": "pnpm -r --if-present lint",
|
|
18
|
+
"lint": "eslint *.js *.ts e2e && pnpm -r --if-present lint",
|
|
19
19
|
"test": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present test",
|
|
20
20
|
"test:e2e": "pnpm build && playwright test",
|
|
21
21
|
"clean": "pnpm -r --if-present clean && rimraf node_modules .turbo"
|
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
shellEmulator: true
|
|
3
3
|
|
|
4
4
|
trustPolicy: no-downgrade
|
|
5
|
+
# 上游构建工具仍要求 4.x;4.0.3 tarball 已核对原 lockfile 的 SHA-512。
|
|
6
|
+
trustPolicyExclude:
|
|
7
|
+
- chokidar@4.0.3
|
|
8
|
+
|
|
9
|
+
# pnpm 12 配置;原生依赖仅运行明确列出的安装脚本。
|
|
10
|
+
nodeLinker: hoisted
|
|
11
|
+
allowBuilds:
|
|
12
|
+
cpu-features: true
|
|
13
|
+
onnxruntime-node: true
|
|
14
|
+
protobufjs: true
|
|
15
|
+
ssh2: true
|
|
16
|
+
vue-demi: true
|
|
17
|
+
better-sqlite3: true
|
|
18
|
+
esbuild: true
|
|
19
|
+
core-js: false
|
|
20
|
+
|
|
21
|
+
overrides:
|
|
22
|
+
"@ai-sdk/provider-utils@>=4.0.0 <4.0.33": 4.0.57
|
|
23
|
+
cookie@<0.7.0: 0.7.2
|
|
24
|
+
esbuild@<0.28.1: 0.28.2
|
|
25
|
+
katex@<0.18.2: 0.18.10
|
|
26
|
+
sharp@<0.35.5: 0.35.5
|
|
27
|
+
tinypool@<2.1.2: 2.2.0
|
|
28
|
+
'@qdrant/js-client-rest>undici': 7.30.0
|
|
29
|
+
xcode>uuid: 11.1.1
|
|
30
|
+
"@types/node": "{{versions.nodeTypes}}"
|
|
5
31
|
|
|
6
32
|
packages:
|
|
7
33
|
- apps/*
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
node_modules
|
|
2
|
+
.turbo
|
|
3
|
+
dist
|
|
4
|
+
build
|
|
5
|
+
**/src/lib/paraglide
|
|
6
|
+
playwright-report
|
|
7
|
+
test-results
|
|
8
|
+
.env
|
|
9
|
+
.env.*
|
|
10
|
+
!.env.example
|
|
11
|
+
!.env.example.hbs
|
|
12
|
+
**/src-tauri/gen/
|
|
13
|
+
**/src-tauri/target/
|
|
14
|
+
|
|
15
|
+
# hai deploy 产物(compose / .env.runtime / 镜像 tar / sidecar 凭据)
|
|
16
|
+
.hai/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 注册表与认证可配置在此;pnpm 专属设置统一位于 pnpm-workspace.yaml。
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
# syntax=docker/dockerfile:1.7
|
|
2
|
-
FROM node:
|
|
2
|
+
FROM node:24-bookworm-slim AS build
|
|
3
3
|
|
|
4
4
|
ENV PNPM_HOME=/pnpm
|
|
5
5
|
ENV PATH=$PNPM_HOME:$PATH
|
|
6
6
|
ENV CI=true
|
|
7
7
|
WORKDIR /workspace
|
|
8
8
|
|
|
9
|
-
RUN corepack enable && corepack prepare pnpm@
|
|
9
|
+
RUN corepack enable && corepack prepare pnpm@12.11.2 --activate
|
|
10
10
|
COPY pnpm-lock.yaml pnpm-workspace.yaml ./
|
|
11
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
11
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch
|
|
12
12
|
COPY . .
|
|
13
13
|
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
|
|
14
14
|
RUN pnpm build
|
|
15
15
|
|
|
16
16
|
FROM build AS service-build
|
|
17
17
|
|
|
18
|
-
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm --filter {{fullstack.servPackageName}} --prod
|
|
18
|
+
RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm pm deploy --filter {{fullstack.servPackageName}} --prod /prod/service
|
|
19
19
|
|
|
20
|
-
FROM node:
|
|
20
|
+
FROM node:24-bookworm-slim AS service
|
|
21
21
|
|
|
22
22
|
ENV NODE_ENV=production
|
|
23
|
+
ENV HAI_CORE_ENV=production
|
|
23
24
|
ENV HOST=0.0.0.0
|
|
24
25
|
ENV PORT=3000
|
|
25
26
|
WORKDIR /app
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
{{#if fullstack.frontends.app}}
|
|
3
3
|
# {{projectName}}-app
|
|
4
4
|
|
|
5
|
-
App/H5
|
|
5
|
+
App/H5 前端工程,复用 shared 的响应式 mini 后台,使用 Svelte 5 + Vite + Capacitor,可输出 Web 预览并同步 Android / iOS 原生工程。
|
|
6
6
|
|
|
7
7
|
## i18n 与 shared 协同
|
|
8
8
|
|
|
9
9
|
- 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
|
|
10
10
|
- 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
|
|
11
11
|
- 语言切换通过 shared runtime 与本端 `src/lib/paraglide/runtime.js` 同步。
|
|
12
|
-
-
|
|
12
|
+
- 个人设置提供头像、语言、风格与改密,管理员可打开用户、角色与审计日志页面。原生端使用 Capacitor 安全 TokenStorage;浏览器预览使用 httpOnly refresh Cookie。
|
|
13
13
|
|
|
14
14
|
自定义建议:移动端独有引导、运营位、按钮文案放在本目录 `messages/`;跨端通用组件放到 shared。
|
|
15
15
|
|
|
@@ -5,7 +5,7 @@ import process from 'node:process'
|
|
|
5
5
|
|
|
6
6
|
const config: CapacitorConfig = {
|
|
7
7
|
appId: 'com.hai.{{fullstack.nativeAppIdSegment}}.app',
|
|
8
|
-
appName:
|
|
8
|
+
appName: {{jsString fullstack.appName}},
|
|
9
9
|
webDir: 'dist',
|
|
10
10
|
server: {
|
|
11
11
|
// 仅用于 Capacitor live reload 前端页面;API 地址由前端配置或 shared client 参数控制。
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
{{! @skipIfEmpty }}
|
|
2
2
|
{{#if fullstack.frontends.app}}
|
|
3
|
-
import antfu from '@antfu/eslint-config'
|
|
3
|
+
import antfu, { GLOB_SRC } from '@antfu/eslint-config'
|
|
4
|
+
import { haiQualityConfig } from '../../eslint-rules.js'
|
|
4
5
|
|
|
5
6
|
export default antfu({
|
|
7
|
+
// unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
|
|
8
|
+
typescript: { files: [GLOB_SRC] },
|
|
6
9
|
formatters: true,
|
|
7
10
|
ignores: ['**/build/**', '**/dist/**', '**/*.d.ts', '**/project.inlang/**', '**/src/lib/paraglide/**'],
|
|
8
11
|
svelte: true,
|
|
9
|
-
}, {
|
|
10
|
-
files: ['**/*.ts', '**/*.svelte'],
|
|
11
|
-
rules: {
|
|
12
|
-
'no-console': 'error',
|
|
13
|
-
'ts/no-explicit-any': 'error',
|
|
14
|
-
},
|
|
15
|
-
}, {
|
|
12
|
+
}, haiQualityConfig, {
|
|
16
13
|
files: ['**/*.svelte'],
|
|
17
14
|
rules: {
|
|
18
15
|
'svelte/html-quotes': 'off',
|
|
@@ -6,11 +6,16 @@
|
|
|
6
6
|
<meta charset="UTF-8" />
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
8
8
|
<meta name="theme-color" content="#2563eb" />
|
|
9
|
-
<title>{{
|
|
9
|
+
<title>{{html fullstack.appName}}</title>
|
|
10
|
+
<link
|
|
11
|
+
rel="icon"
|
|
12
|
+
type="image/svg+xml"
|
|
13
|
+
href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%234438df'/%3E%3Cpath d='M10 8v16M22 8v16M10 16h12' fill='none' stroke='white' stroke-width='3'/%3E%3C/svg%3E"
|
|
14
|
+
/>
|
|
10
15
|
</head>
|
|
11
16
|
<body>
|
|
12
17
|
<div id="app"></div>
|
|
13
18
|
<script type="module" src="/src/main.ts"></script>
|
|
14
19
|
</body>
|
|
15
20
|
</html>
|
|
16
|
-
{{/if}}
|
|
21
|
+
{{/if}}
|