Claude Code の Hooks、使っていますか?「自動で Prettier かけるやつでしょ」くらいの認識の人も多いかもしれません。私もそうでした。
でも海外の Reddit や GitHub を漁ってみたら、想像以上に面白い使い方がたくさん出てきたんですよね。待機中に BGM を流すとか、瞑想アプリを起動するとか、セッションごとに Git ブランチを分けるとか。
今回は lint/format 以外で見つけたユニークな Hooks 設定を紹介します。
通知・エンタメ系のHooks
まずは「え、そんな使い方するの?」と思った系統から。
Voice Hooks - 各イベントにサウンドを割り当て
Claude Codeのイベントにサウンドを割り当てるプラグイン。セッション開始時にマリオのスタート音が鳴ります。
| イベント | サウンド |
|---|---|
| SessionStart | マリオのスタート音 |
| SessionEnd | 終了音 |
| PreToolUse | ding |
| PostToolUse | dong |
# プロジェクトディレクトリで実行
mkdir -p .claude
git clone https://github.com/shanraisshan/claude-code-voice-hooks.git temp-hooks
cp -r temp-hooks/.claude/. .claude/
rm -rf temp-hooks
既に.claude/settings.jsonがある場合は、hookスクリプトをコピー後、hooksキーを手動でマージする必要があります。
OS自動検出で、Macはafplay、Linuxはpaplay、Windowsはwinsoundを使います。非同期hookなのでClaudeの実行をブロックしません。
音量がデカいので注意。イヤホンしてたらびっくりする。
Moo Plugin - パーミッション要求で「モー」
別ウィンドウで作業してると、Claude Codeがパーミッション待ちなのに気づかないことありますよね。5分後に「あ、まだ待ってた」みたいな。
このプラグインは、パーミッション要求時に牛の鳴き声「モー」を再生します。
{
"hooks": {
"PermissionRequest": [{
"hooks": [{
"type": "command",
"command": "afplay ~/.claude/sounds/moo.wav"
}]
}]
}
}
牛の鳴き声という発想がユニーク。地味に便利。
Elevator Music - 待機中にBGMを流す
Claude Code が処理中のとき、エレベーターミュージック(いわゆる保留音的なBGM)を自動再生するプラグイン。
{
"hooks": {
"Notification": [{
"matcher": "idle_prompt|permission_prompt",
"hooks": [{
"type": "command",
"command": "python3 ~/.claude/hooks/elevator-music.py"
}]
}]
}
}
30秒で自動停止するので、無限再生の心配はありません。対応プレーヤーは ffplay、mpv、afplay(Mac標準)など。
長時間タスクを待ってるとき、無音より何か流れてる方が精神的に楽。
Clauditate - 待機中に呼吸エクササイズ
Claude Code が処理中のとき、自動で瞑想・呼吸エクササイズのアプリを表示してくれます。
npm install -g clauditate
clauditate --hook-claude
特徴的なのは「スマートタイミング」機能。毎回表示されるとうざいので、以下の条件で制御されています。
- 勤務時間内のみ表示(デフォルト9時〜17時)
- 前回の瞑想から60分以内は非表示
- 1日の目標達成後は表示しない
- 30分以内に2回スキップすると、2時間待機
日次・週次・月次の瞑想データも記録されるので、「今週どれくらい深呼吸したか」が可視化されます。健康意識高い系エンジニア向けですね。
TTS音声通知 - 完了を読み上げ
Stop hook でタスク完了時に「作業が完了しました」と音声で読み上げる設定。ElevenLabs、OpenAI TTS、pyttsx3(ローカル)の優先順位で対応しています。
# Stop hook で呼ばれる
def notify_completion(message):
# ElevenLabs > OpenAI > pyttsx3 の優先順位で再生
if elevenlabs_available():
elevenlabs_speak(message)
elif openai_available():
openai_speak(message)
else:
pyttsx3_speak(message)
別の作業をしているときに「終わったよ」と教えてくれるのは地味に便利。Mac なら say コマンドでもっと簡単にできますね。
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "say '処理が完了しました'"
}]
}]
}
}
Git連携系のHooks
ここからは実用的な設定が多めです。
自動gitステージング
Claude Code がファイルを編集したら、自動で git add する設定。コミットは手動なので、変更を確認してからコミットできます。
{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "git add -A"
}]
}]
}
}
これは割と定番かもしれませんが、「自分でステージングするの忘れがち」という人には便利ですよね。
Stop時に自動コミット
セッション終了時に、プロンプト内容をコミットメッセージにして自動コミットする設定。GitButler のブログで紹介されていました。
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "python3 ~/.claude/hooks/auto-commit.py"
}]
}]
}
}
スクリプト内で transcript_path から最新のプロンプトを抽出し、それをコミットメッセージにします。「何をお願いしたか」がそのまま履歴に残るので、後から見返しやすいです。
セッション別ブランチ管理
これが一番技術的に面白かった設定。並列で複数の Claude Code セッションを動かすとき、それぞれを別の Git ブランチに分離します。
同じブランチで並行作業してると変更が混ざって「どっちの編集だっけ?」ってなるんですよね。これ欲しかった。
{
"hooks": {
"PreToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/setup-shadow-index.sh"
}]
}],
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/stage-to-session.sh"
}]
}],
"Stop": [{
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/commit-session-branch.sh"
}]
}]
}
}
仕組みとしては、PreToolUse/PostToolUse/Stop の各フェーズでセッションごとにGit操作を分離します。GitButlerと連携すると、セッションごとに自動で別ブランチが作成され、変更が混ざる問題を回避できます。
これで「セッションAの変更とセッションBの変更が混ざる」問題を解決。複数セッションを本格的に使う人向けですね。
Jujutsu(jj)連携
Git の代替として注目されている Jujutsu との連携設定。「AI の編集を絶対に失わない」がコンセプトです。
{
"hooks": {
"Stop": [{
"hooks": [{
"type": "command",
"command": "jj show"
}]
}]
}
}
最初は jj commit を使っていたそうですが、jj は jj op log と jj op restore で以前の状態を復元できるため、jj show だけで十分とのこと。コミット履歴を汚さずに、いつでもロールバックできる状態を維持できます。
高度な自動化系のHooks
SessionStart で課題を自動読み込み
セッション開始時に、GitHub の未解決 Issues や CI の失敗ステータスを自動で取得する設定。
{
"hooks": {
"SessionStart": [{
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/load-context.sh"
}]
}]
}
}
「今日やるべきこと」をセッション開始時に Claude Code が把握してくれるので、「このIssue直して」とお願いするときに番号だけ伝えれば済みます。
サブエージェント制御
Claude Codeにはサブエージェント専用のHookイベントSubagentStartとSubagentStopが用意されています。サブエージェントの開始・終了をトラッキングしたいときに便利です。
{
"hooks": {
"SubagentStart": [{
"hooks": [{
"type": "command",
"command": "echo \"サブエージェント開始: $(date)\" >> ~/.claude/subagent.log"
}]
}],
"SubagentStop": [{
"hooks": [{
"type": "command",
"command": "say 'サブエージェント完了'"
}]
}]
}
}
サブエージェントの実行時間を計測したり、完了通知を受け取ったりするのに使えます。
AI連携系Hooks
Claude Code単体じゃなくて、他のAIと組み合わせる設定。
Claude-Gemini Bridge - 大規模ファイルを自動委譲
これ技術的に面白い。Claude Codeが大きなファイルを読もうとしたとき、自動でGeminiに委譲するhook。
{
"hooks": {
"PreToolUse": [{
"matcher": "Read|Grep|Glob|Task",
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/gemini-bridge.py"
}]
}]
}
}
委譲の判断基準:
- 50kトークン超(約200KB)のファイル → Geminiへ
- 3ファイル以上のTask操作 → Geminiへ
- 機密ファイル(
.env,.key等)→ 自動除外
Claudeのコンテキストを節約しつつ、Geminiの大容量コンテキスト(100万〜200万トークン)を活用できます。
「適材適所でAIを使い分ける」を自動化してるの、発想がすごい。
Prompt Improver - 曖昧プロンプトを明確化
UserPromptSubmitで発火して、曖昧なプロンプトを検出したら明確化質問を自動生成するhook。claude-code-prompt-improverというプロジェクトで公開されています。
# マーケットプレイス経由でインストール
claude plugin marketplace add severity1/severity1-marketplace
claude plugin install prompt-improver@severity1-marketplace
例えば「このコード直して」と入力すると:
- 「どの部分を直しますか?」
- 「期待する動作は?」
- 「エラーメッセージはありますか?」
といった質問を生成し、AskUserQuestionツールで確認してから実行します。
面白いのは、Pythonスクリプト自体は評価ロジックを持たない点。「このプロンプトは明確?曖昧?」という判断をClaude自身に委ねる設計です。評価のオーバーヘッドは約189トークンと軽量。
曖昧な指示でトークン消費するより、最初に明確化した方が効率的という発想です。*で始めるとバイパスできるので、急いでいるときは明確化をスキップできます。
まとめ
lint/format 以外の Hooks 設定、思った以上にバリエーションがありました。
試してみたいもの
- TTS 音声通知(Mac の
sayコマンドで簡単に試せる) - セッション別ブランチ管理(同じブランチで並行AIコーディングしてると変更が混ざるので)
- Claude-Gemini Bridge(大規模ファイルの自動委譲、コンテキスト節約になりそう)
- Voice Hooks / Moo Plugin(通知音のカスタマイズ)
Hooks の設定は ~/.claude/settings.json(グローバル)か .claude/settings.json(プロジェクト)に書けます。まずは通知系から試してみると、Hooks の動作が理解しやすいと思います。
皆さんはどんなHooks設定を使っていますか?面白い使い方があればぜひ教えてください。
Ghostty入門|HashiCorp創業者が作った次世代ターミナルの設定ガイドMac