Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 3x 3x 15x 15x 15x 15x 3x 9x 9x 9x 3x 7x 7x 3x 4x | import type { ScanResult, Category, Checkpoint } from "./types.js";
const statusIcon: Record<string, string> = {
pass: "[PASS]",
partial: "[PARTIAL]",
fail: "[FAIL]",
skip: "[SKIP]",
};
export const formatCheckpoint = (cp: Checkpoint): string => {
const lines = [
` ${statusIcon[cp.status] ?? cp.status} ${cp.id} ${cp.name} (${cp.score}/${cp.max_score})`,
];
Eif (cp.details) lines.push(` Details: ${cp.details}`);
if (cp.status !== "pass" && cp.recommendation) lines.push(` Recommendation: ${cp.recommendation}`);
return lines.join("\n");
};
export const formatCategory = (cat: Category): string => {
const pct = cat.max_score > 0 ? Math.round((cat.score / cat.max_score) * 100) : 0;
const lines = [
`${cat.label} — ${cat.score}/${cat.max_score} (${pct}%, weight: ${cat.weight}%)`,
...cat.checkpoints.map(formatCheckpoint),
];
return lines.join("\n");
};
export const formatScanResult = (scan: ScanResult): string => {
const lines = [
`Domain: ${scan.domain}`,
`Grade: ${scan.letter_grade} (${scan.overall_score}/100)`,
`Status: ${scan.status}`,
scan.scan_duration_ms ? `Scan duration: ${scan.scan_duration_ms}ms` : "",
scan.completed_at ? `Completed: ${scan.completed_at}` : "",
"",
...(scan.categories ?? []).map(formatCategory),
];
return lines.filter(Boolean).join("\n");
};
export const formatScanSummary = (scan: ScanResult): string =>
`${scan.domain} — Grade: ${scan.letter_grade} (${scan.overall_score}/100)`;
|