AIコーディング 2026.04.23
Claude Codeコンテキスト管理5ステップ【2026年版】セッション間で説明を繰り返さない設定方法
なぜコンテキスト管理が必要か
Claude Codeは新しいセッションを開始するたびに会話履歴がリセットされます。毎回「このプロジェクトはNext.js + Prismaで…」と説明するのは時間の無駄です。正しく設定すれば、説明ゼロで作業を再開できます。
コンテキスト引き継ぎの仕組み
Claude Codeが起動時に読む情報(永続):
~/.claude/CLAUDE.md ← グローバル設定
プロジェクトルート/CLAUDE.md ← プロジェクト設定
src/CLAUDE.md ← サブディレクトリ設定
セッション中のみ(リセットされる):
会話の内容(プロンプト・回答)
コンテキストウィンドウ上の情報
Step 1: CLAUDE.mdにプロジェクトコンテキストを書く
<!-- CLAUDE.md(プロジェクトルート) -->
# プロジェクトコンテキスト
## 技術スタック
- Next.js 15 (App Router) / TypeScript 5.4 / Prisma 6 / PostgreSQL 16
- スタイリング: Tailwind CSS 3 + shadcn/ui
- テスト: Vitest + Playwright
## アーキテクチャ
- src/app/ … ルーティング(App Router)
- src/components/ … UIコンポーネント
- src/lib/ … ユーティリティ・API呼び出し
- src/server/ … Server Actions・DB操作
## 現在の作業
- メインブランチ: main / 作業ブランチ: feature/user-auth
- 優先タスク: Auth.jsを使ったGoogle OAuth実装
- 既知の問題: Prismaのコネクションプール設定が未完了(本番前に要対応)
Step 2: セッション開始時のコンテキスト確認スクリプト
# context_setup.py
# 新しいClaudeセッション開始時に現在の状態を一括確認する
import subprocess
import os
from pathlib import Path
def get_project_context() -> str:
"""プロジェクトの現在状態をまとめて取得する"""
lines = []
# Gitの状態
try:
branch = subprocess.check_output(["git", "branch", "--show-current"], text=True).strip()
status = subprocess.check_output(["git", "status", "--short"], text=True).strip()
recent = subprocess.check_output(["git", "log", "--oneline", "-5"], text=True).strip()
lines.append(f"## Gitブランチ: {branch}")
if status:
lines.append(f"変更ファイル:\n{status}")
lines.append(f"最近のコミット:\n{recent}")
except subprocess.CalledProcessError:
pass
# CLAUDE.mdの内容
claude_md = Path("CLAUDE.md")
if claude_md.exists():
lines.append(f"\n## CLAUDE.md:\n{claude_md.read_text()[:1000]}")
# MEMORY.mdがあれば追加
memory_md = Path("MEMORY.md")
if memory_md.exists():
lines.append(f"\n## 引き継ぎメモ:\n{memory_md.read_text()[:500]}")
return "\n".join(lines)
print(get_project_context())
# このスクリプトの出力をClaudeへの最初のメッセージに使う
Step 3: プロファイルで複数プロジェクトを切り替える
# ~/.claude/config.toml に複数プロファイルを設定
[profile.work]
api_key = "sk-ant-work-xxxxx"
model = "claude-sonnet-4-5"
[profile.personal]
api_key = "sk-ant-personal-xxxxx"
model = "claude-haiku-4-5-20251001"
[profile.client-a]
api_key = "sk-ant-client-xxxxx"
model = "claude-opus-5"
# プロジェクトごとに切り替えて起動
claude --profile work # 仕事用プロジェクト
claude --profile personal # 個人用プロジェクト
claude --profile client-a # クライアントA案件
Step 4: /compactでコンテキストを節約する
長いセッションの途中でコンテキストが減ってきたら:
> /compact
Claude Codeが自動的に:
1. これまでの会話を要約する
2. 重要な決定事項・変更点を保持する
3. トークンを節約して作業を続行する
コンテキストウィンドウの残量確認:
> /status
Step 5: MEMORY.mdで引き継ぎメモを管理する
<!-- MEMORY.md(自分でメンテナンスする引き継ぎメモ) -->
# 作業メモ(最終更新: 2026-08-19)
## 決定事項
- 認証: Auth.js v5(NextAuth.js改名)を使用 → JWT戦略
- DB接続: Prisma Accelerate経由(コネクションプール対応)
- デプロイ: Vercel(プレビューURL: https://staging.example.com)
## 未解決の問題
- [ ] Prisma Accelerateの接続URLを本番環境変数に追加(期限: 今週中)
- [ ] StripeのWebhookシークレットを設定(期限: 来週)
## よく使うコマンド
- テスト: `pnpm test:unit`
- DB操作: `pnpm db:studio`
- 型チェック: `pnpm typecheck`
# claude_with_context.py
# CLAUDE.md + MEMORY.md をシステムプロンプトに組み込んでAPIを呼ぶ
import anthropic
from pathlib import Path
import os
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
def load_context(project_dir: str = ".") -> str:
"""プロジェクトのコンテキストファイルを読み込む"""
files = ["CLAUDE.md", "MEMORY.md"]
parts = []
for filename in files:
path = Path(project_dir) / filename
if path.exists():
parts.append(f"## {filename}\n{path.read_text()}")
return "\n\n".join(parts)
def ask_with_context(question: str, project_dir: str = ".") -> str:
"""プロジェクトコンテキストを持ってAPIを呼ぶ"""
context = load_context(project_dir)
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
system=f"あなたはコーディングアシスタントです。\n\n{context}",
messages=[{"role": "user", "content": question}]
)
return response.content[0].text
# 使用例 - CLAUDE.mdを読んでいるので説明不要
answer = ask_with_context("Prismaのコネクションプール問題を解決するコードを書いて")
print(answer)