@h-ai/cli 0.1.0-alpha.57 → 0.1.0-alpha.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.en.md +70 -21
  2. package/README.ja.md +70 -21
  3. package/README.md +70 -21
  4. package/dist/chunk-2H7UOFLK.js +0 -0
  5. package/dist/{chunk-O3ANVICQ.js → chunk-WUSFJFW5.js} +13 -7
  6. package/dist/chunk-WUSFJFW5.js.map +1 -0
  7. package/dist/{chunk-MJGUBOAV.js → chunk-WWG3U5ZD.js} +24 -42
  8. package/dist/chunk-WWG3U5ZD.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-ZYXES3NT.js → cli-skill-templates-2KDUACT6.js} +3 -3
  12. package/dist/{cli-skill-templates-ZYXES3NT.js.map → cli-skill-templates-2KDUACT6.js.map} +1 -1
  13. package/dist/index.js +192 -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 +19 -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/.npmrc.hbs +1 -2
  23. package/templates/apps/api/Dockerfile.hbs +6 -5
  24. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +1 -1
  25. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +2 -0
  26. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  27. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +8 -0
  28. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -1
  29. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +7 -8
  30. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +4 -3
  31. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +0 -1
  32. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +4 -0
  33. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +3 -1
  34. package/templates/apps/api/e2e/api-service.spec.ts.hbs +3 -1
  35. package/templates/apps/api/package.json.hbs +2 -2
  36. package/templates/apps/api/pnpm-workspace.yaml.hbs +26 -0
  37. package/templates/apps/api/tsconfig.base.json +0 -1
  38. package/templates/apps/fullstack/.dockerignore.hbs +3 -0
  39. package/templates/apps/fullstack/.npmrc.hbs +1 -2
  40. package/templates/apps/fullstack/Dockerfile.hbs +6 -5
  41. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +2 -2
  42. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +1 -1
  43. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +7 -2
  44. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +1 -34
  45. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +1 -34
  46. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +2 -2
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +30 -170
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +1 -1
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +6 -5
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +1 -1
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +48 -22
  52. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +3 -1
  53. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +6 -1
  54. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +1 -28
  55. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +1 -28
  56. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +5 -4
  57. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +10 -141
  58. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +5 -5
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +3 -3
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +21 -2
  61. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +2 -2
  62. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +6 -1
  63. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +1 -28
  64. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +1 -28
  65. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +2 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +5 -143
  67. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +1 -1
  68. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +1 -1
  69. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +48 -22
  70. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +206 -16
  71. package/templates/apps/fullstack/package.json.hbs +2 -2
  72. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +2 -0
  73. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +1 -1
  74. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +66 -0
  75. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +96 -0
  76. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +3 -0
  77. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +3 -1
  78. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +5 -0
  79. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +3 -0
  80. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +1 -1
  81. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +13 -3
  82. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +3 -0
  83. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +2 -0
  84. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +10 -3
  85. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +3 -0
  86. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +21 -0
  87. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +10 -3
  88. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +3 -0
  89. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -3
  90. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +63 -28
  91. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +26 -11
  92. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +276 -0
  93. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +29 -0
  94. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +94 -0
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -0
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +5 -1
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +98 -0
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +446 -33
  99. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +48 -0
  100. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +1 -1
  101. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +19 -26
  102. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +78 -15
  103. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +78 -15
  104. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +4 -1
  105. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +3 -4
  106. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +53 -27
  107. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +73 -0
  108. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +55 -45
  109. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AuditManagement.svelte.hbs +61 -0
  110. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ProfileSettings.svelte.hbs +57 -0
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/RoleManagement.svelte.hbs +49 -0
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/UserManagement.svelte.hbs +174 -0
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +399 -0
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +7 -39
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
  116. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +151 -0
  117. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +101 -0
  118. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
  119. package/templates/apps/fullstack/playwright.config.ts.hbs +6 -0
  120. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +24 -0
  121. package/templates/apps/fullstack/tsconfig.base.json +0 -1
  122. package/templates/apps/h5/src/routes/+layout.svelte.hbs +4 -0
  123. package/templates/apps/h5/src/routes/+page.svelte.hbs +3 -2
  124. package/templates/apps/mobile-app/index.html.hbs +2 -2
  125. package/templates/apps/mobile-app/src/App.svelte.hbs +6 -2
  126. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +13 -0
  127. package/templates/apps/website/src/routes/+layout.svelte.hbs +8 -2
  128. package/templates/apps/website/src/routes/+page.svelte.hbs +4 -3
  129. package/templates/base/.npmrc.hbs +1 -15
  130. package/templates/base/Dockerfile.hbs +9 -8
  131. package/templates/base/e2e/app.spec.ts.hbs +1 -0
  132. package/templates/base/package.json.hbs +39 -42
  133. package/templates/base/pnpm-workspace.yaml.hbs +26 -0
  134. package/templates/base/src/app.d.ts.hbs +4 -0
  135. package/templates/base/src/hooks.server.ts.hbs +0 -8
  136. package/templates/base/src/lib/server/init.ts.hbs +26 -5
  137. package/templates/base/src/routes/+layout.server.ts.hbs +18 -0
  138. package/templates/base/tests/scaffold.test.ts.hbs +21 -1
  139. package/templates/base/vite.config.ts.hbs +21 -0
  140. package/templates/features/ai/routes/api/chat/+server.ts +6 -7
  141. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +1 -1
  142. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +1 -1
  143. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +14 -10
  144. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +6 -4
  145. package/templates/features/storage/routes/api/upload/+server.ts +10 -8
  146. package/templates/skills/CLAUDE.md +0 -14
  147. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +13 -2
  148. package/templates/skills/bridges/fullstack/copilot-instructions.md.hbs +3 -0
  149. package/templates/skills/hai-api-client/SKILL.md +1 -1
  150. package/templates/skills/hai-app-create/SKILL.md +2 -0
  151. package/templates/skills/hai-app-create/development.md +21 -0
  152. package/templates/skills/hai-build/reference.md +4 -2
  153. package/templates/skills/hai-core/SKILL.md +2 -0
  154. package/templates/skills/hai-core/reference.md +6 -4
  155. package/templates/skills/hai-deploy/SKILL.md +2 -0
  156. package/templates/skills/hai-framework-sync/SKILL.md +5 -2
  157. package/templates/skills/hai-serv/SKILL.md +1 -0
  158. package/templates/skills/hai-serv/reference.md +3 -1
  159. package/templates/skills/hai-ui/SKILL.md +6 -0
  160. package/templates/skills/hai-ui/reference.md +7 -4
  161. package/templates/skills/hai-vecdb/reference.md +53 -49
  162. package/dist/chunk-MJGUBOAV.js.map +0 -1
  163. package/dist/chunk-O3ANVICQ.js.map +0 -1
  164. package/dist/cli-config-templates-OWBEGBZQ.js +0 -5
  165. package/dist/src-TBIET7YU.js.map +0 -1
  166. package/templates/apps/fullstack/apps/{{projectName}}-app/tests/api.test.ts.hbs +0 -28
  167. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tests/api.test.ts.hbs +0 -28
  168. package/templates/apps/fullstack/apps/{{projectName}}-web/tests/api.test.ts.hbs +0 -55
  169. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/LanguageSwitcher.svelte.hbs +0 -27
  170. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +0 -18
  171. package/templates/skills/bridges/admin/CLAUDE.md +0 -15
  172. package/templates/skills/bridges/api/CLAUDE.md +0 -15
  173. package/templates/skills/bridges/fullstack/CLAUDE.md.hbs +0 -9
  174. package/templates/skills/bridges/h5/CLAUDE.md +0 -15
  175. package/templates/skills/bridges/mobile-app/CLAUDE.md +0 -15
  176. package/templates/skills/bridges/website/CLAUDE.md +0 -15
  177. package/templates/skills/claude-skill.md.hbs +0 -7
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.57",
4
+ "version": "0.1.0-alpha.59",
5
5
  "description": "Hai Framework CLI for project scaffolding and code generation.",
6
6
  "license": "Apache-2.0",
7
7
  "keywords": [
@@ -27,36 +27,38 @@
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.59",
34
+ "cac": "^7.0.1",
35
+ "chalk": "^6.0.1",
36
+ "fast-wrap-ansi": "^0.2.2",
37
+ "fs-extra": "^11.4.1",
38
+ "handlebars": "^4.7.10",
39
+ "ora": "^9.4.1",
38
40
  "prompts": "^2.4.2",
39
- "yaml": "^2.7.0",
40
- "@h-ai/core": "0.1.0-alpha.57"
41
+ "yaml": "^2.9.1"
41
42
  },
42
43
  "devDependencies": {
44
+ "@h-ai/cache": "0.1.0-alpha.59",
45
+ "@h-ai/deploy": "0.1.0-alpha.59",
46
+ "@h-ai/reach": "0.1.0-alpha.59",
47
+ "@h-ai/reldb": "0.1.0-alpha.59",
48
+ "@h-ai/storage": "0.1.0-alpha.59",
43
49
  "@types/fs-extra": "^11.0.4",
44
- "@types/node": "^25.9.1",
50
+ "@types/node": "^26.6.5",
45
51
  "@types/prompts": "^2.4.9",
52
+ "fast-string-width": "^3.0.2",
46
53
  "rimraf": "^6.1.3",
47
54
  "tsup": "^8.5.1",
48
55
  "typescript": "^6.0.3",
49
- "vitest": "^4.1.7",
50
- "@h-ai/cache": "0.1.0-alpha.57",
51
- "@h-ai/reldb": "0.1.0-alpha.57",
52
- "@h-ai/deploy": "0.1.0-alpha.57",
53
- "@h-ai/reach": "0.1.0-alpha.57",
54
- "@h-ai/storage": "0.1.0-alpha.57"
56
+ "vitest": "^4.1.11"
55
57
  },
56
58
  "scripts": {
57
59
  "build": "tsup",
58
60
  "dev": "tsup --watch",
59
- "typecheck": "tsc --noEmit",
61
+ "typecheck": "node ../../scripts/typecheck.mjs --noEmit",
60
62
  "lint": "eslint .",
61
63
  "lint:fix": "eslint . --fix",
62
64
  "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'>
@@ -1,2 +1 @@
1
- node-linker=hoisted
2
- shamefully-hoist=true
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
  })
@@ -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,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",
@@ -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
@@ -1,2 +1 @@
1
- node-linker=hoisted
2
- shamefully-hoist=true
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 参数控制。
@@ -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}}
@@ -2,39 +2,6 @@
2
2
  {{#if fullstack.frontends.app}}
3
3
  {
4
4
  "$schema": "https://inlang.com/schema/inlang-message-format",
5
- "page_title": "{name} · App",
6
- "platform_name": "App/H5",
7
- "nav_workspace": "Workspace",
8
- "nav_status": "Status",
9
- "nav_settings": "Settings",
10
- "settings_description": "Switch theme and language here to verify shared theme and i18n state take effect instantly on mobile.",
11
- "settings_theme_description": "Theme switching reuses the shared theme store and persists the preference on the device.",
12
- "settings_language_description": "Language switching keeps the shared runtime and the app runtime in sync.",
13
- "hero_badge": "Mobile workspace",
14
- "hero_title": "{name} App Experience",
15
- "hero_subtitle": "A mobile and H5 oriented entry point. This app keeps its own messages so onboarding and campaign copy can evolve independently.",
16
- "hero_primary_action": "View service status",
17
- "hero_secondary_action": "Customize the starter",
18
- "preview_title": "Mobile-first interface",
19
- "preview_body": "Ready for H5, Capacitor or embedded WebViews",
20
- "preview_metric_shared": "Shared shell and API",
21
- "preview_metric_local": "App-owned messages",
22
- "preview_metric_theme": "Theme from config",
23
- "status_title": "Service connectivity",
24
- "status_description": "The mobile page calls the same backend API to verify cross-platform contract and shared API client wiring.",
25
- "status_online": "{name} is connected",
26
- "status_version": "Service version",
27
- "status_started": "Started at: {time}",
28
- "status_frontends": "Service frontends: {list}",
29
- "status_frontends_count": "{count} frontend targets",
30
- "custom_shared_title": "Shared owns common capabilities",
31
- "custom_shared_body": "Keep cross-platform layout, locale, theme and API access in packages/{{projectName}}-shared.",
32
- "custom_local_title": "App owns mobile copy",
33
- "custom_local_body": "Write App-specific copy in apps/{{projectName}}-app/messages so mobile UX can iterate independently.",
34
- "flow_title": "Collaboration boundary",
35
- "flow_contract": "Contract constrains requests/responses",
36
- "flow_service": "Service exposes unified APIs",
37
- "flow_shared": "Shared reuses cross-platform capabilities",
38
- "flow_frontend": "App composes the mobile experience"
5
+ "page_title": "{name}"
39
6
  }
40
7
  {{/if}}
@@ -2,39 +2,6 @@
2
2
  {{#if fullstack.frontends.app}}
3
3
  {
4
4
  "$schema": "https://inlang.com/schema/inlang-message-format",
5
- "page_title": "{name} · App",
6
- "platform_name": "App/H5",
7
- "nav_workspace": "工作台",
8
- "nav_status": "状态",
9
- "nav_settings": "设置",
10
- "settings_description": "在这里切换主题与语言,验证 shared 的主题与 i18n 在移动端即时生效。",
11
- "settings_theme_description": "主题切换复用 shared theme store,并将偏好持久化到本地设备。",
12
- "settings_language_description": "语言切换会同时同步 shared runtime 与当前 App runtime。",
13
- "hero_badge": "移动端工作台",
14
- "hero_title": "{name} App 体验",
15
- "hero_subtitle": "面向移动端与 H5 场景的轻量入口,保留本端 messages 以便独立调整文案、引导语和运营内容。",
16
- "hero_primary_action": "查看服务状态",
17
- "hero_secondary_action": "了解如何自定义",
18
- "preview_title": "移动优先界面",
19
- "preview_body": "适合 H5、Capacitor 或内嵌 WebView",
20
- "preview_metric_shared": "共享 Shell 与接口",
21
- "preview_metric_local": "App 自有 messages",
22
- "preview_metric_theme": "主题跟随配置",
23
- "status_title": "服务联通状态",
24
- "status_description": "移动端页面会调用同一套后端 API,验证跨端 contract 与 shared API client 正常工作。",
25
- "status_online": "{name} 已连接",
26
- "status_version": "服务版本",
27
- "status_started": "启动时间:{time}",
28
- "status_frontends": "服务声明的前端:{list}",
29
- "status_frontends_count": "{count} 个前端目标",
30
- "custom_shared_title": "共享层放通用能力",
31
- "custom_shared_body": "跨端一致的布局、语言、主题和 API 访问都放在 packages/{{projectName}}-shared。",
32
- "custom_local_title": "App 层放移动文案",
33
- "custom_local_body": "App 独有文案写在 apps/{{projectName}}-app/messages,便于移动端独立迭代。",
34
- "flow_title": "协同边界",
35
- "flow_contract": "Contract 约束请求响应",
36
- "flow_service": "Service 提供统一 API",
37
- "flow_shared": "Shared 复用跨端能力",
38
- "flow_frontend": "App 组织移动端体验"
5
+ "page_title": "{name}"
39
6
  }
40
7
  {{/if}}
@@ -5,7 +5,7 @@
5
5
  "type": "module",
6
6
  "version": "0.1.0",
7
7
  "private": true,
8
- "engines": { "node": ">=22.12.0" },
8
+ "engines": { "node": "^22.22.2 || ^24.15.0 || >=26.0.0" },
9
9
  "scripts": {
10
10
  "paraglide:compile": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide",
11
11
  "paraglide:watch": "paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide --watch",
@@ -16,7 +16,7 @@
16
16
  "preview": "vite preview --host 127.0.0.1 --port {{fullstack.ports.app}} --strictPort",
17
17
  "typecheck": "pnpm paraglide:compile && svelte-check --tsconfig ./tsconfig.json",
18
18
  "lint": "eslint .",
19
- "test": "pnpm paraglide:compile && vitest run",
19
+ "test": "pnpm paraglide:compile && vitest run --passWithNoTests",
20
20
  "test:watch": "pnpm paraglide:compile && vitest",
21
21
  "clean": "rimraf dist build android ios .turbo src/lib/paraglide",
22
22
  "cap:add:android": "cap add android",