メインコンテンツへスキップ
フックを使用すると、エージェントのライフサイクル内のイベントに応じてカスタムロジックを実行できます。フックは、ポリシーの適用、前提情報の追加、アクションの記録、権限の変更、外部システムとの連携に利用できます。 フックは JSON 形式で設定します。これらをプロジェクトの .devin/ ディレクトリ (またはユーザーレベルの設定) に配置すると、Devin CLI はマッチングするライフサイクルイベントで実行します。.claude/ ディレクトリ内の既存のフックも自動的に検出されます。詳しくは Where Hooks Live を参照してください。

Hooksでできること

ポリシーを強制

危険なコマンドをブロックしたり、特定のアクションで確認を必須にしたり、ファイルへのアクセスを制限したりできます。

前提情報を追加

特定のツールが呼び出されたときに、追加の指示や情報を渡します。

付随処理を実行

イベント発生時に、スクリプトを実行したり、通知を送信したり、イベントを記録したりできます。

権限を変更

状況に応じて、権限を動的に付与または制限できます。

簡単な例

プロジェクト内に .devin/hooks.v1.json を作成します:
{
  "PreToolUse": [
    {
      "matcher": "exec",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/check-command.sh"
        }
      ]
    }
  ]
}
シェルコマンドを実行する前に、毎回 ./scripts/check-command.sh が実行されます。このスクリプトは stdin でイベントデータを受け取り、ゼロ以外の終了コードを返すことでそのアクションをブロックできます。

Hook Events

フックは、以下のライフサイクルイベントに応答できます。
Event発生するタイミング
PreToolUseツールの実行前
PostToolUseツールの実行完了後
PermissionRequest権限の判断が必要なとき
UserPromptSubmitユーザーがメッセージを送信したとき
Stopエージェントが停止しようとするとき
SessionStartセッションの開始時
SessionEndセッションの終了時
各イベントと利用可能なデータの詳細については、ライフサイクルフックを参照してください。

フックの形式

各フックには、type (command または prompt) 、任意の matcher (フックイベントの tool_name に対する正規表現) 、および各種設定があります。
{
  "PreToolUse": [
    {
      "matcher": "exec",
      "hooks": [
        {
          "type": "command",
          "command": "./scripts/validate.sh",
          "timeout": 10
        }
      ]
    }
  ]
}
フィールド説明
matcherフックイベントの tool_name に対してマッチする正規表現。空文字列、または matcher を省略した場合は、すべてのツール名に一致します。
typeシェルコマンドを実行する場合は "command"、LLM プロンプトを評価する場合は "prompt"
command実行するシェルコマンド (command タイプの場合) 。
prompt評価する LLM プロンプト (prompt タイプの場合) 。
timeoutタイムアウト時間 (秒) (任意) 。

コマンドフック

コマンドフックでは、シェルコマンドを実行します。イベントデータは stdin 経由で JSON として渡され、コマンドは stdout に JSON を返すことで結果を制御できます (以下の出力形式を参照) 。 入力 (stdin) :
{
  "hook_event_name": "PreToolUse",
  "tool_name": "exec",
  "tool_input": {
    "command": "rm -rf /"
  }
}
DEVIN_PROJECT_DIR 環境変数は、プロジェクトのルートディレクトリに自動的に設定されます。 一致対象にできる組み込みツール名と MCP ツール名の形式については、Matcher の使用 を参照してください。

出力形式

コマンドフックは、結果を制御するために stdout に JSON オブジェクトを出力できます。 アクションを承認またはブロックするには、トップレベルの decision (必要に応じて reason も) を返します。
{
  "decision": "block",
  "reason": "Destructive command blocked by policy"
}
エージェントの前提情報にテキストを追加するには、イベント名を付けた hookSpecificOutput オブジェクト内で additionalContext を返します:
{
  "hookSpecificOutput": {
    "hookEventName": "UserPromptSubmit",
    "additionalContext": "Remember: deploys require an approved change ticket."
  }
}
出力フィールド説明
decisionアクションを許可する場合は "approve"、拒否する場合は "block"
reasonエージェントに表示される理由
hookSpecificOutput.hookEventNameこの出力が適用されるイベント (例: UserPromptSubmitSessionStartPostToolUse)
hookSpecificOutput.additionalContextエージェントの前提情報に追加されるテキスト (UserPromptSubmitSessionStartPostToolUse 用)

終了コード

コード意味
0成功 — フックは通常どおり続行
2ブロック — アクションは拒否される
その他エラー — ログに記録されるが、ブロックはしない

フックの格納場所

Devin CLI は、以下の場所にあるフックを読み取ります。いずれも同じ JSON 形式です。

プロジェクトレベル

場所説明
.devin/hooks.v1.json独立した hooks ファイル (推奨)
.devin/config.json設定ファイル内の "hooks" キー
.devin/config.local.json"hooks" キー (ローカルで上書き、gitignore 対象)
.claude/settings.json"hooks" キー (Claude Code 形式)
.claude/settings.local.json"hooks" キー (Claude Code 形式)

ユーザーレベル (グローバル)

場所説明
~/.config/devin/config.json (%APPDATA%\devin\config.json は Windows)ユーザー設定の "hooks" キー
~/.claude.json"hooks" キー (Claude Code 形式)
~/.claude/settings.json"hooks" キー (Claude Code 形式)
~/.claude/settings.local.json"hooks" キー (Claude Code 形式)
.devin/hooks.v1.json では、hooks オブジェクトがファイル全体にあたります (ラッパーキーは不要です) 。それ以外の場所では、hooks は設定ファイル内の "hooks" キーの下にネストされます。
.claude/ 配下のパスにある hooks は、read_config_from.claude が有効な場合 (デフォルト) に読み込まれます。必要に応じて、ユーザー設定でこれを無効にできます。

フックの確認

現在読み込まれているすべてのフックとそのソースファイルを確認するには、/hooks スラッシュコマンドを利用します:
/hooks

次のステップ

ライフサイクルフック

各イベントタイプと利用可能なデータについて詳しく解説します。

設定

Devin CLI がフックの読み込み元とする設定場所を制御します。