hermes-agent/apps/bootstrap-installer
brooklyn! 5f9e0545ca
macOS desktop: install + in-app self-update (#35607)
* fix(installer): align macOS HERMES_HOME with the rest of the stack

paths.rs computed the macOS Hermes home as ~/Library/Application Support/
hermes, but nothing else does: hermes_constants.get_hermes_home() (Python),
scripts/install.sh, and the Electron desktop's resolveHermesHome() all use
~/.hermes on macOS. The drift meant the Tauri installer wrote the install to
one directory and the desktop looked for it in another, so a fresh GUI
install never found its backend (the file's own comment warned this exact
drift would break things). Use ~/.hermes on macOS to match.

* fix(install.sh): always emit a stage result frame on failure

Stage helpers (clone_repo, install_deps, check_python, …) were written for
the monolithic flow and call `exit 1` on failure. Under `--stage`, that
terminated the process before the JSON result frame was printed, so the
installer's parse_stage_result saw "no frame" instead of a clean
{ok:false,...} contract response. Run the stage body in a subshell so an
`exit` only unwinds the subshell and the parent still emits the frame.

* feat(install.sh): auto-provision git on macOS/Linux (parity with install.ps1)

install.ps1 downloads PortableGit on Windows, but install.sh just printed a
"please install git" hint and exited — so a fresh Mac with no developer tools
(no Xcode CLT → no git) couldn't get past the clone step. check_git now tries
to install git before bailing:
  - macOS: Homebrew if present (headless), else `xcode-select --install`
    (the CLT prompt also provides the compiler some wheels need), polling for
    git to appear.
  - Linux: apt/dnf/pacman via sudo when available.
Falls back to the manual instructions only if auto-provision fails.

* feat(desktop): in-app GUI+backend self-update on macOS/Linux

On Windows the staged Hermes-Setup binary drives updates (quit → hermes
update → hermes desktop --build-only → relaunch). The mac drag-install has no
such binary, so "Update now" previously just printed `hermes update`.

Since there's no venv-shim file lock on POSIX, the desktop can drive the whole
update itself. applyUpdates now, when no staged updater exists on mac/linux:
  1. runs `hermes update --yes [--branch <current>]` (backend git pull + deps),
  2. runs `hermes desktop --build-only` (OS-aware GUI rebuild) with the
     Hermes-managed Node + venv on PATH,
  3. spawns a detached swapper that waits for this process to exit, dittos the
     freshly built Hermes.app over the running bundle, clears quarantine, and
     relaunches.
Degrades to "backend updated — restart to load the new GUI" if the rebuild
fails or there's no .app bundle to swap (dev run, Linux AppImage).

* chore: uptick
2026-05-30 22:26:08 -05:00
..
src fix(installer): stamp Hermes icon onto Hermes.exe via rcedit (no winCodeSign) 2026-05-29 00:50:14 -04:00
src-tauri macOS desktop: install + in-app self-update (#35607) 2026-05-30 22:26:08 -05:00
.gitignore fix(installer): pass -IncludeDesktop to manifest, surface launch errors, alias hermes desktop 2026-05-28 02:42:33 -04:00
index.html feat(installer): Tauri bootstrap installer for first-time onboarding 2026-05-28 02:23:13 -04:00
package.json feat(installer): Tauri bootstrap installer for first-time onboarding 2026-05-28 02:23:13 -04:00
tsconfig.json feat(installer): Tauri bootstrap installer for first-time onboarding 2026-05-28 02:23:13 -04:00
tsconfig.node.json feat(installer): Tauri bootstrap installer for first-time onboarding 2026-05-28 02:23:13 -04:00
vite.config.ts Merge origin/main into bb/gui 2026-05-29 20:40:08 -05:00