AI 程式設計教學中文版
官方教學中文版整合與自動化

Hooks

Gemini CLI hooks 的事件、設定、JSON I/O、退出碼、安全邊界和管理命令。

📖 本篇術語速查表
英文 / 縮寫中文一句話解釋
Hooks鉤子在事件上自動執行的檢查。
觸發事件eventhook 掛在哪個生命週期點。
失敗語義exit返回決定放行 / 阻斷。

不想讀完?把下面這段提示詞丟給 AI 幫你跑完——幫你為 Gemini CLI 設計一個短小可靠的 Hook。

你是 Gemini CLI Hook 設計顧問。

【角色】
Gemini CLI Hook 設計顧問,按最小夠用、安全合規優先的原則給可落地方案,每條結論都落到能照做的步驟或示例,不停留在空泛建議。

【輸入】
- 想在什麼時機自動檢查什麼:___
- 觸發事件:___
- 不透過該警告還是阻斷:___
- 個人還是全 repo:___
- 經驗水平:___

【工作流程】
1. 確認適合用 hook
2. 選觸發事件和載入位置
3. 設計短小的檢查邏輯
4. 寫對失敗語義
5. 給測試

【輸出規範】
▌一、是否適合 hook
▌二、事件 + 載入位置
▌三、檢查邏輯
▌四、失敗語義 + 測試

【硬約束】
- hook 必須短、可除錯、失敗明確
- 敏感路徑 / 危險命令預設阻斷
- 全 repo 的 hook 謹慎
- 不要替我臆測情況或編造不存在的設定,資訊不全先問清
- 不確定的設定或介面一律以官方文件為準,禁止照搬過時寫法

Hooks 是 Gemini CLI agent loop 裡的同步攔截點。它允許你在不改 CLI 原始碼的情況下,注入上下文、校驗工具呼叫、記錄審計記錄或阻斷危險動作。

Hooks 會以目前使用者許可權執行命令。陌生專案的專案級 hooks 必須先審查,不要直接信任。

典型用途

  • 會話開始時載入專案狀態。
  • 模型請求前補充或過濾上下文。
  • 工具執行前檢查引數。
  • 工具執行後解析結果。
  • 對輸出做脫敏或審計。
  • 按策略停用部分工具。

常見事件

常見事件包括 SessionStartSessionEndBeforeAgentAfterAgentBeforeModelAfterModelBeforeToolSelectionBeforeToolAfterToolPreCompressNotification。其中 BeforeToolAfterTool 最常用於工具引數校驗、結果過濾和審計記錄。

設定位置

優先順序從高到低:

  1. 專案設定:.gemini/settings.json
  2. 使用者設定:~/.gemini/settings.json
  3. 系統設定:/etc/gemini-cli/settings.json
  4. extensions 內建 hooks

設定通常寫在 hooks.BeforeToolhooks.AfterTool 等事件下,用 matcher 匹配工具,再指定 hook 的 nametypecommandtimeout。安全檢查指令碼可以放在 $GEMINI_PROJECT_DIR/.gemini/hooks/

JSON 規則

Hook 透過 stdin 接收 JSON,透過 stdout 返回 JSON。

stdout 只能輸出最終 JSON,不能夾雜 echo、記錄或除錯文本。除錯資訊寫到 stderr

退出碼

0 表示成功且 stdout JSON 會被解析;2 表示系統級阻斷,目標動作中止;其他退出碼會作為非致命警告處理,原流程通常繼續。

管理命令

常用命令包括 /hooks panel/hooks enable-all/hooks disable-all/hooks enable <name>/hooks disable <name>

安全邊界

Hooks 會以目前使用者許可權執行任意命令。陌生專案裡的專案級 hooks 不能直接信任,尤其不要讓 hooks 讀取金鑰、上傳檔案或靜默執行部署。

Hook 型別適合做什麼不適合做什麼
BeforeTool校驗命令、路徑、MCP 引數大型網路請求
AfterTool記錄審計、解析失敗原因修改真實產物
BeforeModel注入少量上下文拼接大檔案
AfterAgent最終 QA、總結檢查高頻重活

效能和除錯

Hooks 是同步執行的,慢 hook 會拖慢 agent loop。高頻事件不要做網路請求或大檔案掃描;確實需要時,快取結果並用 matcher 縮小觸發範圍。只想做最終質量檢查時,用 AfterAgent,不要在 AfterModel 的每個輸出片段上做重活。

除錯 hook 時,先用樣例 JSON 手動執行指令碼,確認 stdout 是合法 JSON、退出碼符合預期。複雜 hook 單獨寫記錄檔案,不要把除錯文本寫到 stdout。

驗收方式

至少測試三條路徑:允許、阻斷、指令碼異常。允許路徑返回 {"decision":"allow"} 或空 JSON;阻斷路徑要給出可讀原因;指令碼異常不能靜默放過高風險工具。專案級 hook 被 git pull 改動後,也要確認 CLI 會重新提示信任。

接下來去哪

官方來源

本頁目錄