hermes-plugin-development

Guides writing and debugging Hermes Agent Python directory plugins and memory providers.

2|Updated Jul 18, 2026
One-click install
npx skills add https://github.com/Arasz/ai-badger --skill hermes-plugin-development-arasz
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: hermes-plugin-development
Source: https://github.com/Arasz/ai-badger/tree/main/features/hermes/skills/hermes-plugin-development
Command: npx skills add https://github.com/Arasz/ai-badger --skill hermes-plugin-development-arasz

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Hermes Agent plugins fail silently when packaged wrong: flat .py files are invisible to the loader, hooks never fire without plugins.enabled opt-in, and payload keys differ between plugin and shell-hook surfaces. This Skill encodes the verified plugin ABI so hooks actually load and fire. ## Core Features & Use Cases - Directory plugin packaging: Enforces the plugin.yaml + init.py with register(ctx) shape, the VALID_HOOKS list, per-hook payload keys, and the plugins.enabled opt-in requirement. - Memory provider plugins: Covers the MemoryProvider ABC (4 abstract members plus ~14 optional hooks), threading and lifecycle contracts, config schema surface, and the MCP-bridge shim pattern for server-backed memory. - Empirical verification: Provides a checklist (pycache, agent.log, live side-effect probes) to prove a plugin actually loaded instead of inferring from file contents. - Use Case: Your post_tool_call hook never fires after copying a .py file into ~/.hermes/plugins/. Use this Skill to repackage it as a directory plugin, enable it, and verify with a fresh one-shot session probe. ## Quick Start Help me write a Hermes plugin that registers a post_tool_call hook and verify it actually loads in a fresh session.

Frequently Asked Questions about hermes-plugin-development

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
Why is my Hermes plugin hook never firing?

The most common cause is packaging shape: Hermes only loads directory plugins containing plugin.yaml and __init__.py with register(ctx), so flat .py files in ~/.hermes/plugins/ are invisible. Also confirm the plugin is listed in plugins.enabled, since user plugins are opt-in.

How do I write a Hermes memory provider plugin?

Implement the MemoryProvider ABC from agent/memory_provider.py: four abstract members (name, is_available, initialize, get_tool_schemas) plus optional hooks like prefetch and sync_turn. Register it via ctx.register_memory_provider(provider) and select it with memory.provider in config.yaml, not plugins.enabled.

What payload keys do Hermes plugin hooks receive?

Plugin hooks receive kwargs with no cwd: post_tool_call gets function_name, function_args, result, session_id, and status, while pre_tool_call uses tool_name and args. Adapters must normalize both spellings and derive the project directory via os.getcwd() at callback time.

How do I verify a Hermes plugin actually loaded?

Check for a __pycache__ directory next to the plugin, grep ~/.hermes/logs/agent.log for registration lines, and run a fresh one-shot session that triggers the hook's side effect. Hooks load at session start, so enabling mid-session changes nothing.

Can a Hermes memory provider connect to a remote MCP server?

Yes, the provider runs in-process, so a remote backend plugs in as a thin Python shim using the official mcp SDK. Import mcp lazily inside connect(), run a persistent asyncio loop thread, and note that stdio_client yields a 2-tuple while streamable_http_client yields a 3-tuple.

Why does Hermes plugin discovery skip my __init__.py?

The memory-provider discovery heuristic scans only the first 8192 bytes of __init__.py for the strings register_memory_provider or MemoryProvider. Put the marker in the module or class docstring near the top of the file.