Claude Codeを使っていると、もどかしい瞬間に直面することがあります。「コードをフォーマットして」と頼んだのに無視されたり、「特定のファイルには触らないで」と言ったのに書き換えられたり、テストを走らせずに作業完了を報告されたり……。
その理由はシンプルです。CLAUDE.mdへの記述はあくまで「提案(Suggestion)」であり、モデルがそれを読み飛ばしたり、文脈の中で忘れたりする可能性があるからです。
そこで重要になるのがHooks(フック)です。指示が「お願い」なら、フックは「強制力を持つルール」です。特定の条件下で自動的に割り込むフックを導入することで、Claudeの挙動を物理的に制御し、開発ワークフローの品質を一段上のレベルへ引き上げることができます。
参考
https://x.com/Techburhan/status/2040869682912297196
フック(Hooks)の仕組み:30秒で理解する基本概念
フックは、Claude Codeがアクション(ファイルの編集、コマンドの実行など)を行う際、その前後に自動的に割り込む仕組みです。
- 設定場所: プロジェクトルートの
.claude/settings.jsonで定義します。このファイルをリポジトリに含めることで、チーム全体で同じ自動化ルールを共有できます。 - PreToolUse(門番 / Bouncer): Claudeが何かを実行する前に動作します。実行内容を検証し、不適切な場合は拒否(exit code 2)して実行を阻止します。
- PostToolUse(品質管理 / Production Line Inspector): Claudeが何かを実行した後に動作します。フォーマット、テスト、ログ記録など、一連の「検品」を自動化します。
——————————————————————————–
厳選された8つのClaude Code Hook
① ファイル保存時の自動フォーマット(Prettier)
Claudeは正しいロジックを書きますが、プロジェクト独自のスタイルガイドを完璧に守り続けるのは苦手です。PostToolUseでPrettierを強制することで、一貫性のあるコードを常に維持します。
分析・考察: 「指示してもたまに忘れる」というAI特有の不確実性を排除します。ファイルが書き換えられた直後にバックグラウンドでフォーマットが走るため、人間が手動で微調整する手間がゼロになります。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write 2>/dev/null; exit 0"
}
]
}
]
}
}
② 危険なコマンドの実行阻止
rm -rf のような破壊的な操作や、意図しないディレクトリへの干渉を PreToolUse で物理的にブロックします。
分析・考察: AIによる予期せぬ操作から環境を守る「門番」の役割です。このフックで exit 2 を返すと、Claude Codeは「コマンドが拒絶された」ことを理解し、無理に実行を継続したり、成功したと誤認(ハルシネーション)したりすることを防げます。
# .claude/hooks/block-dangerous.sh
if echo "$tool_input" | grep -qE "rm -rf /|mv .* /dev/null"; then
echo "Error: 危険なコマンドが検知されました。"
exit 2
fi
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{ "type": "command", "command": ".claude/hooks/block-dangerous.sh" }]
}
]
}
}
③ 変更後の自動テスト実行とフィードバックループ
コードを変更するたびにテストを自動実行し、その結果を即座にClaudeへフィードバックします。
分析・考察: テスト結果を即座に見せることで、Claudeは自らのミスに即座に気づき、自律的に修正を開始します。tail -5 を使うのは、冗長なログでClaudeのコンテキスト(記憶容量)を埋めないためのテクニックです。
“Claude Codeの作成者であるBoris Chernyは、Claudeにこのようなフィードバックループを与えることで、出力の質が2〜3倍向上すると述べています。”
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "npm test | tail -5; exit 0"
}
]
}
]
}
}
④ PR作成前のテスト合格の強制
テストが失敗している状態でのプルリクエスト(PR)作成を、フックによって「硬いゲート」として拒絶します。
分析・考察: 開発の「最終ゲート」です。CI/CDでエラーが出てレビューが止まる前に、ローカル環境でClaudeに責任を持たせます。ここでも exit 2 を利用し、テストが通らない限りPR作成アクション自体を成立させません。
# .claude/hooks/require-tests-for-pr.sh
npm test > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "テストが失敗しています。PRを作成する前に修正してください。"
exit 2
fi
⑤ 自動Lintとエラーレポート
ESLintなどの静的解析ツールを実行し、コードスタイルや潜在的なバグを自動修正・報告させます。
分析・考察: ①のPrettierと「連鎖(Chain)」させることで、人間がコードを確認する頃には、フォーマット済みかつLintエラーのない完璧な状態になります。機械的に解決できる指摘をレビューから排除し、より本質的な議論に集中できます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "npx eslint --fix $(jq -r '.tool_input.file_path'); exit 0"
}
]
}
]
}
}
⑥ 実行コマンドのログ記録(監査ログ)
Claudeが実行したすべてのBashコマンドを、タイムスタンプと共にログファイルに保存します。
分析・考察: デバッグ時の「証跡」として極めて有用です。数ステップ前にClaudeが何をしたかを正確に把握できるため、トラブル時の切り戻しや原因特定が容易になります。.claude/command-log.txt は .gitignore に追加しておきましょう。
# .claude/hooks/log-commands.sh
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $CLAUDE_COMMAND" >> .claude/command-log.txt
⑦ タスク完了時の自動コミット
Claudeがタスクを終え、応答を終了(Stop)するたびに、自動的にアトミックなコミットを作成します。
分析・考察: 複数のタスクが混ざった巨大な「一括コミット」を避け、Git履歴をクリーンに保ちます。これを claude -w(ワークツリー機能)と組み合わせれば、タスクごとに独立した履歴を自動構築する強力なパイプラインが完成します。
# .claude/hooks/auto-commit.sh
git add .
git commit -m "Claude: $CURRENT_TASK_SUMMARY" || exit 0
{
"hooks": {
"Stop": [
{ "type": "command", "command": ".claude/hooks/auto-commit.sh" }
]
}
}
⑧ チーム共有設定としての活用
.claude/settings.json をリポジトリに含めることで、チーム全員が同じ自動化の恩恵を享受します。
分析・考察: 個人の生産性向上だけでなく、チーム全体の「開発の規律」をフックで強制できます。新メンバーがジョインした瞬間から、シニアエンジニアと同じレベルの安全網と品質管理の中でClaude Codeを使い始めることが可能になります。
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash", "hooks": [{ "type": "command", "command": ".claude/hooks/block-dangerous.sh" }] }
],
"PostToolUse": [
{ "matcher": "Write|Edit", "hooks": [
{ "type": "command", "command": "npx prettier --write ..." },
{ "type": "command", "command": "npm test | tail -5" }
]}
],
"Stop": [
{ "type": "command", "command": ".claude/hooks/auto-commit.sh" }
]
}
}
——————————————————————————–
結論と次の一歩
優れたセットアップと最高のセットアップの違いは、使用するモデルの性能やプロンプトの工夫ではなく、「いかにフックで外枠を固めているか」にあります。
CLAUDE.mdは依然として道標として重要ですが、確実にルールを遵守させ、品質を担保したいのであれば、フックによる自動化は不可欠です。
まずは、最も効果を実感しやすい「①自動フォーマット」と「②危険コマンドの阻止」から導入してみてください。それだけで、Claude Codeは「指示を待つAI」から、「プロジェクトの規律を守り、自律的に高品質な成果を出す真のパートナー」へと変貌するはずです。


コメント