hermes-plugin-authoring

Guides writing, deploying, and debugging Hermes agent plugins with verified hook contracts.

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

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes references (resource) components.

What problem does it solve? Hermes plugins fail silently when deployed incorrectly: flat .py files are never loaded, plugins stay disabled until explicitly enabled, and hook payload key spellings differ between surfaces. This Skill provides the verified plugin contract so hooks actually register and fire. ## Core Features & Use Cases - Directory plugin contract: Documents the required layout (~/.hermes/plugins/<name>/ with plugin.yaml and init.py exposing register(ctx)) and the opt-in plugins.enabled requirement. - Hook payload reference: Lists exact kwargs per hook (post_tool_call uses function_name/function_args, never cwd) and the stash/pop pattern for injecting context via pre_llm_call. - Memory-provider ABC reference: Covers the MemoryProvider abstract class, discovery heuristics, single-provider selection via memory.provider, and bridging to MCP servers like AiRaccoon. - Use Case: You wrote a post_tool_call hook that never fires. This Skill tells you to check the directory layout, run hermes plugins enable, verify with HERMES_PLUGINS_DEBUG=1, and test in a fresh session since hooks load only at session start. ## Quick Start Use the hermes-plugin-authoring skill to scaffold a directory plugin with plugin.yaml and register(ctx), then enable it and verify the hook fires in a fresh hermes chat session.

Frequently Asked Questions about hermes-plugin-authoring

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

FAQPage Schema
How do I write a Hermes plugin that actually loads?

Create a directory ~/.hermes/plugins/<name>/ containing plugin.yaml and __init__.py with a register(ctx) function that calls ctx.register_hook. Flat .py files are never loaded, and you must run hermes plugins enable <name> since user plugins are opt-in.

Why is my Hermes hook not firing after enabling the plugin?

Hooks load only at session start, so enabling mid-session changes nothing in the current session. Run a fresh hermes chat session and check side effects, using HERMES_PLUGINS_DEBUG=1 to see discovery logs in ~/.hermes/logs/agent.log.

What payload keys do Hermes post_tool_call hooks receive?

Plugin post_tool_call callbacks receive function_name, function_args, result, session_id, task_id, duration_ms, status, and error fields, but never cwd. The shell-hook spelling tool_name/args is a different surface, so adapters must normalize both.

How do I inject context into the model from a Hermes plugin?

Return {"context": "..."} from a pre_llm_call callback; it is injected into the user message, never the system prompt. Since post_tool_call has no return channel, stash data keyed by project path and pop it in pre_llm_call.

Can a Hermes memory provider connect to an external MCP server?

Yes, the Hermes venv ships the official MCP SDK, so a provider can act as an MCP client over stdio or Streamable HTTP. Implement the MemoryProvider ABC, inject required fields like projectId, and select it via the memory.provider config key.

How many external memory providers can Hermes use at once?

Only one external memory provider can be active at a time; MemoryManager rejects a second with a warning. Selection happens through the memory.provider config key, and built-in MEMORY.md/USER.md memory always stays active alongside it.