AIDive

Belgesiz Claude Code Mod'u Yazdım, Bariyer Açık Kalıyor

AIDive tarafından · Yayın

Kodlama agent'larıYapay zekâ güvenliği

'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.

Kaynaklar

Sık sorulan sorular

Claude Code Mod nedir?
Bir Mod, davranışı bir TypeScript hooks modülünde yaşayan bir Claude Code plugin'idir. Modül, motorun olayları üzerinde fonksiyonlar kaydeder ve Bun üzerinde process içinde çalışır; her yan etki `$` nesnesi üzerinden geçer.
Claude Code hook'ları, plugin'leri, skill'leri ve Mod'ları arasındaki fark nedir?
Bir shell hook, sabit bir anda çağrılan ve bir exit code ile yanıt veren bir script'tir. Bir plugin; skill, agent, hook ve MCP server paketidir. Bir skill, modelin eşleşen bir promptta yüklediği düzyazıdır. Bir Mod ise bir fazla dosyaya sahip bir plugin'dir: motorun her olayını process içinde hook eden, tipli bir TypeScript modülü.
Bir Claude Code Mod'u sırları modelden gizleyebilir mi?
Evet. Tool sonucunu await eden, key, secret ve token pattern'lerini temizleyen ve redacted metni döndüren 42 satırlık bir Mod, hop başına 28 ms ekler ve sıfır token kullanır. Değerleri ekrandaki transcript'ten gizlemez; bunun için farklı bir Mod gerekir.
Yavaş bir Claude Code Mod'u neden fail open olur?
Hooks worker, her hook'a 10 saniyelik bir bütçe verir. Bunu aşan veya throw eden bir hook skipped olarak işaretlenir ve yerine altındaki zincir çalışır, bu yüzden korunan komut yine de çalıştırılır. Anthropic'in önerdiği çözüm, hook'un return'ü üzerinde tanımlı bir catch'tir.
Claude Code Mods'ları kurmak güvenli mi?
Henüz varsayılan olarak değil. İlk 48 saatte indekslenen 31 Mod'un 14'ü host process çalıştırabiliyor, 13'ü her tool call'ı görüyor ve tek denetim statik bir footprint. Managed settings, Anthropic'in security default'unu bir kullanıcının kurduğu her şeyin üzerine koyar.
Şimdi bir Claude Code Mod'u inşa etmeli miyim?
Zaten hook yazıyorsanız ve bir audit log, redaction veya bir diff paneli istiyorsanız birini şimdi inşa edin. Bir ekibe yayınlamadan önce bekleyin: özellik early access'tir, API bir haftada 20 olaydan 84 olaya değişti ve henüz bir docs sayfası veya changelog satırı yok.

İlgili videolar