@h-ai/cli 1.0.0-beta.5 → 1.0.0-beta.7
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 +24 -10
- package/README.ja.md +24 -10
- package/README.md +24 -10
- package/dist/{chunk-YHSX7AQX.js → chunk-7DNIMG2H.js} +89 -14
- package/dist/chunk-7DNIMG2H.js.map +1 -0
- package/dist/{chunk-YVNNMC4H.js → chunk-RT5OZJKM.js} +644 -11
- package/dist/chunk-RT5OZJKM.js.map +1 -0
- package/dist/{chunk-VUWM43KR.js → chunk-XI5SKOOR.js} +6673 -723
- package/dist/chunk-XI5SKOOR.js.map +1 -0
- package/dist/cli-config-templates-5KS3AE4H.js +5 -0
- package/dist/{cli-config-templates-LUJGDQNW.js.map → cli-config-templates-5KS3AE4H.js.map} +1 -1
- package/dist/{cli-skill-templates-COTP767H.js → cli-skill-templates-S2YH642Z.js} +3 -3
- package/dist/{cli-skill-templates-COTP767H.js.map → cli-skill-templates-S2YH642Z.js.map} +1 -1
- package/dist/index.js +395 -387
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/src-CX5IJGYM.js +5 -0
- package/dist/src-CX5IJGYM.js.map +1 -0
- package/package.json +11 -11
- package/templates/README.md +4 -0
- package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +1 -1
- package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +4 -4
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +41 -2
- package/templates/apps/api/images/serv.Dockerfile.hbs +11 -6
- package/templates/apps/fullstack/docs/security-configuration.md.hbs +1 -1
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +11 -6
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +11 -5
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +6 -6
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +4 -4
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +1 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +26 -2
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +0 -1
- package/templates/base/images/web.Dockerfile.hbs +20 -10
- package/templates/base/package.json.hbs +8 -3
- package/templates/base/src/lib/server/init.ts.hbs +40 -2
- package/templates/shared/run-node.mjs +45 -0
- package/templates/skills/hai-ai/SKILL.md +6 -2
- package/templates/skills/hai-ai/acp.md +143 -0
- package/templates/skills/hai-ai/guide.md +2 -2
- package/templates/skills/hai-ai/resources.md +69 -0
- package/templates/skills/hai-app-create/development.md +9 -8
- package/templates/skills/hai-app-create/reference.md +1 -1
- package/templates/skills/hai-build/SKILL.md +5 -2
- package/templates/skills/hai-build/reference.md +16 -2
- package/templates/skills/hai-ci/SKILL.md +2 -0
- package/templates/skills/hai-core/SKILL.md +2 -2
- package/templates/skills/hai-core/reference.md +3 -3
- package/templates/skills/hai-core/request-access.md +1 -1
- package/templates/skills/hai-crypto/reference.md +1 -1
- package/templates/skills/hai-deploy/SKILL.md +8 -4
- package/templates/skills/hai-deploy/middleware.md +9 -9
- package/templates/skills/hai-iam/reference.md +2 -2
- package/templates/skills/hai-serv/reference.md +1 -1
- package/dist/chunk-VUWM43KR.js.map +0 -1
- package/dist/chunk-YHSX7AQX.js.map +0 -1
- package/dist/chunk-YVNNMC4H.js.map +0 -1
- package/dist/cli-config-templates-LUJGDQNW.js +0 -5
- package/dist/src-24PXSKE6.js +0 -5
- package/dist/src-24PXSKE6.js.map +0 -1
|
@@ -31,7 +31,7 @@ description: "构建并发布或交付已有镜像:完整离线包、按服务
|
|
|
31
31
|
排错与交付按[沟通与同步维护](../hai-app-create/collaboration.md)先说明实际影响、恢复步骤和验证边界,再附脱敏错误码/traceId/日志;配置、使用文档和截图随实际部署流程同步。
|
|
32
32
|
|
|
33
33
|
1. 读取项目 scripts、images/ 中的 Dockerfile、项目根 hai.json 的 build/deploy 与服务目录运行配置。构建与部署属于整个项目;服务目录只用于扫描运行依赖。创建默认带开发期部署工具;用户明确 --no-deploy 时不生成部署入口。构建细节见 [hai-build](../hai-build/SKILL.md)。
|
|
34
|
-
2. 选择环境,验证 .env.<mode> 存在,再处理部署目标与必要中间件。SSH 支持 key/agent 或 password,缺项按说明补齐,有效完整配置直接复用;--bundle-only 在构建和中间件配置后、打包前最后询问是否添加或修改 SSH 信息,保存并用于本次和后续 target;--yes 或跳过时复用已有配置。新私有参数写 .env.<mode>.local
|
|
34
|
+
2. 选择环境,验证 .env.<mode> 存在,再处理部署目标与必要中间件。SSH 支持 key/agent 或 password,缺项按说明补齐,有效完整配置直接复用;--bundle-only 在构建和中间件配置后、打包前最后询问是否添加或修改 SSH 信息,保存并用于本次和后续 target;--yes 或跳过时复用已有配置。新私有参数写 .env.<mode>.local,共享 .env.local 保留本机私有值;私钥仅引用路径,密码隐藏输入并保留原值。Core、Node/Vite 和部署统一加载模式私有层,按来源先父后细项。优先级与认证边界见 [middleware.md](middleware.md)。
|
|
35
35
|
3. 先校验所选制品、版本、服务和SHA-256。--build只构建所选应用镜像;不带它时缺产物明确失败,不隐式补构建。根目录使用格式4,非根目录使用格式5及webBasePath;两者都记录appVersion、buildId、partial、hasWeb、镜像归档及显式配置的servContainerPort/webContainerPort,部分构建也保留未选镜像端口,缺省使用部署默认值。网站目录由构建进程PUBLIC_BASE_PATH确定,所有部分构建须保持一致;目录变化必须全量,健康与恢复按制品记录处理。具体步骤见[网站挂载目录](../hai-build/paths.md)。同一应用版本可重建,镜像引用区分实际内容;禁止latest与无版本镜像。
|
|
36
36
|
4. 完整包自动导出实际自建中间件镜像并去重;只更新 Web 不重新打包 API/中间件。打包机需容器引擎导出中间件,服务器仅 load,禁止 pull/build。外部连接及云开通不能伪称为离线自包含服务。
|
|
37
37
|
5. --services 使用目标服务器最后成功状态为基线,检查端口/拓扑及未选依赖,保留未选配置、凭据、网络和卷。脚本先按项目/服务标签仅删除选中旧容器(保留卷),再 up -d --no-deps --no-build --pull never --no-recreate 创建新容器并保留其他容器;先等待选中中间件健康,再启动 serv/Web,失败恢复同序,避免 Compose Provider 连带重建反向依赖,禁止整个项目 down。S3 可选 createBucket 在 storage.init 中检查并创建缺失桶,自建 S3 注入 HAI_STORAGE_CREATEBUCKET=true;仅更新 storage 无须应用镜像,新桶在下次应用初始化时创建。Compose 网络统一 hai-app,序列化不使用 YAML 锚点。
|
|
@@ -53,11 +53,13 @@ description: "构建并发布或交付已有镜像:完整离线包、按服务
|
|
|
53
53
|
|
|
54
54
|
独立读取的核心环境、职责账号初始密码和传输密钥环保留进程语义,不能仅按前缀判定已失效;Node 启动参数及私有代理标记由部署装配提供,不在运行文件重复保留无效项。
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
生成端优先写细项,数组保留 JSON;手写 JSON 允许兜底,放在对应模块细项之前。同源细项覆盖 JSON,动态字典、JSON 文本和显式空对象保留原义;整体替换展开时以最上层 `{}` 标记阻止旧 YAML 字段恢复。容器路径只写交付配置,不反写工程源环境。
|
|
57
57
|
|
|
58
|
-
Node 后端(Serv / SvelteKit SSR
|
|
58
|
+
Node 后端(Serv / SvelteKit SSR)每次启动读取服务器 `<部署目录>/config/.env.runtime`。应用配置与托管连接在此合并,修改 `HAI_STORAGE_PUBLICENDPOINT` 等细项后重启对应后端即可;同一来源的细项覆盖父 JSON。配置目录只读挂载到 `/run/hai/config`,编辑器原子替换文件也会被下一次启动读取。私有代理标记和 Node 启动参数由部署装配管理;静态 Web、中间件原生环境、端口/挂载、Nginx 路由与限额变更仍需部署。仅更新 Web/中间件保留当前应用配置;后端局部更新保留服务器托管连接,其余值来自新包,全量更新采用新包并按已有凭据状态定稿。手工修改先备份,长期配置同步回源环境。
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
运行文件固定为 `<部署目录>/config/.env.runtime`,只读挂载目录到 `/run/hai/config`;各 release 保留配置快照。单文件不超过 1 MiB,缺失、不可读、重复变量或超限阻止启动;dotenv 字面解析不执行 shell。同源细项覆盖 JSON,显式进程 HAI 配置优先。修改后重启、验健康和受影响业务,失败恢复备份再重启。
|
|
61
|
+
|
|
62
|
+
部署归档只保留五个顶层入口:`apply.sh`、`manifest.json`、`config/`、`images/`、`.hai/`。`config/.env.runtime` 是唯一应用环境文件;`manifest.json.metadata` 集中保存依赖、布局、健康路径、镜像列表、受管绑定等非敏感元数据。`.hai/compose.json` 是完整服务快照;局部更新在服务边界替换并保留未选服务,不串联历史 Compose 文件。`.hai/` 还存原生环境、加载器、Nginx/TLS、策略和校验和,秘密不写入 manifest。辅助脚本合入 `apply.sh`。失败时先恢复原应用配置再恢复服务,凭据、后端账本和数据卷继续保护。新包格式为 2,不实现旧目录兼容或迁移。
|
|
61
63
|
|
|
62
64
|
## CLI
|
|
63
65
|
|
|
@@ -90,6 +92,8 @@ S3 的内部 endpoint 与预签名 publicEndpoint 分开;后者无默认,填
|
|
|
90
92
|
|
|
91
93
|
deploy.init 后检查 HaiResult.success,deploy.deployApp 接收 artifactDir、bundleOnly、selectedServices、runtime 与 onProgress;finally 中 deploy.close。deploy.scan 和 deploy.credentials.* 不依赖 init。Vercel 只消费已有 .vercel/output,不执行源码构建,也不支持 Compose 离线/部分更新。
|
|
92
94
|
|
|
95
|
+
下载源由 `--image-source official|cn|custom` 控制构建和打包中间件,`--npm-source` 只随 `--build` 作用于 Corepack/pnpm。SDK 的 DeployAppOptions.imageSource 接收 `{ type, registries? }`,proxy 接收 `{ mode, url?, bypass? }`;resolveImageReference / resolveDownloadProxy 是无 init 的解析工具。配置、优先级与代理边界见 [hai-build 下载源与代理](../hai-build/reference.md#下载源与代理)。SDK 拉取子进程会覆盖代理变量,远程引擎仍需自身设置;镜像归档保持原始标签。
|
|
96
|
+
|
|
93
97
|
内部命令工具须显式枚举 `secrets`(包括转换后的敏感字面量),成功/失败/回调均跨块脱敏;不得向日志附加原始异常 cause。捕获默认每流末尾 1 Mi 字符,结构化消费先检查截断标志;异步输出回调按序等待并保持 pipe 背压。进度每行最多解析 512 字符,超时后确认远程执行状态。详细边界见 [middleware.md](middleware.md#命令输出)。
|
|
94
98
|
|
|
95
99
|
超时或输入/输出失败会终止本地受管理 Job/进程组并等待核验;Windows 用系统 PowerShell/.NET 内嵌 Job,先挂起创建、分配成功才恢复,失败不降级裸进程;POSIX 后代须保留继承的进程组。`terminationTimeoutMs` 默认 10000、最大 60000 毫秒,核验失败返回 unknown。失败分支用 `getDeployCommandState(error)` 读取 localTermination 和 remoteExecution;CLI 分别显示。本地已退出不能证明 SSH 远端停止;仅新连接读到完整、ID 匹配的原子结果才确认 finished,给出结果路径/退出码。未知状态不自动重跑发布或回滚,先核对 current、步骤和实际服务。
|
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
|
|
15
15
|
构建与部署配置统一在项目根 `hai.json`:`build` 保存 images/desktop,`deploy` 保存 provider/container/services 等项目级配置。服务目录只扫描运行依赖与模块 YAML。`deploy` 支持 `${变量:回退值}` 和 `HAI_DEPLOY_*` 分层覆盖;父对象可用 JSON 整体覆盖,缺省 SSH 节点可由 Schema 已知字段补齐,不接受未知字段。高层来源父对象覆盖低层叶字段,同一来源叶字段优先。凭据不要直接写入 hai.json。构建不读取部署环境或密钥。
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
公共配置保存在 `.env` 和 `.env.<mode>`,连接凭据与 SSH 配置保存在忽略 Git 的 `.env.<mode>.local`,`.env.local` 用于本机共享私有值。构建不读取部署秘密。
|
|
18
18
|
|
|
19
19
|
部署 SDK 的来源优先级从高到低为:
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
- 普通模块:进程 > `.env.<mode>.local` > 旧 `.env.local` > `.env.<mode>` > `.env`,保留旧私有凭据优先级。
|
|
21
|
+
所有 `HAI_*` 统一使用:进程 > `.env.<mode>.local` > `.env.local` > `.env.<mode>` > `.env` > YAML。同来源 JSON 为基础,细项继续覆盖;高来源整段替换先清掉低来源细项。Node/Vite 与部署共用 Core 合并,不维护模块专用顺序。
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
|
|
24
|
+
`.env.<mode>.local` 同时用于普通开发、Node 启动和部署;通过公共 Core 工具合并,不实现模块专用来源顺序。
|
|
25
25
|
|
|
26
26
|
交付 tar 内的 `.env.runtime` 是按上述配置生成的 Compose 运行文件,不是下次部署的配置源。`NODE_ENV` 默认按目标模式选择:test 为 test,dev/development 为 development,其余为 production;显式应用配置仍可覆盖。构建保持正式优化模式,旧包需重新生成。完整配置使用 `--env test --yes` 复用;需要保持中间件时追加 `--skip-middleware`。自建中间件的密码由服务器 `<remoteDir>/managed-secrets.env` 持久保存(权限 0600),应与数据卷一起备份。每次打包只生成首次初始化的随机候选,不依赖打包机缓存;在线 SDK、deploy.sh、deploy.ps1 和 deploy-local.sh 都在部署锁内复用服务器值,同时更新应用连接配置及中间件原生变量。交付 tar 保持不可变,只有服务器私有运行文件使用定稿值。若状态缺失而对应数据卷已存在,部署在变更服务前明确停止,须恢复服务器凭据备份;不会自动换密或删除数据。旧版本可通过显式预检和凭据导入流程迁移,缺状态的普通部署仍拒绝。
|
|
27
27
|
|
|
@@ -31,13 +31,13 @@ Podman 部署会主动执行容器已有的 healthcheck 并重新核对状态,
|
|
|
31
31
|
|
|
32
32
|
分批启动仅在首批清理孤立容器,后续 serv/Web 启动必须保留已经就绪的中间件。
|
|
33
33
|
|
|
34
|
-
生成时为 `.env.dev/.env.test/.env.prod`
|
|
34
|
+
生成时为 `.env.dev.local/.env.test.local/.env.prod.local` 分别生成独立的初始管理员密码和传输密钥环;文件不提交 Git,克隆后通过受保护配置分发对应环境秘密,并可通过本机私有文件或进程环境覆盖。启用 transport 的应用缺少/错误配置 `HAI_CRYPTO_TRANSPORT_SERVERKEYRING` 时,部署在上传前指出配置来源;同一环境的所有节点可直接加载环境文件中的同一有效密钥环,也可由 Secret Manager 覆盖;不为每个节点临时生成。CLI 完成部署后提示 `HAI_ADMIN_DEFAULT_PASSWORD` 的实际来源,不打印密码,不依赖日志级别;该密码仅在首次创建管理员时生效。 离线入口也会提示服务器私有 `.env.runtime` 中的密码变量位置。
|
|
35
35
|
|
|
36
36
|
## 识别与逐项选择
|
|
37
37
|
|
|
38
|
-
默认和自定义模式均从同后端的有效配置继续,不能按表单重建对象而丢掉未展示项。自建/云开通保留连接池、操作日志、公开端点/前缀、Redis 重试、向量检索、SMTP 发件人及 LDAP 属性映射,仅由实际服务定稿地址与认证;旧 URL、TLS
|
|
38
|
+
默认和自定义模式均从同后端的有效配置继续,不能按表单重建对象而丢掉未展示项。自建/云开通保留连接池、操作日志、公开端点/前缀、Redis 重试、向量检索、SMTP 发件人及 LDAP 属性映射,仅由实际服务定稿地址与认证;旧 URL、TLS/集群选择器不能覆盖新服务。切换后端清除不兼容字段。生成端优先写细项,数组保留 JSON;手写 JSON 允许兜底,放在对应模块细项之前。同源细项覆盖 JSON,动态字典、JSON 文本和显式空对象保留原义;整体替换展开时以最上层 `{}` 标记阻止旧 YAML 字段恢复。容器路径只写交付配置,不反写工程源环境。
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
中间件原生变量(`POSTGRES_*`、`MYSQL_*`、`RUSTFS_*`、`MINIO_*`、`LDAP_*`)按镜像契约保留原名,只写私有 `.hai/middleware-runtime.env`,仅由中间件读取。应用连接全部合并到 `config/.env.runtime`。
|
|
41
41
|
|
|
42
42
|
数据库连接保存前复用所选后端的公开配置 Schema;MySQL `ssl` 仅 `false` 或严格对象,`{}` 默认验证证书链和 DNS 身份,`ca/cert/key` 为 PEM 内容且 `cert/key` 必须成对;私钥仅进入私有环境。PostgreSQL 保留其布尔值/字符串模式/对象契约。CLI 内联 `@h-ai/reldb/schemas` 与 Zod,无需为配置校验给目标应用额外安装数据库包或驱动;部署本身仍需已安装的 `@h-ai/deploy`,实际运行应用仍需其数据库依赖。
|
|
43
43
|
|
|
@@ -60,7 +60,7 @@ Podman 部署会主动执行容器已有的 healthcheck 并重新核对状态,
|
|
|
60
60
|
|
|
61
61
|
1. **使用默认配置**:选择后端;Compose 生成匹配容器/卷,云平台调用已支持的 Provisioner,并保存实际连接配置。MySQL、LDAP、向量库等没有云自动开通器时,明确提示改用自定义连接;不能声称已经创建云资源。Resend 需要已验证的发件域名,R2 需要已有 S3 访问密钥,阿里云短信需要签名/模板与额度。
|
|
62
62
|
2. **使用自定义配置**:逐项输入所选后端的连接字段,展示字段用途与约束,校验必填项、端口、布尔和 URL;凭据用密码输入。保存配置后跳过该服务的开通与 sidecar。
|
|
63
|
-
3. **保持不变**:仅在目标 `.env.<mode>` 显式声明当前后端及完整连接配置时出现;私有凭据可来自 `.env.<mode>.local
|
|
63
|
+
3. **保持不变**:仅在目标 `.env.<mode>` 显式声明当前后端及完整连接配置时出现;私有凭据可来自 `.env.<mode>.local`、共享 `.env.local` 或进程。选择后不修改该项、不认证其 Provisioner、不创建或移除已有中间件容器,继续下一项。只有 `.env` 或其他环境有配置不满足此条件。
|
|
64
64
|
|
|
65
65
|
逐项配置前提供“环境配置已完备,直接部署”。选择后跳过全部中间件提示、变量改写、云资源与 sidecar 创建,保留已有服务;仍校验已有构建产物并执行部署及健康检查。命令行使用唯一的 `--skip-middleware`,SDK 使用 `skipMiddleware`。不要因为缺少某项中间件的目标文件声明而阻止用户主动跳过。
|
|
66
66
|
|
|
@@ -120,7 +120,7 @@ manifest.json 的 partial 与 selectedServices、apply 脚本共同记录部署
|
|
|
120
120
|
|
|
121
121
|
生成 web.conf 时从目标环境解析后的 _serv.yml 读取 transport.maxPlaintextBytes,调用 crypto.resolveTransportBodyLimits 推导 client_max_body_size;默认 2129920 字节,8 MiB 明文对应 16809984 字节。请求/响应 buffering 关闭,认证头缓冲固定。SvelteKit 从 _kit.yml 自动推导 adapter-node BODY_SIZE_LIMIT。app 增量包携带代理配置;容量变化时复用现有 Web 镜像重建代理并纳入失败恢复,容量不变保留 Web 容器。容量变化须选择 app;路由/端口/其他代理策略改变仍要求全量部署。应用继续独立限制业务文件、解压和行数。自管代理调用 resolveTransportBodyLimits 获取同一预算。
|
|
122
122
|
|
|
123
|
-
完全离线构建另需基础镜像、Linux 依赖缓存、pnpm 和匹配驱动/Node ABI/架构/libc
|
|
123
|
+
完全离线构建另需基础镜像、Linux 依赖缓存、pnpm 和匹配驱动/Node ABI/架构/libc 的原生预编译包。联网准备可选 --image-source / --npm-source 的 official、cn、custom;npm 参数随 --build 使用。代理通过 --proxy-mode 及 --proxy-url / --proxy-bypass 配置,--no-http-proxy 等价 none;镜像拉取端还需配置引擎代理。具体契约见 [下载源与代理](../hai-build/reference.md#下载源与代理)。原生包保留 --sqlite-prebuild-mirror,不让 deploy 下载编译环境。生产 HTTPS、CORS、证书、DNS 另行准备。实际断网验收登录、刷新、重启和数据持久化。
|
|
124
124
|
|
|
125
125
|
## 命令输出
|
|
126
126
|
|
|
@@ -73,11 +73,11 @@ rbac:
|
|
|
73
73
|
import type { IamConfigSettingsInput } from '@h-ai/iam'
|
|
74
74
|
import { cache } from '@h-ai/cache'
|
|
75
75
|
import { core } from '@h-ai/core'
|
|
76
|
-
import { iam } from '@h-ai/iam'
|
|
76
|
+
import { iam, IamConfigSchema } from '@h-ai/iam'
|
|
77
77
|
import { reldb } from '@h-ai/reldb'
|
|
78
78
|
|
|
79
79
|
// 位于应用启动函数内;依赖初始化失败时立即返回,不能继续启动 IAM。
|
|
80
|
-
core.init({ configDir: './config' })
|
|
80
|
+
core.init({ configDir: './config', configSchemas: { iam: IamConfigSchema } })
|
|
81
81
|
const db = await reldb.init({ type: 'sqlite', database: './data.db' })
|
|
82
82
|
if (!db.success)
|
|
83
83
|
return db
|
|
@@ -235,7 +235,7 @@ export default { fetch: handler }
|
|
|
235
235
|
import { core } from '@h-ai/core'
|
|
236
236
|
import { serv, ServConfigSchema } from '@h-ai/serv'
|
|
237
237
|
|
|
238
|
-
core.init({ configDir: './config' })
|
|
238
|
+
core.init({ configDir: './config', configSchemas: { serv: ServConfigSchema } })
|
|
239
239
|
|
|
240
240
|
const validation = core.config.validate('serv', ServConfigSchema)
|
|
241
241
|
if (!validation.success)
|