CLAUDE.md の書き方:ユーザー・プロジェクト・ディレクトリの 3 階層と実例テンプレート

Claude Code 公開:

Claude Code が読み込む CLAUDE.md の配置場所と優先順位、書くべき内容と書かない方がよい内容、そのまま使えるテンプレートを公式ドキュメントに基づいて解説します。

検証日 2026年9月7日 仕様変更が早い分野です。最新の公式ドキュメントも併せてご確認ください。 記事の作り方と検証手順
目次
  1. CLAUDE.md の 3 階層
  2. 最初の 1 枚は /init で作る
  3. 書くべき内容
    1. よく使うコマンド
    2. 守ってほしい規約
    3. 触ってはいけない場所
    4. 作業の進め方
  4. 書かない方がよい内容
  5. テンプレート(小〜中規模の Web プロジェクト向け)
  6. 育て方:セッション中に追記する
  7. まとめ

Claude Code に同じ説明を毎回繰り返している、指示したはずのコーディング規約が守られない。こうした悩みの多くは CLAUDE.md を整えることで解決します。

CLAUDE.md は、Claude Code がセッション開始時に自動で読み込む Markdown ファイルです。この記事では、どこに何を書くべきかを 3 つの階層に分けて整理し、そのまま使えるテンプレートを示します。

KEY POINT

この記事で分かること

  • CLAUDE.md を置ける場所と、それぞれの読み込みタイミング
  • 書くべき内容と、書いても効果が薄い内容の見分け方
  • 小〜中規模プロジェクト向けのテンプレート

CLAUDE.md の 3 階層

階層パス用途Git 管理
ユーザー~/.claude/CLAUDE.md全プロジェクト共通の好み(言語、口調、よく使うコマンド)しない
プロジェクト./CLAUDE.md または ./.claude/CLAUDE.mdチームで共有する規約、ビルド手順、構成する
個人(プロジェクト内)./CLAUDE.local.md自分だけのメモ、ローカル環境固有の情報しない(.gitignore に追加)

これに加えて、サブディレクトリの CLAUDE.md も使えます。たとえば packages/api/CLAUDE.md に置いた内容は、Claude がそのディレクトリ内のファイルを扱うときに読み込まれます。モノレポでは、ルートに全体方針、各パッケージに固有ルールを置く構成が扱いやすいです。

読み込まれた内容は /memory コマンドで確認できます。どのファイルが効いているか分からないときは、まずここを見ます。

最初の 1 枚は /init で作る

リポジトリのルートで /init を実行すると、Claude がプロジェクトを調べて CLAUDE.md の雛形を生成します。生成物はそのまま使わず、次の観点で削ってください。

  • README を読めば分かる内容(プロジェクトの目的の長い説明)は削る
  • Claude が自分でファイルを見れば分かること(ディレクトリ一覧)は削る
  • 残すのは「見ただけでは分からない約束事」

用語解説

インポート記法: @docs/coding-style.md のように @ に続けてパスを書くと、そのファイルの内容が CLAUDE.md に取り込まれます。長い規約を別ファイルに分けたいときに使います。

書くべき内容

よく使うコマンド

Claude が推測で間違ったコマンドを実行するのを防ぎます。

## コマンド
- テスト: `npm test`(単体)/ `npm run test:e2e`(E2E、Docker 起動が必要)
- Lint: `npm run lint` — コミット前に必ず通す
- ビルド: `npm run build`
- DB マイグレーション: `npm run db:migrate`

守ってほしい規約

「なぜ」を一言添えると、Claude が判断に迷う場面で規約の意図に沿って動きやすくなります。

## 規約
- 新しい関数には必ず JSDoc を書く(型定義から API ドキュメントを生成しているため)
- `any` は使わない。型が分からない場合は `unknown` にして絞り込む
- 日付は `date-fns` を使う。`moment` は追加しない(バンドルサイズの理由)

触ってはいけない場所

## 変更禁止
- `src/generated/` 配下(コード生成物。元は `schema/` を編集する)
- `migrations/` の既存ファイル(新規ファイルを追加する)

作業の進め方

## 作業の進め方
- 3 ファイル以上を変更するときは、先に変更方針を箇条書きで提示してから着手する
- テストが落ちたまま「完了」と報告しない
- コミットは 1 つの論理的変更ごとに分ける

書かない方がよい内容

内容理由
ファイル一覧やディレクトリ構成の丸写しClaude は必要なときに自分で探索する。更新漏れで嘘になりやすい
一般的なベストプラクティス(「読みやすいコードを書く」)具体的でない指示は行動に反映されにくい
秘密情報・URL・認証情報CLAUDE.md は Git に入る。個人情報は CLAUDE.local.md にも書かず環境変数にする
長大な仕様書毎セッションのコンテキストを消費する。必要な部分だけ @ でインポートする

CLAUDE.md は毎回コンテキストを消費する

CLAUDE.md の内容はセッションのたびに読み込まれ、トークンを消費します。目安として、プロジェクトの CLAUDE.md は 100〜200 行に収めると、指示の効き目と消費のバランスが取れます。コンテキストの節約については Claude Code のコンテキスト管理 も参照してください。

テンプレート(小〜中規模の Web プロジェクト向け)

# プロジェクト概要
Next.js + TypeScript の管理画面。API は `apps/api`(NestJS)。

## コマンド
- 開発サーバー: `pnpm dev`
- テスト: `pnpm test`(変更したファイルに関連するテストは必ず実行する)
- Lint / Format: `pnpm lint && pnpm format`
- 型チェック: `pnpm typecheck`

## 規約
- コンポーネントは関数コンポーネント + hooks。クラスコンポーネントは追加しない
- スタイルは Tailwind。CSS Modules は既存分のみ保守する
- API のレスポンス型は `packages/types` に置き、フロントとバックで共有する
- エラーは握りつぶさず、`AppError` を throw する

## 変更禁止
- `packages/types/generated/`(OpenAPI から生成)
- `.github/workflows/`(変更が必要なら提案だけする)

## 作業の進め方
- 変更前に関連するテストを読む
- 3 ファイル以上の変更は、方針を先に提示する
- 完了報告には実行したテストコマンドと結果を含める

## 参照
@docs/architecture.md

育て方:セッション中に追記する

会話の途中で # から始まる行を入力すると、その内容を CLAUDE.md に追記するよう Claude に指示できます。「今後は〇〇して」と口頭で伝えるだけでは次のセッションに残らないため、繰り返し伝えていることは # で書き込む習慣をつけると、CLAUDE.md が自然に育っていきます。

同じ考え方で AGENTS.md(Codex)や GEMINI.md(Gemini CLI)を使う場合は、CLAUDE.md・AGENTS.md・GEMINI.md の違いと共通化テクニック を参照してください。

まとめ

  • CLAUDE.md はユーザー・プロジェクト・個人の 3 階層に分けて置き、/memory で読み込み状況を確認する
  • 書くのは「見ただけでは分からない約束事」。コマンド、規約、変更禁止、進め方の 4 種類が中心
  • ディレクトリ一覧や一般論は書かない。長い文書は @ でインポートする
  • # で会話中に追記して育てる

よくある質問

CLAUDE.md はどこに置けばよいですか?
全プロジェクト共通のルールは ~/.claude/CLAUDE.md、プロジェクト共通はリポジトリ直下の CLAUDE.md、個人用は CLAUDE.local.md に置きます。
CLAUDE.md が長くなりすぎた場合はどうすればよいですか?
@docs/architecture.md のようなインポート記法で別ファイルに分割できます。また、サブディレクトリに置いた CLAUDE.md はそのディレクトリを扱うときだけ読み込まれます。
CLAUDE.md と .cursorrules や AGENTS.md は同じものですか?
役割は同じ「エージェントへの前提説明」ですが、読み込む製品が異なります。共通化の方法は別記事で解説しています。

読者からの質問と回答

Q. CLAUDE.md はセッション開始時にシステムプロンプトへ注入されているはずなのに、最初の質問で参照されません。システムプロンプトに入っているなら、なぜ適用されないのですか?

編集部の回答質問の出典: GitHub anthropics/claude-code Issue #98533

前提が公式ドキュメントと異なります。CLAUDE.md は システムプロンプトには入っていません。公式のメモリのドキュメントにこう書かれています。

CLAUDE.md content is delivered as a user message after the system prompt, not as part of the system prompt itself. Claude reads it and tries to follow it, but there's no guarantee of strict compliance, especially for vague or conflicting instructions.

(CLAUDE.md の内容は、システムプロンプトの一部ではなく、システムプロンプトの 後ろに置かれるユーザーメッセージ として渡されます。Claude はそれを読んで従おうとしますが、厳密な遵守は保証されません。曖昧な指示や矛盾する指示では特にそうです。)

つまり「システムプロンプトに入っているのだから必ず適用されるはず」という期待が、設計と合っていません。読み込まれていること自体は /context の Memory files で確認できます。そこに出ていれば、Claude は見えています。

遵守率を上げる方法として、ドキュメントは次を挙げています。

  • 指示を具体的にする。「コードを整形する」ではなく「2 スペースのインデントを使う」のように検証できる書き方にする
  • CLAUDE.md 同士、サブディレクトリの CLAUDE.md、.claude/rules/ の間で矛盾していないか見直す。矛盾があると Claude はどちらかを任意に選びます
  • 1 ファイル 200 行未満に収める。長いファイルはコンテキストを多く消費し、遵守率を下げると明記されています

特定の時点で必ず実行されなければならない指示(コミット前、ファイル編集後など)は、文章ではなくフックとして書きます。フックはライフサイクルの決まった時点でシェルコマンドとして実行され、Claude の判断に関係なく適用されます。

本当にシステムプロンプトのレベルに置きたい場合は、起動時に --append-system-prompt を渡します。対話利用よりスクリプトや自動化に向いた方法です。

Q. CLAUDE.md に「必ず守るルール」を 11 項目書いているのに、セッションをまたぐと無視されます。CLAUDE.md のルールを強制的に守らせることはできますか?

編集部の回答質問の出典: GitHub anthropics/claude-code Issue #97999

CLAUDE.md にできるのは「Claude が何をしようとするか」を変えることまでで、「何が許されるか」を決める仕組みではありません。公式の権限ドキュメントにこう明記されています。

Permission rules are enforced by Claude Code, not by the model. Instructions in your prompt or CLAUDE.md shape what Claude tries to do, but they don't change what Claude Code allows.

(権限ルールを強制するのは Claude Code であって、モデルではありません。プロンプトや CLAUDE.md の指示は Claude が何をしようとするかを左右しますが、Claude Code が何を許すかは変えません。)

つまり「明示的な合図がないかぎり実行しない」のようなルールは、CLAUDE.md に書いただけでは保証されません。読み込まれてはいるが、守るかどうかはモデルの判断に委ねられます。同じドキュメントは、実際に強制する手段として /permissions、権限ルール、権限モード、PreToolUse フックの 4 つを挙げています。

確実に止めたい操作があるなら、settings.json の permissions に書きます。評価の順序は deny → ask → allow で、最初に一致したルールが結果を決めます。ルールの具体性は順序を変えないので、広い deny は狭い allow より優先されます。

{
  "permissions": {
    "ask": [
      "Bash",
      "Edit"
    ],
    "deny": [
      "Bash(rm -rf *)"
    ]
  }
}

条件がもっと複雑な場合は PreToolUse フックを使います。公式ドキュメントによると、PreToolUse フックはツール呼び出しのたびに、権限の確認プロンプトより前に実行され、その出力で呼び出しを拒否する・確認を強制する・確認を飛ばすのいずれかを選べます。終了コード 2 で終わると、権限ルールの評価より前にツール呼び出しが止まります。

なお、フックの判断は権限ルールを飛び越えません。deny ルールと ask ルールはフックの戻り値に関係なく評価され、一致する deny があれば呼び出しは止まり、一致する ask はフックが "allow" を返しても確認を出します。

セッションをまたいで挙動が揺れる点についても、CLAUDE.md は毎回読み込まれますが、過去の文脈の要約をどう扱うかはモデル側の判断です。ここを固定したい場合も、文章ではなく permissions かフックで縛るのが確実です。

詳しい手順は Claude Code の settings.json で権限を設定する を参照してください。

参考にした一次情報

この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合は お問い合わせからお知らせください。