playwright-checkpoint 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +665 -0
- package/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-F5A6XGLJ.js +104 -0
- package/dist/chunk-F5A6XGLJ.js.map +1 -0
- package/dist/chunk-K5DX32TO.js +214 -0
- package/dist/chunk-K5DX32TO.js.map +1 -0
- package/dist/chunk-KG37WSYS.js +1549 -0
- package/dist/chunk-KG37WSYS.js.map +1 -0
- package/dist/chunk-X5IPL32H.js +1484 -0
- package/dist/chunk-X5IPL32H.js.map +1 -0
- package/dist/cli/bin.cjs +3972 -0
- package/dist/cli/bin.cjs.map +1 -0
- package/dist/cli/bin.d.cts +1 -0
- package/dist/cli/bin.d.ts +1 -0
- package/dist/cli/bin.js +43 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.cjs +1672 -0
- package/dist/cli/index.cjs.map +1 -0
- package/dist/cli/index.d.cts +31 -0
- package/dist/cli/index.d.ts +31 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-args.cjs +129 -0
- package/dist/cli/mcp-args.cjs.map +1 -0
- package/dist/cli/mcp-args.d.cts +32 -0
- package/dist/cli/mcp-args.d.ts +32 -0
- package/dist/cli/mcp-args.js +10 -0
- package/dist/cli/mcp-args.js.map +1 -0
- package/dist/components.cjs +53 -0
- package/dist/components.cjs.map +1 -0
- package/dist/components.d.cts +27 -0
- package/dist/components.d.ts +27 -0
- package/dist/components.js +26 -0
- package/dist/components.js.map +1 -0
- package/dist/core-CD4jHGgI.d.cts +51 -0
- package/dist/core-CZvnc0rE.d.ts +51 -0
- package/dist/core.cjs +1576 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +3 -0
- package/dist/core.d.ts +3 -0
- package/dist/core.js +32 -0
- package/dist/core.js.map +1 -0
- package/dist/index-BjYQX_hK.d.ts +8 -0
- package/dist/index-Cabk31qi.d.cts +8 -0
- package/dist/index.cjs +3318 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +94 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.js +285 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.cjs +3467 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +26 -0
- package/dist/mcp/index.d.ts +26 -0
- package/dist/mcp/index.js +586 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/teardown.cjs +1509 -0
- package/dist/teardown.cjs.map +1 -0
- package/dist/teardown.d.cts +5 -0
- package/dist/teardown.d.ts +5 -0
- package/dist/teardown.js +52 -0
- package/dist/teardown.js.map +1 -0
- package/dist/types-G7w4n8kR.d.cts +359 -0
- package/dist/types-G7w4n8kR.d.ts +359 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/report/story-utils.ts","../../src/report/html-reporter.ts","../../src/report/markdown-reporter.ts","../../src/report/mdx-reporter.ts","../../src/report/index.ts","../../src/mcp/transport.ts","../../src/mcp/upstream.ts","../../src/mcp/browser-connect.ts","../../src/collectors/aria-snapshot.ts","../../src/page-utils.ts","../../src/collectors/axe.ts","../../src/collectors/console.ts","../../src/collectors/dom-stats.ts","../../src/collectors/forms.ts","../../src/collectors/html.ts","../../src/collectors/metadata.ts","../../src/collectors/network.ts","../../src/collectors/network-timing.ts","../../src/collectors/screenshot.ts","../../src/collectors/storage.ts","../../src/collectors/web-vitals.ts","../../src/collectors/builtin-collectors.ts","../../src/collectors/registry.ts","../../src/core.ts","../../src/mcp/tools.ts","../../src/mcp/index.ts","../../src/cli/index.ts","../../src/cli/mcp-args.ts","../../src/cli/bin.ts"],"sourcesContent":["import type { RunRecord } from '../types';\n\nexport function groupByStory(runs: RunRecord[]): Map<string, RunRecord[]> {\n const stories = new Map<string, RunRecord[]>();\n\n for (const run of runs) {\n const existing = stories.get(run.title) ?? [];\n existing.push(run);\n stories.set(run.title, existing);\n }\n\n return stories;\n}\n\nexport function orderedCheckpointNames(runs: RunRecord[]): string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n\n for (const run of runs) {\n for (const checkpoint of run.checkpoints) {\n if (seen.has(checkpoint.name)) {\n continue;\n }\n\n seen.add(checkpoint.name);\n names.push(checkpoint.name);\n }\n }\n\n return names;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory, orderedCheckpointNames } from './story-utils';\n\ntype HtmlReporterConfig = {\n title?: string;\n projectOrder?: string[];\n};\n\nconst DEFAULT_PROJECT_ORDER = ['desktop-light', 'desktop-dark', 'mobile-light', 'mobile-dark'];\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nfunction slugify(value: string): string {\n return (\n value\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction formatDateTime(isoDate: string): string {\n const date = new Date(isoDate);\n if (Number.isNaN(date.getTime())) {\n return isoDate;\n }\n\n return new Intl.DateTimeFormat('en-US', {\n dateStyle: 'medium',\n timeStyle: 'short',\n }).format(date);\n}\n\nfunction projectWeight(projectName: string, projectOrder: string[]): number {\n const index = projectOrder.indexOf(projectName);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction formatProjectLabel(projectName: string): string {\n const [device, mode] = projectName.split('-');\n if (!device || !mode) {\n return projectName;\n }\n\n const deviceLabel = device === 'desktop' ? 'Desktop' : device === 'mobile' ? 'Mobile' : device;\n const modeLabel = mode === 'light' ? 'Light' : mode === 'dark' ? 'Dark' : mode;\n return `${deviceLabel} / ${modeLabel}`;\n}\n\nfunction sortByProjectAndTime(a: RunRecord, b: RunRecord, projectOrder: string[]): number {\n const byProject = projectWeight(a.project, projectOrder) - projectWeight(b.project, projectOrder);\n if (byProject !== 0) {\n return byProject;\n }\n\n const byProjectName = a.project.localeCompare(b.project);\n if (byProjectName !== 0) {\n return byProjectName;\n }\n\n return new Date(a.startedAt).getTime() - new Date(b.startedAt).getTime();\n}\n\nfunction getCollectorSummaryNumber(checkpoint: CheckpointRecord, collectorName: string, key: string): number | null {\n const value = checkpoint.collectors[collectorName]?.summary[key];\n return typeof value === 'number' ? value : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction highlightOverlayStyle(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const bounds = data?.highlightBounds;\n const imageSize = data?.imageSize;\n\n if (\n !bounds ||\n !imageSize ||\n typeof bounds.x !== 'number' ||\n typeof bounds.y !== 'number' ||\n typeof bounds.width !== 'number' ||\n typeof bounds.height !== 'number' ||\n typeof imageSize.width !== 'number' ||\n typeof imageSize.height !== 'number' ||\n imageSize.width <= 0 ||\n imageSize.height <= 0\n ) {\n return null;\n }\n\n const left = (bounds.x / imageSize.width) * 100;\n const top = (bounds.y / imageSize.height) * 100;\n const width = (bounds.width / imageSize.width) * 100;\n const height = (bounds.height / imageSize.height) * 100;\n\n return [\n `left:${left.toFixed(4)}%`,\n `top:${top.toFixed(4)}%`,\n `width:${width.toFixed(4)}%`,\n `height:${height.toFixed(4)}%`,\n ].join(';');\n}\n\nfunction highlightLabel(checkpoint: CheckpointRecord): string | null {\n const selector = screenshotData(checkpoint)?.highlightSelector;\n return typeof selector === 'string' && selector.trim().length > 0 ? `Focus: ${selector.trim()}` : null;\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction toEncodedHref(outputDir: string, filePath: string | null): string | null {\n if (!filePath) {\n return null;\n }\n\n const relativePath = path.relative(outputDir, filePath);\n return relativePath.split(path.sep).map(encodeURIComponent).join('/');\n}\n\nfunction getArtifactHref(\n run: RunRecord,\n checkpoint: CheckpointRecord,\n outputDir: string,\n collectorName: string,\n artifactName?: string,\n): string | null {\n const artifacts = checkpoint.collectors[collectorName]?.artifacts ?? [];\n const artifact = artifactName\n ? artifacts.find((entry) => entry.name === artifactName)\n : artifacts[0];\n\n if (!artifact?.path) {\n return null;\n }\n\n return toEncodedHref(outputDir, resolveArtifactPath(run, artifact.path));\n}\n\nfunction renderArtifactLinks(run: RunRecord, checkpoint: CheckpointRecord, outputDir: string): string {\n const links: Array<{ label: string; href: string | null }> = [\n { label: 'DOM HTML', href: getArtifactHref(run, checkpoint, outputDir, 'html', 'html') },\n { label: 'Axe', href: getArtifactHref(run, checkpoint, outputDir, 'axe', 'axe') },\n { label: 'Web Vitals', href: getArtifactHref(run, checkpoint, outputDir, 'web-vitals', 'web-vitals') },\n { label: 'Console', href: getArtifactHref(run, checkpoint, outputDir, 'console', 'console-errors') },\n { label: 'Failed Requests', href: getArtifactHref(run, checkpoint, outputDir, 'network', 'failed-requests') },\n ];\n\n return links\n .map((link) => {\n if (!link.href) {\n return `<span class=\"artifact disabled\">${escapeHtml(link.label)}</span>`;\n }\n\n return `<a class=\"artifact\" href=\"${link.href}\" target=\"_blank\" rel=\"noreferrer\">${escapeHtml(link.label)}</a>`;\n })\n .join('');\n}\n\nfunction renderCheckpointCard(run: RunRecord, checkpointName: string, outputDir: string): string {\n const checkpoint = run.checkpoints.find((entry) => entry.name === checkpointName);\n if (!checkpoint) {\n return `\n <article class=\"variant-card missing\">\n <header class=\"variant-card-header\">\n <div>\n <h5>${escapeHtml(formatProjectLabel(run.project))}</h5>\n <p>${escapeHtml(run.project)}</p>\n </div>\n <time>${escapeHtml(formatDateTime(run.startedAt))}</time>\n </header>\n <div class=\"empty-card\">No checkpoint captured for this run.</div>\n </article>\n `;\n }\n\n const screenshotHref = getArtifactHref(run, checkpoint, outputDir, 'screenshot', 'screenshot');\n const overlayStyle = highlightOverlayStyle(checkpoint);\n const focus = highlightLabel(checkpoint);\n const axeViolations = getCollectorSummaryNumber(checkpoint, 'axe', 'violations');\n const consoleErrors = getCollectorSummaryNumber(checkpoint, 'console', 'consoleErrorCount') ?? 0;\n const failedRequests = getCollectorSummaryNumber(checkpoint, 'network', 'failedRequestCount') ?? 0;\n\n return `\n <article class=\"variant-card\">\n <header class=\"variant-card-header\">\n <div>\n <h5>${escapeHtml(formatProjectLabel(run.project))}</h5>\n <p>${escapeHtml(run.project)}</p>\n </div>\n <time>${escapeHtml(formatDateTime(checkpoint.timestamp || run.startedAt))}</time>\n </header>\n <p class=\"page-meta\">\n <span>${escapeHtml(checkpoint.title || 'Untitled page')}</span>\n <span class=\"page-url\">${escapeHtml(checkpoint.url)}</span>\n </p>\n ${\n screenshotHref\n ? `<a class=\"thumbnail-link\" href=\"${screenshotHref}\" target=\"_blank\" rel=\"noreferrer\">\n <img src=\"${screenshotHref}\" alt=\"${escapeHtml(`${run.project} — ${checkpoint.name}`)}\" loading=\"lazy\" />\n ${overlayStyle ? `<span class=\"highlight-overlay\" style=\"${overlayStyle}\" aria-hidden=\"true\"></span>` : ''}\n ${focus ? `<span class=\"highlight-label\">${escapeHtml(focus)}</span>` : ''}\n </a>`\n : '<div class=\"empty-card\">Screenshot unavailable.</div>'\n }\n <div class=\"stats-grid\">\n <span><strong>${axeViolations ?? 'n/a'}</strong><small>Axe violations</small></span>\n <span><strong>${consoleErrors}</strong><small>Console errors</small></span>\n <span><strong>${failedRequests}</strong><small>Failed requests</small></span>\n </div>\n <div class=\"artifact-list\">${renderArtifactLinks(run, checkpoint, outputDir)}</div>\n </article>\n `;\n}\n\nfunction renderStorySection(title: string, runs: RunRecord[], outputDir: string): string {\n const checkpointNames = orderedCheckpointNames(runs);\n const environments = [...new Set(runs.map((run) => run.environment))].sort();\n const tags = [...new Set(runs.flatMap((run) => run.tags))].sort();\n\n const checkpointBlocks = checkpointNames\n .map(\n (checkpointName) => `\n <details class=\"accordion checkpoint-block\">\n <summary class=\"checkpoint-summary\">\n <span>${escapeHtml(checkpointName)}</span>\n <span class=\"checkpoint-meta\">${runs.length} variants</span>\n </summary>\n <div class=\"variant-grid\">\n ${runs.map((run) => renderCheckpointCard(run, checkpointName, outputDir)).join('')}\n </div>\n </details>\n `,\n )\n .join('');\n\n return `\n <details class=\"accordion story-block\" id=\"story-${slugify(title)}\" open>\n <summary class=\"story-summary\">\n <span class=\"story-title\">${escapeHtml(title)}</span>\n <span class=\"story-meta-chip\">${runs.length} run${runs.length === 1 ? '' : 's'}</span>\n </summary>\n <div class=\"story-body\">\n <div class=\"story-meta-row\">\n <span><strong>Projects</strong> ${escapeHtml(runs.map((run) => run.project).join(', '))}</span>\n <span><strong>Environments</strong> ${escapeHtml(environments.join(', ') || 'n/a')}</span>\n <span><strong>Tags</strong> ${escapeHtml(tags.join(', ') || 'none')}</span>\n </div>\n ${checkpointBlocks || '<p class=\"empty-state\">No checkpoints captured for this story.</p>'}\n </div>\n </details>\n `;\n}\n\nfunction buildHtmlReport(runs: RunRecord[], outputDir: string, config: HtmlReporterConfig): string {\n const groupedRuns = groupByStory(runs);\n const storyTitles = [...groupedRuns.keys()].sort((a, b) => a.localeCompare(b));\n const projectOrder = Array.isArray(config.projectOrder)\n ? config.projectOrder.filter((value): value is string => typeof value === 'string')\n : DEFAULT_PROJECT_ORDER;\n const generatedAt = new Date().toISOString();\n const reportTitle = typeof config.title === 'string' && config.title.trim() ? config.title.trim() : 'Playwright Checkpoint Report';\n\n for (const title of storyTitles) {\n groupedRuns.get(title)?.sort((a, b) => sortByProjectAndTime(a, b, projectOrder));\n }\n\n const navLinks = storyTitles\n .map((title) => `<a href=\"#story-${slugify(title)}\">${escapeHtml(title)}</a>`)\n .join('');\n\n const storySections = storyTitles\n .map((title) => renderStorySection(title, groupedRuns.get(title) ?? [], outputDir))\n .join('');\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(reportTitle)}</title>\n <style>\n :root {\n color-scheme: dark;\n --bg: #0b1020;\n --panel: rgba(15, 23, 42, 0.88);\n --panel-2: rgba(17, 25, 40, 0.98);\n --text: #e5eefb;\n --muted: #9fb3c8;\n --accent: #60a5fa;\n --accent-2: #22d3ee;\n --border: rgba(148, 163, 184, 0.18);\n --success: #34d399;\n --warning: #fbbf24;\n --danger: #fb7185;\n --shadow: 0 24px 64px rgba(2, 6, 23, 0.45);\n }\n * { box-sizing: border-box; }\n html { scroll-behavior: smooth; }\n body {\n margin: 0;\n min-height: 100vh;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n background:\n radial-gradient(circle at top, rgba(96, 165, 250, 0.14), transparent 30%),\n linear-gradient(180deg, #07101f 0%, #0b1020 100%);\n color: var(--text);\n }\n a { color: inherit; }\n .page {\n width: min(1600px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 56px;\n }\n .hero {\n background: linear-gradient(180deg, rgba(15, 23, 42, 0.96), rgba(15, 23, 42, 0.84));\n border: 1px solid var(--border);\n border-radius: 24px;\n padding: 24px;\n box-shadow: var(--shadow);\n backdrop-filter: blur(18px);\n }\n .hero h1 {\n margin: 0;\n font-size: clamp(1.9rem, 2.6vw, 3rem);\n line-height: 1.1;\n }\n .hero p {\n margin: 10px 0 0;\n color: var(--muted);\n max-width: 72ch;\n line-height: 1.6;\n }\n .summary-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 12px;\n margin-top: 18px;\n }\n .summary-pill {\n display: inline-flex;\n gap: 8px;\n align-items: center;\n padding: 9px 12px;\n border: 1px solid var(--border);\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.72);\n color: var(--muted);\n font-size: 0.92rem;\n }\n .summary-pill strong { color: var(--text); }\n .toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n gap: 16px;\n margin-top: 18px;\n padding-top: 18px;\n border-top: 1px solid var(--border);\n }\n .story-nav {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n }\n .story-nav a,\n .toolbar button,\n .artifact {\n border: 1px solid var(--border);\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.7);\n color: var(--text);\n text-decoration: none;\n padding: 8px 12px;\n font: inherit;\n font-size: 0.86rem;\n transition: transform 140ms ease, border-color 140ms ease, background 140ms ease;\n }\n .toolbar button:hover,\n .story-nav a:hover,\n .artifact:hover {\n transform: translateY(-1px);\n border-color: rgba(96, 165, 250, 0.55);\n background: rgba(30, 41, 59, 0.96);\n cursor: pointer;\n }\n .content {\n display: grid;\n gap: 18px;\n margin-top: 22px;\n }\n .accordion {\n border: 1px solid var(--border);\n border-radius: 22px;\n background: var(--panel);\n box-shadow: var(--shadow);\n overflow: hidden;\n }\n .accordion summary {\n list-style: none;\n cursor: pointer;\n }\n .accordion summary::-webkit-details-marker { display: none; }\n .story-summary,\n .checkpoint-summary {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n }\n .story-summary {\n padding: 20px 22px;\n background: linear-gradient(180deg, rgba(15, 23, 42, 0.92), rgba(15, 23, 42, 0.74));\n }\n .story-title {\n font-size: 1.1rem;\n font-weight: 700;\n }\n .story-meta-chip,\n .checkpoint-meta {\n color: var(--muted);\n font-size: 0.84rem;\n white-space: nowrap;\n }\n .story-body {\n padding: 0 22px 22px;\n }\n .story-meta-row {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n color: var(--muted);\n font-size: 0.92rem;\n line-height: 1.5;\n margin: 4px 0 18px;\n }\n .story-meta-row strong { color: var(--text); margin-right: 6px; }\n .checkpoint-block {\n margin-top: 14px;\n border-radius: 18px;\n background: var(--panel-2);\n border: 1px solid rgba(148, 163, 184, 0.14);\n }\n .checkpoint-summary {\n padding: 16px 18px;\n font-weight: 600;\n background: rgba(15, 23, 42, 0.68);\n }\n .variant-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n gap: 14px;\n padding: 0 18px 18px;\n }\n .variant-card {\n display: grid;\n gap: 12px;\n border: 1px solid rgba(148, 163, 184, 0.14);\n border-radius: 18px;\n background: rgba(15, 23, 42, 0.72);\n padding: 16px;\n min-height: 100%;\n }\n .variant-card.missing {\n opacity: 0.72;\n border-style: dashed;\n }\n .variant-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 10px;\n }\n .variant-card-header h5 {\n margin: 0;\n font-size: 1rem;\n }\n .variant-card-header p,\n .variant-card-header time {\n margin: 4px 0 0;\n color: var(--muted);\n font-size: 0.83rem;\n }\n .page-meta {\n display: grid;\n gap: 4px;\n margin: 0;\n color: var(--muted);\n font-size: 0.9rem;\n }\n .page-url {\n overflow-wrap: anywhere;\n font-size: 0.82rem;\n }\n .thumbnail-link {\n position: relative;\n display: block;\n border-radius: 14px;\n overflow: hidden;\n border: 1px solid rgba(148, 163, 184, 0.18);\n background: rgba(2, 6, 23, 0.65);\n }\n .thumbnail-link img {\n display: block;\n width: 100%;\n aspect-ratio: 16 / 10;\n object-fit: cover;\n }\n .highlight-overlay {\n position: absolute;\n border: 2px solid var(--danger);\n border-radius: 12px;\n background: rgba(251, 113, 133, 0.08);\n box-shadow: 0 0 0 999px rgba(251, 113, 133, 0.02);\n pointer-events: none;\n }\n .highlight-label {\n position: absolute;\n left: 12px;\n bottom: 12px;\n max-width: calc(100% - 24px);\n padding: 6px 9px;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.9);\n border: 1px solid rgba(251, 113, 133, 0.35);\n color: #ffe4e6;\n font-size: 0.74rem;\n line-height: 1.3;\n overflow-wrap: anywhere;\n }\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 10px;\n }\n .stats-grid span {\n display: grid;\n gap: 6px;\n padding: 10px 12px;\n border-radius: 14px;\n background: rgba(2, 6, 23, 0.42);\n border: 1px solid rgba(148, 163, 184, 0.12);\n }\n .stats-grid strong {\n font-size: 1.15rem;\n line-height: 1;\n }\n .stats-grid small {\n color: var(--muted);\n font-size: 0.76rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n .artifact-list {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n .artifact.disabled {\n opacity: 0.45;\n pointer-events: none;\n }\n .empty-state,\n .empty-card {\n margin: 0;\n color: var(--muted);\n padding: 12px;\n border: 1px dashed rgba(148, 163, 184, 0.2);\n border-radius: 14px;\n background: rgba(2, 6, 23, 0.24);\n }\n @media (max-width: 720px) {\n .page {\n width: min(100vw - 20px, 1600px);\n padding-top: 18px;\n }\n .hero,\n .story-summary,\n .story-body,\n .checkpoint-summary,\n .variant-grid {\n padding-left: 16px;\n padding-right: 16px;\n }\n .variant-card-header,\n .story-summary,\n .checkpoint-summary,\n .toolbar {\n flex-direction: column;\n align-items: flex-start;\n }\n .stats-grid {\n grid-template-columns: 1fr;\n }\n }\n </style>\n</head>\n<body>\n <main class=\"page\">\n <section class=\"hero\">\n <h1>${escapeHtml(reportTitle)}</h1>\n <p>Explore checkpoint runs by story, inspect every project variant side-by-side, and jump directly to screenshots and generated artifacts.</p>\n <div class=\"summary-bar\">\n <span class=\"summary-pill\"><strong>Generated</strong> ${escapeHtml(formatDateTime(generatedAt))}</span>\n <span class=\"summary-pill\"><strong>Stories</strong> ${storyTitles.length}</span>\n <span class=\"summary-pill\"><strong>Runs</strong> ${runs.length}</span>\n <span class=\"summary-pill\"><strong>Output</strong> ${escapeHtml(outputDir)}</span>\n </div>\n <div class=\"toolbar\">\n <nav class=\"story-nav\">${navLinks || '<span class=\"summary-pill\">No stories found</span>'}</nav>\n <div class=\"toolbar-actions\">\n <button type=\"button\" data-action=\"expand-all\">Expand all</button>\n <button type=\"button\" data-action=\"collapse-all\">Collapse all</button>\n </div>\n </div>\n </section>\n <section class=\"content\">\n ${storySections || '<p class=\"empty-state\">No checkpoint manifests found.</p>'}\n </section>\n </main>\n <script>\n (() => {\n const details = Array.from(document.querySelectorAll('details.accordion'));\n const setAll = (open) => {\n details.forEach((entry) => {\n entry.open = open;\n });\n };\n document.querySelector('[data-action=\"expand-all\"]')?.addEventListener('click', () => setAll(true));\n document.querySelector('[data-action=\"collapse-all\"]')?.addEventListener('click', () => setAll(false));\n const revealHash = () => {\n if (!window.location.hash) {\n return;\n }\n const target = document.querySelector(window.location.hash);\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const parentDetails = target.closest('details');\n if (parentDetails instanceof HTMLDetailsElement) {\n parentDetails.open = true;\n }\n target.scrollIntoView({ block: 'start', behavior: 'smooth' });\n };\n window.addEventListener('hashchange', revealHash);\n revealHash();\n })();\n </script>\n</body>\n</html>\n`;\n}\n\nexport const htmlReporter: ReportGenerator = {\n name: 'html',\n description: 'Responsive HTML report for checkpoint manifests.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const outputFile = path.join(context.outputDir, 'index.html');\n const html = buildHtmlReport(context.runs, context.outputDir, context.config as HtmlReporterConfig);\n\n await fs.mkdir(context.outputDir, { recursive: true });\n await fs.writeFile(outputFile, html, 'utf8');\n\n const storyCount = new Set(context.runs.map((run) => run.title)).size;\n\n return {\n files: [outputFile],\n summary: `Generated HTML report for ${storyCount} stor${storyCount === 1 ? 'y' : 'ies'} (${context.runs.length} run${context.runs.length === 1 ? '' : 's'}).`,\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory } from './story-utils';\n\ntype MarkdownReporterConfig = {\n storiesDir?: string;\n screenshotsDir?: string;\n includeTags?: string[];\n preferredProject?: string;\n header?: string;\n footer?: string;\n frontmatter?: boolean | Record<string, unknown>;\n imagePathPrefix?: string;\n copyScreenshots?: boolean;\n};\n\ntype MarkdownStep = {\n checkpoint: CheckpointRecord;\n order: number;\n heading: string;\n description: string;\n imagePath: string | null;\n urlLabel: string;\n breadcrumbLabel: string | null;\n focusNote: string | null;\n};\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction stripTags(value: string): string {\n const stripped = value.replace(/\\s+@[a-z0-9-]+/gi, ' ').replace(/\\s+/g, ' ').trim();\n return stripped || value.trim() || 'Untitled story';\n}\n\nfunction normalizeConfig(config: Record<string, unknown>): MarkdownReporterConfig {\n return {\n storiesDir: typeof config.storiesDir === 'string' ? config.storiesDir : '.',\n screenshotsDir: typeof config.screenshotsDir === 'string' ? config.screenshotsDir : 'screenshots',\n includeTags: Array.isArray(config.includeTags)\n ? config.includeTags.filter((value): value is string => typeof value === 'string')\n : undefined,\n preferredProject: typeof config.preferredProject === 'string' ? config.preferredProject : undefined,\n header: typeof config.header === 'string' ? config.header : undefined,\n footer: typeof config.footer === 'string' ? config.footer : undefined,\n frontmatter:\n config.frontmatter === true ||\n config.frontmatter === false ||\n (config.frontmatter != null && typeof config.frontmatter === 'object' && !Array.isArray(config.frontmatter))\n ? (config.frontmatter as MarkdownReporterConfig['frontmatter'])\n : false,\n imagePathPrefix: typeof config.imagePathPrefix === 'string' ? config.imagePathPrefix : undefined,\n copyScreenshots: typeof config.copyScreenshots === 'boolean' ? config.copyScreenshots : true,\n };\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n return (tags ?? []).map((tag) => tag.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction shouldIncludeRun(run: RunRecord, config: MarkdownReporterConfig): boolean {\n const includeTags = normalizeTags(config.includeTags);\n if (includeTags.length > 0) {\n const runTags = new Set(normalizeTags(run.tags));\n return includeTags.some((tag) => runTags.has(tag));\n }\n\n return run.checkpoints.some((checkpoint) => {\n const hasDescription = typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0;\n return hasDescription || typeof checkpoint.step === 'number';\n });\n}\n\nfunction choosePrimaryRun(runs: RunRecord[], preferredProject?: string): RunRecord | null {\n if (runs.length === 0) {\n return null;\n }\n\n return [...runs].sort((left, right) => {\n const leftPreferred = preferredProject && left.project === preferredProject ? 0 : 1;\n const rightPreferred = preferredProject && right.project === preferredProject ? 0 : 1;\n if (leftPreferred !== rightPreferred) {\n return leftPreferred - rightPreferred;\n }\n\n const rightTime = new Date(right.startedAt).getTime();\n const leftTime = new Date(left.startedAt).getTime();\n if (rightTime !== leftTime) {\n return rightTime - leftTime;\n }\n\n return left.project.localeCompare(right.project);\n })[0] ?? null;\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction screenshotSourcePath(run: RunRecord, checkpoint: CheckpointRecord): string | null {\n const artifacts = checkpoint.collectors.screenshot?.artifacts ?? [];\n const artifact = artifacts.find((entry) => entry.name === 'screenshot') ?? artifacts[0];\n return artifact?.path ? resolveArtifactPath(run, artifact.path) : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction focusNote(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const selector = typeof data?.highlightSelector === 'string' ? data.highlightSelector.trim() : '';\n if (selector) {\n return `Focus: \\`${selector}\\``;\n }\n\n const bounds = data?.highlightBounds;\n if (\n bounds &&\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n ) {\n return 'Focus: highlighted UI element.';\n }\n\n return null;\n}\n\nfunction urlLabel(url: string): string {\n try {\n const parsed = new URL(url);\n const value = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return value || '/';\n } catch {\n return url || '/';\n }\n}\n\nfunction breadcrumbLabel(url: string): string | null {\n const label = urlLabel(url);\n if (!label.startsWith('/')) {\n return null;\n }\n\n const [withoutQuery = label] = label.split('?');\n const [withoutHash = withoutQuery] = withoutQuery.split('#');\n\n const segments = withoutHash\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .map((segment) => decodeURIComponent(segment).replace(/[-_]+/g, ' '));\n\n return segments.length > 0 ? segments.join(' › ') : 'home';\n}\n\nfunction autoDescription(checkpoint: CheckpointRecord): string {\n const pageTitle = checkpoint.title.trim();\n const location = urlLabel(checkpoint.url);\n\n if (pageTitle) {\n return `This step captures **${pageTitle}** at \\`${location}\\`.`;\n }\n\n return `This step captures **${checkpoint.name}** at \\`${location}\\`.`;\n}\n\nfunction markdownRelativePath(fromFile: string, toFile: string): string {\n const relativePath = path.relative(path.dirname(fromFile), toFile).split(path.sep).join('/');\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n\nfunction rewriteImagePath(markdownFile: string, imageFile: string, outputDir: string, prefix?: string): string {\n const relativePath = path.relative(outputDir, imageFile).split(path.sep).join('/');\n if (prefix) {\n return `${prefix.replace(/\\/+$/g, '')}/${relativePath.replace(/^\\/+/, '')}`;\n }\n\n return markdownRelativePath(markdownFile, imageFile);\n}\n\nfunction yamlScalar(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction serializeFrontmatter(fields: Record<string, unknown>): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n lines.push(`${key}:`);\n if (value.length === 0) {\n lines.push(' []');\n continue;\n }\n\n for (const item of value) {\n lines.push(` - ${yamlScalar(item)}`);\n }\n continue;\n }\n\n lines.push(`${key}: ${yamlScalar(value)}`);\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nasync function materializeScreenshot(args: {\n run: RunRecord;\n checkpoint: CheckpointRecord;\n storySlug: string;\n stepOrder: number;\n outputDir: string;\n markdownFile: string;\n config: MarkdownReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<string | null> {\n const sourcePath = screenshotSourcePath(args.run, args.checkpoint);\n if (!sourcePath) {\n return null;\n }\n\n const extension = path.extname(sourcePath) || '.png';\n const targetPath = path.join(\n args.outputDir,\n args.config.screenshotsDir ?? 'screenshots',\n args.storySlug,\n `${String(args.stepOrder).padStart(2, '0')}-${slugify(args.checkpoint.name)}${extension}`,\n );\n\n try {\n if (args.config.copyScreenshots !== false) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourcePath, targetPath);\n args.writtenFiles.add(targetPath);\n return rewriteImagePath(args.markdownFile, targetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n return rewriteImagePath(args.markdownFile, sourcePath, args.outputDir, args.config.imagePathPrefix);\n } catch {\n return null;\n }\n}\n\nfunction orderedCheckpoints(checkpoints: CheckpointRecord[]): CheckpointRecord[] {\n return [...checkpoints].sort((left, right) => {\n const leftOrder = typeof left.step === 'number' ? left.step : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.step === 'number' ? right.step : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return checkpoints.indexOf(left) - checkpoints.indexOf(right);\n });\n}\n\nasync function buildSteps(args: {\n run: RunRecord;\n storySlug: string;\n outputDir: string;\n markdownFile: string;\n config: MarkdownReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<MarkdownStep[]> {\n const checkpoints = orderedCheckpoints(args.run.checkpoints);\n const steps: MarkdownStep[] = [];\n\n for (const [index, checkpoint] of checkpoints.entries()) {\n const order = typeof checkpoint.step === 'number' ? checkpoint.step : index + 1;\n steps.push({\n checkpoint,\n order,\n heading: checkpoint.name,\n description:\n typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0\n ? checkpoint.description.trim()\n : autoDescription(checkpoint),\n imagePath: await materializeScreenshot({\n run: args.run,\n checkpoint,\n storySlug: args.storySlug,\n stepOrder: order,\n outputDir: args.outputDir,\n markdownFile: args.markdownFile,\n config: args.config,\n writtenFiles: args.writtenFiles,\n }),\n urlLabel: urlLabel(checkpoint.url),\n breadcrumbLabel: breadcrumbLabel(checkpoint.url),\n focusNote: focusNote(checkpoint),\n });\n }\n\n return steps;\n}\n\nfunction renderMarkdown(args: {\n title: string;\n steps: MarkdownStep[];\n run: RunRecord;\n config: MarkdownReporterConfig;\n generatedAt: string;\n}): string {\n const frontmatterFields =\n args.config.frontmatter === true || typeof args.config.frontmatter === 'object'\n ? {\n title: args.title,\n project: args.run.project,\n testId: args.run.testId,\n tags: args.run.tags,\n startedAt: args.run.startedAt,\n generatedAt: args.generatedAt,\n ...(args.config.frontmatter && typeof args.config.frontmatter === 'object' ? args.config.frontmatter : {}),\n }\n : null;\n\n const sections = args.steps\n .map((step) => {\n const lines = [`## Step ${step.order}: ${step.heading}`, ''];\n\n if (step.imagePath) {\n lines.push(``, '');\n }\n\n lines.push(`**URL:** \\`${step.urlLabel}\\``);\n if (step.breadcrumbLabel) {\n lines.push('', `**Breadcrumb:** ${step.breadcrumbLabel}`);\n }\n\n if (step.focusNote) {\n lines.push('', `> ${step.focusNote}`);\n }\n\n lines.push('', step.description);\n\n return lines.join('\\n');\n })\n .join('\\n\\n');\n\n const parts = [\n frontmatterFields ? serializeFrontmatter(frontmatterFields) : '',\n `# ${args.title}`,\n args.config.header ? args.config.header.trim() : '',\n sections,\n args.config.footer ? args.config.footer.trim() : '',\n ].filter((value) => value.trim().length > 0);\n\n return `${parts.join('\\n\\n')}\\n`;\n}\n\nexport const markdownReporter: ReportGenerator = {\n name: 'markdown',\n description: 'Generates one Markdown help article per captured story.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const config = normalizeConfig(context.config);\n const stories = groupByStory(context.runs);\n const generatedAt = new Date().toISOString();\n const writtenFiles = new Set<string>();\n let articleCount = 0;\n\n for (const [storyTitle, runs] of stories) {\n const primaryRun = choosePrimaryRun(runs, config.preferredProject);\n if (!primaryRun || !shouldIncludeRun(primaryRun, config)) {\n continue;\n }\n\n const title = stripTags(storyTitle);\n const storySlug = slugify(title);\n const markdownFile = path.join(context.outputDir, config.storiesDir ?? '.', `${storySlug}.md`);\n const steps = await buildSteps({\n run: primaryRun,\n storySlug,\n outputDir: context.outputDir,\n markdownFile,\n config,\n writtenFiles,\n });\n\n await fs.mkdir(path.dirname(markdownFile), { recursive: true });\n await fs.writeFile(\n markdownFile,\n renderMarkdown({\n title,\n steps,\n run: primaryRun,\n config,\n generatedAt,\n }),\n 'utf8',\n );\n\n writtenFiles.add(markdownFile);\n articleCount += 1;\n }\n\n return {\n files: [...writtenFiles],\n summary: `Generated ${articleCount} Markdown article${articleCount === 1 ? '' : 's'}.`,\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointRecord, ReportGenerator, RunRecord, ScreenshotCollectorData } from '../types';\nimport { groupByStory } from './story-utils';\n\ntype MdxReporterConfig = {\n storiesDir?: string;\n screenshotsDir?: string;\n includeTags?: string[];\n preferredProject?: string;\n imagePathPrefix?: string;\n copyScreenshots?: boolean;\n componentImportPath?: string;\n};\n\ntype MdxVariant = {\n project: string;\n projectLabel: string;\n imagePath: string | null;\n imageAlt: string;\n};\n\ntype MdxStep = {\n checkpoint: CheckpointRecord;\n order: number;\n title: string;\n description: string;\n focusNote: string | null;\n variants: MdxVariant[];\n};\n\nconst DEFAULT_PROJECT_ORDER = ['desktop-light', 'desktop-dark', 'mobile-light', 'mobile-dark'];\n\nfunction slugify(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'story'\n );\n}\n\nfunction stripTags(value: string): string {\n const stripped = value.replace(/\\s+@[a-z0-9-]+/gi, ' ').replace(/\\s+/g, ' ').trim();\n return stripped || value.trim() || 'Untitled story';\n}\n\nfunction normalizeConfig(config: Record<string, unknown>): MdxReporterConfig {\n return {\n storiesDir: typeof config.storiesDir === 'string' ? config.storiesDir : '.',\n screenshotsDir: typeof config.screenshotsDir === 'string' ? config.screenshotsDir : 'screenshots',\n includeTags: Array.isArray(config.includeTags)\n ? config.includeTags.filter((value): value is string => typeof value === 'string')\n : undefined,\n preferredProject: typeof config.preferredProject === 'string' ? config.preferredProject : undefined,\n imagePathPrefix: typeof config.imagePathPrefix === 'string' ? config.imagePathPrefix : undefined,\n copyScreenshots: typeof config.copyScreenshots === 'boolean' ? config.copyScreenshots : true,\n componentImportPath:\n typeof config.componentImportPath === 'string' ? config.componentImportPath : 'playwright-checkpoint/components',\n };\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n return (tags ?? []).map((tag) => tag.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction frontmatterTags(tags: string[]): string[] {\n return normalizeTags(tags).map((tag) => tag.replace(/^@+/, '')).filter(Boolean);\n}\n\nfunction shouldIncludeRun(run: RunRecord, config: MdxReporterConfig): boolean {\n const includeTags = normalizeTags(config.includeTags);\n if (includeTags.length > 0) {\n const runTags = new Set(normalizeTags(run.tags));\n return includeTags.some((tag) => runTags.has(tag));\n }\n\n return run.checkpoints.some((checkpoint) => {\n const hasDescription = typeof checkpoint.description === 'string' && checkpoint.description.trim().length > 0;\n return hasDescription || typeof checkpoint.step === 'number';\n });\n}\n\nfunction choosePrimaryRun(runs: RunRecord[], preferredProject?: string): RunRecord | null {\n if (runs.length === 0) {\n return null;\n }\n\n return [...runs].sort((left, right) => {\n const leftPreferred = preferredProject && left.project === preferredProject ? 0 : 1;\n const rightPreferred = preferredProject && right.project === preferredProject ? 0 : 1;\n if (leftPreferred !== rightPreferred) {\n return leftPreferred - rightPreferred;\n }\n\n const rightTime = new Date(right.startedAt).getTime();\n const leftTime = new Date(left.startedAt).getTime();\n if (rightTime !== leftTime) {\n return rightTime - leftTime;\n }\n\n return left.project.localeCompare(right.project);\n })[0] ?? null;\n}\n\nfunction orderedCheckpoints(checkpoints: CheckpointRecord[]): CheckpointRecord[] {\n return [...checkpoints].sort((left, right) => {\n const leftOrder = typeof left.step === 'number' ? left.step : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.step === 'number' ? right.step : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return checkpoints.indexOf(left) - checkpoints.indexOf(right);\n });\n}\n\nfunction resolveArtifactPath(run: RunRecord, artifactPath: string): string {\n return path.isAbsolute(artifactPath) ? artifactPath : path.resolve(path.dirname(run.sourceManifestPath), artifactPath);\n}\n\nfunction screenshotSourcePath(run: RunRecord, checkpoint: CheckpointRecord): string | null {\n const artifacts = checkpoint.collectors.screenshot?.artifacts ?? [];\n const artifact = artifacts.find((entry) => entry.name === 'screenshot') ?? artifacts[0];\n return artifact?.path ? resolveArtifactPath(run, artifact.path) : null;\n}\n\nfunction screenshotData(checkpoint: CheckpointRecord): Partial<ScreenshotCollectorData> | null {\n const data = checkpoint.collectors.screenshot?.data;\n return data && typeof data === 'object' ? (data as Partial<ScreenshotCollectorData>) : null;\n}\n\nfunction focusNote(checkpoint: CheckpointRecord): string | null {\n const data = screenshotData(checkpoint);\n const selector = typeof data?.highlightSelector === 'string' ? data.highlightSelector.trim() : '';\n if (selector) {\n return `Focus: \\`${selector}\\``;\n }\n\n const bounds = data?.highlightBounds;\n if (\n bounds &&\n typeof bounds.x === 'number' &&\n typeof bounds.y === 'number' &&\n typeof bounds.width === 'number' &&\n typeof bounds.height === 'number'\n ) {\n return 'Focus: highlighted UI element.';\n }\n\n return null;\n}\n\nfunction urlLabel(url: string): string {\n try {\n const parsed = new URL(url);\n const value = `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return value || '/';\n } catch {\n return url || '/';\n }\n}\n\nfunction autoDescription(checkpoint: CheckpointRecord): string {\n const pageTitle = checkpoint.title.trim();\n const location = urlLabel(checkpoint.url);\n\n if (pageTitle) {\n return `This step captures **${pageTitle}** at \\`${location}\\`.`;\n }\n\n return `This step captures **${checkpoint.name}** at \\`${location}\\`.`;\n}\n\nfunction markdownRelativePath(fromFile: string, toFile: string): string {\n const relativePath = path.relative(path.dirname(fromFile), toFile).split(path.sep).join('/');\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n\nfunction rewriteImagePath(mdxFile: string, imageFile: string, outputDir: string, prefix?: string): string {\n const relativePath = path.relative(outputDir, imageFile).split(path.sep).join('/');\n if (prefix) {\n return `${prefix.replace(/\\/+$/g, '')}/${relativePath.replace(/^\\/+/, '')}`;\n }\n\n return markdownRelativePath(mdxFile, imageFile);\n}\n\nfunction yamlScalar(value: unknown): string {\n return JSON.stringify(value);\n}\n\nfunction serializeFrontmatter(fields: Record<string, unknown>): string {\n const lines = ['---'];\n\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n lines.push(`${key}:`);\n if (value.length === 0) {\n lines.push(' []');\n continue;\n }\n\n for (const item of value) {\n lines.push(` - ${yamlScalar(item)}`);\n }\n continue;\n }\n\n lines.push(`${key}: ${yamlScalar(value)}`);\n }\n\n lines.push('---', '');\n return lines.join('\\n');\n}\n\nfunction quoteJsx(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction projectWeight(projectName: string): number {\n const index = DEFAULT_PROJECT_ORDER.indexOf(projectName);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction formatProjectLabel(projectName: string): string {\n const [device, mode] = projectName.split('-');\n if (!device || !mode) {\n return projectName;\n }\n\n const deviceLabel = device === 'desktop' ? 'Desktop' : device === 'mobile' ? 'Mobile' : device;\n const modeLabel = mode === 'light' ? 'Light' : mode === 'dark' ? 'Dark' : mode;\n return `${deviceLabel} / ${modeLabel}`;\n}\n\nfunction sortRunsForVariants(runs: RunRecord[]): RunRecord[] {\n return [...runs].sort((left, right) => {\n const byWeight = projectWeight(left.project) - projectWeight(right.project);\n if (byWeight !== 0) {\n return byWeight;\n }\n\n return left.project.localeCompare(right.project);\n });\n}\n\nfunction findMatchingCheckpoint(run: RunRecord, baseCheckpoint: CheckpointRecord, fallbackIndex: number): CheckpointRecord | null {\n const checkpoints = orderedCheckpoints(run.checkpoints);\n\n if (typeof baseCheckpoint.step === 'number') {\n const byStep = checkpoints.find((entry) => entry.step === baseCheckpoint.step);\n if (byStep) {\n return byStep;\n }\n }\n\n const byName = checkpoints.find((entry) => entry.name === baseCheckpoint.name);\n if (byName) {\n return byName;\n }\n\n return checkpoints[fallbackIndex] ?? null;\n}\n\nasync function materializeScreenshot(args: {\n run: RunRecord;\n checkpoint: CheckpointRecord;\n storySlug: string;\n stepOrder: number;\n outputDir: string;\n mdxFile: string;\n config: MdxReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<string | null> {\n const sourcePath = screenshotSourcePath(args.run, args.checkpoint);\n if (!sourcePath) {\n return null;\n }\n\n const extension = path.extname(sourcePath) || '.png';\n const targetPath = path.join(\n args.outputDir,\n args.config.screenshotsDir ?? 'screenshots',\n args.storySlug,\n `${String(args.stepOrder).padStart(2, '0')}-${slugify(args.run.project)}-${slugify(args.checkpoint.name)}${extension}`,\n );\n\n try {\n if (args.config.copyScreenshots !== false) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(sourcePath, targetPath);\n args.writtenFiles.add(targetPath);\n return rewriteImagePath(args.mdxFile, targetPath, args.outputDir, args.config.imagePathPrefix);\n }\n\n return rewriteImagePath(args.mdxFile, sourcePath, args.outputDir, args.config.imagePathPrefix);\n } catch {\n return null;\n }\n}\n\nasync function buildSteps(args: {\n runs: RunRecord[];\n primaryRun: RunRecord;\n storySlug: string;\n outputDir: string;\n mdxFile: string;\n config: MdxReporterConfig;\n writtenFiles: Set<string>;\n}): Promise<MdxStep[]> {\n const baseCheckpoints = orderedCheckpoints(args.primaryRun.checkpoints);\n const sortedRuns = sortRunsForVariants(args.runs);\n const steps: MdxStep[] = [];\n\n for (const [index, checkpoint] of baseCheckpoints.entries()) {\n const order = typeof checkpoint.step === 'number' ? checkpoint.step : index + 1;\n const variants: MdxVariant[] = [];\n const matchedCheckpoints: CheckpointRecord[] = [];\n\n for (const run of sortedRuns) {\n const variantCheckpoint = findMatchingCheckpoint(run, checkpoint, index);\n if (!variantCheckpoint) {\n continue;\n }\n\n matchedCheckpoints.push(variantCheckpoint);\n variants.push({\n project: run.project,\n projectLabel: formatProjectLabel(run.project),\n imagePath: await materializeScreenshot({\n run,\n checkpoint: variantCheckpoint,\n storySlug: args.storySlug,\n stepOrder: order,\n outputDir: args.outputDir,\n mdxFile: args.mdxFile,\n config: args.config,\n writtenFiles: args.writtenFiles,\n }),\n imageAlt: variantCheckpoint.title || `${checkpoint.name} (${formatProjectLabel(run.project)})`,\n });\n }\n\n const descriptionSource = matchedCheckpoints.find(\n (entry) => typeof entry.description === 'string' && entry.description.trim().length > 0,\n ) ?? checkpoint;\n const stepFocus = matchedCheckpoints.map((entry) => focusNote(entry)).find((value): value is string => Boolean(value)) ?? null;\n\n steps.push({\n checkpoint,\n order,\n title: checkpoint.name,\n description:\n typeof descriptionSource.description === 'string' && descriptionSource.description.trim().length > 0\n ? descriptionSource.description.trim()\n : autoDescription(descriptionSource),\n focusNote: stepFocus,\n variants,\n });\n }\n\n return steps;\n}\n\nfunction renderVariantTabs(variants: MdxVariant[]): string {\n if (variants.length === 0) {\n return '';\n }\n\n if (variants.length === 1) {\n const [variant] = variants;\n if (!variant?.imagePath) {\n return '';\n }\n\n return `<Screenshot src={${quoteJsx(variant.imagePath)}} alt={${quoteJsx(variant.imageAlt)}} />`;\n }\n\n const tabs = variants\n .map((variant) => {\n const lines = [` <DeviceTab label={${quoteJsx(variant.projectLabel)}}>`];\n if (variant.imagePath) {\n lines.push(` <Screenshot src={${quoteJsx(variant.imagePath)}} alt={${quoteJsx(variant.imageAlt)}} />`);\n } else {\n lines.push(` <p>No screenshot captured for ${variant.projectLabel}.</p>`);\n }\n lines.push(' </DeviceTab>');\n return lines.join('\\n');\n })\n .join('\\n');\n\n return `<DeviceTabs>\\n${tabs}\\n</DeviceTabs>`;\n}\n\nfunction renderStep(step: MdxStep): string {\n const lines = [` <Step number={${step.order}} title={${quoteJsx(step.title)}}>`];\n const variantBlock = renderVariantTabs(step.variants);\n if (variantBlock) {\n lines.push(` ${variantBlock.replace(/\\n/g, '\\n ')}`, '');\n }\n\n if (step.focusNote) {\n lines.push(` ${step.focusNote}`, '');\n }\n\n lines.push(` ${step.description}`, ' </Step>');\n return lines.join('\\n');\n}\n\nfunction renderMdx(args: {\n title: string;\n steps: MdxStep[];\n runs: RunRecord[];\n config: MdxReporterConfig;\n generatedAt: string;\n}): string {\n const importNames = new Set(['Screenshot', 'StepList', 'Step']);\n if (args.steps.some((step) => step.variants.length > 1)) {\n importNames.add('DeviceTabs');\n importNames.add('DeviceTab');\n }\n\n const frontmatter = serializeFrontmatter({\n title: args.title,\n tags: frontmatterTags([...new Set(args.runs.flatMap((run) => run.tags))]),\n generatedAt: args.generatedAt,\n projects: [...new Set(args.runs.map((run) => run.project))],\n });\n\n const stepBlocks = args.steps.map(renderStep).join('\\n\\n');\n\n return `${frontmatter}import { ${[...importNames].join(', ')} } from '${args.config.componentImportPath}';\\n\\n<StepList>\\n${stepBlocks}\\n</StepList>\\n`;\n}\n\nexport const mdxReporter: ReportGenerator = {\n name: 'mdx',\n description: 'Generates one MDX help article per captured story.',\n\n validateConfig(config): boolean {\n return config != null && typeof config === 'object' && !Array.isArray(config);\n },\n\n async generate(context) {\n const config = normalizeConfig(context.config);\n const stories = groupByStory(context.runs);\n const generatedAt = new Date().toISOString();\n const writtenFiles = new Set<string>();\n let articleCount = 0;\n\n for (const [storyTitle, runs] of stories) {\n const primaryRun = choosePrimaryRun(runs, config.preferredProject);\n if (!primaryRun || !shouldIncludeRun(primaryRun, config)) {\n continue;\n }\n\n const title = stripTags(storyTitle);\n const storySlug = slugify(title);\n const mdxFile = path.join(context.outputDir, config.storiesDir ?? '.', `${storySlug}.mdx`);\n const steps = await buildSteps({\n runs,\n primaryRun,\n storySlug,\n outputDir: context.outputDir,\n mdxFile,\n config,\n writtenFiles,\n });\n\n await fs.mkdir(path.dirname(mdxFile), { recursive: true });\n await fs.writeFile(\n mdxFile,\n renderMdx({\n title,\n steps,\n runs,\n config,\n generatedAt,\n }),\n 'utf8',\n );\n\n writtenFiles.add(mdxFile);\n articleCount += 1;\n }\n\n return {\n files: [...writtenFiles],\n summary: `Generated ${articleCount} MDX article${articleCount === 1 ? '' : 's'}.`,\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointConfig,\n CheckpointManifest,\n ReportGenerationResults,\n ReportGenerator,\n ReporterConfig,\n RunRecord,\n} from '../types';\nimport { htmlReporter } from './html-reporter';\nimport { markdownReporter } from './markdown-reporter';\nimport { mdxReporter } from './mdx-reporter';\nexport { groupByStory, orderedCheckpointNames } from './story-utils';\n\nconst builtinReporters = new Map<string, ReportGenerator>();\nconst builtinReporterDefaults: Partial<Record<string, ReporterConfig>> = {\n html: true,\n markdown: false,\n mdx: false,\n};\n\nasync function walkFiles(directory: string): Promise<string[]> {\n const dirents = await fs.readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const dirent of dirents) {\n const absolutePath = path.join(directory, dirent.name);\n if (dirent.isDirectory()) {\n files.push(...(await walkFiles(absolutePath)));\n continue;\n }\n if (dirent.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nfunction isCheckpointManifestFile(filePath: string): boolean {\n const fileName = path.basename(filePath);\n return fileName === 'checkpoint-manifest.json' || (fileName.startsWith('checkpoint-manifest-') && fileName.endsWith('.json'));\n}\n\nfunction isCheckpointManifest(value: unknown): value is CheckpointManifest {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const manifest = value as Partial<CheckpointManifest>;\n return (\n typeof manifest.project === 'string' &&\n typeof manifest.testId === 'string' &&\n typeof manifest.title === 'string' &&\n typeof manifest.startedAt === 'string' &&\n Array.isArray(manifest.tags) &&\n Array.isArray(manifest.checkpoints)\n );\n}\n\nfunction toRunRecord(manifest: CheckpointManifest, sourceManifestPath: string): RunRecord {\n return {\n key: `${manifest.testId}|${manifest.project}|${manifest.startedAt}`,\n sourceManifestPath,\n environment: manifest.environment || 'unknown',\n project: manifest.project,\n testId: manifest.testId,\n title: manifest.title,\n tags: manifest.tags,\n startedAt: manifest.startedAt,\n checkpoints: manifest.checkpoints,\n };\n}\n\nfunction toManifest(run: RunRecord): CheckpointManifest {\n return {\n environment: run.environment,\n project: run.project,\n testId: run.testId,\n title: run.title,\n tags: run.tags,\n startedAt: run.startedAt,\n checkpoints: run.checkpoints,\n };\n}\n\nfunction normalizeReporterConfig(config: ReporterConfig | undefined): Record<string, unknown> | null {\n if (config == null || config === false) {\n return null;\n }\n\n if (config === true) {\n return {};\n }\n\n return { ...config };\n}\n\nexport function registerBuiltinReporter(reporter: ReportGenerator): void {\n builtinReporters.set(reporter.name, reporter);\n}\n\nexport function dedupeRuns(runs: RunRecord[]): RunRecord[] {\n const map = new Map<string, RunRecord>();\n\n for (const run of runs) {\n const existing = map.get(run.key);\n if (!existing) {\n map.set(run.key, run);\n continue;\n }\n\n const existingTime = new Date(existing.startedAt).getTime();\n const currentTime = new Date(run.startedAt).getTime();\n if (currentTime >= existingTime) {\n map.set(run.key, run);\n }\n }\n\n return [...map.values()];\n}\n\nexport async function loadRuns(testResultsDir: string): Promise<RunRecord[]> {\n let manifestFiles: string[];\n try {\n manifestFiles = (await walkFiles(testResultsDir)).filter(isCheckpointManifestFile);\n } catch {\n return [];\n }\n\n const runs: RunRecord[] = [];\n for (const manifestPath of manifestFiles) {\n let rawManifest: unknown;\n try {\n rawManifest = JSON.parse(await fs.readFile(manifestPath, 'utf8'));\n } catch {\n continue;\n }\n\n if (!isCheckpointManifest(rawManifest)) {\n continue;\n }\n\n runs.push(toRunRecord(rawManifest, manifestPath));\n }\n\n return dedupeRuns(runs);\n}\n\nexport async function runReporters(\n config: CheckpointConfig,\n testResultsDir: string,\n outputDir: string,\n): Promise<ReportGenerationResults> {\n const runs = await loadRuns(testResultsDir);\n const manifests = runs.map(toManifest);\n const results: ReportGenerationResults = {};\n const reporterConfigMap: Partial<Record<string, ReporterConfig>> = {\n ...builtinReporterDefaults,\n ...(config.reporters ?? {}),\n };\n\n for (const [name, value] of Object.entries(reporterConfigMap)) {\n const reporterConfig = normalizeReporterConfig(value);\n if (!reporterConfig) {\n continue;\n }\n\n const reporter = builtinReporters.get(name);\n if (!reporter) {\n throw new Error(`Reporter \"${name}\" is enabled but no implementation is registered.`);\n }\n\n if (reporter.validateConfig && !reporter.validateConfig(reporterConfig)) {\n throw new Error(`Reporter \"${name}\" received invalid configuration.`);\n }\n\n results[name] = await reporter.generate({\n runs,\n outputDir,\n config: reporterConfig,\n manifests,\n });\n }\n\n return results;\n}\n\nregisterBuiltinReporter(htmlReporter);\nregisterBuiltinReporter(markdownReporter);\nregisterBuiltinReporter(mdxReporter);\n\nexport { annotateScreenshot } from './annotate';\nexport { htmlReporter, markdownReporter, mdxReporter };\nexport type { ReportGenerator } from '../types';\n","/**\n * Minimal MCP stdio transport — inlined from @modelcontextprotocol/sdk/shared/stdio\n * to avoid SDK subpath resolution issues. This matches the SDK's protocol exactly.\n */\n\nimport type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types';\n\nfunction serializeMessage(message: JSONRPCMessage): string {\n return JSON.stringify(message) + '\\n';\n}\n\nclass ReadBuffer {\n private _buffer?: Buffer;\n\n append(chunk: Buffer): void {\n this._buffer = this._buffer ? Buffer.concat([this._buffer, chunk]) : chunk;\n }\n\n readMessage(): JSONRPCMessage | null {\n if (!this._buffer) return null;\n const index = this._buffer.indexOf('\\n');\n if (index === -1) return null;\n const line = this._buffer.toString('utf8', 0, index).replace(/\\r$/, '');\n this._buffer = this._buffer.subarray(index + 1);\n try {\n return JSON.parse(line) as JSONRPCMessage;\n } catch {\n return null;\n }\n }\n\n clear(): void {\n this._buffer = undefined;\n }\n}\n\n/**\n * Minimal stdio transport for the MCP server.\n * Communicates with the MCP client via stdin/stdout using newline-delimited JSON-RPC.\n */\nexport class StdioServerTransport {\n private readonly _stdin: NodeJS.ReadableStream;\n private readonly _stdout: NodeJS.WritableStream;\n private readonly _readBuffer = new ReadBuffer();\n private _started = false;\n\n constructor(stdin?: NodeJS.ReadableStream, stdout?: NodeJS.WritableStream) {\n this._stdin = stdin ?? process.stdin;\n this._stdout = stdout ?? process.stdout;\n }\n\n onclose?: () => void;\n onerror?: (error: Error) => void;\n onmessage?: (message: JSONRPCMessage) => void;\n\n async start(): Promise<void> {\n if (this._started) {\n throw new Error('StdioServerTransport already started!');\n }\n this._started = true;\n\n this._stdin.on('data', (chunk: Buffer) => {\n this._readBuffer.append(chunk);\n this.#processReadBuffer();\n });\n\n this._stdin.on('error', (error: Error) => {\n this.onerror?.(error);\n });\n }\n\n #processReadBuffer(): void {\n while (true) {\n try {\n const message = this._readBuffer.readMessage();\n if (message === null) break;\n this.onmessage?.(message);\n } catch (error) {\n this.onerror?.(error instanceof Error ? error : new Error(String(error)));\n }\n }\n }\n\n async close(): Promise<void> {\n (this._stdin as NodeJS.ReadableStream & { pause?: () => void }).pause?.();\n this._readBuffer.clear();\n this.onclose?.();\n }\n\n async send(message: JSONRPCMessage): Promise<void> {\n const json = serializeMessage(message);\n if (this._stdout.write(json)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n this._stdout.once('drain', resolve);\n });\n }\n}\n","/**\n * Upstream Playwright MCP detection and spawning.\n *\n * Auto-detection priority:\n * 1. Explicit `--upstream @playwright/mcp` flag\n * 2. Scan node_modules for `@playwright/mcp`\n * 3. Scan node_modules for `playwright-mcp-advanced`\n * 4. null — standalone mode (no upstream proxying)\n */\n\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport type { Readable, Writable } from 'node:stream';\n\n/* eslint-disable @typescript-eslint/no-require-imports */\nfunction getNodeModuleCreateRequire(): NodeJS.Require {\n const { createRequire } = require('node:module');\n return createRequire(process.cwd() + '/noop.js');\n}\n/* eslint-enable @typescript-eslint/no-require-imports */\n\ninterface ToolDescriptor {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n outputSchema?: Record<string, unknown>;\n}\n\ninterface ListToolsResult {\n tools: ToolDescriptor[];\n}\n\ninterface CallToolResult {\n content: Array<{ type: string; [key: string]: unknown }>;\n isError?: boolean;\n structuredContent?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Package detection\n// ---------------------------------------------------------------------------\n\n/** Attempt to resolve a package's package.json from the current working directory. */\nfunction resolvePackageJson(pkg: string): string | null {\n try {\n const req = getNodeModuleCreateRequire();\n return req.resolve(`${pkg}/package.json`);\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve the upstream MCP package to use.\n *\n * Returns the package name to spawn, or null for standalone mode.\n */\nexport function resolveUpstream(options: { upstream?: string }): string | null {\n // Explicit override always wins\n if (options.upstream) {\n return options.upstream;\n }\n\n // Auto-detect\n if (resolvePackageJson('@playwright/mcp')) {\n return '@playwright/mcp';\n }\n if (resolvePackageJson('playwright-mcp-advanced')) {\n return 'playwright-mcp-advanced';\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Stdio transport helpers (minimal, no external deps beyond Node built-ins)\n// ---------------------------------------------------------------------------\n\ntype MessageCallback = (message: unknown) => void;\n\n/**\n * Minimal stdio transport that wraps a ChildProcess's stdin/stdout as an\n * MCP transport using the same newline-delimited JSON-RPC format as the SDK.\n */\nclass ChildProcessTransport {\n private pendingRequests = new Map<string, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n private id = 0;\n\n constructor(\n private stdin: Writable,\n private stdout: Readable,\n private stderr: Readable | null,\n private onMessage: MessageCallback,\n private onClose?: () => void,\n ) {}\n\n start(): void {\n // Drain stdout line-by-line into JSON-RPC messages\n let buffer = '';\n this.stdout.on('data', (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (line.trim()) {\n try {\n const msg = JSON.parse(line);\n this.handleMessage(msg);\n } catch {\n // ignore parse errors\n }\n }\n }\n });\n\n this.stdout.on('end', () => {\n this.onClose?.();\n });\n\n this.stderr?.on('data', (chunk: Buffer) => {\n // Pass stderr through to parent stderr so Chrome debug URLs are visible\n process.stderr.write(chunk);\n });\n }\n\n private handleMessage(\n \n msg: { id?: unknown; result?: unknown; error?: unknown; method?: string; params?: unknown },\n ): void {\n // Response to one of our requests\n if (msg.id !== undefined) {\n const pending = this.pendingRequests.get(String(msg.id));\n if (pending) {\n this.pendingRequests.delete(String(msg.id));\n if (msg.error) {\n pending.reject(new Error(String(msg.error)));\n } else {\n pending.resolve(msg.result);\n }\n }\n return;\n }\n // Server-to-client notification (shouldn't happen in our use case but handle gracefully)\n if (msg.method) {\n this.onMessage(msg);\n }\n }\n\n send(message: { method: string; params?: unknown; id?: unknown }): void {\n const json = JSON.stringify(message) + '\\n';\n this.stdin.write(json);\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n const id = String(++this.id);\n const promise = new Promise((resolve, reject) => {\n this.pendingRequests.set(id, { resolve: resolve as (v: unknown) => void, reject });\n });\n this.send({ method, params, id });\n return promise;\n }\n\n close(): void {\n this.stdin.end();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Upstream connection\n// ---------------------------------------------------------------------------\n\nexport interface UpstreamConnection {\n /** List all tools the upstream server provides. */\n listTools(): Promise<ListToolsResult>;\n /** Call a tool on the upstream server. */\n callTool(name: string, args?: Record<string, unknown>): Promise<CallToolResult>;\n /** The underlying child process (may be null in standalone mode). */\n process: ChildProcess | null;\n /** Close the upstream connection. */\n close(): void;\n}\n\n// ---------------------------------------------------------------------------\n// CDP port injection\n// ---------------------------------------------------------------------------\n\n/**\n * Inject `--remote-debugging-port=9222` into the args array if no existing\n * remote-debugging-port or cdp-endpoint flag is present.\n */\nexport function injectDebugPort(args: string[]): string[] {\n const hasDebugFlag = args.some(\n (a) => a.startsWith('--remote-debugging-port') || a.startsWith('--cdp-endpoint'),\n );\n if (hasDebugFlag) {\n return args;\n }\n return ['--remote-debugging-port=9222', ...args];\n}\n\n// ---------------------------------------------------------------------------\n// Spawn and connect\n// ---------------------------------------------------------------------------\n\n/**\n * Spawn the upstream MCP server as a child process and return a connection handle.\n */\nexport function spawnUpstream(pkg: string, passthroughArgs: string[]): UpstreamConnection {\n // Spawn via npx so scoped packages work without a local install\n const npxBin = process.platform === 'win32' ? 'npx.cmd' : 'npx';\n const npxArgs = [pkg, ...passthroughArgs];\n\n const child = spawn(npxBin, npxArgs, {\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n // Prevent npx from prompting or caching in CI\n NPM_CONFIG_YES: 'true',\n NPM_CONFIG_INTERACTIVE: 'false',\n },\n shell: false,\n windowsHide: true,\n });\n\n const transport = new ChildProcessTransport(\n child.stdin!,\n child.stdout!,\n child.stderr!,\n (_msg: unknown) => {\n // Notifications from upstream — not expected in proxy use, ignore\n },\n () => {\n // Process ended\n },\n );\n transport.start();\n\n const connection: UpstreamConnection = {\n process: child,\n\n async listTools(): Promise<ListToolsResult> {\n const result = await transport.request('tools/list');\n return result as ListToolsResult;\n },\n\n async callTool(name: string, args?: Record<string, unknown>): Promise<CallToolResult> {\n const result = await transport.request('tools/call', { name, arguments: args ?? {} });\n return result as CallToolResult;\n },\n\n close(): void {\n transport.close();\n },\n };\n\n return connection;\n}\n","/**\n * CDP connection to the browser that the upstream Playwright MCP controls.\n *\n * Strategy (in priority order):\n * 1. Explicit `--cdp-endpoint` flag (highest priority)\n * 2. Parse CDP URL from upstream stderr — Chrome prints `DevTools listening on ws://...`\n * 3. Try well-known debug port 9222 as fallback\n * 4. Auto-inject `--remote-debugging-port=9222` into upstream passthrough args\n */\n\nimport type { Browser, Page } from 'playwright-core';\nimport type { ChildProcess } from 'node:child_process';\n\n// CDP WebSocket URL regex — Chrome prints this to stderr when remote debugging is on\nconst CDP_WS_REGEX = /DevTools listening on (ws:\\/\\/[^\\s]+)/;\n\nlet cachedConnection: { browser: Browser; page: Page } | null = null;\n\n/**\n * Find the CDP WebSocket URL in the upstream process's stderr output.\n */\nexport function extractCdpUrlFromStderr(data: string): string | null {\n const match = CDP_WS_REGEX.exec(data);\n return match ? (match[1] ?? null) : null;\n}\n\n/**\n * Lazily connect to the upstream browser via CDP and return a shared Page handle.\n *\n * The connection is cached — subsequent calls return the same handle.\n */\nexport async function getUpstreamPage(\n upstreamProcess: ChildProcess | null,\n options: { cdpEndpoint?: string; debugPort?: number },\n): Promise<{ browser: Browser; page: Page }> {\n if (cachedConnection) {\n return cachedConnection;\n }\n\n let cdpEndpoint = options.cdpEndpoint;\n\n // 1. Explicit endpoint from flags\n if (!cdpEndpoint) {\n // 2. Parse from upstream stderr if we have the process\n if (upstreamProcess?.stderr) {\n const stderrLines: string[] = [];\n upstreamProcess.stderr.on('data', (chunk: Buffer) => {\n stderrLines.push(chunk.toString());\n });\n\n // Give Chrome a moment to emit the listening message\n await new Promise<void>((resolve) => setTimeout(resolve, 500));\n\n for (const line of stderrLines) {\n const url = extractCdpUrlFromStderr(line);\n if (url) {\n cdpEndpoint = url;\n break;\n }\n }\n }\n }\n\n // 3. Fall back to well-known debug port\n if (!cdpEndpoint) {\n const port = options.debugPort ?? 9222;\n cdpEndpoint = `http://localhost:${port}`;\n }\n\n // Connect via CDP\n const browser = await chromiumConnect(cdpEndpoint);\n const pages = await browser.contexts()[0]?.pages() ?? [];\n const page = pages[0] ?? (await browser.newPage());\n\n cachedConnection = { browser, page };\n return cachedConnection;\n}\n\n/* eslint-disable @typescript-eslint/no-require-imports */\nfunction getNodeModuleCreateRequire(): NodeJS.Require {\n const { createRequire } = require('node:module');\n return createRequire(import.meta.url);\n}\n/* eslint-enable @typescript-eslint/no-require-imports */\n\n/**\n * Thin wrapper around playwright-core's CDP connect to allow swapping\n * the implementation during tests.\n */\nexport async function chromiumConnect(endpoint: string): Promise<Browser> {\n const req = getNodeModuleCreateRequire();\n const pw = req('playwright-core') as unknown as { chromium: { connectOverCDP: (url: string) => Promise<Browser> } };\n return pw.chromium.connectOverCDP(endpoint);\n}\n\nexport function resetCachedConnection(): void {\n cachedConnection = null;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, AriaSnapshotCollectorData } from '../types';\n\nfunction countSnapshotNodes(value: unknown): number {\n if (value == null) {\n return 0;\n }\n\n if (Array.isArray(value)) {\n return value.reduce((total, item) => total + countSnapshotNodes(item), 0);\n }\n\n if (typeof value !== 'object') {\n return 1;\n }\n\n const node = value as { children?: unknown };\n const children = Array.isArray(node.children) ? node.children : [];\n return 1 + children.reduce((total, child) => total + countSnapshotNodes(child), 0);\n}\n\nasync function captureAriaSnapshot(page: {\n locator: (selector: string) => { ariaSnapshot?: () => Promise<unknown> };\n accessibility?: { snapshot?: (options?: { interestingOnly?: boolean }) => Promise<unknown> };\n}): Promise<unknown | null> {\n try {\n const root = page.locator(':root');\n if (typeof root.ariaSnapshot === 'function') {\n const snapshot = await root.ariaSnapshot();\n return snapshot ?? null;\n }\n } catch {\n // Fall through to accessibility.snapshot.\n }\n\n if (typeof page.accessibility?.snapshot === 'function') {\n try {\n const snapshot = await page.accessibility.snapshot({ interestingOnly: false });\n return snapshot ?? null;\n } catch {\n return null;\n }\n }\n\n return null;\n}\n\nexport const ariaSnapshotCollector: CheckpointCollector = {\n name: 'aria-snapshot',\n defaultEnabled: false,\n\n async collect(ctx) {\n const snapshot = await captureAriaSnapshot(ctx.page as unknown as Parameters<typeof captureAriaSnapshot>[0]);\n const nodeCount = countSnapshotNodes(snapshot);\n const outputPath = path.join(ctx.checkpointDir, 'aria-snapshot.json');\n\n const data: AriaSnapshotCollectorData = {\n snapshot,\n nodeCount,\n };\n\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'aria-snapshot',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n nodeCount,\n },\n };\n },\n};\n","import type { Page } from '@playwright/test';\n\nexport async function settlePage(page: Page): Promise<void> {\n await page.waitForLoadState('domcontentloaded').catch(() => undefined);\n await page.waitForLoadState('load', { timeout: 3_000 }).catch(() => undefined);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport { settlePage } from '../page-utils';\nimport type { AxeCollectorData, CheckpointCollector } from '../types';\n\ntype AxeBuilderInstance = {\n analyze(): Promise<unknown>;\n};\n\ntype AxeBuilderConstructor = new (options: { page: Page }) => AxeBuilderInstance;\n\ntype AxeModule = {\n default?: AxeBuilderConstructor;\n AxeBuilder?: AxeBuilderConstructor;\n};\n\nlet axeLoader: () => Promise<AxeModule> = () => import('@axe-core/playwright');\nlet warnedAboutMissingAxe = false;\n\nfunction warnOnce(message: string, error?: unknown): void {\n if (warnedAboutMissingAxe) {\n return;\n }\n\n warnedAboutMissingAxe = true;\n if (error instanceof Error) {\n console.warn(`[playwright-checkpoint] ${message}`, error);\n return;\n }\n\n if (error !== undefined) {\n console.warn(`[playwright-checkpoint] ${message}`, String(error));\n return;\n }\n\n console.warn(`[playwright-checkpoint] ${message}`);\n}\n\nfunction resolveAxeBuilder(module: AxeModule): AxeBuilderConstructor | null {\n return module.default ?? module.AxeBuilder ?? null;\n}\n\nasync function analyzeAccessibility(page: Page, AxeBuilder: AxeBuilderConstructor): Promise<unknown> {\n try {\n await settlePage(page);\n return await new AxeBuilder({ page }).analyze();\n } catch {\n await page.waitForTimeout(500);\n await settlePage(page);\n return await new AxeBuilder({ page }).analyze();\n }\n}\n\nfunction skippedAxeResult(reason: string): {\n data: AxeCollectorData;\n artifacts: [];\n summary: { violations: number };\n} {\n return {\n data: {\n skipped: true,\n reason,\n violations: 0,\n results: null,\n },\n artifacts: [],\n summary: {\n violations: 0,\n },\n };\n}\n\nexport function setAxeLoaderForTests(loader: (() => Promise<AxeModule>) | null): void {\n axeLoader = loader ?? (() => import('@axe-core/playwright'));\n warnedAboutMissingAxe = false;\n}\n\nexport const axeCollector: CheckpointCollector = {\n name: 'axe',\n defaultEnabled: true,\n\n async collect(ctx) {\n const timeoutBudgetMs = typeof ctx.config.timeoutMs === 'number' ? ctx.config.timeoutMs : 5_000;\n\n if (timeoutBudgetMs > 0) {\n if (typeof ctx.adjustTimeout === 'function') {\n ctx.adjustTimeout(timeoutBudgetMs);\n } else if (ctx.testInfo && typeof ctx.testInfo.setTimeout === 'function') {\n ctx.testInfo.setTimeout(ctx.testInfo.timeout + timeoutBudgetMs);\n }\n }\n\n let module: AxeModule;\n try {\n module = await axeLoader();\n } catch (error) {\n warnOnce('Skipping axe collector because @axe-core/playwright is unavailable.', error);\n return skippedAxeResult('@axe-core/playwright is unavailable');\n }\n\n const AxeBuilder = resolveAxeBuilder(module);\n if (!AxeBuilder) {\n warnOnce('Skipping axe collector because @axe-core/playwright did not expose an AxeBuilder export.');\n return skippedAxeResult('@axe-core/playwright did not expose AxeBuilder');\n }\n\n const results = await analyzeAccessibility(ctx.page, AxeBuilder);\n const violations =\n results &&\n typeof results === 'object' &&\n Array.isArray((results as { violations?: unknown }).violations)\n ? (results as { violations: unknown[] }).violations.length\n : 0;\n const axePath = path.join(ctx.checkpointDir, 'axe.json');\n\n await fs.writeFile(axePath, `${JSON.stringify(results, null, 2)}\\n`, 'utf8');\n\n return {\n data: {\n skipped: false,\n reason: null,\n violations,\n results,\n } satisfies AxeCollectorData,\n artifacts: [\n {\n name: 'axe',\n path: axePath,\n contentType: 'application/json',\n },\n ],\n summary: {\n violations,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { ConsoleMessage, Page } from '@playwright/test';\nimport type { CheckpointCollector, ConsoleErrorRecord } from '../types';\n\ntype ConsoleCollectorState = {\n entries: ConsoleErrorRecord[];\n offset: number;\n recordConsoleMessage: (message: ConsoleMessage) => void | Promise<void>;\n recordPageError: (error: Error) => void;\n};\n\nconst consoleStates = new WeakMap<Page, ConsoleCollectorState>();\n\nfunction getLocation(message: ConsoleMessage): ConsoleErrorRecord['location'] {\n const location = message.location();\n if (!location.url && location.lineNumber == null && location.columnNumber == null) {\n return null;\n }\n\n return {\n ...(location.url ? { url: location.url } : {}),\n ...(location.lineNumber == null ? {} : { lineNumber: location.lineNumber }),\n ...(location.columnNumber == null ? {} : { columnNumber: location.columnNumber }),\n };\n}\n\nexport const consoleCollector: CheckpointCollector = {\n name: 'console',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (consoleStates.has(page)) {\n return;\n }\n\n const entries: ConsoleErrorRecord[] = [];\n\n const recordConsoleMessage = (message: ConsoleMessage): void => {\n if (message.type() !== 'error') {\n return;\n }\n\n entries.push({\n type: message.type(),\n text: message.text(),\n location: getLocation(message),\n timestamp: new Date().toISOString(),\n });\n };\n\n const recordPageError = (error: Error): void => {\n entries.push({\n type: 'pageerror',\n text: error.message,\n location: null,\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('console', recordConsoleMessage);\n page.on('pageerror', recordPageError);\n\n consoleStates.set(page, {\n entries,\n offset: 0,\n recordConsoleMessage,\n recordPageError,\n });\n },\n\n async collect(ctx) {\n const state = consoleStates.get(ctx.page);\n const checkpointEntries = state ? state.entries.slice(state.offset) : [];\n\n if (state) {\n state.offset = state.entries.length;\n }\n\n const outputPath = path.join(ctx.checkpointDir, 'console-errors.json');\n await fs.writeFile(outputPath, `${JSON.stringify(checkpointEntries, null, 2)}\\n`, 'utf8');\n\n return {\n data: checkpointEntries,\n artifacts: [\n {\n name: 'console-errors',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n consoleErrorCount: checkpointEntries.length,\n },\n };\n },\n\n async teardown({ page }) {\n const state = consoleStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('console', state.recordConsoleMessage);\n page.off('pageerror', state.recordPageError);\n consoleStates.delete(page);\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, DomStatsCollectorData } from '../types';\n\nexport const domStatsCollector: CheckpointCollector = {\n name: 'dom-stats',\n defaultEnabled: false,\n\n async collect(ctx) {\n const stats = await ctx.page.evaluate(() => {\n const allNodes = document.querySelectorAll('*');\n\n const maxDepthFrom = (root: Element | null): number => {\n if (!root) {\n return 0;\n }\n\n let maxDepth = 1;\n const queue: Array<{ node: Element; depth: number }> = [{ node: root, depth: 1 }];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n maxDepth = Math.max(maxDepth, current.depth);\n for (const child of Array.from(current.node.children)) {\n queue.push({ node: child, depth: current.depth + 1 });\n }\n }\n\n return maxDepth;\n };\n\n const maybeGetEventListeners =\n (globalThis as { getEventListeners?: (target: EventTarget) => Record<string, unknown[]> }).getEventListeners;\n\n let eventListenerCount: number | null = null;\n if (typeof maybeGetEventListeners === 'function') {\n eventListenerCount = 0;\n const targets: EventTarget[] = [window, document, ...Array.from(allNodes)];\n\n for (const target of targets) {\n try {\n const listeners = maybeGetEventListeners(target) ?? {};\n for (const entries of Object.values(listeners)) {\n eventListenerCount += Array.isArray(entries) ? entries.length : 0;\n }\n } catch {\n // Ignore inaccessible targets.\n }\n }\n }\n\n return {\n nodeCount: allNodes.length,\n maxDepth: maxDepthFrom(document.documentElement),\n formCount: document.querySelectorAll('form').length,\n imageCount: document.querySelectorAll('img').length,\n scriptCount: document.querySelectorAll('script').length,\n stylesheetCount: document.styleSheets.length,\n eventListenerCount,\n };\n });\n\n const data: DomStatsCollectorData = {\n nodeCount: stats.nodeCount,\n maxDepth: stats.maxDepth,\n formCount: stats.formCount,\n imageCount: stats.imageCount,\n scriptCount: stats.scriptCount,\n stylesheetCount: stats.stylesheetCount,\n eventListenerCount: stats.eventListenerCount,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'dom-stats.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'dom-stats',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n nodeCount: data.nodeCount,\n maxDepth: data.maxDepth,\n formCount: data.formCount,\n imageCount: data.imageCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointCollector,\n FormFieldState,\n FormFieldValue,\n FormsCollectorData,\n} from '../types';\n\nconst REDACTED = '[REDACTED]';\nconst DEFAULT_REDACT_PATTERNS = ['password', 'token', 'secret', 'api[_-]?key', 'authorization', 'bearer'];\nconst EMAIL_LIKE_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\ntype RawFieldState = Omit<FormFieldState, 'redacted'>;\n\nfunction toRegex(pattern: string): RegExp | null {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n return new RegExp(trimmed, 'i');\n } catch {\n return null;\n }\n}\n\nfunction redactionRegexes(ctx: { redact: string[]; config: Record<string, unknown> }): RegExp[] {\n const fromConfig = Array.isArray(ctx.config.redact)\n ? ctx.config.redact.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n return [...DEFAULT_REDACT_PATTERNS, ...ctx.redact, ...fromConfig]\n .map((pattern) => toRegex(pattern))\n .filter((value): value is RegExp => value instanceof RegExp);\n}\n\nfunction shouldRedactText(value: string, regexes: RegExp[]): boolean {\n if (EMAIL_LIKE_REGEX.test(value.trim())) {\n return true;\n }\n\n return regexes.some((regex) => regex.test(value));\n}\n\nfunction fieldIdentifier(field: RawFieldState): string {\n return [field.type, field.name, field.id, field.label, field.placeholder].filter((value): value is string => !!value).join(' ');\n}\n\nfunction redactValue(value: FormFieldValue): FormFieldValue {\n if (value == null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(() => REDACTED);\n }\n\n return REDACTED;\n}\n\nfunction fieldNeedsRedaction(field: RawFieldState, regexes: RegExp[]): boolean {\n if (shouldRedactText(fieldIdentifier(field), regexes)) {\n return true;\n }\n\n if (field.value == null) {\n return false;\n }\n\n if (Array.isArray(field.value)) {\n return field.value.some((entry) => shouldRedactText(entry, regexes));\n }\n\n return shouldRedactText(field.value, regexes);\n}\n\nexport const formsCollector: CheckpointCollector = {\n name: 'forms',\n defaultEnabled: false,\n\n async collect(ctx) {\n const rawFields = await ctx.page.evaluate(() => {\n const elements = Array.from(document.querySelectorAll('input, select, textarea'));\n\n const isVisible = (element: Element): boolean => {\n if (!(element instanceof HTMLElement)) {\n return false;\n }\n\n const inputType = element instanceof HTMLInputElement ? element.type.toLowerCase() : null;\n if (inputType === 'hidden') {\n return false;\n }\n\n if (element.hasAttribute('hidden') || element.getAttribute('aria-hidden') === 'true') {\n return false;\n }\n\n const style = window.getComputedStyle(element);\n if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) {\n return false;\n }\n\n const rect = element.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n };\n\n const readLabel = (element: Element): string | null => {\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n const fromLabels = element.labels && element.labels.length > 0 ? element.labels[0]?.textContent?.trim() : null;\n if (fromLabels) {\n return fromLabels;\n }\n }\n\n return element.getAttribute('aria-label')?.trim() ?? null;\n };\n\n const readValue = (element: Element): { value: string | string[] | null; checked: boolean | null; type: string | null } => {\n if (element instanceof HTMLSelectElement) {\n if (element.multiple) {\n return {\n value: Array.from(element.selectedOptions).map((option) => option.value),\n checked: null,\n type: 'select-multiple',\n };\n }\n\n return {\n value: element.value,\n checked: null,\n type: 'select-one',\n };\n }\n\n if (element instanceof HTMLTextAreaElement) {\n return {\n value: element.value,\n checked: null,\n type: 'textarea',\n };\n }\n\n if (element instanceof HTMLInputElement) {\n const inputType = element.type.toLowerCase();\n if (inputType === 'checkbox' || inputType === 'radio') {\n return {\n value: element.checked ? element.value || 'on' : null,\n checked: element.checked,\n type: inputType,\n };\n }\n\n if (inputType === 'file') {\n return {\n value: element.files ? Array.from(element.files).map((file) => file.name) : [],\n checked: null,\n type: inputType,\n };\n }\n\n return {\n value: element.value,\n checked: null,\n type: inputType || null,\n };\n }\n\n return {\n value: null,\n checked: null,\n type: null,\n };\n };\n\n return elements\n .filter((element) => isVisible(element))\n .map((element) => {\n const { value, checked, type } = readValue(element);\n\n return {\n tagName: element.tagName.toLowerCase() as 'input' | 'select' | 'textarea',\n type,\n name: element.getAttribute('name'),\n id: element.getAttribute('id'),\n label: readLabel(element),\n placeholder: element.getAttribute('placeholder'),\n value,\n checked,\n disabled: (element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).disabled,\n required: (element as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).required,\n };\n });\n });\n\n const regexes = redactionRegexes({ redact: ctx.redact, config: ctx.config });\n let redactedCount = 0;\n\n const fields: FormFieldState[] = (rawFields as RawFieldState[]).map((field) => {\n const redacted = fieldNeedsRedaction(field, regexes);\n if (redacted) {\n redactedCount += 1;\n }\n\n return {\n ...field,\n redacted,\n value: redacted ? redactValue(field.value) : field.value,\n };\n });\n\n const data: FormsCollectorData = {\n fieldCount: fields.length,\n redactedCount,\n fields,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'form-state.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'form-state',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n fieldCount: data.fieldCount,\n redactedCount: data.redactedCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport { settlePage } from '../page-utils';\nimport type { CheckpointCollector, HtmlCollectorData } from '../types';\n\nasync function readPageContent(page: Page): Promise<string> {\n try {\n await settlePage(page);\n return await page.content();\n } catch {\n await page.waitForTimeout(500);\n await settlePage(page);\n return await page.content();\n }\n}\n\nexport const htmlCollector: CheckpointCollector = {\n name: 'html',\n defaultEnabled: true,\n\n async collect(ctx) {\n const htmlPath = path.join(ctx.checkpointDir, 'page.html');\n const html = await readPageContent(ctx.page);\n\n await fs.writeFile(htmlPath, html, 'utf8');\n\n return {\n data: {\n contentLength: html.length,\n } satisfies HtmlCollectorData,\n artifacts: [\n {\n name: 'html',\n path: htmlPath,\n contentType: 'text/html',\n },\n ],\n summary: {\n htmlPath: 'page.html',\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CheckpointCollector, PageMetadata } from '../types';\n\nfunction normalizeStructuredData(scriptContents: Array<string | null>): unknown[] {\n const values: unknown[] = [];\n\n for (const content of scriptContents) {\n const value = content?.trim();\n if (!value) {\n continue;\n }\n\n try {\n values.push(JSON.parse(value));\n } catch {\n values.push({\n parseError: 'Invalid JSON-LD',\n raw: value,\n });\n }\n }\n\n return values;\n}\n\nexport const metadataCollector: CheckpointCollector = {\n name: 'metadata',\n defaultEnabled: true,\n\n async collect(ctx) {\n const metadata = await ctx.page.evaluate(() => {\n const meta = (selector: string): string | null => document.querySelector(selector)?.getAttribute('content') ?? null;\n const canonicalLink = document.querySelector('link[rel=\"canonical\"]');\n const html = document.documentElement;\n const structuredDataScripts = Array.from(document.querySelectorAll('script[type=\"application/ld+json\"]')).map((script) => script.textContent ?? null);\n\n return {\n url: location.href,\n title: document.title,\n description: meta('meta[name=\"description\"]'),\n openGraph: {\n title: meta('meta[property=\"og:title\"]'),\n description: meta('meta[property=\"og:description\"]'),\n image: meta('meta[property=\"og:image\"]'),\n },\n canonicalUrl: canonicalLink?.getAttribute('href') ?? null,\n lang: html.getAttribute('lang'),\n viewport: meta('meta[name=\"viewport\"]'),\n structuredDataScripts,\n };\n });\n\n const normalizedMetadata: PageMetadata = {\n url: metadata.url,\n title: metadata.title,\n description: metadata.description,\n openGraph: metadata.openGraph,\n canonicalUrl: metadata.canonicalUrl,\n lang: metadata.lang,\n viewport: metadata.viewport,\n structuredData: normalizeStructuredData(metadata.structuredDataScripts),\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'metadata.json');\n await fs.writeFile(outputPath, `${JSON.stringify(normalizedMetadata, null, 2)}\\n`, 'utf8');\n\n return {\n data: normalizedMetadata,\n artifacts: [\n {\n name: 'metadata',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n url: normalizedMetadata.url,\n title: normalizedMetadata.title,\n lang: normalizedMetadata.lang,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, Request, Response } from '@playwright/test';\nimport type { CheckpointCollector, FailedRequestRecord } from '../types';\n\ntype NetworkCollectorState = {\n entries: FailedRequestRecord[];\n offset: number;\n recordRequestFailure: (request: Request) => void;\n recordHttpError: (response: Response) => void;\n};\n\nconst networkStates = new WeakMap<Page, NetworkCollectorState>();\n\nexport const networkCollector: CheckpointCollector = {\n name: 'network',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (networkStates.has(page)) {\n return;\n }\n\n const entries: FailedRequestRecord[] = [];\n\n const recordRequestFailure = (request: Request): void => {\n entries.push({\n kind: 'requestfailed',\n url: request.url(),\n method: request.method(),\n status: null,\n statusText: null,\n failureText: request.failure()?.errorText ?? null,\n timestamp: new Date().toISOString(),\n });\n };\n\n const recordHttpError = (response: Response): void => {\n if (response.status() < 400) {\n return;\n }\n\n entries.push({\n kind: 'http-error',\n url: response.url(),\n method: response.request().method(),\n status: response.status(),\n statusText: response.statusText(),\n failureText: null,\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('requestfailed', recordRequestFailure);\n page.on('response', recordHttpError);\n\n networkStates.set(page, {\n entries,\n offset: 0,\n recordRequestFailure,\n recordHttpError,\n });\n },\n\n async collect(ctx) {\n const state = networkStates.get(ctx.page);\n const checkpointEntries = state ? state.entries.slice(state.offset) : [];\n\n if (state) {\n state.offset = state.entries.length;\n }\n\n const outputPath = path.join(ctx.checkpointDir, 'failed-requests.json');\n await fs.writeFile(outputPath, `${JSON.stringify(checkpointEntries, null, 2)}\\n`, 'utf8');\n\n return {\n data: checkpointEntries,\n artifacts: [\n {\n name: 'failed-requests',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n failedRequestCount: checkpointEntries.length,\n },\n };\n },\n\n async teardown({ page }) {\n const state = networkStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('requestfailed', state.recordRequestFailure);\n page.off('response', state.recordHttpError);\n networkStates.delete(page);\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, Response } from '@playwright/test';\nimport type {\n CheckpointCollector,\n NetworkTimingCollectorData,\n NetworkTimingRecord,\n} from '../types';\n\ntype ResponseEventRecord = {\n url: string;\n status: number | null;\n statusText: string | null;\n resourceType: string | null;\n timestamp: string;\n};\n\ntype ResourceTimingRecord = {\n name: string;\n duration: number;\n transferSize: number;\n encodedBodySize: number;\n decodedBodySize: number;\n nextHopProtocol: string;\n startTime: number;\n redirectStart: number;\n redirectEnd: number;\n domainLookupStart: number;\n domainLookupEnd: number;\n connectStart: number;\n connectEnd: number;\n secureConnectionStart: number;\n requestStart: number;\n responseStart: number;\n responseEnd: number;\n};\n\ntype NetworkTimingCollectorState = {\n responses: ResponseEventRecord[];\n responseOffset: number;\n resourceOffsetByUrl: Map<string, number>;\n recordResponse: (response: Response) => void;\n};\n\nconst timingStates = new WeakMap<Page, NetworkTimingCollectorState>();\n\nfunction maybeDuration(start: number, end: number): number | null {\n if (start <= 0 || end <= 0 || end < start) {\n return null;\n }\n\n return end - start;\n}\n\nfunction toNetworkRecord(response: ResponseEventRecord, timing: ResourceTimingRecord | null): NetworkTimingRecord {\n return {\n url: response.url,\n status: response.status,\n statusText: response.statusText,\n resourceType: response.resourceType,\n timestamp: response.timestamp,\n durationMs: timing ? timing.duration : null,\n transferSize: timing ? timing.transferSize : null,\n encodedBodySize: timing ? timing.encodedBodySize : null,\n decodedBodySize: timing ? timing.decodedBodySize : null,\n nextHopProtocol: timing ? timing.nextHopProtocol || null : null,\n timing: {\n startTimeMs: timing ? timing.startTime : null,\n redirectMs: timing ? maybeDuration(timing.redirectStart, timing.redirectEnd) : null,\n dnsMs: timing ? maybeDuration(timing.domainLookupStart, timing.domainLookupEnd) : null,\n connectMs: timing ? maybeDuration(timing.connectStart, timing.connectEnd) : null,\n tlsMs: timing ? maybeDuration(timing.secureConnectionStart, timing.connectEnd) : null,\n requestMs: timing ? maybeDuration(timing.requestStart, timing.responseStart) : null,\n responseMs: timing ? maybeDuration(timing.responseStart, timing.responseEnd) : null,\n },\n };\n}\n\nexport const networkTimingCollector: CheckpointCollector = {\n name: 'network-timing',\n defaultEnabled: false,\n\n async setup({ page }) {\n if (timingStates.has(page)) {\n return;\n }\n\n const responses: ResponseEventRecord[] = [];\n\n const recordResponse = (response: Response): void => {\n responses.push({\n url: response.url(),\n status: response.status(),\n statusText: response.statusText(),\n resourceType: response.request().resourceType(),\n timestamp: new Date().toISOString(),\n });\n };\n\n page.on('response', recordResponse);\n\n timingStates.set(page, {\n responses,\n responseOffset: 0,\n resourceOffsetByUrl: new Map<string, number>(),\n recordResponse,\n });\n },\n\n async collect(ctx) {\n const state = timingStates.get(ctx.page);\n const recentResponses = state ? state.responses.slice(state.responseOffset) : [];\n\n if (state) {\n state.responseOffset = state.responses.length;\n }\n\n const resourceTimings = (await ctx.page.evaluate(() => {\n const entries = performance.getEntriesByType('resource') as PerformanceResourceTiming[];\n return entries.map((entry) => ({\n name: entry.name,\n duration: entry.duration,\n transferSize: entry.transferSize,\n encodedBodySize: entry.encodedBodySize,\n decodedBodySize: entry.decodedBodySize,\n nextHopProtocol: entry.nextHopProtocol,\n startTime: entry.startTime,\n redirectStart: entry.redirectStart,\n redirectEnd: entry.redirectEnd,\n domainLookupStart: entry.domainLookupStart,\n domainLookupEnd: entry.domainLookupEnd,\n connectStart: entry.connectStart,\n connectEnd: entry.connectEnd,\n secureConnectionStart: entry.secureConnectionStart,\n requestStart: entry.requestStart,\n responseStart: entry.responseStart,\n responseEnd: entry.responseEnd,\n }));\n })) as ResourceTimingRecord[];\n\n const timingsByUrl = new Map<string, ResourceTimingRecord[]>();\n for (const timing of resourceTimings) {\n const list = timingsByUrl.get(timing.name);\n if (list) {\n list.push(timing);\n } else {\n timingsByUrl.set(timing.name, [timing]);\n }\n }\n\n const requests: NetworkTimingRecord[] = recentResponses.map((response) => {\n if (!state) {\n return toNetworkRecord(response, null);\n }\n\n const list = timingsByUrl.get(response.url) ?? [];\n const currentOffset = state.resourceOffsetByUrl.get(response.url) ?? 0;\n const match = list[currentOffset] ?? null;\n\n if (match) {\n state.resourceOffsetByUrl.set(response.url, currentOffset + 1);\n }\n\n return toNetworkRecord(response, match);\n });\n\n const totalBytes = requests.reduce((total, request) => {\n if (typeof request.transferSize !== 'number' || request.transferSize < 0) {\n return total;\n }\n\n return total + request.transferSize;\n }, 0);\n\n const slowestRequestMs = requests.reduce((slowest, request) => {\n if (typeof request.durationMs !== 'number') {\n return slowest;\n }\n\n return Math.max(slowest, request.durationMs);\n }, 0);\n\n const data: NetworkTimingCollectorData = {\n requestCount: requests.length,\n totalBytes,\n slowestRequestMs,\n requests,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'network-timing.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'network-timing',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n requestCount: data.requestCount,\n totalBytes: data.totalBytes,\n slowestRequestMs: data.slowestRequestMs,\n },\n };\n },\n\n async teardown({ page }) {\n const state = timingStates.get(page);\n if (!state) {\n return;\n }\n\n page.off('response', state.recordResponse);\n timingStates.delete(page);\n },\n};\n","import path from 'node:path';\nimport type { CheckpointCollector, ScreenshotCollectorData } from '../types';\n\nconst PNG_SIGNATURE = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\nfunction readPngSize(buffer: Buffer): ScreenshotCollectorData['imageSize'] {\n if (buffer.length < 24 || !buffer.subarray(0, 8).equals(PNG_SIGNATURE)) {\n return null;\n }\n\n if (buffer.toString('ascii', 12, 16) !== 'IHDR') {\n return null;\n }\n\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n}\n\nexport const screenshotCollector: CheckpointCollector = {\n name: 'screenshot',\n defaultEnabled: true,\n\n async collect(ctx) {\n const fullPage = ctx.options.fullPage ?? true;\n const screenshotPath = path.join(ctx.checkpointDir, 'page.png');\n const screenshotBuffer = await ctx.page.screenshot({ path: screenshotPath, fullPage });\n\n let highlightBounds: ScreenshotCollectorData['highlightBounds'] = null;\n if (ctx.options.highlightSelector) {\n highlightBounds = await ctx.page\n .locator(ctx.options.highlightSelector)\n .boundingBox()\n .catch(() => null);\n }\n\n return {\n data: {\n fullPage,\n highlightBounds,\n highlightSelector: ctx.options.highlightSelector ?? null,\n imageSize: Buffer.isBuffer(screenshotBuffer) ? readPngSize(screenshotBuffer) : null,\n } satisfies ScreenshotCollectorData,\n artifacts: [\n {\n name: 'screenshot',\n path: screenshotPath,\n contentType: 'image/png',\n },\n ],\n summary: {\n screenshotPath: 'page.png',\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n CheckpointCollector,\n StorageCollectorData,\n StorageCookieState,\n StorageEntryState,\n} from '../types';\n\nconst REDACTED = '[REDACTED]';\nconst DEFAULT_REDACT_PATTERNS = ['password', 'token', 'secret', 'api[_-]?key', 'authorization', 'session', 'email'];\nconst EMAIL_LIKE_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\ntype RawCookie = {\n name: string;\n domain: string;\n path: string;\n value: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: string;\n};\n\ntype RawStorageEntry = {\n key: string;\n value: string;\n};\n\nfunction toRegex(pattern: string): RegExp | null {\n const trimmed = pattern.trim();\n if (!trimmed) {\n return null;\n }\n\n try {\n return new RegExp(trimmed, 'i');\n } catch {\n return null;\n }\n}\n\nfunction buildRedactionRegexes(ctx: { redact: string[]; config: Record<string, unknown> }): RegExp[] {\n const fromConfig = Array.isArray(ctx.config.redact)\n ? ctx.config.redact.filter((entry): entry is string => typeof entry === 'string')\n : [];\n\n return [...DEFAULT_REDACT_PATTERNS, ...ctx.redact, ...fromConfig]\n .map((pattern) => toRegex(pattern))\n .filter((value): value is RegExp => value instanceof RegExp);\n}\n\nfunction shouldRedact(identifier: string, value: string | null, regexes: RegExp[]): boolean {\n if (regexes.some((regex) => regex.test(identifier))) {\n return true;\n }\n\n if (!value) {\n return false;\n }\n\n if (EMAIL_LIKE_REGEX.test(value.trim())) {\n return true;\n }\n\n return regexes.some((regex) => regex.test(value));\n}\n\nexport const storageCollector: CheckpointCollector = {\n name: 'storage',\n defaultEnabled: false,\n\n async collect(ctx) {\n const includeCookieValues = ctx.config.includeCookieValues === true;\n const includeLocalStorageValues = ctx.config.includeLocalStorageValues === true;\n const redactValues = ctx.config.redactValues !== false;\n const regexes = buildRedactionRegexes({ redact: ctx.redact, config: ctx.config });\n\n const cookies = (await ctx.page.context().cookies()) as RawCookie[];\n const localStorageEntries = await ctx.page.evaluate(() =>\n Object.keys(localStorage).map((key) => ({\n key,\n value: localStorage.getItem(key) ?? '',\n })),\n );\n\n const normalizedCookies: StorageCookieState[] = cookies.map((cookie) => {\n const rawValue = includeCookieValues ? cookie.value : null;\n const redacted = redactValues && shouldRedact(cookie.name, rawValue, regexes);\n\n return {\n name: cookie.name,\n domain: cookie.domain,\n path: cookie.path,\n value: rawValue == null ? null : redacted ? REDACTED : rawValue,\n redacted,\n expires: cookie.expires,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure,\n sameSite: cookie.sameSite,\n };\n });\n\n const normalizedLocalStorage: StorageEntryState[] = (localStorageEntries as RawStorageEntry[]).map((entry) => {\n const rawValue = includeLocalStorageValues ? entry.value : null;\n const redacted = redactValues && shouldRedact(entry.key, rawValue, regexes);\n\n return {\n key: entry.key,\n value: rawValue == null ? null : redacted ? REDACTED : rawValue,\n redacted,\n };\n });\n\n const data: StorageCollectorData = {\n cookieCount: normalizedCookies.length,\n localStorageKeyCount: normalizedLocalStorage.length,\n cookies: normalizedCookies,\n localStorage: normalizedLocalStorage,\n };\n\n const outputPath = path.join(ctx.checkpointDir, 'storage-state.json');\n await fs.writeFile(outputPath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n\n return {\n data,\n artifacts: [\n {\n name: 'storage-state',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n cookieCount: data.cookieCount,\n localStorageKeyCount: data.localStorageKeyCount,\n },\n };\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page } from '@playwright/test';\nimport type {\n CheckpointCollector,\n WebVitalMetric,\n WebVitalRating,\n WebVitalsSnapshot,\n} from '../types';\n\ntype RawWebVitals = {\n cls: number | null;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n ttfb: number | null;\n domContentLoaded: number | null;\n loadEvent: number | null;\n url: string;\n};\n\nconst initializedPages = new WeakSet<Page>();\n\nfunction rateMetric(\n value: number | null,\n thresholds: { good: number; needsImprovement: number },\n): WebVitalRating {\n if (value == null || Number.isNaN(value)) {\n return 'unknown';\n }\n if (value <= thresholds.good) {\n return 'good';\n }\n if (value <= thresholds.needsImprovement) {\n return 'needs-improvement';\n }\n return 'poor';\n}\n\nfunction metric(value: number | null, thresholds: { good: number; needsImprovement: number }): WebVitalMetric {\n return {\n value,\n rating: rateMetric(value, thresholds),\n };\n}\n\nasync function captureWebVitals(page: Page): Promise<WebVitalsSnapshot> {\n const raw = await page.evaluate(() => {\n const globalState = globalThis as typeof globalThis & {\n __e2eWebVitals?: {\n cls: number;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n };\n };\n\n const state = globalState.__e2eWebVitals ?? {\n cls: 0,\n fcp: null,\n lcp: null,\n inp: null,\n };\n const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined;\n\n return {\n cls: state.cls,\n fcp: state.fcp,\n lcp: state.lcp,\n inp: state.inp,\n ttfb: navigation ? navigation.responseStart : null,\n domContentLoaded: navigation ? navigation.domContentLoadedEventEnd : null,\n loadEvent: navigation ? navigation.loadEventEnd : null,\n url: location.href,\n } satisfies RawWebVitals;\n });\n\n return {\n url: raw.url,\n capturedAt: new Date().toISOString(),\n cls: metric(raw.cls, { good: 0.1, needsImprovement: 0.25 }),\n fcpMs: metric(raw.fcp, { good: 1800, needsImprovement: 3000 }),\n lcpMs: metric(raw.lcp, { good: 2500, needsImprovement: 4000 }),\n inpMs: metric(raw.inp, { good: 200, needsImprovement: 500 }),\n ttfbMs: metric(raw.ttfb, { good: 800, needsImprovement: 1800 }),\n domContentLoadedMs: raw.domContentLoaded,\n loadEventMs: raw.loadEvent,\n };\n}\n\nexport const webVitalsCollector: CheckpointCollector = {\n name: 'web-vitals',\n defaultEnabled: true,\n\n async setup({ page }) {\n if (initializedPages.has(page)) {\n return;\n }\n\n initializedPages.add(page);\n\n await page.addInitScript(() => {\n const globalState = globalThis as typeof globalThis & {\n __e2eWebVitals?: {\n cls: number;\n fcp: number | null;\n lcp: number | null;\n inp: number | null;\n };\n };\n\n if (!globalState.__e2eWebVitals) {\n globalState.__e2eWebVitals = {\n cls: 0,\n fcp: null,\n lcp: null,\n inp: null,\n };\n }\n\n const state = globalState.__e2eWebVitals;\n\n try {\n const paintObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n state.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const lcpObserver = new PerformanceObserver((entryList) => {\n const entries = entryList.getEntries();\n const lastEntry = entries[entries.length - 1];\n if (lastEntry) {\n state.lcp = lastEntry.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n addEventListener('pagehide', () => lcpObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const clsObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries() as Array<PerformanceEntry & { hadRecentInput?: boolean; value?: number }>) {\n if (!entry.hadRecentInput) {\n state.cls += entry.value ?? 0;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n addEventListener('pagehide', () => clsObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n\n try {\n const inpObserver = new PerformanceObserver((entryList) => {\n for (const entry of entryList.getEntries() as Array<PerformanceEntry & { duration?: number }>) {\n const duration = entry.duration ?? 0;\n if (state.inp == null || duration > state.inp) {\n state.inp = duration;\n }\n }\n });\n inpObserver.observe({ type: 'event', buffered: true, durationThreshold: 40 } as PerformanceObserverInit);\n addEventListener('pagehide', () => inpObserver.disconnect(), { once: true });\n } catch {\n // Unsupported in this browser context.\n }\n });\n },\n\n async collect(ctx) {\n const snapshot = await captureWebVitals(ctx.page);\n const outputPath = path.join(ctx.checkpointDir, 'web-vitals.json');\n\n await fs.writeFile(outputPath, `${JSON.stringify(snapshot, null, 2)}\\n`, 'utf8');\n\n return {\n data: snapshot,\n artifacts: [\n {\n name: 'web-vitals',\n path: outputPath,\n contentType: 'application/json',\n },\n ],\n summary: {\n cls: snapshot.cls,\n fcp: snapshot.fcpMs,\n lcp: snapshot.lcpMs,\n inp: snapshot.inpMs,\n ttfb: snapshot.ttfbMs,\n },\n };\n },\n\n async teardown({ page }) {\n initializedPages.delete(page);\n },\n};\n","import { ariaSnapshotCollector } from './aria-snapshot';\nimport { axeCollector } from './axe';\nimport { consoleCollector } from './console';\nimport { domStatsCollector } from './dom-stats';\nimport { formsCollector } from './forms';\nimport { htmlCollector } from './html';\nimport { metadataCollector } from './metadata';\nimport { networkCollector } from './network';\nimport { networkTimingCollector } from './network-timing';\nimport { screenshotCollector } from './screenshot';\nimport { storageCollector } from './storage';\nimport { webVitalsCollector } from './web-vitals';\n\nexport const builtinCollectors = [\n screenshotCollector,\n htmlCollector,\n axeCollector,\n webVitalsCollector,\n consoleCollector,\n networkCollector,\n metadataCollector,\n ariaSnapshotCollector,\n domStatsCollector,\n formsCollector,\n storageCollector,\n networkTimingCollector,\n];\n","import type { CheckpointCollector } from '../types';\n\nconst builtinCollectors = new Map<string, CheckpointCollector>();\nlet builtinsRegistered = false;\n\nexport function registerBuiltinCollector(collector: CheckpointCollector): void {\n builtinCollectors.set(collector.name, collector);\n}\n\nexport function registerBuiltinCollectors(collectors: CheckpointCollector[]): void {\n if (builtinsRegistered) {\n return;\n }\n\n for (const collector of collectors) {\n registerBuiltinCollector(collector);\n }\n\n builtinsRegistered = true;\n}\n\nexport function getBuiltinCollectors(): Map<string, CheckpointCollector> {\n return new Map(builtinCollectors);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { Page, TestInfo } from '@playwright/test';\nimport { builtinCollectors as defaultBuiltinCollectors } from './collectors/builtin-collectors';\nimport { getBuiltinCollectors, registerBuiltinCollector, registerBuiltinCollectors } from './collectors/registry';\nimport { settlePage } from './page-utils';\nimport type {\n CheckpointCollector,\n CheckpointConfig,\n CheckpointManifest,\n CheckpointOptions,\n CheckpointRecord,\n CollectorArtifact,\n CollectorConfig,\n CollectorOptions,\n CollectorResult,\n ResolvedCollectorConfig,\n TestCheckpointConfig,\n} from './types';\n\ntype CollectorInput = boolean | CollectorOptions | CollectorConfig | undefined;\n\ntype MutableCollectorState = {\n enabled: boolean;\n config: ResolvedCollectorConfig;\n};\n\nexport type CheckpointSessionMetadata = Partial<\n Pick<CheckpointManifest, 'environment' | 'project' | 'testId' | 'title' | 'tags'>\n>;\n\nexport type CheckpointSessionOptions = Omit<CheckpointConfig, 'collectors'> & {\n outputDir: string;\n collectors?: Partial<Record<string, boolean | CollectorConfig>>;\n sessionMetadata?: CheckpointSessionMetadata;\n manifest?: CheckpointManifest;\n manifestPath?: string;\n testInfo?: TestInfo;\n adjustTimeout?: (ms: number) => void;\n};\n\nexport type CaptureCheckpointOptions = CheckpointSessionOptions & CheckpointOptions;\n\nexport type CheckpointSession = {\n outputDir: string;\n manifest: CheckpointManifest;\n checkpoint(name: string, options?: CheckpointOptions): Promise<CheckpointRecord>;\n finalize(): Promise<CheckpointManifest>;\n};\n\nexport type RunCollectorPipelineArgs = {\n page: Page;\n name: string;\n outputDir: string;\n resolvedCollectors: Map<string, ResolvedCollectorConfig>;\n registry: Map<string, CheckpointCollector>;\n options?: CheckpointOptions;\n manifest?: CheckpointManifest;\n slug?: string;\n redact?: string[];\n testInfo?: TestInfo;\n adjustTimeout?: (ms: number) => void;\n};\n\nregisterBuiltinCollectors(defaultBuiltinCollectors);\n\nfunction cloneResolvedConfig(config: ResolvedCollectorConfig): ResolvedCollectorConfig {\n return { ...config };\n}\n\nfunction cloneCollectorState(state: MutableCollectorState | undefined): MutableCollectorState {\n return {\n enabled: state?.enabled ?? false,\n config: cloneResolvedConfig(state?.config ?? {}),\n };\n}\n\nfunction applyCollectorInput(state: MutableCollectorState | undefined, input: CollectorInput): MutableCollectorState {\n const next = cloneCollectorState(state);\n\n if (input === undefined) {\n return next;\n }\n\n if (input === false) {\n return {\n enabled: false,\n config: {},\n };\n }\n\n if (input === true) {\n return {\n enabled: true,\n config: next.config,\n };\n }\n\n return {\n enabled: true,\n config: {\n ...next.config,\n ...input,\n },\n };\n}\n\nfunction collectorRegistryFor(config: CheckpointConfig = {}): Map<string, CheckpointCollector> {\n const registry = getBuiltinCollectors();\n\n for (const collector of config.custom ?? []) {\n registry.set(collector.name, collector);\n }\n\n return registry;\n}\n\nfunction cloneCheckpointOptions(options: CheckpointOptions): CheckpointOptions {\n return {\n ...options,\n ...(options.collectors ? { collectors: { ...options.collectors } } : {}),\n };\n}\n\nfunction defaultManifestEnvironment(): string {\n return process.env.PLAYWRIGHT_CHECKPOINT_ENV || process.env.NODE_ENV || 'test';\n}\n\nfunction createManifest(sessionMetadata: CheckpointSessionMetadata | undefined): CheckpointManifest {\n return {\n environment: sessionMetadata?.environment ?? defaultManifestEnvironment(),\n project: sessionMetadata?.project ?? '',\n testId: sessionMetadata?.testId ?? '',\n title: sessionMetadata?.title ?? '',\n tags: [...(sessionMetadata?.tags ?? [])],\n startedAt: new Date().toISOString(),\n checkpoints: [],\n };\n}\n\nasync function writeManifestFile(manifestPath: string, manifest: CheckpointManifest): Promise<string> {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n return manifestPath;\n}\n\nexport function warn(message: string, error?: unknown): void {\n if (error instanceof Error) {\n console.warn(`[playwright-checkpoint] ${message}`, error);\n return;\n }\n\n if (error !== undefined) {\n console.warn(`[playwright-checkpoint] ${message}`, String(error));\n return;\n }\n\n console.warn(`[playwright-checkpoint] ${message}`);\n}\n\nexport function sanitizeSegment(value: string): string {\n return (\n value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'checkpoint'\n );\n}\n\nexport function checkpointSlug(name: string, existing: CheckpointRecord[]): string {\n const base = sanitizeSegment(name);\n const existingSlugs = new Set(existing.map((record) => record.slug));\n\n if (!existingSlugs.has(base)) {\n return base;\n }\n\n let index = 2;\n let candidate = `${base}-${index}`;\n while (existingSlugs.has(candidate)) {\n index += 1;\n candidate = `${base}-${index}`;\n }\n\n return candidate;\n}\n\nasync function attachArtifacts(\n testInfo: TestInfo | undefined,\n checkpointSlugValue: string,\n collectorName: string,\n artifacts: CollectorArtifact[],\n): Promise<void> {\n const attach = testInfo?.attach;\n if (typeof attach !== 'function') {\n return;\n }\n\n for (const artifact of artifacts) {\n try {\n await attach.call(testInfo, `${checkpointSlugValue}/${collectorName}/${artifact.name}`, {\n path: artifact.path,\n contentType: artifact.contentType,\n });\n } catch (error) {\n warn(`Failed to attach artifact \"${artifact.name}\" from collector \"${collectorName}\".`, error);\n }\n }\n}\n\nexport async function collectPageTitle(page: Page): Promise<string> {\n try {\n return await page.title();\n } catch {\n return '';\n }\n}\n\nexport async function runCollectorSetup(\n collectors: Iterable<CheckpointCollector>,\n page: Page,\n testInfo?: TestInfo,\n): Promise<void> {\n for (const collector of collectors) {\n if (!collector.setup) {\n continue;\n }\n\n try {\n await collector.setup({ page, testInfo });\n } catch (error) {\n warn(`Collector \"${collector.name}\" setup failed.`, error);\n }\n }\n}\n\nexport async function runCollectorTeardown(\n collectors: Iterable<CheckpointCollector>,\n page: Page,\n testInfo?: TestInfo,\n): Promise<void> {\n const collectorList = Array.from(collectors).reverse();\n\n for (const collector of collectorList) {\n if (!collector.teardown) {\n continue;\n }\n\n try {\n await collector.teardown({ page, testInfo });\n } catch (error) {\n warn(`Collector \"${collector.name}\" teardown failed.`, error);\n }\n }\n}\n\nexport function resolveCollectors(\n globalConfig: CheckpointConfig = {},\n testConfig: TestCheckpointConfig | null = null,\n checkpointOptions: CheckpointOptions = {},\n): Map<string, ResolvedCollectorConfig> {\n const registry = collectorRegistryFor(globalConfig);\n const states = new Map<string, MutableCollectorState>();\n\n for (const collector of registry.values()) {\n states.set(collector.name, {\n enabled: collector.defaultEnabled,\n config: {},\n });\n }\n\n const levels = [globalConfig.collectors, testConfig?.collectors, checkpointOptions.collectors];\n\n for (const level of levels) {\n for (const [name, input] of Object.entries(level ?? {})) {\n states.set(name, applyCollectorInput(states.get(name), input));\n }\n }\n\n const resolved = new Map<string, ResolvedCollectorConfig>();\n\n for (const [name, state] of states) {\n if (state.enabled) {\n resolved.set(name, cloneResolvedConfig(state.config));\n }\n }\n\n return resolved;\n}\n\nexport async function runCollectorPipeline(args: RunCollectorPipelineArgs): Promise<CheckpointRecord> {\n const options = cloneCheckpointOptions(args.options ?? {});\n const slug = args.slug ?? checkpointSlug(args.name, args.manifest?.checkpoints ?? []);\n const checkpointDir = path.join(args.outputDir, slug);\n const collectorResults: Record<string, CollectorResult> = {};\n\n await fs.mkdir(checkpointDir, { recursive: true });\n await settlePage(args.page);\n\n for (const [collectorName, collectorConfig] of args.resolvedCollectors) {\n const collector = args.registry.get(collectorName);\n if (!collector) {\n warn(`Collector \"${collectorName}\" is enabled but no implementation is registered.`);\n continue;\n }\n\n try {\n const result = await collector.collect({\n page: args.page,\n testInfo: args.testInfo,\n checkpointDir,\n checkpointName: args.name,\n checkpointSlug: slug,\n redact: [...(args.redact ?? [])],\n config: cloneResolvedConfig(collectorConfig),\n options,\n adjustTimeout: args.adjustTimeout,\n });\n\n collectorResults[collectorName] = result;\n await attachArtifacts(args.testInfo, slug, collectorName, result.artifacts);\n } catch (error) {\n warn(`Collector \"${collectorName}\" failed during checkpoint \"${args.name}\".`, error);\n }\n }\n\n const record: CheckpointRecord = {\n name: args.name,\n slug,\n url: args.page.url(),\n title: await collectPageTitle(args.page),\n timestamp: new Date().toISOString(),\n ...(options.description ? { description: options.description } : {}),\n ...(typeof options.step === 'number' ? { step: options.step } : {}),\n collectors: collectorResults,\n };\n\n args.manifest?.checkpoints.push(record);\n return record;\n}\n\nexport async function captureCheckpoint(\n page: Page,\n name: string,\n options: CaptureCheckpointOptions,\n): Promise<CheckpointRecord> {\n const sessionConfig: CheckpointConfig = {\n collectors: options.collectors,\n custom: options.custom,\n redact: options.redact,\n };\n const registry = collectorRegistryFor(sessionConfig);\n const resolvedCollectors = resolveCollectors(sessionConfig, null, options);\n const enabledCollectors = Array.from(resolvedCollectors.keys())\n .map((collectorName) => registry.get(collectorName))\n .filter((collector): collector is CheckpointCollector => Boolean(collector));\n\n await fs.mkdir(options.outputDir, { recursive: true });\n await runCollectorSetup(enabledCollectors, page, options.testInfo);\n\n try {\n return await runCollectorPipeline({\n page,\n name,\n outputDir: options.outputDir,\n resolvedCollectors,\n registry,\n options,\n redact: options.redact,\n testInfo: options.testInfo,\n adjustTimeout: options.adjustTimeout,\n slug: checkpointSlug(name, []),\n });\n } finally {\n await runCollectorTeardown(enabledCollectors, page, options.testInfo);\n }\n}\n\nexport async function createCheckpointSession(page: Page, options: CheckpointSessionOptions): Promise<CheckpointSession> {\n const sessionConfig: CheckpointConfig = {\n collectors: options.collectors,\n custom: options.custom,\n redact: options.redact,\n };\n const outputDir = options.outputDir;\n const registry = collectorRegistryFor(sessionConfig);\n const manifest = options.manifest ?? createManifest(options.sessionMetadata);\n const setupCollectorNames = new Set<string>();\n const setupCollectors: CheckpointCollector[] = [];\n let finalizePromise: Promise<CheckpointManifest> | null = null;\n\n async function ensureCollectorsSetup(resolvedCollectors: Map<string, ResolvedCollectorConfig>): Promise<void> {\n for (const collectorName of resolvedCollectors.keys()) {\n if (setupCollectorNames.has(collectorName)) {\n continue;\n }\n\n const collector = registry.get(collectorName);\n if (!collector) {\n warn(`Collector \"${collectorName}\" is enabled but no implementation is registered.`);\n continue;\n }\n\n setupCollectorNames.add(collectorName);\n setupCollectors.push(collector);\n await runCollectorSetup([collector], page, options.testInfo);\n }\n }\n\n await fs.mkdir(outputDir, { recursive: true });\n await ensureCollectorsSetup(resolveCollectors(sessionConfig));\n\n return {\n outputDir,\n manifest,\n async checkpoint(name, checkpointOptions = {}) {\n if (finalizePromise) {\n throw new Error('Checkpoint session has already been finalized.');\n }\n\n const resolvedCollectors = resolveCollectors(sessionConfig, null, checkpointOptions);\n await ensureCollectorsSetup(resolvedCollectors);\n\n return runCollectorPipeline({\n page,\n name,\n outputDir,\n resolvedCollectors,\n registry,\n options: checkpointOptions,\n manifest,\n redact: options.redact,\n testInfo: options.testInfo,\n adjustTimeout: options.adjustTimeout,\n });\n },\n finalize() {\n if (!finalizePromise) {\n finalizePromise = (async () => {\n await runCollectorTeardown(setupCollectors, page, options.testInfo);\n await writeManifestFile(options.manifestPath ?? path.join(outputDir, 'checkpoint-manifest.json'), manifest);\n return manifest;\n })();\n }\n\n return finalizePromise;\n },\n };\n}\n\nexport { registerBuiltinCollector, registerBuiltinCollectors, settlePage };\n","/**\n * Checkpoint tool definitions and the handler that runs them locally.\n */\n\nimport type { Page } from 'playwright-core';\nimport type {\n CheckpointRecord,\n WebVitalsSnapshot,\n} from '../types';\nimport { captureCheckpoint, sanitizeSegment } from '../core';\nimport { runReporters } from '../report';\nimport type { CheckpointConfig } from '../types';\n\n// ---------------------------------------------------------------------------\n// Tool input schemas (JSON Schema for MCP tool registration)\n// ---------------------------------------------------------------------------\n\nconst browserCheckpointSchema = {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Unique name for this checkpoint (e.g. \"homepage\", \"after-login\").' },\n description: {\n type: 'string',\n description: 'Long-form description of what this checkpoint captures.',\n },\n highlightSelector: {\n type: 'string',\n description: 'CSS selector for a region to highlight in the annotated screenshot.',\n },\n fullPage: {\n type: 'boolean',\n description: 'Capture the full page (default: true). Set false for viewport-only.',\n },\n collectors: {\n type: 'object',\n description: 'Per-collector overrides. Set to false to disable, or an options object to configure.',\n additionalProperties: true,\n },\n },\n required: ['name'],\n};\n\nconst browserCheckpointReportSchema = {\n type: 'object' as const,\n properties: {\n outputDir: {\n type: 'string',\n description: 'Directory to write report files (default: ./report).',\n },\n format: {\n type: 'string',\n enum: ['html', 'markdown', 'mdx'],\n description: 'Report format(s) to generate.',\n },\n },\n};\n\nconst browserCheckpointCompareSchema = {\n type: 'object' as const,\n properties: {\n baseline: { type: 'string', description: 'Path or name of the baseline checkpoint manifest.' },\n current: { type: 'string', description: 'Path or name of the current checkpoint manifest.' },\n },\n required: ['baseline', 'current'],\n};\n\nexport const CHECKPOINT_TOOL_NAME = 'browser_checkpoint';\nexport const REPORT_TOOL_NAME = 'browser_checkpoint_report';\nexport const COMPARE_TOOL_NAME = 'browser_checkpoint_compare';\n\nexport const CHECKPOINT_TOOLS = [\n {\n name: CHECKPOINT_TOOL_NAME,\n description:\n 'Capture a structured snapshot of the current browser page: screenshot, accessibility violations, Web Vitals, console errors, and network failures. Returns an LLM-friendly summary plus artifact paths.',\n inputSchema: browserCheckpointSchema,\n },\n {\n name: REPORT_TOOL_NAME,\n description: 'Generate an HTML, Markdown, or MDX report from all checkpoint manifests in a directory.',\n inputSchema: browserCheckpointReportSchema,\n },\n {\n name: COMPARE_TOOL_NAME,\n description: 'Compare two checkpoint runs to surface differences (not yet implemented).',\n inputSchema: browserCheckpointCompareSchema,\n },\n] as const;\n\n// ---------------------------------------------------------------------------\n// Tool implementations\n// ---------------------------------------------------------------------------\n\nexport type ToolContext = {\n page: Page;\n outputDir: string;\n};\n\nexport async function handleBrowserCheckpoint(\n args: {\n name: string;\n description?: string;\n highlightSelector?: string;\n fullPage?: boolean;\n collectors?: Record<string, unknown>;\n },\n ctx: ToolContext,\n): Promise<string> {\n const slug = sanitizeSegment(args.name);\n\n const record = await captureCheckpoint(ctx.page, args.name, {\n outputDir: ctx.outputDir,\n highlightSelector: args.highlightSelector,\n fullPage: args.fullPage ?? true,\n description: args.description,\n collectors: args.collectors as Record<string, boolean | Record<string, unknown>> | undefined,\n });\n\n void slug; // reserved for future path-building use\n return formatCheckpointSummary(record);\n}\n\nexport async function handleBrowserCheckpointReport(\n args: {\n outputDir?: string;\n format?: 'html' | 'markdown' | 'mdx';\n },\n testResultsDir = 'test-results',\n): Promise<string> {\n const outputDir = args.outputDir ?? 'report';\n const config: CheckpointConfig = {\n reporters: {\n html: args.format === undefined || args.format === 'html',\n markdown: args.format === 'markdown',\n mdx: args.format === 'mdx',\n },\n };\n\n const { resolve } = await import('node:path');\n\n const results = await runReporters(\n config,\n resolve(process.cwd(), testResultsDir),\n resolve(process.cwd(), outputDir),\n );\n\n const lines = Object.entries(results).map(([name, result]) => `- ${name}: ${result.summary}`);\n if (lines.length === 0) {\n return 'No reports generated.';\n }\n return `Report generation complete:\\n${lines.join('\\n')}`;\n}\n\nexport function handleBrowserCheckpointCompare(\n _args: { baseline: string; current: string },\n): string {\n return 'browser_checkpoint_compare is not yet implemented.';\n}\n\n// ---------------------------------------------------------------------------\n// Summary formatter\n// ---------------------------------------------------------------------------\n\n/**\n * Format a CheckpointRecord into a clean, LLM-friendly text summary.\n */\nexport function formatCheckpointSummary(record: CheckpointRecord): string {\n const lines: string[] = [];\n\n lines.push(`Checkpoint \"${record.name}\" captured.`);\n lines.push(`URL: ${record.url}`);\n lines.push(`Title: ${record.title}`);\n lines.push('');\n\n // ── Accessibility ──────────────────────────────────────────────────────\n const axeData = record.collectors['axe'];\n if (axeData?.data) {\n const axe = axeData.data as { skipped?: boolean; violations?: number; reason?: string | null };\n if (axe.skipped) {\n lines.push(`Accessibility: skipped (${axe.reason ?? 'unknown reason'})`);\n } else {\n const violations = axe.violations ?? 0;\n lines.push(`Accessibility: ${violations} violation${violations !== 1 ? 's' : ''}`);\n }\n }\n\n // ── Web Vitals ────────────────────────────────────────────────────────\n const wvData = record.collectors['web-vitals'];\n if (wvData?.data) {\n const wv = wvData.data as WebVitalsSnapshot;\n lines.push('Web Vitals:');\n\n const metricLines: string[] = [];\n for (const [key, metric] of Object.entries(wv)) {\n if (!metric || typeof metric !== 'object') continue;\n const m = metric as { value: number | null; rating: string };\n if (m.value === null) continue;\n\n const ratingIcon = m.rating === 'good' ? '✅' : m.rating === 'needs-improvement' ? '⚠️' : m.rating === 'poor' ? '❌' : '';\n const label = key.replace(/Ms$/, '').toUpperCase();\n const formatted =\n key.endsWith('Ms') ? `${Math.round(m.value)}ms` : m.value.toFixed ? m.value.toFixed(3) : String(m.value);\n metricLines.push(` ${label}: ${formatted} (${m.rating} ${ratingIcon})`.trim());\n }\n if (metricLines.length > 0) {\n lines.push(metricLines.join('\\n'));\n }\n }\n\n // ── Console ────────────────────────────────────────────────────────────\n const consoleData = record.collectors['console'];\n if (consoleData?.data) {\n const entries = consoleData.data as Array<{ type: string; text: string }>;\n const errors = entries.filter((e) => e.type === 'error' || e.type === 'pageerror');\n if (errors.length > 0) {\n lines.push(`Console: ${errors.length} error${errors.length !== 1 ? 's' : ''}`);\n for (const err of errors.slice(0, 3)) {\n lines.push(` ${err.text}`);\n }\n if (errors.length > 3) {\n lines.push(` ... and ${errors.length - 3} more`);\n }\n } else {\n lines.push('Console: no errors');\n }\n }\n\n // ── Network ────────────────────────────────────────────────────────────\n const netData = record.collectors['network'];\n if (netData?.data) {\n const requests = netData.data as Array<{\n url: string;\n status: number | null;\n failureText: string | null;\n }>;\n const failed = requests.filter((r) => r.status === null || r.status >= 400 || r.failureText);\n if (failed.length > 0) {\n lines.push(`Network: ${failed.length} failed request${failed.length !== 1 ? 's' : ''}`);\n for (const req of failed.slice(0, 3)) {\n const reason = req.failureText ?? `${req.status} ${req.url}`;\n lines.push(` ${req.url} → ${reason}`);\n }\n if (failed.length > 3) {\n lines.push(` ... and ${failed.length - 3} more`);\n }\n } else {\n lines.push('Network: 0 failed requests');\n }\n }\n\n // ── Screenshot ─────────────────────────────────────────────────────────\n const ssData = record.collectors['screenshot'];\n if (ssData?.summary) {\n const ss = ssData.summary as { screenshotPath?: string };\n if (ss.screenshotPath) {\n lines.push(`Screenshot: ${ss.screenshotPath}`);\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * playwright-checkpoint MCP proxy server.\n *\n * Proxies all tools from an upstream Playwright MCP server while adding\n * the browser_checkpoint, browser_checkpoint_report, and\n * browser_checkpoint_compare tools handled locally.\n *\n * The StdioServerTransport is inlined locally. The SDK is loaded at runtime\n * (not bundled) so this module works even when the SDK is not installed,\n * with a clear error message when startMcpProxy() is actually called.\n */\n\nimport { StdioServerTransport } from './transport';\n\nimport { resolveUpstream, spawnUpstream, injectDebugPort } from './upstream';\nimport { getUpstreamPage, resetCachedConnection } from './browser-connect';\nimport {\n CHECKPOINT_TOOLS,\n CHECKPOINT_TOOL_NAME,\n REPORT_TOOL_NAME,\n COMPARE_TOOL_NAME,\n handleBrowserCheckpoint,\n handleBrowserCheckpointReport,\n handleBrowserCheckpointCompare,\n} from './tools';\n\n// ---------------------------------------------------------------------------\n// SDK availability check\n// ---------------------------------------------------------------------------\n\nfunction ensureMcpSdk(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require('@modelcontextprotocol/sdk');\n } catch {\n throw new Error(\n 'playwright-checkpoint MCP mode requires @modelcontextprotocol/sdk.\\n' +\n 'Install it: npm install @modelcontextprotocol/sdk',\n );\n }\n}\n\n/* eslint-disable @typescript-eslint/no-require-imports */\nfunction getNodeModuleCreateRequire(): (specifier: string) => NodeJS.Require {\n const { createRequire } = require('node:module');\n return createRequire(import.meta.url);\n}\n/* eslint-enable @typescript-eslint/no-require-imports */\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport type McpProxyOptions = {\n /** Explicit upstream package to proxy (e.g. \"@playwright/mcp\"). */\n upstream?: string;\n /** Run in standalone mode — no upstream proxying. */\n standalone?: boolean;\n /** CDP endpoint to connect to the browser directly (overrides auto-detection). */\n cdpEndpoint?: string;\n /** Directory for checkpoint output files (default: ./checkpoints). */\n outputDir?: string;\n /** Arguments to pass through to the upstream server (everything after --). */\n passthrough?: string[];\n};\n\n// ---------------------------------------------------------------------------\n// Server\n// ---------------------------------------------------------------------------\n\nexport async function startMcpProxy(options: McpProxyOptions = {}): Promise<void> {\n ensureMcpSdk();\n\n // Load SDK at runtime — it is a peer-optional dep so we do not bundle it.\n const req = getNodeModuleCreateRequire();\n const sdk: { ListToolsRequestSchema: unknown; CallToolRequestSchema: unknown } = req('@modelcontextprotocol/sdk') as unknown as {\n ListToolsRequestSchema: unknown;\n CallToolRequestSchema: unknown;\n };\n const sdkServer: { Server: unknown } = req('@modelcontextprotocol/sdk/server') as unknown as {\n Server: new (opts: unknown, capabilities?: unknown) => unknown\n };\n\n const ListToolsRequestSchema = sdk.ListToolsRequestSchema;\n const CallToolRequestSchema = sdk.CallToolRequestSchema;\n \n const Server = sdkServer.Server as new (opts: unknown, capabilities?: unknown) => any;\n\n const outputDir = options.outputDir ?? './checkpoints';\n\n // ── Resolve upstream ────────────────────────────────────────────────────\n let upstreamConnection: ReturnType<typeof spawnUpstream> | null = null;\n const upstreamTools: Array<{\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n }> = [];\n\n const upstreamPkg = options.standalone ? null : resolveUpstream({ upstream: options.upstream });\n\n if (upstreamPkg) {\n console.error(`[playwright-checkpoint MCP] Proxying upstream: ${upstreamPkg}`);\n\n let passthroughArgs = options.passthrough ?? [];\n\n // If no explicit CDP endpoint and no debug port in args, inject one\n // so we can auto-detect the browser\n if (!options.cdpEndpoint) {\n passthroughArgs = injectDebugPort(passthroughArgs);\n }\n\n upstreamConnection = spawnUpstream(upstreamPkg, passthroughArgs);\n\n // Wait briefly for the upstream to initialize, then fetch its tool list\n await new Promise<void>((resolve) => setTimeout(resolve, 500));\n try {\n const result = await upstreamConnection.listTools();\n for (const tool of result.tools) {\n upstreamTools.push({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n });\n }\n } catch (err) {\n console.error('[playwright-checkpoint MCP] Warning: could not list upstream tools:', err);\n }\n } else {\n console.error('[playwright-checkpoint MCP] Running in standalone mode (no upstream).');\n }\n\n // ── Build merged tool list ──────────────────────────────────────────────\n const checkpointTools = CHECKPOINT_TOOLS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema as Record<string, unknown>,\n }));\n\n const allTools = [...checkpointTools, ...upstreamTools];\n\n // ── Create MCP server ─────────────────────────────────────────────────\n \n const server = new Server({ name: 'playwright-checkpoint', version: '0.1.0-beta.0' }, { capabilities: { tools: {} } });\n\n \n server.setRequestHandler(ListToolsRequestSchema as any, async () => {\n return { tools: allTools };\n });\n\n \n server.setRequestHandler(CallToolRequestSchema as any, async (request: {\n params: { name: string; arguments?: Record<string, unknown> };\n }) => {\n const { name, arguments: args = {} } = request.params;\n\n // ── Handle checkpoint tools locally ──────────────────────────────────\n if (name === CHECKPOINT_TOOL_NAME) {\n const { page } = await getUpstreamPage(upstreamConnection?.process ?? null, {\n cdpEndpoint: options.cdpEndpoint,\n debugPort: 9222,\n });\n\n const result = await handleBrowserCheckpoint(\n args as Parameters<typeof handleBrowserCheckpoint>[0],\n { page, outputDir },\n );\n\n return { content: [{ type: 'text', text: result }] };\n }\n\n if (name === REPORT_TOOL_NAME) {\n const result = await handleBrowserCheckpointReport(\n args as Parameters<typeof handleBrowserCheckpointReport>[0],\n );\n return { content: [{ type: 'text', text: result }] };\n }\n\n if (name === COMPARE_TOOL_NAME) {\n const result = handleBrowserCheckpointCompare(\n args as Parameters<typeof handleBrowserCheckpointCompare>[0],\n );\n return { content: [{ type: 'text', text: result }], isError: true };\n }\n\n // ── Forward to upstream ──────────────────────────────────────────────\n if (upstreamConnection) {\n try {\n const result = await upstreamConnection.callTool(name, args as Record<string, unknown>);\n return {\n content: result.content as Array<{ type: string; [key: string]: unknown }>,\n isError: result.isError,\n structuredContent: result.structuredContent,\n };\n } catch (err) {\n return {\n content: [\n {\n type: 'text',\n text: `Upstream tool \"${name}\" failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n // No upstream and tool not found\n return { content: [{ type: 'text', text: `Tool \"${name}\" is not available.` }], isError: true };\n });\n\n // ── Connect transport and start ───────────────────────────────────────\n const transport = new StdioServerTransport();\n \n await (server as any).connect(transport);\n\n // Clean up on exit\n const cleanup = (): void => {\n resetCachedConnection();\n upstreamConnection?.close();\n };\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n}\n","import path from 'node:path';\nimport { runReporters } from '../report';\nimport type { CheckpointConfig } from '../types';\n\nexport const DEFAULT_RESULTS_DIR = 'test-results';\nexport const DEFAULT_REPORT_OUTPUT_DIR = 'report';\nexport const DEFAULT_DOCS_OUTPUT_DIR = 'docs';\n\ntype CliDeps = {\n cwd?: () => string;\n log?: (message: string) => void;\n error?: (message: string) => void;\n runReportersImpl?: typeof runReporters;\n};\n\ntype ParsedCli =\n | {\n command: 'help';\n }\n | {\n command: 'report';\n resultsDir: string;\n outputDir: string;\n reporters: string[] | null;\n }\n | {\n command: 'docs';\n resultsDir: string;\n outputDir: string;\n format: 'markdown' | 'mdx';\n filterTags: string[];\n };\n\nfunction printHelp(log: (message: string) => void): void {\n log(`playwright-checkpoint\n\nUsage:\n playwright-checkpoint report [--results-dir ./test-results] [--output-dir ./report] [--reporter html,markdown]\n playwright-checkpoint docs [--results-dir ./test-results] [--output-dir ./docs] [--format markdown|mdx] [--filter @user-journey]\n\nCommands:\n report Generate reports from checkpoint manifests\n docs Generate Markdown or MDX help articles from checkpoint manifests\n\nOptions:\n --results-dir <path> Directory containing checkpoint manifests (default: ./${DEFAULT_RESULTS_DIR})\n --output-dir <path> Directory where generated output is written (defaults: ./${DEFAULT_REPORT_OUTPUT_DIR} for report, ./${DEFAULT_DOCS_OUTPUT_DIR} for docs)\n --reporter <names> Comma-separated reporters to run with the report command (default: html)\n --format <name> Docs output format: markdown or mdx (default: markdown)\n --filter <tags> Comma-separated tag filter for docs generation\n -h, --help Show this help text`);\n}\n\nfunction takeFlagValue(args: string[], index: number, flag: string): { value: string; nextIndex: number } {\n const value = args[index + 1];\n if (!value) {\n throw new Error(`Missing value for ${flag}.`);\n }\n\n return {\n value,\n nextIndex: index + 1,\n };\n}\n\nfunction parseCommaSeparated(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nexport function parseCliArgs(argv: string[]): ParsedCli {\n if (argv.length === 0 || argv.includes('--help') || argv.includes('-h')) {\n return { command: 'help' };\n }\n\n const [command, ...rest] = argv;\n if (command !== 'report' && command !== 'docs') {\n throw new Error(`Unknown command \"${command}\".`);\n }\n\n let resultsDir = DEFAULT_RESULTS_DIR;\n let outputDir = command === 'docs' ? DEFAULT_DOCS_OUTPUT_DIR : DEFAULT_REPORT_OUTPUT_DIR;\n let reporters: string[] | null = null;\n let format: 'markdown' | 'mdx' = 'markdown';\n let filterTags: string[] = [];\n\n for (let index = 0; index < rest.length; index += 1) {\n const argument = rest[index];\n if (!argument) {\n continue;\n }\n\n if (argument === '--results-dir') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n resultsDir = value;\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--results-dir=')) {\n resultsDir = argument.slice('--results-dir='.length);\n continue;\n }\n\n if (argument === '--output-dir') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n outputDir = value;\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--output-dir=')) {\n outputDir = argument.slice('--output-dir='.length);\n continue;\n }\n\n if (command === 'report') {\n if (argument === '--reporter') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n reporters = parseCommaSeparated(value);\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--reporter=')) {\n reporters = parseCommaSeparated(argument.slice('--reporter='.length));\n continue;\n }\n }\n\n if (command === 'docs') {\n if (argument === '--format') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n if (value !== 'markdown' && value !== 'mdx') {\n throw new Error(`Unsupported docs format \"${value}\".`);\n }\n format = value;\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--format=')) {\n const value = argument.slice('--format='.length);\n if (value !== 'markdown' && value !== 'mdx') {\n throw new Error(`Unsupported docs format \"${value}\".`);\n }\n format = value;\n continue;\n }\n\n if (argument === '--filter') {\n const { value, nextIndex } = takeFlagValue(rest, index, argument);\n filterTags = parseCommaSeparated(value);\n index = nextIndex;\n continue;\n }\n\n if (argument.startsWith('--filter=')) {\n filterTags = parseCommaSeparated(argument.slice('--filter='.length));\n continue;\n }\n }\n\n throw new Error(`Unknown argument \"${argument}\".`);\n }\n\n if (command === 'docs') {\n return {\n command,\n resultsDir,\n outputDir,\n format,\n filterTags,\n };\n }\n\n return {\n command,\n resultsDir,\n outputDir,\n reporters,\n };\n}\n\nfunction reporterConfig(reporters: string[] | null): CheckpointConfig {\n if (!reporters || reporters.length === 0) {\n return {};\n }\n\n const selected = new Set(reporters);\n\n return {\n reporters: {\n html: selected.has('html'),\n markdown: selected.has('markdown'),\n mdx: selected.has('mdx'),\n ...Object.fromEntries(reporters.map((name) => [name, true])),\n },\n };\n}\n\nfunction docsConfig(format: 'markdown' | 'mdx', filterTags: string[]): CheckpointConfig {\n const reporterName = format === 'mdx' ? 'mdx' : 'markdown';\n\n return {\n reporters: {\n html: false,\n markdown: false,\n mdx: false,\n [reporterName]: {\n ...(filterTags.length > 0 ? { includeTags: filterTags } : {}),\n },\n },\n };\n}\n\nexport async function runCli(argv = process.argv.slice(2), deps: CliDeps = {}): Promise<number> {\n const cwd = deps.cwd ?? process.cwd;\n const log = deps.log ?? console.log;\n const error = deps.error ?? console.error;\n const runReportersImpl = deps.runReportersImpl ?? runReporters;\n\n let parsed: ParsedCli;\n try {\n parsed = parseCliArgs(argv);\n } catch (caught) {\n error(`[playwright-checkpoint] ${caught instanceof Error ? caught.message : String(caught)}`);\n error('Run `playwright-checkpoint --help` for usage.');\n return 1;\n }\n\n if (parsed.command === 'help') {\n printHelp(log);\n return 0;\n }\n\n const resultsDir = path.resolve(cwd(), parsed.resultsDir);\n const outputDir = path.resolve(cwd(), parsed.outputDir);\n\n try {\n const config = parsed.command === 'docs' ? docsConfig(parsed.format, parsed.filterTags) : reporterConfig(parsed.reporters);\n const results = await runReportersImpl(config, resultsDir, outputDir);\n const summaryLines = Object.entries(results).map(([name, result]) => `- ${name}: ${result.summary}`);\n\n log(\n parsed.command === 'docs'\n ? `[playwright-checkpoint] Generated ${parsed.format.toUpperCase()} docs from ${resultsDir} to ${outputDir}`\n : `[playwright-checkpoint] Generated reports from ${resultsDir} to ${outputDir}`,\n );\n\n if (summaryLines.length > 0) {\n for (const line of summaryLines) {\n log(line);\n }\n } else {\n log('- No reporters were enabled.');\n }\n\n return 0;\n } catch (caught) {\n error('[playwright-checkpoint] Failed to generate reports.');\n error(caught instanceof Error ? caught.stack ?? caught.message : String(caught));\n return 1;\n }\n}\n","/**\n * Argument parsing for the `playwright-checkpoint mcp` subcommand.\n *\n * Syntax:\n * playwright-checkpoint mcp [--upstream <pkg>] [--standalone] [--cdp-endpoint <url>]\n * [--output-dir <path>] [--] [<passthrough-args>...]\n *\n * The `--` separator terminates flag parsing; everything after it is passed\n * through to the upstream MCP server unchanged.\n */\n\nexport type McpFlags = {\n upstream?: string;\n standalone?: boolean;\n cdpEndpoint?: string;\n outputDir?: string;\n};\n\nexport type ParsedMcpArgs = {\n flags: McpFlags;\n passthroughArgs: string[];\n};\n\n/**\n * Parse CLI arguments for the `mcp` subcommand.\n *\n * Returns the parsed flags and any remaining positional / passthrough arguments.\n */\nexport function parseMcpCliArgs(argv: string[]): ParsedMcpArgs {\n const flags: McpFlags = {};\n const passthroughArgs: string[] = [];\n let doubleDashSeen = false;\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i] ?? '';\n\n if (doubleDashSeen) {\n passthroughArgs.push(arg);\n continue;\n }\n\n if (arg === '--') {\n doubleDashSeen = true;\n continue;\n }\n\n if (arg === '--upstream') {\n const value = argv[i + 1];\n if (!value || value.startsWith('-')) {\n throw new Error('--upstream requires a package name argument.');\n }\n flags.upstream = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--upstream=')) {\n flags.upstream = arg.slice('--upstream='.length);\n continue;\n }\n\n if (arg === '--standalone') {\n flags.standalone = true;\n continue;\n }\n\n if (arg === '--cdp-endpoint') {\n const value = argv[i + 1];\n if (!value || value.startsWith('-')) {\n throw new Error('--cdp-endpoint requires a URL argument.');\n }\n flags.cdpEndpoint = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--cdp-endpoint=')) {\n flags.cdpEndpoint = arg.slice('--cdp-endpoint='.length);\n continue;\n }\n\n if (arg === '--output-dir') {\n const value = argv[i + 1];\n if (!value || value.startsWith('-')) {\n throw new Error('--output-dir requires a path argument.');\n }\n flags.outputDir = value;\n i += 1;\n continue;\n }\n\n if (arg.startsWith('--output-dir=')) {\n flags.outputDir = arg.slice('--output-dir='.length);\n continue;\n }\n\n if (arg === '--help' || arg === '-h') {\n flags.upstream = '__help__'; // signal to bin.ts to print help\n return { flags, passthroughArgs: [] };\n }\n\n // Unknown flag — treat remaining args as passthrough\n passthroughArgs.push(arg, ...argv.slice(i + 1));\n break;\n }\n\n return { flags, passthroughArgs };\n}\n\n/**\n * Print the MCP subcommand help text.\n */\nexport function printMcpHelp(log: (msg: string) => void): void {\n log(`playwright-checkpoint mcp\n\nStart the playwright-checkpoint MCP proxy server.\n\nUsage:\n playwright-checkpoint mcp [options] [-- <upstream-args>...]\n\nOptions:\n --upstream <pkg> Upstream MCP package to proxy (default: auto-detect)\n --standalone Run without an upstream MCP server\n --cdp-endpoint <url> Connect directly to a browser CDP endpoint\n --output-dir <path> Directory for checkpoint output (default: ./checkpoints)\n -h, --help Show this help text\n\nAll arguments after -- are passed through to the upstream MCP server.\n\nExamples:\n # Auto-detect @playwright/mcp from node_modules\n playwright-checkpoint mcp\n\n # Explicit upstream package\n playwright-checkpoint mcp --upstream @playwright/mcp\n\n # Pass headless args to upstream\n playwright-checkpoint mcp -- --headless --browser chrome\n\n # Standalone mode (no upstream, connect to existing browser)\n playwright-checkpoint mcp --standalone --cdp-endpoint http://localhost:9222\n`);\n}\n","#!/usr/bin/env node\n\nimport { runCli } from './index';\nimport { parseMcpCliArgs, printMcpHelp } from './mcp-args';\n\nconst argv = process.argv.slice(2);\n\nif (argv[0] === 'mcp') {\n const { passthroughArgs, flags } = parseMcpCliArgs(argv.slice(1));\n\n if (flags.upstream === '__help__') {\n printMcpHelp(console.log);\n process.exit(0);\n }\n\n void (async () => {\n try {\n const { startMcpProxy } = await import('../mcp/index.js');\n await startMcpProxy({\n upstream: flags.upstream,\n standalone: flags.standalone,\n cdpEndpoint: flags.cdpEndpoint,\n outputDir: flags.outputDir,\n passthrough: passthroughArgs,\n });\n } catch (err) {\n console.error(\n '[playwright-checkpoint MCP]',\n err instanceof Error ? err.message : String(err),\n );\n process.exit(1);\n }\n })();\n} else {\n void runCli(argv).then((code) => {\n process.exitCode = code;\n });\n}\n"],"mappings":"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","names":["path","fs","slugify","resolveArtifactPath","path","screenshotData","location","fs","import_promises","import_node_path","slugify","stripTags","normalizeConfig","normalizeTags","shouldIncludeRun","choosePrimaryRun","orderedCheckpoints","resolveArtifactPath","path","screenshotSourcePath","screenshotData","focusNote","urlLabel","autoDescription","location","markdownRelativePath","rewriteImagePath","yamlScalar","serializeFrontmatter","projectWeight","DEFAULT_PROJECT_ORDER","formatProjectLabel","materializeScreenshot","fs","buildSteps","import_promises","import_node_path","fs","path","reporterConfig","import_promises","import_node_path","getNodeModuleCreateRequire","import_promises","import_node_path","path","fs","module","import_promises","import_node_path","path","fs","location","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_promises","import_node_path","path","fs","import_node_path","path","toRegex","DEFAULT_REDACT_PATTERNS","EMAIL_LIKE_REGEX","import_promises","import_node_path","REDACTED","path","fs","import_promises","import_node_path","path","fs","builtinCollectors","path","fs","import_promises","import_node_path","metric","getNodeModuleCreateRequire","import_meta","import_node_path","argv","path","argv","startMcpProxy"]}
|