@h-ai/cli 1.0.0-beta.2 → 1.0.0-beta.21

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 (254) hide show
  1. package/README.en.md +74 -154
  2. package/README.ja.md +74 -154
  3. package/README.md +74 -154
  4. package/dist/{chunk-AKV2CQZV.js → chunk-2ZL5ORQ2.js} +316 -97
  5. package/dist/chunk-2ZL5ORQ2.js.map +1 -0
  6. package/dist/{chunk-EF7WOFWZ.js → chunk-L53P43B2.js} +1312 -163
  7. package/dist/chunk-L53P43B2.js.map +1 -0
  8. package/dist/cli-config-templates-LWMD2I6V.js +5 -0
  9. package/dist/{cli-config-templates-HHFHNXBN.js.map → cli-config-templates-LWMD2I6V.js.map} +1 -1
  10. package/dist/{cli-skill-templates-PN4FLGBC.js → cli-skill-templates-D6S2OQ6X.js} +3 -3
  11. package/dist/{cli-skill-templates-PN4FLGBC.js.map → cli-skill-templates-D6S2OQ6X.js.map} +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.js +30118 -3253
  14. package/dist/index.js.map +1 -1
  15. package/dist/metafile-esm.json +1 -1
  16. package/package.json +22 -18
  17. package/templates/README.md +45 -30
  18. package/templates/apps/admin/src/routes/+layout.svelte.hbs +16 -10
  19. package/templates/apps/admin/src/routes/+page.svelte.hbs +4 -4
  20. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +17 -7
  21. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +26 -6
  22. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +2 -2
  23. package/templates/apps/api/.dockerignore.hbs +10 -0
  24. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +8 -0
  25. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +6 -1
  26. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +13 -5
  27. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +13 -5
  28. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +3 -1
  29. package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +6 -2
  30. package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +24 -2
  31. package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +4 -4
  32. package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +74 -24
  33. package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +0 -1
  34. package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +153 -37
  35. package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +39 -13
  36. package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +106 -33
  37. package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +3 -1
  38. package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +3 -1
  39. package/templates/apps/api/e2e/api-serv.spec.ts.hbs +20 -3
  40. package/templates/apps/api/e2e/capture-evidence.ts.hbs +4 -1
  41. package/templates/apps/api/eslint.config.js.hbs +3 -1
  42. package/templates/apps/api/images/serv.Dockerfile.hbs +15 -10
  43. package/templates/apps/api/playwright.config.ts.hbs +23 -19
  44. package/templates/apps/api/pnpm-workspace.yaml.hbs +27 -16
  45. package/templates/apps/fullstack/.dockerignore.hbs +10 -0
  46. package/templates/apps/fullstack/.gitignore.hbs +7 -2
  47. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +14 -12
  48. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +5 -3
  49. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +10 -2
  50. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +1 -1
  51. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +10 -2
  52. package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +0 -1
  53. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +0 -1
  54. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +4 -1
  55. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +16 -4
  56. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +10 -8
  57. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +3 -3
  58. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +8 -2
  59. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +0 -1
  60. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +0 -2
  61. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +4 -1
  62. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +16 -4
  63. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +2 -0
  64. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +9 -9
  65. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +10 -2
  66. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +1 -0
  67. package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +0 -1
  68. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +0 -2
  69. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +4 -1
  70. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +19 -5
  71. package/templates/apps/fullstack/docs/security-configuration.md.hbs +4 -1
  72. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +140 -28
  73. package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +19 -5
  74. package/templates/apps/fullstack/eslint.config.js.hbs +3 -1
  75. package/templates/apps/fullstack/images/serv.Dockerfile.hbs +19 -11
  76. package/templates/apps/fullstack/images/web.Dockerfile.hbs +17 -8
  77. package/templates/apps/fullstack/package.json.hbs +2 -1
  78. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +7 -5
  79. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +114 -23
  80. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +57 -11
  81. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +3 -1
  82. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +17 -7
  83. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +13 -7
  84. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +17 -7
  85. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +10 -4
  86. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +65 -30
  87. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +0 -1
  88. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -2
  89. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +69 -21
  90. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +21 -5
  91. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +63 -11
  92. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +6 -1
  93. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +3 -1
  94. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +147 -33
  95. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +43 -12
  96. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +146 -30
  97. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +33 -10
  98. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +142 -26
  99. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +6 -2
  100. package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +3 -1
  101. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +48 -66
  102. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +1 -0
  103. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +1 -0
  104. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +1 -0
  105. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +9 -2
  106. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +0 -3
  107. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +15 -3
  108. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +33 -7
  109. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +16 -2
  110. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +104 -13
  111. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +37 -7
  112. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +9 -3
  113. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +25 -3
  114. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +133 -19
  115. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +14 -2
  116. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +66 -34
  117. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +132 -30
  118. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +8 -2
  119. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +23 -5
  120. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +143 -21
  121. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -2
  122. package/templates/apps/fullstack/playwright.config.ts.hbs +25 -3
  123. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +30 -14
  124. package/templates/apps/h5/src/routes/+layout.svelte.hbs +74 -30
  125. package/templates/apps/h5/src/routes/+page.svelte.hbs +2 -2
  126. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +2 -2
  127. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +2 -2
  128. package/templates/apps/mobile-app/capacitor.config.ts.hbs +5 -2
  129. package/templates/apps/mobile-app/messages/en-US.json +2 -2
  130. package/templates/apps/mobile-app/messages/ja-JP.json +2 -2
  131. package/templates/apps/mobile-app/messages/zh-CN.json +2 -2
  132. package/templates/apps/mobile-app/src/App.svelte.hbs +17 -5
  133. package/templates/apps/mobile-app/src/lib/api.ts.hbs +20 -6
  134. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +8 -1
  135. package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +6 -2
  136. package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -1
  137. package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +5 -1
  138. package/templates/apps/website/scripts/static-website.mjs.hbs +19 -6
  139. package/templates/apps/website/src/routes/+layout.svelte.hbs +56 -29
  140. package/templates/apps/website/src/routes/+page.svelte.hbs +4 -4
  141. package/templates/apps/website/src/routes/about/+page.svelte.hbs +2 -2
  142. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +2 -2
  143. package/templates/apps/website/src/routes/services/+page.svelte.hbs +20 -5
  144. package/templates/base/.dockerignore.hbs +10 -0
  145. package/templates/base/.gitignore.hbs +7 -2
  146. package/templates/base/e2e/app.spec.ts.hbs +130 -36
  147. package/templates/base/eslint-rules.js +44 -25
  148. package/templates/base/eslint.config.js.hbs +3 -1
  149. package/templates/base/images/web.Dockerfile.hbs +25 -14
  150. package/templates/base/package.json.hbs +13 -7
  151. package/templates/base/patches/daisyui-5.7.50.patch +8 -0
  152. package/templates/base/patches/deepmerge-4.3.1.patch +51 -0
  153. package/templates/base/playwright.config.ts +3 -1
  154. package/templates/base/pnpm-workspace.yaml.hbs +33 -16
  155. package/templates/base/src/app.d.ts.hbs +1 -1
  156. package/templates/base/src/app.html.hbs +1 -0
  157. package/templates/base/src/hooks.server.ts.hbs +44 -33
  158. package/templates/base/src/lib/build-metadata.ts.hbs +0 -1
  159. package/templates/base/src/lib/server/init.ts.hbs +146 -35
  160. package/templates/base/src/lib/server/kit-config.ts.hbs +7 -4
  161. package/templates/base/src/routes/+layout.server.ts.hbs +2 -2
  162. package/templates/base/svelte.config.js.hbs +10 -100
  163. package/templates/base/tests/scaffold.test.ts.hbs +12 -3
  164. package/templates/base/tsconfig.json.hbs +7 -4
  165. package/templates/base/vite.config.ts.hbs +108 -14
  166. package/templates/base/vitest.config.ts.hbs +6 -2
  167. package/templates/features/ai/routes/api/chat/+server.ts +3 -1
  168. package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +3 -3
  169. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +3 -3
  170. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +3 -3
  171. package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +3 -3
  172. package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +3 -3
  173. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +3 -3
  174. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +3 -3
  175. package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +3 -3
  176. package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +3 -3
  177. package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +3 -3
  178. package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +3 -3
  179. package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +3 -3
  180. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +14 -3
  181. package/templates/shared/browser-check/startup.js +115 -0
  182. package/templates/shared/browser-check/update.css +37 -0
  183. package/templates/shared/browser-check/update.html +19 -0
  184. package/templates/shared/browser-startup.spec.ts +23 -0
  185. package/templates/shared/build-metadata.ts +18 -4
  186. package/templates/shared/e2e-env.ts +22 -6
  187. package/templates/shared/native-name.d.mts +5 -0
  188. package/templates/shared/native-name.mjs +94 -0
  189. package/templates/shared/public-base-path.mjs +17 -4
  190. package/templates/shared/run-e2e.mjs +46 -12
  191. package/templates/shared/run-node.mjs +56 -0
  192. package/templates/shared/run-tauri.mjs +74 -0
  193. package/templates/shared/vite-runtime-config.ts +9 -3
  194. package/templates/skills/AGENTS.md +10 -73
  195. package/templates/skills/bridges/admin/AGENTS.md +9 -65
  196. package/templates/skills/bridges/api/AGENTS.md +8 -59
  197. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +9 -54
  198. package/templates/skills/bridges/h5/AGENTS.md +8 -63
  199. package/templates/skills/bridges/mobile-app/AGENTS.md +8 -62
  200. package/templates/skills/bridges/website/AGENTS.md +8 -63
  201. package/templates/skills/hai-ai/SKILL.md +6 -2
  202. package/templates/skills/hai-ai/acp.md +153 -0
  203. package/templates/skills/hai-ai/guide.md +27 -12
  204. package/templates/skills/hai-ai/reference.md +24 -15
  205. package/templates/skills/hai-ai/resources.md +69 -0
  206. package/templates/skills/hai-api-client/SKILL.md +1 -1
  207. package/templates/skills/hai-api-client/reference.md +3 -1
  208. package/templates/skills/hai-app-create/collaboration.md +7 -0
  209. package/templates/skills/hai-app-create/development.md +19 -10
  210. package/templates/skills/hai-app-create/project.md +33 -0
  211. package/templates/skills/hai-app-create/reference.md +10 -10
  212. package/templates/skills/hai-app-tests/reference.md +1 -1
  213. package/templates/skills/hai-app-tests/validation.md +1 -0
  214. package/templates/skills/hai-build/SKILL.md +19 -9
  215. package/templates/skills/hai-build/paths.md +4 -2
  216. package/templates/skills/hai-build/reference.md +26 -8
  217. package/templates/skills/hai-cache/reference.md +6 -2
  218. package/templates/skills/hai-capacitor/SKILL.md +1 -0
  219. package/templates/skills/hai-capacitor/reference.md +24 -0
  220. package/templates/skills/hai-ci/SKILL.md +3 -0
  221. package/templates/skills/hai-core/SKILL.md +9 -4
  222. package/templates/skills/hai-core/reference.md +40 -10
  223. package/templates/skills/hai-core/request-access.md +2 -2
  224. package/templates/skills/hai-crypto/SKILL.md +2 -2
  225. package/templates/skills/hai-crypto/reference.md +7 -3
  226. package/templates/skills/hai-deploy/SKILL.md +41 -5
  227. package/templates/skills/hai-deploy/middleware.md +26 -14
  228. package/templates/skills/hai-framework-sync/SKILL.md +13 -9
  229. package/templates/skills/hai-framework-sync/sync.md +2 -0
  230. package/templates/skills/hai-iam/reference.md +2 -2
  231. package/templates/skills/hai-kit/SKILL.md +1 -1
  232. package/templates/skills/hai-kit/reference.md +19 -5
  233. package/templates/skills/hai-payment/reference.md +41 -17
  234. package/templates/skills/hai-reach/SKILL.md +3 -1
  235. package/templates/skills/hai-reach/reference.md +29 -9
  236. package/templates/skills/hai-reldb/SKILL.md +1 -1
  237. package/templates/skills/hai-reldb/reference.md +9 -2
  238. package/templates/skills/hai-scheduler/reference.md +1 -1
  239. package/templates/skills/hai-serv/SKILL.md +2 -1
  240. package/templates/skills/hai-serv/reference.md +26 -15
  241. package/templates/skills/hai-storage/reference.md +23 -6
  242. package/templates/skills/hai-ui/SKILL.md +11 -6
  243. package/templates/skills/hai-ui/charts.md +51 -0
  244. package/templates/skills/hai-ui/guide.md +1 -1
  245. package/templates/skills/hai-ui/reference.md +58 -38
  246. package/templates/skills/hai-vecdb/reference.md +8 -3
  247. package/dist/chunk-AKV2CQZV.js.map +0 -1
  248. package/dist/chunk-EF7WOFWZ.js.map +0 -1
  249. package/dist/chunk-MUHRBJSW.js +0 -29272
  250. package/dist/chunk-MUHRBJSW.js.map +0 -1
  251. package/dist/cli-config-templates-HHFHNXBN.js +0 -5
  252. package/dist/src-TEBHR5I5.js +0 -5
  253. package/dist/src-TEBHR5I5.js.map +0 -1
  254. package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +0 -18
@@ -3,7 +3,6 @@
3
3
  {{#if features.feedback}}
4
4
  /** 当前应用编译时烘焙的产物身份;运行时配置不能覆盖。 */
5
5
  declare const __HAI_BUILD_METADATA__: { appVersion: string, buildId: string, commit: string }
6
-
7
6
  export const buildMetadata = __HAI_BUILD_METADATA__
8
7
  {{/if}}
9
8
  {{/if}}
@@ -7,7 +7,6 @@ export async function initCapacitor(): Promise<HaiResult<void>> {
7
7
  const result = await capacitor.init()
8
8
  if (!result.success)
9
9
  return result
10
-
11
10
  if (capacitor.isNative()) {
12
11
  return capacitor.statusBar.configure({
13
12
  style: 'dark',
@@ -5,7 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
5
5
 
6
6
  /** @type {import('@sveltejs/vite-plugin-svelte').SvelteConfig} */
7
7
  const config = {
8
- preprocess: [autoImportHaiUi(), vitePreprocess()],
8
+ preprocess: [
9
+ vitePreprocess(),
10
+ autoImportHaiUi(),
11
+ ],
9
12
  compilerOptions: {
10
13
  // 使用 Svelte 5 Runes,和 @h-ai/ui 组件库保持一致。
11
14
  runes: true,
@@ -14,7 +14,9 @@ import { resolveBuildMetadata } from '../../scripts/build-metadata.js'
14
14
  const envDir = fileURLToPath(new URL('../../', import.meta.url))
15
15
 
16
16
  export default defineConfig(({ mode, command }) => {
17
- const envResult = command === 'build' || process.env.HAI_E2E === '1' ? { success: true as const, data: {} as Record<string, string> } : core.config.loadEnvFiles({ mode, envDir })
17
+ const envResult = command === 'build' || process.env.HAI_E2E === '1'
18
+ ? { success: true as const, data: {} as Record<string, string> }
19
+ : core.config.loadEnvFiles({ mode, envDir })
18
20
  if (!envResult.success)
19
21
  throw new Error(envResult.error.message)
20
22
  const env = envResult.data
@@ -23,15 +25,23 @@ export default defineConfig(({ mode, command }) => {
23
25
  const metadataAsset: Plugin = {
24
26
  name: 'hai-build-metadata',
25
27
  generateBundle() {
26
- this.emitFile({ type: 'asset', fileName: 'build-metadata.json', source: JSON.stringify(buildMetadata) })
28
+ this.emitFile({
29
+ type: 'asset',
30
+ fileName: 'build-metadata.json',
31
+ source: JSON.stringify(buildMetadata),
32
+ })
27
33
  },
28
34
  }
29
35
  const target = (env.PUBLIC_API_BASE || process.env.SERVICE_BASE_URL || 'http://127.0.0.1:3000').replace(/\/api\/v1\/?$/, '')
30
- const proxy = { '/api': { target, changeOrigin: true } }
36
+ const proxy = {
37
+ '/api': { target, changeOrigin: true },
38
+ }
31
39
  return {
32
40
  base: './',
33
41
  envDir: false,
34
- define: { __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata) },
42
+ define: {
43
+ __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata),
44
+ },
35
45
  server: { proxy },
36
46
  preview: { proxy },
37
47
  build: {
@@ -51,6 +61,8 @@ export default defineConfig(({ mode, command }) => {
51
61
  metadataAsset,
52
62
  svelte(),
53
63
  paraglideVitePlugin({
64
+ // 共享物理消息产物供独立 Vitest/Node 工具读取。
65
+ outputStructure: 'message-modules',
54
66
  project: './project.inlang',
55
67
  outdir: './src/lib/paraglide',
56
68
  strategy: ['cookie', 'baseLocale'],
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 简介
6
6
 
7
- 桌面端工程,参考 `apps/desktop-app` 使用 Tauri v2 + Svelte 5 + Vite,前端通过共享 contract 调用 `{{fullstack.servPackageName}}`。
7
+ Tauri v2 + Svelte 5 + Vite桌面工程,前端通过共享contract调用 `{{fullstack.servPackageName}}`。
8
8
 
9
9
  ## 核心功能清单
10
10
 
@@ -16,6 +16,8 @@
16
16
 
17
17
  ### i18n 与 shared 协同
18
18
 
19
+ 先从工程根安装依赖、启动Serv并配置实际API地址,再运行tauri:dev。有效账号登录后使用相同共享管理界面;输入受权限允许的管理操作,输出与Web一致。关闭并重启原生程序后内存凭据不保留,需要重新登录;外观/语言属于服务器偏好,登录后恢复。
20
+
19
21
  - 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
20
22
  - 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
21
23
  - 个人设置保存语言与风格偏好到 IAM 元数据,并同步 shared 和本端 Paraglide runtime
@@ -26,6 +28,8 @@
26
28
 
27
29
  ### 编译、打包与部署
28
30
 
31
+ 产品名和主窗口初始标题统一取工程根环境文件解析后的 `packages/{{fullstack.servPackageName}}/config/_core.yml` 的 `name`,可用 `HAI_CORE_NAME` 覆盖。`tauri:dev` 默认 `dev`、打包默认 `prod`;进程 `HAI_CORE_ENV` 可指定模式。请使用下面的 `pnpm` 入口,直接 `pnpm exec tauri` / `cargo tauri` 会绕过名称解析。入口通过 `--config` 覆盖,不回写 JSON;显式追加的 `--config` 保留最终覆盖权。
32
+
29
33
  ```bash
30
34
  # 仅前端开发,默认端口 {{fullstack.ports.desktop}}
31
35
  pnpm --filter {{projectName}}-desktop dev
@@ -40,17 +44,15 @@ pnpm --filter {{projectName}}-desktop build
40
44
  pnpm build --target desktop --platform windows --arch x64
41
45
  ```
42
46
 
43
- 打包前需要安装 Rust 工具链和 Tauri 平台依赖。构建不读取 .env.prod/.env.local;启动已安装程序前设置进程 PUBLIC_API_BASE(HTTP(S),不含凭据、查询和片段)。Rust 会在页面加载前注入公开地址,仅将该 Origin 加入 CSP;不需要为 test/prod 重打安装包。缺省连接 http://localhost:3000/api/v1。
44
-
45
- ### IAM 认证配置
47
+ 打包前需要安装 Rust 工具链和 Tauri 平台依赖。原生名称按 Core 规则读取环境文件,只将名称传入 Tauri 配置;前端源码编译不读取部署环境文件。启动已安装程序前设置进程 PUBLIC_API_BASE(HTTP(S),不含凭据、查询和片段)。Rust 会在页面加载前注入公开地址,仅将该 Origin 加入 CSP;不需要为 API 地址的 test/prod 切换重打安装包,修改原生名称仍需重新打包。缺省连接 http://localhost:3000/api/v1。
46
48
 
47
- 服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token、验证码倒计时和错误提示。Memory 仅用于本地开发和显式测试;生产环境即使只有一个实例,也须使用框架支持的共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
49
+ 加 `--debug` 生成调试安装包。成功后 CLI 打印 `.hai/build/desktop/<平台>/<构建类型>/build-{{projectName}}-desktop-<平台>-<架构>-<类型>-YYYYMMDD-HHmmss-<随机串>-<版本>/` 中的归档路径。Windows 文件名如 `{{projectName}}-windows-x64-release-<版本>-setup.exe`;使用工程标识,产品显示名仍取 Core。
48
50
 
49
- LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IAM 服务端 workspace 安装 ldapts,再配置 login.ldap 与连接信息。自定义 onOtpSendEmail/onOtpSendSms/onPasswordResetRequest 回调可独立于 Reach 使用,投递失败须拒绝 Promise;回调第三参数 context 提供 expiresAt/idempotencyKey,发送服务按稳定键持久化去重,异常/超时为结果未知且不自动重发。协议在 Modal 显示;LoginForm/RegisterForm 提供 header/extraFields/footer,AuthPanel 透传 loginHeader/loginFields/loginFooter 和 registerHeader/registerFields/registerFooter。配置及例子见生成项目的 hai-iam/hai-ui skills。
51
+ ### 认证与模块导航
50
52
 
51
- 协议支持配置中的 userAgreementMarkdown/privacyPolicyMarkdown 正文及 URL;同主题优先 Markdown,由安全渲染器在弹窗显示。
53
+ 认证方式、注册、密码策略、协议与品牌由Serv的 `_iam.yml` 控制。前端只接收安全公开配置,使用共享AuthPanel和加密typed client;服务端再次核验权限。LDAP、通知回调、用途证明和会话限制在服务端接入,不把私密配置复制到客户端。
52
54
 
53
- 完整契约见生成应用的 `.agents/skills/hai-iam/reference.md`。
55
+ 所有前端共用的偏好、认证存储、表单、审计与帮助行为见[共享工作区](../../packages/{{fullstack.sharedPackageName}}/README.md),详细配置见[生成应用IAM技能](../../.agents/skills/hai-iam/reference.md)。
54
56
 
55
57
  启用反馈时使用 SDK 原生保存对话框,Tauri dialog/fs 插件只允许选择路径后写入。CSP 允许图片和视频 blob 预览、沙箱回放,脚本和网络来源限制保持明确;Web 浏览器验证不代替系统 WebView/安装包验收。
56
58
 
@@ -23,9 +23,9 @@
23
23
  "test": "pnpm paraglide:compile && vitest run --passWithNoTests",
24
24
  "test:watch": "pnpm paraglide:compile && vitest",
25
25
  "clean": "rimraf dist .turbo src-tauri/target src/lib/paraglide",
26
- "tauri": "tauri",
27
- "tauri:dev": "tauri dev",
28
- "tauri:build": "tauri build"
26
+ "tauri": "node ../../scripts/run-tauri.mjs ../.. packages/{{fullstack.servPackageName}}/config/_core.yml",
27
+ "tauri:dev": "pnpm tauri dev",
28
+ "tauri:build": "pnpm tauri build"
29
29
  },
30
30
  "dependencies": {
31
31
  "@h-ai/api-client": "{{haiPackageSpecifier}}",
@@ -12,8 +12,14 @@
12
12
  const native = '__TAURI_INTERNALS__' in globalThis
13
13
  const apiOptions: ManagementApiOptions = {
14
14
  clientName: '{{projectName}}-desktop',
15
- terminalType: 'desktop',
16
- ...(native ? { requireApiBase: true, tokenStorage: apiClient.tokenStorage.memory(), headers: { 'X-HAI-Token-Transport': 'body' } } : {}),
15
+ terminalType: 'desktop',
16
+ ...(native
17
+ ? {
18
+ requireApiBase: true,
19
+ tokenStorage: apiClient.tokenStorage.memory(),
20
+ headers: { 'X-HAI-Token-Transport': 'body' },
21
+ }
22
+ : {}),
17
23
  }
18
24
 
19
25
  function syncLocale(locale: string) {
@@ -3,7 +3,6 @@
3
3
  {{#if features.feedback}}
4
4
  /** 当前应用编译时烘焙的产物身份;运行时配置不能覆盖。 */
5
5
  declare const __HAI_BUILD_METADATA__: { appVersion: string, buildId: string, commit: string }
6
-
7
6
  export const buildMetadata = __HAI_BUILD_METADATA__
8
7
  {{/if}}
9
8
  {{/if}}
@@ -2,7 +2,6 @@
2
2
  {{#if fullstack.frontends.desktop}}
3
3
  {
4
4
  "$schema": "https://schema.tauri.app/config/2",
5
- "productName": {{json fullstack.appName}},
6
5
  "version": "../../../package.json",
7
6
  "identifier": "com.hai.{{fullstack.nativeAppIdSegment}}.desktop",
8
7
  "build": {
@@ -14,7 +13,6 @@
14
13
  "app": {
15
14
  "windows": [
16
15
  {
17
- "title": {{json fullstack.appName}},
18
16
  "width": 1280,
19
17
  "height": 800,
20
18
  "resizable": true,
@@ -5,7 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
5
5
 
6
6
  /** @type {import('@sveltejs/vite-plugin-svelte').SvelteConfig} */
7
7
  export default {
8
- preprocess: [autoImportHaiUi(), vitePreprocess()],
8
+ preprocess: [
9
+ vitePreprocess(),
10
+ autoImportHaiUi(),
11
+ ],
9
12
  compilerOptions: {
10
13
  // 使用 Svelte 5 Runes,和 @h-ai/ui 组件库保持一致。
11
14
  runes: true,
@@ -15,7 +15,9 @@ const host = process.env.TAURI_DEV_HOST
15
15
  const envDir = fileURLToPath(new URL('../../', import.meta.url))
16
16
 
17
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 })
18
+ const envResult = command === 'build' || process.env.HAI_E2E === '1'
19
+ ? { success: true as const, data: {} as Record<string, string> }
20
+ : core.config.loadEnvFiles({ mode, envDir })
19
21
  if (!envResult.success)
20
22
  throw new Error(envResult.error.message)
21
23
  const env = envResult.data
@@ -24,16 +26,24 @@ export default defineConfig(({ mode, command }) => {
24
26
  const metadataAsset: Plugin = {
25
27
  name: 'hai-build-metadata',
26
28
  generateBundle() {
27
- this.emitFile({ type: 'asset', fileName: 'build-metadata.json', source: JSON.stringify(buildMetadata) })
29
+ this.emitFile({
30
+ type: 'asset',
31
+ fileName: 'build-metadata.json',
32
+ source: JSON.stringify(buildMetadata),
33
+ })
28
34
  },
29
35
  }
30
36
  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 } }
37
+ const proxy = {
38
+ '/api': { target, changeOrigin: true },
39
+ }
32
40
 
33
41
  return {
34
42
  base: './',
35
43
  envDir: false,
36
- define: { __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata) },
44
+ define: {
45
+ __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata),
46
+ },
37
47
  preview: { proxy },
38
48
  build: {
39
49
  rolldownOptions: {
@@ -53,6 +63,8 @@ export default defineConfig(({ mode, command }) => {
53
63
  svelte(),
54
64
  tailwindcss(),
55
65
  paraglideVitePlugin({
66
+ // 共享物理消息产物供独立 Vitest/Node 工具读取。
67
+ outputStructure: 'message-modules',
56
68
  project: './project.inlang',
57
69
  outdir: './src/lib/paraglide',
58
70
  strategy: ['cookie', 'baseLocale'],
@@ -15,6 +15,8 @@
15
15
 
16
16
  选定小程序框架后再实现页面、请求适配和认证。小程序文案放本目录 `messages/`,跨端通用内容放 `packages/{{fullstack.sharedPackageName}}`;消息格式插件使用工程根已安装的依赖。
17
17
 
18
+ 例如在messages加入一条中英日文业务提示,当前输出只是可供后续接入的消息资源,不会生成页面或安装包。引用contract只获得输入输出类型,不能自动获得请求传输、登录、安全存储或平台权限。建立真正的小程序工程后再加入workspace、运行脚本和发布流程。
19
+
18
20
  ## 开发测试
19
21
 
20
22
  本目录不参与 workspace 构建、单元测试或 E2E。接入实际框架后增加对应命令,并在目标平台验证登录、请求、导航与发布包。
@@ -16,6 +16,8 @@
16
16
 
17
17
  ### i18n 与 shared 协同
18
18
 
19
+ 从根目录安装依赖并启动Serv,再执行本页dev命令。输入有效测试账号后进入共享管理界面;普通用户只能看到被授权的功能。修改个人资料成功才结束编辑,失败保留输入。个人设置的主题/语言保存后,刷新并重新登录应能恢复。
20
+
19
21
  - 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
20
22
  - 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
21
23
  - 个人设置保存语言与风格偏好到 IAM 元数据,并同步 shared 和本端 Paraglide runtime
@@ -24,6 +26,8 @@
24
26
 
25
27
  ### 编译、打包与部署
26
28
 
29
+ 入口 HTML 在主应用前执行 `public/_hai/browser-check/startup.js`。Chrome/Edge 低于 111、Firefox 低于 114、Safari 或 iOS/iPadOS 低于 16.4 时,独立升级页会显示当前版本、最低要求和厂商更新入口。发布时连同该目录的 HTML 和样式一起部署。
30
+
27
31
  ```bash
28
32
  # 开发预览,默认端口 {{fullstack.ports.web}}
29
33
  pnpm --filter {{projectName}}-web dev
@@ -32,21 +36,17 @@ pnpm --filter {{projectName}}-web dev
32
36
  pnpm --filter {{projectName}}-web build
33
37
  ```
34
38
 
35
- 从工程根运行 `pnpm build --target docker` 导出镜像。默认带部署工具,可运行 `pnpm run deploy --env test --build` 一次完成构建发布,或 `pnpm run deploy --env prod --bundle-only` 交付已有镜像及跨平台脚本。完整包包含自建中间件,人工部署与按服务更新见工程根 README。
36
-
37
- ### IAM 认证配置
38
-
39
- 服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token、验证码倒计时和错误提示。Memory 仅用于本地开发和显式测试;生产环境即使只有一个实例,也须使用框架支持的共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
39
+ 从工程根运行 `pnpm build --target image` 导出镜像。默认带部署工具,可运行 `pnpm run deploy --env test --build` 一次完成构建发布,或 `pnpm run deploy --env prod --bundle-only` 交付已有镜像及跨平台脚本。完整包包含自建中间件,人工部署与按服务更新见工程根 README。
40
40
 
41
- LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IAM 服务端 workspace 安装 ldapts,再配置 login.ldap 与连接信息。自定义 onOtpSendEmail/onOtpSendSms/onPasswordResetRequest 回调可独立于 Reach 使用,投递失败须拒绝 Promise;回调第三参数 context 提供 expiresAt/idempotencyKey,发送服务按稳定键持久化去重,异常/超时为结果未知且不自动重发。协议在 Modal 显示;LoginForm/RegisterForm 提供 header/extraFields/footer,AuthPanel 透传 loginHeader/loginFields/loginFooter 和 registerHeader/registerFields/registerFooter。配置及例子见生成项目的 hai-iam/hai-ui skills。
41
+ ### 认证与模块导航
42
42
 
43
- 协议支持配置中的 userAgreementMarkdown/privacyPolicyMarkdown 正文及 URL;同主题优先 Markdown,由安全渲染器在弹窗显示。
43
+ 认证方式、注册、密码策略、协议与品牌由Serv的 `_iam.yml` 控制。前端只接收安全公开配置,使用共享AuthPanel和加密typed client;服务端再次核验权限。LDAP、通知回调、用途证明和会话限制在服务端接入,不把私密配置复制到客户端。
44
44
 
45
- 完整契约见生成应用的 `.agents/skills/hai-iam/reference.md`。
45
+ 所有前端共用的偏好、认证存储、表单、审计与帮助行为见[共享工作区](../../packages/{{fullstack.sharedPackageName}}/README.md),详细配置见[生成应用IAM技能](../../.agents/skills/hai-iam/reference.md)。
46
46
 
47
47
  ## 开发测试
48
48
 
49
- 从工程根执行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test` 和 `pnpm test:e2e`。浏览器预览通过后,原生壳仍需在对应系统或设备单独验收。
49
+ 从工程根执行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test` 和 `pnpm test:e2e`。浏览器通过后仍需在实际公开地址验证部署、认证与持久数据。
50
50
 
51
51
  ## 许可证
52
52
 
@@ -5,9 +5,17 @@ import { haiQualityConfig } from '../../eslint-rules.js'
5
5
 
6
6
  export default antfu({
7
7
  // unused-imports 使用 TS 规则,JS 同样使用 TS parser 以保持 scope 契约一致。
8
- typescript: { files: [GLOB_SRC] },
8
+ typescript: {
9
+ files: [GLOB_SRC],
10
+ },
9
11
  formatters: true,
10
- ignores: ['**/build/**', '**/dist/**', '**/*.d.ts', '**/project.inlang/**', '**/src/lib/paraglide/**'],
12
+ ignores: [
13
+ '**/build/**',
14
+ '**/dist/**',
15
+ '**/*.d.ts',
16
+ '**/project.inlang/**',
17
+ '**/src/lib/paraglide/**',
18
+ ],
11
19
  svelte: true,
12
20
  }, haiQualityConfig, {
13
21
  files: ['**/*.svelte'],
@@ -5,6 +5,7 @@
5
5
  <head>
6
6
  <meta charset="UTF-8" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1" />
8
+ <script id="hai-browser-startup" src="./_hai/browser-check/startup.js"></script>
8
9
  <title>{{html fullstack.appName}}</title>
9
10
  <link
10
11
  rel="icon"
@@ -3,7 +3,6 @@
3
3
  {{#if features.feedback}}
4
4
  /** 当前应用编译时烘焙的产物身份;运行时配置不能覆盖。 */
5
5
  declare const __HAI_BUILD_METADATA__: { appVersion: string, buildId: string, commit: string }
6
-
7
6
  export const buildMetadata = __HAI_BUILD_METADATA__
8
7
  {{/if}}
9
8
  {{/if}}
@@ -7,8 +7,6 @@ import './app.css'
7
7
  const target = document.getElementById('app')
8
8
  if (!target)
9
9
  throw new Error('Root element #app not found')
10
-
11
10
  const app = mount(App, { target })
12
-
13
11
  export default app
14
12
  {{/if}}
@@ -5,7 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
5
5
 
6
6
  /** @type {import('@sveltejs/vite-plugin-svelte').SvelteConfig} */
7
7
  const config = {
8
- preprocess: [autoImportHaiUi(), vitePreprocess()],
8
+ preprocess: [
9
+ vitePreprocess(),
10
+ autoImportHaiUi(),
11
+ ],
9
12
  compilerOptions: {
10
13
  // 使用 Svelte 5 Runes,和 @h-ai/ui 组件库保持一致。
11
14
  runes: true,
@@ -15,7 +15,9 @@ import { resolvePublicBasePath } from '../../scripts/public-base-path.mjs'
15
15
  const envDir = fileURLToPath(new URL('../../', import.meta.url))
16
16
 
17
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 })
18
+ const envResult = command === 'build' || process.env.HAI_E2E === '1'
19
+ ? { success: true as const, data: {} as Record<string, string> }
20
+ : core.config.loadEnvFiles({ mode, envDir })
19
21
  if (!envResult.success)
20
22
  throw new Error(envResult.error.message)
21
23
  const env = envResult.data
@@ -24,16 +26,26 @@ export default defineConfig(({ mode, command }) => {
24
26
  const metadataAsset: Plugin = {
25
27
  name: 'hai-build-metadata',
26
28
  generateBundle() {
27
- this.emitFile({ type: 'asset', fileName: 'build-metadata.json', source: JSON.stringify(buildMetadata) })
29
+ this.emitFile({
30
+ type: 'asset',
31
+ fileName: 'build-metadata.json',
32
+ source: JSON.stringify(buildMetadata),
33
+ })
28
34
  },
29
35
  }
30
36
  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 } }
37
+ const proxy = {
38
+ '/api': { target, changeOrigin: true },
39
+ }
32
40
  const publicBase = resolvePublicBasePath()
33
41
  return {
34
- base: publicBase ? `${publicBase}/` : './',
42
+ base: publicBase
43
+ ? `${publicBase}/`
44
+ : './',
35
45
  envDir: false,
36
- define: { __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata) },
46
+ define: {
47
+ __HAI_BUILD_METADATA__: JSON.stringify(buildMetadata),
48
+ },
37
49
  server: { proxy },
38
50
  preview: { proxy },
39
51
  build: {
@@ -53,6 +65,8 @@ export default defineConfig(({ mode, command }) => {
53
65
  metadataAsset,
54
66
  svelte(),
55
67
  paraglideVitePlugin({
68
+ // 共享物理消息产物供独立 Vitest/Node 工具读取。
69
+ outputStructure: 'message-modules',
56
70
  project: './project.inlang',
57
71
  outdir: './src/lib/paraglide',
58
72
  strategy: ['cookie', 'baseLocale'],
@@ -7,6 +7,7 @@
7
7
  | 文件 | 用途 |
8
8
  | ------------------------------------------------------------ | -------------------------------------------------- |
9
9
  | `packages/{{projectName}}-serv/config/_iam.yml` | 账号、密码、验证码、锁定、敏感操作、登录限制、会话 |
10
+ | `packages/{{projectName}}-serv/config/_serv.yml` | API 传输加密及请求时间窗口 |
10
11
  | `packages/{{projectName}}-serv/config/_audit.yml` | 审计采集、脱敏、保留、备份、告警 |
11
12
  | `packages/{{projectName}}-serv/config/_reach.yml` | 邮件、短信或通知 API 及通知模板 |
12
13
  | `packages/{{projectName}}-serv/config/_scheduler.yml` | 已有 Scheduler 的持久化及调度参数 |
@@ -30,6 +31,8 @@ HAI_AUDIT_BACKUP_ENABLED=true
30
31
 
31
32
  这里列的是 fullstack 模板默认值,不是所有项目或底层 Schema 的普适限制。
32
33
 
34
+ 加密请求默认有效 300 秒,允许客户端时间领先服务器最多 30 秒。可在 `_serv.yml` 的 `transport` 下设置 `maxRequestAgeSeconds`(1~600)和 `maxFutureSkewSeconds`(0~300),单位为整数秒。超限时,前端显示校验时的服务器 UTC 时间,提示用户开启设备自动校时或手工修改时间,然后刷新。升级旧版本后,从最后一个旧节点停止处理请求起等待 12 分钟,再把请求有效期调到 300 秒以上。
35
+
33
36
  | 条目 | fullstack 默认及启用入口 | 使用影响 |
34
37
  | ---------------------------- | --------------------------------------------------------------- | -------------------------------------------------------- |
35
38
  | B03 长期/临时账号 | 用户管理中的账号类型、到期时间 | 临时账号必须有未来到期时间;到期后旧会话也不能继续使用 |
@@ -128,7 +131,7 @@ security:
128
131
 
129
132
  ## 独立初始凭据和安全邀请
130
133
 
131
- CLI 创建完成时会提示四个用户名、职责及密码变量位置;不在终端打印明文密码。新项目已在 `.env.dev/.env.test/.env.prod` 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机密码,各环境也不同。服务首次启动才创建缺失账号;缺少对应初始密码时跳过该账号,已有账号不覆盖。Admin Console 仓库示例由部署者在私有环境/进程中提供下表四个变量,不能把模板随机密码当成示例的固定通用密码。同名进程变量或 `.env.local` 可覆盖;修改这些初始变量不会重设已有账号的密码。需要首次强改时,在首次创建这些账号前开启上一节的 `requireInitialChange`。
134
+ CLI 创建完成时会提示四个用户名、职责及密码变量位置;不在终端打印明文密码。新项目已在 `.env.dev.local/.env.test.local/.env.prod.local` 中为 admin、audit_admin、config_admin、business_operator 分别生成独立随机密码,各环境也不同。服务首次启动才创建缺失账号;缺少对应初始密码时跳过该账号,已有账号不覆盖。Admin Console 仓库示例由部署者在私有环境/进程中提供下表四个变量,不能把模板随机密码当成示例的固定通用密码。同名进程变量或 `.env.local` 可覆盖;修改这些初始变量不会重设已有账号的密码。需要首次强改时,在首次创建这些账号前开启上一节的 `requireInitialChange`。
132
135
 
133
136
  日常创建业务账号希望改为一次性邀请,先配置真实发送通道,再设置:
134
137