Skip to content

Copilot CLI Hooks 让你在 AI 操作的前后"插入"自定义脚本:AI 修改代码后自动跑 eslint,提交前自动跑测试,或者记录每次会话的操作日志。Hooks 通过项目目录下的 hooks.json 配置,不影响 Copilot 的核心行为,只是在特定时机触发你的脚本。

GitHub Copilot CLI Hooks:在会话关键节点自动执行自定义脚本

什么是 Hooks

Hooks 是在 Copilot CLI 会话生命周期的特定节点,自动执行你预定义的 Shell 命令或脚本的机制。

与 Claude Code 的 Hooks 概念相同:你不改变 AI 的行为逻辑,而是在 AI 动作的"前后"挂载自己的操作,实现自动化质量保证、日志记录或与现有工具链的集成。

配置文件

在项目目录(或 ~/.copilot/)创建 hooks.json 文件:

json
{
  "hooks": [
    {
      "event": "postToolUse",
      "command": "npm run lint:fix"
    },
    {
      "event": "sessionEnd",
      "command": "echo \"Session ended: $(date)\" >> logs/copilot-session.log"
    }
  ]
}

支持的 Hook 事件

事件触发时机
sessionStartCLI 会话启动时
sessionEndCLI 会话结束时
userPromptSubmitted用户发送 Prompt 后、Copilot 处理前
preToolUseCopilot 调用工具(如写文件)前
postToolUseCopilot 调用工具后
errorOccurred发生错误时

配置字段

每个 Hook 条目支持以下字段:

字段必须说明
event触发事件名称
command要执行的 Shell 命令(bash 或 PowerShell)
cwd命令的工作目录,默认为当前目录
timeoutSec命令超时时间(秒),超时后强制终止
env额外的环境变量(JSON 格式)

实用示例

代码修改后自动 Lint

json
{
  "hooks": [
    {
      "event": "postToolUse",
      "command": "npm run lint:fix",
      "timeoutSec": 30
    }
  ]
}

运行测试(超时保护)

json
{
  "hooks": [
    {
      "event": "postToolUse",
      "command": "npm test --passWithNoTests",
      "timeoutSec": 60
    }
  ]
}

记录会话操作日志

json
{
  "hooks": [
    {
      "event": "sessionStart",
      "command": "echo \"[$(date)] Copilot session started\" >> ~/.copilot/session.log"
    },
    {
      "event": "sessionEnd",
      "command": "echo \"[$(date)] Copilot session ended\" >> ~/.copilot/session.log"
    }
  ]
}

每次 Prompt 时检查 TypeScript 类型

json
{
  "hooks": [
    {
      "event": "postToolUse",
      "command": "npx tsc --noEmit",
      "timeoutSec": 30
    }
  ]
}

与自定义指令的区别

Hooks自定义指令
作用执行外部脚本为 AI 提供上下文信息
执行时机特定事件触发每次对话注入
适合场景自动化质量检查、日志项目规范、架构约定

调试技巧

  • 在命令中加 echo 或写入日志文件,确认 Hook 是否被触发
  • 使用 timeoutSec 防止 Hook 因子进程挂起而阻塞 Copilot
  • 先在终端手动运行命令确认无误,再写入 hooks.json

常见问题

Q: Hooks 中的命令执行失败会影响 Copilot 的后续操作吗?

A: 默认情况下,Hook 执行失败(非零退出码)不会中断 Copilot 的工作流,但会在日志中记录错误。如果需要在某些情况下阻止操作继续,可以结合 preToolUse 事件实现门控逻辑。

Q: hooks.json 应该放在项目目录还是全局目录?

A: 项目相关的质量检查(如 npm test)放在项目目录的 hooks.json;通用的日志记录等放在 ~/.copilot/hooks.json。两个文件都存在时,都会生效。

Q: 这个 Hooks 系统和 Claude Code 的 Hooks 有什么区别?

A: 概念相同,但配置格式和事件名称有差异。Claude Code 使用 settings.json 中的 hooks 字段;Copilot CLI 使用独立的 hooks.json。两者的核心理念一致:在 AI 操作前后自动执行自定义逻辑。