{"record":{"id":"07ba1f02b2d7140c","repo":"NousResearch/hermes-agent","slug":"desktop-rebuild-succeeded-but-no-hermes-app-was-fo","errorCode":null,"errorMessage":"desktop rebuild succeeded but no Hermes.app was found under {}","messagePattern":"desktop rebuild succeeded but no Hermes\\.app was found under (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"apps/bootstrap-installer/src-tauri/src/update.rs","lineNumber":998,"sourceCode":"    }\n    None\n}\n\n#[cfg(target_os = \"macos\")]\nasync fn install_macos_app_update(\n    app: &AppHandle,\n    install_root: &Path,\n    target_app: &Path,\n) -> Result<PathBuf> {\n    if target_app.extension().and_then(|e| e.to_str()) != Some(\"app\") {\n        return Err(anyhow!(\n            \"refusing to install update into non-app path: {}\",\n            target_app.display()\n        ));\n    }\n\n    let rebuilt_app = crate::bootstrap::resolve_hermes_desktop_app(install_root).ok_or_else(|| {\n        anyhow!(\n            \"desktop rebuild succeeded but no Hermes.app was found under {}\",\n            install_root.join(\"apps\").join(\"desktop\").join(\"release\").display()\n        )\n    })?;\n\n    let same = match (rebuilt_app.canonicalize(), target_app.canonicalize()) {\n        (Ok(a), Ok(b)) => a == b,\n        _ => rebuilt_app == target_app,\n    };\n    if same {\n        emit_log(\n            app,\n            Some(\"install\"),\n            LogStream::Stdout,\n            &format!(\n                \"[update] rebuilt app is already the launch target: {}\",\n                target_app.display()\n            ),","sourceCodeStart":980,"sourceCodeEnd":1016,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/apps/bootstrap-installer/src-tauri/src/update.rs#L980-L1016","documentation":"macOS-only failure in install_macos_app_update: the `hermes desktop --build-only` rebuild reported success, but resolve_hermes_desktop_app() found no Hermes.app under <install_root>/apps/desktop/release. The updater will not guess a destination, so it aborts rather than installing a nonexistent bundle.","triggerScenarios":"The desktop build succeeded but emitted its bundle to a non-default release directory (custom build config changed the output path); a partial build wrote only some artifacts; the release dir was cleaned between build and install; bundle name changed from Hermes.app.","commonSituations":"Developer customization of electron-builder output paths; a build that skipped the macOS bundle target (built only the JS side); race with disk-cleanup tools removing large build outputs; renaming the product without updating the resolver.","solutions":["List <install_root>/apps/desktop/release — see what was actually produced and where the .app landed.","If the bundle is elsewhere (config-driven), point the build config back to the default release path or fix resolve_hermes_desktop_app's search set.","Clean-rebuild the desktop app (`hermes desktop --build-only`) and confirm Hermes.app exists before retrying the update."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// After `--build-only`, assert the expected artifact exists before installing.\nlet expected = install_root.join(\"apps\").join(\"desktop\").join(\"release\");\nlet bundle = crate::bootstrap::resolve_hermes_desktop_app(&install_root);\nif bundle.is_none() {\n    eprintln!(\"no Hermes.app under {} — check where electron-builder emitted the bundle\", expected.display());\n}","typeGuard":"fn rebuilt_bundle_present(install_root: &std::path::Path) -> Option<std::path::PathBuf> {\n    let app = crate::bootstrap::resolve_hermes_desktop_app(install_root)?;\n    app.join(\"Contents\").join(\"MacOS\").is_dir().then_some(app)\n}","tryCatchPattern":null,"preventionTips":["Keep electron-builder output paths at their defaults so the resolver can find the bundle.","Verify apps/desktop/release contains Hermes.app after every local build before scripting updates.","Don't clean the release directory between the rebuild and install steps."],"tags":["macos","build","update","filesystem","bootstrap-installer"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}