Use this skill when you need to configure, create, or troubleshoot Claude Code hooks. This includes setting up PreToolUse hooks, PostToolUse hooks, UserPromptSubmit hooks, debugging hook failures, or any automation within Claude Code. Examples include "I want to run tests before every file edit", "My hook isn't firing", "1 out of 2 hooks ran", or "How do I create a hook that formats JSON output with jq?"
Manages Claude Code hook configuration for automating actions before or after tool usage.
npx claudepluginhub bendrucker/claudeThis skill is limited to using the following tools:
references/debugging.mdReference for creating and configuring Claude Code hooks. When uncertain about syntax or features, use the Task tool with subagent_type='claude-code-guide' to consult official documentation.
| Type | Trigger | Use Cases |
|---|---|---|
| PreToolUse | Before tool execution | Validate inputs, block operations, modify parameters |
| PostToolUse | After tool completes | Check results, run linters, provide feedback |
| UserPromptSubmit | When user sends message | Pre-process input, add context |
| Stop | Session ends | Cleanup, save state |
| SubagentStop | Subagent completes | Process results |
| PreCompact | Before context compaction | Save important state |
| Notification | System notification | Log events |
~/.claude/settings.json - User-level (global).claude/settings.json - Project-level.claude/settings.local.json - Local (not committed)plugins/<name>/hooks/hooks.json{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "bun ./hooks/biome"
}
]
}
]
}
}
Matcher Patterns:
"Write", "Edit""Edit|Write|MultiEdit""Bash(npm:*)", "Bash(osascript:*)|Bash(open:*)""mcp__linear__create_issue""mcp__plugin_<plugin>_<namespace>__<tool>""mcp__linear__create_issue|mcp__plugin_linear_linear__create_issue"Commands receive JSON on stdin:
{
"tool_name": "Write",
"tool_input": {
"file_path": "/path/to/file.ts",
"content": "..."
},
"cwd": "/project/root",
"session_id": "...",
"transcript_path": "..."
}
Parse in shell:
input=$(cat)
file_path=$(echo "$input" | jq -r '.tool_input.file_path')
Or use @constellos/claude-code-kit/runners:
import { readStdinJson, writeStdoutJson } from "@constellos/claude-code-kit/runners";
const input = await readStdinJson<PreToolUseHookInput>();
PreToolUse - Control execution:
{"hookSpecificOutput": {"hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "Use gh cli instead"}}
{"hookSpecificOutput": {"hookEventName": "PreToolUse", "updatedInput": {"state": "Todo"}}}
PostToolUse - Provide feedback:
{"hookSpecificOutput": {"hookEventName": "PostToolUse", "additionalContext": "Lint errors found..."}}
Exit with no output to allow without modification.
Store complex hooks in .claude/hooks/ or project hooks/ directory:
.claude/
├── settings.json
└── hooks/
└── my-hook.ts
Reference with:
"command": "bun $CLAUDE_PROJECT_DIR/.claude/hooks/my-hook.ts"
See these repositories for hook implementations:
For troubleshooting hook failures, see debugging.
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.