关于钩子
挂钩使你可以在代理工作流中的战略点执行自定义 shell 命令,例如代理会话启动或结束,或者在输入提示或调用工具之前和之后。
挂钩通过 JSON 输入接收有关智能体操作的详细信息,支持上下文感知自动化。 例如,您可以使用钩子来:
- 以编程方式批准或拒绝工具执行。
- 利用机密扫描等内置安全功能来防止凭据泄漏。
- 实现自定义验证规则和审核日志记录以实现符合性。
Copilot 智能体支持存储在仓库中 .github/hooks/*.json 路径下 JSON 文件中的挂钩。
挂钩可用于:
- Copilot 编码智能体 上的 GitHub
- 终端中的 GitHub Copilot 命令行界面
挂钩类型
提供以下类型的挂钩:
-
**sessionStart**:在新代理会话开始或恢复现有会话时执行。 可用于初始化环境、日志会话开始用于审核、验证项目状态和设置临时资源。 -
**sessionEnd**:在代理会话完成或终止时执行。 可用于清理临时资源、生成和存档会话报告和日志,或发送有关会话完成的通知。 -
**userPromptSubmitted**:当用户向代理提交提示时执行。 可用于记录用户审核和使用情况分析的请求。 -
**preToolUse**:在代理使用任何工具(如 `bash`, `edit`,) `view`之前执行。 这是最强大的挂钩,因为它可以 **批准或拒绝工具执行**。 使用此挂钩程序可阻止危险命令、强制实施安全策略和编码标准、要求批准敏感操作,或记录工具使用情况以实现合规性。 -
**postToolUse**:在工具完成执行后执行(无论是成功还是失败)。 可用于记录执行结果、跟踪使用情况统计信息、生成审核线索、监视性能指标以及发送故障警报。 -
**errorOccurred**:在代理执行期间发生错误时执行。 可用于记录用于调试的错误、发送通知、跟踪错误模式和生成报告。
若要查看具有示例用例、最佳做法和高级模式的挂钩类型的完整参考,请参阅 挂钩配置。
钩子配置格式
使用特殊 JSON 格式配置钩子。 JSON 必须包含一个字段version,其值为1,并含有一个hooks对象,该对象包含挂钩定义的数组。
{
"version": 1,
"hooks": {
"sessionStart": [
{
"type": "command",
"bash": "string (optional)",
"powershell": "string (optional)",
"cwd": "string (optional)",
"env": { "KEY": "value" },
"timeoutSec": 30
}
],
}
}
{
"version": 1,
"hooks": {
"sessionStart": [
{
"type": "command",
"bash": "string (optional)",
"powershell": "string (optional)",
"cwd": "string (optional)",
"env": { "KEY": "value" },
"timeoutSec": 30
}
],
}
}
挂钩对象可以包含以下键:
| 资产 | 必选 | Description |
|---|---|---|
type | 是的 | 必须是 "command" |
bash | 是(在 Unix 系统上) | 要执行的 bash 脚本的路径 |
powershell | 是(在 Windows 上) | 要执行的 PowerShell 脚本的路径 |
cwd | 否 | 脚本的工作目录(相对于存储库根目录) |
env | 否 | 与现有环境合并的其他环境变量 |
timeoutSec | 否 | 最大执行时间(默认值:30) |
示例挂钩配置文件
这是位于存储库中的 ~/.github/hooks/project-hooks.json 示例配置文件。
{
"version": 1,
"hooks": {
"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
}
],
"userPromptSubmitted": [
{
"type": "command",
"bash": "./scripts/log-prompt.sh",
"powershell": "./scripts/log-prompt.ps1",
"cwd": "scripts",
"env": {
"LOG_LEVEL": "INFO"
}
}
],
"preToolUse": [
{
"type": "command",
"bash": "./scripts/security-check.sh",
"powershell": "./scripts/security-check.ps1",
"cwd": "scripts",
"timeoutSec": 15
},
{
"type": "command",
"bash": "./scripts/log-tool-use.sh",
"powershell": "./scripts/log-tool-use.ps1",
"cwd": "scripts"
}
],
"postToolUse": [
{
"type": "command",
"bash": "cat >> logs/tool-results.jsonl",
"powershell": "$input | Add-Content -Path logs/tool-results.jsonl"
}
],
"sessionEnd": [
{
"type": "command",
"bash": "./scripts/cleanup.sh",
"powershell": "./scripts/cleanup.ps1",
"cwd": "scripts",
"timeoutSec": 60
}
]
}
}
{
"version": 1,
"hooks": {
"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
}
],
"userPromptSubmitted": [
{
"type": "command",
"bash": "./scripts/log-prompt.sh",
"powershell": "./scripts/log-prompt.ps1",
"cwd": "scripts",
"env": {
"LOG_LEVEL": "INFO"
}
}
],
"preToolUse": [
{
"type": "command",
"bash": "./scripts/security-check.sh",
"powershell": "./scripts/security-check.ps1",
"cwd": "scripts",
"timeoutSec": 15
},
{
"type": "command",
"bash": "./scripts/log-tool-use.sh",
"powershell": "./scripts/log-tool-use.ps1",
"cwd": "scripts"
}
],
"postToolUse": [
{
"type": "command",
"bash": "cat >> logs/tool-results.jsonl",
"powershell": "$input | Add-Content -Path logs/tool-results.jsonl"
}
],
"sessionEnd": [
{
"type": "command",
"bash": "./scripts/cleanup.sh",
"powershell": "./scripts/cleanup.ps1",
"cwd": "scripts",
"timeoutSec": 60
}
]
}
}
性能注意事项
挂钩同步运行并阻止代理执行。 若要确保响应式体验,请记住以下注意事项:
-
**最小化执行时间**:尽可能将挂钩执行时间保持在 5 秒以内。 -
**优化日志记录**:使用异步日志记录操作,例如将日志追加到文件中,而不是同步输入/输出操作。 -
**使用后台处理**:对于昂贵的操作,请考虑后台处理。 -
**缓存结果**:尽可能缓存昂贵的计算。
安全注意事项
若要确保在使用挂钩时保持安全性,请记住以下注意事项:
-
**始终验证和清理挂钩处理的输入**。 不受信任的输入可能导致意外行为。 -
**构造命令时使用适当的 Shell 转义**。 这可以防止命令注入漏洞。 -
**从不记录敏感数据,例如令牌或密码**。 -
**确保挂钩脚本和日志具有适当的权限**。 -
**请谨慎使用会进行外部网络调用的钩子**。 这可能会导致延迟、故障或向第三方公开数据。 -
**设置适当的超时以防止资源耗尽**。 长时间运行的挂钩可能会阻止代理执行并降低性能。
后续步骤
若要开始创建挂钩,请参阅 在 GitHub Copilot 智能体中使用挂钩。