發行檢查清單(npm + macOS)
從 repo 根目錄使用pnpm,預設使用 Node 24。Node 22 LTS 目前為 22.16+,仍可支援相容性。標記/發佈前保持工作樹清潔。
操作員觸發
當操作員說「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 金鑰。
版本控制
OpenClaw 目前發佈使用日期型版本控制。- 穩定版本:
YYYY.M.D- Git 標籤:
vYYYY.M.D - Repo 歷史範例:
v2026.2.26、v2026.3.8
- Git 標籤:
- Beta 預發佈版本:
YYYY.M.D-beta.N- Git 標籤:
vYYYY.M.D-beta.N - Repo 歷史範例:
v2026.2.15-beta.1、v2026.3.8-beta.1
- Git 標籤:
- 到處使用相同的版本字串,減去不使用 Git 標籤的地方的開頭
v:package.json:2026.3.8- Git 標籤:
v2026.3.8 - GitHub 發佈標題:
openclaw 2026.3.8
- 不使用零填充月或日。使用
2026.3.8,而不是2026.03.08。 - 穩定版和 beta 版是 npm dist-tags,而不是獨立的發佈線:
latest= 穩定版beta= 預發佈/測試版
- Dev 是
main的移動 head,而不是普通的 git 標籤發佈。 - 發佈工作流強制執行目前穩定/beta 標籤格式,並拒絕 CalVer 日期距發佈日期超過 2 個 UTC 日曆天的版本。
- 舊標籤如
v2026.1.11-1、v2026.2.6-3和v2.0.0-beta2存在於 repo 歷史中。 - 將這些視為遺留標籤模式。新發佈應使用
vYYYY.M.D進行穩定版本,使用vYYYY.M.D-beta.N進行 beta 版本。
- 版本 & 元資料
- 更新
package.json版本(例如2026.1.29)。 - 執行
pnpm plugins:sync以對齊擴充套件包版本 + 變更日誌。 - 更新 CLI/版本字串在
src/version.ts和src/web/session.ts中的 Baileys 使用者代理。 - 確認套件元資料(名稱、描述、儲存庫、關鍵字、授權)並且
bin對應指向openclaw.mjs作為openclaw。 - 如果依賴項已變更,執行
pnpm install使pnpm-lock.yaml為最新。
- 構建 & 成品
- 如果 A2UI 輸入已變更,執行
pnpm canvas:a2ui:bundle並提交任何已更新的src/canvas-host/a2ui/a2ui.bundle.js。 -
pnpm run build(重新產生dist/)。 - 驗證 npm 套件
files包含所有必要的dist/*資料夾(特別是dist/node-host/**和dist/acp/**用於無頭 node + ACP CLI)。 - 確認
dist/build-info.json存在並包含預期的commit雜湊(CLI 橫幅對 npm 安裝使用此項)。 - 選擇性:在構建後執行
npm pack --pack-destination /tmp;檢查 tarball 內容並將其保留在 GitHub 發佈的手邊(不要提交它)。
- 變更日誌 & 文件
- 使用使用者面向的亮點更新
CHANGELOG.md(如果遺留,請建立檔案);保持條目嚴格按版本降序排列。 - 確保 README 範例/標誌與目前 CLI 行為相符(特別是新命令或選項)。
- 驗證
-
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進行安裝前步驟。
- 如果立即先前的 npm 發佈已知為損壞,設定
- (選擇性)完整安裝程式煙霧(新增非根 + 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(需要兩個金鑰;執行兩個提供者)
- (選擇性)如果您的變更影響傳送/接收路徑,點檢 web 閘道。
- macOS app(Sparkle)
- 構建 + 簽署 macOS app,然後壓縮它以供發佈。
- 產生 Sparkle appcast(HTML 備註透過
scripts/make_appcast.sh)並更新appcast.xml。 - 保持 app zip(和選擇性的 dSYM zip)準備好附加到 GitHub 發佈。
- 遵循 macOS 發佈 的確切命令和必要環境變數。
APP_BUILD必須是數值 + 單調的(無-beta),以便 Sparkle 正確比較版本。- 如果進行公証,使用從 App Store Connect API 環境變數建立的
openclaw-notary鑰匙圈設定檔(參見 macOS 發佈)。
- 發佈(npm)
- 確認 git 狀態乾淨;視需要提交並推送。
- 確認為
openclaw套件配置了 npm 受信任發佈。 - 推送相符的 git 標籤以觸發
.github/workflows/openclaw-npm-release.yml。- 穩定標籤發佈到 npm
latest。 - Beta 標籤發佈到 npm
beta。 - 工作流拒絕與
package.json不符、不在main上或 CalVer 日期距發佈日期超過 2 個 UTC 日曆天的標籤。
- 穩定標籤發佈到 npm
- 驗證登錄:
npm view openclaw version、npm view openclaw dist-tags和npx -y openclaw@X.Y.Z --version(或--help)。
故障排除(來自 2.0.0-beta2 發佈的備註)
- npm pack/publish 掛起或產生巨大 tarball:
dist/OpenClaw.app中的 macOS app bundle(和發佈 zip)被掃入套件中。透過package.jsonfiles白名單發佈內容以修復(包含 dist 子目錄、文件、技能;排除 app 束)。使用npm pack --dry-run確認dist/OpenClaw.app未列出。 - npm 驗證 dist-tags 的 web 迴圈:使用舊版驗證以取得 OTP 提示:
NPM_CONFIG_AUTH_TYPE=legacy npm dist-tag add openclaw@X.Y.Z latest
npx驗證失敗,出現ECOMPROMISED: Lock compromised:使用全新快取重試:NPM_CONFIG_CACHE=/tmp/npm-cache-$(date +%s) npx -y openclaw@X.Y.Z --version
- 標籤需要在晚期修復後重新指向:強制更新並推送標籤,然後確保 GitHub 發佈資產仍然相符:
git tag -f vX.Y.Z && git push -f origin vX.Y.Z
- GitHub 發佈 + appcast
- 標籤並推送:
git tag vX.Y.Z && git push origin vX.Y.Z(或git push --tags)。- 推送標籤也觸發 npm 發佈工作流。
- 為
vX.Y.Z建立/刷新 GitHub 發佈,標題為openclaw X.Y.Z(不只是標籤);正文應包含該版本的 完整變更日誌區段(亮點 + 變更 + 修復),內聯(無裸連結),並且 必須不重複正文內的標題。 - 附加成品:
npm packtarball(選擇性)、OpenClaw-X.Y.Z.zip和OpenClaw-X.Y.Z.dSYM.zip(如果產生)。 - 提交已更新的
appcast.xml並推送它(Sparkle 從 main 饋送)。 - 從乾淨的臨時目錄(無
package.json),執行npx -y openclaw@X.Y.Z send --help以確認安裝/CLI 進入點有效。 - 宣佈/分享發佈備註。
外掛發佈範圍(npm)
我們只發佈@openclaw/* 範圍下的 現有 npm 外掛。未在 npm 上的束外掛保持 磁碟樹僅有(仍在 extensions/** 中發佈)。
導出清單的流程:
npm search @openclaw --json並捕捉套件名稱。- 與
extensions/*/package.json名稱進行比較。 - 僅發佈 交集(已在 npm 上)。
- @openclaw/bluebubbles
- @openclaw/diagnostics-otel
- @openclaw/discord
- @openclaw/feishu
- @openclaw/lobster
- @openclaw/matrix
- @openclaw/msteams
- @openclaw/nextcloud-talk
- @openclaw/nostr
- @openclaw/voice-call
- @openclaw/zalo
- @openclaw/zalouser
tlon)。