Claude CodeのHooks完全ガイド ── 開発ワークフローを自動化する仕組み
Claude Codeを使っていて、こんなことを思ったことはありませんか。
- ファイルを保存するたびに手動でフォーマッター(コードの見た目を自動で整えるツール)を実行するのが面倒
rm -rfやgit push --forceみたいな危険なコマンドをうっかり実行しそうで怖い- コミット(変更の記録)するたびにコードチェックツールを手動で実行するのを忘れてしまう
こういう「毎回やらなきゃいけないけど、つい忘れちゃう作業」を自動化してくれるのが**Hooks(フック)**です。Claude Codeが特定の操作をするたびに、あらかじめ設定しておいたコマンドが自動で実行される仕組みです。つまり、「AIがファイルを保存したら、自動的にコードを整形する」といったことが設定一つでできるようになります。
この記事では、Hooksの基本的な考え方から設定のやり方、すぐに使えるレシピまでを、できるだけわかりやすく説明します。
Hooksとは何か
Hooksは、Claude Codeの作業の流れの中で、決まったタイミングに自動で実行されるコマンドのことです。
Claude Code
がファイルを保存
Hook発動!
Prettierが自動実行
整形されたキレイな
ファイルが保存される
ここで大事なポイントは、HooksはAI(LLM)に頼らず、確実に毎回同じように動く処理を差し込めるということです。AIは「うっかり忘れる」こともありますが、Hooksなら絶対に忘れません。つまり、「AIが忘れるかもしれない定型作業を自動化するのに最適」な仕組みです。
Hooksが使える6つのタイミング
「いつ自動実行するか」を選べます。全部で6つのタイミングがあります。
| タイミング | いつ発動する? | こんなことに使える |
|---|---|---|
| SessionStart | セッション(作業の会話)が始まったとき | 環境チェック、必要なパーツがそろっているか確認 |
| PreToolUse | AIがコマンドを実行する直前 | 危険なコマンドをブロックする、入力チェック |
| PostToolUse | AIがコマンドを実行した直後 | コードの自動整形、コードチェックの実行 |
| PostToolUseFailure | AIのコマンドが失敗したとき | エラーの記録、復旧処理 |
| PermissionRequest | AIが権限を求めてきたとき | 独自の承認ルールを設定 |
| SessionEnd | セッションが終わるとき | 後片付け、レポートの出力 |
設定のやり方
Hooksは .claude/settings.json というファイルに書きます。つまり、プロジェクトのフォルダの中に .claude というフォルダを作って、その中に settings.json を置くということです。
基本的な書き方
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "npx prettier --write \"$CLAUDE_FILE_PATH\""
}
]
}
}
この設定だと、Claude Codeがファイルを書き込む(Write)か編集する(Edit)たびに、Prettier(コード整形ツール)が自動実行されます。つまり、「AIがコードを書いたら、自動的にキレイに整えてくれる」というわけです。
設定のポイント
| 項目 | どういう意味? | 書き方の例 |
|---|---|---|
matcher | どの操作のときに発動するか(正規表現で指定) | "Write|Edit"(書き込みか編集のとき), "Bash"(コマンド実行のとき) |
command | 発動したら何を実行するか | "npx prettier --write \"$CLAUDE_FILE_PATH\"" |
使える変数
Hookのコマンドの中で使える便利な変数があります。「$」で始まる名前で、自動的に実際の値に置き換わります。
| 変数 | 何が入る? |
|---|---|
$CLAUDE_FILE_PATH | 操作されたファイルの場所(パス) |
$CLAUDE_TOOL_NAME | 実行されたツールの名前 |
$CLAUDE_TOOL_INPUT | ツールに渡された情報(JSON形式) |
$CLAUDE_TOOL_OUTPUT | ツールから返ってきた結果(JSON形式) |
すぐに使えるレシピ10選
レシピ1: ファイル保存時に自動でコードを整形する
一番基本的で、一番効果が高いHookです。Claude Codeがファイルを保存するたびに、Prettier(コード整形ツール)が自動で走ります。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
}
]
}
}
末尾の 2>/dev/null || true は「Prettierが対応していないファイル形式だったときにエラーで止まらないようにする」おまじないです。これがないと、Markdownファイルなどを保存したときにエラーが出て作業が止まってしまうことがあります。
レシピ2: 危険なコマンドをブロックする
rm -rf /(ファイルを全部消す超危険コマンド)や git push --force(変更を強制的に上書きする危険な操作)のような、うっかり実行すると取り返しのつかないコマンドを事前にブロックします。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | python3 -c \"import sys,json; cmd=json.load(sys.stdin).get('command',''); [exit(1) for p in ['rm -rf /','git push --force','DROP TABLE','DROP DATABASE'] if p in cmd]\""
}
]
}
}
PreToolUseは軽い処理だけにしよう
PreToolUse(コマンド実行の直前)のHookはAIが何かするたびに毎回呼ばれるので、重い処理を入れると全体が遅くなります。ここにはシンプルなチェックだけ入れましょう。
レシピ3: TypeScriptの型チェックを自動実行する
TypeScriptファイルが変更されるたびに、型チェック(書き方が正しいかの確認)を自動で実行します。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "echo \"$CLAUDE_FILE_PATH\" | grep -q '\\.tsx\\?$' && npx tsc --noEmit 2>&1 | head -20 || true"
}
]
}
}
レシピ4: ESLint(コード品質チェックツール)を自動実行する
ファイル保存後にESLintでコードの品質をチェックし、自動で直せるものは直してくれます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "echo \"$CLAUDE_FILE_PATH\" | grep -qE '\\.(js|ts|jsx|tsx)$' && npx eslint \"$CLAUDE_FILE_PATH\" --fix 2>/dev/null || true"
}
]
}
}
レシピ5: セッション開始時に環境を確認する
セッションが始まったときに、Node.jsのバージョンや必要なパーツがちゃんとそろっているかを自動で確認します。つまり、「作業を始める前に、準備が整っているか自動でチェックする」ということです。
{
"hooks": {
"SessionStart": [
{
"command": "echo '=== Environment ===' && node -v && echo '=== Dependencies ===' && (npm ls --depth=0 2>/dev/null | tail -5)"
}
]
}
}
レシピ6: 大事なファイルの編集をブロックする
設定ファイルやロックファイルなど、「このファイルは勝手に触ってほしくない」というファイルの編集をブロックします。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"command": "echo \"$CLAUDE_FILE_PATH\" | grep -qE '(package-lock\\.json|\\.env|prisma/migrations/)' && echo 'BLOCKED: Protected file' && exit 1 || true"
}
]
}
}
レシピ7: コミット前にテストを自動実行する
git commit(変更の記録)をする前に、自動でテストを実行してくれます。つまり、「テストが通らない状態でコミットしてしまう」という事故を防げます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'git commit' && npm test 2>&1 | tail -10 || true"
}
]
}
}
レシピ8: ファイルが大きくなりすぎたら警告する
AIが極端に大きなファイルを作ってしまうのを防ぎます。500行を超えたら警告を出します。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"command": "[ -f \"$CLAUDE_FILE_PATH\" ] && [ $(wc -l < \"$CLAUDE_FILE_PATH\") -gt 500 ] && echo 'WARNING: File exceeds 500 lines' || true"
}
]
}
}
レシピ9: 画像ファイルの最適化をリマインドする
画像ファイルが追加されたときに、「最適化したほうがいいよ」とリマインドしてくれます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE '\\.(png|jpg|jpeg)' && echo 'TIP: Consider optimizing images with sharp or squoosh' || true"
}
]
}
}
レシピ10: セッション終了時に作業のまとめを出す
セッションが終わるときに、どのファイルが変更されたかをログに記録します。つまり、「今日の作業記録を自動で残す」ということです。
{
"hooks": {
"SessionEnd": [
{
"command": "echo '=== Session Summary ===' && git diff --stat 2>/dev/null && echo '=== End ===' >> ~/.claude/session-log.txt"
}
]
}
}
複数のHookを組み合わせて使う
実際のプロジェクトでは、いくつかのHookを組み合わせて使うのがふつうです。以下は「セッション開始時の環境チェック」「危険なコマンドのブロック」「大事なファイルの保護」「自動コード整形」を全部まとめた設定例です。
{
"hooks": {
"SessionStart": [
{
"command": "node -v && npm ls --depth=0 2>/dev/null | tail -3"
}
],
"PreToolUse": [
{
"matcher": "Bash",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | python3 -c \"import sys,json; cmd=json.load(sys.stdin).get('command',''); [exit(1) for p in ['rm -rf','--force','DROP '] if p in cmd]\""
},
{
"matcher": "Write|Edit",
"command": "echo \"$CLAUDE_FILE_PATH\" | grep -qE '(\\.env|package-lock)' && exit 1 || true"
}
],
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true"
}
]
}
}
Hooksを使うときの注意点
無限ループに気をつけよう
「Hookがファイルを書き込む → その書き込みでまたHookが発動する → またファイルを書き込む…」という無限ループが起きる可能性があります。Hookのコマンドではファイルの書き込みを避けるか、発動条件をちゃんと絞っておきましょう。
重い処理はPreToolUseに入れない
特にPreToolUseのHookは、AIが何かするたびに毎回実行されます。ここにテストの全件実行みたいな重い処理を入れると、作業全体がすごく遅くなります。重い処理はPostToolUse(作業の後)に置いて、PreToolUse(作業の前)にはサッと終わるチェックだけ入れましょう。
エラーで作業が止まらないようにする
Hookがエラーで止まると、Claude Codeの作業もそこでストップしてしまいます。|| true(エラーが出ても続行する)や 2>/dev/null(エラーメッセージを表示しない)をつけて、想定外のエラーでも作業が止まらないようにしておきましょう。
まずは1つから始めよう
最初からたくさんのHookを設定しようとすると、何が問題を起こしているかわからなくなります。まず1つ(自動コード整形)だけ入れて、ちゃんと動くのを確認してから、少しずつ追加していくのがおすすめです。
まず入れるべきHookはこの2つ
迷ったら「PostToolUseの自動コード整形(レシピ1)」と「PreToolUseの危険コマンドブロック(レシピ2)」の2つだけ入れましょう。これだけで開発の安全性とコード品質がぐっと上がります。
まとめ
Hooksは、Claude Codeの作業の流れに対して**「絶対に忘れない自動処理」を差し込む仕組み**です。AIが忘れるかもしれないことも、Hooksなら毎回確実に実行してくれます。
今日から始めるステップ:
.claude/settings.jsonを作る- まず自動コード整形(レシピ1)を設定して、ちゃんと動くか確認
- 危険コマンドブロック(レシピ2)を追加する
- プロジェクトに合わせて、必要なHookを少しずつ追加
- ときどき設定を見直して、使わなくなったHookは消す
Hooksをうまく設定すれば、「コードの整形を忘れた」「危険なコマンドを実行してしまった」という事故がゼロになり、コードの品質を自動で守れるようになります。