钩子允许您通过在代理执行的关键节点运行自定义 shell 命令,扩展和自定义 GitHub Copilot 代理的行为。有关钩子的概念概述——包括可用钩子触发器的详细信息——请参阅 关于钩子。
在 GitHub 仓库中创建钩子
-
在仓库的
.github/hooks/文件夹中创建一个您自定义名称的新hooks.json文件。钩子配置文件 必须位于 仓库的默认分支上,才能被 Copilot 云代理使用。对于 GitHub Copilot CLI,钩子会从当前工作目录加载。 -
在文本编辑器中,复制并粘贴以下钩子模板。请从
hooks数组中移除任何您不打算使用的钩子。JSON { "version": 1, "hooks": { "sessionStart": [...], "sessionEnd": [...], "userPromptSubmitted": [...], "preToolUse": [...], "postToolUse": [...], "errorOccurred": [...] } }{ "version": 1, "hooks": { "sessionStart": [...], "sessionEnd": [...], "userPromptSubmitted": [...], "preToolUse": [...], "postToolUse": [...], "errorOccurred": [...] } } -
在
bash或powershell键下配置您的钩子语法,或者直接引用您已创建的脚本文件。-
此示例使用
sessionStart钩子运行一个脚本,将会话的开始日期输出到日志文件。JSON "sessionStart": [ { "type": "command", "bash": "echo \"Session started: $(date)\" >> logs/session.log", "powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"", "cwd": ".", "timeoutSec": 10 } ],"sessionStart": [ { "type": "command", "bash": "echo \"Session started: $(date)\" >> logs/session.log", "powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"", "cwd": ".", "timeoutSec": 10 } ], -
此示例调用外部的
log-prompt脚本。JSON "userPromptSubmitted": [ { "type": "command", "bash": "./scripts/log-prompt.sh", "powershell": "./scripts/log-prompt.ps1", "cwd": "scripts", "env": { "LOG_LEVEL": "INFO" } } ],"userPromptSubmitted": [ { "type": "command", "bash": "./scripts/log-prompt.sh", "powershell": "./scripts/log-prompt.ps1", "cwd": "scripts", "env": { "LOG_LEVEL": "INFO" } } ],有关代理会话输入 JSON 的完整参考以及示例脚本,请参阅 钩子配置。
-
-
将文件提交到仓库并合并到默认分支。您的钩子现在将在代理会话期间运行。
故障排除
如果在使用钩子时遇到问题,请使用以下表格进行故障排查。
| 议题 | 操作 |
|---|---|
| 钩子未执行 |
|
| 钩子超时 |
|
| JSON 输出无效 |
|
调试
您可以使用以下方法调试钩子
-
在脚本中启用详细日志,以检查输入数据并追踪脚本执行。
Shell #!/bin/bash set -x # Enable bash debug mode INPUT=$(cat) echo "DEBUG: Received input" >&2 echo "$INPUT" >&2 # ... rest of script
#!/bin/bash set -x # Enable bash debug mode INPUT=$(cat) echo "DEBUG: Received input" >&2 echo "$INPUT" >&2 # ... rest of script -
在本地测试钩子,通过将测试输入管道传入钩子以验证其行为
Shell # Create test input echo '{"timestamp":1704614400000,"cwd":"/tmp","toolName":"bash","toolArgs":"{\"command\":\"ls\"}"}' | ./my-hook.sh # Check exit code echo $? # Validate output is valid JSON ./my-hook.sh | jq .# Create test input echo '{"timestamp":1704614400000,"cwd":"/tmp","toolName":"bash","toolArgs":"{\"command\":\"ls\"}"}' | ./my-hook.sh # Check exit code echo $? # Validate output is valid JSON ./my-hook.sh | jq .