
軽量なCLIツール。AIコーディングエージェントを隔離されたBubblewrapサンドボックス内で実行し、ファイルシステム、ネットワーク、認証情報を厳格に分離することで、プロンプトインジェクションやサプライチェーン攻撃から保護します。
FLARはFast Light Agent Restrictorです。garsと呼ばれる岩の上で動作します。
Goで書かれたシンプルで軽量なCLIツールで、Claude Code、Antigravity、Codex、Copilot、ReasonixといったコーディングエージェントCLIを、隔離されたBubblewrap(bwrap)サンドボックス内で安全に実行するためのものです。

目的は、複雑な設定なしに即座にAIエージェントをbubblewrapで囲み、現在作業中のプロジェクトのみにアクセスを制限することです。これにより、プロンプトインジェクションや、エージェントが十分な検証なしに(または不運にも)ライブラリをプロジェクトに取り込む際のサプライチェーン問題から保護します。アクセス可能な機密情報は、エージェント自身の認証情報とそのプロジェクトのチャット履歴だけです。
ほとんどのエージェントには「サンドボックス」機能がありますが、それはかなり脆弱で、エージェント自身がアクセス可能な範囲を拡大できます。そしてもちろん、サプライチェーンの脆弱性はエージェントのサンドボックスの対象外です。flarはエージェントに対して完全に影響を受けず、サプライチェーン攻撃の爆発半径を厳密に制限します。
Bubblewrapは非常に十分にテストされており、積極的にメンテナンスされています。Flatpackや他の多くのプロジェクトで軽量コンテナとして使用されています。flarのテストははるかに不十分で、私が数日間使用した程度です。
tmpfs)を使用して、非特権ユーザ名前空間でエージェントを実行します。システムパス(/usr、/bin、/lib、/lib64など)はホストから読み取り専用でマウントされ、コンテナイメージの管理なしにホストパッケージがすぐに利用可能になります。localhostにマッピングすることで、ローカルサービス(例:データベース、llama.cppモデル)を選択的に公開します。agyでは--dangerously-skip-permissions、Codexでは--dangerously-bypass-approvals-and-sandbox)を自動的に注入します。-askで無効化可能。~/.claude/、~/.codex/、~/.gemini/、またはGitHub CLI設定など)をサンドボックスホームディレクトリ内にマウントされる一時ディレクトリに自動的にコピーし、ホストの設定ファイルには触れません。--resume/--continueが実行間で機能します。現在のプロジェクトにスコープされるため、他のプロジェクトの履歴がサンドボックスに入ることはありません。それ以外の場合、特定のエージェントとプロジェクトに対して初めてflarを実行したときに履歴がフォークされます。セッション永続化と再開を参照してください。agy): Antigravity CLIはOAuthトークンをファイルではなくOSのキーリングに保存します。flarはその1つのシークレットだけを抽出し、サンドボックス内でプライベートなインプロセスSecret Serviceを介して提供します。これにより、エージェントはキーリングの残りを公開せずに認証されます。認証情報を参照してください。ホストシステムにbwrap(Bubblewrap)がインストールされていることを確認してください。
# Fedora/RHEL
sudo dnf install bubblewrap
# Debian/Ubuntu
sudo apt install bubblewrap
ソースからflarをビルドするには:
go build -o `flar` .
インストールするには:
mv `flar` ~/.local/bin/
プロジェクトフォルダでflarを実行するか、パスを指定します:
flar [flags] [path/to/project] [extra agent args/prompts...]
-m: 実行するエージェントを指定(claude、codex、agy、copilot、reasonix)。デフォルトでは、利用可能なホスト設定または環境変数をチェックします。-ask: 権限/承認をスキップしない(エージェントに許可を求めるように強制)。-network: ネットワークモード:isolated(デフォルト)またはhost。-allow-port: 隔離ネットワークサンドボックスを介して特定のローカルTCPポート(例:8080、11434)を許可します。複数指定可能。-v: 詳細ログ出力を有効にする。.flar.json)プロジェクトごとに<project>/.flar.json、またはグローバルに~/.config/flar/config.jsonでオプションを設定できます:
{
"agent": "claude",
"ask": false,
"network": "isolated",
"allow_ports": [5432, 11434]
}
設定の一時コピーのみがマウントされるため、エージェントは元のファイルに触れることなく、既存のホストセッションを使用して認証された状態で実行されます。ほとんどのエージェントはセッションをファイルに保存しており、flarが直接コピーします:
~/.claude/(.credentials.jsonを含む)および ~/.claude.json(オンボーディング状態とアカウントIDを保持するトップレベルファイル)。両方が必要です。認証情報のみでは、Claudeはサンドボックスを新規インストールと見なしてログインを促します。~/.codex/、~/.copilot/、およびGitHub CLI設定。agy)のキーリングagyは例外で、トークンをファイルに保存しません。OSキーリングに保持し、D-Busセッションバス経由のfreedesktop Secret Service APIで読み取ります。サンドボックスにはセッションバスがないため、単純な設定ではauthentication failed or timed outで失敗します。
flarはこれを特別に処理します:
secret-toolを使用してagyトークン(キーリングアイテムservice=gemini, username=antigravity)のみを抽出し、一時設定ディレクトリ内の0600ファイルに書き込みます。flar --internal-secretsvc)を実行し、DBUS_SESSION_BUS_ADDRESSでポイントします。その1つのトークンのみを提供し、それ以外は何も提供しません。エージェントは自分のトークンにのみアクセスでき、キーリングの残り(ブラウザのパスワード、他のアプリのシークレットなど)にはアクセスできません。実装はD-Busワイヤプロトコルを直接話すため、サンドボックス内にgnome-keyringやdbus-daemonは不要です。
要件と注意点:
secret-tool(libsecret)がインストールされている必要があります。存在しない場合やトークンが見つからない場合、flarはブリッジをスキップし、agyは通常のログインプロンプトにフォールバックします。サンドボックスは設定の一時コピーをマウントするため、エージェントがそこに書き込んだものは通常、終了時に消えます(実行した会話も含む)。flarは各エージェントのトランスクリプトストレージをホストにバインドバックし、セッションを永続化して後で再開できるようにすると同時に、他のプロジェクトの履歴がサンドボックスに入らないようにします。
Claude: トランスクリプトはプロジェクトごとのディレクトリ(~/.claude/projects/<project-slug>/)に保存されます。flarは現在のプロジェクトのディレクトリのみをホストからコピーされた設定にバインドするため、claude --resumeはこのプロジェクトのセッションのみを表示します。注意点として、履歴に保存されたプロンプトインジェクションがリスクになる可能性があります。作業中のプロンプトインジェクションを含むセッションを再開すると、flarの外でclaudeを実行した場合に爆発半径が無限に大きくなります。利便性がリスクを上回ると考えています。そのようなリスクのあるプロジェクトでは、常にflar内で実行してください。
Codex CLI: Codexはトランスクリプトを~/.codex/sessions/の日付ベースのディレクトリに保存し、グローバルのstate_5.sqliteでインデックス化します。両方とも各スレッドのcwdを記録しますが、ディスク上のディレクトリはプロジェクトを混在させます。flarは各ワークスペースに$XDG_STATE_HOME/flar/codex/<project-slug>/の下にシャドウCodexホームを与え、その変数が設定されていない場合は~/.local/state/flar/codex/<project-slug>/にフォールバックします。初回使用時に、一致するトランスクリプトファイル、SQLite行、プロンプト履歴エントリのみでそのホームをシードします。その後、シャドウホームがとしてマウントされるため、新しいセッションはで他のプロジェクトを露出させることなく永続化されます。
~/.copilot/.flar/<project-slug>/
初回使用時に、flarはそのシャドウホームを、保存されたcwdが現在のワークスペースと一致するセッションのみでシードし、該当するSQLite行と一致するsession-state/ディレクトリの両方をコピーします。その後、シャドウホーム全体がサンドボックス内で~/.copilotとしてバインドマウントされるため、copilot --continueはこのワークスペースのセッションのみを再開でき、新しいセッションはそこに安全に永続化されます。
agy): Copilotと同様に、プロジェクトで初めてflarを実行したときにセッションが「フォーク」され、flarの外で実行されるagyと共有されなくなります。agyは会話をディスク上でプロジェクトごとに分離しません。すべてのプロジェクトのすべての会話が、~/.gemini/antigravity-cli/(conversations/、brain/、implicit/)下の1つのフラットストアに、UUIDのみでキー付けされて保存され、所有ワークスペースは不透明な会話ブロブの内部に記録されます。新しさのインデックス(cache/last_conversations.json)は各ワークスペースを最新の会話にマッピングし、agy --continueはそれをたどります。
そのストアをそのままサンドボックスにバインドすると、サンドボックス化されたagyが--continue、インタラクティブピッカー、または明示的な--conversation <ID>を介して異なるプロジェクトに属する会話を再開でき、そこに貼り付けられた内容が漏洩する可能性があります。これを防ぐため、flarは各ワークスペースに独自のスコープ化ストアを与えます:
~/.gemini/antigravity-cli/.flar/<project-slug>/
このディレクトリは、サンドボックス内のconversations/、brain/、implicit/、history.jsonl、およびcache/last_conversations.jsonにバインドマウントされます。したがって、プロジェクトAで開かれたサンドボックスはプロジェクトAの会話のみを表示できます。新しいセッションはスコープ化ストアに蓄積され、次回の実行で再開可能です。
プロジェクトで初めてflarがagyを実行したとき、そのプロジェクトのスコープ化ストアを既存のホスト履歴からシードします。ただし、agy自身がこのワークスペースに帰属すると判断した会話のみです(これはプレーンテキストのlast_conversations.jsonとhistory.jsonlから判断され、会話ブロブを解析することはありません)。その一度限りのシード後、スコープ化ストアは独立します。新しいセッションはスコープ化ストアのみに存在し、後のホスト側の変更は取り込まれません。
認識しておくべき結果:
agyと同様に、スコープ化シャドウホームは初期シード後、プロジェクトごとの別世界になります。Copilotをflarの外で開始したセッションは後でflarに取り込まれず、flarの内で開始したセッションはホストのグローバルCopilotストアではなく、スコープ化シャドウホームに保存されます。flarの外でagyを開始したセッションは(初期シードを除き)flarの内側では見えず、その逆も同様です。これは意図的です。flarのagy履歴は別のプロジェクトごとの世界です。agy自身のインデックスが現在のワークスペースに帰属しなかった会話は、設計上シードされません。安全なデフォルトは、他のプロジェクトのデータを露出するリスクを避けるためにそれを保留することです。.flar/ディレクトリは互換性のために設定コピーから除外され、flar所有の状態は$XDG_STATE_HOME/flar/(または~/.local/state/flar/)にあり、エージェント管理の設定ディレクトリの外にあります。隔離ネットワークモードでは、エージェントの環境はホストネットワークインターフェースに直接アクセスできません。
HTTP_PROXYおよびHTTPS_PROXY環境変数を使用して、HTTP/HTTPSリクエスト(クラウドLLM(AnthropicやGeminiなど)への接続など)に対して自動的に機能します。localhostまたはループバックIPへのリクエストはブロックされます。127.0.0.1:11434)にアクセスできるようにするには、-allow-port 11434またはallow_ports設定を使用してポートを指定します。セキュアなループバックフォワーダーがサンドボックス内で127.0.0.1:11434をバインドし、トラフィックをホストにプロキシします。~/.codexcodex resume --allCopilot CLI: Copilotは再開可能なセッションを~/.copilot/の下の2つのグローバルな場所に保存します:SQLiteインデックス(session-store.db)と、各セッションにつきsession-state/<session-id>/の下の1つのディレクトリ。SQLite行は所有するcwdを持ち、各状態ディレクトリは同じセッションIDでキー付けされます。ホストストアをそのままバインドすると、サンドボックス化されたCopilotにすべてのプロジェクトのセッションが公開されるため、flarは各ワークスペースに独自のシャドウCopilotホームを与えます: