{
  "sources": [
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/README.md",
      "quote": "OS notification (when away), optional chime, status chip (`busy` / `done` /\n`needs you`). No API keys. Does not send chat, write code, or touch user files.\n\nLives under `plugins/done-bell/` so it stays separate from debug-desk.\n\nRepo: https://github.com/aydnOktay/hermes-done-bell-\n\n## Install (dev)\n\n```powershell\nhermes plugins install C:\\Users\\aydin\\Desktop\\nous-puling\\plugins\\done-bell\nhermes plugins enable done-bell\n```\n\nCopy the pane (Hermes 0.21 installer may skip it):\n\n"
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-official-plugins/e7a218f26db88426ab3e7376f0e000b6e356f5e7/homeassistant/README.md",
      "quote": "1. **Gateway platform `homeassistant`**: subscribes to Home Assistant's WebSocket event bus and\n   forwards `state_changed` events to the agent, with domain/entity filters and per-entity cooldowns.\n   The agent's replies show up as Home Assistant persistent notifications titled \"Hermes Agent\".\n   Cron jobs can deliver to `deliver=homeassistant[:target]` through the target's own notify service\n   (`notify.mobile_app_my_phone` for `target=mobile_app_my_phone`), without a runnin"
    },
    {
      "url": "https://raw.githubusercontent.com/Frazzlesprite/hermes-dossier/ddce23165df1488331f04e980713393bacba81b0/README.md",
      "quote": "Every sentence in a brief carries a source, a publication date and a retrieval date. If a claim has no evidence row, it does not print. A disagreement between sources is not resolved: it is printed as contested, with both sides and both dates.\n\n---\n\n## Disclosure: what this plugin does with your data\n\nDossier makes **outbound network requests** to read public pages. It sends a descriptive `User-Agent`, respects `robots.txt`, and makes at most one request per host per second.\n"
    },
    {
      "url": "https://raw.githubusercontent.com/memtomem/memtomem/465e1abdf5285b2ebdce15e7c8fc6dd9d1a55601/packages/memtomem-hermes-memory/README.md",
      "quote": "A Hermes memory provider backed by memtomem. On each user turn it looks up your memtomem\nlong-term memory and gives Hermes the most relevant notes as context for that turn, without\nthe model having to call a tool. If you turn it on, it also copies what Hermes saves in its\nbuilt-in memory (`MEMORY.md` / `USER.md`) into memtomem. It uses the memtomem MCP server you\nalready run in Hermes; it starts no server of its own.\n\n`plugin.yaml` is generated by `tools/render_plugin_assets."
    },
    {
      "url": "https://raw.githubusercontent.com/fudge-ai/fudge-plugin/11f589b9e06952396f3f670481ec9a133a34794f/README.md",
      "quote": "Publishing always stays in Fudge: when a draft is ready, your assistant gives you a link to Fudge's review page, where you check the exact changes and approve them yourself.\n\n## What you can ask\n\n- \u201cBrief me on my store.\u201d\n- \u201cWhat's waiting for my review?\u201d\n- \u201cRun an SEO review of my store.\u201d\n- \u201cHow do other stores explain sizing on mobile?\u201d\n- \u201cHave Fudge build a buying guide for our waxed laces.\u201d\n\n## Setup\n\nInstall the plugin and connect it with your Shopify store when your ass"
    },
    {
      "url": "https://raw.githubusercontent.com/Hazem-Samak/hermes-which-copy/b67367e09371d658647166057cc3d161a1050c5b/README.md",
      "quote": "## Limits, stated plainly\n\n- **macOS and Linux.** The login-shell probe is POSIX; on Windows the plugin\n  would need a different environment source and is untested there.\n- **The terminal tool's PATH is not measured.** Hermes's terminal tool runs a\n  command in a login shell and appends directories it manages. Which Copy reads\n  the two PATHs it can read exactly and says in every report that the third can\n  differ \u2014 it does not guess at the composition.\n- **Your login shell i"
    },
    {
      "url": "https://raw.githubusercontent.com/clatsonhacks/hermes-polydesk/190d38e2cda2bfd8509b73bbdf17e88887c094c9/README.md",
      "quote": "- **Real fills, real slippage.** Every order walks the live CLOB book level by level, so a\n  $500 buy in a thin market gets the price it would actually get, not the headline odds.\n- **Quote, then confirm.** A trade first returns a single-use ticket that expires in 5 minutes.\n  At execution it's re-priced against a fresh book and rejected if the price moved against you.\n- **Risk limits.** Max per-trade size, max % of equity in one outcome, a max-slippage sweep\n  guard, cash ch"
    },
    {
      "url": "https://raw.githubusercontent.com/Canonry/canonry/d70ff15cc8c2e5dd342cfd1f2d8785a7addb67e0/plugins/canonry/README.md",
      "quote": "## Safety boundary\n\n- The plugin contains no API keys and does not read or edit\n  `~/.canonry/config.yaml`; `canonry-mcp` uses the runtime's existing config.\n- There are no hooks or background jobs. Sweeps, mutations, publishing, and\n  paid or quota-consuming operations require explicit operator approval.\n- The plugin does not expand server-enforced key scopes, but it gives the\n  client MCP tools that can exercise the configured scope. Write tools are\n  available by default w"
    },
    {
      "url": "https://raw.githubusercontent.com/cYoren/exoself/c52b9d47af7b8c6d25212dcb389b1cac4745aafe/hermes/README.md",
      "quote": "## What it writes\n\nInside the profile's home (`$HERMES_HOME`):\n\n```\n.exoself/birth.json   the one draw; never overwritten\n.exoself/state.json   the history; created by the first recorded turn\nSOUL.md               the rendered temperament, in a managed block\n```\n\n`SOUL.md` keeps whatever you wrote: the block sits at the end, delimited by\n`<!-- exoself:begin ... -->` and `<!-- exoself:end -->`, and is replaced in\nplace on every refresh. Everything above it is yours.\n\n## What i"
    },
    {
      "url": "https://raw.githubusercontent.com/cgray2222/hermes-proxmox/1540a01bf422ad48f762add14ac9db20190c0705/README.md",
      "quote": "## Safety model\n\n- **Read tools are read-only.** They use the token's own permissions and nothing wider.\n- **Write tools refuse without `confirm: true` in the same call.** Creating a snapshot,\n  deleting one, or running a command returns a refusal that names the exact change. The\n  agent has to state the change and get agreement, then call again \u2014 an accidental write\n  is a refused call, not a lost disk.\n- **Guest exec is QEMU-only.** Containers reject it with an explanation;"
    },
    {
      "url": "https://raw.githubusercontent.com/grounder-labs/grounder-hermes-plugin/4c0e58799b2f2c2258f143d9e97ea7d3ff37ebeb/README.md",
      "quote": "## What Hermes gets\n\nEach search returns up to 20 rows (Hermes asks for 5 unless told otherwise), in Grounder's order:\n\n| Field | From Grounder |\n|---|---|\n| `title` | The result's title |\n| `url` | The result's address |\n| `description` | Its summary, or its text on one line: the passages that best match your search, chosen by Grounder to fit 800 characters |\n| `position` | Its rank, from 1 |\n\nA failed search returns `success: false` and one of these errors. Hermes then retr"
    },
    {
      "url": "https://raw.githubusercontent.com/ryanteoyx/agentic-operations/dd4a6cf563a03b65231e30f3b32338ab1fe5a113/plugin/hermes_ops/README.md",
      "quote": "All demo business data is synthetic. SQLite state belongs only in the explicit data root or the active Hermes profile's plugin storage, never the installation tree. No real ERP is connected and no real supplier order is placed.\n\n## Checks and integration boundary\n\n```sh\npython3 -m unittest discover -s tests -p 'test_*.py' -v\n```\n\nRun from the repository root; the adapter tests exercise the real integrated `manufacturing_ops` core, not a mock. The combined suite (core plus ada"
    },
    {
      "url": "https://raw.githubusercontent.com/Frazzlesprite/hermes-dossier/ddce23165df1488331f04e980713393bacba81b0/adapters/base.py",
      "quote": "def _validate(url: str) -> None:\n    parsed = urllib.parse.urlparse(url)\n    if parsed.scheme not in (\"http\", \"https\"):\n        raise FetchRefused(f\"unsupported scheme {parsed.scheme!r}\")\n    host = (parsed.hostname or \"\").lower()\n    if not host:\n        raise FetchRefused(\"no host\")\n    if _PRIVATE_HOST.match(host):\n        raise FetchRefused(f\"refusing to fetch a private/loopback host: {host}\")\n\n\n_robots_cache: dict[str, Optional[object]] = {}\n\n\ndef _robots_for(url: str, p"
    },
    {
      "url": "https://raw.githubusercontent.com/memtomem/memtomem/465e1abdf5285b2ebdce15e7c8fc6dd9d1a55601/packages/memtomem-hermes-memory/__init__.py",
      "quote": "class _ContextHolder:\n    \"\"\"One provider instance's Hermes ``PluginContext``, built lazily on the worker.\n\n    Building it calls ``get_plugin_manager()``, which takes a Hermes lock, so it never runs on\n    the hook. The holder references no provider instance, so a worker holding it does not keep\n    a dropped instance alive.\n    \"\"\"\n\n    __slots__ = (\"_lock\", \"_context\")\n\n    def __init__(self, context: Any = None) -> None:\n        self._lock = threading.Lock()\n        self."
    },
    {
      "url": "https://raw.githubusercontent.com/clatsonhacks/hermes-polydesk/190d38e2cda2bfd8509b73bbdf17e88887c094c9/desk.py",
      "quote": "    def execute(self, ticket_id: str) -> dict:\n        with self._lock, self._db() as c:\n            self._ensure_bankroll(c)\n            row = c.execute(\"SELECT created,payload FROM tickets WHERE id=?\", (ticket_id,)).fetchone()\n            if not row:\n                raise ValueError(\"unknown or already-used ticket_id; preview the trade again\")\n            c.execute(\"DELETE FROM tickets WHERE id=?\", (ticket_id,))\n            if time.time() - row[\"created\"] > TICKET_TTL:\n    "
    },
    {
      "url": "https://raw.githubusercontent.com/cYoren/exoself/c52b9d47af7b8c6d25212dcb389b1cac4745aafe/hermes/profile.py",
      "quote": "def ensure(home: Path, desire: bool = False, timeout: int = TIMEOUT) -> dict:\n    \"\"\"Draw once, then keep the block current. Safe to call on every load.\n\n    `born` writes with mode \"x\" and refuses an existing certificate, so two\n    loads racing each other still produce one agent: the loser sees the file\n    and uses it. There is deliberately no path here that redraws.\n    \"\"\"\n    cert, _, _ = paths(home)\n    drawn = False\n    if not cert.exists():\n        cert.parent.mkdir("
    },
    {
      "url": "https://raw.githubusercontent.com/cgray2222/hermes-proxmox/1540a01bf422ad48f762add14ac9db20190c0705/tools.py",
      "quote": "        if not args.get(\"confirm\"):\n            return _err(\n                pve.PveError(\n                    f\"refused: {action} snapshot {name!r} on guest {vmid} needs confirm=true \"\n                    \"(the same call, after the operator agrees)\"\n                )\n            )\n\n        if action == \"create\":\n            upid = pve.create_snapshot(vmid, name, str(args.get(\"description\") or \"\"), node)\n            finished = pve.wait_for_task(upid, timeout=float(args.get(\"t"
    },
    {
      "url": "https://raw.githubusercontent.com/grounder-labs/grounder-hermes-plugin/4c0e58799b2f2c2258f143d9e97ea7d3ff37ebeb/provider.py",
      "quote": "        results = body.get(\"results\") or []\n        rows = [\n            {\"title\": str(r.get(\"title\", \"\")), \"url\": str(r.get(\"url\", \"\")),\n             \"description\": _description(r), \"position\": i + 1}\n            for i, r in enumerate(results[:max(1, int(limit))])\n        ]\n        # The count only: a query is the user's words, and a log line outlives the search.\n        logger.info(\"Grounder search: %d results\", len(rows))\n        return {\"success\": True, \"data\": {\"web\": ro"
    },
    {
      "url": "https://raw.githubusercontent.com/ryanteoyx/agentic-operations/dd4a6cf563a03b65231e30f3b32338ab1fe5a113/plugin/hermes_ops/manufacturing_ops/service.py",
      "quote": "    def execute(self, case_id: str, crash_after_external: bool = False) -> dict:\n        conn = self._conn()\n        try:\n            with write_tx(conn):\n                case = self._get_row(conn, \"cases\", case_id)\n                if case[\"selected_plan_id\"] is None:\n                    raise ConflictError(\"no plan is selected\")\n                action = conn.execute(\n                    \"SELECT * FROM actions WHERE case_id = ?\", (case_id,)\n                ).fetchone()\n      "
    },
    {
      "url": "https://api.github.com/repos/NousResearch/hermes-agent/issues/153561",
      "quote": "A plugin can't turn on OAuth for its remote server yet (#87253), so, as with `courier-by-autolane`, the user runs `hermes mcp add fudge --url https://mcp.fudge.ai/mcp --auth oauth` once."
    }
  ]
}