npx -y cc-safety-net@latest install --devin を実行すると、Devin CLI の config.json に PreToolUse フックが 1 つ追加され、すべてのツール呼び出しが最初に CC Safety Net を通るようになります。続けて npx cc-safety-net doctor を実行し、フックが有効か確認してください。Devin CLI のフックはフェイルオープンです。フックがタイムアウトしたり、応答する前に終了したりすると、その呼び出しはそのまま実行されます。
Devin CLI に CC Safety Net をインストールする
1
インストーラーを実行する
2
フックが有効か確認する
Devin CLI のインストールで変わること
インストーラーは、Devin CLI のconfig.json の hooks.PreToolUse に次の管理対象エントリを書き込みます。
$XDG_CONFIG_HOME/devin/config.json で、既定は ~/.config/devin/config.json です。Windows では %APPDATA%\devin\config.json になります。正確な規則は Devin CLI の設定の場所を参照してください。
- このエントリにはマッチャーがありません。そのため
execだけでなく、すべてのツール呼び出しがフックに届きます。 - インストールは、ファイル内の他のキー、フックイベント、
PreToolUseエントリをすべてそのまま残します。config.jsonが存在しない場合は、このhooksキーだけを持つファイルを作ります。 - Devin CLI は
config.jsonのコメントと末尾のカンマを受け付けます。インストールとアンインストールは通常の JSON として書き戻すため、コメントは残りません。
Devin CLI のフックが検査する内容
- コマンドを実行するツールは
execだけです。フックはそのシェルの方言を自動判定します。 write_to_processの呼び出しで実行中のプロセスに入力されるテキストも解析します。Devin CLI のフックが入力テキストを検査する仕組みを参照してください。- その他のツールについては、ツール入力に保護対象のパスが含まれていないかを検査します。
Devin CLI のフックがコマンドを解析するディレクトリ
Devin CLI はセッションの作業ディレクトリをフックに渡さないため、フックは自身が動作しているディレクトリを使います。exec の呼び出しは workdir で別のディレクトリを指定でき、その場合フックはそのディレクトリを基準にコマンドを解析します。
- 相対パスの
workdirは、セッションのディレクトリを基準に解決します。 workdirはセッションのディレクトリの内側でなくてもかまいません。- 空または空白だけの
workdirや、文字列でないworkdirは拒否します。 - 既存のディレクトリでない
workdirも拒否し、拒否の理由にそのディレクトリを示します。
Devin CLI のフックが入力テキストを検査する仕組み
write_to_process の呼び出しは、すでに動作しているプロセスにテキストを入力します。フックは text_input または bytes_input で入力されるテキストを、シェルコマンドとして解析します。text_input が y、bytes_input が <CR> の場合は、y を解析します。
受け取ったプログラムが実行する行を特定できない場合、フックはその呼び出しを拒否します。
- テキストと一緒に
<ESC>、<BS>、矢印キー、<C-…>キーが送られる。 bytes_inputに、Devin CLI のドキュメントにない<Name>形式のキーが含まれる。text_inputとbytes_inputの両方にテキストがある。
<UP><CR> や <C-c> のようにキーだけを送る場合はコマンドではないため、フックは解析しません。
Devin CLI のチェックが失敗したときの動作
Devin CLI のフックはフェイルオープンです。ツール呼び出しをブロックできるのは、終了コード 2 とblock の判定だけです。タイムアウトした場合、npx が見つからない場合、フックのプロセスが応答する前に終了した場合は、その呼び出しはそのまま実行されます。フック自身が捕捉したエラーでは block を返すため、呼び出しはブロックされます。
Devin CLI での保護範囲の制限
- プロジェクトのフック。 CC Safety Net が対応するのは、インストールが書き込むユーザーレベルの
config.jsonだけです。プロジェクトの.devin/hooks.v1.jsonにあるフックはリポジトリのルートを作業ディレクトリとして実行され、Devin CLI にはフック側でそれを補正する手段がありません。 - 分割された入力。 フックは
write_to_processの呼び出しを 1 回ずつ解析します。何回かに分けて入力されたコマンドを、1 つのコマンドとしては検査しません。 - Devin Cloud。 CC Safety Net は Devin Cloud のセッションを対象にしていません。
- Claude Code のフック。 Devin は既定で Claude Code のフックファイルも読み込みます。そのため、Claude Code 用にインストールした CC Safety Net のフックが Devin のセッションでも動くことがあります。その場合も、拒否が重複するだけです。
Devin CLI から CC Safety Net をアンインストールする
hooks.PreToolUse が空になっても、config.json は削除しません。管理対象のハンドラーがファイルにない場合は何も書き込まず、フックは未インストールと報告します。
Devin CLI の設定の場所
Devin CLI では設定ディレクトリを移動できます。CC Safety Net も同じ規則で設定の場所を決めるため、移動した設定も見つけられます。XDG_CONFIG_HOMEが設定されていて空でなければ、$XDG_CONFIG_HOME/devin。- それ以外の場合は
<home>/.config/devin。 - Windows では
%APPDATA%\devin。APPDATAが未設定または空の場合は<home>\AppData\Roaming\devin。
config.json です。CC Safety Net は環境変数の値を書かれたとおりに使い、~ は展開しません。
Devin CLI のトラブルシューティング
config.json に問題があると、インストールは何も書き込まずに停止します。doctor は同じメッセージを Error (Devin CLI): <message> の形で表示し、Devin CLI を未設定として数え、終了コード 1 で終了します。ファイルを修正してから、インストールをやり直してください。
フックのエントリが変更されていると
doctor が警告した場合は、インストールをやり直してください。警告の一覧は管理対象フックの設定ずれにあります。