릴리스 체크리스트 (npm + macOS)
리포지토리 루트에서pnpm (Node 22+)을 사용하세요. 태그/게시 전에 작업 트리를 깨끗하게 유지하세요.
운영자 트리거
운영자가 “릴리스”라고 말할 때, 즉시 이 사전 점검을 수행하세요 (차단되는 경우를 제외하고 추가 질문 없이):- 이 문서와
docs/platforms/mac/release.md를 읽으세요. ~/.profile에서 환경을 로드하고SPARKLE_PRIVATE_KEY_FILE+ App Store Connect 변수들이 설정되어 있는지 확인하세요 (SPARKLE_PRIVATE_KEY_FILE은~/.profile에 있어야 합니다).- 필요하다면
~/Library/CloudStorage/Dropbox/Backup/Sparkle에서 Sparkle 키를 사용하세요.
- 버전 및 메타데이터
-
package.json버전 올리기 (예:2026.1.29). -
pnpm plugins:sync를 실행하여 확장 패키지 버전 및 변경 로그를 정렬합니다. - CLI / 버전 문자열 업데이트:
src/cli/program.ts및 Baileys 사용자 에이전트를src/provider-web.ts에서 업데이트합니다. - 패키지 메타데이터(이름, 설명, 리포지토리, 키워드, 라이선스) 및
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/*폴더가 포함되어 있는지 확인합니다 (특히 무인 노드 및 ACP CLI를 위한dist/node-host/**및dist/acp/**). -
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 패키지 내용을 검증합니다) -
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(두 키 모두 필요; 두 프로바이더 실행)
- (선택 사항) 변경 사항이 송수신 경로에 영향을 미치는 경우 웹 게이트웨이를 점검하세요.
- macOS 앱 (Sparkle)
- macOS 앱을 빌드하고 서명한 후 배포를 위해 압축하세요.
- Sparkle 앱캐스트 생성 (HTML 노트는
scripts/make_appcast.sh를 통해) 및appcast.xml을 업데이트하세요. - 앱 압축 파일 및 선택적 dSYM 압축 파일을 GitHub 릴리스에 첨부할 준비를 하세요.
- 정확한 명령어 및 필요한 환경 변수를 위해 macOS 릴리스를 따르세요.
APP_BUILD는 버전 비교가 제대로 이루어지도록 숫자 및 단조 증가해야 합니다 (no-beta).- 공증을 하는 경우, App Store Connect API 환경 변수에서 생성된
openclaw-notary키체인 프로파일을 사용하세요 (macOS 릴리스 참조).
- 게시 (npm)
- git 상태가 깨끗한지 확인하고 필요한 경우 커밋 및 푸시하세요.
- 필요한 경우
npm login(2FA 확인). -
npm publish --access public(사전 릴리스에는--tag beta를 사용). - 레지스트리 확인:
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 앱 번들 (및 릴리스 zip 파일)이 패키지에 포함됩니다. 게시 내용을package.jsonfiles를 통해 화이트리스트로 관리해 해결하세요 (dist하위 디렉토리, 문서, 스킬 포함; 앱 번들 제외).npm pack --dry-run으로dist/OpenClaw.app가 목록에 나오지 않는지 확인하세요. dist-tags에 대한 npm 인증 웹 루프: 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 릴리스 + 앱캐스트
- 태그 및 푸시:
git tag vX.Y.Z && git push origin vX.Y.Z(또는git push --tags). -
vX.Y.Z에 대한 GitHub 릴리스를 생성/새로 고침하며 **제목openclaw X.Y.Z**을 사용하세요 (단순 태그명이 아닌); 본문은 해당 버전에 대한 전체 변경 로그 섹션을 포함해야 하며 (하이라이트 + 변경사항 + 수정사항) 인라인으로 제공되며, 본문에 제목을 반복해서는 안 됩니다. - 아티팩트 첨부:
npm packtarball (선택적),OpenClaw-X.Y.Z.zip, 및OpenClaw-X.Y.Z.dSYM.zip(생성된 경우). - 업데이트된
appcast.xml을 커밋하고 푸시하세요 (Sparkle은 메인에서 공급됩니다). - 깨끗한 임시 디렉토리에서 (no
package.json),npx -y openclaw@X.Y.Z send --help를 실행하여 설치/CLI 진입점이 동작하는지 확인합니다. - 릴리스 노트를 발표/공유하세요.
플러그인 출판 범위 (npm)
우리는 기존 npm 플러그인만을@openclaw/* 범위 아래에 게시합니다. 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).