Kaan DoğanYapay Zekâ Sistemleri

KütüphaneOtomasyon

Claude Code 7 Hook Paketi: Kopyala-Yapıştır JSON'lar

Süre
7 dk okuma
Biçim
Kopyala-yapıştır
Dayanak
Resmi kaynak

Claude Code'un settings.json'ına yapıştırılan 7 hook ile .env koruması, otomatik formatlama, audit log, tehlikeli komut engelleme ve test kapısı — hepsi resmi dokudan alınmış, kopyala-çalıştır.

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. hooks anahtarı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 /hooks menü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):

HOOK · bildirim (Windows)
{
  "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:

HOOK · bildirim (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

SH · 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
terminal · izin ver
$ chmod +x .claude/hooks/protect-files.sh
# Script'e çalıştırma izni ver (Linux/macOS)

Adım 2 — Hook kaydı:

HOOK · .env koruması (settings.json)
{
  "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.

HOOK · otomatik Prettier
{
  "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:

HOOK · bash audit log (temel)
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.command' >> ~/.claude/command-log.txt"
          }
        ]
      }
    ]
  }
}

Zaman damgalı versiyon:

HOOK · bash audit log (zaman damgalı)
{
  "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

SH · 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 0

Engellemek 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):

HOOK · tehlikeli komut engelleme
{
  "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):

HOOK · oturum başı git brifingi
{
  "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):

HOOK · compaction sonrası 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ü):

HOOK · Stop prompt versiyonu
{
  "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):

HOOK · Stop agent versiyonu (test)
{
  "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):

SH · stop hook guard (sonsuz döngü önle)
#!/bin/bash
INPUT=$(cat)
if [ "$(echo "$INPUT" | jq -r '.stop_hook_active')" = "true" ]; then
  exit 0  # Claude'un durmasina izin ver
fi
# ... hook mantigi buraya

Stop 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

KategoriOlayEngelleyebilir?
OturumSessionStart, Setup, SessionEndHayır
TurUserPromptSubmit, UserPromptExpansion, Stop, StopFailureStop: Evet
AraçPreToolUse, PostToolUse, PermissionRequest, PostToolBatch...PreToolUse: Evet
Dosya/OrtamFileChanged, CwdChanged, ConfigChange, WorktreeCreate...Bazıları
İçerik/KompaktPreCompact, PostCompact, MessageDisplay, InstructionsLoadedPreCompact: Evet
Bildirim/MCPNotification, Elicitation, ElicitationResultElicitation: Evet
Subagent/GörevSubagentStart, SubagentStop, TaskCreated, TaskCompletedTaskCreated: 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: /hooks menü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_active guard'ı 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.sh ile ç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

Kütüphaneden daha fazlası

Tüm kaynaklar →