发布检查清单 (npm + macOS)

在仓库根目录使用 pnpm (Node 22+)。打标签/发布前保持工作树干净。

Operator 触发器

当 operator 说”release”时,立即执行以下预检(除非遇到阻塞,否则不要问额外问题):

  • 读取本文档和 docs/platforms/mac/release.md
  • ~/.profile 加载环境变量,确认 SPARKLE_PRIVATE_KEY_FILE + App Store Connect 变量已设置(SPARKLE_PRIVATE_KEY_FILE 应该在 ~/.profile 中)。
  • 如需要,使用 ~/Library/CloudStorage/Dropbox/Backup/Sparkle 中的 Sparkle 密钥。
  1. 版本和元数据
  • 更新 package.json 版本(例如 2026.1.29)。
  • 运行 pnpm plugins:sync 对齐扩展包版本和变更日志。
  • 更新 CLI/版本字符串:src/cli/program.tssrc/provider-web.ts 中的 Baileys user agent。
  • 确认包元数据(name、description、repository、keywords、license)以及 bin 映射指向 openclaw.mjsopenclaw
  • 如果依赖项有变化,运行 pnpm install 更新 pnpm-lock.yaml
  1. 构建和产物
  • 如果 A2UI 输入有变化,运行 pnpm canvas:a2ui:bundle 并提交更新后的 src/canvas-host/a2ui/a2ui.bundle.js
  • pnpm run build(重新生成 dist/)。
  • 验证 npm 包的 files 包含所有必需的 dist/* 目录(特别是 dist/node-host/**dist/acp/**,用于 headless node + ACP CLI)。
  • 确认 dist/build-info.json 存在并包含预期的 commit 哈希(CLI banner 在 npm 安装时使用此信息)。
  • 可选:构建后运行 npm pack --pack-destination /tmp;检查 tarball 内容并保留它用于 GitHub release(不要提交它)。
  1. 变更日志和文档
  • 用面向用户的重点内容更新 CHANGELOG.md(如果文件不存在则创建);条目严格按版本降序排列。
  • 确保 README 示例/标志与当前 CLI 行为匹配(特别是新命令或选项)。
  1. 验证
  • pnpm build
  • pnpm check
  • pnpm test(如果需要覆盖率输出则用 pnpm test:coverage)
  • pnpm release:check(验证 npm pack 内容)
  • OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke(Docker 安装冒烟测试,快速路径;发布前必需)
    • 如果上一个 npm 版本已知有问题,在预安装步骤设置 OPENCLAW_INSTALL_SMOKE_PREVIOUS=<last-good-version>OPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS=1
  • (可选)完整安装冒烟测试(增加 non-root + CLI 覆盖):pnpm test:install:smoke
  • (可选)安装 E2E 测试(Docker,运行 curl -fsSL https://openclaw.ai/install.sh | bash,引导,然后运行真实工具调用):
    • pnpm test:install:e2e:openai(需要 OPENAI_API_KEY)
    • pnpm test:install:e2e:anthropic(需要 ANTHROPIC_API_KEY)
    • pnpm test:install:e2e(需要两个密钥;运行两个 provider)
  • (可选)如果你的更改影响发送/接收路径,抽查 web gateway。
  1. macOS 应用 (Sparkle)
  • 构建 + 签名 macOS 应用,然后打包成 zip 用于分发。
  • 生成 Sparkle appcast(通过 scripts/make_appcast.sh 生成 HTML 说明)并更新 appcast.xml
  • 准备好应用 zip(和可选的 dSYM zip)附加到 GitHub release。
  • 按照 macOS release 执行确切的命令和所需的环境变量。
    • APP_BUILD 必须是数字且单调递增(不能有 -beta),这样 Sparkle 才能正确比较版本。
    • 如果需要公证,使用从 App Store Connect API 环境变量创建的 openclaw-notary keychain profile(参见 macOS release)。
  1. 发布 (npm)
  • 确认 git 状态干净;根据需要提交和推送。
  • 如需要,运行 npm login(验证 2FA)。
  • npm publish --access public(预发布版本使用 --tag beta)。
  • 验证注册表:npm view openclaw versionnpm view openclaw dist-tagsnpx -y [email protected] --version(或 --help)。

故障排除(来自 2.0.0-beta2 发布的笔记)

  • npm pack/publish 挂起或生成巨大的 tarball:dist/OpenClaw.app 中的 macOS 应用包(和 release zip)被打包进去了。通过 package.jsonfiles 白名单发布内容来修复(包含 dist 子目录、docs、skills;排除应用包)。用 npm pack --dry-run 确认 dist/OpenClaw.app 未列出。
  • npm auth web loop for dist-tags:使用 legacy auth 获取 OTP 提示:
  • npx 验证失败,提示 ECOMPROMISED: Lock compromised:用新缓存重试:
  • 修复后需要重新指向标签:强制更新并推送标签,然后确保 GitHub release 资源仍然匹配:
    • git tag -f vX.Y.Z && git push -f origin vX.Y.Z
  1. GitHub release + appcast
  • 打标签并推送:git tag vX.Y.Z && git push origin vX.Y.Z(或 git push --tags)。
  • vX.Y.Z 创建/刷新 GitHub release,标题为 openclaw X.Y.Z(不只是标签);正文应包含该版本的完整变更日志部分(Highlights + Changes + Fixes),内联(不要裸链接),并且不要在正文中重复标题
  • 附加产物:npm pack tarball(可选)、OpenClaw-X.Y.Z.zipOpenClaw-X.Y.Z.dSYM.zip(如果生成了)。
  • 提交更新后的 appcast.xml 并推送(Sparkle 从 main 分支获取)。
  • 从干净的临时目录(没有 package.json)运行 npx -y [email protected] send --help 确认安装/CLI 入口点正常工作。
  • 发布/分享 release notes。

Plugin 发布范围 (npm)

我们只发布 @openclaw/* scope 下已存在的 npm plugins。未在 npm 上的捆绑 plugins 保持仅磁盘树(仍然在 extensions/** 中发布)。

获取列表的流程:

  1. npm search @openclaw --json 并捕获包名。
  2. extensions/*/package.json 名称比较。
  3. 只发布交集(已在 npm 上的)。

当前 npm plugin 列表(根据需要更新):

  • @openclaw/bluebubbles
  • @openclaw/diagnostics-otel
  • @openclaw/discord
  • @openclaw/lobster
  • @openclaw/matrix
  • @openclaw/msteams
  • @openclaw/nextcloud-talk
  • @openclaw/nostr
  • @openclaw/voice-call
  • @openclaw/zalo
  • @openclaw/zalouser

Release notes 还必须指出默认未启用新可选捆绑 plugins(例如:tlon)。