{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write|Bash", "hooks": [] }, { "matcher": "Read", "hooks": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.wolf/hooks/post-read.js\"", "timeout": 5 } ] }, { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.wolf/hooks/post-write.js\"", "timeout": 10 }, { "type": "command", "command": "FILE_PATH=$(python3 -c \"import json,sys; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('file_path') or d.get('tool_input',{}).get('path') or '')\" 2>/dev/null); [[ \"$FILE_PATH\" == *.py ]] && ruff format --quiet \"$FILE_PATH\" 2>/dev/null; true", "timeout": 10 }, { "type": "command", "command": "FILE_PATH=$(python3 -c \"import json,sys; d=json.load(sys.stdin); print(d.get('tool_input',{}).get('file_path') or d.get('tool_input',{}).get('path') or '')\" 2>/dev/null); [[ \"$FILE_PATH\" == *.py ]] && ruff check --quiet \"$FILE_PATH\" 2>/dev/null; true", "timeout": 10 } ] } ], "SessionStart": [ { "matcher": "", "hooks": [] }, { "matcher": "", "hooks": [] }, { "matcher": "", "hooks": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.wolf/hooks/session-start.js\"", "timeout": 5 } ] } ], "PreToolUse": [ { "matcher": "Read", "hooks": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.wolf/hooks/pre-read.js\"", "timeout": 5 } ] }, { "matcher": "Write|Edit|MultiEdit", "hooks": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.wolf/hooks/pre-write.js\"", "timeout": 5 } ] } ], "Stop": [ { "matcher": "", "hooks": [ { "type": "command", "command": "node \"$CLAUDE_PROJECT_DIR/.wolf/hooks/stop.js\"", "timeout": 10 } ] } ] }, "worktree": { "baseRef": "head" } }