Hooks は、Cascade の動作をきめ細かく制御する必要があるパワーユーザーや Enterprise のチーム向けに設計されています。基本的なシェルスクリプトの知識が必要です。
何が作れるか
- Logging & Analytics: コンプライアンスと利用分析のために、Cascade によるすべてのファイル読み取り、コード変更、コマンド実行、ユーザーから Cascade へ送信されたプロンプト、および Cascade の応答を追跡
- セキュリティコントロール: Cascade の機密ファイルへのアクセスや危険なコマンドの実行、ポリシー違反となるプロンプトの処理をブロック
- 品質保証: コード変更後にリンター、フォーマッター、テストを自動実行
- カスタムワークフロー: 課題トラッカー、通知システム、デプロイパイプラインと連携
- チーム標準化: 組織全体でコーディング規約とベストプラクティスを遵守させる
Hooks の仕組み
- 標準入力で JSON を受け取り、実行中のアクションに関する詳細なコンテキストを取得
- Python、Bash、Node.js など、任意の実行可能ファイルでスクリプトを実行
- 終了コードと標準出力/標準エラーを通じて結果を返す
2 で終了させることでアクションをブロックできます。これにより、プレフックはセキュリティポリシーやバリデーションの実装に最適です。
設定
システムレベル
- macOS:
/Library/Application Support/Windsurf/hooks.json - Linux/WSL:
/etc/windsurf/hooks.json - Windows:
C:\ProgramData\Windsurf\hooks.json
ユーザー レベル
- Windsurf IDE:
~/.codeium/windsurf/hooks.json - JetBrains プラグイン:
~/.codeium/hooks.json
ワークスペースレベル
- 場所: ワークスペースのルートにある
.windsurf/hooks.json
3 つの場所のフックはすべて**統合 (マージ) **されます。同じフックイベントが複数の場所で設定されている場合、すべてのフックは次の順序で実行されます: system → user → workspace。
基本構成
設定オプション
working_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 形式で含まれます。これには、planner の応答、ツールによるアクション (ファイルの読み取り・書き込み・コマンドの実行) 、および Cascade が実行したその他のステップが含まれます。また、どのルールがトリガーされたかに関する情報も含まれます。ルールの発火状況をどのように解析するかについては、Tracking Triggered Rules の例を参照してください。
show_output 設定オプションは、このフックには適用されません。
post_cascade_response_with_transcript
post_cascade_response と似ていますが、インラインで Markdown 形式の要約を提供する代わりに、このフックは会話の全文 (会話開始時点から) をローカルの JSONL ファイルに書き出し、そのファイルパスを提供します。
ユースケース: Enterprise の監査およびコンプライアンスログ、AI 生成コンテンツの貢献度追跡、外部のオブザーバビリティ/Analytics ツールへの会話ログ連携
入力 JSON:
transcript_path は、~/.windsurf/transcripts/{trajectory_id}.jsonl にある JSONL ファイルを指します。各行は、type と status フィールドに加えてステップ固有のデータを持つ、会話の 1 ステップを表す JSON オブジェクトです。例えば、次のようになります。
0600 パーミッションで書き込まれます。Windsurf はトランスクリプトディレクトリ内のファイル数を自動的に 100 件に制限し、更新時刻が最も古いものから順に削除します。
show_output 設定オプションはこのフックには適用されません。
次の表は、post_cascade_response フックと post_cascade_response_with_transcript フックの主な違いを示しています。
post_setup_worktree
.env ファイルやその他の Git で管理されていないファイルを 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- 条件付き適用のため、その説明が AIモデル に提示されるルールManual- ユーザー入力で明示的に @ メンションされたルールGlobal-global_rules.mdに定義されたグローバルルールGlob- glob パターンに一致するファイルアクセスによってトリガーされるルール
これは、どのルールが AIモデル に提示されたか、あるいはファイルアクセスによってトリガーされたかを追跡するものであり、AIモデル が実際にそのルールに従ったかどうかを示すものではありません。会話内ですでに直近で提示されたルールは重複排除され、しばらくのあいだ再表示されない場合があります。
編集後にコードフォーマッタを実行する
format_code.sh) :
ワークツリーのセットアップ
.windsurf/hooks.json 内):
hooks/setup_worktree.sh):
ベストプラクティス
セキュリティ
- すべての入力を検証する: 特にファイルパスやコマンドに関して、検証されていない入力 JSON を信用しないでください。
- 絶対パスを使用する: あいまいさを避けるため、hook の設定では常に絶対パスを使用してください。
- 機微情報を保護する: API キーや資格情報などの機微情報はログに記録しないでください。
- 権限を確認する: hook スクリプトに適切なファイルシステム権限が設定されていることを確認してください。
- 導入前に精査する: 設定に追加する前に、すべての hook コマンドとスクリプトをレビューしてください。
- 隔離環境でテストする: メインの開発マシンで有効化する前に、テスト環境で hook を実行してください。
パフォーマンスに関する考慮事項
- フックは高速に: フックが遅いと Cascade の応答性に影響します。実行時間は 100ms 未満を目指してください。
- 非同期処理の活用: ブロッキングを避けるため、ログはキューやデータベースに非同期で記録することを検討してください。
- 早期フィルタリング: 不要な処理を避けるため、スクリプト冒頭でアクションタイプを確認してください。
エラーハンドリング
- 常に JSON を検証する: 不正な入力に優雅に対処できるよう、try-catch ブロックを使用してください。
- エラーを適切にログ出力する:
show_outputが有効な場合に見えるよう、エラーはstderrに出力してください。 - 安全に失敗する: フックでエラーが発生した場合、そのアクションをブロックすべきか、処理を続行させるべきかを検討してください。
フックのテスト
- ログから始める: データフローを把握するため、まずはシンプルなロギングフックを実装します。
show_output: trueを使用する: 開発中は出力を有効にして、フックの動作を確認します。- ブロック動作をテストする: pre-hook で終了コード 2 によってアクションが正しくブロックされることを検証します。
- すべてのコードパスを確認する: スクリプトで成功と失敗の両ケースをテストします。
Enterprise 配布
- Cloud Dashboard - Windsurf ダッシュボードの Team Settings からフックを設定します
- System-Level Files - MDM または構成管理ツール経由でフックをデプロイします
クラウドダッシュボードでの設定
- Enterprise プラン
TEAM_SETTINGS_UPDATE権限
- Windsurf ダッシュボードで Team Settings に移動します
- 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 またはセキュリティチームが一元的に管理します。Windsurf はシステムレベルのパスにファイルを配置・管理しません。組織のポリシーに従い、内部チームがデプロイ、更新、コンプライアンス対応を適切に実施してください。
チームプロジェクト向けワークスペースフック
追加リソース
- MCP 連携: Windsurf における Model Context Protocol の詳細について学ぶ
- ワークフロー: フックを Cascade Workflows と組み合わせる方法を学ぶ
- Analytics: Team Analytics で Cascade の利用状況を把握する