00 · Ne işe yarar
Claude'a güvenmeyin — kural koyun
Claude Code bir araç çağırmadan önce, çalıştırdıktan sonra ya da oturum başında ne olacağını siz belirleyebilirsiniz. Bu mekanizmaya hook denir: sizin yazdığınız bir shell komutu, Claude'un yaşam döngüsündeki belirli anlarda otomatik devreye girer.
Farkı şuradan anlıyorsunuz: Claude'dan ".env dosyasına dokunma" dediğinizde bu bir istek'tir — LLM yorumlar, uygulayabilir ya da atlar. Bir hook kurduğunuzda bu bir kural'dır; LLM'in karar vermesine gerek kalmaz, sistem seviyesinde çalışır.
01 · 30 olay, az konuşulan
settings.json'da gizli kalan 30 güç noktası
Resmi Claude Code dokümantasyonu 30 hook olayı tanımlıyor: oturum başlangıcından compaction sonrasına, araç çağrısı öncesinden subagent'ın durmasına kadar. Her olay için kendi komutunuzu bağlayabilirsiniz.
hook kurulmadan
Claude'dan "formatla", "dokunma", "bitince söyle" diyorsunuz — bazen yapıyor, bazen unutuyor.
hook kurulduktan sonra
Prettier her dosya değişikliğinde çalışıyor. .env'ye erişim kapalı. İş bitince masaüstünüze bildirim geliyor.
02 · Neden az konuşuluyor
Çünkü settings.json kimsenin açmadığı bir dosya
Claude Code kullanıcılarının büyük çoğunluğu CLAUDE.md yazar, konuşur, kod ürettirir. settings.json'a bir kez dokunup kapatır. Hook'ların burada yaşadığını bilen, konfigürasyon yaptıran oldukça az.
Aşağıda 7 somut senaryonun tam JSON'larını bulacaksınız: bildirim, .env koruması, otomatik formatlama, audit log, tehlikeli komut engelleme, oturum brifingi ve test kapısı. Tamamı resmi Anthropic dokümantasyonundan (code.claude.com) alındı.
Nasıl kullanılır
4 adımda başlayın
- Kapsam seçin: Tüm projelerinizde çalışsın →
~/.claude/settings.json. Tek proje →.claude/settings.json(repo'ya commit edebilirsiniz). Gizli tutmak istiyorsanız →.claude/settings.local.json. - JSON yapıştırın: Her hook bölümünde tam yapılandırmayı bulacaksınız.
hooksanahtarını kopyalayıp settings.json'ınıza ekleyin; birden fazla hook varsa nesneleri birleştirin. - .sh script gerektirenleri kaydedin: Dosya koruması ve tehlikeli komut engellemesi için verilen script'leri
.claude/hooks/klasörüne kaydedin, çalıştırma iznini (chmod +x) verin. - Doğrulayın: Claude Code'da
/hooksmenüsünü açın; kayıtlı hook'ları ve tetiklenme koşullarını buradan görebilirsiniz.
Hook 1
Terminale bakıp durmayın — bildirim gelsin
Claude bir işi tamamlayıp sizden girdi beklediğinde masaüstü bildirimi gönderir. Uzun görevlerde sekmeyi açık tutmak zorunda kalmazsınız.
Windows (PowerShell):
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""
}
]
}
]
}
}macOS:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}Kalıcılık notu: Bu hook ucuz modellerde de değişmez — sistem bildirimi shell komutu, LLM içeriğinden bağımsız çalışır.
Hook 2
Claude gizli dosyalarına dokunamasın
.env, package-lock.json, .git/ gibi hassas dosyalara Claude'un erişimini tamamen engelleyin. Hook, araç çağrısı gerçekleşmeden önce devreye girer ve exit 2 ile reddeder; Claude neden engellendiğini görür, alternatif arar.
Adım 1 — Script dosyasını kaydedin: .claude/hooks/protect-files.sh
#!/bin/bash
# protect-files.sh
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")
for pattern in "${PROTECTED_PATTERNS[@]}"; do
if [[ "$FILE_PATH" == *"$pattern"* ]]; then
echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2
exit 2
fi
done
exit 0$ chmod +x .claude/hooks/protect-files.sh
# Script'e çalıştırma izni ver (Linux/macOS)Adım 2 — Hook kaydı:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
}
]
}
]
}
}Kalıcılık notu: Model güncellese de CLAUDE.md yenilense de bu hook settings dosyasında yaşar — her araç çağrısında koşulsuz çalışır.
Hook 3
Her dosya değişikliğinde Prettier — formatlama için ayrıca bir şey yapmayın
Claude bir dosyayı her düzenlediğinde Prettier otomatik çalışır. Formatlama için ayrıca komut vermenize gerek kalmaz.
Ön koşul: jq kurulu olmalı. macOS: brew install jq — Linux: apt-get install jq.
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}Kalıcılık notu: Prettier sürümü güncellese de hook aynı kalır; npx prettier her zaman projedeki versiyonu kullanır.
Hook 4
Claude ne yaptı, ne zaman? — Audit log
Claude'un çalıştırdığı her Bash komutunu zaman damgasıyla bir log dosyasına kaydeder. Projenizde neyin ne zaman değiştiğini sonradan takip edebilirsiniz.
Temel versiyon:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"
}
]
}
]
}
}Zaman damgalı versiyon:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.command' | xargs -I {} sh -c 'echo \"$(date) {}\" >> .claude/audit.log'; exit 0"
}
]
}
]
}
}Kalıcılık notu: Log dosyası büyüyünce logrotate veya cron ile periyodik temizleme eklenebilir — hook mantığı değişmez.
Hook 5
rm -rf diyince dur — tehlikeli komutları kapatın
Geri dönüşü olmayan komutları Claude çalıştırmadan önce kesin. Claude neden engellendiğini görür, alternatif arar.
Adım 1 — Script dosyasını kaydedin: .claude/hooks/block-rm-rf.sh
#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q "drop table"; then
echo "Blocked: dropping tables is not allowed" >&2
exit 2
fi
exit 0Engellemek istediğiniz diğer kalıpları grep -q satırına ekleyin: rm -rf, DROP DATABASE, format c: vb.
Adım 2 — Hook kaydı (log + engelleme birlikte):
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r .tool_input.command >> ~/.claude/bash.log"
},
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-rm-rf.sh"
}
]
}
]
}
}İki hook paralel çalışır: biri log yazar (exit 0), diğeri engeller (exit 2). Exit 2 araç çağrısını reddeder.
Hook 6
Her oturuma başında proje kurallarını otomatik söyleyin
Claude'un her oturumda sprint'i, branch'i ve projeye özel kuralları bilmesini istiyorsanız, oturum başında bu bilgiyi siz zaten inject edin.
Startup (git durumu):
{
"hooks": {
"SessionStart": [
{
"matcher": "startup",
"hooks": [
{
"type": "command",
"command": "bash -c 'git branch --show-current && git status --short'"
}
]
}
]
}
}Compaction sonrası bağlam yenileme (sprint/kural hatırlatma):
{
"hooks": {
"SessionStart": [
{
"matcher": "compact",
"hooks": [
{
"type": "command",
"command": "echo 'Reminder: use Bun, not npm. Run bun test before committing. Current sprint: auth refactor.'"
}
]
}
]
}
}stdout'a yazdığınız her metin Claude'un bağlamına eklenir. CLAUDE.md'nin kısaldığı compaction sonrasında özellikle işe yarar.
Kalıcılık notu: Compaction hook, bağlam sıfırlandığında devreye girer — CLAUDE.md'ye alternatif, settings.json'dan kalıcı.
Hook 7
"Bitirdim" demeden önce testler geçmeli
Claude bir görevi tamamlayıp durmak istediğinde Stop hook devreye girer. Testler başarısız olursa Claude durdurulamaz — devam etmek zorunda kalır.
Prompt versiyonu (görev tamamlama kontrolü):
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "Check if all tasks are complete. If not, respond with {\"ok\": false, \"reason\": \"what remains to be done\"}."
}
]
}
]
}
}Agent versiyonu (test suite'i fiilen koşturur):
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "agent",
"prompt": "Verify that all unit tests pass. Run the test suite and check the results. $ARGUMENTS",
"timeout": 120
}
]
}
]
}
}Sonsuz döngü önleme (stop_hook_active guard):
#!/bin/bash
INPUT=$(cat)
if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then
exit 0 # Claude'un durmasina izin ver
fi
# ... hook mantigi burayaStop hook 8 kez üst üste engellenirse Claude Code geçersiz sayar ve hook'u atlar. Guard'ı eklemek sonsuz döngüyü önler.
Kalıcılık notu: Test suite değişse de hook aynı kalır — sadece çalıştıracağı komutu güncellersiniz, yapılandırma dokunulmaz kalır.
Hızlı Referans
30 hook olayı — hangi kategori ne işe yarar
| Kategori | Olay | Engelleyebilir? |
|---|---|---|
| Oturum | SessionStart, Setup, SessionEnd | Hayır |
| Tur | UserPromptSubmit, UserPromptExpansion, Stop, StopFailure | Stop: Evet |
| Araç | PreToolUse, PostToolUse, PermissionRequest, PostToolBatch... | PreToolUse: Evet |
| Dosya/Ortam | FileChanged, CwdChanged, ConfigChange, WorktreeCreate... | Bazıları |
| İçerik/Kompakt | PreCompact, PostCompact, MessageDisplay, InstructionsLoaded | PreCompact: Evet |
| Bildirim/MCP | Notification, Elicitation, ElicitationResult | Elicitation: Evet |
| Subagent/Görev | SubagentStart, SubagentStop, TaskCreated, TaskCompleted | TaskCreated: Evet |
Tam liste ve parametreler: code.claude.com/docs/en/hooks
Sorun Giderme
Hook çalışmıyor — sık nedenler
- jq bulunamıyor:
jq -r '.tool_input.command'kullanan hook'larda jq kurulu olmalı. macOS:brew install jq· Linux:apt-get install jq· Windows: jqlang.org/download - Hook tetiklenmiyor:
/hooksmenüsünden kayıtlı hook'ları kontrol edin. JSON syntax hatası varsa araç sessizce atlar — JSON doğrulayıcı kullanın. - Stop hook sonsuz döngüsü:
stop_hook_activeguard'ı olmadan Stop hook 8 kez üst üste engellenirse Claude Code hook'u geçersiz sayar. Yukarıdaki guard script'ini ekleyin. - .sh script çalışmıyor:
chmod +x .claude/hooks/script-adi.shile çalıştırma izni verdiğinizden emin olun. Windows'ta WSL veya Git Bash gerektiren komutlar doğrudan PowerShell'de çalışmayabilir. - Exit kodları: exit 0 → devam, exit 2 → engelle (stderr Claude'a gider), diğer → hata göster ama akış devam eder.
@kaandoganai · Daha fazlası için Instagram'dan takip edin