@h-ai/cli 1.0.0-beta.1 → 1.0.0-beta.3
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.
- package/README.en.md +20 -8
- package/README.ja.md +20 -8
- package/README.md +20 -8
- package/dist/{chunk-M7HN2OE3.js → chunk-K6RWTTHD.js} +573 -106
- package/dist/chunk-K6RWTTHD.js.map +1 -0
- package/dist/{chunk-AKV2CQZV.js → chunk-SWEU7KUE.js} +71 -59
- package/dist/chunk-SWEU7KUE.js.map +1 -0
- package/dist/{chunk-3JCZO34U.js → chunk-YVNNMC4H.js} +365 -137
- package/dist/chunk-YVNNMC4H.js.map +1 -0
- package/dist/cli-config-templates-LUJGDQNW.js +5 -0
- package/dist/{cli-config-templates-RCWQMHZN.js.map → cli-config-templates-LUJGDQNW.js.map} +1 -1
- package/dist/{cli-skill-templates-PN4FLGBC.js → cli-skill-templates-VV2XWYON.js} +3 -3
- package/dist/{cli-skill-templates-PN4FLGBC.js.map → cli-skill-templates-VV2XWYON.js.map} +1 -1
- package/dist/index.js +118 -209
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/{src-JRKSWJ2Q.js → src-IR5AU43K.js} +3 -3
- package/dist/src-IR5AU43K.js.map +1 -0
- package/package.json +11 -11
- package/templates/apps/api/.dockerignore.hbs +10 -0
- package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +20 -1
- package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +6 -1
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +1 -1
- package/templates/apps/api/images/serv.Dockerfile.hbs +3 -2
- package/templates/apps/fullstack/.dockerignore.hbs +10 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +1 -1
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +16 -2
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +6 -2
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +6 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +10 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +14 -7
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +6 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +1 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +7 -1
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +1 -1
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +1 -0
- package/templates/apps/website/scripts/static-website.mjs.hbs +3 -3
- package/templates/base/.dockerignore.hbs +10 -0
- package/templates/base/images/web.Dockerfile.hbs +4 -2
- package/templates/base/package.json.hbs +1 -1
- package/templates/base/src/hooks.server.ts.hbs +9 -7
- package/templates/features/payment/routes/api/v1/payment/create/+server.ts +3 -1
- package/templates/skills/AGENTS.md +2 -0
- package/templates/skills/bridges/admin/AGENTS.md +2 -0
- package/templates/skills/bridges/api/AGENTS.md +2 -0
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +2 -0
- package/templates/skills/bridges/h5/AGENTS.md +2 -0
- package/templates/skills/bridges/mobile-app/AGENTS.md +2 -0
- package/templates/skills/bridges/website/AGENTS.md +2 -0
- package/templates/skills/hai-ai/guide.md +5 -3
- package/templates/skills/hai-app-create/SKILL.md +1 -1
- package/templates/skills/hai-app-create/collaboration.md +6 -1
- package/templates/skills/hai-app-create/development.md +10 -4
- package/templates/skills/hai-app-create/reference.md +4 -2
- package/templates/skills/hai-app-review/SKILL.md +2 -0
- package/templates/skills/hai-app-tests/SKILL.md +2 -0
- package/templates/skills/hai-build/SKILL.md +5 -5
- package/templates/skills/hai-build/paths.md +1 -1
- package/templates/skills/hai-build/reference.md +1 -1
- package/templates/skills/hai-change-plan/SKILL.md +46 -0
- package/templates/skills/hai-deploy/SKILL.md +16 -4
- package/templates/skills/hai-deploy/middleware.md +4 -2
- package/templates/skills/hai-feedback/SKILL.md +1 -1
- package/templates/skills/hai-pr-review/SKILL.md +2 -0
- package/templates/skills/hai-serv/reference.md +5 -8
- package/templates/skills/hai-spec-implement/SKILL.md +2 -0
- package/templates/skills/hai-storage/SKILL.md +2 -2
- package/templates/skills/hai-storage/reference.md +1 -1
- package/dist/chunk-3JCZO34U.js.map +0 -1
- package/dist/chunk-AKV2CQZV.js.map +0 -1
- package/dist/chunk-M7HN2OE3.js.map +0 -1
- package/dist/cli-config-templates-RCWQMHZN.js +0 -5
- package/dist/src-JRKSWJ2Q.js.map +0 -1
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
## 行为契约
|
|
13
13
|
|
|
14
|
+
涉及框架结构、配置、核心流程或模块边界变更时,先按 [变更影响与方案确认](.agents/skills/hai-change-plan/SKILL.md) 说明影响并等待用户决定;已确认且未扩大的方案继续执行。
|
|
15
|
+
|
|
14
16
|
需求/设计文档审查或从文档生成代码时,读取 [hai-spec-review](.agents/skills/hai-spec-review/SKILL.md),严格确认完备性、歧义、技术正确性与命名一致性;影响行为的问题未解决前不判定文档可生成。普通小改动不重审无关文档。
|
|
15
17
|
|
|
16
18
|
升级 hai-framework 到最新/指定版本、比较版本差异或同步框架 skills 时,先读 [框架升级与同步 Skill](.agents/skills/hai-framework-sync/SKILL.md),执行版本发现、差异分析、用户选择/阻塞处理、迁移与验证;仅要求比较时不修改应用。
|
|
@@ -11,6 +11,8 @@ Fullstack 多包工程入口。先读 README、根 workspace 脚本与相关 pac
|
|
|
11
11
|
|
|
12
12
|
## 行为契约
|
|
13
13
|
|
|
14
|
+
涉及框架结构、配置、核心流程或模块边界变更时,先按 [变更影响与方案确认](.agents/skills/hai-change-plan/SKILL.md) 说明影响并等待用户决定;已确认且未扩大的方案继续执行。
|
|
15
|
+
|
|
14
16
|
需求/设计文档审查或从文档生成代码时,读取 [hai-spec-review](.agents/skills/hai-spec-review/SKILL.md),严格确认完备性、歧义、技术正确性与命名一致性;影响行为的问题未解决前不判定文档可生成。普通小改动不重审无关文档。
|
|
15
17
|
|
|
16
18
|
升级 hai-framework 到最新/指定版本、比较版本差异或同步框架 skills 时,先读 [框架升级与同步 Skill](.agents/skills/hai-framework-sync/SKILL.md),执行版本发现、差异分析、用户选择/阻塞处理、迁移与验证;仅要求比较时不修改应用。
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
## 行为契约
|
|
13
13
|
|
|
14
|
+
涉及框架结构、配置、核心流程或模块边界变更时,先按 [变更影响与方案确认](.agents/skills/hai-change-plan/SKILL.md) 说明影响并等待用户决定;已确认且未扩大的方案继续执行。
|
|
15
|
+
|
|
14
16
|
需求/设计文档审查或从文档生成代码时,读取 [hai-spec-review](.agents/skills/hai-spec-review/SKILL.md),严格确认完备性、歧义、技术正确性与命名一致性;影响行为的问题未解决前不判定文档可生成。普通小改动不重审无关文档。
|
|
15
17
|
|
|
16
18
|
升级 hai-framework 到最新/指定版本、比较版本差异或同步框架 skills 时,先读 [框架升级与同步 Skill](.agents/skills/hai-framework-sync/SKILL.md),执行版本发现、差异分析、用户选择/阻塞处理、迁移与验证;仅要求比较时不修改应用。
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
## 行为契约
|
|
13
13
|
|
|
14
|
+
涉及框架结构、配置、核心流程或模块边界变更时,先按 [变更影响与方案确认](.agents/skills/hai-change-plan/SKILL.md) 说明影响并等待用户决定;已确认且未扩大的方案继续执行。
|
|
15
|
+
|
|
14
16
|
需求/设计文档审查或从文档生成代码时,读取 [hai-spec-review](.agents/skills/hai-spec-review/SKILL.md),严格确认完备性、歧义、技术正确性与命名一致性;影响行为的问题未解决前不判定文档可生成。普通小改动不重审无关文档。
|
|
15
17
|
|
|
16
18
|
升级 hai-framework 到最新/指定版本、比较版本差异或同步框架 skills 时,先读 [框架升级与同步 Skill](.agents/skills/hai-framework-sync/SKILL.md),执行版本发现、差异分析、用户选择/阻塞处理、迁移与验证;仅要求比较时不修改应用。
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
## 行为契约
|
|
13
13
|
|
|
14
|
+
涉及框架结构、配置、核心流程或模块边界变更时,先按 [变更影响与方案确认](.agents/skills/hai-change-plan/SKILL.md) 说明影响并等待用户决定;已确认且未扩大的方案继续执行。
|
|
15
|
+
|
|
14
16
|
需求/设计文档审查或从文档生成代码时,读取 [hai-spec-review](.agents/skills/hai-spec-review/SKILL.md),严格确认完备性、歧义、技术正确性与命名一致性;影响行为的问题未解决前不判定文档可生成。普通小改动不重审无关文档。
|
|
15
17
|
|
|
16
18
|
升级 hai-framework 到最新/指定版本、比较版本差异或同步框架 skills 时,先读 [框架升级与同步 Skill](.agents/skills/hai-framework-sync/SKILL.md),执行版本发现、差异分析、用户选择/阻塞处理、迁移与验证;仅要求比较时不修改应用。
|
|
@@ -80,16 +80,18 @@ await ai.close()
|
|
|
80
80
|
|
|
81
81
|
## 配置要点
|
|
82
82
|
|
|
83
|
+
LLM 协议使用 `llm.protocol`、`llm.models[].protocol` 和 `tempModel.protocol`,值为 `chat | responses | anthropic`;环境变量使用 `HAI_AI_LLM_PROTOCOL`、`HAI_AI_LLM_MODELS_0_PROTOCOL` 等。旧 `api` 字段及旧协议变量会报迁移错误,密钥字段 `apiKey` 不变。
|
|
84
|
+
|
|
83
85
|
```yaml
|
|
84
86
|
llm:
|
|
85
87
|
apiKey: ''
|
|
86
88
|
baseUrl: https://api.openai.com/v1
|
|
87
89
|
model: gpt-4o-mini
|
|
88
|
-
|
|
90
|
+
protocol: chat # chat(默认)| responses | anthropic——底层协议,对使用方透明
|
|
89
91
|
timeout: 60000
|
|
90
92
|
tempModelCacheTtl: 600000 # 临时模型客户端缓存 TTL(毫秒,默认 10 分钟)
|
|
91
93
|
models: # 可为单个模型指定协议(responses / anthropic)
|
|
92
|
-
- {id: claude, model: claude-3-5-sonnet-latest,
|
|
94
|
+
- {id: claude, model: claude-3-5-sonnet-latest, protocol: anthropic}
|
|
93
95
|
scenarios:
|
|
94
96
|
chat: fast
|
|
95
97
|
reasoning: strong
|
|
@@ -125,7 +127,7 @@ memory:
|
|
|
125
127
|
| ------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
126
128
|
| 非流式对话 | `ai.llm.chat({ messages })` | OpenAI 兼容 Chat Completion |
|
|
127
129
|
| 流式对话 | `ai.llm.chatStream({ messages })` | 返回 `AsyncIterable` |
|
|
128
|
-
| 多协议 | 模型 `
|
|
130
|
+
| 多协议 | 模型 `protocol: chat/responses/anthropic` | 底层走 Chat Completions / Responses / Anthropic,公共形状不变 |
|
|
129
131
|
| 请求取消 | `ai.llm.chat({ messages, signal })` | 传 `AbortSignal`,`abort()` 立即停上游生成 |
|
|
130
132
|
| 临时模型 | `ai.llm.chat({ messages, tempModel })` | 单次请求级临时端点,客户端按 TTL 缓存 |
|
|
131
133
|
| 工具定义 | `ai.tools.define(...)` | Zod schema 转 JSON Schema;`handler(input, ctx)` 第二参为执行上下文 |
|
|
@@ -38,7 +38,7 @@ description: "在 hai 应用中新增、修改或修复功能,按需求复用
|
|
|
38
38
|
|
|
39
39
|
界面新建或明显改变信息结构时先用已交付的 hai-ui-design 确定页面模式、状态和组件映射;使用 hai-ui 的当前版本契约实现,以 hai-ui-review 的真实页面检查收尾。窄范围修复直接复用既有设计。界面方案与最终实现的差异需回写适用设计记录。
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
带前端的工程新增引导或帮助时,读取本工程 `hai-ui` Skill 中的 `guide.md`,复用 fullstack 的共享 guide-store、locale 与稳定 data-guide 锚点;纯 API 工程不需要 UI 指引。
|
|
42
42
|
|
|
43
43
|
按任务读取 [reference.md](reference.md) 的对应小节;签名以当前源码或安装版本的公开类型为准,不默认加载全部资料。示例中的业务变量由应用提供。
|
|
44
44
|
|
|
@@ -12,19 +12,22 @@
|
|
|
12
12
|
|
|
13
13
|
## 修改前与交付前的同步检查
|
|
14
14
|
|
|
15
|
+
框架增删改涉及数据结构、配置/环境变量、核心流程或模块边界时,先执行[变更影响与方案确认](../hai-change-plan/SKILL.md),用清楚简短的语言说明改变什么、影响谁、怎样同步与验证,等待用户决定后实施。既有具体确认不重复要求;新发现的重要影响只确认增量。普通业务私有实现不因此升级成框架改造。
|
|
16
|
+
|
|
15
17
|
框架相关任务先从四个视角提出可检验的要求,再查找差距:维护者需要稳定契约、清楚职责、失败可定位和同步成本可控;框架使用者需要可运行示例、可理解配置、明确环境边界和可恢复的调用流程;生成应用的最终用户需要清楚的信息层级、完整状态反馈、语言一致及键盘/窄屏可用;安全审查员关注服务端身份与资源权限、输入和外部地址边界、密钥与诊断材料保护,以及并发、重试和恢复中的权限绕过或重复副作用。每项问题说明触发条件、实际影响和验证办法,同一根因合并记录;不把四个视角机械扩展为本次范围外的大改造,也不把推测写成已确认漏洞。
|
|
16
18
|
|
|
17
19
|
按实际影响逐项作出“需同步 / 已同步 / 不适用及原因”的判断,不能机械要求每次全部修改:
|
|
18
20
|
|
|
19
21
|
| 对象 | 何时需要同步 | 应确认的结果 |
|
|
20
22
|
| --- | --- | --- |
|
|
21
|
-
|
|
|
23
|
+
| 使用文档与网站 | 操作路径、环境前提、公开能力或故障恢复变化 | 更新相关 README、docs/usage 或既有指南;同步 GitHub Pages 内容源、导航与图片,验证构建和链接,不手改生成产物 |
|
|
22
24
|
| 配置与示例 | 配置名、默认值、校验、优先级或安全策略变化 | 核对 Schema 与消费点,区分框架默认、模板默认和建议值;示例能通过当前版本校验 |
|
|
23
25
|
| 截图 | 界面/交互或使用说明中的画面变化 | 当前版本实际操作后截图,记录场景、语言、尺寸;去除凭据与私人数据,不用旧图冒充新结果 |
|
|
24
26
|
| 测试 | 行为、权限、异常、并发或恢复边界变化 | 补最小合适层的行为回归;关键跨层流程保留 E2E,按影响定向运行 |
|
|
25
27
|
| CLI 模板 | 公共组件、配置、初始化或应用规范变化 | 新生成应用继承改进,验证复制后的文件、引用与核心流程;生成应用无框架仓库时不伪造仓库检查命令 |
|
|
26
28
|
| 调用方 | API、类型、错误码或共享默认变化 | 搜索直接及关键间接消费者;同步框架包、示例与模板,说明必要迁移 |
|
|
27
29
|
| README / Skills / AI 入口 | 使用方式或后续工作流程变化 | 共用正文与链接维护,已提供的多语言版本保持一致;不向应用复制仓库私有路径 |
|
|
30
|
+
| 注释与类型说明 | 字段、默认值、约束、调用顺序或错误行为变化 | 同步 JSDoc、源码注释和示例,说明实际契约,不保留旧语义 |
|
|
28
31
|
|
|
29
32
|
## 使用文档与证据
|
|
30
33
|
|
|
@@ -34,6 +37,8 @@
|
|
|
34
37
|
|
|
35
38
|
使用指南由理解源码和实际操作后人工编写,不用脚本将 Schema/API 表直接生成正文。自动化只做示例、链接、翻译键和截图采集等验证工作。截图解释“做了什么、看到什么变化”,优先展示操作前后和失败恢复,不能堆放无关图片。
|
|
36
39
|
|
|
40
|
+
安装说明与“最新版”介绍使用 npm 注册表链接、动态徽标、`@latest` 与 `pnpm view <包名>@latest version`,不写死当前框架发布号。需要固定依赖时引导使用查询结果;运行环境的最低依赖版本和历史验收来源按事实记录,不能改写成动态最新。
|
|
41
|
+
|
|
37
42
|
统一提示的术语、语气和动作名称。面向用户说明发生了什么及下一步,开发定位用错误码和追踪标识连接日志;5xx/未知异常不显示内部细节。业务失败保留完整 HaiError,确需转换为异常时通过 Error.cause 保留来源。审查可见正文、占位符、按钮、校验、空状态、提示和辅助技术标签,不只检查翻译字典的键数;演示页和模板同样适用。
|
|
38
43
|
|
|
39
44
|
所有警告、错误及即时操作结果统一经 ToastContainer;不新增行内警告框、红色错误段落或页面私有提示浮层。字段保留错误标记、aria-invalid 和读屏关联说明,恢复动作留在原操作区域。默认仅显示可读说明,不显示 traceId;有编号时使用容器内“查看排查信息”图标,展开后显示“问题追踪编号”、复制入口及联系客户支持或开发人员时提供编号的说明。展开、悬停和聚焦期间暂停计时;验证复制失败的手动复制路径、键盘、弹窗和窄屏。中英日文同步,不把内部异常或敏感上下文放入排查面板。
|
|
@@ -12,7 +12,7 @@ README 编辑先读章节,把功能说明与示例合并到对应章节;新
|
|
|
12
12
|
|
|
13
13
|
## 先确认应用与版本
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- 带前端的工程新增引导与帮助时使用 `@h-ai/ui/guide`,读取随前端交付的 `hai-ui` Skill 中的 `guide.md`;纯 API 工程不需要该 UI 指引。fullstack 共享管理界面已有帮助入口,业务内容放共享 guide-store,使用应用 i18n 和稳定 data-guide 锚点。
|
|
16
16
|
|
|
17
17
|
- 读取当前 `AGENTS.md`、README、`package.json`、lockfile、初始化入口和已有相似功能;用 `rg` 查实现、引用、测试。保留已有改动,沿用项目分层、命名、ESLint、i18n 与测试入口。
|
|
18
18
|
- 确认架构:SvelteKit 使用 `kit` 和文件路由;API workspace 使用 contract/service;fullstack 使用 contract/serv/shared 与所选前端;Vite SPA/原生端通过 typed API 客户端调用服务。不要把服务端目录、DB、密钥或 Node 初始化复制到浏览器。
|
|
@@ -22,7 +22,9 @@ README 编辑先读章节,把功能说明与示例合并到对应章节;新
|
|
|
22
22
|
|
|
23
23
|
### 页面与布局
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
新建工程统一采用适用的完整模块和示例,服务端包含 AI、向量库、反馈等依赖;客户端仍按类型隔离服务端模块。安装体积相应增加,示例需按实际业务替换。`--template`、`--features`、`--examples/--no-examples` 已删除,`create --yes/-y` 改为 `--defaults`,旧参数明确报错;`deploy --yes` 保持原义。已有工程的模块选择不受影响。
|
|
26
|
+
|
|
27
|
+
website默认SSR;静态发布须先移除服务端业务依赖、初始化及API/actions。静态构建与实际路径验证按[hai-build](../hai-build/SKILL.md)。
|
|
26
28
|
|
|
27
29
|
网站挂载到`/yyy/`等目录时,按[网站挂载目录](../hai-build/paths.md)同步资源、链接、认证端点和服务端守卫。SvelteKit在编译时固定base,Vite默认相对资源加hash导航;API基址单独配置。SDK子目录制品使用格式5,健康与增量检查随制品处理,不手工修改旧格式清单来代替重新构建。
|
|
28
30
|
|
|
@@ -68,11 +70,15 @@ YAML 使用 `${HAI_DB_TYPE:sqlite}` 等显式引用,冒号后是未配置时
|
|
|
68
70
|
|
|
69
71
|
`prod` 是文件模式名,对应 `HAI_CORE_ENV=production`;环境枚举为 `development | test | production | staging`。SvelteKit adapter-node 产物使用 `node --env-file=.env --env-file=.env.prod --env-file-if-exists=.env.local build/index.js`。文件路径相对进程工作目录,公共文件随项目提交;容器通过部署平台或 `--env-file` 注入目标环境值。浏览器只接收公开白名单,构建产物和镜像不包含 `.env.local`。
|
|
70
72
|
|
|
73
|
+
Compose `env_file` 的变量在创建容器时固定,改文件后 `restart` 不会更新,应沿用原项目名/文件列表重新创建容器,通常无需重建镜像。请求策略可固定引用只读挂载 YAML,后续改文件并重启服务实例重新读取;运行中不监视文件、不逐请求读盘。完整 `HAI_SERV` / `HAI_KIT` 优先于叶子变量,不叠加覆盖。SDK 交付的 `.env.runtime` 与策略快照不可手改;运维外部文件和 Compose override 必须另行备份、纳入后续发布,SDK 自动回滚不恢复外部文件。
|
|
74
|
+
|
|
71
75
|
Fullstack 的环境文件在工程根;service 脚本通过 `../../.env*` 加载,Web/App/Desktop 的 Vite 自动 dotenv 加载关闭(`envDir: false`),开发和预览由 `core.config.loadEnvFiles` 从工程根读取,构建不读取部署环境文件。API workspace 的环境文件在 `apps/<name>-serv/`。独立应用在各自根目录加载。静态 Web 通过 `runtime-config.js` 获取公开地址,部署环境覆盖无需重建镜像;原生包在复制静态资源前配置该入口。修改编译进客户端的默认值时仍需重新构建;fullstack 的公开应用元数据由 service `app.info` 返回。
|
|
72
76
|
|
|
77
|
+
Node后端的当前部署包默认重读发布.env.runtime,修改后restart容器即可;托管连接优先级不变,布局/Node参数与中间件仍需重新部署。长期修改同步回源环境;见[部署指引](../hai-deploy/SKILL.md#后端运行配置重载)。
|
|
78
|
+
|
|
73
79
|
#### 迁移已有项目
|
|
74
80
|
|
|
75
|
-
先把原来被忽略的 `.env` 私有值迁入 `.env.local`,再提交公共基础和环境文件。本机文件只保留需要覆盖的值,避免整份复制示例后固定开发环境。旧的 `
|
|
81
|
+
先把原来被忽略的 `.env` 私有值迁入 `.env.local`,再提交公共基础和环境文件。本机文件只保留需要覆盖的值,避免整份复制示例后固定开发环境。旧的 `HAI_AI_LLM_PROTOCOL_KEY` / `HAI_AI_LLM_BASE_URL` 改为 `HAI_AI_LLM_APIKEY` / `HAI_AI_LLM_BASEURL`;音频和图像厂商回退变量同样使用 `APIKEY` 后缀。Reach 和 deploy 凭据按当前 YAML 路径命名,以项目 `.env.example` 为准,同步迁移部署平台变量和本机文件。
|
|
76
82
|
|
|
77
83
|
原 `HAI_AI_ANTHROPIC_API_KEY` / `HAI_AI_ANTHROPIC_BASE_URL` 不再使用。默认协议为 `anthropic` 时改用标准 LLM 变量;混合模型池中有独立凭据或端点时,将 `apiKey` / `baseUrl` 配置在对应模型项。厂商回退 `ANTHROPIC_API_KEY` / `ANTHROPIC_BASE_URL` 保留,优先级以 AI 模块说明为准。
|
|
78
84
|
|
|
@@ -90,7 +96,7 @@ Fullstack 的环境文件在工程根;service 脚本通过 `../../.env*` 加
|
|
|
90
96
|
| `HAI_CACHE_TYPE` / `HAI_CACHE_DB` | `memory \| redis`;DB 为整数 0–15;memory 仅单进程使用 |
|
|
91
97
|
| `HAI_STORAGE_TYPE` | `local \| s3`;local 要求 root,s3 要求 bucket、region、accessKeyId、secretAccessKey |
|
|
92
98
|
| `HAI_SERV_SERVER_HOST` / `HAI_SERV_SERVER_PORT` | HTTP 主机和整数端口 1–65535;部署平台 HOST/PORT 可覆盖 |
|
|
93
|
-
| `
|
|
99
|
+
| `HAI_AI_LLM_PROTOCOL` / `HAI_AI_LLM_TEMPERATURE` | `chat \| responses \| anthropic`;temperature 为数字 0–2 |
|
|
94
100
|
| `HAI_AI_LLM_APIKEY` / `HAI_AI_LLM_BASEURL` / `HAI_AI_LLM_MODEL` | 厂商密钥、服务 URL、实际可用模型名;启用时满足厂商要求 |
|
|
95
101
|
| `HAI_ADMIN_DEFAULT_PASSWORD` | 首次创建管理员的密码,满足 IAM 密码策略;CLI 为 fullstack 的 `.env.dev/.env.test/.env.prod` 分别生成独立随机值 |
|
|
96
102
|
| `PUBLIC_API_BASE` | 可公开的 API 地址,不得包含用户名、密码或 token |
|
|
@@ -145,7 +145,9 @@ export const load: PageServerLoad = async ({ locals }) => {
|
|
|
145
145
|
|
|
146
146
|
## 创建 API 端点
|
|
147
147
|
|
|
148
|
-
API workspace/fullstack
|
|
148
|
+
API workspace/fullstack 读取本工程随模板交付的 `hai-api-contract` 与 `hai-serv` Skills,先检查内置领域 contract 和 feature procedures。应用私有接口通过现有 contract → procedure → typed client 扩展,serv route 使用 auth/permission/role,资源归属在服务层检查,不添加 `+server.ts` 或 kit.validate。
|
|
149
|
+
|
|
150
|
+
同源 SvelteKit 工程读取其 `hai-kit` Skill,沿用文件路由与既有 guard。各架构只读取实际提供的技能。
|
|
149
151
|
|
|
150
152
|
### SvelteKit RESTful 端点模板
|
|
151
153
|
|
|
@@ -337,7 +339,7 @@ core.init() → crypto.init() → reldb.init() → cache.init() → iam.init()
|
|
|
337
339
|
|
|
338
340
|
- 保持脚手架 `images/*.Dockerfile`、`.dockerignore` 与 `package.json` 中 `build` / `compile` 命令与 hai.json 的 build/deploy 配置同步。保留 `.gitattributes`,让 `.dockerignore`、Dockerfile 和 POSIX 脚本统一使用 LF,保持跨平台输入一致并确保 Linux 脚本可运行。
|
|
339
341
|
- Podman 多阶段构建保持 `--format docker --jobs=1`;前者保留 `HEALTHCHECK`,后者避免部分 Podman 5.8/Buildah 组合在并行 stage 构建时触发内部 semaphore panic。
|
|
340
|
-
- 先复制 lockfile、workspace 配置与构建器准备的 `images/dependencies/` 安装输入执行 `pnpm fetch --ignore-scripts
|
|
342
|
+
- 先复制 lockfile、workspace 配置与构建器准备的 `images/dependencies/` 安装输入执行 `pnpm fetch --ignore-scripts`,再离线安装、复制源码并构建;fetch、安装和 `pnpm pm deploy` 共用 pnpm store,安装与生产依赖整理共用 SQLite 驱动缓存,使源码变化复用下载与安装层,兼容新增 workspace、本地归档与补丁。
|
|
341
343
|
- 默认容器面向 CPU 运行或远程 AI 服务,Dockerfile 设置 `ONNXRUNTIME_NODE_INSTALL_CUDA=skip`,跳过额外 CUDA/TensorRT 下载;使用宿主机 GPU 时定制镜像和运行参数,不修改本机 npm 或全局 AI/GPU 配置。
|
|
342
344
|
- SvelteKit 服务使用 Node adapter;纯 Vite 前端使用带 SPA fallback 的静态镜像;fullstack 的 Service 与 Web 分别交付,Service 直接监听且不增加转发进程。
|
|
343
345
|
- Web 的 `PUBLIC_*` 部署配置在容器启动时生成静态运行时配置,不作为 build arg 烘焙,确保同一镜像可跨环境部署。
|
|
@@ -17,6 +17,8 @@ description: "审查 hai 应用的框架复用、安全边界、返回契约、
|
|
|
17
17
|
|
|
18
18
|
## 审查路径
|
|
19
19
|
|
|
20
|
+
涉及框架结构、配置、核心流程或模块边界的修复,先按 [变更影响与方案确认](../hai-change-plan/SKILL.md) 提案并等待用户决定;普通业务私有实现沿当前授权处理。
|
|
21
|
+
|
|
20
22
|
发现表达、状态区分与同步检查遵循[沟通与同步维护](../hai-app-create/collaboration.md)。审查范围内核对使用文档、配置示例、截图、测试、模板和调用方是否需要更新。
|
|
21
23
|
|
|
22
24
|
对代码差异读取 [差异审查](differential.md):固定 base/head,先核对需求符合性,再按真实风险检查历史约束、直接与关键间接调用方。完整应用审查使用同样的需求追踪与发现复核,说明实际覆盖范围。发现、修复和验收沿 [工作交接契约](../hai-spec-implement/handoff.md) 记录。
|
|
@@ -17,6 +17,8 @@ description: "为 hai 应用编写或修复 Vitest/Playwright 测试,组织分
|
|
|
17
17
|
|
|
18
18
|
## 使用路径
|
|
19
19
|
|
|
20
|
+
测试或排错发现需要改变框架结构、配置、核心流程、模块边界时,先按 [变更影响与方案确认](../hai-change-plan/SKILL.md) 说明原因、影响与验证办法,待用户决定后改实现。不能通过修改断言把未确认的契约变化变成既定行为。
|
|
21
|
+
|
|
20
22
|
测试增删、问题表达及同步检查遵循[沟通与同步维护](../hai-app-create/collaboration.md)。合并或删除用例前核对独有风险覆盖,交付说明新增、删除、调整的原因;界面与文档示例使用当前运行证据。
|
|
21
23
|
|
|
22
24
|
先复用 [工作交接契约](../hai-spec-implement/handoff.md) 中的验收编号和本轮范围。结果关联提交与未提交差异、命令/操作、依赖与环境、退出码和证据位置;源码/配置/依赖或环境变化后按影响使旧结果失效并复测。测试通过只是相应验收的证据,整体验收仍逐项核对需求。
|
|
@@ -27,14 +27,14 @@ description: "构建或排查 hai 应用的源码、静态网站、容器镜像
|
|
|
27
27
|
|
|
28
28
|
## 构建与部署
|
|
29
29
|
|
|
30
|
-
- website
|
|
30
|
+
- 新建website包含完整模块与示例,默认Node SSR;静态发布须先移除服务端业务依赖、初始化及API/actions,保留Core/Kit/UI。compile静态预渲染使用`HAI_BUILD_STATIC=1 PUBLIC_BASE_PATH=/docs-site`,docs-site替换为实际仓库名,各路径段仅ASCII字母、数字、_、.、-,无末尾/;省略/0保持SSR,根站路径留空。HAI_BUILD_STATIC仅用于compile,PUBLIC_BASE_PATH也支持image网站构建。静态拒绝服务端业务模块、自定义API/actions与未预渲染页面,不放宽生产守卫、不用SPA fallback;默认健康端点不发布。构建不读根.env,static为公开目录,拒绝.env/.env.*与符号链接。上传build使用include-hidden-files:true保留.nojekyll,验首页/深链/刷新/资产与敏感哨兵。
|
|
31
31
|
|
|
32
32
|
- 创建默认包含开发期部署工具,可用 --no-deploy 关闭。每个镜像使用 images/ 中独立 Dockerfile,Web 配置位于 images/web/,不使用镜像阶段 target 配置。
|
|
33
|
-
- 构建器生成 images/dependencies/ 安装输入;fetch、安装和生产依赖整理共用 pnpm store,安装与生产依赖整理共用 SQLite
|
|
33
|
+
- 构建器生成 images/dependencies/ 安装输入;fetch、安装和生产依赖整理共用 pnpm store,安装与生产依赖整理共用 SQLite 驱动缓存,并复用依赖层;依赖安装在源码COPY前,前后端仅复制各自需要的源码。运行镜像去掉应用自身声明、source map和README。file: 归档、补丁、workspace 元数据必须进入下载上下文;原生依赖缓存按系统/架构/ABI 区分。基础镜像、中间件及工具指定版本,禁止 latest。
|
|
34
34
|
- 默认容器面向 CPU 运行或远程 AI 服务,Dockerfile 设置 `ONNXRUNTIME_NODE_INSTALL_CUDA=skip`,跳过额外 CUDA/TensorRT 下载;使用宿主机 GPU 时定制镜像和运行参数,不修改本机 npm 或全局 AI/GPU 配置。
|
|
35
35
|
- pnpm run deploy --build 显式串联构建、打包和发布;--bundle-only 只交付完整离线包与跨平台脚本;--services 以服务器成功状态为基线只更新选中服务。完整包自动包含自建中间件镜像,服务器禁止联网拉取。
|
|
36
|
-
- `pnpm build` 默认仅编译源码(调用 compile);`pnpm build --target
|
|
37
|
-
- compile 交付源码编译结果,
|
|
36
|
+
- `pnpm build` 默认仅编译源码(调用 compile);`pnpm build --target image` 根据 hai.json.build.images 的 dockerfile 构建并导出 serv/web 镜像(可单独或组合),可用 --images web 只构建前端,默认最多两项并行,--concurrency 1可串行,auto 优先可达 Podman、其次 Docker,可用 --runtime 显式指定。
|
|
37
|
+
- compile 交付源码编译结果,image 交付镜像归档,desktop 交付 Tauri 系统安装包,app 交付 Capacitor 原生制品;每次选择一个 target。hai.json 的 build.images[].dockerfile 指向独立镜像文件,build.desktop/build.app 声明原生工程目录,deploy 保存整个项目的部署配置;参数和平台前置以当前 CLI 类型与工程 scripts 为准。cap:sync 只同步工程,不能作为已打包或已安装的证据。
|
|
38
38
|
- Podman 的客户端代理通过预定义构建参数传递,覆盖 Windows/macOS 远程引擎的服务端默认值;代理地址必须能从构建容器访问,--no-http-proxy 禁止此传递。不要把代理写成 Dockerfile ENV 或固化进交付镜像。
|
|
39
39
|
- --network 默认沿用引擎网络;只有实际构建网络无法访问依赖/代理时才显式选择网络,pasta 仅适用于 rootless Podman。build 与 run 的主机名解析可能不同,须验证构建网络中的可达性,不默认改成 host 网络。
|
|
40
40
|
- 从运行build的应用根package.json.version读取版本,不能使用CLI/框架版本或服务子包版本代替。根目录清单version=4,非根目录version=5并记录webBasePath;appVersion为应用版本。servContainerPort/webContainerPort仅记录images配置显式填写的端口,部分构建也保留未选镜像端口,未填写时沿用部署默认值。镜像tar名含版本、buildId区分同版本构建,Tauri也接收根版本。不要手改清单或保留无版本的交付归档。
|
|
@@ -44,7 +44,7 @@ description: "构建或排查 hai 应用的源码、静态网站、容器镜像
|
|
|
44
44
|
- 静态客户端通过 runtime-config.js 或原生宿主初始化脚本获取公开地址与元数据;仅投影公开白名单,禁止将完整 process.env、服务配置或密钥序列化到浏览器。预览与容器启动均须验证真实登录,不能依赖构建期 API 地址让 E2E 通过。
|
|
45
45
|
- Fullstack Capacitor App 在 `public/runtime-config.js` 提供公开 API 地址,再编译并同步原生资源;Tauri 从启动进程的 PUBLIC_API_BASE 注入。不能把开发代理的 .env 配置当作已安装原生包的运行配置。
|
|
46
46
|
- `pnpm build --target desktop --platform windows|linux|macos --arch x64|arm64` 调用对应工程的 Tauri build。要求在目标系统准备 Rust target、SDK 和打包工具,不假定跨系统编译。原生安装包必须按目标系统实测。
|
|
47
|
-
- deploy 默认消费已有产物,--build 显式先构建,详见 [hai-deploy](../hai-deploy/SKILL.md)。网络不通时 --bundle-only
|
|
47
|
+
- deploy 默认消费已有产物,--build 显式先构建,详见 [hai-deploy](../hai-deploy/SKILL.md)。网络不通时 --bundle-only 默认生成 tar.gz(显式--output release.tar保留未压缩格式),按说明手工搬运;packaged 不代表部署已运行。
|
|
48
48
|
- 测试临时工程、镜像、容器、辅助进程和数据必须在 finally/teardown 自动清理,失败/取消也清理;日志、截图和报告保留到分析和交付结束再清理,不得提交测试产物或删除用户既有资源。
|
|
49
49
|
- 浏览器测试的数据放入本轮独立临时目录;Windows 等子进程与服务退出后再删除数据库和上传文件,不依赖下一轮测试补清理。
|
|
50
50
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
## SDK容器交付
|
|
22
22
|
|
|
23
|
-
- `PUBLIC_BASE_PATH=/yyy`用于compile或
|
|
23
|
+
- `PUBLIC_BASE_PATH=/yyy`用于compile或image网站构建;HAI_BUILD_STATIC仍只用于website的compile静态预渲染。
|
|
24
24
|
- 根目录制品沿用格式4,非根目录制品使用格式5并记录webBasePath。使用支持格式5的CLI/Deploy;旧工具拒绝新格式,不能手改编号绕过。
|
|
25
25
|
- SDK生成匹配的Nginx目录、运行配置入口、健康检查和访问URL。外部网关转发到此入口时保留目录,避免再次剥离。
|
|
26
26
|
- 每次完整或部分构建保持同一PUBLIC_BASE_PATH,即使只构建serv。目录变化须全量部署;遗漏或改变目录的增量包会在替换前拒绝。失败恢复使用旧发布的健康路径;容器恢复不撤销业务数据。
|
|
@@ -46,7 +46,7 @@ pnpm 专属配置放在 `pnpm-workspace.yaml`,`.npmrc` 仅用于注册表与
|
|
|
46
46
|
|
|
47
47
|
### SvelteKit Adapter 模式
|
|
48
48
|
|
|
49
|
-
CLI website模板默认Node SSR
|
|
49
|
+
CLI website模板默认Node SSR。新建工程包含完整模块和示例,静态发布须先移除服务端业务依赖、初始化和API/actions;在compile时使用`HAI_BUILD_STATIC=1`与可选`PUBLIC_BASE_PATH`切换完整静态预渲染,边界见本skill的静态网站说明;该模板没有使用下方VITE_ADAPTER工厂。静态产物用preview本机检查,上传build到Pages/CDN;生成的start/Docker配置属于普通SSR模式,不能用于运行静态HTML。切回SSR只需清除静态开关并重建,PUBLIC_BASE_PATH仍可按实际网站目录用于SSR或Docker;SvelteKit/Vite差异、制品格式和健康检查见[网站挂载目录](paths.md)。
|
|
50
50
|
|
|
51
51
|
仅在项目实际使用 SvelteKit 和 `@h-ai/kit/adapter` 时使用;Vite SPA 不配置 SvelteKit adapter,fullstack 各前端按自身 scripts 构建。
|
|
52
52
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hai-change-plan
|
|
3
|
+
description: "框架增删改涉及数据结构、配置、核心流程或模块边界时,先说明方案与影响,等待用户决定后实施。"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 变更影响与方案确认
|
|
7
|
+
|
|
8
|
+
## 能力契约
|
|
9
|
+
|
|
10
|
+
| 项目 | 契约 |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| 能力 | 将框架变更整理成维护者看得懂、能作决定的方案,并跟踪同步与验证 |
|
|
13
|
+
| 适用场景 | 新增、修改、删除框架功能,或修复中发现需要改变结构、配置、核心流程、模块边界 |
|
|
14
|
+
| 输入 | 用户目标、当前实现与调用方、现有配置和文档、已确认方案及授权 |
|
|
15
|
+
| 输出 | 简明方案、具体影响、用户决定、同步清单和验证结果 |
|
|
16
|
+
| 限制 | 未确认的重要变更先停在方案;普通业务私有实现不因此扩大成框架改造,已确认且未扩大的方案不重复确认 |
|
|
17
|
+
|
|
18
|
+
## 何时先提方案
|
|
19
|
+
|
|
20
|
+
发现以下任一实际变化,在修改对应实现、配置或模板之前说明方案,**等待用户明确同意推进**:
|
|
21
|
+
|
|
22
|
+
- `type`、`interface`、Schema 等结构的字段、形状或语义改变,包括新增、删除及会改变执行方式的内部结构。
|
|
23
|
+
- 模块配置或环境变量的名称、位置、默认值、可选/必填、校验、优先级、安全含义改变。
|
|
24
|
+
- 初始化/关闭、请求处理、认证授权、数据读写、并发重试、部署/恢复等核心流程改变。
|
|
25
|
+
- 模块职责、依赖关系、公开入口、调用方式或跨模块返回值/错误契约改变。
|
|
26
|
+
|
|
27
|
+
先查源码、调用方和运行证据,给出足以决定的具体方案;不要只说“重构一下”“优化架构”。只读分析、现状复现及不改变上述边界的准备工作可以继续,不能先落地再要求追认。已有“修复”“按最佳方案”等一般授权,不代替尚未说明的重要方案;用户已明确指定并同意的具体方案无需重问。执行中出现新的重要影响,只确认新增部分。
|
|
28
|
+
|
|
29
|
+
纯格式、注释纠错、翻译修正,或不改变上述结构与边界的内部修复,按已有授权继续;先简述实际影响即可。拿不准时说明具体不确定项,不为假设风险引入审批。
|
|
30
|
+
|
|
31
|
+
## 怎样说明
|
|
32
|
+
|
|
33
|
+
先用一两句话说明结论,再按实际复杂度交代:
|
|
34
|
+
|
|
35
|
+
1. **为什么改、改成什么**:当前场景有什么问题,使用前后有什么变化。
|
|
36
|
+
2. **影响谁**:涉及哪些模块、应用、CLI 模板和调用方;旧配置、数据、部署是否需要调整。
|
|
37
|
+
3. **如何同步与验证**:需要更新哪些文档、注释、示例与测试;如何确认生效,失败如何恢复。
|
|
38
|
+
4. **请用户决定**:给出推荐方案;确有取舍时列少量可行选项,并说明代价。
|
|
39
|
+
|
|
40
|
+
技术名词和必要路径用于支持判断,避免堆文件清单与过程日志。简单变化一小段即可,复杂变化再分层。区分已确认事实、待验证假设、拟实施及已完成;明确哪些部分尚未获准,不把等待写成完成。
|
|
41
|
+
|
|
42
|
+
## 确认后成套维护
|
|
43
|
+
|
|
44
|
+
在当前任务记录中保存决定和影响范围,不额外创建重复台账。按[沟通与同步维护](../hai-app-create/collaboration.md)逐项核对相关 README(已有中英日版同步)、环境变量与模块配置项、`docs/` 使用说明、GitHub Pages 的内容源/导航/图片、注释与类型说明、调用方、测试和 CLI 模板。每项注明已同步,或不适用及原因。
|
|
45
|
+
|
|
46
|
+
GitHub Pages 由文档源构建时修改源文件,不手改生成产物;配置示例按真实默认值与覆盖顺序核对,界面截图来自当前实际操作。按受影响范围验证,报告实际执行、复用与未验证边界。若实现与获准方案不同,先说明差异并重新确认新增影响。
|
|
@@ -41,14 +41,26 @@ description: "构建并发布或交付已有镜像:完整离线包、按服务
|
|
|
41
41
|
|
|
42
42
|
成功后手工回退使用**当前 CLI**、旧应用 build 制品和匹配配置,省略 `--build`、`--services` 生成新全量 ID;离线也须重新打包,不能运行旧 bundle 或旧工具绕过账本。旧制品通常只保留 serv/web 镜像,中间件仍按当前 CLI 固定版本规划,不承诺精确回退全部中间件版本、DDL 或业务数据。确认主版本、Schema、拓扑和数据兼容并准备备份,再发布和验证。
|
|
43
43
|
|
|
44
|
+
## 可选 HTTPS
|
|
45
|
+
|
|
46
|
+
所有容器模板共用deploy.provider.expose.https,省略时HTTP。files指定domain、certificateFile、privateKeyFile(相对工程根),校验域名/期限/密钥并复制到私有包。letsencrypt指定domain、email、acceptTerms:true,HTTP hostPort必须80,公网DNS、80入站及CA出站须可达。固定版本官方Certbot申请并每12小时检查续期,Nginx自动重载。仅单域名HTTP-01,无DNS/通配符。HTTPS默认443、redirectHttp默认true;--yes复用配置。启停或改模式/域名/端口/本地证书需全量。状态在服务器https/acme及按域名隔离的https/certificates目录,需备份;续期失败保留旧证书并须及时处理,隔离目标用已有证书。打包/plan不申请证书。
|
|
47
|
+
|
|
48
|
+
默认.tar.gz,显式--output release.tar为未压缩,README仅外层。镜像从解包目录导入,release只留配置/恢复状态;成功后清理本次incoming,失败保留诊断。中间件归档按镜像内容ID缓存且复用前验摘要。
|
|
49
|
+
|
|
50
|
+
## 后端运行配置重载
|
|
51
|
+
|
|
52
|
+
Node 后端(Serv / SvelteKit SSR)默认在每次启动时重读发布目录的 `.env.runtime`,修改后 `docker restart <容器名>` 或 `podman restart <容器名>` 即可,无需重建镜像或额外 override。旧部署先用新版 CLI 发布一次。删除的字段不会从旧 Compose 注入中复活;服务器托管连接的 `middleware.env` 保持原有更高优先级,私有代理标记和 Node 启动参数仍由部署装配管理。静态 Web、中间件、端口/挂载和 Nginx 限额不在该重载范围。手工修改需备份;下一次后端发布会从工程环境重新生成,需要长期保留的配置同步回源环境。
|
|
53
|
+
|
|
54
|
+
运行文件在后端实际挂载的releases/<后端发布ID>/.env.runtime;仅更新Web/中间件后current可能指向新记录,不能据此猜测后端文件,按容器Mounts中/run/hai/.env.runtime的Source确认。只读文件挂载,上级目录0700,容器非root可读,宿主所有者可修改。dotenv字面解析不执行shell;双引号支持JSON转义。单文件≤1MiB,缺失/不可读/超限在应用导入前失败。父HAI_SERV/HAI_KIT仍优先于叶字段。重启后验健康与配置影响的业务,失败恢复文件再重启。
|
|
55
|
+
|
|
44
56
|
## CLI
|
|
45
57
|
|
|
46
58
|
```sh
|
|
47
59
|
pnpm run deploy --env prod --build
|
|
48
|
-
pnpm build --target
|
|
60
|
+
pnpm build --target image
|
|
49
61
|
pnpm run deploy --env prod --artifact-dir .hai/build/docker/<buildId>
|
|
50
62
|
pnpm run deploy --env prod --bundle-only
|
|
51
|
-
pnpm build --target
|
|
63
|
+
pnpm build --target image --images web
|
|
52
64
|
pnpm run deploy --env prod --services web
|
|
53
65
|
```
|
|
54
66
|
|
|
@@ -60,7 +72,7 @@ pnpm run deploy --env prod --services web
|
|
|
60
72
|
|
|
61
73
|
## 请求访问策略
|
|
62
74
|
|
|
63
|
-
|
|
75
|
+
Serv/SvelteKit 后端的策略快照、只读挂载、环境覆盖、代理信任和增量保留见[请求访问配置手册](https://hai-series.github.io/hai-framework/docs/configuration/request-access/),也可读取工程交付的 `hai-core/request-access.md`;纯客户端由实际后端管理这些设置。默认快照模式通过新包更新,恢复使用原成功发布文件,不覆盖旧发布目录。需要运维文件重启加载时,先按变更方案确认流程说明启动方式和优先级变化;独立外部文件需另行备份,SDK 回滚不恢复它。
|
|
64
76
|
|
|
65
77
|
## 自建对象存储直连
|
|
66
78
|
|
|
@@ -84,7 +96,7 @@ Linux 预备 Docker/Podman、支持 --pull never 的 Compose(Docker Compose v2
|
|
|
84
96
|
|
|
85
97
|
按 [分轮验证与集中修复](../hai-app-tests/validation.md) 收集适用的 typecheck、lint、build、test、scaffold gates 和 test:deploy-gates,汇总后集中修复、再验证。实际验证无 registry 网络的首次部署、登录刷新、同版本重发、只更新 Web/API、停止/down 后增量恢复、缺密码隐藏输入、上传进度、损坏归档、缺基线、健康失败与恢复。Windows/Linux/macOS 上传入口分别执行验收;原生安装包在对应 OS 验证。测试临时工程、容器、镜像、数据和进程在 finally/teardown 清理,只清理测试拥有的资源;日志、截图和报告保留到分析和交付结束再清理。
|
|
86
98
|
|
|
87
|
-
部署前可 hai deploy --env prod --plan
|
|
99
|
+
部署前可 hai deploy --env prod --plan,只读校验真实制品和执行范围,显示工程根root、服务源码/配置目录serviceDir、项目/环境、版本/构建、配置文件及键名、保留范围、基线要求和恢复目录;不构建、不创建凭据、不连接或改变目标。远端 current 未读取标 not-inspected;不得把计划或本地打包当真实基线成功。数据库与业务数据不随 Compose 恢复回退。
|
|
88
100
|
|
|
89
101
|
需要核对目标真实基线时加 --inspect-remote(必须配合 --plan),仅 SSH 读取 current/成功发布目录,按 verified/missing/unavailable 与真实发布 ID 报告,不写目标;不能把未检查当作成功。
|
|
90
102
|
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
## 环境先行
|
|
6
6
|
|
|
7
|
-
自建 S3 还要区分内部 endpoint 和浏览器 publicEndpoint;后者是 HTTP(S) origin
|
|
7
|
+
自建 S3 还要区分内部 endpoint 和浏览器 publicEndpoint;后者是 HTTP(S) origin 或带代理目录的入口,无默认且不含桶名。全栈 Web Nginx 或 SSR/API gateway 将桶路径直接转至 storage,存储端口与控制台不直接发布。外层入口保持 Host/URI/query,仅生成网关移除代理目录,精确 CORS 在实际 S3 设置。增加网关或改变自建访问配置需全量基线,应用增量仅复用原配置;外部 S3 不生成本地路由,local 不公开目录。操作与验证见 [Storage skill](../hai-storage/SKILL.md)。
|
|
8
8
|
|
|
9
|
-
默认部署名取工程根(最近的 `hai.json` 或锁文件所在目录)的 `package.json.name`,缺失时报错,再附加显式环境后缀。例如 fullstack 工程 `hai-delivery` 扫描 `packages/hai-delivery-serv`,`--env test` 生成 `/opt/hai/apps/hai-delivery-test` 和 `bundle-hai-delivery-test-<部署ID>-<版本>.tar`。远端目录、交付包、Compose 项目、API/Web/中间件容器、数据卷、服务器凭据状态及增量基线统一使用该名称;不会按字符串删除真实项目名中的 `-serv`。
|
|
9
|
+
默认部署名取工程根(最近的 `hai.json` 或锁文件所在目录)的 `package.json.name`,缺失时报错,再附加显式环境后缀。例如 fullstack 工程 `hai-delivery` 扫描 `packages/hai-delivery-serv`,`--env test` 生成 `/opt/hai/apps/hai-delivery-test` 和 `bundle-hai-delivery-test-<部署ID>-<版本>.tar.gz`。远端目录、交付包、Compose 项目、API/Web/中间件容器、数据卷、服务器凭据状态及增量基线统一使用该名称;不会按字符串删除真实项目名中的 `-serv`。
|
|
10
10
|
|
|
11
11
|
资源身份和制品格式沿用[构建技能](../hai-build/SKILL.md)及[网站挂载目录](../hai-build/paths.md):根目录格式4,非根目录格式5,两者都有primaryService/hasWeb;webBasePath仅格式5。旧工程同步镜像角色、Dockerfile、-serv包名与引用后重建,不手改清单。旧部署先核对项目名、卷和受管凭据,再建立完整基线;工具不跨项目迁移数据,改target目录不能完成迁移。
|
|
12
12
|
|
|
@@ -35,6 +35,8 @@ Podman 部署会主动执行容器已有的 healthcheck 并重新核对状态,
|
|
|
35
35
|
|
|
36
36
|
## 识别与逐项选择
|
|
37
37
|
|
|
38
|
+
默认和自定义模式均从同后端的有效配置继续,不能按表单重建对象而丢掉未展示项。自建/云开通保留连接池、操作日志、公开端点/前缀、Redis 重试、向量检索、SMTP 发件人及 LDAP 属性映射,仅由实际服务定稿地址与认证;旧 URL、TLS/集群选择器不能覆盖新服务。切换后端清除不兼容字段。若旧向导已写出缺字段父 JSON,先从原配置/备份恢复最高优先级 `HAI_STORAGE` 的 `publicEndpoint` 等字段,再用修复版重建部署包;父 JSON 仍优先于 YAML 和叶变量,不自动猜测丢失值。
|
|
39
|
+
|
|
38
40
|
框架 `HAI_*` 连接配置与镜像原生变量分开:PostgreSQL/MySQL/RustFS/MinIO/LDAP 的原生键必须按镜像契约命名,只写私有 `middleware-runtime.env`、只让中间件加载。不得改成镜像不识别的 HAI 前缀,也不得写回工程 `.env.<mode>` / 私有覆盖或注入应用 `.env.runtime`。应用的增量覆盖文件 `middleware.env` 只含 `HAI_*`。旧工程原生字段不自动删除,新应用环境忽略框架曾生成的已知原生键;不要批量过滤其他业务变量。
|
|
39
41
|
|
|
40
42
|
数据库连接保存前复用所选后端的公开配置 Schema;MySQL `ssl` 仅 `false` 或严格对象,`{}` 默认验证证书链和 DNS 身份,`ca/cert/key` 为 PEM 内容且 `cert/key` 必须成对;私钥仅进入私有环境。PostgreSQL 保留其布尔值/字符串模式/对象契约。CLI 内联 `@h-ai/reldb/schemas` 与 Zod,无需为配置校验给目标应用额外安装数据库包或驱动;部署本身仍需已安装的 `@h-ai/deploy`,实际运行应用仍需其数据库依赖。
|
|
@@ -72,7 +72,7 @@ Web 不导入原生插件。原生入口分别为 @h-ai/feedback/tauri 与 /capa
|
|
|
72
72
|
|
|
73
73
|
- 已安装包的 README 和公开 /client、/bundle、api-contract/feedback、serv/features/feedback 类型。
|
|
74
74
|
- 数据库、对象存储和通知分别读取 [hai-reldb](../hai-reldb/SKILL.md)、[hai-storage](../hai-storage/SKILL.md)、[hai-reach](../hai-reach/SKILL.md)。
|
|
75
|
-
-
|
|
75
|
+
- 带前端的工程按其 `hai-ui` Skill 复用界面组件;纯 API 只接入服务端能力。验证遵循[分轮流程](../hai-app-tests/validation.md)。
|
|
76
76
|
|
|
77
77
|
反馈交互:当前截图优先;FeedbackModal.oncapture 连接 captureScreenshot(id?),选择时隐藏弹窗,允许换页后补图/替换并保留输入。FeedbackForm.evidence 展开实际脱敏内容,不能把全部事件数量称作日志。onfileschange 接入后支持用户主动无声短录屏(60秒/5 MiB),视频不自动遮挡,必须支持预览/删除;停止共享、取消、超时和销毁释放流。WebM/MP4 的私有读授权、容器字节/checksum 校验、上传和离线查看须一并验证。
|
|
78
78
|
|
|
@@ -17,6 +17,8 @@ description: "审查 PR、提交或分支的实际差异、调用影响、需求
|
|
|
17
17
|
|
|
18
18
|
## 审查路径
|
|
19
19
|
|
|
20
|
+
框架重要变更按 [变更影响与方案确认](../hai-change-plan/SKILL.md) 核对方案、用户决定与实际差异。缺少确认时说明具体缺口;新增修复影响先提方案,不把已有一般修复授权当成所有结构/流程改动的确认。
|
|
21
|
+
|
|
20
22
|
按[沟通与同步维护](../hai-app-create/collaboration.md)核对使用文档、配置示例、截图、测试、模板及调用方,结论区分已确认问题与待验证事项。
|
|
21
23
|
|
|
22
24
|
1. 读取仓库入口和 PR/任务目标,确认比较对象。按 [差异审查](../hai-app-review/differential.md) 固定 base/head、列全文件与重命名,说明 staged/unstaged 和截断限制。
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
- 使用 Node listener,或在满足包 Node 依赖的宿主/测试中注入标准 fetch handler
|
|
19
19
|
- 自定义 `ServContext`(注入 session、tenant 等请求级数据)
|
|
20
20
|
- 生成 OpenAPI 3.1 文档供外部工具消费
|
|
21
|
-
- 通过 `config/_serv.yml` 管理 API 前缀、OpenAPI、docs、health
|
|
21
|
+
- 通过 `config/_serv.yml` 管理 API 前缀、OpenAPI、docs、health 等 HTTP 挂载配置
|
|
22
22
|
- 通过 `serv.createRuntimeSecurityPolicy(...)` 对生产 CORS Origin、原生 WebView Origin、Secure Cookie 与 API 文档暴露执行 fail-closed 策略
|
|
23
23
|
- 启用传输加密:`serv.createApp({ transport: { crypto, serverKeyRing, keyStore } })`
|
|
24
24
|
- 高级场景通过 `createApp({ middlewares })` 自定义 HTTP middleware,通过 `createContext` 注入请求级业务字段
|
|
@@ -276,7 +276,6 @@ http:
|
|
|
276
276
|
health:
|
|
277
277
|
path: /health
|
|
278
278
|
readyPath: /ready
|
|
279
|
-
rpc: false
|
|
280
279
|
|
|
281
280
|
transport:
|
|
282
281
|
keyExchangePath: /_hai/key-exchange
|
|
@@ -483,7 +482,7 @@ const app = serv.createApp({
|
|
|
483
482
|
})
|
|
484
483
|
```
|
|
485
484
|
|
|
486
|
-
执行顺序为:`securityHeaders` → 内置 CORS 响应包装/握手和预检策略 → `transport`(若启用)/请求策略 → 普通 `middlewares` → health/refresh-cookie/OpenAPI/
|
|
485
|
+
执行顺序为:`securityHeaders` → 内置 CORS 响应包装/握手和预检策略 → `transport`(若启用)/请求策略 → 普通 `middlewares` → health/refresh-cookie/OpenAPI/docs/oRPC routes。
|
|
487
486
|
|
|
488
487
|
- 普通 `middlewares` 在解密和策略之后执行,提前响应仍受访问策略和响应加密约束。二进制端点显式加入 transport.excludePaths;内置 CORS 预检和密钥交换也执行策略。
|
|
489
488
|
- 公开只读文件优先使用 `serv.storageAssets(...)`;应用仍须显式提供 key/MIME 白名单、缓存与跨域策略,框架不内置头像等业务概念。
|
|
@@ -549,7 +548,7 @@ HTTP 审计、限流、CORS、租户头校验等跨 route 能力继续放在
|
|
|
549
548
|
| oRPC contract 输入 schema 校验失败(handler 之前) | 400 | 本地化失败体,`error.httpStatus=400` 与字段错误 |
|
|
550
549
|
| handler 内 `serv.validateInputOrFail(...)` 失败 | 200 | 失败 HaiResult,`error.httpStatus=400` 与字段错误 |
|
|
551
550
|
|
|
552
|
-
HTTP middleware、自定义 Response、refresh-cookie、OpenAPI
|
|
551
|
+
HTTP middleware、自定义 Response、refresh-cookie、OpenAPI 入口权限和 transport 协议错误分别按自身响应契约处理,可返回真实 HTTP 4xx/5xx。`@h-ai/api-client` 在真实 HTTP 401 或 HTTP 200 的有效失败 HaiResult(`success=false`、字符串 `error.code/message`、`error.httpStatus=401`)后自动刷新,成功后只重试一次;内置登录、注册和配置的刷新路径除外,403/500 不刷新。启用 transport 时刷新和重试复用加密链路,不能手写明文刷新请求。
|
|
553
552
|
|
|
554
553
|
SvelteKit 的 `kit.response.fromError` 根据 `error.httpStatus` 生成 HTTP Response;`kit.response.fromResult` 使用显式错误码映射,未命中默认 400。这些响应转换规则不能套用到 serv 普通 procedure。
|
|
555
554
|
|
|
@@ -584,7 +583,7 @@ const procedures = serv
|
|
|
584
583
|
|
|
585
584
|
### `serv.parseRequestContext` — 默认 Context 解析器
|
|
586
585
|
|
|
587
|
-
默认忽略转发头,缺少运行时对端时 IP 为 undefined。XFF 从右向左停在首个不可信地址,忽略左侧;可信链无效/过长时保留 IP 未知,不能回退为代理身份。Fetch 使用 `app.fetch(request, { remoteAddress: platformPeerAddress })`,对端必须来自可信平台 API。自定义 context 传递完整 input,保留已解析的 ip
|
|
586
|
+
默认忽略转发头,缺少运行时对端时 IP 为 undefined。XFF 从右向左停在首个不可信地址,忽略左侧;可信链无效/过长时保留 IP 未知,不能回退为代理身份。Fetch 使用 `app.fetch(request, { remoteAddress: platformPeerAddress })`,对端必须来自可信平台 API。自定义 context 传递完整 input,保留已解析的 ip。
|
|
588
587
|
|
|
589
588
|
从 HTTP 请求头自动解析:
|
|
590
589
|
|
|
@@ -615,8 +614,7 @@ const spec = await serv.generateSpec(contract, {
|
|
|
615
614
|
| `apiPrefix` | `'/api/v1'` | oRPC OpenAPI handler 挂载前缀 |
|
|
616
615
|
| `health` | `{ path: '/health', readyPath: '/ready' }` | 健康与就绪检查端点 |
|
|
617
616
|
| `openapi` | `false` | OpenAPI JSON endpoint,显式开启 |
|
|
618
|
-
| `docs` | `false` | Scalar
|
|
619
|
-
| `rpc` | `false` | 内部 RPC endpoint,显式开启;`loopback` / `private-network` 基于真实连接 IP,网关场景用 `gateway-only` |
|
|
617
|
+
| `docs` | `false` | Scalar 文档页,显式开启;在文档目录下挂载 `_hai/scalar.js`,页面使用相对脚本和 spec 地址;认证仍在后端执行 |
|
|
620
618
|
| `transport` | `undefined` | 顶层配置;启用后默认挂载 `{apiPrefix}/_hai/key-exchange` |
|
|
621
619
|
|
|
622
620
|
```ts
|
|
@@ -627,7 +625,6 @@ const http: ServHttpConfigInput = {
|
|
|
627
625
|
openapi: { path: '/openapi.json' },
|
|
628
626
|
docs: { path: '/docs' },
|
|
629
627
|
health: { path: '/health', readyPath: '/ready' },
|
|
630
|
-
rpc: false,
|
|
631
628
|
}
|
|
632
629
|
```
|
|
633
630
|
|
|
@@ -17,6 +17,8 @@ description: "从需求或设计文档规划、执行、返修 hai 应用,或
|
|
|
17
17
|
|
|
18
18
|
## 使用路径
|
|
19
19
|
|
|
20
|
+
涉及框架结构、配置、核心流程或模块边界的计划与返修,先按 [变更影响与方案确认](../hai-change-plan/SKILL.md) 获取具体决定,再实施对应部分。已有确认且范围未扩大时继续;文档中的宽泛目标不等于具体架构方案已获确认。
|
|
21
|
+
|
|
20
22
|
先按 [工作交接契约](handoff.md) 选择本次路径,复用既有需求和决策,传递同一组验收与证据。skills 明显变动后的行为回放见 [evaluation.md](evaluation.md),结构门禁与实际决策分别验证。
|
|
21
23
|
|
|
22
24
|
先区分本次请求是 **规划 / 执行 / 返修 / 文档变更实施**。仅要求分析或列清单时停在规划;要求按文档生成或“已修改文档,请更新实现”时,在已授权范围内完成规划并依次实施,无需每个任务重复确认。指定任务只执行该任务,依赖未完成时说明具体阻塞,不自行扩展执行范围。普通小改动仍使用 [hai-app-create](../hai-app-create/SKILL.md)。
|
|
@@ -18,12 +18,12 @@ description: "实现本地/S3 文件与目录操作、流式读写、checksum
|
|
|
18
18
|
## 使用路径
|
|
19
19
|
|
|
20
20
|
1. Node 端配置 Local/S3,校验并检查 init;MinIO/RustFS 使用 s3 类型。S3 `createBucket` 默认 false,需自动建桶时设 true(YAML 用 `${HAI_STORAGE_CREATEBUCKET:false}`);初始化只在 HeadBucket 明确 404 时创建,权限/网络/建桶失败会阻止就绪。默认自建 S3 部署通过环境启用此项。
|
|
21
|
-
2. 从 file/dir/presign 选择操作,检查 HaiResult。流与 checksum 按真实签名处理,checksum 在 Node 无需 init。S3 内部 endpoint 与浏览器 publicEndpoint 分开:publicEndpoint 无默认,缺省仍用 endpoint
|
|
21
|
+
2. 从 file/dir/presign 选择操作,检查 HaiResult。流与 checksum 按真实签名处理,checksum 在 Node 无需 init。S3 内部 endpoint 与浏览器 publicEndpoint 分开:publicEndpoint 无默认,缺省仍用 endpoint;可带 /delivery/files 等安全代理目录,不含桶、凭据或查询。含目录时外部签名用桶路径,返回 URL 已加前缀,代理去前缀后须保留原始 S3 URI/Host/query;调用方不能自行改签名地址。publicUrl 仅拼接公开资源,GET 签名不能用于 HEAD;跨源 CORS 在实际 S3 配置。
|
|
22
22
|
3. 客户端经受保护 API 或预签名 URL,服务端校验路径、内容、大小及资源权限;putUrl 不强制 maxSize。
|
|
23
23
|
进度上传使用原生 XHR;预取消不发送,取消/错误一次结算并清理监听,完成后取消不影响旧请求。取消不回滚远端对象,先核对状态再授权删除。
|
|
24
24
|
4. 不覆盖上传使用 ifNoneMatch;冲突/checksum 失败不能伪装成功。验证取消、流错误和文件清理,最后 close。
|
|
25
25
|
5. 批量删除核对逐项进度,S3 每批最多 1000 项;HTTP 200 不能代替成功判断。unknown 结果先核对业务状态,避免重删并发新对象;dir.delete 不保证隔离并发写入或清除 S3 历史版本。
|
|
26
|
-
6. 自建 Compose 的桶路径由 Web Nginx 或 SSR/API gateway 直达 storage,下载/Range 不经过 Serv
|
|
26
|
+
6. 自建 Compose 的桶路径由 Web Nginx 或 SSR/API gateway 直达 storage,下载/Range 不经过 Serv,存储端口和控制台不公开。publicEndpoint 可含入口前缀,Nginx 用原始 request_uri 去前缀且保留编码、Host、签名查询,外层代理不能再剥离;入口可在网站目录内,拒绝 API/资源/健康冲突。新增网关、变更桶/公开地址需全量基线,增量及回滚保持原配置。外部 S3 不生成本地路由,Local 不开放目录。验证大文件、Range、过期/篡改/匿名拒绝、根/前缀路径和增量代理 DNS 刷新;签名 URL 不进入日志或截图。
|
|
27
27
|
7. 同源对象可能包含不可信 HTML;默认代理返回 CSP sandbox/default-src none、nosniff、no-referrer、private/no-store,不用于执行网站脚本。外部 S3/CDN 须配置等价策略。自建 bucket/region 为空时由部署补 hai/us-east-1,不能误写成 Storage Schema 默认值。
|
|
28
28
|
|
|
29
29
|
## 按需参考
|
|
@@ -25,7 +25,7 @@ type: local # local | s3
|
|
|
25
25
|
root: ./data/storage
|
|
26
26
|
# S3 存储(type=s3 时生效)
|
|
27
27
|
# endpoint: ''
|
|
28
|
-
# publicEndpoint: https://app.example.com #
|
|
28
|
+
# publicEndpoint: https://app.example.com/delivery/files # 可含代理目录,不含桶;网关去此前缀后直达 S3
|
|
29
29
|
# region: us-east-1
|
|
30
30
|
# accessKeyId: ''
|
|
31
31
|
# secretAccessKey: ''
|