03

Mimari

Katmanlar, modül haritası, 7 adımlı işlem hattı, modüller arası veri akışı

4 dk okuma6 bölüm

Katmanlar

CleanLens, tek bir motoru ve iki ince arayüzü olan bir TypeScript projesidir.

text
┌──────────────────────────────┐   ┌──────────────────────────────┐
│  VS Code extension           │   │  CLI                         │
│  src/extension.ts            │   │  src/cli/index.ts            │
│  src/views/*                 │   │  src/cli/format.ts           │
└──────────────┬───────────────┘   └──────────────┬───────────────┘
               │   analyzeRepository(root, opts)  │
               └───────────────┬──────────────────┘
                               ▼
┌────────────────────────────────────────────────────────────────┐
│  Core pipeline — src/core/analyzeRepository.ts (no VS Code API) │
├──────────────┬──────────────┬───────────────┬──────────────────┤
│ git/         │ configuration│ analyzers/    │ attribution/     │
│ git commands │ config, rules│ rule checks   │ commit replay    │
│ + identities │ presets,     │ per file      │ + fingerprints   │
│              │ excludes     │               │                  │
├──────────────┴──────────────┴───────────────┼──────────────────┤
│ cache/ — per-commit results on disk         │ scoring/ — score │
└─────────────────────────────────────────────┴──────────────────┘
  • Yalnızca src/extension.ts ve src/views/* vscode içe aktarır. Geri kalan her şey düz Node.js'tir; CLI ve testlerin onu çalıştırabilmesinin nedeni budur.
  • typescript dışında çalışma zamanı bağımlılığı yoktur (JS analizörü tarafından ayrıştırıcı olarak kullanılır, esbuild ile pakete dahil edilir). Tüm Git erişimi execFile("git", …) üzerinden yapılır.

Modül haritası

KlasörDosyaSorumluluk
src/extension.tsEtkinleştirme, komut kaydı, ilerleme arayüzü, VS Code ayarlarının okunması, canlı tanıların bağlanması
src/core/analyzeRepository.tsOrtak işlem hattı; ayarları yapılandırmanın üzerine birleştirir; önbelleği kurar; ProjectReport döndürür
src/cli/index.tsArgüman ayrıştırma, çıkış kodları, stdout/stderr yönetimi
format.tsRapor → metin / Markdown; --fail-on denetimi
src/git/gitService.ts"Bu bir depo mu?", "Commit'i var mı?", katkıcı istatistikleri için git log
contributors.tsCommit'leri geliştiricilere gruplar; yinelenen kimlikleri birleştirir
commitHistory.tsBirleştirme olmayan commit'leri listeler (en yeni N / bir tarihten beri), en eskiden başlayarak
diffService.tsCommit başına bir git diff → değişen dosyalar, satır aralıkları, blob kimlikleri; blob okumak için git cat-file --batch
blameService.tsgit blame --line-porcelain ayrıştırıcısı. Eski (önceki blame motorundan); hâlâ test ediliyor, işlem hattında kullanılmıyor
src/configuration/types.tsYapılandırma tipleri, 14 kural kimliği, başlıkları ve kategorileri, dosya adları
configValidator.ts.clean-code-tracker.json şema doğrulaması
configLoader.tsYapılandırmayı (veya varsayılan ön ayarı) yükler, yerel geçersiz kılmayı birleştirir, yeni yapılandırma yazar
presets.tsDört ön ayar; ön ayarın otomatik tespiti
excludes.tsYerleşik hariç tutmalar; .gitignore / .gitattributes okuma; üretilmiş dosya başlığı tespiti
src/analyzers/fileScanner.tsHEAD taraması için dizin gezintisi
glob.tsMinimal glob → RegExp ve ExcludeMatcher
jsAnalyzer.tsJS/TS için AST tabanlı kurallar (TypeScript derleyici API'si)
pyAnalyzer.tsPython için satır/girinti tabanlı kurallar
duplicateCode.tsKayan pencere ile yinelenen blok tespiti
secrets.ts, names.tsGizli bilgiler ve belirsiz isimler için ortak sezgiler
model.tsRawFinding → Violation; kuralın etkinlik/sınır/seçenek yardımcıları
runAnalyzers.tsHEAD taramasını yönetir; uzantıya göre analizörü seçer
analyzeRevision.tsBir dosyanın tek bir sürümünü (blob) analiz eder ve her ihlale parmak izi verir
src/attribution/commitAttribution.tsCommit'leri gezer, önce/sonra karşılaştırır, her ihlali sınıflandırır
attributeReport.tsHEAD ihlallerini commit sonuçlarıyla birleştirir; geliştiricileri puanlar
fingerprint.tsFNV-1a hash; sabit ihlal parmak izi
ownership.tsE-posta → geliştirici kimliği eşlemesi (+ eski blame yardımcıları)
src/scoring/scoringConfig.tsAyarlanabilir tüm sabitler: ağırlıklar, ölçekler, ön bilgi, eşikler, ENGINE_VERSION
cleanCodeScore.tsPuan formülü
src/cache/analysisCache.tsCommit başına JSON önbelleği + yapılandırma hash'i
src/types/index.tsSeverity, Violation, Developer, ProjectReport, durumlar
src/views/treeProviders.tsKenar çubuğu ağaçları + ReportStore
dashboardPanel.tsWebview panelinin yaşam döngüsü ve mesajları
dashboardHtml.tsPano için saf HTML/CSS/JS üretimi
diagnostics.tsEditör tanıları: tam rapor beslemesi ve canlı besleme

İşlem hattı, adım adım

src/core/analyzeRepository.ts içindeki analyzeRepository(root, opts):

text
 1. Git checks        git rev-parse --is-inside-work-tree, git rev-parse HEAD
 2. Config            loadConfig()  →  applySettings(VS Code / CLI overrides)
                      readRepoAttributes() (.gitignore, .gitattributes)
                      mergedExcludeGlobs(), resolveScoring(), analysisConfigHash()
 3. Developers        git log --no-merges → aggregateContributors() → toDevelopers()
 4. HEAD scan         analyzeProject(): walk files → analyzer per file → duplicates
                      → sorted Violation[]
 5. Commit walk       attributeCommits(): newest N commits, oldest first,
                      12 in parallel, each: diff → blobs → analyze before/after
                      → introduced / fixed / existing
 6. Merge + score     attributeReport(): fingerprint every HEAD violation, look up
                      its origin, set status/confidence/developer; compute the
                      project prior; score every developer
 7. Display           extension: tree views, dashboard, diagnostics
                      CLI: text / Markdown / JSON + exit code

Aşamalar:

  1. Git kontrolleri: Klasör bir depo mu? Commit'i var mı?
  2. Yapılandırma: Yapılandırmayı yükle, VS Code ayarlarını veya CLI seçeneklerini üzerine birleştir, .gitignore ve .gitattributes dosyalarını oku, hariç tutma listesini, puanlama sabitlerini ve yapılandırma hash'ini oluştur.
  3. Geliştiriciler: Git geçmişini oku ve commit'leri geliştiricilere grupla.
  4. HEAD taraması: Mevcut dosyaları analiz et, sıralı ihlal listesini üret.
  5. Commit yürüyüşü: En yeni N commit, en eskiden başlayarak, 12'si paralel; her biri için: diff → blob'lar → önce/sonra analizi → eklenen / düzeltilen / mevcut.
  6. Birleştirme ve puanlama: HEAD'deki her ihlale parmak izi ver, kökenini bul, durumunu/güvenini/geliştiricisini belirle; proje ortalamasını hesapla ve her geliştiriciyi puanla.
  7. Gösterim: Eklentide ağaç görünümleri, pano, tanılar; CLI'da metin / Markdown / JSON + çıkış kodu.

1–6. adımlar iki arayüz için de aynıdır. Yalnızca seçenekler farklıdır:

SeçenekEklentiCLI
configdepodan yüklenirdepodan yüklenir veya --preset
settingsVS Code ayarlarından (cleanlens.*)--max-commits, --full-history, --since bayraklarından
cacheDircontext.globalStorageUri<os tmpdir>/cleanlens-cache
cachecleanlens.cache.enabled--no-cache ile kapalı
signalilerleme bildirimindeki Cancel düğmesiyok

Beklenen hatalar

AnalysisError, kullanıcının düzeltebileceği sorunlarda fırlatılır: Git deposu değil, commit yok, geçersiz yapılandırma. Eklenti bunu hata mesajı olarak gösterir; CLI error: … yazdırır ve 2 koduyla çıkar. Bunun dışındaki her istisna bir hatadır (bug).

Veri akışı ve tipler

text
RawFinding  ──toViolation()──▶  Violation (severity, category, weight, id)
                                   │
       analyzeRevision()           │  fingerprintFor()
                                   ▼
RevisionViolation (+fingerprint) ─▶ CommitContribution (per commit, cached)
                                   │
                    attributeCommits() aggregates
                                   ▼
            DeveloperAttribution (per developer) + origins (fingerprint → commit)
                                   │
                        attributeReport()
                                   ▼
                  ProjectReport { developers[], violations[] }

Tip tanımları src/types/index.ts ve src/configuration/types.ts içindedir. Rapor biçimi 14 — Rapor şeması içinde alan alan belgelenmiştir.

İki analiz, iki amaç

Anlaşılması gereken en önemli tasarım noktası budur:

HEAD taraması (4. adım)Commit yürüyüşü (5. adım)
Girdişu anda diskte olan dosyalarGit geçmişindeki blob'lar
Çıktısize gösterilen ihlal listesikim neyi ekledi / düzeltti ve analiz edilen satırlar
Tekrar tespititüm dosyalar arasındayalnızca her dosyanın içinde
Kapsamanaliz edilebilir her dosyayalnızca analiz edilen commit'lerin değiştirdiği dosyalar

Altıncı adım ikisini parmak izleriyle birleştirir. Parmak izi yürüyüş sırasında eklenmiş bir HEAD ihlali, o commit'in yazarına atanır. Yürüyüşte hiç görünmeyen bir HEAD ihlali, analiz penceresinden eskidir → existing.

Derleme çıktıları

esbuild iki bağımsız dosya paketler:

  • dist/extension.js — giriş noktası src/extension.ts, vscode paket dışında tutulur.
  • dist/cli.js — giriş noktası src/cli/index.ts, başında #!/usr/bin/env node satırı; cleanlens komutu olarak sunulur.

Derleme komutları için bkz. 15 — Geliştirme kılavuzu.