agentleFS
iapiap/hermes-guide/AGENTS.md

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

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
  1. Distinctive:

    Always-on operating contract for AI agents working in this repository.

    line 3
  2. Very specific:

    Complement, don't duplicate: Prefer built-in hermes doctor / helpers when they already answer.

    line 19
  3. Very specific:

    Read-only: No config mutation, no auto-fix, no privileged capabilities: without a concrete need (tools/check_no_mutation.py).

    line 21
  4. Distinctive:

    Never git add -A. Stage named paths.

    line 103
  5. Very specific:

    Confirm no skill version regressions: before the bump: python tools/check_skill_version_bump.py origin/master — 0 failures.

    line 160
  6. Very specific:

    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 …

    line 185
  7. Very specific:

    Verify any cross-platform skill on BOTH environments.

    line 219
  8. Distinctive:

    NEVER merge on green CI alone: Follow the complete procedure in docs/agent/review-ops.md#pre-merge-cross-check.

    line 232

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
AGENTS.md

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.yaml under NousResearch/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-doctor and hermes guide (twelve read-only health checks: config, mcp, skills, commands, hooks, plugins, memories, sessions, storage, dashboard, update, gateway).
  • Skills — thirty-one skills/<name>/SKILL.md files: one install guide (installing-hermes), one configuration map (hermes-configuration-guide), twenty-seven diagnosing-* 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

ChangeTouch
Upstream name/value driftconstants.py
New or changed health surfacechecks.py + _CHECKS, then skill text if users need a fix path
How-to / troubleshootingskills/<name>/SKILL.md + version bump + provenance footer
Repo CI / guard / regressiontools/check_*.py or tools/test_*.py, wired into reusable-ci.yml when it must gate PRs
Which gates run locallytools/check_gates.py + .pre-commit-config.yaml. CI stays the authority
Generated doc blockstools/render_docs.py, never by hand
Agent deep-ops prosedocs/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 cause

python 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.py

CI 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 in skills/*/scripts/ need behavioral coverage in tools/test_*.py — a green guard suite is not evidence the script is correct.

Hard contracts (one line each)

ContractGuard / 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.pycheck_upstream_drift.py
Skill version bumps up; provenance footer dated only when facts re-checkedcheck_skill_version_bump.py, check_skill_provenance.py
Citations resolve against .github/upstream-drift.baselinecheck_citation_integrity.py
Finding IDs are public API: add FINDING_IDS entries, never rename; docs/findings.md is generatedtest_finding_ids.py, render_docs.py
hermes guide --json is one stdout document; no update notice; /hermes-doctor stays textdeep-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 givendeep-ops.md
Review threads: enumerate reviewThreads, reply with evidence, then resolve; isOutdated is not a fixreview-ops.md
Reviewer order: Qodo auto-reviews (never re-triggered per head); CodeRabbit full review once after Qodo clean, then incremental per head until cleanreview-ops.md
Tone / no emoji / no fillerCONTRIBUTING.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_HOOKS and 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) — not plugin.json. See diagnosing-commands and diagnosing-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-agent source 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 guide output).

[!WARNING] Don't hardcode a venv path. Older checkouts carry venv/ and .venv/ side by side and project_venv_dir() resolves venv first; PM-era installs have no in-tree venv at all and project_venv_dir() returns None even when a dependency environment exists — ask PM (committed_venv() for the directory, project_python() for the interpreter, and they are not interchangeable). diagnosing-path has 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 add or git stash it 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 update re-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):

  1. Confirm no skill version regressions before the bump: python tools/check_skill_version_bump.py origin/master — 0 failures. A downgraded SKILL.md version 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). A CHANGELOG.md section for the new version is required by design and is not a refusal signal.
  2. Bump the version in all five sites (plugin.yaml, __init__.py, SECURITY.md policy sentence + supported table, pyproject.toml), with the bump uncommitted.
  3. Generate the section in the same checkout: python tools/gen_changelog.py --upcoming. Requires git fetch --tags — the tag half of the check is invisible without tags.
  4. Commit the bump and the section together, then run python tools/check_gates.py — all hermetic gates in --list must pass locally; the gates it leaves to CI must pass in CI before merge.
  5. Merge the PR, then check readiness on the merged master: python tools/check_release_readiness.py. It fails a dirty tree or a non-master branch; when the origin/master fetch fails it reports sync as an advisory, so confirm HEAD == origin/master by hand before tagging.
  6. 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.
  7. 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 this the default; same SSH key as commit signing — if git tag -s falls back to GPG or fails, configure gpg.format=ssh and user.signingkey first). Set git config gpg.ssh.allowedSignersFile .github/allowed_signers, then run git tag -v v<version> 1>/dev/null and confirm its first (stderr) line starts with Good "git" signature for — stdout carries the tag payload, so an unredirected check can show object ... even for a valid tag. Then push v<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 the v. Refresh an open pin PR rather than opening a second one; run python scripts/validate_plugin_catalog.py plugin-catalog in that clone, then re-run python tools/check_release_readiness.py here.
  8. Verify the release: release.yml fails 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 with gh 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 uv2nix for 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.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.