Marketplace claude-code-hooks

Claude Code hook system for pre/post tool execution. Triggers on: hooks, PreToolUse, PostToolUse, hook script, tool validation, audit logging.

install
source · Clone the upstream repo
git clone https://github.com/aiskillstore/marketplace
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/aiskillstore/marketplace "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/0xdarkmatter/claude-code-hooks" ~/.claude/skills/aiskillstore-marketplace-claude-code-hooks && rm -rf "$T"
manifest: skills/0xdarkmatter/claude-code-hooks/SKILL.md
source content

Claude Code Hooks

Execute custom scripts before/after Claude Code tool invocations.

Quick Reference

EventWhenHas Matcher
PreToolUse
Before tool executionYes
PostToolUse
After tool completesYes
PermissionRequest
Permission dialog shownYes
Notification
Notifications sentYes
UserPromptSubmit
User submits promptNo
Stop
Agent finishesNo
SubagentStop
Subagent finishesNo
PreCompact
Before context compactionNo
SessionStart
Session begins/resumesNo
SessionEnd
Session endsNo

Basic Configuration

Add to

~/.claude/settings.json
or
.claude/settings.local.json
:

{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "$CLAUDE_PROJECT_DIR/hooks/validate.sh",
        "timeout": 5000
      }]
    }]
  }
}

Matcher Patterns

PatternMatches
"Write"
Only Write tool
"*"
or
""
All tools
"mcp__*"
All MCP tools
"Bash"
Bash commands

Hook Script Requirements

#!/bin/bash
# Receives JSON via stdin: { "tool_name": "...", "tool_input": {...} }
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')

# Exit codes:
# 0 = Success (continue)
# 2 = Block with error (stderr shown to Claude)
# Other = Non-blocking error

Common Use Cases

Use CaseEventExample
Validate inputsPreToolUseBlock dangerous commands
Audit loggingPostToolUseLog all tool usage
Custom approvalPermissionRequestSlack notification
Session initSessionStartLoad project context

Security Checklist

  • Quote all variables:
    "$VAR"
    not
    $VAR
  • Validate paths (no
    ..
    traversal)
  • Use
    $CLAUDE_PROJECT_DIR
    for paths
  • Set reasonable timeouts
  • Handle jq parsing errors

Troubleshooting

# Debug hook loading
claude --debug

# List registered hooks
/hooks

# Test script manually
echo '{"tool_name":"Bash"}' | ./hooks/validate.sh

Official Documentation

Additional Resources

  • ./references/hook-events.md
    - All events with input/output schemas
  • ./references/configuration.md
    - Advanced config patterns
  • ./references/security-patterns.md
    - Production security

See Also:

claude-code-debug
for troubleshooting,
claude-code-headless
for CLI automation