- 准备发布 channel(mcp/plugin 等)或正式版到 npm 与 GitHub Releases 二进制
- 准备打 git tag(仅 stable)
发版必须通过 CI 完成,不要本地手动 pnpm publish。
入口:GitHub Actions → Publish workflow(.github/workflows/publish.yml)→ Run workflow。
编排关系(重要):
publish-stable.mjs / publish-channel.mjs ← 唯一发版入口
├─ npm(pnpm publish)
└─ binary(lib/binary-release
→ binary-build
→ gh-release
→ oss-direct-upload)
tools/release/lib/binary-release.mjs 等是实现,一般不要单独当发版入口(调试可用)。
两种模式:
| 模式 | 用途 | 触发方式 |
|---|---|---|
| channel | npm dist-tag +(仅 bailian-cli)二进制 + CDN 一律覆盖 sync-release.json |
mode=channel,channel 填 npm dist-tag 名 |
| stable | npm latest + GitHub Release v<ver> + CDN manifest.json(及 latest.json 别名) |
mode=stable,需 production environment 审批 |
可选 flag:--skip-binary(仅发 npm,紧急逃生)。
| 发布模式 | CDN 指针 | 本机安装 / 更新 |
|---|---|---|
| channel | 始终覆盖 sync-release.json |
BAILIAN_CHANNEL=sync-release / install --channel sync-release |
| stable | manifest.json(+ latest.json) |
默认安装 / bl update(无 channel) |
workflow 的 channel 输入只决定 npm dist-tag(如 mcp / plugin / sync-release),不再生成 release-test.json 这类旁路文件。
- 在 GitHub 触发 Publish workflow,mode 选
channel,channel 填 npm dist-tag 名:bailian-cli:npm 发到该 tag;二进制同时刷新 CDNsync-release.json(与 tag 名无关)。本机验证:BAILIAN_CHANNEL=sync-releaseknowledge-studio-cli:仅 npm(自动跳过 binary,不碰sync-release.json)
- CI 自动:生成
0.0.0-beta-<sha7>-<YYYYMMDDHHMM>(UTC 到分钟;同 commit 同分钟重跑会覆盖同号)→ 临时 bump → 自检 → npm 发到 dist-tag →(bailian-cli)Bun 编二进制 + GH prerelease + 覆盖sync-release.json→ 还原 package.json - 对应脚本:
tools/release/publish-channel.mjs
- 确保当前 release tooling 覆盖的包(
tools/release/lib/packages.mjs)已升到目标版本且一致;当前基础集合为packages/core/packages/runtime/packages/commands/packages/cli,knowledge-studio-cli发布会额外包含packages/kscli - 在 GitHub 触发 Publish workflow,package 选目标包集合,mode 选
stable - 需要 production environment 审批人批准
- CI 自动:自检 → npm 发到 latest → 推送 git tag
v<ver>→ Bun 编二进制并创建/更新 GitHub Release →(bailian-cli)维护 CDNmanifest.json→ 完成 - 如果所选发布集合的当前版本已全部存在于 npm,stable 发布会失败并提示先升级版本号;如果只有部分包已发布,CI 会继续补发缺失包
- 对应脚本:
tools/release/publish-stable.mjs
两种模式都会先跑 check.mjs,覆盖以下检查:
| 检查项 | 说明 |
|---|---|
pnpm install --frozen-lockfile |
lockfile 一致性 |
| README 同步 | packages/cli/README.md 与根 README 一致 |
| 版本号一致 | tools/release/lib/packages.mjs 中待发布包集合 version 相同 |
workspace:* 替换 |
发布包间 workspace 依赖解析为真实版本号 |
| 构建 | 基础发布构建 core/runtime/commands 依赖和 cli;--knowledge 额外构建 knowledge-studio-cli |
| 生成资产 | 重建各 skills/<skill>/reference/;非 channel 模式还同步各 skills/*/SKILL.md version(含 bailian-protocol) |
| pnpm pack | 打 tarball |
| publint | 包元数据校验 |
| gitleaks | 敏感信息扫描 |
本地可以 dry-run 验证:
node tools/release/publish-channel.mjs --channel test --dry-run
node tools/release/publish-channel.mjs --channel test --knowledge --dry-run- 认证:npm OIDC Trusted Publishing(无 token),需要
id-token: write权限 - GitHub Release:
contents: write+GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}(stable / channel 均需) - Node 版本:24(npm 11.5+ 才支持 OIDC token 交换)
- Bun:
oven-sh/setup-bun,版本钉死在 workflow 中 - Actions 版本:checkout/setup-node/pnpm-action 均为 v6(Node 24 兼容)
- npm 配置:当前 release tooling 发布的包(
bailian-cli-core/bailian-cli-runtime/bailian-cli-commands/bailian-cli/knowledge-studio-cli)的 Trusted Publisher 指向modelstudioai/cli的publish.yml;新增发布包时同步 npm Trusted Publisher
-
tools/release/lib/packages.mjs覆盖的目标包集合已升到目标版本且一致 - 源码包
packages/core/package.json、packages/runtime/package.json、packages/commands/package.json、packages/cli/package.json、packages/kscli/package.json是否需要同步升版已人工确认;当前仓库通常保持五包版本一致 -
tools/release/lib/packages.mjs的PACKAGES覆盖基础发布包;KSCLI_PACKAGE/ALL_PACKAGES覆盖knowledge-studio-cli发布路径;如果新增发布包,同步publish-stable.mjs/publish-channel.mjs的 bump、publish、idempotency 逻辑和.github/workflows/publish.yml的 package 选项 - pre-release 格式正确(
1.0.0-beta.0/1.0.0-rc.1,不要直接用1.0.0当 beta)
-
CHANGELOG.md和CHANGELOG.zh.md都已新增目标版本条目,中英文一一对应 - 分类标题用 Keep a Changelog 规范的
Added/Changed/Deprecated/Removed/Fixed/Security(中文版对应新增/变更/已弃用/已移除/修复/安全),不要自创Improved/优化等规范外分类 - 条目日期与发版日期一致
-
README.md/README.zh.md的 Quick Start 命令仍能跑通 - README 的 Node.js 徽章版本与
cli/package.json.engines.node一致 - README 宣传的 bin 名称在
cli/package.json.bin都真的注册 -
packages/kscli/README.md/README.zh.md与knowledge-studio-cli的 bin、控制台 URL、认证方式一致 -
LICENSE文件存在(根 + 当前实际发布包;新增发布包时补该包 LICENSE)
- 验证 npm 上能装:
npm view bailian-cli@<tag> version;如发布knowledge-studio-cli,同时npm view knowledge-studio-cli@<tag> version - 试装一次:
npm i -g bailian-cli@<tag> && bl --version;如发布knowledge-studio-cli,同时npm i -g knowledge-studio-cli@<tag> && kscli --version
| 漏点 | 后果 |
|---|---|
| 只升部分包,漏升 runtime/commands/kscli | 当前 check.mjs 按所选发布集合校验,但未选择 knowledge-studio-cli 时不会覆盖 kscli |
新增发布包但没加 tools/release/lib/packages.mjs |
CI 不会 bump/publish/校验该包 |
| cli 升版号但 core 没升 | check.mjs 会拦下 |
发版漏更 CHANGELOG,或分类写成规范外的 优化/Improved |
用户看不到本次变更,分类与历史不一致 |
1.0.0 当 beta 直接发 |
占了 latest tag,所有用户被强升,撤回成本极高 |
README 写的 bin 名实际 package.json.bin 没注册 |
用户复制命令报 command not found |
Node 徽章与 cli/package.json.engines 不一致(当前应为 >=18.17) |
用户在声明外的 Node 上 npm i 被 engine 警告或直接失败 |
| npm Trusted Publisher 的 workflow filename 改了没同步 | OIDC 匹配不上,publish 报 404 |
| CI 用 Node 22(npm 10)跑 publish | npm 10 不支持 OIDC token 交换,publish 报 404 |
| stable 发布前没有升级版本号 | 所选发布集合的版本已全部存在于 npm,CI 明确报错并要求先升级版本号 |
channel job 缺少 contents: write |
gh release create 失败 |
| stable 未先推 tag 就建 Release | --verify-tag 失败 |