Modül 4 · Hooks and the SDK · ⏱ 12 dakika

Faydalı hook'lar

Useful hooks!

Bu derste neler öğreneceksin

  • Tehlikeli komutları bloklayan bir PreToolUse hook'u kurmak
  • Audit log için PostToolUse hook'u yazmak
  • UserPromptSubmit ile takım kuralı enjekte etmek

Bu derste kopyala-yapıştır kıvamında üç hook. Hedef: pratik fayda + best practice.

1. rm -rf ve tehlikeli Bash komutlarını blokla

.claude/scripts/block-danger.sh:

#!/usr/bin/env bash
set -euo pipefail

INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

[[ "$TOOL" != "Bash" ]] && exit 0
[[ -z "$CMD" ]] && exit 0

# Kara liste
DANGEROUS_PATTERNS=(
  "rm -rf /"
  "rm -rf ~"
  ":(){:|:&};:"             # fork bomb
  "dd if=/dev/zero"
  "mkfs\."
  "shutdown"
  "git push --force.*(main|master)"
)

for pat in "${DANGEROUS_PATTERNS[@]}"; do
  if echo "$CMD" | grep -E "$pat" >/dev/null; then
    echo "BLOCKED: '$pat' bu projede yasak." >&2
    exit 2
  fi
done

exit 0

.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/block-danger.sh"
          }
        ]
      }
    ]
  }
}

Claude rm -rf ~/Documents denerse exit 2 → komut iptal, stderr Claude’a feedback olarak döner. Claude yaklaşımını değiştirir.

2. Audit log — kim, ne, ne zaman

.claude/scripts/audit.sh:

#!/usr/bin/env bash
set -euo pipefail

INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
SESSION=$(echo "$INPUT" | jq -r '.session_id')
TS=$(date -Iseconds)

mkdir -p "$CLAUDE_PROJECT_DIR/.claude/audit"
echo "[$TS] session=$SESSION tool=$TOOL" >> "$CLAUDE_PROJECT_DIR/.claude/audit/$(date +%Y-%m-%d).log"

exit 0

.claude/settings.json:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": ".*",
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/audit.sh"
          }
        ]
      }
    ]
  }
}

.gitignore’a .claude/audit/ ekle — log’u repo’ya commit’leme.

3. UserPromptSubmit ile takım kuralı enjekte et

Hedef: takım kuralı (örn: “tüm test mock’ları yasaktır”) her prompt’ta otomatik hatırlatılsın.

.claude/scripts/inject-rules.sh:

#!/usr/bin/env bash
set -euo pipefail

RULES=$(cat "$CLAUDE_PROJECT_DIR/.claude/team-rules.md")

cat <<EOF
{
  "additionalContext": "Takım kuralları (her promptta hatırlat):\n${RULES//$'\n'/\\n}"
}
EOF

.claude/settings.json:

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/scripts/inject-rules.sh"
          }
        ]
      }
    ]
  }
}

additionalContext field’ı Claude’un context’ine eklenir → her prompt’ta kurallar diri kalır.

Bonus: bildirim hook’u

Notification event ile Claude bir izin istediğinde sana sistem bildirimi gönderebilirsin (macOS):

"Notification": [
  {
    "hooks": [
      {
        "type": "command",
        "command": "osascript -e 'display notification \"Claude izin istiyor\" with title \"Claude Code\"'"
      }
    ]
  }
]

Toplantı ortasında izin bekleyen Claude’u kaçırmazsın.

Özet

  • block-danger.sh → tehlikeli Bash bloğu
  • audit.sh → her tool’da log
  • inject-rules.sh → takım kuralı enjeksiyonu
  • Notification → macOS bildirimi

Hepsi takımla paylaşılabilir; commit et yeter.

Sırada ne var?

Bir başka faydalı hook’u — CLAUDE.md’yi otomatik güncelleyen bir akışı — gelecek derste işliyoruz.