{"record":{"id":"0ead870e4b873caf","repo":"NousResearch/hermes-agent","slug":"hermes-install-at-active-hermes-root-is-missing","errorCode":null,"errorMessage":"Hermes install at ${ACTIVE_HERMES_ROOT} is missing or incomplete. Reinstall via the desktop installer or scripts/install.ps1.","messagePattern":"Hermes install at (.+?) is missing or incomplete\\. Reinstall via the desktop installer or scripts/install\\.ps1\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"apps/desktop/electron/main.ts","lineNumber":4078,"sourceCode":"      bootstrapFailure = bootstrapError\n      throw bootstrapError\n    }\n\n    rememberLog('[bootstrap] bootstrap complete; marker written. Re-resolving backend.')\n\n    // Re-resolve now that the install exists. The new resolution lands in\n    // step 3 (bootstrap-complete marker) and we recurse to wire venvPython.\n    return ensureRuntime(resolveHermesBackend(backend.args))\n  }\n\n  // bootstrap=true with a real backend (createActiveBackend path) means we\n  // have a checkout and need to ensure the venv-derived Python command is\n  // wired into the backend before launch. Same code path the old factory\n  // sync flow exited through, minus all the factory/pip/marker machinery\n  // (install.ps1 owns those concerns now and the bootstrap-complete marker\n  // attests they ran successfully).\n  if (!isHermesSourceRoot(ACTIVE_HERMES_ROOT)) {\n    throw new Error(\n      `Hermes install at ${ACTIVE_HERMES_ROOT} is missing or incomplete. ` +\n        'Reinstall via the desktop installer or scripts/install.ps1.'\n    )\n  }\n\n  // On Windows, preflight Git Bash. Hermes' terminal tool calls bash.exe\n  // directly (tools/environments/local.py); without it the agent can't run\n  // terminal commands. install.ps1's Stage-Git puts PortableGit at\n  // %LOCALAPPDATA%\\hermes\\git\\, which findGitBash() picks up, so for any\n  // user who completed the bootstrap this is a no-op. For users who got\n  // here via an external `hermes` on PATH, this check still helps.\n  if (IS_WINDOWS && !findGitBash()) {\n    throw new Error(\n      'Git for Windows is required for Hermes on Windows (provides Git Bash, ' +\n        \"which the agent's terminal tool uses). Install it from \" +\n        'https://git-scm.com/download/win or run `winget install -e --id Git.Git`, ' +\n        'then relaunch Hermes.'\n    )","sourceCodeStart":4060,"sourceCodeEnd":4096,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/apps/desktop/electron/main.ts#L4060-L4096","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Reinstall via the desktop installer or scripts/install.ps1, as the message says — this restores a complete checkout.","If the install was intentionally moved, update the desktop's recorded ACTIVE_HERMES_ROOT to the new location.","Verify the directory contains a Hermes checkout (.git plus source files) before relaunching."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const fs = require('fs')\nconst path = require('path')\nfunction looksLikeHermesCheckout(root) {\n  return fs.existsSync(path.join(root, '.git')) && fs.existsSync(path.join(root, 'pyproject.toml'))\n}\nif (!looksLikeHermesCheckout(ACTIVE_HERMES_ROOT)) {\n  promptReinstall()\n}","typeGuard":null,"tryCatchPattern":"try {\n  await ensureRuntime(backend)\n} catch (e) {\n  if (/missing or incomplete/.test(e.message)) await offerReinstall()\n  else throw e\n}","preventionTips":["Don't delete files inside the install root","Re-run the installer after moving an install","Keep the installer's bootstrap-complete marker intact"],"tags":["desktop","install","runtime","bootstrap","startup"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}