Back to list
aiskillstore

creating-hooks

by aiskillstore

Security-audited skills for Claude, Codex & Claude Code. One-click install, quality verified.

102🍴 3📅 Jan 23, 2026

SKILL.md


name: creating-hooks description: | Creates Claude Code hooks for automation and workflow customization. Guides through hook events, configuration, and script creation. Use when user wants to create a hook, automate Claude Code, or asks about hook events.

Creating Hooks

Guides creation of Claude Code hooks for automation and workflow customization.

Quick Start

  1. Choose hook event (when should it trigger?)
  2. Configure in settings.json
  3. Create hook script
  4. Test the hook

Workflow: Create New Hook

Progress:
- [ ] Select hook event
- [ ] Add to settings.json
- [ ] Create hook script
- [ ] Test and validate

Step 1: Select Hook Event

EventWhen It TriggersCommon Use
PreToolUseBefore tool runsBlock/modify tools
PostToolUseAfter tool succeedsValidate, log, feedback
UserPromptSubmitUser sends messageInject context, validate
SessionStartSession beginsLoad context, init state
SessionEndSession endsCleanup, save state
StopAgent finishesDecide if should continue

Full event reference: reference.md

Step 2: Configure settings.json

Location priority (highest wins):

  1. .claude/settings.local.json (local, not committed)
  2. .claude/settings.json (project)
  3. ~/.claude/settings.json (user)

Basic structure:

{
  "hooks": {
    "EventName": [
      {
        "matcher": "ToolPattern",
        "hooks": [
          {
            "type": "command",
            "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/my-hook.sh\""
          }
        ]
      }
    ]
  }
}

Step 3: Create Hook Script

Use templates from templates/ directory.

Key requirements:

  • Read JSON from stdin
  • Use exit codes for control (0=success, 2=block)
  • Output JSON for decisions

Step 4: Test

Run hook manually with test input:

echo '{"tool_name":"Write"}' | bash .claude/hooks/my-hook.sh

Hook Configuration

Matcher Patterns

"matcher": "Write"           // Exact match
"matcher": "Edit|Write"      // Multiple tools
"matcher": "mcp__.*"         // MCP tools (regex)
"matcher": "*"               // All tools

Matchers apply to: PreToolUse, PostToolUse, PermissionRequest

Timeout

{
  "type": "command",
  "command": "...",
  "timeout": 120
}

Default: 60 seconds. Max recommended: 300 seconds.

Exit Codes

CodeMeaningBehavior
0SuccessContinue normally
2BlockStop action, show error
OtherNon-blocking errorLog only (verbose mode)

JSON Output

Return JSON to stdout for decisions:

{
  "decision": "block",
  "reason": "Why blocked",
  "additionalContext": "Info for Claude"
}

Decision values by event:

  • PreToolUse: allow, deny, ask
  • PostToolUse: block (with reason)
  • UserPromptSubmit: block (with reason)
  • Stop: block (requires reason)

Security Best Practices

  1. Quote all variables: "$VAR" not $VAR
  2. Use absolute paths: "$CLAUDE_PROJECT_DIR/..."
  3. Validate inputs: Check before processing
  4. Block path traversal: Reject paths with ..
  5. Set timeouts: Prevent runaway scripts

Environment Variables

Available in all hooks:

  • CLAUDE_PROJECT_DIR - Project root path
  • CLAUDE_CODE_REMOTE - "true" if web environment

SessionStart only:

  • CLAUDE_ENV_FILE - Path to persist env vars

Common Patterns

Inject Context on Session Start

#!/bin/bash
# Output context for Claude
echo '{"additionalContext": "Project uses TypeScript"}'
exit 0

Block Dangerous File Edits

#!/bin/bash
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
if [[ "$FILE" == *".env"* ]]; then
  echo "Blocking edit to sensitive file" >&2
  exit 2
fi
exit 0

Log All Tool Usage

#!/bin/bash
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
echo "$(date -Iseconds) $TOOL" >> "$CLAUDE_PROJECT_DIR/.claude/tool.log"
exit 0

See reference.md for complete event details and more examples.

Score

Total Score

60/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

0/10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

+5
最近の活動

1ヶ月以内に更新

+10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

Reviews

💬

Reviews coming soon