{
  "sources": [
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/field.json",
      "quote": "{\"about\":\"Hermes Agent Plugin Hackathon entries: every plugin-catalog entry added to github.com/NousResearch/hermes-agent by a pull request opened from the hackathon post (2026-11-04 21:33Z) to its close (2026-11-11 22:00Z), one per distinct plugin. pr is the entrant's own pull r"
    },
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/RUN.md",
      "quote": "## 1. Hermes, once\n\n    git clone --depth 1 https://github.com/NousResearch/hermes-agent test/scratch/hermes\n    cd test/scratch/hermes && uv sync --locked --python 3.14 && cd -\n    test/scratch/hermes/.venv/bin/hermes plugins --help\n\nThe last line must list `install`, `validate` and `doctor`. `uv sync --locked` is how Nous's own CI builds Hermes; it fetches Python 3.14 itself when the machine lac"
    },
    {
      "url": "https://gist.githubusercontent.com/gtmcknight/594c47336546c8763e641b46cf9af4ec/raw/tryit.py",
      "quote": "\"\"\"Run one plugin inside real Hermes, driven by Nous's own scripted test model.\n\n  test/scratch/hermes/.venv/bin/python tryit.py PLUGIN_DIR PLAN.json REPORT.json\n\nRun it with the Python of the Hermes checkout's environment (RUN.md step 1). PLUGIN_DIR is the plugin's folder at\nits pinned commit. PLAN.json is a list of steps, each {\"tool\": NAME, \"args\": {...}}: the test model asks Hermes to\nmake tho"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-agent/a84025ade22d2a4085f575d4353072e5b702635d/plugin-catalog/README.md",
      "quote": "11. **Credentials come through Hermes, never from files.** A plugin gets\n   secrets only through Hermes's routes. Its declared `requires_env` and\n   `config_schema` secrets are read with `agent.secret_scope.get_secret(NAME)`,\n   which honours the active profile (a bare `os.environ` read can pick up another\n   profile's key under multiplexing). A subscription sign-in (Codex / ChatGPT\n   today) is used only through `credentialed_provider_request` with\n   `requires_auth`, so Her"
    },
    {
      "url": "https://raw.githubusercontent.com/ctmakc/hermes-redactgate/d4bb87d78381d0514cd8dd74525fea98a5b46d62/README.md",
      "quote": "**What no plugin can rewrite, and what RedactGate does about it.** Hermes runs auxiliary\nmodel calls (session titles, context compression, vision, approvals) without request\nmiddleware. In a live test, Hermes's title generator sent the raw first message, name, e-mail,\nphone and card, to the same provider. RedactGate:\n\n* watches every auxiliary call through the `pre_auxiliary_call` observer and records an\n  `aux_unprotected` event with the entity "
    },
    {
      "url": "https://raw.githubusercontent.com/helenn-szn/undo-send/10d388c951245ceeabc1101bb8ff65e75f4f6737/README.md",
      "quote": "It sits on Hermes' public `tool_execution` middleware, after Hermes' own\nguardrails and approvals, so it adds a step without replacing anything. It\nfails open: if undo-send itself errors, the tool call runs as it would have.\n\n## What gets held\n\n| Kind | Examples |\n|---|---|\n| Messages to people | `hermes send --to telegram \"…\"` (Telegram, Slack, Discord, Signal, SMS…), `imsg send`, email/message tools |\n| App connector and MCP writes | `connector"
    },
    {
      "url": "https://raw.githubusercontent.com/harishkotra/hermes-regress/877c6dfdfd5e80bb1dca79a67b3081f9764545b5/README.md",
      "quote": "Captured text passes through a redaction layer first: provider keys (`sk-`, `pk-`, `rk-`), GitHub tokens (`ghp_`, `gho_`, `ghu_`, `ghs_`, `ghr_`), Slack tokens, AWS access keys, JWTs, inline `password=` / `token=` / `api_key=` values, and long hex strings are replaced with `[REDACTED]` before anything is written to disk. The count lands in the case as `redactions`.\n\n## Verdicts\n\n| Verdict | Meaning |\n| --- | --- |\n| `pass` | Answer matches the re"
    },
    {
      "url": "https://raw.githubusercontent.com/GodlyDeveloper1/hermes/f5f69e215dad54c06d2977320a080ab1c68f10ca/README.md",
      "quote": "- **Credentials:** read through Hermes's scoped secret store. The plugin stores no tokens of its own.\n- **State:** inboxes and sessions are kept in memory and are lost when the gateway restarts. Nothing is written to disk.\n- **No shell commands, no background processes** beyond the HTTP server above, and no self-update.\n\n## Limits worth knowing\n\n- Text only. Images, files and voice do not exist on USSD.\n- Operators cap a USSD session at roughly o"
    },
    {
      "url": "https://raw.githubusercontent.com/EconLearn/hermes-heats/2bcee10e9ca6489b7fd23bb0362a36eacdae269f/README.md",
      "quote": "- **The v6 gain did not replicate.** In v6, on the same task and run, the race solved 8 that plain Hermes did not, and plain Hermes 0 that it did not\n  (exact sign test p = 0.01). In v7 it was 1 vs 3. Both benches together: 9 vs 3 (p = 0.15), referee 8 vs 6.\n  Plain Hermes itself moved from 8/20 to 14/20 between the two benches, so run-to-run noise on this model is\n  as large as the effect we were looking for. We do not claim that Heats raises th"
    },
    {
      "url": "https://raw.githubusercontent.com/emiwltz/hermes-habits/c2e32395e0e3461fe56c7d68b7bc993ee0954277/README.md",
      "quote": "**More than a skill or a script.** A skill, even one that ships a script, waits for the model to choose it and to read its output. A reflex can start on a message you said yes to, before Hermes's model is called; it branches on rules and closed questions; and when it cannot finish, it hands the rest back.\n\n## Try it in 2 minutes, without a key\n\n```bash\nhermes plugins install emiwltz/hermes-habits\nhermes plugins enable habits\nhermes habits run her"
    },
    {
      "url": "https://raw.githubusercontent.com/ctmakc/hermes-redactgate/d4bb87d78381d0514cd8dd74525fea98a5b46d62/engine.py",
      "quote": "LOCAL_TOOLS = (\n    \"terminal\", \"process_manage\", \"read_file\", \"write_file\", \"patch\", \"search_files\",\n    \"execute_code\", \"todo_list\", \"memory\", \"clarify\",\n)\n\nWITHHELD = \"[redactgate: content withheld because redaction failed; see /redact status]\"\n\nMODEL_GUIDE = (\n    \"[RedactGate privacy note] Personal data in this conversation has been replaced w"
    },
    {
      "url": "https://raw.githubusercontent.com/helenn-szn/undo-send/10d388c951245ceeabc1101bb8ff65e75f4f6737/undo_send/hold.py",
      "quote": "if not decision.hold or window == 0:\n            return next_call(args)\n\n        summary = summarize(tool_name, args, decision.label)\n        session = str(kwargs.get(\"session_id\") or kwargs.get(\"conversation_id\") or \"\")\n        aid = self.store.add(tool_name, summary, window, session, current_origin())\n\n        while True:\n            row = self.store.get(aid)\n            if row is None or row[\"status\"] != \"pending\""
    },
    {
      "url": "https://raw.githubusercontent.com/harishkotra/hermes-regress/877c6dfdfd5e80bb1dca79a67b3081f9764545b5/rg_capture.py",
      "quote": "    redactions = 0\n    if cfg.get(\"redact\", True):\n        for call in calls:\n            text, n = redact(call[\"result\"])\n            call[\"result\"] = text\n            redactions += n\n\n    case_id = store.case_id_for(session_id, turn_id, prompt)\n    return {\n        \"schema\": store.SCHEMA,\n        \"case_id\": case_id,\n        \"created_at\": time.strftime(\"%Y-%m-%dT%H:%M:%S%z\", time.localtime()),\n        \"session_id\": session_id or \"\",\n        \"turn_id\": tur"
    },
    {
      "url": "https://raw.githubusercontent.com/GodlyDeveloper1/hermes/f5f69e215dad54c06d2977320a080ab1c68f10ca/adapter.py",
      "quote": "    async def connect(self, *, is_reconnect: bool = False) -> bool:\n        if not AIOHTTP_AVAILABLE:\n            self._set_fatal_error(\"ussd_missing_aiohttp\", \"[ussd] aiohttp is not installed\", retryable=False)\n            return False\n        if len(self._secret) < MIN_SECRET_LENGTH:\n            message = (\n                f\"[ussd] Refusing to start: USSD_WEBHOOK_SECRET must be at least {MIN_SECRET_LENGTH} characters. \"\n                \"USSD ga"
    },
    {
      "url": "https://raw.githubusercontent.com/EconLearn/hermes-heats/2bcee10e9ca6489b7fd23bb0362a36eacdae269f/heats_core/referee.py",
      "quote": "def review(changed_paths: list[str], attempt: int, max_nudges: int, check: Optional[str] = None,\n           timeout_s: float = 120, runner: Callable[..., CheckResult] = run_check,\n           info: Optional[dict] = None, allowed: Optional[Callable[[str], bool]] = None) -> Optional[dict]:\n    \"\"\"Return ``{\"action\": \"continue\", \"message\": ...}`` when the check fails, else None. If *info* is\n    given it is filled with what was measured (for the Desk"
    },
    {
      "url": "https://raw.githubusercontent.com/emiwltz/hermes-habits/c2e32395e0e3461fe56c7d68b7bc993ee0954277/habits/plugin.py",
      "quote": "def refused(name: str, args: dict, *, approved: bool = False) -> str | None:\n    \"\"\"Why a habit may not make this call: a habit never does what the model could not do itself. approved: the\n    user said yes to this habit and it runs inside a Hermes turn (permissions: hermes), so a command Hermes would\n    ask about is left to Hermes's own approval, which asks, refuses or lets through as it does for the model; if\n    nobody could be asked from her"
    },
    {
      "url": "https://raw.githubusercontent.com/harishkotra/hermes-regress/877c6dfdfd5e80bb1dca79a67b3081f9764545b5/rg_store.py",
      "quote": "def save_case(case: dict[str, Any]) -> Path:\n    home = ensure_dirs()\n    path = home / \"cases\" / f\"{case['case_id']}.json\"\n    path.write_text(json.dumps(case, indent=2, sort_keys=True) + \"\\n\", \"utf-8\")\n    return path\n\n\ndef load_case(case_id: str) -> dict[str, Any] | None:\n    path = regress_home("
    },
    {
      "url": "https://raw.githubusercontent.com/harishkotra/hermes-regress/877c6dfdfd5e80bb1dca79a67b3081f9764545b5/rg_replay.py",
      "quote": "def preflight(*, timeout: int = 150, force: bool = False) -> dict[str, Any]:\n    \"\"\"Prove this Hermes runtime serves recorded fixtures before we replay anything.\n\n    Plugins load when the runtime starts, so a freshly edited or freshly\n    installed plugin is invisible until the runtime restarts. Replaying against\n    a runtime that does not intercept would execute real tools -- the exact\n    thing replay exists to prevent -- so every run is gated on this probe.\n    \"\"\"\n    i"
    },
    {
      "url": "https://raw.githubusercontent.com/EconLearn/hermes-heats/2bcee10e9ca6489b7fd23bb0362a36eacdae269f/heats_core/runner.py",
      "quote": "            if cfg.run_baseline:  # measured before any attempt starts: a check that cannot run stops the race here\n                baseline = self._baseline(root, base, run_id, check, cfg)\n                self._live[\"baseline\"] = {\"ok\": baseline.ok, \"passed\": baseline.passed, \"failed\": baseline.failed}\n                if cannot_run(baseline, check):\n                    raise RuntimeError(f\"the check command could not run (exit {baseline.exit_cod"
    },
    {
      "url": "https://raw.githubusercontent.com/emiwltz/hermes-habits/c2e32395e0e3461fe56c7d68b7bc993ee0954277/habits/tools.py",
      "quote": "        hidden = any(part.startswith(\".\") for part in full.parts)\n        if runner.secret_name(value) or runner.secret_name(full):  # the runner hands such an end back already\n            continue\n        if full.is_file() and not hidden and any(f == full or f in full.parents for f in folders):\n            found += [str(full)] if str(full) not in found else []\n    return found\n\n\ndef with_files(text: str, files: list[str]) -> str:\n    \"\"\"A habit'"
    }
  ]
}
