Чек‑лист релиза (npm + macOS)
Используйтеpnpm (Node 22+) из корня репозитория. Перед тегированием/публикацией убедитесь, что рабочее дерево чистое.
Триггер оператора
Когда оператор говорит «release», немедленно выполните этот preflight (без дополнительных вопросов, если не заблокировано):- Прочитайте этот документ и
docs/platforms/mac/release.md. - Загрузите переменные окружения из
~/.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, чтобы выровнять версии пакетов расширений и журналы изменений. - Обновите строки CLI/версии:
src/cli/program.tsи user agent Baileys вsrc/provider-web.ts. - Подтвердите метаданные пакета (name, description, repository, keywords, license) и то, что карта
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/**для headless‑узла и ACP CLI). - Подтвердите, что
dist/build-info.jsonсуществует и содержит ожидаемый хешcommit(баннер CLI использует его для установок из npm). - Необязательно:
npm pack --pack-destination /tmpпосле сборки; проверьте содержимое tarball и сохраните его для релиза GitHub (не коммитьте его).
- Changelog и документация
- Обновите
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(smoke‑тест установки Docker, быстрый путь; обязателен перед релизом)- Если предыдущий npm‑релиз заведомо сломан, установите
OPENCLAW_INSTALL_SMOKE_PREVIOUS=<last-good-version>илиOPENCLAW_INSTALL_SMOKE_SKIP_PREVIOUS=1для шага preinstall.
- Если предыдущий npm‑релиз заведомо сломан, установите
- (Необязательно) Полный smoke‑тест установщика (добавляет покрытие 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(требуются оба ключа; запускает обоих провайдеров)
- (Необязательно) Точечно проверьте веб‑Gateway (шлюз), если изменения затрагивают пути отправки/приёма.
- Приложение macOS (Sparkle)
- Соберите и подпишите приложение macOS, затем упакуйте его в zip для распространения.
- Сгенерируйте appcast Sparkle (HTML‑заметки через
scripts/make_appcast.sh) и обновитеappcast.xml. - Держите zip приложения (и необязательный zip dSYM) готовыми для прикрепления к релизу GitHub.
- Следуйте macOS release для точных команд и требуемых переменных окружения.
APP_BUILDдолжен быть числовым и монотонным (без-beta), чтобы Sparkle корректно сравнивал версии.- При нотарификации используйте профиль ключей
openclaw-notary, созданный из переменных окружения App Store Connect API (см. macOS release).
- Публикация (npm)
- Подтвердите, что git‑статус чистый; при необходимости закоммитьте и отправьте изменения.
-
npm login(проверка 2FA) при необходимости. -
npm publish --access public(используйте--tag betaдля pre‑release). - Проверьте реестр:
npm view openclaw version,npm view openclaw dist-tagsиnpx -y [email protected] --version(или--help).
Устранение неполадок (заметки из релиза 2.0.0-beta2)
- npm pack/publish зависает или создаёт огромный tarball: бандл приложения macOS в
dist/OpenClaw.app(и релизные zip) попадает в пакет. Исправление — белый список содержимого публикации черезpackage.jsonfiles(включить подкаталоги dist, docs, skills; исключить бандлы приложений). Подтвердите с помощьюnpm pack --dry-run, чтоdist/OpenClaw.appотсутствует в списке. - Цикл веб‑аутентификации npm для dist‑tags: используйте legacy‑аутентификацию, чтобы получить запрос OTP:
NPM_CONFIG_AUTH_TYPE=legacy npm dist-tag add [email protected] latest
- Проверка
npxзавершается ошибкойECOMPROMISED: Lock compromised: повторите с чистым кэшем:NPM_CONFIG_CACHE=/tmp/npm-cache-$(date +%s) npx -y [email protected] --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). - Создайте/обновите релиз GitHub для
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 [email protected] send --help, чтобы подтвердить, что установка/entrypoints 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).