Claude Code の hooks 機能を使い始めたら、繰り返し作業がかなり減った話
Claude Code の hooks 設定(Stop / PostToolUse など)を使って定型作業を自動化した体験談です。設定方法から実際に使っている内容まで紹介します。
👀 結論から
Claude Code には hooks という機能があって、特定のタイミングでシェルコマンドを自動実行できます!
リポジトリの .claude/settings.json に設定を書いておくだけで、「AIが回答を返したら通知を出す」「ファイルを編集した後に lint を走らせる」といった定型作業を自動化できます。
実際に仕事のプロジェクトで使い始めたら、毎回手動でやっていた確認作業がかなり減って助かっています(^o^)/
💡 hooks 機能とはなにか
hooks は Claude Code が特定のイベントを検知したタイミングで、指定したシェルコマンドを実行してくれる仕組みです。
~/.claude/settings.json(グローバル)か .claude/settings.json(プロジェクト単位)に設定を書きます。
イベントの種類は全部で30ほどありますが、まず使い始めるならこの4種類を押さえておけば十分です:
UserPromptSubmit— プロンプトを送信したときPreToolUse— ツール(ファイル編集・コマンド実行など)を使う直前PostToolUse— ツールを使った直後Stop— AIの応答が完了したとき
イベントごとに「どんなコマンドを実行するか」を設定できます。
✨ 実際に設定している hooks
いくつか実際に使っている設定を紹介します(^^)
Stop で完了通知を出す
Claude Code に長めの作業を頼んだとき、終わったタイミングで macOS の通知を出す設定です。
処理中は別の作業に集中できるので、かなりありがたいです!
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code の処理が完了しました\" with title \"Claude Code\"'"
}
]
}
]
}
}
PostToolUse で lint を自動チェック
ファイルを編集した直後に ESLint を走らせる設定です。
Claude が生成したコードに lint エラーが含まれていた場合、すぐに気づけるようになりました。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "npm run lint --silent 2>&1 | head -20"
}
]
}
]
}
}
👍 使い始めてからの変化
一番変わったのは、処理中に別作業ができるようになったことです。
以前は Claude Code に少し複雑なタスクを頼んだとき、終わりに気づかずに画面をぼーっと見続けていることがありました(´・ω・`)
Stop フックで通知を出すようにしてから、処理中は別ウィンドウで普通に作業できるようになって、待ち時間がほぼゼロになった感じがしています!
lint の自動チェックも、Claude が生成したコードを自分でいちいち開いて確認する手間がなくなったので、かなりスムーズになりました。
コードを頼んでから「エラーないですよ」まで Claude が一連で確認してくれる感じになったのが、正直かなり大きいです!
🤔 気になった点
コマンドが失敗してもセッションは止まらない仕様なので、最初は「フックが本当に動いているかどうかわからない」という場面がありました(・_・;)
echo "hook fired" のようなログを最初に入れておくと、動作確認がしやすくなります。
また、hooks はまだ比較的新しい機能なので、設定できるイベントやオプションが今後さらに増えていく可能性があります。
プロジェクトの .claude/settings.json に設定を書いておけばバージョン管理もできるので、チームで共有するときも便利です。
🚀 SessionStart フックでプロジェクト情報を自動読み込みする
Stop と PostToolUse に慣れたあと、SessionStart というイベントも試してみました。
これはセッションが新規に始まったとき(起動・再開・/clear 実行時・コンパクション後など)に発火するフックで、標準出力の内容がそのままAIのコンテキストに注入されるという特徴があります。
私はここに、直近のgit状況とTODOリストを表示するスクリプトを仕込みました。
{
"hooks": {
"SessionStart": [
{
"matcher": "startup",
"hooks": [
{
"type": "command",
"command": "git log --oneline -5 && echo '---' && cat TODO.md 2>/dev/null"
}
]
}
]
}
}
matcher に startup を指定すると新規セッション開始時だけに絞れるので、セッション再開のたびに毎回同じ情報が二重に出てくることもありません。
これのおかげで、Claude Code を開き直すたびに「最近の変更内容」と「今のTODO」を毎回自分で説明しなくてよくなりました(^^)
もうひとつ意外と助かっているのが、matcher に compact(コンテキスト圧縮時)を指定するパターンです。
長いセッションでコンテキストが圧縮されると、細かいプロジェクトルールを忘れられてしまうことがあったんですが、圧縮のタイミングで重要なルールを再注入するようにしてから、そのブレがかなり減りました!
exit code の意味も覚えておくと応用が効きます。exit 0 は成功(出力はJSONとして解釈)、exit 2 はツールの実行自体をブロックするエラー、exit 1 はブロックしないエラー、という3パターンで動作が変わります。
パパ系Webエンジニア〜愛用ガジェット一覧 🛍️
AI開発・執筆に使っている作業デスク環境を楽天ROOMにまとめています ✨ デスク周りの参考にどうぞ 🙌
🙌 まとめ
Claude Code の hooks 機能を使うと、定型的な確認作業や通知まわりをかなり自動化できます。
.claude/settings.jsonに書くだけでプロジェクト単位で設定できるStopで完了通知、PostToolUseで lint チェックが特に便利- フックが動いているか確認する
echoログを最初に仕込んでおくと安心 - バージョン管理できるのでチーム共有にも向いている
Claude Code を仕事で使っている人は、hooks を組み合わせると毎日の作業がさらにスムーズになります🙌