feat(manascore): add extended codebase metrics to all app audits

Add LOC, source files, size, commits, contributors, first commit date,
TODO count, API endpoints, stores, and max file size metrics to all 20
ManaScore audit files with real measured data from the monorepo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-25 15:12:15 +01:00
parent 89e32d4798
commit b9a9052ae5
23 changed files with 326 additions and 4 deletions

View file

@ -285,6 +285,15 @@ const manascoreCollection = defineCollection({
testCount: z.number().optional(),
languages: z.number().optional(),
linesOfCode: z.number().optional(),
sourceFiles: z.number().optional(),
sizeInMb: z.number().optional(),
commits: z.number().optional(),
contributors: z.number().optional(),
firstCommitDate: z.string().optional(),
todoCount: z.number().optional(),
apiEndpoints: z.number().optional(),
stores: z.number().optional(),
maxFileLines: z.number().optional(),
})
.optional(),
}),

View file

@ -65,6 +65,16 @@ stats:
testFiles: 24
testCount: 250
languages: 5
linesOfCode: 43549
sourceFiles: 269
sizeInMb: 2.2
commits: 310
contributors: 3
firstCommitDate: '2025-12-02'
todoCount: 103
apiEndpoints: 49
stores: 46
maxFileLines: 1686
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 2
testCount: 78
languages: 5
linesOfCode: 28989
sourceFiles: 203
sizeInMb: 1.5
commits: 178
contributors: 4
firstCommitDate: '2025-11-26'
todoCount: 477
apiEndpoints: 45
stores: 22
maxFileLines: 959
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 0
testCount: 0
languages: 2
linesOfCode: 7720
sourceFiles: 97
sizeInMb: 0.6
commits: 131
contributors: 3
firstCommitDate: '2025-12-03'
todoCount: 94
apiEndpoints: 26
stores: 22
maxFileLines: 478
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 14
testCount: 150
languages: 5
linesOfCode: 27840
sourceFiles: 177
sizeInMb: 1.5
commits: 181
contributors: 3
firstCommitDate: '2025-12-02'
todoCount: 52
apiEndpoints: 46
stores: 28
maxFileLines: 1696
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 4
testCount: 70
languages: 2
linesOfCode: 31386
sourceFiles: 220
sizeInMb: 1.6
commits: 26
contributors: 3
firstCommitDate: '2025-12-05'
todoCount: 523
apiEndpoints: 23
stores: 16
maxFileLines: 1104
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 12
testCount: 103
languages: 5
linesOfCode: 50234
sourceFiles: 300
sizeInMb: 7.8
commits: 214
contributors: 4
firstCommitDate: '2025-11-26'
todoCount: 111
apiEndpoints: 0
stores: 12
maxFileLines: 2001
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 1
testCount: 8
languages: 5
linesOfCode: 21118
sourceFiles: 185
sizeInMb: 2.5
commits: 99
contributors: 3
firstCommitDate: '2025-11-26'
todoCount: 295
apiEndpoints: 58
stores: 23
maxFileLines: 971
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 2
testCount: 5
languages: 2
linesOfCode: 16076
sourceFiles: 100
sizeInMb: 1.4
commits: 111
contributors: 3
firstCommitDate: '2026-01-28'
todoCount: 489
apiEndpoints: 0
stores: 8
maxFileLines: 2019
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 6
testCount: 113
languages: 1
linesOfCode: 16327
sourceFiles: 142
sizeInMb: 1.0
commits: 60
contributors: 1
firstCommitDate: '2026-03-17'
todoCount: 61
apiEndpoints: 59
stores: 25
maxFileLines: 572
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 8
testCount: 45
languages: 2
linesOfCode: 6521
sourceFiles: 83
sizeInMb: 0.6
commits: 78
contributors: 3
firstCommitDate: '2025-11-26'
todoCount: 158
apiEndpoints: 19
stores: 5
maxFileLines: 298
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 0
testCount: 0
languages: 3
linesOfCode: 6136
sourceFiles: 73
sizeInMb: 0.2
commits: 40
contributors: 2
firstCommitDate: '2026-02-11'
todoCount: 46
apiEndpoints: 26
stores: 14
maxFileLines: 421
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 4
testCount: 70
languages: 5
linesOfCode: 54828
sourceFiles: 406
sizeInMb: 5.0
commits: 139
contributors: 3
firstCommitDate: '2025-11-26'
todoCount: 253
apiEndpoints: 68
stores: 40
maxFileLines: 1064
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 0
testCount: 0
languages: 3
linesOfCode: 4228
sourceFiles: 65
sizeInMb: 0.6
commits: 58
contributors: 2
firstCommitDate: '2026-01-18'
todoCount: 46
apiEndpoints: 15
stores: 8
maxFileLines: 279
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 10
testCount: 72
languages: 6
linesOfCode: 7086
sourceFiles: 90
sizeInMb: 0.7
commits: 98
contributors: 3
firstCommitDate: '2025-11-27'
todoCount: 48
apiEndpoints: 18
stores: 12
maxFileLines: 675
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 0
testCount: 0
languages: 3
linesOfCode: 6009
sourceFiles: 89
sizeInMb: 0.5
commits: 48
contributors: 3
firstCommitDate: '2026-01-28'
todoCount: 46
apiEndpoints: 32
stores: 14
maxFileLines: 320
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 2
testCount: 12
languages: 4
linesOfCode: 7417
sourceFiles: 71
sizeInMb: 0.7
commits: 56
contributors: 3
firstCommitDate: '2026-01-28'
todoCount: 48
apiEndpoints: 13
stores: 10
maxFileLines: 554
---
## Zusammenfassung

View file

@ -35,6 +35,16 @@ stats:
testFiles: 19
testCount: 205
languages: 2
linesOfCode: 12908
sourceFiles: 113
sizeInMb: 0.9
commits: 90
contributors: 3
firstCommitDate: '2025-12-02'
todoCount: 48
apiEndpoints: 35
stores: 12
maxFileLines: 676
---
## Zusammenfassung

View file

@ -65,6 +65,16 @@ stats:
testFiles: 16
testCount: 210
languages: 5
linesOfCode: 26567
sourceFiles: 187
sizeInMb: 1.2
commits: 223
contributors: 3
firstCommitDate: '2025-12-03'
todoCount: 98
apiEndpoints: 50
stores: 30
maxFileLines: 1252
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 0
testCount: 0
languages: 0
linesOfCode: 11637
sourceFiles: 78
sizeInMb: 0.8
commits: 6
contributors: 1
firstCommitDate: '2026-03-15'
todoCount: 38
apiEndpoints: 14
stores: 0
maxFileLines: 760
---
## Zusammenfassung

View file

@ -31,6 +31,16 @@ stats:
testFiles: 0
testCount: 0
languages: 2
linesOfCode: 7807
sourceFiles: 70
sizeInMb: 0.6
commits: 105
contributors: 3
firstCommitDate: '2025-11-28'
todoCount: 47
apiEndpoints: 12
stores: 20
maxFileLines: 1425
---
## Zusammenfassung

View file

@ -488,7 +488,78 @@ function getBarColor(score: number): string {
audit.data.stats && (
<div class="border-border/50 mb-8 rounded-xl border bg-gradient-to-br from-white/5 to-white/[0.02] p-6">
<h2 class="text-foreground mb-4 text-sm font-semibold">Metriken</h2>
{/* Codebase size highlight */}
{(audit.data.stats.linesOfCode ||
audit.data.stats.sourceFiles ||
audit.data.stats.sizeInMb) && (
<div class="mb-4 grid grid-cols-3 gap-4 rounded-lg bg-white/5 p-4">
{audit.data.stats.linesOfCode !== undefined && (
<div class="text-center">
<span class="text-primary text-2xl font-bold">
{audit.data.stats.linesOfCode.toLocaleString('de-DE')}
</span>
<span class="text-muted-foreground block text-xs">Lines of Code</span>
</div>
)}
{audit.data.stats.sourceFiles !== undefined && (
<div class="text-center">
<span class="text-primary text-2xl font-bold">
{audit.data.stats.sourceFiles}
</span>
<span class="text-muted-foreground block text-xs">Source Files</span>
</div>
)}
{audit.data.stats.sizeInMb !== undefined && (
<div class="text-center">
<span class="text-primary text-2xl font-bold">
{audit.data.stats.sizeInMb}
</span>
<span class="text-muted-foreground block text-xs">MB (Source)</span>
</div>
)}
</div>
)}
{/* Activity & History */}
{(audit.data.stats.commits ||
audit.data.stats.contributors ||
audit.data.stats.firstCommitDate) && (
<div class="mb-4 grid grid-cols-3 gap-4 rounded-lg bg-white/5 p-4">
{audit.data.stats.commits !== undefined && (
<div class="text-center">
<span class="text-foreground text-2xl font-bold">
{audit.data.stats.commits}
</span>
<span class="text-muted-foreground block text-xs">Commits</span>
</div>
)}
{audit.data.stats.contributors !== undefined && (
<div class="text-center">
<span class="text-foreground text-2xl font-bold">
{audit.data.stats.contributors}
</span>
<span class="text-muted-foreground block text-xs">Contributors</span>
</div>
)}
{audit.data.stats.firstCommitDate && (
<div class="text-center">
<span class="text-foreground text-lg font-bold">
{audit.data.stats.firstCommitDate}
</span>
<span class="text-muted-foreground block text-xs">Erster Commit</span>
</div>
)}
</div>
)}
<div class="grid grid-cols-2 gap-4 sm:grid-cols-4">
{audit.data.stats.apiEndpoints !== undefined &&
audit.data.stats.apiEndpoints > 0 && (
<div>
<span class="text-foreground text-2xl font-bold">
{audit.data.stats.apiEndpoints}
</span>
<span class="text-muted-foreground block text-xs">API Endpoints</span>
</div>
)}
{audit.data.stats.backendModules !== undefined && (
<div>
<span class="text-foreground text-2xl font-bold">
@ -505,6 +576,14 @@ function getBarColor(score: number): string {
<span class="text-muted-foreground block text-xs">Web Routes</span>
</div>
)}
{audit.data.stats.stores !== undefined && audit.data.stats.stores > 0 && (
<div>
<span class="text-foreground text-2xl font-bold">
{audit.data.stats.stores}
</span>
<span class="text-muted-foreground block text-xs">Stores</span>
</div>
)}
{audit.data.stats.components !== undefined && (
<div>
<span class="text-foreground text-2xl font-bold">
@ -545,6 +624,26 @@ function getBarColor(score: number): string {
<span class="text-muted-foreground block text-xs">Sprachen</span>
</div>
)}
{audit.data.stats.todoCount !== undefined && audit.data.stats.todoCount > 0 && (
<div>
<span
class={`text-2xl font-bold ${audit.data.stats.todoCount > 200 ? 'text-yellow-500' : audit.data.stats.todoCount > 400 ? 'text-red-500' : 'text-foreground'}`}
>
{audit.data.stats.todoCount}
</span>
<span class="text-muted-foreground block text-xs">TODOs/FIXMEs</span>
</div>
)}
{audit.data.stats.maxFileLines !== undefined && (
<div>
<span
class={`text-2xl font-bold ${audit.data.stats.maxFileLines > 1000 ? 'text-yellow-500' : 'text-foreground'}`}
>
{audit.data.stats.maxFileLines}
</span>
<span class="text-muted-foreground block text-xs">Max File (LOC)</span>
</div>
)}
</div>
</div>
)

View file

@ -288,11 +288,25 @@ const statuses = [...new Set(sortedAudits.map((a) => a.data.status))];
{/* Stats row */}
{data.stats && (
<div class="text-muted-foreground/60 mt-2 flex flex-wrap gap-3 text-[10px]">
{data.stats.backendModules ? (
<span>{data.stats.backendModules} Module</span>
{data.stats.linesOfCode ? (
<span class="text-foreground/70 font-medium">
{data.stats.linesOfCode.toLocaleString('de-DE')} LOC
</span>
) : null}
{data.stats.sourceFiles ? (
<span>{data.stats.sourceFiles} Files</span>
) : null}
{data.stats.sizeInMb ? <span>{data.stats.sizeInMb} MB</span> : null}
{data.stats.commits ? <span>{data.stats.commits} Commits</span> : null}
{data.stats.apiEndpoints ? (
<span>{data.stats.apiEndpoints} Endpoints</span>
) : null}
{data.stats.stores ? <span>{data.stats.stores} Stores</span> : null}
{data.stats.todoCount ? (
<span class={data.stats.todoCount > 200 ? 'text-yellow-500' : ''}>
{data.stats.todoCount} TODOs
</span>
) : null}
{data.stats.webRoutes ? <span>{data.stats.webRoutes} Routes</span> : null}
{data.stats.dbTables ? <span>{data.stats.dbTables} Tables</span> : null}
{data.stats.testCount !== undefined ? (
<span>{data.stats.testCount} Tests</span>
) : null}