Claude Code hookをauto-recapより先に試すべき3パターン — commit漏れ・文脈消失・危険操作を自動検知した実録
「Claude Code に auto-recap を入れたほうがいいんじゃないか」と思っていた時期があります。
セッションを跨いで記憶を引き継ぐ仕組みは確かに魅力的です。ただ、実際に検討すると デメリット(ノイズ多発・クォータ消費・同じ決定の重複記録) が無視できないサイズでした。
代わりに辿り着いたのが、hook を別の用途に使う3パターンです。実装した当日に「あ、これが先だった」と感じたので記録します。
結論:この3つのhookを先に入れる
(A) Stop hook — 会話終了時に未commit / 未push ファイル数を表示
(B) PreCompact hook — コンテキスト圧縮直前にセッションログを自動退避
(C) UserPromptSubmit hook — 「削除/push/リリース」含むプロンプト検出時にgit情報を自動注入
auto-recap は「全部記憶させる」方向。この3つは「見えていなかった情報を適切なタイミングで出す」方向です。目的が違います。
この記事の前提
- Claude Code を個人開発で日常運用(portfolio サイト・masatoman.net・各種スクリプト)
- 複数リポジトリを1セッションで横断するため、git 状態の把握が難しい
- auto-recap の opt-in を検討した結果、今回の3 hook に着地
なぜ auto-recap を入れなかったか
検討したのは以下の理由からです。
- ノイズ多発: セッション終了のたびに Claude がまとめを書く → 短いセッションでも毎回走る
- クォータ消費: 要約生成にトークンが使われる → Max プランでも積み重なる
- 重複記録: 同じ判断(「軸 B を主軸にする」など)が何度もまとめに登場し、読み返したとき混乱する
「メリットしかない」と思っていたが、使い方によっては出力の質を下げる要因になると判断してopt-out を維持しました。
代わりに hook の別用途を模索した結果、上記3パターンに落ち着きました。
実装した3つのhook
(A) Stop hook — 会話終了時にgit状態を強制表示
目的: セッションを終えるたびにgit status を出す。commit 漏れ・untracked 放置を会話の節目で検知する。
# ~/.claude/hooks/stop-git-status.sh
#!/bin/bash
echo "=== git status サマリー ==="
for repo in ~/projects/*/; do
if [ -d "$repo/.git" ]; then
repo_name=$(basename "$repo")
status=$(git -C "$repo" status --porcelain 2>/dev/null)
untracked=$(echo "$status" | grep '^??' | wc -l | tr -d ' ')
modified=$(echo "$status" | grep -v '^??' | wc -l | tr -d ' ')
unpushed=$(git -C "$repo" log --oneline @{u}.. 2>/dev/null | wc -l | tr -d ' ')
if [ "$untracked" -gt 0 ] || [ "$modified" -gt 0 ] || [ "$unpushed" -gt 0 ]; then
echo "[$repo_name] 変更:$modified 未追跡:$untracked 未push:$unpushed"
fi
fi
done
// ~/.claude/settings.json(抜粋)
{
"hooks": {
"Stop": [
{
"type": "command",
"command": "bash ~/.claude/hooks/stop-git-status.sh"
}
]
}
}
実装して初発火したとき、portfolio リポジトリに変更 5 件 + untracked 84 件 + 未push 0 件が一発で可視化されました。
hook を入れるまでこれに気づいていませんでした。git status を毎回手動で打たない限り、untracked は静かに積み上がります。hook で会話の節目に強制表示することで、「気づけなかった」状態が解消されます。
untracked 84 件の内訳は lab-tools / local-business / preview 用 PNG / docs HTML / scripts など。その後8 commit に分けて系統整理し、346 件あった untracked を 4 件まで削減しました(詳細は別記事で書きます)。
(B) PreCompact hook — コンテキスト圧縮前にセッションログを退避
目的: Claude Code のコンテキスト圧縮(PreCompact)直前に、今セッションのトランスクリプトを _inbox/ にコピーして残す。圧縮後も生の会話が読める。
# ~/.claude/hooks/precompact-backup.sh
#!/bin/bash
INBOX="$HOME/_inbox/claude-sessions"
mkdir -p "$INBOX"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
SESSION_LOG="$HOME/.claude/current-session.jsonl"
if [ -f "$SESSION_LOG" ]; then
cp "$SESSION_LOG" "$INBOX/session_${TIMESTAMP}.jsonl"
echo "PreCompact backup: $INBOX/session_${TIMESTAMP}.jsonl"
fi
// ~/.claude/settings.json(抜粋)
{
"hooks": {
"PreCompact": [
{
"type": "command",
"command": "bash ~/.claude/hooks/precompact-backup.sh"
}
]
}
}
なぜこれが必要か: Claude Code はコンテキストが一定量を超えると自動圧縮します。圧縮後は直前の細かいやり取りが Claude から見えなくなる。後から「あのとき何を決めたか」を確認したくても、Claude 側には要約しか残っていない。
_inbox/ に毎回の生ログを退避しておくことで、自分が読み返せる形で保存が続きます。auto-recap で Claude に要約させるより、生ログを保持しておくほうが情報量の損失が少ない。
(C) UserPromptSubmit hook — 危険キーワード検出時にgit情報を自動注入
目的: 「削除」「push」「リリース」「本番」「reset」「merge」を含むプロンプトを打ったとき、自動的に現在の git 状態を Claude のコンテキストに注入する。Claude が git の状態を把握した上で応答できるようになる。
# ~/.claude/hooks/user-prompt-git-inject.sh
#!/bin/bash
# UserPromptSubmit は stdin で JSON が来る
INPUT=$(cat)
PROMPT=$(echo "$INPUT" | python3 -c "import sys, json; print(json.load(sys.stdin).get('prompt',''))" 2>/dev/null)
# 危険キーワードのいずれかが含まれるか確認
KEYWORDS="リリース|デプロイ|push|削除|reset|merge|本番"
if echo "$PROMPT" | grep -qE "$KEYWORDS"; then
echo "<git-context-auto-injected>"
echo "現在のブランチ:"
git branch --show-current 2>/dev/null
echo "直近のコミット:"
git log --oneline -5 2>/dev/null
echo "git status (porcelain):"
git status --porcelain 2>/dev/null | head -20
echo "</git-context-auto-injected>"
fi
// ~/.claude/settings.json(抜粋)
{
"hooks": {
"UserPromptSubmit": [
{
"type": "command",
"command": "bash ~/.claude/hooks/user-prompt-git-inject.sh"
}
]
}
}
このhookを実装した際、「settings.json を編集した後、次のセッションから有効」と思っていたところ、同セッション内でのプロンプト送信時に即発火しました。
Claude Code は settings.json を都度再読み込みする仕組みがあるようです(hot reload の挙動、または都度読み直し)。「次セッション待ち」の前提を持っていると見落とすポイントなので注意が必要です。
永続施策を導入するときの落とし穴3つ
hookやoutput styleを導入する際に実際に踏んだ落とし穴です。
落とし穴1:Output Style はsettings.json 編集と同セッション内では切り替わらない
Output Style(カスタムスタイル)は セッション開始時に system prompt に焼き込まれる 仕様です。セッション中に settings.json を書き換えても、その変更は現在のセッションには反映されません。次セッションから有効になります。
UserPromptSubmit hook は即発火したのに Output Style は次セッション待ち——この非対称が混乱の原因でした。
落とし穴2:PostToolUse 自動 lint はツールが入っていないと意味がない
「保存後に自動で lint を走らせる」PostToolUse hook を設定したが、対象リポジトリに Prettier が入っていなかったため何も起きませんでした。
ツール前提の確認(which prettier / npx prettier --version)を先に済ませてから hook を書く必要があります。hook が「エラーなしで何も起きない」状態は、設定が壊れているのか正常動作なのか判別しにくい。
落とし穴3:anthropics/claude-code-action は API 従量課金が発生する
GitHub Actions 経由で Claude を呼ぶ anthropics/claude-code-action を試みたところ、Max/Pro サブスクのクォータとは別に ANTHROPIC_API_KEY が必要で、API 呼び出しの従量課金が発生する ことが分かりました。
Max プランで PR レビューを自動化しようと考えていたが、Actions 公式版は API 従量課金ルートのため採用を見送り、/schedule でのレビュー依頼に振り替えました。
「Max プランで全部賄える」という前提は誤りです。GitHub Actions 経由の自動化は別課金になる点を把握した上で設計する必要があります。
今日やること3つ
~/.claude/settings.jsonに Stop hook を1行追加し、次のセッション終了時に git 状態を確認する- PreCompact hook を入れて
_inbox/claude-sessions/に生ログが溜まる状態を作る(これが後から読み返せる一次資料になる) - UserPromptSubmit hook に自分がよく打つ「危険キーワード」(「本番」「reset」など)を追加して、Claude への git 情報自動注入を試す
masatoman.net 運営 + portfolio サイト作業で Claude Code を複数リポジトリ横断して使用中。今回の3つの hook は 2026-05-14 のセッションで実装・発火確認済み。Stop hook 初回発火でportfolio リポジトリのuntracked 84件を検知し、その後8commitで346→4件に整理した実績あり。auto-recap はデメリット評価の結果 opt-out 維持。GA4 + Search Console 連携済みでベースライン計測中。
で、どう稼ぐ?
Claude Code を毎日使う個人開発者にとって、commit 漏れと git 状態の把握ミスは直接的な損失につながります。
- commit 漏れ → 翌日のセッションで「あれ、どこまでやったっけ」の調査コストが発生
- untracked 放置 → 作りかけのファイルが積み上がり、どれが本番用でどれが試作かが分からなくなる
- 危険操作のコンテキスト不足 → Claude がブランチや変更差分を把握しないまま「削除してください」に従ってしまう
これらのコストを hook で自動化すると、調査・確認・手戻りに使っていた時間が開発時間に変わります。
個人開発で月5万を目指すなら、Claude Code の操作速度よりも「ミスをしない構造」のほうが先に投資する価値があります。hook 設定は1時間で終わり、効果は毎日の作業に永続します。
Claude Crew Lab では、こうした Claude Code の実運用パターンを継続的にまとめています。Free 登録で更新通知を受け取れます。
masatoman のメルマガ — 毎週月曜の朝に手紙を 1 通
masatoman.net の今週の記事 1 本を、読者目線で深掘りした手紙が毎週月曜 9:00 に届きます。「これ自分のことだ」が見つかる予告編。登録特典に「個人開発の収益化チェックリスト 15 項目」。
masatoman のメルマガ — 毎週月曜の朝に 1 通
masatoman.net で今週公開した記事の中から 1 本を、読者目線で深掘りした手紙が届きます。「自分も同じことやってる」「ここで詰まってた」が見つかる予告編。
Next Step
次に読むならこの導線です
【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード
Claude Codeラボ全12話の集大成。Skills/MCP/サブエージェント/Hooks/リモート運用を統合した「自走する Claude 自動化」を、月 ¥5K の実コストで動かす全構成を公開。寝てる間に競合調査・記事下書き・PR まで自動化する 6 層アーキテクチャの完成版。
【第4回】Claude Code Hooks 完全ガイド — 保存時自動整形・コミット前チェックの実装
Claude Code の Hooks 機能で「人間が忘れがちな処理」を強制する設定方法を、実コード付きで解説。保存時 lint・コミット前テスト・本番DB保護まで、実運用 Hooks 5パターンを公開します。
【第12回】夜寝てる間に Claude Code が記事を書き上げる構成 — 月 ¥5K で動く全コード
Claude Codeラボ全12話の集大成。Skills/MCP/サブエージェント/Hooks/リモート運用を統合した「自走する Claude 自動化」を、月 ¥5K の実コストで動かす全構成を公開。寝てる間に競合調査・記事下書き・PR まで自動化する 6 層アーキテクチャの完成版。
【第1回】Claude Code Skills 入門 — 自作スキルで開発効率を2倍にする実装ガイド
Claude Code の Skills 機能を自作する手順を、masatoman.net 周辺の自動化を Claude Code で回している立場で実コード付きで解説。1 スキル 15 分の投資で月 10 時間の作業を削減する実装ガイドです。
次の実験記録も追う
Claude Code × 個人開発の実験ログ、失敗、判断変更をまとめて追いたい人向けに、月次でLab Freeを届けます。
masatoman のメルマガ — 毎週月曜の朝に 1 通
masatoman.net で今週公開した記事の中から 1 本を、読者目線で深掘りした手紙が届きます。「自分も同じことやってる」「ここで詰まってた」が見つかる予告編。
この記事が役に立ったらシェア