@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
@@ -1,126 +1,68 @@
1
- # CLI Templates
1
+ # CLI 项目模板
2
2
 
3
- 此目录包含 `hai create` 命令使用的项目模板文件。
3
+ ## 简介
4
4
 
5
- ## 目录结构
5
+ 这里保存 `hai create` 生成应用时使用的源码、配置和 AI 指引。维护模板后,需要生成真实项目验证,不能只检查模板文件本身。
6
6
 
7
- ```
8
- templates/
9
- ├── base/ # 所有应用类型共用的骨架文件
10
- │ ├── package.json.hbs # 动态:按 features 注入依赖
11
- │ ├── vite.config.ts.hbs # 动态:按 hasI18n / hasUi 注入插件
12
- │ ├── tsconfig.json
13
- │ ├── svelte.config.js
14
- │ ├── .gitignore
15
- │ ├── playwright.config.ts
16
- │ └── src/
17
- │ ├── app.html.hbs # 动态:i18n 时输出 %lang% 占位符
18
- │ ├── app.d.ts
19
- │ ├── app.css
20
- │ ├── hooks.server.ts.hbs # 动态:按 features / hasI18n 组装 handle 序列
21
- │ └── lib/server/
22
- │ └── init.ts.hbs # 动态:按 features 注入模块初始化
23
- │
24
- ├── apps/ # 应用类型专属路由与页面
25
- │ ├── admin/ # 管理后台
26
- │ │ ├── messages/ # i18n 消息文件(zh-CN / en-US)
27
- │ │ └── src/routes/ # +page / +layout .svelte.hbs
28
- │ ├── website/ # 企业官网
29
- │ │ ├── messages/
30
- │ │ └── src/routes/
31
- │ ├── h5/ # H5 移动端
32
- │ │ ├── messages/
33
- │ │ └── src/routes/
34
- │ └── api/ # 纯 API 服务(无 UI / 无 i18n)
35
- │ └── src/routes/
36
- │
37
- ├── features/ # 可选 feature 路由(叠加到 src/routes/)
38
- │ ├── iam/
39
- │ │ ├── routes-shared/ # 所有应用类型共用(API 端点)
40
- │ │ ├── routes-admin/ # admin 专属(登录/注册页 .hbs)
41
- │ │ └── routes-h5/ # h5 专属(登录/注册页 .hbs)
42
- │ ├── storage/
43
- │ │ └── routes/ # 上传 API
44
- │ └── ai/
45
- │ └── routes/ # 聊天流 API
46
- │
47
- ├── i18n/ # i18n 脚手架(hasI18n 时复制到项目根)
48
- │ └── project.inlang/
49
- │ └── settings.json # Paraglide 项目配置
50
- │
51
- └── skills/ # AI Skill 单一来源模板(分发到 .agents/skills/)
52
- ```
7
+ ## 核心功能清单
53
8
 
54
- ## AI Skill 模板(Single Source of Truth)
55
-
56
- `templates/skills/` 是 CLI 生成共享 AI 上下文时的单一来源,同时用于 `hai create` 与 `hai add`。
57
-
58
- - 每个 Skill 目录会复制到 `.agents/skills/<skill>/`
59
- - `copilot-instructions.md` 会复制到 `.github/copilot-instructions.md`,并引导 Copilot/其他助手读取 `.agents/skills/`
60
- - `AGENTS.md`、`CLAUDE.md`、`opencode.json` 会复制到项目根目录
61
- - `opencode.json` 使用 OpenCode 的 `instructions` 与 `skills.paths` 配置,将项目级指令与 Skill 目录显式指向 `AGENTS.md` 和 `.agents/skills/`
62
- - `CLAUDE.md` 作为 Claude Code 的原生项目指引入口,并通过 `@AGENTS.md` 复用共享规范;`.agents/skills/` 仍是共享参考目录,而非 Claude Code 的原生 project skills 目录
63
- - `hai add` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/`
64
-
65
- ## 文件类型说明
66
-
67
- | 类型 | 处理方式 |
68
- | ------------------------------------------ | -------------------------------------------- |
69
- | 普通文件(`.ts` / `.svelte` / `.json` 等) | 直接复制,内容不变 |
70
- | `.hbs` 文件 | 经 Handlebars 渲染后输出(去掉 `.hbs` 后缀) |
71
-
72
- ## 渲染上下文(TemplateContext)
73
-
74
- 所有 `.hbs` 文件可使用以下变量:
75
-
76
- | 变量 | 类型 | 说明 |
77
- | ---------------------- | --------- | -------------------------------------------- |
78
- | `{{projectName}}` | `string` | 项目名称(如 `my-app`) |
79
- | `{{appType}}` | `string` | 应用类型:`admin` / `website` / `h5` / `api` |
80
- | `{{hasUi}}` | `boolean` | 是否包含 UI(非 `api` 类型为 `true`) |
81
- | `{{hasI18n}}` | `boolean` | 是否启用 i18n(非 `api` 类型为 `true`) |
82
- | `{{defaultLocale}}` | `string` | 默认语言,如 `zh-CN` |
83
- | `{{packageManager}}` | `string` | 包管理器:`pnpm` / `npm` / `yarn` |
84
- | `{{features.iam}}` | `boolean` | 是否选中 iam feature |
85
- | `{{features.db}}` | `boolean` | 是否选中 db feature |
86
- | `{{features.cache}}` | `boolean` | 是否选中 cache feature |
87
- | `{{features.crypto}}` | `boolean` | 是否选中 crypto feature |
88
- | `{{features.storage}}` | `boolean` | 是否选中 storage feature |
89
- | `{{features.ai}}` | `boolean` | 是否选中 ai feature |
90
-
91
- ### 常用条件写法
92
-
93
- ```handlebars
94
- {{!-- 按 feature 条件注入内容 --}}
95
- {{#if features.iam}}
96
- import { iam } from '@h-ai/iam'
97
- {{/if}}
98
-
99
- {{!-- 按 i18n 条件切换内容 --}}
100
- {{#if hasI18n}}
101
- <title>{m.page_title()}</title>
102
- {{else}}
103
- <title>首页</title>
104
- {{/if}}
105
- ```
9
+ - `admin`、`website`、`h5`:SvelteKit 应用。
10
+ - `api`:共享 contract 与 API service 的 workspace。
11
+ - `mobile-app`:Svelte + Vite + Capacitor 应用。
12
+ - `fullstack`:contract、API、共享界面,以及按需选择的 Web/App/Desktop;miniapp 仅预留说明。
13
+ - 后台工作区随窗口扩展;手机壳支持宽屏,表格在内部滚动,文章与认证表单保留阅读宽度。
14
+ - 默认部署工具、独立镜像 Dockerfile、环境示例和可复制的 AI 技能。
15
+
16
+ ## 使用入门
17
+
18
+ ### 文件如何组合
19
+
20
+ | 目录 | 用途 |
21
+ | -------------- | ------------------------------------------------------------------- |
22
+ | `base/` | 普通应用共用的配置、脚本和入口 |
23
+ | `apps/<类型>/` | 应用专属页面、workspace、原生壳与配置;API/fullstack 维护自己的骨架 |
24
+ | `features/` | 按所选模块叠加的路由和页面 |
25
+ | `i18n/` | Paraglide 工程配置 |
26
+ | `skills/` | 完整的技能目录与各类型 AI 入口 |
27
+
28
+ 普通文件直接复制,`.hbs` 经 Handlebars 渲染并去掉后缀。`cli-template-engine.ts` 决定适用目录与条件;`cli-create.ts` 完成配置、镜像定义和根 README 等生成工作。修改前先查实际调用路径,API/fullstack 不套用 SvelteKit 文件路由。
29
+
30
+ ### 配置与构建
106
31
 
107
- ## 生成流程
32
+ 模板通过 `projectName`、`appType`、`features`、`hasUi`、`hasI18n`、`versions` 以及 `api`/`fullstack` 上下文渲染,完整字段见 [cli-types.ts](../src/cli-types.ts)。模块 YAML 使用 `moduleConfig` helper,与 [配置生成器](../src/commands/cli-config-templates.ts) 共用字段和默认值。
108
33
 
109
- 模板引擎执行 6 个步骤:
34
+ 部署默认启用,`--no-deploy` 可关闭;SDK 是开发依赖。每个镜像使用 `images/` 中独立 Dockerfile,Web 资源放 `images/web/`。`hai.json` 的 `build.images` 选择文件,`deploy` 保存项目级部署参数;依赖输入由构建器生成到 `images/dependencies/`。所有根 `.gitignore` 均忽略 `**/images/dependencies/`、运行数据和私有环境文件。
110
35
 
111
- 1. **复制 `base/` 静态文件** → 项目根
112
- 2. **复制 `apps/{appType}/` 路由** → 项目根(`messages/` 仅 `hasI18n` 时复制)
113
- 3. **叠加 feature 静态路由** → `src/routes/`
114
- 4. **渲染所有 `.hbs` 文件** — `base/` + `apps/{appType}/` 输出到项目根;`features/*/routes*/` 输出到 `src/routes/`
115
- 5. **复制 `i18n/` 脚手架** → 项目根(仅 `hasI18n` 时)
116
- 6. **确保 `static/` 目录存在**
36
+ Fullstack 服务端保留各模块的配置示例,未使用模块保持注释。安装依赖、校验和初始化、接入业务后才启用对应配置。修改公开 Schema 时同步配置生成器、环境变量说明、调用方与技能。
117
37
 
118
- ## 新增模板
38
+ SvelteKit 的 `kit-config.ts` 在服务端读取并固定 `_kit.yml`,根 load 只投影公开 transport;选择 crypto 后,hooks 装配环境密钥环和 registry,布局安装浏览器传输。db 提供共享 registry,无 db 仅限开发/测试。路径规则可配置 IP、时段与 required/disabled 加密,规则冲突须在装配时失败。调整时同步三种 SSR 布局、服务端入口、私钥生成边界和实际生成工程的根/子目录门禁;纯客户端工程不生成服务端私钥。
119
39
 
120
- ### 新增应用页面
40
+ ### AI 指引
41
+
42
+ `skills/hai-*` 的完整目录复制到生成应用 `.agents/skills/`,按应用架构排除不适用项。`bridges/<类型>/AGENTS.md` 提供根入口;Claude/Copilot/OpenCode 配置只引用共享规则。新增参考文件必须随 skill 一起复制,不能链接回框架私有路径。
43
+
44
+ `hai add` / `hai init` 补齐缺失文件,保留应用已有的自定义内容。框架升级时按目标发布版本比较并合并,不直接覆盖应用规则。
45
+
46
+ ### 页面与文案
47
+
48
+ 用户可见文本加入对应 messages。认证复用 AuthPanel 与服务端公开 IAM 配置;表单复用 Form/FormLayout/FormField。业务规则由应用需求决定,模板默认角色、流程和限额可调整,修改时同步授权、界面、测试和文档。
49
+
50
+ ## 开发测试
51
+
52
+ 维护模板时保留 `shared/.gitattributes`,让生成工程的 `.dockerignore`、Dockerfile 和 POSIX 脚本统一使用 LF,保持跨平台输入一致并确保 Linux 脚本可运行。在仓库根执行:
53
+
54
+ ```sh
55
+ pnpm --filter @h-ai/cli typecheck
56
+ pnpm --filter @h-ai/cli lint
57
+ pnpm --filter @h-ai/cli build
58
+ pnpm --filter @h-ai/cli test
59
+ pnpm check:skills
60
+ pnpm --filter @h-ai/cli test:scaffold-gates
61
+ pnpm --filter @h-ai/cli test:deploy-gates
62
+ ```
121
63
 
122
- 在 `apps/{appType}/src/routes/` 下创建 `.svelte` 或 `.svelte.hbs` 文件。若含用户可见文本,使用 `.hbs` 并加 `{{#if hasI18n}}` 条件,同时在对应的 `apps/{appType}/messages/` 里补充 i18n key。
64
+ 脚手架门禁会生成项目并执行安装、类型检查、lint、构建、测试和浏览器流程。部署门禁另需可用 Podman/Docker,验证镜像构建、隔离服务器上的 SSH/人工部署与部分更新。原生安装包和真实第三方服务需要各自的验收环境。
123
65
 
124
- ### 新增 feature 路由
66
+ ## 许可证
125
67
 
126
- 在 `features/{featureId}/routes-shared/`(API 路由)或 `features/{featureId}/routes-{appType}/`(UI 页面)下创建文件,然后在 `template-engine.ts` 的 `FEATURE_ROUTE_DIRS` / `FEATURE_APP_ROUTE_DIRS` 中注册该目录。
68
+ Apache-2.0
@@ -5,13 +5,20 @@
5
5
  "nav_home": "Home",
6
6
  "nav_dashboard": "Dashboard",
7
7
  "nav_settings": "Settings",
8
+ "nav_close_sidebar": "Close sidebar",
9
+ "nav_open_sidebar": "Open sidebar",
8
10
  "nav_admin": "Enter Admin",
9
11
  "page_home_title": "Admin Console",
10
12
  "page_home_subtitle": "Built with hai Agent Framework",
13
+ "page_home_badge": "Powered by hai",
11
14
  "page_dashboard_title": "Dashboard",
15
+ "page_dashboard_subtitle": "Overview of system operations",
12
16
  "page_dashboard_total_users": "Total Users",
13
17
  "page_dashboard_today_active": "Today Active",
18
+ "page_dashboard_revenue": "Monthly Revenue",
19
+ "page_dashboard_orders": "Pending Orders",
14
20
  "page_settings_title": "System Settings",
21
+ "page_settings_subtitle": "Manage system configuration",
15
22
  "page_settings_basic": "Basic Configuration",
16
23
  "page_settings_desc": "Manage system settings here.",
17
24
  "auth_login_title": "Login",
@@ -0,0 +1,40 @@
1
+ {
2
+ "app_title": "管理コンソール",
3
+ "app_description": "hai Agent Frameworkで構築した管理コンソール",
4
+ "meta_description": "管理コンソール — 企業管理システム",
5
+ "nav_home": "ホーム",
6
+ "nav_dashboard": "ダッシュボード",
7
+ "nav_settings": "設定",
8
+ "nav_close_sidebar": "サイドバーを閉じる",
9
+ "nav_open_sidebar": "サイドバーを開く",
10
+ "nav_admin": "管理画面へ",
11
+ "page_home_title": "管理コンソール",
12
+ "page_home_subtitle": "hai Agent Frameworkで構築",
13
+ "page_home_badge": "Powered by hai",
14
+ "page_dashboard_title": "ダッシュボード",
15
+ "page_dashboard_subtitle": "システム稼働状況の概要",
16
+ "page_dashboard_total_users": "総ユーザー数",
17
+ "page_dashboard_today_active": "本日のアクティブユーザー",
18
+ "page_dashboard_revenue": "月間売上",
19
+ "page_dashboard_orders": "未処理の注文",
20
+ "page_settings_title": "システム設定",
21
+ "page_settings_subtitle": "システム設定を管理",
22
+ "page_settings_basic": "基本設定",
23
+ "page_settings_desc": "ここでシステムの設定を管理します。",
24
+ "auth_login_title": "ログイン",
25
+ "auth_login_submit": "ログイン",
26
+ "auth_login_loading": "ログイン中...",
27
+ "auth_login_failed": "ログインに失敗しました",
28
+ "auth_login_to_register": "アカウントをお持ちでない方は新規登録",
29
+ "auth_register_title": "登録",
30
+ "auth_register_submit": "登録",
31
+ "auth_register_loading": "登録中...",
32
+ "auth_register_failed": "登録に失敗しました",
33
+ "auth_register_to_login": "既にアカウントをお持ちの方はログイン",
34
+ "auth_label_username": "ユーザー名",
35
+ "auth_label_email": "メールアドレス",
36
+ "auth_label_password": "パスワード",
37
+ "auth_label_confirm_password": "パスワードの確認",
38
+ "auth_error_network": "ネットワークエラー",
39
+ "auth_error_password_mismatch": "パスワードが一致しません"
40
+ }
@@ -5,13 +5,20 @@
5
5
  "nav_home": "首页",
6
6
  "nav_dashboard": "仪表盘",
7
7
  "nav_settings": "设置",
8
+ "nav_close_sidebar": "关闭侧栏",
9
+ "nav_open_sidebar": "打开侧栏",
8
10
  "nav_admin": "进入后台",
9
11
  "page_home_title": "管理后台",
10
12
  "page_home_subtitle": "基于 hai Agent Framework 构建",
13
+ "page_home_badge": "由 hai 驱动",
11
14
  "page_dashboard_title": "仪表盘",
15
+ "page_dashboard_subtitle": "系统运营数据总览",
12
16
  "page_dashboard_total_users": "总用户",
13
17
  "page_dashboard_today_active": "今日活跃",
18
+ "page_dashboard_revenue": "本月营收",
19
+ "page_dashboard_orders": "待处理订单",
14
20
  "page_settings_title": "系统设置",
21
+ "page_settings_subtitle": "管理系统配置项",
15
22
  "page_settings_basic": "基本配置",
16
23
  "page_settings_desc": "在此管理系统设置。",
17
24
  "auth_login_title": "登录",
@@ -1,23 +1,67 @@
1
1
  {{!-- 管理后台根布局 --}}
2
- <script lang="ts">
2
+ <script lang='ts'>
3
3
  /**
4
4
  * 管理后台根布局
5
5
  */
6
6
  import type { Snippet } from 'svelte'
7
- import '../app.css'
8
- {{#if hasI18n}}
9
7
  import { browser } from '$app/environment'
10
- import { setGlobalLocale } from '@h-ai/ui'
11
- import { getLocale } from '$lib/paraglide/runtime.js'
8
+ {{#if features.iam}}
9
+ import { base } from '$app/paths'
10
+ {{else}}
11
+ {{#if features.crypto}}
12
+ import { base } from '$app/paths'
13
+ {{/if}}
14
+ {{/if}}
15
+ import { page } from '$app/state'
16
+ {{#if hasI18n}}
17
+ import { getLocale, setLocale } from '$lib/paraglide/runtime.js'
18
+ {{/if}}
19
+ {{#if features.crypto}}
20
+ import { crypto } from '@h-ai/crypto'
21
+ import { kit } from '@h-ai/kit'
22
+ {{else}}
23
+ {{#if features.iam}}
24
+ import { kit } from '@h-ai/kit'
25
+ {{/if}}
26
+ {{/if}}
27
+ {{#if hasI18n}}
28
+ import { applyTheme, getSavedTheme, LanguageSwitch, setGlobalLocale, ThemeSelector } from '@h-ai/ui'
29
+ {{else}}
30
+ import { applyTheme, getSavedTheme, ThemeSelector } from '@h-ai/ui'
31
+ {{/if}}
32
+ {{#if features.crypto}}
33
+ import { untrack } from 'svelte'
12
34
  {{/if}}
35
+ import '../app.css'
13
36
 
14
37
  interface Props {
15
38
  children: Snippet
16
39
  }
17
40
 
18
- let { children }: Props = $props()
41
+ const { children }: Props = $props()
42
+ {{#if features.crypto}}
43
+ if (browser)
44
+ kit.client.installBrowserTransport(untrack(() => page.data.kitConfig), { crypto, basePath: base })
45
+ {{/if}}
46
+ const initialTheme = browser ? getSavedTheme() : 'light'
47
+ let currentTheme = $state(initialTheme)
48
+ if (browser)
49
+ applyTheme(initialTheme, false)
50
+ function handleThemeChange(theme: string) {
51
+ currentTheme = theme
52
+ applyTheme(theme)
53
+ }
54
+ {{#if features.iam}}
55
+ const authActions = kit.client.createAuthActions({ basePath: `${base}/api/auth` })
56
+ $effect(() => authActions.bindPageExit({ enabled: page.data.iamPublicConfig?.session.endOnPageHide }))
57
+ {{/if}}
19
58
  {{#if hasI18n}}
20
59
 
60
+ function handleLanguageChange(language: string) {
61
+ setGlobalLocale(language)
62
+ setLocale(language as Parameters<typeof setLocale>[0])
63
+ }
64
+
21
65
  if (browser) {
22
66
  const paraglideLocale = getLocale()
23
67
  setGlobalLocale(paraglideLocale)
@@ -25,6 +69,19 @@
25
69
  {{/if}}
26
70
  </script>
27
71
 
28
- <div class="min-h-screen bg-base-200">
29
- {@render children()}
72
+ <svelte:head>
73
+ <title>{page.data.appConfig.name}</title>
74
+ </svelte:head>
75
+
76
+ <div class='h-dvh flex flex-col overflow-hidden bg-base-200'>
77
+ <header class='navbar h-12 min-h-12 shrink-0 border-b border-base-300 bg-base-100 px-3 sm:px-4'>
78
+ <span class='flex-1 text-lg font-semibold'>{page.data.appConfig.name}</span>
79
+ <ThemeSelector {currentTheme} onchange={handleThemeChange} compact />
80
+ {{#if hasI18n}}
81
+ <LanguageSwitch currentLanguage={getLocale()} onchange={handleLanguageChange} />
82
+ {{/if}}
83
+ </header>
84
+ <div class='flex min-h-0 flex-1 flex-col overflow-auto'>{@render children()}</div>
85
+ <footer class='shrink-0 border-t border-base-300 bg-base-100 px-3 py-1 text-center text-xs text-base-content/60'>{page.data.appConfig.name} · {page.data.appConfig.version} · {page.data.appConfig.env}</footer>
30
86
  </div>
87
+ <ToastContainer />
@@ -1,35 +1,56 @@
1
1
  {{!-- 管理后台首页 --}}
2
- <script lang="ts">
2
+ <script lang='ts'>
3
3
  /**
4
4
  * 管理后台首页 — 入口导航
5
5
  */
6
+ import { resolve } from '$app/paths'
7
+ import { page } from '$app/state'
6
8
  {{#if hasI18n}}
7
9
  import * as m from '$lib/paraglide/messages'
8
10
  {{/if}}
11
+ import { Badge, Card } from '@h-ai/ui'
9
12
  </script>
10
13
 
11
14
  <svelte:head>
12
15
  {{#if hasI18n}}
13
- <title>{m.app_title()}</title>
16
+ <title>{page.data.appConfig.name}</title>
14
17
  {{else}}
15
- <title>管理后台</title>
18
+ <title>{page.data.appConfig.name}</title>
16
19
  {{/if}}
17
20
  </svelte:head>
18
21
 
19
- <main class="min-h-screen flex items-center justify-center">
20
- <div class="text-center">
22
+ <main class='min-h-screen flex items-center justify-center p-6'>
23
+ <Card shadow='lg' padding='xl' class='w-full max-w-xl bg-base-100 text-center'>
21
24
  {{#if hasI18n}}
22
- <h1 class="text-4xl font-bold mb-4">{m.app_title()}</h1>
23
- <p class="text-gray-600 mb-8">{m.page_home_subtitle()}</p>
24
- <div class="flex gap-4 justify-center">
25
- <a href="/admin" class="btn btn-primary">{m.nav_admin()}</a>
25
+ <div class='flex justify-center'>
26
+ <Badge variant='primary'>
27
+ <span class='icon-[tabler--sparkles] size-4'></span>
28
+ {m.page_home_badge()}
29
+ </Badge>
30
+ </div>
31
+ <h1 class='mt-4 text-4xl font-black tracking-tight'>{page.data.appConfig.name}</h1>
32
+ <p class='mt-3 text-base-content/60'>{m.page_home_subtitle()}</p>
33
+ <div class='mt-8 flex flex-wrap gap-3 justify-center'>
34
+ <a href={resolve('/admin', {})} class='btn btn-primary'>
35
+ <span class='icon-[tabler--layout-dashboard] size-5'></span>
36
+ {m.nav_admin()}
37
+ </a>
26
38
  </div>
27
39
  {{else}}
28
- <h1 class="text-4xl font-bold mb-4">管理后台</h1>
29
- <p class="text-gray-600 mb-8">基于 hai Agent Framework 构建</p>
30
- <div class="flex gap-4 justify-center">
31
- <a href="/admin" class="btn btn-primary">进入后台</a>
40
+ <div class='flex justify-center'>
41
+ <Badge variant='primary'>
42
+ <span class='icon-[tabler--sparkles] size-4'></span>
43
+ 由 hai 驱动
44
+ </Badge>
45
+ </div>
46
+ <h1 class='mt-4 text-4xl font-black tracking-tight'>{page.data.appConfig.name}</h1>
47
+ <p class='mt-3 text-base-content/60'>基于 hai Agent Framework 构建</p>
48
+ <div class='mt-8 flex flex-wrap gap-3 justify-center'>
49
+ <a href={resolve('/admin', {})} class='btn btn-primary'>
50
+ <span class='icon-[tabler--layout-dashboard] size-5'></span>
51
+ 进入后台
52
+ </a>
32
53
  </div>
33
54
  {{/if}}
34
- </div>
55
+ </Card>
35
56
  </main>
@@ -1,44 +1,76 @@
1
1
  {{!-- 后台管理布局(侧边栏 + 内容区) --}}
2
- <script lang="ts">
2
+ <script lang='ts'>
3
3
  /**
4
4
  * 后台管理布局(侧边栏 + 内容区)
5
5
  */
6
6
  import type { Snippet } from 'svelte'
7
+ import { resolve } from '$app/paths'
8
+ import { page } from '$app/state'
7
9
  {{#if hasI18n}}
8
10
  import * as m from '$lib/paraglide/messages'
9
11
  {{/if}}
12
+ import { WorkspaceLayout } from '@h-ai/ui'
10
13
 
11
14
  interface Props {
12
15
  children: Snippet
13
16
  }
14
17
 
15
- let { children }: Props = $props()
18
+ const { children }: Props = $props()
19
+ let drawerOpen = $state(false)
20
+ let menuButton: HTMLButtonElement
21
+
22
+ function closeDrawer() {
23
+ drawerOpen = false
24
+ menuButton?.focus()
25
+ }
26
+
27
+ function handleDrawerKeydown(event: KeyboardEvent) {
28
+ if (drawerOpen && event.key === 'Escape')
29
+ closeDrawer()
30
+ }
31
+
32
+ const navItems = $derived([
33
+ {{#if hasI18n}}
34
+ { path: '/admin', label: m.nav_dashboard(), icon: 'icon-[tabler--layout-dashboard]' },
35
+ { path: '/admin/settings', label: m.nav_settings(), icon: 'icon-[tabler--settings]' },
36
+ {{else}}
37
+ { path: '/admin', label: '仪表盘', icon: 'icon-[tabler--layout-dashboard]' },
38
+ { path: '/admin/settings', label: '设置', icon: 'icon-[tabler--settings]' },
39
+ {{/if}}
40
+ ] as const)
16
41
  </script>
17
42
 
18
- <div class="drawer lg:drawer-open">
19
- <input id="admin-drawer" type="checkbox" class="drawer-toggle" />
20
- <div class="drawer-content p-6">
21
- <label for="admin-drawer" class="btn btn-ghost drawer-button lg:hidden mb-4">
22
- ☰
23
- </label>
24
- {@render children()}
43
+ <svelte:window onkeydown={handleDrawerKeydown} />
44
+
45
+ <div class='drawer min-h-0 flex-1 lg:drawer-open'>
46
+ <input id='admin-drawer' type='checkbox' class='drawer-toggle' bind:checked={drawerOpen} />
47
+ <div class='drawer-content flex min-h-0 min-w-0 flex-col overflow-hidden'>
48
+ <button bind:this={menuButton} type='button' class='btn btn-ghost btn-sm drawer-button m-1 shrink-0 self-start lg:hidden' aria-label={{#if hasI18n}}{m.nav_open_sidebar()}{{else}}'打开侧栏'{{/if}} aria-expanded={drawerOpen} aria-controls='admin-sidebar' onclick={() => drawerOpen = !drawerOpen}>
49
+ <span class='icon-[tabler--menu-2] size-5'></span>
50
+ </button>
51
+ <WorkspaceLayout>{@render children()}</WorkspaceLayout>
25
52
  </div>
26
- <div class="drawer-side">
27
- <label for="admin-drawer" class="drawer-overlay"></label>
28
- <nav class="menu p-4 w-64 min-h-full bg-base-100 text-base-content">
53
+ <div id='admin-sidebar' class='drawer-side'>
54
+ <button type='button' class='drawer-overlay' aria-label={{#if hasI18n}}{m.nav_close_sidebar()}{{else}}'关闭侧栏'{{/if}} onclick={closeDrawer}></button>
55
+ <nav class='menu p-4 w-64 min-h-full gap-1 bg-base-100 text-base-content border-r border-base-300/60'>
56
+ <div class='flex items-center gap-2 px-2 mb-6 text-xl font-bold'>
57
+ <span class='icon-[tabler--cube] size-6 text-primary'></span>
29
58
  {{#if hasI18n}}
30
- <div class="text-xl font-bold mb-6 px-2">{m.app_title()}</div>
31
- <ul>
32
- <li><a href="/admin">{m.nav_dashboard()}</a></li>
33
- <li><a href="/admin/settings">{m.nav_settings()}</a></li>
34
- </ul>
59
+ {page.data.appConfig.name}
35
60
  {{else}}
36
- <div class="text-xl font-bold mb-6 px-2">管理后台</div>
37
- <ul>
38
- <li><a href="/admin">仪表盘</a></li>
39
- <li><a href="/admin/settings">设置</a></li>
40
- </ul>
61
+ {page.data.appConfig.name}
41
62
  {{/if}}
63
+ </div>
64
+ <ul class='gap-1'>
65
+ {#each navItems as item (item.path)}
66
+ <li>
67
+ <a href={resolve(item.path, {})} class:menu-active={page.url.pathname === resolve(item.path, {})} onclick={closeDrawer}>
68
+ <span class='{item.icon} size-5'></span>
69
+ {item.label}
70
+ </a>
71
+ </li>
72
+ {/each}
73
+ </ul>
42
74
  </nav>
43
75
  </div>
44
76
  </div>
@@ -1,10 +1,27 @@
1
1
  {{!-- 仪表盘页面 --}}
2
- <script lang="ts">
2
+ <script lang='ts'>
3
3
  /**
4
4
  * 仪表盘页面
5
5
  */
6
6
  {{#if hasI18n}}
7
7
  import * as m from '$lib/paraglide/messages'
8
+ {{/if}}
9
+ import { Card, PageHeader } from '@h-ai/ui'
10
+ {{#if hasI18n}}
11
+
12
+ const stats = $derived([
13
+ { label: m.page_dashboard_total_users(), value: '0', icon: 'icon-[tabler--users]', accent: 'text-primary' },
14
+ { label: m.page_dashboard_today_active(), value: '0', icon: 'icon-[tabler--activity]', accent: 'text-success' },
15
+ { label: m.page_dashboard_revenue(), value: '¥0', icon: 'icon-[tabler--coin]', accent: 'text-warning' },
16
+ { label: m.page_dashboard_orders(), value: '0', icon: 'icon-[tabler--shopping-cart]', accent: 'text-info' },
17
+ ])
18
+ {{else}}
19
+ const stats = [
20
+ { label: '总用户', value: '0', icon: 'icon-[tabler--users]', accent: 'text-primary' },
21
+ { label: '今日活跃', value: '0', icon: 'icon-[tabler--activity]', accent: 'text-success' },
22
+ { label: '本月营收', value: '¥0', icon: 'icon-[tabler--coin]', accent: 'text-warning' },
23
+ { label: '待处理订单', value: '0', icon: 'icon-[tabler--shopping-cart]', accent: 'text-info' },
24
+ ]
8
25
  {{/if}}
9
26
  </script>
10
27
 
@@ -17,29 +34,21 @@
17
34
  </svelte:head>
18
35
 
19
36
  {{#if hasI18n}}
20
- <h1 class="text-2xl font-bold mb-6">{m.page_dashboard_title()}</h1>
21
-
22
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
23
- <div class="stat bg-base-100 rounded-box shadow">
24
- <div class="stat-title">{m.page_dashboard_total_users()}</div>
25
- <div class="stat-value">0</div>
26
- </div>
27
- <div class="stat bg-base-100 rounded-box shadow">
28
- <div class="stat-title">{m.page_dashboard_today_active()}</div>
29
- <div class="stat-value">0</div>
30
- </div>
31
- </div>
37
+ <PageHeader title={m.page_dashboard_title()} description={m.page_dashboard_subtitle()} />
32
38
  {{else}}
33
- <h1 class="text-2xl font-bold mb-6">仪表盘</h1>
39
+ <PageHeader title='仪表盘' description='系统运营数据总览' />
40
+ {{/if}}
34
41
 
35
- <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
36
- <div class="stat bg-base-100 rounded-box shadow">
37
- <div class="stat-title">总用户</div>
38
- <div class="stat-value">0</div>
39
- </div>
40
- <div class="stat bg-base-100 rounded-box shadow">
41
- <div class="stat-title">今日活跃</div>
42
- <div class="stat-value">0</div>
43
- </div>
42
+ <div class='grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-4'>
43
+ {#each stats as stat (stat.label)}
44
+ <Card shadow='sm' class='bg-base-100'>
45
+ <div class='flex items-center justify-between'>
46
+ <div>
47
+ <div class='text-sm text-base-content/55'>{stat.label}</div>
48
+ <div class='mt-1 text-3xl font-bold tracking-tight'>{stat.value}</div>
49
+ </div>
50
+ <span class='{stat.icon} {stat.accent} size-9'></span>
51
+ </div>
52
+ </Card>
53
+ {/each}
44
54
  </div>
45
- {{/if}}