コンテンツにスキップ
このページの翻訳は LLM によって生成されています。誤りに気づいた場合は GitHub で issue を開いてお知らせください。

プラグイン

Next docs describe unreleased work from master. Stable docs remain at /docs/.

Herdr プラグインは、共有可能で実行可能なワークフローパッケージです。プラグインは Bash スクリプト、JavaScript アプリ、Lua スクリプト、Rust バイナリ、その他マシンで 実行できる任意の argv コマンドにできます。Herdr はホスト側の面を担います: インストール、マニフェスト検証、キーバインド、ターミナルペイン、イベント、 呼び出しコンテキスト、ソケットアクセスです。プラグインは自分の実装言語、依存関係、 ファイル、永続状態を担います。

プラグインは Herdr を軽量に保つために存在します。コアはターミナルワークスペース、 ペイン、エージェント、安定した CLI/ソケット API に集中し続けます。プラグインは その既存の拡張面を、あらゆるワークフローを Herdr 本体に追加することなく、 誰もが作成・インストール・共有できる再利用可能なワークフローに変えます。

プラグインは SDK インテグレーションではありません。herdr-plugin.toml マニフェストと、Herdr が起動できるコマンドを持つディレクトリです。Herdr は マニフェストを検証し、ランタイムコンテキストを注入し、宣言されたコマンドを起動し、 ログを記録します。コマンドはさらに作業が必要なときに、CLI またはソケット経由で Herdr を呼び出します。

独立したプラグイン SDK や制限付きコマンドセットはありません。Herdr CLI 全体が プラグイン API です: CLI リファレンスのすべてのコマンドを プラグインから使えます。自分で herdr ... として実行できるものは、プラグインも 実行できます。ほとんどのプラグインは、実行中の Herdr バイナリを指す HERDR_BIN_PATH を通じて Herdr を呼び出すべきです。これにより、Unix ソケットと Windows 名前付きパイプの両方でプラグインの移植性が保たれます。生の JSON リクエストを 自分で送りたいときはソケット APIを使ってください。

ランタイムでのアクション登録と、ターミナル以外のネイティブなプラグイン UI は プラグイン v1 の範囲外です。アクション、イベントフック、ペイン、リンクハンドラーは すべてマニフェストで宣言します。

プラグインはあなたのマシンで動く普通のコードです。インストールまたはリンクすると、 そのビルドコマンドとランタイムコマンドはあなたのユーザーとして、あなたの環境で 実行され、Herdr CLI 全体を呼び出せます — エディタ、シェル、コーディングエージェントに 追加する拡張機能と同じです。この開放性こそが狙いであり、少しの判断力があれば 安全に保てます。

信頼できる作者とリポジトリからプラグインをインストールし、新しいプラグインが 何をするのか先に目を通してください: herdr-plugin.toml マニフェストと、実行される スクリプトやバイナリです。herdr plugin install は対話的なターミナルでソースと 実行されるコマンドのプレビューを表示するので、確定する前に確認できます。すでに 信頼しているソースには --yes を使い、特定のリビジョンが欲しいときは --ref で 固定してください。

Herdr はマニフェストを検証し、各プラグインの設定と状態を専用ディレクトリに 保ちますが、プラグインの動作をレビューしたりサンドボックス化したりはしません。 サードパーティのプラグインは Herdr ではなく作者のものです。検証と実行の判断は あなた自身に委ねられます。

マニフェストは Herdr とプラグインの間の契約です。パッケージのメタデータ、対応 プラットフォーム、任意のビルドコマンド、Herdr が実行できるエントリーポイントを 宣言します。

id = "example.layout"
name = "Layout"
version = "0.1.0"
min_herdr_version = "0.7.0"
description = "Apply project layouts"
platforms = ["linux", "macos", "windows"]
[[build]]
command = ["npm", "ci"]
[[build]]
command = ["npm", "run", "build"]
platforms = ["linux", "macos"]
[[startup]]
command = ["node", "dist/restore.js"]
[[actions]]
id = "apply"
title = "Apply layout"
contexts = ["workspace"]
command = ["node", "dist/apply.js"]
[[events]]
on = "worktree.created"
command = ["herdr", "workspace", "list"]
[[panes]]
id = "board"
title = "Project board"
placement = "overlay"
command = ["herdr-board"]
[[link_handlers]]
id = "github-issue"
title = "Open GitHub issue"
pattern = "^https://github\\.com/[^/]+/[^/]+/(issues|pull)/[0-9]+$"
action = "apply"

トップレベルの idnameversionmin_herdr_version は必須です。 min_herdr_version には、プラグインが使うプラグイン API、イベント名、 マニフェストフィールドをサポートする最も古い Herdr バージョンを設定してください。 プラグインの最低バージョンが現在のバイナリより新しい場合、Herdr はリンクや インストールを拒否します。description は任意です。プラグイン id には ASCII の 英字、数字、ドット、コロン、アンダースコア、ハイフンが使えます。

アクション id、ペイン id、リンクハンドラー id はプラグイン内部のローカル id です。 ASCII の英字、数字、コロン、アンダースコア、ハイフンが使えますが、ドットは 使えません。各 id の種類はプラグイン内で一意でなければなりません。グローバルに 一意な名前が必要なとき、Herdr はアクション id を plugin.id.action の形に修飾します。

プラグインが動作する場所は platforms = ["linux", "macos", "windows"] で宣言します。 ビルドコマンド、スタートアップフック、アクション、イベントフック、ペイン、 リンクハンドラーも独自の platforms を宣言でき、項目レベルの platforms は トップレベルのリストを上書きします。トップレベルの platforms がないローカル プラグインは警告付きでリンクされます。

command の値は argv 配列です。Herdr はこれをシェル経由で実行しないため、 コマンド自身がシェルを起動しない限りシェル展開はありません。言語固有の挙動は スクリプトやバイナリの側に置いてください。

herdr-plugin.toml と実行可能なスクリプトまたはプログラムをひとつ含む ディレクトリから始めます:

my-plugin/
herdr-plugin.toml
index.js
id = "example.workspace-tools"
name = "Workspace Tools"
version = "0.1.0"
min_herdr_version = "0.7.0"
description = "Small workspace helpers"
platforms = ["linux", "macos", "windows"]
[[actions]]
id = "list-workspaces"
title = "List workspaces"
contexts = ["workspace"]
command = ["node", "index.js"]

コマンドの中からは HERDR_BIN_PATH で Herdr を呼び出します:

const { spawnSync } = require("node:child_process");
const herdr = process.env.HERDR_BIN_PATH ?? "herdr";
const result = spawnSync(herdr, ["workspace", "list"], {
encoding: "utf8",
stdio: ["ignore", "pipe", "pipe"],
});
process.stdout.write(result.stdout);
process.stderr.write(result.stderr);
process.exit(result.status ?? 1);

この例は Node を使っていますが、プラグインに Node は必須ではありません。 マニフェストは Bash、PowerShell、Python、Rust、Go、Lua、Bun など、ユーザーの マシンで使える任意のコマンドを起動できます。

サンプルプラグインをインストールします:

Terminal window
herdr plugin install ogulcancelik/herdr-plugin-examples/agent-telegram-notify
herdr plugin config-dir examples.agent-telegram-notify
herdr plugin list
herdr plugin action list --plugin examples.agent-telegram-notify

ローカルでプラグインを作成しているときは、代わりに作業ディレクトリをリンクします:

Terminal window
herdr plugin link /path/to/plugin
herdr plugin config-dir example.layout
herdr plugin action list --plugin example.layout
herdr plugin action invoke example.layout.apply
herdr plugin pane open --plugin example.layout --entrypoint board
herdr plugin log list --plugin example.layout

plugin installowner/repo/subdir のような GitHub 省略記法のみを受け付けます。 git でクローンし、対話的なターミナルではプレビューを表示し、サポートされる ビルドコマンドを実行し、チェックアウトを Herdr 管理のプラグインデータの下に保存して 登録します。非対話的なインストールには --yes を使ってください。GitHub 管理の プラグインを再インストールすると、その管理チェックアウトが置き換えられます。 インストール済みおよびリンク済みのプラグインと、その有効・無効の状態は現在の ユーザー全体で共有され、すべての Herdr セッションから利用できます。Herdr サーバーが 動作していないときでも plugin installplugin link で登録できます。 Herdr 0.7.3 の名前付きセッションだけにインストールしたプラグインは、再度 install または link してください。既存のプラグイン設定と状態はそのまま残ります。 ローカルにリンクされたプラグインへの上書きインストールは拒否されます。先に ローカルプラグインを unlink または uninstall してください。plugin installplugin link はプラグインの設定・状態ディレクトリを作成し、 plugin config-dir <id> はセットアップドキュメントやシェルスクリプト向けに 設定ディレクトリを表示します。

plugin uninstall <id-or-source> はプラグインの登録を解除します。GitHub 管理の インストールでは管理チェックアウトも削除し、プラグイン id と、install で使うのと 同じ owner/repo[/subdir...] 省略記法の両方を受け付けます。plugin unlink <id> は 登録解除のみを行いファイルには触れないため、ローカル開発に便利です。v1 に独立した plugin update はありません。管理プラグインを更新するには GitHub から 再インストールしてください。

サンプル集のリポジトリは ogulcancelik/herdr-plugin-examples です。 agent-telegram-notifygithub-link-previewdev-layout-bootstrap を含む 独立したサンプルプラグインがサブディレクトリに入っています。これらはコピーする ためのサンプルであり、メンテナンスされる公式プラグインではありません。

ビルドコマンドは GitHub からの plugin install 中、確認の後、Herdr がプラグインを 登録する前に実行されます。ビルドコマンドが失敗するとインストールは中止され、 プラグインは登録されません。plugin link はビルドコマンドを実行しません。 ローカルの作者は自分で作業ツリーをビルドします。ビルドコマンドはファイルを生成して 構いませんが、インストールプレビュー後に herdr-plugin.toml を変更すると インストールは中止されます。ビルド失敗時には、プラグイン id、ビルドのインデックス、 作業ディレクトリ、コマンド、終了ステータスまたは spawn エラー、上限付きの stdout/stderr が、ツールの出力を解釈せずに表示されます。

ビルドコマンドも素の argv コマンドですが、ランタイムのプラグインコンテキストや Herdr のソケット環境変数は受け取りません。プラグインの作者は cargonpmbunlua といった必要なシステムツールをドキュメントに書いてください。Herdr は ビルドの失敗を報告しますが、足りないツールチェーンをインストールすることはありません。

[[startup]] コマンドは、Herdr がセッションを復元し、API ソケットの準備が整った後に、 有効なプラグインごとに一度実行されます。ライブハンドオフで新しいサーバーが引き継いだ ときにも再実行されますが、クライアントの接続、設定の再読み込み、プラグインの link や enable では実行されません。Herdr はこれらを非同期で開始し、完了を通常のプラグイン コマンドログに記録します。スタートアップの失敗でサーバーが停止することはありません。

スタートアップフックは一度限りの初期化コマンドであり、監視されるデーモンではありません。 フックはプラグインが所有する状態を復元し、必要な Herdr API を呼び出して終了してください。 たとえば宣言型の Agent ビューを HERDR_PLUGIN_STATE_DIR に保存し、スタートアップフックで 読み込んで再適用できます。

スタートアップフックは通常のランタイムプラグイン環境と HERDR_PLUGIN_EVENT=startup を受け取ります。インストールプレビューには、自動実行される コードを確認できるよう、すべてのスタートアップコマンドが表示されます。

ランタイムコマンドは、プラグインディレクトリを作業ディレクトリとして実行されます。 Herdr は HERDR_SOCKET_PATHHERDR_BIN_PATHHERDR_ENV=1HERDR_PLUGIN_IDHERDR_PLUGIN_ROOTHERDR_PLUGIN_CONFIG_DIRHERDR_PLUGIN_STATE_DIRHERDR_PLUGIN_CONTEXT_JSON、そして利用可能なら HERDR_WORKSPACE_IDHERDR_TAB_IDHERDR_PANE_ID を注入します。アクション コマンドは加えて HERDR_PLUGIN_ACTION_ID を受け取ります。スタートアップフックと イベントフックは HERDR_PLUGIN_EVENT(スタートアップフックでは startup)を受け取り、 イベントフックはさらに HERDR_PLUGIN_EVENT_JSON を、ペインコマンドは HERDR_PLUGIN_ENTRYPOINT_ID を受け取ります。

HERDR_PLUGIN_ROOT は、インストールまたはリンクされたプラグインディレクトリです。 GitHub からインストールされたプラグインのルートは管理されたソースチェックアウト なので、そこにユーザーの認証情報や永続状態を保存しないでください。.env ファイルの ようなユーザーが編集する設定は HERDR_PLUGIN_CONFIG_DIR の下に、ローカルの ランタイム状態は HERDR_PLUGIN_STATE_DIR の下に置いてください。Herdr はこれらの ディレクトリを作成し、レガシーなプラグイン設定の場所が存在すれば HERDR_PLUGIN_CONFIG_DIR に初期内容を移しますが、その中身の検証、同期、削除は しません。ファイル形式とライフサイクルはプラグインが所有します。

HERDR_PLUGIN_CONTEXT_JSON には、その呼び出しで利用可能な場合、ワークスペース、 タブ、フォーカス中のペイン、worktree、エージェント、選択テキスト、クリックされた URL、リンクハンドラーのフィールドが含まれます。シェルプラグインは、よく使う id は 個別の環境変数から読み、完全な形が必要ならコンテキスト JSON をパースできます。

Node、PowerShell、Bash など別のランタイムから移植性を保って Herdr を呼び出す必要が あるときは HERDR_BIN_PATH を使ってください。HERDR_SOCKET_PATH の背後にある生の ソケットトランスポートは OS 固有です: Unix クライアントは Unix ソケットパスに、 Windows クライアントは名前付きパイプに接続します。HERDR_BIN_PATH を通じた CLI 呼び出しなら、そのトランスポートの違いを気にせずに済みます。利用可能なコマンドは CLI リファレンス、生のリクエスト形式は ソケット APIを参照してください。

マニフェストのペイン placement のデフォルトは overlay で、アクティブなペインの 上に一時的なズームオーバーレイを開き、閉じるときに以前のフォーカスとズームを 復元します。plugin.pane.open リクエストは、マニフェストの placement を overlaypopupsplittabzoomed で上書きできます。

placement = "popup" は、タイルレイアウトを変更せずにセッションモーダルなターミナルポップアップを開きます。 マニフェストまたは open リクエストで任意の widthheight を指定できます。 省略するとデフォルトの半分のサイズになり、数値なら外側のターミナルセル数、"80%" のような文字列ならターミナル領域に対する割合になります。 Escape を含むすべてのターミナル入力を受け取り、コマンドが終了するか popup.close リクエストが送られると閉じます。 最小サイズより小さい寸法は最小値に制限されます。

ペインを常に一時的にしたい場合は、プラグインペインのエントリーポイントに placement を直接宣言します:

[[panes]]
id = "picker"
title = "Picker"
platforms = ["linux", "macos"]
placement = "popup"
width = "80%"
height = 20
command = ["sh", "picker.sh"]

split、tab、zoomed、overlay のプラグインペインは、開いた後は通常の Herdr ペインです。プラグインはソケットや CLI を 通じて pane.movepane.swappane.resizepane.zoom といった標準のペイン API を呼び出せます。ペインがタブやワークスペースをまたいで移動しても、Herdr は プラグインペインの所有権を元のペインに結び付けたまま維持します。 ポップアップは Herdr ペインではなく、セッションに 1 つだけ存在できるリソースです。 ペイン id を持たず、プラグインのフォーカスコンテキストを変更せず、ペインのライフサイクルイベントを発行せず、pane、layout、永続化、エージェント API に参加しません。 そのプロセスには HERDR_PANE_ID が渡されず、背後のタイルペインは HERDR_PLUGIN_CONTEXT_JSON から参照できます。 Settings、コピーモード、または別の Herdr モーダルが開いている間にポップアップを開くと ui_busy が返り、起動後の plugin.pane.openok を返します。

Windows では、ビルドコマンド、アクションコマンド、イベントコマンドは、素の コマンドが PATH にあれば npm.cmdbun.cmdpnpm.cmd のような一般的な PATHEXT shim を解決します。ペインコマンドは Herdr の通常の Windows ペイン ランチャーを使うため、引き続き有効な Windows の argv コマンドでなければなりません。

インストール済みプラグインのアクションにキーを割り当てます:

[[keys.command]]
key = "prefix+l"
type = "plugin_action"
command = "example.layout.apply"
description = "apply layout"

[[link_handlers]] を使うと、マッチしたターミナル URL への修飾キー付きクリックを、 ブラウザで URL を開く代わりにプラグインのアクションにルーティングできます。 修飾キー付きクリックの修飾キーは macOS を含むすべてのプラットフォームで Control です。キャプチャされたターミナルのマウスレポートは、Command/Super を通常のクリックと 区別して伝えないからです。pattern はクリックされた URL に対してマッチする Rust の 正規表現で、action には同じプラグインが宣言したアクション名を指定します。リンク ハンドラーのアクションは HERDR_PLUGIN_CONTEXT_JSONinvocation_source = "link_click"clicked_urllink_handler_id を受け取ります。 シェルプラグインは HERDR_PLUGIN_CLICKED_URLHERDR_PLUGIN_LINK_HANDLER_ID も 読めます。ハンドラーは各プラグイン内でマニフェストの順にチェックされます。

v1 には Herdr が管理するプラグインストレージ API はありません。永続状態が必要な プラグインは、自分のファイルやデータベースを持ってください。

コミュニティ製プラグインはマーケットプレイスで探せます。これは GitHub トピック herdr-plugin が付いた公開 GitHub リポジトリの自動インデックスです。 プラグインは普通の GitHub リポジトリのままです: herdr-plugin.toml を含めて公開し、 herdr plugin install owner/repo[/subdir] を共有してください。

プラグインを掲載するには、公開リポジトリに GitHub トピック herdr-plugin を 追加します。インデックスは 30 分ごとに更新されます。発見の仕組みは マーケットプレイスを参照してください。