Skip to content

feat(agents): add Hermes agent support#74

Merged
RealZST merged 12 commits into
RealZST:mainfrom
zahariadaniel16:main
Jun 5, 2026
Merged

feat(agents): add Hermes agent support#74
RealZST merged 12 commits into
RealZST:mainfrom
zahariadaniel16:main

Conversation

@zahariadaniel16

@zahariadaniel16 zahariadaniel16 commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Adds Hermes (by Nous Research, installed at ~/.hermes) as a fully supported ninth agent alongside Claude Code, Codex, Gemini CLI, Cursor, Antigravity, Copilot, Windsurf, and OpenCode.
  • Introduces Hermes-specific category-aware skill install — skills in Hermes are organized into named subdirectory categories (e.g. apple/, devops/, github/). All three install paths (local, git, marketplace) and the cross-agent deploy flow show a category picker when Hermes is the target.
  • Fixes stale detail panel paths after cross-agent install: new instances are detected and their content + skill locations are loaded without navigating away.

Changes

Rust (hk-core)

  • adapter/hermes.rs (new): HermesAdapter implementing AgentAdapter. Scans ~/.hermes/skills/{category}/ across all category dirs (write target: local/). Reads MCP servers from ~/.hermes/config.yaml (YAML, both URL-based and command-based). No hooks or user-level plugins. Surfaces SOUL.md, memories/, and config.yaml on the Agents page. Project marker: .hermes/skills/local.
  • McpFormat::HermesYaml + serde_yaml = "0.9": full deploy/remove/restore/read for Hermes's YAML config format in deployer.rs and kits/install_plan.rs.
  • service::install_to_agent: new hermes_category: Option<&str> param resolves the target dir to ~/.hermes/skills/{category}/ instead of the default local/.
  • list_hermes_categories command + web route: returns sorted subdirectory names from ~/.hermes/skills/ for the frontend picker.
  • install_from_local and install_from_marketplace in all command handlers (Tauri + web) accept hermes_category.

Frontend

  • Official Hermes SVG mascot with hover-float and click-spin animations.
  • Hermes added to AGENT_ORDER, AGENT_DISPLAY_NAMES, and onboarding scatter positions.
  • Category picker (pill row + "New" text input) wired into:
    • Install dialog (local + git install modes)
    • Marketplace agent install buttons
    • Extension detail panel cross-agent deploy
  • Immediate path refresh: a new useEffect on group?.instances.length loads content and skill locations for newly-added instances right after a cross-agent install.

Test plan

  • cargo test --workspace passes (507 tests)
  • npm test passes (223 tests)
  • Hermes appears in Agents list as detected with correct skill/MCP counts
  • Skills visible in Extensions tab filtered by hermes
  • MCP entry from ~/.hermes/config.yaml appears
  • Installing a skill via local path to Hermes shows category picker; skill lands in selected ~/.hermes/skills/{category}/
  • Marketplace Hermes install button shows category picker
  • Cross-agent deploy to Hermes from detail panel shows category picker
  • Paths section refreshes immediately after cross-agent install

zahariadaniel16 and others added 12 commits June 2, 2026 10:48
Adds Hermes (by Nous Research) as a fully supported agent alongside the
existing 8. Hermes is detected at ~/.hermes and manages skills organized
into named category subdirectories (e.g. apple/, devops/, github/).

Rust (hk-core):
- New HermesAdapter: scans ~/.hermes/skills/{category}/ across all
  category dirs; global write target is ~/.hermes/skills/local by
  convention; MCP servers read from ~/.hermes/config.yaml (YAML format,
  both URL-based and command-based entries); no hook or plugin support.
- McpFormat::HermesYaml + serde_yaml dependency: full deploy/remove/
  restore/read support for Hermes's YAML config format.
- service::install_to_agent gains hermes_category: Option<&str> so
  cross-agent deploys can target any category directory, not just local.
- install_from_local and install_from_marketplace also accept
  hermes_category in all command handlers (Tauri + web).
- list_hermes_categories command/route exposes available category dirs.
- Project marker: .hermes/skills/local (HK-managed convention).

Frontend:
- Official Hermes SVG mascot with float/spin animations.
- Hermes added to AGENT_ORDER, display names, and onboarding scatter.
- Category picker (pill row + New input) in all three install paths:
  install dialog (local/git), marketplace agent buttons, and extension
  detail panel cross-agent deploy.
- Extension detail: new effect refreshes skill locations and loads
  content for newly-added instances immediately after cross-agent
  install, without navigating away.
… shared component, remove dead code

Extract the duplicated 'tag buttons + new-input' UI (install dialog,
detail page, marketplace) into a single shared HermesCategoryPicker.
Remove dead code and backend/frontend duplication left by the PR.
Baseline for the full Hermes support work (hooks/plugins/MCP/skills).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…hrough it

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s-agent)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ml plugins.enabled)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…isable→enable

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…th tooltip

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…disable)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e, Hermes true)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… secrets/keys, no snapshot)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hermes was the only agent without a dedicated filter color, falling back
to the default gray. Add --agent-hermes (amber/gold, matching Nous
Research's official 'amber-on-dark' Hermes brand: #FFD700 dark / #8B6508
light) across all theme blocks + the @theme registration, and wire it
into AGENT_FILTER_COLORS. Distinct from every existing agent/semantic hue.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…by native toggle)

Hermes MCP enable/disable now flips the native `enabled` field in place
(set_hermes_mcp_enabled), so toggle_mcp's remove+snapshot+restore path is
never reached for Hermes. The HermesYaml arms of restore_mcp_server and
read_mcp_server_config were therefore dead; replace them with unreachable!()
documenting the invariant, and drop the now-moot restore test (its behaviour
is covered by test_hermes_mcp_native_disable_enable_in_place). deploy/remove
HermesYaml paths are untouched (still used by install/uninstall/kits).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@RealZST

RealZST commented Jun 5, 2026

Copy link
Copy Markdown
Owner

Thanks for adding Hermes!

I verified the integration against the upstream Hermes docs and pushed maintainer fixes on top of your commit.

What changed, commit by commit:

Corrected against upstream docs

  • Hooks — the PR said Hermes has none, but it does: Hermes — Event Hooks (root hooks: in config.yaml, per-event {matcher, command, timeout}). Added read + deploy/remove/restore + enable/disable + cross-agent event mapping. — f2bffdc
  • Plugins — likewise supported: Hermes — Plugins (~/.hermes/plugins/<name>/plugin.yaml, disabled-by-default via plugins.enabled). Added read + enable/disable. — 5f9f8fc
  • Skills are global-only — project-local skill discovery isn't shipped upstream yet (the implementation PR NousResearch/hermes-agent#17328 is still open), so the fabricated .hermes/skills/local project marker was dropped. Skills made global-only; project scope gated in the UI (disabled + tooltip), the same way antigravity/opencode are gated where they lack a capability. — 99d5fc5

Fixes

  • Native MCP enable/disable — Hermes has a per-server enabled: bool (Hermes — MCP Config Reference: "Skip the server entirely when false … config remains in place"). Disable now flips enabled: false in place like hermes mcp does, instead of removing the entry + DB-snapshot + redact — so env secrets and advanced keys (tools/sampling/headers/…) are preserved across disable→enable (they used to be dropped). — baa81d2, bead6df, a324ad5

Refactor / polish

  • Extracted one modify_hermes_yaml primitive so every Hermes YAML write (MCP/hooks/plugins) goes through a single path. — e11f217
  • Deduped the category-picker UI (install dialog / detail panel / marketplace) into one shared component + removed dead code. — f8abc45
  • Added the Hermes agent filter color (brand gold, matching Nous's amber-on-dark branding). — fdba93f

All backend + frontend tests pass; verified end-to-end against a local ~/.hermes (hooks/plugins/MCP toggles, scope gating, category-picker installs).

Thanks again!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants