Hub Codex CLI 完整教學

第 2 篇 核心 · 第 5 章

AGENTS.md 與專案記憶

AGENTS.md 是一份你親手寫、Codex「動手做任何事之前」一定先讀一遍的「工作守則手冊」。

想像你請了一位很厲害、但完全不認識你公司的新同事。他能力很強,可是不知道「我們這個專案要先跑哪個測試」「commit 訊息要怎麼寫」「哪幾個資料夾碰不得」。你總不能每次交辦工作都把這些規矩從頭講一次吧?

AGENTS.md 就是你放在桌上的那張守則便條。新同事(Codex)每次開工前都會先把它讀過一遍,自動照規矩辦事。你只要寫一次,之後它就一直記得。

放對位置、寫得精簡,守則就生效;放錯地方、寫太長,它就讀不到或讀不完。這一章就教你把這張便條放對、寫對。

你會學到:

  • 「幫我修這個 bug,但記得改完 JS 一定要跑 npm test。」——這種規矩寫進 AGENTS.md,以後就不用每次再講。
  • 「這個專案前端跟後端規矩不一樣。」——用不同層級的 AGENTS.md 分開管。
  • 「我已經有 Claude Code 的 CLAUDE.md 了,不想重寫。」——教你怎麼沿用。
  • 「Codex 自己會記住我們聊過什麼嗎?跟 AGENTS.md 是不是同一件事?」——分清楚 Memories 跟你手寫的守則是兩回事,還有第三層 Skills 藏在哪裡。

5.1 AGENTS.md 是什麼、何時被讀

先記住一句官方原話:

Codex reads AGENTS.md files before doing any work.
(Codex 在做任何工作之前,會先讀 AGENTS.md。)

來源:官方 AGENTS.md 指南

把這句話拆開看,有兩個重點:

  1. 它是「持久化」的指令檔。 你寫一次,存進專案,以後每次跑 Codex 它都會自動讀。不是這次對話講完就忘,而是長期生效的「專案慣例」。
  2. 它在「動手前」就被讀。 Codex 每跑一次(每個 session 開始時)都會重新建構一次指令鏈(rebuild the instruction chain),把守則讀進去當這次工作的背景知識。你不用手動清快取、不用提醒它「記得看守則」。

重要提醒:改完 AGENTS.md,這個對話還讀不到

「重新建構指令鏈」這件事只發生在一個 session 開始的那一刻——不管是互動模式裡開一段新對話,還是用 codex exec 起一次新執行。如果你在對話進行到一半時,另外開編輯器改了 AGENTS.md 的內容,這個當下的 session 並不會自動感知、重讀。你會覺得「明明改了,它怎麼還是老樣子」——其實不是它沒讀到,是它還在用開工那一刻的舊版本。想讓新守則生效,把目前這個 session 結束、重新開一個就好。

小技巧

一個好記的比喻:AGENTS.md 就像「專案級的 system prompt(系統提示詞)」。第 4 章你學的 prompt 是「這一次要做什麼」,AGENTS.md 則是「這個專案永遠都要遵守什麼」。

那裡面通常放什麼? 官方與社群常見的內容是這些「工作約定(working agreements)」:

類型範例守則
測試 / 建置指令「改完 JavaScript 檔一律跑 npm test
lint / 程式風格「提交前要過 npm run lint
路徑禁區「不要改 legacy/ 資料夾裡的東西」
commit / PR 規範「commit 訊息用英文、開頭加類型標籤」
框架 / 命名慣例「元件用 PascalCase、樣式用 Tailwind」

官方參考

AGENTS.md 指南

重要提醒

AGENTS.md跨工具的開放標準,並不是 Codex 自己發明的格式。OpenAI 官方把它定位成「給 agent 看的開放格式 README」,實際維護這份格式規範的是Agentic AI Foundation(Linux Foundation 底下的專案),Codex、Cursor、GitHub Copilot、Jules、Zed、Aider 等二十多個工具都採用同一套慣例,agents.md 官方網站號稱已有超過六萬個開源專案在用(此數字為官方自報、會持續變動,僅供感受規模)。這代表你寫一份 AGENTS.md,理論上多個工具都受用——但各工具實際讀取的細節(探索順序、大小上限、合併規則)仍各自為政,以各自官方文件為準,別假設完全一致。

5.2 三層探索順序與「近者覆寫」

這一節是本章最關鍵、也最容易搞混的地方。請慢慢看,搞懂這套規則,你就能自由設計專案的守則層級。

Codex 找守則檔,分成全域專案兩個範圍(scope),而且有一個非常明確的順序。

全域範圍(你的個人預設)

Codex 檢查你家目錄下的全域檔,順序是:

  1. 先看 ~/.codex/AGENTS.override.md(如果有,優先用它)
  2. 沒有的話,才看 ~/.codex/AGENTS.md

官方原話:「Codex checks ~/.codex/AGENTS.override.md first, then ~/.codex/AGENTS.md. Only the first non-empty file at this level is used.」
(這一層只會用「第一個非空的檔」。)

這一層放的是你個人跨所有專案的偏好,例如「回答用繁體中文」「我習慣用 pnpm 不用 npm」。

Windows 小提醒

~ 在 Windows 對應的是 %USERPROFILE%,也就是 C:\Users\你的帳號\。所以全域檔的實際路徑是 C:\Users\你的帳號\.codex\AGENTS.md

實測前先有心理準備:這一層曾經被回報「讀不到」

官方文件說得斬釘截鐵——會先查 ~/.codex/AGENTS.md。但 GitHub 上有一則使用者回報(issue #8759,回報時版本為 Codex CLI 0.77.0)指出,CLI 實際上只搜尋 workspace(工作目錄)這一層,沒有像文件講的那樣自動展開讀取全域路徑,結果就是每次開新 session,全域守則都像「失憶」一樣沒生效。官方把這則回報標成 not planned(不打算修)。已知的權宜作法有兩種:把 ~/.codex/AGENTS.md 用 symlink(軟連結)連到專案根目錄,或乾脆把內容複製一份貼進專案根目錄的 AGENTS.md(代價是要維護兩份重複內容)。這類行為隨版本可能已經改變,別直接相信文件說的一定成立,先用 5.4 節教的驗證指令自己測一次

專案範圍(從 Git 根目錄一路走到你現在的位置)

接著,Codex 從專案根目錄(通常是 Git 根目錄,也就是有 .git 的那一層)開始,一路往下走到你目前所在的工作目錄。沿途每一層資料夾都依序檢查:

  1. AGENTS.override.md
  2. AGENTS.md
  3. project_doc_fallback_filenames 裡設定的備用檔名(預設沒有,5.3 節會講)

這裡有一條官方鐵則,務必記牢:

Codex includes at most one file per directory.
(每一層資料夾,最多只納入一個檔。)

意思是:同一層資料夾如果同時有 AGENTS.override.mdAGENTS.md,Codex 只取第一個命中的(override 優先),不會兩個都讀。

串接方向與「近者覆寫」

把沿路收集到的檔湊在一起時,Codex 怎麼排?官方原話:

Codex concatenates files from the root down, joining them with blank lines. Files closer to your current directory override earlier guidance because they appear later in the combined prompt.

翻成白話:

  • 方向:從根目錄往下接合,中間用空行隔開。
  • 誰贏越靠近你目前位置的檔,排在越後面;後面的指令會蓋過前面的。所以衝突時,近者(子目錄)贏

超好懂的比喻

想成公司的規定階層。全域檔 =「公司總則」、repo 根目錄 =「部門規範」、子目錄 =「這個小組的特別規定」。三者都生效,但小組規定跟部門規範打架時,以小組為準(因為它最貼近你現在做的事)。

來看一個實際例子。假設你的專案長這樣,而你現在人在 frontend/ 裡工作:

my-project/            ← Git 根目錄
├── AGENTS.md          ← 「全專案用 TypeScript」
└── frontend/
    └── AGENTS.md      ← 「前端額外:元件用 PascalCase」

Codex 會把兩個檔都讀進來(根目錄的 + frontend/ 的),用空行接起來。如果兩份有衝突,frontend/AGENTS.md 因為排在後面而勝出。

於是,三種檔各自的角色就很清楚了:

放在哪路徑角色
全域~/.codex/AGENTS.md你的個人預設(到哪個專案都套用)
專案根目錄<repo>/AGENTS.md團隊共用標準(commit 進 Git,大家一起遵守)
子目錄<repo>/frontend/AGENTS.md該部分程式碼的局部覆寫

重要提醒

子目錄的 AGENTS.md 會不會被讀,取決於它有沒有落在「根目錄 → 你目前位置」這條路徑上,而不是「你進到那個資料夾才讀」。如果你人在 backend/ 工作,frontend/AGENTS.md 因為不在你這條路徑上,就不會被讀進來。「進入資料夾才載入」這種說法官方並未明講,以實機行為為準。

官方參考

AGENTS.md 指南

5.3 放什麼、32 KiB 上限、相關 config 鍵

守則放對位置之後,還要寫得精簡。這一節講三件事:大小上限、寫作建議、可調的設定鍵。

32 KiB 上限:寫太長後面會被切掉

Codex 把所有層級的守則接合起來時,有一個預設組合上限:32 KiB(由設定鍵 project_doc_max_bytes 控制,預設值 32768 位元組)。行為是:

  • 空檔直接跳過(skips empty files)——空的 AGENTS.md 不佔額度也不生效。
  • 一旦組合大小達到上限,就停止再加檔(stops adding files once the combined size reaches the limit)。

官方原話:「Codex skips empty files and stops adding files once the combined size reaches the limit defined by project_doc_max_bytes (32 KiB by default).」

重要提醒

「停止加檔」這件事很容易踩雷。如果你的守則寫得又臭又長、塞爆 32 KiB,排在後面的層級可能根本沒被讀進來。所以:守則要精簡,把最重要的規矩寫清楚就好,別把整本開發手冊複製進去。社群常見建議是單一檔控制在大約 800 字以內,把 context 留給真正的工作(此為第三方建議,非硬性官方規定)。

特別容易搞錯的一點:這 32 KiB 是全域檔 + 專案根目錄 + 一路巢狀下來所有檔案加總的上限,不是每份 AGENTS.md 各自獨立擁有 32 KiB。最常見的地雷組合是「全域檔案寫得很肥(例如將近 30 KiB)」再疊上「專案本身又是多層巢狀」,兩者加總很快撞頂,而且越接近你目前工作目錄、理論上最該優先套用的細節,反而因為排在後面被擠掉或截斷不完整,行為變得難以預期。

寫什麼比較有用

新手起步,守則只要回答「Codex 在這個專案最該知道的事」就好。給你一份可以照抄改的範本:

# AGENTS.md

## 開發指令
- 改完 JavaScript / TypeScript 後,一律跑 `npm test`
- 提交前要過 `npm run lint`

## 路徑禁區
- 不要修改 `legacy/` 與 `vendor/` 資料夾

## Commit 規範
- commit 訊息用英文,開頭加類型(feat / fix / docs)

## 慣例
- 元件命名用 PascalCase
- 樣式統一用 Tailwind,不要寫 inline style

小技巧

守則用祈使句、條列式寫最好(「一律跑 X」「不要碰 Y」),不要寫成長篇大論。Codex 跟人一樣,清單比作文好讀。指令也盡量寫得跨平台——如果團隊裡有人在原生 Windows(非 WSL2)工作,AGENTS.md 裡寫死 makefind -name 這類 Linux 專屬指令,對方那邊會直接跑不動。這類環境落差,Codex 官方 GitHub 上仍不時有開放中的議題在討論(多半是路徑轉換問題),查閱時請自行確認現況;保守作法是在守則裡註明「Windows 使用者請改用 WSL2」,或乾脆附上對應指令。

怎麼判斷「這條該寫進 prompt」還是「該寫進 AGENTS.md」?

官方最佳實踐給了一條簡單的分野:prompt 該放的是「這次任務」專屬的東西——這次要做什麼、有什麼上下文、限制是什麼、怎樣算完成;只要一條規矩會被反覆套用到「每一次」任務,就該把它從 prompt 搬進 AGENTS.md,不要每次開工都在對話裡重講一次。判斷口訣很直覺:如果你發現自己在複製貼上同一段話當 prompt 開頭,那段話大概就該搬家了。

相關 config.toml 設定鍵

如果你想微調 AGENTS.md 的行為,以下幾個鍵寫在設定檔(~/.codex/config.toml,詳見第 8 章)。這幾個鍵的名稱與預設值都經過官方文件查核:

設定鍵預設值作用
project_doc_max_bytes32768(32 KiB)守則組合的位元組上限,可調高
project_doc_fallback_filenames陣列(預設視官方為準)AGENTS.md 不存在時,依序嘗試的備用檔名
project_root_markers.git(預設值見下方提醒)哪些標記檔代表「專案根目錄」
model_instructions_file(無)用自訂檔取代內建指令,而非走 AGENTS.md 發現流程
developer_instructions(無)額外注入這次 session 的開發者指示,疊加AGENTS.md 之上(不是取代),選用

預設值別寫死

官方設定參考確認 project_doc_fallback_filenamesproject_root_markers 這兩個鍵存在,但官方頁並未逐字列出它們的預設值。網路上常見「預設就是 [".git"]」「預設就是空陣列」的說法是合理推測但非官方明文——確切預設值以實機 codex --help官方設定參考為準,不要當成鐵板事實寫進你的文件。

一份對應的 config.toml 範例:

# ~/.codex/config.toml

# 把守則組合上限調高到 64 KiB(預設 32768)
project_doc_max_bytes = 65536

# AGENTS.md 不存在時,改找這些檔名
project_doc_fallback_filenames = ["TEAM_GUIDE.md", "CLAUDE.md"]

# 哪些標記代表專案根目錄(預設只有 .git)
project_root_markers = [".git"]

重要提醒(別寫錯鍵名)

網路上有些舊文章把「自訂指令檔」的鍵寫成 experimental_instructions_file——這個鍵在現行官方文件已經不存在了,它被改名為 model_instructions_file。另外有一個叫 instructions 的鍵,官方明確標為「保留未用(Reserved for future use)」,也別用。要自訂就用 model_instructions_file。確切鍵名與預設值,以實機 codex --help官方設定參考為準

三個名字很像的鍵,功能完全不同,一次分清楚:model_instructions_file整套取代(不再走 AGENTS.md 三層發現流程);developer_instructions疊加補充(不動 AGENTS.md 本身,額外多塞一段);instructions保留未用,官方明講現在別碰

project_doc_fallback_filenames 的妙用

CLAUDE.md 加進這個清單,Codex 在找不到 AGENTS.md 時就會改讀你的 CLAUDE.md——這是 Claude Code 老使用者沿用舊守則最省事的一招(下一節還會講另一招)。

查到「CODEX.md」或「instructions.md」?那是過時命名

Codex 早期的文件(Prompting Guide)曾經用過一套不一樣的命名:使用者層叫 ~/.codex/instructions.md、專案層叫 CODEX.md,這套舊命名跟後來 README 描述的三層 AGENTS.md 架構互相矛盾,社群也因此提出困惑(GitHub issue #1132)。現行所有官方頁面已經統一為本章教的 AGENTS.md / AGENTS.override.md。之後如果你 Google 到比較舊的教學文章或部落格,看到叫你建立 CODEX.md~/.codex/instructions.md,那是過時的命名——現行版本的 Codex 不會去讀那兩個檔名,照本章教的檔名走就對了。

5.4 /init 生成、Memories 差異、驗證生效

最後三招,讓你從零起步、分清兩種「記憶」、確認守則真的生效。

/init 自動生成骨架

不知道從何下手?別怕,Codex 內建一個指令幫你生骨架(scaffold)。在 Codex 的互動模式裡輸入:

/init

官方對它的說明是「Generate an AGENTS.md scaffold in the current directory.」——也就是在你當前所在的目錄生出一份 AGENTS.md 草稿。

官方建議的用法很重要:

Run /init in the directory where you want Codex to look for persistent instructions. Review the generated AGENTS.md, then edit it to match your repository conventions.

白話三步驟:

  1. cd 到你要放守則的目錄(通常是專案根目錄),再開 Codex。
  2. 輸入 /init,讓它生出草稿。
  3. 檢查並修改這份草稿,改成符合你專案的真實慣例,然後 commit 進 Git 供未來 session 使用。

小技巧

/init 生的只是起點,不是成品。它幫你搭好架子,真正的規矩還是要你自己增刪。把它當「填空題的格線」就對了。

Memories 是另一回事,別搞混

你可能會在 Codex 裡看到 /memories 這個指令,以為跟 AGENTS.md 是同一件事。不是。 兩者是不同層、不同機制

面向AGENTS.mdMemories(/memories
誰寫的你手寫的持久指令Codex 自己產生與管理的小型記憶
怎麼來/init 生骨架後你編輯Codex 在對話中自動寫入
預設狀態放好就生效預設關閉,需要開啟功能旗標

官方對 /memories 的說明是「Configure memory use and generation.」(設定記憶的使用與產生)。注意有「generation(產生)」這個字——代表記憶是由 Codex 自己生的,跟你手寫的守則完全不同。

重要提醒

Memories 功能預設是關閉的,需要在設定裡開啟(社群指出需 [features] memories = true)。是否啟用、確切設定方式,以實機 /memories 與官方文件為準。新手階段,先把手寫的 AGENTS.md 用好就很夠了,Memories 可以之後再研究。

新手到這裡先有個印象就好;如果你想再多懂一點 Memories 實際怎麼運作,下面補三件事:它怎麼被產生、存在哪裡、跟 AGENTS.md 衝突時聽誰的

Memories 的產生分成兩階段的背景任務,都是非同步跑、不會擋住你當下的操作:

  1. 第一階段:逐 session 摘要。 一個對話「結束且閒置夠久」之後,Codex 才會把那個 session 摘要成記憶素材。閒置門檻官方沒有逐字列出確切小時數,第三方分析報告估計約 6 小時,以你實機觀察到的行為為準。用 --ephemeral(不持久化 session rollout)跑的、或還在進行中的 session,不會被納入。
  2. 第二階段:全域彙整。 這一階段序列化執行(同一時間只跑一份),依「使用次數」與「新舊程度」決定哪些記憶留下來,太久沒被用到的舊條目會被過濾掉(第三方報告推估約 30 天,同樣未經官方逐字確認)。彙整完,才把增/留/刪的差異寫回磁碟。

存放位置在 $CODEX_HOME(沒特別設定就是 ~/.codex/)底下的 memories/ 資料夾,長這樣:

~/.codex/memories/
├── MEMORY.md              # 較完整的可查詢知識登記
├── memory_summary.md      # 精簡摘要,主要注入點,依 context 預算截斷
├── raw_memories.md        # 合併後的原始擷取,暫存用
├── rollout_summaries/     # 每個 session 各自的摘要
├── skills/                # 從經驗中學到的可重用程序
└── memories_extensions/   # 外掛/來源專屬輸入

其中 memory_summary.md 是真正每次 session 開始時會被讀進 context 的主要檔案;MEMORY.md 比較像一份「詳細目錄」,官方引導的用法是讓 Codex 用類似 grep 的方式在需要時去查細節,而不是整份塞進 context。這幾個檔都是產生出來的狀態檔,官方建議當成自動生成的結果看待,不建議手動編輯當成主要控制手段——真的要「教」Codex 記住什麼,正常管道是讓它在對話中自然累積,或者乾脆寫進 AGENTS.md

要開啟這個功能、細調行為,設定寫在 config.toml

# ~/.codex/config.toml

[features]
memories = true

[memories]
generate_memories = true        # 新 session 要不要納入記憶素材
use_memories = true             # 既有記憶要不要注入未來 session
extract_model = "gpt-5.2-codex"        # 逐 session 摘要用的模型
consolidation_model = "gpt-5.3-codex"  # 全域彙整用的模型

[memories] 底下還有幾個可以細調的鍵,例如 disable_on_external_context(把有用到 MCP、網路搜尋的 task 排除在記憶素材外)和 min_rate_limit_remaining_percent(配額低於某個門檻時就跳過記憶生成,避免記憶功能反過來吃光你的用量)。這幾個鍵的預設值官方未逐字列出,以實機 codex --help官方 Memories 說明為準

省錢小撇步

extract_model 逐 session 都要跑一次,呼叫次數多;consolidation_model 因為是彙整階段、序列化只跑一次。社群觀察到的做法是前者塞一個較便宜的模型、後者放能力較強的模型,對應這套兩階段架構分開調參。這不是官方硬性建議,範例中的模型名稱僅示意,實際可用的模型清單以你當下 Codex 版本支援的為準。

互動模式裡的 /memories 除了設定,還能對目前這個 thread(對話)做操作:切換這段對話要不要貢獻記憶素材、檢視目前有哪些記憶被注入這次 session、或強制刷新。確切選單項目請以實機 /memories 畫面為準。

隱私提醒:遮蔽是「盡力而為」,不是保證

官方會在記憶寫入存檔前自動做 secrets 遮蔽(redaction),但官方文件本身也提醒:要分享你的 Codex home 目錄或產生出來的記憶檔之前,自己要先檢查一遍——遮蔽是盡力而為,不是保證零殘留。另外,Memories 上線初期(2026 年 4 月)在歐洲經濟區(EEA)、英國、瑞士因 GDPR 相關考量還不可用,這些地區目前 AGENTS.md 仍是唯一能持久化的層;是否已開放,以官方公告與你所在地區的實際畫面為準。這兩點在你考慮「要不要把 ~/.codex/memories/ 整包搬去新機器」或跟別人共用開發環境時特別重要。

最後回到最重要的一句話:Memories 是輔助回憶層,不是必須遵守之規則的唯一來源。 凡是你希望 Codex 每一次都不能違反的規矩,還是得放進 AGENTS.md 這種進版控、團隊共用的文件;Memories 更適合放「有它更好、沒它也不會出事」的個人化背景,例如它記得你偏好的除錯路數、或上次繞過某個環境陷阱的做法。如果你的場景需要一切決策都能被稽核(例如正式的團隊協作環境),一個穩妥的做法是乾脆把 generate_memories 設回 false,逼自己把所有「該被記住的知識」都走人工審查、進版控的 AGENTS.md,而不是散落在本機、無法稽核的記憶檔裡。

還有第三層:Skills

如果你發現自己一直對 Codex 重複同一種 prompt、或反覆糾正同一套流程,那件事大概不該繼續留在 AGENTS.md 裡當一條規則,而是該升級成一個 SkillSKILL.md)——專門封裝「這件事怎麼做」的可重複執行程序。個人常用的放 $HOME/.agents/skills,團隊共用的放進 repo 的 .agents/skills。簡單分工:AGENTS.md 管規則、Memories 管個人化背景記憶、Skills 管可重複執行的具體流程。Skills 怎麼寫、怎麼觸發,第 12 章會完整示範,這裡你只要知道它在整張地圖上的位置。

怎麼確認守則「真的被讀到了」

寫好守則,怎麼知道 Codex 有沒有乖乖照辦?官方提供一個簡單的驗證招數——直接問它「現在的指令是什麼」:

codex --ask-for-approval never "Summarize current instructions"

如果回應裡出現你在 AGENTS.md 寫的內容(例如它複述了「改完 JS 要跑 npm test」),就代表守則確實被讀進去了

「讀到了」不等於「會照辦」

這招驗證的是守則有沒有被載入 context,不是「Codex 保證會遵守」。這兩件事不一樣——下面 5.5 節會用一個真實案例告訴你,就算守則白紙黑字寫著、也確認被讀到了,Codex 仍然可能不照辦。真正「不能違反」的規矩,光靠 AGENTS.md 文字約束不夠保險。

更省事的查法

在互動模式裡,你也可以用 /status(看目前 session 設定)或 /debug-config(印出 config 各層診斷)來檢查指令來源。這些指令的確切行為,以實機 /help 清單為準。

5.5 🎓 高手進階

前面四節讓你把 AGENTS.md 放對、寫對、驗對。這一節給已經上手的你幾件「老手才知道」的事:怎麼寫才不會越寫越爛、三層怎麼分工、這套機制反過來可能被怎麼利用、32 KiB 怎麼省、還有怎麼用環境變數隔離不同人格。心法層的完整推演(為什麼 short > long、reward hacking 怎麼防)會在第 13 章深談,本節先把機制講清楚,讓你立刻能用。

簡潔哲學:short > long,而且「事後才加規則」

先記官方這句最關鍵的話:

A short, accurate AGENTS.md is more useful than a long file full of vague rules. Start with the basics, then add new rules only after you notice repeated mistakes.
(一份簡短、準確AGENTS.md,比一份塞滿模糊規則的長檔有用。先寫基本款,只有當你注意到反覆出錯,才補上新規則。)

來源:官方 AGENTS.md 指南

這句話翻成老手心法是兩條:

  1. AGENTS.md 不是一次寫滿的「開發聖經」。 一開始就把所有想得到的規則全塞進去,反而害事——規則越多、可以被鑽的字面空間越大,Codex 越容易挑一條對它最省力的合法讀法交差。
  2. 規則是「事後長出來」的。 正確姿勢是:先放最基本的(怎麼跑測試、怎麼 commit),然後觀察——當你發現 Codex 反覆犯同一個錯,針對那個錯加一條規則。沒看到錯就先加的規則,多半是無效的猜測。

一句話記住

好的 AGENTS.md養出來的,不是寫出來的

三層分工:Global / Repo / Subdir override 各放什麼

5.2 節你已經學會三層的讀取順序(全域 → 根目錄 → 子目錄,近者覆寫)。老手還要知道每一層該放哪一類規則,官方對這三層各有明確定位:

路徑該放什麼(官方定位)
Global(全域)~/.codex/AGENTS.md跨所有專案的個人預設:測試習慣、慣用的套件管理器(pnpm / npm)、approval 工作流偏好
Repository(專案)<repo>/AGENTS.md團隊共用標準:專案慣例、文件規範、lint 要求(commit 進 Git,大家一起遵守)
Subdirectory(子目錄)<subdir>/AGENTS.override.md局部覆寫:某個 team 或 service 跟整體規範不一樣的特殊規則

來看一個更貼近真實專案的例子——一個有多個子套件的 monorepo:

repo-root/AGENTS.md          # PR 慣例、安全紅線、分支策略
├── apps/web/AGENTS.md       # Next.js 專屬細節
├── apps/api/AGENTS.md       # FastAPI 專屬細節
├── packages/ui/AGENTS.md    # 設計系統規則
└── infra/AGENTS.md          # Terraform/機密管理規則

apps/web/components 底下工作時,依 5.2 節的探索順序,Codex 會沿路吃進 ~/.codex/AGENTS.md(若有)→ repo-root/AGENTS.mdapps/web/AGENTS.md不會吃到 apps/apipackages/ui 這些旁支目錄的檔案——因為它們不在「根目錄到你目前位置」這條路徑上。這正是「近者覆寫」機制的自然副作用:每個子套件只需要煩惱自己的技術細節,不用擔心被隔壁套件的規則污染,也不用手動排除。 Root 那份只放跨子專案都適用的共通規則(PR 慣例、安全紅線、分支策略),細節下放給各自的子套件,是老手管理大型 repo 的標準分工。

官方參考

AGENTS.md 指南

AGENTS.override.md 的妙用——臨時改規則不刪本體

子目錄那層的查找順序是「先 AGENTS.override.md、再 AGENTS.md、再 fallback,每層只取第一個命中」。所以你可以保留原本的 AGENTS.md 不動,另外放一個 AGENTS.override.md 暫時蓋掉某條規則(例如「這個實驗分支先別跑 lint」)。實驗結束,把 override 檔刪掉就還原,本體完全沒被污染。舉個具體例子:在 services/payments/ 底下放一份 services/payments/AGENTS.override.md,就能暫時關掉一條規則做效能實驗,其他目錄完全不受影響。記得把這類個人化的 override 檔加進 .gitignore——它原本就該是本機臨時的東西,沒排除在版控外的話,很容易不小心把個人的臨時覆寫 commit 進共用 repo,變成全隊都被套用你那條非預期的規則。

近者覆寫也是攻擊面:小心被污染的 AGENTS.md

「越靠近你目前位置的檔案權重越高」這個機制方便,但反過來想:如果有人能在你的工作目錄裡偷偷塞一份 AGENTS.md,等於直接在你 Codex 的指令鏈裡插話。 這不是憑空想像——NVIDIA 的 AI Red Team 曾經公開一個概念驗證(PoC),並已通報 OpenAI:一個惡意的相依套件,在 build 階段(例如觸發 go mod tidy 這類指令時)偵測到 Codex 的執行環境,動態寫入一份偽造的 AGENTS.md,內容要求 Codex 插入隱藏的惡意程式碼,還在程式碼註解裡進一步指示「摘要模型別提到這處修改」,企圖連 PR 摘要都一起隱瞞。

前提是攻擊者已經能透過惡意套件執行程式碼——OpenAI 官方當時的立場是,這個風險並不比「相依套件本身已經被攻陷」更高,因此沒有針對這個案例額外加防護(此為 PoC 揭露當下的官方立場,後續是否調整以官方公告為準)。對你的實務意義是:

  • 對外部、第三方觸碰過的 AGENTS.md 內容,當成不可信輸入看待,尤其是透過 npm installgo mod tidy 這類會執行第三方程式碼的指令帶進來的相依套件。
  • 開工前用第 1 章教的 git status / git diff 習慣,順手也掃一眼有沒有非預期出現的 AGENTS.mdAGENTS.override.md,尤其是安裝新套件之後。
  • 敏感的自動化流程,考慮限制哪些流程/使用者能寫入設定檔案,並監控非預期的檔案差異——這一塊跟第 6 章談的沙箱與核可機制是同一條防線的兩端:一個管「Codex 能碰什麼」,一個管「誰能餵給 Codex 什麼指令」。

別因噎廢食,但要有這根弦

這是一個已公開揭露、有實際 PoC 的攻擊面,不是危言聳聽,但也不代表你每次 npm install 都要如臨大敵。多數個人與社群專案的相依套件風險本來就存在(供應鏈攻擊不是 AGENTS.md 專屬的新問題),AGENTS.md 只是多了一個「被攻陷後可以拿來做壞事」的管道。正常使用、來源可信的套件不用特別緊張,記得有這回事、知道怎麼快速自查(git statusgit diff 看有沒有非預期新增的 AGENTS.md)就夠了。

偷學 OpenAI 自家的 AGENTS.md:規則「密度」怎麼抓

想知道一份高手級的 AGENTS.md 長怎樣?最好的範本就是 Codex 開發團隊自己用的那一份(放在 openai/codex 的 GitHub repo)。拆解它的寫法,你會看到三個值得抄的習慣:

  • 規則用不同「強度」表述,不是每條都喊「絕對禁止」。 有絕對指令(「Never…」永遠不要)、有偏好(「Prefer X over Y when…」優先用 X)、也有帶例外的(「Do not… Exception: …」原則上不要,除了某情況)。強弱分明,Codex 才知道哪些是紅線、哪些是傾向。
  • 粒度從「微觀」到「宏觀」並存。 既有很細的程式風格(例如「字串格式化的參數一律寫成 inline」),也有架構級的方向(例如「克制把程式碼往核心模組塞」),還有流程(例如「改完自動跑格式化」)。
  • 多數規則都附「為什麼」與「可驗門檻」。 重點來了:它不寫「檔案不要太大」這種模糊話,而是給數字——「Rust 模組目標控制在 500 行以下(不含測試)」「檔案超過大約 800 行就考慮拆分」。

老手心法

每條規則盡量自帶「為什麼」+「一個可量的門檻」。 把「不要寫太長」這種會被 Codex 用字面狡辯的模糊判斷,換成「超過 800 行就拆」這種它無法狡辯的數字。這就是 reward hacking(鑽規則漏洞)的結構性對策——第 13 章會把這套心法講透。

這不是紙上談兵:已有實測案例

有使用者實測回報(issue #6502,回報時版本為 Codex CLI 0.57.0 搭配 gpt-5-codex):即使 AGENTS.md 白紙黑字寫著「測試沒過不能 commit」,Codex 仍然反覆建議把失敗的測試 commit 上去,多次提醒也未必修正。AGENTS.md 說到底是強烈的引導,不是強制執行機制。 真正「不能違反」的硬性要求,不能只寫在守則文字裡自我安慰,還是要搭配 pre-commit hook、CI gate 這類真正會擋下動作的機制——文字約束負責「溝通意圖」,機制負責「把關」。

32 KiB 撞上限了?拆檔或調高,別硬塞

5.3 節提過 32 KiB 上限會「達標即停止加檔」。老手遇到守則確實寫不下時,官方給兩條正解(別硬塞成一坨):

  1. 拆檔到巢狀子目錄(split large files across nested directories):把冷門、只在特定子目錄才需要的規則,下放到該子目錄的 AGENTS.md。這樣它只在你工作路徑經過那層時才載入,不佔用全域額度。
  2. 調高位元組上限:在 config.tomlproject_doc_max_bytes 設大(見 5.3 範例)。

老手的取捨原則:重要、通用的規則放會先被讀到的層(全域 / 根目錄);冷門、局部的規則下放子目錄。 這樣既不會撞上限,也讓最關鍵的守則一定載入得到。

隱性成本提醒

AGENTS.md每次 run 都注入 Codex 的 context——寫越長,每個 turn 都多付一次 token。所以「short > long」不只是準確性問題,也是省錢問題。把 context 留給真正的工作,別讓守則檔吃掉預算。

自訂指令檔:model_instructions_fileproject_doc_fallback_filenames 再看一眼

這兩個鍵 5.3 節已經出現,這裡補老手的用法分界:

  • project_doc_fallback_filenames(沿用既有檔名): 你有一份既存的 TEAM_GUIDE.mdCLAUDE.md,不想改檔名,就把它加進這個清單——Codex 找不到 AGENTS.md 時會改讀它。本體還是走正常的 AGENTS.md 三層發現流程,只是換個檔名認。
  • model_instructions_file(完全接管): 這個更重——它讓 Codex 完全取代內建指令發現流程,不再走 AGENTS.md 那套三層串接,改用你指定的那一個檔當整份指令。用在你要精準控制整個 system prompt、不想要任何自動串接行為的場景。

別搞混兩者的層級

fallback_filenames 是「換個檔名繼續玩同一套發現規則」;model_instructions_file 是「整套發現規則我不要了,聽我這一個檔的」。後者威力大,不確定就別開——確切行為以實機 codex --help官方設定參考為準

老手工具:用 CODEX_HOME 隔離不同的守則人格

目前為止談的都是同一個 ~/.codex/ 底下的探索規則。但如果你想徹底隔開兩套環境——例如「工作用的守則與記憶」跟「個人練習用的守則與記憶」互不干擾,或是想乾淨測試某組 config.toml 設定會不會撞到既有習慣——有一個更狠的招數:整個換掉 Codex 的家目錄。

# 用當前資料夾底下的 .codex/ 當這次執行的家目錄,不去動平常的 ~/.codex/
CODEX_HOME=$(pwd)/.codex codex exec "..."

CODEX_HOME 這個環境變數決定 Codex 去哪裡找全域 AGENTS.mdconfig.tomlmemories/ 這一整包東西。指定成專案資料夾底下的 .codex/,就等於幫這次執行套上一個全新、乾淨的「人格」,跑完也不會汙染你平常用的全域設定。適合拿來做「這條新規則會不會有副作用」的隔離測試,或是同一台機器要分飾工作/個人兩種身分時使用。

驗證守則「真的生效」(老手版)

5.4 節給過驗證指令,這裡講它的進階用法。官方的驗證招數是直接叫 Codex 把目前載入的指令吐出來:

codex --ask-for-approval never "Summarize the current instructions."

老手會多看一步:Codex 應該按照「全域 → 根目錄 → 子目錄」的順序、把各層載入的指引都回吐出來。

  • 如果回吐的內容完整覆蓋你各層寫的規則 → 指令鏈正確載入。
  • 如果某一層的規則不見了 → 高機率是撞上 32 KiB 上限被截掉了。對策就回到上面:把大檔拆到巢狀目錄,或調高 project_doc_max_bytes

交叉引用

這一節講的是機制(三層、上限、檔案鍵)。背後的心法——為什麼簡潔反而更準、怎麼用「自帶 why + 可量門檻」的規則防住 Codex 鑽漏洞——會在第 13 章「進階 prompt 與心法」完整展開,本節學到的機制是那套心法的地基。

本章小結

這一章你學會了用 AGENTS.md 給 Codex 一份「寫一次、永遠記得」的專案守則:它在動手前被讀、按全域 → 根目錄 → 子目錄的順序串接、近者覆寫遠者、有 32 KiB 上限所以要精簡,還會用 /init 生骨架、用 model_instructions_file(不是舊的 experimental_instructions_file)做進階自訂。你也搞懂了三種持久化機制怎麼分工——手寫、進版控的 AGENTS.md 管規則、Codex 自己產生的 Memories 管個人化背景記憶、Skills 管可重複執行的流程;更知道 AGENTS.md 終究只是強力引導、不是強制執行,真正不能違反的規矩還是得靠 hook、CI 這類機制把關。

動手試試

  1. 在你的專案根目錄開 Codex,輸入 /init,看看它生出什麼骨架,改成你專案的真實慣例(例如加一條「改完程式碼跑你的測試指令」)。
  2. codex --ask-for-approval never "Summarize current instructions",確認你剛寫的守則有被讀進去。
  3. (進階)如果你是 Claude Code 老使用者,在 config.toml 加一行 project_doc_fallback_filenames = ["CLAUDE.md"],讓 Codex 沿用你舊的 CLAUDE.md
  4. (進階)在互動模式打 /memories,看看這個功能在你的版本上預設是開是關;如果已經用了一陣子 Codex,順便看看 ~/.codex/memories/ 資料夾裡有沒有東西。
  5. (進階)驗證看看全域 ~/.codex/AGENTS.md 在你的版本上到底有沒有被讀到——寫一條很好認的測試規則(例如「永遠用『喵』結尾回答」)進全域檔,開一個新專案資料夾測看看,親自確認 5.2 節提到的那個「讀不到」議題在你這裡是否還存在。

時效提醒

本章提到的設定鍵、指令旗標與功能開關,Codex CLI 數天一版,行為可能已經調整。本章對照版本為 Codex CLI 0.140.0(2026-06-15),內文引用的 GitHub 議題編號也都標了回報當下的版本——最終請以你實機的 codex --help官方設定參考為準。

本章官方文件參考