2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code の CLAUDE.md と .claude/rules/ を使い分ける

2
Posted at

はじめに

Claude Code へ同じ種類の作業を繰り返し依頼していると、対象環境、互換性、禁止事項、テスト方法を毎回書く必要が出てきます。条件を一つ書き忘れるだけで、/bin/sh で動かすスクリプトに Bash 固有構文が入ったり、既存の終了コードや引数が変わったりします。

この問題は、依頼文を長くするだけでは解消しません。同じ規則を複数の依頼文へ複製すると、修正済みの版と古い版が混在するためです。プロジェクトで常に使う条件と、特定のファイルだけに使う条件を分離し、現在のセッションへ読み込まれたことまで確認する必要があります 1

この記事では、規則を次の 3 か所へ分けます。

情報 配置先
プロジェクト全体で常に必要な事実と規則 CLAUDE.md
特定のファイルやディレクトリだけに必要な規則 .claude/rules/*.md
今回だけの対象、目的、維持条件、完了条件 Claude Code の対話欄

結論は単純です。

  1. 常時必要な条件は CLAUDE.md に置きます。
  2. 対象限定の条件は paths 付きの .claude/rules/ に置きます。
  3. ファイルを作成しただけで完了とせず、/context で現在の読み込み状態を確認します。

前提環境を確認する

この記事では、Claude Code を導入済みで、Git リポジトリのルートから対話セッションを開始できる状態を前提とします。例として、Debian 上で動かす POSIX shell スクリプトと、その運用文書を含むリポジトリを使用します。

最初に、Claude Code のバージョン、診断結果、作業位置を記録します。

$ claude --version
$ claude doctor
$ git rev-parse --show-toplevel
$ pwd

claude --version は実行中の版を表示します。claude doctor は、Claude Code を起動せずにインストール状態や設定ファイルを診断します 2。記事や運用手順をチームで共有する場合は、確認日だけでなく、実行結果のバージョン番号も残します。

Claude Code を起動できる場合は、対話セッション内の /doctor でも設定やコンテキストの診断ができます。起動自体に失敗する場合は、シェルから claude doctor を実行します。

リポジトリの例は次の構成です。

project/
├── CLAUDE.md
├── .claude/
│   └── rules/
│       ├── shell-scripts.md
│       └── documentation.md
├── scripts/
│   ├── backup.sh
│   └── lib/
│       └── common.sh
├── docs/
│   └── operations/
│       └── backup.md
└── run_tests.sh

既存リポジトリでディレクトリ名が異なる場合は、後述する paths を実際の配置へ合わせます。

規則を置く場所を決める

CLAUDE.md.claude/rules/ は、どちらも Markdown で指示を書く仕組みです。違いは書式ではなく、規則を読み込む範囲にあります。

情報の種類 配置先
プロジェクトの事実 対象 OS、使用言語、主要な実行方法 CLAUDE.md
全作業で守る規則 既存の引数と終了コードを維持する CLAUDE.md
ファイル種別固有の規則 POSIX shell 構文だけを使う .claude/rules/
ディレクトリ固有の規則 docs/ の見出し番号を維持する .claude/rules/
個人端末だけの条件 ローカル URL、個人用の試験データ CLAUDE.local.md
今回だけの作業条件 修正対象、観測した不具合、変更範囲 対話欄

Claude Code は、プロジェクト用の指示としてリポジトリ直下の CLAUDE.md または .claude/CLAUDE.md を読み込みます。個人用の CLAUDE.local.md はプロジェクト固有の私的な条件に使えますが、通常は .gitignore へ追加します 3

分類に迷った場合は、次の基準で判断できます。

  • 別の作業でも毎回必要なら CLAUDE.md に置きます。
  • 対象ファイルが変わると不要になるなら .claude/rules/ に置きます。
  • 作業の終了後に不要になるなら対話欄へ書きます。
  • 複数工程を持ち、必要なときだけ呼び出す手順なら Skill の候補です。

CLAUDE.md にプロジェクト共通規則を書く

リポジトリのルートへ CLAUDE.md を作成します。

# Project overview

- This repository contains POSIX shell scripts for Debian systems.
- Shell scripts are stored under `scripts/`.
- Operational documents are stored under `docs/`.

# Compatibility

- Preserve existing command-line options.
- Preserve documented exit codes and output formats.
- Do not add external dependencies without explicit approval.

# Verification

- Run `./run_tests.sh` after modifying shell scripts.
- Run ShellCheck when it is available.
- Report changed files, executed checks, and test results.
- Do not report success when a required check was skipped.

# File operations

- Do not delete or move files without explicit approval.
- Do not modify files outside this repository.
- Do not change generated files when their source file can be changed instead.

規則は、作業後に確認できる表現へ落とします。

「適切にテストする」では、どの処理を実行すれば完了なのか判断できません。次のように、コマンドと報告内容を指定します。

Run `./run_tests.sh` after modifying shell scripts.
Report the command exit status and failed test names.

同じ理由で、「既存仕様を壊さない」だけでは不十分です。維持する対象を、引数、終了コード、標準出力、設定形式などへ分解します。

CLAUDE.md は毎回のセッションへ読み込まれるため、リポジトリから容易に取得できる情報を大量に転記すると、作業に使えるコンテキストを消費します。公式文書では、各 CLAUDE.md を 200 行未満に保つことが目安として示されています 3。200 行は読み込み上限ではありません。長いほど遵守性が下がりやすいため、常時必要な条件だけを残すための目安です。

.claude/rules/ に対象別規則を書く

対象ファイルが限られる規則は、.claude/rules/ へ分けます。

$ mkdir -p .claude/rules

.claude/rules/ 以下の Markdown ファイルは再帰的に検出されます。1 ファイルへ複数分野の規則を詰め込まず、対象や目的ごとに分割します 3

シェルスクリプト用の規則を作る

.claude/rules/shell-scripts.md を作成します。

---
paths:
  - "scripts/**/*.sh"
---

# Shell script rules

- Use POSIX shell syntax compatible with `/bin/sh`.
- Use `command -v` instead of `which`.
- Do not use arrays, `[[ ... ]]`, process substitution, or `source`.
- Quote variable expansions unless intentional field splitting is required.
- Preserve documented exit codes.
- Run `./run_tests.sh` after changing shell scripts.
- Run ShellCheck when `command -v shellcheck` succeeds.

YAML frontmatter の paths は、この規則を適用するファイルを指定する設定キーです。scripts/**/*.sh は、scripts/ 以下のシェルスクリプトを対象にします。

POSIX shell の規則を CLAUDE.md へ直接書くこともできます。ただし、同じリポジトリに Python や Ruby のコードがある場合、シェルスクリプトにしか関係しない情報まで常に読み込まれます。対象限定の規則として分離すれば、無関係な作業のコンテキストを増やさずに済みます。

文書用の規則を作る

.claude/rules/documentation.md を作成します。

---
paths:
  - "docs/**/*.md"
---

# Documentation rules

- Write explanatory prose in Japanese.
- Preserve existing heading numbering.
- Preserve reference numbering unless citation order changes.
- Do not modify code examples unless technically necessary.
- Report any command or option whose behavior was not verified.

シェルスクリプトと文書では、確認すべき内容が異なります。シェルスクリプトでは構文、終了状態、既存の呼び出し方法が中心になります。文書では見出し構造、参照番号、コード例と説明の整合性が中心になります。

paths を省略した rules ファイルは無条件で読み込まれます。常時必要な規則を rules として分割することもできますが、対象限定のつもりで paths を書き忘れると、すべての作業へ適用されます 3

paths を実際のファイル配置に合わせる

paths は予定上の構成ではなく、現在のリポジトリに存在する相対パスへ合わせます。最初に対象ファイルを列挙します。

$ find scripts docs -type f -print | sort
$ git ls-files scripts docs

想定する対応は次のとおりです。

実ファイル 一致させる paths
scripts/backup.sh scripts/**/*.sh
scripts/lib/common.sh scripts/**/*.sh
docs/operations/backup.md docs/**/*.md
src/scripts/backup.sh src/scripts/**/*.sh

たとえば、シェルスクリプトを scripts/ から src/scripts/ へ移動した後も、規則が scripts/**/*.sh のままなら適用されません。規則本文が正しくても、適用条件が実ファイルと一致していないためです。

公式文書では、代表的なパターンが次のように整理されています 3

パターン 対象
**/*.ts 任意のディレクトリにある TypeScript ファイル
src/**/* src/ 以下のすべてのファイル
*.md プロジェクト直下の Markdown ファイル
src/components/*.tsx src/components/ 直下の TSX ファイル

ファイルを移動したときは、コードや文書だけでなく .claude/rules/paths も変更対象に含めます。

/context で読み込み状態を確認する

設定ファイルが存在することと、現在のセッションへ読み込まれたことは別です。Claude Code をリポジトリのルートから起動します。

$ cd "$(git rev-parse --show-toplevel)"
$ claude

起動後に /context を実行します。

/context

/context は、現在のコンテキスト使用量と内訳を表示します。詳細を展開できる版では、次のように all を付けます。

/context all

最初に、プロジェクトの CLAUDE.md が読み込まれていることを確認します。表示されない場合は、起動位置とファイル位置を調べます。

$ pwd
$ git rev-parse --show-toplevel
$ find .. \( -name CLAUDE.md -o -name CLAUDE.local.md \) -print

/memory は、利用者用、プロジェクト用、ローカル用の CLAUDE.md や自動メモリを閲覧・編集するためのコマンドです。現在のセッションへ実際に読み込まれたファイルを確認する用途では /context を使います 3

/memory

パス限定規則を確認する

paths 付きの規則は、一致するファイルを Claude Code が扱ったときに読み込まれます。起動直後に表示されないことだけで、設定失敗とは判断できません。

最初に、シェルスクリプトを変更せずに読ませます。

scripts/backup.sh を読み、内容を変更せず、このファイルへ適用される規則を報告してください。

続けて確認します。

/context all

同じ方法で文書用の規則を確認します。

docs/operations/backup.md を読み、内容を変更せず、このファイルへ適用される規則を報告してください。
/context all

確認だけでファイルが変更されていないことも調べます。

$ git status --short

期待する結果は、次の 3 点です。

  1. 起動時から CLAUDE.md が読み込まれています。
  2. scripts/backup.sh を読んだ後に shell-scripts.md が関係します。
  3. docs/operations/backup.md を読んだ後に documentation.md が関係します。

Claude Code の表示形式は版によって変わる可能性があります。ファイル名の表示だけに依存せず、対象ファイルへ適用される規則を説明させ、/context の内訳と照合します。

短い依頼へ作業固有の条件だけを書く

恒久条件をファイルへ移しても、今回だけ変わる判断まで省略してはいけません。

たとえば、次の依頼には対象ファイル、不具合、維持条件、変更前の停止点があります。

scripts/backup.sh で、失敗時の終了コードが呼び出し元へ返らない問題を調査してください。

既存のコマンドライン引数と出力形式は維持してください。
変更前に原因、変更対象、確認方法を示してください。

一方、次の依頼では変更範囲と完了条件が決まりません。

backup.sh を適切に直してください。

CLAUDE.md と rules に保存するのは、すべての作業または対象ファイルで再利用できる条件です。観測した不具合、今回の対象、変更してよい範囲、今回だけ必要な承認点は対話欄へ残します。

短い依頼が成立するのは、必要な情報を削ったからではありません。恒久条件と個別条件の置き場所を分けたためです。

規則が適用されない場合を切り分ける

規則が反映されない場合は、文章をすぐに書き換えず、読み込み条件から確認します。

順序 確認対象 確認方法
1 Claude Code の起動位置 pwd
2 Git リポジトリのルート git rev-parse --show-toplevel
3 CLAUDE.md の配置 find で探索
4 rules ファイルの配置 find .claude/rules -type f -name '*.md' -print
5 対象ファイルの実パス git ls-files または find
6 paths との一致 frontmatter と相対パスを照合
7 現在の読み込み状態 /context all
8 規則の競合 複数の CLAUDE.md と rules を比較
9 Claude Code の状態 /doctor または claude doctor
10 Claude Code の版 claude --version

rules ファイルを列挙します。

$ find .claude/rules -type f -name '*.md' -print | sort

競合する規則がないか検索します。

$ grep -Rni \
    -e 'POSIX' \
    -e 'Bash' \
    -e 'run_tests.sh' \
    CLAUDE.md CLAUDE.local.md .claude/rules 2>/dev/null

たとえば、次の 2 つが同時に存在すると、修正方針が競合します。

CLAUDE.md:
- Use Bash features when they simplify the implementation.

.claude/rules/shell-scripts.md:
- Use POSIX shell syntax compatible with `/bin/sh`.

Claude Code は、見つけた複数の CLAUDE.md や rules を単純に上書きするのではなく、コンテキストへ連結して読み込みます。矛盾した規則がある場合、どちらか一方を確実に優先するとは限りません 3。追加するだけでなく、古い規則と重複した規則を削除します。

CLAUDE.md と rules の留意事項

指示は強制的な禁止設定ではない

CLAUDE.md.claude/rules/ は、Claude Code の判断へ与える文脈です。クライアント側で操作を遮断する強制設定ではありません 3

次のような操作を確実に止める必要がある場合、「実行しない」と書くだけでは足りません。

  • ファイルの削除
  • 本番環境への反映
  • 秘密情報の読み取り
  • 外部サービスへの書き込み
  • 特定コマンドの実行

実行経路を制限する場合は、Permissions、sandbox、PreToolUse Hook などの強制機構を使います。CLAUDE.md は行動方針、settings や Hooks は実行制御という役割分担になります。

機密情報を記載しない

CLAUDE.local.md は Git 管理から外せますが、機密情報の保管場所ではありません。API キー、パスワード、秘密鍵を平文で記載せず、環境変数や既存の資格情報管理へ分離します。

リポジトリから分かる情報を転記しすぎない

ディレクトリ一覧、依存関係、すべてのコマンド説明を CLAUDE.md へ複製すると、実装との不一致が生じます。Claude Code がリポジトリを読めば取得できる情報より、次の内容を優先します。

  • 一般的な慣行と異なる制約
  • 過去に繰り返した失敗
  • 維持しなければならない外部仕様
  • 実行すべき検証コマンド
  • 失敗時に成功と報告しない条件
  • 自動判定できない業務上の判断基準

版と確認日を記録する

Claude Code は更新頻度が高く、コマンドの表示や読み込み仕様が変わる可能性があります。運用手順や記事には、実測値を記録します。

確認日: 2026-07-20
Claude Code: `claude --version` の実行結果
OS: `cat /etc/os-release` の実行結果
Repository root: `git rev-parse --show-toplevel` の実行結果

記事内へ架空のバージョン番号を固定せず、検証時の出力を保存します。

まとめ

Claude Code の規則を安定して再利用するには、情報を次の 3 層へ分けます。

置く内容 確認方法
CLAUDE.md プロジェクト全体で常に必要な事実、互換性、検証条件 起動後の /context all
.claude/rules/ ファイル形式やディレクトリに限定される規則 対象ファイルを読ませた後の /context all
対話欄 今回の対象、不具合、維持条件、完了条件 作業計画と最終報告を照合

設定後に確認すべき点は、ファイルが存在するかではありません。現在の作業で必要な規則が読み込まれ、実際のファイル配置と paths が一致しているかです。

CLAUDE.md へ規則を集約しすぎず、対象限定の条件は rules へ移します。一時的な依頼は対話欄へ残します。この分離により、毎回の入力を短くしながら、互換性、変更範囲、検証方法を省略しない運用へ移行できます。

参考文献

  1. id774, Claude Code を継続的な業務環境へ変える(2026-07-20). https://blog.id774.net/entry/2026/07/20/5112/
  2. Anthropic, Advanced setup(公開日記載なし、2026-07-20確認). https://code.claude.com/docs/en/setup
  3. Anthropic, How Claude remembers your project(公開日記載なし、2026-07-20確認). https://code.claude.com/docs/en/memory
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?