@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,353 @@
1
+ # hai-build — 详细用法
2
+
3
+ 从 [SKILL.md](SKILL.md) 选择主题后读取对应小节。代码片段展示 API 用法;省略的业务变量、schema、依赖与 return 上下文需由应用补齐。
4
+
5
+ 应用 Node/工具链要求以当前 `package.json.engines`、lockfile 与 CI 为准。使用 Turbo 时核对影响产物的环境变量、共享配置和模式切换清理策略,并验证实际产物;不要假定应用使用框架仓库的 tsup/Turbo 私有脚本。
6
+
7
+ 本技能帮助识别应用架构、依赖和技能。日常开发决策、安全边界与能力选择见 [development.md](../hai-app-create/development.md)。
8
+
9
+ ## 适用场景
10
+
11
+ - 初次接触项目,需要了解整体架构与模块关系
12
+ - 不确定应使用哪个技能来完成任务
13
+ - 需要了解模块初始化顺序与依赖关系
14
+ - 需要执行跨模块操作或全局配置变更
15
+ - 多端构建切换(SSR ↔ SPA ↔ 原生 App)
16
+
17
+ ## 项目架构
18
+
19
+ ### 先辨别当前项目
20
+
21
+ | 架构 | 接口/服务 | UI 与客户端 | 常见位置(以当前项目为准) |
22
+ | --- | --- | --- | --- |
23
+ | SvelteKit | `@h-ai/kit`、文件路由与 server services | Svelte 组件与既有数据加载 | `src/routes/`、`src/lib/server/` |
24
+ | API workspace | `@h-ai/api-contract` + `@h-ai/serv` | 无需页面 | `apps/*-contract`、`apps/*-serv` |
25
+ | fullstack | contract + serv,共享业务结构 | Vite Svelte Web/所选原生前端,typed client | `packages/*-contract`、`packages/*-serv`、`packages/*-shared`、`apps/*` |
26
+ | Vite SPA/原生 | 远端服务 contract | `@h-ai/api-client` 与适用平台适配 | `src/App.svelte`、`src/lib/api.ts` 或 shared 客户端 |
27
+
28
+ 不要从目录名称推断运行环境;沿入口、导入与 scripts 核实。下列 SvelteKit 示例只适用于对应项目。
29
+
30
+ ### 技术栈
31
+
32
+ | 层次 | 技术 |
33
+ | -------- | ------------------------------ |
34
+ | UI | Svelte 5 (Runes);SvelteKit 或 Vite 以项目为准 |
35
+ | 样式 | TailwindCSS 4 + DaisyUI 5 |
36
+ | 语言 | TypeScript 6 / 7 (strict) |
37
+ | 构建 | Vite + tsup |
38
+ | 包管理 | pnpm 12 |
39
+ | 单元测试 | Vitest |
40
+ | E2E 测试 | Playwright |
41
+ | 原生 App | Capacitor / Tauri / 小程序适配按当前项目选择 |
42
+ | 公共 API | oRPC contract + Hono + typed client |
43
+ | 认证 | Bearer access token + httpOnly refresh cookie(浏览器推荐) |
44
+
45
+ pnpm 专属配置放在 `pnpm-workspace.yaml`,`.npmrc` 仅用于注册表与认证。Docker 缓存层使用 `pnpm fetch` 读取锁文件;pnpm 12 的该命令不支持 `--frozen-lockfile`。后续仍通过 `pnpm install --offline --frozen-lockfile` 校验清单与锁文件一致。容器裁剪用 `pnpm pm deploy --filter <服务包> --prod <目标目录>`,确保执行内置命令,避免项目同名 `deploy` 脚本覆盖它。保留 `.gitattributes`,让 `.dockerignore`、Dockerfile 和 POSIX 脚本统一使用 LF,保持跨平台输入一致并确保 Linux 脚本可运行。
46
+
47
+ ### SvelteKit Adapter 模式
48
+
49
+ CLI website模板默认Node SSR。纯展示站点通过`--features none`创建,在compile时使用`HAI_BUILD_STATIC=1`与可选`PUBLIC_BASE_PATH`切换完整静态预渲染,边界见本skill的静态网站说明;该模板没有使用下方VITE_ADAPTER工厂。静态产物用preview本机检查,上传build到Pages/CDN;生成的start/Docker配置属于普通SSR模式,不能用于运行静态HTML。切回SSR只需清除静态开关并重建,PUBLIC_BASE_PATH仍可按实际网站目录用于SSR或Docker;SvelteKit/Vite差异、制品格式和健康检查见[网站挂载目录](paths.md)。
50
+
51
+ 仅在项目实际使用 SvelteKit 和 `@h-ai/kit/adapter` 时使用;Vite SPA 不配置 SvelteKit adapter,fullstack 各前端按自身 scripts 构建。
52
+
53
+ | 模式 | Adapter | 认证方式 | 部署目标 |
54
+ | ------- | -------------- | --------------------- | ----------------------- |
55
+ | SSR Web | adapter-node | 项目现有 Cookie/会话管道 | Node.js 服务器 |
56
+ | SPA | adapter-static | Bearer access token + httpOnly refresh cookie | CDN / 静态托管 |
57
+ | Android | adapter-static | Bearer access token + Capacitor secure storage | Capacitor → Android APK |
58
+ | iOS | adapter-static | Bearer access token + Capacitor secure storage | Capacitor → iOS IPA |
59
+
60
+ **Adapter 切换**:
61
+
62
+ ```typescript
63
+ // svelte.config.js — 使用 kit 提供的 createAdapter
64
+ import { createAdapter } from '@h-ai/kit/adapter'
65
+
66
+ const config = {
67
+ kit: {
68
+ adapter: await createAdapter(), // 异步加载对应适配器,必须等待完成
69
+ },
70
+ }
71
+ ```
72
+
73
+ - `VITE_ADAPTER=node`(默认)→ adapter-node(SSR)
74
+ - `VITE_ADAPTER=static` → adapter-static(SPA / 原生 App)
75
+
76
+ ### SvelteKit 目录示例
77
+
78
+ ```
79
+ 项目根/
80
+ config/ # 模块配置(YAML)
81
+ _core.yml # Core 配置(必须)
82
+ _db.yml # DB 配置(按需)
83
+ _cache.yml # Cache 配置(按需)
84
+ _iam.yml # IAM 配置(按需)
85
+ _storage.yml # Storage 配置(按需)
86
+ _ai.yml # AI 配置(按需)
87
+ src/
88
+ app.html # HTML 入口
89
+ app.d.ts # 全局类型声明
90
+ hooks.server.ts # 服务端 Hook(模块初始化 + 请求管道)
91
+ lib/
92
+ api.ts # @h-ai/api-client 初始化(SPA / 原生 App 使用)
93
+ capacitor.ts # Capacitor 初始化(原生 App)
94
+ server/
95
+ init.ts # 模块初始化入口(单例,SSR)
96
+ paraglide/ # i18n 生成文件(禁止手动修改)
97
+ components/ # 应用组件
98
+ routes/
99
+ +layout.svelte # 根布局
100
+ +page.svelte # 首页
101
+ (auth)/ # 认证相关页面组
102
+ api/ # API 端点
103
+ v1/ # API v1 版本
104
+ payment/ # 支付端点(按需)
105
+ static/ # 静态资源
106
+ messages/ # i18n 翻译文件
107
+ capacitor.config.ts # Capacitor 配置(原生 App)
108
+ ```
109
+
110
+ ### 模块依赖图
111
+
112
+ ```
113
+ core(基础能力:配置、日志、i18n、HaiResult)
114
+ ├── crypto(加密:SM2/SM3/SM4)
115
+ ├── reldb(数据库:SQLite/PostgreSQL/MySQL)
116
+ ├── cache(缓存:内存/Redis)
117
+ ├── storage(存储:本地/S3)
118
+ ├── ai(AI:LLM/MCP/Agent)
119
+ ├── iam(身份管理)← 依赖 crypto + reldb + cache
120
+ ├── payment(支付)← 依赖 reldb + crypto
121
+ ├── api-contract(公共 HTTP API 契约)← 纯定义,依赖 core + zod + oRPC contract
122
+ ├── serv(Hono + oRPC API Service)← 依赖 api-contract;features 按需依赖 iam/storage/ai
123
+ ├── kit(SvelteKit 集成)← Hook / guard / validate / response,不定义公共 contract
124
+ ├── api-client(typed API 客户端)← 依赖 api-contract + oRPC client
125
+ ├── capacitor(原生能力)← 纯浏览器端
126
+ └── ui(UI 组件库)← 依赖 core
127
+ ```
128
+
129
+ 这是常见关联;具体配置/依赖以所选模块当前版本为准。其它能力(reach/audit/scheduler/datapipe/vecdb)及同模块 feature 的任务导航见 [需求能力表](../hai-app-create/development.md#将需求映射到现有能力)。
130
+
131
+ ### 模块初始化顺序
132
+
133
+ #### SSR 模式(hooks.server.ts)
134
+
135
+ 在 `src/lib/server/init.ts` 中按依赖顺序初始化:
136
+
137
+ ```typescript
138
+ import { core } from '@h-ai/core'
139
+ import { cache, CacheConfigSchema } from '@h-ai/cache'
140
+ import { reldb, ReldbConfigSchema } from '@h-ai/reldb'
141
+ import { iam, IamConfigSchema } from '@h-ai/iam'
142
+
143
+ // 放入应用已有的启动函数;并发防护和关闭钩子复用当前模板。
144
+ core.init({ configDir: './config' })
145
+ const dbConfig = core.config.validate('db', ReldbConfigSchema)
146
+ if (!dbConfig.success) return dbConfig
147
+ const cacheConfig = core.config.validate('cache', CacheConfigSchema)
148
+ if (!cacheConfig.success) return cacheConfig
149
+ const iamConfig = core.config.validate('iam', IamConfigSchema)
150
+ if (!iamConfig.success) return iamConfig
151
+ const db = await reldb.init(dbConfig.data)
152
+ if (!db.success) return db
153
+ const cached = await cache.init(cacheConfig.data)
154
+ if (!cached.success) {
155
+ const cleanup = await reldb.close()
156
+ return cleanup.success ? cached : cleanup
157
+ }
158
+ const identity = await iam.init(iamConfig.data)
159
+ if (!identity.success) {
160
+ const cacheCleanup = await cache.close()
161
+ const dbCleanup = await reldb.close()
162
+ if (!cacheCleanup.success) return cacheCleanup
163
+ if (!dbCleanup.success) return dbCleanup
164
+ return identity
165
+ }
166
+ // 应用结束时 await iam.close()、cache.close()、reldb.close();
167
+ // 检查关闭结果;core 无 close,kit/api-contract/serv 不需要 init。
168
+ ```
169
+
170
+ #### SPA / 原生 App 模式(已有 api.ts 或 shared 客户端)
171
+
172
+ 复用当前项目初始化函数、API base 运行时配置和 TokenStorage;以下仅展示浏览器 Cookie 模式。原生端按 `hai-api-client` / `hai-capacitor` 配置安全存储,不用 localStorage 持久化敏感 token。
173
+
174
+ ```typescript
175
+ import { apiClient } from '@h-ai/api-client'
176
+
177
+ export async function initApi() {
178
+ return apiClient.init({
179
+ baseUrl: configuredApiBase, // 来自当前项目已校验的运行时配置
180
+ auth: {}, // 浏览器默认 httpOnly cookie;原生 App 传入 Capacitor TokenStorage
181
+ timeout: 15_000,
182
+ })
183
+ }
184
+
185
+ export { apiClient }
186
+ ```
187
+
188
+ #### 原生 App 追加初始化(src/lib/capacitor.ts)
189
+
190
+ ```typescript
191
+ import { capacitor } from '@h-ai/capacitor'
192
+
193
+ export async function initCapacitor() {
194
+ const initialized = await capacitor.init()
195
+ if (!initialized.success) return initialized
196
+ return capacitor.statusBar.configure({ style: 'dark' })
197
+ }
198
+ ```
199
+
200
+ ### 配置文件格式
201
+
202
+ 所有模块配置使用 YAML 保存默认值;`HAI_<配置名>_<YAML 路径>` 环境变量
203
+ 自动覆盖对应叶子项,且优先级更高:
204
+
205
+ ```yaml
206
+ # config/_core.yml
207
+ name: my-app
208
+ env: development
209
+ logging:
210
+ level: info
211
+ ```
212
+
213
+ 以上字段分别对应 `HAI_CORE_NAME`、`HAI_CORE_ENV`、
214
+ `HAI_CORE_LOGGING_LEVEL`。
215
+
216
+ ## 技能导航
217
+
218
+ 根据任务类型选择正确的技能:
219
+
220
+ ### 模块使用(API 与集成)
221
+
222
+ 先按 [development.md 的需求能力表](../hai-app-create/development.md#将需求映射到现有能力) 匹配需求,再查以下 API 入口;不用通读所有技能。
223
+
224
+ | 任务 | 技能 | 触发关键词 |
225
+ | --------------------- | ---------------- | ------------------------------------------------- |
226
+ | 配置/日志/i18n/HaiResult | `hai-core` | core.init, core.logger, core.config, HaiResult |
227
+ | 数据库操作 | `hai-reldb` | reldb.init, SQL, CRUD, 事务, 分页, DDL |
228
+ | 缓存操作 | `hai-cache` | cache.init, cache.kv.get/set, TTL, Redis |
229
+ | 文件存储 | `hai-storage` | storage.init, 上传, 下载, S3, 本地存储 |
230
+ | 加密/签名/哈希 | `hai-crypto` | crypto.init, SM2, SM3, SM4, 加密, 签名 |
231
+ | 身份认证/授权 | `hai-iam` | iam.init, 登录, 注册, RBAC, Token, Bearer |
232
+ | AI/LLM/MCP | `hai-ai` | ai.init, LLM, MCP, Agent, 工具调用 |
233
+ | 公共 API 契约 | `hai-api-contract` | apiContract.create, contract, schema, oRPC, HaiResult |
234
+ | API Service 运行时 | `hai-serv` | serv.createApp, Hono, procedures, OpenAPI, docs, route guard |
235
+ | SvelteKit 集成 | `hai-kit` | kit.createHandle, guard, middleware, validate, response |
236
+ | UI 组件 | `hai-ui` | 表单, 按钮, 表格, Modal, Toast, 移动端组件 |
237
+ | typed API 客户端 | `hai-api-client` | apiClient.init, typed client, Bearer, 401 refresh, custom fetch |
238
+ | 原生 App 能力 | `hai-capacitor` | capacitor, 相机, 推送, 状态栏, 设备信息 |
239
+ | 支付 | `hai-payment` | payment, 微信支付, 支付宝, Stripe, 订单 |
240
+
241
+ ### 开发流程
242
+
243
+ | 任务 | 技能 | 触发关键词 |
244
+ | ---------------------- | ---------------- | -------------------------------------- |
245
+ | 新增/修改/修复应用功能 | `hai-app-create` | 页面, 组件, API, 模型, 功能修复 |
246
+ | 代码审查与规范化 | `hai-app-review` | 审查, review, 规范, 优化 |
247
+ | 编写/补充测试 | `hai-app-tests` | 测试, test, 单测, 覆盖率, TDD, E2E |
248
+ | CI/CD 与质量门禁 | `hai-ci` | CI, CD, GitHub Actions, workflow, secret scan |
249
+ | PR / Issue 交付审查 | `hai-pr-review` | PR, pull request, issue, CODEOWNERS, 自动 Review, AI Review |
250
+ | hai-framework 升级与同步 | `hai-framework-sync` | 升级框架, 最新版本, 版本差异, skills 同步, npm/local 漂移 |
251
+
252
+ ## 行为开发工作流
253
+
254
+ 新增/改变行为时:先写有意义的目标用例 → 确认因目标行为缺失失败 → 实现 → 通过 → 审查。纯文案、格式和文档变化按影响验证,不机械新增单元与 E2E 测试。
255
+
256
+ ### 完整流程
257
+
258
+ ```
259
+ 需求分析 → 设计测试用例 → 编写测试(Red)→ 运行测试确认失败
260
+ → 编写实现(Green)→ 运行测试确认通过
261
+ → 重构优化(Refactor)→ 运行质量门禁
262
+ ```
263
+
264
+ ### 按阶段使用的技能
265
+
266
+ | 阶段 | 主要技能 | 说明 |
267
+ | ------------------- | ---------------- | ------------------------------------------ |
268
+ | 需求分析 + 测试设计 | `hai-app-tests` | 拆分测试点,确定单元测试与 E2E 测试 |
269
+ | Red:编写测试 | `hai-app-tests` | 编写 Vitest 单元测试 + Playwright E2E 测试 |
270
+ | Green:编写实现 | `hai-app-create` | 按照创建规范编写服务/路由/组件 |
271
+ | Refactor:重构审查 | `hai-app-review` | 代码规范审查、分层检查、日志/i18n 合规 |
272
+
273
+ ### 快速指令
274
+
275
+ ```bash
276
+ # Red:运行测试确认新增目标用例因预期行为缺失而失败(既有回归保持通过)
277
+ pnpm --filter <app-name> test
278
+ pnpm --filter <app-name> test:e2e
279
+
280
+ # Green:运行测试确认全部通过
281
+ pnpm --filter <app-name> test
282
+ pnpm --filter <app-name> test:e2e
283
+
284
+ # Refactor:按下方分轮验证流程收集适用门禁
285
+ pnpm typecheck
286
+ pnpm lint
287
+ pnpm build # 构建/配置/模板/跨包契约变更
288
+ pnpm test
289
+ ```
290
+
291
+ 以上命令按 [分轮验证与集中修复](../hai-app-tests/validation.md) 调度,不在普通失败时立即修改并从头重跑。
292
+
293
+ ## 统一编码规范
294
+
295
+ ### 强制规则
296
+
297
+ - **禁止 `any`**:不确定类型用 `unknown`,在边界处做类型缩窄
298
+ - **禁止 `console.log`**:使用 `core.logger`(trace/debug/info/warn/error/fatal)
299
+ - **禁止硬编码密钥**:使用服务端配置/环境变量;新增变量在 `.env.example` 中写入占位符,PUBLIC/VITE 变量不得包含密钥
300
+ - **禁止无说明的 `as unknown as T`**:必要第三方断言写明依据;代码注释中文、日志英文并脱敏
301
+ - **禁止硬编码用户文案**:所有用户可见文本必须使用 i18n key
302
+ - **禁止修改 `src/lib/paraglide`** 生成文件
303
+
304
+ ### HaiResult 模式
305
+
306
+ 返回 `HaiResult<T>` 的领域操作按以下模式处理;工具、工厂和流式 API 以签名为准:
307
+
308
+ ```typescript
309
+ const result = await reldb.sql.query('SELECT * FROM users')
310
+ if (!result.success) {
311
+ // result.error: { code, message, details? }
312
+ core.logger.error('Query failed', { error: result.error })
313
+ return kit.response.internalError()
314
+ }
315
+ // result.data 可安全使用
316
+ return kit.response.ok(result.data)
317
+ ```
318
+
319
+ ### 质量门禁
320
+
321
+ 按当前项目已定义的 scripts 和变更影响选择检查,执行 [分轮验证与集中修复](../hai-app-tests/validation.md):普通失败先记录,独立检查继续,汇总后集中修复。PowerShell 使用 `pnpm.cmd`:
322
+
323
+ ```bash
324
+ pnpm typecheck # TypeScript 类型检查
325
+ pnpm lint # ESLint 检查
326
+ pnpm build # 构建/配置/模板/跨包契约变更
327
+ pnpm test # Vitest 单元测试
328
+ ```
329
+
330
+ ## 标准工作流
331
+
332
+ ### 变更前:需求分析 + 测试设计
333
+
334
+ 1. 按 development.md 匹配适用框架能力、已有 feature/配置和实际版本,说明必要自定义缺口
335
+ 2. 列出将修改的文件路径
336
+ 3. 确认哪些类型/接口会变
337
+ 4. 搜索确认引用关系(避免遗漏)
338
+ 5. 按行为风险设计测试与安全验收场景
339
+
340
+ ### 变更中:TDD 三步走
341
+
342
+ 1. **Red**:为新增/改变行为编写适用的单元/集成/E2E 测试,确认目标用例失败、既有回归通过
343
+ 2. **Green**:按技能指引完成功能实现,逐步让测试通过
344
+ 3. **Refactor**:审查代码规范、重构优化
345
+
346
+ ### 变更后:验证
347
+
348
+ 1. 按影响范围调度一轮 typecheck/lint/build/test;UI/路由/端到端改动加相应 E2E,从 package.json 确认入口
349
+ 2. 记录全部可执行结果与日志;真实前置失败只阻塞依赖项,普通失败不边测边改
350
+ 3. 归并问题并集中修复,再验证失败、阻塞及受影响项;最终必需门禁对最终代码有效通过
351
+ 4. 搜索确认所有引用点已更新,报告未验证边界与结果来源
352
+
353
+ 涉及原生交付时按当前项目 Tauri/Gradle/Xcode 等实际入口打包,在目标 OS/设备验证安装启动、会话、安全 TokenStorage、API 域名及覆盖升级。Web 构建/E2E 不代替原生验收;记录平台/工具链与结果,缺平台写未验证。
@@ -1,190 +1,41 @@
1
1
  ---
2
2
  name: hai-cache
3
- description: 使用 @h-ai/cache 进行内存或 Redis 缓存操作(kv/hash/list/set/zset/分布式锁);当需求涉及缓存读写、TTL 管理、集合运算、排行榜、缓存一致性策略或分布式互斥锁时使用。
3
+ description: "实现或排查 Memory/Redis 缓存、TTL、集合与分布式锁,处理过期、回源和并发边界。"
4
4
  ---
5
5
 
6
6
  # hai-cache
7
7
 
8
- > `@h-ai/cache` 提供统一缓存接口,支持 Memory 与 Redis 后端,包含 KV / Hash / List / Set / ZSet / 分布式锁 六类操作。
8
+ ## 能力契约
9
9
 
10
- ---
11
-
12
- ## 运行环境
13
-
14
- > ⚠️ **服务端模块(Node.js only)。** 浏览器端无需直接操作缓存,由服务端模块(如 IAM、Scheduler)内部使用。
15
-
16
- ---
17
-
18
- ## 适用场景
19
-
20
- - 缓存热点数据减少数据库查询
21
- - 会话存储(配合 IAM)
22
- - 分布式缓存(Redis)与本地测试缓存(Memory)
23
- - 集合操作(权限缓存、标签集合)
24
- - 排行榜(ZSet)与队列(List)
25
- - 分布式锁(多节点部署互斥控制)
26
-
27
- ---
28
-
29
- ## 使用步骤
30
-
31
- ### 1. 配置
32
-
33
- ```yaml
34
- # config/_cache.yml
35
- type: ${HAI_CACHE_TYPE:memory} # memory | redis
36
- # Redis 配置(type=redis 时生效):
37
- # host: ${HAI_CACHE_REDIS_HOST:localhost}
38
- # port: ${HAI_CACHE_REDIS_PORT:6379}
39
- # password: ${HAI_CACHE_REDIS_PASSWORD:}
40
- # db: ${HAI_CACHE_REDIS_DB:0}
41
- # keyPrefix: ${HAI_CACHE_KEY_PREFIX:hai:}
42
- ```
43
-
44
- ### 2. 初始化与关闭
45
-
46
- ```typescript
47
- import { cache } from '@h-ai/cache'
48
-
49
- await cache.init(core.config.get('cache'))
50
- // 使用后关闭
51
- await cache.close()
52
- ```
53
-
54
- ---
55
-
56
- ## 核心 API
57
-
58
- ### KV 操作(`cache.kv`)
59
-
60
- | 方法 | 说明 |
61
- | ----------------------------------- | -------------------- |
62
- | `get / set / del / exists` | 基础读写与存在性判断 |
63
- | `expire / expireAt / ttl / persist` | TTL 管理 |
64
- | `incr / incrBy / decr / decrBy` | 计数器操作 |
65
- | `mget / mset` | 批量读写 |
66
- | `scan / keys / type` | Key 检索与类型判断 |
10
+ | 项目 | 契约 |
11
+ | --- | --- |
12
+ | 能力 | 使用 @h-ai/cache 的 Memory/Redis 缓存、TTL、集合、排行榜和锁 |
13
+ | 适用场景 | 缓存读写、过期策略或共享资源互斥 |
14
+ | 输入 | CacheConfigInput、key/value、TTL;acquire 返回本次获锁唯一 owner |
15
+ | 输出 | 缓存和锁操作的 HaiResult,获锁 data 为唯一 owner 或 null |
16
+ | 限制 | 仅服务端;Memory 不跨节点。release/extend 携带本次 owner,避免锁过期后误操作新持有者。 |
67
17
 
68
- ```typescript
69
- await cache.kv.set('user:123', { name: '张三' }, { ex: 3600 })
70
- const result = await cache.kv.get<{ name: string }>('user:123')
71
- if (result.success && result.data) {
72
- // result.data.name === '张三'
73
- }
18
+ ## 使用路径
74
19
 
75
- await cache.kv.del('user:123')
76
- ```
20
+ 1. 开发/显式测试可用单进程 Memory;生产环境即使只有一个实例,也必须使用 Redis 共享状态,不能把单实例当作 Memory 的生产适用条件。配置校验与 init 成功后才使用。cache 不依赖 reldb。
21
+ 2. 根据 KV/Hash/List/Set/ZSet 选择公开操作,明确 TTL、空值和回源失败的业务含义。
22
+ 3. 读取 acquire 成功返回的唯一 owner,检查 success 与 data;续期/释放复用该 owner,丢锁后停止受保护工作。
23
+ 4. 验证过期、连接失败、并发与锁过期后的旧任务;最后 close。
77
24
 
78
- ### Hash/List/Set/ZSet(`cache.hash/list/set_/zset`)
25
+ Cluster 的 mset/集合运算/多键 blocking pop 须同 slot;mget/del/exists 可跨 slot,但无全局原子性。scan 使用字符串游标遍历全部主节点,返回去除 keyPrefix 的逻辑 key;拓扑/条件变化后重新遍历。
79
26
 
80
- - `cache.hash`:对象字段读写(如用户 profile 局部更新)
81
- - `cache.list`:队列/消息顺序处理
82
- - `cache.set_`:去重集合(成员关系、权限集合)
83
- - `cache.zset`:分数排序(排行榜、权重调度)
27
+ ## 按需参考
84
28
 
85
- ```typescript
86
- await cache.hash.hset('profile:1', { nickname: 'alice' })
87
- await cache.list.lpush('queue:jobs', 'job-1', 'job-2')
88
- await cache.set_.sadd('role:admin:perms', 'user.read', 'user.write')
89
- await cache.zset.zadd('rank:daily', { member: 'u1', score: 100 })
90
- ```
29
+ 按本次操作读取对应小节;以已安装版本的公开类型核验签名,示例中的业务变量由应用提供。
91
30
 
92
- ### 分布式锁(`cache.lock`)
93
-
94
- | 方法 | 说明 |
95
- | ---------- | ------------------------------------------ |
96
- | `acquire` | 尝试获锁(SET NX EX),返回 true/false |
97
- | `release` | 释放锁(支持 owner 验证,防止误释放) |
98
- | `isLocked` | 检查锁是否被持有 |
99
- | `extend` | 续期锁 TTL(支持 owner 验证) |
100
-
101
- ```typescript
102
- // 获锁(TTL 30 秒,owner 用于标识持有者)
103
- const acquired = await cache.lock.acquire('my-lock', { ttl: 30, owner: 'node-1' })
104
- if (acquired.success && acquired.data) {
105
- try {
106
- // 受保护的操作
107
- }
108
- finally {
109
- await cache.lock.release('my-lock', 'node-1')
110
- }
111
- }
112
-
113
- // 续期
114
- await cache.lock.extend('my-lock', 60, 'node-1')
115
-
116
- // 检查
117
- const locked = await cache.lock.isLocked('my-lock')
118
- ```
119
-
120
- **最佳实践:**
121
-
122
- - `owner` 使用稳定的节点标识(如 `nodeId`),不要每次随机生成
123
- - 释放锁时传入 `owner` 防止误释放他人锁
124
- - Memory 后端适合开发/测试;Redis 后端用 Lua 脚本保证 release/extend 原子性
125
-
126
- ---
127
-
128
- ## 错误码 — `HaiCacheError`
129
-
130
- | 错误码 | code | 说明 |
131
- |--------|------|------|
132
- | `HaiCacheError.CONNECTION_FAILED` | `hai:cache:001` | 连接失败 |
133
- | `HaiCacheError.OPERATION_FAILED` | `hai:cache:002` | 操作失败 |
134
- | `HaiCacheError.SERIALIZATION_FAILED` | `hai:cache:003` | 序列化失败 |
135
- | `HaiCacheError.DESERIALIZATION_FAILED` | `hai:cache:004` | 反序列化失败 |
136
- | `HaiCacheError.KEY_NOT_FOUND` | `hai:cache:005` | 键不存在 |
137
- | `HaiCacheError.TIMEOUT` | `hai:cache:006` | 超时 |
138
- | `HaiCacheError.NOT_INITIALIZED` | `hai:cache:010` | 未初始化 |
139
- | `HaiCacheError.UNSUPPORTED_TYPE` | `hai:cache:011` | 不支持的缓存类型 |
140
- | `HaiCacheError.CONFIG_ERROR` | `hai:cache:012` | 配置错误 |
141
-
142
- ---
143
-
144
- ## 常见模式
145
-
146
- ### 缓存穿透保护
147
-
148
- ```typescript
149
- async function getUserCached(userId: string) {
150
- const cached = await cache.kv.get<User>(`user:${userId}`)
151
- if (cached.success && cached.data)
152
- return cached.data
153
-
154
- const user = await userRepo.findById(userId)
155
- if (user.success && user.data) {
156
- await cache.kv.set(`user:${userId}`, user.data, { ex: 3600 })
157
- return user.data
158
- }
159
- return null
160
- }
161
- ```
162
-
163
- ### 分布式锁保护共享资源
164
-
165
- ```typescript
166
- const lockKey = 'batch:import'
167
- const acquired = await cache.lock.acquire(lockKey, { ttl: 60, owner: nodeId })
168
- if (acquired.success && acquired.data) {
169
- try {
170
- await runBatchImport()
171
- }
172
- finally {
173
- await cache.lock.release(lockKey, nodeId)
174
- }
175
- }
176
- else {
177
- logger.info('Another node is running the import')
178
- }
179
- ```
180
-
181
- ---
31
+ - [运行环境](reference.md#运行环境)
32
+ - [适用场景](reference.md#适用场景)
33
+ - [使用步骤](reference.md#使用步骤)
34
+ - [核心 API](reference.md#核心-api)
35
+ - [错误码 — `HaiCacheError`](reference.md#错误码--haicacheerror)
36
+ - [常见模式](reference.md#常见模式)
37
+ - [相关 Skills](reference.md#相关-skills)
182
38
 
183
- ## 相关 Skills
39
+ 单键 compareAndSwap(key, expected, value, {px?,keepTtl?}) 比较 JSON 序列化快照并原子替换,必须检查 success 与 boolean data。expected=undefined 表示不存在,value=undefined 表示删除,null 是值;px 正整数且与 keepTtl 互斥。比较失败不修改 TTL;跨节点版本状态优先使用 CAS 而不是租约后无条件 SET。
184
40
 
185
- - `hai-build`:模块初始化顺序(cache 在 db 之后、iam 之前)
186
- - `hai-core`:配置与 HaiResult 模型
187
- - `hai-iam`:会话存储与权限缓存(底层使用 cache)
188
- - `hai-scheduler`:定时任务分布式锁(底层使用 cache.lock)
189
- - `hai-reach`:消息发送互斥锁(底层使用 cache.lock)
190
- - `hai-kit`:SvelteKit 集成层
41
+ `kv.set` 返回 `HaiResult<boolean>`:`data=true` 表示实际写入,NX/XX 未命中返回 `success=true,data=false` 且不改变原值或 TTL。签发票据、会话或登记公钥前必须检查这两个字段。`ex/px/exat/pxat` 分别使用秒、毫秒、Unix 秒、Unix 毫秒,须为正安全整数且只能指定一种,与 `keepTtl=true` 互斥;`nx/xx` 也互斥。零、负数、小数、非有限值或溢出返回 `INVALID_SET_OPTIONS`(`cache:016`),不会写成永久键。过去的正绝对时间表示立即过期。省略期限会移除原 TTL;`keepTtl` 保留已有 TTL,新键仍永久保存。memory 和 Redis 都保存 JSON 快照。