AIコーディング 2026.05.05
CLAUDE.mdの書き方【Claude Code設定ファイル完全ガイド】
CLAUDE.mdとは「AIへの引き継ぎメモ」
Claude Codeが毎回セッション開始時に自動で読み込む設定ファイルです。一度書いておけば、毎回同じプロジェクト説明をAIに繰り返す必要がなくなります。
Before(CLAUDE.mdなし):
毎セッション: 「TypeScriptで書いてください、anyは使わないでください、
Prismaでクエリを...」 → 5分の説明
After(CLAUDE.mdあり):
セッション開始即座に作業開始
→ Claude Codeが設定を自動読み込み
基本テンプレート(コピペして使えます)
# CLAUDE.md
# このファイルはClaude Codeが自動で読み込みます
## プロジェクト概要
[プロジェクト名]: [一行説明]
技術スタック:
- Frontend: [フレームワーク + バージョン]
- Backend: [フレームワーク + バージョン]
- DB: [データベース名]
- インフラ: [デプロイ先]
## コーディングルール
- TypeScript: strict: true を維持する
- 型: any 禁止、不明な型は unknown を使う
- スタイル: [スタイルガイドへのリンク]
- テスト: [テスト方針]
## 禁止操作
- git push --force は絶対にしない
- APIキーやシークレットをコードに直書きしない
- .env ファイルをgitにコミットしない
- production DB への直接接続は禁止
## よく使うコマンド
- 開発サーバー起動: npm run dev
- テスト実行: npm test
- 型チェック: npm run type-check
## 現在の作業状況
- ✅ 完了: [機能名]
- 🔄 進行中: [機能名]
- ⏳ 未着手: [機能名]
Next.js + Prisma向け実践テンプレート
# CLAUDE.md
## プロジェクト概要
ECサイト「MyShop」: Next.js 14 + TypeScript + Prisma + PostgreSQL
デプロイ: Vercel + Vercel Postgres
## 技術スタック
- Next.js 14 (App Router) - Pages Routerは使わない
- TypeScript strict mode
- Prisma ORM(生のSQL禁止)
- Tailwind CSS + shadcn/ui
- Auth.js(認証)
- Zod(バリデーション)
## コーディングルール
### TypeScript
- `any` 型を一切使わない → `unknown` を使う
- エクスポートされる関数の引数・戻り値の型を明示する
- Props は interface で定義する
### Next.js
- デフォルトはServer Component
- `"use client"` は useState・イベントハンドラが必要な場合のみ
- `<img>` → `next/image` / `<a>` → `next/link`
### Server Actions
- 最初に認証チェック(middleware に依存しない)
- 全入力は Zod でバリデーション
- 変更後は revalidatePath / revalidateTag でキャッシュ更新
### Prisma
- `$queryRaw`(生SQL)は使用前にユーザーに確認
- スキーマ変更は migrate dev でマイグレーションファイルを生成
- `prisma db push` は開発初期のみ
## 禁止操作(実行前に必ず確認)
- git push --force
- git reset --hard
- rm -rf(対象と影響範囲を明示してから確認)
- DROP TABLE / TRUNCATE
- .env ファイルのコミット
CLAUDE.mdをAPIで自動検証する
# validate_claude_md.py
# CLAUDE.mdの必須セクションが揃っているか自動検証する
import anthropic
from pathlib import Path
client = anthropic.Anthropic()
REQUIRED_SECTIONS = [
"プロジェクト概要",
"コーディングルール",
"禁止操作",
]
def validate_claude_md(file_path: str = "CLAUDE.md") -> dict:
"""CLAUDE.mdの品質をClaude APIで検証する"""
content = Path(file_path).read_text()
missing = [s for s in REQUIRED_SECTIONS if s not in content]
if missing:
return {"status": "incomplete", "missing": missing}
response = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=256,
messages=[{
"role": "user",
"content": f"""以下のCLAUDE.mdを評価してください。
評価観点:
1. 明確さ(1-10): ルールが明確に書かれているか
2. 完全性(1-10): 必要な情報が網羅されているか
3. 改善点: 3点以内で具体的に指摘してください
CLAUDE.md:
{content[:2000]}"""
}]
)
cost = (response.usage.input_tokens * 0.80 + response.usage.output_tokens * 4.00) / 1_000_000
return {
"status": "complete",
"feedback": response.content[0].text,
"cost_usd": round(cost, 5)
}
result = validate_claude_md()
print(f"ステータス: {result['status']}")
if result["status"] == "incomplete":
print(f"不足セクション: {result['missing']}")
else:
print(f"フィードバック:\n{result.get('feedback', '')}")
print(f"検証コスト: ${result.get('cost_usd', 0):.5f}")