เช็กลิสต์การรีลีส (npm + macOS)¶
ใช้ pnpm (Node 22+) จากรากของรีโป ใช้ pnpm (Node 22+) จากรากของรีโป ตรวจสอบให้แน่ใจว่า working tree สะอาดก่อนการแท็ก/เผยแพร่
ทริกเกอร์ของผู้ปฏิบัติการ¶
เมื่อโอเปอเรเตอร์พูดว่า “release” ให้ทำ preflight นี้ทันที (ไม่ถามคำถามเพิ่มเติมเว้นแต่ติดขัด):
- อ่านเอกสารนี้และ
docs/platforms/mac/release.md. - โหลด env จาก
~/.profileและยืนยันว่าได้ตั้งค่าSPARKLE_PRIVATE_KEY_FILE+ ตัวแปร App Store Connect แล้ว (ไฟล์ SPARKLE_PRIVATE_KEY_FILE ควรอยู่ใน~/.profile). - ใช้คีย์ Sparkle จาก
~/Library/CloudStorage/Dropbox/Backup/Sparkleหากจำเป็น
- เวอร์ชันและเมทาดาทา
- [ ] เพิ่มเวอร์ชัน
package.json(เช่น2026.1.29). - [ ] รัน
pnpm plugins:syncเพื่อจัดแนวเวอร์ชันแพ็กเกจส่วนขยาย + changelog ให้ตรงกัน - [ ] อัปเดตสตริง CLI/เวอร์ชัน:
src/cli/program.tsและ user agent ของ Baileys ในsrc/provider-web.ts. - [ ] ยืนยันเมทาดาทาแพ็กเกจ (name, description, repository, keywords, license) และตรวจสอบว่า map ของ
binชี้ไปที่openclaw.mjsสำหรับopenclaw. - [ ] หากมีการเปลี่ยนแปลง dependencies ให้รัน
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/**สำหรับโหนดแบบ headless + ACP CLI) - [ ] ยืนยันว่า
dist/build-info.jsonมีอยู่และมีแฮชcommitตามที่คาดไว้ (แบนเนอร์ CLI ใช้สิ่งนี้สำหรับการติดตั้งผ่าน npm) - [ ] ทางเลือก:
npm pack --pack-destination /tmpหลังการบิลด์; ตรวจสอบเนื้อหาใน tarball และเก็บไว้สำหรับ GitHub release (อย่าคอมมิต)
- Changelog และเอกสาร
- [ ] อัปเดต
CHANGELOG.mdด้วยไฮไลต์ที่ผู้ใช้เห็นได้ (สร้างไฟล์หากยังไม่มี); จัดลำดับรายการจากเวอร์ชันใหม่ไปเก่าอย่างเคร่งครัด - [ ] ตรวจสอบให้แน่ใจว่าตัวอย่าง/แฟล็กใน README ตรงกับพฤติกรรม CLI ปัจจุบัน (โดยเฉพาะคำสั่งหรือออปชันใหม่)
- การตรวจสอบความถูกต้อง
- [ ]
pnpm build - [ ]
pnpm check - [ ]
pnpm test(หรือpnpm test:coverageหากต้องการเอาต์พุต coverage) - [ ]
pnpm release:check(ตรวจสอบเนื้อหา npm pack) - [ ]
OPENCLAW_INSTALL_SMOKE_SKIP_NONROOT=1 pnpm test:install:smoke(ทดสอบติดตั้ง Docker แบบ smoke test, fast path; ต้องทำก่อนรีลีส) - หากรีลีส npm ก่อนหน้าทันทีทราบว่าพัง ให้ตั้งค่า
OPENCLAW_INSTALL_SMOKE_PREVIOUS=<last-good-version>หรือOPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS=1สำหรับขั้นตอน preinstall - [ ] (ทางเลือก) Smoke ของตัวติดตั้งแบบเต็ม (เพิ่มการครอบคลุม non-root + CLI):
pnpm test:install:smoke - [ ] (ทางเลือก) Installer E2E (Docker, รัน
curl -fsSL https://openclaw.ai/install.sh | bash, ทำ onboarding แล้วเรียกเครื่องมือจริง): pnpm test:install:e2e:openai(ต้องใช้OPENAI_API_KEY)pnpm test:install:e2e:anthropic(ต้องใช้ANTHROPIC_API_KEY)pnpm test:install:e2e(ต้องใช้ทั้งสองคีย์; รันผู้ให้บริการทั้งคู่)- [ ] (ทางเลือก) ตรวจเช็ค web gateway แบบสุ่ม หากการเปลี่ยนแปลงของคุณกระทบเส้นทางส่ง/รับ
- แอปmacOS (Sparkle)
- [ ] บิลด์และเซ็นแอปmacOS จากนั้น zip เพื่อแจกจ่าย
- [ ] สร้าง Sparkle appcast (โน้ต HTML ผ่าน
scripts/make_appcast.sh) และอัปเดตappcast.xml - [ ] เก็บไฟล์ zip ของแอป (และ zip dSYM หากมี) ไว้เพื่อแนบกับ GitHub release
- [ ] ทำตาม macOS release สำหรับคำสั่งที่ถูกต้องและตัวแปร env ที่จำเป็น
APP_BUILDต้องเป็นตัวเลขและเพิ่มขึ้นแบบ monotonic (ไม่มี-beta) เพื่อให้ Sparkle เปรียบเทียบเวอร์ชันได้ถูกต้อง- หากทำ notarize ให้ใช้โปรไฟล์ keychain
openclaw-notaryที่สร้างจากตัวแปร env ของ App Store Connect API (ดู macOS release)
- เผยแพร่ (npm)
- [ ] ยืนยันว่า git status สะอาด; คอมมิตและพุชตามความจำเป็น
- [ ]
npm login(ยืนยัน 2FA) หากจำเป็น - [ ]
npm publish --access public(ใช้--tag betaสำหรับ pre-release) - [ ] ตรวจสอบ registry:
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 ขนาดใหญ่มาก: บันเดิลแอปmacOS ใน
dist/OpenClaw.app(และไฟล์ zip ของรีลีส) ถูกดึงเข้าแพ็กเกจ แก้ไขโดย whitelist เนื้อหาที่เผยแพร่ผ่านpackage.jsonfiles(รวม dist subdirs, docs, skills; ตัด app bundles ออก) ตรวจสอบด้วยnpm pack --dry-runว่าไม่มีdist/OpenClaw.appแสดงอยู่ แก้ไขโดยการ whitelist เนื้อหาที่เผยแพร่ผ่านpackage.jsonfiles(รวมไดเรกทอรี dist, docs, skills; ไม่รวม app bundles) ยืนยันด้วยnpm pack --dry-runว่าdist/OpenClaw.appไม่ถูกแสดงรายการ - npm auth web วนลูปสำหรับ dist-tags: ใช้ legacy auth เพื่อให้มีการขอ 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 release ยังตรงกัน:
git tag -f vX.Y.Z && git push -f origin vX.Y.Z
- GitHub release + appcast
- [ ] แท็กและพุช:
git tag vX.Y.Z && git push origin vX.Y.Z(หรือgit push --tags) - [ ] สร้าง/รีเฟรช GitHub release สำหรับ
vX.Y.Zโดยมี ชื่อopenclaw X.Y.Z(ไม่ใช่แค่แท็ก); เนื้อหาควรรวมส่วน changelog ทั้งหมด สำหรับเวอร์ชันนั้น (Highlights + Changes + Fixes) แบบฝังในตัว (ไม่มีลิงก์เปล่า) และ ต้องไม่ซ้ำชื่อเรื่องภายในเนื้อหา - [ ] แนบอาร์ติแฟกต์: tarball
npm pack(ทางเลือก),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)¶
เราจะเผยแพร่เฉพาะ ปลั๊กอิน npm ที่มีอยู่แล้ว ภายใต้สโคป @openclaw/* เราจะเผยแพร่เฉพาะ ปลั๊กอิน npm ที่มีอยู่แล้ว ภายใต้สโคป @openclaw/* เท่านั้น ปลั๊กอินที่บันเดิลมาแต่ไม่ได้อยู่บน npm จะคงเป็น disk-tree only (ยังคงถูกส่งมอบใน extensions/**).
กระบวนการเพื่อหาไลสต์:
npm search @openclaw --jsonและบันทึกชื่อแพ็กเกจ- เปรียบเทียบกับชื่อใน
extensions/*/package.json - เผยแพร่เฉพาะ ส่วนตัดกัน (ที่อยู่บน npm แล้ว)
รายการปลั๊กอิน 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).