hook-creator
Create and configure Claude Code hooks for customizing agent behavior. Use when the user wants to (1) create a new hook, (2) configure automatic formatting, logging, or notifications, (3) add file protection or custom permissions, (4) set up pre/post tool execution actions, or (5) asks about hook events like PreToolUse, PostToolUse, Notification, etc.
$ Installer
git clone https://github.com/greatSumini/cc-system /tmp/cc-system && cp -r /tmp/cc-system/.claude/skills/hook-creator ~/.claude/skills/cc-system// tip: Run this command in your terminal to install the skill
SKILL.md
name: hook-creator description: Create and configure Claude Code hooks for customizing agent behavior. Use when the user wants to (1) create a new hook, (2) configure automatic formatting, logging, or notifications, (3) add file protection or custom permissions, (4) set up pre/post tool execution actions, or (5) asks about hook events like PreToolUse, PostToolUse, Notification, etc.
Hook Creator
Create Claude Code hooks that execute shell commands at specific lifecycle events.
Hook Creation Workflow
- Identify the use case - Determine what the hook should accomplish
- Select the appropriate event - Choose from available hook events (see references/hook-events.md)
- Design the hook command - Write shell command that processes JSON input from stdin
- Configure the matcher - Set tool/event filter (use
*for all, or specific tool names likeBash,Edit|Write) - Choose storage location - User settings (
~/.claude/settings.json) or project (.claude/settings.json) - Test the hook - Verify behavior with a simple test case
Hook Configuration Structure
{
"hooks": {
"<EventName>": [
{
"matcher": "<ToolPattern>",
"hooks": [
{
"type": "command",
"command": "<shell-command>"
}
]
}
]
}
}
Common Patterns
Reading Input Data
Hooks receive JSON via stdin. Use jq to extract fields:
# Extract tool input field
jq -r '.tool_input.file_path'
# Extract with fallback
jq -r '.tool_input.description // "No description"'
# Conditional processing
jq -r 'if .tool_input.file_path then .tool_input.file_path else empty end'
Exit Codes for PreToolUse
0- Allow the tool to proceed2- Block the tool and provide feedback to Claude
Matcher Patterns
*- Match all toolsBash- Match only Bash toolEdit|Write- Match Edit or Write toolsRead- Match Read tool
Quick Examples
Log all bash commands:
jq -r '"\(.tool_input.command)"' >> ~/.claude/bash-log.txt
Auto-format TypeScript after edit:
jq -r '.tool_input.file_path' | { read f; [[ "$f" == *.ts ]] && npx prettier --write "$f"; }
Block edits to .env files:
python3 -c "import json,sys; p=json.load(sys.stdin).get('tool_input',{}).get('file_path',''); sys.exit(2 if '.env' in p else 0)"
Resources
- Hook Events Reference: See
references/hook-events.mdfor detailed event documentation with input/output schemas - Example Configurations: See
references/examples.mdfor complete, tested hook configurations
Repository

greatSumini
Author
greatSumini/cc-system/.claude/skills/hook-creator
44
Stars
17
Forks
Updated6d ago
Added1w ago