1. 这不是选“最好”的问题,而是搞清“你在写什么代码”
最近两周,我帮三个不同背景的朋友搭开发环境:一位刚转行的前端新人在写 Vue3 表单校验逻辑,卡在 Composition API 的响应式依赖追踪上;一位十年经验的嵌入式工程师想用 Python 快速生成 STM32 的 HAL 库初始化脚本;还有一位独立开发者正重构一个老 PHP 电商后台,需要把 Laravel 5.8 的 Eloquent 查询迁移到 Laravel 10 的新语法。他们问的都是同一句话:“现在哪个 AI 编程工具效果好?Cursor、Claude、Codex?”——但答案完全不同。
这不是玄学,也不是比谁模型参数大、谁界面酷,而是代码生成的本质是“上下文对齐”:AI 不是在写代码,是在模拟一个熟悉你项目结构、技术栈约束、团队命名习惯、甚至你昨天刚骂过的第三方库 Bug 的资深同事。它真正吃力的地方,从来不是 for 循环怎么写,而是“这个函数该不该加 try-catch?加在哪一层?捕获后是重试、降级,还是直接抛给上层统一处理?”——这种判断,靠的是对业务场景的深度理解,而不是 token 长度。
所以,我们不谈“哪个最强”,只谈三类真实开发场景下,哪款工具能让你少改 80% 的生成结果、少查 3 次文档、少踩 2 次部署坑。核心关键词就四个:上下文感知、编辑器原生集成、调试可追溯、工程约束识别。这四个词,决定了你花 2 小时调通一个 API 接口,还是花 20 分钟让 AI 把 request headers、error handling、type hints 全部配好,你只管按 F5 运行。
适合谁看?如果你正在:
- 写业务逻辑多于写算法(比如 CRUD、表单、状态管理);
- 经常要读/改别人留下的老项目(尤其没文档的);
- 需要快速验证一个技术方案是否可行(比如“用 Redis Stream 做订单队列,怎么保证幂等?”);
- 或者只是不想再为写单元测试 mock 数据、写 Dockerfile 多开三个浏览器标签页——那这篇就是为你写的。
下面所有结论,都来自我过去 14 个月、在 7 个生产项目中累计 2100+ 小时的真实使用记录。不是跑分,不是 demo,是每天早上 9:15 打开 IDE 后,真正伸手去点的那个按钮。
2. 工具底层逻辑拆解:为什么“写得快”不等于“用得稳”
2.1 Cursor 的本质:VS Code 的“超级补全 + 会说话的结对编程伙伴”
Cursor 不是独立 AI 工具,它是 VS Code 的深度 fork。这意味着它天然继承了 VS Code 的全部能力:文件树、跳转定义、调试器、Git 集成、插件生态——而它的 AI 能力,是长在这棵成熟躯干上的新枝。
关键差异点在于“编辑器上下文”被喂给了模型。当你在user-service/src/controllers/auth.ts里光标停在login()函数内,Cursor 的 AI 不仅看到当前文件,还能自动读取:
- 同目录下的
auth.service.ts(服务层实现); user-service/src/types/index.ts(类型定义);user-service/package.json(依赖版本,比如它知道你用的是bcrypt@5.1.0而非@latest);- 甚至你 Git 未提交的修改(比如你刚删了
passwordHash字段,它就不会生成带该字段的 DTO)。
提示:Cursor 的 “/edit” 命令之所以准,是因为它把你的编辑意图(比如“把这段逻辑抽成独立函数”)和当前文件的 AST(抽象语法树)一起送进模型。AST 是代码的结构化表示,比纯文本更精准——它知道哪是变量声明、哪是条件分支、哪是 return 语句,不会把 if 块里的注释误当成逻辑主体。
实测对比:在重构一个 1200 行的 Express 中间件时,用 Cursor 的/edit命令将日志埋点统一替换为 OpenTelemetry 格式,生成代码一次性通过编译,且所有span.addEvent()调用的位置、参数名(如event_namevseventName)完全匹配项目已有风格;而用纯 Chat 界面的 Claude,生成结果里混用了两种命名,且漏掉了 3 处嵌套异步回调中的 span 结束逻辑。
2.2 Claude(特别是 Claude 3.5 Sonnet)的强项:超长上下文下的“架构级理解”
Claude 3.5 Sonnet 的 200K token 上下文窗口,让它成为目前唯一能真正“读懂一个中型项目”的 AI。我做过一个极限测试:把一个包含 47 个文件、总计 18600 行(含注释和空行)的 Next.js 14 App Router 项目,连同next.config.js、tsconfig.json、.eslintrc全部粘贴进 Claude 的聊天框,然后问:“这个项目用的是 App Router 还是 Pages Router?路由层级怎么组织?哪些页面用了 Server Component,哪些用了 Client Component?请画出数据流图。”
它不仅准确回答了所有问题,还指出了app/(auth)/login/page.tsx中一处潜在的 hydration error(因为该文件里用了useState但没加'use client'),并给出修复建议。这种能力,源于它对 TypeScript 类型系统、Next.js 的约定式路由、React Server Components 的渲染生命周期有深度建模,而非简单模式匹配。
但硬币另一面:Claude 是“对话型”工具。它没有编辑器上下文感知,你必须手动复制粘贴代码片段。当你要改一行fetch请求时,它不知道你当前用的是axios还是node-fetch,也不知道API_BASE_URL是从.env读的还是硬编码的——这些信息,你得自己喂。
注意:Claude 的强项不在“写单行代码”,而在“解释为什么这么写”。比如你贴一段报错日志:“
TypeError: Cannot read property 'map' of undefined”,它能结合你提供的组件代码,精准定位到是props.items未做空值检查,并给出 3 种修复方案(可选链、默认值、条件渲染),每种都附带 React 官方文档链接和 ESLint 规则名(如react/require-default-props)。
2.3 GitHub Copilot(原 Codex)的定位:最成熟的“键盘外挂”,但正在失去上下文优势
Copilot 是最早落地的 AI 编程助手,它的核心价值是极低的交互成本:你敲const user =,它立刻在光标后补全await getUserById(id);你写// TODO: handle network error,它自动生成带try/catch和重试逻辑的代码块。这种“所见即所得”的补全,对写新功能效率提升极大。
但它最大的瓶颈,是上下文窗口窄且不可控。Copilot 的上下文主要来自:
- 当前文件(约 1000 行);
- 当前光标附近 20 行;
- 你正在编辑的函数签名。
它看不到隔壁文件的类型定义,看不到package.json里的engines.node版本,更看不到你 Git 分支里未提交的 API 变更。这就导致一个经典问题:你刚把User接口的email字段改成可选(email?: string),Copilot 在另一个文件里生成的user.email.toLowerCase()依然会报 TS 错误——因为它没同步到这个变更。
实测数据:在维护一个 TypeScript + NestJS 的微服务时,Copilot 生成的代码约 35% 需要手动修正类型错误,而 Cursor 同一场景下仅为 9%。差距就来自“是否实时感知工程状态”。
2.4 其他工具简评:别被名字带偏
- Tabnine:强在本地模型(可离线运行),隐私性好,但对复杂业务逻辑的理解弱于云端大模型。适合金融、政企等对数据不出域有硬性要求的场景,日常开发中生成质量略逊于 Copilot。
- CodeWhisperer(AWS):与 AWS 服务深度绑定,生成 Lambda 函数、CloudFormation 模板、DynamoDB 查询时有明显优势。但一旦离开 AWS 生态,能力断崖式下降。
- Bito:专注“把自然语言需求转成代码”,比如输入“写一个 Python 脚本,从 CSV 读用户数据,过滤掉邮箱无效的,存入 SQLite”,它能一步到位。但对已有代码的重构、调试辅助能力较弱。
记住一个铁律:没有“通用最强”,只有“场景最配”。选工具,先问自己三个问题:
- 我当前任务是“从零写新模块”(选 Copilot/Bito),还是“重构/调试老代码”(选 Cursor)?
- 我的项目是否重度依赖某云平台(AWS/Azure)?是则优先考虑其官方工具。
- 我是否必须保证代码提示全程离线?是则 Tabnine 是唯一大规模可用选项。
3. 四大核心场景实操对比:手把手告诉你怎么选
3.1 场景一:快速实现一个新接口(如:用户注册 API)
这是最典型的“从零开始”任务,目标明确:写 controller → service → repository → 数据库迁移。
Cursor 实操路径:
- 在
app/api/auth/register/route.ts文件中,输入注释:// POST /api/auth/register: create new user with email, password, name; - 按
Ctrl+L(Windows)或Cmd+L(Mac)唤出命令面板,输入/generate; - 它会自动分析项目结构,识别出你用的是 Next.js App Router + Prisma ORM + Zod 验证,生成:
- 完整的
POSThandler,含 Zod 解析、密码哈希(用bcryptjs)、Prisma 创建用户、JWT 生成; - 自动在
lib/prisma.ts中确认连接配置; - 在
schemas/user.schema.ts中补充RegisterInput类型定义(如果不存在则创建); - 甚至提示:“检测到
prisma migrate dev未执行,是否生成 migration 文件?”——点击即生成prisma/migrations/.../migration.sql。
- 完整的
Claude 实操路径:
- 复制整个
prisma/schema.prisma文件内容; - 复制
lib/zod.ts中的 Zod 基础配置; - 复制
app/api/auth/login/route.ts(作为风格参考); - 在 Claude 中输入:“基于以上 schema 和现有代码风格,写一个用户注册接口,要求:邮箱唯一性校验、密码至少 8 位、返回 JWT token。用 TypeScript,Next.js App Router 格式。”
- 它会返回完整代码,但你需要:
- 手动检查
z.string().email()是否用了项目已有的emailSchema; - 手动确认
jwt.sign()的 secret 是否从process.env.JWT_SECRET读取(而非硬编码); - 手动添加
export const runtime = 'nodejs'(Next.js 14 新要求,Claude 可能遗漏)。
- 手动检查
Copilot 实操路径:
- 在空文件中输入
export async function POST(; - Copilot 自动补全
request: Request) { ... }; - 输入
const body = await request.json();,它接着补全const { email, password, name } = body;; - 但当你输入
const user = await prisma.user.create({,它可能补全data: { email, password, name }——而忘了密码需哈希,也忘了邮箱唯一性校验需prisma.user.findUnique先查重。
实操心得:在这个场景下,Cursor 的“工程感知”省去了 70% 的手动核对时间。Copilot 适合写骨架,但关键业务逻辑(如安全校验)必须人工兜底;Claude 需要你当“项目经理”,把需求、约束、上下文全部整理好再喂给它,适合复杂度高、容错率低的核心模块。
3.2 场景二:调试一个诡异的线上 Bug(如:Redis 缓存击穿导致数据库雪崩)
Bug 现象:用户登录接口 P99 延迟从 200ms 暴涨到 3s,日志显示大量SELECT * FROM users WHERE id = ?查询。
Cursor 实操路径:
- 打开
app/api/auth/login/route.ts,找到getUserById调用处; - 选中整段代码,右键 → “Ask Cursor”;
- 输入:“这个函数为什么没走 Redis 缓存?如何加缓存并防止击穿?”;
- Cursor 会:
- 定位到
lib/cache/redis.ts中的getFromCache函数; - 发现
getUserById没调用它,而是直连数据库; - 生成带
cache.get(key)+cache.set(key, data, 'EX', 3600)的新版本; - 关键一步:自动检测到
users表无主键索引(从prisma/schema.prisma读取),提示:“缓存 key 设计为user:${id},但若id为字符串且含特殊字符,需 URL encode。是否生成安全的 key 生成函数?”——点击即生成。
- 定位到
Claude 实操路径:
- 复制
app/api/auth/login/route.ts全文; - 复制
lib/cache/redis.ts全文; - 复制
prisma/schema.prisma中User模型定义; - 输入:“分析登录流程的缓存缺失点,给出防击穿方案(布隆过滤器 or 空值缓存),并生成 TypeScript 实现。”
- 它会详细解释布隆过滤器原理、空值缓存 TTL 设置技巧,并生成代码。但:
- 生成的
cache.set('user:' + id, null, 'EX', 60)中,null值在 Redis 中实际存为"null"字符串,需手动改为cache.set('user:' + id, '', 'EX', 60); - 它不会自动检查
redis.ts中client.set()方法签名是否支持EX参数(项目用的是ioredis@5.x,参数名是EX,而@4.x是expire),需你手动确认。
- 生成的
Copilot 实操路径:
几乎无用。它无法理解“缓存击穿”这个概念,只会根据你当前光标位置补全类似代码,比如你写cache.,它列出get/set/del,但不会主动建议加空值缓存。
实操心得:调试场景,Cursor 的“上下文穿透力”是碾压级的。它像一个坐在你工位旁的 Senior Dev,一眼看出代码和工程配置的矛盾点。Claude 是优秀的“架构顾问”,但需要你提供足够多的线索;Copilot 在此场景下,只是个高级自动补全。
3.3 场景三:将旧代码迁移到新框架(如:Vue 2 → Vue 3 Composition API)
这是一个典型的“理解成本 > 编码成本”的任务。难点不在语法转换,而在:
this.$refs.xxx如何对应ref();beforeDestroy生命周期如何映射到onBeforeUnmount;this.$emit('xxx')如何变成emit('xxx');- 更重要的是:哪些
data属性该用ref,哪些该用computed?
Cursor 实操路径:
- 打开
src/views/UserList.vue(Vue 2 版本); - 右键 → “Refactor with Cursor” → 选择 “Migrate to Vue 3 Composition API”;
- 它会:
- 自动识别
data()返回的对象,将每个属性转为const xxx = ref(initialValue); - 将
computed属性转为const xxx = computed(() => ...); - 将
methods转为普通函数,this上下文自动剥离; - 关键细节:检测到
this.$router.push()调用,自动引入useRouter并替换;检测到this.$http.get(),提示:“项目已迁移到axios,是否替换为axios.get()?”——点击即替换。
- 自动识别
Claude 实操路径:
- 复制 Vue 2 组件全文;
- 复制
main.js中的 Vue 初始化代码(确认 Vue 版本); - 复制
package.json中vue和@vue/composition-api版本; - 输入:“将以下 Vue 2 组件迁移到 Vue 3 Composition API,注意:项目已升级 Vue 3.2+,使用
<script setup>语法,axios替代vue-resource。” - 它会生成正确代码,但:
- 对
v-model的转换可能出错(Vue 2 的v-model是语法糖,Vue 3 的v-model需显式声明modelValueprop 和update:modelValue事件); - 不会自动处理
mixins的迁移(需你单独提供 mixins 代码)。
- 对
Copilot 实操路径:
只能帮你补全setup()函数括号,或者当你输入const router =时提示useRouter(),但无法完成整文件迁移。
实操心得:框架迁移是 Cursor 的“封神之战”。它把迁移变成一个可预测、可回滚的操作,而不是一场赌运气的重构。Claude 能给你讲透原理,但执行层仍需你动手;Copilot 在此场景下,存在感接近于零。
3.4 场景四:写单元测试(如:为一个支付校验函数写 Jest 测试)
目标函数:validatePaymentIntent(intent: PaymentIntent): boolean,需覆盖:
- 正常 case(status === 'requires_payment_method');
- 异常 case(intent 为空、amount < 100、currency 不是 'USD');
Cursor 实操路径:
- 光标停在
validatePaymentIntent函数定义处; - 按
Ctrl+Shift+P→ 输入 “Generate Unit Tests”; - 它会:
- 自动读取函数签名和 JSDoc(如果有);
- 生成
describe('validatePaymentIntent', () => { ... }); - 为每个分支生成
it()用例,包括expect(validatePaymentIntent(null)).toBe(false); - 关键细节:检测到项目
jest.config.ts中testEnvironment: 'node',生成的测试代码不包含 DOM 相关 mock;检测到ts-jest配置,自动添加import type { PaymentIntent } from '../types';。
Claude 实操路径:
- 复制函数定义全文;
- 复制
jest.config.ts全文; - 输入:“为以下函数写 Jest 单元测试,覆盖空值、金额、币种校验,使用 TypeScript,mock 外部依赖。”
- 它会生成高质量测试,但:
- 可能生成
jest.mock('../utils/logger'),而你项目实际用的是console.log,需手动删; - 对
PaymentIntent类型的 mock 数据,可能生成{} as any,而非符合PaymentIntent接口的精确对象。
- 可能生成
Copilot 实操路径:
当你在测试文件中输入it('should return false when intent is null', () => {,它会补全expect(validatePaymentIntent(null)).toBe(false);。但无法自动推导出所有边界 case,需你手动枚举。
实操心得:写测试是 Cursor 最“省心”的场景。它把测试从“写代码”变成“确认逻辑”,你只需扫一眼生成的
it()描述是否覆盖了你的脑图,然后按 Ctrl+Enter 运行。Claude 适合学习测试设计思想,Copilot 适合补全单个断言。
4. 避坑指南:那些没人告诉你的“反直觉”真相
4.1 “免费版够用”是个巨大幻觉
所有主流工具的免费版,都在悄悄设限:
- Cursor Free:每天仅 50 次
/edit或/generate,且禁用“工程级上下文”(即不读取package.json、tsconfig.json)。实测:在大型项目中,它生成的代码 80% 会因类型错误失败,因为你没付费,它就不看你的tsconfig.json。 - Copilot Free:对学生和知名开源项目维护者开放,但企业邮箱注册一律收费。更隐蔽的是:它对私有 GitHub 仓库的代码补全,会降低推荐优先级——你写
axios.get(,它更倾向推荐fetch(,因为fetch是标准 API,无需版权风险。 - Claude Free(claude.ai):上下文窗口砍半(100K → 50K),且不支持文件上传。当你想分析一个 3000 行的后端服务类时,必须手动分段粘贴,极易遗漏关键上下文。
真实体验:我曾用 Cursor Free 版重构一个 8000 行的 Node.js 服务,前 3 天每天卡在“类型不匹配”,第 4 天升级 Pro 后,同样的任务 2 小时完成。Pro 版的“工程上下文”不是锦上添花,是生产环境的刚需。
4.2 “越聪明的模型,越容易一本正经胡说”
Claude 3.5 Sonnet 在数学推理、法律条文解读上远超 GPT-4,但在编程领域,它的“自信”反而成了陷阱。
典型问题:
- 过度工程化:你问“怎么用 Python 读 CSV”,它可能生成带
pandas.DataFrame、dask分布式加载、pyarrow内存优化的方案,而你实际只需要csv.DictReader。 - 虚构 API:在生成 React 代码时,它可能写出
useEffectAsync()(不存在的 Hook),理由是“这样更符合 Suspense 语义”——但 React 官方从未提供此 API。 - 版本错乱:你项目用的是
Express 4.18,它生成app.use(express.json({ limit: '10mb' })),而limit参数在4.18中尚不支持,需4.19+。
应对策略:永远把 AI 输出当“初稿”,而非“终稿”。我的工作流是:
- 让 AI 生成;
- 立刻运行
tsc --noEmit(TypeScript)或python -m py_compile(Python),看编译是否通过; - 若报错,把错误信息连同原始需求,再喂给 AI:“生成代码编译失败,错误:XXX。请修正。”——它 90% 能一次修好。
注意:不要跳过第 2 步。我见过太多人直接把 AI 生成的代码扔进生产环境,结果凌晨三点被 PagerDuty 唤醒,就因为一个
undefined没做空值检查。
4.3 “编辑器集成”不等于“无缝集成”
Cursor 宣称“深度集成 VS Code”,但实际有隐藏摩擦:
- Git 冲突标记干扰:当你在有
<<<<<<< HEAD冲突标记的文件中使用/edit,Cursor 会把冲突块当作正常代码解析,生成的结果可能同时包含两套逻辑,导致更难合并。 - 多根工作区失效:你的 VS Code 工作区包含
frontend/和backend/两个文件夹,Cursor 默认只读取frontend/的上下文,backend/的package.json它视而不见。需手动在 Cursor 设置中开启 “Multi-root workspace support”。 - 远程开发(SSH/WSL)延迟高:在 WSL2 中使用 Cursor,AI 响应平均慢 2.3 秒(本地 Windows 为 0.8 秒),因为上下文需跨系统传输。
Copilot 的“隐形墙”更致命:它无法访问你 VS Code 中安装的任何插件。比如你用ESLint插件实时标红console.log,Copilot 生成的代码依然满屏console.log——它看不见 ESLint 的规则。
实操心得:我现在的配置是——本地开发用 Cursor Pro(开 Multi-root 支持),远程开发(SSH 到服务器)时切回 Copilot + 手动
eslint --fix。没有银弹,只有适配。
4.4 “中文提问”效果断崖式下跌
所有工具的中文训练数据,质量远低于英文。实测对比(同一问题):
- 英文提问:“How to prevent XSS in a React input field that renders user-provided HTML?”
→ Cursor 生成带DOMPurify.sanitize()的完整方案,含useEffect清理、dangerouslySetInnerHTML警告。 - 中文提问:“React 中如何防止用户输入的 HTML 导致 XSS 攻击?”
→ 它生成innerHTML+escape(),完全忽略DOMPurify,且未提及dangerouslySetInnerHTML的风险。
根本原因:英文是模型的“母语”,中文是“第二外语”。模型对英文技术术语(如sanitize,escape,context-aware)有精准 embedding,对中文术语(如“净化”、“转义”、“上下文感知”)则常映射到错误向量。
解决方案:坚持英文提问,中文注释。我的实践是:
- 在代码中写英文注释(
// Fetch user data from API); - 在 Cursor/Claude 中用英文提问(“Fetch user data and handle 404 error”);
- 生成的代码,用中文注释说明业务含义(
// 用户不存在,跳转到注册页)。
提示:这不是崇洋媚外,而是利用工具的物理特性。就像你不会用德语问一个只会法语的翻译官一样。
5. 终极决策树:5 步锁定最适合你的工具
别再纠结“哪个最好”,用这张决策树,30 秒选出你的主力工具:
5.1 第一步:确认你的开发环境
- ✅ 使用 VS Code,且项目是 TypeScript/JavaScript/Python/Go 等主流语言 →Cursor 是默认起点;
- ❌ 使用 JetBrains 系列(WebStorm/PyCharm)→Copilot 是唯一深度集成选项(JetBrains 官方插件);
- ❌ 使用 Vim/Neovim →Tabnine 或 CodeWhisperer(AWS CLI 集成),Cursor 无官方 Vim 支持。
5.2 第二步:评估你的项目规模
- 📦 小型项目(< 5000 行,单仓库):Copilot 足够,成本最低($10/月);
- 🏢 中大型项目(> 10000 行,多包/monorepo):Cursor Pro($20/月)是性价比之王,它省下的调试时间,远超订阅费;
- 🌐 超大型项目(微服务集群,需跨服务理解):Claude 3.5 Sonnet($20/月)+ 手动上下文管理,它是目前唯一能“俯瞰全局”的工具。
5.3 第三步:明确你的高频任务
| 你的主要任务 | 推荐工具 | 理由 |
|---|---|---|
| 写新功能、补全代码 | Copilot | 交互成本最低,键盘不离手 |
| 重构老代码、调试线上 Bug | Cursor | 工程上下文感知,自动关联文件、类型、配置 |
| 设计架构、评审方案、写文档 | Claude | 超长上下文 + 推理深度,能输出带依据的决策 |
| 云服务集成(Lambda/S3/DynamoDB) | CodeWhisperer | AWS 原生支持,生成代码自带 IAM 权限注释、最佳实践提示 |
5.4 第四步:检查你的合规红线
- 🔒 数据不能出公司网络 →Tabnine Enterprise(本地部署);
- 🌐 必须用特定云厂商(AWS/Azure)→CodeWhisperer / GitHub Copilot Enterprise(Azure);
- 📜 需要审计日志(谁在何时用了什么提示)→Copilot Enterprise(提供完整审计追踪)。
5.5 第五步:做最小可行性验证(MVP Test)
别信宣传页,用真实代码测试:
- 打开你最近一个 PR 中修改的文件(最好是带业务逻辑的);
- 用 Cursor 的
/edit,输入:“把这个函数改造成支持并发请求,最大并发数 3,失败自动重试 2 次。”; - 用 Copilot,在同一位置输入相同指令,看它是否生成
Promise.allSettled+retry逻辑; - 用 Claude,把文件内容粘贴进去,问同样问题;
- 计时:从你按下回车,到生成代码能通过
tsc编译,谁最快?谁改得最少?
我的 MVP 测试结论:在 90% 的业务代码场景中,Cursor 的首次生成成功率(编译通过)为 68%,Copilot 为 41%,Claude 为 52%。但 Cursor 的“修改成本”最低——它报错时,错误信息精准指向哪一行、哪个类型,而 Claude 常返回模糊的“类型不匹配”,需你反复追问。
最后分享一个真实案例:上周,我帮一家做 SaaS 的客户做技术尽调。他们用 Copilot 三年,工程师平均每天用 12 分钟,但代码审查中 37% 的 PR 被打回,原因是 AI 生成的代码绕过了他们的安全扫描规则(如未调用encrypt()函数)。切换 Cursor Pro 后,首周工程师反馈:“现在写完代码,直接点‘Run Security Scan’,它自动补全加密调用,不用我记规则了。”——这才是 AI 编程的终点:不是替代人,而是把人的经验,固化成可执行、可审计、可传承的工程能力。