Modül 3 · Hooks and the SDK · ⏱ Text lesson

Bir başka faydalı hook

Another useful hook

Bu kursta tartıştığımız PreToolUse ve PostToolUse hook’larının ötesinde başka hook’lar da var:

  • Notification — Claude Code bir notification gönderdiğinde çalışır. Bu, Claude’un bir tool kullanmak için izin istemesi veya Claude Code’un 60 saniye idle kaldığı durumlarda olur.
  • Stop — Claude Code cevap vermeyi bitirdiğinde çalışır.
  • SubagentStop — Bir subagent (UI’da “Task” olarak görünür) bittiğinde çalışır.
  • PreCompact — Manuel veya otomatik bir compact operasyonu olmadan önce çalışır.
  • UserPromptSubmit — Kullanıcı bir prompt gönderdiğinde, Claude onu işlemeden önce çalışır.
  • SessionStart — Bir session başlatılırken veya devam ettirilirken çalışır.
  • SessionEnd — Bir session bittiğinde çalışır.

Kafa karıştırıcı kısım

  1. Komutuna gönderilecek stdin input’u, çalışan hook türüne göre değişir (PreToolUse, PostToolUse, Notification, vb.).
  2. Bunun içindeki tool_input ise çağrılan tool’a göre değişir (PreToolUse ve PostToolUse hook’larında).

Örneğin, bir hook’a giden stdin input’unun bir örneği şu şekilde — bu örnekte hook TodoWrite tool’unu izleyen bir PostToolUse. Hatırlatma: TodoWrite, Claude’un to-do item’larını takip etmek için kullandığı tool.

{
  "session_id": "9ecf22fa-edf8-4332-ae85-b6d5456eda64",
  "transcript_path": "<path_to_transcript>",
  "hook_event_name": "PostToolUse",
  "tool_name": "TodoWrite",
  "tool_input": {
    "todos": [{ "content": "write a readme", "status": "pending", "id": "1" }]
  },
  "tool_response": {
    "oldTodos": [],
    "newTodos": [{ "content": "write a readme", "status": "pending", "id": "1" }]
  }
}

Karşılaştırma olarak, bir Stop hook’una giden input örneği şu şekilde:

{
  "session_id": "af9f50b6-f042-4773-b3e2-c3a4814765ce",
  "transcript_path": "<path_to_transcript>",
  "hook_event_name": "Stop",
  "stop_hook_active": false
}

Gördüğün gibi, komutuna giden stdin input’u hook’a (PreToolUse, PostToolUse, Stop, vb.) ve kullanılan matcher’a (PreToolUse ve PostToolUse durumunda) göre anlamlı şekilde değişir. Bu, hook yazmayı zorlaştırabilir — komutuna gelen input’un tam yapısını bilemeyebilirsin!

Helper hook tekniği

Bu zorluğu aşmak için şöyle bir helper hook yapmayı dene:

"PostToolUse": [ // Veya "PreToolUse" veya "Stop", vb.
  {
    "matcher": "*",
    "hooks": [
      {
        "type": "command",
        "command": "jq . > post-log.json"
      }
    ]
  },
]

Verilen komuta dikkat et. Bu komut hook’a gelen input’u post-log.json dosyasına yazar — yani komutuna ne tür bir veri gideceğini birebir inceleyebilirsin! Bu, komutunun hangi veriyi inspect etmesi gerektiğini anlamayı çok kolaylaştırır.