什麼是 OpenClaw 掛鉤? (以及為什麼他們改變了您與 AI 代理商的合作方式)
如果您曾經看到 AI 代理程式覆蓋了它不應該觸及的文件,或者希望它在每次程式碼更改後自動運行您的測試套件 - OpenClaw 掛鉤就是答案。它們讓您能夠在關鍵時刻攔截、反應和控制代理行為。
Hooks 是 在 OpenClaw 閘道內執行的小型事件驅動腳本 在代理生命週期的特定點。將它們視為人工智慧代理的中間件 - 它們位於代理與其調用的工具之間,為您提供可編程攔截層。
有兩種不同的類型:
- Internal hooks — 執行的腳本 裡面 網關進程本身。他們可以直接存取會話狀態、工具呼叫元資料和代理的工作上下文。零網路開銷。
- Webhooks — 當生命週期事件發生時觸發到外部端點的 HTTP 回呼。網關發送POST請求;您的伺服器處理邏輯。
實際差異:內部掛鉤用於快速、同步護欄和本地自動化。 Webhooks 適用於任何需要到達機器外部的東西 - Slack 通知、CI 系統、日誌平台。
內部 Hook 與 Webhooks — 您需要哪一個?
| 因素 | 內鉤 | 網路鉤子 |
|---|---|---|
| Execution location | Inside the Gateway process | External HTTP server |
| Latency | Near-zero (synchronous) | Network round-trip |
| Session state access | Direct | Serialized payload only |
| 最適合 | File guards, auto-formatting, local scripts | Slack alerts, audit logging, external APIs |
| 設定複雜性 | Low — 只是一個目錄 + 處理程序文件 | Medium — 需要一個正在運作的 HTTP 端點 |
| Blocking agent execution | Yes (PreToolUse hooks can abort) | Typically async/non-blocking |
Decision rule: 如果你的鉤子需要 防止 一個動作或 讀取本地會話數據,使用內部掛鉤。如果需要的話 通知外部系統 且不需要阻止代理,使用 webhook。
OpenClaw Hook Discovery 的工作原理
網關使用 自動目錄掃描 發現鉤子。啟動時,它會掃描配置的鉤子目錄並加載它找到的任何有效的鉤子包。
在激活鉤子之前有兩個重要的先決條件:
- Hooks 必須是 明確啟用 — 僅一個鉤子目錄是不夠的
- 至少 必須配置一個鉤子條目 在您的網關設定中
這是一個常見的混淆點。您可以在正確的目錄中擁有一個完美編寫的掛鉤,但如果網關沒有被告知要啟動掛鉤,它會默默地忽略它們。
每個鉤子包只需要兩個檔案:
HOOK.md— 元資料文件,聲明鉤子的名稱、版本、描述、生命週期事件訂閱以及任何所需的權限handler.ts(或handler.js) — 包含事件觸發時執行的實際邏輯的實作文件
HOOK.md 檔案是網關在發現過程中首先讀取的檔案。如果格式錯誤或缺少必填字段,則掛鉤將不會加載 - 沒有錯誤,只是沉默。這是“我的鉤子不起作用”報告的最常見原因。
每個開發人員都應該了解的四個生命週期事件
| 事件 | 當它著火時 | 常用 |
|---|---|---|
| PreToolUse | 前 代理呼叫任何工具 | Block dangerous operations, validate inputs |
| PostToolUse | 後 工具呼叫完成 | Run tests, 格式代碼、日誌結果 |
| Stop | 當代理會話結束時 | Send notifications, flush logs, cleanup |
| SessionStart | 當新的代理會話開始時 | Load context, set guardrails, warm up state |
PreToolUse 是最強大的——這是唯一可以做到的事件 中止 执行之前的工具调用。如果您的掛鉤在 PreToolUse 期間傳回拒絕訊號,則代理程式永遠不會呼叫該工具。
PostToolUse 是自動化的主力。文件寫好了嗎?運行你的 linter。測試修改了?執行套件。代碼已提交?觸發建置。
步驟:從頭開始編寫您的第一個自訂 Hook
大多數文件都會向您顯示命令。這向您展示了從無到有的完整路徑。
Goal: 每次寫入檔案後自動執行 ESLint。
步驟 1 — 建立鉤子目錄
mkdir -p .OpenClaw/hooks/auto-lint
步驟 2 — 編寫 HOOK.md 元數據
# auto-lint
**Version:** 1.0.0
**Event:** PostToolUse
**Description:** Runs ESLint on any file written by the agent
**Tools:** write_file, edit_file
Tools 欄位將您的掛鉤範圍限定為特定工具呼叫。沒有它,鉤子就會啟動 每一個 PostToolUse 事件 — 通常不是您想要的。
第 3 步 — 實施 handler.ts
import { PostToolUseEvent } from "@OpenClaw/sdk";
import { execSync } from "child_process";
export default function handler(event: PostToolUseEvent) {
const filePath = event.toolResult?.path;
if (!filePath) return;
try {
execSync(`npx eslint --fix "${filePath}"`, { stdio: "inherit" });
} catch (err) {
console.error(`[auto-lint] ESLint failed on ${filePath}`);
}
}
步驟 4 — 透過 CLI 啟用
OpenClaw hooks enable auto-lint
第 5 步 — 驗證其已載入
OpenClaw hooks list
您應該會看到 auto-lint 的狀態為 enabled。啟動一個會話,寫入一個文件,然後觀察 linter 的觸發。
用於 Hook 處理程序的 JavaScript 與 TypeScript — 2026 年選擇什麼
該 SDK 附帶完整的 TypeScript 類型,從 2026 SDK 版本開始, TypeScript 是建議的預設值 用於新鉤子。
| 因素 | TypeScript | JavaScript |
|---|---|---|
| Type safety | Full — 輸入事件形狀 | None — 運行時驚喜 |
| Compilation step | Required (tsc or esbuild) | None |
| SDK compatibility | First-class support | Supported but no autocomplete |
| 最適合 | Any hook that will be maintained or shared | 快速一次性腳本 |
如果您正在編寫一個鉤子,您將致力於版本控製或與團隊共享,請使用 TypeScript。對於一次性的本地護欄,普通的 JavaScript 就可以了——只需將其命名為 handler.js 並跳過編譯步驟。
OpenClaw Hooks CLI 參考
| 命令 | 旗幟 | 它的作用 |
|---|---|---|
| 開爪鉤列表 | --json |
Lists all discovered hooks and their status |
| OpenClaw hooks 檢查 |
— | 顯示 HOOK.md + 目前配置的完整元數據 |
| OpenClaw hooks 啟用 <名稱> | — | 目前專案的 Activates a hook |
| OpenClaw hooks 停用 <名稱> | — | Deactivates without removing |
| OpenClaw hooks 安裝 |
--yes、--dry-run |
Installs a hook pack from registry |
| 開爪鉤更新 | --all、--dry-run |
Updates installed hook packs |
管理 Hook Pack — 安裝、更新和 --dry-run 工作流程
Hook 套件將多個相關的 hook 捆綁為一個可安裝單元。安裝工作流程驗證 完整性哈希 在將任何內容寫入磁碟之前。
# Preview what would be installed without committing
OpenClaw hooks install productivity-pack --dry-run
# Install non-interactively (for CI environments)
OpenClaw hooks install productivity-pack --yes
# Update all installed packs
OpenClaw hooks update --all
--dry-run 標誌未被充分利用。在任何 install 或 update 之前執行它,以準確查看哪些檔案會發生變更。在 CI 管道中,在實際安裝之前的單獨驗證步驟中將 --yes 與 --dry-run 配對。
捆綁 Hook 參考:OpenClaw 附帶什麼
| 鉤 | 預設狀態 | 它的作用 | 最佳使用時間 |
|---|---|---|---|
| 會話記憶體 | Enabled | Persists key context across sessions | Long-running projects with recurring tasks |
| additional bundled hooks vary by Gateway version | — | 運行 OpenClaw hooks list --builtin 查看你的 |
— |
執行 OpenClaw hooks inspect session-memory 以查看其完整設定選項。大多數捆綁的鉤子都附帶合理的預設值,但會公開配置欄位以進行自訂。
真實世界的 Hook 用例(帶有工作範例)
1. 文件保護護欄(PreToolUse)
防止代理商接觸您的 .env 檔案:
import { PreToolUseEvent } from "@OpenClaw/sdk";
export default function handler(event: PreToolUseEvent) {
const target = event.toolInput?.path ?? "";
if (target.includes(".env")) {
return { abort: true, reason: "Modification of .env files is blocked by policy." };
}
}
將其放入 .OpenClaw/hooks/protect-env/ 中,並與訂閱 PreToolUse 的匹配 HOOK.md 範圍為 write_file 和 edit_file。代理在其上下文中收到拒絕原因,並且不會重試。
2. Slack 會話停止通知
import { StopEvent } from "@OpenClaw/sdk";
export default async function handler(event: StopEvent) {
await fetch(process.env.SLACK_WEBHOOK_URL!, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: `OpenClaw session ended. Files modified: ${event.session.filesModified ?? 0}`
})
});
}
將此掛鉤訂閱 Stop 事件。每個會話結束都會觸發一條帶有摘要的 Slack 訊息。不需要外部伺服器-網關進程直接發出出站請求。
3. 自動格式化+PostToolUse測試
import { PostToolUseEvent } from "@OpenClaw/sdk";
import { execSync } from "child_process";
export default function handler(event: PostToolUseEvent) {
const file = event.toolResult?.path;
if (!file?.endsWith(".ts")) return;
execSync(`prettier --write "${file}"`);
execSync("npm test -- --passWithNoTests", { stdio: "inherit" });
}
在每個 TypeScript 檔案寫入、格式化、然後執行測試套件後都會觸發此事件。大型專案速度緩慢 - 使用 HOOK.md 中的 Tools 欄位嚴格限制其範圍。
Teams 的掛鉤 — 在共享專案中實作護欄
將 .OpenClaw/hooks/ 目錄提交給版本控制。每個自動克隆存儲庫的開發人員都具有相同的鉤子配置。
- 將關鍵掛鉤鎖定到專案配置中的
enabled— 防止隊友意外禁用文件防護 - 使用
HOOK.md描述來記錄意圖 — 將它們視為代碼註釋,隊友會閱讀它們 - Scope hooks to tool-level granularity - 寬鉤會減慢所有代理交互,產生摩擦,導致隊友禁用它們
- 在 monorepos 中,父目錄中的鉤子適用於所有巢狀項目,除非在子目錄層級覆蓋
CI/CD 整合 — 以非互動方式運行 OpenClaw Hooks
在 GitHub 作業或任何無頭環境中,互動式確認提示將掛起您的管道。使用 --yes 跳過它:
- name: Install hooks non-interactively
run: OpenClaw hooks install qa-pack --yes
- name: Run OpenClaw session
env:
OpenClaw_HOOKS_ENABLED: "true"
SLACK_WEBHOOK_URL: secrets.SLACK_WEBHOOK_URL
run: OpenClaw run --task "audit dependencies" --yes
將 OpenClaw_HOOKS_ENABLED=true 設定為環境變數以啟動鉤子而無需互動確認。這會覆寫 CI 模式中「至少配置一個條目」的要求。
Hook 安全性:運行的內容、可存取的內容以及如何保持安全
這是大多數文件完全跳過的部分 - 如果您要安裝社區掛鉤包,這是最重要的部分。
哪些鉤子可以使用: Hook 腳本繼承 Gateway進程的全部權限。如果網關以您的使用者帳戶運行,您的掛鉤可以讀取該帳戶可以讀取的任何檔案、發出網路請求、執行子進程以及存取包括機密在內的環境變數。
未經審核的鉤子包的風險: 惡意鉤子包可能會洩漏您的 .env、您的 SSH 金鑰或您的 API 令牌,同時看起來會執行一些良性的操作,例如「格式化程式碼」。
鉤包審核清單
在安裝任何第三方包之前請執行此操作:
- ☐閱讀完整的
HOOK.md— 聲明的權限是否符合規定的目的? - ☐讀取
handler.ts/js的每一行 — 尋找fetch()、execSync、process.env訪問 - ☐檢查 npm 出處是否包是由註冊表分發的 (
npm info <pack> --json | grep provenance) - ☐驗證發布者的身分 - 這是已知的維護者還是新帳戶?
- ☐首先執行
--dry-run並查看檔案清單 - ☐在未先完成上述步驟的情況下,切勿安裝帶有
--yes的鉤子包
OpenClaw hooks inspect 指令顯示已安裝掛鉤的完整來源路徑 - 使用它在更新後重新檢視處理程序程式碼。
OpenClaw 鉤子不觸發時的故障排除
根本沒有發現鉤子
- 驗證目錄位於掃描的掛鉤路徑內:
OpenClaw hooks list --verbose - 確認
HOOK.md存在且有效 — 缺少必填欄位會自動跳過鉤子 - 檢查是否全域啟用了鉤子並且至少配置了一個條目
胡克被發現但沒有開火
- 執行
OpenClaw hooks inspect <name>— 驗證HOOK.md中的Event欄位與您預期的生命週期事件相符 - 檢查
Tools範圍 - 如果您的範圍為write_file但代理正在呼叫create_file,則掛鉤不會觸發 - 確認掛鉤狀態顯示
enabled,而不是loaded(已載入表示已發現但未處於活動狀態)
鉤子觸發但處理程序錯誤保持沉默
- 新增明確
try/catch區塊並在處理程序中記錄console.error - 閘道日誌寫入
~/.OpenClaw/logs/— 檢查最新會話日誌中是否有[hook]前綴行 - 使用
OpenClaw hooks inspect <name> --logs來顯示最後的執行輸出
Hook 減慢了每位特務的動作
- 使用
OpenClaw hooks list --timing進行分析以查看每個鉤子的執行時間 - 將同步
execSync呼叫移至非同步,其中結果不需要阻止代理 - 將範圍掛鉤到特定工具,而不是訂閱所有
PostToolUse事件
使用 EasyClaw 進一步提升您的 AI 代理程式工作流程
OpenClaw 掛鉤讓您可以在代理程式層級進行控制。 EasyClaw 為您提供了這種控制權,以及為需要可靠性、隱私和速度且不依賴雲端的開發人員和內容團隊所建置的完整桌面本機環境。
- ✓ 完全在您自己的機器上運行鉤子、代理和自動化——沒有數據離開您的環境
- ✓ 與現有開發工具鏈的本機整合 — linter、測試運行器、格式化程式、CI 管道
- ✓ 視覺化掛鉤管理 — 啟用、停用和檢查掛鉤,無需記住 CLI 標誌
- ✓ Team 就緒:從一個儀表板共用鉤子配置、鎖定護欄和審核會話日誌
常見問題
Q:掛鉤可以完全阻止代理執行工具呼叫嗎?
答:是的 - 只有 PreToolUse 掛鉤可以中止工具呼叫。從處理程序返回 { abort: true, reason: "..." } ,網關會阻止該工具執行。代理在其上下文中接收原因字串。 PostToolUse、Stop 和 SessionStart 掛鉤無法追溯中止操作。
Q:如果我的鉤子處理程序拋出未處理的錯誤,會發生什麼事?
答:預設情況下,掛鉤處理程序中未處理的錯誤會記錄到網關會話日誌中,但不會使代理會話崩潰。特工繼續說道,就好像鉤子沒有觸發一樣。這是設計使然——鉤子永遠不應該阻止核心代理功能。請務必將處理程序邏輯包裝在 try/catch 中並明確處理錯誤,以便您可以了解故障。
Q:我可以在鉤子處理程序中使用 async/await 嗎?
答:是的,PreToolUse 和 PostToolUse 處理程序都支援非同步函數。對於 PreToolUse,網關在決定是否繼續之前等待處理程序 - 因此非同步中止邏輯可以正常運作。請注意,PreToolUse 中長時間運行的非同步操作會延遲每個工具調用,因此請保持快速。
Q:掛鉤適用於所有項目還是僅適用於它們所在的項目?
答:放置在專案的 .OpenClaw/hooks/ 目錄中的 Hooks 屬於專案範圍,並且僅針對該專案中的會話啟動。全域鉤子可以放置在 ~/.OpenClaw/hooks/ 中並應用於所有項目。在 monorepos 中,父目錄中的掛鉤適用於巢狀項目,除非在子目錄層級被覆寫。
Q:運行許多鉤子會產生性能成本嗎?
答:每個鉤子都會為其訂閱的事件增加延遲。廣泛的快速鉤子(50 毫秒以下)是難以察覺的。當鉤子在沒有工具層級作用域的情況下對每個 PostToolUse 事件運行繁重的同步操作時,就會出現問題。使用 OpenClaw hooks list --timing 進行分析,將鉤子範圍限定到 HOOK.md 中的特定工具,並在可能的情況下將非阻塞工作移至非同步。
Q:hooks 可以安全地存取環境變數中的機密嗎?
答:Hooks 繼承網關進程的完整環境,因此 process.env.MY_SECRET 在任何處理程序內工作。對於 CI 環境,透過管道的機密管理器(例如 GitHub 作業機密)注入機密,而不是對其進行硬編碼。切勿將機密提交至 HOOK.md 或處理程序文件 - 將掛鉤來源檔案視為將進行審查和版本控制的程式碼。
最後的想法 - 為您的工作流程選擇正確的 Hook 策略
| 設想 | 推薦方法 |
|---|---|
| Solo dev — 保護敏感文件 | 內部鉤子,PreToolUse,作用域為編寫工具 |
| Solo dev — 自動執行測試 | 內部鉤子,PostToolUse,作用範圍為測試相鄰檔案類型 |
| Team — 強制執行共用護欄 | 將掛鉤提交至版本控制,鎖定專案配置中啟用的關鍵掛鉤 |
| Team — 審計跟踪 | Stop 事件掛鉤發佈到共用日誌記錄端點 |
| CI pipeline — 自動化會話 | 驗證步驟中的 --yes 標誌 + OpenClaw_HOOKS_ENABLED 環境變數、--dry-run |
| External notifications | Webhook 或 Stop 事件掛鉤,帶有 fetch() 到 Slack/PagerDuty |
從解決真正難題的一個鉤子開始——文件保護或寫入後的 linter。在分層之前先讓它端到端地工作。鉤子的力量是複合的:具有三個範圍良好的鉤子的會話平穩運行比具有十個您不信任的範圍較小的鉤子的會話要可靠得多。
對大多數開發人員來說,槓桿率最高的第一個鉤子是: PreToolUse 保護您的 .env 和機密文件。編寫僅需十分鐘,運行零維護,並永久消除一整類代理錯誤。