Firma en Mac (builds de debug)

Esta app generalmente se compila desde scripts/package-mac-app.sh, que ahora:

  • Establece un identificador de bundle de debug estable: ai.openclaw.mac.debug
  • Escribe el Info.plist con ese bundle id (sobrescribible vía BUNDLE_ID=...)
  • Llama a scripts/codesign-mac-app.sh para firmar el binario principal y el app bundle para que macOS trate cada recompilación como el mismo bundle firmado y mantenga los permisos TCC (notificaciones, accesibilidad, grabación de pantalla, micrófono, voz). Para permisos estables, usa una identidad de firma real; ad-hoc es opt-in y frágil (ver permisos de macOS).
  • Usa CODESIGN_TIMESTAMP=auto por defecto; habilita timestamps confiables para firmas Developer ID. Establece CODESIGN_TIMESTAMP=off para omitir el timestamping (builds de debug offline).
  • Inyecta metadatos de compilación en Info.plist: OpenClawBuildTimestamp (UTC) y OpenClawGitCommit (hash corto) para que el panel About pueda mostrar build, git, y canal debug/release.
  • El empaquetado usa Node 24 por defecto: el script ejecuta builds TS y el build de la Control UI. Node 22 LTS, actualmente 22.16+, sigue siendo compatible.
  • Lee SIGN_IDENTITY del entorno. Añade export SIGN_IDENTITY="Apple Development: Your Name (TEAMID)" (o tu cert Developer ID Application) a tu shell rc para firmar siempre con tu certificado. La firma ad-hoc requiere opt-in explícito vía ALLOW_ADHOC_SIGNING=1 o SIGN_IDENTITY="-" (no recomendado para pruebas de permisos).
  • Ejecuta una auditoría de Team ID después de firmar y falla si algún Mach-O dentro del app bundle está firmado por un Team ID diferente. Establece SKIP_TEAM_ID_CHECK=1 para omitir.

Uso

# desde la raíz del repo
scripts/package-mac-app.sh               # auto-selecciona identidad; error si no se encuentra
SIGN_IDENTITY="Developer ID Application: Your Name" scripts/package-mac-app.sh   # cert real
ALLOW_ADHOC_SIGNING=1 scripts/package-mac-app.sh    # ad-hoc (los permisos no persistirán)
SIGN_IDENTITY="-" scripts/package-mac-app.sh        # ad-hoc explícito (misma advertencia)
DISABLE_LIBRARY_VALIDATION=1 scripts/package-mac-app.sh   # workaround solo dev para desajuste de Team ID de Sparkle

Nota sobre firma ad-hoc

Al firmar con SIGN_IDENTITY="-" (ad-hoc), el script deshabilita automáticamente el Hardened Runtime (--options runtime). Esto es necesario para evitar crashes cuando la app intenta cargar frameworks embebidos (como Sparkle) que no comparten el mismo Team ID. Las firmas ad-hoc también rompen la persistencia de permisos TCC; consulta permisos de macOS para pasos de recuperación.

Metadatos de compilación para About

package-mac-app.sh sella el bundle con:

  • OpenClawBuildTimestamp: ISO8601 UTC al momento del empaquetado
  • OpenClawGitCommit: hash corto de git (o unknown si no está disponible)

La pestaña About lee estas claves para mostrar versión, fecha de compilación, commit de git, y si es un build de debug (vía #if DEBUG). Ejecuta el empaquetador para refrescar estos valores después de cambios en el código.

Por qué

Los permisos TCC están vinculados al identificador de bundle y a la firma de código. Los builds de debug sin firmar con UUIDs cambiantes causaban que macOS olvidara las concesiones después de cada recompilación. Firmar los binarios (ad-hoc por defecto) y mantener un bundle id/ruta fijo (dist/OpenClaw.app) preserva las concesiones entre compilaciones, siguiendo el enfoque de VibeTunnel.