@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
@@ -0,0 +1,243 @@
1
+ # hai-storage 参考
2
+
3
+ > `@h-ai/storage` 提供统一文件存储接口,支持本地文件系统(LocalProvider)和 S3 兼容存储(S3Provider),通过 `storage.file`、`storage.dir`、`storage.presign` 访问存储,`storage.checksum` 提供 Node 端无需初始化的字节完整性工具。
4
+
5
+ ## 运行环境
6
+
7
+ > ⚠️ **服务端模块**。`storage.file` / `storage.dir` / `storage.presign` 均在 Node.js 端使用。浏览器端通过预签名 URL 或 API 端点间接访问存储(见下方「浏览器端文件上传」)。
8
+
9
+ ## 适用场景
10
+
11
+ - 文件上传与下载
12
+ - 预签名 URL 生成(客户端直传)
13
+ - S3 兼容存储对接(AWS S3、MinIO、RustFS、阿里云 OSS 等)
14
+ - 本地开发文件存储
15
+ - 目录前缀清理与批量文件删除
16
+
17
+ ## 使用步骤
18
+
19
+ ### 1. 配置
20
+
21
+ ```yaml
22
+ # config/_storage.yml
23
+ type: local # local | s3
24
+ # 本地存储
25
+ root: ./data/storage
26
+ # S3 存储(type=s3 时生效)
27
+ # endpoint: ''
28
+ # region: us-east-1
29
+ # accessKeyId: ''
30
+ # secretAccessKey: ''
31
+ # bucket: my-bucket
32
+ # forcePathStyle: false
33
+ # prefix: ''
34
+ # publicUrl: ''
35
+ operationLog:
36
+ read: false # file.get/head/exists, dir.list, presign.getUrl/publicUrl
37
+ write: false # file.put/delete/deleteMany/copy, dir.delete, presign.putUrl
38
+ maxLength: 1000
39
+ level: debug # info | debug | trace
40
+ ```
41
+
42
+ 约定环境变量优先于 YAML,例如 `HAI_STORAGE_ROOT`、
43
+ `HAI_STORAGE_ACCESSKEYID`、`HAI_STORAGE_SECRETACCESSKEY`。
44
+
45
+ MinIO、RustFS 使用同一个 S3 Provider:配置 `type: s3`、S3 API `endpoint`(通常为 9000 端口)和 `forcePathStyle: true`,并预先创建 `bucket`;不要新增 `type: minio` 或 `type: rustfs`。
46
+
47
+ 使用 hai-deploy 的默认自建 S3 配置时,可通过 `container.s3Engine`(`HAI_DEPLOY_CONTAINER_S3ENGINE`,`rustfs | minio`)选择实现,默认 RustFS。部署流程复用应用镜像中的 S3 SDK 幂等初始化 bucket,不依赖单独的 mc 镜像;自定义外部 S3 服务仍需确认 bucket 已存在且凭据有相应权限。
48
+
49
+ `operationLog` 在 Local/S3 Provider 的真实 file/dir/presign 操作处输出日志,不要在 `storage-main.ts` 或调用方重复包装。文件内容不会写入日志,上传数据只记录字节长度;`maxLength` 用于截断序列化后的参数,`level` 默认 `debug`。
50
+
51
+ ### 2. 初始化与关闭
52
+
53
+ ```typescript
54
+ import { storage } from '@h-ai/storage'
55
+
56
+ await storage.init(core.config.get('storage'))
57
+ // 使用后关闭
58
+ const closeResult = await storage.close()
59
+ if (!closeResult.success) {
60
+ throw new Error(closeResult.error.message)
61
+ }
62
+ ```
63
+
64
+ > `storage.config` 返回的是**脱敏配置快照**;S3 的 `accessKeyId` / `secretAccessKey` 等敏感字段会被替换为 `[REDACTED]`。
65
+
66
+ ## 核心 API
67
+
68
+ ### 文件操作
69
+
70
+ `storage.file` 提供以下方法:
71
+
72
+ - `put(key, data, options?)`
73
+ - `get(key, options?)`
74
+ - `getStream(key, options?)`(字节流,迭代错误可抛出)
75
+ - `head(key)`
76
+ - `exists(key)`
77
+ - `delete(key)`
78
+ - `deleteMany(keys)`
79
+ - `copy(sourceKey, destKey, options?)`
80
+
81
+ ```typescript
82
+ // 上传文件
83
+ const result = await storage.file.put('avatars/user-123.png', fileBuffer, {
84
+ contentType: 'image/png',
85
+ metadata: { userId: '123' },
86
+ })
87
+
88
+ // 下载文件
89
+ const file = await storage.file.get('avatars/user-123.png')
90
+
91
+ // 列出文件
92
+ const files = await storage.dir.list({ prefix: 'avatars/', maxKeys: 100 })
93
+ ```
94
+
95
+ ### 预签名 URL
96
+
97
+ `storage.presign` 提供以下方法:
98
+
99
+ - `getUrl(key, options?)`
100
+ - `putUrl(key, options?)`
101
+ - `publicUrl(key)`
102
+
103
+ ```typescript
104
+ // 客户端直传模式
105
+ const uploadUrl = await storage.presign.putUrl('uploads/doc.pdf', {
106
+ expiresIn: 3600, // 1 小时有效
107
+ contentType: 'application/pdf',
108
+ })
109
+
110
+ // 临时下载链接
111
+ const downloadUrl = await storage.presign.getUrl('uploads/doc.pdf', {
112
+ expiresIn: 300, // 5 分钟有效
113
+ })
114
+ ```
115
+
116
+ > `storage.presign.putUrl()` 当前不支持 `maxSize` 约束参数;如需大小限制,请在应用层上传前校验,或在服务端落库/回调处二次校验。
117
+
118
+ ## 错误码 — `HaiStorageError`
119
+
120
+ | 错误码 | code | 说明 |
121
+ |--------|------|------|
122
+ | `HaiStorageError.CONNECTION_FAILED` | `hai:storage:001` | 连接失败 |
123
+ | `HaiStorageError.OPERATION_FAILED` | `hai:storage:002` | 操作失败 |
124
+ | `HaiStorageError.NOT_FOUND` | `hai:storage:003` | 文件不存在 |
125
+ | `HaiStorageError.ALREADY_EXISTS` | `hai:storage:004` | 文件已存在 |
126
+ | `HaiStorageError.CHECKSUM_FAILED` | `hai:storage:016` | checksum 读取/计算失败 |
127
+ | `HaiStorageError.INVALID_CHECKSUM` | `hai:storage:017` | checksum 格式/算法非法 |
128
+ | `HaiStorageError.PERMISSION_DENIED` | `hai:storage:005` | 权限不足 |
129
+ | `HaiStorageError.QUOTA_EXCEEDED` | `hai:storage:006` | 配额超限 |
130
+ | `HaiStorageError.INVALID_PATH` | `hai:storage:007` | 路径无效 |
131
+ | `HaiStorageError.IO_ERROR` | `hai:storage:008` | IO 错误 |
132
+ | `HaiStorageError.NETWORK_ERROR` | `hai:storage:009` | 网络错误 |
133
+ | `HaiStorageError.NOT_INITIALIZED` | `hai:storage:010` | 未初始化 |
134
+ | `HaiStorageError.UNSUPPORTED_TYPE` | `hai:storage:011` | 不支持的存储类型 |
135
+ | `HaiStorageError.CONFIG_ERROR` | `hai:storage:012` | 配置错误 |
136
+ | `HaiStorageError.PRESIGN_FAILED` | `hai:storage:013` | 预签名 URL 生成失败 |
137
+ | `HaiStorageError.UPLOAD_FAILED` | `hai:storage:014` | 上传失败 |
138
+ | `HaiStorageError.DOWNLOAD_FAILED` | `hai:storage:015` | 下载失败 |
139
+
140
+ ## HTTP API 契约
141
+
142
+ 公共 HTTP API 统一由 `@h-ai/api-contract` 提供,并由 `@h-ai/serv/features/storage` 绑定到本模块。
143
+
144
+ ```typescript
145
+ import { apiClient } from '@h-ai/api-client'
146
+
147
+ const result = await apiClient.storage.presignedUrls.createUpload({ key: 'avatar.png' })
148
+ ```
149
+
150
+ ## 常见模式
151
+
152
+ 大文件上传用 `file.put(key, readableOrAsyncByteStream, { signal, ifNoneMatch: '*' })`,内部使用有界 S3 multipart;下载用 `file.getStream(key, { signal, rangeStart, rangeEnd })`,及时消费或关闭,迭代期间 I/O/取消可能抛错。本地读取目录直接返回 `INVALID_PATH`。checksum 的 signal 取消会停止等待下一块数据并请求关闭输入迭代器。`get()` 返回完整 Buffer,只用于容量可控的数据。仅创建写入采用 S3 标准条件或本地原子发布,冲突返回 `ALREADY_EXISTS`;后端不支持时失败,不退回覆盖。
153
+
154
+ `checksum.generate(data, options?)` / `checksum.verify(data, expected, options?)` 默认 SHA-256、小写 hex,可选 sha384/sha512/sha1/md5、base64 编码与 signal;流仅消费一次,读取失败返回 HaiResult 错误,不匹配返回 false。MD5/SHA-1 不作安全认证,ETag 和 multipart 复合 checksum 不当作完整文件摘要。浏览器不导入 Node checksum;离线增量摘要需使用适用的浏览器实现,不把 SubtleCrypto.digest 当流式 API。
155
+
156
+ ### 与 kit 集成(文件上传 API)
157
+
158
+ ```typescript
159
+ import { storage } from '$lib/server/init'
160
+ // src/routes/api/files/upload/+server.ts
161
+ import { kit } from '@h-ai/kit'
162
+ import { z } from 'zod'
163
+
164
+ const UploadSchema = z.object({
165
+ key: z.string().min(1),
166
+ })
167
+
168
+ export const POST = kit.handler(async ({ request, locals }) => {
169
+ kit.guard.require(locals.session, 'storage:write')
170
+ const formData = await request.formData()
171
+ const file = formData.get('file') as File
172
+ if (!file)
173
+ return kit.response.badRequest('Missing file')
174
+
175
+ const key = `uploads/${locals.session.userId}/${file.name}`
176
+ const buffer = new Uint8Array(await file.arrayBuffer())
177
+ const result = await storage.file.put(key, buffer, { contentType: file.type })
178
+ if (!result.success)
179
+ return kit.response.internalError()
180
+ return kit.response.created({ key })
181
+ })
182
+ ```
183
+
184
+ > 说明:`@h-ai/storage` 只提供存储能力,不强制要求 `/api/storage` 路由命名。应用可按业务语义自定义 API 路径。
185
+
186
+ > Local Provider 的 `storage.dir.list()` 会递归扫描匹配前缀下的文件,仅支持 `maxKeys` 截断,不支持 `continuationToken` 真分页;大目录建议缩小 `prefix` 或改用 S3 Provider。
187
+
188
+ ### 头像上传
189
+
190
+ ```typescript
191
+ const key = `avatars/${userId}/${Date.now()}.png`
192
+ const result = await storage.file.put(key, avatarBuffer, {
193
+ contentType: 'image/png',
194
+ })
195
+ if (result.success) {
196
+ const publicUrl = storage.presign.publicUrl(key)
197
+ await iam.user.updateUser(userId, { avatarUrl: publicUrl ?? '' })
198
+ }
199
+ ```
200
+
201
+ ## 浏览器端文件上传(预签名 URL 模式)
202
+
203
+ 浏览器端无法直接使用 `storage` 模块,应通过 API 获取预签名 URL 后直传:
204
+
205
+ ```typescript
206
+ import { apiFetch } from '$lib/utils/api'
207
+
208
+ // 1. 向服务端请求预签名上传 URL
209
+ const res = await apiFetch('/api/storage/presign/upload', {
210
+ method: 'POST',
211
+ headers: { 'Content-Type': 'application/json' },
212
+ body: JSON.stringify({ key: `uploads/${file.name}`, contentType: file.type }),
213
+ })
214
+ const { url } = await res.json()
215
+
216
+ // 2. 浏览器直传到存储(不经过服务端,大文件友好)
217
+ await fetch(url, {
218
+ method: 'PUT',
219
+ body: file,
220
+ headers: { 'Content-Type': file.type },
221
+ })
222
+ ```
223
+
224
+ 也可使用 typed client(需配合 `@h-ai/api-client`):
225
+
226
+ ```typescript
227
+ import { apiClient } from '@h-ai/api-client'
228
+
229
+ const result = await apiClient.storage.presignedUrls.createUpload({
230
+ key: `avatars/${userId}.png`,
231
+ contentType: 'image/png',
232
+ })
233
+ if (result.success) {
234
+ await fetch(result.data.url, { method: 'PUT', body: file })
235
+ }
236
+ ```
237
+
238
+ ## 相关 Skills
239
+
240
+ - `hai-build`:模块初始化顺序
241
+ - `hai-core`:配置与 HaiResult 模型
242
+ - `hai-kit`:SvelteKit API 端点集成(`kit.handler` + `kit.guard`)
243
+ - `hai-ui`:Storage 场景组件(FileUpload/ImageUpload/AvatarUpload)
@@ -31,7 +31,7 @@ description: "使用 @h-ai/ui 构建 Svelte 5 表单、表格、弹窗、新手
31
31
 
32
32
  新手引导、首次 Cookie 提示、操作导览和帮助中心见 [guide.md](guide.md)。fullstack 默认在共享管理界面接入,新增业务只补内容与 data-guide 锚点。
33
33
 
34
- 详细配置、API 签名、错误码和范本在 [reference.md](reference.md)。按下列标题定位所需小节,不默认通读;用例中的业务变量需结合当前应用补齐。
34
+ 按任务读取 [reference.md](reference.md) 的对应小节;签名以当前源码或安装版本的公开类型为准,不默认加载全部资料。示例中的业务变量由应用提供。
35
35
 
36
36
  - 运行环境
37
37
  - 适用场景
@@ -39,7 +39,7 @@
39
39
  至少检查以下四项:
40
40
 
41
41
  - `svelte.config.*`:`autoImportHaiUi()` 在 `vitePreprocess()` 前。
42
- - `vite.config.*`:`ssr.noExternal` 包含 `@h-ai/*`,`optimizeDeps.exclude` 包含 `bits-ui`。
42
+ - `vite.config.*`:`ssr.noExternal` 包含 `@h-ai/ui` 和 `@h-ai/kit`,`optimizeDeps.exclude` 包含 `bits-ui`。
43
43
  - `app.css`:已导入 `global.css` / `theme.css`;移动端还要导入 `design-tokens.css` / `mobile.css`。
44
44
  - Tailwind:已配置 `@source` 扫描 `@h-ai/ui/dist/**/*.{svelte,js,ts}`。
45
45
 
@@ -89,7 +89,7 @@
89
89
 
90
90
  ```bash
91
91
  # 核心包
92
- npm install @h-ai/ui
92
+ npm install @h-ai/ui @h-ai/core
93
93
 
94
94
  # 必须的对等依赖与构建工具
95
95
  npm install -D svelte @sveltejs/kit @sveltejs/vite-plugin-svelte
@@ -99,6 +99,8 @@ npm install -D tailwindcss @tailwindcss/vite daisyui
99
99
  npm install -D @iconify/tailwind4 @iconify-json/tabler
100
100
  ```
101
101
 
102
+ Node adapter 使用 Crypto、Kit 或 IAM 时,还需将 `sm-crypto@0.5.7` 作为直接生产依赖安装,保留 Node 原生模块解析。
103
+
102
104
  ### 2. svelte.config.js
103
105
 
104
106
  ```js
@@ -143,7 +145,8 @@ export default defineConfig({
143
145
  },
144
146
  ssr: {
145
147
  // @h-ai 包为 ESM + Svelte 组件,需 Vite 在 SSR 时处理
146
- noExternal: [/@h-ai\//],
148
+ noExternal: ['@h-ai/ui', '@h-ai/kit'],
149
+ external: ['@h-ai/core', 'sm-crypto'],
147
150
  },
148
151
  })
149
152
  ```
@@ -606,6 +609,8 @@ AuthPanel 直接接收 IAM 白名单配置和 actions,内置登录(密码/LD
606
609
 
607
610
  AuthPanel 在 SSR 阶段禁用原生表单控件,客户端挂载并绑定事件后自动开放输入,避免接管时丢失早到的输入。应用无需额外的就绪适配;E2E 等待控件可编辑,并覆盖客户端脚本延迟加载的场景。
608
611
 
612
+ 认证链接指向当前完整 URL 时,AuthPanel 只切换场景并阻止重复导航,返回登录后可立即输入。路径、查询串或 hash 不同时交给应用路由处理;Ctrl/Cmd 等修改键点击保留浏览器行为。不要为切换场景额外调用 goto 或 location.reload。
613
+
609
614
 
610
615
  协议在 Modal 内显示并保留表单输入;使用 URL 时,协议页面须允许 iframe 嵌入,组件禁用其脚本,另提供新窗口查看入口。登录/注册表单使用 `header/extraFields/footer` snippet,AuthPanel 透传 `loginHeader/loginFields/loginFooter` 和 `registerHeader/registerFields/registerFooter`,底部保留内置导航。自定义字段由应用绑定状态和提交,不会隐式写入 IAM 用户模型。
611
616
 
@@ -632,8 +637,9 @@ AuthPanel 在 SSR 阶段禁用原生表单控件,客户端挂载并绑定事
632
637
  4. **Combobox 统一单选/多选**:`MultiSelect` 已删除
633
638
  5. **移动端样式**:务必引入 `design-tokens.css` + `mobile.css`,使用 SafeArea 包裹原生 App 页面
634
639
  6. **`@source` 必须配置**:未配置则 TailwindCSS 无法扫描 `@h-ai/ui` 组件中的 class,样式会丢失
635
- 7. **`ssr.noExternal`**:Vite SSR 需要将 `@h-ai/*` 包纳入处理,否则 SSR 时 Svelte 组件无法正确编译
636
- 8. **data-* 属性透传**:公开 Svelte 组件会把调用方传入的 `data-*` 属性透传到根节点或主交互节点;测试和自动化优先直接使用 `data-testid`、`data-analytics-id`,不要为测试 ID 重复封装组件
640
+ 7. **响应式布局**:后台工作区和数据列表使用可用宽度,避免外壳固定 max-width 造成宽屏两侧留白。flex/grid 子项设 min-width: 0,表格在自身容器滚动;正文和登录框保留阅读宽度。至少验证 390、1440、1920、2560、3840px 的内容占宽、导航与全页溢出。
641
+ 8. **`ssr.noExternal`**:Svelte 组件及 `@h-ai/kit/client` 的 `$app/*` 路由别名需要 Vite 编译,UI 和 Kit 保持 noExternal,core 及其他纯服务端包保留原生加载;本地链接的框架包也要显式 external,避免日志、数据库等原生依赖被重复打包。sm-crypto 使用动态 CommonJS require,应放入 `ssr.external`,并以明确版本列入应用 dependencies;adapter-node 只根据直接生产依赖排除二次打包,不能仅依赖它作为框架的传递依赖。
642
+ 9. **data-* 属性透传**:公开 Svelte 组件会把调用方传入的 `data-*` 属性透传到根节点或主交互节点;测试和自动化优先直接使用 `data-testid`、`data-analytics-id`,不要为测试 ID 重复封装组件
637
643
 
638
644
  ## 导出路径
639
645
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: hai-vecdb
3
- description: "使用 @h-ai/vecdb 管理 LanceDB/pgvector/Qdrant/Chroma 集合与向量检索。"
3
+ description: "使用 LanceDB/pgvector/Qdrant/Chroma 管理向量集合、写入和检索;排查维度、连接与过滤问题。"
4
4
  ---
5
5
 
6
6
  # hai-vecdb
@@ -22,7 +22,7 @@ description: "使用 @h-ai/vecdb 管理 LanceDB/pgvector/Qdrant/Chroma 集合与
22
22
 
23
23
  ## 按需参考
24
24
 
25
- 详细配置、API 签名、错误码和范本在 [reference.md](reference.md)。按下列标题定位所需小节,不默认通读;用例中的业务变量需结合当前应用补齐。
25
+ 按任务读取 [reference.md](reference.md) 的对应小节;签名以当前源码或安装版本的公开类型为准,不默认加载全部资料。示例中的业务变量由应用提供。
26
26
 
27
27
  - 运行环境
28
28
  - 适用场景