'Eğer bunu istiyorsanız'dan Tetris'e on iki gün
Claude Code Mods, Claude Code motorunun içinde çalışan ve motorun olaylarını fonksiyon olarak yakalayan TypeScript modülleridir. Anthropic'te Claude Code'u yöneten Boris Cherny, bunları beş kelimeyle duyurdu: "Claude mods are landing now." Gönderi 2.400 beğeni topladı ve birileri terminalin içinde şimdiden Tetris yapmıştı bile. Tetris, Doom ve Claude testlerinizi çalıştırırken büyüyen bir evcil hayvan; hepsi promptun üzerinde, sıfır token karşılığında render ediliyor.
Duyuru hiçbir dokümantasyon sayfasına bağlanmıyor. Bunun yerine, bir Anthropic mühendisinin 12 gün önce açtığı ve içine bir koşul yazılmış bir GitHub issue'suna bağlanıyor. Alice Poteat, topluluktan gelecek tepkinin özelliğin yayınlanıp yayınlanmayacağını büyük olasılıkla belirleyeceğini yazmıştı. 177 yorum sonra, insanlar flag'li binary'yi zorlamış, timeout'larını ölçmüş ve üzerine oyunlar inşa etmişti.
| Ölçüt | Değer |
|---|---|
| Duyurudaki beğeni sayısı | 2.400 |
| GitHub issue'sundaki yorum sayısı | 177 |
| Bu haftaki build'deki tipli yüzey | 10.700 satır |
| Noun'lardaki olaylar (issue-thread build) | 84 (19 üzerinde) |
| 48 saat içinde GitHub'daki Mod sayısı | 31 |
Bu yazının yazıldığı sırada dokümantasyon sayfası 404 döndürüyor. Bu makale, Claude Code'u genişletmenin dört yolunu, kasıtlı olarak inşa edilip sonra bozulan faydalı bir Mod'u ve birini yayınlamadan önce hâlâ kararsız olan noktaları ele alıyor.
Bir Mod, ortada duran bir fonksiyondur
Kaynak ağacı bunu tek bir cümleyle tanımlıyor: bir Mod, davranışı bir hooks modülünde yaşayan bir Claude Code plugin'idir. Tek bir register girişi, motorun olaylarını fonksiyon olarak yakalar (hook eder). Diskte bu; bir plugin klasörü, tam olarak bir modülü adlandıran bir hooks manifest'i ve modülün kendisi demektir.
Her hook üç şeyin fonksiyonudur: her yan etkinin geçtiği kapı olan $; olay (event); ve continuation, yani sizin altınızdaki zincirin geri kalanı. Hook'lar middleware gibi iç içe geçer. İlk kaydedilen hook olayın sahibidir ve zincirde daha aşağıdaki hiçbir şey onu engelleyemez. Bu sıralama yapılandırılır, kurulmaz. Alice Poteat'in sözleriyle, sıra kurulum zamanına göre değil, yapılandırmaya göre belirlenir.
Ortam erişimi (ambient access) yoktur. Bir Mod'un yaptığı her şey $ üzerinden geçer, böylece bir admin herhangi bir olayı denetleyebilir, izin verebilir, reddedebilir veya loglayabilir. Bir yorumcu bunu şöyle özetledi: bir plugin'in ne yaptığı, tam olarak yaptığı çağrılardır. * üzerindeki tek bir hook her olayı görür, bu yüzden bir audit log tek bir fonksiyondur. Bir Mod çizim yapabilir, çünkü arayüz React'tir. Bun üzerinde process içinde çalışır, 99. yüzdelik dilimde 50 mikrosaniyede. Tek bir ortam değişkeni (environment variable) onu açar. $ üzerinde gerçekte ne olduğu hâlâ early-access ortaklarla birlikte tasarlanıyor.
Claude Code'u genişletmenin dört yolu ve hangisi ne için
Bir shell hook, motorun sabit bir anda çağırdığı bir script'tir. Standart girişte (standard input) JSON alır ve bir exit code ile yanıt verir. Yanıtın bir tavanı vardır: geriye 8.000 karakter context, bazı hook'lar için ise 2.000. Pratham'ın sözleriyle, Windows'ta genellikle garip şekillerde bozuluyorlar.
Bir plugin bir kutudur. Tek bir manifest; skill'leri, agent'ları, hook'ları ve MCP server'ları bir araya getirir. Bir marketplace'ten kurulur veya doğrudan diskteki bir klasörden yüklenir, ve herhangi bir şey çalışmadan önce tek bir komut kutuyu doğrular (validate eder).
Bir skill, modelin ihtiyaç duyduğunda okuduğu düzyazıdır. Gövdesi yalnızca eşleşen bir prompt geldiğinde yüklenir. Davranışı değiştirmenin en ucuz yolu olmaya devam ediyor.
Bir Mod, bir dosya daha fazla olan aynı kutudur: bir modülü adlandıran bir hooks manifest'i, ve bu modül TypeScript'tir, tiplidir, process içindedir, motorun her olayında çalışır. Tüm fark bu.
| Mekanizma | Ne olduğu | Nasıl çalışır | Tavan |
|---|---|---|---|
| Shell hook | Sabit bir anda çağrılan script | Subprocess, exit code | Geriye 8.000 karakter (bazı hook'lar için 2.000) |
| Plugin | Skill, agent, hook ve MCP server paketi | Kurulur veya diskten yüklenir | Çalışmadan önce doğrulanır |
| Skill | Eşleşen bir promptta yüklenen düzyazı | Modelin context'inde | En ucuz değişiklik |
| Mod | Plugin artı bir TypeScript hooks modülü | Process içinde, her olayda | Tipli, early access |
Tipler tek bir slash command'den gelir; bu komut $'ın sunduğu her şeyin tam listesini doğrudan projenize yazar. Eski shell hook'lar emekliye ayrılmadı, sarmalandı (wrap edildi). Erken bir build'de Spencer Morley, wrapper'ın yüklenmeyi başaramadığını ama yine de tanımlı kaldığını gördü. Kestirme kural: Claude'un bildiklerini değiştirmek için bir skill yazın; bir anda script çalıştırmak için bir shell hook; bir paket yayınlamak için bir plugin; motorun içine oturmak için bir Mod. Flag kapalıyken shell hook her yerde çalışmaya devam ediyor.
Anthropic'in kendi üç Mod'u, kaynak koddan okundu
Binary'nin içinde üç Mod yayınlanıyor ve kaynak kodları GitHub'da: bir security default, bir diff paneli ve telemetry.
Security default en dışta oturur. Managed settings'e sahip bir makinede veya bir Team ya da Enterprise organizasyonunda, bir kişinin kurduğu hiçbir şey onun üzerine çıkamaz. 12 olayı hook eder ve her hook üç hareketten birini yapar: user tier'ı geçerek devam etmek, user tier'dan gelen bir çağrıcıyı isme göre reddetmek veya geçmesine izin vermek. Fail closed çalışır ve doc comment bunu iki kelimeyle söyler. Thread'in önemsediği kısım tam olarak buydu: bir admin $ üzerinden bir affordance'ı kaldırır ve altında kayıtlı hiçbir şey onu çağıramaz. Bir yorumcunun sözleriyle, bu bir plugin'den bir şeyi yapmamasını istemekten kategorik olarak farklıdır.
Diff, transcript'in yanında yer alan, oturumun commit edilmemiş değişikliklerini dosya dosya gösteren ve Claude düzenleme yaptıkça yenilenen bir paneldir. Session start'ta kaydedilir ve 27 helper dosyaya yayılır; bir oyuncak değildir.
Telemetry, engine creation'ın içinden $'a bir noun ekler. Altındakini await eder ve onu kendisiyle birlikte döndürür. Yalnızca internal build'lerde çalışır.
README, birini kaynaktan çalıştırmayı ve birini kaynaktan test etmeyi söylüyor. Bugünkü build'deki help; validate, eval ve details'i listeliyor. Test hâlâ yanıt verse de listede yok. Built-in tier ayrıca sizin kopyanızı reddediyor: bu isimlerden biriyle bir plugin yayınlarsanız, binary kendi versiyonunu yükler.
Kırk iki satır: sırları modelden gizleyen bir Mod
Tipleri yazan slash command, bu build'de 11.700 satır üretiyor: 23 noun'da 84 olay. Tool call hook'u bir sonuç veya bir deny ile yanıt verir, asla metinle değil. Bu kısım core tarafından belirlenir.
Mod üç dosyadan oluşur: plugin manifest'i, tek satırlık hooks manifest'i ve modül. Modül 42 satırdır. Altındakini await eder, sonucu temizler (scrub eder) ve geri verir. Dört pattern; iki vendor key şeklini, bir GitHub token'ı ve key, secret veya token adlı bir değişkene atanan her şeyi kapsar.
Validate, çalışmadan önce kaynağı okur. Modülün hook ettiği olayı ve $ üzerinde çağırdığı tek şeyi belirtir. Tek uyarı eksik bir author'dur. Flag açıkken diskten yüklendiğinde, test dosyası tasarım gereği sahte olan iki key içerir ve model "redacted" okur. Kendi sözleriyle, değerler redacted olarak geri geldi, bu yüzden içlerinde ne olduğunu göremiyor.
| Ölçüt | Değer |
|---|---|
| Modül uzunluğu | 42 satır |
| Hop gecikmesi (worker dahil) | 28 ms |
| Oturuma eklenen token | 0 |
Motor, hop'u bir hooks modülü tarafından resolved olarak loglar. Envanter; hiçbir skill, hiçbir agent, sürekli açık hiçbir şey göstermiyor. Bir sınır kalıyor: modelden gizlemek, ekrandan gizlemek anlamına gelmiyor. Transcript, tool'un ne yazdırdığını hâlâ gösteriyor. Ship Notes'tan Max'in tek satırda belirttiği gibi, bu başka bir Mod'un işi.
Kırılma testi: yavaş bir bariyer, atlatılmış bir bariyerdir
Aynı Mod, eklenen bir satır: altındakine yapılan çağrıdan önce 15 saniyelik bir sleep. On saniye sonra motor ondan vazgeçer, hook'un bütçesini aştığını ve skipped olduğunu bildirir, ve altındaki yerine çalışır. Komut yine de çalışır ve "hi" yazdırır.
Sleep'i bir throw ile değiştirin: 574 milisaniye, aynı sonuç, skipped, ve komut çalışır.
| Durum | Süre | Sonuç |
|---|---|---|
| Sağlıklı hook | 28 ms | Resolved |
| Throw | 574 ms | Skipped, komut çalıştı |
| Hang (askıda kalma) | 10 sn'den fazla | Skipped, komut çalıştı |
İki hata da aynı kelimede son buluyor: skipped. Thread bu asimetriyi bir hafta önce ölçmüştü. Yüklemede eksik olan bir capability fail closed olur. Bütçesini aşan bir hook ise fail open olur: Spencer Morley'nin sözleriyle, gürültülü ama atlatılmış (bypassed). Sebepsiz bir block, modeli basitçe başka bir tool'a yönlendirir. Pratham, modelin farklı bir tool seçip dosyayı yine de yazdığını gördü.
Masadaki cevap bir catch. Alice Poteat, çok uzun sürerseniz veya throw ederseniz çalışacak, hook'un return'ü üzerinde bir catch öneriyor. Yeniden yazılan bir write, modele hâlâ bir not gerektiriyor: caching nedeniyle model yazmasını istediği şeyi görür, bu yüzden bir context satırı eklersiniz. Bütçe aynı zamanda izolasyondur (isolation). Hooks worker ayrı çalışır ve çöktüğünde motor onu yeniden başlatır (respawn eder) ve oturum için hook'ları kapatır. Çözüm daha uzun bir bütçe değil, tanımlı bir catch'tir.
Mod'ların kırk sekiz saati ve tek bir cümlenin satın aldığı şey
İki gün içinde: promptun üzerinde Tetris ve Claude çalışırken oynanabilen yedi oyun daha, sıfır token karşılığında. 1993 orijinali Doom kendi process'inde çalışıyor; Mod ona local HTTP üzerinden ulaşıyor ve saniyede 10 kez yeniden çiziyor. Spinner'da bir "breathing" pacer var, ve hooks worker'ın içinde sıfır API token'ıyla çalışan, 260.000 parametreli bir story model var.
Registry, validate ile 31 Mod'u taradı. 14'ü host process çalıştırabiliyor. 13'ü her tool call'ı görüyor.
Topluluk thread'indeki Demo 8, tek bir cümlenin, model onları okumadan önce sırları gizleyen bir plugin yazacağını vadediyordu. Biz de bir tane istedik.
| Ölçüt | Değer |
|---|---|
| Süre | 4 dk |
| Turn sayısı | 34 |
| Maliyet | $1.23 |
| Satır (artı bir test dosyası) | 190, bizim 42'mize karşı |
| Testler | 4'ü saniyenin üçte birinde geçti |
Gizlediği şeyi türüne göre etiketliyor, temiz validate ediyor, ve hiçbir API key veya model call gerektirmiyor. Bir yanıt bunu şöyle ifade etti: allowlist'ler ürün, Tetris ise demo.
Sonuç: birini şimdi inşa edin, birini sonra yayınlayın
Registry'nin kendi sayıları uyarının ta kendisi. 31 Mod'un 14'ü host process çalıştırabiliyor ve tek denetim (vetting) statik bir footprint. Eval help'in kendisi de bunu söylüyor: geçen bir suite bir güvenlik denetimi değildir.
| Sinyal | Değer |
|---|---|
| 8'indeki olay sayısı | 20 |
| 15'indeki olay sayısı | 84 |
| İki haftadaki CLI sürümü sayısı | 14 |
| Hacker News puanı | 2 |
| Uyumluluk sorusuna gelen yanıt sayısı | 0 |
Marat'ın belirttiği gibi, 10 saniyelik bütçe type'larda değil, runtime'da yaşıyor. Ne bir changelog satırı, ne bir docs sayfası, ne de bir launch post var. Bir rakip, Anthropic'in bunu kopyaladığını söylüyor: Ahmad Awais, Command Code'un mods'una işaret ediyor ve onların örnek mod'unu kendisi yazıyor, bunu da hesaba katın. "Early access, APIs may change" gönderisi 357 beğeni topladı.
Zaten hook yazıyorsanız ve audit, redaction veya bir panel istiyorsanız birini şimdi inşa edin. Bir ekibe yayınlayacaksanız, sözleşme (contract) yazılana kadar bekleyin. Fail open olan bütçenin, MCP call type uyuşmazlığının ve wrapper hatasının günler içinde kullanıcılar tarafından bulunmasının sebebi de bu aynı açıklık.
AIDive