Switch language to العربية

Hooks

Event hooks for AI automation. Execute scripts before or after Claude Code actions.

What are Hooks?

Hooks are shell scripts that execute in response to Claude Code events. Use them for validation, logging, formatting, and automation.

Location

.claude/hooks/*.sh

Project-level hook scripts

Hook Types

HookTriggerUse Case
PreToolUseBefore tool executionValidate, block dangerous ops
PostToolUseAfter tool executionLogging, cleanup
UserPromptSubmitUser sends messagePreprocessing, logging
PostCommitAfter git commitLint, test, notify

Pre-Tool Hook

Validate or block tool executions before they run.

pre-tool-use.shbash
#!/bin/bash
# .claude/hooks/pre-tool-use.sh
# Runs before any tool execution

TOOL_NAME="$1"
TOOL_ARGS="$2"

# Block dangerous operations
if [[ "$TOOL_NAME" == "Bash" && "$TOOL_ARGS" == *"rm -rf"* ]]; then
  echo "BLOCKED: Dangerous rm -rf operation"
  exit 1
fi

# Log tool usage
echo "[$(date)] Tool: $TOOL_NAME" >> ~/.claude/logs/tools.log

exit 0

Post-Commit Hook

Run automation after successful commits.

post-commit.shbash
#!/bin/bash
# .claude/hooks/post-commit.sh
# Runs after successful git commit

# Auto-format staged files
pnpm lint --fix

# Run quick tests
pnpm test --watch=false --passWithNoTests

# Notify success
echo "Post-commit checks passed"

User Prompt Hook

Process user input before Claude sees it.

user-prompt-submit.shbash
#!/bin/bash
# .claude/hooks/user-prompt-submit.sh
# Runs when user submits a prompt

PROMPT="$1"

# Add timestamp to conversation
echo "[$(date '+%Y-%m-%d %H:%M')] User prompt received"

# Check for sensitive patterns
if [[ "$PROMPT" == *"API_KEY"* || "$PROMPT" == *"SECRET"* ]]; then
  echo "WARNING: Prompt may contain sensitive data"
fi

exit 0

Configuration

Enable hooks in your settings file.

settings.jsonjson
// .claude/settings.json
{
  "hooks": {
    "preToolUse": ".claude/hooks/pre-tool-use.sh",
    "postToolUse": ".claude/hooks/post-tool-use.sh",
    "userPromptSubmit": ".claude/hooks/user-prompt-submit.sh"
  },
  "permissions": {
    "allow": ["Bash(git:*)"]
  }
}