Cursor开放插件:AI编程流水线可定制了

上周 GitHub 上 cursor/plugins 新增 1273 颗星,Cursor 正式发布了它的插件规范。这不是一个普通的版本更新,而是 Cursor 从“好用的 AI 编辑器”向“可编程的 AI 工作台”转变的标志。

痛点:AI 助手没法完全听你的

我身边很多开发者试用 Cursor 后都会说:“它确实能写代码,但总在不该自动补全的时候瞎补全,而且没法按我的团队规范来。” 比如我的团队要求所有 import 按首字母排序、私有方法加 _ 前缀、注释必须写行号——这些事通用 AI 模型做不到。每天手动调整 AI 生成代码的格式和逻辑,至少要多花 30 分钟。

Cursor 插件正是为解决这类“定制化”问题而来。通过插件,你可以让自己的 AI 助手在特定文件类型下执行特定规则,甚至把重复性操作(比如生成单元测试、更新 changelog)一键自动化。

插件机制如何改变工作流

Cursor 插件本质是一个 TypeScript 包,通过声明式配置和生命周期钩子与编辑器交互。官方提供三种插件类型:

  1. 命令插件:绑定到快捷键或命令面板,执行代码分析、重构等操作。
  2. 事件插件:监听文件保存、打开、光标移动等事件,自动触发逻辑。
  3. AI 增强插件:修改 AI 的建议策略,比如为 React 组件强制使用函数式写法。

cursor plugin architecture diagram with hooks

官方已经发布了几个 demo 插件,比如 cursor-eslint-live 能在你输入时实时显示 lint 错误,cursor-test-gen 根据当前选中的函数自动生成 Jest 测试骨架。这些都不再需要手动跑命令行,插件把 AI 与原生编辑器能力粘合在一起。

历史上下文:为什么现在才开放

早在 2023 年底 Cursor 刚火的时候,社区就呼吁开放 API。当时 Cursor 团队优先打磨模型对话体验,插件优先级低。现在模型能力趋于稳定(Cursor 默认使用 Claude 3.5 Sonnet + GPT-4o 混合),用户增长放缓,平台化成为新增长引擎。参照 VS Code 的插件生态成功路径,Cursor 选择此时开放,目标是把开发者留住,并且吸引第三方贡献智能工作流。

上手:用官方插件省 30% 时间

先别急着自己写插件。官方仓库 cursor/plugins 里已经有 5 个预编译插件可以直接安装。以 cursor-test-gen 为例:

  1. 在 Cursor 中打开插件面板(Cmd+Shift+PPlugins: Install)。
  2. 输入 cursor-test-gen 安装。
  3. 选中一个函数名,右键 → AI: Generate Test

不到 10 秒,插件会解析当前文件的函数签名、依赖关系,然后调用 AI 生成包含 mock 和边界用例的测试文件。我试了试一个 30 行的 handleLogin 函数,生成的测试用例覆盖了成功、密码错误、用户不存在三种场景,直接可用。以前手写至少 5 分钟,现在 10 秒,节省 96% 的时间

当然,不是所有插件都这么靠谱。官方另一个 cursor-import-organizer 插件在保存文件时自动排序 import,但如果你用的 monorepo 结构里有大量路径别名,它会报错。插件目前处于早期阶段,稳定性有限。

动手写第一个插件:让 AI 强制加 _ 前缀

假设团队规范要求所有私有属性和方法名前加 _。你可以写一个事件插件,在文件保存时检查当前类中的私有字段,如果缺少 _,就自动添加并提示。

typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
// my-plugin/src/index.ts
import { Plugin, Editor } from 'cursor-plugin-api';

export const plugin: Plugin = {
  name: 'enforce-private-underscore',
  events: {
    onSave: async (editor: Editor) => {
      const code = editor.getCode();
      const lines = code.split('\n');
      const newLines = lines.map(line => {
        // 检测 # 私有字段或 private 装饰器后没有 _ 的情况
        if ((line.includes('#') || line.includes('private ')) && !line.trim().startsWith('_')) {
          const indent = line.match(/^\s*/)[0];
          const content = line.trim().replace(/^private\s+/, '').replace('#', '');
          return `${indent}_${content}`;
        }
        return line;
      });
      if (newLines.join('\n') !== code) {
        editor.setCode(newLines.join('\n'));
        editor.showNotification('已自动添加 _ 前缀', 'info');
      }
    }
  }
};

这个插件约 20 行代码,依赖 cursor-plugin-api(目前是 0.1.0,API 可能变)。实际用下来,每次保存会慢 0.5 秒,但对规范执行是质的提升——再也不用人工 review 私有字段命名了。

落地注意事项

  1. API 不稳定:插件规范目前是 alpha 阶段,接口随时可能 breaking change。建议只写少量高价值插件,不要做大规模迁移。
  2. 性能开销:事件型插件每触发一次都会调用你的代码,如果里面有 AI 请求(比如每次保存都调用模型检查代码),编辑器会卡顿。尽量做本地正则/语法树匹配,必要时才调 AI。
  3. 权限边界:插件目前能读写文件系统、调用 AI、修改编辑器状态。未来可能会出现恶意插件,安装前建议审查源码(官方插件走 GitHub 仓库,可以看 PR)。
  4. 团队共享:插件可以通过 cursor-plugins.json 配置文件分发给团队,但尚不支持私有 registry,需要自己 git 管理。

现在该做什么

如果你已经在用 Cursor,立刻去 GitHub 仓库看 PLUGIN_SPEC.md 了解钩子列表。如果不是重度用户,可以等 1-2 个月生态成熟点再说。但如果你是团队 leader 或 DevOps,现在就可以用官方插件解决几个最痛的重复性工作——哪怕只把测试生成自动化,每周也能省出半天时间。

Cursor 插件最终的形态不是让 AI 更聪明,而是让 AI 更听话。聪明的 AI 到处都有,听话的 AI 才值钱。 这波插件开放,给开发者一个机会把通用 AI 变成定制化流水线。但记住:工具只是工具,真正的效率提升来自你对工作流的理解和合理取舍。