AIコーディング 2026.04.18

Claude Code CLAUDE.md完全ガイド【2026年版】プロジェクト制約の設定・フォーマット・ベストプラクティス

タグ:Claude Code / CLAUDE.md / プロジェクト設定 / AIエージェント / ベストプラクティス

CLAUDE.mdとは

Claude Codeがプロジェクトで作業を始める前に自動で読み込む設定ファイルです。プロジェクトのルールをここに書くことで、全てのClaudeセッションで一貫したコーディングスタイルと制約が適用されます。

プロジェクト構造:
my-project/
├── CLAUDE.md          ← Claude Codeが自動で読み込む
├── AGENTS.md          ← 他のAIエージェントも読む(任意)
├── src/
│   └── CLAUDE.md      ← サブディレクトリ固有のルール(任意)
└── ...

グローバル設定:
~/.claude/CLAUDE.md    ← 全プロジェクトに適用

基本テンプレート(コピペして使える)

<!-- CLAUDE.md -->
# プロジェクト設定

## 技術スタック
- Python 3.11 / FastAPI 0.110 / PostgreSQL 16
- テスト: pytest 8.x + coverage
- コードフォーマット: black + isort + mypy (strict)
- パッケージ管理: uv

## 絶対禁止操作
- `production/` フォルダのファイルを変更しない
- データベースに生SQL($queryRaw)を使わない(Prismaクライアントのみ)
- APIキー・シークレットをコードに直接書かない
- 既存のテストを削除しない

## 変更前に確認が必要なもの
- src/core/ 以下のファイル(アーキテクチャに影響する)
- pyproject.toml の依存関係(バージョン変更)
- alembic/ のマイグレーションファイル

## コーディングルール
- 型ヒントを全関数に付ける(mypy strictを通すこと)
- `any` / `Any` 型を使わない(`Unknown` を使う)
- コメントは「なぜ」を書く(「何をするか」はコードを読めばわかる)
- 関数は20行以内を目安にする

## テストルール
- 変更後は必ず `pytest` を実行する
- 新しい機能には必ずテストを書く
- カバレッジを下げる変更は原則禁止

## 不確かな場合の行動
- 仕様が曖昧な場合は「確認: 〇〇をどう実装するか」と質問する
- 既存の動作を変える可能性がある場合は先に報告する

AIが無視しないための書き方のコツ

<!-- ❌ 無視されやすい書き方 -->
なるべくanyを使わないでください。

<!-- ✅ 守られやすい書き方 -->
## 絶対ルール(必ず守ること)
- `any` 型を**使ってはいけない**。代わりに `unknown` を使う
- 違反している既存コードを見つけた場合も、直さずにそのまま残す

CLAUDE.mdの内容をsystemプロンプトに組み込む

# claude_md_enforcer.py
# CLAUDE.mdを読み込んでAPIリクエストのsystemに追加する

import os
from pathlib import Path
import anthropic

client = anthropic.Anthropic()

def load_claude_md(directory: str = ".") -> str:
    """ディレクトリ階層を遡ってCLAUDE.mdを探す"""
    current = Path(directory).resolve()
    rules = []
    
    while current != current.parent:
        claude_md = current / "CLAUDE.md"
        if claude_md.exists():
            rules.insert(0, f"# {claude_md} からのルール\n{claude_md.read_text()}")
        current = current.parent
    
    # グローバル設定
    global_md = Path.home() / ".claude" / "CLAUDE.md"
    if global_md.exists():
        rules.insert(0, f"# グローバルルール\n{global_md.read_text()}")
    
    return "\n\n".join(rules)

def guarded_ask(question: str, project_dir: str = ".") -> str:
    """CLAUDE.mdのルールを強制適用してAPIを呼ぶ"""
    rules = load_claude_md(project_dir)
    
    system = f"""あなたはコーディングアシスタントです。

## 重要:以下のルールを必ず守ってください
{rules}

ルールに違反しそうな場合は、実行前に「確認: [何をするか]をしていいですか?」と聞いてください。"""
    
    response = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=2048,
        system=system,
        messages=[{"role": "user", "content": question}]
    )
    return response.content[0].text

# 使用例
answer = guarded_ask(
    "src/utils.pyのデータベース接続コードをリファクタリングして",
    project_dir="/path/to/my-project"
)
print(answer)

フォルダ別のCLAUDE.md(サブディレクトリ設定)

<!-- src/api/CLAUDE.md -->
# APIレイヤー固有のルール

このディレクトリの全エンドポイントに適用:
- 全ての入力をZodでバリデーションする
- 認証チェックを関数の最初に行う(middleware任せにしない)
- レスポンスは必ず型定義通りの形式にする
- エラーは400/401/403/404/500の5種類に分類する

あわせて読みたい

参考ソース