フックを使用すると、エージェントの実行中にキー ポイントでカスタム シェル コマンドを実行することで、 GitHub Copilot エージェントの動作を拡張およびカスタマイズできます。 使用可能なフック トリガーの詳細など、フックの概念の概要については、 フックについて GitHub Copilot を参照してください。
前提条件
Windowsのみ: この記事の例では PowerShell を使用します。 Windowsを使用している場合は、PowerShell 7.0 以降がインストールされ、PATH にインストールされている必要があります。 ターミナルで pwsh --version を実行することで、PowerShell のバージョンを確認できます。 PowerShell をインストールするには、winget install Microsoft.PowerShell を実行し、ターミナルを再起動します。
リポジトリ レベルのフックの作成
-
リポジトリの
NAME.jsonフォルダーに新しいNAMEファイル (.github/hooks/ファイルの目的を説明するファイル) を作成します。 -
テキスト エディターで、次のフック テンプレートをコピーして貼り付けます。 使用する予定のないフックを
hooks配列から削除します。JSON { "version": 1, "hooks": { "sessionStart": [...], "sessionEnd": [...], "userPromptSubmitted": [...], "preToolUse": [...], "postToolUse": [...], "errorOccurred": [...] } }{ "version": 1, "hooks": { "sessionStart": [...], "sessionEnd": [...], "userPromptSubmitted": [...], "preToolUse": [...], "postToolUse": [...], "errorOccurred": [...] } } -
bashキーとpowershellキーでフック構文を構成するか、作成したスクリプト ファイルを直接参照します。メモ
bashキー (Linux および macOS 用のスクリプトを含む) とpowershellキー (Windows 用スクリプト用) の両方を含めて、3 つのオペレーティング システムすべてでフックを実行できるようにします。 Copilot は、ユーザーのオペレーティング システムに基づいて適切なキーを使用します。-
次の例では、
sessionStartフックを使用してセッションの開始日をログ ファイルに出力するスクリプトを実行します。JSON "sessionStart": [ { "type": "command", "bash": "echo \"Session started: $(date)\" >> logs/session.log", "powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"", "cwd": ".", "timeoutSec": 10 } ],"sessionStart": [ { "type": "command", "bash": "echo \"Session started: $(date)\" >> logs/session.log", "powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"", "cwd": ".", "timeoutSec": 10 } ], -
次の例では、外部
log-promptスクリプトを呼び出します。JSON "userPromptSubmitted": [ { "type": "command", "bash": "./scripts/log-prompt.sh", "powershell": "./scripts/log-prompt.ps1", "cwd": "scripts", "env": { "LOG_LEVEL": "INFO" } } ],"userPromptSubmitted": [ { "type": "command", "bash": "./scripts/log-prompt.sh", "powershell": "./scripts/log-prompt.ps1", "cwd": "scripts", "env": { "LOG_LEVEL": "INFO" } } ],エージェント セッションからの入力 JSON とサンプル スクリプトの完全なリファレンスについては、 GitHub Copilotフックリファレンス を参照してください。
-
-
ファイルをリポジトリにコミットし、既定のブランチにマージします。 これで、フックはエージェント セッション中に実行されます。
ユーザー レベルのフックの作成
ユーザー レベルのフックはリポジトリ レベルのフックと同じように構成されますが、フック ファイルはローカルのホーム ディレクトリの下に格納されます。
macOS と Windows の次の例では、CLI がプロンプトに応答し終わったときにサウンドを再生し、メッセージ ボックスを表示するフックを構成し、Copilot CLI (コパイロット CLI)を終了する方法を示します。 Linux 用フックは macOS の例に似ていますが、サウンドの再生やメッセージの表示には Linux ツールを使用します。
macOS のユーザー レベルの例
-
notification-hooks.jsonで~/.copilot/hooks/という名前のファイルを作成します。メモ
COPILOT_HOMEが設定されている場合は、$COPILOT_HOME/hooks/でファイルを作成します。 -
次の JSON をコピーしてファイルに貼り付けます。
JSON { "version": 1, "hooks": { "agentStop": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Agent stopped.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Session ended.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ] } }{ "version": 1, "hooks": { "agentStop": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Agent stopped.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Session ended.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ] } } -
Copilot CLI (コパイロット CLI)を開始または再起動します。
メモ
フック構成の変更は、CLI の開始時に読み込まれます。
-
プロンプトを入力し、エージェントの応答が終了したとき、および CLI を終了したときに、音声が聞こえてメッセージ ボックスが表示されることを確認します。
-
これらのフックを削除するには、
notification-hooks.jsonファイルを削除します。
Windowsのユーザー レベルの例
-
notification-hooks.jsonで%USERPROFILE%\.copilot\hooks\という名前のファイルを作成します。メモ
COPILOT_HOMEが設定されている場合は、%COPILOT_HOME%\hooks\でファイルを作成します。 -
次の JSON をコピーしてファイルに貼り付けます。
JSON { "version": 1, "hooks": { "agentStop": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Agent stopped.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Session ended.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ] } }{ "version": 1, "hooks": { "agentStop": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Agent stopped.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Session ended.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ] } } -
Copilot CLI (コパイロット CLI)を開始または再起動します。
メモ
フック構成の変更は、CLI の開始時に読み込まれます。
-
プロンプトを入力し、エージェントの応答が終了したとき、および CLI を終了したときに、音声が聞こえてメッセージ ボックスが表示されることを確認します。
-
これらのフックを削除するには、
notification-hooks.jsonファイルを削除します。
トラブルシューティング
フックを使用して問題が発生した場合は、次の表を使用してトラブルシューティングを行います。
| 問題点 | アクション |
|---|---|
| フックが実行されていない |
|
version: 1 ファイルにhooks.jsonが指定されていることを確認します。chmod +x script.sh)#!/bin/bash) | |
| フックがタイムアウトする |
|
| 無効な JSON 出力 |
|
デバッグ
次のメソッドを使用してフックをデバッグできます。
-
スクリプトで詳細ログを有効化して、入力データを検査し、スクリプトの実行を追跡します。
Shell #!/bin/bash set -x # Enable bash debug mode INPUT=$(cat) echo "DEBUG: Received input" >&2 echo "$INPUT" >&2 # ... rest of script
#!/bin/bash set -x # Enable bash debug mode INPUT=$(cat) echo "DEBUG: Received input" >&2 echo "$INPUT" >&2 # ... rest of script -
テストフックをローカルでテストするために、テスト入力をフックにパイプし、その動作を検証します。
Shell # Create test input echo '{"timestamp":1704614400000,"cwd":"/tmp","toolName":"bash","toolArgs":"{\"command\":\"ls\"}"}' | ./my-hook.sh # Check exit code echo $? # Validate output is valid JSON ./my-hook.sh | jq .# Create test input echo '{"timestamp":1704614400000,"cwd":"/tmp","toolName":"bash","toolArgs":"{\"command\":\"ls\"}"}' | ./my-hook.sh # Check exit code echo $? # Validate output is valid JSON ./my-hook.sh | jq .