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ğuaudit.sh→ her tool’da loginject-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.