.claude/settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/db-guard.sh",
"statusMessage": "Veritabanı komutu denetleniyor..."
}
]
}
]
}
}
.claude/hooks/db-guard.sh (chmod +x)
#!/bin/bash
CMD=$(jq -r '.tool_input.command // ""')
Canlı bağlantı dizesi geçiyor mu?
if echo "$CMD" | grep -qiE '(prod|production|live)[-_.]?(db|database)|@db.[a-z0-9]+.supabase.co|amazonaws.com:5432'; then
Yıkıcı ifade var mı?
if echo "$CMD" | grep -qiE '\b(drop|truncate|delete from|alter table .* drop)\b'; then
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: "Canlı veritabanında yıkıcı ifade engellendi. Önce staging kopyasında dene."
}
}'
exit 0
fi
Yıkıcı değil ama yine de canlıya dokunuyor: onay iste
jq -n '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "ask",
permissionDecisionReason: "Bu komut canlı veritabanına bağlanıyor."
}
}'
exit 0
fi
exit 0 # karar yok, normal izin akışı işler
Not
Hook kararı izin kurallarını baypas etmez: eşleşen bir deny kuralı,
hook "allow" dese bile komutu durdurur.