これからはじめるClaude Code入門

知っているようで知らないCLAUDE.mdを深掘りする

「Claude Code」は、CLI上で動くLLMによるAIエージェントツールです。本連載は12月5日に発売されたClaude CodeによるAI駆動開発入門に書ききれなかった応用的な内容や最新のアップデートについて解説します。書籍をあわせて読むとさらに理解が深まることでしょう。

今回は知っているようで知らない、Claude CodeのCLAUDE.mdについて深掘っていきます。

CLAUDE.mdとは記憶である

前提としてClaude Codeは、立ち上げた際、つまりセッション間で、そのコードベースやユーザーとの過去のやり取りを基本的に覚えていません。しかしセッションを立ち上げるたびに、膨大なコードベースを毎回走査して理解していくのも現実的ではありません。

そのため、コードやルールなどを理解する起点として存在しているのがCLAUDE.mdです。

これはエンジニアにとってのREADMEに近いイメージで、Claudeにとって外部記憶領域として存在しているファイルがCLAUDE.mdとなります。

CLAUDE.mdの中身

CLAUDE.mdはClaudeに対するオンボードパッケージであると理解するのがよいと思います。その役割を考えれば、必然的にCLAUDE.mdに記載すべき内容は以下のような内容になります。

CLAUDE.MDに記載する内容の例
  • コードベースの概要
  • 使用技術やライブラリ
  • インフラ構成
  • コード規約やルール
  • テスト規約

これらを人力で記述していくこともできますが、基本的には対話モードで用意された/initコマンドを実行してClaudeに一旦作ってもらうのが一般的かつ網羅的なやり方です。

/init

このコマンドを実行すると、Claudeがプロジェクトの構造を分析し、CLAUDE.mdを生成してくれます。生成されるテンプレートには、プロジェクトの概要、使用技術、ディレクトリ構造などが含まれます。

もちろん、生成されたテンプレートはあくまで出発点です。プロジェクトは成長・変遷していくものなので、固有のルールや規約、チームに合わせてCLAUDE.mdを育てて行くことが重要です。

何もしないままだとClaudeにうっかり古い情報を渡し続けてしまうことになりますので注意が必要です。

CLAUDE.mdの読み込まれるタイミング

CLAUDE.mdが読み込まれるタイミングは、セッション開始のタイミングのみです。

つまりclaudeコマンドで対話モードを立ち上げたり/clearコマンドで新たにセッションを立ち上げた時にClaudeのコンテキストに保持されます。

ですので、コードの大きな変更の都度、ユーザーがCLAUDE.mdをメンテナンスしていくことは大事ですが、もしセッションの途中で記載内容の大幅な変更を行った場合はそれを教え込む必要があります。

特に重大な変更の場合は/clearでセッションを新たにロードするか「CLAUDE.mdを読んで、変更点を確認して」などと伝えるとコンテキストにロードしてくれます。

階層的な配置

巨大なコードベースになればなるほど、CLAUDE.mdに記載すべき内容は増えていきます。一つのプロジェクトルートのCLAUDE.mdファイルにすべてを詰め込むと、可読性が低下するだけでなく、コンテキストウィンドウを圧迫してしまいます。

そこでClaude Codeでは、サブディレクトリにもCLAUDE.mdを配置することができます。

project/
├── CLAUDE.md              # プロジェクト全体の設定
├── frontend/
│   └── CLAUDE.md          # フロントエンド固有の設定
└── backend/
    └── CLAUDE.md          # バックエンド固有の設定

Claude Codeは再帰的にこれらのファイルを読み込み、コンテキストとして解釈に含めます。これにより、フロントエンドの作業中はフロントエンド固有のルールが、バックエンドの作業中はバックエンド固有のルールが適用されるようになります。

また、ユーザー自身が動かすすべてのClaude Codeにルールを適用したい場合は、ホームディレクトリ配下の以下のパスにCLAUDE.mdを配置できます。

~/.claude/CLAUDE.md

このグローバルなCLAUDE.mdは、どのプロジェクトで作業していても常に読み込まれます。⁠コミットメッセージは日本語で書いてほしい」といった、プロジェクト横断的な個人の好みを記載するのに最適です。

階層ファイルの読み込みタイミングとLazyLoad

先ほどプロジェクトルートのCLAUDE.mdはセッション開始時、と述べました。

しかし、この階層構造において、CLAUDE.mdの読み込みには2つのパターンがあります。

起動時に読み込まれるもの:
/
├── ~/.claude/CLAUDE.md    ← グローバル設定(読み込まれる)
└── ~/project/
    ├── CLAUDE.md          ← プロジェクトルート(読み込まれる)
    └── src/
        └── CLAUDE.md      ← サブディレクトリ(まだ読み込まれない)

現在のワーキングディレクトリから上位方向(ルートディレクトリに向かって)に存在するCLAUDE.mdは、セッション開始時に一括で読み込まれます。

遅延読み込みされるもの:
~/project/
├── CLAUDE.md              ## ← 起動時に読み込み済み
├── frontend/
│   └── CLAUDE.md         ## ← frontend/内のファイルを触った時に読み込み
└── backend/
    └── CLAUDE.md          ## ← backend/内のファイルを触った時に読み込み

一方、下位方向(サブディレクトリ)にあるCLAUDE.mdは、そのディレクトリ内のファイルをClaudeが読み取った時点で初めて読み込まれます。

この遅延読み込みの仕組みにより、巨大なモノレポ[1]でも必要な時に必要な情報だけがコンテキストに追加され、コンテキストウィンドウを効率的に活用できます。

現在どのCLAUDE.mdが読み込まれているかは、/memoryコマンドで確認できます。

/memoryコマンドの実行結果
│ Select memory to edit:                                                                                           │
│                                                                                                                  │
│  ❯ 1. User memory             Saved in ~/.claude/CLAUDE.md                                                       │
│    2. Project memory          Checked in at ./CLAUDE.md                                                          │
│    3. L doc/ER_DIAGRAM.md     @-imported                                                                         │
│    4. L doc/SCREEN_DESIGN.md  @-imported                                                                         │
│    5. L doc/API_SCHEME.md     @-imported    

CLAUDE.local.mdによる個人用設定の分離

チーム開発において、CLAUDE.mdはGitで共有される設定ファイルです。しかし、個人の開発環境に固有の設定(ローカルのテストサーバーURL、個人用のAPIキーの場所、好みのエディタ設定など)をCLAUDE.mdに書いてしまうと、他のメンバーに影響を与えてしまいます。

この問題を解決するために、Claude CodeではCLAUDE.local.mdという仕組みが用意されています。

settings.json設定ファイルにもチーム共有のためのGit管理されるsettings.jsonと、個人設定のためのsettings.local.jsonが両方存在しているので、お馴染みな方も多いでしょう。

project/
├── CLAUDE.md              # チーム共有(Git管理)
├── CLAUDE.local.md        # 個人用(.gitignoreに自動追加)
└── .claude/
    ├── settings.json      # チーム共有
    └── settings.local.json # 個人用(.gitignoreに自動追加)

CLAUDE.local.mdはプロジェクトルートに配置でき、個人の環境固有の設定を保存できます。重要なのは、このファイルは.gitignoreに自動的に追加されるため、Gitにコミットされる心配がありません。

例えば、以下のような内容をCLAUDE.local.mdに記載できます。

CLAUDE.local.mdの記載例
# 個人環境設定

- ローカルの開発サーバーは http://localhost:3000 で動作している
- テスト用のDBはDockerで localhost:5432 に起動している
- APIのモックサーバーは ./mocks/server.js を使用

# 個人的な設定

- コードの説明は日本語でお願いします
- コミットメッセージも日本語で書いてください

ただしGit管理されないことで履歴を追いづらかったり、うっかり変更や削除してしまうと後追いができません。

また共有のCLAUDE.mdほどメンテナンスが行き届かないことが多く、保守性が悪くなりがちなので、そこはプロジェクトの大きさや、どれほど個人管理や個別の設定を教えておくことが重要かどうかを適宜考えて利用してください。

ファイル参照機能

CLAUDE.mdファイル内では、@記法を使って他のファイルをインポートできます。

@記法の例
詳細な仕様はこちら @docs/SPECIFICATION.md
DBのスキーマはこちら @schema/DB.md

これにより、複数の情報を分散管理しながら、必要に応じて参照させることができます。例えば、詳細なAPI仕様書やデータベーススキーマなど、それ自体が独立したドキュメントとして管理されているファイルを、CLAUDE.mdから参照する形で取り込めます。

インポートには相対パスと絶対パスの両方が使えます。

@docs/api-spec.md                    # 相対パス
@~/.claude/common-rules.md           # ホームディレクトリからの絶対パス

また、インポートされたファイルの中からさらに別のファイルをインポートすることも可能です。これにより、ドキュメントをモジュール化して管理できます。

ただし注意点があります。`@docs/SPECIFICATION.md`のようにコードスパン(バッククォート)で囲んだ場合や、コードブロック内に記載した場合は、インポートとして評価されません。

これは、@anthropic-ai/claude-codeのようなnpmパッケージ名や、Pythonのデコレータ記法との衝突を避けるための仕様です。

個人的な経験ではClaude Code自身にCLAUDE.mdを書かせた際にバッククオート``で囲んでしまい自動ではコンテキストに展開されなかったことがありますので注意してください(ただし必要に応じてLLMが自己判断でロードしてくれる可能性はあります⁠⁠。

またファイル参照が便利だからといって、特にプロジェクトルートに全ての仕様を詰め込むと肥大化してしまいがちです。

CLAUDE.mdが肥大化してくると、Claude Codeの立ち上げ時に⚠ Large CLAUDE.md will impact performanceという警告が出るようになります。

そういった時は上述したディレクトリ分けによる遅延読み込みや、これからお伝えするrulesで分割することにしてください。

.claude/rulesディレクトリ

2025年12月のアップデートで、CLAUDE.mdファイルに加えて.claude/rulesディレクトリという新しい仕組みが導入されました。

your-project/
├── .claude/
│   ├── CLAUDE.md           # メインのプロジェクト設定
│   └── rules/
│       ├── code-style.md   # コーディングスタイルのルール
│       ├── testing.md      # テストに関する規約
│       └── security.md     # セキュリティ要件

これまでは一つのCLAUDE.mdファイル、あるいはサブディレクトリごとのCLAUDE.mdファイルでルールを管理していましたが、.claude/rulesディレクトリを使うことで、上記のようにユーザーが任意の名前をつけることで、関心ごとにルールファイルを分割して管理できるようになりました。

さらに強力なのが、pathsディレクティブです。各ルールファイルのフロントマターにpathsフィールドを記載することで、Globパターンに基づいた、特定のファイルパターンにのみルールを適用できます。

以下はその例です。

pathsディレクティブの記載例
---
paths: src/**/*.{ts,tsx}
---

# TypeScript/Reactのコーディングルール

- コンポーネントは関数コンポーネントで記述すること
- PropsにはTypeScript型定義を必ず付けること

またPathsはカンマ区切りで複数のパスパターンを指定することも可能です。

---
paths: {src,lib}/**/*.ts, tests/**/*.test.ts
---

これにより、ディレクトリ構造に依存せず、ファイルの種類や用途に応じてきめ細かくルールを適用できるようになりました。

さらに.rules配下のメモリーファイルの特徴として、シンボリックリンクがサポートされています。

# 共有のルールファイルからシンボリックリンクを貼ってプロジェクトに適応させる
ln -s ~/shared-rules .claude/rules/shared

# 組織で統一したルールをプロジェクトに適応させる
ln -s ~/company-rule/security.md .claude/rules/security.md

シンボリックリンクでの管理は上手に使わないと逆に煩雑になる事もありますが、特定のルールなどを統一しておきたい、再利用したい場合などに便利です。

なお、CLAUDE.mdに関しては特にサポートは明言されていません。

CLAUDE.mdの指示が無視される理由

ここまでCLAUDE.mdの機能について説明してきましたが、実際に使っていると「書いた指示が無視される」という経験をされた方も多いのではないでしょうか。

おそらくコミュニティで調査されている内容から総括すると、Claude CodeはCLAUDE.mdの内容に関して「関連するものだけを読み込め」という指示を受けている可能性が指摘されています。

これは公式ドキュメントに記載されている一次情報ではありませんが、HumanLayerというAIスタートアップの技術ブログや、データサイエンティストのJannes Klaas氏のブログで、それぞれClaude Codeの通信をプロキシで解析して発見したと報告されています。GitHubのIssue#7571にも同様の報告が上がっています。

具体的に言うと、CLAUDE.mdをシステムプロンプトに含める際に、以下のようなプロンプトを付加しているようです。

<system-reminder>
IMPORTANT: this context may or may not be relevant to your tasks.
You should not respond to this context unless it is highly relevant to your task.
</system-reminder>

日本語訳:「重要:このコンテキストはあなたのタスクには関係するかもしれないし、関係ないかもしれない。あなたはこのコンテキストがあなたのタスクに高度に関連していない限り、反応する必要はない」

つまり、Claudeは「この指示は今のタスクにとても関連する場合にのみ従ってください」と明言されているため、全てをユーザーの指示通りには受け取っていません。

関連性が低いと判断した指示は無視してしまう事があると考えられるのです。

この意図ははっきり明言されていませんが、おそらくコンテキストの効率化や精度向上のためのチューニングのためであろうとは言われています。

必要な関連情報だけを優先して理解できるようにした方がClaude Codeの動作にとって都合が良かったのだろうと思います。

Cursorのrules[2]のようにメモリーファイル自体にその適応度を指示できる機能が付く日を心待ちにしています。

指示を確実に守らせるには

しかし例えばLintチェックや、重要な規約チェックなどは守ってくれないと困ることがあります。

では、どうすれば指示を確実に守らせることができるでしょうか。

まずCLAUDE.mdに記述する方法としては、Claudeに「この指示は今の作業に関連している」と認識させることです。

例えば下記のような記述です。

CLAUDE.mdへの記載例
# テストコード作成時の厳守事項

テストを書く際は以下を必ず守ってください:
- テストは必ず実際の機能を検証すること
- `expect(true).toBe(true)` のような意味のないアサーションは書かない

「テストコード作成時の」という条件を明示することで、テストを書く際にこの指示が適用されることをClaudeに認識させます。

settings.jsonのinstructionsの活用

それでも無視される場合は、.claude/settings.jsoninstructionsフィールドに記載する方法があります。

{
  "instructions": "TypeScript/JavaScriptファイルを作成・編集した後は、必ずlintチェックを実行すること",
  "permissions": {
    "allow": [
      "Bash(npm run lint:*)"
    ]
  }
}

CLAUDE.mdのように網羅的に書かせることは難しいですが、settings.jsonに記載された指示は、CLAUDE.mdとは異なる形でClaudeに渡されるため、より確実に守られる傾向があります。

遅延読み込みによるコンテキスト効率化(非公式)

最後に、公式ドキュメントには記載されていない内容ですが、 段階的開示(Progressive Disclosure)というテクニックをご紹介します。

前述したHumanLayerのブログで紹介されていた手法です。あえて@によるインポートを使わず、Claudeに必要な時にファイルを読ませることでコンテキストを節約しながら効率的に活用します。

例えば下記のようなものです。

# テスト規約

テストを書く際は ./docs/test_define.md を参照してください

このように書くことで、Claudeがテストを書こうとした時に自発的にファイルを読みに行くことが期待出来ます。

前述のrulesの仕組みではファイルの拡張子やディレクトリベースのみですが、⁠やろうとしていること」ベースでルールを読み込ませることができ、コンテキストの節約と効率化が出来ます。

まとめ

CLAUDE.mdの基礎知識から応用編までお伝えしました。CLAUDE.mdはClaudeを使いこなす上で非常に重要な設定ファイルです。ぜひ皆さんも自分なりのCLAUDE.mdを育てていってください。

次回は、セキュリティ対策とエンタープライズ企業への導入について、筆者が実際に取り組んでいることをお話しできればと思います。お楽しみに!

イベントAIツール導入時のポイントを抑え⁠安心して取り組むAI駆動開発

平川さんが登壇するFindy様主催のオンラインイベント【1月30日(金⁠⁠】に開催されます。

平川さんが執筆したClaude CodeによるAI駆動開発入門の内容を紹介しつつ、AIツール導入の際の抑えるべきポイントや実際に平川さんが現場で取り組まれているAIツール導入の事例をお話しします。⁠AIコーディングエージェントやAIツールを採用した開発の設計について知見を得たい」⁠⁠AIコーディングエージェントやAIツールを導入する際の抑えるべき観点を知りたい」と考えている方におすすめの無料イベントです。

なお、参加には事前にconnpassでの登録が必要です。皆様、ぜひご参加ください。

おすすめ記事

記事・ニュース一覧