Skip to content
FunCoding

Search

Search docs, Skills and MCP

Hooks 排障与动态插件

检查配置加载、工作目录和响应,并用 workspaceOpen 按工作区注册插件。

This page has not been translated into English yet. The original Chinese version is shown below.

Hook 没有触发、触发后失败、返回值未生效是不同问题。先在 Customize > Hooks 和 Hooks output channel 检查配置、执行记录和错误。

加载与路径

Cursor 监视 hooks.json 并在保存后重新加载;仍未加载时重启。项目脚本路径相对于项目根,用户脚本相对于 ~/.cursor,脚本还需要具备执行权限。

matcher 匹配对象由事件决定:shell 匹配整条命令,subagent 匹配类型,通用工具匹配 tool type。把文件 glob 当作 afterFileEdit 的 matcher 不会按预期筛选路径。

响应不生效

按事件检查输出字段:preToolUse 的 ask 当前不被执行,subagentStart 的 ask 被当作 deny,sessionStart 的 continue:false 不阻止创建。无效 JSON 在权限事件中会阻止动作,而其他失败默认可能放行;具体见失败策略。

输入中的 conversation_id 在多轮中稳定,generation_id 每条用户消息变化;model_id、model_params 可能缺省。transcript_path 可能为 null,不要未经检查就读文件。

可用环境变量

变量条件与含义
CURSOR_PROJECT_DIR工作区根目录,始终提供
CLAUDE_PROJECT_DIR兼容别名,始终提供
CURSOR_VERSIONCursor 版本,始终提供
CURSOR_USER_EMAIL已登录时提供
CURSOR_TRANSCRIPT_PATH启用 transcripts 时提供
CURSOR_CODE_REMOTE远程工作区中为字符串 true

workspaceOpen

打开工作区及每次文件夹变化时触发,零文件夹窗口跳过。它在 desktop 和 CLI 运行,位于 Agent 会话之外,因此输入不带 conversation_id、generation_id、model、session_id 或 transcript_path。

脚本可返回绝对插件目录列表:

{
  "pluginPaths": ["/absolute/path/to/workspace-plugin"]
}

适合按工作区选择插件。输入仍有 hook_event_name、cursor_version、workspace_roots、user_email;不要要求必须存在会话字段才处理该事件。