{
  "sources": [
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-agent/main/plugin-catalog/README.md",
      "quote": "A plugin never routes around\n   Hermes's approval system: no auto-approving, no disabling guards, and no\n   spawning Hermes or shell children that inherit YOLO or non-interactive mode\n   to run commands nobody approved."
    },
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/README.md",
      "quote": "## 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```powershell\nNew-Item -ItemType Directory -Force -Path \"$env:LOCALAPPDATA\\hermes\\desktop-plugins\\done-bell\" | Out-Null\nCopy-Item \"$env:LOCALAPPDATA\\hermes\\plugins\\done-bell\\desktop\\plugin.js\" \"$env:LOCALAPPDATA\\hermes\\desktop-plugins\\done-bell\\plugin.js\" -Force\n```\n\nRestart Hermes. Status ba"
    },
    {
      "url": "https://raw.githubusercontent.com/aydnOktay/hermes-done-bell-/3fa519a291d91b0e6c44bd42762190363ce80c39/bell_store.py",
      "quote": "def ring_cli(title: str, body: str, *, platform_name: str = \"\") -> None:\n    if os.environ.get(\"DONE_BELL_NO_OS\") == \"1\":\n        return\n    if not should_os_notify_cli(platform_name):\n        return\n    settings = get_settings()\n    if settings.get(\"sound\"):\n        _beep()\n    threading.Thread(target=_os_toast, args=(title, body), daemon=True).start()\n\n\ndef _beep() -> None:\n    try:\n        if sys.platform == \"win32\":\n            import winsoun"
    },
    {
      "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 running gateway."
    },
    {
      "url": "https://raw.githubusercontent.com/NousResearch/hermes-official-plugins/e7a218f26db88426ab3e7376f0e000b6e356f5e7/homeassistant/tools.py",
      "quote": "from agent.secret_scope import get_secret\n\nlogger = logging.getLogger(__name__)\n\nTOOLSET = \"homeassistant\"\n\n\ndef tool_error(message: str) -> str:\n    \"\"\"Tool error envelope (same JSON shape as core's ``tools.registry.tool_error``).\"\"\"\n    return json"
    },
    {
      "url": "https://raw.githubusercontent.com/CraftOS-dev/Agent-App/fecfa424237cbaeb005eb7df773890837955cb9b/harness-plugins/hermes/README.md",
      "quote": "- **Stores a credential.** Connect signs Hermes in to a remote app as you; the CLI keeps that credential in `$A2APP_HOME/credentials.json` (owner-only), and Disconnect revokes it.\n- **In hermes-webui only**, the tab's backend listens on a loopback port behind a token generated at each start, wh"
    },
    {
      "url": "https://raw.githubusercontent.com/CraftOS-dev/Agent-App/fecfa424237cbaeb005eb7df773890837955cb9b/harness-plugins/hermes/__init__.py",
      "quote": "def _on_pre_tool_call(tool_name=None, args=None, **_kw):\n    if not isinstance(tool_name, str) or not tool_name.startswith(\"agent_app_\"):\n        return None\n    try:\n        reason = approval_reason(tool_name, args if isinstance(args, dict) else {}, agent_cwd())\n    except Exception:\n        # A check that failed must not wave the call through.\n        logger.exception(\"agent-app: checking %s failed\", tool_name)\n        reason = f\"Agent App: {tool_name} could not be checked, so it nee"
    },
    {
      "url": "https://raw.githubusercontent.com/itxLikhith/looprunner/1e56db78508be5d250288c26f17659117025d954/tools.py",
      "quote": "    key = _rule_key_for(resolved, command)\n    try:\n        from tools.approval import load_permanent_allowlist, save_permanent_allowlist\n    except Exception as e:\n        return json.dumps({\n            \"approved\": False, \"rule_key\": key,\n            \"error\": \"approval allowlist unavailable (%s); add the key to \"\n                     \"command_allowlist in config.yaml by hand\" % e,\n            \"rule_key_to_add\": key,\n        })\n    try:\n        current = set(load_permanent_allowlist()"
    },
    {
      "url": "https://raw.githubusercontent.com/itxLikhith/looprunner/1e56db78508be5d250288c26f17659117025d954/plugin.yaml",
      "quote": "provides_tools:\n  - loop_start\n  - loop_tick\n  - loop_verify\n  - loop_status\n  - loop_history\n  - loop_analyze\n  - loop_commit\n  - loop_revert\n  - loop_watch\n  - loop_scan_issues\n  - loop_approve\n  - loop_pending\n  - loop_security\n  - loop_security_card\n  - loop_detect\n  - loop_checkpoint\n  - loop_recommend\n  - loop_pause\n  - loop_resume\n  - loop_stop\nprovides_hooks:\n  - pre_llm_call\n  - post_tool_call\n  - pre_tool_call\ncapabi"
    },
    {
      "url": "https://raw.githubusercontent.com/Terahertz-Inc/crosodo-mcp/0acc98a34c1d58251ff1047c67b74ed2bc1b905b/README.md",
      "quote": "## Tools\n\n| Tool | What it does |\n|---|---|\n| `lookup_state_law` | Cottage food and home bakery rules for a US state: sales cap, registration, allowed products, statute and agency links |\n| `lookup_county` | County-level cottage food requirements for a state and county: contacts, verification status and local links |\n| `list_products` | The Crosodo product catalog, including the free state-law report |\n| `start_checkout` | Creates a Stripe Checkout link and returns the URL. It never ch"
    },
    {
      "url": "https://raw.githubusercontent.com/deepmroot/listeningkit-log/dd8960d6ab904c351786e1b6ae95ef3c2ad94849/README.md",
      "quote": "- **Data and credentials:** your account sessions, cookies and message history stay in log's own folder on your machine (`~/.logCli`). The plugin never reads them; only log does. Nothing is put in `mcp.json`.\n- **Writes:** sends, replies, quotes, likes and follows go out as you, so they are gated by Hermes approval (`trust: untrusted`) and by log's own per-account daily limits. log stops on any rate limit, block or failed send instead of retrying.\n- **The tool set** comes from your ins"
    },
    {
      "url": "https://raw.githubusercontent.com/AIverflow/hermes-snooze/65f4128edcb93812af9edab94740a909276cda9b/README.md",
      "quote": "## Limits\n\n- The Hermes gateway must be running on an awake machine for reminders and replies to work.\n- Snooze does not support voice-note confirmations or WhatsApp Cloud API.\n- Reaction confirmations are supported only in Telegram private chats.\n- Reminders arrive in the chat you talk to your agent in. The first message after a reminder is read as its answer: if it is not one, Snooze replies with the valid answers and the agent does not see it.\n- Snoozes belong to the Hermes profile:"
    },
    {
      "url": "https://raw.githubusercontent.com/salch-cred/why/a6f3a0ce923a14d3c36249ae8618d69b00cc9401/README.md",
      "quote": "## Limits\n\n- **It only knows edits made while it was installed,** and only through `write_file` and `patch`. Files the agent changes with shell commands (`sed`, `echo >`) aren't recorded.\n- **Identical lines:** if two requests wrote the very same lines in the same place, it names the most recent one.\n- **Renamed files:** history is kept by path, so a file renamed after the edit loses its link.\n\n## What it touches\n\n- **Stores locally:** the lines the agent wrote, and the request (the fi"
    },
    {
      "url": "https://raw.githubusercontent.com/ochikov/hermes-portals/e336ce862a3f5c4ef7ddffd2590ff7c79a3a246c/README.md",
      "quote": "## Where it stands\n\n**0.3.0 · MIT · community plugin · trusted-LAN prototype.** An independent\nproject, not an official Nous Research product; catalog acceptance is pending.\n\nToday, one laptop and one paired phone share one active tool, with a library of\nup to 30 saved tools. Portals carries supported interactive tools; it does not\nmove native app processes or run arbitrary generated HTML/JavaScript. Pairing\nchooses the phone — the camera does not locate devices in the room.\n\nPhysical "
    },
    {
      "url": "https://raw.githubusercontent.com/ochikov/hermes-portals/e336ce862a3f5c4ef7ddffd2590ff7c79a3a246c/portals/server.py",
      "quote": "    def require_local_owner(request: Request):\n        require(request, owner=True)\n        if request.client.host not in (\"127.0.0.1\", \"::1\", \"testclient\") or request.url.hostname not in (\"127.0.0.1\", \"localhost\"):\n            raise HTTPException(403, \"Open Mac control from the laptop's localhost owner page\")\n\n    @app.get(\"/api/mac/status\")\n    async def mac_status(request: Request):\n "
    },
    {
      "url": "https://raw.githubusercontent.com/Glorya-AI/hermes-plugin/e6ffa2bb4e6180686ebf276ff5b9744c029842f8/core.py",
      "quote": "    def on_pre_tool_call(self, tool_name: str = \"\", args: Optional[dict] = None, **_: Any) -> Optional[dict]:\n        \"\"\"Ad spend and publishing go through Hermes' human approval, whatever the model was told.\"\"\"\n        tool = self._tool(tool_name or \"\")\n        if tool not in APPROVAL_RULES:\n            return None\n        try:\n            message = render.campaign_approval(args or {}) if tool == \"create_campaign\" else PUBLISH_APPROVAL\n        except Exception:\n            message = \""
    },
    {
      "url": "https://raw.githubusercontent.com/Glorya-AI/hermes-plugin/e6ffa2bb4e6180686ebf276ff5b9744c029842f8/README.md",
      "quote": "## Requirements\n\n- Hermes Agent 0.22.5 or newer.\n- A Glorya account with an active plan ($99/month Starter at [glorya.ai](https://glorya.ai)). Jobs use your Glorya credits, the same as in the Glorya platform.\n\n## Install\n\n```bash\nhermes plugins install glorya --enable    # from the Hermes plugin catalog, once listed\n# or straight from this repo:\nhermes plugins install Glorya-AI/hermes-plugin --enable\n\nhermes glorya setup                       # add Glorya and grant what the plugin need"
    },
    {
      "url": "https://api.github.com/repos/VIP-DANaiL/hermes-thread/commits/88ce440aa063447ee53fa4b369e63397322028c0",
      "quote": "No commit found for SHA: 88ce440aa063447ee53fa4b369e63397322028c0"
    },
    {
      "url": "https://raw.githubusercontent.com/GenesisEngine-Triolith/raise/0926ac346b8b083f87bb052a12c6aefa6f74b096/safety.py",
      "quote": "    def pre_tool_call(self, tool_name=\"\", args=None, **_):\n        try:\n            return self._pre(tool_name or \"\", args or {})\n        except Exception:  # never block unrelated tools because of a Raise bug\n            return None\n\n    def _pre(self, tool, args):\n        if tool.startsw"
    },
    {
      "url": "https://raw.githubusercontent.com/GenesisEngine-Triolith/raise/0926ac346b8b083f87bb052a12c6aefa6f74b096/scoring.py",
      "quote": "        if sc > 0 and name not in NO_EVIDENCE_NEEDED and not ids:\n            sc = 0.0\n            notes.append(\"zeroed: no cited evidence\")\n        kept += wt\n        total += wt * sc / 10\n        out[name] = {\"score\": sc, \"weight\": wt, \"evidence_ids\": ids, \"why\": d.get(\"why\", \"\"),\n                     \"note\": \"; \".join(notes)}\n    return {\"total\": round(100 * total / kept, 1) if kept else 0.0, \"dims\": out}\n\n\ndef set_ranking(db, tid, dims, weights=No"
    }
  ]
}
