1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeの「コンパクティング後にルール忘れる問題」をSessionStartフックで解決する

Last updated at Posted at 2025-12-10

【追記:重要】Claude Code を VSCode / Cursor で使う場合の設定

2025年12月19日リリースの VSCode / Cursor 拡張機能バージョン 2.0.74 以降、フック機能(SessionStart、UserPromptSubmit、Stop など)が動作しなくなっています。2.0.73(12月17日)までは正常に動作していました。

この問題の回避策として、「Use Terminal」設定をオンにする必要があります。

設定方法:

  • VSCode / Cursor の設定画面を開く
  • 「Claude Code」の設定項目を探す
  • 「Use Terminal」をオンにする

この設定をオンにすると、拡張機能は内部で CLI を起動して動作するため、フックが正常に機能します。

--追記ここまで

はじめに

Claude Codeを使っていると、長い会話の後にコンパクティング(要約)が発生し、せっかく設定した.claude/rulesの内容をClaudeが忘れてしまうことがあります。

この記事では、**SessionStartフックのmatcher: "compact"**を使って、コンパクティング後に自動的にルールとREADMEを再注入する方法を紹介します。

課題

Claude Codeには.claude/rulesファイルでルールを設定できますが、以下の問題があります:

  • コンパクティング後、ルールの優先度が下がる
  • 長い会話でルールが埋もれて忘れられる
  • 毎回「ルール読んで」と言うのは面倒

既存のアプローチ(UserPromptSubmitフックで毎回表示など)はトークン消費が大きいという欠点がありました。

解決策:compact限定のSessionStartフック

SessionStartフックはsourceパラメータで発火条件を絞り込めます:

  • "new": 新規セッション開始時
  • "resume": セッション再開時
  • "compact": コンパクティング後

コンパクティング後だけにルールを再注入することで、トークン消費を最小限に抑えつつ、ルールの再認識を強制できます。

実装

1. 設定ファイル(.claude/settings.local.json)

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "compact",
        "hooks": [
          {
            "type": "command",
            "command": "/path/to/your/project/.claude/hooks/inject_rules_on_compact.py"
          }
        ]
      }
    ]
  }
}

ポイント: "matcher": "compact"により、コンパクティング後のみフックが発火します。

2. フックスクリプト(inject_rules_on_compact.py)

#!/usr/bin/env python3
"""
SessionStartフック: コンパクティング後にルールとREADMEを注入する

source が "compact" の場合、.claude/rules と README.md の内容を stdout に出力し、
Claudeのコンテキストに自動的に追加される。
"""

import json
import sys
import os

# プロジェクトのルートパスを設定
BASE_PATH = "/path/to/your/project"

def main():
    try:
        data = json.load(sys.stdin)
        source = data.get("source", "")

        # matcherで絞り込んでいるのでsourceチェックは念のため
        if source == "compact":
            # ルールを出力
            rules_path = f"{BASE_PATH}/.claude/rules"
            if os.path.exists(rules_path):
                with open(rules_path, "r", encoding="utf-8") as f:
                    print(f.read())

            # READMEを出力(プロジェクト固有のドキュメント)
            readme_path = f"{BASE_PATH}/README.md"
            if os.path.exists(readme_path):
                print("\n" + "=" * 80)
                print("README.md")
                print("=" * 80 + "\n")
                with open(readme_path, "r", encoding="utf-8") as f:
                    print(f.read())
    except Exception as e:
        # エラーがあっても終了コード0で正常終了
        sys.stderr.write(f"inject_rules_on_compact error: {e}\n")

    sys.exit(0)

if __name__ == "__main__":
    main()

3. 実行権限の付与

chmod +x .claude/hooks/inject_rules_on_compact.py

なぜREADMEも注入するのか

ルールだけでなくREADMEも注入することで、以下の効果があります:

  • プロジェクト固有の仕様・アーキテクチャの再認識
  • 「この機能はない」という誤った回答の防止
  • コンテキスト復元による作業継続性の向上

READMEの鮮度を保つことが、Claude Codeとの開発効率を大きく左右します。

他のアプローチとの比較

アプローチ タイミング トークン消費 用途
UserPromptSubmit 毎回 ルール強制
Subagent品質チェック コード生成後 品質担保
matcher: "compact" compact後のみ 最小限 コンテキスト復元

効果

この方法を導入してから:

  • コンパクティング後もルールが確実に守られる
  • 「ルール読んで」と言う必要がなくなった
  • READMEの内容を踏まえた正確な回答が得られる
  • 穏やかな開発体験が実現

まとめ

  • SessionStartフックのmatcher: "compact"でコンパクティング後のみ発火
  • stdoutに出力した内容がClaudeのコンテキストに追加される
  • ルールだけでなくREADMEも注入することで、プロジェクト理解を維持
  • トークン消費を最小限に抑えつつ、ルールの再認識を強制できる

ぜひお試しください。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?