Add Hermes as a selectable default agent - #7392
Conversation
Hermes (Nous Research) joins the default agent list: it installs through the same lazy mise stubs as the other harnesses (pipx:hermes-agent), appears under Setup > Defaults > Agent, and launches unattended through the agent hotkey, the omarchy agent prompt route, and crash diagnosis. Crash handling needs no changes of its own: omarchy-agent-crash already hands the diagnose-crash skill to whichever agent is the default, so selecting Hermes routes crash toasts and "omarchy agent crash <pid>" to it directly. Unlike the other harnesses, Hermes has no "don't stop to ask" mode, so it launches in its normal approval mode: one-shot prompts go through "hermes -z <prompt>" (the same route OpenCode uses), and interactive launches stay plain. Users who want fully unattended runs can pass --yolo themselves. Like the other harnesses, Hermes needs one-time setup after install (provider credentials, via hermes setup). The provision loop and a new migration also link the shipped agent skills into ~/.hermes/skills, where Hermes discovers global skills, so diagnose-crash and the Omarchy skill are first-class for it.
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds support for the Hermes coding agent across Omarchy’s installer, menus, migrations, and launcher/test harnesses.
Changes:
- Introduces Hermes as a selectable default agent and adds launcher behavior (
-zprompt forwarding). - Installs Hermes via
mise(pipx package) and adds a migration to create Hermes skills symlinks. - Updates shell tests, docs, and preinstall-removal logic to include Hermes.
Reviewed changes
Copilot reviewed 6 out of 10 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| test/shell.d/menu-test.sh | Extends menu expectations to include Hermes and updated sort order. |
| test/shell.d/default-agent-test.sh | Updates agent mapping/package expectations and launcher assertions for Hermes. |
| migrations/1787063342.sh | New migration to install Hermes stub (when allowed) and link skills into ~/.hermes/skills. |
| manual/17-ai.md | Documents Hermes as a supported agent. |
| install/user/mise.sh | Adds Hermes installation via omarchy-mise-install pipx:hermes-agent hermes. |
| default/omarchy/omarchy-menu.jsonc | Adds Hermes option to the default-agent menu. |
| bin/omarchy-remove-preinstalls | Ensures Hermes stub is removed when preinstalls are removed. |
| bin/omarchy-provision-user | Creates ~/.hermes/skills and symlinks skills for new users. |
| bin/omarchy-default-agent | Adds Hermes as a valid default agent selection + package mapping. |
| bin/omarchy-agent | Adds Hermes launch behavior and prompt forwarding via -z. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| echo "Install Hermes lazy mise stub" | ||
|
|
||
| if [[ ! -f $HOME/.local/state/omarchy/preinstalls-removed ]]; then | ||
| omarchy-mise-install pipx:hermes-agent hermes | ||
| fi |
There was a problem hiding this comment.
This one looks like a false positive, so I'd suggest closing as not applicable. The migration runner executes every migration with an explicit bash interpreter — bin/omarchy-migrate line 93: OMARCHY_PATH="$OMARCHY_PATH" bash -euo pipefail "$file" — so the shebang is never consulted. The repo also standardizes on shebang-free migrations: agents/skills/migrations.md and AGENTS.md both note that migration scripts intentionally omit shebangs (they may be sourced), and none of the 81 existing migrations in migrations/ have one. [[ ... ]] is therefore safe here.
If maintainers would still prefer a shebang for readability, I'm happy to add one — just flagging the convention first.
| mkdir -p ~/.hermes/skills | ||
| for skill in "$OMARCHY_PATH"/default/agents/skills/*/; do | ||
| skill=${skill%/} | ||
| name=${skill##*/} | ||
| ln -sfn "$skill" ~/.hermes/skills/"$name" |
There was a problem hiding this comment.
Good catch — fixed in c803951. The skills section now uses $HOME/.hermes/skills consistently, matching bin/omarchy-provision-user and the sibling skill-linking migrations (1786539345.sh, 1786098807.sh) which also mix the two forms; the install guard already used $HOME.
| fi | ||
|
|
||
| echo "Link Omarchy skills into the Hermes skill directory" | ||
|
|
||
| mkdir -p ~/.hermes/skills | ||
| for skill in "$OMARCHY_PATH"/default/agents/skills/*/; do | ||
| skill=${skill%/} | ||
| name=${skill##*/} | ||
| ln -sfn "$skill" ~/.hermes/skills/"$name" | ||
| done |
There was a problem hiding this comment.
The unguarded behavior is intentional and mirrors the existing crash-diagnosis wiring: bin/omarchy-provision-user creates the other four agent skill directories and symlinks unconditionally, and migration 1786539345.sh (which sets up crash diagnosis for existing installs) does the same — no preinstalls-removed check anywhere in that chain. Crash handling is a core feature of Omarchy, not an optional preinstall, so the symlinks should exist even for users who opt out of agent preinstalls; preinstalls-removed gates only the installation of agent binaries.
Since the intent deserves explanation rather than a code change, I added a comment in c803951 documenting this. Happy to add the guard instead if maintainers disagree, but I'd rather keep parity with the existing four agents.
Addresses Copilot review comments on migrations/1787063342.sh: - Consistently use $HOME for the skills directory path (matches bin/omarchy-provision-user and sibling migrations) - Document why the skill symlinks are intentionally unguarded: crash diagnosis is a core feature, and the other agent skill symlinks are created unconditionally as well
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 6 out of 10 changed files in this pull request and generated no new comments.
Suppressed comments (4)
test/shell.d/default-agent-test.sh:394
- This routes Hermes through
assert_bypassand then reports that every agent skips permission prompts, contradicting both the new launcher behavior and the PR's stated normal-approval policy. Test Hermes as a normal launch and make the aggregate message describe the configured approval modes instead.
assert_bypass hermes hermes
pass "agent launcher skips permission prompts for every supported agent"
manual/17-ai.md:16
- Adding Hermes makes the guidance later in this page inaccurate: it says every default-agent launch is unattended, while the new Hermes path deliberately uses normal approval mode and may pause for confirmation. Document that exception so users do not expect crash or prompt launches to be fire-and-forget.
| `hermes` | [Hermes](https://hermes-agent.nousresearch.com) |
test/shell.d/default-agent-test.sh:163
- The added Hermes removal check is currently vacuous: no earlier step creates
$test_home/.local/bin/hermesbecause setup and migration calls use the mockedomarchy-mise-install. Seed a Hermes stub before removal so this fails if the production removal list regresses.
This issue also appears on line 393 of the same file.
for command in omp grok crush hermes; do
migrations/1787063342.sh:4
- No shell test executes this new migration; the existing agent test only sources the earlier agent migrations. This leaves the preinstall opt-out and required Hermes skill-link migration unprotected, despite analogous migrations being covered. Add a temporary-HOME test that runs this migration with and without the marker and verifies reruns plus both skill links.
if [[ ! -f $HOME/.local/state/omarchy/preinstalls-removed ]]; then
omarchy-mise-install pipx:hermes-agent hermes
Summary
Setup > Defaults > Agent, installable through the same lazy mise stubs as the other harnesses (pipx:hermes-agent), and launchable via the agent hotkey, theomarchy agent promptroute, and crash diagnosisomarchy-agent-crashalready hands thediagnose-crashskill to whichever agent is the default, so selecting Hermes routes crash toasts andomarchy agent crash <pid>to it directlyhermes setup)Why
Hermes is a popular agent harness, and Omarchy's crash diagnosis is the first thing a user leans on when something segfaults — but Hermes was not selectable as the agent that receives those hand-offs. Every harness in the picker goes through the same three hard-coded surfaces (selection/install in
omarchy-default-agent, launch inomarchy-agent, the menu), so this change is a small, symmetric addition: one case each, one menu entry, one lazy stub, one migration line for existing installs.Launch behavior: no unattended mode
Unlike the other harnesses, Hermes has no "don't stop to ask" flag in the same spirit as
--yolo,--auto, or--approve-for-me. Rather than wire up its--yoloflag, which bypasses all approval prompts, this change launches Hermes in its normal approval mode:hermesomarchy agent prompt):hermes -z <prompt>, the same one-shot route OpenCode uses via--promptThis is deliberately more conservative than the other entries' unattended behavior: a crash diagnosis that needs to run gdb or write a core file will ask first. Users who want the other harnesses' fire-and-forget behavior can run
hermes --yolothemselves. Happy to revisit if maintainers prefer parity.Skills
Hermes discovers global skills from
~/.hermes/skills(unlike the other harnesses it does not read the generic~/.agents/skillslocation), so the provision loop gains~/.hermes/skillsand the new migration links the shippeddiagnose-crashandomarchyskills there for existing installs. With that in place the crash prompt's "read the skill files directly" fallback is no longer the load path.User impact
Install > AIis untouched: Hermes installs from the agent picker, or by runninghermesonce afteromarchy default agent hermes(first run pulls the mise package)Super + Shift + Ctrl + Aopens Hermes, crash toasts diagnose through it, andomarchy agent crash <pid>works by handRemove Preinstallsdeletes the Hermes stub like every other agent stubRelationship to other Hermes PRs
This is complementary to, and does not touch the files of:
Install > AI, launcher, theme syncingValidation
./test/cli— passesbash test/shell.d/default-agent-test.sh— passes with Hermes added to the expected-agent, package, launch-arg, and bypass tablesbash test/shell.d/menu-test.sh— passes with the Hermes entry (icon: the samenf-md-robot glyph the "Agent" group header uses; a branded glyph can be added later if/when Nous provides a monochrome single-path SVG, peragents/skills/icon-font.md)$HOME: creates the stub, respects thepreinstalls-removedopt-out, is idempotent on re-run, and links both skills into~/.hermes/skillsbash -non all changed scripts,git diff --checkcleanhermes -z "..."returns cleanly (verified on a machine with Hermes installed)bar-icon-geometry,config,runtime-smoke,snapper,unowned-system-paths) fail identically on the base commit — sandbox/environment-only, per the same caveat as Add optional Hermes desktop integration #6644's./test/allnote