@h-ai/cli 0.1.0-alpha9 → 1.0.0-beta.2

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 (438) hide show
  1. package/README.en.md +229 -0
  2. package/README.ja.md +229 -0
  3. package/README.md +175 -113
  4. package/dist/chunk-AKV2CQZV.js +1497 -0
  5. package/dist/chunk-AKV2CQZV.js.map +1 -0
  6. package/dist/chunk-EF7WOFWZ.js +7557 -0
  7. package/dist/chunk-EF7WOFWZ.js.map +1 -0
  8. package/dist/chunk-MUHRBJSW.js +29272 -0
  9. package/dist/chunk-MUHRBJSW.js.map +1 -0
  10. package/dist/chunk-ZSDEVXZ7.js +38 -0
  11. package/dist/{chunk-2H7UOFLK.js.map → chunk-ZSDEVXZ7.js.map} +1 -1
  12. package/dist/cli-config-templates-HHFHNXBN.js +5 -0
  13. package/dist/cli-config-templates-HHFHNXBN.js.map +1 -0
  14. package/dist/cli-skill-templates-PN4FLGBC.js +5 -0
  15. package/dist/cli-skill-templates-PN4FLGBC.js.map +1 -0
  16. package/dist/index.js +4444 -554
  17. package/dist/index.js.map +1 -1
  18. package/dist/metafile-esm.json +1 -0
  19. package/dist/src-TEBHR5I5.js +5 -0
  20. package/dist/src-TEBHR5I5.js.map +1 -0
  21. package/package.json +35 -15
  22. package/templates/README.md +56 -114
  23. package/templates/apps/admin/messages/en-US.json +7 -0
  24. package/templates/apps/admin/messages/ja-JP.json +40 -0
  25. package/templates/apps/admin/messages/zh-CN.json +7 -0
  26. package/templates/apps/admin/src/routes/+layout.svelte.hbs +65 -8
  27. package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -14
  28. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +54 -22
  29. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +33 -24
  30. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +16 -13
  31. package/templates/apps/api/.dockerignore.hbs +25 -0
  32. package/templates/apps/api/.gitignore.hbs +22 -0
  33. package/templates/apps/api/.npmrc.hbs +1 -0
  34. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +39 -0
  35. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +41 -0
  36. package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
  37. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +28 -0
  38. package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +5 -0
  39. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +16 -0
  40. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
  41. package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
  42. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
  43. package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
  44. package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +60 -0
  45. package/templates/apps/api/apps/{{projectName}}-serv/config/_core.yml.hbs +17 -0
  46. package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +54 -0
  47. package/templates/apps/api/apps/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
  48. package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +66 -0
  49. package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +119 -0
  50. package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
  51. package/templates/apps/api/apps/{{projectName}}-serv/src/index.ts.hbs +41 -0
  52. package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +165 -0
  53. package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +57 -0
  54. package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +41 -0
  55. package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +176 -0
  56. package/templates/apps/api/apps/{{projectName}}-serv/tsconfig.json.hbs +16 -0
  57. package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +20 -0
  58. package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
  59. package/templates/apps/api/e2e/api-serv.spec.ts.hbs +113 -0
  60. package/templates/apps/api/e2e/capture-evidence.ts.hbs +23 -0
  61. package/templates/apps/api/eslint.config.js.hbs +30 -0
  62. package/templates/apps/api/hai.json.hbs +4 -0
  63. package/templates/apps/api/images/serv.Dockerfile.hbs +37 -0
  64. package/templates/apps/api/package.json.hbs +53 -0
  65. package/templates/apps/api/playwright.config.ts.hbs +67 -0
  66. package/templates/apps/api/pnpm-workspace.yaml.hbs +40 -0
  67. package/templates/apps/api/tsconfig.base.json +14 -0
  68. package/templates/apps/fullstack/.dockerignore.hbs +25 -0
  69. package/templates/apps/fullstack/.gitignore.hbs +38 -0
  70. package/templates/apps/fullstack/.npmrc.hbs +1 -0
  71. package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
  72. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +67 -0
  73. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +20 -0
  74. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +20 -0
  75. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +22 -0
  76. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +7 -0
  77. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/ja-JP.json.hbs +7 -0
  78. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +7 -0
  79. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +86 -0
  80. package/templates/apps/fullstack/apps/{{projectName}}-app/project.inlang/settings.json.hbs +17 -0
  81. package/templates/apps/fullstack/apps/{{projectName}}-app/public/runtime-config.js.hbs +4 -0
  82. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +59 -0
  83. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +20 -0
  84. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +8 -0
  85. package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +9 -0
  86. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +19 -0
  87. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +21 -0
  88. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +16 -0
  89. package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +23 -0
  90. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +74 -0
  91. package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
  92. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +64 -0
  93. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +20 -0
  94. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +20 -0
  95. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +7 -0
  96. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/ja-JP.json.hbs +7 -0
  97. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +7 -0
  98. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +66 -0
  99. package/templates/apps/fullstack/apps/{{projectName}}-desktop/project.inlang/settings.json.hbs +17 -0
  100. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +25 -0
  101. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.css.hbs +18 -0
  102. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +8 -0
  103. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +9 -0
  104. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +20 -0
  105. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +33 -0
  106. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
  107. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +16 -0
  108. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
  109. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
  110. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
  111. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
  112. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
  113. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +91 -0
  114. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
  115. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +46 -0
  116. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +14 -0
  117. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +22 -0
  118. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +89 -0
  119. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +25 -0
  120. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/en-US.json.hbs +12 -0
  121. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/ja-JP.json.hbs +12 -0
  122. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/zh-CN.json.hbs +12 -0
  123. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/project.inlang/settings.json.hbs +17 -0
  124. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +54 -0
  125. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +20 -0
  126. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +21 -0
  127. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +7 -0
  128. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/ja-JP.json.hbs +7 -0
  129. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +7 -0
  130. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +53 -0
  131. package/templates/apps/fullstack/apps/{{projectName}}-web/project.inlang/settings.json.hbs +17 -0
  132. package/templates/apps/fullstack/apps/{{projectName}}-web/public/runtime-config.js.hbs +1 -0
  133. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +18 -0
  134. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.css.hbs +18 -0
  135. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +8 -0
  136. package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +9 -0
  137. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
  138. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +16 -0
  139. package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +23 -0
  140. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +76 -0
  141. package/templates/apps/fullstack/docs/security-configuration.md.hbs +349 -0
  142. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +988 -0
  143. package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +119 -0
  144. package/templates/apps/fullstack/eslint.config.js.hbs +41 -0
  145. package/templates/apps/fullstack/hai.json.hbs +11 -0
  146. package/templates/apps/fullstack/images/serv.Dockerfile.hbs +38 -0
  147. package/templates/apps/fullstack/images/web/19-runtime-config.envsh.hbs +5 -0
  148. package/templates/apps/fullstack/images/web/nginx.conf.hbs +24 -0
  149. package/templates/apps/fullstack/images/web/runtime-config.js.template.hbs +3 -0
  150. package/templates/apps/fullstack/images/web.Dockerfile.hbs +37 -0
  151. package/templates/apps/fullstack/package.json.hbs +61 -0
  152. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +40 -0
  153. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +30 -0
  154. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +78 -0
  155. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +134 -0
  156. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-contract.ts.hbs +20 -0
  157. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +35 -0
  158. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +7 -0
  159. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +23 -0
  160. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +31 -0
  161. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsconfig.json.hbs +9 -0
  162. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +9 -0
  163. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +84 -0
  164. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_ai.yml.hbs +1 -0
  165. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +1 -0
  166. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +1 -0
  167. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +22 -0
  168. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +1 -0
  169. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_feedback.yml.hbs +1 -0
  170. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +1 -0
  171. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_payment.yml.hbs +1 -0
  172. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +60 -0
  173. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_scheduler.yml.hbs +1 -0
  174. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +64 -0
  175. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +1 -0
  176. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_vecdb.yml.hbs +1 -0
  177. package/templates/apps/fullstack/packages/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
  178. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +62 -0
  179. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +115 -0
  180. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
  181. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +40 -0
  182. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +294 -0
  183. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/audit-jobs.ts.hbs +28 -0
  184. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +50 -0
  185. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +50 -0
  186. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +106 -0
  187. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +49 -0
  188. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +34 -0
  189. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +159 -0
  190. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +73 -0
  191. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +505 -0
  192. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +72 -0
  193. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +183 -0
  194. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsconfig.json.hbs +10 -0
  195. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +18 -0
  196. package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
  197. package/templates/apps/fullstack/packages/{{projectName}}-shared/.gitignore.hbs +10 -0
  198. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +97 -0
  199. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +164 -0
  200. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +164 -0
  201. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +164 -0
  202. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +55 -0
  203. package/templates/apps/fullstack/packages/{{projectName}}-shared/project.inlang/settings.json.hbs +11 -0
  204. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +7 -0
  205. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +94 -0
  206. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +36 -0
  207. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +16 -0
  208. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/session-recovery.svelte.ts.hbs +4 -0
  209. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +122 -0
  210. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +90 -0
  211. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +86 -0
  212. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +94 -0
  213. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/configuration.svelte.hbs +25 -0
  214. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +157 -0
  215. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +77 -0
  216. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +44 -0
  217. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +216 -0
  218. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +12 -0
  219. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +55 -0
  220. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +614 -0
  221. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +23 -0
  222. package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
  223. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +150 -0
  224. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +253 -0
  225. package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +17 -0
  226. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
  227. package/templates/apps/fullstack/playwright.config.ts.hbs +114 -0
  228. package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +18 -0
  229. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +38 -0
  230. package/templates/apps/fullstack/tsconfig.base.json +14 -0
  231. package/templates/apps/h5/messages/en-US.json +3 -0
  232. package/templates/apps/h5/messages/ja-JP.json +40 -0
  233. package/templates/apps/h5/messages/zh-CN.json +3 -0
  234. package/templates/apps/h5/src/routes/+layout.svelte.hbs +85 -30
  235. package/templates/apps/h5/src/routes/+page.svelte.hbs +20 -8
  236. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +17 -6
  237. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +17 -6
  238. package/templates/apps/mobile-app/.env.hbs +3 -0
  239. package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
  240. package/templates/apps/mobile-app/index.html.hbs +14 -0
  241. package/templates/apps/mobile-app/messages/en-US.json +36 -0
  242. package/templates/apps/mobile-app/messages/ja-JP.json +36 -0
  243. package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
  244. package/templates/apps/mobile-app/public/runtime-config.js +1 -0
  245. package/templates/apps/mobile-app/src/App.svelte.hbs +153 -0
  246. package/templates/apps/mobile-app/src/lib/api.ts.hbs +213 -0
  247. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +14 -0
  248. package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +6 -7
  249. package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +58 -0
  250. package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -0
  251. package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +16 -0
  252. package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
  253. package/templates/apps/website/messages/en-US.json +4 -2
  254. package/templates/apps/website/messages/ja-JP.json +34 -0
  255. package/templates/apps/website/messages/zh-CN.json +4 -2
  256. package/templates/apps/website/scripts/static-website.mjs.hbs +67 -0
  257. package/templates/apps/website/src/routes/+layout.svelte.hbs +77 -26
  258. package/templates/apps/website/src/routes/+layout.ts +3 -0
  259. package/templates/apps/website/src/routes/+page.svelte.hbs +31 -12
  260. package/templates/apps/website/src/routes/about/+page.svelte.hbs +11 -6
  261. package/templates/apps/website/src/routes/api/health/+server.ts +3 -0
  262. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +44 -34
  263. package/templates/apps/website/src/routes/services/+page.svelte.hbs +27 -40
  264. package/templates/base/.dockerignore.hbs +27 -0
  265. package/templates/base/.gitignore.hbs +41 -0
  266. package/templates/base/.npmrc.hbs +1 -0
  267. package/templates/base/e2e/app.spec.ts.hbs +213 -0
  268. package/templates/base/e2e/helpers.ts +1 -1
  269. package/templates/base/eslint-rules.js +45 -0
  270. package/templates/base/eslint.config.js.hbs +34 -0
  271. package/templates/base/hai.json.hbs +4 -0
  272. package/templates/base/images/web/nginx.conf.hbs +24 -0
  273. package/templates/base/images/web.Dockerfile.hbs +72 -0
  274. package/templates/base/package.json.hbs +125 -49
  275. package/templates/base/playwright.config.ts +44 -6
  276. package/templates/base/pnpm-workspace.yaml.hbs +40 -0
  277. package/templates/base/src/app.css.hbs +40 -0
  278. package/templates/base/src/app.d.ts.hbs +14 -1
  279. package/templates/base/src/app.html.hbs +13 -0
  280. package/templates/base/src/hooks.server.ts.hbs +115 -43
  281. package/templates/base/src/lib/build-metadata.ts.hbs +7 -0
  282. package/templates/base/src/lib/server/init.ts.hbs +125 -152
  283. package/templates/base/src/lib/server/kit-config.ts.hbs +40 -0
  284. package/templates/base/src/routes/+layout.server.ts.hbs +35 -0
  285. package/templates/base/static/favicon.png +0 -0
  286. package/templates/base/svelte.config.js.hbs +84 -5
  287. package/templates/base/tests/scaffold.test.ts.hbs +102 -0
  288. package/templates/base/tsconfig.json.hbs +50 -0
  289. package/templates/base/vite.config.ts.hbs +117 -12
  290. package/templates/base/vitest.config.ts.hbs +19 -0
  291. package/templates/features/ai/routes/api/chat/+server.ts +6 -7
  292. package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +3 -17
  293. package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +10 -0
  294. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +9 -96
  295. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +9 -122
  296. package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +10 -0
  297. package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +10 -0
  298. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +9 -96
  299. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +9 -112
  300. package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +10 -0
  301. package/templates/features/iam/routes-shared/api/auth/captcha/+server.ts.hbs +4 -0
  302. package/templates/features/iam/routes-shared/api/auth/config/+server.ts +4 -0
  303. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +1 -29
  304. package/templates/features/iam/routes-shared/api/auth/login/ldap/+server.ts +4 -0
  305. package/templates/features/iam/routes-shared/api/auth/login/otp/+server.ts +4 -0
  306. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +13 -6
  307. package/templates/features/iam/routes-shared/api/auth/otp/send/+server.ts +4 -0
  308. package/templates/features/iam/routes-shared/api/auth/password/renew/+server.ts +5 -0
  309. package/templates/features/iam/routes-shared/api/auth/password-reset/confirm/+server.ts +4 -0
  310. package/templates/features/iam/routes-shared/api/auth/password-reset/request/+server.ts +4 -0
  311. package/templates/features/iam/routes-shared/api/auth/reauthenticate/+server.ts +5 -0
  312. package/templates/features/iam/routes-shared/api/auth/register/+server.ts +1 -23
  313. package/templates/features/iam/routes-shared/api/auth/session/close/+server.ts.hbs +4 -0
  314. package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +10 -0
  315. package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +11 -0
  316. package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +11 -0
  317. package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +10 -0
  318. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +25 -23
  319. package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +5 -2
  320. package/templates/features/storage/routes/api/upload/+server.ts +10 -8
  321. package/templates/i18n/project.inlang/settings.json +2 -2
  322. package/templates/shared/.gitattributes +11 -0
  323. package/templates/shared/build-metadata.ts +42 -0
  324. package/templates/shared/container-runtime-config.sh +30 -0
  325. package/templates/shared/e2e-env.ts +98 -0
  326. package/templates/shared/hash-router.svelte.ts +83 -0
  327. package/templates/shared/public-base-path.mjs +19 -0
  328. package/templates/shared/run-e2e.mjs +104 -0
  329. package/templates/shared/vite-runtime-config.ts +56 -0
  330. package/templates/skills/AGENTS.md +75 -16
  331. package/templates/skills/CLAUDE.md +0 -11
  332. package/templates/skills/bridges/admin/AGENTS.md +89 -0
  333. package/templates/skills/bridges/api/AGENTS.md +83 -0
  334. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +102 -0
  335. package/templates/skills/bridges/h5/AGENTS.md +88 -0
  336. package/templates/skills/bridges/mobile-app/AGENTS.md +100 -0
  337. package/templates/skills/bridges/website/AGENTS.md +88 -0
  338. package/templates/skills/copilot-instructions.md +3 -59
  339. package/templates/skills/hai-ai/SKILL.md +44 -715
  340. package/templates/skills/hai-ai/guide.md +457 -0
  341. package/templates/skills/hai-ai/reference.md +292 -0
  342. package/templates/skills/hai-api-client/SKILL.md +26 -339
  343. package/templates/skills/hai-api-client/reference.md +180 -0
  344. package/templates/skills/hai-api-contract/SKILL.md +36 -0
  345. package/templates/skills/hai-api-contract/reference.md +280 -0
  346. package/templates/skills/hai-app-create/SKILL.md +38 -351
  347. package/templates/skills/hai-app-create/collaboration.md +52 -0
  348. package/templates/skills/hai-app-create/development.md +243 -0
  349. package/templates/skills/hai-app-create/reference.md +376 -0
  350. package/templates/skills/hai-app-review/SKILL.md +57 -126
  351. package/templates/skills/hai-app-review/differential.md +34 -0
  352. package/templates/skills/hai-app-tests/SKILL.md +34 -454
  353. package/templates/skills/hai-app-tests/reference.md +462 -0
  354. package/templates/skills/hai-app-tests/validation.md +42 -0
  355. package/templates/skills/hai-audit/SKILL.md +37 -122
  356. package/templates/skills/hai-audit/reference.md +184 -0
  357. package/templates/skills/hai-build/SKILL.md +62 -315
  358. package/templates/skills/hai-build/paths.md +30 -0
  359. package/templates/skills/hai-build/reference.md +353 -0
  360. package/templates/skills/hai-cache/SKILL.md +26 -175
  361. package/templates/skills/hai-cache/reference.md +229 -0
  362. package/templates/skills/hai-capacitor/SKILL.md +24 -364
  363. package/templates/skills/hai-capacitor/reference.md +358 -0
  364. package/templates/skills/hai-change-plan/SKILL.md +46 -0
  365. package/templates/skills/hai-ci/SKILL.md +114 -0
  366. package/templates/skills/hai-core/SKILL.md +31 -469
  367. package/templates/skills/hai-core/reference.md +557 -0
  368. package/templates/skills/hai-core/request-access.md +65 -0
  369. package/templates/skills/hai-crypto/SKILL.md +29 -180
  370. package/templates/skills/hai-crypto/reference.md +317 -0
  371. package/templates/skills/hai-datapipe/SKILL.md +24 -207
  372. package/templates/skills/hai-datapipe/reference.md +204 -0
  373. package/templates/skills/hai-deploy/SKILL.md +53 -178
  374. package/templates/skills/hai-deploy/credentials.md +19 -0
  375. package/templates/skills/hai-deploy/middleware.md +129 -0
  376. package/templates/skills/hai-feedback/SKILL.md +85 -0
  377. package/templates/skills/hai-framework-sync/SKILL.md +105 -0
  378. package/templates/skills/hai-framework-sync/sync.md +49 -0
  379. package/templates/skills/hai-iam/SKILL.md +53 -325
  380. package/templates/skills/hai-iam/reference.md +535 -0
  381. package/templates/skills/hai-kit/SKILL.md +33 -329
  382. package/templates/skills/hai-kit/reference.md +202 -0
  383. package/templates/skills/hai-payment/SKILL.md +28 -262
  384. package/templates/skills/hai-payment/reference.md +295 -0
  385. package/templates/skills/hai-pr-review/SKILL.md +41 -0
  386. package/templates/skills/hai-reach/SKILL.md +28 -300
  387. package/templates/skills/hai-reach/reference.md +363 -0
  388. package/templates/skills/hai-reldb/SKILL.md +28 -449
  389. package/templates/skills/hai-reldb/reference.md +500 -0
  390. package/templates/skills/hai-scheduler/SKILL.md +26 -174
  391. package/templates/skills/hai-scheduler/reference.md +216 -0
  392. package/templates/skills/hai-serv/SKILL.md +60 -0
  393. package/templates/skills/hai-serv/reference.md +792 -0
  394. package/templates/skills/hai-spec-implement/SKILL.md +50 -0
  395. package/templates/skills/hai-spec-implement/changes.md +67 -0
  396. package/templates/skills/hai-spec-implement/evaluation.md +18 -0
  397. package/templates/skills/hai-spec-implement/handoff.md +47 -0
  398. package/templates/skills/hai-spec-implement/templates.md +117 -0
  399. package/templates/skills/hai-spec-implement/workflow.md +56 -0
  400. package/templates/skills/hai-spec-review/SKILL.md +57 -0
  401. package/templates/skills/hai-spec-review/checklist.md +71 -0
  402. package/templates/skills/hai-storage/SKILL.md +31 -262
  403. package/templates/skills/hai-storage/reference.md +284 -0
  404. package/templates/skills/hai-ui/SKILL.md +62 -238
  405. package/templates/skills/hai-ui/guide.md +81 -0
  406. package/templates/skills/hai-ui/reference.md +705 -0
  407. package/templates/skills/hai-ui-design/SKILL.md +31 -0
  408. package/templates/skills/hai-ui-design/patterns.md +31 -0
  409. package/templates/skills/hai-ui-review/SKILL.md +32 -0
  410. package/templates/skills/hai-ui-review/checklist.md +29 -0
  411. package/templates/skills/hai-vecdb/SKILL.md +25 -267
  412. package/templates/skills/hai-vecdb/reference.md +325 -0
  413. package/templates/skills/opencode.json +0 -5
  414. package/dist/chunk-2H7UOFLK.js +0 -10
  415. package/dist/chunk-LANIDJC7.js +0 -659
  416. package/dist/chunk-LANIDJC7.js.map +0 -1
  417. package/dist/chunk-YV7WPUI6.js +0 -206
  418. package/dist/chunk-YV7WPUI6.js.map +0 -1
  419. package/dist/config-templates-S5RI2MC6.js +0 -5
  420. package/dist/config-templates-S5RI2MC6.js.map +0 -1
  421. package/dist/skill-templates-N5DU5FNX.js +0 -5
  422. package/dist/skill-templates-N5DU5FNX.js.map +0 -1
  423. package/dist/src-XJ6YXNAF.js +0 -15030
  424. package/dist/src-XJ6YXNAF.js.map +0 -1
  425. package/templates/apps/android-app/.env.hbs +0 -3
  426. package/templates/apps/android-app/messages/en-US.json +0 -24
  427. package/templates/apps/android-app/messages/zh-CN.json +0 -24
  428. package/templates/apps/android-app/src/lib/api.ts.hbs +0 -30
  429. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -42
  430. package/templates/apps/android-app/src/routes/+layout.ts +0 -7
  431. package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -27
  432. package/templates/apps/api/src/routes/+layout.svelte +0 -14
  433. package/templates/apps/api/src/routes/+page.svelte +0 -11
  434. package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
  435. package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
  436. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
  437. package/templates/base/src/app.css +0 -2
  438. package/templates/base/tsconfig.json +0 -8
@@ -0,0 +1,358 @@
1
+ # hai-capacitor — 详细用法
2
+
3
+ 从 [SKILL.md](SKILL.md) 选择主题后读取对应小节。代码片段展示 API 用法;省略的业务变量、schema、依赖与 return 上下文需由应用补齐。
4
+
5
+ > `@h-ai/capacitor` 是 hai-framework 的 Capacitor 原生桥接模块。设备、推送等领域操作返回 `HaiResult<T>`;TokenStorage 是直接 Promise 适配器,失败会拒绝。与 `@h-ai/api-client` 配合时,Token 仅存于原生安全存储,不回退到 Web `localStorage`。
6
+
7
+ ## 运行环境
8
+
9
+ > **浏览器端 / 原生 App 专用。** 在 Capacitor 原生环境(Android/iOS)中提供完整能力;`createCapacitorTokenStorage()` 仅在原生环境持久化 token,纯 Web 不做不安全回退。`capacitor.preferences` 仍可用于普通偏好数据。
10
+
11
+ ## 适用场景
12
+
13
+ - Android/iOS 原生应用开发(Svelte 5 + Vite + Capacitor)
14
+ - Token 安全存储(`@aparajita/capacitor-secure-storage`)
15
+ - 设备信息获取(平台、型号、版本)
16
+ - 推送通知注册与监听(FCM / APNs)
17
+ - 原生相机拍照 / 相册选取
18
+ - 状态栏配置(沉浸式、颜色、样式)
19
+
20
+ ## 使用步骤
21
+
22
+ ### 1. 初始化与关闭
23
+
24
+ ```typescript
25
+ import { capacitor } from '@h-ai/capacitor'
26
+
27
+ // 应用启动时初始化(检测 Capacitor 环境可用性)
28
+ const result = await capacitor.init()
29
+ if (!result.success) {
30
+ // result.error.code === HaiCapacitorError.NOT_AVAILABLE.code
31
+ // 非 Capacitor 环境(纯 Web)
32
+ }
33
+
34
+ // 检查状态
35
+ capacitor.isInitialized // boolean
36
+ capacitor.getPlatform() // 'android' | 'ios' | 'web'
37
+ capacitor.isNative() // true = 原生 App
38
+
39
+ // 关闭模块(重置状态)
40
+ await capacitor.close()
41
+ ```
42
+
43
+ ### 2. Token 安全存储(与 api-client 配合)
44
+
45
+ 先复用应用已有的 API 初始化入口。示例中的 `apiBase` 由应用解析公开运行配置,已经包含 API 前缀,不重复拼接 `/api/v1`。Web 部署可通过 `runtime-config.js` 覆盖地址;原生包在复制静态资源前设置公开配置。
46
+
47
+ ```typescript
48
+ import { apiClient } from '@h-ai/api-client'
49
+ import { createCapacitorTokenStorage } from '@h-ai/capacitor'
50
+
51
+ await apiClient.init({
52
+ baseUrl: apiBase,
53
+ auth: {
54
+ storage: createCapacitorTokenStorage(),
55
+ },
56
+ })
57
+ ```
58
+
59
+ `createCapacitorTokenStorage()` 返回 `TokenStorage` 实例(兼容 `@h-ai/api-client`),底层使用 `@aparajita/capacitor-secure-storage`:
60
+
61
+ - Android → Android KeyStore + 加密 SharedPreferences
62
+ - iOS → Keychain
63
+ - Web → **不提供原生存储回退**;适配器方法拒绝 Promise,Web 入口选择 api-client 的 Cookie/内存存储
64
+
65
+ 读取、保存与删除失败均拒绝 Promise。调用方通过 `apiClient.auth` 串行更新凭据并捕获 setTokens/clear 失败;界面释放 loading,退出失败仍清理内存身份并提示错误。`clear()` 开始立即屏蔽本实例两类旧凭据,等待两个删除都结束;即使失败也保持屏蔽,相应 key 成功写入后重新开放。屏蔽不等于持久删除,跨实例/重启撤销仍依赖服务端退出/撤销会话。插件恢复后可以在同一实例重试,不缓存永久失败状态。
66
+
67
+ 任一 key 写入失败也会屏蔽整对凭据,避免 access 已落盘而 refresh 保存失败后的半完成登录。登录/注册保存失败后尝试 `auth.clear()` 清理部分数据;清理失败继续显示未确认删除的错误,不能只清界面身份或宣称持久删除成功。
68
+
69
+ #### Preferences 子操作
70
+
71
+ ```typescript
72
+ import { capacitor } from '@h-ai/capacitor'
73
+
74
+ // 返回 HaiResult<string | null>
75
+ const result = await capacitor.preferences.get('my_key')
76
+ if (result.success) {
77
+ // result.data — 值或 null
78
+ }
79
+
80
+ await capacitor.preferences.set('my_key', 'value')
81
+ await capacitor.preferences.remove('my_key')
82
+ ```
83
+
84
+ ### 3. 设备信息
85
+
86
+ ```typescript
87
+ import { capacitor } from '@h-ai/capacitor'
88
+
89
+ const info = await capacitor.device.getInfo()
90
+ if (info.success) {
91
+ info.data.platform // 'android' | 'ios' | 'web'
92
+ info.data.model // 'Pixel 7'
93
+ info.data.osVersion // '14'
94
+ info.data.manufacturer // 'Google'
95
+ info.data.isVirtual // false
96
+ }
97
+
98
+ const version = await capacitor.device.getAppVersion()
99
+ if (version.success) {
100
+ version.data.version // '1.0.0'
101
+ version.data.build // '42'
102
+ }
103
+ ```
104
+
105
+ ### 4. 推送通知
106
+
107
+ ```typescript
108
+ import { capacitor } from '@h-ai/capacitor'
109
+
110
+ // 注册推送(请求权限 + 获取设备 Token)
111
+ const reg = await capacitor.push.register()
112
+ if (reg.success) {
113
+ // 将 reg.data.token 上报给后端
114
+ await api.post('/push/register', { token: reg.data.token })
115
+ }
116
+
117
+ // 监听推送事件(返回 HaiResult 包裹的 async 清理函数)
118
+ const listenResult = await capacitor.push.listen({
119
+ onReceived: (notification) => {
120
+ // 前台收到推送
121
+ // notification: { id, title?, body?, data? }
122
+ },
123
+ onActionPerformed: (notification) => {
124
+ // 用户点击推送
125
+ },
126
+ })
127
+
128
+ // 停止监听
129
+ if (listenResult.success) {
130
+ await listenResult.data()
131
+ }
132
+ ```
133
+
134
+ ### 5. 相机
135
+
136
+ ```typescript
137
+ import { capacitor } from '@h-ai/capacitor'
138
+
139
+ const photo = await capacitor.camera.takePhoto({
140
+ quality: 80, // 0-100
141
+ source: 'camera', // 'camera' | 'photos' | 'prompt'
142
+ resultType: 'base64', // 'uri' | 'base64' | 'dataUrl'
143
+ width: 800, // 最大宽度(可选)
144
+ height: 600, // 最大高度(可选)
145
+ })
146
+
147
+ if (photo.success) {
148
+ const imgSrc = `data:image/${photo.data.format};base64,${photo.data.data}`
149
+ }
150
+ ```
151
+
152
+ ### 6. 状态栏
153
+
154
+ ```typescript
155
+ import { capacitor } from '@h-ai/capacitor'
156
+
157
+ await capacitor.statusBar.configure({
158
+ backgroundColor: '#ffffff',
159
+ style: 'dark', // 'dark' | 'light' | 'default'(文字颜色)
160
+ overlay: true, // 沉浸式
161
+ })
162
+
163
+ await capacitor.statusBar.hide()
164
+ await capacitor.statusBar.show()
165
+ ```
166
+
167
+ ## 核心 API
168
+
169
+ | API | 用途 | 返回值 |
170
+ | --- | --- | --- |
171
+ | `capacitor.init()` | 初始化模块(检测环境) | `HaiResult<void>` |
172
+ | `capacitor.close()` | 关闭模块并回收推送,失败可重试 | `Promise<HaiResult<void>>` |
173
+ | `capacitor.getPlatform()` | 获取当前平台 | `'android' \| 'ios' \| 'web'` |
174
+ | `capacitor.isNative()` | 是否为原生环境 | `boolean` |
175
+ | `capacitor.isInitialized` | 是否已初始化 | `boolean` |
176
+ | `createCapacitorTokenStorage()` | 创建 Token 存储 | `TokenStorage`(兼容 api-client) |
177
+ | `capacitor.preferences.get(key)` | 安全读取 Preference | `HaiResult<string \| null>` |
178
+ | `capacitor.preferences.set(key, value)` | 安全写入 Preference | `HaiResult<void>` |
179
+ | `capacitor.preferences.remove(key)` | 安全删除 Preference | `HaiResult<void>` |
180
+ | `capacitor.device.getInfo()` | 设备信息 | `HaiResult<DeviceInfo>` |
181
+ | `capacitor.device.getAppVersion()` | 应用版本 | `HaiResult<{ version, build }>` |
182
+ | `capacitor.push.register()` | 注册推送 | `HaiResult<PushRegistration>` |
183
+ | `capacitor.push.listen(callbacks)` | 监听推送事件 | `HaiResult<PushCleanup>`(cleanup 返回 `Promise<HaiResult<void>>`) |
184
+ | `capacitor.camera.takePhoto(options?)` | 拍照 / 选取图片 | `HaiResult<PhotoResult>` |
185
+ | `capacitor.statusBar.configure(config)` | 配置状态栏 | `HaiResult<void>` |
186
+ | `capacitor.statusBar.show()` | 显示状态栏 | `HaiResult<void>` |
187
+ | `capacitor.statusBar.hide()` | 隐藏状态栏 | `HaiResult<void>` |
188
+
189
+ ## 错误码 — `HaiCapacitorError`
190
+
191
+ | 错误码 | code | 说明 |
192
+ | -------------------------------------------- | ---------------------- | -------------------- |
193
+ | `HaiCapacitorError.INIT_FAILED` | `hai:capacitor:001` | 初始化失败 |
194
+ | `HaiCapacitorError.NOT_AVAILABLE` | `hai:capacitor:002` | Capacitor 不可用 |
195
+ | `HaiCapacitorError.INIT_IN_PROGRESS` | `hai:capacitor:003` | 正在初始化中 |
196
+ | `HaiCapacitorError.NOT_INITIALIZED` | `hai:capacitor:010` | 模块未初始化 |
197
+ | `HaiCapacitorError.PREFERENCES_GET_FAILED` | `hai:capacitor:011` | Preferences 读取失败 |
198
+ | `HaiCapacitorError.PREFERENCES_SET_FAILED` | `hai:capacitor:012` | Preferences 写入失败 |
199
+ | `HaiCapacitorError.PREFERENCES_REMOVE_FAILED`| `hai:capacitor:013` | Preferences 删除失败 |
200
+ | `HaiCapacitorError.DEVICE_INFO_FAILED` | `hai:capacitor:020` | 获取设备信息失败 |
201
+ | `HaiCapacitorError.APP_VERSION_FAILED` | `hai:capacitor:021` | 获取应用版本失败 |
202
+ | `HaiCapacitorError.PUSH_REGISTER_FAILED` | `hai:capacitor:030` | 推送注册失败 |
203
+ | `HaiCapacitorError.PUSH_LISTEN_FAILED` | `hai:capacitor:031` | 推送监听失败 |
204
+ | `HaiCapacitorError.CAMERA_FAILED` | `hai:capacitor:040` | 拍照/相册失败 |
205
+ | `HaiCapacitorError.STATUS_BAR_FAILED` | `hai:capacitor:050` | 状态栏配置失败 |
206
+
207
+ ## 常见模式
208
+
209
+ ### Mobile App 标准初始化
210
+
211
+ ```typescript
212
+ // src/lib/capacitor.ts
213
+ import { capacitor } from '@h-ai/capacitor'
214
+
215
+ export async function initCapacitor() {
216
+ const result = await capacitor.init()
217
+ if (!result.success) {
218
+ return
219
+ }
220
+
221
+ if (capacitor.isNative()) {
222
+ await capacitor.statusBar.configure({
223
+ backgroundColor: '#ffffff',
224
+ style: 'light',
225
+ overlay: false,
226
+ })
227
+ }
228
+ }
229
+ ```
230
+
231
+ ```svelte
232
+ <!-- src/App.svelte -->
233
+ <script lang='ts'>
234
+ import { onMount } from 'svelte'
235
+ import { initCapacitor } from './lib/capacitor'
236
+
237
+ onMount(() => { initCapacitor() })
238
+ </script>
239
+ ```
240
+
241
+ ### SPA 模式配置(必需)
242
+
243
+ Capacitor 原生壳读取 `webDir` 指定的静态产物。纯 Vite 模板默认为 `dist`;SvelteKit 项目需配置静态适配器,输出可能是 `build`。构建器、容器与 `webDir` 必须一致,以下是 Vite 示例:
244
+
245
+ ```typescript
246
+ // capacitor.config.ts
247
+ import type { CapacitorConfig } from '@capacitor/cli'
248
+
249
+ const config: CapacitorConfig = {
250
+ appId: 'com.example.app',
251
+ appName: 'Example App',
252
+ webDir: 'dist',
253
+ }
254
+
255
+ export default config
256
+ ```
257
+
258
+ ### Token 存储 + 认证流程
259
+
260
+ ```typescript
261
+ // src/lib/api.ts
262
+ import { apiClient } from '@h-ai/api-client'
263
+ import { createCapacitorTokenStorage } from '@h-ai/capacitor'
264
+
265
+ export async function initApi(apiBase: string) {
266
+ return apiClient.init({
267
+ baseUrl: apiBase,
268
+ auth: {
269
+ storage: createCapacitorTokenStorage(),
270
+ },
271
+ })
272
+ }
273
+
274
+ export { apiClient }
275
+ ```
276
+
277
+ ### 推送通知完整流程
278
+
279
+ ```typescript
280
+ import { capacitor } from '@h-ai/capacitor'
281
+
282
+ export async function setupPush() {
283
+ if (!capacitor.isNative()) {
284
+ return
285
+ }
286
+
287
+ const reg = await capacitor.push.register()
288
+ if (!reg.success) {
289
+ return
290
+ }
291
+
292
+ // 上报 Token 给后端
293
+ await api.post('/push/register', {
294
+ token: reg.data.token,
295
+ platform: capacitor.getPlatform(),
296
+ })
297
+
298
+ // 监听推送
299
+ const listenResult = await capacitor.push.listen({
300
+ onReceived: (n) => {
301
+ // 前台通知处理
302
+ },
303
+ onActionPerformed: (n) => {
304
+ // 用户点击跳转
305
+ },
306
+ })
307
+ }
308
+ ```
309
+
310
+ ### 拍照上传
311
+
312
+ ```typescript
313
+ import { capacitor } from '@h-ai/capacitor'
314
+
315
+ async function captureAndUpload() {
316
+ const photo = await capacitor.camera.takePhoto({
317
+ source: 'camera',
318
+ resultType: 'base64',
319
+ quality: 80,
320
+ width: 1024,
321
+ })
322
+
323
+ if (!photo.success) {
324
+ return
325
+ }
326
+
327
+ // 上传 base64 给后端
328
+ await api.post('/files/upload', {
329
+ data: photo.data.data,
330
+ format: photo.data.format,
331
+ })
332
+ }
333
+ ```
334
+
335
+ ## 插件依赖
336
+
337
+ | 插件 | 类型 | 用于 |
338
+ | --- | --- | --- |
339
+ | `@capacitor/core` | peerDependency(必需) | 核心运行时 |
340
+ | `@aparajita/capacitor-secure-storage` | 可选 peerDependency(原生 token 存储必需) | `createCapacitorTokenStorage()` |
341
+ | `@capacitor/preferences` | peerDependency(必需) | `capacitor.preferences.*` 普通偏好数据 |
342
+ | `@capacitor/device` | 可选 | `getDeviceInfo()` |
343
+ | `@capacitor/app` | 可选 | `getAppVersion()` |
344
+ | `@capacitor/push-notifications` | 可选 | `registerPush()` / `listenPush()` |
345
+ | `@capacitor/camera` | 可选 | `takePhoto()` |
346
+ | `@capacitor/status-bar` | 可选 | `configureStatusBar()` / `show/hide` |
347
+
348
+ 可选插件未安装时,对应 API 调用会返回 `err`(动态 import 失败被 catch)。
349
+
350
+ ## 相关 Skills
351
+
352
+ - `hai-api-client`:HTTP 客户端(Token 管理依赖 capacitor 存储)
353
+ - `hai-iam`:认证流程(登录获取 Token → 存储到 Capacitor)
354
+ - `hai-ui`:移动端 UI 组件(SafeArea、BottomNav 等)
355
+
356
+ 原生交付必须单独执行 Tauri/Gradle/Xcode 打包,并在目标 OS/设备验证安装启动、登录/退出、重启会话、安全 TokenStore、真实 API 域名与覆盖升级。Web 构建/E2E 不代替原生验收。保存提交、包 hash、平台/工具链及逐项结果;缺平台写未验证,禁止静默 skip。hai-framework 仓库参考 `.github/workflows/native.yml` 与 desktop-app / mobile-app README 的「原生交付与验收」章节。
357
+
358
+ 推送仅在实际原生平台调用插件。`push.register({ signal? })` 与 `push.listen(callbacks, { signal? })` 的设置阶段限时 30 秒(包含权限和监听器挂载);失败、超时、取消及 `capacitor.close()` 都会停止回调并移除本次拥有的句柄,迟到的句柄在完成后立即移除,不调用影响其他消费者的 removeAllListeners。listen 成功后信号仍有效,也可调用返回的 cleanup。cleanup 与 close 均返回 `HaiResult<void>`;原生 remove 失败返回 `PUSH_CLEANUP_FAILED`(`capacitor:032`),失败句柄保留供再次调用重试,成功移除的句柄不重复操作。模块关闭后立即不可用;重新初始化前先重试遗留清理。自动化验证控制插件时序,不能代替 Android/iOS 真机 FCM/APNs 权限、注册与反复挂载验收。
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: hai-change-plan
3
+ description: "框架增删改涉及数据结构、配置、核心流程或模块边界时,先说明方案与影响,等待用户决定后实施。"
4
+ ---
5
+
6
+ # 变更影响与方案确认
7
+
8
+ ## 能力契约
9
+
10
+ | 项目 | 契约 |
11
+ | --- | --- |
12
+ | 能力 | 将框架变更整理成维护者看得懂、能作决定的方案,并跟踪同步与验证 |
13
+ | 适用场景 | 新增、修改、删除框架功能,或修复中发现需要改变结构、配置、核心流程、模块边界 |
14
+ | 输入 | 用户目标、当前实现与调用方、现有配置和文档、已确认方案及授权 |
15
+ | 输出 | 简明方案、具体影响、用户决定、同步清单和验证结果 |
16
+ | 限制 | 未确认的重要变更先停在方案;普通业务私有实现不因此扩大成框架改造,已确认且未扩大的方案不重复确认 |
17
+
18
+ ## 何时先提方案
19
+
20
+ 发现以下任一实际变化,在修改对应实现、配置或模板之前说明方案,**等待用户明确同意推进**:
21
+
22
+ - `type`、`interface`、Schema 等结构的字段、形状或语义改变,包括新增、删除及会改变执行方式的内部结构。
23
+ - 模块配置或环境变量的名称、位置、默认值、可选/必填、校验、优先级、安全含义改变。
24
+ - 初始化/关闭、请求处理、认证授权、数据读写、并发重试、部署/恢复等核心流程改变。
25
+ - 模块职责、依赖关系、公开入口、调用方式或跨模块返回值/错误契约改变。
26
+
27
+ 先查源码、调用方和运行证据,给出足以决定的具体方案;不要只说“重构一下”“优化架构”。只读分析、现状复现及不改变上述边界的准备工作可以继续,不能先落地再要求追认。已有“修复”“按最佳方案”等一般授权,不代替尚未说明的重要方案;用户已明确指定并同意的具体方案无需重问。执行中出现新的重要影响,只确认新增部分。
28
+
29
+ 纯格式、注释纠错、翻译修正,或不改变上述结构与边界的内部修复,按已有授权继续;先简述实际影响即可。拿不准时说明具体不确定项,不为假设风险引入审批。
30
+
31
+ ## 怎样说明
32
+
33
+ 先用一两句话说明结论,再按实际复杂度交代:
34
+
35
+ 1. **为什么改、改成什么**:当前场景有什么问题,使用前后有什么变化。
36
+ 2. **影响谁**:涉及哪些模块、应用、CLI 模板和调用方;旧配置、数据、部署是否需要调整。
37
+ 3. **如何同步与验证**:需要更新哪些文档、注释、示例与测试;如何确认生效,失败如何恢复。
38
+ 4. **请用户决定**:给出推荐方案;确有取舍时列少量可行选项,并说明代价。
39
+
40
+ 技术名词和必要路径用于支持判断,避免堆文件清单与过程日志。简单变化一小段即可,复杂变化再分层。区分已确认事实、待验证假设、拟实施及已完成;明确哪些部分尚未获准,不把等待写成完成。
41
+
42
+ ## 确认后成套维护
43
+
44
+ 在当前任务记录中保存决定和影响范围,不额外创建重复台账。按[沟通与同步维护](../hai-app-create/collaboration.md)逐项核对相关 README(已有中英日版同步)、环境变量与模块配置项、`docs/` 使用说明、GitHub Pages 的内容源/导航/图片、注释与类型说明、调用方、测试和 CLI 模板。每项注明已同步,或不适用及原因。
45
+
46
+ GitHub Pages 由文档源构建时修改源文件,不手改生成产物;配置示例按真实默认值与覆盖顺序核对,界面截图来自当前实际操作。按受影响范围验证,报告实际执行、复用与未验证边界。若实现与获准方案不同,先说明差异并重新确认新增影响。
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: hai-ci
3
+ description: "维护 hai 应用的 CI/CD、GitHub Actions、质量门禁和凭据泄漏扫描。"
4
+ ---
5
+
6
+ # hai-ci — CI/CD 与质量门禁规范
7
+
8
+ ## 能力契约
9
+
10
+ | 项目 | 契约 |
11
+ | --- | --- |
12
+ | 能力 | 维护 hai 应用的 CI/CD、GitHub Actions、质量门禁和凭据泄漏扫描 |
13
+ | 适用场景 | 应用 CI/CD 和质量门禁维护 |
14
+ | 输入 | 现有 workflow、package scripts、权限和发布策略 |
15
+ | 输出 | 可执行工作流与检查结果 |
16
+ | 限制 | 默认验证真实 npm 依赖;最小 workflow 权限,不向不可信 PR 暴露 secret,未经授权不发布。 |
17
+
18
+ > 面向 AI 助手和团队成员的仓库自动化指南。目标是让每个 PR 都能被机器稳定验证,同时避免把 secrets 暴露给不可信 PR 或第三方 Action。
19
+
20
+ ## 适用场景
21
+
22
+ - 新增或修改 `.github/workflows/**`
23
+ - 配置 `pnpm typecheck`、`pnpm lint`、`pnpm test`、`pnpm build`、E2E
24
+ - 调整 secret scan、依赖扫描、安全扫描、release workflow 编排
25
+ - 设计 required checks 的 CI 状态、workflow 权限、触发条件与 concurrency
26
+ - 排查 CI flaky、缓存、矩阵构建或执行顺序问题
27
+
28
+ 不负责:PR 人工审查流程(用 `hai-pr-review`)、测试用例设计(用 `hai-app-tests`)、代码质量审查(用 `hai-app-review`)、云资源开通与应用部署 API(用 `hai-deploy`)。
29
+
30
+ ## 核心原则
31
+
32
+ 1. **确定性检查优先**:CI 只负责可重复的机器检查;测试内容设计交给 `hai-app-tests`,代码规范判断交给 `hai-app-review`。
33
+ 2. **最小权限**:默认 `permissions: contents: read`,只有 release、comment、pages 等明确场景才提升权限。
34
+ 3. **PR 不使用 secrets**:来自 fork 或不可信分支的 PR 不得运行读取 secrets 的 workflow。
35
+ 4. **禁用高风险组合**:禁止 `pull_request_target` + checkout PR 代码 + secrets/写权限。
36
+ 5. **按风险选择门禁**:核心 CI 必须稳定;E2E、发布、安全深扫可拆为独立 workflow,但关键权限/数据完整性路径不能因不稳定而长期没有验收。
37
+ 6. **可追溯**:workflow 改动必须说明触发条件、权限、缓存、失败路径和验证命令。
38
+
39
+ ## 标准 CI 工作流
40
+
41
+ ### PR / main 基础质量门禁
42
+
43
+ 建议顺序:
44
+
45
+ ```bash
46
+ pnpm install --frozen-lockfile
47
+ pnpm typecheck
48
+ pnpm lint
49
+ pnpm build
50
+ pnpm test
51
+ ```
52
+
53
+ 从当前 package.json 确认实际 scripts,使用声明的最低 Node 版本验证并与 engines/README 同步;PowerShell 使用 `pnpm.cmd`。测试内容由 `hai-app-tests` 定义;本技能决定门禁如何稳定执行。
54
+
55
+ AI 本地验收和排查按 [分轮验证与集中修复](../hai-app-tests/validation.md) 收集所有可执行结果,再集中修复;普通失败不立即从头重跑。独立 CI job 可继续收集结果,真实前置失败则阻塞其依赖 job;必需检查与发布步骤仍须全部成功,不以继续收集为由设置 `continue-on-error` 或放行失败。
56
+
57
+ lint/typecheck 只能执行已配置的规则。新增开发规范时区分可静态检测项(如显式 any/console.log)与必须行为验收项(如资源越权、事务/幂等、失败结果、生命周期清理),后者在适用单元/集成/E2E 中验证。禁止通过关闭规则、添加无依据忽略或把 `|| true` 加到门禁来“统一风格”。
58
+
59
+ ### E2E 策略
60
+
61
+ - 若 E2E 稳定且耗时可控,可作为 required check。
62
+ - 若 E2E 依赖浏览器、服务、密钥或容易 flaky,先放到 `workflow_dispatch` / `schedule` / 独立 job。
63
+ - 应用级 E2E 使用:`pnpm --filter <app> test:e2e`。
64
+
65
+ ### hai-framework 依赖策略
66
+
67
+ - CI 默认使用 `pnpm-lock.yaml` 中的 npm/published 依赖,确保与真实安装环境一致。
68
+ - 本地联调先查项目是否定义 `framework:use:local` / `framework:watch`;没有时按本项目 README 操作,不要让默认 PR CI 隐式依赖本机路径。
69
+ - 需要验证本地 framework 改动时,创建显式的 sync/drift check 或双仓联动 PR。
70
+
71
+ ## GitHub Actions 安全清单
72
+
73
+ - [ ] workflow 顶层声明 `permissions`
74
+ - [ ] PR workflow 使用 `pull_request`,不用 `pull_request_target`
75
+ - [ ] 不在 PR workflow 中读取 secrets
76
+ - [ ] 第三方 action 固定版本;高风险 action 优先改为本地脚本或官方 action
77
+ - [ ] 使用 `concurrency` 取消同分支旧任务
78
+ - [ ] 不在 CI 日志打印 token、cookie、连接串、`.env` 内容
79
+ - [ ] release workflow 独立提权,只在 main/tag/manual 触发
80
+ - [ ] 失败日志可定位,不吞错、不 `|| true` 掩盖核心质量门禁
81
+
82
+ ## Secret scan 策略
83
+
84
+ ### 推荐
85
+
86
+ - 用无 secrets 的高置信正则扫描常见密钥形态。
87
+ - 技能/文档与配置同样可能泄漏凭据,不按目录整体排除;只对已确认的测试占位和固定误报做有依据的最小忽略,检查修改是否掩盖真实密钥。
88
+ - 需要私有关键词表时,仅在受信任分支的独立 workflow 中运行,不对 fork PR 暴露。
89
+
90
+ ### 禁止
91
+
92
+ - ❌ `pull_request_target` 中 checkout 不可信 PR 代码后读取 `secrets.*`
93
+ - ❌ 把完整密钥关键词列表传给未知第三方 action
94
+ - ❌ 为了通过扫描而删除失败证据或扩大忽略范围
95
+
96
+ ## Workflow 变更交付清单
97
+
98
+ 修改 CI/CD 时,PR 描述必须包含:
99
+
100
+ - 触发条件:`pull_request` / `push` / `workflow_dispatch` / `schedule`
101
+ - 权限:顶层和 job 级 `permissions`
102
+ - 执行命令:每个 job 的核心命令
103
+ - 安全影响:是否读取 secrets、是否写仓库、是否评论 PR
104
+ - 验证方式:本地命令或 GitHub Actions dry run 结果
105
+
106
+ ## 相关 Skills
107
+
108
+ - `hai-build` — 项目结构与质量门禁总览
109
+ - `hai-app-tests` — Vitest / Playwright 测试规范
110
+ - `hai-pr-review` — PR 审查与 AI Review 策略
111
+ - `hai-deploy` — 应用部署与云服务开通
112
+ - `hai-framework-sync` — 框架版本升级、差异分析与 npm/本地同步
113
+
114
+ 涉及发布时按本应用实际 registry/镜像/部署目标核验精确版本与提交,不以 tag 或 CI 绿灯代替发布产物;未经授权不发布。原生/容器交付按当前项目入口单独构建与启动验收,保存产物、平台和行为证据;缺平台写未验证,Web E2E 不代替原生验收。