CLAUDE.md — Proje Kuralları Şablonu
Yazılım
RestoPromt10 Temmuz 2026
AI destekli geliştirmede projeye bağlayıcı mühendislik kuralları tanımlayan kapsamlı CLAUDE.md şablonu: mimari, güvenlik, veritabanı, test, git ve daha fazlası.
# CLAUDE.md Bu dosya, projede çalışırken uyman gereken kuralları içerir. Kurallar bağlayıcıdır. Bir kuralı esnetmen gerekiyorsa önce gerekçeni belirt ve onay iste. Bu kurallar **teknolojiden bağımsız** prensiplerdir. Parantez içindeki araç isimleri yalnızca örnektir; projenin seçtiği dil, framework, veritabanı ve araçlara göre uygulanır. --- ## Git Kuralları - Her kod değişikliğinden sonra commit yap - *git add -A KULLANMA* — sadece değiştirdiğin dosyaları git add <dosya1> <dosya2> ile ekle - Commit öncesi git diff --stat ile hangi dosyaların değiştiğini kontrol et, görevle ilgisiz dosya varsa ekleme - Commit mesajı: ne değiştiğini kısaca açıkla (Türkçe) - Birden fazla dosya değiştiysen tek commit yeterli - Secret yada api key gibi gizli bilgiler publish edilmemeli. ## 1. Genel Prensipler - Tip güvenliğini en üst düzeyde tut; dilin sunduğu en katı modu kullan. Kaçış tipi (örn. `any`) kullanma; bilinmeyen için güvenli/daraltılabilir tip kullan. - Her dosya tek sorumluluk taşır. Dosyalar makul boyutta kalsın. - Magic string / magic number yasaktır. Sabitleri isimlendir ve merkezi tut. - Kod İngilizce yazılır (değişken, fonksiyon, yorum). Kullanıcıya dönen metinler ayrı bir katalogda. - Çalışan koda dokunurken davranışı koruduğundan emin ol; ilgili testleri çalıştır. - Açıklık (explicit) örtüklüğe (implicit) tercih edilir; "akıllı" kısa yollar yerine okunabilir kod. ## 2. Sektör Standartlarına Uyum - Bu dosyada açıkça belirtilmemiş her durumda yerleşik sektör standardını ve yaygın kabul görmüş best practice'i takip et; kendi ad-hoc çözümünü uydurma. - Dil, framework ve kütüphane idiomlarına uy. Topluluğun beklediği konvansiyon ile bizim kuralımız çelişirse, çelişkiyi belirt ve onay iste; sessizce sapma. - Tekerleği yeniden icat etme: olgun, bakımlı ve yaygın kullanılan bir çözüm işi görüyorsa onu tercih et. Yeni bağımlılık eklemeden önce gerekçeni sun. - "Herkes böyle yapıyor" tek başına gerekçe değildir; standardın bizim bağlamımıza (ölçek, güvenlik, performans) uyduğundan emin ol. Uymuyorsa nedenini açıkla. - Standartlar zamanla değişir; bir pratiğin güncel olup olmadığından emin değilsen varsayım yapma, doğrula. ## 3. Klasör ve Dosya Yapısı - Özellik (feature) bazlı organizasyonu tercih et: her özellik kendi klasöründe, ilgili tüm parçalarıyla (giriş noktası, iş mantığı, veri erişimi, tipler, testler) birlikte dursun. - Modüller arası ortak parçalar (middleware, base sınıflar, ortak hatalar) ayrı bir paylaşılan alanda toplanır. - Bir şeyin nereye gideceği tahmin edilebilir olmalı; "bunu nereye koyayım?" sorusu yaşanmamalı. - Dosya isimlendirmede tek bir şema seç ve tutarlı kal. - Relative import spagettisinden (`../../../..`) kaçın; path alias kullan. - Barrel/index dosyalarını yalnızca modül sınırında, public API'yi dışa açmak için kullan; her klasöre koyma (döngüsel bağımlılık riski). ## 4. Mimari ve Bağımlılık Yönü - Net katmanlar tanımla (örn. giriş/transport → iş mantığı → veri erişimi) ve bağımlılığın tek yöne aktığından emin ol. - Alt katman üst katmanı bilmez; veri erişimi iş mantığını, iş mantığı transport katmanını import etmez. - Ortak yardımcılar hiçbir özelliğe bağımlı olmaz (en altta durur). - Bağımlılıkları dışarıdan enjekte et (DI); sınıf içinde somut bağımlılığı doğrudan oluşturma. - Somut implementasyona değil, davranış sözleşmesine (arayüz/soyutlama) bağımlı ol (Dependency Inversion). - Mümkünse katman sınırlarını otomatik araçla (lint kuralları) zorla. ## 5. OOP ve Modelleme - State veya polimorfizm taşıyan birimleri sınıf olarak modelle; saf, durumsuz yardımcılar fonksiyon kalır. - Her şeyi sınıf yapma; gereksiz soyutlama da bir anti-pattern'dir. - Değiştirilebilir parçaları arayüz/soyutlama ile tanımla, somut implementasyonu ayır. - Karmaşık iş kuralı olan domain'lerde davranışı veriyle birlikte modele koy (anemic model'den kaçın); basit CRUD için zorlama. - Anlamlı kavramları primitive yerine değer nesnesi (value object) olarak tiple ve doğrulamayı içine al. ## 6. Dış Entegrasyon ve Genişletilebilirlik - Her dış servis/sağlayıcı entegrasyonunu, iş mantığını sağlayıcının somut API'sinden yalıtan bir **adapter** olarak yaz. Çekirdek mantık sağlayıcıya değil, bir davranış sözleşmesine (interface) bağımlı olsun. - Aynı kategoride (örn. sipariş sağlayıcısı, ödeme sağlayıcısı, kargo sağlayıcısı) birden fazla entegrasyon gelebileceğini varsay; tek sağlayıcıya özgü detayları (auth, webhook formatı, durum eşlemesi) adapter'ın içine hapset, dışarı sızdırma. - Yeni bir sağlayıcı eklemek, çekirdek iş mantığına dokunmadan yeni bir adapter yazmak kadar kolay olmalı (Open/Closed prensibi). - Sözleşmeyi minimal ve gerçek ihtiyaca dayalı tut. **Erken soyutlamadan kaçın:** tek somut örnek varken kapsamlı abstract hiyerarşi / plugin sistemi / registry kurma; soyutlamayı ikinci gerçek örnek ortaya çıkınca olgunlaştır. Yanlış soyutlama, kod tekrarından daha pahalıdır. - Davranış sözleşmesi için `interface` kullan; `abstract class`'ı yalnızca sağlayıcılar arasında gerçekten paylaşılan ortak kod (örn. retry, imza doğrulama) olduğunda tercih et. ## 7. Explicit Mapping (Katmanlar Arası Veri) - Veritabanı/iç veri modelini asla dış arayüzde (API) doğrudan dönme; her zaman açık bir dönüşümle dışa açılan tipe çevir. - İç model (kalıcılık), dış sözleşme (API I/O) ve gerekirse domain modelini ayrı tut. - Dönüşümü gevşek kopyalama (spread) ile değil, alan alan açık yaz; böylece yeni bir iç alan otomatik olarak dışarı sızmaz. - Gelen girdiyi doğrudan iç modele atama (mass assignment koruması); yalnızca izinli alanları seç (whitelist). ## 8. Tipler ve Validation - Çalışma zamanı doğrulaması ile statik tipi tek kaynaktan üret; tip ile kontrol senkron kalsın. - Her dış girdi (ve mümkünse çıktı) bir şema ile doğrulanır. - Tipleri kullanıldıkları yere yakın tut; her şeyi tek bir dev tip dosyasına yığma. - Client'tan/dışarıdan gelen veriye asla güvenme; whitelist yaklaşımı uygula. ## 9. Async ve Hata Yönetimi - Asenkron işlerde tutarlı, modern bir yaklaşım kullan; callback yuvalanmasından kaçın. - Bağımsız işleri paralel çalıştır; gereksiz yere sırayla bekleme. - Yalnızca hata nesnesi (veya türevi) fırlat; ham değer/string fırlatma. - Operasyonel hata ile programcı hatasını ayır. Özel hata tipleri tek bir yerde toplanır. - Tek bir merkezi hata yöneticisi ile yanıt üret; her giriş noktası kendi formatını uydurmasın. - Yakalanmamış hatalar / reddedilen promise'ler global olarak dinlenir. ## 10. API / Arayüz Tasarımı - Tutarlı yanıt yapısı (envelope) kullan; başarı ve hata aynı şekle uysun. - Doğru durum kodları / hata semantiği kullan. - Kaynak odaklı, tutarlı ve öngörülebilir isimlendirme. - Arayüzü sürümle; geriye dönük uyumluluğu koru, kırıcı değişiklikleri yönet. - Liste uçlarında standart sayfalama, filtreleme, sıralama. - Sözleşmeyi (API dokümantasyonu) güncel tut; değişiklikte birlikte güncellenir. ## 11. Veri Saklama (Veritabanı) ### Şema - Doğru veri tiplerini kullan (örn. para için ondalık/decimal, asla kayan nokta; tarih için zaman dilimli zaman damgası). - Bütünlük kısıtlarını (zorunluluk, benzersizlik, ilişki, kontrol) veri katmanında tanımla; yalnızca uygulamaya güvenme. - Tutarlı isimlendirme ve id stratejisi. ### Migration / Şema Değişikliği - Tüm şema değişiklikleri versiyonlu migration ile; elle veriye/şemaya dokunma. - Uygulanmış migration'ı düzenleme; yeni migration ekle. - Kırıcı değişiklikleri kesintisiz (zero-downtime) için aşamalandır: ekle → dağıt → doldur → zorunlu kıl → eskiyi kaldır. ### Performans - Sık sorgulanan ve ilişki kolonlarını indeksle; aşırı indekslemeden de kaçın. - İlişkili veriyi toplu çek; **N+1 sorgudan kaçın**. - Yalnızca gereken alanları seç. - Büyük veri setlerinde offset yerine cursor/keyset sayfalama. - Performans kritik noktalarda sorgu planını incele. - ORM kullanılıyorsa ürettiği sorguyu görmezden gelme; geliştirmede sorguları görünür kıl. ### Şişme (bloat) ve Büyüme - Sürekli büyüyen tablolara (log, audit, event, session) retention/arşivleme politikası uygula. - Çok büyük tabloları gerektiğinde bölümle (partition). - Soft delete'i dikkatli kullan; sorgu karmaşası ve şişme maliyetini göz önünde tut. ### Bağlantı ve Transaction - Bağlantıları havuzla (connection pool) yönet; her istekte yeni bağlantı açma. Yüksek eşzamanlılıkta havuz tükenmesine karşı önlem al. - Çoklu yazma işlemlerini transaction'a sar (atomiklik). - Transaction'ları kısa tut; içinde dış çağrı veya ağır hesaplama yapma. - Yarış durumuna (race condition) açık akışlarda uygun kilitleme veya optimistic locking kullan. ## 12. Yan Etki / Dış Kaynak Temizliği - Bir kayıt dış bir kaynağa referans tutuyorsa (obje deposu / S3 dosyası, cache, arama indeksi, dış servisteki obje), o kayıt **silindiğinde dış kaynağı da sil**. Yetim (orphan) veri bırakma — yetim obje hem maliyet hem güvenlik/yönetim sorunudur. - Aynı kural **güncellemede** de geçerli: bir dosya/kaynak referansı değişiyorsa, eskisini temizle. - Bu temizliği her silme çağrısına elle eklemek yerine **tek bir yere** (repository/servis metodu veya entity lifecycle hook'u) hapset; silme tek kapıdan geçsin, kim nereden silerse silsin temizlik otomatik çalışsın. - **Sıralama:** önce DB değişikliğini commit et, sonra dış kaynağı temizle. Dış silmeyi transaction içinde yapma. Dış silme başarısız olursa yetim kalmaması için retry/temizlik job'ına düşür. - **S3'e özgü:** Silme idempotenttir (olmayan objeyi silmek hata değildir). Birden çok obje için döngüde tek tek değil toplu silme (`DeleteObjects`) kullan. Bucket'ta **versioning açıksa** normal silme yalnızca delete marker koyar; veri ve maliyeti sürer — eski versiyonları da sil veya bir lifecycle politikasıyla süpür. - Bir entity'ye silme/güncelleme eklerken bağlı dış kaynağın da ele alındığını doğrulayan bir test yaz (kaydı sil → dış kaynağın gerçekten gittiğini assert et). ## 13. Güvenlik - Sırlar koda gömülmez, repoya girmez; ortam değişkeninden okunur. Örnek bir env şablonu güncel tutulur. - Bilinen güvenlik katmanlarını uygula (güvenlik header'ları, rate limiting). - Şifreleri güçlü bir algoritma ile hash'le; kimlik token'larında güçlü sırlar kullan. - Enjeksiyon saldırılarına karşı parametreli sorgu / güvenli katman kullan. - Hassas veri (şifre, token, kart) loglara asla yazılmaz. - Bağımlılıkları güncel ve bilinen açıklardan arınmış tut. ## 14. Configuration - Hardcoded değer yok; tüm ayarlar ortamdan gelir. - Ortam değişkenleri tek bir yerde okunur ve uygulama açılışında doğrulanır; geçersizse uygulama başlamaz. - Ayarlara dağınık şekilde her dosyadan erişme. ## 15. Logging ve Gözlemlenebilirlik - Gelişigüzel çıktı (örn. doğrudan konsol) yerine yapılandırılmış (structured) logger. - Log seviyeleri doğru kullanılır. - İstek/iz takibi için correlation id. - Metrikler ve gerekirse dağıtık izleme (tracing); hata izleme entegre edilir. - Hassas veri loglanmaz. ## 16. Dayanıklılık (Resilience) - Dış servis çağrılarında timeout + retry (exponential backoff). - Sağlık/hazırlık (health/readiness) ucu; kritik bağımlılıklar kontrol edilir. - Graceful shutdown: kapanış sinyalleri yakalanır, açık işler düzgün tamamlanır. - Kritik işlemlerde (ödeme, sipariş) idempotency. - Cache eklenirse net invalidation stratejisi ve TTL (cache-aside deseni). ## 17. Test - Birim ve entegrasyon testlerini ayır; iş mantığı için birim, uçtan uca için entegrasyon. - Yeni davranış için test yazılır. - Test dosyaları ilgili kodun yanında, tutarlı isimlendirmeyle. - Testler bağımsız ve tekrarlanabilir olmalı; gerçek dış servise bağlanma, mock/stub kullan. ## 18. Ortak Fonksiyonlar (utils) - Ortak yardımcı alanı yalnızca generic, domain bilgisi içermeyen, **yan etkisiz** saf fonksiyonlar içindir. - İş kuralı içeren hiçbir şeyi buraya koyma; o bir servise/domaine aittir. - Tek devasa yardımcı dosyası yerine konu bazlı küçük dosyalar. - Yardımcı fonksiyonlar veriye dokunmaz, log atmaz, dış çağrı yapmaz. ## 19. classes.md & helpers.md (ZORUNLU Kayıt) - Yeni bir **class** tanımladığında → `classes.md`'ye ekle. - Yeni bir **helper** tanımladığında → `helpers.md`'ye ekle. - Mevcut bir class/helper'ı sildiğinde veya yolunu/imzasını değiştirdiğinde **aynı commit içinde** ilgili md dosyasını güncelle. - Her kayıt için: **ad**, **dosya yolu** (relative link), **kısa kullanım amacı** (1 satır), **public API özeti** (constructor + temel metodlar / fonksiyon imzası). - Format için `classes.md` ve `helpers.md`'nin kendisindeki örneklere bak. - **Kapsam:** Yalnızca modüller arası paylaşılan / public API niteliğindeki class ve helper'ları kaydet. Modül-içi private olanları kaydetme. - **Drift kontrolü:** CI/pre-commit, yeni bir public class/fonksiyon ekleyen ama ilgili md'yi güncellemeyen commit'lerde uyarı versin. Bayat kayıt, hiç kayıt olmamasından daha zararlıdır. - Mümkün olduğunda bu kaydı bir dokümantasyon aracıyla otomatik üret; manuel kayıt yalnızca otomasyon kurulana kadarki geçici çözümdür. ## 20. Alt Dizin CLAUDE.md Standardı Bu kurallar projedeki **tüm alt dizin CLAUDE.md dosyaları** için geçerlidir. - Alt dizin CLAUDE.md'leri yalnızca o dizine **özgü** kuralları içerir; bu kök dosyadaki genel kuralları tekrar etme, onlarla çelişme. - Kısa tut (hedef: birkaç ekranı geçmesin); uzun anlatım yerine net, emir kipinde direktifler. - Şu iskeleti kullan: 1. **Kapsam** — bu kurallar hangi dizin/modül için geçerli. 2. **Bağlam** — bu modülün ne yaptığı, dikkat edilecek özel durumlar. 3. **Kurallar** — yalnızca bu modüle özgü maddeler. 4. **Yapma** (gerekiyorsa) — bu modüle özgü yasaklar. - Genel bir kuralın bu modülde istisnası varsa, istisnayı ve gerekçesini açıkça yaz. - Yeni bir alt CLAUDE.md oluştururken bu standarda uy; mevcut birini düzenlerken de standarda çek. ## 21. Tarih/Saat ve i18n - Her şey UTC saklanır; yalnızca sınırda (kullanıcıya gösterirken) lokalize edilir. - Kullanıcıya dönen metinler koda gömülü değil, mesaj kataloğunda. ## 22. Standards & Cost Review (ZORUNLU) Anlamlı bir kod düzenlemesinden (yeni uç/akış/servis veya mevcut mantığın değişmesi) sonra, commit'ten önce **`standards-reviewer` subagent'ını çalıştır** (`.claude/agents/standards-reviewer.md`). Read-only, adversarial bir pass'tir; çıktı **file:line + somut fix + maliyet büyüklük tahmini** içerir. Tek bir vendor'a göre değil, mimarinin liyakatine göre yargılar. Agent mevcut değilse veya çalıştırılamıyorsa, aynı denetimi aşağıdaki iki eksende elle yap: 1. **Sektör standardı / mimari:** API/arayüz sözleşmesi, idempotency, hata & dayanıklılık, güvenlik, eşzamanlılık (concurrency/locking), sorumluluk ayrımı (katman sınırları), geri-uyumluluk. 2. **Maliyet & performans:** gereksiz sorgu / **N+1**, eksik index / tam tarama, hot spot & kilit çekişmesi (lock contention), taranan/işlenen veri miktarı, gereksiz büyük payload, bağlantı havuzu tükenmesi, önbellek (cache) fırsatı, soğuk başlangıç maliyeti. Önceliklendirme: - 🔴 **Critical** (standart ihlali / güvenlik açığı / ciddi maliyet) → commit'ten **önce** çöz. - 🟡 **Important** → görev olarak takip et, biriktirme. ## 23. Git Kuralları - Her kod değişikliğinden sonra commit yap - **`git add -A` KULLANMA** — sadece değiştirdiğin dosyaları `git add <dosya1> <dosya2>` ile ekle - Commit öncesi `git diff --stat` ile hangi dosyaların değiştiğini kontrol et, görevle ilgisiz dosya varsa ekleme - Commit mesajı: ne değiştiğini kısaca açıkla (Türkçe) - Birden fazla dosya değiştiysen tek commit yeterli ## 24. Dependency ve CI/CD - Lock dosyası commit edilir, elle düzenlenmez. - Yeni paket eklemeden önce gerekçe; mevcut bir paket işi görüyorsa yenisini ekleme. - Pre-commit hook ile bozuk kod commit edilmez. - Merge öncesi lint + test + build geçmek zorunda. ## 25. DO NOT (yapma) - Kaçış tipi (örn. `any`) kullanma. - İç/veri modelini doğrudan dış arayüzde dönme. - Gelişigüzel konsol çıktısı bırakma; yapılandırılmış logger kullan. - Bağımlılık klasörünü veya lock dosyasını elle düzenleme. - Uygulanmış migration'ı geriye dönük değiştirme. - Sırrı koda gömme veya commit etme. - Hassas veriyi loglama. - Transaction içinde dış servis çağırma. - Döngü içinde tek tek sorgu atma (N+1). - Relative import spagettisi (`../../../..`). - Gelen girdiyi doğrudan iç modele yazma (mass assignment). - Dış kaynağa (S3 vb.) referanslı bir kaydı, dış kaynağı temizlemeden silme (yetim obje bırakma). ## UI: içerik genişliği (kalıcı kural) - Tüm sayfa ana kapsayıcıları **header ile aynı genişlikte** olmalı: `mx-auto w-full max-w-7xl px-4`. Yeni sayfalarda varsayılan budur; daha dar (`max-w-2xl/3xl/6xl`) kullanma. - **Hero** alanları **tam genişlik** (edge-to-edge); hero üzerindeki başlık/metin overlay'i içeride `mx-auto max-w-7xl px-4` ile hizalanır. - Tek istisna: `components/site/page-shell.tsx` (`PageShell`, max-w-3xl) yalnızca uzun-metin **yasal/bilgi** sayfaları (gizlilik, kvkk, sss vb.) için okunabilirlik amacıyla dardır. Blog/mağaza/panel gibi sayfalarda PageShell kullanma; header genişliğini koru.
Değişiklik öner
Bu promptu yalnızca sahibi düzenleyebilir; ama sen bir iyileştirme önerebilirsin. Sahibi kabul ederse içerik güncellenir.