Skip to content

卸载后未清理 ~/.cursor/hooks.json,残留的 progressive-skill-route 会 fail-close 所有写入(包括 skill_route 自己) #3

Description

@zhouavs

概述

在 Cursor(macOS)上,DevCodex 的用户级适配会把 progressive-skill-route hook 写进 ~/.cursor/hooks.json。这条 hook 会 fail-close 所有写操作StrReplace / Write / Shell),连 CallMcpToolskill_route 也会被拦住。结果是:hook 要求先走 skill_route,但 skill_route 自己也被拦,形成死锁。

只卸载 Cursor 插件,或只执行 npm uninstall -g devcodex不能恢复 Cursor 写入。必须手动删掉用户级残留文件(~/.cursor/hooks.json~/.cursor/devcodex/ 等),完全退出 Cursor 并开新对话后,写入才恢复正常。

README 当前的卸载说明只有:

npm uninstall -g devcodex

这不足以恢复 Cursor / Codex / Claude 环境。

环境

  • 宿主:Cursor 本地 IDE(不是 Cloud Agent)
  • 系统:macOS(darwin 25.5.0
  • 安装方式:GitHub / npm 发布包;之后从 Cursor 卸载,并执行了 npm uninstall -g
  • 本机没有其他第三方 hook / skill 插件
  • 不限于单个仓库:smart-listingmerchant-user 写入都被拦

实际现象

  1. 安装 DevCodex 后,Cursor Agent 可以读文件,但任何写入都会被拒绝:

    Error: progressive-skill-route
    
  2. 同一条 hook 还会拦住:

    • CallMcpToolskill_routecatalog / 空参数)
    • profile_compose_entry_check
    • 读取 DevCodex 自己的 skill 文件
    • ~/.cursor 做 glob / shell

    hook 要求的恢复路径(先跑 skill_route)本身也被拦,形成死锁。

  3. 拦截是 会话级全局,不是某个项目特有。换到第二个仓库同样写不进去。

  4. 从 Cursor 卸掉插件后,已经打开的会话里仍然存在:

    • MCP:plugin-devcodex-workspace-devcodex-memoryplugin-devcodex-workspace-devcodex-profile 仍为 ready
    • 同样的 progressive-skill-route 拒绝
  5. 只有手动删除用户级适配残留,并完全退出 Cursor(Cmd+Q)后开 新对话,写入才恢复。

真正让 Cursor 一直坏掉的残留

这些路径来自 README / global-host-target.js,以及本机实际残留:

路径 影响
~/.cursor/hooks.json Cursor 用户级 hook,正是 progressive-skill-route 的执行入口
~/.cursor/devcodex/plugins/devcodex-workspace 动态插件 / MCP
~/.codex/devcodex/~/.codex/hooks.json~/.codex/config.toml 里的 managed MCP 段 Codex 适配残留
~/.claude/devcodex/~/.claude/settings.json 里合并进去的 hooks Claude 适配残留
~/.agents/devcodex/ 共用运行时 / full fallback 指令

让用户去删整个 ~/.cursor / ~/.codex / ~/.claude 不合理,里面还有宿主自己的登录态、设置和历史。用户现在只能自己猜哪些文件是 DevCodex 写的。

这也和 CLI 里的说明一致:第一批还不支持自动删除全局 host config。

期望

  1. 完整卸载

    • npm uninstall -g devcodex(或新增 devcodex uninstall / devcodex global-adapters remove)应清掉用户级宿主配置里由 DevCodex 写入的条目。
    • 保留 hooks.json / settings.json / config.toml / AGENTS.md 里非 DevCodex 的内容。
    • 若仍需手工步骤,请在文档里写明精确路径。
  2. Cursor SkillRoute 不能死锁

    • 如果 skill_route 跑不起来,PreToolUse 应该 fail open(或至少等路由成功后再拦截),不要直接拒绝 StrReplace / Write / Shell / CallMcpTool(skill_route)
    • 要求先走 skill_route 的 hook,绝不能反过来拦截 skill_route
  3. 文档

    • README「卸载」应写明:卸 Cursor 插件 / npm 包 不会卸载已经打开的会话;残留的 ~/.cursor/hooks.json 会继续 fail-close 写入。
    • 增加恢复说明:删哪些文件,然后完全退出宿主并开新对话。

现状

  • README 卸载只有 npm uninstall -g devcodex
  • 用户级 ~/.cursor/hooks.json~/.cursor/devcodex/ 会留下。
  • 不删这些文件并重启,Cursor Agent 就一直不能写。
  • progressive-skill-route 会把满足这条 hook 所必需的工具一并拦掉。

恢复写入的临时做法

npm uninstall -g devcodex
rm -f ~/.cursor/hooks.json
rm -rf ~/.cursor/devcodex
# 如存在,一并删除 ~/.codex/devcodex、~/.claude/devcodex、~/.agents/devcodex

然后完全退出 Cursor,重新打开,再开一个 新对话。这样写入就恢复了。

相关

另有一条 issue 描述安装后运行时就把写入死锁。那是运行时问题;本 issue 描述的是 卸载后用户级适配残留,导致 Cursor 仍然不能写

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions