"use client"; import React from "react"; import { ShieldCheck, ShieldAlert, Bug, TestTube2, Lock } from "lucide-react"; import { Card, CardBody, CardHeader, CardTitle } from "@/components/ui/Card"; import { Badge } from "@/components/ui/Badge"; import { EmptyState } from "@/components/ui/EmptyState"; import { MetricCard } from "@/components/ui/MetricCard"; import { ProgressRing } from "@/components/ui/ProgressRing"; const FINDINGS = [ { sev: "critical", title: "Hardcoded secret in asf-core/config.py#L18", rule: "SECRET-LEAK-001", file: "services/asf-core/app/config.py" }, { sev: "high", title: "SQL injection vector in raw query", rule: "SQLI-014", file: "services/asf-core/app/repositories/artifact_repo.py" }, { sev: "medium", title: "CORS permissive in dev-trust mode", rule: "CORS-002", file: "services/asf-core/app/main.py" }, { sev: "medium", title: "Missing rate limit on /ask-asf", rule: "RATE-010", file: "services/asf-core/app/api/v1/ask_asf.py" }, { sev: "low", title: "Insecure cookie flags hint", rule: "COOKIE-004", file: "services/asf-core/app/dependencies.py" }, ]; const SEV_TONES: Record = { critical: "red", high: "red", medium: "amber", low: "neutral", }; export default function QualityPage() { return (

Quality & Security

Static analysis, test coverage, security findings, build health — consolidated from every ASF connector.

SonarQube · Semgrep connectors
} /> } subtitle="of 512 total" delta={0.6} /> } /> } />
Scores Security findings {FINDINGS.filter((f) => f.sev === "critical" || f.sev === "high").length} critical/high {FINDINGS.length === 0 ? (
) : (
    {FINDINGS.map((f, i) => (
  • {f.sev}
    {f.title}
    {f.rule} {f.file}
  • ))}
)}
); }