Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/reporters/verification-html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export function renderVerificationHtml(input: VerificationReport): string {
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'"><title>SkillSync · ${title}</title>
<style>:root{font-family:system-ui,sans-serif;color:#19343c;background:#f1f5f6;line-height:1.6}*{box-sizing:border-box}body{margin:0}header,main,footer{max-width:960px;margin:auto;padding:24px}a{color:#066d78}:focus-visible{outline:3px solid #18849b;outline-offset:4px}nav{display:flex;flex-wrap:wrap;gap:18px}h1{font-size:clamp(28px,4vw,42px);line-height:1.2}.hero,.issue-group{background:white;border:1px solid #cddce0;border-radius:8px;padding:20px;margin:16px 0}.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;border-block:1px solid #cddce0;padding:16px 0;font-variant-numeric:tabular-nums}.metrics strong{display:block;font-size:28px}.priorities{gap:8px;margin-top:20px}.priorities a{display:flex;align-items:center;gap:12px;min-height:44px;padding:8px 12px;border:1px solid #9db7bd;border-radius:4px;text-decoration:none}.priorities a:hover{background:#e8f3f4}summary{cursor:pointer;font-weight:700;min-height:44px;padding-block:8px}article{padding:16px 0;border-top:1px solid #cddce0}article h3{margin:0}article details{margin-top:12px}code,p{overflow-wrap:anywhere}[id]{scroll-margin-top:16px}small{font-size:13px}footer{color:#4e6871;font-size:13px}@media(max-width:600px){.metrics{grid-template-columns:1fr 1fr}header,main,footer{padding:16px}}@media print{body{background:white}nav{display:none}article{break-inside:avoid}details{border-radius:0}}</style></head>
<body><header><strong>SkillSync · Offline verification review</strong><nav aria-label="Report sections"><a href="#overview">Overview</a><a href="#issues">Issues and next steps</a><a href="#scope">Scope</a></nav></header><main>
<section class="hero" id="overview"><h1>${title}</h1><p>These checks read declared metadata. They do not establish runtime safety, authenticated provenance, or approval.</p><div class="metrics">${([{ key: "pass", label: "Passed" }, { key: "fail", label: "Failed" }, { key: "warn", label: "Warnings" }, { key: "unknown", label: "Unverified" }] as const).map(({ key, label }) => `<div><strong>${text(counts[key])}</strong>${label}</div>`).join("")}</div><p>${text(counts.total)} findings · ${text(issues.length)} deduplicated issues · exit code ${report.exitCode}</p>${links}</section>
<section id="issues"><h2>Issues and next steps</h2>${priorities.length ? `<p>The first group is open. Choose a priority above to open another group. At most ${DETAIL_LIMIT} issue details are included; use JSON for the full report.</p>${groups}` : "<p>No issues were reported. Review the scope and selected targets below.</p>"}</section>
<section id="scope"><h2>Scope and evidence</h2><p>${report.targets.length} selected ${report.targets.length === 1 ? "target" : "targets"}. ${text(report.generated_at)}</p><p>Local paths and raw evidence contents are excluded. No Skill was executed and no fix was applied by this report.</p></section></main><footer>Generated from local verification metadata. No scripts, external assets, or network requests. Keep the JSON report for complete machine-readable evidence.</footer></body></html>\n`;
<section class="hero" id="overview"><h1>${title}</h1><div class="metrics">${([{ key: "pass", label: "Passed" }, { key: "fail", label: "Failed" }, { key: "warn", label: "Warnings" }, { key: "unknown", label: "Unverified" }] as const).map(({ key, label }) => `<div><strong>${text(counts[key])}</strong>${label}</div>`).join("")}</div><p>${text(counts.total)} findings · ${text(issues.length)} deduplicated issues · exit code ${report.exitCode}</p>${links}</section>
<section id="issues"><h2>Issues and next steps</h2>${priorities.length ? `<p>Up to ${DETAIL_LIMIT} issue details. Use JSON for the complete report.</p>${groups}` : "<p>No issues were reported.</p>"}</section>
<section id="scope"><h2>Scope and evidence</h2><p>${report.targets.length} selected ${report.targets.length === 1 ? "target" : "targets"}. ${text(report.generated_at)}</p><p>Metadata checks only; no Skill execution or fixes. Runtime safety, authenticated provenance and approval remain unverified. Local paths and raw contents are omitted.</p></section></main><footer>Offline report. No scripts or external requests.</footer></body></html>\n`;
}
Loading