title: Mimari description: “Hook işleyicisinin, config yüklemesinin ve politika değerlendirmesinin dahili olarak nasıl çalıştığı” icon: sitemap
Bu belge failproofai’nin dahili olarak nasıl çalıştığını açıklar: hook sistemi aracı araç çağrılarını nasıl yakalar, yapılandırma nasıl yüklenir ve birleştirilir, politikalar nasıl değerlendirilir ve kontrol paneli aracı etkinliğini nasıl izler.Genel Bakış
failproofai iki bağımsız alt sisteme sahiptir:- Hook işleyicisi - Claude Code’un her aracı araç çağrısında çağırdığı hızlı bir CLI alt süreci. Politikaları değerlendirir ve bir karar döndürür.
- Aracı İzleyicisi (Kontrol Paneli) - Aracı oturumlarını izlemek ve politikaları yönetmek için Next.js web uygulaması.
~/.failproofai/ ve projenin .failproofai/ dizinindeki yapılandırma dosyalarını paylaşır, ancak ayrı süreçler olarak çalışır ve yalnızca dosya sistemi aracılığıyla iletişim kurar.
Hook işleyicisi
Claude Code ile Entegrasyon
failproofai policies --install komutunu çalıştırdığınızda, ~/.claude/settings.json dosyasına şu gibi girişler yazar:
failproofai --hook PreToolUse komutunu bir alt süreç olarak çağırır ve stdin üzerinde bir JSON yükü iletir.
Yük biçimi
PostToolUse olayları için yük, araçın çıktısını içeren tool_result da içerir.
İşleyici 1 MB stdin sınırını uygular. Bu sınırı aşan yükler atılır ve tüm politikalar örtük olarak izin verir.
Yanıt biçimi
Reddet (PreToolUse):- Çıkış kodu:
2 - Sebep stderr’e yazılmıştır (stdout değil)
- Çıkış kodu:
0 - Boş stdout
allow(message) bir politikanın, işlem izin verildiğinde bile Claude’a bilgilendirici bağlam göndermesine izin verir. Hook işleyicisi aşağıdaki JSON’u stdout’a yazar (yapılandırma dosyası değil — bu, deny ve instruct yanıtlarının üstünde olduğu gibi hook işleyici sürecinin Claude Code’a yanıtıdır):
- Çıkış kodu:
0(işleme izin verildi) - Birden fazla politika ileti içeren
allowdöndürdüğünde, iletileri yeni satırlarla birleştirerek tek biradditionalContextdizesine katılırlar - Hiçbir politika ileti sağlamazsa, stdout boştur (öncekiyle aynı)
İşlem hattı
src/hooks/handler.ts tam işlem hattını uygular:
Yapılandırma Yükleme
src/hooks/hooks-config.ts üç kapsamlı config yükleme uygular.
enabledPolicies- her üç dosya arasında tekilleştirilen birleşimpolicyParams- politika başına anahtar, ilk dosya tamamen kazanırcustomPoliciesPath- ilk dosya kazanırllm- ilk dosya kazanır
readHooksConfig() kullanır çünkü bir proje cwd ile çağrılmaz.
Politika Değerlendirmesi
src/hooks/policy-evaluator.ts politikaları sırayla çalıştırır.
Her politika için:
- Politikanın
paramsşemasını ara (varsa). - Birleştirilen yapılandırmadan
policyParams[policy.name]oku. - Kullanıcı tarafından sağlanan değerleri şema varsayılanları üzerine birleştirerek
ctx.paramsüret. policy.fn(ctx)komutunu çözümlenen bağlamla çağır.- Sonuç
denyise, hemen durdur ve bu kararı döndür. - Sonuç
instructise, mesajı biriktir ve devam et. - Sonuç
allowise, sonraki politikaya devam et.
- Herhangi bir
denydöndürülürse, reddet yanıtını yayınla. - Herhangi bir
instructdönüşü toplanırsa, tüm mesajlarla birleştirilerek tek bir instruct yanıtı yayınla. - Aksi takdirde, izin yanıtını yayınla (boş stdout, çıkış 0).
Yerleşik Politikalar
src/hooks/builtin-policies.ts tüm 39 yerleşik politikayı BuiltinPolicyDefinition nesneleri olarak tanımlar:
params kabul eden politikalar her parametre için türler ve varsayılanlar içeren PolicyParamsSchema bildirir. Politika değerlendiricisi, fn çağrılmadan önce çözümlenen değerleri ctx.params öğesine enjekte eder. Politika işlevleri, varsayılanlar her zaman ilk olarak uygulandığı için ctx.params öğesini null kontrol yapmadan okur.
Politikalar içindeki desen eşleştirmesi, ham dize eşleştirmesinden değil, ayrıştırılmış komut belirteçlerini (argv) kullanır. Bu, shell operatörü enjeksiyonu aracılığıyla bypass’ı önler (örneğin, sudo systemctl status * için bir desen, komuta ; rm -rf / eklenerek bypass edilemez).
Özel Politikalar
src/hooks/custom-hooks-registry.ts bir globalThis tabanlı kayıt defteri uygular:
src/hooks/custom-hooks-loader.ts kullanıcının politika dosyasını yükler:
- Yapılandırmadan
customPoliciesPathöğesini oku; yoksa atla. - Mutlak yola çöz; dosyanın var olduğunu kontrol et.
- Tüm
from "failproofai"içe aktarımlarını gerçek dist yoluna yeniden yaz, böylececustomPoliciesaynıglobalThiskaydına çözülür. - ESM uyumluluğunu sağlamak için geçişli yerel içe aktarımları yinelemeli olarak yeniden yaz.
- Geçici
.mjsdosyaları yaz ve giriş dosyasınıimport()et. - Kayıtlı kancaları almak için
getCustomHooks()çağır. finallybloğunda tüm geçici dosyaları temizle.
~/.failproofai/hook.log dosyasına kaydedilir ve yükleyici boş bir dizi döndürür. Yerleşik politikalar etkilenmez.
Özel politikalar tüm yerleşik politikalardan sonra değerlendirilir. Özel bir politika deny yine de başka özel politikaları kısa devre yapar (ancak bu noktada tüm yerleşikler zaten çalıştırılmıştır).
Etkinlik Günlüğü
Her hook olayından sonra, işleyici~/.failproofai/hook-activity.jsonl dosyasına bir JSONL satırı ekler:
Kontrol Paneli Mimarisi
Kontrol paneli, React Server Components ve Server Actions ile App Router kullanan bir Next.js 16 uygulamasıdır.- Sayfa bileşenleri, proje/oturum verilerini dosya sisteminden doğrudan okumak için
lib/projects.tsvelib/log-entries.tskomutlarını çağırır (okumalar için API katmanı yok). - Politikalar sayfası, tüm mutasyonlar (değiştir, parametreleri güncelle, yükle/kaldır) için Server Actions kullanır.
- Oturum görüntüleyicisi Claude’un JSONL transkript biçimini ayrıştırır ve iletilerin ve araç çağrılarının bir zaman çizelgesini oluşturur.
- Veritabanı yok - tüm kalıcı durum düz dosyalardadır (
~/.failproofai/,~/.claude/projects/). - Mutasyonlar için Server Actions - CRUD işlemleri için REST API gerekli değildir.
- Okuma sayfaları için React Server Components - daha hızlı ilk yükleme, veri getirme için istemci paketi yok.
- İstemci bileşenleri yalnızca etkileşimin gerekli olduğu yerlerde (politika açma/kapatma, etkinlik arama, günlük görüntüleyicisi).

