@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.
Files changed (208) hide show
  1. package/README.en.md +239 -0
  2. package/README.ja.md +239 -0
  3. package/README.md +51 -1
  4. package/dist/chunk-2H7UOFLK.js +0 -0
  5. package/dist/chunk-F4IBPVZ5.js +355 -0
  6. package/dist/chunk-F4IBPVZ5.js.map +1 -0
  7. package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
  8. package/dist/chunk-WUSFJFW5.js.map +1 -0
  9. package/dist/cli-config-templates-6XA7V6CC.js +5 -0
  10. package/dist/{cli-config-templates-OWBEGBZQ.js.map → cli-config-templates-6XA7V6CC.js.map} +1 -1
  11. package/dist/{cli-skill-templates-ZIWYMS4Y.js → cli-skill-templates-45CK4RQ2.js} +3 -3
  12. package/dist/{cli-skill-templates-ZIWYMS4Y.js.map → cli-skill-templates-45CK4RQ2.js.map} +1 -1
  13. package/dist/index.js +134 -125
  14. package/dist/index.js.map +1 -1
  15. package/dist/{src-TBIET7YU.js → src-DUGLX4YB.js} +7270 -2119
  16. package/dist/src-DUGLX4YB.js.map +1 -0
  17. package/package.json +17 -17
  18. package/templates/README.md +4 -4
  19. package/templates/apps/admin/src/routes/+layout.svelte.hbs +7 -0
  20. package/templates/apps/admin/src/routes/+page.svelte.hbs +5 -4
  21. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +2 -2
  22. package/templates/apps/api/.gitignore.hbs +13 -0
  23. package/templates/apps/api/.npmrc.hbs +1 -0
  24. package/templates/apps/api/Dockerfile.hbs +6 -5
  25. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
  26. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
  27. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  28. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
  29. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
  30. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
  31. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
  32. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
  33. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
  34. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
  35. package/templates/apps/api/e2e/api-service.spec.ts.hbs +4 -2
  36. package/templates/apps/api/{eslint.config.js → eslint.config.js.hbs} +6 -8
  37. package/templates/apps/api/package.json.hbs +3 -3
  38. package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
  39. package/templates/apps/api/tsconfig.base.json +0 -1
  40. package/templates/apps/fullstack/.dockerignore.hbs +3 -0
  41. package/templates/apps/fullstack/.gitignore.hbs +16 -0
  42. package/templates/apps/fullstack/.npmrc.hbs +1 -0
  43. package/templates/apps/fullstack/Dockerfile.hbs +6 -5
  44. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
  45. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
  46. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +5 -8
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
  56. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
  57. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +5 -8
  58. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
  61. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
  62. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
  63. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
  64. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
  65. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
  67. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +5 -8
  68. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
  69. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
  70. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
  71. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
  72. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
  73. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
  74. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
  75. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
  76. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +207 -17
  77. package/templates/apps/fullstack/{eslint.config.js → eslint.config.js.hbs} +6 -8
  78. package/templates/apps/fullstack/package.json.hbs +3 -3
  79. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
  80. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
  81. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
  82. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
  83. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
  84. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
  85. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
  86. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
  87. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  88. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
  89. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
  90. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
  91. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
  92. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
  93. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
  94. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
  99. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
  100. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
  101. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
  102. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
  103. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
  104. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
  105. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
  106. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
  107. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
  108. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
  109. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
  110. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
  116. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
  117. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
  118. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
  119. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
  120. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
  121. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
  122. package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
  123. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
  124. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
  125. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
  126. package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
  127. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
  128. package/templates/apps/fullstack/tsconfig.base.json +0 -1
  129. package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
  130. package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
  131. package/templates/apps/mobile-app/index.html.hbs +2 -2
  132. package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
  133. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
  134. package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
  135. package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
  136. package/templates/base/.npmrc.hbs +1 -0
  137. package/templates/base/Dockerfile.hbs +9 -8
  138. package/templates/base/e2e/app.spec.ts.hbs +1 -0
  139. package/templates/base/eslint-rules.js +45 -0
  140. package/templates/base/eslint.config.js.hbs +6 -8
  141. package/templates/base/package.json.hbs +39 -42
  142. package/templates/base/pnpm-workspace.yaml.hbs +26 -0
  143. package/templates/base/src/app.d.ts.hbs +4 -0
  144. package/templates/base/src/hooks.server.ts.hbs +0 -8
  145. package/templates/base/src/lib/server/init.ts.hbs +26 -5
  146. package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
  147. package/templates/base/tests/scaffold.test.ts.hbs +21 -1
  148. package/templates/base/vite.config.ts.hbs +21 -0
  149. package/templates/features/ai/routes/api/chat/+server.ts +6 -7
  150. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
  151. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
  152. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
  153. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
  154. package/templates/features/storage/routes/api/upload/+server.ts +10 -8
  155. package/templates/skills/AGENTS.md +9 -8
  156. package/templates/skills/CLAUDE.md +0 -10
  157. package/templates/skills/bridges/admin/AGENTS.md +8 -0
  158. package/templates/skills/bridges/admin/copilot-instructions.md +2 -0
  159. package/templates/skills/bridges/api/AGENTS.md +8 -1
  160. package/templates/skills/bridges/api/copilot-instructions.md +2 -0
  161. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +21 -4
  162. package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +5 -0
  163. package/templates/skills/bridges/h5/AGENTS.md +8 -0
  164. package/templates/skills/bridges/h5/copilot-instructions.md +2 -0
  165. package/templates/skills/bridges/mobile-app/AGENTS.md +8 -0
  166. package/templates/skills/bridges/mobile-app/copilot-instructions.md +2 -0
  167. package/templates/skills/bridges/website/AGENTS.md +8 -0
  168. package/templates/skills/bridges/website/copilot-instructions.md +2 -0
  169. package/templates/skills/copilot-instructions.md +2 -0
  170. package/templates/skills/hai-api-client/SKILL.md +2 -0
  171. package/templates/skills/hai-app-create/SKILL.md +9 -7
  172. package/templates/skills/hai-app-create/development.md +72 -0
  173. package/templates/skills/hai-app-create/reference.md +44 -32
  174. package/templates/skills/hai-app-review/SKILL.md +50 -144
  175. package/templates/skills/hai-app-tests/SKILL.md +3 -1
  176. package/templates/skills/hai-app-tests/reference.md +47 -27
  177. package/templates/skills/hai-build/SKILL.md +5 -4
  178. package/templates/skills/hai-build/reference.md +56 -34
  179. package/templates/skills/hai-ci/SKILL.md +8 -15
  180. package/templates/skills/hai-core/SKILL.md +2 -0
  181. package/templates/skills/hai-core/reference.md +6 -4
  182. package/templates/skills/hai-framework-sync/SKILL.md +8 -2
  183. package/templates/skills/hai-pr-review/SKILL.md +5 -4
  184. package/templates/skills/hai-reldb/SKILL.md +1 -0
  185. package/templates/skills/hai-reldb/reference.md +3 -0
  186. package/templates/skills/hai-scheduler/SKILL.md +3 -0
  187. package/templates/skills/hai-serv/SKILL.md +2 -0
  188. package/templates/skills/hai-serv/reference.md +18 -2
  189. package/templates/skills/hai-storage/SKILL.md +3 -1
  190. package/templates/skills/hai-ui/SKILL.md +6 -0
  191. package/templates/skills/hai-ui/reference.md +7 -4
  192. package/templates/skills/hai-vecdb/reference.md +53 -49
  193. package/dist/chunk-O3ANVICQ.js.map +0 -1
  194. package/dist/chunk-WUYLYCW2.js +0 -237
  195. package/dist/chunk-WUYLYCW2.js.map +0 -1
  196. package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
  197. package/dist/src-TBIET7YU.js.map +0 -1
  198. package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
  199. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
  200. package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
  201. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
  202. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
  203. package/templates/skills/bridges/admin/CLAUDE.md +0 -11
  204. package/templates/skills/bridges/api/CLAUDE.md +0 -11
  205. package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -5
  206. package/templates/skills/bridges/h5/CLAUDE.md +0 -11
  207. package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -11
  208. 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.56",
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": ">=22.12.0"
30
+ "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
31
31
  },
32
32
  "dependencies": {
33
- "cac": "^7.0.0",
34
- "chalk": "^5.4.1",
35
- "fs-extra": "^11.2.0",
36
- "handlebars": "^4.7.8",
37
- "ora": "^9.1.0",
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.7.0",
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": "^25.9.1",
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.7",
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": "tsc --noEmit",
59
+ "typecheck": "node ../../scripts/typecheck.mjs --noEmit",
60
60
  "lint": "eslint .",
61
61
  "lint:fix": "eslint . --fix",
62
62
  "test": "vitest run",
@@ -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/Claude
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`、`bridges/<appType>/CLAUDE.md` 会复制到项目根目录,确保不同样板工程使用自己的 AI 指引
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` 作为 Claude Code 的原生项目指引入口,并通过 `@AGENTS.md` 复用共享规范;`.agents/skills/` 仍是共享参考目录,而非 Claude Code 的原生 project skills 目录
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>{m.app_title()}</title>
16
+ <title>{page.data.appConfig.name}</title>
16
17
  {{else}}
17
- <title>管理后台</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'>{m.app_title()}</h1>
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'>管理后台</h1>
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
- {m.app_title()}
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,13 @@
1
+ node_modules
2
+ .turbo
3
+ dist
4
+ build
5
+ playwright-report
6
+ test-results
7
+ .env
8
+ .env.*
9
+ !.env.example
10
+ !.env.example.hbs
11
+
12
+ # hai deploy 产物(compose / .env.runtime / 镜像 tar / sidecar 凭据)
13
+ .hai/
@@ -0,0 +1 @@
1
+ # 注册表与认证可配置在此;pnpm 专属设置统一位于 pnpm-workspace.yaml。
@@ -1,22 +1,23 @@
1
1
  # syntax=docker/dockerfile:1.7
2
- FROM node:22-bookworm-slim AS build
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.15.0 --activate
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 --frozen-lockfile
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 deploy /prod/app
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:22-bookworm-slim AS runtime-base
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
@@ -1,5 +1,5 @@
1
1
  {
2
- "engines": { "node": ">=22.12.0" },
2
+ "engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
3
3
  "name": "{{api.contractPackageName}}",
4
4
  "type": "module",
5
5
  "version": "0.1.0",
@@ -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
  })
@@ -6,6 +6,6 @@ export default defineConfig({
6
6
  target: 'node22',
7
7
  sourcemap: true,
8
8
  clean: true,
9
- dts: true,
9
+ dts: { compilerOptions: { ignoreDeprecations: '6.0' } },
10
10
  external: ['@h-ai/api-contract', 'zod'],
11
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,5 +1,5 @@
1
1
  {
2
- "engines": { "node": ">=22.12.0" },
2
+ "engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
3
3
  "name": "{{api.servicePackageName}}",
4
4
  "type": "module",
5
5
  "version": "0.1.0",
@@ -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.get<AppCoreConfig>('core')
20
+ const coreConfig = core.config.getOrThrow<CoreConfig>('core')
24
21
  const security = serv.createRuntimeSecurityPolicy({
25
- environment: coreConfig?.env,
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: pkg.name,
50
- version: pkg.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
  })
@@ -42,7 +42,6 @@ export async function initApp(): Promise<void> {
42
42
  async function doInit(): Promise<void> {
43
43
  core.init({
44
44
  configDir: './config',
45
- logging: { level: 'info' },
46
45
  })
47
46
 
48
47
  const servValidation = core.config.validate('serv', ServConfigSchema)
@@ -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
- expect(result.data.name).toContain('{{projectName}}')
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).toContain('{{projectName}}')
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": ">=22.12.0" },
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@9.15.0",
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/*
@@ -3,7 +3,6 @@
3
3
  "target": "ES2022",
4
4
  "module": "ESNext",
5
5
  "moduleResolution": "bundler",
6
- "ignoreDeprecations": "6.0",
7
6
  "resolveJsonModule": true,
8
7
  "strict": true,
9
8
  "esModuleInterop": true,
@@ -6,6 +6,9 @@ Dockerfile
6
6
  .codex
7
7
  .opencode
8
8
  .turbo
9
+ .env
10
+ .env.*
11
+ !.env.example
9
12
  **/build
10
13
  **/dist
11
14
  **/node_modules
@@ -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:22-bookworm-slim AS build
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.15.0 --activate
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 --frozen-lockfile
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 deploy /prod/service
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:22-bookworm-slim AS service
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 前端工程,参考 `apps/mobile-app` 的移动端 UI 风格,使用 Svelte 5 + Vite + Capacitor,可输出 Web 预览并同步 Android / iOS 原生工程。
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
- - 设置 tab 默认集成 shared 的 `ThemeSwitcher` / `LanguageSwitcher`,可直接验证主题与语言同步。
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: '{{projectName}} App',
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>{{projectName}} App</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}}