@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,23 @@
1
+ {{! @skipIfEmpty }}
2
+ {{#if fullstack.frontends.web}}
3
+ {
4
+ "compilerOptions": {
5
+ "target": "ES2022",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "moduleDetection": "force",
8
+ "module": "ESNext",
9
+ "moduleResolution": "bundler",
10
+ "resolveJsonModule": true,
11
+ "types": ["svelte", "vite/client", "node", "vitest/globals"],
12
+ "allowJs": true,
13
+ "checkJs": false,
14
+ "strict": true,
15
+ "noEmit": true,
16
+ "isolatedModules": true,
17
+ "verbatimModuleSyntax": true,
18
+ "skipLibCheck": true
19
+ },
20
+ "include": ["src/**/*.ts", "src/**/*.svelte", "tests/**/*.ts", "vite.config.ts", "svelte.config.js"],
21
+ "exclude": ["node_modules", "dist", "build"]
22
+ }
23
+ {{/if}}
@@ -0,0 +1,76 @@
1
+ {{! @skipIfEmpty }}
2
+ {{#if fullstack.frontends.web}}
3
+ import type { Plugin } from 'vite'
4
+ import process from 'node:process'
5
+ import { fileURLToPath } from 'node:url'
6
+ import { core } from '@h-ai/core'
7
+ import { haiOptimizeExclude, haiPrebundledDeps } from '@h-ai/ui/vite'
8
+ import { paraglideVitePlugin } from '@inlang/paraglide-js'
9
+ import { svelte } from '@sveltejs/vite-plugin-svelte'
10
+ import tailwindcss from '@tailwindcss/vite'
11
+ import { defineConfig } from 'vitest/config'
12
+ import { resolveBuildMetadata } from '../../scripts/build-metadata.js'
13
+ import { resolvePublicBasePath } from '../../scripts/public-base-path.mjs'
14
+
15
+ const envDir = fileURLToPath(new URL('../../', import.meta.url))
16
+
17
+ export default defineConfig(({ mode, command }) => {
18
+ const envResult = command === 'build' || process.env.HAI_E2E === '1' ? { success: true as const, data: {} as Record<string, string> } : core.config.loadEnvFiles({ mode, envDir })
19
+ if (!envResult.success)
20
+ throw new Error(envResult.error.message)
21
+ const env = envResult.data
22
+ Object.assign(process.env, env)
23
+ const buildMetadata = resolveBuildMetadata(fileURLToPath(new URL('.', import.meta.url)))
24
+ const metadataAsset: Plugin = {
25
+ name: 'hai-build-metadata',
26
+ generateBundle() {
27
+ this.emitFile({ type: 'asset', fileName: 'build-metadata.json', source: JSON.stringify(buildMetadata) })
28
+ },
29
+ }
30
+ const target = (env.PUBLIC_API_BASE || process.env.SERVICE_BASE_URL || 'http://127.0.0.1:3000').replace(/\/api\/v1\/?$/, '')
31
+ const proxy = { '/api': { target, changeOrigin: true } }
32
+ const publicBase = resolvePublicBasePath()
33
+ return {
34
+ base: publicBase ? `${publicBase}/` : './',
35
+ envDir: false,
36
+ define: { __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata) },
37
+ server: { proxy },
38
+ preview: { proxy },
39
+ build: {
40
+ rolldownOptions: {
41
+ output: {
42
+ codeSplitting: {
43
+ groups: [
44
+ { name: 'vendor-ui', test: /node_modules\/(?:@h-ai\/ui|bits-ui|svelte)\// },
45
+ { name: 'vendor-crypto', test: /node_modules\/(?:@h-ai\/(?:core|crypto)|sm-crypto(?:-v2)?)\// },
46
+ { name: 'vendor-api', test: /node_modules\/(?:@orpc\/|zod\/)/ },
47
+ ],
48
+ },
49
+ },
50
+ },
51
+ },
52
+ plugins: [
53
+ metadataAsset,
54
+ svelte(),
55
+ paraglideVitePlugin({
56
+ project: './project.inlang',
57
+ outdir: './src/lib/paraglide',
58
+ strategy: ['cookie', 'baseLocale'],
59
+ }),
60
+ tailwindcss(),
61
+ ],
62
+ optimizeDeps: {
63
+ exclude: [...haiOptimizeExclude],
64
+ include: [...haiPrebundledDeps],
65
+ },
66
+ envPrefix: ['VITE_', 'PUBLIC_'],
67
+ ssr: {
68
+ noExternal: ['@h-ai/ui', /{{fullstack.sharedPackageName}}/],
69
+ },
70
+ test: {
71
+ environment: 'node',
72
+ include: ['tests/**/*.test.ts'],
73
+ },
74
+ }
75
+ })
76
+ {{/if}}
@@ -0,0 +1,349 @@
1
+ # fullstack 安全配置与使用影响
2
+
3
+ 本文对应本模板生成的 `{{projectName}}` 项目。开关由可信服务端配置决定,不是配置管理员网页里的开关。Web、App、Desktop 共用服务端策略及 shared 中的认证交互。额外密码复杂度、失败锁定、审计保留保护等增强默认关闭;下面的 YAML 是按需启用的示例,并非所有功能默认同时打开。
4
+
5
+ ## 配置在哪里,怎么生效
6
+
7
+ | 文件 | 用途 |
8
+ | ------------------------------------------------------------ | -------------------------------------------------- |
9
+ | `packages/{{projectName}}-serv/config/_iam.yml` | 账号、密码、验证码、锁定、敏感操作、登录限制、会话 |
10
+ | `packages/{{projectName}}-serv/config/_audit.yml` | 审计采集、脱敏、保留、备份、告警 |
11
+ | `packages/{{projectName}}-serv/config/_reach.yml` | 邮件、短信或通知 API 及通知模板 |
12
+ | `packages/{{projectName}}-serv/config/_scheduler.yml` | 已有 Scheduler 的持久化及调度参数 |
13
+ | `packages/{{projectName}}-serv/config/_storage.yml` | 备份实际使用的存储;生产归档必须私有 |
14
+ | `packages/{{projectName}}-serv/src/server/security-roles.ts` | 本项目的职责角色与权限映射 |
15
+ | `.env.example`、`.env.dev/.env.test/.env.prod`、`.env.local` | 环境覆盖说明、所选环境配置、本机私有覆盖 |
16
+
17
+ 按功能把下面的配置段合并进已有 YAML,不要整文件覆盖掉登录方式、RBAC、品牌等其他配置。保存后重启服务端;多节点保持一致。客户端刷新页面以重新读取公开认证配置,不在前端放服务端秘密或完整安全策略。
18
+
19
+ 生成的 YAML 标量通常使用 `${HAI_…:默认值}`;环境覆盖优先于这里的默认值。普通应用加载顺序为进程环境 > `.env.local` > 所选环境文件 > `.env`。例如:
20
+
21
+ ```dotenv
22
+ HAI_IAM_SESSION_IDLETIMEOUT=1800
23
+ HAI_IAM_PASSWORD_EXPIRATIONDAYS=90
24
+ HAI_AUDIT_BACKUP_ENABLED=true
25
+ ```
26
+
27
+ 数组和规则直接在 YAML 中编辑最清楚。变量名以项目 `.env.example` 为准,不在 camelCase 字段中额外插入下划线。不要用整个 `HAI_IAM` JSON 覆盖来代替单字段修改;整模块覆盖可能使未提供的策略回到 Schema 默认值。
28
+
29
+ ## 默认情况
30
+
31
+ 这里列的是 fullstack 模板默认值,不是所有项目或底层 Schema 的普适限制。
32
+
33
+ | 条目 | fullstack 默认及启用入口 | 使用影响 |
34
+ | ---------------------------- | --------------------------------------------------------------- | -------------------------------------------------------- |
35
+ | B03 长期/临时账号 | 用户管理中的账号类型、到期时间 | 临时账号必须有未来到期时间;到期后旧会话也不能继续使用 |
36
+ | B04 激活/休眠/注销 | 用户管理中的状态;另保留启用/禁用 | 状态和禁用标志共同决定可用性;注销状态不等于物理删除 |
37
+ | B05 不活动扫描 | `accounts.dormantAfterDays: 0` 关闭 | 正数启用,扫描会把符合条件的账号设为休眠 |
38
+ | B06/B07 密码复杂度 | 默认 8–128 位,不额外要求字符类别;类别数 0 | 配置三类等条件后,新建、改密、重置统一校验 |
39
+ | B08 定期改密 | `password.expirationDays: 0` 关闭;`preventSamePassword: false` | 正数开启到期改密;新旧相同可单独禁止 |
40
+ | B10 轻量验证码 | `captcha.enabled: false` | 开启后在提交按钮中显示验证进度;自动求解挑战,无需图片识别 |
41
+ | B11 失败锁定 | `security.lockoutEnabled: false`;预设24小时/5次/20分钟 | 开启后执行阈值/时间限制;关闭后历史锁不阻止密码鉴别 |
42
+ | B13 初始凭据/通知 | 四类引导账号已各有随机密码;一次性邀请默认关闭 | 开启邀请还需真实通知通道及正确设密页面地址 |
43
+ | B14 首次改密 | `password.requireInitialChange: false` | 管理端创建/重置的初始密码先更新,才允许普通登录 |
44
+ | B16 敏感操作 | `reauthentication.enabled: false`,操作列表为空 | 文件与权限表规则取并集,对已接入操作验证当前密码,不增加权限 |
45
+ | B20–B24 职责分离 | 示例已按应用配置分离,无框架全局开关 | 换账号会看到不同菜单,服务端同时限制权限 |
46
+ | B28 登录时间/IP | `loginAccess.enabled: false` | 开启后限制新登录;不是工作时间结束后自动强退已有会话 |
47
+ | B29 自动审计 | `capture.enabled: true`,`includeReads: false` | 重要写入及失败/拒绝自动记录;业务语义仍需业务显式记录 |
48
+ | B30/B31 分类、字段、身份快照 | 内置,无单独开关 | 记录事件时身份;历史空字段不会伪造补齐 |
49
+ | B32 业务隐私脱敏 | `privacy.enabled: true` | 可增补详情中的隐私字段;凭据脱敏始终生效 |
50
+ | B33 审计查询/排序/统计 | 审计管理员页面已接入 | 无需另开开关;系统管理员不因此获得审计权限 |
51
+ | B34 分级告警 | `alerts.enabled: false` | 还需规则、人员/目标与 Reach;自动检查另开 schedule |
52
+ | B35 手动/自动备份 | `backup.enabled: false`,计划也关闭 | 手动与定时分别启用;备份不自动清理原日志 |
53
+ | B36 保留保护 | `retention.enabled: false`;预设90天 | 开启后保护期内不能修改、删除、覆盖;不是到期自动删除 |
54
+ | B42 安全错误响应 | 默认生效,无关闭内部错误保护的业务开关 | 自写接口也应使用统一错误边界,不把原始异常当作业务消息 |
55
+ | B43 严格闲置期限 | `session.idleTimeout: 0` 关闭 | 设为 1800 即 30 分钟;失效后原地重新登录,保留页面输入 |
56
+ | B44 页面关闭策略 | 显式退出已可靠撤销;`endOnPageHide: false` | 开启会影响刷新/整页导航,关闭通知只能尽力发送 |
57
+ | B45 每次登录新会话 | 默认生效,无需开关 | 每次登录新建随机服务端会话 |
58
+ | B46 并发会话数 | `session.maxSessions: 0` 不限制 | 正数开启额度,超限拒绝新登录 |
59
+ | B47 禁止重复登录 | `session.singleDevice: false` | 可按 web/app/desktop/api 配额,或跨所有终端只允许一个会话 |
60
+
61
+ ## 自助注册与注册后的账号状态
62
+
63
+ 在 `_iam.yml` 设置 `register.enabled: false` 会隐藏访客注册入口,同时由服务端拒绝自助注册;已有账号仍可登录,管理员也仍可创建用户。设回 true 恢复访客注册。
64
+
65
+ `register.defaultAccountStatus: dormant` 表示自助注册成功后创建休眠账号,等待系统管理员激活后才能登录。默认 active 表示无需审批;仅影响新自助注册账号,管理员创建可另选状态。环境变量为 `HAI_IAM_REGISTER_ENABLED` / `HAI_IAM_REGISTER_DEFAULTACCOUNTSTATUS`。账号只有激活、休眠、注销三种生命周期,不再使用独立启用/停用开关。系统管理员可管理所有职责账号的资料、状态、角色并重置密码;审计与业务配置权限仍归各职责。
66
+
67
+ ## 账号类型、状态和自动休眠
68
+
69
+ 在用户新增/编辑中选择长期账号 `permanent` 或临时账号 `temporary`,临时账号设置到期时间;状态为 `active`、`dormant`、`closed`。这些是账号数据,不需要先开启一个全局账号类型开关。状态、禁用和到期限制会影响已有 access/refresh 的后续服务端校验。
70
+
71
+ 如需 90 天未成功登录自动休眠,在 `_iam.yml` 设置:
72
+
73
+ ```yaml
74
+ accounts:
75
+ dormantAfterDays: 90
76
+ scanIntervalSeconds: 3600
77
+ ```
78
+
79
+ 按最后成功登录时间计算,从未登录的账号按创建时间计算;不是按每一次业务访问计算,自动刷新 token 也不是重新登录。每 3600 秒扫描一次,扫描间隔范围 60–86400 秒。设回 `dormantAfterDays: 0` 停止自动休眠,但不会自动激活已休眠账号。普通业务账号可由系统管理员在用户管理中激活;独立职责账号另受防接管保护,其恢复由部署者通过可信运维流程处理。可信服务端也可调用 `iam.user.scanInactiveAccounts()`,并检查返回结果的 `success`。
80
+
81
+ ## 密码复杂度、到期和首次改密
82
+
83
+ 在 `_iam.yml` 按需设置:
84
+
85
+ ```yaml
86
+ password:
87
+ minLength: 8
88
+ maxLength: 128
89
+ requireUppercase: false
90
+ requireLowercase: false
91
+ requireNumber: false
92
+ requireSpecialChar: false
93
+ minCharacterClasses: 3
94
+ expirationDays: 90
95
+ preventSamePassword: true
96
+ requireInitialChange: true
97
+ ```
98
+
99
+ 四类指大写、小写、数字、特殊字符。`minCharacterClasses: 3` 是任意三类;各 `require*` 是另外必须满足的条件,二者同时执行。例如要求必须含大写,再把 `requireUppercase` 改为 true。仅把类别数设为 0 不会取消仍为 true 的 `require*`。长度下限至少 1、最大长度最多 256,且最大值不能小于最小值。
100
+
101
+ 提高复杂度只校验今后的设密,不会从旧密码散列中反查复杂度或重写旧密码。`expirationDays: 90` 以保存的改密时间判断,存量旧密码可能立即到期;0 关闭期限。开启期限或首次强改时,即使 `preventSamePassword` 为 false,也不能改回当前旧密码。这里比较当前旧密码,不是保存最近 N 次历史密码。
102
+
103
+ `requireInitialChange` 作用于管理员创建/重置的初始密码,自助注册自行设密不重复强改;开启它不等于给所有存量账号补上初始密码标记。首次/到期用户在登录页完成原密码验证和新密码设置,再重新登录。未完成时服务端不授权普通业务会话,前端隐藏提示不能绕过。
104
+
105
+ 改密提示区分确认不一致、复杂度不足和新旧密码相同(`hai:iam:034`),凭据验证失败统一提示“用户名或密码不正确”。前端确认密码与服务端逐字符比较,保留空白和 Unicode 原文;本地校验失败不发送请求并给出具体填写提示。认证失败共用 UI 的 `authErrorMessage` 和统一 Toast,隐藏未知异常原文、保留追踪编号。修改当前密码失败不会被误判为会话过期;成功后清理本地凭据并重新登录。
106
+
107
+ ## 轻量验证码与失败锁定
108
+
109
+ ```yaml
110
+ captcha:
111
+ enabled: true
112
+ ttlSeconds: 120
113
+ cost: 5000
114
+ maxCounter: 100
115
+
116
+ security:
117
+ lockoutEnabled: true
118
+ failureWindow: 86400
119
+ maxLoginAttempts: 5
120
+ lockoutDuration: 1200
121
+ ```
122
+
123
+ 以上放入 `_iam.yml`。验证码是自托管 ALTCHA 计算挑战,标准认证界面已接好;关闭时不加载求解器。启用后提交时出现验证/等待状态,弱机型可能更慢。`ttlSeconds` 为证明有效秒数(1–600),`cost`(100–50000)和 `maxCounter`(1–2000)控制工作量。证明按用途短期单用;重试密码也需要新证明。它提高自动化成本,不保证请求一定来自真人。
124
+
125
+ 登录、注册、OTP 发送、密码重置及匿名原密码续期等对应入口会按策略校验。自定义认证界面应复用框架认证动作,不能仅在页面加一个装饰性验证码。
126
+
127
+ 失败计数从首次失败起使用固定窗口,不是滚动 24 小时。`failureWindow`、`lockoutDuration` 单位为秒,阈值为次数;成功密码鉴别会重置失败计数。示例表示窗口内达到 5 次失败后锁定密码鉴别 20 分钟。可单独把 `lockoutEnabled` 设为 false,锁定时间最小 60 秒。
128
+
129
+ ## 独立初始凭据和安全邀请
130
+
131
+ CLI 创建完成时会提示四个用户名、职责及密码变量位置;不在终端打印明文密码。新项目已在 `.env.dev/.env.test/.env.prod` 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机密码,各环境也不同。服务首次启动才创建缺失账号;缺少对应初始密码时跳过该账号,已有账号不覆盖。Admin Console 仓库示例由部署者在私有环境/进程中提供下表四个变量,不能把模板随机密码当成示例的固定通用密码。同名进程变量或 `.env.local` 可覆盖;修改这些初始变量不会重设已有账号的密码。需要首次强改时,在首次创建这些账号前开启上一节的 `requireInitialChange`。
132
+
133
+ 日常创建业务账号希望改为一次性邀请,先配置真实发送通道,再设置:
134
+
135
+ ```yaml
136
+ initialCredentials:
137
+ enabled: true
138
+ passwordReset:
139
+ enabled: true
140
+ mode: email
141
+ resetUrl: https://app.example.com/
142
+ tokenExpiresIn: 3600
143
+ maxAttempts: 3
144
+ ```
145
+
146
+ 这些字段位于 `_iam.yml`。`mode: phone` 使用用户手机号和短信模板;邮箱模式须填写邮箱。`tokenExpiresIn` 单位秒、最小 300,`maxAttempts` 为验证次数。保留 `_reach.yml` 中的 `password_reset` / `password_reset_sms` 模板,把对应 provider 从开发 Console 换成真实 SMTP、短信或发送 API,并通过环境变量注入凭据。默认 Console 不是邮件或短信投递。已有引导账号不等于已绑定联系方式,各职责用户应先在个人资料中完善自己的邮箱/手机,才能使用对应的通知找回流程。
147
+
148
+ fullstack 是 HashRouter 工作区,设密界面在 Web 根页面:这里填写实际可访问的 Web 根 URL,不是 API 地址,也不是通用示例里的 `/auth/reset-password`。服务端会附加 `?token=…`,页面进入设密流程,完成后清理 URL 中的令牌。没有可访问 Web 入口时,应先安排可用设密入口,或使用认证页“已有令牌”的流程。
149
+
150
+ 开启后用户管理走邀请流程,不向管理员展示可共享的初始秘密。关闭重置、缺少通道或缺少对应联系方式会失败。通知失败或结果不明时账号可能已创建;先核对用户与渠道,再通过重置流程处理,不要反复创建或盲目重发。
151
+
152
+ ## 敏感操作重新认证
153
+
154
+ ```yaml
155
+ reauthentication:
156
+ enabled: true
157
+ ttlSeconds: 300
158
+ operations:
159
+ - iam.users.delete
160
+ - iam.roles.update
161
+ - audit.backup
162
+ - business.settings.update
163
+ ```
164
+
165
+ 放入 `_iam.yml`。用户先正常登录,点击清单中的敏感动作后弹出“二次身份验证”窗口:输入当前账号密码,验证成功才提交这一笔操作;取消不提交,密码错误停留在弹窗并显示错误。它不是重新切换账号,也不会创建第二次登录会话。只有列入清单且服务端已接入的操作要求当前密码;证明有效期 1–900 秒,短期、单次、用户/当前会话/操作绑定,不提升原权限。没有可用本地密码的账号不能完成这种密码再认证,需要业务安排可用凭据或调整操作清单。
166
+
167
+ 模板已接入的标识包括:`iam.users.create`、`iam.users.invite`、`iam.users.update`、`iam.users.delete`、`iam.users.avatar`、`iam.roles.update`、`iam.profile.update`、`iam.profile.avatar`、`business.settings.update`、`audit.backup`。标准界面会按公开配置弹出再认证对话框。
168
+
169
+ 通用界面及交互由 `@h-ai/ui` 的 `ReauthenticationDialog` 和 `createSensitiveActions(actions)` 提供。模板的 shared 仅保留具体请求与凭据传递;其他模板/项目可传入 Kit 或 API client 的标准认证动作复用同一工厂,不需复制状态机。每个根布局创建一份,接公开策略,卸载时取消待确认动作。
170
+
171
+ 自定义业务不能只往清单里加一个名字:服务端在完成授权/资源校验后调用 `iam.auth.checkSensitiveOperation()`,客户端通过 shared 的 `requestSensitive()` 取得并传递凭据。操作名两端一致;无票据、过期、重复使用或用途不符都应拒绝。敏感操作标识不等于审计 action 名称,不能想当然地互换。
172
+
173
+ 权限表 `hai_iam_permissions.sensitive_operations` 还可保存操作 ID 列表。先启用主开关,系统管理员再进入“角色”页下方的“敏感操作”,选择一个权限并逐行填写,例如 `iam.users.delete`;对应 API 为 `admin.permissions.update`。主开关关闭时隐藏这块高级配置并省去策略列表请求。Admin Console 示例启用后在“权限管理”每行也有同一编辑入口,复用 UI 模块表单。实际集合为文件 `operations` 与所有权限记录的操作列表的并集,不受当前用户是否拥有该权限影响;删除权限或清空列表仅移除这条数据库规则,不能取消文件规则。`reauthentication.enabled: false` 关闭二次认证要求,数据库规则仍保留。服务端实时读取;标准 UI 在提交动作前获取最新公开策略,其他客户端应调用异步 `iam.getPublicConfig()`,同步 `iam.publicConfig` 只含文件快照。
174
+
175
+ 操作 ID 必须与服务端 `checkSensitiveOperation` / `requireSensitive` 守卫一致。给权限写一个未接入的 ID 不会自动拦截任意业务代码;新业务入口先做普通授权,再检查同名敏感操作。权限规则的写入仅授予系统管理职责,审计员、配置管理员和操作员不能修改。
176
+
177
+ ## 示例职责分离如何使用
178
+
179
+ | 登录账号/角色 | 示例职责 | 初始密码变量 |
180
+ | ----------------- | ---------------------------- | -------------------------------- |
181
+ | admin | 系统账号和角色管理 | `HAI_ADMIN_DEFAULT_PASSWORD` |
182
+ | audit_admin | 审计查询、统计和备份 | `HAI_AUDIT_ADMIN_PASSWORD` |
183
+ | config_admin | 业务基础配置,当前示例为公告 | `HAI_CONFIG_ADMIN_PASSWORD` |
184
+ | business_operator | 示例反馈业务处理 | `HAI_BUSINESS_OPERATOR_PASSWORD` |
185
+ | user | 普通自助和反馈提交 | 按注册/创建流程设置 |
186
+
187
+ 这部分已经启用,不需要一个“角色分离=true”。系统管理员统一管理全部职责账号的资料、状态、角色和密码,可在创建或编辑账号时选择全部五种职责;审计查询和业务配置仍按职责独立授权。重置密码不会激活休眠或注销账号,且会使目标账号已有会话失效。配置管理员的配置页不提供修改密码策略、审计保护等服务端安全配置的权限。
188
+
189
+ 角色名称及权限由 `src/server/security-roles.ts` 的 `APP_DUTIES` 维护,启动时按这个映射同步角色权限。项目改变职责时同步服务端守卫、UI 菜单和测试,不要只改菜单或临时改数据库。不把这些职责角色设成框架的 `rbac.superAdminRole`,模板会拒绝绕过职责分离的设置。这些是示例应用规则,可以按实际业务替换,不是框架对所有项目写死的角色。
190
+
191
+ ## 登录时间和客户端地址
192
+
193
+ ```yaml
194
+ loginAccess:
195
+ enabled: true
196
+ timezone: Asia/Shanghai
197
+ allowIps: [203.0.113.0/24]
198
+ denyIps: [203.0.113.42]
199
+ windows:
200
+ - days: [1, 2, 3, 4, 5]
201
+ start: '09:00'
202
+ end: '18:00'
203
+ ```
204
+
205
+ 放入 `_iam.yml`,并先将示例地址换成真实允许的办公网 IP/CIDR。支持 IPv4/IPv6,拒绝优先。空 IP 列表不限制地址;空 windows 不限制时间。星期为周一 1 到周日 7,起点包含、终点不包含;跨午夜按开始日归属。时区使用 IANA 名称,模板默认 UTC,不能把它当作中国本地时间。
206
+
207
+ 此项控制新登录及其他新建登录会话入口,不是业务 API 防火墙,也不会在 18 点自动结束已有会话。IP 来自宿主可信地址;反向代理必须正确配置可信代理,不要直接相信客户端自己填的转发头。只有启用了地址列表时,缺少可信地址才会拒绝登录。
208
+
209
+ ## 闲置、绝对期限、关闭页面和并发会话
210
+
211
+ ```yaml
212
+ session:
213
+ maxAge: 900
214
+ refreshTokenMaxAge: 604800
215
+ sliding: true
216
+ idleTimeout: 1800
217
+ absoluteTimeout: 28800
218
+ endOnPageHide: false
219
+ maxSessions: 3
220
+ singleDevice: false
221
+ singleDeviceMode: replace
222
+ ```
223
+
224
+ 放入 `_iam.yml`。上述示例为 access 15 分钟、refresh 凭据 7 天、闲置 30 分钟、首次登录起最多 8 小时、最多 3 个有效会话。时限单位均为秒。`maxAge` 不是严格闲置时间:自动刷新仍可能维持登录;`idleTimeout` 同时约束 access/refresh,自动刷新不延长闲置。服务端以受保护请求记录活动,业务自动轮询也可能构成请求活动。`absoluteTimeout` 不因刷新重新计时;期限变严可能影响存量会话。
225
+
226
+ fullstack 与 Admin Console 在已登录页面遇到明确的服务端会话失效时弹出“重新登录”,保留当前页面和表单。弹窗沿正常登录规则执行验证码、失败锁定、登录时间/IP 限制及首次/到期改密;只允许原账号恢复。成功后最多续接一次服务端明确以未认证拒绝的请求,取消则保留输入,不自动提交。网络断开、超时和 5xx 的写入结果不明确,不自动重放。整页刷新、关闭浏览器会销毁内存草稿,弹窗不能恢复这些数据;业务仍可按需实现自己的草稿保存。
227
+
228
+ `idleTimeout`、`absoluteTimeout`、`maxSessions` 的 0 分别关闭对应限制。`sliding` 控制 access 滑动延长,不会取消闲置/绝对期限。并发数包含 access 已到期但仍可刷新的有效会话,达到额度会拒绝新登录;应从旧会话退出或安排撤销。
229
+
230
+ 若只允许同一用户一个登录会话,把 `singleDevice` 改为 true。`singleDeviceMode: replace` 顶掉旧会话;`reject` 保留旧会话、拒绝新登录。它限制登录会话,不是采集硬件设备标识;与 `maxSessions` 同时配置时,单会话策略更严格。额度在新登录提交时原子执行,切换配置不承诺立即清退所有存量会话。
231
+
232
+ 按终端分别限制时保持 `singleDevice: false`,并设置:
233
+
234
+ ```yaml
235
+ session:
236
+ maxSessions: 3
237
+ terminalLimits:
238
+ web: 2
239
+ app: 1
240
+ terminalLimitMode: reject
241
+ ```
242
+
243
+ 这允许同一账号最多两个 Web 会话和一个 App 会话,总数也不超过 3。`terminalLimits: {}` 关闭分终端限制;非空时未列出的终端不能新登录。`terminalLimitMode: replace` 只替换同类最早会话,`reject` 保留旧会话并拒绝新登录;替换后仍受全局 `maxSessions` 约束。要无论终端总共只允许一个,配置 `singleDevice: true` 并选择 `singleDeviceMode`,或设置 `maxSessions: 1` 拒绝超额新登录。所有配额在同一用户的共享 CAS 中判定,不能用每节点计数代替。
244
+
245
+ 模板 Web/App/Desktop 已分别传入 `web/app/desktop`。标准 SDK 默认归为 `web`;纯 API 客户端应显式传 `api`。可信服务端直接用 API Key 登录且未提供终端上下文时归为 `api`。其他客户端可配置 `apiClient.init({ auth: { terminalType: 'app' } })` 或 `kit.client.create({ terminalType: 'app' })`;自定义可信服务端可通过 `AuthRequestContext.terminalType` 指定。旧会话归为 `web`。类型用于会话分组,不是硬件设备识别或设备真实性证明;终端标识来自客户端时不能把它当授权条件。需要可信设备身份时由项目网关/设备登记流程校验来源后传入。
246
+
247
+ `endOnPageHide: true` 会在非 BFCache 的页面离开事件中尽力撤销,也可能发生在刷新或整页导航,用户可能因此需要重登。崩溃、断网和系统杀进程可能不发送事件,因此它不能保证关闭立即退出;通常保留 false,先使用服务端闲置/绝对期限。点击正常退出始终走可靠服务端撤销,不依赖此开关。
248
+
249
+ ## 审计采集、分类、脱敏与保留
250
+
251
+ 在 `_audit.yml` 按需设置:
252
+
253
+ ```yaml
254
+ capture:
255
+ enabled: true
256
+ includeReads: false
257
+ privacy:
258
+ enabled: true
259
+ fields: [customerPhone, identityNumber]
260
+ retention:
261
+ enabled: true
262
+ minDays: 90
263
+ ```
264
+
265
+ 标准框架入口自动记录安全事件、重要写入和失败/拒绝;成功读取默认跳过。`includeReads: true` 会增加正常查询日志量。关闭自动采集不关闭显式 `audit.log()`。系统/业务分类、结果、等级、关联编号、可信来源及事件时身份快照是内置记录能力,不另设开关;历史空值不会伪造。
266
+
267
+ 业务详情按凭据和隐私字段名脱敏,`privacy.fields` 可补项目自己的键名,比较不区分大小写。即使关闭业务隐私开关,密码、token、captcha 等凭据仍脱敏。不要将敏感正文塞进 action、resource、resourceId 等标识字段。
268
+
269
+ 框架不能猜出项目自己的“订单审批”等业务含义;在业务服务完成/失败边界记录显式事件,分类为 business,并检查 `HaiResult.success`。事务事件使用现有 `audit.capture` 事务上下文配合提交/回滚。审计管理员登录后可筛选分类、结果、级别、时间等;高级筛选还可选择排序字段和升降序,无需另开开关。当前页面统计是最近 7 天按 action 计数,不等于列表自选起止日期;业务需要其他统计周期时可使用 `audit.getStats(days, filters)` 扩展对应界面。
270
+
271
+ 保留保护在本模板默认关闭;上面的启用示例保护 90 天。共享数据库阻止保护期内修改、删除、冲突覆盖,`cleanup(0)` 也不能绕过。90 天后不会自动删除,备份也不自动清理数据库。已有数据库策略会持久保留,删掉配置段不等于解除保护,可信启动配置显式设为 false 才解除;已有部署需要保护时应保留 true,不要以示例默认覆盖其策略。集群须统一配置。
272
+
273
+ ## 手动与自动审计备份
274
+
275
+ ```yaml
276
+ backup:
277
+ enabled: true
278
+ batchSize: 200
279
+ maxRecordBytes: 1048576
280
+ schedule:
281
+ enabled: true
282
+ cron: '0 2 * * *'
283
+ timezone: Asia/Shanghai
284
+ ```
285
+
286
+ 放入 `_audit.yml`。只需手动备份时保持 `schedule.enabled: false`,由 audit_admin 在审计页点击备份;定时备份需要两个 enabled 都为 true。模板已把 `audit.schedulerPlan` 接入现有 Scheduler,无需另写系统 cron。这里每天中国时间 02:00 执行;默认 timezone 为 UTC 时,同一 cron 对应中国时间 10:00。
287
+
288
+ `batchSize` 为每批记录数(1–1000),`maxRecordBytes` 为单条 UTF-8 字节上限(默认 1 MiB,范围 1 KiB–64 MiB);超限失败,不截断原记录。回执包含 key、记录数和 SHA-256,失败重试沿用同一执行编号;已有完整归档经校验后复用,不覆盖。管理页已保留本次编号及回执。
289
+
290
+ 归档位于私有命名空间 `hai-private/audit-backups/`,不是公开下载链接。生产使用私有存储,开启时拒绝配置公开 publicUrl 的 S3;数据库保留策略与对象存储的保留/访问策略分别管理。校验用 `audit.backup.verify()` 并检查结果。归档支持离线核对,不是运行中数据库的原子时间点快照;严格恢复应停写/清理或采用数据库原生快照,并在独立环境恢复,不覆盖受保护在线记录。
291
+
292
+ ## 异常分级与告警人员
293
+
294
+ ```yaml
295
+ alerts:
296
+ enabled: true
297
+ maxNotificationsPerCheck: 100
298
+ rules:
299
+ - id: login-failures
300
+ actions: [auth.login]
301
+ outcomes: [failure, denied]
302
+ minimumSeverity: info
303
+ severity: warning
304
+ threshold: 10
305
+ windowSeconds: 300
306
+ targets:
307
+ - id: security-team
308
+ provider: email
309
+ to: security@example.com
310
+ schedule:
311
+ enabled: true
312
+ cron: '* * * * *'
313
+ timezone: Asia/Shanghai
314
+ ```
315
+
316
+ 放入 `_audit.yml`,并把收件人换成实际目标。`provider` 是 `_reach.yml` 中已注册的 provider 名称,不是 provider 类型;真实通知先配置真实通道。默认 Console 可看调试摘要,但不会发邮件。启用告警必须有规则,空规则会导致配置校验失败。
317
+
318
+ 本例是全站匹配事件在固定 5 分钟窗口累计达到 10 次后告警,不是对每个账号各计 10 次;账号登录锁定由前面的 security 配置控制。`actions` 精确匹配实际审计事件名,不支持 `auth.*` 通配;应从审计记录复制实际 action,OTP/LDAP 等需分别按实际事件名加入。`resource` 可选过滤资源,`outcomes` 为空表示不按结果过滤;默认只看 failure/denied。`minimumSeverity` 过滤事件最低等级,`severity` 是发出告警的等级。窗口范围 60–86400 秒;规则/目标 id 稳定且各自唯一,改变规则或目标可能产生新通知。
319
+
320
+ 告警功能和自动检查分别开启;仅手动检查可关闭 schedule,在可信服务端调用 `audit.checkAlerts()` 并同时检查 `success` 与报告的 `failed`。`maxNotificationsPerCheck` 限制一轮尝试数,报告 more 表示仍有待后续检查的目标。模板已接 Scheduler,开启计划后自动检查。
321
+
322
+ 通知只发送规则、等级、次数和窗口等摘要,不复制敏感事件正文。共享数据库认领避免多节点重复尝试;渠道接受/入队不等于人员已读。结果不明时核对渠道及审计告警记录,不盲目重发;停机超过两个窗口不会补发全部历史通知。
323
+
324
+ ## 传输容量、通知隐私与升级预检
325
+
326
+ 普通业务仍使用 `transport.maxPlaintextBytes`(auto/省略为 1 MiB);Feedback 的报告受理、证据、附件及 ZIP 下载路由通过 `routePlaintextBytes` 单独声明从已校验反馈配置派生的 `maxTransportBytes`,不依赖可选反馈的初始化/重试状态。路径中的 `*` 仅匹配一个完整路径段;宿主显式路由值优先。握手、adapter-node 与代理使用各路由最大容量,普通业务不会随材料预算扩大。HTTP 适配器为单独声明且大于 1 MiB 的材料路由保留最多 2 个槽,普通业务另有 16 个槽,完整响应/失败后释放;忙碌返回 503 / `hai:crypto:072`,不自动重放业务写入。
327
+
328
+ 反馈 console 通知默认 consoleContent: metadata,只打印编号、应用版本等元数据;summary 是显式选项,可能包含业务信息。Reach API 默认拒绝重定向,敏感发送始终拒绝重定向,生产敏感发送默认要求 HTTPS;可信内网例外必须显式配置 requireHttps: false 并评估网络边界。
329
+
330
+ 升级前可用 `hai upgrade <精确版本>` 检查实际消费的包和已发布迁移导出。报告出现 migrateAudit({ dryRun: true }) 时先只读预检,再按结果安排备份和实际迁移;报告本身不执行数据库迁移。旧部署缺少受管凭据状态时仍拒绝普通部署,按 hai-deploy skill 的凭据导入流程处理,不删除旧卷或生成新密码替代。
331
+
332
+ ## 其他模板和业务项目如何复用
333
+
334
+ | 能力 | 通用模块及接入边界 |
335
+ | ---- | ------------------ |
336
+ | 账号状态、密码、挑战、再认证、登录限制、会话 | `@h-ai/iam` 按同一配置执行服务端策略,不依赖 fullstack 页面或具体业务角色名 |
337
+ | 登录/注册/找回/初始或过期改密、挑战交互 | `@h-ai/ui` 的 `AuthPanel`;传 IAM 公开配置及标准认证动作,无需业务复制表单流程 |
338
+ | 已登录敏感动作确认 | `@h-ai/ui` 的 `createSensitiveActions(actions)` + `ReauthenticationDialog`,应用只写操作名、业务请求和本次证明传递 |
339
+ | Cookie / typed client 传输及页面离开通知 | Kit / API client 的 `createAuthActions`;服务端仍用 IAM 或 `kit.guard.requireSensitive` 校验 |
340
+ | 审计、脱敏、保留保护、备份和告警 | `@h-ai/audit`;复用 Scheduler、Storage、Reach,宿主装配已有模块及自己的业务事件 |
341
+ | 四类职责与示例管理页面 | 留在应用中维护;角色、权限、业务资源与具体流程不能写死进 UI 或 IAM |
342
+
343
+ admin、h5、website 等有认证界面的模板已复用标准认证组件与动作;API-only 项目使用服务端 IAM,不需要为了启用密码或会话策略引入 UI。没有审计管理业务的项目也不必搬入整个 fullstack 后台,只按需初始化审计及通知/备份依赖。既有项目升级不会自动添加业务守卫,仍须对实际敏感接口设置操作名并验证权限。
344
+
345
+ ## 建议的启用顺序与已有项目
346
+
347
+ 默认保留职责分离、基础密码长度、审计采集与凭据脱敏,额外复杂度、失败锁定、保留保护、闲置期限、备份和告警按业务要求分别开启。密码期限、首次改密、IP/时段、敏感操作和禁止重复登录先确认受影响用户和运维入口;不必一次开启全部增强。页面关闭即退出尤其应先评估刷新/导航体验。
348
+
349
+ 已存在的业务项目升级框架包,不会自动改写业务源码、守卫、表单和 YAML。核对认证动作、再认证服务端守卫、shared 对话框、页面离开接入、审计/Scheduler 装配与本指南;保留业务定制,不整目录覆盖。默认生产共享数据库、Redis 和私有存储的要求仍按项目现有部署规则执行;单机 Memory 不能证明跨节点并发额度或通知去重。