Keep the GUI installer prerequisite changes because the install.ps1 stage protocol PR does not touch these files. Drop only the unrelated thread spacing change.
When winget is unavailable, keep the installer copy aligned with the non-blocking flow by directing users to continue setup and relaunch after manual installs.
Avoid calling Python and Node hard installer requirements when the NSIS flow intentionally lets users continue after skipped or failed dependency installs.
**Option A — let the desktop provision it for you (recommended for first-time setup):** just run `npm run dev`. On first launch the desktop creates a venv at `HERMES_HOME/hermes-agent/venv` and runs `pip install -e .` against the resolved Hermes source automatically. Requires Python 3.11+ on `PATH`.
**Option A — let the desktop provision it for you (recommended for first-time setup):** just run `npm run dev`. On first launch the desktop creates a venv at `HERMES_HOME/hermes-agent/venv` and runs `pip install -e .` against the resolved Hermes source automatically. Requires Python 3.11-3.13 on Windows.
**Option B — share an existing CLI install:** if you already ran `scripts/install.ps1` / `scripts/install.sh`, that's the same layout the desktop uses. The desktop reuses your existing venv and editable install — no extra steps. See [Runtime Bootstrap](#runtime-bootstrap) below for details.
@@ -24,20 +24,20 @@ HERMES_DESKTOP_HERMES_ROOT=/path/to/your/clone npm run dev
- **Python 3.11+** — for the agent runtime, dashboard backend, and tool execution. (required)
- **Git for Windows** (Windows only) — provides Git Bash, which Hermes' terminal tool calls directly. Linux and macOS already ship a system bash. (required)
- **ripgrep** — used by Hermes' `search_files` tool for fast `.gitignore`-aware file/content search. Recommended on all platforms; Hermes falls back to `grep`/`find` if missing (works but slower and noisier).
- **Python 3.11-3.13** — for the agent runtime, dashboard backend, and tool execution.
- **Node.js 20+ LTS** — for browser tools and Node-backed capabilities.
- **Git for Windows** — for Git Bash, which powers Hermes terminal commands on Windows.
The packaged Windows installer (`Hermes-*.exe`) detects all three at install time. Required items missing are auto-installed via `winget install -e --id Python.Python.3.11 --scope user` and `winget install -e --id Git.Git`. The recommended ripgrep is offered as `winget install -e --id BurntSushi.ripgrep.MSVC --scope user`. If `winget` isn't available the installer shows manual download URLs and lets you continue. The MSI installer (`Hermes-*.msi`) doesn't run the prereq page — enterprise deploys are expected to handle prereqs out-of-band.
The packaged Windows installer (`Hermes-*.exe`) is intentionally barebones: it installs the GUI and offers to install Python 3.11, Node.js 20+, and Git for Windows via `winget` when possible. Python 3.14 is not accepted yet because several Hermes dependencies do not publish compatible wheels. On first launch, the GUI handles the Hermes-specific work: syncing the bundled agent payload, creating the virtualenv, installing Python dependencies, and showing progress in the onboarding UI. The MSI installer does not run the prerequisite page, so enterprise deploys should preinstall these dependencies out-of-band.
For dev (`npm run dev`) the Python and Git Bash checks happen at first launch via the Electron bootstrapper, which throws a clear error if either prereq is missing. Manual install commands you can run yourself:
For dev (`npm run dev`) the Python check happens at first launch via the Electron bootstrapper. Manual install commands you can run yourself:
@@ -218,11 +218,11 @@ The desktop resolves a Hermes backend in this order:
### First-launch flow on a packaged install
1. Sync factory image → `HERMES_HOME/hermes-agent`. Skipped if a `.git` directory exists at the destination (developer install) — never overwrites a user's local repo.
2. Create venv at `HERMES_HOME/hermes-agent/venv` using system Python (errors out with a Python-install hint if no Python 3.11+ is found).
2. Create venv at `HERMES_HOME/hermes-agent/venv` using system Python (errors out with a Python-install hint if no supported Python is found).
3.`pip install -e HERMES_HOME/hermes-agent` — `pyproject.toml` is the single source of truth for dependencies.
4. Stamp `.hermes-desktop-runtime.json` with the schema version + pyproject hash + factory version.
Subsequent launches compare the marker against the active `pyproject.toml` and skip steps 2-4 when nothing has changed.
Subsequent launches compare the marker against the active `pyproject.toml` and skip venv/dependency work when nothing has changed.
${NSD_CreateLabel}8u59u95%14u"Not detected. Install manually from https://git-scm.com/download/win and re-run this installer."
Pop$HermesGitStatusLabel
${NSD_CreateLabel}8u59u95%14u"Not detected. Install manually from https://nodejs.org/en/download/, then relaunch Hermes."
Pop$HermesNodeStatusLabel
${EndIf}
${EndIf}
; --- ripgrep panel (RECOMMENDED) ---
${NSD_CreateGroupBox}0u82u100%30u"ripgrep (recommended for fast file search)"
; --- Git panel ---
${NSD_CreateGroupBox}0u82u100%30u"Git for Windows"
Pop$0
${If}$HermesHasRipgrep=="1"
${If}$HermesHasGitBash=="1"
${NSD_CreateLabel}8u92u95%10u"Detected on your system."
Pop$HermesRgStatusLabel
Pop$HermesGitBashStatusLabel
${Else}
${If}$HermesHasWinget=="1"
${NSD_CreateLabel}8u91u95%9u"Not detected. Hermes will fall back to slower grep/find."
Pop$HermesRgStatusLabel
${NSD_CreateCheckbox}8u101u95%9u"Install ripgrep"
Pop$HermesRgCheckbox
${NSD_Check}$HermesRgCheckbox
${NSD_CreateLabel}8u91u95%9u"Not detected. Provides Git Bash for Hermes terminal commands."
Pop$HermesGitBashStatusLabel
${NSD_CreateCheckbox}8u101u95%9u"Install Git for Windows"
Pop$HermesGitBashCheckbox
${NSD_Check}$HermesGitBashCheckbox
${Else}
${NSD_CreateLabel}8u91u95%14u"Not detected. Install manually from https://github.com/BurntSushi/ripgrep#installation if you want fast .gitignore-aware search."
Pop$HermesRgStatusLabel
${NSD_CreateLabel}8u91u95%14u"Not detected. Install manually from https://git-scm.com/download/win for terminal commands."
Pop$HermesGitBashStatusLabel
${EndIf}
${EndIf}
; --- Footer (UAC notice when Git install will run) ---
${If}$HermesHasGit=="0"
${AndIf}$HermesHasWinget=="1"
${NSD_CreateLabel}0u116u100%18u"Note: Git for Windows requires administrator approval. The UAC prompt may appear behind this window — check your taskbar."
${If}$HermesHasPython=="1"
${AndIf}$HermesHasNode=="1"
${AndIf}$HermesHasGitBash=="1"
${NSD_CreateLabel}0u116u100%18u"After launch, Hermes will finish installing the bundled agent files and Python dependencies in the GUI."
Pop$HermesFooterLabel
${ElseIf}$HermesHasWinget=="0"
${NSD_CreateLabel}0u116u100%18u"Continue setup, then install missing dependencies manually and relaunch Hermes."
Pop$HermesFooterLabel
${ElseIf}$HermesHasWinget=="1"
${If}$HermesHasNode=="0"
${OrIf}$HermesHasGitBash=="0"
${NSD_CreateLabel}0u116u100%18u"Note: Node.js or Git for Windows may request administrator approval. Check your taskbar if hidden."
Pop$HermesFooterLabel
${Else}
${NSD_CreateLabel}0u116u100%18u"Selected missing items will install before launch; Hermes finishes setup in the GUI."
Pop$HermesFooterLabel
${EndIf}
${Else}
${NSD_CreateLabel}0u116u100%18u"Selected missing items will install before launch; Hermes finishes setup in the GUI."
Pop$HermesFooterLabel
${EndIf}
@@ -581,15 +609,15 @@ Function HermesPrereqPageLeave
; Python with --scope user installs to %LOCALAPPDATA%\Programs\Python\
; — no UAC, no foreground chain to preserve. HermesRunWinget captures
; both the Details-panel output AND a copy to the installer log.
DetailPrint"Installing Python 3.11+ via winget (silent per-user install, no admin prompt)..."
DetailPrint"Installing Python 3.11 via winget (silent per-user install, no admin prompt)..."
Push'install -e --id Python.Python.3.11 --scope user --silent --disable-interactivity --accept-package-agreements --accept-source-agreements'
Push'Python 3.11'
CallHermesRunWinget
${If}$0!=0
DetailPrint"Python install via winget exited with code $0."
${HermesLog}"Python install FAILED (exit $0). User notified via MessageBox."
MessageBoxMB_OK|MB_ICONEXCLAMATION|MB_TOPMOST"Python install via winget did not complete successfully (exit code $0).$\r$\n$\r$\nSee log: $HermesLogPath$\r$\n$\r$\nYou can install Python 3.11+ manually from https://www.python.org/downloads/ after Hermes setup finishes. Hermes will not run until Python is installed."
MessageBoxMB_OK|MB_ICONEXCLAMATION|MB_TOPMOST"Python install via winget did not complete successfully (exit code $0).$\r$\n$\r$\nSee log: $HermesLogPath$\r$\n$\r$\nAfter this installer finishes, install Python 3.11, 3.12, or 3.13 manually from https://www.python.org/downloads/, then relaunch Hermes. Hermes will not run until Python is installed."
${Else}
DetailPrint"Python 3.11+ installed successfully."
DetailPrint"Python 3.11 installed successfully."
${HermesLog}"Python install succeeded"
${EndIf}
${EndIf}
${If}$HermesInstallRipgrep=="1"
; ripgrep with --scope user — ~5MB, no UAC needed. Failure is non-fatal:
; Hermes' search_files tool falls back to grep/find from Git Bash.
DetailPrint"Installing ripgrep via winget (silent per-user install, no admin prompt)..."
Push'install -e --id BurntSushi.ripgrep.MSVC --scope user --silent --disable-interactivity --accept-package-agreements --accept-source-agreements'
Push'ripgrep'
CallHermesRunWinget
${If}$0!=0
DetailPrint"ripgrep install via winget exited with code $0 (non-fatal — Hermes will fall back to grep/find)."
DetailPrint"Node.js 20+ could not be validated after install."
${HermesLog}"Node.js install failed, needs a restart, or installed an unsupported version (version probe negative)."
MessageBoxMB_OK|MB_ICONEXCLAMATION|MB_TOPMOST"Node.js 20+ could not be validated after winget.$\r$\n$\r$\nA restart may be required. See log: $HermesLogPath$\r$\n$\r$\nInstall Node.js 20+ manually from https://nodejs.org/en/download/ if Hermes browser tools or Node-backed capabilities fail."
${EndIf}
${EndIf}
${If}$HermesInstallGit=="1"
; Git for Windows always installs per-machine and triggers UAC. We use
; ExecShellWait (NSIS's wrapper around Windows ShellExecute) instead of
; nsExec because ShellExecute preserves the foreground focus chain
; across non-elevated → elevated process spawns. With nsExec the
; intermediate hidden winget.exe breaks that chain and UAC ends up
; behind the installer window.
;
; Trade-off: ExecShellWait doesn't capture output, so winget runs in
; its own console window. The console flashes briefly while winget
; downloads, then UAC fires for the elevated Git installer with
; correct foreground promotion. We CANNOT log winget's stdout/stderr
; for this case; we only log start time, end time, and the post-
; install filesystem probe result.
DetailPrint"Installing Git for Windows via winget (UAC prompt will appear)..."
${HermesLog}"Git: starting ExecShellWait — UAC will fire; no stdout capture possible"
${If}$HermesInstallGitBash=="1"
DetailPrint"Installing Git for Windows via winget..."
${HermesLog}"Git: starting ExecShellWait — UAC may appear; no stdout capture possible"
DetailPrint"Git for Windows install did not complete (bash.exe not found at standard install locations)."
${HermesLog}"Git install FAILED (filesystem probe negative). User notified via MessageBox."
MessageBoxMB_OK|MB_ICONEXCLAMATION|MB_TOPMOST"Git for Windows install via winget did not complete successfully.$\r$\n$\r$\nSee log: $HermesLogPath$\r$\n$\r$\nYou can install Git for Windows manually from https://git-scm.com/download/win after Hermes setup finishes. Hermes' terminal tool will not work until Git Bash is available."
${HermesLog}"Git install failed or needs a restart (filesystem probe negative)."
MessageBoxMB_OK|MB_ICONEXCLAMATION|MB_TOPMOST"Git for Windows install via winget did not complete successfully.$\r$\n$\r$\nSee log: $HermesLogPath$\r$\n$\r$\nInstall Git for Windows manually from https://git-scm.com/download/win if Hermes terminal commands fail."
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.