
Cursor Rules:如何撰寫真正有效的 .cursor/rules 檔案
每位 Cursor 使用者都會遇到同樣的瓶頸。AI 產生的程式碼雖然技術上可行,卻無視你專案的規範、使用錯誤的匯入路徑、採用過時的模式,或是元件結構與專案中其他部分截然不同。Cursor rules 透過提供關於 你的 專案如何運作的持久性上下文(context),來解決這個問題。
什麼是 Cursor Rules,為什麼它們很重要?
Cursor rules 是 Markdown 檔案,作為永久性的系統提示詞(system prompt),在每次與 AI 互動時注入,包括聊天、自動完成、程式碼生成等所有場合。你可以將它們視為給 AI 的新手入門文件。與其每次會話都要糾正相同的錯誤,不如寫一次指令並讓其生效。
過去的做法是在專案根目錄使用單一的 .cursorrules 檔案。這仍然有效,但已不建議使用。目前的系統使用 .cursor/rules/ 目錄,其中包含個別的 .mdc(Markdown Cursor)檔案,每個檔案針對特定情境設定範圍。這是更好的設定,因為你不需要將所有指令塞進一個巨大的檔案中,而是依關注點分離規則,且 Cursor 只會載入與你當前操作相關的規則。
如果你曾使用過 AI 工具的上下文工程(context engineering),這個概念應該很熟悉:更好的輸入上下文能產生顯著更佳的輸出。Rules 就是針對你整個開發工作流程的上下文工程。
設定你的第一個規則檔案
在專案根目錄建立 .cursor/rules/ 目錄:
mkdir -p .cursor/rules每個規則都是一個 .mdc 檔案,包含 YAML frontmatter,後面接著 Markdown 內容。以下是基本骨架:
---
description: "When this rule should apply"
globs: ["src/components/**/*.tsx"]
alwaysApply: false
---
Your instructions go here in plain markdown.三個 frontmatter 欄位控制一切:
| 欄位 | 類型 | 用途 |
|---|---|---|
alwaysApply | boolean | 設為 true 時,包含在每個 AI 請求中 |
description | string | 幫助代理程式判斷此規則是否相關 |
globs | string[] | 觸發此規則的檔案模式 |
你也可以直接在 Cursor 中建立規則,在聊天中输入 /create-rule 並描述你想要的内容。但手動撰寫能讓你擁有更多控制權。
四種規則類型詳解
規則的啟動方式取決於其 frontmatter 設定。共有四種模式,選擇正確的模式對你的 上下文視窗預算 至關重要。
始終套用 (Always Apply)
---
alwaysApply: true
---載入到每一個 AI 請求中。請謹慎使用,僅用於專案級別的基礎設定,例如技術堆疊聲明或適用於各處的關鍵規範。每個始終啟用的規則都會從每次互動中消耗 Token,無論其是否相關。
自動附加 (Auto-Attached, 基於 Glob)
---
globs: ["src/api/**/*.ts", "src/routes/**/*.ts"]
alwaysApply: false
---僅當你編輯符合 glob 模式的檔案時才會啟動。這是主力規則類型。當你在元件檔案中時,會載入 React 元件規範;當你在路由處理器中時,會載入 API 模式;當你在撰寫測試時,會載入測試規則。
代理程式請求 (Agent-Requested, 智慧型)
---
description: "Database migration patterns using Drizzle ORM"
alwaysApply: false
---沒有 globs,也沒有 always-apply,只有 description。Cursor 的代理程式會閱讀 description 並決定該規則是否與當前任務相關。如果你要求它撰寫遷移腳本,它會引入此規則。如果你在為按鈕樣式化,它會跳過。對於無法整齊對應到檔案路徑的規則,這種方式的效果出奇地好。
手動 (Manual)
---
---未設定任何 frontmatter 欄位(或 frontmatter 為空)。這些規則僅當你在聊天中使用 @rule-name 明確提及它們時才會啟動。適合用於罕見但重要的指令,例如部署檢查清單或偶爾才需要的重構指南。
| 規則類型 | 載入時機 | 最佳適用場景 |
|---|---|---|
| Always Apply | 每個請求 | 技術堆疊、關鍵規範 |
| Auto-Attached | 開啟相符檔案 | 框架模式、檔案類型規則 |
| Agent-Requested | 由代理程式決定 | 跨領域關注點、工作流程 |
| Manual | 使用 @ 提及 | 一次性任務、檢查清單 |
真正有效的 Glob 模式
Globs 決定哪些檔案會觸發自動附加規則。如果設定錯誤,你的規則要麼永遠不會觸發,要麼到處亂觸發。以下是有效的做法:
# All TypeScript files in src
globs: ["src/**/*.ts", "src/**/*.tsx"]
# Only component files
globs: ["**/components/**/*.tsx"]
# Python files, excluding tests
globs: ["**/*.py", "!**/test_*.py"]
# Multiple specific directories
globs: ["src/api/**", "src/services/**"]來自實際使用的幾個注意事項:
src/*僅匹配一層目錄。你幾乎總是想要使用src/**/*進行遞迴匹配。*.js不會匹配.jsx或.ts檔案。請明確指定副檔名。- Globs 必須是 YAML 列表。像
{src,lib}/**/*.ts這樣的大括號語法可能會靜默失敗,請堅持使用單獨的列表項目。 !前綴用於排除模式,這對於忽略生成的檔案或舊程式碼很有用。
實用規則範例
理論與現實在此交會。這些是你可以直接放入專案並立即看到更好 AI 輸出的規則。
專案級別基礎規則 (Always Apply)
---
alwaysApply: true
---
# Project: Acme Dashboard
## Tech Stack
- Next.js 15 (App Router only — no Pages Router)
- TypeScript strict mode
- Tailwind CSS v4
- Drizzle ORM with PostgreSQL
- pnpm for package management
## Critical Conventions
- All components are React Server Components by default
- Use "use client" only when the component needs interactivity
- Import paths use @/ alias mapped to src/
- Error handling: wrap async operations in try/catch, never use .catch()
- No default exports except for pages and layouts保持此規則在 30 行以內。它會隨每個請求載入,因此每個字都會消耗 Token。
React 元件規則 (Auto-Attached)
---
description: "React component patterns and conventions"
globs: ["src/components/**/*.tsx", "src/app/**/*.tsx"]
alwaysApply: false
---
# React Component Rules
## Structure
Every component file follows this order:
1. Imports
2. Type definitions (Props interface)
3. Component function (named export)
4. Sub-components (if any)
## Patterns
Use named exports, not default:
- YES: `export function Button({ label }: ButtonProps)`
- NO: `export default function Button()`
For data fetching in Server Components:
```tsx
// 直接在元件中獲取資料,不使用 useEffect
export async function UserProfile({ id }: { id: string }) {
const user = await db.query.users.findFirst({
where: eq(users.id, id)
});
return <div>{user.name}</div>;
}Anti-Patterns (NEVER do these)
- No useEffect for data fetching in Server Components
- No CSS modules — use Tailwind exclusively
- No barrel exports (index.ts re-exports)
- No prop drilling beyond 2 levels — use context or composition
### Python API 規則 (Auto-Attached)
```yaml
---
description: "FastAPI endpoint conventions and patterns"
globs: ["src/api/**/*.py", "src/routes/**/*.py"]
alwaysApply: false
---
# FastAPI Conventions
## Endpoint Structure
- Use APIRouter for route grouping
- Type all request/response models with Pydantic v2
- Dependency injection for database sessions
## Pattern
```python
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/{user_id}", response_model=UserResponse)
async def get_user(
user_id: int,
db: AsyncSession = Depends(get_db)
) -> UserResponse:
user = await db.get(User, user_id)
if not user:
raise HTTPException(status_code=404, detail="User not found")
return UserResponse.model_validate(user)Error Handling
- Always use HTTPException, not raw Response objects
- Log errors with structlog before raising
- Return consistent error shapes: {"detail": "message"}
### Go Service 規則 (Auto-Attached)
```yaml
---
description: "Go service patterns and error handling"
globs: ["**/*.go", "!**/*_test.go"]
alwaysApply: false
---
# Go Conventions
## Error Handling
- Always handle errors immediately — no _ for error returns
- Wrap errors with fmt.Errorf("context: %w", err)
- Use sentinel errors for expected failure cases
## Project Layout
- cmd/ for entrypoints
- internal/ for private packages
- pkg/ for public libraries
## Pattern
```go
func (s *UserService) GetByID(ctx context.Context, id string) (*User, error) {
user, err := s.repo.Find(ctx, id)
if err != nil {
if errors.Is(err, ErrNotFound) {
return nil, fmt.Errorf("user %s: %w", id, ErrNotFound)
}
return nil, fmt.Errorf("fetching user %s: %w", id, err)
}
return user, nil
}
## 管理 Token 稅負
這是大多數 Cursor 指南忽略的一點:你撰寫的每個規則都會消耗 Token。一個擁有 20 個始終啟用規則的專案,可能在 AI 甚至查看你的程式碼之前,每個請求就消耗 **2,000+ Token** 僅用於指令。
這很重要,因為 Cursor 的聊天上下文在標準模式下大約為 20,000 Token。如果你的規則吃掉了其中的 25%,你就損失了四分之一的 AI「思考空間」來處理你的實際問題。隨著規則累積,你會注意到輸出品質變差,特別是在較長的對話中。
三個原則能保持你的 Token 預算健康:
**1. 積極使用自動附加和代理程式請求規則。** 只有你的專案堆疊聲明應該始終啟用。其他一切都應條件式載入。那個 React 元件規則?當你撰寫 SQL 遷移腳本時,它不需要存在於上下文中。
**2. 寫得精簡,不要囉嗦。** 將「強烈建議開發者在定義公共 API 合約時使用 TypeScript 介面而非類型別名」替換為「公共 API 優先使用 `interface` 而非 `type`」。AI 不需要說服,它需要指令。
**3. 應用「三次規則」。** 只有在 AI 犯錯三次後,才將模式編碼為規則。如果 Cursor 已經在沒有規則的情況下正確處理了你的命名規範,那就跳過該規則。每個不必要的規則都是浪費的上下文。
你可以在 Cursor 聊天面板底部的狀態列監控 Token 使用情況。注意它是否接近 100%,那是你需要修剪規則的信號。
## 為真實專案組織規則
一個生產環境專案通常需要 5-8 個規則檔案。以下是一個運作良好的結構:
```text
.cursor/rules/
base.mdc # Tech stack, always-apply (< 30 lines)
components.mdc # React/Vue patterns, glob to component dirs
api.mdc # Backend conventions, glob to API dirs
database.mdc # ORM patterns, glob to models/migrations
testing.mdc # Test conventions, glob to test files
deployment.mdc # CI/CD patterns, manual trigger
personal.mdc # Your preferences (gitignored)除了 personal.mdc 之外,將所有内容提交到版本控制。這樣你的整個團隊都能獲得相同的 AI 行為,這正是重點所在。正如一位 Cursor 論壇用戶所言,好的規則意味著「你更多地原樣接受建議,輸出在第一次嘗試时就符合你的規範」。
如果你在使用 Cursor 的同時也使用其他 AI 編碼工具,這些概念可以直接轉移。Claude Code 使用 CLAUDE.md,GitHub Copilot 有指令檔案,Windsurf 也有自己的格式,但底層原理是相同的。
規則優先級如何運作
當多個規則適用於同一個檔案時,Cursor 遵循明確的層級:
| 優先級 | 來源 | 覆蓋行為 |
|---|---|---|
| 1 (最高) | 團隊規則 (儀表板) | 用戶無法停用 |
| 2 | 專案規則 (.cursor/rules) | 覆蓋用戶規則 |
| 3 | 用戶規則 (Cursor 設定) | 全域預設值 |
團隊規則可在 Team 和 Enterprise 方案中使用。它們由管理員在 Cursor 儀表板中設定,並在整個組織中強制執行,個別開發人員無法關閉它們。
在專案規則內部,如果兩個規則適用於同一個檔案且發生衝突,行為並未嚴格定義。在實踐中,後來載入的規則往往具有優先權。為你的檔案編號(001-base.mdc, 002-components.mdc)可以讓你獲得可預測的順序。
常見錯誤及修復方法
在閱讀了數十個社區討論串並在多個專案中測試規則後,這些是最常讓人栽跟頭的錯誤:
撰寫過於模糊的規則。 「撰寫乾淨的程式碼」對 AI 來說毫無意義。「使用具名匯出,而非預設匯出。將元件結構化為:匯入、類型、函數、子元件」則提供了可執行的內容。
讓所有內容都始終套用。 你的直覺可能是對每個規則都設定 alwaysApply: true。請抵制這種衝動。每季度審計你的規則,如果你有超過 2-3 個始終啟用的規則,你可能正在浪費 Token。
忘記測試規則。 撰寫規則後,開啟相關檔案並要求 Cursor 生成應遵循該規則的內容。如果沒有,你的 glob 模式可能有誤,或者指令不夠清晰。
未記錄反模式 (Anti-patterns)。 告訴 AI 要做什麼只是工作的一半。告訴它 不要 做什麼是另一半。在每个规则中包含一个「絕不執行這些操作」的部分,並提供錯誤方法的明確範例。
忽略 UI 中的規則儲存。 一個 已知錯誤 會導致規則編輯消失。如果更改消失,請完全關閉 Cursor,在未保存更改的彈出視窗中選擇「覆蓋 (Override)」,然後重新開啟。
Cursor Rules vs CLAUDE.md vs AGENTS.md
Cursor 並非唯一使用指令檔案的工具。以下是為那些在 多個 AI 編碼助手 之間工作的人提供的格式比較:
| 功能 | .cursor/rules | CLAUDE.md | AGENTS.md |
|---|---|---|---|
| 格式 | 帶 frontmatter 的 MDC | 純 Markdown | 純 Markdown |
| Glob 範圍 | 是 | 否 | 目錄級別 |
| 規則類型 | 4 種 (always, auto, agent, manual) | 始終啟用 | 始終啟用 |
| Token 控制 | 細粒度 | 粗粒度 | 粗粒度 |
| 版本控制 | 是 | 是 | 是 |
| 適用環境 | 僅 Cursor | Claude Code | 多種工具 |
Cursor 的優勢在於細粒度。CLAUDE.md 和 AGENTS.md 更簡單,它們始終載入所有内容。Cursor 讓你能在正確的時間載入正確的規則,這在你的指令集超過幾百行時變得非常重要。
若要深入了解上下文如何在這些工具中塑造 AI 輸出,我們的 上下文工程指南 分解了無論你使用哪種編輯器都適用的原則。
常見問題 (FAQ)
.cursorrules 已棄用嗎?
是的。專案根目錄中的單一 .cursorrules 檔案仍然有效,但 Cursor 建議遷移到 .cursor/rules/*.mdc 檔案。新格式支持 glob 模式、條件式載入和更好的組織。透過將單一大檔案拆分為專注的規則來進行遷移。
我應該使用什麼副檔名,.mdc 還是 .md?
對於包含 YAML frontmatter(description, globs, alwaysApply)的檔案,請使用 .mdc。純 .md 檔案也可以在 rules 目錄中運作,但不支持啟用條件式載入的 frontmatter 元數據。
一個專案應該有多少個規則?
對大多數專案來說,五到八個是甜蜜點。一個始終啟用的基礎規則,三到四個按檔案類型範圍劃分的自動附加規則,以及一兩個用於特殊任務的手動規則。超過 10 個規則通常意味著有些可以合併或移除。
Cursor rules 會影響自動完成和 Tab 補全嗎?
規則適用於聊天和代理程式互動。用戶規則 不 適用於內聯編輯 (Cmd/Ctrl+K),且規則通常不會影響 Cursor Tab 自動完成建議。它們在聊天和 Composer 會話中最有效。
我可以在多個專案之間共享規則嗎?
可以,透過 Cursor 的 Remote Rules 功能。前往 Cursor Settings > Rules, Commands,選擇「Remote Rule (GitHub)」,並貼上儲存庫 URL。當來源儲存庫更新時,規則會自動同步。或者,維護一個共享規則儲存庫並符號連結到每個專案中。
建議的最大規則長度是多少?
Cursor 的文件建議將個別規則保持在 500 行 以下。在實踐中,目標是每個規則少於 100 行。較短的規則更容易維護且消耗較少的 Token。如果規則超過 150 行,請將其拆分為兩個專注的規則。
規則是否適用於 Cursor 中的所有 AI 模型?
規則適用於 Cursor 支持的每個模型,包括 Claude、GPT-4o、Gemini 等。無論你選擇哪個模型,規則都會作為系統級上下文注入。模型行為可能有所不同,但規則本身與模型無關。
如何除錯無效的規則?
首先,驗證 glob 模式是否匹配你的檔案,開啟檔案並檢查規則是否出現在上下文面板中。其次,使用應觸發規則的直接問題進行測試。第三,暫時設定 alwaysApply: true 以確認規則内容本身有效。如果有效,則問題出在你的 glob 模式上。
我應該將 .cursor/rules 提交到 git 嗎?
絕對應該。專案規則的重點在於團隊範圍的一致性。提交 .cursor/rules/ 中的所有内容,除了個人偏好檔案。將 personal.mdc 添加到 .gitignore 中,用於不應適用於所有人的個人設定。
我可以將 Cursor rules 與 MCP 伺服器一起使用嗎?
可以,而且它們互補性很好。規則定義 AI 應 如何 撰寫程式碼,而 MCP 伺服器 則讓 AI 能夠存取外部工具和資料。規則可能會說「始終使用我們的內部 API 客戶端」,而 MCP 伺服器則讓 AI 在開發過程中實際查詢該 API。
如果 AI 功能在你的路線圖上,這正是我們的專長:Techsy 的 AI 整合團隊 協助將 LLM 系統從原型推向生產環境。想要對你的技術堆疊獲得第二意見嗎?獲取免費諮詢。