Hooks 面向需要对 Cascade 行为进行精细化控制的高级用户和 Enterprise 团队。使用它们需要具备基础的 shell 脚本知识。
你可以构建什么
- 日志与 Analytics:为合规与使用分析,跟踪 Cascade 读取的每个文件、进行的代码更改、执行的命令、用户请求或 Cascade 响应
- 安全控制:阻止 Cascade 访问敏感文件、运行高风险命令,或处理违反策略的请求
- 质量保障:在代码修改后自动运行 linter、formatter 或测试
- 自定义工作流:与缺陷/事项跟踪器、通知系统或部署流水线集成
- 团队标准化:在组织范围内强制执行编码规范与最佳实践
钩子如何工作
- 通过标准输入以 JSON 格式接收上下文 (有关正在执行的操作的详细信息)
- 执行你的脚本——Python、Bash、Node.js,或任何可执行文件
- 通过退出码和输出流返回结果
2 退出来阻止该操作。这使预钩子非常适合实施安全策略或验证检查。
配置
系统级
- macOS:
/Library/Application Support/Windsurf/hooks.json - Linux/WSL:
/etc/windsurf/hooks.json - Windows:
C:\ProgramData\Windsurf\hooks.json
用户级
- Windsurf IDE:
~/.codeium/windsurf/hooks.json - JetBrains 插件:
~/.codeium/hooks.json
工作区级别
- 位置:工作区根目录下的
.windsurf/hooks.json
来自这三个位置的钩子会被合并。如果同一钩子事件在多个位置配置,所有钩子将按顺序执行:system → user → workspace。
基本结构
配置选项
关于
working_directory 参数:- 在多仓库工作区中,默认值为当前正在处理的仓库根目录
- 相对路径将从默认位置 (工作区或仓库根目录) 解析
- 支持绝对路径
- 不支持使用
~进行用户主目录展开
Hook 事件
通用输入结构
在以下示例中,为简洁起见省略了通用字段。共有十二类主要的 hook 事件:
pre_read_code
file_path 可能是目录路径。
post_read_code
file_path 可能是目录路径。
pre_write_code
post_write_code
pre_run_command
post_run_command
pre_mcp_tool_use
post_mcp_tool_use
pre_user_prompt
show_output 配置选项不适用于此钩子。
post_cascade_response
response 字段包含自上次用户输入以来 Cascade 返回的、采用 Markdown 格式的内容。这包括规划器的响应、工具操作 (读取文件、写入、执行命令) 以及 Cascade 执行的任何其他步骤。它还包括哪些规则被触发的信息。关于如何解析规则使用情况,请参见 Tracking Triggered Rules 示例。
show_output 配置选项不适用于此钩子。
post_cascade_response_with_transcript
post_cascade_response。不同的是,这个 hook 不会内联提供 markdown 摘要,而是将整个会话的完整转录记录 (从会话开始到当前) 写入本地 JSONL 文件,并返回文件路径。
使用场景:Enterprise 审计与合规日志记录、追踪 AI 生成的贡献、将会话转录发送到外部可观测性或 Analytics 工具
输入 JSON:
transcript_path 指向 ~/.windsurf/transcripts/{trajectory_id}.jsonl 里的一个 JSONL 文件。文件中的每一行都是一个 JSON 对象,表示对话中的单个步骤,包含 type 和 status 字段以及该步骤特有的数据。例如:`
0600 权限写入。Windsurf 会自动将转录目录限制为 100 个文件,并按修改时间删除最旧的文件。
show_output 配置选项不适用于此 hook。
下表展示了 post_cascade_response 和 post_cascade_response_with_transcript 这两个 hook 之间的关键差异:
post_setup_worktree
.env 文件或其他未被 Git 跟踪的文件复制到 worktree 中、安装依赖、运行初始化脚本
环境变量:
输入 JSON:
退出码
请注意,如果
show_output 为 true,用户可以在 Cascade UI 中看到钩子生成的标准输出和标准错误。
示例用法
记录所有 Cascade 操作
log_input.py) :
限制文件访问
block_read_access.py) :
阻止危险命令
block_dangerous_commands.py) :
阻止违反策略的提示词
block_bad_prompts.py) :
记录 Cascade 响应
log_cascade_response.py) :
跟踪已触发的规则
track_rules.py) :
Always On- 始终生效的规则Model Decision- 其描述会展示给 AI 模型,以便按条件决定是否应用的规则Manual- 在用户输入中通过 @ 显式提及的规则Global- 来自global_rules.md的全局规则Glob- 通过匹配 glob 模式的文件访问而触发的规则
这里记录的是哪些规则被 展示 给了 AI 模型,或因文件访问而被 触发,但并不表示 AI 模型实际上 遵循 了某条规则。最近已经在对话中展示过的规则会被去重,可能要到之后才会再次出现。
编辑后运行代码格式化程序
format_code.sh) :
设置工作树
.windsurf/hooks.json 中):
hooks/setup_worktree.sh):
最佳实践
安全
- 验证所有输入:切勿在未经验证的情况下信任输入的 JSON,尤其是文件路径和命令。
- 使用绝对路径:在 hook 配置中始终使用绝对路径以避免歧义。
- 保护敏感数据:避免记录 API 密钥或凭证等敏感信息。
- 审查权限:确保你的 hook 脚本具有适当的文件系统权限。
- 部署前审计:在将每条 hook 命令和脚本加入配置前进行审计。
- 隔离测试:在主力开发机器上启用前,先在测试环境中运行 hooks。
性能注意事项
- 确保 hooks 足够快:缓慢的 hooks 会影响 Cascade 的响应速度。尽量将执行时间控制在 100ms 以内。
- 使用异步操作:对于非阻塞的 hooks,可将日志异步写入队列或数据库。
- 提前过滤:在脚本开头检查操作类型,避免不必要的处理。
错误处理
- 务必验证 JSON:使用 try-catch 代码块,优雅地处理格式不正确的输入。
- 正确记录错误:将错误写到
stderr,以便在启用show_output时可见。 - 安全降级:如果你的 hook 遇到错误,考虑是应阻止该操作,还是允许其继续执行。
测试你的 Hooks
- 从日志入手:先实现一个简单的日志 hook,了解数据流向。
- 使用
show_output: true:在开发过程中启用输出,以便查看 hooks 的执行情况。 - 测试阻塞行为:验证在前置 hooks 中,退出码 2 能正确阻止操作。
- 检查所有代码路径:在脚本中同时测试成功与失败两种情形。
Enterprise 级分发
- Cloud Dashboard - 通过 Windsurf Dashboard 中的 Team Settings 配置 hooks
- System-Level Files - 通过 MDM 或配置管理工具部署 hooks
云端控制台配置
- Enterprise 方案
TEAM_SETTINGS_UPDATE权限
- 在 Windsurf 控制台中进入 Team Settings
- 找到 Cascade Hooks 部分
- 以 JSON 格式输入 hooks 配置
- 保存更改
当合并多个团队配置时,hooks 会按每个 action 进行合并,而不是相互覆盖。这意味着来自所有适用团队配置的 hooks 会一同运行。
系统级文件部署
hooks.json 配置部署到以下各操作系统的指定位置:
macOS:
/usr/local/share/windsurf-hooks/) 。
系统级 hook 的优先级高于用户级和工作区级 hook,终端用户若无 root 权限将无法将其禁用。
MDM 和配置管理
- Jamf Pro (macOS) - 通过配置描述文件或脚本进行部署
- Microsoft Intune (Windows/macOS) - 使用 PowerShell 脚本或策略进行部署
- Workspace ONE、Google Endpoint Management 以及其他 MDM 解决方案
- Ansible、Puppet、Chef、SaltStack - 利用你现有的基础设施自动化
- 自定义部署脚本 - Shell 脚本、PowerShell 或你常用的工具
验证与审计
重要:系统级钩子由贵司的 IT 或安全团队全权管理。Windsurf 不会在系统级路径部署或管理任何文件。请确保内部团队依照贵组织的政策负责部署、更新与合规。
团队项目中的工作区钩子
其他资源
- MCP 集成:详细了解 Windsurf 中的 MCP (模型上下文协议,Model Context Protocol)
- 工作流:了解如何将 hooks 与 Cascade Workflows 结合使用
- Analytics:通过 Team Analytics 跟踪 Cascade 的使用情况