フック
プログラムやシステムのライフサイクルの特定のタイミングで自動実行される処理。イベント駆動アーキテクチャの一種。
基本概念
フックは「何かが起きた時に自動的に実行される処理」を定義する仕組み。ユーザーが明示的に呼び出す必要がなく、システムが適切なタイミングで呼び出す。
代表的なフック種類
ライフサイクルフック
- SessionStart: セッション開始時
- SessionEnd: セッション終了時
- PreToolUse: ツール実行前
- PostToolUse: ツール実行後
バージョン管理フック
- pre-commit: コミット前(コード整形、リンター実行)
- post-commit: コミット後(通知送信)
- pre-push: プッシュ前(テスト実行)
ビルドフック
- pre-build: ビルド前(依存関係チェック)
- post-build: ビルド後(デプロイ、通知)
利点
1. 自動化
明示的な呼び出しが不要。条件が満たされたら自動実行。
2. 関心の分離
本体のロジックとフック処理を分離できる。コア機能を汚染せずに拡張可能。
3. 軽量な観察
フックを使えば、重いポーリングや監視プロセスなしに、イベント発生時だけ処理できる。
メタエージェントでの活用
AIエージェントの操作パターンを観察するために、フックベースの軽量な記録を行う:
# PostToolUse フック例
on: PostToolUse
run: |
echo "$TOOL_NAME,$TIMESTAMP,$PROJECT" >> ~/.config/agent/meta-manage/usage.log
ポーリングで常時監視するのではなく、ツール使用時だけログを記録するため、パフォーマンス影響が少ない。
実装パターン
1. コールバック型
system.onToolUse((tool, args) => {
log(tool.name, Date.now());
});
2. 宣言型(YAML/設定ファイル)
hooks:
post-tool-use:
- log-usage
- check-security
3. ファイルベース
特定のディレクトリに配置されたスクリプトを自動実行:
.git/hooks/
├── pre-commit
├── post-commit
└── pre-push
注意点
パフォーマンス
フックが重い処理を行うと、本来の操作が遅延する。軽量に保つか、バックグラウンド実行する。
エラーハンドリング
フックでエラーが発生した場合、本体の処理を中断するか続行するかを明確にする。
順序依存性
複数のフックが登録されている場合、実行順序が重要になることがある。