Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

鉤子管道

precc-hook 二進制文件是PRECC的核心。它位於Claude Code和shell之間,在5毫秒內處理每個bash命令。

Claude Code如何調用鉤子

Claude Code支持PreToolUse鉤子——可以在執行前檢查和修改工具輸入的外部程序。當Claude即將運行bash命令時,它通過stdin將JSON發送給 precc-hook 並從stdout讀取響應。

管道階段

Claude Code
    |
    v
+---------------------------+
| 1. Parse JSON stdin       |  Read the command from Claude Code
+---------------------------+
    |
    v
+---------------------------+
| 2. Skill matching         |  Query heuristics.db for matching skills (Pillar 4)
+---------------------------+
    |
    v
+---------------------------+
| 3. Directory correction   |  Resolve correct working directory (Pillar 1)
+---------------------------+
    |
    v
+---------------------------+
| 4. GDB check              |  Detect debug opportunities (Pillar 2)
+---------------------------+
    |
    v
+---------------------------+
| 5. RTK rewriting          |  Apply command rewrites for token savings
+---------------------------+
    |
    v
+---------------------------+
| 6. Emit JSON stdout       |  Return modified command to Claude Code
+---------------------------+
    |
    v
  Shell executes corrected command

示例:JSON輸入和輸出

輸入(來自Claude Code)

{
  "tool_input": {
    "command": "cargo build"
  }
}

PRECC檢測到當前目錄沒有 Cargo.toml,但 ./myapp/Cargo.toml 存在。

輸出(到Claude Code)

{
  "hookSpecificOutput": {
    "updatedInput": {
      "command": "cd /home/user/projects/myapp && cargo build"
    }
  }
}

如果不需要修改,updatedInput.command 爲空,Claude Code使用原始命令。

階段詳情

階段1:解析JSON

從stdin讀取完整的JSON對象。提取 tool_input.command。如果解析失敗,鉤子立即退出,Claude Code使用原始命令(fail-open設計)。

階段2:技能匹配

查詢SQLite啓發式數據庫,尋找觸發模式與命令匹配的技能。技能按優先級順序檢查。內置TOML技能和挖掘的技能都會被評估。

階段3:目錄修正

對於構建命令(cargogomakenpmpython 等),檢查預期的項目文件是否存在於當前目錄中。如果不存在,掃描附近目錄尋找最近匹配並添加 cd <dir> && 前綴。

目錄掃描使用緩存的文件系統索引,TTL爲5秒,以保持高速。

階段4:GDB檢查

如果命令可能產生崩潰(例如運行調試二進制文件),PRECC可以建議或注入GDB包裝器來捕獲結構化的調試輸出,而不是原始崩潰日誌。

階段5:RTK重寫

應用RTK(重寫工具包)規則,縮短冗長命令、抑制嘈雜輸出或重構命令以提高token效率。

階段6:輸出JSON

將修改後的命令序列化回JSON並寫入stdout。如果沒有更改,輸出信號Claude Code使用原始命令。

性能

整個管道在5毫秒(p99)內完成。關鍵優化:

  • SQLite使用WAL模式實現無鎖併發讀取
  • 預編譯的正則表達式模式用於技能匹配
  • 緩存的文件系統掃描(5秒TTL)
  • 熱路徑中無網絡調用
  • Fail-open:任何錯誤都回退到原始命令

手動測試鉤子

你可以直接調用鉤子:

$ echo '{"tool_input":{"command":"cargo build"}}' | precc-hook
{"hookSpecificOutput":{"updatedInput":{"command":"cd /home/user/myapp && cargo build"}}}