@h-ai/cli 0.1.0-alpha.19 → 0.1.0-alpha.21

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 (219) hide show
  1. package/README.md +10 -7
  2. package/dist/{chunk-GSMXGUYF.js → chunk-5IGMJVV5.js} +56 -38
  3. package/dist/chunk-5IGMJVV5.js.map +1 -0
  4. package/dist/{chunk-BPO34NRL.js → chunk-CFCXOKGV.js} +27 -5
  5. package/dist/chunk-CFCXOKGV.js.map +1 -0
  6. package/dist/cli-config-templates-5J5VKWWD.js +5 -0
  7. package/dist/{cli-config-templates-JCS7T3NU.js.map → cli-config-templates-5J5VKWWD.js.map} +1 -1
  8. package/dist/cli-skill-templates-JMSV2SVW.js +5 -0
  9. package/dist/{cli-skill-templates-IMYZPQRG.js.map → cli-skill-templates-JMSV2SVW.js.map} +1 -1
  10. package/dist/index.js +627 -107
  11. package/dist/index.js.map +1 -1
  12. package/dist/{src-N4NPS7AG.js → src-QNEJJ3BV.js} +261 -103
  13. package/dist/src-QNEJJ3BV.js.map +1 -0
  14. package/package.json +3 -2
  15. package/templates/README.md +40 -29
  16. package/templates/apps/admin/messages/en-US.json +5 -0
  17. package/templates/apps/admin/messages/zh-CN.json +5 -0
  18. package/templates/apps/admin/src/routes/+layout.svelte.hbs +5 -5
  19. package/templates/apps/admin/src/routes/+page.svelte.hbs +32 -12
  20. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +37 -20
  21. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +33 -24
  22. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +16 -13
  23. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +16 -0
  24. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +38 -0
  25. package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
  26. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +33 -0
  27. package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +3 -0
  28. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +12 -0
  29. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
  30. package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
  31. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
  32. package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
  33. package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +17 -0
  34. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +19 -0
  35. package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +26 -0
  36. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +55 -0
  37. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +98 -0
  38. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +21 -0
  39. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +184 -0
  40. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +49 -0
  41. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/index.ts.hbs +18 -0
  42. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +168 -0
  43. package/templates/apps/api/apps/{{projectName}}-service/tsconfig.json.hbs +16 -0
  44. package/templates/apps/api/apps/{{projectName}}-service/tsup.config.ts.hbs +11 -0
  45. package/templates/apps/api/apps/{{projectName}}-service/vitest.config.ts.hbs +9 -0
  46. package/templates/apps/api/e2e/api-service.spec.ts.hbs +18 -0
  47. package/templates/apps/api/eslint.config.js +32 -0
  48. package/templates/apps/api/package.json.hbs +29 -0
  49. package/templates/apps/api/playwright.config.ts.hbs +58 -0
  50. package/templates/apps/api/pnpm-workspace.yaml.hbs +14 -0
  51. package/templates/apps/api/tsconfig.base.json +15 -0
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +24 -7
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +18 -0
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +1 -1
  56. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +16 -0
  57. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +6 -0
  58. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +6 -0
  59. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +51 -29
  60. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +186 -0
  61. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +2 -0
  62. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +0 -1
  63. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +18 -0
  64. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +14 -0
  65. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +1 -5
  66. package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +10 -4
  67. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +4 -3
  68. package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
  69. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +20 -6
  70. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +1 -1
  71. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +15 -0
  72. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +33 -30
  73. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +152 -0
  74. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +1 -2
  75. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +13 -0
  76. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +22 -0
  77. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
  78. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +12 -0
  79. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
  80. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
  81. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
  82. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
  83. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
  84. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +16 -0
  85. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
  86. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +41 -0
  87. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +2 -8
  88. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +9 -4
  89. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +44 -21
  90. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +15 -6
  91. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +1 -1
  92. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +15 -0
  93. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +25 -27
  94. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +153 -0
  95. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +0 -1
  96. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
  97. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +1 -5
  98. package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +10 -4
  99. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +3 -2
  100. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +2 -1
  101. package/templates/apps/fullstack/eslint.config.js +0 -1
  102. package/templates/apps/fullstack/package.json.hbs +18 -17
  103. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +3 -3
  104. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +5 -2
  105. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +14 -0
  106. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +13 -0
  107. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +2 -2
  108. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/{server-app.ts.hbs → app-server.ts.hbs} +23 -3
  109. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +4 -1
  110. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/{server-app.test.ts.hbs → app-server.test.ts.hbs} +1 -1
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +9 -8
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +1 -1
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +5 -1
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +1 -1
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +1 -1
  116. package/templates/apps/fullstack/playwright.config.ts.hbs +41 -4
  117. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +15 -0
  118. package/templates/apps/h5/messages/en-US.json +3 -0
  119. package/templates/apps/h5/messages/zh-CN.json +3 -0
  120. package/templates/apps/h5/src/routes/+layout.svelte.hbs +30 -29
  121. package/templates/apps/h5/src/routes/+page.svelte.hbs +17 -6
  122. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +17 -6
  123. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +17 -6
  124. package/templates/apps/mobile-app/.env.hbs +3 -0
  125. package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
  126. package/templates/apps/mobile-app/index.html.hbs +13 -0
  127. package/templates/apps/mobile-app/messages/en-US.json +36 -0
  128. package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
  129. package/templates/apps/mobile-app/src/App.svelte.hbs +162 -0
  130. package/templates/apps/mobile-app/src/lib/api.ts.hbs +54 -0
  131. package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +6 -7
  132. package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
  133. package/templates/apps/website/src/routes/+layout.svelte.hbs +35 -26
  134. package/templates/apps/website/src/routes/+page.svelte.hbs +28 -10
  135. package/templates/apps/website/src/routes/about/+page.svelte.hbs +11 -6
  136. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +37 -34
  137. package/templates/apps/website/src/routes/services/+page.svelte.hbs +27 -40
  138. package/templates/base/.gitignore.hbs +16 -0
  139. package/templates/base/{eslint.config.js → eslint.config.js.hbs} +4 -1
  140. package/templates/base/package.json.hbs +55 -31
  141. package/templates/base/playwright.config.ts +30 -3
  142. package/templates/base/pnpm-workspace.yaml.hbs +14 -0
  143. package/templates/base/src/app.d.ts.hbs +3 -0
  144. package/templates/base/src/app.html.hbs +7 -0
  145. package/templates/base/src/hooks.server.ts.hbs +17 -7
  146. package/templates/base/src/lib/server/init.ts.hbs +20 -12
  147. package/templates/base/static/favicon.png +0 -0
  148. package/templates/base/svelte.config.js.hbs +43 -3
  149. package/templates/base/tests/scaffold.test.ts.hbs +16 -1
  150. package/templates/base/tsconfig.json.hbs +50 -0
  151. package/templates/base/vite.config.ts.hbs +13 -3
  152. package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +5 -5
  153. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +34 -32
  154. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +46 -48
  155. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +35 -31
  156. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +41 -38
  157. package/templates/skills/AGENTS.md +60 -17
  158. package/templates/skills/CLAUDE.md +18 -6
  159. package/templates/skills/bridges/admin/AGENTS.md +66 -0
  160. package/templates/skills/bridges/admin/CLAUDE.md +19 -0
  161. package/templates/skills/bridges/admin/copilot-instructions.md +46 -0
  162. package/templates/skills/bridges/api/AGENTS.md +65 -0
  163. package/templates/skills/bridges/api/CLAUDE.md +19 -0
  164. package/templates/skills/bridges/api/copilot-instructions.md +46 -0
  165. package/templates/skills/bridges/fullstack/AGENTS.md +84 -0
  166. package/templates/skills/bridges/fullstack/CLAUDE.md +19 -0
  167. package/templates/skills/bridges/fullstack/copilot-instructions.md +54 -0
  168. package/templates/skills/bridges/h5/AGENTS.md +65 -0
  169. package/templates/skills/bridges/h5/CLAUDE.md +19 -0
  170. package/templates/skills/bridges/h5/copilot-instructions.md +44 -0
  171. package/templates/skills/bridges/mobile-app/AGENTS.md +77 -0
  172. package/templates/skills/bridges/mobile-app/CLAUDE.md +19 -0
  173. package/templates/skills/bridges/mobile-app/copilot-instructions.md +45 -0
  174. package/templates/skills/bridges/website/AGENTS.md +65 -0
  175. package/templates/skills/bridges/website/CLAUDE.md +19 -0
  176. package/templates/skills/bridges/website/copilot-instructions.md +44 -0
  177. package/templates/skills/copilot-instructions.md +29 -50
  178. package/templates/skills/hai-ai/SKILL.md +115 -648
  179. package/templates/skills/hai-ai/reference.md +197 -0
  180. package/templates/skills/hai-api-client/SKILL.md +3 -1
  181. package/templates/skills/hai-app-create/SKILL.md +2 -1
  182. package/templates/skills/hai-app-review/SKILL.md +2 -2
  183. package/templates/skills/hai-app-tests/SKILL.md +28 -3
  184. package/templates/skills/hai-capacitor/SKILL.md +14 -22
  185. package/templates/skills/hai-deploy/SKILL.md +12 -9
  186. package/templates/skills/hai-kit/SKILL.md +5 -3
  187. package/templates/skills/hai-serv/SKILL.md +2 -0
  188. package/templates/skills/hai-ui/SKILL.md +25 -11
  189. package/templates/skills/opencode.json +1 -6
  190. package/dist/chunk-BPO34NRL.js.map +0 -1
  191. package/dist/chunk-GSMXGUYF.js.map +0 -1
  192. package/dist/cli-config-templates-JCS7T3NU.js +0 -5
  193. package/dist/cli-skill-templates-IMYZPQRG.js +0 -5
  194. package/dist/src-N4NPS7AG.js.map +0 -1
  195. package/templates/apps/android-app/.env.hbs +0 -3
  196. package/templates/apps/android-app/messages/en-US.json +0 -24
  197. package/templates/apps/android-app/messages/zh-CN.json +0 -24
  198. package/templates/apps/android-app/src/lib/api.ts.hbs +0 -31
  199. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -42
  200. package/templates/apps/android-app/src/routes/+layout.ts +0 -7
  201. package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -27
  202. package/templates/apps/api/src/routes/+layout.svelte +0 -14
  203. package/templates/apps/api/src/routes/+page.svelte +0 -11
  204. package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
  205. package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
  206. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
  207. package/templates/apps/api/tests/health.test.ts.hbs +0 -26
  208. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.html.hbs +0 -14
  209. package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+layout.svelte.hbs +0 -18
  210. package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+page.svelte.hbs +0 -162
  211. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.html.hbs +0 -14
  212. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+layout.svelte.hbs +0 -18
  213. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+page.svelte.hbs +0 -162
  214. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.html.hbs +0 -14
  215. package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+layout.svelte.hbs +0 -18
  216. package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+page.svelte.hbs +0 -162
  217. package/templates/apps/fullstack/pnpm-workspace.yaml +0 -7
  218. package/templates/base/tsconfig.json +0 -20
  219. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/{theme.svelte.ts.hbs → theme-store.svelte.ts.hbs} +0 -0
@@ -1,3 +0,0 @@
1
- # {{projectName}} — 环境变量
2
- # Android 模拟器使用 10.0.2.2 访问宿主机
3
- PUBLIC_API_BASE=http://10.0.2.2:3000
@@ -1,24 +0,0 @@
1
- {
2
- "app_title": "Android App",
3
- "app_description": "Android app built with hai Agent Framework + Capacitor",
4
- "nav_home": "Home",
5
- "nav_discover": "Discover",
6
- "nav_profile": "Profile",
7
- "page_home_title": "Home",
8
- "page_home_desc": "Welcome to the Android App",
9
- "page_discover_title": "Discover",
10
- "page_discover_desc": "Explore more content.",
11
- "page_profile_title": "Profile",
12
- "page_profile_username": "Username",
13
- "page_profile_login_hint": "Tap to login",
14
- "auth_login_title": "Login",
15
- "auth_login_submit": "Login",
16
- "auth_login_loading": "Logging in...",
17
- "auth_login_failed": "Login failed",
18
- "auth_login_to_register": "No account? Register now",
19
- "auth_register_title": "Register",
20
- "auth_register_submit": "Register",
21
- "auth_register_loading": "Registering...",
22
- "auth_register_failed": "Registration failed",
23
- "auth_register_to_login": "Already have an account? Login"
24
- }
@@ -1,24 +0,0 @@
1
- {
2
- "app_title": "Android 应用",
3
- "app_description": "基于 hai Agent Framework + Capacitor 构建的 Android 应用",
4
- "nav_home": "首页",
5
- "nav_discover": "发现",
6
- "nav_profile": "我的",
7
- "page_home_title": "首页",
8
- "page_home_desc": "欢迎使用 Android 应用",
9
- "page_discover_title": "发现",
10
- "page_discover_desc": "探索更多精彩内容。",
11
- "page_profile_title": "我的",
12
- "page_profile_username": "用户名",
13
- "page_profile_login_hint": "点击登录",
14
- "auth_login_title": "登录",
15
- "auth_login_submit": "登录",
16
- "auth_login_loading": "登录中...",
17
- "auth_login_failed": "登录失败",
18
- "auth_login_to_register": "没有账号?立即注册",
19
- "auth_register_title": "注册",
20
- "auth_register_submit": "注册",
21
- "auth_register_loading": "注册中...",
22
- "auth_register_failed": "注册失败",
23
- "auth_register_to_login": "已有账号?去登录"
24
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * {{projectName}} — API 客户端初始化
3
- *
4
- * 使用 @h-ai/api-client 单例模式构建统一 HTTP 客户端,
5
- * 搭配 @h-ai/capacitor 的原生 Token 存储。
6
- */
7
- import { api } from '@h-ai/api-client'
8
- import { createCapacitorTokenStorage } from '@h-ai/capacitor'
9
-
10
- // Capacitor 静态构建后通过 Vite 的 import.meta.env 注入 PUBLIC_* 变量
11
- // 此处不使用 SvelteKit 的 $env/static/public,避免脱离 SvelteKit SSR 上下文时的类型/运行时缺失
12
- const API_BASE = (import.meta.env.PUBLIC_API_BASE as string | undefined) ?? 'http://localhost:3000'
13
-
14
- /**
15
- * 初始化 API 客户端
16
- *
17
- * 应在应用启动时调用一次。
18
- * - Token 存储使用 Capacitor 原生安全存储插件(仅原生环境启用)
19
- * - 自动附加 Bearer Token、401 自动刷新重试
20
- */
21
- export async function initApi() {
22
- return api.init({
23
- baseUrl: `${API_BASE}/api/v1`,
24
- auth: {
25
- storage: createCapacitorTokenStorage(),
26
- refreshPath: '/auth/refresh',
27
- },
28
- })
29
- }
30
-
31
- export { api }
@@ -1,42 +0,0 @@
1
- {{!-- Android App 根布局 --}}
2
- <script lang="ts">
3
- /**
4
- * Android App 根布局
5
- *
6
- * - 初始化 Capacitor 原生能力
7
- * - 使用 SafeArea 包裹确保安全区域
8
- */
9
- import type { Snippet } from 'svelte'
10
- import { onMount } from 'svelte'
11
- import '../app.css'
12
- import { initCapacitor } from '$lib/capacitor'
13
- {{#if hasI18n}}
14
- import { browser } from '$app/environment'
15
- import { setGlobalLocale } from '@h-ai/ui'
16
- import { getLocale } from '$lib/paraglide/runtime.js'
17
- import * as m from '$lib/paraglide/messages'
18
- {{/if}}
19
-
20
- interface Props {
21
- children: Snippet
22
- }
23
-
24
- let { children }: Props = $props()
25
-
26
- onMount(() => {
27
- initCapacitor()
28
- })
29
- {{#if hasI18n}}
30
-
31
- if (typeof window !== 'undefined') {
32
- const paraglideLocale = getLocale()
33
- setGlobalLocale(paraglideLocale)
34
- }
35
- {{/if}}
36
- </script>
37
-
38
- <div class="hai-safe-all min-h-screen flex flex-col bg-base-200">
39
- <main class="flex-1">
40
- {@render children()}
41
- </main>
42
- </div>
@@ -1,7 +0,0 @@
1
- /**
2
- * 全局 Layout 配置
3
- *
4
- * Capacitor 应用必须使用 SPA 模式(prerender + 禁用 SSR)。
5
- */
6
- export const prerender = true
7
- export const ssr = false
@@ -1,27 +0,0 @@
1
- {{!-- Android App 首页 --}}
2
- <script lang="ts">
3
- /**
4
- * Android App 首页
5
- */
6
- {{#if hasI18n}}
7
- import * as m from '$lib/paraglide/messages'
8
- {{/if}}
9
- </script>
10
-
11
- <svelte:head>
12
- {{#if hasI18n}}
13
- <title>{m.app_title()}</title>
14
- {{else}}
15
- <title>{{projectName}}</title>
16
- {{/if}}
17
- </svelte:head>
18
-
19
- <section class="p-4">
20
- {{#if hasI18n}}
21
- <h1 class="text-2xl font-bold mb-4">{m.page_home_title()}</h1>
22
- <p class="text-gray-600">{m.page_home_desc()}</p>
23
- {{else}}
24
- <h1 class="text-2xl font-bold mb-4">首页</h1>
25
- <p class="text-gray-600">欢迎使用 Android 应用</p>
26
- {{/if}}
27
- </section>
@@ -1,14 +0,0 @@
1
- <script lang='ts'>
2
- /**
3
- * API 服务根布局
4
- */
5
- import type { Snippet } from 'svelte'
6
-
7
- interface Props {
8
- children: Snippet
9
- }
10
-
11
- const { children }: Props = $props()
12
- </script>
13
-
14
- {@render children()}
@@ -1,11 +0,0 @@
1
- <svelte:head>
2
- <title>API Service</title>
3
- </svelte:head>
4
-
5
- <main class='min-h-screen flex items-center justify-center font-mono'>
6
- <div class='text-center'>
7
- <h1 class='text-3xl font-bold mb-4'>API Service</h1>
8
- <p class='text-gray-600 mb-4'>RESTful API Service</p>
9
- <p class='text-sm text-gray-400'>GET /api/v1/health — 健康检查</p>
10
- </div>
11
- </main>
@@ -1,14 +0,0 @@
1
- /**
2
- * 健康检查端点
3
- */
4
- import type { RequestHandler } from './$types'
5
- import { kit } from '@h-ai/kit'
6
-
7
- export const GET: RequestHandler = async ({ locals }) => {
8
- return kit.response.ok({
9
- status: 'ok',
10
- service: 'api-service',
11
- version: '0.0.1',
12
- timestamp: new Date().toISOString(),
13
- }, locals.requestId)
14
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * Items API — 列表与创建
3
- */
4
- import type { RequestHandler } from './$types'
5
- import { kit } from '@h-ai/kit'
6
-
7
- /**
8
- * GET /api/v1/items — 获取列表
9
- */
10
- export const GET: RequestHandler = async ({ url, locals }) => {
11
- const page = Number(url.searchParams.get('page') || '1')
12
- const pageSize = Number(url.searchParams.get('pageSize') || '20')
13
-
14
- return kit.response.ok({
15
- items: [],
16
- total: 0,
17
- page,
18
- pageSize,
19
- }, locals.requestId)
20
- }
21
-
22
- /**
23
- * POST /api/v1/items — 创建
24
- */
25
- export const POST: RequestHandler = async ({ request, locals }) => {
26
- const body = await request.json()
27
-
28
- if (!body.name) {
29
- return kit.response.badRequest('name is required')
30
- }
31
-
32
- return kit.response.ok({
33
- id: '1',
34
- ...body,
35
- createdAt: new Date().toISOString(),
36
- }, locals.requestId)
37
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * Items API — 单项操作
3
- */
4
- import type { RequestHandler } from './$types'
5
- import { kit } from '@h-ai/kit'
6
-
7
- /**
8
- * GET /api/v1/items/:id — 获取详情
9
- */
10
- export const GET: RequestHandler = async ({ params, locals }) => {
11
- const { id } = params
12
- return kit.response.ok({ id, name: 'Example Item' }, locals.requestId)
13
- }
14
-
15
- /**
16
- * PUT /api/v1/items/:id — 更新
17
- */
18
- export const PUT: RequestHandler = async ({ params, request, locals }) => {
19
- const { id } = params
20
- const body = await request.json()
21
- return kit.response.ok({ id, ...body, updatedAt: new Date().toISOString() }, locals.requestId)
22
- }
23
-
24
- /**
25
- * DELETE /api/v1/items/:id — 删除
26
- */
27
- export const DELETE: RequestHandler = async ({ params, locals }) => {
28
- const { id } = params
29
- return kit.response.ok({ id, deleted: true }, locals.requestId)
30
- }
@@ -1,26 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
- import { GET } from '../src/routes/api/v1/health/+server'
3
-
4
- interface HealthResponseBody {
5
- success: boolean
6
- data?: {
7
- status?: string
8
- service?: string
9
- }
10
- requestId?: string
11
- }
12
-
13
- describe('api health endpoint', () => {
14
- it('returns a successful HaiResult response', async () => {
15
- const response = await GET({
16
- locals: { requestId: 'test-request' },
17
- } as Parameters<typeof GET>[0])
18
- const body = await response.json() as HealthResponseBody
19
-
20
- expect(response.status).toBe(200)
21
- expect(body.success).toBe(true)
22
- expect(body.data?.status).toBe('ok')
23
- expect(body.data?.service).toBe('api-service')
24
- expect(body.requestId).toBe('test-request')
25
- })
26
- })
@@ -1,14 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.app}}
3
- <!doctype html>
4
- <html lang="%paraglide.lang%">
5
- <head>
6
- <meta charset="utf-8" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1" />
8
- %sveltekit.head%
9
- </head>
10
- <body data-sveltekit-preload-data="hover">
11
- <div style="display: contents">%sveltekit.body%</div>
12
- </body>
13
- </html>
14
- {{/if}}
@@ -1,18 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.app}}
3
- <script lang="ts">
4
- import { setLocale } from '$lib/paraglide/runtime.js'
5
- import { AppShell } from '{{fullstack.sharedPackageName}}'
6
- import '../app.css'
7
-
8
- const { children } = $props()
9
-
10
- function syncLocale(locale: string) {
11
- setLocale(locale as Parameters<typeof setLocale>[0])
12
- }
13
- </script>
14
-
15
- <AppShell platform="app" onLocaleChange={syncLocale}>
16
- {@render children()}
17
- </AppShell>
18
- {{/if}}
@@ -1,162 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.app}}
3
- <script lang="ts">
4
- import type { AppInfo } from '{{fullstack.sharedPackageName}}'
5
- import * as appM from '$lib/paraglide/messages.js'
6
- import { Alert, Button, Card, Skeleton } from '@h-ai/ui'
7
- import { onMount } from 'svelte'
8
- import { fetchAppInfo, messages as sharedM } from '{{fullstack.sharedPackageName}}'
9
-
10
- let info = $state<AppInfo | null>(null)
11
- let loading = $state(true)
12
- let errorMessage = $state('')
13
-
14
- async function refreshStatus() {
15
- loading = true
16
- errorMessage = ''
17
- try {
18
- info = await fetchAppInfo()
19
- }
20
- catch {
21
- info = null
22
- errorMessage = sharedM.home_error()
23
- }
24
- finally {
25
- loading = false
26
- }
27
- }
28
-
29
- onMount(() => {
30
- void refreshStatus()
31
- })
32
- </script>
33
-
34
- <svelte:head>
35
- <title>{appM.page_title({ name: sharedM.app_name() })}</title>
36
- </svelte:head>
37
-
38
- <section class="space-y-8">
39
- <div class="grid gap-6 lg:grid-cols-[1.2fr_0.8fr]">
40
- <section class="relative overflow-hidden rounded-[2rem] border border-base-300/70 bg-gradient-to-br from-primary/15 via-base-100 to-secondary/15 p-6 shadow-2xl shadow-primary/10 lg:p-10">
41
- <div class="absolute right-8 top-8 hidden size-28 rounded-full bg-primary/20 blur-3xl sm:block"></div>
42
- <div class="relative z-10 max-w-2xl space-y-6">
43
- <span class="badge badge-primary badge-lg gap-2">
44
- <span class="icon-[tabler--rocket] size-4"></span>
45
- {appM.hero_badge()}
46
- </span>
47
- <div class="space-y-4">
48
- <h1 class="text-4xl font-black tracking-tight text-base-content sm:text-5xl">
49
- {appM.hero_title({ name: sharedM.app_name() })}
50
- </h1>
51
- <p class="max-w-xl text-lg leading-8 text-base-content/70">
52
- {appM.hero_subtitle()}
53
- </p>
54
- </div>
55
- <div class="flex flex-wrap gap-3">
56
- <a class="btn btn-primary shadow-lg shadow-primary/20" href="#status">
57
- <span class="icon-[tabler--activity-heartbeat] size-5"></span>
58
- {appM.hero_primary_action()}
59
- </a>
60
- <a class="btn btn-ghost" href="#customize">
61
- <span class="icon-[tabler--adjustments] size-5"></span>
62
- {appM.hero_secondary_action()}
63
- </a>
64
- </div>
65
- </div>
66
- </section>
67
-
68
- <aside class="rounded-[2rem] border border-base-300/70 bg-base-100/80 p-5 shadow-xl backdrop-blur">
69
- <div class="mockup-window border border-base-300 bg-base-200/70">
70
- <div class="space-y-4 bg-base-100 p-5">
71
- <div class="flex items-center justify-between">
72
- <div>
73
- <p class="text-sm font-semibold">{appM.preview_title()}</p>
74
- <p class="text-xs text-base-content/55">{appM.preview_body()}</p>
75
- </div>
76
- <span class="badge badge-success badge-outline">{appM.platform_name()}</span>
77
- </div>
78
- <div class="grid gap-3 text-sm">
79
- <div class="rounded-2xl bg-primary/10 p-4">
80
- <span class="icon-[tabler--components] mb-2 size-6 text-primary"></span>
81
- <p class="font-semibold">{appM.preview_metric_shared()}</p>
82
- </div>
83
- <div class="grid grid-cols-2 gap-3">
84
- <div class="rounded-2xl bg-secondary/10 p-4">
85
- <span class="icon-[tabler--language] mb-2 size-6 text-secondary"></span>
86
- <p class="font-semibold">{appM.preview_metric_local()}</p>
87
- </div>
88
- <div class="rounded-2xl bg-accent/10 p-4">
89
- <span class="icon-[tabler--palette] mb-2 size-6 text-accent"></span>
90
- <p class="font-semibold">{appM.preview_metric_theme()}</p>
91
- </div>
92
- </div>
93
- </div>
94
- </div>
95
- </div>
96
- </aside>
97
- </div>
98
-
99
- <div class="grid gap-6 lg:grid-cols-[0.95fr_1.05fr]">
100
- <div id="status">
101
- <Card title={appM.status_title()} bordered shadow="md" class="bg-base-100/90 backdrop-blur">
102
- <p class="mb-5 text-sm text-base-content/65">{appM.status_description()}</p>
103
- {#if loading}
104
- <Skeleton variant="title" class="mb-3" />
105
- <Skeleton count={3} />
106
- <p class="sr-only" data-testid="service-status">{sharedM.home_loading()}</p>
107
- {:else if info}
108
- <Alert variant="success" title={appM.status_online({ name: info.name })}>
109
- <p data-testid="service-status">{info.name}</p>
110
- </Alert>
111
- <dl class="mt-5 grid gap-3 sm:grid-cols-2 text-sm">
112
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4">
113
- <dt class="text-xs text-base-content/55">{appM.status_version()}</dt>
114
- <dd class="mt-1 font-semibold">{info.version}</dd>
115
- </div>
116
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4">
117
- <dt class="text-xs text-base-content/55">{appM.status_started({ time: info.startedAt })}</dt>
118
- <dd class="mt-1 font-semibold">{appM.status_frontends_count({ count: String(info.frontends.length) })}</dd>
119
- </div>
120
- <div class="rounded-box border border-base-300/70 bg-base-200/60 p-4 sm:col-span-2">
121
- <dt class="text-xs text-base-content/55">{appM.status_frontends({ list: info.frontends.join(' / ') })}</dt>
122
- <dd class="mt-1 font-semibold">{sharedM.home_subtitle()}</dd>
123
- </div>
124
- </dl>
125
- {:else}
126
- <Alert variant="error" title={sharedM.home_error()}>
127
- <p data-testid="service-status">{errorMessage}</p>
128
- </Alert>
129
- {/if}
130
-
131
- <div class="mt-5">
132
- <Button type="button" variant="primary" loading={loading} onclick={refreshStatus}>
133
- {sharedM.home_refresh()}
134
- </Button>
135
- </div>
136
- </Card>
137
- </div>
138
-
139
- <section id="customize" class="grid gap-4 sm:grid-cols-2">
140
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md">
141
- <span class="icon-[tabler--package] mb-4 size-7 text-primary"></span>
142
- <h2 class="text-lg font-bold">{appM.custom_shared_title()}</h2>
143
- <p class="mt-2 text-sm leading-6 text-base-content/65">{appM.custom_shared_body()}</p>
144
- </div>
145
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md">
146
- <span class="icon-[tabler--message-language] mb-4 size-7 text-secondary"></span>
147
- <h2 class="text-lg font-bold">{appM.custom_local_title()}</h2>
148
- <p class="mt-2 text-sm leading-6 text-base-content/65">{appM.custom_local_body()}</p>
149
- </div>
150
- <div class="rounded-[1.5rem] border border-base-300/70 bg-base-100/90 p-5 shadow-md sm:col-span-2">
151
- <h2 class="text-lg font-bold">{appM.flow_title()}</h2>
152
- <ol class="mt-4 grid gap-3 md:grid-cols-4">
153
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_contract()}</li>
154
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_service()}</li>
155
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_shared()}</li>
156
- <li class="rounded-box bg-base-200/70 p-4 text-sm">{appM.flow_frontend()}</li>
157
- </ol>
158
- </div>
159
- </section>
160
- </div>
161
- </section>
162
- {{/if}}
@@ -1,14 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.desktop}}
3
- <!doctype html>
4
- <html lang="%paraglide.lang%">
5
- <head>
6
- <meta charset="utf-8" />
7
- <meta name="viewport" content="width=device-width, initial-scale=1" />
8
- %sveltekit.head%
9
- </head>
10
- <body data-sveltekit-preload-data="hover">
11
- <div style="display: contents">%sveltekit.body%</div>
12
- </body>
13
- </html>
14
- {{/if}}
@@ -1,18 +0,0 @@
1
- {{! @skipIfEmpty }}
2
- {{#if fullstack.frontends.desktop}}
3
- <script lang="ts">
4
- import { setLocale } from '$lib/paraglide/runtime.js'
5
- import { AppShell } from '{{fullstack.sharedPackageName}}'
6
- import '../app.css'
7
-
8
- const { children } = $props()
9
-
10
- function syncLocale(locale: string) {
11
- setLocale(locale as Parameters<typeof setLocale>[0])
12
- }
13
- </script>
14
-
15
- <AppShell platform="desktop" onLocaleChange={syncLocale}>
16
- {@render children()}
17
- </AppShell>
18
- {{/if}}