Rapor şeması
--json ile üretilen JSON ProjectReport, alan alan
cleanlens --json bir ProjectReport yazdırır. Tipler src/types/index.ts içinde tanımlıdır. Bu doküman her alanı açıklar.
ProjectReport
| Alan | Tip | Açıklama |
|---|---|---|
schemaVersion | sayı | commit-diff motoru için 2 |
generatedAt | string (ISO 8601) | Raporun oluşturulma zamanı |
engine | "commit-diff" | Kullanılan atama motoru ("head-blame" eskisiydi) |
analysisConfigHash | string | Kurallar + hariç tutmalar + puanlamanın hash'i (aynı zamanda önbellek anahtarı); eşit hash'ler karşılaştırılabilir raporlar demektir |
developerCount | sayı | Kimlik birleştirmeden sonraki geliştirici sayısı |
totalViolations | sayı | Mevcut koddaki ihlaller |
unattributedViolations | sayı | Dosyası okunamayan ihlaller |
analyzedFiles | sayı | HEAD taramasında analiz edilen dosyalar |
analyzedCommits | sayı | Yeniden oynatılan commit'ler |
developers | Developer[] | Aşağıya bakın |
violations | Violation[] | Aşağıya bakın; önem derecesine, sonra yola, sonra satıra göre sıralı |
Developer
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Commit sayısına göre dev-1, dev-2, … Yalnızca tek bir rapor içinde sabittir. Geliştiricileri raporlar arasında emails ile eşleştirin. |
displayName | string | Ad (birleştirilmiş adlar - ile birleştirilir) |
emails | string[] | Küçük harfli yazar e-postaları |
cleanCodeScore | sayı | null | 0–100, yuvarlanmış; null = analiz edilen kod yok |
scoreExact | sayı | null | Yuvarlanmamış puan |
scoreByCategory | nesne | { duplication, structure, hygiene }, her biri { density, subScore }; density büzülmeden sonradır |
violationCount | sayı | high/medium güvenle eklenen ihlaller |
weightedViolationPoints | sayı | Bu ihlallerin ağırlık toplamı |
analyzedLines | sayı | Analiz edilen commit'lerde eklenen/değiştirilen satırlar |
attributedCodeLines | sayı | Aynı değer (tarihsel ad) |
violationDensity | sayı | KLOC başına ağırlıklı puan, büzülmeden önce |
confidenceLevel | insufficient | provisional | reliable | highly_reliable | Analiz edilen satırlardan |
rankable | boolean | Puanı ve sıralanmak için yeterli satırı var |
contributionPercent | sayı 0–1 | Tüm analiz edilen satırlardaki payı |
breakdown | nesne | Aşağıya bakın |
activeDays | sayı | Commit içeren farklı UTC günleri (tüm geçmiş) |
firstContribution, lastContribution | string (ISO) | İlk/son commit tarihi (tüm geçmiş) |
breakdown
| Alan | Açıklama |
|---|---|
introduced | high/medium güvenle eklenen ihlaller (violationCount ile aynı) |
fixed | Commit'lerinin kaldırdığı ihlaller |
existing | Değiştirdiği dosyalardaki önceden var olan ihlaller (bilgi amaçlı) |
excluded | Geliştirici düzeyinde her zaman 0 (şema kararlılığı için tutulur) |
unattributed | Commit'lerinin analiz edilemez hale getirdiği ihlaller (bilgi amaçlı) |
introducedWeighted | introduced ağırlıklarının toplamı |
fixedWeighted | fixed ağırlıklarının toplamı |
netQualityImpact | introducedWeighted − fixedWeighted (pozitif = kaldırılandan fazla borç eklendi) |
introduced ve fixed değerlerinin analiz edilen commit'ler üzerinden tarihsel sayılar olduğunu, violations[] listesinin ise yalnızca şu anda kodda olanı listelediğini unutmayın.
Violation
| Alan | Tip | Açıklama |
|---|---|---|
id | string | Kural + yol + satır + mesajın hash'i; rapor içinde benzersiz |
ruleId | string | 14 kural kimliğinden biri |
message | string | Okunabilir ayrıntı, örn. Function load has 58 lines (limit 40). |
severity | critical | high | medium | low | Kural yapılandırmasından |
weight | sayı | Önem ağırlığı |
category | duplication | structure | hygiene | |
filePath | string | Depoya göreli, / ayıraçlı |
startLine, endLine | sayı | 1'den başlar; endLine bulunmayabilir |
symbolName | string? | Kapsayan fonksiyon/sınıf |
fingerprint | string | Sabit kimlik (bkz. 07) |
status | introduced | existing | fixed | excluded | unattributed | Atama durumu |
confidence | high | medium | low | Atama güveni |
developerId | string? | İhlalin yazıldığı geliştirici (yalnızca high/medium) |
introducedBy | string? | Commit'i ihlali ekleyen geliştirici (her güven düzeyi) |
introducedCommit | string? | Commit hash'i |
introducedAt | string? | Commit yazar tarihi (ISO) |
source | "internal" | Bugün her zaman internal (eslint, ruff, pylint ayrılmıştır) |
Örnek
{
"schemaVersion": 2,
"generatedAt": "2026-09-30T10:12:44.120Z",
"engine": "commit-diff",
"analysisConfigHash": "1x9k2ab",
"developerCount": 2,
"totalViolations": 1,
"unattributedViolations": 0,
"analyzedFiles": 12,
"analyzedCommits": 40,
"developers": [
{
"id": "dev-1",
"displayName": "Alice",
"emails": ["alice@example.com"],
"cleanCodeScore": 82,
"scoreExact": 81.7,
"scoreByCategory": {
"duplication": { "density": 0.8, "subScore": 95 },
"structure": { "density": 9.1, "subScore": 82 },
"hygiene": { "density": 12.4, "subScore": 72 }
},
"violationCount": 9,
"weightedViolationPoints": 27,
"analyzedLines": 2400,
"attributedCodeLines": 2400,
"violationDensity": 11.25,
"confidenceLevel": "reliable",
"rankable": true,
"contributionPercent": 0.8,
"breakdown": {
"introduced": 9, "existing": 3, "fixed": 4, "excluded": 0, "unattributed": 0,
"introducedWeighted": 27, "fixedWeighted": 10, "netQualityImpact": 17
},
"activeDays": 21,
"firstContribution": "2026-05-02T09:00:00+03:00",
"lastContribution": "2026-09-28T17:40:00+03:00"
}
],
"violations": [
{
"id": "k2j3h1",
"ruleId": "maxComplexity",
"message": "Function parse has complexity 14 (limit 10).",
"severity": "high",
"weight": 5,
"category": "structure",
"filePath": "src/parser.ts",
"startLine": 40,
"endLine": 96,
"symbolName": "parse",
"fingerprint": "1a2b3c",
"status": "introduced",
"confidence": "high",
"developerId": "dev-1",
"introducedBy": "dev-1",
"introducedCommit": "3f9e1c…",
"introducedAt": "2026-08-14T11:02:00+03:00",
"source": "internal"
}
]
}(Değerler örnektir.)
jq ile yararlı sorgular
# Puanlar, en düşük önce
jq -r '.developers | sort_by(.cleanCodeScore) | .[] | "\(.cleanCodeScore)\t\(.displayName)"' report.json
# Kritik ihlaller ve onları kimin eklediği
jq -r '.violations[] | select(.severity=="critical") | "\(.filePath):\(.startLine)\t\(.introducedBy // "-")"' report.json
# Kural başına ihlal sayısı
jq -r '.violations | group_by(.ruleId) | map("\(length)\t\(.[0].ruleId)") | .[]' report.json