Hermes Agent Deep Cuts: One Slash Command Can Load a Whole Review Protocol
Created bundle: .../skill-bundles/review-pass.yaml
Invoke with: /review-pass (loads 2 skills)
That was the output from a real hermes bundles create run in a throwaway Hermes home. The command made a YAML file, not a new skill, and it did not install either referenced skill. That distinction is where bundles become useful, and where people can mistake a tidy shortcut for a complete workflow.
A bundle is a message composer
A bundle lives in ~/.hermes/skill-bundles/<slug>.yaml. Its skills list names skills that must already exist. Calling /<bundle> loads each available member and combines the skill content with an optional instruction and the text after the slash command into one user message.
The implementation keeps a mapping from slash command to parsed YAML. It scans bundle files and caches the result using modification times. Invocation then resolves each member through Hermes’s skill loader, builds the combined message, and returns the loaded and missing names. The bundle itself does not edit the system prompt, so it does not require rebuilding the prompt cache. This is why bundles are a lightweight dispatch layer rather than another way to install or permanently preload skills.
Create a repeatable review command like this:
hermes bundles create review-pass \
--skill github-code-review \
--skill test-driven-development \
--description "Review and test changes" \
--instruction "Check the changed surface before proposing fixes."
Then run it in a chat:
/review-pass inspect the authentication change in this branch
The instruction is prepended to the combined skill content. Keep it specific to how the skills should work together. If it simply repeats what one member already says, it spends context without changing the workflow.
For a shared setup, bundle YAML is small enough to keep in dotfiles and link into each Hermes home. The skills documentation gives the schema and CLI management commands. A profile-specific bundle directory matters: a bundle created under one profile’s home is not automatically available to another.
Dispatch has a few sharp edges
A bundle does not fail just because a member is absent. Hermes loads the members it can resolve and puts a note about missing names into the message. That partial success can be easy to miss if you expect the slash command itself to certify that every skill is present.
Disabled skills are also filtered again during invocation. The bundle loader explicitly applies the disabled-skill set because it loads member payloads directly, outside the regular skill-command scan. This check takes the active platform into account in gateway dispatch. A bundle therefore cannot be used to sneak a disabled skill back into a message.
Bundle slugs take precedence over skill slugs. If both are named review-pass, /review-pass resolves to the bundle. This is deliberate, but it can silently change what a familiar slash command means after a bundle is added. Choose names that describe the workflow, not a member skill.
The YAML reader also rejects a bundle without a non-empty skill list. Invalid YAML or duplicate bundle slugs are logged and skipped. For duplicate slugs, the first file in sorted order wins, so two files that normalize to the same slug do not merge.
Create and inspect without changing your profile
Hermes accepts a profile option for CLI commands. To test bundle management without touching your normal profile, point the invocation at a disposable Hermes home through the supported home environment, then list and inspect the generated bundle:
export HERMES_HOME="$HOME/.hermes/cache/scratch/bundle-test/home"
hermes bundles create review-pass \
--skill github-code-review \
--skill test-driven-development \
--description "Review and test changes" \
--instruction "Check the changed surface before proposing fixes."
hermes bundles list
hermes bundles show review-pass
The CLI output confirms the command name, member count, file path, and instruction. The actual test used a temporary home and returned /review-pass with two skills. Remove the test directory when you are done. Do not use --force in a real home unless replacing the existing YAML is intentional. The CLI documents --force as an overwrite, not a merge.
For routine inspection, hermes bundles list and hermes bundles show <name> are safer than opening an editor in the profile by guesswork. hermes bundles reload explicitly rescans and reports changes. Normal discovery also checks directory and file modification times, but reload gives you a direct confirmation after an externally managed YAML update.
Verify the command actually loads what you expect
Start with the stored definition:
hermes bundles show review-pass
Check the member names and the extra instruction. Then invoke /review-pass with a task and confirm the loaded-skill header names both skills. If one is absent, install or enable it in that profile and repeat. A successful create output only proves that the bundle file was written; it does not prove the referenced skills exist or that the runtime can load them.
That is the right mental model for bundles: a named composition of skills at the moment of invocation. They save repeated typing, but the slash command is not a dependency lockfile and it is not a guarantee that every step of your team’s process ran.
Sources
- Skills System: Skill Bundles, official Hermes documentation for YAML fields, management commands, and behavior.
- Slash Commands Reference, official documentation for skill and bundle slash command dispatch.
agent/skill_bundles.py, loader, cache, invocation message, disabled-member filtering, and file operations.hermes_cli/bundles.py, CLI create/list/show/delete/reload implementation.