鉤子管道
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:目錄修正
對於構建命令(cargo、go、make、npm、python 等),檢查預期的項目文件是否存在於當前目錄中。如果不存在,掃描附近目錄尋找最近匹配並添加 cd <dir> && 前綴。
目錄掃描使用緩存的文件系統索引,TTL爲5秒,以保持高速。
階段4:GDB檢查
如果命令可能產生崩潰(例如運行調試二進制文件),PRECC可以建議或注入GDB包裝器來捕獲結構化的調試輸出,而不是原始崩潰日誌。
階段5:RTK重寫
應用RTK(重寫工具包)規則,縮短冗長命令、抑制嘈雜輸出或重構命令以提高token效率。
選擇性啟用的後端:lowfat
輸出壓縮是可插拔的。預設情況下 PRECC 使用 RTK,並在已安裝 lean-ctx 或 nushell 時委派給它們。lowfat 是額外的選擇性啟用後端:安裝 lowfat 二進位檔,設定 PRECC_LOWFAT=1,PRECC 便會將符合條件的命令包裝為 lowfat <command>——將 lowfat 視為另一種壓縮模式,由自適應選擇器與其他模式進行衡量比較,並針對每個命令類別進行選擇。它預設為關閉;若未設定 PRECC_LOWFAT=1 則不會有任何變化。請勿同時安裝 lowfat 自己的 Claude Code 掛勾——兩者都會改寫命令。precc doctor 在偵測到該衝突時會發出警告。
# Install lowfat (separately), then opt in:
export PRECC_LOWFAT=1
階段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"}}}