Otter Bridge について
入力メタデータとREADMEの内容は一致していません。READMEに記載されているweirは、隔離されたCLIエージェントワーカー向けのタスクランナー兼GPUスロットスケジューラーで、Otter Bridgeではありません。新しいGit worktree、期限、隔離チェック、JSON記録でタスクを管理し、MCPは使用しません。
主な機能
- 01タスクごとに新しいGit worktreeを作成
- 02GPUスロットを排他的にリース
- 03厳格な実行期限を設定
- 04隔離環境で検証チェックを実行
- 05タスク結果をJSONで記録
活用シーン
- 01制限付きコーディング作業を低コストのワーカーに委任
- 02複数ワーカー間でGPUスロットを割り当て
- 03隔離チェックを実行してパッチをレビュー
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
weir
隔離された CLI エージェントワーカー向けのタスクランナー兼 GPU スロットスケジューラーです。静的バイナリ 1 つで動作し、デーモンは不要です。
コーディングエージェント(たとえば Claude Code のサブエージェント)が、範囲を限定したジョブを、より低コストのワーカーに渡します。weir はそのジョブに新しい git worktree、単一の GPU スロットのリース、厳格な期限、隔離された検証チェック、1 件の JSON レコードを用意し、その後は処理に介入しません。呼び出し元がパッチをレビューしてコミットします。
- HTTP、MCP、サーバー、API キーはありません。認証情報は各ワーカーが独自に管理します。
- weir が実行するのは
pi-worker、agy-worker、agent-jail、gitのみです。 - weir がコミット、マージ、プッシュすることはありません。
- プロンプト用のパイプを除き、すべての起動時に
stdinは null です。
設計:DESIGN.md。決定記録:docs/design-v1.md。 履歴:CHANGELOG.md。
インストール
cargo install --path . --root ~/.local # installs ~/.local/bin/weir
または、GitHub リリースから weir-<version>-x86_64-unknown-linux-gnu.tar.gz をダウンロードし、隣にある .sha256 で検証して、weir を PATH に配置してください。
実行時要件:Linux、git、設定したワーカースクリプト(pi-worker、agy-worker)が PATH 上にあること、チェック用の agent-jail(bwrap を含む)。
クイックスタート
mkdir -p ~/.config/weir
cp examples/weir.v2.example.toml ~/.config/weir/weir.toml # edit paths and checks
weir validate --deep # wrappers, bwrap, agent-jail WT_ROOTS, state_dir
weir status
weir task run --repo ~/code/myrepo --base main --worker pi \
--prompt-file notes.md --check web-typecheck --json
設定の検索順序:--config > $WEIR_CONFIG > $XDG_CONFIG_HOME/weir/weir.toml >
~/.config/weir/weir.toml。./weir.toml は意図的に読み込みません。ファイルには version = 2 が含まれている必要があります。weir schema を実行すると JSON Schema が出力されます。
コマンド
すべてのコマンドで --json、-c/--config、--log-level、--log-format を指定できます。
task
# One worker, two checks, keep the worktree for review (default cleanup=never)
weir task run --repo ~/code/myrepo --base main --worker pi --replica auto \
--prompt-file notes.md --check web-typecheck --check web-lint --json
# Walk an escalation ladder: pi, then cloud models, on timeout/empty/quota
weir task run --repo ~/code/myrepo --ladder default --prompt-stdin --json < notes.md
weir task list --since 24h
weir task show 20261001-fix-tones-3fa2 # ledger record
weir task show 20261001-fix-tones-3fa2 --patch # the diff
weir task clean --merged # or: <ID>, --older-than 7d
各実行では、paths.wt_roots のいずれかの下に wt/<id> を作成し、ラッパーを実行して patch.diff を取得し、隔離された [check.*] エントリを実行し、<state_dir>/ledger.jsonl に weir.task/1 の行を 1 件追加して、--json を指定した場合はその内容を出力します。--cleanup never|on-success|always で worktree の削除を制御します。
lease
# Run a wrapper under an exclusive slot; {replica} is filled with the winner
weir lease run --slot gpu-a=a --slot gpu-b=b --wait-timeout 600 -- \
pi-worker -b {replica} /wt/notes /tmp/prompt.md
weir lease status --json # {"slots":[...],"cooldowns":{"agy":{"<model>":<unix>}}}
リースには flock ファイルを使用するため、保持者がクラッシュするとスロットは自動的に解放されます。--affinity KEY を指定すると、最後にそのキーの処理を担当したスロットが優先されます(プレフィックスキャッシュをウォーム状態に保てます)。lease は設定を読み込まず、pi-worker と agy-worker のみ受け付けます。
worker
weir worker run --worker pi --replica a /wt/notes /tmp/prompt.md
上限付きの出力と厳格な期限を設定し、独自のプロセスグループで 1 つのラッパーを実行します。リース、worktree、チェックは使用しません。
validate, status, schema, config
weir validate [--deep] # exit 0 valid, 1 invalid
weir status # workers, slots, ladders, checks, active agy cooldowns
weir schema # JSON Schema of the v2 config
weir config path # resolved config file
weir version
終了コード
| コード | 意味 |
|---|---|
| 0 | 成功(task:ワーカーが成功し、すべてのチェックに合格) |
| 1 | 設定または実行時エラー |
| 2 | 使用方法のエラー |
| 3 | ワーカーの出力が空 |
| 5 | Jail に拒否された |
| 6 | ワーカーがアクションを拒否された |
| 7 | クォータ超過(ラダーも使い切った) |
| 10 | ワーカーは成功したが、チェックに失敗 |
| 124 | タイムアウト |
| 75 | lease run:--wait-timeout までに空きスロットがない |
| 126 / 127 | lease run:ワーカーを起動できなかった/見つからなかった |
それ以外の場合、lease run は子プロセス自身の終了コードを返します。呼び出し元のスクリプトは JSON を解析せずに、これらのコードに応じた分岐ができます。
ラッパーの契約
weir はラッパーを <worker>-worker [-b REPLICA | -m MODEL] -t <secs> <WORKDIR> <PROMPT_FILE> として実行し、以下を想定します。
| ラッパーの終了コード | 意味 | weir の種類 |
|---|---|---|
| 0 | 成功 | ok |
| 124 | ラッパーのタイムアウト | timeout |
| 3 | 出力が空、または stderr に quota_pattern が含まれる場合はクォータ超過 | empty / quota |
| 6 | アクションが拒否された | denied |
| 5 | Jail に拒否された | jail_refused |
| 2 | 使用方法 | usage |
| その他 | 失敗 | error |
pi-worker:ローカルの llama.cpp ワーカー。-b a|bで固定します。スロットはgpu-a/gpu-bです。agy-worker:クラウドワーカー。-mでモデルを選択します。クォータに達すると、モデルごとのクールダウンを<state_dir>/cooldown.jsonに書き込みます。agent-jail:ワーカーと各チェックを、WT_ROOTSの下にある 1 つの worktree 内に閉じ込めるサンドボックス(bubblewrap)です。weir はその外部でワーカーコードを実行しません。weir validate --deepはpaths.wt_rootsがこの設定と一致することを検証します。
ラダーが次の段階に進むのは、各段階で新しい worktree を使い、timeout、empty、quota が発生した場合のみです。denied、jail_refused、チェック失敗では次の段階に進みません。
開発
export CARGO_TARGET_DIR=$HOME/.cache/weir-target
cargo fmt --all --check
cargo clippy --all-targets --locked -- -D warnings
cargo test --all-targets --locked
cargo build --release --locked
ライセンス
Apache-2.0。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。