@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,280 @@
1
+ # hai-api-contract 参考
2
+
3
+ > `@h-ai/api-contract` 是 hai-framework 的公共 HTTP API 契约包,使用 oRPC contract + Zod v4 作为唯一接口真相源。本包只描述接口边界,不包含任何 procedure 实现。
4
+
5
+ ## 运行环境
6
+
7
+ 独立 contract 包发布前验证实际声明构建。`ContractProcedureBuilderWithInputOutput`、`ContractProcedureBuilderWithOutput`、`Schema` 直接复用上游公共类型,由 `@h-ai/api-contract` 类型转出,供推导声明与显式 `import type` 使用;不手写仿造类型或导入 node_modules 内部路径。
8
+
9
+ > ✅ **契约定义包,无服务端业务依赖;Zod/oRPC schema 构造仍有运行时代码。** 可在客户端、服务端、测试环境直接引用。
10
+
11
+ ## 适用场景
12
+
13
+ - 定义新领域的 oRPC contract(输入/输出 Schema + HTTP 路由元数据)
14
+ - 组合多个领域 contract 为应用级 contract
15
+ - 向 `@h-ai/serv` 提供 contract(装配为 HTTP API)
16
+ - 向 `@h-ai/api-client` 提供 contract(生成类型安全客户端)
17
+ - 复用内置领域 contract(iam/storage/ai/payment)
18
+ - 复用公共 Schema 工厂(`apiContract.haiResultSchema`、分页 Schema)
19
+
20
+ ## 使用步骤
21
+
22
+ ### 1. 组合应用级 contract
23
+
24
+ ```typescript
25
+ import { apiContract } from '@h-ai/api-contract'
26
+
27
+ // 按需组合,传 false/undefined 的领域不会出现在 contract 或 OpenAPI spec 中
28
+ export const myContract = apiContract.create({
29
+ iam: apiContract.iam,
30
+ storage: apiContract.storage,
31
+ ai: apiContract.ai,
32
+ payment: false, // 禁用领域
33
+ })
34
+
35
+ // myContract.iam.auth.login
36
+ // myContract.storage.presignedUrls.createUpload
37
+ // myContract.ai.chats.createCompletion
38
+ ```
39
+
40
+ ### 2. 组合自定义 contract
41
+
42
+ ```typescript
43
+ import { apiContract } from '@h-ai/api-contract'
44
+
45
+ export const myContract = apiContract.create({
46
+ iam: apiContract.iam,
47
+ storage: apiContract.storage,
48
+ payment: false, // 禁用领域(不会出现在 contract 或 OpenAPI spec 中)
49
+ })
50
+ ```
51
+
52
+ ### 3. 定义新领域 contract
53
+
54
+ ```typescript
55
+ import { apiContract } from '@h-ai/api-contract'
56
+ import { z } from 'zod'
57
+
58
+ // 输入 Schema
59
+ const WidgetCreateInputSchema = z.object({
60
+ name: z.string().min(1),
61
+ description: z.string().optional(),
62
+ })
63
+
64
+ // 同一 contract 内两个接口复用,因此保留为文件私有常量,不从 schemas 导出。
65
+ const WidgetOutputSchema = apiContract.haiResultSchema(z.object({
66
+ id: z.string(),
67
+ name: z.string(),
68
+ createdAt: z.string(),
69
+ }))
70
+
71
+ // 领域 contract
72
+ export const widgetContract = {
73
+ widget: {
74
+ create: apiContract
75
+ .route({
76
+ method: 'POST',
77
+ path: '/widgets',
78
+ operationId: 'widget.create',
79
+ summary: 'Create widget',
80
+ tags: ['widget'],
81
+ })
82
+ .input(WidgetCreateInputSchema)
83
+ .output(WidgetOutputSchema),
84
+
85
+ getById: apiContract
86
+ .route({
87
+ method: 'GET',
88
+ path: '/widgets/{id}',
89
+ operationId: 'widget.getById',
90
+ summary: 'Get widget by id',
91
+ tags: ['widget'],
92
+ })
93
+ .input(z.object({ id: z.string() }))
94
+ .output(WidgetOutputSchema),
95
+ },
96
+ }
97
+ ```
98
+
99
+ ### 4. 将新 contract 挂入应用级 contract
100
+
101
+ ```typescript
102
+ import { apiContract } from '@h-ai/api-contract'
103
+ import { widgetContract } from './widget-contract.js'
104
+
105
+ export const appContract = apiContract.create({
106
+ iam: apiContract.iam,
107
+ widget: widgetContract,
108
+ })
109
+ ```
110
+
111
+ ### 5. 传给 `@h-ai/serv`(服务端)
112
+
113
+ ```typescript
114
+ import { serv } from '@h-ai/serv'
115
+ import { appContract } from './app-contract.js'
116
+ import { createMyProcedures } from './procedures/widget.js'
117
+
118
+ const app = serv.createApp({
119
+ contract: appContract,
120
+ procedures: {
121
+ iam: createIamProcedures({ iam }),
122
+ widget: createMyProcedures(),
123
+ },
124
+ http: { apiPrefix: '/api/v1' },
125
+ })
126
+ ```
127
+
128
+ ## 核心 API
129
+
130
+ ### `apiContract.create(options)` — 组合领域 contract
131
+
132
+ ```typescript
133
+ import { apiContract } from '@h-ai/api-contract'
134
+
135
+ const contract = apiContract.create({
136
+ iam: apiContract.iam, // 启用:纳入 contract
137
+ storage: false, // 禁用:不出现在 OpenAPI spec 中
138
+ custom: myContract, // 自定义领域
139
+ })
140
+ // 类型自动收窄,被禁用的 key 不出现在 contract 类型中
141
+ ```
142
+
143
+ ### 内置领域 contract
144
+
145
+ | 访问路径 | 领域 | 功能概述 |
146
+ | --- | --- | --- |
147
+ | `apiContract.iam` | IAM | auth(登录/登出/OTP/刷新/注册/改密码)、users、roles、permissions Admin CRUD |
148
+ | `apiContract.storage` | Storage | presignedUrls(上传/下载/批量)、files(元数据查询/删除) |
149
+ | `apiContract.ai` | AI | chats(非流式补全/消息/历史)、memories(召回/列表)、sessions(列表) |
150
+ | `apiContract.payment` | Payment | orders、subscriptions |
151
+
152
+ ### 内置 contract 路径示例
153
+
154
+ ```typescript
155
+ const myContract = apiContract.create({ iam: apiContract.iam, storage: apiContract.storage, ai: apiContract.ai })
156
+
157
+ // IAM
158
+ myContract.iam.auth.login // POST /auth/login
159
+ myContract.iam.auth.logout // POST /auth/logout
160
+ myContract.iam.users.list // GET /iam/users
161
+ myContract.iam.roles.create // POST /iam/roles
162
+
163
+ // Storage
164
+ myContract.storage.presignedUrls.createUpload // POST /storage/presigned-urls/upload
165
+
166
+ // AI
167
+ myContract.ai.chats.createCompletion // POST /ai/chats/completions,非流式 JSON
168
+ ```
169
+
170
+ ### `apiContract.haiResultSchema(dataSchema)` — 标准输出包装
171
+
172
+ 所有 HTTP 输出必须通过 `apiContract.haiResultSchema` 包装为 `HaiResult<T>`,与 `@h-ai/core` 的 `ok()/err()` 返回结构一致:
173
+
174
+ ```typescript
175
+ import { apiContract } from '@h-ai/api-contract'
176
+ import { z } from 'zod'
177
+
178
+ const getWidget = apiContract
179
+ .route({ method: 'GET', path: '/widgets/{id}' })
180
+ .output(apiContract.haiResultSchema(z.object({
181
+ id: z.string(),
182
+ name: z.string(),
183
+ })))
184
+
185
+ // 等价于:
186
+ // { success: true, data: { id: string, name: string } }
187
+ // | { success: false, error: HaiError }
188
+ ```
189
+
190
+ ### `apiContract.pathOf(procedure)` — 读取业务路径
191
+
192
+ ```typescript
193
+ const refreshPath = apiContract.pathOf(apiContract.iam.auth.refresh)
194
+ // '/auth/refresh'
195
+ ```
196
+
197
+ middleware、client 与 E2E 需要业务路径时从 contract 元数据读取,不维护第二份 route 常量。服务端挂载时再与 `_serv.yml` 的 `http.apiPrefix` 拼接。
198
+
199
+ ### 公共 Schema 工具
200
+
201
+ | 访问路径 | 说明 |
202
+ | --- | --- |
203
+ | `apiContract.haiResultSchema(dataSchema)` | `HaiResult<T>` 输出包装 |
204
+ | `apiContract.voidResultSchema` | `HaiResult<void>` 空结果包装 |
205
+ | `apiContract.paginatedSchema(itemSchema)` | 分页列表输出 Schema |
206
+ | `HaiErrorSchema` | HaiError 公共字段 Schema |
207
+ | `PaginationQuerySchema` | 分页参数 Schema(可选 page/pageSize,pageSize 上限 100;默认值由服务端处理) |
208
+
209
+ ## Contract 定义规范
210
+
211
+ ### 必须遵循
212
+
213
+ - **输出必须包装为 `apiContract.haiResultSchema`** — 客户端依赖 `success` 判断成功/失败
214
+ - **业务 path 直接写在对应 `*-contract.ts`** — 禁止新增 `*-routes.ts` 或业务路径常量
215
+ - **一次性 `*OutputSchema` 直接内联** — 不在 schemas 文件声明或导出
216
+ - **同一 contract 内重复使用的输出可设私有常量** — 不得为复用扩大公共导出
217
+ - **公共 HTTP 传输配置以配置文件为准** — API 前缀、健康检查、OpenAPI/docs、密钥协商路径与跨端 Header 放在 service 的 `_serv.yml`,不放 contract 包
218
+ - **schemas 只保留真实复用结构** — 至少被多个接口或 contract/procedure 等不同层共同消费
219
+ - **`operationId` 全局唯一** — 格式为 `domain.resource.action`,如 `iam.auth.login`
220
+ - **`tags` 至少包含领域名** — 供 OpenAPI 文档分组
221
+ - **输入 Schema 用 Zod v4** — 与 `@orpc/zod/zod4` 的 `ZodToJsonSchemaConverter` 配套
222
+ - **Contract 不含业务逻辑** — 只有 Schema + 路由元数据,没有 `async function`
223
+
224
+ ### 禁止
225
+
226
+ - ❌ Contract 文件中 `import` 任何业务模块(`@h-ai/iam`、`@h-ai/storage` 等)
227
+ - ❌ 在 contract 中使用 `z.any()` 或 `z.unknown()` 作为输出类型
228
+ - ❌ 重复定义已存在的领域 contract
229
+ - ❌ 导出只被单个 contract 接口使用的 `*OutputSchema`
230
+ - ❌ 用独立 `*-routes.ts` 维护业务接口路径
231
+
232
+ ### 文件职责
233
+
234
+ | 文件 | 只负责 |
235
+ | --- | --- |
236
+ | `*-contract.ts` | 业务接口 path、method、输入与输出边界 |
237
+ | `*-schemas.ts` | 跨接口或跨层复用的输入、实体、数据结构 |
238
+ | service `config/_serv.yml` | API 前缀、基础设施端点、跨端 Header 与加密 transport 配置 |
239
+
240
+ ## 常见模式
241
+
242
+ ### 带分页的列表接口
243
+
244
+ ```typescript
245
+ import { apiContract, PaginationQuerySchema } from '@h-ai/api-contract'
246
+ import { z } from 'zod'
247
+
248
+ const WidgetSchema = z.object({ id: z.string(), name: z.string() })
249
+
250
+ const listWidgets = apiContract
251
+ .route({ method: 'GET', path: '/widgets', operationId: 'widget.list', tags: ['widget'] })
252
+ .input(PaginationQuerySchema.extend({ keyword: z.string().optional() }))
253
+ .output(apiContract.haiResultSchema(apiContract.paginatedSchema(WidgetSchema)))
254
+ ```
255
+
256
+ ### 路径参数
257
+
258
+ ```typescript
259
+ // 路径中的 {id} 对应 input 中的 id 字段
260
+ const getWidget = apiContract
261
+ .route({ method: 'GET', path: '/widgets/{id}', operationId: 'widget.getById', tags: ['widget'] })
262
+ .input(z.object({ id: z.string() }))
263
+ .output(apiContract.haiResultSchema(WidgetSchema))
264
+ ```
265
+
266
+ ### 无输入的端点
267
+
268
+ ```typescript
269
+ const versionContract = apiContract
270
+ .route({ method: 'GET', path: '/system/version', operationId: 'system.version', tags: ['system'] })
271
+ .output(apiContract.haiResultSchema(z.object({ version: z.string() })))
272
+ ```
273
+
274
+ ## 测试
275
+
276
+ ```bash
277
+ pnpm --filter @h-ai/api-contract test
278
+ pnpm --filter @h-ai/api-contract typecheck
279
+ pnpm --filter @h-ai/api-contract lint
280
+ ```
@@ -1,371 +1,58 @@
1
1
  ---
2
2
  name: hai-app-create
3
- description: 以 TDD 方式在应用中创建新功能:先编写测试定义行为,再编码实现直至测试通过;当需求涉及新增页面/路由、API、服务、数据模型、组件时使用。
3
+ description: "在 hai 应用中新增、修改或修复功能,按需求复用框架能力并验证安全、质量与风格。"
4
4
  ---
5
5
 
6
- # hai-app-create — TDD 驱动的应用功能创建规范
6
+ # hai-app-create
7
7
 
8
- > 面向 AI 助手的应用功能创建指南。**必须遵循 TDD**:先写测试(Red)→ 再实现(Green)→ 再重构(Refactor)。
8
+ ## 能力契约
9
9
 
10
- ---
11
-
12
- ## 适用场景
13
-
14
- - 新增页面(路由)
15
- - 新增 API 端点
16
- - 新增服务层模块(`$lib/server/services/`)
17
- - 新增数据库表 / 数据模型
18
- - 新增业务组件
19
-
20
- ---
21
-
22
- ## TDD 开发流程(强制)
23
-
24
- 创建任何新功能时,必须按以下顺序执行:
25
-
26
- ### Step 1:需求分析与测试设计
27
-
28
- 1. 明确功能的输入、输出、边界条件、错误场景
29
- 2. 确定需要创建的文件(服务、路由、Schema、组件等)
30
- 3. 设计测试用例清单(参照 `hai-app-tests` 技能的覆盖范围要求)
31
-
32
- ### Step 2:编写测试(Red 阶段)
33
-
34
- 1. **创建单元测试**:在 `tests/` 下为服务层、Schema 编写 Vitest 测试
35
- 2. **创建 E2E 测试**:在 `e2e/` 下为 API 端点、页面交互编写 Playwright 测试
36
- 3. **创建空的实现文件**:仅包含函数签名和类型定义,不写实际逻辑(确保 import 不报错)
37
- 4. **运行测试确认全部失败**:
38
- ```bash
39
- pnpm --filter <app-name> test # 应全部 FAIL
40
- ```
41
-
42
- ### Step 3:编写实现(Green 阶段)
43
-
44
- 按照下文的「创建指南」编写实际功能代码,每完成一个功能点立即运行测试确认通过。
45
-
46
- ### Step 4:重构与验证(Refactor 阶段)
47
-
48
- 1. 参照 `hai-app-review` 审查代码规范
49
- 2. 运行质量门禁:`pnpm typecheck && pnpm lint && pnpm test`
50
- 3. 运行 E2E:`pnpm --filter <app-name> test:e2e`
51
-
52
- ---
53
-
54
- ## 目录结构约定
55
-
56
- ```
57
- src/
58
- hooks.server.ts # Handle Hook 入口
59
- app.css # 全局样式(TailwindCSS 4)
60
- lib/
61
- server/
62
- init.ts # 应用初始化(模块 init 顺序)
63
- services/ # 业务服务层(Server-only)
64
- index.ts # 服务聚合导出
65
- user.ts # 示例:用户服务
66
- schemas/ # 请求校验 Schema(Zod)
67
- components/ # 业务组件(非 @h-ai/ui 通用组件)
68
- stores/ # 客户端 Store(Svelte 5 Runes)
69
- paraglide/ # i18n 生成文件(禁止手动修改)
70
- routes/
71
- +layout.svelte # 根布局
72
- +page.svelte # 首页
73
- (auth)/ # 认证分组路由
74
- login/+page.svelte
75
- admin/ # 管理区域
76
- users/
77
- +page.svelte # 列表页
78
- +page.server.ts # 列表数据加载
79
- [id]/
80
- +page.svelte # 详情页
81
- +page.server.ts
82
- api/ # API 端点
83
- auth/+server.ts
84
- health/+server.ts
85
- iam/
86
- users/+server.ts
87
- messages/ # i18n 消息文件
88
- en-US.json
89
- zh-CN.json
90
- config/ # 模块配置文件
91
- _core.yml
92
- _db.yml
93
- _cache.yml
94
- _iam.yml
95
- ```
96
-
97
- ---
98
-
99
- ## 创建页面
100
-
101
- ### 页面路由规则
102
-
103
- 使用 SvelteKit 文件路由,参考 `src/routes/` 约定:
104
-
105
- | 类型 | 路径示例 | 说明 |
106
- | -------- | ---------------------------------- | -------------------- |
107
- | 静态页面 | `routes/about/+page.svelte` | 常规页面 |
108
- | 动态路由 | `routes/users/[id]/+page.svelte` | URL 参数 |
109
- | 分组路由 | `routes/(auth)/login/+page.svelte` | 共享布局,不影响 URL |
110
- | API 端点 | `routes/api/users/+server.ts` | RESTful API |
111
-
112
- ### 页面文件模板
113
-
114
- ```svelte
115
- <!-- +page.svelte -->
116
- <script lang="ts">
117
- // Svelte 5 Runes 语法
118
- let { data } = $props()
119
- let loading = $state(false)
120
-
121
- async function handleAction() {
122
- loading = true
123
- try {
124
- // 业务逻辑
125
- } finally {
126
- loading = false
127
- }
128
- }
129
- </script>
130
-
131
- <div class="container mx-auto p-4">
132
- <!-- 使用 @h-ai/ui 组件 -->
133
- </div>
134
- ```
135
-
136
- ### 数据加载(+page.server.ts)
137
-
138
- ```typescript
139
- import type { PageServerLoad } from './$types'
140
- import { kit } from '@h-ai/kit'
141
-
142
- export const load: PageServerLoad = async (event) => {
143
- // 权限守卫
144
- const guard = kit.guard.requireAuth(event)
145
- if (!guard.success)
146
- return kit.response.redirect('/login')
147
-
148
- // 加载数据
149
- const result = await someService.list()
150
- if (!result.success)
151
- return kit.response.error(500, result.error.message)
152
-
153
- return { items: result.data }
154
- }
155
- ```
156
-
157
- ---
158
-
159
- ## 创建 API 端点
160
-
161
- ### RESTful 端点模板
162
-
163
- ```typescript
164
- // src/routes/api/[resource]/+server.ts
165
- import type { RequestHandler } from './$types'
166
- import { kit } from '@h-ai/kit'
167
- import { z } from 'zod'
10
+ | 项目 | 契约 |
11
+ | --- | --- |
12
+ | 能力 | 在 hai 应用中新增、修改或修复页面、API、服务、模型与组件 |
13
+ | 适用场景 | 日常应用功能开发与已授权修复 |
14
+ | 输入 | 功能需求、现有路由/contract、数据模型和验收场景 |
15
+ | 输出 | 能力选择依据、最小实现、行为验证、i18n 与受影响文档 |
16
+ | 限制 | 优先复用;TDD 验证本次目标行为,仍适用的回归保持通过。保留 API workspace 架构时不混入 SvelteKit 路由。 |
168
17
 
169
- const CreateSchema = z.object({
170
- name: z.string().min(1).max(100),
171
- description: z.string().optional(),
172
- })
18
+ ## 使用路径
173
19
 
174
- // GET - 列表
175
- export const GET = kit.handler(async ({ locals }) => {
176
- kit.guard.requirePermission(locals.session, 'resource:read')
20
+ 沟通、问题状态与文档/配置/截图/测试/模板/调用方同步遵循[沟通与同步维护](collaboration.md)。
177
21
 
178
- const result = await service.list()
179
- if (!result.success)
180
- return kit.response.error(500, result.error.message)
181
- return kit.response.ok(result.data)
182
- })
22
+ 范围、验收、复用依据和证据按 [工作交接契约](../hai-spec-implement/handoff.md) 贯穿实现、测试和审查;小改动使用简短记录,文档驱动任务沿既有任务记录续跑。
183
23
 
184
- // POST - 创建
185
- export const POST = kit.handler(async ({ request, locals }) => {
186
- kit.guard.requirePermission(locals.session, 'resource:create')
24
+ 业务以用户当前明确要求及其指定文档为准;模板规则、生成代码与测试只描述初始方案。需求改变角色、流程、限额或架构时,在已有授权范围内同步调整冲突实现及过期 AGENTS/skills/README,不要求把需求改回模板。具体判定见 [development.md](development.md#需求与模板的关系)。
187
25
 
188
- const data = await kit.validate.formOrFail(request, CreateSchema)
26
+ 从需求/设计文档开始生成项目或功能前,使用 [hai-spec-review](../hai-spec-review/SKILL.md) 检查文档是否足以确定实现;修正影响行为的缺项、歧义和技术错误后再进入生成。普通小改动按本次范围确认规则,不要求重审无关文档。
189
27
 
190
- const result = await service.create(data)
191
- if (!result.success)
192
- return kit.response.error(500, result.error.message)
193
- return kit.response.created(result.data)
194
- })
195
- ```
28
+ 需要按文档规划/执行、返修或根据已提交文档差异同步实现时,使用 [hai-spec-implement](../hai-spec-implement/SKILL.md) 管理 docs 清单、任务记录、文档基线、TDD 和任务分支;本 skill 负责其中的具体应用实现,复用固定目标版本、范围与验收。
196
29
 
197
- ### 要点
30
+ 需要新建项目、添加模块、补齐配置或生成代码时,先按 [CLI 安装与命令](development.md#cli-安装与命令) 全局安装 `@h-ai/cli`,再执行 `hai` 命令。
198
31
 
199
- - 所有端点**必须**用 `kit.handler(async ({ locals, request, ... }) => { ... })` 包裹,由 handler 统一处理 throw 的 Response
200
- - 权限守卫使用 `kit.guard.requirePermission(locals.session, 'xxx:yyy')`,它本身就是 throw 模式(未通过时 throw 403 Response),**无需**检查返回值
201
- - 输入校验使用 `await kit.validate.formOrFail(request, Schema)`,校验失败时 throw 400 Response,**无需**手动判断 valid
202
- - 返回统一使用 `kit.response.*`
203
- - HaiResult 错误直接透传,不重新包装
204
- - 框架模块 API 不抛异常,不要用 `try/catch` 处理模块返回的错误,直接检查 `result.success`
32
+ 1. 读取 [development.md](development.md):先按真实需求匹配框架能力、已安装版本与应用架构,再确定改动。适用能力包括同一模块已有 feature、配置和扩展点,不以导入包作为复用完成的证据。
33
+ 2. 读取所选模块的 skill 与实际公开类型,复用现有服务和组件。新增依赖或直接使用第三方 SDK 前说明已有能力的具体缺口;无需安装无关模块。
34
+ 3. 新增或改变行为时用有意义的目标用例验证,仍适用的回归保持通过;被明确新需求替代的模板断言同步更新并记录依据。按下方参考实现,使用 [hai-app-review](../hai-app-review/SKILL.md) 检查改动涉及的安全与质量边界。
35
+ 4. 按 [分轮验证与集中修复](../hai-app-tests/validation.md) 运行已有门禁:一轮先收集所有可执行结果,再归并修复、复测失败及受影响项;报告行为证据、能力选择及未验证项。纯文案、格式和文档变化按影响验证,不强制新增测试。
205
36
 
206
- ---
207
-
208
- ## 创建服务层
209
-
210
- 服务层位于 `$lib/server/services/`,处理业务逻辑。
211
-
212
- ```typescript
213
- import type { HaiResult } from '@h-ai/core'
214
- // src/lib/server/services/article.ts
215
- import { core } from '@h-ai/core'
216
- import { reldb } from '@h-ai/reldb'
217
-
218
- const logger = core.logger
219
-
220
- /** 创建文章 */
221
- export async function createArticle(input: CreateArticleInput): Promise<HaiResult<Article>> {
222
- logger.debug('Creating article', { title: input.title })
223
-
224
- const result = await reldb.crud.create('articles', {
225
- id: crypto.randomUUID(),
226
- ...input,
227
- created_at: new Date().toISOString(),
228
- })
229
- if (!result.success)
230
- return result
231
-
232
- logger.info('Article created', { id: result.data.id })
233
- return result
234
- }
235
-
236
- /** 获取文章列表 */
237
- export async function listArticles(params: ListParams): Promise<HaiResult<PaginatedResult<Article>>> {
238
- logger.debug('Listing articles', { page: params.page })
239
- return reldb.crud.paginate('articles', params)
240
- }
241
- ```
242
-
243
- ### 服务层规则
37
+ ## 按需参考
244
38
 
245
- - 统一返回 `HaiResult<T>`
246
- - 写操作需 `debug`(进入)+ `info`(成功)日志
247
- - 读操作仅 `debug` 日志
248
- - 禁止 `console.log`,使用 `core.logger`
249
- - 服务层不处理 HTTP 响应格式,只返回 HaiResult
39
+ 界面新建或明显改变信息结构时先用已交付的 hai-ui-design 确定页面模式、状态和组件映射;使用 hai-ui 的当前版本契约实现,以 hai-ui-review 的真实页面检查收尾。窄范围修复直接复用既有设计。界面方案与最终实现的差异需回写适用设计记录。
250
40
 
251
- ---
252
-
253
- ## 创建数据模型
254
-
255
- ### Schema 定义(SQL DDL)
256
-
257
- 数据库表 Schema 定义在 `$lib/server/init.ts` 中:
258
-
259
- ```typescript
260
- const BUSINESS_SCHEMA = `
261
- CREATE TABLE IF NOT EXISTS articles (
262
- id TEXT PRIMARY KEY,
263
- title TEXT NOT NULL,
264
- content TEXT,
265
- author_id TEXT NOT NULL,
266
- status TEXT DEFAULT 'draft',
267
- created_at TEXT DEFAULT (datetime('now')),
268
- updated_at TEXT DEFAULT (datetime('now'))
269
- );
41
+ 带前端的工程新增引导或帮助时,读取本工程 `hai-ui` Skill 中的 `guide.md`,复用 fullstack 的共享 guide-store、locale 与稳定 data-guide 锚点;纯 API 工程不需要 UI 指引。
270
42
 
271
- CREATE INDEX IF NOT EXISTS idx_articles_author_id ON articles(author_id);
272
- CREATE INDEX IF NOT EXISTS idx_articles_status ON articles(status);
273
- `
274
- ```
275
-
276
- ### 类型定义
277
-
278
- ```typescript
279
- // 在服务文件或独立类型文件中定义
280
- interface Article {
281
- id: string
282
- title: string
283
- content: string | null
284
- authorId: string
285
- status: 'draft' | 'published' | 'archived'
286
- createdAt: string
287
- updatedAt: string
288
- }
289
-
290
- interface CreateArticleInput {
291
- title: string
292
- content?: string
293
- authorId: string
294
- }
295
- ```
296
-
297
- ---
298
-
299
- ## 创建业务组件
300
-
301
- 业务组件放在 `$lib/components/`,通用 UI 使用 `@h-ai/ui`。
302
-
303
- ```svelte
304
- <!-- src/lib/components/ArticleCard.svelte -->
305
- <script lang="ts">
306
- import type { Article } from '$lib/server/services/article'
307
-
308
- let { article, onEdit }: { article: Article, onEdit?: () => void } = $props()
309
- </script>
310
-
311
- <div class="card bg-base-100 shadow">
312
- <div class="card-body">
313
- <h2 class="card-title">{article.title}</h2>
314
- <p>{article.content ?? ''}</p>
315
- {#if onEdit}
316
- <div class="card-actions justify-end">
317
- <button class="btn btn-primary" onclick={onEdit}>编辑</button>
318
- </div>
319
- {/if}
320
- </div>
321
- </div>
322
- ```
323
-
324
- ### 组件规则
325
-
326
- - 使用 Svelte 5 Runes 语法(`$props()`、`$state()`、`$derived()`、`$effect()`)
327
- - 事件回调通过 props 传入(非 `createEventDispatcher`)
328
- - 样式使用 TailwindCSS 4 + DaisyUI 5 class
329
- - 通用 UI 组件优先使用 `@h-ai/ui`,不重复实现
330
- - i18n 文本使用 `$lib/paraglide/messages.js` 中的 key
331
-
332
- ---
333
-
334
- ## 初始化顺序
335
-
336
- 在 `$lib/server/init.ts` 中管理模块初始化顺序:
337
-
338
- ```
339
- core.init() → reldb.init() → cache.init() → iam.init() → createBusinessTables()
340
- ```
341
-
342
- 新增模块时需在此文件中按依赖顺序添加初始化调用。
343
-
344
- ---
345
-
346
- ## 检查清单
347
-
348
- - [ ] **TDD 流程已执行**:先写测试 → 确认失败 → 再实现 → 确认通过
349
- - [ ] 单元测试已编写(服务层、Schema)
350
- - [ ] E2E 测试已编写(API 端点、页面交互)
351
- - [ ] 页面使用 Svelte 5 Runes 语法
352
- - [ ] API 端点有权限守卫与输入校验
353
- - [ ] 服务层统一返回 `HaiResult<T>`
354
- - [ ] 日志级别正确(读 debug / 写 debug+info / 失败 warn|error)
355
- - [ ] 禁止 `console.log`、`any`、硬编码密钥
356
- - [ ] 用户可见文本走 i18n
357
- - [ ] 新增表有索引定义
358
- - [ ] 组件优先使用 `@h-ai/ui`
359
- - [ ] `pnpm typecheck && pnpm lint && pnpm test` 通过
360
-
361
- ---
43
+ 按任务读取 [reference.md](reference.md) 的对应小节;签名以当前源码或安装版本的公开类型为准,不默认加载全部资料。示例中的业务变量由应用提供。
362
44
 
363
- ## 相关 Skills
45
+ - 适用场景
46
+ - 行为开发与验证
47
+ - 目录结构约定
48
+ - 创建页面
49
+ - 创建 API 端点
50
+ - 创建服务层
51
+ - 创建数据模型
52
+ - 创建业务组件
53
+ - 初始化顺序
54
+ - 容器交付
55
+ - 检查清单
56
+ - 相关 Skills
364
57
 
365
- - `hai-build`:项目架构与模块初始化顺序
366
- - `hai-app-tests`:TDD 测试规范(Red 阶段详细指引)
367
- - `hai-app-review`:代码审查规范(Refactor 阶段参照)
368
- - `hai-kit`:SvelteKit 集成的完整 API
369
- - `hai-ui`:UI 组件库使用
370
- - `hai-reldb`:数据库操作详细 API
371
- - `hai-iam`:认证与权限管理
58
+ 宿主生命周期优先 core.module.createRuntime([{name,enabled?,start,close}]):声明真实顺序与业务钩子,失败回滚,关闭失败保留依赖和义务待重试。不要在应用复制并发/回滚/关闭状态机;纯函数与 core 配置不臆造 init/close。错误只报告模块、阶段、错误码和配置路径,不传播私密值。