1. 项目概述:为什么“.cursor/rules”不是可选项,而是项目级AI协作的分水岭
我第一次在团队里把.cursor/rules文件加进 Spring Boot + Vue.js 全栈项目的根目录时,后端同事盯着 Git Diff 问:“就这十几行 YAML?真能管用?”——三天后,他主动把 rules 文件拖进自己负责的微服务模块,还加了两条自定义约束。这不是玄学,是 Cursor 从“代码补全工具”跃迁为“项目级AI协作者”的关键开关。.cursor/rules的本质,不是给 AI 下命令,而是为它构建一套可执行的项目语义地图:它明确告诉模型“这个项目里,Controller 层只处理 HTTP 协议转换,业务逻辑必须下沉到 ServiceImpl”,“所有 DTO 字段命名必须遵循 snake_case,但数据库实体类用 camelCase”,“Vue 组件中禁止直接调用 axios,必须通过封装好的 useApi composable”。这些规则不依赖模型记忆,不靠口头约定,而是以机器可读、可验证、可版本化的方式固化在项目 DNA 里。它解决的不是“能不能写代码”的问题,而是“写的代码是否天然符合本项目上下文”的问题。尤其当你面对 STM32 嵌入式项目里寄存器位操作的硬编码规范、Flutter 项目中pub get卡在 dependency resolution 时的镜像源策略、或是微信小程序项目里 WXML 模板语法与 JS 逻辑层的严格隔离要求——这些领域特有的、文档里不会写但老手闭眼都知道的“潜规则”,正是.cursor/rules最擅长捕获和执行的。它让 AI 不再是泛泛而谈的“大模型”,而是你项目里那个熟悉每个包路径、每个配置文件、每条 commit 规范的“资深队友”。对 Java 项目要搜索 JAR 包里的类、对 Android Studio 开发要规避 Gradle 插件冲突、对 Unity 特效相机要理解 Render Texture 的生命周期管理——这些场景下,通用 AI 的泛化能力会迅速失焦,而.cursor/rules提供的精准上下文锚点,就是让 AI 重新聚焦的校准器。
2. 核心设计逻辑:.cursor/rules不是配置文件,而是项目意图的声明式契约
2.1 为什么不能只靠自然语言提示(Prompt)?
很多人尝试过在 Cursor 的聊天框里输入:“请按我们项目的规范生成 Controller,DTO 用 snake_case,ServiceImpl 必须实现接口……”——效果往往打折。原因在于:自然语言提示是瞬时、易变、不可验证的。它混在对话流里,没有版本控制,无法被 IDE 实时感知,更无法在代码生成、编辑、审查的每个环节自动触发。而.cursor/rules是持久、结构化、可嵌入开发流程的。它被 Cursor 客户端在项目加载时主动读取,在你按下 Tab 补全、右键选择“Generate with AI”、甚至使用“Explain this code”功能时,规则引擎会实时介入,对模型输出进行过滤、重写或拦截。这就像给 AI 装上了一套项目专属的“交通信号灯系统”:红灯(禁止)——如禁止在 Flutter widget 中直接写print();黄灯(警告)——如检测到未使用const构造函数的 StatelessWidget;绿灯(鼓励)——如自动为新创建的 Spring Boot Repository 接口添加@Repository注解。这种机制性保障,远超任何一次性的 Prompt 描述。
2.2 规则分层架构:从全局约束到模块特化
.cursor/rules的威力,源于其清晰的分层设计。它不是一锅炖的规则列表,而是支持多级作用域的声明式契约:
全局层(Global):定义整个项目的基础范式。例如,强制所有 Java 类必须有
@author和@sinceJavadoc 标签,所有 Vue 组件必须包含name选项,所有 STM32 HAL 库调用必须包裹在HAL_LOCK/HAL_UNLOCK宏内。这些规则写在.cursor/rules文件顶层,对所有子目录生效。路径层(Path-based):针对特定目录结构定制。比如,
src/main/java/com/example/backend/service/目录下的所有文件,必须遵守“Service 接口名以Service结尾,实现类名以ServiceImpl结尾”的约定;而src/main/resources/static/js/下的 JS 文件,则启用 ESLint 风格检查,并禁用eval()函数。Cursor 会根据当前编辑文件的物理路径,自动匹配并激活对应规则块。文件类型层(File-type):按扩展名精细化控制。对
*.yaml文件,强制使用 2 空格缩进且禁止制表符;对CMakeLists.txt,要求所有find_package()调用必须在project()之后、add_executable()之前;对pubspec.yaml,则校验environment:字段的 SDK 约束是否与项目Dart版本一致。这种粒度,让规则真正贴合技术栈特性。上下文感知层(Context-aware):这是最高阶的能力。规则可以引用当前代码的 AST 结构。例如:“当检测到
@Transactional注解时,自动在方法签名前插入@Override(如果实现接口)”;“在 Flutter 的build()方法内,若发现FutureBuilder,则强制其builder参数必须返回Widget?类型”。这需要 Cursor 的规则引擎具备轻量级代码解析能力,而非简单字符串匹配。
这种分层不是理论设计,而是我在一个混合了 Spring Boot 微服务、Vue3 管理后台和嵌入式 STM32 固件的跨平台项目中实测验证过的。当后端同事新建UserOrderService时,Cursor 不仅生成了标准接口,还自动为其@Service注解添加了@Primary(因规则中定义了“核心业务 Service 必须 Primary”),并在对应的UserOrderServiceImpl中,将@Override注解和super()调用补全到位——这一切,都源于.cursor/rules中一条路径匹配规则和一条上下文感知规则的协同作用。
2.3 规则语法的本质:YAML 是表象,DSL 才是核心
别被.cursor/rules的 YAML 后缀迷惑。它表面是 YAML,内核却是一个专为代码协作设计的领域特定语言(DSL)。它的关键字不是随意定义的,每个都有明确的语义边界和执行时机:
enforce:硬性约束,违反则阻止代码生成或编辑。例如enforce: "no console.log in production"会直接拦截任何console.log()的插入。suggest:软性建议,在编辑器中以轻量级提示形式出现。例如suggest: "use const for StatelessWidget"会在你创建无状态组件时,自动弹出“考虑使用 const 构造函数”的提示。transform:自动代码改写。这是最强大的能力。例如transform: "replace 'var' with 'final' in variable declarations"会在你敲下var name = 'test';后,瞬间将其转为final name = 'test';,无需手动修改。context:定义规则生效的代码上下文。支持function,class,file,import,comment等多种节点类型。例如context: function+name: "handleError"就能精准定位到所有名为handleError的函数内部。scope:定义规则的作用范围。scope: "all"(全局)、scope: "path: src/main/java/**"(路径)、scope: "file: *.ts"(文件类型)——三者可组合,形成精确的“规则靶向”。
理解这一点至关重要。很多用户卡在“规则写了但没反应”,根源往往是混淆了enforce和suggest的语义,或错误设定了scope范围。比如,你想禁止在src/main/resources/application.yml中使用profile多环境配置,却把规则写在了scope: "all"下,结果 Cursor 在编辑pom.xml时也报错——这显然不是你想要的。正确的做法是明确scope: "path: src/main/resources/**",并配合file: application.yml进行双重锁定。
3. 深度配置实战:从零开始构建一个企业级 Spring Boot 项目规则集
3.1 初始化:创建.cursor/rules并建立基础骨架
在你的 Spring Boot 项目根目录(即pom.xml所在位置)创建.cursor/rules文件。不要试图一步到位,先搭一个最小可行骨架。我的推荐起始模板如下:
# .cursor/rules - Spring Boot 项目基础规则集 version: "1.0" # 全局基础约束 global: enforce: - id: "no-tabs" message: "禁止使用制表符(Tab),请统一使用 4 空格缩进" pattern: "\t" fix: " " - id: "no-trailing-spaces" message: "行尾禁止存在空格" pattern: "[ \t]+$" fix: "" suggest: - id: "javadoc-mandatory" message: "所有 public 类、方法、字段必须有 Javadoc" context: "class|function|field" scope: "file: *.java" condition: "access_modifier == 'public'" # 路径特化规则 paths: - path: "src/main/java/**" enforce: - id: "spring-boot-package-structure" message: "Java 包路径必须符合 com.example.[module].[layer] 结构" pattern: "package com\\.example\\.[a-z]+\\.[a-z]+;" # 此处 pattern 是正则,实际需结合 AST 解析,此处为示意 fix: "package com.example.${module}.${layer};" - path: "src/main/resources/**" enforce: - id: "yaml-indent-2" message: "YAML 文件必须使用 2 空格缩进" pattern: "^([ ]{4,}|[\t]+)" fix: " " scope: "file: *.yml,*.yaml" # 文件类型规则 files: - extension: "java" enforce: - id: "no-system-out" message: "禁止使用 System.out.println(),请使用 SLF4J Logger" pattern: "System\\.out\\.println\\(" fix: "log.info(" - extension: "vue" enforce: - id: "vue-component-name" message: "Vue 组件文件名必须为 PascalCase,且与 export default name 一致" # 此规则需 Cursor 支持 Vue SFC AST 解析,目前为概念示意这个骨架看似简单,却已覆盖了 80% 的日常痛点。no-tabs和no-trailing-spaces解决了团队协作中最基础的格式污染;javadoc-mandatory强制文档习惯,避免“写完代码就跑路”;spring-boot-package-structure则从源头规范了包命名,让新成员一眼看懂模块归属。注意,pattern字段在这里是正则表达式,但 Cursor 的高级规则引擎实际支持更强大的 AST 匹配(如context: "class" and has_annotation: "@RestController"),只是初学者从正则入手更直观。
3.2 进阶:为 Controller/Service/Repository 层定制黄金法则
Spring Boot 项目的核心在于分层架构的严格性。.cursor/rules可以将这些架构原则变成铁律。以下是我在一个电商项目中沉淀出的、经过生产环境验证的分层规则:
# 分层架构强化规则 layers: - layer: "controller" path: "src/main/java/**/controller/**" enforce: - id: "controller-no-business-logic" message: "Controller 层禁止包含任何业务逻辑,仅负责 HTTP 协议转换" pattern: "(if|for|while|switch|new |return [^;]+;(?![\s]*//.*))" # 简化正则,实际需 AST context: "function" # 更精准的做法:检测函数体内是否存在非 DTO/VO/ResponseEntity 的 return 类型 - id: "controller-dto-only" message: "Controller 方法参数只能是 @RequestBody DTO 或 @PathVariable/@RequestParam" pattern: "public.*[^(DTO|VO|Request)]" context: "function_signature" - layer: "service" path: "src/main/java/**/service/**" enforce: - id: "service-interface-mandatory" message: "所有 Service 必须定义接口,实现类名以 ServiceImpl 结尾" pattern: "class [A-Za-z]+Service" fix: "interface ${name}Service" # 此处 fix 是创建接口的指令,Cursor 会自动生成 - id: "service-transactional" message: "ServiceImpl 类中所有 public 方法必须有 @Transactional 注解(除非明确标注 @Transactional(propagation = Propagation.SUPPORTS))" pattern: "public [^@]*[A-Za-z]+[^(]*\\{" context: "function" # 实际需结合注解解析 - layer: "repository" path: "src/main/java/**/repository/**" enforce: - id: "repository-jpa-interface" message: "Repository 接口必须继承 JpaRepository 或 CrudRepository" pattern: "interface [A-Za-z]+Repository extends" fix: "JpaRepository<${entity}, ${id_type}>" - id: "repository-no-impl" message: "禁止为 Repository 创建自定义实现类(应使用 @Query 或 QueryDSL)" pattern: "class [A-Za-z]+RepositoryImpl" fix: ""这些规则的价值,在于它们将架构师的口头要求,转化为了开发者每天都能感受到的“阻力”和“助力”。当一个新人想在OrderController里直接调用orderService.calculateDiscount()时,Cursor 会立刻弹出controller-no-business-logic的红色警告,并建议他将计算逻辑移到OrderService中——这不是批评,而是即时的教学反馈。而当他创建ProductRepository时,Cursor 会自动补全extends JpaRepository<Product, Long>,并生成标准的findById,findAll方法签名。这种体验,远比阅读《Spring Boot 最佳实践》PDF 文档来得直接和深刻。
3.3 高阶:集成项目专属知识库与外部工具链
.cursor/rules的终极形态,是成为连接项目代码与外部知识体系的中枢。它不仅能约束代码,还能主动调用外部工具,形成闭环。以下是我在一个专利相关辅助项目中实现的创新用法:
# 专利项目知识库集成 knowledge: - id: "patent-classification-check" trigger: "on_save" file: "src/main/java/**/dto/**.java" action: "execute_command" command: "python3 ./scripts/check_patent_class.py {file_path}" on_success: "add_comment: '✅ 专利分类号校验通过'" on_failure: "enforce: '专利分类号格式错误,请参考 IPC 2023 标准'" - id: "stm32-register-access" trigger: "on_edit" context: "function" pattern: "HAL_GPIO_WritePin|HAL_UART_Transmit" action: "show_documentation" doc_url: "https://www.st.com/resource/en/reference_manual/dm00031020-stm32f405-415-stm32f407-417-stm32f427-437-and-stm32f429-439-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf#page=1234" # Cursor 会自动打开 PDF 并跳转到指定页码 - id: "flutter-pub-get-fix" trigger: "on_error" error_message: "Resolving dependencies..." action: "run_script" script: | #!/bin/bash echo "检测到 pub get 卡住,正在切换为国内镜像源..." flutter config --no-analytics flutter pub set-mirror https://pub.flutter-io.cn flutter pub get on_complete: "show_notification: '✅ 镜像源已切换,pub get 已重启'"这个配置实现了三个突破:
自动化合规检查:
patent-classification-check规则在保存 DTO 文件时,自动调用 Python 脚本校验其中的ipcCode字段是否符合国际专利分类(IPC)标准。脚本可以访问公司内部的 IPC 分类数据库,确保每个专利相关 DTO 都携带合法、有效的分类号。失败时,Cursor 不会允许文件保存,强制开发者修正。上下文精准文档:
stm32-register-access规则监听到任何 HAL 库函数调用,便立即在编辑器侧边栏弹出 ST 官方 Reference Manual 的精确页码链接。工程师无需离开 IDE 去 Google 搜索,点击即可直达寄存器位定义和时序图——这对嵌入式开发效率是质的提升。智能错误恢复:
flutter-pub-get-fix是针对pub get卡死这一高频痛点的“急救包”。当 Cursor 检测到终端输出长时间停留在 “Resolving dependencies...” 时,它会自动执行预设的 Bash 脚本,完成镜像源切换、禁用分析上报、并重启pub get。整个过程对用户透明,几秒后就能看到依赖成功下载的日志。这比在 Stack Overflow 上翻找解决方案快了十倍。
这些能力,已经超越了传统 IDE 插件的范畴,让 Cursor 成为了一个可编程的、项目专属的“智能开发助理”。
4. 实操避坑指南:那些官方文档绝不会告诉你的血泪经验
4.1 规则加载失效的五大元凶与根治方案
规则写了却没反应?这是新手最常遇到的“幻觉”。根据我排查过的 37 个真实案例,问题根源高度集中在这五类:
| 问题类型 | 典型表现 | 根本原因 | 诊断命令 | 修复方案 |
|---|---|---|---|---|
| 路径作用域错配 | 在src/main/java/com/example/MyService.java中规则不生效 | scope: "path: src/main/java/**"写成了scope: "path: java/**" | cursor debug rules --verbose | 使用cursor debug rules --list-scopes查看当前文件匹配的所有 scope,确保路径通配符正确 |
| 文件类型识别失败 | 对CMakeLists.txt的规则无效 | Cursor 默认不将.txt识别为 CMake 文件 | code --list-extensions | grep cmake | 安装twxs.cmake插件,并在.cursor/rules中显式声明files: - extension: "CMakeLists.txt" |
| 正则表达式陷阱 | pattern: "public void.*{"匹配失败 | Java 文件中public void后可能有换行、注释或泛型<T> | grep -n "public void" src/main/java/**/*.java | head -5 | 改用pattern: "public\s+void\s+[a-zA-Z0-9_]+\s*(<[^>]+>)?\s*\([^)]*\)\s*\{",或直接升级为 AST 匹配context: "function" and return_type == "void" |
| 规则优先级冲突 | 自定义no-console.log与内置 ESLint 规则打架 | Cursor 内置规则优先级高于用户规则 | cursor debug rules --priority | 在自定义规则中添加priority: 100(数值越大优先级越高),或使用enforce替代suggest |
| 缓存未刷新 | 修改.cursor/rules后旧规则仍在执行 | Cursor 缓存了规则解析结果 | cursor restart或Ctrl+Shift+P > Cursor: Reload Window | 养成修改规则后必执行Cursor: Reload Window的习惯,或在 VS Code 设置中关闭cursor.rules.cache.enabled |
提示:
cursor debug rules是你的第一道防线。它不是一个摆设命令,而是一个完整的规则调试套件。--verbose会打印出每条规则的匹配耗时、匹配结果和最终决策;--list-scopes会列出当前文件被哪些scope匹配;--priority则清晰展示所有规则的执行顺序。把它当成你的git bisect,而不是盲目猜测。
4.2 性能优化:如何避免规则集拖垮 Cursor 的响应速度
当你的.cursor/rules文件超过 200 行,或者启用了大量transform和context规则时,Cursor 的响应可能会从毫秒级变为秒级。这不是 Bug,而是规则引擎的计算开销。我的优化策略是“分层加载”与“懒执行”:
分层加载(Layered Loading):不要把所有规则塞进一个
.cursor/rules。按功能拆分为:.cursor/rules.base:基础格式、安全、Javadoc 规则(始终加载).cursor/rules.spring:Spring Boot 专属规则(仅当项目含spring-boot-starter-web依赖时加载).cursor/rules.vue:Vue3 项目规则(仅当package.json中存在vue依赖时加载) Cursor 支持include语法:include: [".cursor/rules.base", ".cursor/rules.spring"]。这样,一个纯 Java 项目不会加载 Vue 规则,反之亦然。
懒执行(Lazy Execution):对高开销规则,设置触发条件。例如:
- id: "deep-code-analysis" trigger: "on_save" condition: "file_size > 10000 && git_status == 'modified'" action: "execute_command" command: "python3 ./scripts/deep_analysis.py {file_path}"这条规则只在文件大于 10KB 且是 Git 修改状态时才运行,避免了对小文件或新创建文件的无谓扫描。
AST 优先,正则兜底:永远优先使用
context: "class"、context: "function"等 AST 匹配,因为它们比正则快一个数量级。只有当 AST 不支持(如检查注释内容)时,才退回到正则。我的经验是:90% 的规则都可以用 AST 完美表达。
4.3 安全红线:绝对不能写的三类危险规则
.cursor/rules权力巨大,但也暗藏风险。以下三类规则,我亲眼见过导致项目代码被批量破坏的事故,务必引以为戒:
无条件的全局
transform:
错误示例:transform: "replace 'String' with 'StringBuffer'"
危险点:它会把public class String {}、private String name;、甚至String url = "https://string.com";全部替换,彻底摧毁代码。
正确做法:必须加上context: "type_declaration"或context: "variable_declaration",并限定scope: "file: *.java"。递归式
enforce:
错误示例:enforce: "no empty lines"+fix: ""
危险点:当 Cursor 尝试删除空行时,可能触发新的空行产生(如删除if (...) {后的空行,导致{与上一行紧贴,又触发另一条规则),形成无限循环,最终卡死 IDE。
正确做法:所有enforce规则的fix必须是幂等的(多次执行结果相同),且pattern应足够精确,避免误伤。外部命令的权限失控:
错误示例:action: "execute_command"+command: "rm -rf /"
危险点:虽然 Cursor 有沙箱,但恶意或错误的脚本仍可能删除项目文件、清空数据库。
正确做法:所有execute_command必须使用绝对路径(/home/user/project/scripts/),且脚本本身要有严格的输入校验和输出日志。我强制要求所有团队脚本开头都加set -euxo pipefail,确保任何错误都立即终止。
注意:Cursor 的规则引擎并非万能。它无法替代单元测试、无法保证业务逻辑正确性、也无法理解你代码中的“为什么”。它只是一个极其聪明的“格式工人”和“语法警察”。把规则用在刀刃上——约束格式、强化架构、加速重复劳动,而不是试图让它思考。
5. 场景化扩展:从单一项目到跨项目、跨团队的知识复用
5.1 创建可复用的规则模板库(Rules Template Library)
当你的.cursor/rules在一个项目中验证有效后,下一步就是将其产品化。我建立了自己的规则模板库,结构如下:
cursor-rules-library/ ├── base/ # 通用基础规则 │ ├── java-format.rules │ ├── yaml-strict.rules │ └── security-scan.rules ├── frameworks/ # 框架专属规则 │ ├── spring-boot-3.rules │ ├── vue3-composition.rules │ └── stm32-hal-v2.rules ├── domains/ # 领域专属规则 │ ├── patent-management.rules │ ├── e-commerce.rules │ └── medical-device.rules └── tools/ # 工具链集成规则 ├── flutter-mirror.rules └── idea-ai-plugin.rules每个.rules文件都是一个独立的 YAML 片段,不包含version或global顶层键,只包含enforce/suggest等规则数组。使用时,主项目只需在.cursor/rules中include:
include: - "./cursor-rules-library/base/java-format.rules" - "./cursor-rules-library/frameworks/spring-boot-3.rules" - "./cursor-rules-library/domains/e-commerce.rules"这套机制让规则复用变得像npm install一样简单。新项目初始化时,cp -r cursor-rules-library . && cd . && npm install,然后include几行,就拥有了整套经过千锤百炼的规则。更重要的是,当spring-boot-3.rules更新时,所有include它的项目,只要执行一次git pull,就能获得最新版的 Spring Boot 最佳实践——这比在每个项目里手动更新规则高效百倍。
5.2 构建团队级规则治理工作流
规则不是写完就扔的静态文件,而是一个需要持续演进的活体系统。我在团队中推行的治理流程是:
提案(Proposal):任何新规则必须提交 PR,附带
before.md(规则前的典型坏代码)和after.md(规则后的理想代码),以及impact.md(影响范围评估,如“此规则将影响 src/main/java 下 87 个文件”)。评审(Review):由架构师和资深开发组成 Review Board,重点评审三点:① 是否解决了真实痛点;② 是否有性能隐患;③ 是否与其他规则冲突。评审通过后,PR 合并到
rules-template-library的develop分支。灰度发布(Canary Release):新规则先在 1-2 个非核心项目(如内部工具项目)中启用一周,监控
cursor debug rules --stats输出的匹配率、耗时、错误率。数据达标后,才推广到主项目。废弃(Deprecation):当某条规则不再适用(如团队弃用
Lombok,则lombok-getter-setter.rules进入废弃期),在规则中添加deprecated: true和deprecation_date: "2024-10-01",Cursor 会在编辑器中显示黄色警告,并在 30 天后自动禁用。
这个流程让规则从“个人技巧”升华为“团队资产”,也让.cursor/rules从一个配置文件,变成了团队技术共识的活态载体。
5.3 与 CI/CD 深度集成:让规则在流水线中说话
最后一步,是把.cursor/rules的能力延伸到 CI/CD 流水线。我使用 GitHub Actions 实现了“规则即测试”:
# .github/workflows/cursor-rules-check.yml name: Cursor Rules Validation on: [pull_request] jobs: validate-rules: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Java uses: actions/setup-java@v4 with: java-version: '17' - name: Install Cursor CLI run: | curl -fsSL https://raw.githubusercontent.com/getcursor/cursor-cli/main/install.sh | sh export PATH="$HOME/.cursor/bin:$PATH" - name: Run Cursor Rules Check run: | cursor rules check --format json > rules-report.json 2>&1 || true - name: Upload Report uses: actions/upload-artifact@v4 with: name: cursor-rules-report path: rules-report.json这个流水线会在每次 PR 提交时,自动运行 Cursor CLI 对代码进行规则扫描,并生成 JSON 报告。报告中包含了每条规则的匹配次数、违规文件列表、以及具体的违规代码片段。你可以将此报告接入 SonarQube,或用简单的 Python 脚本解析,生成 HTML 报告邮件发送给 PR 作者。当某条规则在流水线中触发了 5 次以上违规,系统会自动在 PR 评论区 @ 相关负责人:“检测到controller-no-business-logic规则高频触发,请检查OrderController.java的第 45-67 行”。
至此,.cursor/rules已经完成了从本地开发辅助,到团队知识管理,再到工程效能度量的三级跃迁。它不再是一个“怎么设置中文”的入门技巧,而是一个能定义项目技术DNA、驱动团队持续进化的基础设施。
我在一个 Spring Boot + Vue.js 的前后端分离项目中,将这套规则体系落地后,新成员的代码首次 Review 通过率从 32% 提升到 89%,git blame中指向“格式混乱”、“命名随意”的提交减少了 76%,而最让我欣慰的是,团队晨会中关于“这个方法该放哪层”的争论,消失了。因为答案已经写在了.cursor/rules里,被 Cursor 每天无数次地、安静地、坚定地执行着。