NousResearch/hermes-agent · critical

Hermes install at ${ACTIVE_HERMES_ROOT} is missing or incomp

Error message

Hermes install at ${ACTIVE_HERMES_ROOT} is missing or incomplete. Reinstall via the desktop installer or scripts/install.ps1.

What it means

Thrown in ensureRuntime after backend bootstrapping when isHermesSourceRoot(ACTIVE_HERMES_ROOT) is false — the directory the desktop resolved as the active Hermes install no longer looks like a Hermes source checkout (missing .git / source files). The desktop requires a complete checkout before wiring the venv Python into the backend command.

Source

Thrown at apps/desktop/electron/main.ts:4078

      bootstrapFailure = bootstrapError
      throw bootstrapError
    }

    rememberLog('[bootstrap] bootstrap complete; marker written. Re-resolving backend.')

    // Re-resolve now that the install exists. The new resolution lands in
    // step 3 (bootstrap-complete marker) and we recurse to wire venvPython.
    return ensureRuntime(resolveHermesBackend(backend.args))
  }

  // bootstrap=true with a real backend (createActiveBackend path) means we
  // have a checkout and need to ensure the venv-derived Python command is
  // wired into the backend before launch. Same code path the old factory
  // sync flow exited through, minus all the factory/pip/marker machinery
  // (install.ps1 owns those concerns now and the bootstrap-complete marker
  // attests they ran successfully).
  if (!isHermesSourceRoot(ACTIVE_HERMES_ROOT)) {
    throw new Error(
      `Hermes install at ${ACTIVE_HERMES_ROOT} is missing or incomplete. ` +
        'Reinstall via the desktop installer or scripts/install.ps1.'
    )
  }

  // On Windows, preflight Git Bash. Hermes' terminal tool calls bash.exe
  // directly (tools/environments/local.py); without it the agent can't run
  // terminal commands. install.ps1's Stage-Git puts PortableGit at
  // %LOCALAPPDATA%\hermes\git\, which findGitBash() picks up, so for any
  // user who completed the bootstrap this is a no-op. For users who got
  // here via an external `hermes` on PATH, this check still helps.
  if (IS_WINDOWS && !findGitBash()) {
    throw new Error(
      'Git for Windows is required for Hermes on Windows (provides Git Bash, ' +
        "which the agent's terminal tool uses). Install it from " +
        'https://git-scm.com/download/win or run `winget install -e --id Git.Git`, ' +
        'then relaunch Hermes.'
    )

View on GitHub (pinned to c896c09c42)

Solutions

  1. Reinstall via the desktop installer or scripts/install.ps1, as the message says — this restores a complete checkout.
  2. If the install was intentionally moved, update the desktop's recorded ACTIVE_HERMES_ROOT to the new location.
  3. Verify the directory contains a Hermes checkout (.git plus source files) before relaunching.
Defensive patterns

Strategy: validation

Validate before calling

const fs = require('fs')
const path = require('path')
function looksLikeHermesCheckout(root) {
  return fs.existsSync(path.join(root, '.git')) && fs.existsSync(path.join(root, 'pyproject.toml'))
}
if (!looksLikeHermesCheckout(ACTIVE_HERMES_ROOT)) {
  promptReinstall()
}

Try / catch

try {
  await ensureRuntime(backend)
} catch (e) {
  if (/missing or incomplete/.test(e.message)) await offerReinstall()
  else throw e
}

Prevention

When it happens

Trigger: The checkout at ACTIVE_HERMES_ROOT was deleted, moved, or partially copied after installation; a half-completed installer run left .git missing; the config points ACTIVE_HERMES_ROOT at a wrong/stale path.

Common situations: Users who cleaned up 'unused' folders under the install root; antivirus or disk-cleanup tools removing checkout contents; moving the install directory manually without updating the desktop's config.

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/0ead870e4b873caf. Report an issue: GitHub.