Kimi Code CLI 扩展能力与生态集成教程
Kimi Code CLI 扩展能力与生态集成教程
Hooks
2 分钟阅读
Hooks
Hooks(钩子)是 Kimi Code CLI 提供的高度灵活的事件驱动扩展机制:你预先告诉 Kimi Code CLI"每当发生 X,运行这个脚本",脚本在你的本机执行,你可以在里面写任何逻辑。作为AI开发工作流的"黏合剂",Hooks可以帮你实现安全管控、自动化操作、状态同步等高度定制化的需求,配合DeepSeek的工具调用能力,可打造完全适配团队习惯的智能开发流程。 典型的使用场景:
- 安全拦截:Agent 要执行 Shell 命令前,检查是否包含危险操作(如
rm -rf),包含则阻断执行 - 桌面通知:后台任务完成时,弹出系统通知提醒你回来查看结果
- 自动检查:每次用户提交消息时,自动在上下文里附加一些背景信息(如当前 Git 分支、环境版本)
- 流程自动化:代码修改后自动执行ESLint检查、Git提交后自动触发CI流水线
- 多渠道同步:子Agent完成任务后自动将结果同步到企业微信、邮件等平台
通过阅读本文,你将全面掌握Hooks的工作原理、配置方法、事件体系与常见场景的实现方案,能够根据需求开发自定义Hook扩展CLI能力。
Hooks 是怎么工作的
配置一条 hook 规则,需要指定三件事:在什么事件上触发、匹配哪些目标、运行哪个脚本,三者共同构成Hook的核心三要素:
- 触发事件(Event):Agent生命周期中的特定节点,如工具调用前、用户提交消息后、子Agent完成等
- 匹配规则(Matcher):用于过滤事件的正则表达式,可精准匹配你需要处理的特定场景
- 执行脚本(Command):触发时运行的自定义逻辑,支持Shell命令、Python/Node.js脚本等任意可执行程序
触发时,CLI 会把事件的详细信息(触发原因、工具名称、命令内容等)打包成 JSON(一种结构化文本格式),通过标准输入(stdin,程序运行时用来接收外部数据的通道)传给你的脚本,无需额外SDK或网络请求,脚本只需读取stdin即可获取完整上下文信息。脚本读取这些信息后,决定怎么响应。
脚本的响应结果由两样东西决定:
- 退出码(exit code,程序结束时向操作系统报告的状态数字):
0表示放行,2表示阻断,其他数字默认放行 - 标准输出(stdout,就是你用
console.log或print打印出来的内容):可以附带说明文字,内容会被自动附加到会话上下文,模型可直接读取
即使脚本报错、超时,CLI 也不会因此中断你的工作——这种"出错就放行"的设计叫 fail-open(失败开放),避免 hook 异常变成绊脚石,确保核心功能的可用性。
快速上手:一个最简单的 hook
下面这条 hook 会在每次后台任务完成时,在终端标题栏闪一下通知(macOS 需要安装 terminal-notifier),避免你长时间等待任务完成,提升多任务处理效率。
前置环境检查:
- 运行
brew install terminal-notifier安装通知工具(macOS),Windows用户可使用burnttoast、Linux用户可使用notify-send替代 - 执行
terminal-notifier -title "测试" -message "通知测试",若弹出系统通知说明环境正常
配置步骤:
生效验证:
保存配置、运行/reload重载配置,无报错则说明配置生效。下次后台任务完成时就会弹出通知,你也可以执行/run sleep 10触发测试,10秒后将收到通知。
配置
所有 hook 规则写在 ~/.kimi-code/config.toml 的 [[hooks]] 数组里,每一项是一条规则:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
event | string | 是 | 触发事件名,必须是下文「事件一览」表中的某一项,不支持自定义事件 |
matcher | string | 否 | 用Go语言正则表达式过滤事件目标;不填则匹配该事件下的全部场景,特殊字符需转义 |
command | string | 是 | 触发时要运行的 Shell 命令,支持管道、重定向,也可直接写脚本绝对路径 |
timeout | integer | 否 | 超时秒数,范围 1–600;默认 30 秒,通知类Hook建议设为5秒以内,复杂检查类可设为30-60秒 |
[[hooks]] 只允许这四个字段,多写会导致配置文件加载失败,可运行/config validate命令检查配置语法是否正确。
同一事件匹配多条规则时,所有命中的 hook 并行运行,不会互相等待,若有依赖关系建议合并为一个脚本执行;command 完全相同的多条规则只运行一次,避免重复执行。
Hook 命令的工作目录是当前会话的项目目录,可直接使用相对路径访问项目内的文件。非 Windows 平台上,hook 进程放在独立进程组里,超时时先发SIGTERM信号让它有机会善后,之后才强制终止。
事件数据格式
每次触发时,CLI 都会把以下基础信息通过 stdin 传给脚本,所有字段名使用下划线命名(snake_case):
具体事件还会附带额外字段(如工具名称、命令内容),例如PreToolUse事件的完整payload:
你可在脚本中直接读取这些字段获取完整上下文信息。
返回值
脚本结束后,CLI 根据退出码判断 hook 的意图:
| 退出码 | 含义 | CLI 怎么处理 |
|---|---|---|
0 | 正常结束,放行 | 继续执行,若标准输出(stdout)有内容可附加到上下文,模型可直接读取 |
2 | 主动阻断 | 停止当前操作;错误输出(stderr,console.error 打印的内容)作为阻断原因,同时会被加入上下文供模型参考 |
| 其他非零值 | 脚本出错 | 默认放行(fail-open),错误信息会被记录到Hook日志 |
| 超时或崩溃 | 脚本异常 | 默认放行(fail-open),错误信息会被记录到Hook日志 |
也可以通过标准输出返回一段 JSON 来实现更灵活的阻断逻辑:
只有可阻断事件(PreToolUse、Stop、UserPromptSubmit)的返回值会影响主流程。其余事件属于观察型事件——触发后即发即忘,不管脚本返回什么,主流程都不会改变。
事件一览
| 事件 | Matcher 匹配的是 | 会触发阻断? | 适用场景 | 说明 |
|---|---|---|---|---|
UserPromptSubmit | 用户提交的文本内容 | ✓ | 自动注入上下文信息(如Git分支、环境版本)、敏感词过滤 | 用户发送消息时触发;返回文本会附加到上下文;若阻断,本轮不调用模型 |
PreToolUse | 工具名 | ✓ | 安全拦截、命令改写(如自动将npm install替换为pnpm install) | 工具调用前触发(权限检查前);阻断后工具不会执行 |
Stop | 空字符串 | ✓ | 自动检查未完成任务、强制补充必要信息 | 模型准备结束本轮时触发;阻断后可追加一条消息让模型继续 |
PostToolUse | 工具名 | — | 后置处理(如Git提交后自动触发CI、代码修改后自动执行ESLint) | 工具成功执行后触发(观察用) |
PostToolUseFailure | 工具名 | — | 错误告警、自动重试逻辑 | 工具失败或被阻断后触发(观察用) |
PermissionRequest | 工具名 | — | 安全告警、审批流程同步 | 即将等待用户审批前触发(观察用) |
PermissionResult | 工具名 | — | 权限规则自动学习、审批日志记录 | 审批结束后触发(观察用) |
SessionStart | startup 或 resume | — | 环境检查、初始化操作 | 新会话启动或历史会话恢复后触发 |
SessionEnd | exit | — | 会话日志归档、资源清理 | 会话关闭后触发 |
SubagentStart | 子 Agent 名称 | — | 子任务启动通知、资源预分配 | 子 Agent 开始运行前触发 |
SubagentStop | 子 Agent 名称 | — | 子任务完成通知、结果自动同步 | 子 Agent 成功完成后触发(观察用) |
StopFailure | 错误类型 | — | 错误告警、自动重试 | 本轮因错误失败后触发(观察用) |
Interrupt | 空字符串 | — | 用户中断日志记录、资源清理 | 用户中断本轮时触发(例如按下 Esc);超时或其他程序性中断不会触发。中断时 Stop 不会触发,由本事件替代。payload 含 reason 字段(观察用) |
PreCompact | manual 或 auto | — | 压缩前备份、日志记录 | 上下文压缩开始前触发;返回值被完全忽略 |
PostCompact | manual 或 auto | — | 压缩结果通知、token消耗统计 | 上下文压缩完成后触发(观察用) |
Notification | 通知类型(如 task.completed) | — | 多渠道通知(系统通知、企业微信、邮件) | 后台任务状态变化时触发(观察用) |
示例:阻断危险 Shell 命令
下面的 hook 在 Agent 调用 Bash 工具前检查命令内容,发现 rm -rf 就阻断,避免误删文件造成数据损失。
前置环境检查:
运行node -v确认已安装Node.js v16及以上版本,若未安装可通过官网或包管理器安装。
配置步骤:
- 在
~/.kimi-code/下新建hooks目录,创建block-dangerous-bash.mjs文件:
生效验证:
保存文件后运行/reload重载配置,当Agent要执行包含rm -rf且不在白名单内的命令时,会弹出阻断提示,模型会收到该提示并调整为更安全的操作方式。
常见问题(FAQ)
- Hook脚本没有生效怎么办?
首先运行
/config validate检查config.toml语法是否正确,然后检查脚本是否有可执行权限(可运行chmod +x <脚本路径>添加权限),最后可在脚本中添加日志输出将payload写入本地文件,或运行/logs hooks查看Hook执行日志排查问题。 - Hook可以修改Agent的工具调用参数吗? 目前不支持直接修改工具调用参数,只能选择放行或阻断。如果需要修改参数,可在阻断原因中说明需要调整的内容,模型会自动调整参数重新发起调用。
- Hook的执行日志在哪里查看?
运行
/logs hooks命令可查看所有Hook的执行日志,包括stdout、stderr、退出码、执行时间等信息,方便排查问题。