diff --git a/apps/manacore/apps/landing/src/content/config.ts b/apps/manacore/apps/landing/src/content/config.ts index 2168f52d3..e3ca1f7e6 100644 --- a/apps/manacore/apps/landing/src/content/config.ts +++ b/apps/manacore/apps/landing/src/content/config.ts @@ -228,6 +228,31 @@ const manascoreCollection = defineCollection({ lastChecked: z.string().optional(), // ISO date }) .optional(), + // API conformity checks + apiConformity: z + .object({ + consistentResponses: z.boolean(), // Uses ApiResult format + errorCodes: z.boolean(), // Consistent HTTP error codes + pagination: z.boolean(), // Supports pagination where needed + versioning: z.boolean(), // API versioning (/api/v1/) + documentation: z.boolean(), // Swagger/OpenAPI docs + healthEndpoint: z.boolean(), // /health endpoint + validation: z.boolean(), // DTO validation on all inputs + }) + .optional(), + // Cross-app consistency (shared package usage) + consistency: z + .object({ + sharedAuth: z.boolean(), // Uses @manacore/shared-nestjs-auth or nestjs-integration + sharedUi: z.boolean(), // Uses @manacore/shared-ui components + sharedTheme: z.boolean(), // Uses @manacore/shared-theme + sharedBranding: z.boolean(), // Uses @manacore/shared-branding + sharedI18n: z.boolean(), // Uses @manacore/shared-i18n + sharedErrorTracking: z.boolean(), // Uses @manacore/shared-error-tracking + sharedStorage: z.boolean().optional(), // Uses @manacore/shared-storage (if applicable) + sharedLlm: z.boolean().optional(), // Uses @manacore/shared-llm (if applicable) + }) + .optional(), // Score history for trend visualization history: z .array( diff --git a/apps/manacore/apps/landing/src/content/manascore/2026-03-19-calendar.md b/apps/manacore/apps/landing/src/content/manascore/2026-03-19-calendar.md index 33891dde3..0327052c8 100644 --- a/apps/manacore/apps/landing/src/content/manascore/2026-03-19-calendar.md +++ b/apps/manacore/apps/landing/src/content/manascore/2026-03-19-calendar.md @@ -18,6 +18,23 @@ scores: documentation: 98 security: 92 ux: 95 +apiConformity: + consistentResponses: true + errorCodes: true + pagination: true + versioning: true + documentation: true + healthEndpoint: true + validation: true +consistency: + sharedAuth: true + sharedUi: true + sharedTheme: true + sharedBranding: true + sharedI18n: true + sharedErrorTracking: true + sharedStorage: false + sharedLlm: false dependencies: total: 42 outdated: 9 diff --git a/apps/manacore/apps/landing/src/content/manascore/2026-03-19-todo.md b/apps/manacore/apps/landing/src/content/manascore/2026-03-19-todo.md index ec14546af..f60223b49 100644 --- a/apps/manacore/apps/landing/src/content/manascore/2026-03-19-todo.md +++ b/apps/manacore/apps/landing/src/content/manascore/2026-03-19-todo.md @@ -18,6 +18,23 @@ scores: documentation: 95 security: 90 ux: 94 +apiConformity: + consistentResponses: true + errorCodes: true + pagination: false + versioning: true + documentation: true + healthEndpoint: true + validation: true +consistency: + sharedAuth: true + sharedUi: true + sharedTheme: true + sharedBranding: true + sharedI18n: true + sharedErrorTracking: true + sharedStorage: false + sharedLlm: false dependencies: total: 38 outdated: 9 diff --git a/apps/manacore/apps/landing/src/pages/manascore/[slug].astro b/apps/manacore/apps/landing/src/pages/manascore/[slug].astro index ccc23e7e1..8af427be0 100644 --- a/apps/manacore/apps/landing/src/pages/manascore/[slug].astro +++ b/apps/manacore/apps/landing/src/pages/manascore/[slug].astro @@ -274,6 +274,108 @@ function getBarColor(score: number): string { })() } + {/* API Conformity */} + { + audit.data.apiConformity && + (() => { + const api = audit.data.apiConformity; + const checks = [ + { + key: 'Konsistente Responses', + value: api.consistentResponses, + desc: 'ApiResult', + }, + { key: 'Error Codes', value: api.errorCodes, desc: 'HTTP Status' }, + { key: 'Pagination', value: api.pagination, desc: 'Offset/Cursor' }, + { key: 'Versioning', value: api.versioning, desc: '/api/v1/' }, + { key: 'Dokumentation', value: api.documentation, desc: 'Swagger' }, + { key: 'Health Endpoint', value: api.healthEndpoint, desc: '/health' }, + { key: 'Validation', value: api.validation, desc: 'DTO' }, + ]; + const passed = checks.filter((c) => c.value).length; + + return ( +
+
+
+

API Conformity

+

Konsistenz der Backend-API

+
+ + {passed}/{checks.length} + +
+
+ {checks.map(({ key, value, desc }) => ( +
+ + {value ? '✓' : '✗'} + + {key} + ({desc}) +
+ ))} +
+
+ ); + })() + } + + {/* Cross-App Consistency */} + { + audit.data.consistency && + (() => { + const c = audit.data.consistency; + const packages = [ + { key: 'shared-auth', used: c.sharedAuth, req: true }, + { key: 'shared-ui', used: c.sharedUi, req: true }, + { key: 'shared-theme', used: c.sharedTheme, req: true }, + { key: 'shared-branding', used: c.sharedBranding, req: true }, + { key: 'shared-i18n', used: c.sharedI18n, req: true }, + { key: 'shared-error-tracking', used: c.sharedErrorTracking, req: true }, + { key: 'shared-storage', used: c.sharedStorage ?? false, req: false }, + { key: 'shared-llm', used: c.sharedLlm ?? false, req: false }, + ]; + const core = packages.filter((p) => p.req); + const coreUsed = core.filter((p) => p.used).length; + + return ( +
+
+
+

Cross-App Consistency

+

Nutzung der shared Packages

+
+ + {coreUsed}/{core.length} Core + +
+
+ {packages.map(({ key, used, req }) => ( +
+ + {used ? '✓' : req ? '✗' : '—'} + + {key} + {!req && ( + optional + )} +
+ ))} +
+
+ ); + })() + } + {/* Dependency Health */} { audit.data.dependencies && diff --git a/apps/manacore/apps/landing/src/pages/manascore/index.astro b/apps/manacore/apps/landing/src/pages/manascore/index.astro index 27d3be9bf..e045ce106 100644 --- a/apps/manacore/apps/landing/src/pages/manascore/index.astro +++ b/apps/manacore/apps/landing/src/pages/manascore/index.astro @@ -172,6 +172,51 @@ const statuses = [...new Set(sortedAudits.map((a) => a.data.status))]; ))} + {/* API & Consistency badges */} + {(data.apiConformity || data.consistency) && ( +
+ {data.apiConformity && + (() => { + const api = data.apiConformity; + const passed = [ + api.consistentResponses, + api.errorCodes, + api.pagination, + api.versioning, + api.documentation, + api.healthEndpoint, + api.validation, + ].filter(Boolean).length; + return ( + + API: {passed}/7 + + ); + })()} + {data.consistency && + (() => { + const c = data.consistency; + const core = [ + c.sharedAuth, + c.sharedUi, + c.sharedTheme, + c.sharedBranding, + c.sharedI18n, + c.sharedErrorTracking, + ].filter(Boolean).length; + return ( + + Shared: {core}/6 + + ); + })()} +
+ )} + {/* Dependency health */} {data.dependencies && (() => {