@h-ai/cli 0.1.0-alpha.20 → 0.1.0-alpha.22

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 (182) 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-3BBXDQ4Y.js → chunk-CFCXOKGV.js} +24 -2
  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-IGGO7P45.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 +567 -75
  11. package/dist/index.js.map +1 -1
  12. package/package.json +3 -2
  13. package/templates/README.md +40 -29
  14. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +16 -0
  15. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +38 -0
  16. package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
  17. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +33 -0
  18. package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +3 -0
  19. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +12 -0
  20. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
  21. package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
  22. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
  23. package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
  24. package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +17 -0
  25. package/templates/apps/api/apps/{{projectName}}-service/config/_core.yml.hbs +19 -0
  26. package/templates/apps/api/apps/{{projectName}}-service/config/_serv.yml.hbs +26 -0
  27. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +55 -0
  28. package/templates/apps/api/apps/{{projectName}}-service/src/app.ts.hbs +98 -0
  29. package/templates/apps/api/apps/{{projectName}}-service/src/index.ts.hbs +21 -0
  30. package/templates/apps/api/apps/{{projectName}}-service/src/lib/server/init.ts.hbs +184 -0
  31. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/app-procedures.ts.hbs +49 -0
  32. package/templates/apps/api/apps/{{projectName}}-service/src/server/procedures/index.ts.hbs +18 -0
  33. package/templates/apps/api/apps/{{projectName}}-service/tests/service.test.ts.hbs +168 -0
  34. package/templates/apps/api/apps/{{projectName}}-service/tsconfig.json.hbs +16 -0
  35. package/templates/apps/api/apps/{{projectName}}-service/tsup.config.ts.hbs +11 -0
  36. package/templates/apps/api/apps/{{projectName}}-service/vitest.config.ts.hbs +9 -0
  37. package/templates/apps/api/e2e/api-service.spec.ts.hbs +18 -0
  38. package/templates/apps/api/eslint.config.js +32 -0
  39. package/templates/apps/api/package.json.hbs +29 -0
  40. package/templates/apps/api/playwright.config.ts.hbs +58 -0
  41. package/templates/apps/api/pnpm-workspace.yaml.hbs +14 -0
  42. package/templates/apps/api/tsconfig.base.json +15 -0
  43. package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
  44. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +24 -7
  45. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +18 -0
  46. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +1 -1
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +16 -0
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +6 -0
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +6 -0
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +51 -29
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +186 -0
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +2 -0
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +0 -1
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +18 -0
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +14 -0
  56. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +1 -5
  57. package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +10 -4
  58. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +4 -3
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +20 -6
  61. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +1 -1
  62. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +15 -0
  63. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +33 -30
  64. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +152 -0
  65. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +1 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +13 -0
  67. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +22 -0
  68. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
  69. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +12 -0
  70. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
  71. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
  72. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
  73. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
  74. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
  75. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +16 -0
  76. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
  77. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +41 -0
  78. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +2 -8
  79. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +9 -4
  80. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +44 -21
  81. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +15 -6
  82. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +1 -1
  83. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +15 -0
  84. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +25 -27
  85. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +153 -0
  86. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +0 -1
  87. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
  88. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +1 -5
  89. package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +10 -4
  90. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +3 -2
  91. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +2 -1
  92. package/templates/apps/fullstack/eslint.config.js +0 -1
  93. package/templates/apps/fullstack/package.json.hbs +18 -17
  94. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +3 -3
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +2 -2
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +2 -2
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -1
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/{server-app.test.ts.hbs → app-server.test.ts.hbs} +1 -1
  99. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +9 -8
  100. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +1 -1
  101. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +5 -1
  102. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/ThemeSwitcher.svelte.hbs +1 -1
  103. package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +1 -1
  104. package/templates/apps/fullstack/playwright.config.ts.hbs +41 -4
  105. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +15 -0
  106. package/templates/apps/mobile-app/.env.hbs +3 -0
  107. package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
  108. package/templates/apps/mobile-app/index.html.hbs +13 -0
  109. package/templates/apps/mobile-app/messages/en-US.json +36 -0
  110. package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
  111. package/templates/apps/mobile-app/src/App.svelte.hbs +162 -0
  112. package/templates/apps/mobile-app/src/lib/api.ts.hbs +54 -0
  113. package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +5 -6
  114. package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
  115. package/templates/base/.gitignore.hbs +16 -0
  116. package/templates/base/{eslint.config.js → eslint.config.js.hbs} +4 -1
  117. package/templates/base/package.json.hbs +52 -33
  118. package/templates/base/playwright.config.ts +30 -3
  119. package/templates/base/pnpm-workspace.yaml.hbs +14 -0
  120. package/templates/base/src/app.d.ts.hbs +3 -0
  121. package/templates/base/src/app.html.hbs +3 -0
  122. package/templates/base/svelte.config.js.hbs +43 -3
  123. package/templates/base/tests/scaffold.test.ts.hbs +7 -0
  124. package/templates/base/tsconfig.json.hbs +50 -0
  125. package/templates/base/vite.config.ts.hbs +10 -0
  126. package/templates/skills/AGENTS.md +57 -24
  127. package/templates/skills/CLAUDE.md +18 -7
  128. package/templates/skills/bridges/admin/AGENTS.md +66 -0
  129. package/templates/skills/bridges/admin/CLAUDE.md +19 -0
  130. package/templates/skills/bridges/admin/copilot-instructions.md +46 -0
  131. package/templates/skills/bridges/api/AGENTS.md +65 -0
  132. package/templates/skills/bridges/api/CLAUDE.md +19 -0
  133. package/templates/skills/bridges/api/copilot-instructions.md +46 -0
  134. package/templates/skills/bridges/fullstack/AGENTS.md +84 -0
  135. package/templates/skills/bridges/fullstack/CLAUDE.md +19 -0
  136. package/templates/skills/bridges/fullstack/copilot-instructions.md +54 -0
  137. package/templates/skills/bridges/h5/AGENTS.md +65 -0
  138. package/templates/skills/bridges/h5/CLAUDE.md +19 -0
  139. package/templates/skills/bridges/h5/copilot-instructions.md +44 -0
  140. package/templates/skills/bridges/mobile-app/AGENTS.md +77 -0
  141. package/templates/skills/bridges/mobile-app/CLAUDE.md +19 -0
  142. package/templates/skills/bridges/mobile-app/copilot-instructions.md +45 -0
  143. package/templates/skills/bridges/website/AGENTS.md +65 -0
  144. package/templates/skills/bridges/website/CLAUDE.md +19 -0
  145. package/templates/skills/bridges/website/copilot-instructions.md +44 -0
  146. package/templates/skills/copilot-instructions.md +27 -64
  147. package/templates/skills/hai-app-create/SKILL.md +1 -0
  148. package/templates/skills/hai-app-review/SKILL.md +1 -1
  149. package/templates/skills/hai-app-tests/SKILL.md +28 -3
  150. package/templates/skills/hai-capacitor/SKILL.md +14 -22
  151. package/templates/skills/hai-ui/SKILL.md +8 -2
  152. package/templates/skills/opencode.json +1 -6
  153. package/dist/chunk-3BBXDQ4Y.js.map +0 -1
  154. package/dist/chunk-GSMXGUYF.js.map +0 -1
  155. package/dist/cli-config-templates-IGGO7P45.js +0 -5
  156. package/dist/cli-skill-templates-IMYZPQRG.js +0 -5
  157. package/templates/apps/android-app/.env.hbs +0 -3
  158. package/templates/apps/android-app/messages/en-US.json +0 -24
  159. package/templates/apps/android-app/messages/zh-CN.json +0 -24
  160. package/templates/apps/android-app/src/lib/api.ts.hbs +0 -32
  161. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -43
  162. package/templates/apps/android-app/src/routes/+layout.ts +0 -7
  163. package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -38
  164. package/templates/apps/api/src/routes/+layout.svelte +0 -14
  165. package/templates/apps/api/src/routes/+page.svelte +0 -11
  166. package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
  167. package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
  168. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
  169. package/templates/apps/api/tests/health.test.ts.hbs +0 -26
  170. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.html.hbs +0 -14
  171. package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+layout.svelte.hbs +0 -18
  172. package/templates/apps/fullstack/apps/{{projectName}}-app/src/routes/+page.svelte.hbs +0 -162
  173. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.html.hbs +0 -14
  174. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+layout.svelte.hbs +0 -18
  175. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/routes/+page.svelte.hbs +0 -162
  176. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.html.hbs +0 -14
  177. package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+layout.svelte.hbs +0 -18
  178. package/templates/apps/fullstack/apps/{{projectName}}-web/src/routes/+page.svelte.hbs +0 -162
  179. package/templates/apps/fullstack/pnpm-workspace.yaml +0 -7
  180. package/templates/base/tsconfig.json +0 -20
  181. /package/templates/apps/fullstack/packages/{{projectName}}-serv/src/{server-app.ts.hbs → app-server.ts.hbs} +0 -0
  182. /package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/{theme.svelte.ts.hbs → theme-store.svelte.ts.hbs} +0 -0
@@ -0,0 +1,65 @@
1
+ # AGENTS.md
2
+
3
+ > H5 移动端项目 AI 编程助手入口。优先结合 `README.md`、`.agents/skills/`、`src/routes/`、`messages/*` 与移动端测试工作。
4
+
5
+ ## 行为契约
6
+
7
+ 1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ 2. 任务规模 ≥ M 时,先回顾现有路由、触屏交互、messages、测试与 `.agents/skills/*/SKILL.md`。
9
+ 3. 在写第一行新代码前,用 1 行回答 Q1-Q7 必要性自检。
10
+ 4. 任务规模 ≥ M 时,说明将影响的页面、移动端导航、API、messages、测试和 README。
11
+
12
+ ## 必要性自检(M / L 任务必须输出)
13
+
14
+ - Q1:已有页面 / layout / 底部导航 / 组件是否可复用?
15
+ - Q2:能否扩展现有路由、移动端组件和 API,而不是新增抽象层?
16
+ - Q3:当前真实调用点是哪些触屏页面、导航和 API?
17
+ - Q4:能否用更少的 route、section、helper 解决?
18
+ - Q5:是否把服务端、中间态或敏感 token 细节泄漏给页面层?
19
+ - Q6:是否与现有移动端布局、i18n、脚本和路由结构一致?
20
+ - Q7:是否比较过更安全的鉴权、缓存和请求处理方式?
21
+
22
+ ## 影响分析(M / L 任务必须输出)
23
+
24
+ - 直接影响:哪些页面、layout、导航、API、messages、README、测试会变。
25
+ - 间接影响:哪些移动端流程、权限入口、共享组件和接口断言需要同步。
26
+
27
+ ## 项目定位
28
+
29
+ 本项目是 hai-framework H5 模板,面向移动浏览器,重点是触屏布局、移动端导航、i18n、API 调用与端到端流程。
30
+
31
+ ## 架构边界
32
+
33
+ - 使用移动端友好的布局和 `@h-ai/ui` 移动组件。
34
+ - 页面文本走 i18n,同步中英文 messages。
35
+ - API 输入必须校验,业务错误按 HaiResult 传递。
36
+ - `+server.ts` 只能导出 handler 和 SvelteKit 允许的配置项;helper 放到 `src/lib/**`。
37
+ - 敏感 token 不要写入不安全存储;优先复用模板已有的鉴权与请求模式。
38
+ - 本样板默认不以 `@h-ai/serv`、`@h-ai/api-contract`、`@h-ai/api-client`、`@h-ai/capacitor` 作为主架构。
39
+
40
+ ## 工作流程
41
+
42
+ 1. 先搜索现有移动端页面、导航、messages、API 和测试。
43
+ 2. 修改导航、触屏交互、API 或认证流程时,同步 README、i18n 和测试。
44
+ 3. 每次改动后运行质量门禁,不能留下“已知失败”。
45
+
46
+ ## 质量门禁
47
+
48
+ ```bash
49
+ pnpm typecheck
50
+ pnpm lint
51
+ pnpm build
52
+ pnpm test
53
+ pnpm test:e2e
54
+ ```
55
+
56
+ ## 完成条件
57
+
58
+ - 页面、导航、API、i18n 与测试保持一致。
59
+ - 最终回复说明门禁状态、已更新移动端流程 / 文档与未完成项。
60
+
61
+ ## 优先 Skills
62
+
63
+ - `hai-build`、`hai-app-create`、`hai-app-review`、`hai-app-tests`
64
+ - `hai-kit`、`hai-ui`、`hai-reldb`、`hai-cache`
65
+ - 其它 `hai-*` 模块按需读取
@@ -0,0 +1,19 @@
1
+ # CLAUDE.md
2
+
3
+ @AGENTS.md
4
+
5
+ > Claude Code H5 项目指引。共享规范通过 `@AGENTS.md` 复用;具体模块用法按需读取 `.agents/skills/`。
6
+
7
+ 如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
8
+
9
+ ## 开始工作前
10
+
11
+ - 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
12
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析。
13
+ - 修改前先看 `src/routes/`、移动端导航、`messages/*` 与测试。
14
+
15
+ ## H5 特有提醒
16
+
17
+ - 优先复用现有移动端布局、底部导航和 `@h-ai/ui` 组件。
18
+ - 页面文案、导航标签和错误提示都要同步 i18n。
19
+ - 不要把 `@h-ai/serv` / `@h-ai/api-client` / `@h-ai/capacitor` 当成当前 H5 样板的默认主架构。
@@ -0,0 +1,44 @@
1
+ # GitHub Copilot 项目指令
2
+
3
+ > H5 移动端工程指引。详细模块用法按需读取 `.agents/skills/`。
4
+
5
+ ## 行为契约
6
+
7
+ - 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
9
+ - 修改前先阅读 `AGENTS.md`、`README.md`、相关页面 / messages / 测试与 `.agents/skills/*/SKILL.md`。
10
+
11
+ ## 技术栈要点
12
+
13
+ - SvelteKit + Svelte 5 Runes。
14
+ - TailwindCSS / DaisyUI / `@h-ai/ui` 移动组件。
15
+ - Paraglide i18n。
16
+
17
+ ## 技术边界
18
+
19
+ - 页面组件只负责渲染和交互;复杂业务逻辑放在服务层或模块 API。
20
+ - 移动端文案、导航和错误提示全部走 i18n。
21
+ - `+server.ts` 只能导出 handler 与官方允许的配置项;helper 放到 `src/lib/**`。
22
+ - 优先复用现有移动端导航与组件,不要引入不必要的桌面式交互。
23
+ - 禁止 `any`、`console.log`、硬编码密钥。
24
+
25
+ ## 开发流程
26
+
27
+ 1. 先检索现有移动端页面、导航、messages、API 和测试。
28
+ 2. 修改导航、API 或认证流程时,同步 README、i18n 和测试。
29
+ 3. 不要把未运行或失败的门禁写成“已通过”。
30
+
31
+ ## 质量门禁
32
+
33
+ ```bash
34
+ pnpm typecheck
35
+ pnpm lint
36
+ pnpm build
37
+ pnpm test
38
+ pnpm test:e2e
39
+ ```
40
+
41
+ ## 完成条件
42
+
43
+ - 页面、导航、API、i18n 与测试同步更新。
44
+ - 最终交付说明中列出门禁状态、受影响流程 / 文档与未完成项。
@@ -0,0 +1,77 @@
1
+ # AGENTS.md
2
+
3
+ > Capacitor Mobile App 项目 AI 编程助手入口。优先结合 `README.md`、`.agents/skills/`、`src/`、`messages/*` 与移动端测试工作。
4
+
5
+ ## 行为契约
6
+
7
+ 1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ 2. 任务规模 ≥ M 时,先回顾现有页面、原生桥接、API 调用、messages、测试与 `.agents/skills/*/SKILL.md`。
9
+ 3. 在写第一行新代码前,用 1 行回答 Q1-Q7 必要性自检。
10
+ 4. 任务规模 ≥ M 时,说明将影响的页面、状态管理、原生桥接、API、messages、README 和测试。
11
+
12
+ ## 必要性自检(M / L 任务必须输出)
13
+
14
+ - Q1:已有页面、store、service、Capacitor 封装是否可复用?
15
+ - Q2:能否扩展现有 `src/lib/capacitor.ts`、service 或组件,而不是新建抽象层?
16
+ - Q3:当前真实调用点是哪些页面、原生能力或 API 流程?
17
+ - Q4:能否用更少的 page、store、helper 解决?
18
+ - Q5:是否把原生桥接、token 或 API 细节泄漏给页面层?
19
+ - Q6:是否与现有 Svelte 5 + Vite + Capacitor 目录、脚本和 i18n 一致?
20
+ - Q7:是否比较过更安全的存储、权限和网络调用方案?
21
+
22
+ ## 影响分析(M / L 任务必须输出)
23
+
24
+ - 直接影响:哪些页面、store、原生桥接、messages、README、测试和打包脚本会变。
25
+ - 间接影响:哪些 Android/iOS 权限、API 调用方、构建/打包流程和共享组件需要同步。
26
+
27
+ ## 项目概述
28
+
29
+ 本项目是 hai-framework Mobile/Capacitor 模板:直接使用 Svelte 5 + Vite 输出 SPA,Capacitor 负责 Android/iOS 原生壳和设备能力。
30
+
31
+ ## 架构边界
32
+
33
+ - 不使用 SvelteKit 路由、server hooks 或 `@h-ai/kit`。
34
+ - 不新增 `+page.svelte`、`+layout.svelte`、`hooks.server.ts`、`src/routes/*` 等 SvelteKit 文件。
35
+ - 原生能力通过 `@h-ai/capacitor` 使用;token 原生端使用 Capacitor 安全存储,Web 预览仅使用内存存储。
36
+ - API 调用使用 `@h-ai/api-client`,业务错误按 HaiResult 处理。
37
+ - 页面文本走 i18n,同步中英文 messages。
38
+ - 原生桥接与设备调用放在 `src/lib/capacitor.ts` 或 service,避免散落在页面模板中。
39
+ - 本样板默认不使用 `@h-ai/core`、`@h-ai/kit`、`@h-ai/serv`、`@h-ai/api-contract` 作为主架构。
40
+
41
+ ## 常用命令
42
+
43
+ ```bash
44
+ pnpm build
45
+ pnpm cap:sync:android
46
+ pnpm cap:run:android
47
+ pnpm cap:build:android:debug
48
+ pnpm cap:build:android:release
49
+ ```
50
+
51
+ ## 工作流程
52
+
53
+ 1. 先搜索现有页面、stores、原生桥接、API client、messages 和测试。
54
+ 2. 修改原生能力、权限、登录态或 API 流程时,同步 README、i18n 和测试。
55
+ 3. 每次改动后运行质量门禁,不能留下“已知失败”。
56
+
57
+ ## 质量门禁
58
+
59
+ ```bash
60
+ pnpm typecheck
61
+ pnpm lint
62
+ pnpm build
63
+ pnpm test
64
+ pnpm test:e2e
65
+ ```
66
+
67
+ ## 完成条件
68
+
69
+ - 页面、原生桥接、API、i18n 与测试保持一致。
70
+ - 若改动影响打包 / 原生权限 / 设备能力,README 与脚本说明必须同步更新。
71
+ - 最终回复说明门禁状态、已更新移动端流程 / 文档与未完成项。
72
+
73
+ ## 优先 Skills
74
+
75
+ - `hai-build`、`hai-app-review`、`hai-app-tests`
76
+ - `hai-ui`、`hai-api-client`、`hai-capacitor`
77
+ - 其它 `hai-*` 模块按需读取
@@ -0,0 +1,19 @@
1
+ # CLAUDE.md
2
+
3
+ @AGENTS.md
4
+
5
+ > Claude Code Capacitor Mobile App 项目指引。共享规范通过 `@AGENTS.md` 复用;具体模块用法按需读取 `.agents/skills/`。
6
+
7
+ 如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
8
+
9
+ ## 开始工作前
10
+
11
+ - 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
12
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析。
13
+ - 修改前先看 `src/`、`src/lib/capacitor.ts`、API client、messages 和测试。
14
+
15
+ ## Mobile/Capacitor 特有提醒
16
+
17
+ - 本项目是 Svelte 5 + Vite,不是 SvelteKit;不要新建 `+page.svelte`、`hooks.server.ts` 等文件。
18
+ - 设备能力与 token 存储放在原生桥接 / service 层,不要散落进页面模板。
19
+ - 页面文本、错误提示和设置项都要同步 i18n。
@@ -0,0 +1,45 @@
1
+ # GitHub Copilot 项目指令
2
+
3
+ > Capacitor Mobile App 工程指引。详细模块用法按需读取 `.agents/skills/`。
4
+
5
+ ## 行为契约
6
+
7
+ - 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
9
+ - 修改前先阅读 `AGENTS.md`、`README.md`、相关页面 / 原生桥接 / 测试与 `.agents/skills/*/SKILL.md`。
10
+
11
+ ## 技术栈要点
12
+
13
+ - Svelte 5 + Vite SPA(无 SvelteKit)。
14
+ - Capacitor Android/iOS 原生壳。
15
+ - `@h-ai/capacitor` 负责原生能力和安全 token 存储。
16
+ - `@h-ai/api-client` 负责 typed API 调用。
17
+
18
+ ## 技术边界
19
+
20
+ - 不新增 `+page.svelte` / `+layout.svelte` / `hooks.server.ts` 等 SvelteKit 文件。
21
+ - 原生能力封装在 `src/lib/capacitor.ts` 或 service,不写进页面模板。
22
+ - 原生 token 使用安全存储;Web 预览不要落到不安全持久化存储。
23
+ - 页面文本走 i18n。
24
+ - 禁止 `any`、`console.log`、硬编码密钥。
25
+
26
+ ## 开发流程
27
+
28
+ 1. 先检索现有页面、store、原生桥接、API client、messages 和测试。
29
+ 2. 修改原生能力、权限、登录态或 API 流程时,同步 README、i18n 和测试。
30
+ 3. 不要把未运行或失败的门禁写成“已通过”。
31
+
32
+ ## 质量门禁
33
+
34
+ ```bash
35
+ pnpm typecheck
36
+ pnpm lint
37
+ pnpm build
38
+ pnpm test
39
+ pnpm test:e2e
40
+ ```
41
+
42
+ ## 完成条件
43
+
44
+ - 页面、原生桥接、API、i18n 与测试同步更新。
45
+ - 交付说明中列出门禁状态、受影响的设备能力 / 文档与未完成项。
@@ -0,0 +1,65 @@
1
+ # AGENTS.md
2
+
3
+ > 企业官网项目 AI 编程助手入口。优先结合 `README.md`、`.agents/skills/`、`src/routes/`、`messages/*` 与测试工作。
4
+
5
+ ## 行为契约
6
+
7
+ 1. 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ 2. 任务规模 ≥ M 时,先回顾现有页面、SEO 相关实现、表单/API、测试与 `.agents/skills/*/SKILL.md`。
9
+ 3. 在写第一行新代码前,用 1 行回答 Q1-Q7 必要性自检。
10
+ 4. 任务规模 ≥ M 时,说明将影响的页面、表单、messages、SEO 元信息、测试和 README。
11
+
12
+ ## 必要性自检(M / L 任务必须输出)
13
+
14
+ - Q1:已有页面 / layout / 组件 / 表单是否可复用?
15
+ - Q2:能否扩展现有 route、section、组件,而不是新增抽象层?
16
+ - Q3:当前真实调用点是哪些页面、表单或 API?
17
+ - Q4:能否用更少的 section、组件、helper 解决?
18
+ - Q5:是否把后端、存储或中间态细节泄漏给页面层?
19
+ - Q6:是否与现有路由、i18n、SEO 和脚本一致?
20
+ - Q7:是否比较过更安全的表单校验、SEO 和构建方案?
21
+
22
+ ## 影响分析(M / L 任务必须输出)
23
+
24
+ - 直接影响:哪些页面、layout、表单/API、messages、README、测试会变。
25
+ - 间接影响:哪些导航入口、SEO 标签、部署脚本和共享组件需要同步。
26
+
27
+ ## 项目定位
28
+
29
+ 本项目是 hai-framework 企业官网模板,重点是 SvelteKit 页面、SEO、i18n、表单/API 边界和可部署构建产物。
30
+
31
+ ## 架构边界
32
+
33
+ - 页面内容与导航文案全部走 i18n,同步中英文 messages。
34
+ - 表单和 API 输入必须 Zod 校验。
35
+ - UI 组件优先使用 `@h-ai/ui`,不要重复实现已有组件。
36
+ - `+server.ts` 只能导出 handler 和 SvelteKit 允许的配置项;helper 放到 `src/lib/**`。
37
+ - SEO 元信息、路由结构和消息文案要一起维护。
38
+ - 本样板默认不以 `@h-ai/serv`、`@h-ai/api-contract`、`@h-ai/api-client`、`@h-ai/capacitor` 作为主架构。
39
+
40
+ ## 工作流程
41
+
42
+ 1. 先搜索现有页面、layout、组件、messages、表单/API 和测试。
43
+ 2. 修改页面时同步 README、i18n、测试和 SEO 相关元信息。
44
+ 3. 每次改动后运行质量门禁,不能留下“已知失败”。
45
+
46
+ ## 质量门禁
47
+
48
+ ```bash
49
+ pnpm typecheck
50
+ pnpm lint
51
+ pnpm build
52
+ pnpm test
53
+ pnpm test:e2e
54
+ ```
55
+
56
+ ## 完成条件
57
+
58
+ - 页面、表单、SEO、i18n 与测试保持一致。
59
+ - 最终回复说明门禁状态、已更新页面 / 表单 / 文档与未完成项。
60
+
61
+ ## 优先 Skills
62
+
63
+ - `hai-build`、`hai-app-create`、`hai-app-review`、`hai-app-tests`
64
+ - `hai-kit`、`hai-ui`、`hai-reldb`、`hai-cache`
65
+ - 其它 `hai-*` 模块按需读取
@@ -0,0 +1,19 @@
1
+ # CLAUDE.md
2
+
3
+ @AGENTS.md
4
+
5
+ > Claude Code 企业官网项目指引。共享规范通过 `@AGENTS.md` 复用;具体模块用法按需读取 `.agents/skills/`。
6
+
7
+ 如果当前运行环境未自动展开 `@AGENTS.md`,必须先手动阅读 `AGENTS.md`,再开始修改代码或文档。
8
+
9
+ ## 开始工作前
10
+
11
+ - 回复第一行保持:`规模: XS|S|M|L — <一句话意图>`。
12
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析。
13
+ - 修改前先看 `src/routes/`、`messages/*`、表单/API 与测试。
14
+
15
+ ## 官网特有提醒
16
+
17
+ - 页面文案、导航、SEO 元信息与 i18n 需要一起维护。
18
+ - 优先复用现有 `@h-ai/ui` 组件,不要重复造轮子。
19
+ - 不要把 `@h-ai/serv` / `@h-ai/api-client` 当成默认官网主架构。
@@ -0,0 +1,44 @@
1
+ # GitHub Copilot 项目指令
2
+
3
+ > 企业官网工程指引。详细模块用法按需读取 `.agents/skills/`。
4
+
5
+ ## 行为契约
6
+
7
+ - 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
9
+ - 修改前先阅读 `AGENTS.md`、`README.md`、相关页面 / messages / 测试与 `.agents/skills/*/SKILL.md`。
10
+
11
+ ## 技术栈要点
12
+
13
+ - SvelteKit 页面与路由。
14
+ - TailwindCSS / DaisyUI / `@h-ai/ui`。
15
+ - Paraglide i18n,messages 位于 `messages/zh-CN.json` 与 `messages/en-US.json`。
16
+
17
+ ## 技术边界
18
+
19
+ - 所有页面文案走 i18n。
20
+ - 表单/API 输入使用 Zod 校验。
21
+ - `+server.ts` 只能导出 handler 与官方允许的配置项;helper 放到 `src/lib/**`。
22
+ - 页面内容、SEO 元信息和测试要一起维护。
23
+ - 禁止 `any`、`console.log`、硬编码密钥。
24
+
25
+ ## 开发流程
26
+
27
+ 1. 先检索现有页面、组件、messages、表单/API 和测试。
28
+ 2. 修改页面或 SEO 相关实现时,同步 README、i18n、测试和元信息。
29
+ 3. 不要把未运行或失败的门禁写成“已通过”。
30
+
31
+ ## 质量门禁
32
+
33
+ ```bash
34
+ pnpm typecheck
35
+ pnpm lint
36
+ pnpm build
37
+ pnpm test
38
+ pnpm test:e2e
39
+ ```
40
+
41
+ ## 完成条件
42
+
43
+ - 页面、表单、SEO、i18n 与测试同步更新。
44
+ - 最终交付说明中列出门禁状态、受影响页面 / 文档与未完成项。
@@ -1,80 +1,43 @@
1
1
  # GitHub Copilot 项目指令
2
2
 
3
- > 本文件作为 GitHub Copilot 的项目级指引,指向 `.agents/skills/` 中的详细 Skill 文件。
3
+ > 本文件作为 Copilot 项目级指引;当缺少 appType 专属桥接时,使用本文件作为 generic fallback。详细用法按需读取 `.agents/skills/`。
4
4
 
5
- ## 项目概述
5
+ ## 行为契约
6
6
 
7
- 本项目使用 [hai-framework](https://github.com/nicehero/hai-framework) 构建,基于 SvelteKit 2 + Svelte 5 (Runes) + TailwindCSS 4 + DaisyUI 5 + TypeScript 5.7+。
7
+ - 每次响应第一行写:`规模: XS|S|M|L — <一句话意图>`。
8
+ - 任务规模 ≥ M 时,先输出 Q1-Q7 必要性自检与影响分析,再开始修改。
9
+ - 修改前先阅读 `README.md`、相关测试、`AGENTS.md` 与对应 `.agents/skills/*/SKILL.md`。
10
+ - 不要把未运行或失败的门禁写成“已通过”。
8
11
 
9
- ## 技术栈要点
12
+ ## 通用约定
10
13
 
11
- - **前端框架**:Svelte 5 (Runes: `$props()`, `$state()`, `$derived()`, `$effect()`)
12
- - **SvelteKit 应用层**:使用文件系统路由、`+layout/+page`、`load` 与 `hooks.server.ts` 做 UI/请求编排;SSR/SPA/静态输出以具体 app 的 adapter 与配置为准
13
- - **Fullstack 服务端**:前后端分离工程的业务 API 在 `packages/<project>-serv` 中通过 `@h-ai/serv` 实现;不要把服务端业务逻辑塞进 SvelteKit 页面、`load` 或前端组件
14
- - **样式**:TailwindCSS 4 + DaisyUI 5
15
- - **后端框架**:hai-framework (`@h-ai/core`, `@h-ai/kit`, `@h-ai/reldb`, `@h-ai/iam` 等)
16
- - **统一模式**:`module.init(config) → use → module.close()`,所有操作返回 `HaiResult<T>`
17
- - **单元测试**:Vitest
18
- - **E2E 测试**:Playwright
19
- - **包管理**:pnpm
20
-
21
- ## 编码规范
22
-
23
- - 禁止 `any`(使用 `unknown` + 缩窄)
24
- - 禁止 `console.log`(使用 `core.logger`)
25
- - 禁止硬编码密钥
26
- - `xx-main.ts` 仅做生命周期管理和 API 编排,禁止在 main 中编写具体业务逻辑(委托给 `xx-functions.ts` / `xx-runner.ts` 等)
27
- - 用户可见文本必须走 i18n(`$lib/paraglide/messages.js`)
28
- - HaiResult 错误直接透传,不重新包装
29
- - 框架模块公共 API 不抛异常,统一返回 `HaiResult<T>`;不要用 `try/catch` 处理模块返回的错误
30
- - 日志消息英文、简洁动宾结构
31
- - 代码注释中文
32
-
33
- ## Skills 目录
34
-
35
- 详细的开发指南位于 `.agents/skills/` 目录:
36
-
37
- | Skill | 说明 |
38
- | ---------------- | ----------------------------------------------------- |
39
- | `hai-build` | 项目架构、模块依赖、初始化顺序、编码标准 |
40
- | `hai-core` | 配置加载、日志、i18n、HaiResult 模型、模块生命周期 |
41
- | `hai-kit` | SvelteKit 集成:`handle` hook、守卫、中间件、响应、校验 |
42
- | `hai-ui` | UI 组件库:三层架构、自动导入、主题、i18n |
43
- | `hai-reldb` | 数据库操作:DDL、SQL、CRUD、事务、分页 |
44
- | `hai-iam` | 认证与权限:密码/OTP/LDAP、会话、RBAC |
45
- | `hai-crypto` | 加密:SM2/SM3/SM4、密码哈希、随机生成 |
46
- | `hai-cache` | 缓存:内存/Redis、TTL、集合操作、分布式锁 |
47
- | `hai-storage` | 存储:本地/S3、上传下载、预签名 URL |
48
- | `hai-ai` | AI:LLM 调用、MCP 服务器、工具定义、流处理 |
49
- | `hai-app-create` | TDD 驱动的功能创建(先测试后实现) |
50
- | `hai-app-review` | 应用代码审查(含 TDD 合规检查) |
51
- | `hai-app-tests` | TDD 测试规范(Vitest 单元测试 + Playwright E2E) |
52
- | `hai-ci` | CI/CD、GitHub Actions、质量门禁与 workflow 安全 |
53
- | `hai-pr-review` | PR / Issue 交付审查、AI Review 策略、CODEOWNERS 与合并门禁 |
54
- | `hai-framework-sync` | hai-framework 模板源头与应用仓库同步 |
14
+ - 使用 hai-framework 的模块生命周期:`init(config) -> use -> close()`。
15
+ - 公共 API 返回 `HaiResult<T>` 或 `Promise<HaiResult<T>>`,业务错误不要直接 `throw`。
16
+ - 禁止 `any`、`console.log`、硬编码密钥。
17
+ - 用户可见文本必须走 i18n,并同步中英文消息文件。
18
+ - 代码注释中文,日志消息英文。
19
+ - 若项目使用 SvelteKit,`+server.ts` 只能导出 handler 与官方允许的配置项。
55
20
 
56
21
  ## 开发流程
57
22
 
58
- **必须遵循 TDD**:先写测试(Red)→ 确认失败 → 再实现(Green)→ 确认通过 → 重构(Refactor)。
23
+ 1. 先用全局检索确认现有实现、引用点、测试和文档。
24
+ 2. 优先复用现有目录和模块,不新增无真实调用点的抽象。
25
+ 3. 修改公共类型、API、模板或共享逻辑后,同步 README、测试和所有依赖方。
59
26
 
60
27
  ## 质量门禁
61
28
 
62
- 改动完成后按顺序执行,失败必须先修复,不能把已知失败留给下一轮:
63
-
64
- 1. `pnpm typecheck`
65
- 2. `pnpm lint`(可先 `pnpm lint:fix`,再重新执行 `pnpm lint`)
66
- 3. `pnpm build`(涉及构建产物、打包配置、前后端分离工程或发布路径时必须执行)
67
- 4. `pnpm test`
68
- 5. `pnpm --filter <app-or-package> test:e2e`(涉及 UI、路由、浏览器交互或端到端流程时必须执行)
29
+ 按影响范围执行:
69
30
 
70
- 优先使用 `pnpm --filter <workspace-name>` 缩小验证范围;跨包契约、共享类型或根配置变更必须提升到根命令验证。
31
+ ```bash
32
+ pnpm typecheck
33
+ pnpm lint
34
+ pnpm build
35
+ pnpm test
36
+ pnpm test:e2e
37
+ ```
71
38
 
72
39
  ## 完成条件
73
40
 
74
- - **测试同步**:新增/修改功能必须补单元测试;UI、路由和关键用户流程必须补 E2E 或更新现有 E2E。
75
- - **文档同步**:README、`.agents/skills/**/SKILL.md`、代码注释与实际行为保持一致;生成模板改动要同步模板与测试断言。
76
- - **i18n 同步**:所有用户可见文本必须走 i18n,并同时更新 `zh-CN` 与 `en-US` 消息文件。
77
- - **类型/契约同步**:公共类型、API contract、client、server procedure 与调用方必须一起更新,不能只改一端。
78
- - **错误处理同步**:新增错误码、错误消息或 HaiResult 形态时,同步文档、测试和调用方处理逻辑。
79
- - **依赖方传导**:修改共享包、公共 API 或模板后,用全局检索确认引用点,并更新受影响的 `packages/*`、`apps/*`、CLI 模板/脚手架。
80
- - **完成报告**:最终回复必须列出 typecheck/lint/build/test/e2e 状态、已更新文档、已更新依赖方;未执行或未通过的项目必须说明原因与后续动作。
41
+ - 门禁失败必须先修复;未执行项要写明原因。
42
+ - README、i18n、测试、代码注释与实现保持一致。
43
+ - 最终交付说明中列出门禁状态、已同步文档与依赖方。
@@ -6,6 +6,7 @@ description: 以 TDD 方式在应用中创建新功能:先编写测试定义
6
6
  # hai-app-create — TDD 驱动的应用功能创建规范
7
7
 
8
8
  > 面向 AI 助手的应用功能创建指南。**必须遵循 TDD**:先写测试(Red)→ 再实现(Green)→ 再重构(Refactor)。
9
+ > 若目标是纯 API service workspace,优先围绕 `apps/*-contract`、`apps/*-service` 与测试组织改动,而不是套用页面/路由脚手架。
9
10
 
10
11
  ---
11
12
 
@@ -5,7 +5,7 @@ description: 对应用代码进行审查:检查 TDD 合规性、架构分层
5
5
 
6
6
  # hai-app-review — 应用代码审查规范
7
7
 
8
- > 面向 AI 助手的应用代码审查指南。用于审查使用 hai-framework 构建的 SvelteKit 应用。本技能也是 TDD Refactor 阶段的执行入口。
8
+ > 面向 AI 助手的应用代码审查指南。用于审查使用 hai-framework 构建的 SvelteKit 应用、纯 Svelte/Vite 客户端与 API service workspace。本技能也是 TDD Refactor 阶段的执行入口。
9
9
 
10
10
  ---
11
11
 
@@ -216,7 +216,32 @@ describe('CreateUserSchema', () => {
216
216
  import process from 'node:process'
217
217
  import { defineConfig } from '@playwright/test'
218
218
 
219
- const baseURL = process.env.BASE_URL || 'http://localhost:4173'
219
+ const DEFAULT_BASE_URL = 'http://localhost:4173'
220
+ const baseURL = process.env.BASE_URL || DEFAULT_BASE_URL
221
+ const previewHost = resolveHostFromBaseUrl(baseURL, 'localhost')
222
+ const previewPort = resolvePortFromBaseUrl(baseURL, '4173')
223
+
224
+ function resolveHostFromBaseUrl(urlString: string, fallbackHost: string): string {
225
+ try {
226
+ const url = new URL(urlString)
227
+ return url.hostname || fallbackHost
228
+ }
229
+ catch {
230
+ return fallbackHost
231
+ }
232
+ }
233
+
234
+ function resolvePortFromBaseUrl(urlString: string, fallbackPort: string): string {
235
+ try {
236
+ const url = new URL(urlString)
237
+ if (url.port)
238
+ return url.port
239
+ return url.protocol === 'https:' ? '443' : '80'
240
+ }
241
+ catch {
242
+ return fallbackPort
243
+ }
244
+ }
220
245
 
221
246
  export default defineConfig({
222
247
  testDir: './e2e',
@@ -233,8 +258,8 @@ export default defineConfig({
233
258
  screenshot: 'only-on-failure',
234
259
  },
235
260
  webServer: {
236
- command: 'pnpm build && pnpm preview --port 4173 --strictPort',
237
- env: { HAI_E2E: '1' },
261
+ command: `pnpm build && pnpm preview --host ${previewHost} --port ${previewPort} --strictPort`,
262
+ env: { HAI_E2E: '1', BASE_URL: baseURL },
238
263
  url: baseURL,
239
264
  reuseExistingServer: false,
240
265
  timeout: 180_000,
@@ -17,7 +17,7 @@ description: 使用 @h-ai/capacitor 桥接 Capacitor 原生能力(Token 安全
17
17
 
18
18
  ## 适用场景
19
19
 
20
- - Android/iOS 原生应用开发(SvelteKit + Capacitor)
20
+ - Android/iOS 原生应用开发(Svelte 5 + Vite + Capacitor)
21
21
  - Token 安全存储(`@aparajita/capacitor-secure-storage`)
22
22
  - 设备信息获取(平台、型号、版本)
23
23
  - 推送通知注册与监听(FCM / APNs)
@@ -218,7 +218,7 @@ await capacitor.statusBar.show()
218
218
 
219
219
  ## 常见模式
220
220
 
221
- ### Android 应用标准初始化
221
+ ### Mobile App 标准初始化
222
222
 
223
223
  ```typescript
224
224
  // src/lib/capacitor.ts
@@ -241,10 +241,10 @@ export async function initCapacitor() {
241
241
  ```
242
242
 
243
243
  ```svelte
244
- <!-- src/routes/+layout.svelte -->
245
- <script lang="ts">
244
+ <!-- src/App.svelte -->
245
+ <script lang='ts'>
246
246
  import { onMount } from 'svelte'
247
- import { initCapacitor } from '$lib/capacitor'
247
+ import { initCapacitor } from './lib/capacitor'
248
248
 
249
249
  onMount(() => { initCapacitor() })
250
250
  </script>
@@ -252,27 +252,19 @@ export async function initCapacitor() {
252
252
 
253
253
  ### SPA 模式配置(必需)
254
254
 
255
- Capacitor 应用必须使用 SPA 模式:
255
+ Capacitor 应用使用 Vite 构建 SPA,并让原生壳读取 `dist`:
256
256
 
257
257
  ```typescript
258
- // src/routes/+layout.ts
259
- export const prerender = true
260
- export const ssr = false
261
- ```
258
+ // capacitor.config.ts
259
+ import type { CapacitorConfig } from '@capacitor/cli'
262
260
 
263
- ```javascript
264
- // svelte.config.js
265
- import adapter from '@sveltejs/adapter-static'
266
-
267
- const config = {
268
- kit: {
269
- adapter: adapter({
270
- pages: 'build',
271
- assets: 'build',
272
- fallback: 'index.html',
273
- }),
274
- },
261
+ const config: CapacitorConfig = {
262
+ appId: 'com.example.app',
263
+ appName: 'Example App',
264
+ webDir: 'dist',
275
265
  }
266
+
267
+ export default config
276
268
  ```
277
269
 
278
270
  ### Token 存储 + 认证流程