Büyük monorepolarda Claude Code bağlamdan sapabilir. Yanıtları kesin tutmak için sınırlar, yerel özetler ve tekrar edilebilir iş akışlarını öğrenin.

Monorepolarda Claude Code tahmin edilemez hissi verebilir; bunun basit bir nedeni var: depo, modelin aynı anda tutabileceğinden daha büyüktür.
“Bağlam”, Claude'a bu görev için gösterilen dosyalar, kod parçacıkları, notlar ve talimatların tümü ile bunlardan çıkarılabilecek çıkarımlardır. Önemli ayrıntılar eksik olduğunda Claude boşlukları tahminlerle doldurur. Büyük bir repoda bu daha sık olur.
Tekrar eden üç hata modu şunlardır:
İlk olarak, kaçırılan dosyalar. Bir klasörde güvenli görünen bir değişiklik aslında paylaşılan bir tipe, bir yapılandırma kuralına veya başka bir yerde tanımlı bir build adımına bağımlı olabilir. O bağımlılık bağlamda yoksa Claude yanlış şeyi kendinden emin şekilde düzenleyebilir ya da gerçek kaynağı göremediği için erken durabilir.
İkincisi, yanlış benzerlik. Monorepolar genellikle birbirine benzeyen birden çok paket içerir: iki auth modülü, üç API client veya benzer klasör yapısına sahip birkaç React uygulaması. Claude desenleri karıştırabilir, yanlış pakette bir yardımcıyı güncelleyebilir veya “neredeyse doğru” modül adından import edebilir.
Üçüncü, zaman sapması. Büyük kod tabanlarında aynı işi yapan eski ve yeni yollar genellikle yan yana bulunur. Claude sadece eski dosyaları görürse (çünkü bağlamda onlar vardır), ekip ilerlemiş olsa bile eski desenleri (tükenmiş config seçenekleri, eskimiş API'ler) kopyalayabilir.
Gerçek bir örnek: faturalama UI'sında küçük bir değişiklik istersiniz ve Claude, değiştirilmesi gereken uygulamaya özgü sarmalayıcıyı hiç görmediği için diğer uygulamalar tarafından kullanılan ortak bir payments bileşenini düzenler.
Amaç Claude'a tüm monoreponuzu göstermek değil. Amaç, yine de soruyu cevaplamaya yetecek daha küçük, kasıtlı girdiler sağlamaktır: değiştirdiğiniz paket, doğrudan bağımlılıkları ve tipler ile config için bir veya iki “gerçek kaynak”. Ayrıca “dokunulmaz” alanları (diğer uygulamalar, infra, üretilmiş kod) belirtin ve davranışın hangi paketin sorumluluğunda olduğunu onaylayın.
Doğruluk, yapıştırdığınız kod miktarından çok işi ne kadar net tanımladığınıza bağlıdır.
İstediğiniz sonucu net bir şekilde belirleyerek başlayın: belirli bir düzeltme, refactor veya cevap. “Koda dair bir soru” üst düzey kalabilir. “Bir değişiklik yap” isteği sınırlar, girdiler ve başarı kontrolleri gerektirir.
Herhangi bir şeyi paylaşmadan önce şu cümleyi tamamlayan bir cümle yazın: “İşiniz bittiğinde, şunu yapabiliyor olmalıyım…”. Örnekler: “paket X için birim testlerini başarısızlık olmadan çalıştırabilmek” veya “Y endpoint'i için API yanıtında yeni alanı görebilmek.” Bu cümle, depo çok büyük olduğunda kuzey yıldızınız olur.
Değişiklikler için, değişikliğin doğru olduğunu kanıtlayacak en küçük eser setini paylaşın: giriş noktası(ları), ilgili tipler/arayüzler veya şema, bir başarısız test ya da repro adımı ve yolu etkileyen herhangi bir config (routing, feature flag, build veya lint kuralları). Eğer yardımcı olursa, paket klasörünün kısa bir haritasını ekleyin ki Claude hangi dizinin ne işe yaradığını anlasın.
Neceğe bakmaması gerektiğini açıkça söyleyin. "Üretilmiş dosyaları, vendor klasörlerini, build çıktıları, snapshot'ları ve lockfile'ları istemediğim sürece yoksay." Bu, zaman kaybını ve incelemeyeceğiniz yerlerde yapılan değişiklikleri önler.
Ayrıca belirsizlik için beklentileri ayarlayın. Claude'dan tahmin yapmak yerine varsayımları ve bilinmeyenleri işaretlemesini isteyin. Örneğin: “Bu fonksiyonun nerede çağrıldığını göremiyorsan, bunu belirt ve 2 yol öner.”
Büyük bir monorepoda doğruluk, model görev dışı yakın kodu “yardımcı olarak” çekmeye başladığında düşer. Çözüm basit: değişiklik istemeden önce neyin kapsamda olup neyin olmadığını tanımlayın.
Repo organizasyonunuzla eşleşen bir sınırla başlayın: bir paket, servis, uygulama veya paylaşılan bir kütüphane. Örneğin “checkout UI'sını güncelle” isteği için sınır muhtemelen tek bir uygulama paketi olur; “checkout” kelimesinin geçtiği her yeri değil.
Claude'ın yerinde kalmasına yardımcı olacak sinyaller arasında klasör konvansiyonları (apps/, services/, packages/, libs/), package manifestleri (exports ve dependencies), public giriş noktaları (index dosyaları, export edilen bileşenler, handler'lar) ve testler (genelde hedef yüzeyi gösterir) bulunur. Klasör içindeki bir README hızlı bir sınır işaretçisi olabilir.
Sınırlar, köprüleri adlandırdığınızda en iyi biçimde çalışır. Claude'ın dokunabileceği belirli arayüzleri belirtin ve diğer her şeyi kapalı kabul edin. Tipik köprüler HTTP API sözleşmeleri, event konuları ve payload'lar, paylaşılan türler veya sınırlı sayıda export edilen fonksiyonlardır.
Ayrıca, değişikliğin etkilememesi gereken “dokunulmaz” alanları her seferinde adlandırın. Bunlar genelde infra ve dağıtım config'leri, güvenlik ve auth mantığı, faturalama, veri migrasyonları ve prod şemaları ile birçok takım tarafından kullanılan paylaşılan kütüphanelerdir.
Yardımcı olabilecek somut bir prompt detayı:
“Değişiklikleri sadece packages/cart/ ve testleri içinde yap. packages/types/ içindeki paylaşılan türleri okuyabilirsin ama değiştirme. Infra, auth veya billing'i düzenleme.”
Doğruluk, değiştirmek istediğiniz alanın küçük, kararlı bir haritasını sağladığınızda iyileşir. Bir “yerel özet” o haritadır: hızlıca okunacak kadar kısa, tahmin etmeyi önleyecek kadar spesifik.
Her özeti 10–20 satır civarında tutun. Bunu, sınırla sınırlı çalışan yeni bir ekip arkadaşına kodu teslim ediyormuş gibi yazın. Düz dil kullanın ve koddan gerçek isimleri kullanın: klasörler, paketler, export edilen fonksiyonlar.
Yararlı bir yerel özet beş soruyu yanıtlar:
Bir “gotchas” satırı ekleyin. Bu, pahalı hataları önler: gizli cache'ler, feature flag'ler, migration adımları ve sessizce bozulan durumlar.
Kopyalayabileceğiniz kompakt bir şablon:
Local summary: <package/service name>
Purpose: <1 sentence>
Scope: <what to touch> | Not: <what not to change>
Entry points: <files/routes/commands>
Public surface: <exports/endpoints/events>
Data sources: <tables/collections/queues/caches>
Conventions: errors=<how>, logging=<how>, tests=<where/how>
Gotchas: <flags/caching/migrations/edge cases>
Örnek: faturalama paketini düzenliyorsanız, fatura oluşturan kesin fonksiyonu, yazdığı tablo isimlerini ve retry edilebilir hatalar için kuralı not edin. Böylece Claude sınır üzerinde odaklanır, paylaşılan auth, config veya alakasız paketlere sapmaz.
En iyi özet, Claude'ın ihtiyaç duyduğunda gördüğü özetidir. Kodun yanında tutun ki gözden kaçması zor ve güncellemesi kolay olsun. Örneğin her paket, servis veya uygulama klasörü içine kısa bir SUMMARY.md (veya README bölüm) koyun, kök dizindeki devasa bir doküman yerine.
Basit, tekrarlanabilir bir yapı yardımcı olur. Kısa tutun ki insanlar onu korusun:
YYYY-MM-DD - <ne değişti bir cümleyle>Özetler öngörülebilir sebeplerle güncelliğini yitirir. Güncellemeyi bir type tanımını güncellemek gibi treat edin: işin bitişinin parçası olsun, ayrı bir görev değil.
Refactor yapı/isim değiştirirse, yeni modül ana yolsa, bir API/event/şema değişirse (testler yine geçse bile), paketler arası boundary değişirse veya bir bağımlılık kaldırılıp değiştirildiyse özeti güncelleyin.
Pratik bir alışkanlık: bir değişikliği merge ederken, ne değiştiğini belirten bir “Last updated” satırı ekleyin. Koder.ai gibi araçlar kod değişiminde sizi hızlandırabilir, ama özet gelecekteki değişikliklerin doğruluğunu koruyan şeydir.
Doğruluk genelde konuşmayı nasıl zamanladığınıza bağlıdır. Claude'a büyük bir snapshot yerine küçük parçalar halinde bağlam kazandırın.
Herhangi bir düzenleme yapmadan önce Claude'dan gördüklerini ve nelerin gerektiğini anlatmasını isteyin. İyi bir harita kısa olur: ilgili paketler, akışın giriş noktası ve testlerin/türlerin nerede olduğu.
İstem örneği:
“Bu değişikliğin bir haritasını oluştur: ilgili paketler, ana akış ve muhtemel dokunma noktaları. Henüz kod önermeyin.”
Dar bir dilim seçin: bir özellik, bir paket, bir kullanıcı akışı. Sınırı açıkça belirtin (ör. “Sadece packages/billing-api'yi değiştir. shared-ui veya infra'ya dokunmayın.”).
Kontrolü sizde tutacak bir iş akışı:
Claude bir şeyi kaçırıyorsa bunu belirtmeli. Ondan şu üç şeyi yazmasını isteyin: (1) yaptığı varsayımlar, (2) bunları geçersiz kılacak durumlar, (3) doğrulamak için gerekli sonraki dosyalar.
Örnek: Invoice yanıtına alan eklemeniz gerekiyorsa. Claude handler'ı, DTO/tür tanımını ve bir testi ister. Siz sadece bunları paylaşırsınız. Sohnet tabanlı bir araç kullanıyorsanız aynı kural geçerli: en küçük dosya setini verin, daha fazlası gerçekten gerekmedikçe genişletmeyin.
Yanlış düzenlemelere karşı en iyi savunuz, prompta yazılı küçük bir “kontrattır”: nerelere dokunabileceği, nasıl başarıyı ölçeceğiniz ve uyması gereken kurallar.
Kolayca uyulabilecek bir sınırla başlayın. Düzenlemelere izin verilen yerleri açıkça söyleyin ve “dokunma” alanlarını adlandırın.
Kontrat şablonu:
packages/payments/ altındaki dosyaları değiştirin.packages/auth/, infra/ veya paylaşılan config'leri düzenlemeyin.Sonra kabul kontrollerini tanımlayın. Bunlar yoksa Claude görünüşte doğru kod üretebilir ama repo kurallarını bozan sonuçlar oluşturabilir.
existing config deyin).Stil kısıtları da önemlidir. Hangi desenlerin kullanılacağını ve hangilerinden kaçınılacağını söyleyin. Örnek: “Bu pakette var olan error helper'ları kullan; yeni bağımlılık ekleme; fonksiyon isimlerini camelCase tut; yeni bir mimari katmanı tanıtarak değişik yapma.”
Son olarak herhangi bir düzenlemeden önce kısa bir değişiklik planı isteyin:
“Düzenlemeden önce dokunacağınız 3–5 dosyayı ve beklenen davranış değişikliğini listeleyin. Onay bekleyin.”
Örnek:
“Fatura toplamlarındaki yuvarlamayı düzelt. Sadece packages/billing/src/ ve testleri packages/billing/test/ altında değiştir. Kabul: pnpm -C packages/billing test ve typecheck. Mevcut money util'lerini kullan; API tiplerini yeniden yazma. Önce 4 adımlık bir plan sun.”
Monorepoda yanlış düzenlemelerin en hızlı yolu Claude'a bir kerede çok fazla şey vermektir. Büyük bir kod yığını yapıştırdığınızda model genellikle repo özel tasarımınız yerine genel desenlere geri döner.
Başka bir tuzak: mimariyi modelin tahmin etmesine izin vermek. Gerçek giriş noktalarını göstermezseniz ilk gözüken dosyayı seçip mantığı oraya bağlayabilir. Pratikte doğruluk, küçük bir set “gerçek kaynak” dosyasından (giriş modülleri, router'lar, servis kayıtları, paket boundary dokümanları) gelir. Bunlar bağlamda yoksa model boşlukları doldurur.
İsimler de yanıltıcı olabilir. Monorepolarda genelde ui, ui-kit, shared-ui gibi paketler veya iki yerde benzer yardımcılar bulunur. İki parçacığı karıştırırsanız Claude bir dosyayı yamalarken diğer dosya üzerinde düşünüyor olabilir. Örnek: buton stilini değiştirmek istersiniz, packages/ui/Button.tsx'i düzenler ama uygulama packages/ui-kit/Button.tsx'i import eder. Diff güzel görünür ama prodda hiçbir şey değişmez.
Config de sessiz bir sapma kaynağıdır. Davranış environment değişkenlerine, feature flag'lere, build ayarlarına veya workspace tooling'e bağlı olabilir. Bunlardan bahsetmezseniz Claude bayat görünen bir kontrolü kaldırabilir veya bir build adımını bozacak kod ekleyebilir.
Sapma belirtileri:
Paketler arası importları varsayılan değil bir karar olarak ele alın. Kapsamı bilinçli şekilde genişletmediğiniz sürece düzenlemeleri yerel tutun.
Doğru düzenlemeler almak için en hızlı yol sınırlarla başlamaktır, hacimle değil. İyi bir prompt biraz katı hissettirir: Claude'a nerelere bakacağını, neleri yoksayacağını ve “tamam”ın ne anlama geldiğini söyler.
Kod yapıştırmadan önce kısa bir önsöz yazın ve işi depo içindeki bir yere sabitleyin. Paketi, kesin klasörü ve spesifik hedefi adlandırın. Ardından bir yerel özet (amaç, ana bağımlılıklar, önemli konvansiyonlar) ve değişikliği sabitleyecek giriş dosyasını ekleyin.
Kontrol listesi:
<package>/<path> içinde çalış. Hedef: <one sentence>. Başka her şeyi yoksayın, gerekirse sorun.<5-10 satır>. Giriş dosyası: <path/to/file>.<...>. Değiştirilmemeli: <folders/files or APIs>. Davranış korunmalı: <what must stay true>.Claude kapsam dışında değişiklikler önerirse, bunu bir işaret olarak kabul edin: ya promptu sıkılaştırın ya da kasıtlı olarak sınırı genişletip bunu yeniden belirtin.
Diyelim monoreponuzda apps/web-store (bir React uygulaması) ve packages/ui-kit (paylaşılan butonlar, inputlar ve stiller) var. Küçük bir özellik istiyorsunuz: sepette “Save for later” butonu eklemek ve ui-kit'ten yeni bir SaveIcon kullanmak. Başka hiçbir şey değişmemeli.
İstemeden önce sınırlar olarak iş görecek iki yerel özet oluşturun. Kısa, spesifik ve neyin önemli olduğuna dair fikir verin.
# apps/web-store/LOCAL_SUMMARY.md
Purpose: Customer shopping UI.
Entry points: src/routes.tsx, src/pages/cart/CartPage.tsx
Cart rules: cart state lives in src/cart/useCart.ts
Do not touch: checkout flow (src/pages/checkout), payments, auth.
Tests: npm test -w apps/web-store
# packages/ui-kit/LOCAL_SUMMARY.md
Purpose: shared UI components.
Exports: src/index.ts
Icons: src/icons/*, add new icons by exporting from index.
Do not touch: theming tokens, build config.
Tests: npm test -w packages/ui-kit
Döngüyü sıkı tutun:
CartPage ve ui-kit ikonlarıyla sınırlıdır. Checkout/auth düzenlemeleri yok.”CartPage, useCart, ui-kit ikonları, ui-kit index).Değişiklikten sonra bunu belgelendirin ki gelecekte bağlam küçük kalsın:
Tek kişi için iyi çalışıp ekipte yaygınlaşmıyorsa eksik parça genelde tekrarlanabilirliktir. “İyi bağlam hijyenini” varsayılan haline getirin, kişisel bir alışkanlık değil.
Herkesin kopyalayıp doldurabileceği bir prompt iskeleti kaydedin. Kısa ama katı tutun. Hedefi (“tamam” ne demek), izin verilen scope'u, sert sınırları (ve nedenlerini), bir yerel özet ve çıktı kontratını (önce plan, sonra diff ve testler) ekleyin.
Kimsenin yapmadığı büyük aylık incelemeler atlayın. Özet güncellemelerini normal işe bağlayın: bir değişiklik davranışı, bağımlılıkları veya API'leri etkilediğinde aynı PR içinde özeti güncelleyin.
Basit kural: bir takım arkadaşı “burası nerede?” veya “buna ne bağımlı?” diye soracaksa, özet artık güncel değildir.
Eğer chat-öncelikli bir iş akışını tercih ediyorsanız, Koder.ai bu iterasyon tarzını daha güvenli hale getirmeye yardımcı olabilir. Planning mode, düzenlemeler olmadan önce kapsam üzerinde anlaşmanızı sağlar ve rollback ile snapshot'lar, bir tahminin yanlış çıktığında hızlıca geri dönmeyi kolaylaştırır.
Claude gerçek kaynak dosyasını “göremediğinde” daha az doğru olur.
Büyük bir monorepoda model genellikle bir bağımlılık dosyasını kaçırır, birbirine benzeyen iki paketi karıştırır veya bağlamda eski kalan bir desenin kopyasını kullanır.
Tüm depoyu vermeye çalışmayın. Değişikliğin doğru olduğunu kanıtlayacak en küçük setle başlayın.
İyi bir varsayılan set:
Davranışı sabitleyen dosyaları paylaşın, isimden dolayı ilişkili her şeyi değil.
Pratik bir set:
Depo organizasyonuna uygun tek bir sınır seçin: bir paket, app veya servis.
Sonra bunu açıkça yazın ve kapsam dışını belirtin. Örnek kısıtlamalar:
packages/cart/ ve testlerini değiştir.”Çünkü monorepolarda genellikle birbirine benzeyen modüller (ui, ui-kit, shared-ui) ve aynı isimli yardımcılar (ör. iki yerde date.ts) olur.
Claude doğru fikri yanlış pakete uygulayabilir veya “neredeyse doğru” bir modül adından import edebilir. Bunu önlemek için tam paket ve giriş noktalarını adlandırın.
Yerel özet, değiştirmek istediğiniz alanın kısa bir haritasıdır; genelde 10–20 satır.
İçermesi gerekenler:
Kodun yanında tutun ki görünmesi ve güncellenmesi kolay olsun.
Basit bir varsayılan:
SUMMARY.md veya README bölümüClaude'dan tahminde bulunmak yerine varsayımları ve bilinmeyenleri belirtmesini isteyin.
Kullanışlı bir kural:
Kontekstin küçük parçalar halinde “kazanılmasını” sağlayan sıkı bir döngü kullanın:
Prompta küçük bir “kontrat” yazın ve yerine getirilmesini isteyin:
Bu, incelemeyi kolaylaştırır ve yanlışlıkla paketler arası değişiklikleri azaltır.