跳至主要內容
技術

CLAUDE.md 與 Rules Files 大師班:我維護 40+ 份設定檔學到的事

CLAUDE.md 與 Rules Files 大師班:我維護 40+ 份設定檔學到的事
Agentic Engineering 實戰手冊 第 8 / 14 篇

這是「Agentic Engineering 實戰手冊」系列的第八篇。上一篇:Prompt 到 Production

我的 ~/.claude/ 目錄下有 47 個設定檔

一年前,我的整個 agent 設定就是一個 CLAUDE.md,裡面寫了三行:build command、test command、和「請用 TypeScript」。

現在?47 個設定檔。Global CLAUDE.md、12 個專案的 project CLAUDE.md、23 個 skills、hooks 設定、memory system。這不是因為我喜歡寫設定檔,是因為一個檔案真的不夠用。

但你不需要從 47 個檔案開始。這篇分享的是這套系統怎麼一步步長出來的,以及你在每個階段需要什麼、不需要什麼。

從一個檔案到一套系統

問題浮現的時刻

問題 1:跨專案衝突

我同時在做一個 Astro 部落格和一個 Next.js 專案。Global CLAUDE.md 裡寫了「用 Astro 的 file-based routing」,結果在 Next.js 專案裡 agent 也嘗試用 Astro 的方式處理 routing。

需要 per-project 設定。

問題 2:CLAUDE.md 太長

有一陣子我的 project CLAUDE.md 膨脹到了 400 行。裡面什麼都有——build 指令、coding conventions、deploy 流程、specific component 的使用方式。結果 agent 的行為變得不穩定——有時候遵循 convention A,有時候遵循 convention B。

原因是 Context Engineering 裡提到的 “Lost in the Middle” 效應:CLAUDE.md 中間的指令比頭尾更容易被忽略。

需要拆分,讓每份檔案都精簡。

問題 3:重複的工作流

我發現自己經常在不同專案裡跟 agent 說同樣的事:「先跑 linter」、「commit 前做 review」、「用 conventional commits 格式」。每次新開一個 session 都要重複。

需要可重用的 skill 模組。

設定檔層級架構

經過一年的演化,我的設定檔系統有四個層級:

~/.claude/CLAUDE.md           ← Global:所有專案通用
  └── project/CLAUDE.md       ← Project:專案特定
      └── .claude/rules/*.md  ← Rules:場景特定
          └── skills/*.md     ← Skills:可觸發的工作流

Layer 1: Global CLAUDE.md(~100 行)

位置:~/.claude/CLAUDE.md

放什麼:

  • 開發哲學:incremental progress、composition over inheritance、test-driven
  • 通用 conventions:prefer TypeScript、conventional commits、no —no-verify
  • 工具偏好:prefer npm over yarn、GitHub CLI for CI/CD
  • 行為規範:不要自動 git push、不要自動加 emoji、stop after 3 failed attempts

不放什麼:

  • 任何專案特定的技術棧或 build 指令
  • 任何會跟其他專案衝突的規則

原則:如果這條規則適用於你所有的專案,放 global。否則,放 project。

Layer 2: Project CLAUDE.md(~50 行)

位置:project root 的 CLAUDE.md

放什麼:

  • Build/test/dev 指令npm run devnpm run buildnpm run test
  • 技術棧:Astro 5 + MDX + Tailwind CSS 4 + TypeScript
  • 專案結構:key directories 和 file conventions
  • 專案特有的慣例:命名規則、component patterns、design tokens

我的 bobo-blog-2026 的 CLAUDE.md 大概長這樣:

# CLAUDE.md

## Commands

npm run dev # Start dev server at localhost:4323
npm run build # Build production site to ./dist/

## Architecture

Stack: Astro 5 + MDX + Tailwind CSS 4 + TypeScript

- src/pages/ — File-based routing
- src/content/blog/ — MDX blog posts
- src/components/ — Astro components (PascalCase)
- src/layouts/ — BaseLayout.astro, BlogLayout.astro

## Content Schema

Blog posts require: title, description, pubDate
Optional: tags, featured, image, draft

## Theme System

CSS Custom Properties: --color-_, --glass-_, --radius-\*
Dark mode: .dark class on <html>

## Conventions

- lang="zh-TW"
- Component files: PascalCase
- Use existing CSS custom properties over hardcoded values

50 行以內。每一行都跟這個專案直接相關。

關鍵原則:Project CLAUDE.md 應該被 commit 進 git。它是專案文件的一部分,就像 README.md 或 tsconfig.json 一樣。團隊成員 pull 下來就能用。

Layer 3: Rules Files(按場景分)

位置:.claude/rules/*.md

Rules files 是「場景特定的 context」——不是每次都需要,但在特定情境下很重要的指令。

例子:

  • testing-rules.md:「test 要用 vitest、prefer integration test over unit test、mock 只在必要時使用」
  • deploy-rules.md:「deploy 到 Cloudflare Workers、使用 wrangler.jsonc、先 deploy staging 再 production」
  • content-rules.md:「部落格文章用繁中、frontmatter 必須有 title/description/pubDate」

什麼時候用 rules file 而不是 CLAUDE.md?當一條規則只在特定類型的任務中需要。如果你在寫測試的時候才需要知道 testing conventions,那它應該在 testing-rules.md,不是在每次 session 都會載入的 CLAUDE.md。

Layer 4: Skills(可觸發的工作流)

位置:~/.claude/skills/skill-name/SKILL.md

Skills 是 CLAUDE.md 的「按需版」——你用 /skill-name 觸發,它才會被載入到 context。

為什麼需要 skills?因為有些工作流太複雜、太長、而且不是每次都需要。比如 pre-commit review 的 4-agent 並行 review 流程,有 200 行的指令——這些如果放在 CLAUDE.md 裡,每個 session 都會佔用 context window,但 90% 的時間根本用不到。

我目前有 23 個 skills,大致分四類:

類別數量例子
開發工作流8commitpre-commit-reviewiterative-tdd-loopself-healing-deploy
內容創作7content-research-writerlesson-to-blogtranslation-zh-tw
寫作風格5will-pao-stylefireship-stylelenny-newsletter-style
工具自動化3gcp-log-checknotion-workflow-bobowordhunter-image-processor

四層的優先順序

當多層設定有衝突時,優先順序是:

Skills(最高) > Rules > Project CLAUDE.md > Global CLAUDE.md(最低)

這跟 CSS 的 specificity 邏輯一樣:越具體的越優先。Global 是預設值,project 覆蓋 global,rules 覆蓋 project,skills 覆蓋一切。

Skills 系統深入

一個好的 skill 有三個部分:

1. Trigger Condition

什麼時候觸發?寫在 description field 裡:

description: >
  Smart git commit skill. Triggers on "commit", "/commit",
  "幫我 commit", "提交", or any request to create a git commit.

這讓 Claude Code 知道什麼時候該自動載入這個 skill。

2. Step-by-Step Instructions

具體怎麼執行:

## Step 1: Gather Context (parallel)

Run: git status, git diff --cached, git log --oneline -10

## Step 2: Stage Check

Confirm staging is correct...

## Step 3: Draft Commit Message

Analyze diff, follow conventional commits...

## Step 4: Execute

Use HEREDOC format...

3. Safety Rules

什麼不能做:

## Safety Rules

- NEVER use --no-verify
- NEVER use --amend on pushed commits
- NEVER auto-push
- NEVER commit .env files

Skills vs CLAUDE.md 的選擇

情境放哪裡
每次 session 都需要CLAUDE.md
特定類型任務才需要Rules file
需要明確觸發的工作流Skill
很少用、但用到時很關鍵Skill
團隊共用的慣例CLAUDE.md(commit 進 git)
個人的工作偏好Global CLAUDE.md 或 Skill

知識放哪裡的決策框架

這是我在一年中最常遇到的問題:「這個資訊應該放在哪裡?」

以下是我的決策樹:

這個知識...
├── 每次 session 都需要?
│   ├── 是 → 所有專案都需要?
│   │   ├── 是 → Global CLAUDE.md
│   │   └── 否 → Project CLAUDE.md
│   └── 否
│       ├── 特定任務類型需要?
│       │   ├── 是 → Rules file 或 Skill
│       │   └── 否
│       │       ├── 跨 session 需要記住?
│       │       │   ├── 是 → Memory system
│       │       │   └── 否 → 不需要持久化
│       │       └── 專案文件已有?
│       │           ├── 是 → 不要重複(讓 agent 自己讀)
│       │           └── 否 → 考慮加到 README 或 docs/
│       └── 給人看的?
│           └── 是 → README / docs/

核心原則:不要重複。如果 package.json 裡已經有 build script,不要在 CLAUDE.md 裡複製。如果 tsconfig.json 已經定義了 TypeScript 設定,不要在 CLAUDE.md 裡再寫一次。Agent 有能力讀這些檔案。

CLAUDE.md 放的應該是那些檔案裡看不出來的隱性知識——比如「我們偏好 composition over inheritance」或「deploy 前一定要先跑 staging」。

維護的藝術:設定檔也需要重構

定期 Review

設定檔跟 code 一樣,會腐化。三個月前加的一條 rule,可能因為 codebase 已經改了而不再需要。

我的習慣:每月花 30 分鐘做一次「設定檔 review」。具體做什麼:

  1. 讀一遍 CLAUDE.md,刪掉過時的內容
  2. 看最近一個月 agent 犯過什麼重複的錯——需要加 rule 嗎?
  3. 看 skills 的使用頻率——完全沒用過的 skill 考慮歸檔
  4. 確認多個設定檔之間沒有矛盾

Version Control

CLAUDE.md 應該被 commit 進 git——這不只是最佳實踐,是必要的:

  1. 團隊成員 clone 下來就能用
  2. 可以 track 變更歷史
  3. 可以 code review
  4. 跟 codebase 保持同步

~/.claude/CLAUDE.md(global)不需要 commit——那是你個人的偏好設定。但 project CLAUDE.md 一定要。

團隊共用的考量

當團隊共用同一份 CLAUDE.md 時,注意:

  • 避免主觀規則:「程式碼要寫得漂亮」是主觀的;「函數不超過 50 行」是客觀的
  • 避免個人偏好:你喜歡 semicolons,同事不喜歡——這種交給 ESLint 處理
  • 建立修改流程:修改 CLAUDE.md 也需要 PR review,就像修改 ESLint config 一樣

Anti-patterns:太長、太嚴格、太模糊

Anti-pattern 1:太長(>300 行)

症狀:CLAUDE.md 超過 300 行,什麼都寫在裡面。

問題:Agent 的注意力被稀釋。中間的指令可能被忽略(Lost in the Middle)。每次 session 啟動時,大量 token 被設定檔佔用。

修正

  • 拆到 rules files 和 skills
  • 刪掉可以從 codebase 推斷出來的資訊
  • 刪掉過時的資訊
  • 目標:Project CLAUDE.md < 100 行

Anti-pattern 2:太嚴格

症狀:規則寫得太死——「每個函數不能超過 10 行」、「每個模組不能超過 5 個 export」、「所有變數必須用全名不能縮寫」。

問題:Agent 會為了遵守規則而寫出更爛的 code。為了讓函數不超過 10 行,它把一個清晰的函數拆成 5 個意義不明的小函數。為了不縮寫,它寫出 currentlyAuthenticatedUserEmailAddress 這種變數名。

修正:用 guideline 取代 hard rule。「函數盡量保持短小」比「函數不能超過 10 行」好。給 agent 判斷空間,讓它在合理範圍內做決策。

Anti-pattern 3:太模糊

症狀:「寫好的 code」、「遵循最佳實踐」、「保持 code 品質」。

問題:等於沒說。Agent 會用它 training data 裡的「最佳實踐」,那可能跟你的專案完全不合。

修正:具體。「用 Tailwind utility classes,不要寫 custom CSS」比「遵循專案的 CSS 慣例」明確 100 倍。

Anti-pattern 4:矛盾

症狀:Global CLAUDE.md 說「用 tabs」,Project CLAUDE.md 說「用 spaces」。或者 rules 裡說「prefer functional components」,但 CLAUDE.md 說「follow existing patterns」(而 existing patterns 有 class components)。

問題:Agent 隨機選一個,或者更糟,在同一個 PR 裡兩種都用。

修正

  1. 建立明確的 override 規則(project > global)
  2. 定期交叉檢查不同層級的設定
  3. 一條規則只在一個地方定義

讀者範本:從零開始的三階段路線圖

Week 1:基礎版(5 行)

# CLAUDE.md

## Commands

npm run dev
npm run build
npm run test

## Stack

TypeScript + [你的框架]

就這麼多。這 5 行就能讓 agent 知道怎麼跑你的專案。

Month 1:進階版(30 行)

# CLAUDE.md

## Commands

npm run dev # Start dev server
npm run build # Build production
npm run test # Run tests

## Architecture

Stack: [框架] + [語言] + [CSS 方案]

- src/pages/ — Routes
- src/components/ — UI components (PascalCase)
- src/lib/ — Utilities and helpers

## Conventions

- Language: [zh-TW / en]
- Naming: [PascalCase components, camelCase functions]
- Use [design tokens / CSS variables] over hardcoded values
- Prefer [composition over inheritance]

## Key Patterns

- [列出 2-3 個專案裡最常用的 pattern]
- [比如:所有 API endpoints 在 /api/ 目錄下]
- [比如:用 Zod 做 input validation]

這 30 行涵蓋了 agent 最常需要的資訊。

Month 3:完整系統

~/.claude/CLAUDE.md            ← 你的開發哲學(~50 行)
project/CLAUDE.md              ← 專案技術棧和慣例(~50 行)
.claude/rules/testing.md       ← 測試規範
.claude/rules/deploy.md        ← 部署流程
~/.claude/skills/commit/       ← git commit 工作流
~/.claude/skills/review/       ← pre-commit review

不需要一次建好。每次你發現 agent 重複犯同一種錯、或你重複跟 agent 說同一件事的時候,那就是該加一條 rule 或一個 skill 的時機。

從少開始,需要時再加。CLAUDE.md 是有機生長的文件,不是一次性的架構設計。

Takeaway

  1. CLAUDE.md 不是寫一次就忘記的文件——它是你跟 agent 的持續溝通管道。像 code 一樣,它需要被 version control、被 review、被定期維護。過時的 CLAUDE.md 比沒有 CLAUDE.md 更糟,因為它會誤導 agent。

  2. 好的設定檔系統是分層的——Global(所有專案通用)→ Project(專案特定)→ Rules(場景特定)→ Skills(按需觸發)。每一層有各自的職責,避免一個檔案什麼都放。

  3. 從三行開始就好——build、test、tech stack。隨著需要自然成長。如果 agent 重複犯同一種錯,加一條 rule。如果你重複跟 agent 說同一件事,加一個 skill。47 個設定檔是 12 個月累積的結果,不是一天建好的。


上一篇:Prompt 到 Production 下一篇:MCP 與 A2A 協議實戰

留言討論

esc
輸入關鍵字搜尋文章...
查看收藏 →