CLAUDE.md Hiyerarşisi ve Path-Specific Rules
User/project/directory seviyelerinde CLAUDE.md, @path syntax ile modüler import, .claude/rules/ dizini ve YAML frontmatter paths glob ile conditional loading.
Öğreneceklerin
- 3 CLAUDE.md seviyesini (user/project/directory) ve hangi sırayla yüklendiğini bilmek
- @path import syntax'ını ve max nesting (5) sınırını uygulamak
- .claude/rules/ + YAML paths glob ile conditional loading mantığını kavramak
- Yeni ekip üyesinin user-level vs project-level'a ne koyması gerektiğini kararlaştırmak
- Token/context tasarrufu için path-specific rules stratejisi tasarlamak
CLAUDE.md Hiyerarşisi ve Path-Specific Rules
Bu derste Claude Code’un “context layering” mekanizmasının en alt katmanını — kalıcı kural dosyaları sistemini — sınav perspektifinden açıyoruz. CLAUDE.md tek dosya değil, üç seviyeli bir hiyerarşi; yanına @path import ve .claude/rules/ ile path-specific yükleme geliyor. Yanlış katmana yazarsan kural ya görmezden gelinir (user-level’a repo-specific kural koymak), ya da her oturumu gereksiz şişirir (project-level’a kişisel tercih yazıp 50K token context harcatmak). Sınav bu ikisini de sorar.
Neden bu konu sınavda çıkıyor
Domain 3’ün ağırlığı %20. Bu domain içinde “configuration” maddesinin yaklaşık yarısı doğrudan context layering + rules ile ilgili. Tipik sınav sorusu: “Bir ekibin 12 geliştiricisi var. Test convention’ları sadece test dosyaları düzenlenirken yüklensin, kalan context kirletmesin. Hangi mekanizma doğru?” Cevap her zaman .claude/rules/ + YAML paths glob. Bir başka klasik: “CLAUDE.md’den başka bir markdown dosyasını içeri almak için hangi syntax kullanılır?” → @path. Bu ders bu iki soruya hazırlık.
Temel kavramlar
1. Üç seviye ve yükleme sırası
Claude Code her oturum açılışında bu üç dosyayı şu sırayla yükler:
- User-level:
~/.claude/CLAUDE.md(senin kişisel makinende, tüm projelerde geçerli) - Project-level:
<repo>/.claude/CLAUDE.mdveya<repo>/CLAUDE.md(ekibin tamamı, git’e commit edilir) - Directory-level: Claude’un o an üzerinde çalıştığı dizine en yakın ek
CLAUDE.md(monorepo’larda sık kullanılır)
📝 Rehber kapsamı dışında (pratik gözlem): Aynı konuda çakışma varsa bazı kullanıcılar “üst seviye önce yüklenir ama alt seviye kazanır” diye bir precedence gözlemi paylaşıyor. Sınav bu iddiayı teyit etmez; rehberin verdiği kesin kural daha sade: directory-level CLAUDE.md yalnızca o dizindeki dosyalarla çalışırken geçerlidir (rehber 5.1), ve yaygın hata ekibin proje konvansiyonunu user-level (~/.claude/CLAUDE.md) yerine project-level (.claude/CLAUDE.md) koymamaktır — yeni katılan ekip üyesi talimatı görmez (rehber 5.1 “Common mistake”).
İkilik: CLAUDE.md (root) ile .claude/CLAUDE.md aynı sayılır, ikisi de project-level. Tercih genelde .claude/CLAUDE.md — çünkü diğer Claude konfigürasyon dosyalarıyla (commands/, skills/, hooks/, settings.json) aynı yerde gruplanır.
2. @path import — modüler CLAUDE.md
200 satır sınırını aşmamak için CLAUDE.md’i parçalara bölersin, sonra ana dosyadan import edersin:
# .claude/CLAUDE.md
# Proje kuralları — ana dosya
## Genel
- TypeScript strict, ESM modules, vitest
- PR'da `pnpm test && pnpm typecheck` geçmeli
## Detaylı kurallar
- @.claude/rules/testing.md
- @.claude/rules/git-workflow.md
- @.claude/rules/style.md
Her import modülerdir: içerik çağrıldığı dosyanın context’ine eklenir. Rehber 5.2’ye göre @ kuralları: dosya yolundan hemen önce boşluksuz @ kullanılır, göreli/absolute path desteklenir, göreli path import’u barındıran dosyaya göre çözülür ve maximum import nesting depth 5’tir. Sınav tuzağı: “sınırsız” cevabı. Sınırsız değil, 5.
3. .claude/rules/ + YAML paths glob
Klasik soru: “Test convention’ları sadece test dosyalarına dokunulduğunda yüklensin.” Çözüm:
# .claude/rules/testing.md
---
paths:
- "**/*.test.ts"
- "**/*.test.tsx"
- "**/*.spec.ts"
- "src/test/**"
---
Test yazma kuralları:
- Her describe bloğunda setup/teardown ayrı
- Mock'lar `vi.mock` ile module seviyesinde
- Integration test'lerde gerçek DB kullanma, fixture'dan oku
paths frontmatter alanı glob listesi alır. Eğer aktif dosya bu glob’lardan birine eşleşirse rule yüklenir, yoksa hiç inject edilmez. Bu sayede:
- 50 satırlık test konvansiyonu context’e sadece test dosyası açtığında girer
- Diğer dosyalarda tam 0 token harcar
- Büyük monorepo’larda (örn. backend + frontend + infra) her alt dizin kendi kurallarını sadece ilgili dosyalarda yükler
Sınavda göreceğin varyasyon: paths: ["src/api/**/*.ts"] gibi alt-dizin kısıtı. Rehber 5.3’teki glob örnekleri pozitif pattern’lerdir; negation glob (!**/foo/**) konusunda rehber sessiz.
4. Hangi katmana ne yazılır — karar matrisi
| İçerik | Nereye? | Neden? |
|---|---|---|
| Dil tercihi (Türkçe yanıt) | ~/.claude/CLAUDE.md (user) | Kişisel, her projede geçerli |
| ”Kod yorumu yazma, sadece neden” | user-level | Senin tarzın, takıma bağlı değil |
| Tech stack bilgisi (Next.js 15, tRPC) | project-level .claude/CLAUDE.md | Ekip kararı, commit edilir |
| Test framework + çalıştırma komutu | project-level veya .claude/rules/testing.md | Test convention’ı ekip standardı |
Sadece *.test.ts dosyaları için convention | .claude/rules/testing.md + paths glob | Context tasarrufu |
Monorepo’da apps/web/ kuralları | apps/web/CLAUDE.md (directory) | Sadece o sub-tree için geçerli |
| DB şifresi, API key, kişi listesi | Hiçbir zaman CLAUDE.md | Gizli bilgi + context şişirir |
Sınav tuzağı: “Test convention’larını user-level’a koyalım, her yerde geçerli olsun” → yanlış, çünkü user-level tüm projelerde yüklenir, gereksiz context harcatır. Doğrusu: project-level + path-specific rules.
Sınav tuzakları
- “CLAUDE.md sınırsız import derinliğine izin verir” — Yanlış. Rehber 5.2 “Maximum import nesting depth is 5” der. Beş seviyeyi aşan import için rehber ek davranış tanımlamaz; sınav bu detayı sormaz.
- “User-level CLAUDE.md, project-level’dan daha önceliklidir” — Yanlış. Rehber 5.1’in vurguladığı yaygın hata: ekibin proje konvansiyonunu user-level yerine project-level’a koymamak, yeni katılan üye talimatı görmez. Precedence’ı sınav bu çerçevede sorar, “alt seviye kazanır” gibi kesin bir formül vermez.
- “Path-specific rules her dosyada yüklenir ama görünmez olur” — Yanlış. Rehber 5.3: kural,
pathspattern’iyle eşleşen dosya düzenlenirken yüklenir; eşleşmezse yüklenmez — yani token bile harcamaz. “Görünmez yükleme” gibi ara bir mod yok. - “
@.claude/rules/testing.mdile import ettiğin dosya ayrıca paths glob kontrolünden geçer” — Yanlış/kesin değil. Rehber 5.2 import edilen dosyanınpathsglob’la ilişkisini tanımlamıyor; sınavda bu detay beklenmez. Import edilen içerik çağrıldığı dosyanın context’ine eklenir.
Hands-on
Senaryo: Yeni başlayan bir geliştirici repoya katılıyor. Aşağıdaki yapıyı kur.
# 1. Dizinleri oluştur
mkdir -p .claude/rules
# 2. Ana CLAUDE.md
cat > .claude/CLAUDE.md <<'EOF'
# Proje: claudenews
- Astro 5 + TypeScript strict
- pnpm ile paket yönetimi
- PR açmadan önce: pnpm test && pnpm typecheck
## Detaylı kurallar
- @.claude/rules/testing.md
- @.claude/rules/git-workflow.md
EOF
# 3. Test kuralları (sadece test dosyaları için)
cat > .claude/rules/testing.md <<'EOF'
---
paths:
- "**/*.test.ts"
- "**/*.test.tsx"
- "**/*.spec.ts"
---
Test yazma standartları:
- vi.mock module seviyesinde
- Her describe kendi setup/teardown'una sahip
- Coverage threshold: lines 80%, branches 70%
EOF
# 4. Kişisel user-level (sadece senin makinende)
cat > ~/.claude/CLAUDE.md <<'EOF'
# Kişisel tercihlerim
- Türkçe yanıt ver
- Kod yorumu yazma, sadece "neden" ise yaz
- Plan mode'da başla (karmaşık işler için)
EOF
Doğrulama:
# Test dosyası açınca rules/testing.md yüklü mü?
claude
> "src/lib/auth.test.ts dosyasına bir unit test ekle"
# → "vi.mock module seviyesinde" kuralı geldi mi? EVET
# Production dosyasında rules/testing.md yüklenmemeli
> "src/lib/auth.ts dosyasına rate limiting ekle"
# → "coverage threshold" kuralı geldi mi? HAYIR (doğru, context tasarrufu)
Token tasarrufu hesabı: rehber kesin rakam vermez, niteliksel konuşur. Pratik gözlem — path-specific rules her oturumda yüklendiğinde context’e yüzlerce token ekler (dosya uzunluğuna ve path eşleşme sıklığına bağlı). Sadece eşleşen dosyalarda yüklemek, monorepo’da yoğun test dosyası açan bir geliştirici için yüzlerce token × dosya sayısı mertebesinde tasarruf sağlar. Küçük gibi ama context window’un başına gelen “system + claude.md + project rules + memory” yükünün anlamlı bir yüzdesi olabilir.
Özet
- 3 seviye: user (
~/.claude/CLAUDE.md) → project (.claude/CLAUDE.mdveya root) → directory (monorepo sub-tree). Directory-level yalnızca o dizindeki dosyalarla çalışırken geçerlidir. @pathimport: 5 seviye max, modüler kuralları ana dosyaya gömer..claude/rules/+pathsglob: dosya-spesifik kurallar sadece glob eşleşirse yüklenir, context tasarrufu sağlar.- Karar kuralı: kişisel → user-level, ekip standardı → project-level, dosya-spesifik → rules/ + paths.
- Yasak: gizli bilgi, repo’ya bağlı olmayan kişisel tercih project-level’a; sık erişilmeyen convention user-level’a yazılmaz.
- Sınav formülü: “Conditional loading =
.claude/rules/+pathsglob. Modüler import =@path(max nesting 5). Directory-level = o dizinle sınırlı. Yaygın hata = proje konvansiyonunu user-level yerine project-level’a koymamak.”
Kaynaklar
- Anthropic Docs — Claude Code: Memory and CLAUDE.md — https://docs.claude.com/en/docs/claude-code/memory
- Anthropic Docs — Claude Code: Configuration — https://docs.claude.com/en/docs/claude-code/configuration
- Skilljar — Claude Code Foundations: Configuration Module (Foundation course)
- Repo:
paullarionov/claude-certified-architect— Domain 3 okuma notları