hermes-guide
AGENTS.md6 starsChanged 8 days agoMITView on GitHub
Always-on operating contract for AI agents working in this repository. Keep this file short: every coding turn pays its full cost via CLAUDE.md and Cursor rules. Deep ops live under docs/agent/ — open the row that matches the task, not the whole of deep-ops.md or review-ops.md. It is not a Hermes tutorial. Per-surface knowledge lives in skills/; the authoring standard lives in CONTRIBUTING.md. Where those two disagree, CONTRIBUTING.md wins on what to write and this file wins on how to…
- Pipes a download into a shell
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,843 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository32 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- diagnosing-authSkill
- diagnosing-backupSkill
- diagnosing-bot-modeSkill
- diagnosing-browserSkill
- diagnosing-cli-tuiSkill
- diagnosing-commandsSkill
- diagnosing-configSkill
- diagnosing-cronSkill
- diagnosing-desktopSkill
- diagnosing-gatewaySkill
- diagnosing-hooksSkill
- diagnosing-host-pressureSkill
- diagnosing-mcpSkill
- diagnosing-memoriesSkill
- diagnosing-memorySkill
- diagnosing-pathSkill
- diagnosing-pluginsSkill
- diagnosing-profilesSkill
- diagnosing-providersSkill
- diagnosing-runtimeSkill
- diagnosing-secretsSkill
- diagnosing-sessionsSkill
- diagnosing-skillsSkill
- diagnosing-storageSkill
- diagnosing-triageSkill
- diagnosing-updateSkill
- diagnosing-voiceSkill
- hermes-configuration-guideSkill
- hermes-post-updateSkill
- installing-hermesSkill
- plugin-authoringSkill
The file
We split this AGENTS.md into the rules it gives an agent
8 rules. About 0 are common, 3 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 3
Always-on operating contract for AI agents working in this repository.
- Very specific: line 19
Complement, don't duplicate: Prefer built-in hermes doctor / helpers when they already answer.
- Very specific: line 21
Read-only: No config mutation, no auto-fix, no privileged capabilities: without a concrete need (tools/check_no_mutation.py).
- Distinctive: line 103
Never git add -A. Stage named paths.
- Very specific: line 160
Confirm no skill version regressions: before the bump: python tools/check_skill_version_bump.py origin/master — 0 failures.
- Very specific: line 185
Tag, verify, push, and re-pin: create the tag annotated and signed — git tag -s v<plugin.yaml version> master (local tag.gpgsign true makes …
- Very specific: line 219
Verify any cross-platform skill on BOTH environments.
- Distinctive: line 232
NEVER merge on green CI alone: Follow the complete procedure in docs/agent/review-ops.md#pre-merge-cross-check.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
AGENTS.md
Always-on operating contract for AI agents working in this repository. Keep
this file short: every coding turn pays its full cost via CLAUDE.md and Cursor
rules. Deep ops live under docs/agent/ — open the row
that matches the task, not the whole of deep-ops.md or review-ops.md.
It is not a Hermes tutorial. Per-surface knowledge lives in skills/; the
authoring standard lives in CONTRIBUTING.md. Where those two
disagree, CONTRIBUTING.md wins on what to write and this file wins on how
to work in the repo.
Identity and non-goals
hermes-guide is a curated Hermes plugin catalog entry (hermes-guide,
community tier) plus a skills tap. It inspects Hermes; it contains zero
Hermes source and is not a fork of hermes-agent.
- Complement, don't duplicate. Prefer built-in
hermes doctor/ helpers when they already answer; trim any check that starts overlapping a built-in. - Read-only. No config mutation, no auto-fix, no privileged
capabilities:without a concrete need (tools/check_no_mutation.py). - Never rebrand Hermes CLI output. Parse it into check envelopes; do not rewrite upstream messages as ours.
- Not core, permanently. hermes-guide will not seek to become part of Hermes
core, and no change to Hermes code or behavior is filed upstream for this
plugin's benefit. The exception is its own catalog listing, which lives in the
upstream repository at
plugin-catalog/hermes-guide.yamlunderNousResearch/hermes-agent— that entry is ours to maintain, so pin bumps and disclosure edits there are ordinary maintenance reviewed like any other entry. Genuine Hermes defects found while diagnosing still go upstream as ordinary bug reports — the rule is about this plugin's scope, not about withholding real findings.
What ships
<!-- BEGIN GENERATED: inventory -->- Plugin —
plugin.yaml+__init__.py/checks.py/constants.py. Registers/hermes-doctorandhermes guide(twelve read-only health checks: config, mcp, skills, commands, hooks, plugins, memories, sessions, storage, dashboard, update, gateway). - Skills —
thirty-oneskills/<name>/SKILL.mdfiles: one install guide (installing-hermes), one configuration map (hermes-configuration-guide), twenty-sevendiagnosing-*playbooks, two other skills (hermes-post-update,plugin-authoring). They install separately, through the skills tap.
<!-- END GENERATED: inventory -->Catalog install: hermes plugins install hermes-guide. Skills: hermes skills
tap add iap/hermes-guide. $HERMES_HOME is ~/.hermes on POSIX and
%LOCALAPPDATA%\hermes on native Windows; hermes config path is ground truth.
Repo layout encyclopedia: docs/agent/layout.md.
Where a change goes
| Change | Touch |
| Upstream name/value drift | constants.py |
| New or changed health surface | checks.py + _CHECKS, then skill text if users need a fix path |
| How-to / troubleshooting | skills/<name>/SKILL.md + version bump + provenance footer |
| Repo CI / guard / regression | tools/check_*.py or tools/test_*.py, wired into reusable-ci.yml when it must gate PRs |
| Which gates run locally | tools/check_gates.py + .pre-commit-config.yaml. CI stays the authority |
| Generated doc blocks | tools/render_docs.py, never by hand |
| Agent deep-ops prose | docs/agent/, not a longer AGENTS.md |
Run this before you claim done
python tools/check_gates.py # hermetic tier — no network/Hermes; count via --list (four gates read the git index: test_skill_counts, check_doc_style, check_eol_contract, check_scope_enumeration)
python -m py_compile __init__.py checks.py constants.py
hermes plugins doctor . --ci # needs a local Hermes; if it times out on a degraded host, record `not run` with causepython tools/check_gates.py --list prints the tier and what it leaves to CI.
Adding a skill or editing a SKILL.md also means:
python tools/render_docs.py --write # refresh generated blocks (never hand-edit inside them)
python tools/check_skill_version_bump.py origin/master
python tools/check_skill_provenance.pyCI adds tools/test_*.py, citation integrity, install-scan parity, mypy, and bandit. Skip → say
not run in the PR validation table. Full testing/security/git rules:
docs/agent/deep-ops.md.
[!NOTE] Guards in
tools/read text. Executable scripts inskills/*/scripts/need behavioral coverage intools/test_*.py— a green guard suite is not evidence the script is correct.
Hard contracts (one line each)
| Contract | Guard / owner |
Three output layers never mixed (Hermes CLI / plugin envelopes / harness OK:/FAIL) | deep-ops.md |
| Checks return envelopes; plugin formats UX | __init__.py / checks.py |
Read-only plugin; empty capabilities: | check_no_mutation.py |
Drift-prone names live in constants.py | check_upstream_drift.py |
| Skill version bumps up; provenance footer dated only when facts re-checked | check_skill_version_bump.py, check_skill_provenance.py |
Citations resolve against .github/upstream-drift.baseline | check_citation_integrity.py |
Finding IDs are public API: add FINDING_IDS entries, never rename; docs/findings.md is generated | test_finding_ids.py, render_docs.py |
hermes guide --json is one stdout document; no update notice; /hermes-doctor stays text | deep-ops.md |
Hooks default to in-process check_hooks_readonly() (executes nothing); --deep runs hermes hooks doctor, which executes approved hooks once; --fast wins when both are given | deep-ops.md |
Review threads: enumerate reviewThreads, reply with evidence, then resolve; isOutdated is not a fix | review-ops.md |
| Reviewer order: Qodo auto-reviews (never re-triggered per head); CodeRabbit full review once after Qodo clean, then incremental per head until clean | review-ops.md |
| Tone / no emoji / no filler | CONTRIBUTING.md#tone, check_doc_style.py |
Never git add -A. Stage named paths. Platform facts: three claim tiers
(shared / cross-platform prose / platform-owned); WSL is its own class — see
deep-ops.md. Name the verifying
host in the PR Environment block.
Traps
[!IMPORTANT] Don't guess Hermes hook event names. The valid set is
hermes_cli/plugins.py::VALID_HOOKSand it grows across releases — read the installed source, never a hardcoded count.
[!WARNING] Don't confuse Hermes with Claude Code or ZCode. Hermes has no standalone command files (commands come from built-ins, skills-as-slash, bundles, and plugins), hooks span four separate systems, and plugins are
plugin.yaml+register(ctx)— notplugin.json. Seediagnosing-commandsanddiagnosing-hooks.
[!WARNING] Don't confuse hermes-guide with hermes-agent.
hermes-agent(NousResearch) is the assistant itself — CLI, runtime, doctor, skills engine; its bugs go upstream.hermes-guide(this repo) is a diagnostics plugin + skills tap that only inspects Hermes. Never edit~/.hermes/hermes-agentsource to fix a guide finding, and never file guide bugs upstream (or Hermes bugs here) — confirm which component is defective first (hermes --version, install directory,hermes guideoutput).
[!WARNING] Don't hardcode a venv path. Older checkouts carry
venv/and.venv/side by side andproject_venv_dir()resolvesvenvfirst; PM-era installs have no in-tree venv at all andproject_venv_dir()returnsNoneeven when a dependency environment exists — ask PM (committed_venv()for the directory,project_python()for the interpreter, and they are not interchangeable).diagnosing-pathhas the resolution order and the cross-platform patterns.
[!NOTE] An untracked
skills/<name>/fails the pre-commit hook. The gates read the working tree, so a new skill directory that is not yet staged breaks the count and routing gates on every commit.git addorgit stashit first.
[!TIP] Hermes configuration is YAML, never JSON. And every diagnosis should end in a concrete action: a
hermes <subcommand>, or a specific file + field edit, followed by a/reload-*or a restart.
[!WARNING] On hosts whose macOS < 13, do not let a full
hermes updatere-resolve the node tool. Handling, pins, and upstream tracking live in deep-ops.md — Host limitation register.
Release flow (agent checklist)
Releases ship via stacked PRs and tag-gated releases. Working checklist for any release-related change (the authoritative, always-current source is CONTRIBUTING.md#cutting-a-release):
- Confirm no skill version regressions before the bump:
python tools/check_skill_version_bump.py origin/master— 0 failures. A downgradedSKILL.mdversion is a bug, not a release note. The version-bump PR also runs the release guard (python tools/check_no_active_release.py --version <proposed>), which refuses the bump while a release is active (latest tag created within--window-hours, default 48h) or when the proposed version is already a git tag (a redundant release). ACHANGELOG.mdsection for the new version is required by design and is not a refusal signal. - Bump the version in all five sites (
plugin.yaml,__init__.py,SECURITY.mdpolicy sentence + supported table,pyproject.toml), with the bump uncommitted. - Generate the section in the same checkout:
python tools/gen_changelog.py --upcoming. Requiresgit fetch --tags— the tag half of the check is invisible without tags. - Commit the bump and the section together, then run
python tools/check_gates.py— all hermetic gates in--listmust pass locally; the gates it leaves to CI must pass in CI before merge. - Merge the PR, then check readiness on the merged master:
python tools/check_release_readiness.py. It fails a dirty tree or a non-masterbranch; when theorigin/masterfetch fails it reports sync as an advisory, so confirmHEAD == origin/masterby hand before tagging. - Audit the one drift direction the guard cannot see (docs/agent/deep-ops.md,
"Values that drift go in
constants.py"):git ls-tree -d --name-only <upstream-head>:plugins/vs PLUGIN_SUBCATEGORY_DIRS. - Tag, verify, push, and re-pin: create the tag annotated and signed —
git tag -s v<plugin.yaml version> master(localtag.gpgsign truemakes this the default; same SSH key as commit signing — ifgit tag -sfalls back to GPG or fails, configuregpg.format=sshanduser.signingkeyfirst). Setgit config gpg.ssh.allowedSignersFile .github/allowed_signers, then rungit tag -v v<version> 1>/dev/nulland confirm its first (stderr) line starts withGood "git" signature for— stdout carries the tag payload, so an unredirected check can showobject ...even for a valid tag. Then pushv<plugin.yaml version>to master, then re-pin the upstream catalog entry (NousResearch/hermes-agent,plugin-catalog/hermes-guide.yaml): sha =git rev-parse v<version>^{commit}, version = tag without thev. Refresh an open pin PR rather than opening a second one; runpython scripts/validate_plugin_catalog.py plugin-catalogin that clone, then re-runpython tools/check_release_readiness.pyhere. - Verify the release:
release.ymlfails closed unless the tag matches plugin.yaml, the tagged commit is on master, every tag has a changelog section, and the tag is annotated + SSH-signed (verifier line first, against.github/allowed_signers). Confirm withgh release view v<version>after creation.
The full procedure, including readiness verdicts and the drift audit, is CONTRIBUTING.md#cutting-a-release. Deep-ops reference material lives in docs/agent/deep-ops.md.
Dual-environment verification
This repo is maintained from Windows + NixOS WSL in parallel. Both targets must be verified independently:
- Windows — standard installer (
curl | bash), Tier 1 (supported). - NixOS WSL — standard installer in WSL, Tier 1 (supported). Nix bundle is
Tier 2 (best-effort), immutable, uses
uv2nixfor build-time only.
Verify any cross-platform skill on BOTH environments. Document the verifying
host in the PR Environment block. NixOS WSL standard install is mutable: the
plugin is at ~/.hermes/plugins/<name>/ (NOT /nix/store/).
Before you finish
State plainly what you checked, what passed, and what you skipped. A validation
table with honest not run entries is accepted; a claim that outruns the evidence
is not — validate-claim.yml re-runs the hermetic gates against your PR head and
fails the check if your table does not match reality.
Pre-merge cross-check (MANDATORY)
NEVER merge on green CI alone. Follow the complete procedure in docs/agent/review-ops.md#pre-merge-cross-check.
Key points: Qodo is the automatic primary — post /agentic_review only when it has never reviewed the PR, never per head; CodeRabbit full review once after Qodo's findings are resolved, then @coderabbitai review (incremental) per head until its check completes clean, never resolve threads manually. All required checks passing (not pending), Qodo has no open findings on the current head, mergeStateStatus: CLEAN, explicit merge authorization recorded, fresh green CI on fixed head.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

