这个教程解决什么问题
每个新会话都要重复交代一遍项目约定——“我们用 pnpm 不用 npm""组件一律函数式""错误统一走 AppError”——说多了烦,忘了说就返工。Rules 就是把这些约定写成文件,让 Cursor 每次对话自动带着走。这篇按”全局偏好 → 项目规则 → 触发方式 → 写法打磨”的顺序,给你一套能直接抄进仓库的配置实践。
环境与机制速览
Cursor 的规则分两级,各管一摊:
| 级别 | 位置 | 作用范围 |
|---|---|---|
| User Rules | Settings 里的 Rules 设置项 | 你的所有项目,全局生效 |
| Project Rules | 仓库内 .cursor/rules/ 目录 | 只作用于该项目,随 git 共享 |
早期社区通行做法是在项目根放一个 .cursorrules 文件;现在官方主推 .cursor/rules/ 目录结构,旧文件仍被兼容读取,但建议尽早迁移。版本号在 Help → About 查看【待补:你的 Cursor 实际版本号】。
第一级:User Rules,写跨项目偏好
在 Settings 的 Rules 设置项里用自然语言写,适合放”对任何项目都成立”的偏好:
- 始终用中文回复和解释代码
- 修改前先给方案,确认后再动手
- 不确定的 API 直接问我,禁止编造不存在的函数
- 生成的代码补上必要注释
注意 User Rules 是全局的:别把某个项目特有的约定写进来,否则换项目时它会拿错误的上下文污染对话。项目特有的事,交给下一级。
第二级:Project Rules,随仓库走
项目根建 .cursor/rules/ 目录,一个关注点一个 .mdc 文件:
.cursor/
└── rules/
├── general.mdc # 全项目通用约定,always 生效
├── python.mdc # 只对后端 Python 文件生效
└── frontend.mdc # 只对前端文件生效
每个 .mdc 文件用 frontmatter 声明何时生效,正文写具体指令。一个可直接抄的后端示例:
---
description: 后端 Python 代码规范
globs:
- "app/**/*.py"
alwaysApply: false
---
- 数据库操作统一走 app/db/session.py 的 get_session(),禁止直接建连接
- 业务异常抛 app/errors.py 定义的 AppError 子类,禁止裸抛 Exception
- 新增接口必须带 pytest 用例,命名 test_<函数名>
- 提交信息格式:类型: 中文摘要(如 feat: 增加订单导出)
全项目都要生效的约定(提交规范、目录结构说明)单独放一个文件,alwaysApply 置为 true、globs 留空。建议单条规则十行上下、1 KB 以内(经验口径),长了必然没人遵守,模型也一样。
四种触发方式怎么选
frontmatter 的写法决定规则何时注入对话:
| frontmatter 写法 | 行为 | 适合放什么 |
|---|---|---|
alwaysApply: true | 每次对话都注入 | 提交规范、架构总览 |
globs: ["app/**/*.py"] | 命中对应文件时自动注入 | 各技术栈的编码规范 |
只写 description | 模型判断相关时自行取用 | 大块头的架构与领域说明 |
| 都不写 | 仅手动 @ 引用时生效 | 偶尔才用的流程说明 |
判断标准一句话:这个约定是不是只在碰到某类文件时才有意义。是,就用 globs;不是,才考虑 always。所有 always 规则都会进每一次请求的上下文,体积直接换算成额度和注意力成本——多份 always 规则叠加到 50 KB(示例规模,发布前替换为你的实测)这个量级时,模型对每条规则的服从度会肉眼可见地下降。
写规则的实践:像写代码规范一样写
写”必须做什么”,不写”不要写烂代码”。 “代码要简洁”是废话,模型无从执行;“禁止超过 3 层嵌套,超出必须提取函数”才是一条规则。
一条管一件事,超出就拆文件。 按关注点拆分,命名即文档:python.mdc、frontend.mdc、git.mdc。
长文档用 @file 引用。 已有的详细设计文档不必塞进规则,规则里写摘要加 @docs/architecture.md 引用,模型需要时自己去读。
子目录可以有独立规则。 大仓里在子包下再建 .cursor/rules/,只管那棵子树,monorepo 友好。
AI 能帮你起稿,但你必须修剪。 对话里可以让模型根据当前项目生成规则草稿,但生成物往往又长又虚,逐条删到只剩可验证的指令为止。
常见坑与解法
坑 1:新旧机制并存,团队改错了文件
仓库根还留着 .cursorrules,有人往新目录加规则,有人还在改旧文件,两边说法还不一致。处理:把旧文件内容合并进 .cursor/rules/general.mdc,删掉旧文件(git 历史随时可找回),在 README 写明”改规则请去 rules 目录”。
坑 2:globs 写错,规则永远不触发
globs 匹配的是相对仓库根的路径,用正斜杠 /,Windows 上写反斜杠不生效;*.py 只匹配根目录,子目录要写 **/*.py。验证方法:让 Cursor 新建一个命中路径的文件并故意违反一条规则,看它是否自我纠正。
坑 3:规则写成感想散文
“我们团队注重代码质量和可维护性”这类句子没有信息量。每条规则改写成编号指令:动词开头、有明确对象、能判断违反与否。
坑 4:两条规则打架
frontend.mdc 说样式用方案 A,legacy.mdc 说用方案 B,模型只能随机站队。拆分时给每个文件划清管辖边界,同一类文件只归一条规则管;实在重叠,在 description 里写清优先关系。
最终效果与验证
配置完成后做一次验收:新开对话,让它在项目里新增一个符合规范的接口,检查三件事——是否主动用了 get_session()、是否带了 pytest 用例、给出的提交信息是否符合格式。三个都对,规则就算立住了;有偏差,回头检查对应规则是不是被写成了散文。

【待补:规则生效前后生成结果对比截图】
高频问答
- 规则会消耗额度吗:会。always 类规则随每次请求发送,token 计入上下文,所以只放真正的全局约定;
- 团队怎么共享:
.cursor/rules/随 git 提交,全组自动统一;User Rules 是个人的,不进仓库; - 和 CLAUDE.md、AGENTS.md 这类文件什么关系:都是”给 AI 的项目说明书”,思路相通,内容可以互相搬运,但文件位置和语法不通用,别混着放;
- 规则越多越好吗:不是。总量超过模型上下文的一定比例(示例阈值,发布前按官方当期建议修正)后服从度下降,宁少而精;
- 官方对规则长度的建议是多少:以官方文档当期口径为准【待补:当期建议数字】。
相关阅读
- Cursor 新手入门:界面/Tab 补全/Agent 模式
- Cursor 中文设置教程:界面汉化与中文回复配置:User Rules 的典型用法之一
- Claude Code CLAUDE.md 实践:同类机制在命令行工具里的做法
- Cursor 接入 MCP 服务器教程