AGENTS.md / CLAUDE.md 寫作原則
我最早是去年底先讀到這篇文章 Writing a good CLAUDE.md,我也嘗試把公司專案的 AGENTS.md / CLAUDE.md 做大整理,後續開發的體感也都變得比較順暢。
再隨著專案的規模逐漸變大、模型越來越聰明以及 Agent 的工具更新,我發現 AGENTS.md / CLAUDE.md 不是寫完就放著了,而是應該跟著 Codebase 一起迭代,於是我也開始會注意每次開發完也要更新 AGENTS.md / CLAUDE.md,這樣 AI 保持跟開發者一致的知識或是開發習慣。
最近剛好又讀到一篇 aihao.tw 的 AGENTS.md 研究與實踐,裡面有些是我之前就知道的原則,想說乾脆來整理一下我覺得不錯的原則當作紀錄。
AGENTS.md 簡介
一般來說,開發者在第一次接觸一個 Repo 的時候,通常都會去讀根目錄的 README.md,透過這份文件可以了解這個專案是個什麼專案,有哪些指令可以用,或是特殊的知識點。
而 AGENTS.md / CLAUDE.md (以下都統稱 AGENTS.md)就類似給 AI 讀的 README,但這份文件是要告訴 AI 這個 Repo 的開發習慣、能做不能做的事情是什麼等等的。
用 AI Coding 不外乎有幾個工具 Claude Code / Codex / Gemini CLI,每次啟動新的對話 AI 會去讀 AGENTS.md 作為初始載入的 Context。根據工具不同讀的檔案會不一樣,例如我常用的 Claude Code 讀的是 CLAUDE.md。
建立 AGENTS.md
在講原則之前,要先知道 AGENTS.md 的建立方式以及具體檔案位置。
基本上 AGENTS.md 是手動建立的,或者是在啟動 AI 的那個目錄下 /init 這個指令來建立。
以 Claude Code 來說會放在這幾個地方:
- 使用者層級:
~/.claude/CLAUDE.md - 專案層級:
./CLAUDE.md(在 repo 的根目錄)
像是 Codex / Gemini CLI 的話也是有分「使用者層級」跟「專案層級」,檔案位置也是差不多的邏輯,再依自己需求去找就好了。
做到這裡其實我們就已經把 AGENTS.md 建立好了,但是 AI 可能還是像個不受控的實習生一樣很難配合,接下來要講的是,讓我們的 AI 可以很好進入狀況的 AGENTS.md 寫作原則。
AGENTS.md 寫作原則
以下幾條部分有資料佐證,部分是我體感上有效,實際應用要看你的專案情境調整,也歡迎大家一起討論。
1. 少於 200 行,最好是 100~150 行
Anthropic 官方就有建議 CLAUDE.md 要低於 200 行,否則過長的文件會佔用更多 Context,還會降低指令遵從度。
依照我自己實際的經驗也是,超過 200 行的時候滿容易失控的,反而越少行越能遵守指令,並且也有研究指出太長的話很容易被 AI 忽略部分的指令。
但 200 行只是一個建議值,不代表控制在 200 行就不會失控,我們還是要考慮到開啟對話的當下 AI 載入了多少 Context,我體感上比較好的做法是縮短到 100~150 行。
2. 不要直接用 /init 產生的檔案
前面有提到可以用 /init 來建立,但大多時候自動生成內容會有專案架構、查得到的資訊、重複描述可能已經有的資訊,這些佔用 context 的廢話可能會讓 AI 浪費更多 Token。
我們可以把 /init 生成的檔案當作草稿,但具體內容再自己修正過。
3. 不要一次告訴 Claude 所有資訊,而是告訴他「如何找到重要資訊」
如果 codebase 已經有 docs/、README.md 之類的檔案,就不要把差不多的內容寫到 AGENTS.md,而是要告訴他去哪裡找。
有些情境需要讀指定的檔案,我會用提示路徑的方式,例如:
在撰寫任何程式碼之前,必須先讀取以下文件:
- docs/coding-style.md - TypeScript 型別宣告、Function 宣告、Component 結構
- docs/naming-conventions.md - 檔名與程式命名規範
4. 只寫最常用的指令
不要在 AGENTS.md 寫可能會用到的指令。
你以為你是在告訴 AI 這些指令「可以用」,但是 AI 會以為是「一定要用」,所以有時候會略過你直接執行那些指令。
像我比較常做前端開發,我就只會寫 pnpm dev 或是 pnpm build 這兩個指令。
5. 不要把排版或風格檢查的規則寫進 AGENTS.md
叫 AI 用文字規則去檢查反而又慢又浪費 Token,有時候還會做錯,我們可以用 ESLint / Prettier 這類 linter 跟 formatter 去做。
使用 Claude Code 還可以搭配 hooks 讓 AI 改完程式碼之後自動觸發。
6. 描述 WHY 或是交接重要資訊
交接重要資訊可以幫助 AI 在讀程式碼的時候了解「為什麼這裡這樣寫」,這樣 AI 動手之前就先有一些脈絡而不會自己腦補。
要描述在開發的時候需要知道的事情,例如:
- 技術棧細節版本:「本專案使用 React 18 + Tailwind CSS 4 + Vite 5.x」
- 歷史脈絡:「本專案使用 React 18,但 X 模組仍是 class component 尚未遷移,改動之前先問使用者」
不要只寫「本專案使用 React」,一來是 package.json 查得到,二來是這樣對 AI 來說不是有意義的內容。
7. 子目錄的 AGENTS.md
隨著專案越來越大,光是根目錄的 AGENTS.md 沒辦法涵蓋不同功能之間開發的需求,後來我發現子目錄其實是可以放 AGENTS.md,可以只描述該功能需要的 Context。
以實際經驗來說,寫 API 介面的時候我希望 AI 知道的事情有:
- 使用 Tanstack query + Zod
- 檔案要怎麼放
- 命名、Hooks 拆分、query keys 等等的規範
- 建立新的 api 介面的流程
我把這份 AGENTS.md 放在 apis/,在開發 API 的時候 AI 就能讀到這份文件。
我自己實際的經驗:子目錄放
README.md或AGENTS.md都會有很好的效果,可能這些 AI Coding 工具的預設行為就是會去讀這些文件。
8. 描述協作偏好
我試過不管哪套工具,預設都是很雞婆、很急著把事情做完的感覺,我的習慣是在「系統層級」的 AGENTS.md 定義跟我溝通的方式。
像我不喜歡 AI 直接寫程式,我希望 AI 先跟我討論確認沒問題再開工、回我中文,所以我寫了以下幾點:
- Always use zh-tw
- 除非明確要求實作,否則預設為諮詢和規劃模式
- 在執行任何程式碼修改前,必須明確確認使用者意圖
- 優先提供分析、建議和計劃,而非直接實作
9. 用英文撰寫可以節省 Token
之前有實驗過整份文件用中文寫跟用英文寫,在載入對話的時候消耗的 Token 最多可以差 30%~40%,像 AGENTS.md、Skill.md 這種給 AI 看的東西寫成英文不只是省 Token,我體感上也覺得他理解力也比中文好一些些。背後的原因應該是這些 LLM 的訓練資料大多都是英文,自然對英文的理解力會比較好。
前一陣子也有看到一篇文章AI大模型的「中文稅」:中文比英文更費Token 為什麼?,證實了用中文確實比較燒 Token。
最後再提供一個小技巧
如果覺得這篇文章不錯的話,可以把整篇文章讓 AI 讀過,再讓 AI 按照這些原則來修改你的 AGENTS.md。
祝大家都有很好的開發體驗。