Hooks
Hooks 在 Agent 生命周期事件上执行配置的动作。EvoX 扩展中的 Hooks 页面用于查看、诊断和重新扫描配置,帮助确认执行来源与 shell 风险;它不是 Hook 编辑器或运行中热重载入口。
查看实际来源
打开 扩展 > Hooks,按事件、匹配条件和作用域检查条目。页面读取桌面所用的 Claude Code 风格生命周期配置,包括用户、项目与管理员管理范围。
| 来源 | 检查重点 |
|---|---|
| 用户配置 | Agent 目录下的 settings.json,影响该用户范围 |
| 项目配置 | 对应项目范围的 settings.local.json,核对实际项目目录 |
| 管理配置 | 管理员部署的系统配置,应用内按只读方式检查 |
界面显示事件、匹配条件、作用域、解析状态以及命令的 shell 风险。命令展示经过长度限制和脱敏;展示文本不能替代对原配置及脚本的检查。
判断是否适合使用
适合 Hook 的动作包括在明确事件后运行范围受控的检查或记录。需要人工判断、外部写入、发布或消费的操作,仍保留各自的授权与验证流程。
在配置动作前确认:
- 事件是
PreToolUse、PostToolUse、UserPromptSubmit、Stop等生命周期中的哪一个。 - 匹配条件会覆盖哪些调用,是否意外扩大到所有工具。
- 命令读取哪些输入、写到哪里、访问哪些网络资源。
- 超时、失败和重复触发如何影响后续任务。
- 日志是否包含提示、文件内容或凭证。
这些 Hook 具备 shell 执行影响。来源不明的命令不因出现在配置列表中就变成可信动作。
示例:检查一次文件编辑后的语法
下面是项目配置中的 Hook 结构,放入负责该项目的配置文件。把命令中的两个路径替换为实际 Node.js 可执行文件与待检查文件的绝对路径,并保留该文件中的其他配置:
{
"hooks": {
"PostToolUse": [{
"matcher": "Write|Edit",
"hooks": [{
"type": "command",
"command": "\"/absolute/path/to/node\" --check \"/absolute/path/to/project/src/example.mjs\""
}]
}]
}
}
本例在匹配的文件写入或编辑工具事件后检查固定文件的 JavaScript 语法,不自动检查每个被编辑文件,也不执行该模块。路径含空格时按所用 shell 正确引用。先在目标运行环境中手动执行这条命令,确认文件存在且 Node 可用,再交给 Hook。
保存后重新扫描,在条目中核对 PostToolUse、Write|Edit、来源和命令。按 Agent 的加载流程重启或加载配置,再让它对测试文件完成一次编辑,核对该次处理命令的实际输出。扫描列表出现条目只证明配置被发现。
| 故障 | 检查位置 |
|---|---|
| 扫描解析失败 | 对应来源文件的 JSON 与 Hook 结构 |
| 发现条目但没有触发 | 运行中的配置是否已加载,事件与工具名称是否匹配 |
| 命令退出失败 | 绝对路径、shell、依赖和语法错误输出 |
| 每次调用都被触发 | matcher 是否写得过宽,以及事件是否选错 |
测试结束后移除这条示例 Hook 并重新加载对应 Agent,避免后续编辑继续检查同一个演示文件。
修改后分别验证磁盘与运行时
修改由该配置的所有者完成;Hooks 页面不负责写回配置文件。修改前保留原内容,先检查格式、命令和脚本,再保存到正确作用域。
选择重新扫描后,页面重新读取磁盘,并更新发现条目与解析诊断。重新扫描不重载正在运行的 Agent Hook 表。 按承载该 Agent 的启动流程重新加载或重启,再用一个范围明确的事件检查实际效果。
不要把 /hooks reload 当作已经可用的运行时重载接口。配置已保存、扫描成功与动作实际生效需要分别确认。
处理异常与停用
解析失败时先检查失败作用域;不能把列表缺项当作没有 Hook。重新扫描失败时,核对最后成功扫描时间,旧列表不代表新配置读取成功。
停用时修改真实来源配置,并按运行时加载流程验证。停止某条 Hook 不等于撤销它已产生的文件、网络操作或外部授权。需要恢复时使用修改前保留的配置及任务记录。