フックは、Cascade の動作をきめ細かく制御する必要がある上級ユーザーや Enterprise チーム向けに設計されています。基本的なシェルスクリプトの知識が必要です。
構築できるもの
- ログ記録と分析: コンプライアンスや使用量の分析のために、読み取られたすべてのファイル、コード変更、実行されたコマンド、ユーザープロンプト、または Cascade の応答を追跡する
- セキュリティ制御: Cascade が機密ファイルにアクセスしたり、危険なコマンドを実行したり、ポリシーに違反するプロンプトを処理したりすることをブロックする
- 品質保証: コード変更後にリンター、フォーマッター、またはテストを自動的に実行する
- カスタムワークフロー: issue トラッカー、通知システム、またはデプロイパイプラインと連携する
- チームの標準化: 組織全体でコーディング規約とベストプラクティスを徹底する
フックの仕組み
- 前提情報を受け取る (実行されるアクションの詳細が、JSON として標準入力経由で渡されます)
- スクリプトを実行する - Python、Bash、Node.js、または任意の実行可能ファイル
- 結果を返す (終了コードと出力ストリームを通じて返します)
2 で終了することでアクションをブロックできます。そのため、pre-hooks はセキュリティポリシーや検証チェックの実装に適しています。
設定
システムレベル
- macOS:
/Library/Application Support/Windsurf/hooks.json - Linux/WSL:
/etc/windsurf/hooks.json - Windows:
C:\ProgramData\Windsurf\hooks.json
ユーザーレベル
- Devin Desktop IDE:
~/.codeium/windsurf/hooks.json - JetBrains Plugin:
~/.codeium/hooks.json
ワークスペースレベル
- 場所: ワークスペースルートの
.windsurf/hooks.json
3 つの場所にあるフックはすべてマージされます。同じフックイベントが複数の場所で設定されている場合、すべてのフックが system → user → workspace の順に実行されます。
基本構造
pre_read_code で macOS/Linux 用のコマンドと Windows PowerShell 用のコマンドの両方を指定しています。post_write_code フックでは command のみを指定しているため、macOS/Linux で実行され、Windows では PowerShell が使用されます。
設定オプション
クロスプラットフォームでの動作
command フィールドと powershell フィールドを使用すると、1 つの設定内でプラットフォームごとに適切なコマンドを定義できます。これは、macOS/Linux と Windows が混在する環境を運用するチームで役立ちます。
working_directory パラメータについて:- 複数の repo があるワークスペースでは、デフォルトは現在作業中の repo のルートです
- 相対パスはデフォルトの場所 (ワークスペース または repo ルート) を基準に解決されます
- 絶対パスをサポートしています
~による home directory の展開はサポートされていません
フックイベント
共通の入力構造
以下の使用例では、簡略化のため共通フィールドを省略しています。フックイベントには主に 12 種類あります。
pre_read_code
file_path はディレクトリパスになることがあります。
post_read_code
file_path はディレクトリパスになることがあります。
pre_write_code
post_write_code
pre_run_command
post_run_command
pre_mcp_tool_use
post_mcp_tool_use
pre_user_prompt
show_output 設定オプションは、このフックでは適用されません。
post_cascade_response
response フィールドには、前回のユーザー入力以降における Cascade の応答内容が Markdown 形式で含まれます。これには、プランナーの応答、ツールのアクション (ファイルの読み取り、書き込み、コマンド実行) 、および Cascade が実行したその他のステップが含まれます。また、どのルールがトリガーされたかに関する情報も含まれます。ルールの使用状況を解析する方法については、トリガーされたルールの追跡の例を参照してください。
show_output 設定オプションは、このフックには適用されません。
post_cascade_response_with_transcript
プロンプトへの応答を完了した後に、post_cascade_response と同様に非同期でトリガーされます。インラインで markdown の要約を提供する代わりに、このフック は会話全体の transcript (会話の先頭から) をローカルの JSONL ファイルに書き出し、そのファイルパスを提供します。
利用例: Enterprise の監査およびコンプライアンスのログ記録、AI が生成した変更の追跡、transcript を外部の可観測性ツールや analytics ツールに渡すこと
入力 JSON:
transcript_path は、~/.windsurf/transcripts/{trajectory_id}.jsonl にある JSONL ファイルを指します。各行は会話の1つのステップを表す JSON オブジェクトで、type フィールドと status フィールドに加えて、ステップ固有のデータを含みます。たとえば、
0600 パーミッションで書き込まれます。Devin Desktop はトランスクリプトディレクトリ内のファイル数を自動的に 100 件までに制限し、更新時刻が最も古いものから削除します。
show_output 設定オプションは、このフックには適用されません。
この表は、post_cascade_response フックと post_cascade_response_with_transcript フックの主な違いを示しています。
post_setup_worktree
.env ファイルやその他の未追跡ファイルを worktree にコピーする、依存関係をインストールする、セットアップスクリプトを実行する
環境変数:
入力 JSON:
終了コード
show_output が true の場合、フックが生成した標準出力と標準エラーは、ユーザーが Cascade UI で確認できる点に留意してください。
ユースケース例
Cascade のすべてのアクションを記録する
log_input.py):
ファイルアクセスの制限
block_read_access.py):
危険なコマンドをブロックする
block_dangerous_commands.py):
組織のポリシーに違反するプロンプトをブロックする
block_bad_prompts.py):
Cascade 応答のログ記録
log_cascade_response.py):
トリガーされたルールの追跡
track_rules.py):
Always On- 常に含まれるルールModel Decision- 条件付きで適用するために、説明がモデルに提示されたルールManual- ユーザー入力で明示的に @メンションされたルールGlobal-global_rules.mdにあるグローバルルールGlob- glob パターンにマッチするファイルへのアクセスによってトリガーされるルール
これは、どのルールがモデルに 提示された か、またはファイルへのアクセスによって トリガーされた かを追跡するものであり、モデルが実際にそのルールに 従った かどうかを示すものではありません。会話内ですでに最近表示されたルールは重複排除されるため、しばらく再表示されない場合があります。
編集後にコードフォーマッターを実行する
format_code.sh):
Worktree のセットアップ
.windsurf/hooks.json 内) :
hooks/setup_worktree.sh):
ベストプラクティス
セキュリティ
- すべての入力を検証する: 入力 JSON は、検証せずに決して信用しないでください。特にファイルパスやコマンドには注意が必要です。
- 絶対パスを利用する: あいまいさを避けるため、フックの設定では常に絶対パスを利用してください。
- 機密データを保護する: APIキーや認証情報などの機密情報をログに記録しないようにしてください。
- 権限を確認する: フックスクリプトに適切なファイルシステム権限が設定されていることを確認してください。
- デプロイ前に監査する: 設定に追加する前に、すべてのフックコマンドとスクリプトを確認してください。
- 分離してテストする: メインの開発マシンで有効にする前に、テスト環境でフックを実行してください。
パフォーマンス上の注意点
- フックは高速に保つ: フックが遅いと、Cascade の応答性に影響します。実行時間は 100ms 未満を目指してください。
- 非同期処理を利用する: ブロックしないフックでは、キューやデータベースへの記録を非同期で行うことを検討してください。
- 早めに絞り込む: 不要な処理を避けるため、スクリプトの冒頭でアクションの種類を確認してください。
エラー処理
- 常に JSON を検証する: try-catch ブロックを利用して、不正な形式の入力も適切に処理します。
- エラーを適切に記録する:
show_outputが有効なときに表示されるよう、エラーはstderrに書き込みます。 - 安全に失敗させる: フックでエラーが発生した場合は、その処理を中断すべきか、それとも続行を許可すべきかを検討します。
フックのテスト
- まずはログ記録から始める: データの流れを把握するために、まずはシンプルなログ記録用フックを実装します。
show_output: trueを利用する: 開発中は出力を有効にして、フックが何をしているか確認します。- ブロック動作をテストする: 終了コード 2 で、pre-hook での処理が正しくブロックされることを確認します。
- すべてのコードパスを確認する: スクリプトで成功時と失敗時の両方のケースをテストします。
Enterpriseでの配布
- Cloud Dashboard - Devin Desktopダッシュボードのチーム設定でフックを設定します
- System-Level Files - MDMまたは構成管理ツールを使ってフックを展開します
Cloud Dashboard の設定
- Enterprise プラン
TEAM_SETTINGS_UPDATE権限
- Devin Desktop ダッシュボードのチーム設定に移動します
- Cascade Hooks セクションを探します
- フックの設定を JSON 形式で入力します
- 変更を保存します
複数のチーム設定がマージされる場合、フックは上書きされず、アクションごとに結合されます。つまり、該当するすべてのチーム設定のフックがまとめて実行されます。
システムレベルでのファイル配置
hooks.json設定をOSごとに以下の場所へ配置してください。
macOS:
/usr/local/share/windsurf-hooks/) 。
システムレベルのフックは、ユーザーおよびワークスペースのフックよりも優先され、root 権限がないエンドユーザーは無効化できません。
MDM と構成管理
- Jamf Pro (macOS) - 構成プロファイルまたはスクリプトを使ってデプロイ
- Microsoft Intune (Windows/macOS) - PowerShell スクリプトまたはポリシー配布を利用
- Workspace ONE、Google Endpoint Management、その他の MDM ソリューション
- Ansible、Puppet、Chef、SaltStack - 既存のインフラストラクチャ自動化を利用
- カスタムデプロイスクリプト - シェルスクリプト、PowerShell、または使い慣れたツール
検証と監査
重要: システムレベルのフックは、IT チームまたはセキュリティ チームが全面的に管理します。Devin Desktop がシステムレベルのパスにファイルをデプロイしたり管理したりすることはありません。組織のポリシーに従って、デプロイ、更新、コンプライアンス対応は社内チームで行ってください。
チームプロジェクト向けのワークスペースフック
追加リソース
- MCP 統合: Devin Desktop の Model Context Protocolの詳細をご覧ください
- ワークフロー: フックを Cascade Workflows と組み合わせる方法をご確認ください
- Analytics: Team Analytics で Cascade の使用量を追跡できます

