Release Core(Test)是一个开发者便利性技能,用于将 cyrus-core 包(必要时包含 claude-runner)作为 dev/test 预发布版本发布到 npm 的 test dist-tag 下。它的目标是让开发者无需经过完整发布流程即可迭代 cyrus-core。
用途与定位
该技能用于在开发测试 Cyrus 变更时,将未发布的 cyrus-core 预发布版本快速推送至 npm,以便托管的 GUI 等消费者可以指向它。设计上刻意保持最小化,仅覆盖发布本身。
不做什么
该技能明确不执行以下操作:
- 不更新 CHANGELOG.md 或 CHANGELOG.internal.md
- 不创建 git tag
- 不创建 GitHub release
- 不移动任何 Linear 议题
- 不打开 Pull Request
- 不提交版本号变更(被 bump 的 package.json 仅作为本地工作区变更保留)
此外,它也不发布任何其他工作区包(不发布 edge-worker、不发布 cyrus CLI、不发布 linear-event-transport 等)。唯一例外是 claude-runner,仅当其 workspace:* 引用会导致解析到未发布版本时才会重新发布(见步骤 3)。
工作流程
-
从仓库根目录安装依赖
pnpm install
-
从仓库根目录构建所有包
pnpm build
构建全部包是为了在发布前解析 workspace:* 依赖。
-
判断 claude-runner 是否需要重新发布
cyrus-core 通过 workspace:* 依赖 claude-runner。当 cyrus-core 被发布时,该 workspace:* 会被重写为 packages/claude-runner/package.json 中的当前版本。如果该版本实际尚未存在于 npm(因为 claude-runner 自上次发布后有本地变更),那么安装 cyrus-core@test 的消费者将无法解析该依赖。
需要运行两个确定性检查:
(a) 本地 claude-runner 版本是否已在 npm 上?
LOCAL_CR=$(node -p "require('./packages/claude-runner/package.json').version") npm view "cyrus-claude-runner@${LOCAL_CR}" version 2>/dev/null
(b) claude-runner 自上次发布后是否有未提交/未推送的源码变更?
git diff --quiet HEAD -- packages/claude-runner/src packages/claude-runner/package.json && echo "clean" || echo "dirty"
如果满足以下任一条件,则重新发布 claude-runner:(a) 返回空(本地版本不在 npm 上),或 (b) 输出 dirty。如果两者都干净通过,则跳过此步骤。如果不确定,请询问用户。
重新发布方式:
确定 claude-runner 的下一个 -test.N(与下方 cyrus-core 相同的算法)
将 packages/claude-runner/package.json bump 到例如 0.0.X-test.N
cd packages/claude-runner pnpm publish --access public --no-git-checks --tag test cd ../.. pnpm install # 刷新 lockfile,以便 cyrus-core 获取新的 claude-runner
否则完全跳过此步骤。
-
将 cyrus-core bump 到下一个 -test.N 预发布版本
算法:
- 从 packages/core/package.json 读取当前版本(例如 0.1.22)。
- 增加 patch(例如 0.1.23)。
- 追加 -test.N,从 N = 0 开始,当 <bumped>-test.N 已存在于 npm 上时递增(包括中止/过期的先前尝试)。
使用以下一行命令查找 bump 后 patch 已有的 -test.N 版本并选出下一个 N:
BUMPED=0.1.23 # the patch-bumped base, no suffix npm view cyrus-core versions --json
| jq -r '.[]'
| grep -E "^${BUMPED}-test.[0-9]+$"
| awk -F'test.' '{print $2}'
| sort -n | tail -1如果为空,使用 N=0。否则使用 (max + 1)。
将所选版本(例如 0.1.23-test.0)写回 packages/core/package.json。不要提交此变更——将其保留为本地工作区编辑,由开发者决定是否保留。
-
使用 test dist-tag 发布 cyrus-core
cd packages/core pnpm publish --access public --no-git-checks --tag test cd ../..
使用 --tag test 意味着:
- npm install cyrus-core@test 将安装此版本。
- 不会移动 latest dist-tag,因此生产安装(npm install cyrus-core)不受影响。
-
验证 dist-tags 是否正确落地
npm view cyrus-core dist-tags
确认 latest 与发布前保持不变,且 test 现在指向刚刚发布的版本。如果 latest 发生移动,说明有问题——在告诉任何人安装之前停止并排查。
-
打印安装指令
发布后,打印两种形式以便开发者复制粘贴:
Published cyrus-core@<version> under dist-tag
test.Install with: npm install cyrus-core@test or pinned: npm install cyrus-core@<version>
如果步骤 3 中也重新发布了 claude-runner,同时包含其版本。
关键注意事项
- 始终使用 --no-git-checks,以便可以从带脏工作区的 feature 分支发布。
- 始终使用 --tag test,以保留 latest dist-tag 用于真实发布。
- 预发布版本(任何带 - 后缀如 -test.0 的版本)不会被 npm install cyrus-core 自动安装,除非显式指定 tag 或版本,因此可以安全地反复运行。
- 如果重新发布了 claude-runner,请在发布后运行 pnpm install,以便 lockfile 在 cyrus-core 构建/发布前反映新发布的版本。
- 在干净的工作区上,从根目录运行 pnpm install + pnpm build 合计约需 3 分钟——请相应规划命令超时。
示例
- "release core test" - 运行 cyrus-core 的开发版本发布
- "/release-core-test" - 调用该技能