moonlight-lupin/agent-skills/claude-plugin-converter
Claude Code and agent skill by moonlight-lupin/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Use when converting Claude Code plugins into self-contained Hermes plugins — discovery analysis then full conversion.
Install
npx vskill@latest install moonlight-lupin/agent-skills/claude-plugin-converterSKILL.md
Claude Plugin Converter
Convert a Claude Code plugin (.claude-plugin/plugin.json manifest + components) into a self-contained, installable Hermes plugin (plugin.yaml + __init__.py + bundled skills/hooks).
When to Use
- User wants to use a Claude Code plugin with Hermes Agent
- User says "convert this Claude plugin" or "make this work with Hermes"
- User provides a Claude plugin directory, git URL, or marketplace reference
Overview
Two-phase workflow:
- Discovery — analyze the Claude plugin, report what can/can't be converted
- Conversion — generate a complete Hermes plugin directory the user can install with
hermes plugins enable <name>
The output is a single self-contained Hermes plugin — skills, hooks, and MCP config all bundled inside one ~/.hermes/plugins/<name>/ directory. Not scattered artifacts.
⚠️ Security & Trust Boundary
Only convert plugins from sources you trust. The converter reads shell commands, Python hooks, and MCP server configurations from the source plugin and reproduces them in the Hermes output. Converted hooks may execute shell commands from the source plugin via subprocess.run(..., shell=True, ...).
Before enabling a converted plugin:
- Review `hooks.py` — inspect every
subprocess.runcall and_CMD_*variable for dangerous commands - Review `__init__.py` — check what's registered (tools, hooks, slash commands)
- Review `mcp_config.yaml` — verify MCP server commands and env vars are safe
- Review `MANUAL_STEPS.md` — understand what the converter couldn't automate
Do not blindly convert and enable plugins from untrusted GitHub repos or marketplaces without reviewing the generated output first.
Phase 1: Discovery
Run the analysis script:
The script reads .claude-plugin/plugin.json and all component directories, producing structured JSON with convertibility assessments for each component.
Present the findings to the user as a table showing:
- What converts cleanly (✅)
- What converts partially (⚠️)
- What has no Hermes equivalent (⏭️)
See references/mapping-tables.md for the full component → component mapping.
Phase 2: Conversion
After user approval, run the conversion script:
This generates a complete Hermes plugin directory:
Installation
After conversion, install the plugin:
If the plugin has MCP servers, merge mcp_config.yaml into ~/.hermes/config.yaml:
Component Mapping Summary
| Claude Component | Hermes Target | Location | Convertibility | |
|---|---|---|---|---|
Manifest (plugin.json) | plugin.yaml | Plugin root | ✅ Direct field mapping | |
Skills (skills/*/SKILL.md) | Bundled skills | skills/*/SKILL.md + ctx.register_skill() | ✅ Frontmatter remap | |
Commands (commands/*.md) | Slash commands | ctx.register_command() in __init__.py | ⚠️ Simpler format, needs wrapping | |
Hooks (hooks/hooks.json) | Plugin hooks | hooks.py + ctx.register_hook() | ⚠️ ~10/30 events have equivalents | |
Agents (agents/*.md) | Delegation skills | skills/<agent-name>/SKILL.md | ⚠️ Paradigm shift | |
MCP servers (.mcp.json) | MCP config | mcp_config.yaml snippet | ✅ Config format translation | |
LSP servers (.lsp.json) | ❌ No equivalent | — | ⏭️ Skipped, noted in report | |
Monitors (monitors/*.json) | Cron jobs | Noted in MANUAL_STEPS.md | ⚠️ Different concept, manual setup | |
bin/ (PATH executables) | Plugin data files | Copied into plugin dir | ✅ Low priority |
Frontmatter Mapping (SKILL.md)
| Claude Field | Hermes Field | Notes | |
|---|---|---|---|
description | description | Direct copy | |
name | name | Direct copy (used for ctx.register_skill) | |
disable-model-invocation | ❌ | No equivalent — Hermes skills are always model-invoked. Remove and note. | |
$ARGUMENTS (in body) | ❌ | No placeholder equivalent. Rewrite to reference "the user's request" or flag for manual review. | |
| (missing) | version | Inherit from plugin.json version | |
| (missing) | author | Inherit from plugin.json author |
Hook Event Mapping
See references/mapping-tables.md for the complete 30+ event mapping table.
Key mappings:
PreToolUse→pre_tool_call(both can block)PostToolUse→post_tool_callSessionStart→on_session_startSessionEnd→on_session_endUserPromptSubmit→pre_llm_call(both can inject context)SubagentStart→subagent_startSubagentStop→subagent_stopStop→post_llm_call(closest match)PermissionRequest→pre_approval_request
Events with no Hermes equivalent: PostToolBatch, PreCompact, PostCompact, Notification, FileChanged, WorktreeCreate/Remove, CwdChanged, InstructionsLoaded, ConfigChange, TeammateIdle, Elicitation, TaskCreated/Completed.
Hook Type Mapping
| Claude Hook Type | Hermes Implementation | Notes | |
|---|---|---|---|
command (shell) | Python callback in hooks.py using subprocess | Or shell hook in config.yaml | |
http (POST to URL) | Python callback using httpx.post() | Straightforward | |
mcp_tool (call MCP tool) | Python callback using ctx.dispatch_tool() | Map scoped tool names | |
prompt (LLM eval) | ⚠️ No direct equivalent | Note in MANUAL_STEPS — could spawn one-shot agent | |
agent (agentic verifier) | ⚠️ No direct equivalent | Note in MANUAL_STEPS — could use delegate_task |
Agent → Delegation Skill Conversion
Claude agents are markdown files with a system prompt + frontmatter (model, effort, maxTurns, tools).
Hermes has no standalone agent definitions. Instead, each agent becomes a bundled skill that instructs the agent to use delegate_task:
Pitfalls
- `$ARGUMENTS` has no Hermes equivalent — Claude skills use
$ARGUMENTSfor user input. Hermes skills are loaded into context and the agent reads the user's message naturally. Flag for manual review.
- `disable-model-invocation` — Claude lets skills be manual-only. Hermes skills are always model-invoked. Remove the field, note it.
- Agent paradigm shift — Claude has standalone agent definitions. Hermes uses
delegate_taskat runtime. The converter wraps each agent as a delegation skill, but the behavior won't be identical.
- Many hook events have no Hermes equivalent — ~20 of 30 Claude events can't be converted. The report lists them clearly.
- `prompt` and `agent` hook types — No direct Hermes equivalent. These are noted in MANUAL_STEPS for the user to implement manually if needed.
- LSP servers — Hermes has no LSP integration. Skipped, noted in report.
- `${CLAUDE_PLUGIN_ROOT}` appears in skill body text, not just hooks — Claude skills use
${CLAUDE_PLUGIN_ROOT}in markdown links and inline code to reference files in the plugin tree (e.g.[${CLAUDE_PLUGIN_ROOT}/foundations/doctrine.md](../../foundations/doctrine.md)). A real plugin had 120 occurrences across 21 skills. The converter replaces${CLAUDE_PLUGIN_ROOT}with..(relative path fromskills/<name>/to plugin root). For Python hooks, usePath(__file__).parentinstead.
- MCP server scoped names — Claude uses
mcp__plugin_<plugin-name>_<server-name>__<tool>. Hermes usesmcp__<server-name>__<tool>(no plugin namespace). The converter must strip the plugin namespace prefix.
- Commands vs Skills — Claude
commands/are simpler thanskills/(flat markdown, no frontmatter). Hermes slash commands need a Python handler. The converter wraps each command as actx.register_command()that returns the markdown content as a prompt.
- Non-skill data directories must be copied — Claude plugins often ship support directories (
engines/,foundations/,connectors/,docs/) that skills reference via relative paths. These must be copied into the Hermes plugin output directory alongside the converted skills, or all relative links break. The converter skips.git,__pycache__,.pytest_cache,tests, and hidden dirs but copies everything else.
- Conditional hooks import in `__init__.py` — When a Claude plugin has no hooks, the generated
__init__.pymust NOT import ahooksmodule. The converter checksanalysis["components"]["hooks"]and only generates thefrom . import hooksline when hooks exist.
Verification
After conversion, verify the plugin loads:
Plugin skills are opt-in (not listed in <available_skills>). They load via skill_view("plugin-name:skill-name"). This is expected — not a conversion failure.
Pitfalls: Parser Bugs (found in testing)
- `monitors.json` can be a bare list — not always
{"monitors": [...]}. The analyzer must handleisinstance(monitors_data, list)and use it directly, falling back to.get("monitors", [])for the dict case.
- Claude `hooks.json` has a nested layout — each event entry contains a
hooksarray inside it:{"Stop": [{"hooks": [{"type": "command", "command": "..."}]}]}. The analyzer must iteratehook_entry.get("hooks", [])for the inner hook definitions, not readtype/commandfrom the outer entry directly. The outer entry may also have amatcherfield that applies to all inner hooks. Fall back to flat layout (readingtype/commandfrom the entry itself) when no innerhooksarray is present.
- Hook callback names must be threaded from `convert_hooks()` to `generate_init_py()` —
convert_hooks()generates callback function names (e.g._on_post_llm_call_0) and returns them inhook_infos, butgenerate_init_py()needs those names to emitctx.register_hook()calls. Pass them as a{event_name: [callback_name, ...]}dict. If you skip this,__init__.pyhas an empty hooks section and no hooks fire.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingagent-ops/claude-plugin-converter/SKILL.md
Popularity
- Repository stars
- 76
- Repository forks
- 12
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/moonlight-lupin/agent-skills/claude-plugin-converter)