openclaw-release-maintainer
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOpenClaw Release Maintainer
OpenClaw 发布维护指南
Use this skill for release and publish-time workflow. Keep ordinary development changes and GHSA-specific advisory work outside this skill.
本指南适用于发布及发布阶段工作流,普通开发改动和GHSA专属安全公告相关工作不在本指南适用范围内。
Respect release guardrails
遵守发布防护规则
- Do not change version numbers without explicit operator approval.
- Ask permission before any npm publish or release step.
- This skill should be sufficient to drive the normal release flow end-to-end.
- Use the private maintainer release docs for credentials, recovery steps, and mac signing/notary specifics, and use for public policy.
docs/reference/RELEASING.md - Core publish is manual
openclaw; creating or pushing a tag does not publish by itself.workflow_dispatch
- 未经运营人员明确批准,不得修改版本号。
- 执行任何 npm publish 或发布步骤前需先申请权限。
- 本指南足以覆盖正常发布流程的全链路需求。
- 凭证、恢复步骤、mac 签名/公证相关细节请参考私有维护者发布文档,公共发布规则请参考 。
docs/reference/RELEASING.md - 核心 发布需手动触发
openclaw,仅创建或推送标签不会自动触发发布。workflow_dispatch
Keep release channel naming aligned
统一发布渠道命名规则
- : tagged releases only, with npm dist-tag
stablelatest - : prerelease tags like
beta, with npm dist-tagvYYYY.M.D-beta.Nbeta - Prefer ; do not mint new
-beta.Nor-1beta suffixes-2 - : moving head on
devmain - When using a beta Git tag, publish npm with the matching beta version suffix so the plain version is not consumed or blocked
- :仅含打标签的正式版本,npm dist-tag 为
stablelatest - :预发布标签格式为
beta,npm dist-tag 为vYYYY.M.D-beta.Nbeta - 优先使用 后缀,不要新增
-beta.N或-1这类 beta 后缀格式-2 - :对应
dev分支的最新头部提交main - 使用 beta 版 Git 标签时,npm 发布版本需要携带对应的 beta 后缀,避免无后缀的纯版本号被意外拉取或占用。
Handle versions and release files consistently
统一处理版本和发布文件
- Version locations include:
package.jsonapps/android/app/build.gradle.ktsapps/ios/Sources/Info.plistapps/ios/Tests/Info.plistapps/macos/Sources/OpenClaw/Resources/Info.plistdocs/install/updating.md- Peekaboo Xcode project and plist version fields
- Before creating a release tag, make every version location above match the version encoded by that tag.
- For fallback correction tags like , the repo version locations still stay at
vYYYY.M.D-N.YYYY.M.D - “Bump version everywhere” means all version locations above except .
appcast.xml - Release signing and notary credentials live outside the repo in the private maintainer docs.
- Every OpenClaw release ships the npm package and macOS app together.
- The production Sparkle feed lives at , and the canonical published file is
https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xmlonappcast.xmlin themainrepo.openclaw - That shared production Sparkle feed is stable-only. Beta mac releases may
upload assets to the GitHub prerelease, but they must not replace the shared
unless a separate beta feed exists.
appcast.xml - For fallback correction tags like , the repo version still stays at
vYYYY.M.D-N, but the mac release must use a strictly higher numericYYYY.M.D/ Sparkle build than the original release so existing installs see it as newer.APP_BUILD
版本号需同步更新到以下位置:
package.jsonapps/android/app/build.gradle.ktsapps/ios/Sources/Info.plistapps/ios/Tests/Info.plistapps/macos/Sources/OpenClaw/Resources/Info.plistdocs/install/updating.md- Peekaboo Xcode 项目和 plist 版本字段
- 创建发布标签前,需确保上述所有位置的版本号和标签携带的版本号完全一致。
- 对于 这类修复补丁标签,仓库内上述版本位置仍保留
vYYYY.M.D-N即可。YYYY.M.D - “全量更新版本号”指更新上述所有位置的版本号,除外。
appcast.xml - 发布签名和公证凭证存放在仓库外的私有维护者文档中。
- 所有OpenClaw发布都会同步推送npm包和macOS应用。
- 生产环境Sparkle feed地址为 ,官方发布的
https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml文件存放在appcast.xml仓库的openclaw分支。main - 上述共享的生产Sparkle feed仅用于稳定版。Beta版macOS发布可以将资源上传到GitHub预发布版本中,但除非存在独立的beta feed,否则不得替换共享的文件。
appcast.xml - 对于 这类修复补丁标签,仓库版本仍保留
vYYYY.M.D-N,但mac发布必须使用比原始版本数值更高的YYYY.M.D/Sparkle build号,确保现有安装包能识别到更新。APP_BUILD
Build changelog-backed release notes
基于更新日志生成发布说明
- Changelog entries should be user-facing, not internal release-process notes.
- When cutting a mac release with a beta GitHub prerelease:
- tag from the release commit
vYYYY.M.D-beta.N - create a prerelease titled
openclaw YYYY.M.D-beta.N - use release notes from the matching version section
CHANGELOG.md - attach at least the zip and dSYM zip, plus dmg if available
- tag
- Keep the top version entries in sorted by impact:
CHANGELOG.md- first
### Changes - deduped with user-facing fixes first
### Fixes
- 更新日志条目应当面向用户,不要包含内部发布流程相关的记录。
- 发布beta版macOS应用到GitHub预发布版本时:
- 基于发布 commit 打标签
vYYYY.M.D-beta.N - 创建标题为 的预发布版本
openclaw YYYY.M.D-beta.N - 发布说明使用中对应版本章节的内容
CHANGELOG.md - 至少上传zip包和dSYM zip包,如有dmg包也一并上传
- 基于发布 commit 打标签
- 中最新版本的条目按影响优先级排序:
CHANGELOG.md- 优先放 章节
### Changes - 章节去重后,优先放面向用户的修复内容
### Fixes
- 优先放
Run publish-time validation
执行发布前验证
Before tagging or publishing, run:
bash
node --import tsx scripts/release-check.ts
pnpm release:check
pnpm test:install:smokeFor a non-root smoke path:
bash
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smokeAfter npm publish, run:
bash
node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>- This verifies the published registry install path in a fresh temp prefix.
- For stable correction releases like , it also verifies the upgrade path from
YYYY.M.D-NtoYYYY.M.Dso a correction publish cannot silently leave existing global installs on the old base stable payload.YYYY.M.D-N
打标签或发布前,执行以下命令:
bash
node --import tsx scripts/release-check.ts
pnpm release:check
pnpm test:install:smoke非root权限冒烟测试执行以下命令:
bash
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smokenpm发布完成后,执行以下命令:
bash
node --import tsx scripts/openclaw-npm-postpublish-verify.ts <published-version>- 该命令会在全新的临时目录下验证发布到Registry的安装路径是否正常。
- 对于 这类稳定版修复补丁,还会验证从
YYYY.M.D-N升级到YYYY.M.D的路径是否正常,避免修复发布后现有全局安装的版本仍停留在旧的稳定版。YYYY.M.D-N
Check all relevant release builds
检查所有相关发布构建产物
- Always validate the OpenClaw npm release path before creating the tag.
- Default release checks:
pnpm checkpnpm buildnode --import tsx scripts/release-check.tspnpm release:checkOPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke
- Check all release-related build surfaces touched by the release, not only the npm package.
- Include mac release readiness in preflight by running the public validation
workflow in and the real mac preflight in
openclaw/openclawfor every release.openclaw/releases-private - Treat the update on
appcast.xmlas part of mac release readiness, not an optional follow-up.main - The workflows remain tag-based. The agent is responsible for making sure preflight runs complete successfully before any publish run starts.
- Any fix after preflight means a new commit. Delete and recreate the tag and matching GitHub release from the fixed commit, then rerun preflight from scratch before publishing.
- For stable mac releases, generate the signed before uploading public release assets so the updater feed cannot lag the published binaries.
appcast.xml - Serialize stable appcast-producing runs across tags so two releases do not
generate replacement files from the same stale seed.
appcast.xml - For stable releases, confirm the latest beta already passed the broader release workflows before cutting stable.
- If any required build, packaging step, or release workflow is red, do not say the release is ready.
- 创建标签前必须验证OpenClaw npm发布路径是否正常。
- 默认发布检查项:
pnpm checkpnpm buildnode --import tsx scripts/release-check.tspnpm release:checkOPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke
- 检查本次发布涉及的所有发布相关构建产物,不要仅检查npm包。
- 发布前预检需包含macOS发布就绪检查:每次发布都要运行仓库中的公共验证工作流,以及
openclaw/openclaw仓库中的正式mac预检工作流。openclaw/releases-private - 分支的
main更新属于macOS发布就绪检查的一部分,不是可选的后续步骤。appcast.xml - 工作流仍基于标签触发,Agent需要确保所有预检步骤成功完成后再启动发布流程。
- 预检后如果有任何修复,需要产生新的commit,删除原有标签和对应的GitHub发布版本,基于修复后的commit重新创建标签和发布版本,发布前重新完整执行所有预检步骤。
- 稳定版macOS发布需要先生成签名后的再上传公开发布资源,避免更新 feed 滞后于已发布的二进制文件。
appcast.xml - 不同标签的稳定版appcast生成任务需要串行执行,避免两个发布任务基于同一个旧的基准生成冲突的文件。
appcast.xml - 稳定版发布前,需确认最新的beta版本已经通过了所有全量发布工作流校验。
- 如果有任何必填构建、打包步骤或发布工作流失败,不得声明发布已就绪。
Use the right auth flow
使用正确的鉴权流程
- OpenClaw publish uses GitHub trusted publishing.
- The publish run must be started manually with .
workflow_dispatch - The npm workflow and the private mac publish workflow accept
to run validation/build/package steps without uploading public release assets.
preflight_only=true - The private mac workflow also accepts for branch-safe workflow smoke tests that use ad-hoc signing, skip notarization, skip shared appcast generation, and do not prove release readiness.
smoke_test_only=true - on the npm workflow is also the right way to validate an existing tag after publish; it should keep running the build checks even when the npm version is already published.
preflight_only=true - Validation-only runs may be dispatched from a branch when you are testing a workflow change before merge.
- in
.github/workflows/macos-release.ymlis now a public validation-only handoff. It validates the tag/release state and points operators to the private repo; it does not build or publish macOS artifacts.openclaw/openclaw - Real mac preflight and real mac publish both use
.
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml - The private mac workflow runs on GitHub's xlarge macOS runner and uses a SwiftPM cache because the Swift build/test/package path is CPU-heavy.
- Private mac preflight uploads notarized build artifacts as workflow artifacts instead of uploading public GitHub release assets.
- Private smoke-test runs upload ad-hoc, non-notarized build artifacts as
workflow artifacts and intentionally skip stable generation.
appcast.xml - npm preflight, public mac validation, and private mac preflight must all pass before any real publish run starts.
- Real publish runs must be dispatched from ; branch-dispatched publish attempts should fail before the protected environment is reached.
main - The release workflows stay tag-based; rely on the documented release sequence rather than workflow-level SHA pinning.
- The environment must be approved by
npm-releasebefore publish continues.@openclaw/openclaw-release-managers - Mac publish uses
for build, signing, notarization, packaged mac artifact generation, and stable-feed
openclaw/releases-private/.github/workflows/openclaw-macos-publish.ymlartifact generation.appcast.xml - Real private mac publish uploads the packaged ,
.zip, and.dmgassets to the existing GitHub release in.dSYM.zipautomatically whenopenclaw/openclawis present in the private repoOPENCLAW_PUBLIC_REPO_RELEASE_TOKENenvironment.mac-release - For stable releases, the agent must also download the signed
artifact from the successful private mac workflow and then update
macos-appcast-<tag>onappcast.xml.main - For beta mac releases, do not update the shared production unless a separate beta Sparkle feed exists.
appcast.xml - The private repo targets a dedicated environment. If the GitHub plan does not yet support required reviewers there, do not assume the environment alone is the approval boundary; rely on private repo access and CODEOWNERS until those settings can be enabled.
mac-release - Do not use or the plugin OTP flow for OpenClaw releases.
NPM_TOKEN - plugin publishes use a separate maintainer-only flow.
@openclaw/* - Only publish plugins that already exist on npm; bundled disk-tree-only plugins stay unpublished.
- OpenClaw发布使用GitHub可信发布机制。
- 发布任务必须手动触发启动。
workflow_dispatch - npm工作流和私有mac发布工作流支持传入参数,仅运行验证/构建/打包步骤,不上传公开发布资源。
preflight_only=true - 私有mac工作流还支持传入参数,用于分支安全的工作流冒烟测试,该模式下使用临时签名,跳过公证、共享appcast生成,不代表发布已就绪。
smoke_test_only=true - npm工作流设置也可以用于发布后验证已有标签,即使npm版本已经发布,仍会继续运行构建检查。
preflight_only=true - 测试工作流改动时,可以基于分支触发仅验证的运行任务,无需合并代码。
- 仓库中的
openclaw/openclaw现在仅用于公共验证,它会验证标签/发布状态,指引运营人员访问私有仓库,不会构建或发布macOS产物。.github/workflows/macos-release.yml - 正式的mac预检和mac发布都使用。
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml - 私有mac工作流运行在GitHub的xlarge macOS runner上,使用SwiftPM缓存,因为Swift构建/测试/打包路径CPU占用很高。
- 私有mac预检会将公证后的构建产物作为工作流产物上传,不会上传到GitHub公开发布资源中。
- 私有冒烟测试运行会将未公证的临时签名构建产物作为工作流产物上传,会主动跳过稳定版生成。
appcast.xml - 正式发布启动前,npm预检、公共mac验证、私有mac预检必须全部通过。
- 正式发布任务必须基于分支触发,基于分支触发的发布尝试会在到达受保护环境前失败。
main - 发布工作流基于标签触发,请遵循文档中的发布序列,不要依赖工作流层面的SHA锁定。
- 发布继续前,环境需要得到
npm-release的审批。@openclaw/openclaw-release-managers - macOS发布使用完成构建、签名、公证、mac打包产物生成、稳定版feed的
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml产物生成。appcast.xml - 当私有仓库环境中存在
mac-release时,正式的私有mac发布任务会自动将打包后的OPENCLAW_PUBLIC_REPO_RELEASE_TOKEN、.zip和.dmg资源上传到.dSYM.zip仓库中已有的GitHub发布版本中。openclaw/openclaw - 稳定版发布时,Agent还需要从成功的私有mac工作流中下载签名后的产物,然后更新
macos-appcast-<tag>分支的main。appcast.xml - beta版macOS发布时,除非存在独立的beta Sparkle feed,否则不要更新共享的生产。
appcast.xml - 私有仓库指向专属的环境,如果GitHub计划暂不支持该环境的必需审核者设置,不要仅依赖环境作为审批边界,在相关设置启用前,请依赖私有仓库访问权限和CODEOWNERS规则进行管控。
mac-release - OpenClaw发布不要使用或插件OTP流程。
NPM_TOKEN - 插件发布使用单独的维护者专属流程。
@openclaw/* - 仅发布npm上已存在的插件,仅存于本地disk-tree的捆绑插件不要发布。
Fallback local mac publish
备选本地mac发布流程
- Keep the original local macOS publish workflow available as a fallback in case CI/CD mac publishing is unavailable or broken.
- Preserve the existing maintainer workflow Peter uses: run it on a real Mac with local signing, notary, and Sparkle credentials already configured.
- Follow the private maintainer macOS runbook for the local steps:
to build, sign, notarize, and package the app; manual GitHub release asset upload; then
scripts/package-mac-dist.shplus thescripts/make_appcast.shcommit toappcast.xml.main - now fails closed for release builds if the bundled app comes out with a debug bundle id, an empty Sparkle feed URL, or a
scripts/package-mac-dist.shbelow the canonical Sparkle build floor for that short version. For correction tags, set a higher explicitCFBundleVersion.APP_BUILD - first uses
scripts/make_appcast.shfromgenerate_appcast, then falls back to the SwiftPM Sparkle tool output underPATH.apps/macos/.build - For stable tags, the local fallback may update the shared production
.
appcast.xml - For beta tags, the local fallback still publishes the mac assets but must not
update the shared production unless a separate beta feed exists.
appcast.xml - Treat the local workflow as fallback only. Prefer the CI/CD publish workflow when it is working.
- After any stable mac publish, verify all of the following before you call the
release finished:
- the GitHub release has ,
.zip, and.dmgassets.dSYM.zip - on
appcast.xmlpoints at the new stable zipmain - the packaged app reports the expected short version and a numeric
at or above the canonical Sparkle build floor
CFBundleVersion
- the GitHub release has
- 保留原有的本地macOS发布工作流作为备选,应对CI/CD mac发布不可用或故障的场景。
- 保留Peter使用的现有维护者工作流:在真实Mac设备上运行,本地已配置好签名、公证和Sparkle凭证。
- 本地步骤请遵循私有维护者macOS操作手册:运行完成应用构建、签名、公证和打包;手动上传GitHub发布资源;然后运行
scripts/package-mac-dist.sh并将scripts/make_appcast.sh提交到appcast.xml分支。main - 如果打包后的应用使用了调试bundle id、Sparkle feed URL为空、或低于对应短版本的官方Sparkle build最低值,
CFBundleVersion在发布构建时会主动失败。对于补丁标签,请显式设置更高的scripts/package-mac-dist.sh。APP_BUILD - 会优先使用
scripts/make_appcast.sh中的PATH, fallback 到generate_appcast下的SwiftPM Sparkle工具输出。apps/macos/.build - 稳定版标签的本地备选发布可以更新共享的生产。
appcast.xml - beta版标签的本地备选发布仍可以发布mac资源,但除非存在独立的beta feed,否则不得更新共享的生产。
appcast.xml - 本地工作流仅作为备选,CI/CD发布工作流正常时优先使用CI/CD流程。
- 任何稳定版mac发布完成后,声明发布结束前请验证以下所有项:
- GitHub发布版本包含、
.zip和.dmg资源.dSYM.zip - 分支的
main指向新的稳定版zip包appcast.xml - 打包后的应用显示的短版本符合预期,且数值型不低于官方Sparkle build最低值
CFBundleVersion
- GitHub发布版本包含
Run the release sequence
执行发布序列
- Confirm the operator explicitly wants to cut a release.
- Choose the exact target version and git tag.
- Make every repo version location match that tag before creating it.
- Update and assemble the matching GitHub release notes.
CHANGELOG.md - Run the full preflight for all relevant release builds, including mac readiness.
- Confirm the target npm version is not already published.
- Create and push the git tag.
- Create or refresh the matching GitHub release.
- Start with
.github/workflows/openclaw-npm-release.ymland wait for it to pass.preflight_only=true - Start in
.github/workflows/macos-release.ymland wait for the public validation-only run to pass.openclaw/openclaw - Start
with
openclaw/releases-private/.github/workflows/openclaw-macos-publish.ymland wait for it to pass.preflight_only=true - If any preflight or validation run fails, fix the issue on a new commit, delete the tag and matching GitHub release, recreate them from the fixed commit, and rerun all relevant preflights from scratch before continuing. Never reuse old preflight results after the commit changes.
- Start with the same tag for the real publish.
.github/workflows/openclaw-npm-release.yml - Wait for approval from
npm-release.@openclaw/openclaw-release-managers - Start
for the real publish and wait for success.
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml - Verify the successful real private mac run uploaded the ,
.zip, and.dmgartifacts to the existing GitHub release in.dSYM.zip.openclaw/openclaw - For stable releases, download from the successful private mac run, update
macos-appcast-<tag>onappcast.xml, and verify the feed.main - For beta releases, publish the mac assets but expect no shared production
artifact and do not update the shared production feed unless a separate beta feed exists.
appcast.xml - After publish, verify npm and the attached release artifacts.
- 确认运营人员明确要求发起发布。
- 确定准确的目标版本和git标签。
- 创建标签前,确保仓库内所有版本位置的版本号和标签匹配。
- 更新,整理对应的GitHub发布说明。
CHANGELOG.md - 为所有相关发布构建运行全量预检,包括macOS就绪检查。
- 确认目标npm版本尚未发布。
- 创建并推送git标签。
- 创建或更新对应的GitHub发布版本。
- 启动,设置
.github/workflows/openclaw-npm-release.yml,等待运行通过。preflight_only=true - 启动仓库中的
openclaw/openclaw,等待公共验证任务运行通过。.github/workflows/macos-release.yml - 启动,设置
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml,等待运行通过。preflight_only=true - 如果任何预检或验证任务失败,在新的commit上修复问题,删除标签和对应的GitHub发布版本,基于修复后的commit重新创建标签和发布版本,继续流程前重新完整运行所有相关预检。commit变更后绝对不要复用旧的预检结果。
- 基于相同标签启动执行正式发布。
.github/workflows/openclaw-npm-release.yml - 等待审批
@openclaw/openclaw-release-managers环境。npm-release - 启动执行正式发布,等待运行成功。
openclaw/releases-private/.github/workflows/openclaw-macos-publish.yml - 验证正式私有mac运行任务已将、
.zip和.dmg资源上传到.dSYM.zip仓库中对应的GitHub发布版本。openclaw/openclaw - 稳定版发布时,从成功的私有mac运行任务中下载,更新
macos-appcast-<tag>分支的main并验证feed。appcast.xml - beta版发布时,发布mac资源即可,不会生成共享生产产物,除非存在独立的beta feed,否则不要更新共享生产feed。
appcast.xml - 发布完成后,验证npm包和所有关联的发布资源是否正常。
GHSA advisory work
GHSA公告相关工作
- Use for GHSA advisory inspection, patch/publish flow, private-fork validation, and GHSA API-specific publish checks.
openclaw-ghsa-maintainer
- GHSA公告检查、补丁/发布流程、私有fork验证、GHSA API专属发布检查请使用工作流。
openclaw-ghsa-maintainer