Подпись mac (отладочные сборки)

Это приложение обычно собирается из scripts/package-mac-app.sh, который теперь:

  • устанавливает стабильный идентификатор отладочного пакета: ai.openclaw.mac.debug
  • записывает Info.plist с этим идентификатором пакета (переопределить через BUNDLE_ID=...)
  • вызывает scripts/codesign-mac-app.sh для подписи основного бинарника и пакета приложения, чтобы macOS рассматривал каждую пересборку как один и тот же подписанный пакет и сохранял разрешения TCC (уведомления, доступность, запись экрана, микрофон, речь). Для стабильных разрешений используйте реальную идентификацию подписи; ad-hoc является opt-in и хрупким (см. разрешения macOS).
  • использует CODESIGN_TIMESTAMP=auto по умолчанию; включает доверенные временные метки для подписей Developer ID. Установите CODESIGN_TIMESTAMP=off, чтобы пропустить временные метки (офлайн-отладочные сборки).
  • внедряет метаданные сборки в Info.plist: OpenClawBuildTimestamp (UTC) и OpenClawGitCommit (короткий хеш), чтобы панель About могла показывать сборку, git и отладочный/релизный канал.
  • Упаковка требует Node 22+: скрипт запускает сборки TS и сборку Control UI.
  • читает SIGN_IDENTITY из окружения. Добавьте export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)" (или ваш сертификат Developer ID Application) в ваш shell rc, чтобы всегда подписывать вашим сертификатом. Подпись ad-hoc требует явного opt-in через ALLOW_ADHOC_SIGNING=1 или SIGN_IDENTITY="-" (не рекомендуется для тестирования разрешений).
  • запускает аудит Team ID после подписи и завершается неудачей, если какой-либо Mach-O внутри пакета приложения подписан другим Team ID. Установите SKIP_TEAM_ID_CHECK=1 для обхода.

Использование

# из корня репозитория
scripts/package-mac-app.sh               # автоматический выбор идентификации; ошибка, если не найдена
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh   # реальный сертификат
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh    # ad-hoc (разрешения не будут сохраняться)
SIGN_IDENTITY="-" scripts/package-mac-app.sh        # явный ad-hoc (та же оговорка)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh   # обходной путь dev-only для несоответствия Team ID Sparkle

Примечание о подписи Ad-hoc

При подписи с SIGN_IDENTITY="-" (ad-hoc) скрипт автоматически отключает Hardened Runtime (--options runtime). Это необходимо для предотвращения сбоев, когда приложение пытается загрузить встроенные фреймворки (например, Sparkle), которые не имеют одинакового Team ID. Подписи ad-hoc также нарушают сохранение разрешений TCC; см. разрешения macOS для шагов восстановления.

Метаданные сборки для About

package-mac-app.sh штампует пакет с:

  • OpenClawBuildTimestamp: ISO8601 UTC во время упаковки
  • OpenClawGitCommit: короткий git-хеш (или unknown, если недоступен)

Вкладка About читает эти ключи, чтобы показать версию, дату сборки, git-коммит и отладочную ли это сборка (через #if DEBUG). Запустите упаковщик, чтобы обновить эти значения после изменений кода.

Почему

Разрешения TCC привязаны к идентификатору пакета и подписи кода. Неподписанные отладочные сборки с изменяющимися UUID заставляли macOS забывать предоставления после каждой пересборки. Подпись бинарников (по умолчанию ad-hoc) и сохранение фиксированного идентификатора пакета/пути (dist/OpenClaw.app) сохраняет предоставления между сборками, соответствуя подходу VibeTunnel.