@h-ai/cli 0.1.0-alpha.65 → 0.1.0-alpha.67

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 (141) hide show
  1. package/README.en.md +66 -251
  2. package/README.ja.md +67 -252
  3. package/README.md +66 -251
  4. package/dist/{chunk-47V5OT22.js → chunk-7DSURTJ4.js} +32 -115
  5. package/dist/chunk-7DSURTJ4.js.map +1 -0
  6. package/dist/{chunk-IPG3QNYK.js → chunk-AOQ4N657.js} +212 -8
  7. package/dist/chunk-AOQ4N657.js.map +1 -0
  8. package/dist/cli-config-templates-6AHNUGBN.js +5 -0
  9. package/dist/{cli-config-templates-SJ2MBIR7.js.map → cli-config-templates-6AHNUGBN.js.map} +1 -1
  10. package/dist/{cli-skill-templates-A5VIR5J6.js → cli-skill-templates-FC3QRKDO.js} +3 -3
  11. package/dist/{cli-skill-templates-A5VIR5J6.js.map → cli-skill-templates-FC3QRKDO.js.map} +1 -1
  12. package/dist/index.js +644 -391
  13. package/dist/index.js.map +1 -1
  14. package/dist/{src-6PPBKQ6Q.js → src-2V6VP4I5.js} +972 -520
  15. package/dist/src-2V6VP4I5.js.map +1 -0
  16. package/package.json +8 -8
  17. package/templates/README.md +48 -145
  18. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +1 -1
  19. package/templates/apps/api/.dockerignore.hbs +18 -12
  20. package/templates/apps/api/.gitignore.hbs +9 -1
  21. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +23 -2
  22. package/templates/apps/api/apps/{{projectName}}-service/README.md.hbs +28 -7
  23. package/templates/apps/api/apps/{{projectName}}-service/package.json.hbs +1 -3
  24. package/templates/apps/api/hai.build.json.hbs +1 -0
  25. package/templates/apps/api/images/app.Dockerfile.hbs +35 -0
  26. package/templates/apps/api/package.json.hbs +10 -8
  27. package/templates/apps/fullstack/.dockerignore.hbs +18 -14
  28. package/templates/apps/fullstack/.gitignore.hbs +9 -1
  29. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +23 -8
  30. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +1 -0
  31. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +0 -2
  32. package/templates/apps/fullstack/apps/{{projectName}}-app/public/runtime-config.js.hbs +4 -0
  33. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +3 -3
  34. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +25 -10
  35. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +2 -3
  36. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +73 -2
  37. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +2 -2
  38. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +2 -2
  39. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +16 -6
  40. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +24 -10
  41. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +0 -2
  42. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +3 -3
  43. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +12 -1
  44. package/templates/apps/fullstack/hai.build.json.hbs +7 -0
  45. package/templates/apps/fullstack/images/app.Dockerfile.hbs +36 -0
  46. package/templates/apps/fullstack/images/web.Dockerfile.hbs +34 -0
  47. package/templates/apps/fullstack/package.json.hbs +7 -12
  48. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +23 -2
  49. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +28 -7
  50. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +0 -1
  51. package/templates/apps/fullstack/packages/{{projectName}}-shared/.gitignore.hbs +7 -0
  52. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +33 -12
  53. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +2 -2
  54. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +3 -3
  55. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +2 -2
  56. package/templates/apps/h5/src/routes/+layout.svelte.hbs +2 -2
  57. package/templates/apps/mobile-app/index.html.hbs +1 -0
  58. package/templates/apps/mobile-app/public/runtime-config.js +1 -0
  59. package/templates/apps/mobile-app/src/App.svelte.hbs +2 -2
  60. package/templates/apps/mobile-app/src/lib/api.ts.hbs +2 -1
  61. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +3 -2
  62. package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +2 -2
  63. package/templates/apps/website/src/routes/+layout.svelte.hbs +3 -3
  64. package/templates/apps/website/src/routes/services/+page.svelte.hbs +1 -1
  65. package/templates/base/.dockerignore.hbs +18 -13
  66. package/templates/base/.gitignore.hbs +9 -1
  67. package/templates/base/e2e/app.spec.ts.hbs +10 -0
  68. package/templates/base/hai.build.json.hbs +1 -0
  69. package/templates/base/images/app.Dockerfile.hbs +64 -0
  70. package/templates/base/{docker → images/web}/nginx.conf.hbs +6 -0
  71. package/templates/base/package.json.hbs +20 -19
  72. package/templates/base/svelte.config.js.hbs +2 -0
  73. package/templates/base/vite.config.ts.hbs +9 -3
  74. package/templates/shared/.gitattributes +11 -0
  75. package/templates/shared/container-runtime-config.sh +30 -0
  76. package/templates/shared/run-e2e.mjs +65 -0
  77. package/templates/shared/vite-runtime-config.ts +54 -0
  78. package/templates/skills/AGENTS.md +3 -3
  79. package/templates/skills/bridges/admin/AGENTS.md +1 -1
  80. package/templates/skills/bridges/api/AGENTS.md +1 -1
  81. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +1 -1
  82. package/templates/skills/bridges/h5/AGENTS.md +1 -1
  83. package/templates/skills/bridges/mobile-app/AGENTS.md +1 -1
  84. package/templates/skills/bridges/website/AGENTS.md +1 -1
  85. package/templates/skills/hai-api-client/SKILL.md +14 -161
  86. package/templates/skills/hai-api-client/reference.md +166 -0
  87. package/templates/skills/hai-api-contract/SKILL.md +15 -273
  88. package/templates/skills/hai-api-contract/reference.md +278 -0
  89. package/templates/skills/hai-app-create/SKILL.md +2 -2
  90. package/templates/skills/hai-app-create/development.md +6 -4
  91. package/templates/skills/hai-app-create/reference.md +5 -4
  92. package/templates/skills/hai-app-review/SKILL.md +1 -1
  93. package/templates/skills/hai-app-tests/SKILL.md +4 -3
  94. package/templates/skills/hai-app-tests/reference.md +2 -2
  95. package/templates/skills/hai-app-tests/validation.md +31 -0
  96. package/templates/skills/hai-audit/SKILL.md +17 -142
  97. package/templates/skills/hai-audit/reference.md +145 -0
  98. package/templates/skills/hai-build/SKILL.md +24 -3
  99. package/templates/skills/hai-build/reference.md +10 -9
  100. package/templates/skills/hai-cache/SKILL.md +15 -182
  101. package/templates/skills/hai-cache/reference.md +187 -0
  102. package/templates/skills/hai-capacitor/SKILL.md +4 -3
  103. package/templates/skills/hai-capacitor/reference.md +6 -4
  104. package/templates/skills/hai-ci/SKILL.md +2 -0
  105. package/templates/skills/hai-core/SKILL.md +3 -3
  106. package/templates/skills/hai-crypto/SKILL.md +16 -252
  107. package/templates/skills/hai-crypto/reference.md +256 -0
  108. package/templates/skills/hai-datapipe/SKILL.md +15 -196
  109. package/templates/skills/hai-datapipe/reference.md +202 -0
  110. package/templates/skills/hai-deploy/SKILL.md +28 -271
  111. package/templates/skills/hai-deploy/middleware.md +6 -18
  112. package/templates/skills/hai-framework-sync/SKILL.md +2 -2
  113. package/templates/skills/hai-framework-sync/sync.md +1 -1
  114. package/templates/skills/hai-iam/SKILL.md +1 -3
  115. package/templates/skills/hai-kit/SKILL.md +12 -167
  116. package/templates/skills/hai-kit/reference.md +172 -0
  117. package/templates/skills/hai-payment/SKILL.md +19 -251
  118. package/templates/skills/hai-payment/reference.md +256 -0
  119. package/templates/skills/hai-pr-review/SKILL.md +4 -4
  120. package/templates/skills/hai-reach/SKILL.md +2 -2
  121. package/templates/skills/hai-reldb/SKILL.md +1 -1
  122. package/templates/skills/hai-scheduler/SKILL.md +15 -195
  123. package/templates/skills/hai-scheduler/reference.md +202 -0
  124. package/templates/skills/hai-serv/SKILL.md +2 -2
  125. package/templates/skills/hai-spec-implement/SKILL.md +1 -1
  126. package/templates/skills/hai-spec-implement/workflow.md +3 -3
  127. package/templates/skills/hai-storage/SKILL.md +17 -238
  128. package/templates/skills/hai-storage/reference.md +243 -0
  129. package/templates/skills/hai-ui/SKILL.md +1 -1
  130. package/templates/skills/hai-ui/reference.md +11 -5
  131. package/templates/skills/hai-vecdb/SKILL.md +2 -2
  132. package/dist/chunk-47V5OT22.js.map +0 -1
  133. package/dist/chunk-IPG3QNYK.js.map +0 -1
  134. package/dist/cli-config-templates-SJ2MBIR7.js +0 -5
  135. package/dist/src-6PPBKQ6Q.js.map +0 -1
  136. package/templates/apps/api/Dockerfile.hbs +0 -48
  137. package/templates/apps/fullstack/Dockerfile.hbs +0 -69
  138. package/templates/base/Dockerfile.hbs +0 -79
  139. /package/templates/apps/fullstack/{docker → images/web}/19-runtime-config.envsh.hbs +0 -0
  140. /package/templates/apps/fullstack/{docker → images/web}/nginx.conf.hbs +0 -0
  141. /package/templates/apps/fullstack/{docker → images/web}/runtime-config.js.template.hbs +0 -0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@h-ai/cli",
3
3
  "type": "module",
4
- "version": "0.1.0-alpha.65",
4
+ "version": "0.1.0-alpha.67",
5
5
  "description": "Hai Framework CLI for project scaffolding and code generation.",
6
6
  "license": "Apache-2.0",
7
7
  "keywords": [
@@ -30,7 +30,7 @@
30
30
  "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
31
31
  },
32
32
  "dependencies": {
33
- "@h-ai/core": "0.1.0-alpha.65",
33
+ "@h-ai/core": "0.1.0-alpha.67",
34
34
  "cac": "^7.0.1",
35
35
  "chalk": "^6.0.1",
36
36
  "fast-wrap-ansi": "^0.2.2",
@@ -41,12 +41,12 @@
41
41
  "yaml": "^2.9.1"
42
42
  },
43
43
  "devDependencies": {
44
- "@h-ai/cache": "0.1.0-alpha.65",
45
- "@h-ai/crypto": "0.1.0-alpha.65",
46
- "@h-ai/deploy": "0.1.0-alpha.65",
47
- "@h-ai/reach": "0.1.0-alpha.65",
48
- "@h-ai/reldb": "0.1.0-alpha.65",
49
- "@h-ai/storage": "0.1.0-alpha.65",
44
+ "@h-ai/cache": "0.1.0-alpha.67",
45
+ "@h-ai/crypto": "0.1.0-alpha.67",
46
+ "@h-ai/deploy": "0.1.0-alpha.67",
47
+ "@h-ai/reach": "0.1.0-alpha.67",
48
+ "@h-ai/reldb": "0.1.0-alpha.67",
49
+ "@h-ai/storage": "0.1.0-alpha.67",
50
50
  "@types/fs-extra": "^11.0.4",
51
51
  "@types/node": "^26.6.5",
52
52
  "@types/prompts": "^2.4.9",
@@ -1,163 +1,66 @@
1
- # CLI Templates
1
+ # CLI 项目模板
2
2
 
3
- 此目录包含 `hai create` 命令使用的项目模板文件。
3
+ ## 简介
4
4
 
5
- ## 目录结构
5
+ 这里保存 `hai create` 生成应用时使用的源码、配置和 AI 指引。维护模板后,需要生成真实项目验证,不能只检查模板文件本身。
6
6
 
7
- ```
8
- templates/
9
- ├── base/ # 所有应用类型共用的骨架文件
10
- │ ├── package.json.hbs # 动态:按 features 注入依赖
11
- │ ├── vite.config.ts.hbs # 动态:按 hasI18n / hasUi 注入插件
12
- │ ├── tsconfig.json.hbs # 动态:SvelteKit / 纯 Svelte 5 分支
13
- │ ├── svelte.config.js.hbs # 动态:SvelteKit / 纯 Svelte 5 分支
14
- │ ├── .gitignore.hbs # 动态:纯 Svelte 5 应用不输出 .svelte-kit
15
- │ ├── playwright.config.ts
16
- │ └── src/
17
- │ ├── app.html.hbs # 动态:SvelteKit 应用输出 app shell
18
- │ ├── app.d.ts.hbs # 动态:SvelteKit 应用输出 App namespace
19
- │ ├── app.css
20
- │ ├── hooks.server.ts.hbs # 动态:按 features / hasI18n 组装 handle 序列
21
- │ └── lib/server/
22
- │ └── init.ts.hbs # 动态:按 features 注入模块初始化
23
- │
24
- ├── apps/ # 应用类型专属路由与页面
25
- │ ├── admin/ # 管理后台
26
- │ │ ├── messages/ # i18n 消息文件(zh-CN / en-US)
27
- │ │ └── src/routes/ # +page / +layout .svelte.hbs
28
- │ ├── website/ # 企业官网
29
- │ │ ├── messages/
30
- │ │ └── src/routes/
31
- │ ├── h5/ # H5 移动端
32
- │ │ ├── messages/
33
- │ │ └── src/routes/
34
- │ ├── api/ # 纯 API 服务(无 UI / 无 i18n)
35
- │ │ └── src/routes/
36
- │ ├── mobile-app/ # Svelte 5 + Vite + Capacitor 移动应用
37
- │ │ ├── index.html.hbs
38
- │ │ ├── messages/
39
- │ │ └── src/App.svelte.hbs
40
- │ └── fullstack/ # 前后端分离多包工程(contract / serv / web / app / desktop / miniapp 占位)
41
- │ ├── packages/ # 共享 contract 与后端 serv 包
42
- │ ├── apps/ # 多前端目标,按用户选择条件生成
43
- │ └── e2e/ # 服务端 + 页面级 Playwright 流程
44
- │
45
- ├── features/ # 可选 feature 路由(叠加到 src/routes/)
46
- │ ├── iam/
47
- │ │ ├── routes-shared/ # 所有应用类型共用(API 端点)
48
- │ │ ├── routes-admin/ # admin 专属(登录/注册页 .hbs)
49
- │ │ └── routes-h5/ # h5 专属(登录/注册页 .hbs)
50
- │ ├── storage/
51
- │ │ └── routes/ # 上传 API
52
- │ └── ai/
53
- │ └── routes/ # 聊天流 API
54
- │
55
- ├── i18n/ # i18n 脚手架(hasI18n 时复制到项目根)
56
- │ └── project.inlang/
57
- │ └── settings.json # Paraglide 项目配置
58
- │
59
- └── skills/ # AI Skill 与各 appType 桥接指引
60
- └── bridges/ # admin / api / website / h5 / mobile-app / fullstack 专属 AGENTS
61
- ```
7
+ ## 核心功能清单
62
8
 
63
- ## AI Skill 模板(Single Source of Truth)
64
-
65
- `templates/skills/` 是 CLI 生成共享 AI 上下文时的单一来源,同时用于 `hai create` 与 `hai add`。
66
-
67
- - `hai create` 会把 `templates/skills/` 下所有 `hai-*` Skill 目录复制到 `.agents/skills/<skill>/`,再按 appType 排除互斥项(例如 fullstack 不复制 `hai-kit`;admin / website / h5 不复制 `hai-serv`、`hai-api-contract`、`hai-api-client`、`hai-capacitor`;mobile-app 不复制 `hai-core`、`hai-kit`、`hai-serv`、`hai-api-contract`)
68
- - 通用 `copilot-instructions.md` 复制到 `.github/copilot-instructions.md`,只引用项目根 `AGENTS.md`,不另维护 appType 专属规则
69
- - `bridges/<appType>/AGENTS.md` 会复制到项目根目录,确保不同样板工程使用自己的 AI 指引;通用 `CLAUDE.md` 仅包含 `@AGENTS.md`
70
- - `opencode.json` 会复制到项目根目录
71
- - `templates/skills/AGENTS.md` 是缺少 appType 上下文时的通用规则;`CLAUDE.md`、`copilot-instructions.md` 与 `opencode.json` 是各工具的轻量入口,用于创建项目和回填 AI 支持
72
- - Codex 原生读取根 `AGENTS.md` 并发现 `.agents/skills/`,支持 `$hai-app-create` 等显式调用和按任务自动选择;无需 `.codex/skills` 或工具专属配置。依据:[Codex skills](https://learn.chatgpt.com/docs/build-skills)、[AGENTS.md](https://learn.chatgpt.com/docs/agent-configuration/agents-md)
73
- - `opencode.json` 使用 OpenCode 的 `instructions` 配置直接引用 `AGENTS.md`;`.agents/skills/` 由 OpenCode 原生发现,不再写入过期的 `skills.paths`
74
- - `CLAUDE.md` 通过 `@AGENTS.md` 复用共享规范,Claude Code 按其中的任务导航读取 `.agents/skills/` 正文与参考。CLI 不生成 `.claude/` 技能副本;此模式不提供 Claude 原生技能自动发现或 `/skill` 命令。依据:[Claude Code 项目指引](https://code.claude.com/docs/en/memory)、[原生 skills](https://code.claude.com/docs/en/skills)
75
- - `hai add` / `hai init` 只补齐缺失的 AI 支持文件,不覆盖用户已自定义的桥接文件,也不会自动删除遗留的 `.github/skills/` 或 `.claude/`
76
-
77
- ## 文件类型说明
78
-
79
- | 类型 | 处理方式 |
80
- | ------------------------------------------ | -------------------------------------------- |
81
- | 普通文件(`.ts` / `.svelte` / `.json` 等) | 直接复制,内容不变 |
82
- | `.hbs` 文件 | 经 Handlebars 渲染后输出(去掉 `.hbs` 后缀) |
83
-
84
- ## 渲染上下文(TemplateContext)
85
-
86
- 所有 `.hbs` 文件可使用以下变量:
87
-
88
- | 变量 | 类型 | 说明 |
89
- | ---------------------- | --------- | ----------------------------------------- |
90
- | `{{projectName}}` | `string` | 项目名称(如 `my-app`) |
91
- | `{{appType}}` | `string` | 应用类型 |
92
- | `{{hasUi}}` | `boolean` | 是否包含 UI(非 `api` 类型为 `true`) |
93
- | `{{hasI18n}}` | `boolean` | 是否启用 i18n(非 `api` 类型为 `true`) |
94
- | `{{isSvelteOnlyApp}}` | `boolean` | 是否为不依赖 SvelteKit 的纯 Svelte 5 应用 |
95
- | `{{isCapacitorApp}}` | `boolean` | 是否为 Capacitor 移动应用 |
96
- | `{{defaultLocale}}` | `string` | 默认语言,如 `zh-CN` |
97
- | `{{packageManager}}` | `string` | 包管理器:`pnpm` / `npm` / `yarn` |
98
- | `{{fullstack.*}}` | `object` | fullstack 类型专用上下文 |
99
- | `{{features.iam}}` | `boolean` | 是否选中 iam feature |
100
- | `{{features.db}}` | `boolean` | 是否选中 db feature |
101
- | `{{features.cache}}` | `boolean` | 是否选中 cache feature |
102
- | `{{features.crypto}}` | `boolean` | 是否选中 crypto feature |
103
- | `{{features.storage}}` | `boolean` | 是否选中 storage feature |
104
- | `{{features.ai}}` | `boolean` | 是否选中 ai feature |
105
-
106
- `appType` 支持 `admin` / `website` / `h5` / `api` / `mobile-app` / `fullstack`。
107
-
108
- H5 业务页面复用 `@h-ai/ui` 的 `BottomNav` 和移动端壳样式,桌面预览保持居中限宽,认证路由独立显示。
109
-
110
- `fullstack.*` 包含包名、前端选择、依赖版本、`contractExportName` 和原生壳 `nativeAppIdSegment`,用于渲染 contract / serv / 多端 UI / Capacitor / Tauri 模板。
111
-
112
- `moduleConfigs` 保留创建时指定的模块值。Fullstack 的模块 YAML 用 `{{{moduleConfig 'db' true}}}` 等 helper 复用 `cli-config-templates.ts`;可选模块传 `features.ai` 等开关,未选择时整份注释。创建流程保留已渲染的配置,不再用精简内容覆盖;core、serv、Reach 保留应用专用默认值及完整的可选字段。新增 Schema 字段同步此生成器和相应模板。
113
-
114
- 所有根 `.gitignore`(base / api / fullstack)保留 `**/data/`,包括 `.gitkeep` 在内的运行数据不跟踪。Fullstack 服务端 config 始终含 core、serv、db、cache、iam、storage、audit、reach、ai、vecdb、payment、scheduler、deploy 共 13 份 YAML;不为无配置入口的 crypto/datapipe 生成 YAML。未启用块的后续接入步骤见 [CLI 配置说明](../README.md#应用配置与显示)。
115
-
116
- ### 常用条件写法
117
-
118
- ```handlebars
119
- {{!-- 按 feature 条件注入内容 --}}
120
- {{#if features.iam}}
121
- import { iam } from '@h-ai/iam'
122
- {{/if}}
123
-
124
- {{!-- 按 i18n 条件切换内容 --}}
125
- {{#if hasI18n}}
126
- <title>{m.page_title()}</title>
127
- {{else}}
128
- <title>首页</title>
129
- {{/if}}
130
- ```
9
+ - `admin`、`website`、`h5`:SvelteKit 应用。
10
+ - `api`:共享 contract 与 API service 的 workspace。
11
+ - `mobile-app`:Svelte + Vite + Capacitor 应用。
12
+ - `fullstack`:contract、API、共享界面,以及按需选择的 Web/App/Desktop;miniapp 仅预留说明。
13
+ - 后台工作区随窗口扩展;手机壳支持宽屏,表格在内部滚动,文章与认证表单保留阅读宽度。
14
+ - 默认部署工具、独立镜像 Dockerfile、环境示例和可复制的 AI 技能。
15
+
16
+ ## 使用入门
17
+
18
+ ### 文件如何组合
131
19
 
132
- ## 生成流程
20
+ | 目录 | 用途 |
21
+ | -------------- | ------------------------------------------------------------------- |
22
+ | `base/` | 普通应用共用的配置、脚本和入口 |
23
+ | `apps/<类型>/` | 应用专属页面、workspace、原生壳与配置;API/fullstack 维护自己的骨架 |
24
+ | `features/` | 按所选模块叠加的路由和页面 |
25
+ | `i18n/` | Paraglide 工程配置 |
26
+ | `skills/` | 完整的技能目录与各类型 AI 入口 |
133
27
 
134
- 模板引擎执行 6 个步骤:
28
+ 普通文件直接复制,`.hbs` 经 Handlebars 渲染并去掉后缀。`cli-template-engine.ts` 决定适用目录与条件;`cli-create.ts` 完成配置、镜像定义和根 README 等生成工作。修改前先查实际调用路径,API/fullstack 不套用 SvelteKit 文件路由。
135
29
 
136
- 1. **复制 `base/` 静态文件** → 项目根
137
- 2. **复制 `apps/{appType}/` 专属文件** → 项目根(`messages/` 仅 `hasI18n` 时复制)
138
- 3. **叠加 feature 静态路由** → `src/routes/`(纯 Svelte 5 应用跳过 SvelteKit 路由)
139
- 4. **渲染所有 `.hbs` 文件** — `base/` + `apps/{appType}/` 输出到项目根;`features/*/routes*/` 输出到 `src/routes/`
140
- 5. **复制 `i18n/` 脚手架** → 项目根(仅 `hasI18n` 时)
141
- 6. **确保 `static/` 目录存在**
30
+ ### 配置与构建
142
31
 
143
- ## 新增模板
32
+ 模板通过 `projectName`、`appType`、`features`、`hasUi`、`hasI18n`、`versions` 以及 `api`/`fullstack` 上下文渲染,完整字段见 [cli-types.ts](../src/cli-types.ts)。模块 YAML 使用 `moduleConfig` helper,与 [配置生成器](../src/commands/cli-config-templates.ts) 共用字段和默认值。
144
33
 
145
- ### 新增应用页面
34
+ 部署默认启用,`--no-deploy` 可关闭;SDK 是开发依赖。每个镜像使用 `images/` 中独立 Dockerfile,Web 资源放 `images/web/`。`hai.build.json` 直接选择文件;依赖输入由构建器生成到 `images/dependencies/`。所有根 `.gitignore` 均忽略 `**/images/dependencies/`、运行数据和私有环境文件。
146
35
 
147
- 在 `apps/{appType}/src/routes/` 下创建 `.svelte` 或 `.svelte.hbs` 文件。若含用户可见文本,使用 `.hbs` 并加 `{{#if hasI18n}}` 条件,同时在对应的 `apps/{appType}/messages/` 里补充 i18n key。
36
+ Fullstack 服务端保留各模块的配置示例,未使用模块保持注释。安装依赖、校验和初始化、接入业务后才启用对应配置。修改公开 Schema 时同步配置生成器、环境变量说明、调用方与技能。
148
37
 
149
- ### 新增 feature 路由
38
+ ### AI 指引
150
39
 
151
- 在 `features/{featureId}/routes-shared/`(API 路由)或 `features/{featureId}/routes-{appType}/`(UI 页面)下创建文件,然后在 `cli-template-engine.ts` 的 `FEATURE_ROUTE_DIRS` / `FEATURE_APP_ROUTE_DIRS` 中注册该目录。
40
+ `skills/hai-*` 的完整目录复制到生成应用 `.agents/skills/`,按应用架构排除不适用项。`bridges/<类型>/AGENTS.md` 提供根入口;Claude/Copilot/OpenCode 配置只引用共享规则。新增参考文件必须随 skill 一起复制,不能链接回框架私有路径。
152
41
 
153
- ## 配置驱动认证页面
42
+ `hai add` / `hai init` 补齐缺失文件,保留应用已有的自定义内容。框架升级时按目标发布版本比较并合并,不直接覆盖应用规则。
154
43
 
155
- 协议支持配置中的 userAgreementMarkdown/privacyPolicyMarkdown 正文及 URL;同主题优先 Markdown,由安全渲染器在弹窗显示。
44
+ ### 页面与文案
156
45
 
157
- 选用 IAM 的 admin/h5/website 模板提供 AuthPanel 和标准认证路由;mobile-app 与 fullstack Web/App/Desktop 使用 API 客户端共享动作。修改服务端 config/_iam.yml 即可控制登录方式、注册、重置、协议和品牌,无需改表单。配置 Reach 模板和真实发送 Provider 后启用 OTP/重置。分布式部署使用共享数据库与 Redis。
46
+ 用户可见文本加入对应 messages。认证复用 AuthPanel 与服务端公开 IAM 配置;表单复用 Form/FormLayout/FormField。业务规则由应用需求决定,模板默认角色、流程和限额可调整,修改时同步授权、界面、测试和文档。
47
+
48
+ ## 开发测试
49
+
50
+ 维护模板时保留 `shared/.gitattributes`,让生成工程的 `.dockerignore`、Dockerfile 和 POSIX 脚本统一使用 LF,保持跨平台输入一致并确保 Linux 脚本可运行。在仓库根执行:
51
+
52
+ ```sh
53
+ pnpm --filter @h-ai/cli typecheck
54
+ pnpm --filter @h-ai/cli lint
55
+ pnpm --filter @h-ai/cli build
56
+ pnpm --filter @h-ai/cli test
57
+ pnpm check:skills
58
+ pnpm --filter @h-ai/cli test:scaffold-gates
59
+ pnpm --filter @h-ai/cli test:deploy-gates
60
+ ```
158
61
 
159
- LDAP/Reach 是可选 peer;IAM 不强制启用 Reach。默认 LDAP 客户端由应用选择安装 ldapts。自定义通知回调、协议弹窗、表单 snippet 用法随 hai-iam/hai-ui skills 完整复制到生成项目,不能要求应用读取本仓库私有路径。
62
+ 脚手架门禁会生成项目并执行安装、类型检查、lint、构建、测试和浏览器流程。部署门禁另需可用 Podman/Docker,验证镜像构建、隔离服务器上的 SSH/人工部署与部分更新。原生安装包和真实第三方服务需要各自的验收环境。
160
63
 
161
- ## 表单布局
64
+ ## 许可证
162
65
 
163
- 新增/编辑复用 `@h-ai/ui` 的 Form/FormLayout/FormField:可选一列或双列、标签独立成行或与控件同行,多行文本与多选自动跨列,窄容器自动收为一列。CRUD 使用 `form` 配置,字段可用 `colSpan` 覆盖。错误显示在字段附近并随 UI 语言更新。website 联系页采用 FormLayout + FormField;fullstack 共享用户编辑页采用双列同行标签,个人资料与密码页复用 UI 场景组件。没有数据表单的模板保留现有骨架,新增表单按 hai-ui skill 接入。
66
+ Apache-2.0
@@ -29,7 +29,7 @@
29
29
 
30
30
  <div class='drawer lg:drawer-open'>
31
31
  <input id='admin-drawer' type='checkbox' class='drawer-toggle' />
32
- <div class='drawer-content p-6'>
32
+ <div class='drawer-content min-w-0 p-4 sm:p-6'>
33
33
  <label for='admin-drawer' class='btn btn-ghost btn-sm drawer-button lg:hidden mb-4'>
34
34
  <span class='icon-[tabler--menu-2] size-5'></span>
35
35
  </label>
@@ -1,19 +1,25 @@
1
- .git
1
+ **/.git
2
+ **/node_modules
3
+ **/.pnpm-store
4
+ **/.cache
5
+ **/.svelte-kit
6
+ **/.turbo
7
+ **/build
8
+ **/dist
9
+ **/coverage
10
+ **/playwright-report
11
+ **/test-results
12
+ **/src-tauri/target
13
+ **/hash-core/target
14
+ tmp
15
+ **/*.tar
2
16
  .github
3
17
  .agents
4
18
  .claude
5
19
  .codex
6
20
  .opencode
7
- .turbo
8
- build
9
- dist
10
- node_modules
11
- playwright-report
12
- test-results
13
21
  **/data
14
22
  *.log
15
- # 仅排除本机私有配置,与 Git 处理一致;公共 .env 与 dev/test/prod 随上下文构建。
16
- **/.env.local
17
- **/.env.*.local
18
- **/.env.runtime
19
- **/.hai/deploy
23
+ # 仅保留公共基础 .env;分环境配置、私有覆盖及已有交付包不进入构建上下文。
24
+ **/.env.*
25
+ **/.hai
@@ -6,9 +6,17 @@ build
6
6
  playwright-report
7
7
  test-results
8
8
 
9
- # hai deploy 产物(compose / .env.runtime / 镜像 tar / sidecar 凭据)
9
+ # 构建与部署产物(镜像 / Compose tar / 私有运行配置)
10
10
  .hai/
11
+ *.tar
11
12
 
12
13
  # 本机私有配置;公共 .env 与 dev/test/prod 环境文件纳入版本控制。
13
14
  .env.local
14
15
  .env.*.local
16
+
17
+ # 构建器生成的安装输入快照
18
+ **/images/dependencies/
19
+
20
+ # 项目本地缓存
21
+ **/.pnpm-store/
22
+ **/.cache/
@@ -1,8 +1,18 @@
1
1
  # {{api.contractPackageName}}
2
2
 
3
+ ## 简介
4
+
3
5
  {{projectName}} API service 的共享 contract 包。
4
6
 
5
- ## 包含内容
7
+ ## 核心功能清单
8
+
9
+ - 共享接口路径、输入输出 Schema 和类型。
10
+ - 客户端与服务端使用同一份 contract。
11
+ - 不包含服务端业务实现,也不加载私有配置。
12
+
13
+ ## 使用入门
14
+
15
+ ### 包含内容
6
16
 
7
17
  - `app-contract.ts`:应用级接口定义,业务 path 与一次性输出 Schema 就近内联
8
18
  - `app-schemas.ts`:跨接口、跨层复用的输入/数据 Zod Schema
@@ -10,9 +20,20 @@
10
20
 
11
21
  API 前缀、健康检查与跨端 Header 等传输配置位于 service 的 `config/_serv.yml`。
12
22
 
13
- ## 常用命令
23
+ ### 常用命令
14
24
 
15
25
  ```bash
16
26
  pnpm --filter {{api.contractPackageName}} build
17
27
  pnpm --filter {{api.contractPackageName}} test
18
28
  ```
29
+
30
+ ## 开发测试
31
+
32
+ ```sh
33
+ pnpm --filter {{api.contractPackageName}} typecheck
34
+ pnpm --filter {{api.contractPackageName}} test
35
+ ```
36
+
37
+ ## 许可证
38
+
39
+ Apache-2.0
@@ -1,21 +1,31 @@
1
1
  # {{api.servicePackageName}}
2
2
 
3
+ ## 简介
4
+
3
5
  {{projectName}} API service 包,负责模块初始化、procedure 装配与 HTTP 入口。
4
6
 
5
- ## 常用命令
7
+ ## 核心功能清单
8
+
9
+ - 初始化所选框架模块,装配共享接口并提供 HTTP 服务。
10
+ - 配置、健康检查和应用 procedures 各有明确入口。
11
+ - 从工程根构建镜像,支持自动发布与离线包。
12
+
13
+ ## 使用入门
14
+
15
+ ### 常用命令
6
16
 
7
17
  ```bash
8
18
  pnpm --filter {{api.servicePackageName}} dev
9
19
  pnpm --filter {{api.servicePackageName}} test
10
20
  ```
11
21
 
12
- ## 容器运行
22
+ ### 容器运行
23
+
13
24
 
14
- - 根目录运行 `pnpm docker:build` / `pnpm podman:build`;镜像监听 `0.0.0.0:3000`。
15
25
  - 配置默认打包自本目录 `config/`,可在运行时只读挂载到 `/app/config`,敏感值通过环境变量注入。
16
- - `data/` 可作为 SQLite/本地存储目录;`pnpm docker:build:data` / `pnpm podman:build:data` 会将其固化为镜像初始数据,生产写入应挂载 `/app/data` volume。
17
26
 
18
- ## 关键目录
27
+
28
+ ### 关键目录
19
29
 
20
30
  - `config/`:service 配置
21
31
  - `src/app.ts`:HTTP App 装配
@@ -23,9 +33,9 @@ pnpm --filter {{api.servicePackageName}} test
23
33
  - `src/server/procedures/`:应用级 procedures
24
34
 
25
35
  {{#if features.iam}}
26
- ## IAM 认证配置
36
+ ### IAM 认证配置
27
37
 
28
- 服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。客户端可通过安全公开配置和框架认证动作接入 `AuthPanel`。所有节点共享同一 DB 与 Redis;Memory 仅用于单进程。
38
+ 服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。客户端可通过安全公开配置和框架认证动作接入 `AuthPanel`。单实例可使用 Memory;多实例需共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
29
39
 
30
40
  LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IAM 服务端 workspace 安装 ldapts,再配置 login.ldap 与连接信息。自定义 onOtpSendEmail/onOtpSendSms/onPasswordResetRequest 回调可独立于 Reach 使用,投递失败须拒绝 Promise。协议在 Modal 显示;LoginForm/RegisterForm 提供 header/extraFields/footer,AuthPanel 透传 loginHeader/loginFields/loginFooter 和 registerHeader/registerFields/registerFooter。配置及例子见生成项目的 hai-iam/hai-ui skills。
31
41
 
@@ -33,3 +43,14 @@ LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IA
33
43
 
34
44
  完整契约见生成应用的 `.agents/skills/hai-iam/reference.md`。
35
45
  {{/if}}
46
+
47
+ ## 开发测试
48
+
49
+ ```sh
50
+ pnpm --filter {{api.servicePackageName}} typecheck
51
+ pnpm --filter {{api.servicePackageName}} test
52
+ ```
53
+
54
+ ## 许可证
55
+
56
+ Apache-2.0
@@ -21,7 +21,6 @@
21
21
  ],
22
22
  "scripts": {
23
23
  "build": "tsup",
24
- "build:prod": "pnpm build",
25
24
  "check": "pnpm typecheck",
26
25
  "typecheck": "tsc --noEmit",
27
26
  "lint": "eslint .",
@@ -44,8 +43,7 @@
44
43
  "@h-ai/audit": "{{haiPackageSpecifier}}"{{/if}}{{#if features.cache}},
45
44
  "@h-ai/cache": "{{haiPackageSpecifier}}"{{/if}}{{#if features.crypto}},
46
45
  "@h-ai/crypto": "{{haiPackageSpecifier}}"{{/if}}{{#if features.datapipe}},
47
- "@h-ai/datapipe": "{{haiPackageSpecifier}}"{{/if}}{{#if features.deploy}},
48
- "@h-ai/deploy": "{{haiPackageSpecifier}}"{{/if}}{{#if features.iam}},
46
+ "@h-ai/datapipe": "{{haiPackageSpecifier}}"{{/if}}{{#if features.iam}},
49
47
  "@h-ai/iam": "{{haiPackageSpecifier}}"{{/if}}{{#if features.payment}},
50
48
  "@h-ai/payment": "{{haiPackageSpecifier}}"{{/if}}{{#if features.reach}},
51
49
  "@h-ai/reach": "{{haiPackageSpecifier}}"{{/if}}{{#if features.db}},
@@ -0,0 +1 @@
1
+ { "images": [{ "name": "app", "dockerfile": "images/app.Dockerfile", "containerPort": 3000 }] }
@@ -0,0 +1,35 @@
1
+ FROM node:24.22.1-bookworm-slim AS build
2
+ ARG SQLITE_PREBUILD_MIRROR=
3
+ ENV npm_config_better_sqlite3_binary_host_mirror=$SQLITE_PREBUILD_MIRROR
4
+
5
+ ENV PNPM_HOME=/pnpm
6
+ ENV PATH=$PNPM_HOME:$PATH
7
+ ENV CI=true
8
+ ENV ONNXRUNTIME_NODE_INSTALL_CUDA=skip
9
+ WORKDIR /workspace
10
+
11
+ RUN corepack enable && corepack prepare pnpm@12.11.2 --activate && pnpm config set store-dir /pnpm/store
12
+ COPY pnpm-lock.yaml pnpm-workspace.yaml ./
13
+ COPY images/dependencies/ ./
14
+ RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm fetch --ignore-scripts
15
+ COPY . .
16
+ RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store pnpm install --offline --frozen-lockfile --ignore-scripts
17
+ RUN pnpm compile
18
+ RUN --mount=type=cache,id={{projectName}}-sqlite,target=/root/.npm/_prebuilds if [ -d node_modules/better-sqlite3 ]; then cd node_modules/better-sqlite3; for attempt in 1 2 3; do node -e "require('node:child_process').execFileSync(process.execPath,[require.resolve('prebuild-install/bin.js'),'--verbose'],{stdio:'inherit'})" && break; [ "$attempt" = 3 ] && exit 1; sleep 3; done; fi
19
+ RUN --mount=type=cache,id={{projectName}}-pnpm,target=/pnpm/store --mount=type=cache,id={{projectName}}-sqlite,target=/root/.npm/_prebuilds pnpm pm deploy --filter {{api.servicePackageName}} --prod /prod/app
20
+
21
+ FROM node:24.22.1-bookworm-slim AS runtime-base
22
+
23
+ ENV NODE_ENV=production
24
+ ENV HOST=0.0.0.0
25
+ ENV PORT=3000
26
+ WORKDIR /app
27
+
28
+ COPY --from=build --chown=node:node /prod/app ./
29
+ RUN mkdir -p /app/data && chown node:node /app/data
30
+
31
+ USER node
32
+ EXPOSE 3000
33
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
34
+ CMD node -e "fetch('http://127.0.0.1:'+process.env.PORT+'/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
35
+ CMD ["node", "dist/index.js"]
@@ -13,20 +13,18 @@
13
13
  "start:prod": "pnpm --filter {{api.servicePackageName}} start:prod",
14
14
  "dev:test": "pnpm --filter {{api.servicePackageName}} dev:test",
15
15
  "dev:prod": "pnpm --filter {{api.servicePackageName}} dev:prod",
16
- "compile": "pnpm typecheck && pnpm build",
17
- "build": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present build",
18
- "docker:build": "docker build --target runtime -t {{projectName}}:latest .",
19
- "docker:build:data": "docker build --target runtime-with-data --build-context embedded-data=./apps/{{projectName}}-service/data -t {{projectName}}:latest .",
20
- "podman:build": "podman build --format docker --jobs=1 --target runtime -t {{projectName}}:latest .",
21
- "podman:build:data": "podman build --format docker --jobs=1 --target runtime-with-data --build-context embedded-data=./apps/{{projectName}}-service/data -t {{projectName}}:latest .",
16
+ "compile": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present build",
17
+ "build": "hai build",
18
+ {{#if features.deploy}}
19
+ "deploy": "hai deploy apps/{{projectName}}-service",
20
+ {{/if}}
22
21
  "check": "pnpm typecheck",
23
22
  "typecheck": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present typecheck",
24
23
  "lint": "eslint *.js *.ts e2e && pnpm -r --if-present lint",
25
24
  "lint:fix": "eslint *.js *.ts e2e --fix && pnpm -r --if-present lint:fix",
26
25
  "test": "pnpm --filter {{api.contractPackageName}} build && pnpm -r --if-present test",
27
26
  "test:watch": "pnpm -r --parallel --if-present test:watch",
28
- "build:prod": "pnpm build",
29
- "test:e2e": "pnpm build && playwright test",
27
+ "test:e2e": "pnpm compile && node scripts/run-e2e.mjs",
30
28
  "clean": "pnpm -r --if-present clean && rimraf node_modules .turbo"
31
29
  },
32
30
  "dependencies": {
@@ -34,6 +32,10 @@
34
32
  "{{api.contractPackageName}}": "workspace:*"
35
33
  },
36
34
  "devDependencies": {
35
+ {{#if features.deploy}}
36
+ "@h-ai/deploy": "{{haiPackageSpecifier}}",
37
+ {{/if}}
38
+ "@h-ai/cli": "{{haiPackageSpecifier}}",
37
39
  "@h-ai/api-client": "{{haiPackageSpecifier}}",
38
40
  {{#if features.crypto}}
39
41
  "@h-ai/crypto": "{{haiPackageSpecifier}}",
@@ -1,21 +1,25 @@
1
- .git
2
- Dockerfile
1
+ **/.git
2
+ **/node_modules
3
+ **/.pnpm-store
4
+ **/.cache
5
+ **/.svelte-kit
6
+ **/.turbo
7
+ **/build
8
+ **/dist
9
+ **/coverage
10
+ **/playwright-report
11
+ **/test-results
12
+ **/src-tauri/target
13
+ **/hash-core/target
14
+ tmp
15
+ **/*.tar
3
16
  .github
4
17
  .agents
5
18
  .claude
6
19
  .codex
7
20
  .opencode
8
- .turbo
9
- **/build
10
- **/dist
11
- **/node_modules
12
- node_modules
13
- playwright-report
14
- test-results
15
21
  **/data
16
22
  *.log
17
- # 仅排除本机私有配置,与 Git 处理一致;公共 .env 与 dev/test/prod 随上下文构建。
18
- **/.env.local
19
- **/.env.*.local
20
- **/.env.runtime
21
- **/.hai/deploy
23
+ # 仅保留公共基础 .env;分环境配置、私有覆盖及已有交付包不进入构建上下文。
24
+ **/.env.*
25
+ **/.hai
@@ -22,9 +22,17 @@ playwright-report/
22
22
  # 本地数据目录
23
23
  **/data/
24
24
 
25
- # hai deploy 产物(compose / .env.runtime / 镜像 tar / sidecar 凭据)
25
+ # 构建与部署产物(镜像 / Compose tar / 私有运行配置)
26
26
  .hai/
27
+ *.tar
27
28
 
28
29
  # 本机私有配置;公共 .env 与 dev/test/prod 环境文件纳入版本控制。
29
30
  .env.local
30
31
  .env.*.local
32
+
33
+ # 构建器生成的安装输入快照
34
+ **/images/dependencies/
35
+
36
+ # 项目本地缓存
37
+ **/.pnpm-store/
38
+ **/.cache/
@@ -2,9 +2,19 @@
2
2
  {{#if fullstack.frontends.app}}
3
3
  # {{projectName}}-app
4
4
 
5
+ ## 简介
6
+
5
7
  App/H5 前端工程,复用 shared 的响应式 mini 后台,使用 Svelte 5 + Vite + Capacitor,可输出 Web 预览并同步 Android / iOS 原生工程。
6
8
 
7
- ## i18n 与 shared 协同
9
+ ## 核心功能清单
10
+
11
+ - 响应式 H5 页面与 Capacitor Android/iOS 原生壳。
12
+ - 共享管理界面、个人设置和接口客户端。
13
+ - 原生使用安全 TokenStorage,浏览器预览使用 Cookie 刷新。
14
+
15
+ ## 使用入门
16
+
17
+ ### i18n 与 shared 协同
8
18
 
9
19
  - 本端页面文案:`messages/{locale}.json` + `project.inlang/settings.json`
10
20
  - 共享 Shell/主题/语言/API:`packages/{{fullstack.sharedPackageName}}`
@@ -13,7 +23,7 @@ App/H5 前端工程,复用 shared 的响应式 mini 后台,使用 Svelte 5 +
13
23
 
14
24
  自定义建议:移动端独有引导、运营位、按钮文案放在本目录 `messages/`;跨端通用组件放到 shared。
15
25
 
16
- ## 编译、打包与部署
26
+ ### 编译、打包与部署
17
27
 
18
28
  ```bash
19
29
  # 开发预览,默认端口 {{fullstack.ports.app}}
@@ -29,20 +39,25 @@ pnpm --filter {{projectName}}-app package
29
39
  pnpm --filter {{projectName}}-app cap:build:android:debug
30
40
  pnpm --filter {{projectName}}-app cap:build:android:release
31
41
  pnpm --filter {{projectName}}-app cap:build:ios
32
-
33
- # 当前模板的 deploy 入口默认执行 package,可按目标商店或 CI 平台替换
34
- pnpm --filter {{projectName}}-app deploy
35
42
  ```
36
43
 
37
- 部署前确认 `PUBLIC_API_BASE` 在 `.env` 中指向可访问的后端服务。Android 模拟器访问宿主机通常使用 `http://10.0.2.2:3000`。
44
+ 本地开发通过根 `.env` 的 `PUBLIC_API_BASE` 配置代理。原生打包前,在本端 `public/runtime-config.js` 中设置 `globalThis.__HAI_PUBLIC_CONFIG__ = { apiBase: 'https://api.example.com/api/v1' }`,再编译并同步原生工程;这里只能放公开地址,不能放密钥。Android 模拟器访问宿主机通常使用 `http://10.0.2.2:3000/api/v1`。
38
45
 
39
- ## IAM 认证配置
46
+ ### IAM 认证配置
40
47
 
41
- 服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token、验证码倒计时和错误提示。所有节点共享同一 DB 与 Redis;Memory 仅用于单进程。
48
+ 服务端 `config/_iam.yml` 统一控制登录、注册、重置、协议与 `ui` 品牌。邮件/短信可用 `_reach.yml` 中的 Provider/标准模板或自定义发送回调。`AuthPanel` 使用安全公开配置及框架认证动作;无需在页面适配 Token、验证码倒计时和错误提示。单实例可使用 Memory;多实例需共享数据库与 Redis,并按工程根 README 配置写入路由和传输会话。
42
49
 
43
50
  LDAP/Reach 均可选:基础认证无需安装。默认 LDAP 客户端需在 IAM 服务端 workspace 安装 ldapts,再配置 login.ldap 与连接信息。自定义 onOtpSendEmail/onOtpSendSms/onPasswordResetRequest 回调可独立于 Reach 使用,投递失败须拒绝 Promise。协议在 Modal 显示;LoginForm/RegisterForm 提供 header/extraFields/footer,AuthPanel 透传 loginHeader/loginFields/loginFooter 和 registerHeader/registerFields/registerFooter。配置及例子见生成项目的 hai-iam/hai-ui skills。
44
51
 
45
52
  协议支持配置中的 userAgreementMarkdown/privacyPolicyMarkdown 正文及 URL;同主题优先 Markdown,由安全渲染器在弹窗显示。
46
53
 
47
54
  完整契约见生成应用的 `.agents/skills/hai-iam/reference.md`。
55
+
56
+ ## 开发测试
57
+
58
+ 从工程根执行 `pnpm typecheck`、`pnpm lint`、`pnpm build`、`pnpm test` 和 `pnpm test:e2e`。浏览器预览通过后,原生壳仍需在对应系统或设备单独验收。
59
+
60
+ ## 许可证
61
+
62
+ Apache-2.0
48
63
  {{/if}}