本文へ移動
📎

Claude CodeとCodexの指示ファイルを1本にまとめる:AGENTS.mdを本文にしてCLAUDE.mdから読み込む

13分
もくじ

同じ指示を、Claude Code 用の CLAUDE.md と Codex 用の AGENTS.md の2か所に書いていた。 2か所に書いた指示は、いつの間にか片方だけが古くなる。 僕が欲しかったのは、指示を1か所に書くだけで、両方の道具に同じ指示が届く置き方だった。

共通の指示はAGENTS.mdにまとめ、CLAUDE.mdから読み込む

Claude Code と Codex の両方に同じ指示を読ませたいなら、共通の指示は AGENTS.md に1本だけ書く。 そして同じ場所に置いた CLAUDE.md から、@AGENTS.md の1行で読み込む。 どちらもプロジェクトの最上位に置く。

AGENTS.md はたとえばこうなる。

# 作業の指示

- 変更後は、変更箇所に関係するテストを実行する
- 実行できなかったテストと、その理由を報告する

CLAUDE.md は、この1行だけでいい。

@AGENTS.md

Claude Code にしか意味のない指示があるときは、CLAUDE.md のこの行の下に足す。 つながりを図にすると、こうなる。

@AGENTS.md で読み込む 直接読む Claude Code CLAUDE.md AGENTS.md共通の指示 Codex

ただし落とし穴が1つある。 AGENTS.md の中で、さらに別のファイルを @ で読み込ませないほうがいい。 手元で試したところ、Claude Code には届いたが、Codex には届かなかった。 Codex にも読ませたい内容は、AGENTS.md の本文に直接書く。

指示ファイルが二重になると、片方だけ古くなる

1年ちょっと前、僕は Claude Code と Cursor の使い分けに迷っていた。 今は Claude Code と Codex を併用している。 道具が2つになると、指示ファイルも2つになる。 Claude Code は CLAUDE.md を読み、Codex は AGENTS.md を読むからだ。

最初はどちらにも同じことを書いていた。 実際、手元のリポジトリを見直したら、AGENTS.md のほうだけ古いまま止まっているものがあった。 あとから足したいくつかの説明が、AGENTS.md からは抜けていた。 Codex は古い地図を持たされて、それでも黙々と働いていたことになる。

きっかけは、Claude Code が AGENTS.md を読めるようになったというニュースだった。 それなら CLAUDE.md を捨てて全部 AGENTS.md にすればいいのでは、と思って公式ドキュメントを読みに行った。 僕の結論は「CLAUDE.md は捨てずに、入口として残す」だった。

Claude CodeはAGENTS.mdをどう読むか

公式ドキュメント(How Claude remembers your project)によると、Claude Code は v2.1.277 から AGENTS.md を自分で読むようになった。 ただし、いつも読むわけではない。

既定の設定では、作業ディレクトリとその上の階層に CLAUDE.md、.claude/CLAUDE.md、CLAUDE.local.md のどれかがあるかで動きが変わる。 全プロジェクト共通の ~/.claude/CLAUDE.md は、この判定に数えない。

作業ディレクトリとその上の階層にあるものClaude Code が読むもの
AGENTS.md だけAGENTS.md
AGENTS.md と CLAUDE.md の両方CLAUDE.md だけ
AGENTS.md と、@AGENTS.md と書いた CLAUDE.mdCLAUDE.md(その中で AGENTS.md も読み込まれる)

2行目が大事だ。 両方あると、AGENTS.md は読まれない。 つまり二重に書いていた僕のリポジトリでは、Claude Code は CLAUDE.md しか見ておらず、Codex は AGENTS.md しか見ていなかった。 2人の同僚に、別々の手順書を渡していたようなものだ。

CLAUDE.mdを入口として残す理由

では CLAUDE.md を消して、AGENTS.md だけにすればいいか。 公式ドキュメントは、CLAUDE.md を消す形も認めている。 それでも僕は、@AGENTS.md の1行を持つ CLAUDE.md を残した。

1つめの理由は、Claude Code が AGENTS.md を直接読めない場面があることだ。 組み込みの agents-md プラグインを無効にしている場合や、v2.1.276 以前から上げた直後の最初のセッション(場合による)がこれにあたる。 v2.1.281 より前の版では、Amazon Bedrock 経由のセッションなども読めなかった。 CLAUDE.md から読み込む形にしておけば、こうした場面でも指示が届く。

2つめの理由は、読み込みの扱いが少し変わることだ。 Claude Code には、指示ファイルを読み込んだときに自分で決めた処理を動かせる InstructionsLoaded という仕組みがある。 AGENTS.md を直接読ませた場合、この仕組みは動かない。 CLAUDE.md から @AGENTS.md で読み込んだ場合は、ふだんどおり動く。

そして、残しておいて損がない。 公式ドキュメントには、@AGENTS.md を書いた CLAUDE.md を残しても、AGENTS.md が二重に読まれることはないと書かれている。

Codexで@の読み込みを試した

ここからが本題の落とし穴だ。 Claude Code の CLAUDE.md では、@パス と書くとそのファイルの中身が読み込まれる。 この書き方が AGENTS.md の中でも使えるなら、AGENTS.md を小さなファイルに分けられて便利だ。

ところが Codex の公式ドキュメント(AGENTS.md の説明)には、@ による読み込みの説明が見当たらない。 書いていないことは、できないのか、書き忘れなのか分からない。 分からないので、試した。

Claude Code v2.1.283 と codex-cli 0.157.1 で試した。 説明用に agents-demo/ というフォルダーを作って git で管理し、次の4つのファイルを置いた。 それぞれに別の「合言葉」を書いておき、ファイルを開かずに答えさせる。 答えられた合言葉が、最初から指示として届いていたものになる。

agents-demo/
├── AGENTS.md       合言葉その1と、@extra.md の1行
├── CLAUDE.md       @AGENTS.md の1行だけ
├── extra.md        合言葉その2
└── sub/
    └── AGENTS.md   合言葉その3

ルートの AGENTS.md の中身はこうだ。

# プロジェクトの指示

合言葉その1は「りんご」。

@extra.md

extra.md にはこう書いた。

合言葉その2は「みかん」。

sub/AGENTS.md にはこう書いた。

合言葉その3は「ぶどう」。

質問はどれも同じにした。

ファイルを開かずに答えてください。いま指示として見えている「合言葉」を、飾りのない1行で、読点で区切って挙げてください。見えていないものは推測しないでください。

まず Codex を、agents-demo/ で起動した。

りんご

@extra.md の先にある「みかん」が、回答に出てこない。

次に、同じ Codex を agents-demo/sub/ で起動した。

りんご、ぶどう

今度は sub/AGENTS.md の「ぶどう」が増えた。 Codex は起動したときに、プロジェクトの最上位から起動したディレクトリまでにある AGENTS.md を読み込む。 起動した場所より下にある AGENTS.md は、この読み込みに入らない。 これは公式ドキュメントに書かれている動きどおりだ。

最後に、Claude Code を agents-demo/ で起動した。

りんご、みかん

CLAUDE.md → @AGENTS.md → @extra.md と、読み込みが2段とも効いている。

並べるとこうなる。

道具起動した場所回答
Codexagents-demo/りんご
Codexagents-demo/sub/りんご、ぶどう
Claude Codeagents-demo/りんご、みかん

同じ AGENTS.md を読んでいるのに、Claude Code の回答には「みかん」が出て、Codex の回答には出なかった。 確認した公式ドキュメントにも、Codex が @ で別ファイルを読み込むという説明は無い。 だから僕は、共通の指示を @ による読み込みに頼らないことにした。

Codexの設定でCLAUDE.mdを読ませる手は採らなかった

実は Codex には、AGENTS.md の代わりに読むファイル名を足す設定がある。 ~/.codex/config.toml に次のように書くと、AGENTS.md の無い場所では CLAUDE.md を読みに行く。

project_doc_fallback_filenames = ["CLAUDE.md"]

これを使えば、CLAUDE.md を本文のままにしておける。 それでも僕はこの手を採らなかった。 僕の場合、この設定は自分のパソコンの中にしか無く、消えても Codex は何も知らせず、指示を読まずに動き続けるからだ。 標準のファイル名である AGENTS.md に本文を置けば、追加の設定を管理せずに済む。

書き分けの決まり

最終的に、次の決まりに落ち着いた。

内容書く場所
構成、コマンド、コーディング規約、作業の進め方など、両方に守ってほしい指示AGENTS.md
スキルやフックなど、Claude Code 固有の機能や設定を前提にした指示CLAUDE.md の @AGENTS.md より下

あわせて、次の2つを守る。

  • 同じ内容を2つのファイルに書かない。迷ったら AGENTS.md に書く
  • AGENTS.md の中で @ を使って別ファイルを読ませない

すでに両方のファイルがあるなら、先に中身を比べて、片方にしか無い必要な指示を AGENTS.md へ移してから重複を消す。 僕のように片方だけ古くなっていると、新しいほうを消した瞬間に指示が巻き戻る。

仕様は書いていないところで分かれる

Codex の公式ドキュメントには、@ が使えるとも使えないとも書かれていなかった。 書かれていないだけだった。 そして書かれていない部分こそ、道具ごとの違いが潜んでいる。

同じ書き方が両方の道具で使えるか迷ったら、合言葉を置いて答えさせてみる。 今回は、3つの回答を並べるだけで違いが見えた。

おわり😊

RELATED

つくることで、見える景色がある。