@srgay/cursor-extension
v1.0.18
Published
本机 Cursor workbench 增强:MAX Mode 守护、MCP Follow-up 面板、输入法回车修复、AskQuestion 自动提交(支持随 Cursor 启动持久加载,或 CDP 临时注入)。
Maintainers
Readme
Cursor Extension
一组本机 Cursor workbench 增强脚本,包含四部分:
- MAX Mode 守护:保持
MAX Mode关闭,并在彩色MAX标记出现且聊天框有内容时阻止发送。 - MCP Follow-up 面板:在 Cursor 聊天框上方注入一个 MCP 反馈面板,连接
mcp-feedback-enhanced的 WebSocket,让你直接在 Cursor 里回复interactive_feedback,支持端口自动扫描/自定义,启动时默认匹配当前窗口端口,也可手动选择任意端口(选定后自动重读项目信息并重载状态)。 - 输入法回车修复:修复用中文输入法(拼音/注音等)组字时,按回车上屏候选词会被 Cursor 误当成「提交」的问题(含自带的 AskQuestion「Other」输入框)。
- AskQuestion 自动提交:在 Cursor 自带
AskQuestion工具条上增加倒计时、暂停/启动按钮和左下角齿轮设置入口,配置后自动填入原生Other并提交。
致谢
感谢 LINUX DO 社区的交流氛围与灵感支持。
安装与使用(npx)
无需克隆仓库,直接用 npx 运行(需 Node.js ≥ 20):
# 持久安装:patch Cursor 的 workbench.html,随 Cursor 启动自动加载四个脚本(推荐)
npx @srgay/cursor-extension install
# 查看可安装模块
npx @srgay/cursor-extension install --list
# 只安装指定模块(可多选;支持空格或逗号分隔)
npx @srgay/cursor-extension install followup ime
npx @srgay/cursor-extension install max,ask
# 还原安装
npx @srgay/cursor-extension uninstall
# CDP 临时注入(需先用调试端口启动 Cursor;重启 Cursor 后失效)
npx @srgay/cursor-extension inject # 注入全部四个
npx @srgay/cursor-extension inject followup # 只注入某一个:max | followup | ime | ask | all
# 备用:用命令配置 Cursor 自带 AskQuestion 自动提交(也可直接在原始 AskQuestion 卡片的齿轮设置里改)
npx @srgay/cursor-extension ask-question enable "继续" --delay-s 600
npx @srgay/cursor-extension ask-question status
npx @srgay/cursor-extension ask-question disable
# 查看帮助
npx @srgay/cursor-extension helpinstall后需完整退出并重新打开 Cursor 才生效。- Cursor 更新可能覆盖
workbench.html,功能失效时重新执行install。 install不带模块名时默认安装全部模块;指定模块时是增量安装,不会自动移除已安装的其它模块。- 可安装模块:
max、followup、ime、ask。 - 自定义 Cursor 安装目录:设置环境变量
CURSOR_WORKBENCH_DIR。 inject/ask-question自定义调试端口:设置环境变量CURSOR_DEBUG_PORT(默认9222)。- MCP 面板配置读写所用的 python 命令:默认按平台自动探测(
python/py/python3),可用环境变量CURSOR_MCP_PYTHON强制指定(某些 Windows 环境用得上)。
说明:下文「推荐方式 / 备用方式」里的
npm run patch、npm run inject等是本仓库源码开发用法;最终用户用上面的npx命令即可,二者等价。
功能:MAX Mode 守护
- 检测彩色
MAXbadge。 - 点击 badge 打开模型菜单。
- 只在菜单里的精确
MAX Mode行是aria-checked="true"时点击关闭。 - 如果彩色
MAX存在且聊天框有内容,显示 50px 红色渐变边框。 - 同一条件下禁用
.send-with-mode发送控件,并拦截点击发送和回车发送。 - 脚本加载成功后,在 Cursor 右下角短暂显示
Cursor Extension loaded。
推荐方式:随 Cursor 启动加载
Patch Cursor 的 workbench.html,让四个脚本(MAX Mode 守护、MCP Follow-up 面板、输入法回车修复、AskQuestion 自动提交)都随 Cursor 启动自动加载,无需调试端口、无需每次手动注入:
npm run patchPatch 行为:
- 默认注入
<script src="./cursor-max-mode-guard.js">、<script src="./cursor-mcp-followup.js">、<script src="./cursor-ime-enter-fix.js">、<script src="./cursor-ask-question-auto-submit.js">到workbench.html;指定模块安装时只注入对应脚本(各自带注释标记,便于幂等与回退)。 - 把
cursor-mcp-followup.js拷入 workbench 目录时,按当前系统替换其中的路径/命令占位符:配置路径~/.config/mcp-feedback-enhanced/ui_settings.json(Windows 为C:/Users/<你>/.config/...,统一用正斜杠),以及读取命令(Mac/Linux 用cat、Windows 用python -X utf8读取)与写入用的 python 命令名(面板借 WSrun_command读写该文件,实现常用提示词与自动提交配置的查看/编辑)。 - AskQuestion 自动提交会在原始 AskQuestion 工具条上增加倒计时、暂停/启动按钮和左下角齿轮设置入口;配置保存在 Cursor workbench 页面的全局
localStorage(key:srgay.cursor-extension.ask-question-auto-submit.v1),不依赖 MCP 服务端或端口连接。 - 同步更新 Cursor
product.json里的workbench.htmlchecksum,避免 Cursor 把这次修改识别为安装损坏。 - macOS 下 patch 会修改
.app包内资源并使原签名校验不再完整;脚本会自动移除/Applications/Cursor.app的com.apple.quarantine,避免 Gatekeeper 把已修改的本机应用提示为“已损坏”。
注意:占位符在 patch 时按当前用户主目录与操作系统写死。若更换用户/主目录或操作系统,重新执行
npm run patch。
然后完整退出 Cursor,再重新打开 Cursor。
恢复:
npm run unpatchCursor 更新后可能会覆盖 workbench.html,如果功能失效,重新执行 npm run patch。
默认路径:
- macOS:
/Applications/Cursor.app/Contents/Resources/app/out/vs/code/electron-sandbox/workbench - Windows: 优先自动探测
%LOCALAPPDATA%\Programs\Cursor\resources\app\out\vs\code\electron-sandbox\workbench - Windows: 如果用户目录不存在,会尝试
C:\Program Files\cursor\resources\app\out\vs\code\electron-sandbox\workbench
如果 Cursor 安装在其它目录,可以手动指定:
CURSOR_WORKBENCH_DIR="/path/to/workbench" npm run patchWindows PowerShell:
$env:CURSOR_WORKBENCH_DIR="C:\Path\To\Cursor\resources\app\out\vs\code\electron-sandbox\workbench"
npm run patch如果 Windows 报 EPERM: operation not permitted,说明 Cursor 安装在 C:\Program Files 等受保护目录。请用管理员身份打开 PowerShell 后重新执行:
npm run patch备用方式:临时注入
临时注入适合调试脚本,不推荐作为日常使用方式。它需要用调试端口启动 Cursor:
open -na /Applications/Cursor.app --args --remote-debugging-port=9222然后在本项目根目录执行:
npm run inject功能:AskQuestion 自动提交
给 Cursor 自带 AskQuestion 工具设置一个全局消息。任何会话里出现 AskQuestion 卡片时,脚本会在该卡片自己的 Other 输入框里填入消息,并点击原生 Continue 按钮。
- 原始 UI 改造:不新建独立管理页;脚本只在原始 AskQuestion 工具条左下角增加齿轮设置入口,并在旁边显示倒计时和暂停/启动按钮。点击齿轮后在同一张卡片内展开设置。
- Agent Window:除原始 AskQuestion DOM 外,还识别 Agent Window 的
ui-trayQuestions 卡片;卡片 footer 左下角同样有齿轮设置入口、倒计时和暂停/启动按钮。安装补丁也保留 background composer AskQuestion interaction query 插桩作兜底。两种路径都使用同一份全局配置延迟提交Other。 - 全局配置:配置保存在 workbench
localStorage,所有 composer 会话共享同一条自动提交消息。 - 倒计时可见:启用且本轮已排期时,齿轮旁边会显示
提交 m:ss倒计时。 - 会话隔离:运行状态按每个 AskQuestion toolbar / Agent Window Questions tray 独立计时和提交;用户在某个卡片上先键入、选择选项、点
Other、点Skip/Continue时,只取消该卡片本轮自动提交,不影响其它会话。单纯点卡片背景、标题、暂停/启动按钮或打开齿轮设置不会取消其它卡片倒计时。 - 暂停/启动:倒计时旁边的
暂停只暂停当前卡片并保留剩余时间;卡片进入暂停后,同一位置会变成启动,点击后从剩余时间继续倒计时。如果这个卡片本来没有排过倒计时,显式启动才会按当前全局配置从头排期;如果是因为已有输入而暂停,显式启动会允许本卡继续自动填入Other。 - 不改工具参数:不修改 AskQuestion 入参;普通 Composer 和 Agent Window UI 模式都模拟原生
Other选择、输入和Continue点击,Agent interaction query 兜底模式走 Cursor 自己的 AskQuestion interaction response。
配置(原始 UI 优先)
安装或注入脚本后,当 Cursor 自带 AskQuestion 卡片出现时,Skip / Continue 所在工具条左侧会出现齿轮按钮、倒计时和暂停/启动按钮。点击齿轮后可在原始卡片内设置:
启用自动提交自动提交内容延迟(s)有输入时跳过
没有把这组设置直接写进 Cursor Settings:本项目是 workbench 注入脚本,不是 Cursor 官方扩展;Cursor Settings 的配置注册表在内部 bundle 里,强行 patch 版本耦合太高。现在的齿轮入口放在原始 AskQuestion UI 内,配置仍然是全局持久化的。
备用脚本化配置命令通过 CDP 写入 Cursor workbench,因此需要先用调试端口启动 Cursor:
open -na /Applications/Cursor.app --args --remote-debugging-port=9222
npx @srgay/cursor-extension ask-question enable "继续" --delay-s 600
npx @srgay/cursor-extension ask-question status
npx @srgay/cursor-extension ask-question disable也可以在 Cursor DevTools/CDP 里直接调用:
window.__cursorAskQuestionAutoSubmit.enableSeconds("继续", 600)
window.__cursorAskQuestionAutoSubmit.disable()
window.__cursorAskQuestionAutoSubmit.status()参数:
message:自动填入Other的消息。delay-s/delaySeconds:AskQuestion 出现后等待多少秒提交,默认600秒。内部仍兼容旧的delayMs存储和--delay-ms参数。respectUserInput:默认true,如果问题卡片已有用户输入或选择,则跳过本轮自动提交。
MCP Follow-up 面板
在 Cursor 聊天输入框上方注入一个 MCP 反馈面板,连接 mcp-feedback-enhanced 的 WebSocket(ws://127.0.0.1:{port}/ws),让你直接在 Cursor 内回复 interactive_feedback 调用,无需切到独立的 WebUI。
功能
- 注入到聊天框上方,样式贴合 Cursor 原生输入框。
- Agent Window 最低档支持:同时识别普通
.composer-bar、Agent Window 主输入区(.agent-panel-followup-input)与.ui-tray挂载点;焦点在哪类容器内就挂到哪类容器,无焦点时可见 Agent Window 优先(主输入区前或 tray footer 前)。提交仍走mcp-feedback-enhancedWebSocket 的submit_feedback,用于回复 MCPinteractive_feedback会话;不等同于 Cursor 原生 active-run 追加用户消息。 - 自动扫描端口
8765–8769,识别正在监听的 MCP 服务(连得上或返回4004 无 session即视为活跃)。 - 端口下拉(自定义浮层菜单):点开下拉即扫描一次——先显示「扫描中…」,扫完用最新结果填充并展示可用端口;点选一次即生效(自定义菜单不依赖原生
<select>,不打断、不闪),末尾提供「自定义端口…」可手动输入任意端口。点空白处或按Esc关闭菜单。 - 菜单每项显示「状态 · 项目名」(如
Port 8766 · waiting · my-project)便于区分;触发按钮收起时只显示「Port X · 状态」以贴合宽度,避免与右侧项目名重复。 - 放大镜按钮可随时重新扫描(全量扫描并自动连上本窗口端口)。
- 默认匹配当前窗口端口(不再限制只能连本窗口):每个 Cursor 窗口会起一个独立的 mcp-feedback 实例。面板从 Cursor 原生
window.vscode取当前窗口工作区路径,再借run_command读取每个端口所在实例的WORKSPACE_FOLDER_PATHS(窗口真实工作区,由 Cursor 注入、不受 AI 传入的project_directory影响),启动/重扫时默认优先选中与当前窗口工作区相等的端口;读不到时退用CURSOR_WORKSPACE_LABEL(项目名)做次级匹配。你也可以手动选择任意端口(含别的窗口/常驻实例)——选定后面板会重读该端口的项目信息(env 工作区/会话/状态)并重载状态,项目名以 env 工作区为准显示。本窗口端口尚未出现时降频重扫等待,出现后自动连上;取不到工作区(多根工作区/空窗口)时回退默认选择。 - 持续保持为 WebSocket「最后连接」(每 3 秒重连 + 输入框聚焦时重连),确保始终能收到当前会话并成功提交反馈。
- 底部「常用提示词」下拉:一键把
ui_settings.json里的提示词追加到输入框;旁边刷新按钮可重新拉取配置。 - 齿轮按钮展开配置抽屉:
- 常用提示词增删改(写回
ui_settings.json,删除带二次确认)。 - 自动提交配置:启用开关、超时(秒)、选择提示词,状态实时回显。
- 自动提交运行时:仅在「等待反馈」时倒计时,输入框右侧显示
自动提交 m:ss小标签;到点自动以所选提示词发送(走与手动一致的重连抢占)。用户输入/手动插入提示词/手动发送/点击倒计时/会话离开等待态,本轮即取消自动提交。
- 常用提示词增删改(写回
- 配置读写均借现有 WebSocket 的
run_command完成(Mac/Linux 读用cat,Windows 读用python -X utf8;写入两平台都用 python base64 解码落盘),不依赖本地文件系统访问或 CORS。服务端以shell=False+shlex.split执行命令,故 Windows 路径统一用正斜杠以规避转义。
加载方式
- 推荐:随 Cursor 启动加载(持久,不依赖调试端口)。执行
npm run patch后完整重启 Cursor 即可,详见上文「推荐方式」。 - 备用:CDP 临时注入(适合调试脚本,重启 Cursor 后失效)。先用调试端口启动 Cursor:
open -na /Applications/Cursor.app --args --remote-debugging-port=9222然后在本项目根目录执行:
npm run inject:followupCDP 注入是临时的,重启 Cursor 后需要重新执行;
install-cursor-mcp-followup.mjs会在注入时按平台替换路径/命令占位符(详见src/shared/mcp-settings.mjs)。
端口扫描与自定义
- 面板安装时自动扫描一次
8765–8769。 - 按窗口默认选端口(可手动覆盖):扫描时借
run_command读取每个端口实例的WORKSPACE_FOLDER_PATHS,启动/重扫默认优先选中与当前窗口工作区相等的端口(次级用CURSOR_WORKSPACE_LABEL项目名)。这样「在 A 窗口让 AI 改 B 项目代码」(会话project_directory变成 B)时默认仍连回 A 窗口自己的端口;但不再限制只能连本窗口端口——你可以手动选择任意端口,选定后面板会重读该端口的项目信息(env 工作区/会话/状态)并重载状态。 - 扫描时机:只在「面板启动时」和「每次点开端口下拉时」各扫一次,不做后台轮询扫描;连上本窗口端口后只发心跳维持 WebSocket「最后连接」。本窗口端口暂未出现时,点开下拉重扫即可发现并连上。
- 点击放大镜按钮可手动重扫(全量扫描并自动连上本窗口端口)。
- 在端口下拉里选择「自定义端口…」,就地输入端口号回车即可连接;输入框失焦或按
Esc会回退到第一个可用端口。
查看状态
在 Cursor DevTools/CDP 里执行:
window.__cursorMcpFollowup.status()返回挂载状态、挂载类型(mountKind: composer / agent-window / agent-tray)、当前连接端口、会话信息、扫描结果(foundPorts)、各端口项目名/状态等。
手动操作
window.__cursorMcpFollowup.scan() // 重新扫描端口
window.__cursorMcpFollowup.reconnect() // 重连当前选中端口
window.__cursorMcpFollowup.remount() // 重新挂载面板到聊天框上方
window.__cursorMcpFollowup.toggleConfig() // 展开/收起配置抽屉
window.__cursorMcpFollowup.uninstall() // 卸载面板可调参数
脚本顶部 config 可调整:
scanStart/scanCount:扫描起始端口与数量(默认从8765起、共5个,即8765–8769)。probeTimeoutMs:单端口探测超时(默认2500ms;含一次run_command读取窗口工作区的往返)。reconnectMs:WebSocket 存活探测间隔(默认8000ms;不做周期性重连)。
排障
- 面板没出现:确认 Cursor 用
--remote-debugging-port=9222启动且聊天侧边栏已打开;可执行window.__cursorMcpFollowup.remount()。 - 一直显示 Offline:对应端口当前没有活跃的 MCP 会话;点放大镜重扫,或确认
mcp-feedback-enhanced已在该端口监听。 - 收不到会话 / 提交无效:面板靠定期重连抢占「最后连接」;若 Cursor 自带 WebUI 同时连着,聚焦输入框会触发立即重连抢回当前会话。
功能:输入法回车修复
修复用中文输入法(拼音/注音等)**组字时按回车上屏候选词被误当成「提交」**的问题。典型场景是 Cursor 自带的 AskQuestion「Other / 其他」自定义输入框(textarea.composer-questionnaire-toolbar-freeform-input)。
原理:在 window 捕获阶段最早拦截「组字进行中的回车」(依据 isComposing / keyCode 229 / compositionstart~end 跟踪),stopImmediatePropagation 阻止其到达应用级回车提交处理器;不调用 preventDefault,保证输入法正常上屏。组字结束后回车一切照旧;代码编辑器(Monaco)自行处理组字,已跳过避免误伤。
加载方式
- 推荐:随 Cursor 启动加载,执行
npm run patch后重启 Cursor(见上文「推荐方式」)。 - 备用:CDP 临时注入(重启失效):
open -na /Applications/Cursor.app --args --remote-debugging-port=9222
npm run inject:ime查看状态 / 卸载
window.__cursorImeEnterFix.status() // 含 guardedCount(已拦截次数)/ lastGuardedTarget(最近被拦输入框)
window.__cursorImeEnterFix.uninstall() // 卸载目录
按功能分组,每个功能自成一夹,共享工具单独放在 src/shared/:
src/max-mode-guard/— MAX Mode 守护cursor-max-mode-guard.js: 注入到 Cursor workbench 页面的守护脚本。install-cursor-max-mode-guard.mjs: 通过 CDP 临时注入 MAX Mode 守护脚本。
src/mcp-followup/— MCP Follow-up 面板cursor-mcp-followup.js: MCP Follow-up 面板注入脚本。install-cursor-mcp-followup.mjs: 通过 CDP 临时注入 MCP Follow-up 面板。
src/ime-enter-fix/— 输入法回车修复cursor-ime-enter-fix.js: 输入法组字回车修复脚本(全局生效)。install-cursor-ime-enter-fix.mjs: 通过 CDP 临时注入输入法回车修复。
src/ask-question-auto-submit/— Cursor 自带 AskQuestion 自动提交cursor-ask-question-auto-submit.js: 在原始 AskQuestion 工具条注入倒计时、暂停/启动和齿轮设置;普通 Composer 和 Agent Window Questions 卡自动填写Other并点击原生提交,也能响应 AskQuestion interaction query。install-cursor-ask-question-auto-submit.mjs: 通过 CDP 临时注入 AskQuestion 自动提交。configure-cursor-ask-question-auto-submit.mjs: 通过 CDP 写入/查看全局自动提交配置。
src/shared/— 共享工具cursor-workbench-paths.mjs: macOS/Windows workbench 路径解析。mcp-settings.mjs: 按平台生成 MCP 面板的配置路径与读/写命令(探测 python,Windows 用正斜杠)。patch-cursor-workbench.mjs: patch Cursor 的workbench.html(注入全部四个脚本)。unpatch-cursor-workbench.mjs: 恢复 patch。
查看状态(MAX Mode 守护)
在 Cursor DevTools/CDP 里执行:
window.__cursorMaxModeGuard.status()页面内卸载(MAX Mode 守护)
window.__cursorMaxModeGuard.uninstall()校验
npm run check