跳到主要内容

Copilot Shell Hooks

Hooks 是 copilot-shell 在代理循环的特定节点执行的脚本或程序, 允许你在不修改 CLI 源码的情况下拦截和自定义行为。

什么是 Hooks?

Hooks 作为代理循环的一部分同步运行 —— 当 hook 事件触发时, copilot-shell 会等待所有匹配的 hook 完成后才继续执行。

通过 Hooks,你可以:

  • 注入上下文:在模型处理请求前注入相关信息(如 git 历史)
  • 验证操作:审查工具参数,阻止潜在危险操作
  • 执行策略:实施安全扫描和合规检查
  • 记录交互:跟踪工具使用和模型响应以供审计
  • 优化行为:动态过滤可用工具或调整模型参数
  • 沙箱命令:自动将危险 shell 命令包装在 linux-sandbox 中隔离执行

入门指南

核心概念

Hook 事件

Hooks 由 copilot-shell 生命周期中的特定事件触发。

事件触发时机影响常见用例
SessionStart会话开始(启动/恢复/清除)注入上下文初始化资源、加载上下文
SessionEnd会话结束(退出/清除)通知清理资源、保存状态
UserPromptSubmit用户提交提示后、规划前阻止/上下文添加上下文、验证输入
Stop代理即将停止时重试/停止审查输出、强制重试
BeforeModel发送 LLM 请求前阻止/模拟修改请求、切换模型
AfterModel收到 LLM 响应后阻止/观察过滤响应、记录日志
BeforeToolSelectionLLM 选择工具前过滤工具过滤可用工具集
PreToolUse工具执行前阻止/重写验证参数、阻止危险操作
PostToolUse工具执行后阻止/上下文处理结果、运行测试
PostToolUseFailure工具执行失败后恢复提取原始命令、沙箱绕过
PreCompact上下文压缩前通知保存状态
Notification系统通知发生时通知转发桌面提醒
PermissionRequest权限对话框显示时允许/拒绝自动批准或拒绝

全局机制

严格 JSON 要求("黄金法则")

Hooks 通过 stdin(输入)和 stdout(输出)通信。

  1. 必须保持沉默:脚本不得stdout 输出 JSON 对象以外的任何文本
  2. 污染 = 失败:如果 stdout 包含非 JSON 文本,解析将失败
  3. 调试用 stderr:所有日志和调试信息使用 stderr(如 echo "debug" >&2

退出码

退出码标签行为影响
0成功stdout 被解析为 JSON
2系统阻止操作被中止,stderr 作为拒绝原因
其他警告非致命失败,显示警告后继续

匹配器(Matcher)

使用 matcher 字段过滤触发 hook 的具体工具或事件:

  • 工具事件PreToolUsePostToolUse):匹配器为正则表达式
  • 生命周期事件:匹配器为精确字符串
  • 通配符"*"""(空字符串)匹配所有

多个 Hook 匹配时

当同一事件有多个 hook 匹配时:

  1. 规划与去重:按事件+匹配器选择 hook,基于 name:command 去重
  2. 执行模式:默认并行执行;若任一 hook 设置 sequential: true串行执行
  3. 串行链式传递PreToolUse 可修改 tool_input,后续 hook 看到修改后的输入
  4. 最终输出合并:限制性结果优先(deny/block),原因文本拼接

配置

Hooks 在 settings.json 中配置,支持多层合并(优先级从高到低):

  1. 项目配置.copilot-shell/settings.json
  2. 用户配置~/.copilot-shell/settings.json
  3. 系统配置/etc/copilot-shell/settings.json
  4. 扩展:已安装扩展中定义的 hooks

配置示例

{
"hooks": {
"enabled": true,
"PreToolUse": [
{
"matcher": "run_shell_command",
"sequential": true,
"hooks": [
{
"type": "command",
"command": "python3 hooks/sandbox-guard.py",
"name": "sandbox-guard",
"timeout": 10000,
"description": "将危险命令包装在沙箱中执行"
}
]
}
]
}
}

Hook 配置字段

字段类型必需说明
typestring执行引擎,目前仅支持 "command"
commandstring要执行的 shell 命令
namestring用于日志和 CLI 命令中标识 hook
timeoutnumber执行超时(毫秒),默认 60000
descriptionstringhook 用途的简要说明

环境变量

Hooks 执行时可用以下环境变量:

  • COPILOT_SHELL_PROJECT_DIR:项目根目录的绝对路径

安全与风险

警告:Hooks 以你的用户权限执行任意代码。

项目级 hooks 在打开不受信任的项目时特别危险。copilot-shell 会对项目 hooks 进行指纹识别。如果 hook 的名称或命令发生变化(如通过 git pull), 它会被视为新的不受信任的 hook,执行前会收到警告。

管理 Hooks

使用 CLI 命令管理 hooks:

  • 查看/hooks panel
  • 全部启用/禁用/hooks enable-all/hooks disable-all
  • 单个切换/hooks enable <name>/hooks disable <name>