先日、チームメンバーから「Claudeに同じ指示を毎回繰り返している気がする」と相談を受けました。Xを開けば毎日のようにClaude Codeの新しい使い方が流れてきますが、しっかり腰を据えて勉強する時間はなかなか取れないですよね。

私自身、Claude Codeを使い始めた頃は「TypeScriptのstrict modeを守って」「anyを使わないで」と毎セッション言い続けて疲弊していました。しかし CLAUDE.md の設計パターンを整えてからは、ほとんど指示を繰り返すことなく、自分の規約通りのコードが返ってくるようになりました。

本記事では、CLAUDE.md の階層構造の使い分けからモジュール分割、Why付きルールの書き方まで、実プロジェクトで効いた設計パターンを具体例とともに公開します。

記事末尾には「これだけ送ればOK」なコピペ用プロンプトも置いているので、忙しい方はそれを送るだけでも大丈夫です。

CLAUDE.mdの3階層

図: CLAUDE.mdの3階層

1. CLAUDE.mdの階層構造を理解する

CLAUDE.md は、Claude Codeがセッション開始時に自動で読み込むマークダウン形式の指示書です。読み込まれる優先順位は以下のとおりです。

  1. ~/.claude/CLAUDE.md — ユーザーグローバル(全プロジェクト共通)
  2. プロジェクトルートの CLAUDE.md — チーム共有
  3. サブディレクトリの CLAUDE.md — その配下で作業中のみ有効

この階層を意識せずに全部プロジェクトルートに書いてしまうのが、よくあるアンチパターンです。グローバルには言語や好みなど普遍的なルールを、プロジェクトには技術スタックや命名規則を、サブディレクトリにはモジュール固有の注意点を置くのが基本パターンとされています。

私の場合、~/.claude/CLAUDE.md には「日本語で応答する」「不明点は推測せず確認する」など全プロジェクト共通のルールだけを置き、プロジェクトごとの具体ルールはルート配下の CLAUDE.md に分けています。

2. トークン効率を意識した記述

CLAUDE.md の中身はすべて毎回コンテキストに乗ります。冗長な説明はトークンを浪費し、重要な指示が薄まる原因になります。推奨されているのは**「箇条書き中心・命令形・1行1ルール」**のスタイルです。

悪い例:

このプロジェクトではTypeScriptを使っているのですが、
なるべくstrict modeを有効にしておきたいと考えています。
また、anyを使うのはできれば避けてほしいです。

良い例:

## TypeScript
- strict mode必須
- `any`禁止(やむを得ない場合は`unknown`+型ガード)
- 型インポートは`import type`を使用

後者は約1/3のトークンで同じ情報を伝えられます。500行を超える CLAUDE.md はアンチパターンとされており、肥大化した場合は次のセクションのモジュール分割が有効です。

CLAUDE.mdの書き方ビフォーアフター

図: CLAUDE.mdの書き方ビフォーアフター

3. モジュール分割パターン

大規模プロジェクトでは、ルールをカテゴリごとに分割し、CLAUDE.md から参照する方法が一般的です。

# MyProject

## Stack
- Next.js 16 (App Router) / TypeScript / Tailwind v4
- Supabase (DB + RLS)
- Vercel (Deploy + Cron)

## Rules
詳細ルールは以下を参照:
- `docs/rules/typescript.md`
- `docs/rules/testing.md`
- `docs/rules/security.md`

## Architecture
- `lib/fetchers/` — 外部データ収集
- `lib/ai/` — Claude API呼び出し
- `app/api/cron/` — Vercel Cronエンドポイント

Claude Codeは必要に応じて参照先ファイルを Read ツールで開きにいきます。常時ロードする情報は最小限にし、詳細はオンデマンドで読ませる設計が、トークン効率と網羅性を両立させるコツです。

4. 命令の粒度と「Why」の明示

中級者がやりがちな失敗が、ルールを書くだけで「なぜそうするか」を書かないことです。理由を添えると、Claudeは想定外のエッジケースでも適切に判断できます。

## DBアクセス
- 生SQLは禁止、Supabaseクエリビルダーを使用
  - 理由: SQLインジェクション対策とRLSの確実な適用
- joinの型キャストは `as unknown as { ... }` パターンを使用
  - 理由: Supabase型生成器がjoin結果を正しく推論できないため

「禁止」「必須」だけでは、Claudeが例外判断を求められた際にユーザーへの確認が増えます。理由まで書くと自律性が上がり、結果的にやり取り回数が減ります。

CLAUDE.md設計の手順

図: CLAUDE.md設計の手順

5. 実践テンプレート

以下は実プロジェクトでそのまま使えるテンプレートです。

# プロジェクト名

一行で何のプロジェクトか説明する。

## Stack
- 言語/フレームワーク(バージョン明記)
- DB / 認証 / デプロイ先
- 主要な外部API

## Architecture
- ディレクトリ構造を3-7行で
- 各ディレクトリの責務

## Conventions
- 命名規則(ファイル/変数/型)
- インポートパス規約
- エラーハンドリング方針

## Commands
- `npm run dev` — 開発サーバー
- `npm run test` — テスト実行
- `npm run lint` — Lint

## Don'ts
- してほしくないこと(理由付き)
- 過去にハマった罠

## Notes
- 進行中の移行作業
- 既知の技術的負債

この構造の強みは、新しくチームに入ったメンバーがオンボーディング資料としても読める点です。AI向けと人間向けのドキュメントを兼用できるのが、よく設計された CLAUDE.md の特徴と言えます。

6. メンテナンスとアンチパターン

CLAUDE.md は「書いて終わり」ではなく、プロジェクトの成長に合わせて更新が必要です。私の場合、週次の振り返りで「今週Claudeに何回同じ指示をしたか」を見直し、3回以上繰り返した指示は CLAUDE.md に追加するルールにしています。

アンチパターンとしてよく見るのは以下です。

  • ポエム化: 思想や背景を長文で書き、ルールが埋もれる
  • 重複: グローバルとプロジェクトに同じルールが書かれている
  • 古い情報: 既に廃止したライブラリの注意書きが残っている
  • 過剰な禁止: 「〜は使わない」だけが並び、代替案がない

これらを避けるだけでも、Claudeの応答品質は目に見えて変わります。

🎁 特典: コピペ用プロンプト集

既存プロジェクトの CLAUDE.md をClaude自身に作らせるプロンプトです。プロジェクトルートで Claude Code を起動し、そのまま貼り付けてください。

あなたはClaude Code向けのCLAUDE.md設計の専門家です。
以下の手順でこのプロジェクト用の最適なCLAUDE.mdを設計してください。

1. プロジェクトルートのpackage.json, tsconfig.json, README, 主要ディレクトリ構成を読む
2. 技術スタック・ディレクトリ責務・命名規則・スクリプトコマンドを抽出する
3. 以下のテンプレート構造でCLAUDE.mdを生成する:
   - # プロジェクト名 + 一行説明
   - ## Stack(バージョン明記)
   - ## Architecture(ディレクトリ責務)
   - ## Conventions(命名・インポート・エラー処理)
   - ## Commands(dev/test/lint等)
   - ## Don'ts(禁止事項 + 理由)
   - ## Notes(進行中の移行・技術的負債)
4. 1行1ルール・命令形・箇条書き中心で記述する
5. 各禁止/必須ルールには必ず「理由:」を添える
6. 全体で200行以内に収める。超える場合はdocs/rules/配下に分割案を提示する
7. 既存CLAUDE.mdがある場合は差分のみ提示し、上書き前に確認を求める

📚 参考リファレンス