claude-plugin-converter について
claude-plugin-converter は、Claude Code プラグインをインストール可能な単体の Hermes プラグインに変換するスキルです。事前に各コンポーネントの変換可否を示し、未対応部分と手動作業を記録します。
主な機能
- 01コンポーネントごとの変換可否を分析
- 02マニフェスト、スキル、MCP 設定の変換
- 03対応するコマンド、フック、エージェントのマッピング
- 04出力を Hermes プラグインに集約
- 05未対応項目と手動作業の記録
活用シーン
- 01Claude Code プラグインを Hermes Agent 向けに準備
- 02生成前に変換時の不足を確認
- 03対応するスキルと MCP 設定を Hermes に移行
MCP 対応
元プラグインの MCP サーバー設定を、Hermes 用の `mcp_config.yaml` 断片に変換します。このスキル自体は MCP サーバーを提供しません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ moonlight-lupin/ agent-skills --skill claude-plugin-converterインストール後、Claude Code で/claude-plugin-converterを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/mapping-tables.mdscripts/analyze.pyconvert.pyscripts/schemas/mcp.schema.jsonplugin.schema.jsontests/test_converter.py詳細
Claude Plugin Converter
Claude Code プラグイン(.claude-plugin/plugin.json マニフェストとコンポーネント)を、自己完結型のインストール可能な Hermes プラグイン(plugin.yaml + __init__.py + 同梱スキル/フック)に変換します。
使用するタイミング
- ユーザーが Hermes Agent で Claude Code プラグインを使いたい場合
- ユーザーが「この Claude プラグインを変換して」や「これを Hermes で動くようにして」と依頼した場合
- ユーザーが Claude プラグインのディレクトリ、Git URL、またはマーケットプレイスの参照情報を提供した場合
概要
2 段階のワークフローです。
- 検出 — Claude プラグインを分析し、変換できる内容とできない内容を報告します
- 変換 — ユーザーが
hermes plugins enable <name>でインストールできる、完全な Hermes プラグインディレクトリを生成します
出力は自己完結型の単一の Hermes プラグインです。スキル、フック、MCP 設定はすべて 1 つの ~/.hermes/plugins/<name>/ ディレクトリにまとめられます。成果物が分散することはありません。
⚠️ セキュリティと信頼境界
信頼できるソースのプラグインのみを変換してください。 コンバーターは、ソースプラグインのシェルコマンド、Python フック、MCP サーバー設定を読み取り、Hermes の出力に反映します。変換されたフックは、ソースプラグインのシェルコマンドを subprocess.run(..., shell=True, ...) 経由で実行する場合があります。
変換したプラグインを有効にする前に、次の内容を確認してください。
hooks.pyを確認する — すべてのsubprocess.run呼び出しと_CMD_*変数を調べ、危険なコマンドがないか確認します__init__.pyを確認する — 登録される内容(ツール、フック、スラッシュコマンド)を確認しますmcp_config.yamlを確認する — MCP サーバーのコマンドと環境変数が安全であることを確認しますMANUAL_STEPS.mdを確認する — コンバーターが自動化できなかった内容を把握します
生成された出力を事前に確認せず、信頼できない GitHub リポジトリやマーケットプレイスのプラグインを、むやみに変換して有効にしないでください。
フェーズ 1:検出
分析スクリプトを実行します。
python3 {SKILL_DIR}/scripts/analyze.py <claude_plugin_dir> --output <output_dir>/analysis.json
このスクリプトは .claude-plugin/plugin.json とすべてのコンポーネントディレクトリを読み込み、各コンポーネントの変換可能性評価を含む構造化 JSON を生成します。
調査結果を次の内容を示す表にしてユーザーに提示します。
- そのまま問題なく変換できるもの(✅)
- 一部のみ変換できるもの(⚠️)
- Hermes に相当するものがないもの(⏭️)
コンポーネント間の対応関係の詳細は、references/mapping-tables.md を参照してください。
フェーズ 2:変換
ユーザーの承認後、変換スクリプトを実行します。
python3 {SKILL_DIR}/scripts/convert.py <claude_plugin_dir> --analysis <output_dir>/analysis.json --output <output_dir>/<plugin_name>
これにより、完全な Hermes プラグインディレクトリが生成されます。
<plugin_name>/
├── plugin.yaml # Translated manifest
├── __init__.py # register(ctx) — wires tools, hooks, skills, commands
├── schemas.py # Tool schemas (if MCP servers had custom tools)
├── tools.py # Tool handlers (if any)
├── hooks.py # Hook callback functions (only if hooks exist)
├── skills/ # Bundled skills (registered via ctx.register_skill)
│ └── <skill-name>/
│ └── SKILL.md
├── engines/ # Non-skill data dirs copied from source (engines, foundations, etc.)
├── foundations/
├── connectors/
├── mcp_config.yaml # MCP server config snippet (for user to merge)
├── CONVERSION_REPORT.md # Full report: converted, partial, skipped, manual steps
└── MANUAL_STEPS.md # What the user must do by hand
インストール
変換後、プラグインをインストールします。
cp -r <output_dir>/<plugin_name> ~/.hermes/plugins/
hermes plugins enable <plugin_name>
# Then restart: /reset in CLI or /restart in gateway
プラグインに MCP サーバーが含まれている場合は、mcp_config.yaml の内容を ~/.hermes/config.yaml にマージします。
cat <plugin_name>/mcp_config.yaml >> ~/.hermes/config.yaml
# Or use: hermes mcp add <name> --command <cmd> --args <args>
コンポーネント対応表の概要
| Claude のコンポーネント | Hermes の変換先 | 場所 | 変換可能性 |
|---|---|---|---|
マニフェスト(plugin.json) | plugin.yaml | プラグインのルート | ✅ フィールドを直接対応付け |
スキル(skills/*/SKILL.md) | 同梱スキル | skills/*/SKILL.md + ctx.register_skill() | ✅ フロントマターを対応付け |
コマンド(commands/*.md) | スラッシュコマンド | __init__.py 内の ctx.register_command() | ⚠️ 形式がより単純なため、ラッパーが必要 |
フック(hooks/hooks.json) | プラグインフック | hooks.py + ctx.register_hook() | ⚠️ 30 件中約 10 件のイベントに相当するものがあります |
エージェント(agents/*.md) | 委任スキル | skills/<agent-name>/SKILL.md | ⚠️ パラダイムの変更が必要 |
MCP サーバー(.mcp.json) | MCP 設定 | mcp_config.yaml のスニペット | ✅ 設定形式を変換 |
LSP サーバー(.lsp.json) | ❌ 相当するものなし | — | ⏭️ スキップし、レポートに記載 |
モニター(monitors/*.json) | Cron ジョブ | MANUAL_STEPS.md に記載 | ⚠️ 概念が異なるため、手動で設定 |
bin/(PATH 実行ファイル) | プラグインデータファイル | プラグインディレクトリにコピー | ✅ 優先度は低い |
フロントマターのマッピング(SKILL.md)
| Claude フィールド | Hermes フィールド | 備考 |
|---|---|---|
description | description | そのままコピー |
name | name | そのままコピー(ctx.register_skill で使用) |
disable-model-invocation | ❌ | 相当するものはありません。Hermes のスキルは常にモデルによって呼び出されます。削除して、その旨を記載してください。 |
$ARGUMENTS(本文内) | ❌ | 相当するプレースホルダーはありません。「ユーザーのリクエスト」を参照するように書き換えるか、手動確認が必要であることを示してください。 |
| (なし) | version | plugin.json のバージョンを継承 |
| (なし) | author | plugin.json の作成者を継承 |
フックイベントのマッピング
イベントのマッピング一覧(30 件以上)は、references/mapping-tables.md を参照してください。
主なマッピング:
PreToolUse→pre_tool_call(どちらも処理をブロックできます)PostToolUse→post_tool_callSessionStart→on_session_startSessionEnd→on_session_endUserPromptSubmit→pre_llm_call(どちらもコンテキストを追加できます)SubagentStart→subagent_startSubagentStop→subagent_stopStop→post_llm_call(最も近い対応イベント)PermissionRequest→pre_approval_request
Hermes に相当するイベントがないもの:PostToolBatch、PreCompact、PostCompact、Notification、FileChanged、WorktreeCreate/Remove、CwdChanged、InstructionsLoaded、ConfigChange、TeammateIdle、Elicitation、TaskCreated/Completed。
フックタイプのマッピング
| Claude のフックタイプ | Hermes での実装 | 備考 |
|---|---|---|
command(シェル) | subprocess を使う hooks.py 内の Python コールバック | または config.yaml 内のシェルフック |
http(URL への POST) | httpx.post() を使う Python コールバック | そのまま実装できます |
mcp_tool(MCP ツールの呼び出し) | ctx.dispatch_tool() を使う Python コールバック | スコープ付きのツール名をマッピング |
prompt(LLM による評価) | ⚠️ 直接相当するものはありません | MANUAL_STEPS に記載してください。一度限りのエージェントを起動する方法が考えられます |
agent(エージェントによる検証) | ⚠️ 直接相当するものはありません | MANUAL_STEPS に記載してください。delegate_task を使用する方法が考えられます |
エージェントから委譲スキルへの変換
Claude のエージェントは、システムプロンプトとフロントマター(model、effort、maxTurns、tools)を含む Markdown ファイルです。
Hermes には単独のエージェント定義がありません。代わりに、各エージェントは delegate_task の使用を指示する同梱スキルになります。
---
name: <agent-name>
description: <from Claude agent description>
---
# <Agent Name>
When the user's task matches this agent's specialty, delegate it:
1. Call `delegate_task` with:
- `goal`: "<from Claude agent description>"
- `context`: "<full system prompt from the Claude agent .md file>"
2. Do not attempt the task yourself — delegate it.
## Original Agent Config
- Model: <from frontmatter>
- MaxTurns: <from frontmatter>
- Tools: <from frontmatter, if restricted>
注意点
-
$ARGUMENTSに相当するものは Hermes にありません — Claude のスキルでは、ユーザー入力に$ARGUMENTSを使用します。Hermes のスキルはコンテキストに読み込まれ、エージェントがユーザーのメッセージを自然に読み取ります。手動レビューが必要な項目としてフラグを立てます。 -
disable-model-invocation— Claude では、スキルを手動でのみ実行できます。Hermes のスキルは常にモデルによって呼び出されます。このフィールドを削除し、その旨を記録します。 -
エージェントのパラダイムの違い — Claude には独立したエージェント定義があります。Hermes では実行時に
delegate_taskを使用します。コンバーターは各エージェントを委任スキルとしてラップしますが、動作は完全には一致しません。 -
Hermes に相当するものがないフックイベントが多数あります — Claude のイベント30件のうち、約20件は変換できません。レポートに明記されます。
-
promptとagentのフックタイプ — Hermes に直接相当するものはありません。必要に応じてユーザーが手動で実装できるよう、MANUAL_STEPS に記載します。 -
LSP サーバー — Hermes には LSP 統合がありません。スキップされ、レポートに記載されます。
-
${CLAUDE_PLUGIN_ROOT}がフックだけでなくスキル本文にも登場します — Claude のスキルでは、プラグインのツリー内のファイルを参照するために、Markdown のリンクやインラインコードで${CLAUDE_PLUGIN_ROOT}を使用します(例:[${CLAUDE_PLUGIN_ROOT}/foundations/doctrine.md](../../foundations/doctrine.md))。実際のプラグインでは、21個のスキル全体で120か所に登場しました。コンバーターは${CLAUDE_PLUGIN_ROOT}を..(skills/<name>/からプラグインのルートへの相対パス)に置き換えます。Python フックでは、代わりにPath(__file__).parentを使用します。 -
MCP サーバーのスコープ付き名前 — Claude では
mcp__plugin_<plugin-name>_<server-name>__<tool>を使用します。Hermes ではmcp__<server-name>__<tool>を使用し、プラグインの名前空間はありません。コンバーターでプラグインの名前空間のプレフィックスを削除する必要があります。 -
コマンドとスキルの違い — Claude の
commands/はskills/よりもシンプルで、フラットな Markdown であり、フロントマターはありません。Hermes のスラッシュコマンドには Python ハンドラーが必要です。コンバーターは各コマンドを、Markdown の内容をプロンプトとして返すctx.register_command()でラップします。 -
スキル以外のデータディレクトリもコピーする必要があります — Claude のプラグインには、スキルが相対パスで参照するサポート用ディレクトリ(
engines/、foundations/、connectors/、docs/)が含まれていることがよくあります。相対リンクが切れないよう、変換したスキルとともに Hermes プラグインの出力ディレクトリへコピーする必要があります。コンバーターは.git、__pycache__、.pytest_cache、tests、隠しディレクトリをスキップし、それ以外はすべてコピーします。 -
__init__.pyでの条件付きフックインポート — Claude のプラグインにフックがない場合、生成される__init__.pyでhooksモジュールをインポートしてはいけません。コンバーターはanalysis["components"]["hooks"]を確認し、フックがある場合にのみfrom . import hooksの行を生成します。
検証
変換後、プラグインが読み込まれることを確認します。
# Copy to plugins dir (if not already there)
cp -r <output_dir>/<plugin_name> ~/.hermes/plugins/
# Check it's discovered
HERMES_PLUGINS_DEBUG=1 hermes plugins list
# Enable and test
hermes plugins enable <plugin_name>
# Then test skill loading (plugin skills are opt-in, not in available_skills):
hermes chat -q 'Load skill "plugin-name:skill-name" and tell me what it does' -t skills
プラグインのスキルはオプトインであり(<available_skills> には表示されません)、skill_view("plugin-name:skill-name") で読み込まれます。これは想定どおりの動作であり、変換の失敗ではありません。
注意点:パーサーのバグ(テストで発見)
-
monitors.jsonは単独のリストの場合があります — 常に{"monitors": [...]}とは限りません。アナライザーはisinstance(monitors_data, list)を処理し、リストを直接使用する必要があります。辞書の場合は.get("monitors", [])にフォールバックします。 -
Claude の
hooks.jsonは入れ子構造になっています — 各イベントエントリーには、その内側にhooks配列があります:{"Stop": [{"hooks": [{"type": "command", "command": "..."}]}]}。アナライザーは外側のエントリーからtype/commandを直接読み取るのではなく、内側のフック定義を取得するためにhook_entry.get("hooks", [])を反復処理する必要があります。外側のエントリーには、内側のすべてのフックに適用されるmatcherフィールドが含まれる場合もあります。内側にhooks配列がない場合は、フラットな構造(エントリー自体からtype/commandを読み取る形式)にフォールバックします。 -
フックのコールバック名は
convert_hooks()からgenerate_init_py()に渡す必要があります —convert_hooks()はコールバック関数名(例:_on_post_llm_call_0)を生成し、hook_infosで返しますが、generate_init_py()はctx.register_hook()呼び出しを出力するために、それらの名前を必要とします。{event_name: [callback_name, ...]}の辞書として渡してください。これを省略すると、__init__.pyのフックセクションが空になり、フックは実行されません。 -
複雑な引用符を含むシェルコマンドは、手作業でのエスケープでは正しく処理できません — Claude のフックコマンドには、入れ子になった一重引用符、二重引用符、バックスラッシュが含まれることがよくあります(例:
python3 -c "import os; os.environ.get('CLAUDE_PLUGIN_ROOT')...")。.replace("'", "\\'")を使って手作業でエスケープしないでください。無効な Python コードが生成されます。Python のrepr()(!r書式指定)を使って安全に引用符で囲んだモジュールレベル変数を生成し、その変数をsubprocess.run()で参照してください:_CMD_0 = {command!r}として保存し、続けてsubprocess.run(_CMD_0, shell=True, ...)を呼び出します。
検証チェックリスト
- 生成したすべての
.pyファイルに対してpython3 -c "import py_compile; py_compile.compile('hooks.py', doraise=True)"を実行します - プラグインをインストールします:
cp -r <name> ~/.hermes/plugins/ && hermes plugins enable <name> - ロード失敗がないかログを確認します:
grep -i "failed to load plugin" ~/.hermes/logs/agent.log - スキルの読み込みをテストします:
hermes chat -q 'Load skill "plugin-name:skill-name" and tell me what it does' -t skills - プラグインのスキルはオプトイン方式です(
<available_skills>には含まれません)。正しいテスト方法はskill_view("plugin:skill")による読み込みであり、skills_list に表示されるかどうかの確認ではありません。
テスト対象
-
21 個のスキルを含む会計スタイルのプラグイン(Python エンジン、基盤、コネクター) — 21 個すべてのスキルを問題なく変換し、
${CLAUDE_PLUGIN_ROOT}の参照 120 件を書き換え、データディレクトリをコピーしました。プラグインをロードし、skill_view が正常に動作することを確認しました。 -
複数のコンポーネントを含む 51 個のスキルを持つプラグイン(6 個のエージェント、2 個のフック、1 個のモニター、bin/) — 51 個のスキルを変換し、6 個のエージェントを委譲スキルに、2 個の Stop フックを post_llm_call に変換しました。モニターは手動で cron に設定するものとして記録しました。4 件のバグ(monitors.json のリスト形式、フックの入れ子構造、コールバック名の引き渡し、シェルコマンドの引用符処理)が発生しましたが、すべてスクリプトで修正しました。プラグインをロードし、通常のスキルと委譲スキルの両方で skill_view が正常に動作することを確認しました。