Repository navigation
Add Hermes as a selectable default agent - #7392
Signal-Six wants to merge 13 commits into
Conversation
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.
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
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.
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
c803951 to
f411ba9
Compare
|
Hi @Signal-Six — thank you for building this on the existing default-agent architecture. I’m coordinating a focused Hermes/Omarchy compatibility pass and would much rather collaborate on your PR than create competing work. I checked out the current head (
We are preparing a narrow, tested correction locally: default-agent/install/skills/migration/docs/tests only—no desktop, usage-panel, or HUD scope. We will also account for overlap with #7469 rather than duplicating its installer work. Would you be open to collaborating on revisions? I can first give you a patch/commit series to cherry-pick, or, if you prefer and explicitly grant |
|
Thanks for getting Hermes into the default-agent flow. I pulled this against the current
The material differences from this PR are:
Focused Hermes/default-agent/menu tests and the complete CLI suite pass. The full shell run matches untouched Quattro's host-dependent failures on the non-Omarchy review machine. I have not opened another PR. Please reuse or cherry-pick anything useful; the goal is to consolidate the existing Hermes work rather than compete with it. |
|
Thanks and I'm glad it passed! I'm pretty new to all of this so I'd welcome any revisions. I think I missed PR #7469 since I was looking specifically for integrating Hermes into the crash-diagnosis flow (since I already had it installed locally independent of Quattro). So, yes, I think a conservative approach would be best. I grant |
…onciled # Conflicts: # bin/omarchy-agent # bin/omarchy-default-agent # manual/17-ai.md # test/shell.d/default-agent-test.sh # test/shell.d/menu-test.sh
|
@Signal-Six — thank you. I verified everything on the branch and have one access step left on your side. Your head ( One blocker: |
|
Invitation 330452785 sent. I've also updated the PR on my side to account for the addition of Ori. I can push the update if necessary. |
|
@Signal-Six — invitation received and access verified. I fast-forwarded the verified series to I re-fetched the branch and current Correction to my earlier wording: the final behavior is:
The live PR description still documents the superseded pipx/mise path and incorrectly says crash diagnosis will ask before acting. GitHub reports that Re-verification on the exact pushed head: focused CLI, default-agent, menu, installer, migration, prompt-holder, and provision suites pass; shell syntax and |
|
@Signal-Six — one final author-only correction remains. The branch itself needs no further update: exact head The live PR description still says Please replace the PR description with the audited text below. It is derived from the exact pushed source and current validation evidence; no separate Ori reconciliation should be pushed. Maintainers retain the final installer-lifecycle and merge decision. Ready-to-paste replacement PR description## Summary
- Add Hermes (Nous Research) as a selectable default agent under **Setup > Defaults > Agent**, alongside Ori and the existing harnesses.
- Install Hermes through its supported upstream `install.sh`, using an Omarchy-marked lazy launcher rather than an unsupported pipx/PyPI package.
- Keep ordinary interactive Hermes launches approval-gated while making seeded prompt launches explicitly unattended.
- Give Hermes crash diagnosis a dedicated terminal flow with immediate status, live progress, a persistent report, same-session follow-ups, and explicit Enter-to-close behavior.
- Provision Omarchy's shipped skills under `~/.hermes/skills` for new and existing users while preserving user-owned Hermes installations.
## Why
Omarchy's crash diagnosis hands a coredump and the `diagnose-crash` skill to the selected default agent. Hermes was not selectable in that flow, and its supported installation and approval semantics differ from the mise-managed harnesses. This change integrates Hermes without pretending it is a pipx package or hiding when approvals are bypassed.
## Installation and lifecycle
Fresh Omarchy users receive a marked lazy launcher at `~/.local/bin/hermes`. Selecting Hermes or running that launcher invokes Hermes' official installer from `https://hermes-agent.nousresearch.com/install.sh` with setup deferred, then opens `hermes setup` for one-time provider configuration.
After installation, Hermes owns its own updates through `hermes update`. Omarchy does not overwrite or update an existing real Hermes launcher. **Remove Preinstalls** deletes only the marked Omarchy stub and preserves real or user-owned Hermes installations and symlinks.
## Launch and approval behavior
- Interactive launches from the menu, hotkey, or terminal alias run plain `hermes` and remain approval-gated.
- Inline seeded prompts run `hermes -z <prompt>`, whose one-shot mode auto-bypasses approvals.
- Seeded prompts in a dedicated terminal, including crash diagnosis, run `hermes chat -q <prompt> --yolo`, which also bypasses approvals.
Prompted Hermes launches are therefore unattended by design; they do **not** ask before running diagnostic tools.
## Crash diagnosis UX
Clicking a **Process crashed** notification still routes the coredump through the selected default agent and Omarchy's `diagnose-crash` skill. For Hermes, the dedicated holder:
- immediately says that diagnosis may take a few minutes;
- streams Hermes startup, reasoning, and tool activity live;
- keeps the completed report or error visible;
- captures the Hermes session ID and resumes the same session for typed follow-ups;
- closes only when the user presses Enter on an empty prompt; and
- removes temporary output files on normal exit or interruption.
Manual diagnosis remains available with `omarchy agent crash <pid>`.
## Skills and migration
The existing-user migration creates the supported lazy launcher unless **Remove Preinstalls** was previously selected, and links Omarchy's shipped skills into `~/.hermes/skills`. The migration is idempotent and preserves existing Hermes commands. New-user provisioning creates the same skill links.
## Validation
Verified at head `b58f5518`:
- `./test/cli`
- `bash test/shell.d/default-agent-test.sh`
- `bash test/shell.d/menu-test.sh`
- `bash test/shell.d/hermes-installer-test.sh`
- `bash test/shell.d/agent-hermes-prompt-test.sh`
- `bash test/shell.d/provision-user-test.sh`
- migration and Remove Preinstalls preservation checks
- shell syntax checks and `git diff --check`
- clean reconciliation against current `quattro` `0ae16948`, retaining both Ori and Hermes in all five formerly conflicting files
The aggregate suite's 12 failing test files reproduce identically on untouched `quattro` and require host-only Lua/tooling/checkouts/hybrid-GPU hardware; no Hermes-specific failure remains.
Real acceptance was also completed in a disposable Omarchy 4.0 VM: Hermes installed through the default-agent picker, and a real crash-notification click showed the diagnosis and retained the completed report at the follow-up prompt rather than opening blank or auto-closing. |
|
Looks like the right default-agent PR (install.sh stub, interactive Hermes stays gated). One miss vs #8611: skill links only go to Happy to close #8611 if you absorb that loop. |
|
@envosloth Understood. Updated the description with the markdown you provided. @smfworks Thanks, that loop looks correct. Happy for this PR to take the existing-profile ln -sfn (without creating profiles) if that’s cleaner than keeping #8611 separate. I can try it, or envosloth can fold it in the same way as the earlier series. |
Folds in the existing-profile loop from omacom#8611: provision-user and the Hermes migration symlink shipped skills into each existing ~/.hermes/profiles/<name>/skills without creating profiles, with test and doc coverage.
|
@smfworks @Signal-Six — folded the existing-profile loop into this PR, so #8611 can be closed. Head is now
Validation: provision-user, hermes-installer, agent-hermes-prompt, default-agent, and menu shell suites all pass; @smfworks — if this looks right, #8611 is redundant and can be closed. |
|
@envosloth Thanks for folding the profile loop into #7392. Keeping #8611 open anyway: omarchybot asked us to leave it separate on #7469 so the skill links can land on quattro now, without waiting on the unpublished Hermes release that is holding #7469/#8705. If #7392 merges first with that loop, we'll close this. |
|
Closing in favour of #7469, which now covers both substantive pieces of this. The skills linking lands via #8611, which #7469 takes: The prompted launch lands via #8705, using Hermes' own Thanks for this. Nothing here is lost, and the "prompt should not answer and vanish" point was right well before it was fixed. |
Summary
install.sh, using an Omarchy-marked lazy launcher rather than an unsupported pipx/PyPI package.~/.hermes/skillsfor new and existing users while preserving user-owned Hermes installations.Why
Omarchy's crash diagnosis hands a coredump and the
diagnose-crashskill to the selected default agent. Hermes was not selectable in that flow, and its supported installation and approval semantics differ from the mise-managed harnesses. This change integrates Hermes without pretending it is a pipx package or hiding when approvals are bypassed.Installation and lifecycle
Fresh Omarchy users receive a marked lazy launcher at
~/.local/bin/hermes. Selecting Hermes or running that launcher invokes Hermes' official installer fromhttps://hermes-agent.nousresearch.com/install.shwith setup deferred, then openshermes setupfor one-time provider configuration.After installation, Hermes owns its own updates through
hermes update. Omarchy does not overwrite or update an existing real Hermes launcher. Remove Preinstalls deletes only the marked Omarchy stub and preserves real or user-owned Hermes installations and symlinks.Launch and approval behavior
hermesand remain approval-gated.hermes -z <prompt>, whose one-shot mode auto-bypasses approvals.hermes chat -q <prompt> --yolo, which also bypasses approvals.Prompted Hermes launches are therefore unattended by design; they do not ask before running diagnostic tools.
Crash diagnosis UX
Clicking a Process crashed notification still routes the coredump through the selected default agent and Omarchy's
diagnose-crashskill. For Hermes, the dedicated holder:Manual diagnosis remains available with
omarchy agent crash <pid>.Skills and migration
The existing-user migration creates the supported lazy launcher unless Remove Preinstalls was previously selected, and links Omarchy's shipped skills into
~/.hermes/skills. The migration is idempotent and preserves existing Hermes commands. New-user provisioning creates the same skill links.Validation
Verified at head
b58f5518:./test/clibash test/shell.d/default-agent-test.shbash test/shell.d/menu-test.shbash test/shell.d/hermes-installer-test.shbash test/shell.d/agent-hermes-prompt-test.shbash test/shell.d/provision-user-test.shgit diff --checkquattro0ae16948, retaining both Ori and Hermes in all five formerly conflicting filesThe aggregate suite's 12 failing test files reproduce identically on untouched
quattroand require host-only Lua/tooling/checkouts/hybrid-GPU hardware; no Hermes-specific failure remains.Real acceptance was also completed in a disposable Omarchy 4.0 VM: Hermes installed through the default-agent picker, and a real crash-notification click showed the diagnosis and retained the completed report at the follow-up prompt rather than opening blank or auto-closing.