Skip to content

Hooks & ガードレール

フックはシェルレベルで重要な制約を強制します — LLMが誤解できない決定論的ガードです。

フックタイプ

フックスクリプトトリガー
PreToolUsepre-tool-hook.shツール実行前
PostToolUse (Agent)post-agent-hook.shエージェント復帰後
PostToolUse (Bash)post-bash-hook.shbashコマンド完了後
Stopstop-hook.shパイプラインが停止しようとしたとき

終了コードのセマンティクス

  • exit 0 — アクションを許可
  • exit 2 — アクションをブロック(ハードストップ)

PreToolUse ルール

ルール1:読み取り専用ガード

Phase 1(状況分析)とPhase 2(調査)の間、ソースファイルの編集がブロックされます。ワークスペースディレクトリへのアーティファクト書き込みのみ許可されます。

Phase 1-2 アクティブ + Edit/Write ツール → exit 2(ブロック)
Phase 1-2 アクティブ + .specs/ への Edit/Write → exit 0(許可)

ルール2:並列コミットブロック

並列Phase 5実行中、git commitがブロックされます。オーケストレーターが並列グループ終了後にバッチコミットします。

並列タスクアクティブ + git commit → exit 2(ブロック)
シーケンシャルタスク + git commit → exit 0(許可)

ルール3:Main/Master チェックアウトブロック

アクティブなパイプライン中、mainmaster へのチェックアウトがブロックされ、フィーチャーブランチから離脱することを防ぎます。

アクティブなパイプライン + git checkout main → exit 2(ブロック)
パイプラインなし + git checkout main → exit 0(許可)

PostToolUse:エージェント出力バリデーション

各エージェントの復帰後、post-agent-hook.sh が出力品質をチェックします:

  • 出力が空または支離滅裂な場合に警告
  • status == "in_progress" フィルターを使用(他のフックとは異なる)

最終コミットステップ

PR作成と summary.md 生成の後、パイプラインは最終コミットを amend して summary.mdstate.json を含め、force-push します。これにより PR ブランチに PR 番号を含む最終サマリーが反映されます。

v1(シェルベース)では post-bash-hook.shpost-to-source フェーズ後に自動コミットしていました。v2(MCP駆動)では Engine が明示的な exec アクションとして amend + force-push を発行します。

Stopフック:完了ガード

stop-hook.sh はパイプラインの途中終了を防ぎます — パイプラインは post-to-source フェーズを完了して summary.md を作成するか、明示的に中止される必要があります。

共有ヘルパー

scripts/common.shfind_active_workspace を提供 — pre-tool-hook.shstop-hook.sh が使用。注意:post-agent-hook.sh は異なるフィルターを使用し、common.sh をソースしません。

テスト

bash
# フルフックテストスイートの実行(58テスト)
bash scripts/test-hooks.sh

# サンプル入力での手動テスト
echo '{"tool_name":"Edit","tool_input":{"file_path":"/src/foo.go"}}' \
  | bash scripts/pre-tool-hook.sh
echo $?  # 0(パイプラインなし)または 2(ブロック)

Released under the MIT License.