钩子挂钩允许您在 Antigravity 执行循环期间的特定点运行自定义脚本或 shell 命令。这对于执行自定义规则、运行 linter 或自动捕获诊断信息非常有用。
配置挂钩在位于自定义目录中的 hooks.json 文件中进行配置(例如,工作区中的 .agents/ 或 ~/.gemini/config/ )。
架构和文件格式
hooks.json 文件将挂钩名称映射到其事件配置。
{
"my-linter-hook": {
"PostToolUse": [
{
"matcher": "run_command",
"hooks": [
{
"type": "command",
"command": "./scripts/lint.sh",
"timeout": 10
}
]
}
]
},
"safety-gate": {
"enabled": false,
"PreToolUse": [
{
"matcher": "run_command",
"hooks": [
{
"command": "./scripts/safety-check.sh"
}
]
}
]
},
"reminder": {
"PreInvocation": [
{
"type": "command",
"command": "./scripts/reminder.sh"
}
]
}
}
钩子定义字段
| 领域 | 类型 | 描述 |
|---|---|---|
enabled |
布尔 | 选修的。设置为 false 以禁用挂钩而不删除它。默认为 true 。 |
PreToolUse |
数组 | 在执行工具之前运行的处理程序。 |
PostToolUse |
数组 | 工具完成后运行的处理程序。 |
PreInvocation |
数组 | 在 Antigravity 调用模型之前运行的处理程序。 |
PostInvocation |
数组 | 工具调用完成后运行的处理程序。 |
Stop |
数组 | 当执行循环终止时运行的处理程序。 |
支持的活动
| 活动 | 描述 | 匹配器目标 |
|---|---|---|
PreToolUse |
在执行工具之前触发。 | 工具名称(例如 run_command ) |
PostToolUse |
工具完成后触发。 | 工具名称 |
PreInvocation |
在调用模型之前触发。 | N/A(忽略匹配器) |
PostInvocation |
工具调用完成后触发。 | N/A(忽略匹配器) |
Stop |
执行终止时触发。 | N/A(忽略匹配器) |
匹配器对于 PreToolUse 和 PostToolUse ,您可以在 matcher 字段中使用正则表达式来指定哪些工具触发挂钩:
""或"*":匹配所有工具。"run_command":完全匹配run_command。"run_command|view_file":匹配任一工具。"browser_.*":匹配以browser_开头的任何工具。
<公告>
图标:信息
iconColor: var(--主题-primary)
颜色:var(--主题-表面-表面-容器)
文本: 注意:对于 PreInvocation 、 PostInvocation 和 Stop ,结构更简单(直接位于事件键下的处理程序列表)并且匹配器被忽略。
</公告>
支持的工具对于 PreToolUse 和 PostToolUse 匹配器,您可以匹配以下工具名称(按类别分组):
文件和目录操作
- **
view_file**:查看文件的内容。 - 参数:
AbsolutePath、StartLine(可选)、EndLine(可选)、IsSkillFile(可选) - **
write_to_file**:创建新文件。 - 参数:
TargetFile、Overwrite、CodeContent、Description、IsArtifact(可选)、ArtifactMetadata(可选) - **
replace_file_content**:编辑文件中的单个连续文本块。 - 参数:
TargetFile、Instruction、Description、AllowMultiple、TargetContent、ReplacementContent、StartLine、EndLine、TargetLintErrorIds(可选) - **
multi_replace_file_content**:对同一文件进行多次、不连续的编辑。 - 参数:
TargetFile、Instruction、Description、ReplacementChunks(块数组)、TargetLintErrorIds(可选)、ArtifactMetadata(可选) - **
list_dir**:列出目录的内容。 - 参数:
DirectoryPath - **
find_by_name**:使用 glob 模式搜索文件和目录。 - 参数:
SearchDirectory、Pattern、Type(可选)、Excludes(可选)、Extensions(可选)、FullPath(可选)、MaxDepth(可选)
搜索与研究
- **
grep_search**:在特定路径内快速文本搜索。 - 参数:
SearchPath、Query、IsRegex(可选)、CaseInsensitive(可选)、Includes(可选)、MatchPerLine(可选) - **
search_web**:执行一般网络搜索。 - 参数:
query、domain(可选) - **
read_url_content**:获取公共 URL 的文本内容。 - 参数:
Url
系统与执行
- **
run_command**:建议运行 bash 命令。 - 参数:
CommandLine、Cwd、WaitMsBeforeAsync、RunPersistent(可选)、RequestedTerminalID(可选) - **
manage_task**:与后台任务交互。 - 参数:
Action('list'、'kill'、'status'、'send_input')、TaskId(可选)、Input(可选) - **
schedule**:设置计时器或重复的 cron 作业。 - 参数:
DurationSeconds(可选)、CronExpression(可选)、MaxIterations(可选)、Prompt - **
list_permissions**:查看当前资源访问授权。 - 参数:无
- **
ask_permission**:请求额外的范围权限。 - 参数:
Action、Target、Reason
代理协作
- **
invoke_subagent**:生成专门的子代理。 - 参数:
Subagents(包含Prompt、Role、TypeName、Workspace的规范数组(可选)) - **
define_subagent**:创建自定义子代理。 - 参数:
name、description、system_prompt、enable_mcp_tools(可选)、enable_write_tools(可选)、enable_subagent_tools(可选) - **
send_message**:与其他代理通信。 - 参数:
Recipient、Message - **
manage_subagents**:列出或终止活动子代理。 - 参数:
Action('list'、'kill'、'kill_all')、ConversationIds(可选)
互动与媒体
- **
ask_question**:提出多项选择题。 - 参数:
questions(包含question、options、is_multi_select的问题数组) - **
generate_image**:创建或编辑图像。 - 参数:
Prompt、ImageName、ImagePaths(可选)
钩子处理程序配置
hooks 数组中的每一项都支持:
| 领域 | 类型 | 描述 |
|---|---|---|
type |
字符串 | 选修的。目前仅支持 "command" 。默认为 "command" 。 |
command |
字符串 | 必需的。要执行的 shell 命令。 |
timeout |
整数 | 选修的。超时(以秒为单位)。默认为 30 。 |
输入/输出合同挂钩通过 stdin 作为 JSON 接收输入,并应通过 stdout 作为 JSON 返回输出。字段名称使用驼峰命名法。
通用输入字段所有挂钩在 stdin 上的输入负载中接收以下系统元数据字段:
| 领域 | 类型 | 描述 |
|---|---|---|
conversationId |
字符串 | 活动代理对话的唯一 UUID。 |
workspacePaths |
字符串数组 | 代表用户安装的工作空间的绝对目录路径。 |
transcriptPath |
字符串 | 持久 transcript.jsonl 对话日志的绝对路径。 |
artifactDirectoryPath |
字符串 | 包含所有对话工件和屏幕截图的目录的绝对路径。 |
预工具使用在执行工具之前触发。
模式
输入字段(标准输入):
| 领域 | 类型 | 描述 |
|---|---|---|
toolCall |
对象 | 建议的工具调用的详细信息。 |
toolCall.name |
字符串 | 正在执行的工具的名称(例如 run_command )。 |
toolCall.args |
对象 | 传递给工具的参数。 |
stepIdx |
整数 | 轨迹中当前步骤的从 0 开始的索引。 |
| (公共字段) | 包括 conversationId 、 workspacePaths 、 transcriptPath 、 artifactDirectoryPath 。 |
输出字段(标准输出):
| 领域 | 类型 | 描述 |
|---|---|---|
decision |
字符串 | 必需。 控制工具调用的门控方式: - "allow" :自动允许工具执行。- "deny" :立即硬块执行。- "ask" :提示用户,但遵循“始终允许”设置。- "force_ask" :始终提示用户,忽略缓存的权限。 |
reason |
字符串 | 可选。 向代理或用户显示的决策解释。 |
permissionOverrides |
字符串数组 | 可选。 用于覆盖默认工具权限的资源字符串列表(例如 ["read_file(/path)", "command(args)"] )。 |
例子
- 输入(标准输入):
{
"toolCall": {
"name": "run_command",
"args": {
"CommandLine": "npm test",
"Cwd": "/workspace/project",
"WaitMsBeforeAsync": 5000
}
},
"stepIdx": 19,
"conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
"workspacePaths": ["/workspace/project"],
"transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
"artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
- 输出(标准输出):
{
"decision": "ask",
"reason": "Requires confirmation for test execution.",
"permissionOverrides": ["command(npm test)"]
}
后期工具使用工具完成后触发。
模式
输入字段(标准输入):
| 领域 | 类型 | 描述 |
|---|---|---|
stepIdx |
整数 | 已完成步骤的从 0 开始的索引。 |
error |
字符串 | 选修的。如果工具调用失败,则详细的运行时错误消息。如果成功则为空。 |
| (公共字段) | 包括 conversationId 、 workspacePaths 、 transcriptPath 、 artifactDirectoryPath 。 |
输出字段(stdout):返回空 JSON 对象 {} 。
例子
- 输入(标准输入):
{
"stepIdx": 5,
"error": "exit status 1",
"conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
"workspacePaths": ["/workspace/project"],
"transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
"artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
- 输出(标准输出):
{}
预调用在调用模型之前触发。
模式
输入字段(标准输入):
| 领域 | 类型 | 描述 |
|---|---|---|
invocationNum |
整数 | 当前模型调用的序列号。 |
initialNumSteps |
整数 | 轨迹中当前的步数。 |
| (公共字段) | 包括 conversationId 、 workspacePaths 、 transcriptPath 、 artifactDirectoryPath 。 |
输出字段(标准输出):
| 领域 | 类型 | 描述 |
|---|---|---|
injectSteps |
对象数组 | 可选。 在调用模型之前注入对话轨迹的步骤列表。 |
注入的步骤架构: injectSteps 数组中的每个对象都可以具有以下字段之一:
toolCall(对象):要执行的工具调用。userMessage(字符串):来自用户的消息。ephemeralMessage(字符串):瞬态系统消息。
例子
- 输入(标准输入):
{
"invocationNum": 3,
"initialNumSteps": 10,
"conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
"workspacePaths": ["/workspace/project"],
"transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
"artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
- 输出(标准输出):
{
"injectSteps": [{"ephemeralMessage": "Remember to lint"}]
}
调用后工具调用完成后触发。
模式
输入字段 (stdin):与 PreInvocation 输入字段相同。
输出字段(标准输出):
| 领域 | 类型 | 描述 |
|---|---|---|
injectSteps |
对象数组 | 可选。 调用完成后要注入的步骤列表(与 PreInvocation 注入步骤相同的架构)。 |
terminationBehavior |
字符串 | 可选。 控制注入后的执行流程: - "force_continue" :强制循环继续。- "terminate" :强制循环终止。- "" (或省略):默认行为。 |
例子
- 输入(标准输入):与
PreInvocation相同 - 输出(标准输出):
{
"injectSteps": [],
"terminationBehavior": ""
}
停止当执行循环终止时触发。
模式
输入字段(标准输入):
| 领域 | 类型 | 描述 |
|---|---|---|
executionNum |
整数 | 执行尝试的序列号。 |
terminationReason |
字符串 | 执行停止的原因(例如 "model_stop" 、 "max_steps_exceeded" 、 "error" )。 |
error |
字符串 | 选修的。如果终止是由系统错误引起的,则显示错误消息。 |
fullyIdle |
布尔 | 必需。 true 如果代理完全完成并且所有后台命令或异步任务均已完成。 false 如果活动后台任务仍在运行。 |
| (公共字段) | 包括 conversationId 、 workspacePaths 、 transcriptPath 、 artifactDirectoryPath 。 |
输出字段(标准输出):
| 领域 | 类型 | 描述 |
|---|---|---|
decision |
字符串 | 必需。 设置为 "continue" 以防止代理停止并重新进入执行循环。任何其他值都允许停止。 |
reason |
字符串 | 可选。 如果 decision 是 "continue" ,则此消息将作为系统消息注入到对话中。 |
例子
- 输入(标准输入):
{
"executionNum": 1,
"terminationReason": "model_stop",
"error": "",
"fullyIdle": true,
"conversationId": "ec33ebf9-0cba-4100-8142-c61503f6c587",
"workspacePaths": ["/workspace/project"],
"transcriptPath": "/workspace/project/.gemini/jetski/transcript.jsonl",
"artifactDirectoryPath": "/workspace/project/.gemini/jetski/artifacts"
}
- 输出(标准输出):
{
"decision": "continue",
"reason": "Not done yet"
}