fix(installer): build macOS setup DMG as universal binary - #37762
fix(installer): build macOS setup DMG as universal binary#37762westkite1201 wants to merge 4 commits into
Conversation
Add a dedicated macOS installer workflow that builds Hermes Setup with the universal Apple target and fails if the bundled executable is not both x86_64 and arm64. Constraint: keep the existing generic Tauri build script unchanged for other platforms. Rejected: only renaming the current DMG | it would not prevent arm64-only artifacts from being produced again. Confidence: medium Scope-risk: narrow Tested: npm ci; npm --workspace @hermes/bootstrap-installer run build; ruby YAML.load_file .github/workflows/build-macos-installer.yml; git diff --check; static workflow assertions Not-tested: macOS universal Tauri build on a macOS runner; actionlint unavailable locally
tonydwb
left a comment
There was a problem hiding this comment.
Code Review Summary
Verdict: Approved
Overview
Builds the macOS setup DMG as a universal binary (arm64 + x86_64). Ensures smooth install experience on both Apple Silicon and Intel Macs.
✅ Looks Good
- 94 additions, 0 deletions
- Universal binary support is standard practice for macOS distribution
- No changes to non-macOS build paths
- No security concerns
- Follows Apple's recommended packaging approach
Reviewed by Hermes Agent
austinpickett
left a comment
There was a problem hiding this comment.
Approve.
Verified on main: .github/workflows/build-macos-installer.yml is absent and apps/bootstrap-installer/package.json has no tauri:build:macos:universal script — the bug (no universal-binary build path) is present.
Diff scope (2 files, minimal):
- New
tauri:build:macos:universalnpm script:tauri build --target universal-apple-darwin. - New dispatch-only workflow that (a) gates on repo-admin permission before producing release artifacts, (b) pins all actions by commit SHA, (c) builds the universal DMG, and (d) verifies universality via
lipo -infoasserting bothx86_64andarm64before upload (if-no-files-found: error).
Hygiene: no package-lock.json churn, no version bumps.
Cluster: independent of #38673/#39093 — touches only the Tauri bootstrap-installer + CI, not the Electron desktop app. No conflict.
…etup-dmg # Conflicts: # apps/bootstrap-installer/package.json
|
Updated this branch with the latest main and resolved the package.json conflict while keeping both the universal macOS build script and the new typecheck script.\n\nLocal checks run:\n- |
|
Would love to see this merged! Estimated 20-25% of Mac users are still using Intel devices. |
teknium1
left a comment
There was a problem hiding this comment.
Thanks for adding a focused universal-build path; the Intel-macOS packaging gap remains on current main.
Problems
.github/workflows/build-macos-installer.yml:63expectsHermes Setup.app, but current main declares"productName": "Hermes"inapps/bootstrap-installer/src-tauri/tauri.conf.json:3. The rename landed inb34ee8074, whose commit message explicitly identifies the macOS installer rename. The existence check will fail beforelipoor either upload step runs.
Suggested changes
- Update the verification path to
.../bundle/macos/Hermes.app/Contents/MacOS/Hermes-Setup, then run the workflow on macOS to validate the generated bundle.
Automated hermes-sweeper review.
| workspaces: apps/bootstrap-installer/src-tauri | ||
|
|
||
| - name: Build universal macOS DMG | ||
| run: npm run tauri:build:macos:universal |
There was a problem hiding this comment.
Current main renamed the Tauri productName to Hermes (apps/bootstrap-installer/src-tauri/tauri.conf.json:3, commit b34ee8074), so this path will not exist. Use .../bundle/macos/Hermes.app or derive the bundle name from the active Tauri config.
|
Tested successfully on a real Intel Mac:
The current installer bundle path is: This validates the Intel build and runtime path, but not the arm64 slice of a universal binary or official Developer ID signing/notarization. Reproducible build harness and full report: https://github.com/ryancalpin/hermes-agent-intel-build Unofficial Intel test prerelease (ad-hoc signed and not Apple-notarized): https://github.com/ryancalpin/hermes-agent-intel-build/releases/tag/v2026.7.7.2-intel-test.1 Happy to help update this PR rather than opening another duplicate. |
Related to #51777: both build universal macOS installer artifacts, but their workflow/release scope differs; a maintainer consolidation choice is needed. |
🙏 Same, was in the middle of trying to set up Hermes on my Intel Mac via Homebrew and ran into the unfortunate news… There's still a good amount of us left on Intel Macs (OCLP helps), and reusing older hardware to run an agent framework is a great way to avoid it hitting the dumpster (or having to deal with the current SSD and RAM prices for a while longer…) |
What does this PR do?
Adds a dedicated macOS installer workflow for Hermes Setup that builds the Tauri app with
--target universal-apple-darwinand fails the workflow unless the bundled executable contains bothx86_64andarm64slices.This prevents a release DMG from silently shipping as Apple Silicon-only and causing
Bad CPU type in executableon Intel Macs.Related Issue
Fixes #37505
Type of Change
Changes Made
.github/workflows/build-macos-installer.ymlfor an admin-gated macOS installer build.tauri:build:macos:universaltoapps/bootstrap-installer/package.json.universal-apple-darwin, verifies the app executable withlipo -info, and uploads the DMG/app artifacts withif-no-files-found: error.How to Test
npm cinpm --workspace @hermes/bootstrap-installer run buildruby -e 'require "yaml"; YAML.load_file(".github/workflows/build-macos-installer.yml"); puts "yaml ok"'git diff --checkuniversal-apple-darwin,lipo -info,x86_64,arm64, andif-no-files-found: error.Not tested: the macOS universal Tauri build itself was not run locally because this environment is Linux;
actionlintis not installed locally.Checklist
Code
fix(scope):,feat(scope):, etc.)pytest tests/ -qand all tests passDocumentation & Housekeeping
docs/, docstrings) — or N/Acli-config.yaml.exampleif I added/changed config keys — or N/ACONTRIBUTING.mdorAGENTS.mdif I changed architecture or workflows — or N/AFor New Skills
N/A — this PR does not add or modify skills.
Screenshots / Logs