@kb-labs/qa-core 2.119.0-canary.f8394d5fd → 2.119.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/devkit/devkit-discovery.ts","../src/devkit/devkit-adapter.ts","../src/devkit/git-capture.ts","../src/ci/github-actions-provider.ts","../src/ci/reliability-analyzer.ts","../src/ci/dossier-store.ts","../src/snapshot/snapshot-store.ts","../src/analysis/trend-analyzer.ts","../src/analysis/regression-detector.ts","../src/analysis/baseline-comparator.ts","../src/analysis/package-timeline.ts","../src/analysis/case-timeline.ts","../src/report/text-reporter.ts","../src/report/json-reporter.ts"],"names":["join","existsSync","readFileSync","r","TRENDS_WINDOW","p"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Resolve the kb-devkit binary path.\n *\n * Resolution order:\n * 1. configPath (from QAPluginConfig.devkitPath) — absolute or relative to rootDir\n * 2. tools/kb-devkit/kb-devkit relative to rootDir (workspace-local copy)\n * 3. \"kb-devkit\" — resolved from PATH at spawn time\n *\n * The shell permission whitelist matches by basename, so passing a full path\n * to shell.exec() works correctly when allow: ['kb-devkit'] is declared.\n */\nexport function resolveDevkitBin(rootDir: string, configPath?: string): string {\n if (configPath) {\n const full = configPath.startsWith('/') ? configPath : join(rootDir, configPath);\n if (!existsSync(full)) {\n throw new Error(`devkitPath \"${configPath}\" not found at ${full}`);\n }\n return full;\n }\n\n const local = join(rootDir, 'tools', 'kb-devkit', 'kb-devkit');\n if (existsSync(local)) {return local;}\n\n return 'kb-devkit';\n}\n","import type { ShellAPI } from '@kb-labs/sdk';\nimport type {\n DevkitRunOutput,\n DevkitCheckOutput,\n DevkitStatsOutput,\n DevkitStatusOutput,\n DevkitGateOutput,\n} from '@kb-labs/qa-contracts';\n\nexport interface DevkitAdapterOptions {\n binaryPath: string;\n cwd: string;\n shell: ShellAPI;\n timeoutMs?: number;\n}\n\nexport class DevkitAdapter {\n private readonly bin: string;\n private readonly cwd: string;\n private readonly shell: ShellAPI;\n private readonly timeout: number;\n\n constructor(opts: DevkitAdapterOptions) {\n this.bin = opts.binaryPath;\n this.cwd = opts.cwd;\n this.shell = opts.shell;\n this.timeout = opts.timeoutMs ?? 600_000;\n }\n\n async run(tasks: string[]): Promise<DevkitRunOutput> {\n if (tasks.length === 0) {throw new Error('DevkitAdapter.run: tasks must not be empty');}\n return this.invoke<DevkitRunOutput>(['run', ...tasks]);\n }\n\n async check(): Promise<DevkitCheckOutput> {\n return this.invoke<DevkitCheckOutput>(['check']);\n }\n\n async stats(): Promise<DevkitStatsOutput> {\n return this.invoke<DevkitStatsOutput>(['stats']);\n }\n\n async status(): Promise<DevkitStatusOutput> {\n return this.invoke<DevkitStatusOutput>(['status']);\n }\n\n async gate(): Promise<DevkitGateOutput> {\n return this.invoke<DevkitGateOutput>(['gate']);\n }\n\n async version(): Promise<string> {\n const result = await this.shell.exec(this.bin, ['--version'], {\n cwd: this.cwd,\n timeout: 5_000,\n throwOnError: false,\n });\n if (!result.ok) {\n throw new Error(\n `kb-devkit not found or not executable at \"${this.bin}\". ` +\n `Set QAPluginConfig.devkitPath or ensure kb-devkit is on PATH.`\n );\n }\n return result.stdout.trim();\n }\n\n private async invoke<T>(args: string[]): Promise<T> {\n const result = await this.shell.exec(this.bin, [...args, '--json'], {\n cwd: this.cwd,\n timeout: this.timeout,\n throwOnError: false,\n });\n\n if (result.code !== 0 && !result.stdout.trim()) {\n throw new Error(\n `kb-devkit ${args[0]} failed (exit ${result.code}): ${result.stderr.slice(0, 500)}`\n );\n }\n\n try {\n return JSON.parse(result.stdout) as T;\n } catch {\n throw new Error(\n `kb-devkit ${args[0]} produced non-JSON output (exit ${result.code}). ` +\n `stderr: ${result.stderr.slice(0, 300)}`\n );\n }\n }\n}\n","import type { ShellAPI } from '@kb-labs/sdk';\nimport type { SnapshotGit } from '@kb-labs/qa-contracts';\n\n/**\n * Capture current git context using ctx.api.shell.\n * Returns undefined if the directory is not a git repo or git is unavailable.\n */\nexport async function captureGit(shell: ShellAPI, cwd: string): Promise<SnapshotGit | undefined> {\n try {\n const [commitRes, branchRes, messageRes] = await Promise.all([\n shell.exec('git', ['rev-parse', '--short', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['log', '-1', '--format=%s'], { cwd, throwOnError: false }),\n ]);\n\n if (!commitRes.ok) {return undefined;}\n\n return {\n commit: commitRes.stdout.trim(),\n branch: branchRes.stdout.trim() || 'HEAD',\n message: messageRes.stdout.trim(),\n };\n } catch {\n return undefined;\n }\n}\n","import type { ShellAPI } from '@kb-labs/sdk';\nimport type { CiEvidenceSyncResult, CiFailureEvidence, CiJobEvidence, CiRunDossier, CiStepEvidence } from '@kb-labs/qa-contracts';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\ninterface GithubRun {\n id: number;\n run_attempt: number;\n event: string;\n status: string;\n conclusion: string | null;\n run_started_at: string | null;\n updated_at: string | null;\n head_sha: string;\n head_branch: string | null;\n html_url: string;\n name: string;\n path?: string;\n}\n\ninterface GithubJob {\n id: number;\n name: string;\n conclusion: string | null;\n started_at: string | null;\n completed_at: string | null;\n html_url: string;\n runner_name?: string;\n runner_group_name?: string;\n steps?: Array<{ number: number; name: string; conclusion: string | null; started_at: string | null; completed_at: string | null }>;\n}\n\ninterface GithubJobsResponse { jobs: GithubJob[]; }\ntype GithubStep = NonNullable<GithubJob['steps']>[number];\ninterface GithubRunListEntry { databaseId: number; }\n\nexport interface CiProvider {\n captureRun(input: {\n repository: string;\n runId: string;\n workflowPath?: string;\n workflowSha?: string;\n excludeJobNames?: string[];\n }): Promise<CiRunDossier>;\n}\n\n/** GitHub Actions adapter. The only external requirement is the GitHub CLI already present on Actions runners. */\nexport class GithubActionsProvider implements CiProvider {\n constructor(private readonly shell: ShellAPI, private readonly cwd: string) {}\n\n async captureRun(input: {\n repository: string;\n runId: string;\n workflowPath?: string;\n workflowSha?: string;\n excludeJobNames?: string[];\n }): Promise<CiRunDossier> {\n const run = await this.api<GithubRun>(`repos/${input.repository}/actions/runs/${input.runId}`);\n const jobsResponse = await this.api<GithubJobsResponse>(`repos/${input.repository}/actions/runs/${input.runId}/jobs?per_page=100`);\n const failedLog = await this.getFailedLog(input.repository, input.runId);\n const excludedJobs = new Set(input.excludeJobNames ?? []);\n const jobs = jobsResponse.jobs\n .filter(job => !excludedJobs.has(job.name))\n .map(job => this.toEvidence(job, failedLog));\n const complete = jobs.length > 0 && jobs.every(job => job.conclusion !== null);\n return {\n schemaVersion: 1,\n provider: 'github-actions',\n collectedAt: new Date().toISOString(),\n collectionStatus: complete ? 'complete' : 'partial',\n run: {\n id: String(run.id), attempt: run.run_attempt, event: run.event, status: run.status,\n conclusion: run.conclusion, startedAt: run.run_started_at, completedAt: run.updated_at,\n headSha: run.head_sha, headBranch: run.head_branch, htmlUrl: run.html_url,\n },\n workflow: { name: run.name, path: input.workflowPath, sha: input.workflowSha },\n jobs,\n sourceRefs: [\n { kind: 'run', url: run.html_url, label: `GitHub Actions run ${run.id}` },\n ...jobs.map(job => ({ kind: 'job-log' as const, url: job.htmlUrl, label: job.name })),\n ],\n };\n }\n\n /** Downloads immutable run artifacts only when this workspace has not seen them yet. */\n async syncDossiers(input: { repository: string; workflow: string; limit: number; outputDir: string }): Promise<CiEvidenceSyncResult> {\n const list = await this.shell.exec('gh', [\n 'run', 'list', '--repo', input.repository, '--workflow', input.workflow,\n '--limit', String(input.limit), '--json', 'databaseId',\n ], { cwd: this.cwd, throwOnError: false });\n if (!list.ok) {\n throw new Error(`Unable to list GitHub Actions runs: ${list.stderr.trim() || list.stdout.trim()}`);\n }\n const runs = JSON.parse(list.stdout) as GithubRunListEntry[];\n const result: CiEvidenceSyncResult = { requestedRuns: runs.length, downloadedRunIds: [], cachedRunIds: [], unavailableRunIds: [] };\n for (const run of runs) {\n const runId = String(run.databaseId);\n const target = join(input.outputDir, runId, 'dossier.json');\n if (existsSync(target)) {\n result.cachedRunIds.push(runId);\n continue;\n }\n const download = await this.shell.exec('gh', [\n 'run', 'download', runId, '--repo', input.repository,\n '--name', `qa-ci-evidence-${runId}`, '--dir', join(input.outputDir, runId),\n ], { cwd: this.cwd, throwOnError: false });\n if (download.ok && existsSync(target)) {result.downloadedRunIds.push(runId);}\n else {result.unavailableRunIds.push(runId);}\n }\n return result;\n }\n\n private async api<T>(path: string): Promise<T> {\n const result = await this.shell.exec('gh', ['api', `/${path}`], { cwd: this.cwd, throwOnError: false });\n if (!result.ok) {\n throw new Error(`GitHub Actions API request failed for ${path}: ${result.stderr.trim() || result.stdout.trim()}`);\n }\n return JSON.parse(result.stdout) as T;\n }\n\n private async getFailedLog(repository: string, runId: string): Promise<string | undefined> {\n const result = await this.shell.exec('gh', ['run', 'view', runId, '--repo', repository, '--log-failed'], {\n cwd: this.cwd, throwOnError: false,\n });\n return result.ok && result.stdout.trim() ? result.stdout : undefined;\n }\n\n private toEvidence(job: GithubJob, failedLog?: string): CiJobEvidence {\n const steps = (job.steps ?? []).map(step => this.toStep(step));\n const failedStep = steps.find(step => step.conclusion === 'failure');\n return {\n id: String(job.id), name: job.name, conclusion: job.conclusion,\n startedAt: job.started_at, completedAt: job.completed_at,\n durationMs: duration(job.started_at, job.completed_at), htmlUrl: job.html_url,\n runner: { name: job.runner_name, group: job.runner_group_name },\n steps,\n failure: failedStep ? classifyFailure(failedStep.name, failedLog) : undefined,\n };\n }\n\n private toStep(step: GithubStep): CiStepEvidence {\n return {\n number: step.number, name: step.name, conclusion: step.conclusion,\n startedAt: step.started_at, completedAt: step.completed_at,\n durationMs: duration(step.started_at, step.completed_at),\n };\n }\n}\n\nfunction duration(startedAt: string | null, completedAt: string | null): number | null {\n if (!startedAt || !completedAt) {return null;}\n const value = Date.parse(completedAt) - Date.parse(startedAt);\n return Number.isFinite(value) && value >= 0 ? value : null;\n}\n\nfunction classifyFailure(stepName: string, failedLog?: string): CiFailureEvidence {\n const normalized = stepName.toLowerCase();\n const log = failedLog?.toLowerCase() ?? '';\n if (log.includes('registry-1.docker.io') || log.includes('docker hub') || log.includes('client.timeout exceeded')) {\n return {\n phase: 'setup', fingerprint: 'network.registry.docker-hub-timeout',\n summary: 'Container registry request timed out before tests started',\n excerpt: excerpt(failedLog, /registry-1\\.docker\\.io|Client\\.Timeout exceeded|docker hub/i), confidence: 0.95,\n };\n }\n if (log.includes('permission_denied') || log.includes('denied:')) {\n return {\n phase: 'publish', fingerprint: 'permissions.registry.denied', summary: 'Container registry permission was denied',\n excerpt: excerpt(failedLog, /permission_denied|denied:/i), confidence: 0.9,\n };\n }\n if (log.includes('e403') || log.includes('forbidden')) {\n return {\n phase: 'publish', fingerprint: 'permissions.package-publish-forbidden', summary: 'Package publish was forbidden',\n excerpt: excerpt(failedLog, /E403|forbidden/i), confidence: 0.9,\n };\n }\n if (normalized.includes('test') || normalized.includes('playwright')) {\n return { phase: 'test', fingerprint: 'test.failure.unclassified', summary: `Test step failed: ${stepName}`, confidence: 0.45 };\n }\n if (normalized.includes('build') || normalized.includes('pack')) {\n return { phase: 'build', fingerprint: 'build.failure.unclassified', summary: `Build step failed: ${stepName}`, confidence: 0.45 };\n }\n if (normalized.includes('publish') || normalized.includes('deploy')) {\n return { phase: 'publish', fingerprint: 'publish.failure.unclassified', summary: `Publish step failed: ${stepName}`, confidence: 0.45 };\n }\n return { phase: 'setup', fingerprint: 'setup.failure.unclassified', summary: `Setup step failed: ${stepName}`, confidence: 0.35 };\n}\n\nfunction excerpt(log: string | undefined, pattern: RegExp): string | undefined {\n if (!log) {return undefined;}\n const line = log.split('\\n').find(value => pattern.test(value));\n return line?.trim().slice(0, 500);\n}\n","import type { CiReliabilityFinding, CiReliabilityOverview, CiRunDossier } from '@kb-labs/qa-contracts';\n\nexport function analyzeCiReliability(dossiers: CiRunDossier[]): CiReliabilityOverview {\n const findings = new Map<string, CiReliabilityFinding>();\n let failedRuns = 0;\n let failedBeforeTests = 0;\n let complete = 0;\n for (const dossier of dossiers) {\n if (dossier.collectionStatus === 'complete') {complete++;}\n const failures = dossier.jobs.filter(job => job.failure);\n if (failures.length > 0) {failedRuns++;}\n if (failures.some(job => job.failure?.phase !== 'test')) {failedBeforeTests++;}\n for (const job of failures) {\n const failure = job.failure!;\n const existing = findings.get(failure.fingerprint);\n if (existing) {\n existing.occurrences++;\n existing.affectedJobs = unique([...existing.affectedJobs, job.name]);\n existing.sampleRunIds = unique([...existing.sampleRunIds, dossier.run.id]).slice(-5);\n existing.lastSeenAt = dossier.collectedAt;\n existing.confidence = Math.max(existing.confidence, failure.confidence);\n } else {\n findings.set(failure.fingerprint, {\n fingerprint: failure.fingerprint, phase: failure.phase, summary: failure.summary,\n confidence: failure.confidence, occurrences: 1, affectedJobs: [job.name],\n sampleRunIds: [dossier.run.id], firstSeenAt: dossier.collectedAt, lastSeenAt: dossier.collectedAt,\n });\n }\n }\n }\n const ordered = [...findings.values()].sort((a, b) => b.occurrences - a.occurrences || b.confidence - a.confidence);\n return {\n schemaVersion: 1, generatedAt: new Date().toISOString(), runsAnalyzed: dossiers.length,\n failedRuns, failedBeforeTests, collection: { complete, partial: dossiers.length - complete },\n findings: ordered, drillDown: { runIds: unique(ordered.flatMap(finding => finding.sampleRunIds)) },\n };\n}\n\nfunction unique(values: string[]): string[] { return [...new Set(values)]; }\n","import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CiRunDossier } from '@kb-labs/qa-contracts';\n\n/** Reads only dossier-shaped files; a partial artifact never breaks an investigation. */\nexport function loadCiDossiers(path: string): CiRunDossier[] {\n const dossiers: CiRunDossier[] = [];\n for (const file of findDossierFiles(path)) {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf8')) as Partial<CiRunDossier>;\n if (parsed.schemaVersion === 1 && parsed.provider === 'github-actions' && parsed.run?.id) {\n dossiers.push(parsed as CiRunDossier);\n }\n } catch { /* ignore incomplete or manually corrupted evidence */ }\n }\n return dossiers;\n}\n\nfunction findDossierFiles(path: string): string[] {\n if (!existsSync(path)) {return [];}\n if (!statSync(path).isDirectory()) {return [path];}\n const files: string[] = [];\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n const child = join(path, entry.name);\n if (entry.isDirectory()) {files.push(...findDossierFiles(child));}\n if (entry.isFile() && entry.name === 'dossier.json') {files.push(child);}\n }\n return files;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport {\n PATHS,\n HISTORY_MAX_ENTRIES,\n} from '@kb-labs/qa-contracts';\nimport type {\n RunSnapshot,\n CheckSnapshot,\n StatsSnapshot,\n GateSnapshot,\n E2eFlakySnapshot,\n E2eCaseResult,\n SnapshotMeta,\n SnapshotGit,\n BaselineData,\n DevkitRunOutput,\n DevkitCheckOutput,\n DevkitStatsOutput,\n DevkitGateOutput,\n} from '@kb-labs/qa-contracts';\n\nfunction readJson<T>(filePath: string): T[] {\n if (!existsSync(filePath)) {return [];}\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T[];\n } catch {\n return [];\n }\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {mkdirSync(dir, { recursive: true });}\n writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\nfunction buildMeta(\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n): SnapshotMeta {\n return {\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n durationMs,\n ...(git ? { git } : {}),\n ...(runContext ? { runContext } : {}),\n };\n}\n\nexport class SnapshotStore {\n private readonly rootDir: string;\n private readonly maxEntries: number;\n\n constructor(rootDir: string, maxEntries = HISTORY_MAX_ENTRIES) {\n this.rootDir = rootDir;\n this.maxEntries = maxEntries;\n }\n\n // ── Run snapshots ──────────────────────────────────────────────────────────\n\n loadRunHistory(): RunSnapshot[] {\n return readJson<RunSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_RUN));\n }\n\n saveRun(\n raw: DevkitRunOutput,\n tasks: string[],\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): RunSnapshot {\n const snap: RunSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'run',\n tasks,\n raw,\n };\n const history = this.loadRunHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_RUN), history);\n return snap;\n }\n\n latestRun(): RunSnapshot | null {\n const h = this.loadRunHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Check snapshots ────────────────────────────────────────────────────────\n\n loadCheckHistory(): CheckSnapshot[] {\n return readJson<CheckSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_CHECK));\n }\n\n saveCheck(\n raw: DevkitCheckOutput,\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): CheckSnapshot {\n const snap: CheckSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'check',\n raw,\n };\n const history = this.loadCheckHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_CHECK), history);\n return snap;\n }\n\n latestCheck(): CheckSnapshot | null {\n const h = this.loadCheckHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Stats snapshots ────────────────────────────────────────────────────────\n\n loadStatsHistory(): StatsSnapshot[] {\n return readJson<StatsSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_STATS));\n }\n\n saveStats(\n raw: DevkitStatsOutput,\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): StatsSnapshot {\n const snap: StatsSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'stats',\n raw,\n };\n const history = this.loadStatsHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_STATS), history);\n return snap;\n }\n\n latestStats(): StatsSnapshot | null {\n const h = this.loadStatsHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Gate snapshots ─────────────────────────────────────────────────────────\n\n loadGateHistory(): GateSnapshot[] {\n return readJson<GateSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_GATE));\n }\n\n saveGate(\n raw: DevkitGateOutput,\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): GateSnapshot {\n const snap: GateSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'gate',\n raw,\n };\n const history = this.loadGateHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_GATE), history);\n return snap;\n }\n\n // ── E2E flaky snapshots ───────────────────────────────────────────────────────\n\n loadE2eFlakyHistory(): E2eFlakySnapshot[] {\n return readJson<E2eFlakySnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_E2E_FLAKY));\n }\n\n saveE2eFlaky(\n cases: E2eCaseResult[],\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): E2eFlakySnapshot {\n const snap: E2eFlakySnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'e2e-flaky',\n cases,\n };\n const history = this.loadE2eFlakyHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_E2E_FLAKY), history);\n return snap;\n }\n\n latestE2eFlaky(): E2eFlakySnapshot | null {\n const h = this.loadE2eFlakyHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Baseline ───────────────────────────────────────────────────────────────\n\n loadBaseline(): BaselineData | null {\n const p = join(this.rootDir, PATHS.BASELINE);\n if (!existsSync(p)) {return null;}\n try {\n return JSON.parse(readFileSync(p, 'utf-8')) as BaselineData;\n } catch {\n return null;\n }\n }\n\n saveBaseline(\n check: DevkitCheckOutput,\n stats: DevkitStatsOutput,\n git?: SnapshotGit,\n ): BaselineData {\n const baseline: BaselineData = {\n timestamp: new Date().toISOString(),\n ...(git ? { git } : {}),\n check,\n stats,\n };\n writeJson(join(this.rootDir, PATHS.BASELINE), baseline);\n return baseline;\n }\n}\n","import type {\n RunSnapshot,\n TaskTrend,\n TaskTrendPoint,\n TaskTrendChangelog,\n TrendAnalysis,\n} from '@kb-labs/qa-contracts';\nimport { TRENDS_WINDOW } from '@kb-labs/qa-contracts';\n\nfunction extractFailed(snap: RunSnapshot, task: string): string[] {\n return snap.raw.results\n .filter(r => r.Task === task && !r.OK && !r.Cached)\n .map(r => r.Package);\n}\n\nfunction collectTasks(snapshots: RunSnapshot[]): string[] {\n const s = new Set<string>();\n for (const snap of snapshots) {\n for (const r of snap.raw.results) {s.add(r.Task);}\n }\n return [...s];\n}\n\nfunction buildTimeSeries(snapshots: RunSnapshot[], task: string): TaskTrendPoint[] {\n return snapshots.map(snap => {\n const results = snap.raw.results.filter(r => r.Task === task);\n const failed = results.filter(r => !r.OK && !r.Cached).length;\n const cached = results.filter(r => r.Cached).length;\n const passed = results.filter(r => r.OK && !r.Cached).length;\n return {\n timestamp: snap.timestamp,\n gitCommit: snap.git?.commit ?? 'unknown',\n gitBranch: snap.git?.branch ?? 'unknown',\n gitMessage: snap.git?.message ?? '',\n failed,\n cached,\n passed,\n total: results.length,\n };\n });\n}\n\nfunction buildChangelog(snapshots: RunSnapshot[], task: string): TaskTrendChangelog[] {\n const changelog: TaskTrendChangelog[] = [];\n for (let i = 1; i < snapshots.length; i++) {\n const prev = snapshots[i - 1]!;\n const curr = snapshots[i]!;\n const prevFailed = new Set(extractFailed(prev, task));\n const currFailed = extractFailed(curr, task);\n const currFailedSet = new Set(currFailed);\n const newFailures = currFailed.filter(p => !prevFailed.has(p));\n const fixed = [...prevFailed].filter(p => !currFailedSet.has(p));\n const delta = currFailed.length - prevFailed.size;\n if (newFailures.length > 0 || fixed.length > 0) {\n changelog.push({\n timestamp: curr.timestamp,\n gitCommit: curr.git?.commit ?? 'unknown',\n gitMessage: curr.git?.message ?? '',\n newFailures,\n fixed,\n delta,\n });\n }\n }\n return changelog;\n}\n\nexport function analyzeTrends(\n history: RunSnapshot[],\n window: number = TRENDS_WINDOW,\n): TrendAnalysis {\n if (history.length < 2) {\n return { window, historyCount: history.length, tasks: [] };\n }\n\n const windowSnaps = history.slice(-window);\n const first = windowSnaps[0]!;\n const last = windowSnaps[windowSnaps.length - 1]!;\n const tasks = collectTasks(windowSnaps);\n\n const taskTrends: TaskTrend[] = tasks.map(task => {\n const timeSeries = buildTimeSeries(windowSnaps, task);\n const changelog = buildChangelog(windowSnaps, task);\n const previous = extractFailed(first, task).length;\n const current = extractFailed(last, task).length;\n const delta = current - previous;\n const deltas = changelog.map(c => c.delta);\n const velocity = deltas.length > 0\n ? Math.round((deltas.reduce((s, d) => s + d, 0) / deltas.length) * 100) / 100\n : 0;\n const direction: TaskTrend['direction'] =\n delta > 0 ? 'regression' : delta < 0 ? 'improvement' : 'no-change';\n return { task, previous, current, delta, direction, velocity, timeSeries, changelog };\n });\n\n return { window, historyCount: history.length, tasks: taskTrends };\n}\n","import type { RunSnapshot, RegressionDetection, RunRegression } from '@kb-labs/qa-contracts';\n\nexport function detectRegressions(history: RunSnapshot[]): RegressionDetection {\n if (history.length < 2) {\n return {\n hasRegressions: false,\n regressions: [],\n comparedAt: { previous: '', current: '' },\n };\n }\n\n const prev = history[history.length - 2]!;\n const curr = history[history.length - 1]!;\n\n const allTasks = new Set([\n ...prev.raw.results.map(r => r.Task),\n ...curr.raw.results.map(r => r.Task),\n ]);\n\n const regressions: RunRegression[] = [];\n\n for (const task of allTasks) {\n const prevFailed = new Set(\n prev.raw.results.filter(r => r.Task === task && !r.OK && !r.Cached).map(r => r.Package)\n );\n const currFailed = curr.raw.results\n .filter(r => r.Task === task && !r.OK && !r.Cached)\n .map(r => r.Package);\n const newFailures = currFailed.filter(p => !prevFailed.has(p));\n if (newFailures.length > 0) {\n regressions.push({\n task,\n delta: currFailed.length - prevFailed.size,\n newFailures,\n });\n }\n }\n\n return {\n hasRegressions: regressions.length > 0,\n regressions,\n comparedAt: { previous: prev.timestamp, current: curr.timestamp },\n };\n}\n","import type {\n BaselineData,\n BaselineCheckDiff,\n CheckIssueDiff,\n DevkitCheckOutput,\n DevkitStatsOutput,\n} from '@kb-labs/qa-contracts';\n\nfunction issueKey(pkg: string, check: string, message: string): string {\n return `${pkg}::${check}::${message}`;\n}\n\nexport function compareWithBaseline(\n currentCheck: DevkitCheckOutput,\n currentStats: DevkitStatsOutput,\n baseline: BaselineData,\n): BaselineCheckDiff {\n const baselineIssues = new Map<string, CheckIssueDiff>();\n for (const [pkg, pkgData] of Object.entries(baseline.check.packages)) {\n for (const issue of pkgData.issues ?? []) {\n const key = issueKey(pkg, issue.check, issue.message);\n baselineIssues.set(key, {\n pkg, check: issue.check, status: 'fixed', severity: issue.severity, message: issue.message,\n });\n }\n }\n\n const currentIssues = new Map<string, CheckIssueDiff>();\n for (const [pkg, pkgData] of Object.entries(currentCheck.packages)) {\n for (const issue of pkgData.issues ?? []) {\n const key = issueKey(pkg, issue.check, issue.message);\n currentIssues.set(key, {\n pkg, check: issue.check, status: 'new', severity: issue.severity, message: issue.message,\n });\n }\n }\n\n const newIssues: CheckIssueDiff[] = [];\n const fixedIssues: CheckIssueDiff[] = [];\n const persistingIssues: CheckIssueDiff[] = [];\n\n for (const [key, issue] of currentIssues) {\n if (baselineIssues.has(key)) {\n persistingIssues.push({ ...issue, status: 'persisting' });\n } else {\n newIssues.push({ ...issue, status: 'new' });\n }\n }\n for (const [key, issue] of baselineIssues) {\n if (!currentIssues.has(key)) {\n fixedIssues.push({ ...issue, status: 'fixed' });\n }\n }\n\n return {\n newIssues,\n fixedIssues,\n persistingIssues,\n newIssueCount: newIssues.length,\n fixedIssueCount: fixedIssues.length,\n scoreDelta: currentStats.score - baseline.stats.score,\n gradeDelta: `${baseline.stats.grade} → ${currentStats.grade}`,\n };\n}\n","import type { RunSnapshot, PackageTimeline, PackageTaskHistory } from '@kb-labs/qa-contracts';\n\nexport function buildPackageTimeline(\n history: RunSnapshot[],\n packageName: string,\n): PackageTimeline {\n const entries: PackageTaskHistory[] = [];\n\n for (const snap of [...history].reverse()) {\n for (const r of snap.raw.results.filter(r => r.Package === packageName)) {\n entries.push({\n timestamp: snap.timestamp,\n gitCommit: snap.git?.commit ?? 'unknown',\n task: r.Task,\n status: r.Cached ? 'cached' : r.OK ? 'passed' : 'failed',\n });\n }\n }\n\n const taskNames = [...new Set(entries.map(e => e.task))];\n let totalFlips = 0;\n let totalTransitions = 0;\n const flakyTasks: string[] = [];\n\n for (const task of taskNames) {\n const taskEntries = entries.filter(e => e.task === task && e.status !== 'cached');\n let flips = 0;\n for (let i = 1; i < taskEntries.length; i++) {\n totalTransitions++;\n if (taskEntries[i]!.status !== taskEntries[i - 1]!.status) {\n flips++;\n totalFlips++;\n }\n }\n if (taskEntries.length > 1 && flips / (taskEntries.length - 1) > 0.3) {\n flakyTasks.push(task);\n }\n }\n\n const flakyScore = totalTransitions > 0\n ? Math.round((totalFlips / totalTransitions) * 100) / 100\n : 0;\n\n const latest = entries[0];\n let streakStatus: 'passing' | 'failing' = 'passing';\n let streakCount = 0;\n\n if (latest) {\n streakStatus = latest.status === 'failed' ? 'failing' : 'passing';\n streakCount = 1;\n for (let i = 1; i < entries.length; i++) {\n const s = entries[i]!.status === 'failed' ? 'failing' : 'passing';\n if (s !== streakStatus) {break;}\n streakCount++;\n }\n }\n\n let firstFailure: string | undefined;\n for (const e of [...entries].reverse()) {\n if (e.status === 'failed') {\n firstFailure = e.timestamp;\n break;\n }\n }\n\n return {\n packageName,\n history: entries,\n flakyScore,\n flakyTasks,\n currentStreak: { status: streakStatus, count: streakCount },\n firstFailure,\n };\n}\n","import type {\n E2eFlakySnapshot,\n E2eCaseResult,\n E2eErrorCategory,\n CaseHistoryEntry,\n CaseTimeline,\n FlakyOverview,\n FlakyOverviewEntry,\n} from '@kb-labs/qa-contracts';\nimport { TRENDS_WINDOW } from '@kb-labs/qa-contracts';\n\nexport function caseKeyOf(caseResult: Pick<E2eCaseResult, 'suite' | 'spec' | 'testId'>): string {\n return `${caseResult.suite}/${caseResult.spec}#${caseResult.testId}`;\n}\n\nfunction lastErrorOf(caseResult: E2eCaseResult): { category?: E2eErrorCategory; message?: string } {\n const failedAttempt = [...caseResult.attempts].reverse().find(a => a.status === 'failed');\n return { category: failedAttempt?.errorCategory, message: failedAttempt?.errorMessage };\n}\n\nexport function buildCaseTimeline(\n history: E2eFlakySnapshot[],\n caseKey: string,\n): CaseTimeline | null {\n const entries: CaseHistoryEntry[] = [];\n let suite = '';\n let spec = '';\n let testId = '';\n let title = '';\n\n for (const snap of [...history].reverse()) {\n const match = snap.cases.find(c => caseKeyOf(c) === caseKey);\n if (!match) {continue;}\n suite = match.suite;\n spec = match.spec;\n testId = match.testId;\n title = match.title;\n const { category, message } = lastErrorOf(match);\n entries.push({\n timestamp: snap.timestamp,\n gitCommit: snap.git?.commit ?? 'unknown',\n status: match.outcome,\n retries: match.attempts.length > 0 ? match.attempts.length - 1 : 0,\n errorCategory: category,\n errorMessage: message,\n });\n }\n\n if (entries.length === 0) {return null;}\n\n const nonSkipped = entries.filter(e => e.status !== 'skipped');\n let flips = 0;\n for (let i = 1; i < nonSkipped.length; i++) {\n if (nonSkipped[i]!.status !== nonSkipped[i - 1]!.status) {flips++;}\n }\n const flakyScore = nonSkipped.length > 1\n ? Math.round((flips / (nonSkipped.length - 1)) * 100) / 100\n : 0;\n\n // Uses nonSkipped (not entries) so a run of 'skipped' outcomes doesn't\n // fabricate a passing streak — same exclusion flakyScore applies above.\n const latest = nonSkipped[0];\n let streakStatus: 'passing' | 'failing' = 'passing';\n let streakCount = 0;\n if (latest) {\n streakStatus = latest.status === 'failed' ? 'failing' : 'passing';\n streakCount = 1;\n for (let i = 1; i < nonSkipped.length; i++) {\n const s = nonSkipped[i]!.status === 'failed' ? 'failing' : 'passing';\n if (s !== streakStatus) {break;}\n streakCount++;\n }\n }\n\n let firstFailure: string | undefined;\n for (const e of [...entries].reverse()) {\n if (e.status === 'failed' || e.status === 'flaky') {\n firstFailure = e.timestamp;\n break;\n }\n }\n\n return {\n caseKey,\n suite,\n spec,\n testId,\n title,\n history: entries,\n flakyScore,\n currentStreak: { status: streakStatus, count: streakCount },\n firstFailure,\n };\n}\n\nexport function analyzeFlakyCases(\n history: E2eFlakySnapshot[],\n window: number = TRENDS_WINDOW,\n): FlakyOverview {\n const windowSnaps = history.slice(-window);\n if (windowSnaps.length === 0) {\n return {\n window,\n runsAnalyzed: 0,\n totalCases: 0,\n flakyCases: 0,\n delta: { new: [], fixed: [], unchanged: [] },\n byCategory: { 'infra-timeout': 0, 'assertion-race': 0, 'ws-flake': 0, unknown: 0 },\n top: [],\n };\n }\n\n const caseKeys = new Set<string>();\n for (const snap of windowSnaps) {\n for (const c of snap.cases) {caseKeys.add(caseKeyOf(c));}\n }\n\n const byCategory: Record<E2eErrorCategory, number> = {\n 'infra-timeout': 0,\n 'assertion-race': 0,\n 'ws-flake': 0,\n unknown: 0,\n };\n const flakyEntries: FlakyOverviewEntry[] = [];\n const flakyNowKeys = new Set<string>();\n\n for (const key of caseKeys) {\n const timeline = buildCaseTimeline(windowSnaps, key);\n if (!timeline || timeline.flakyScore === 0) {continue;}\n\n flakyNowKeys.add(key);\n const category = timeline.history[0]?.errorCategory ?? 'unknown';\n byCategory[category]++;\n flakyEntries.push({\n case: key,\n flakyScore: timeline.flakyScore,\n streak: `${timeline.currentStreak.status} x${timeline.currentStreak.count}`,\n category,\n });\n }\n\n flakyEntries.sort((a, b) => b.flakyScore - a.flakyScore);\n\n const previousSnaps = history.slice(-2 * window, -window);\n // Collect previous-window keys independently of `caseKeys` (current window)\n // — a case that was flaky before but has since disappeared entirely (spec\n // renamed/deleted) must still be checkable, or it can never show up as \"fixed\".\n const previousCaseKeys = new Set<string>();\n for (const snap of previousSnaps) {\n for (const c of snap.cases) {previousCaseKeys.add(caseKeyOf(c));}\n }\n const flakyPreviousKeys = new Set<string>();\n for (const key of previousCaseKeys) {\n const timeline = buildCaseTimeline(previousSnaps, key);\n if (timeline && timeline.flakyScore > 0) {flakyPreviousKeys.add(key);}\n }\n\n const delta = {\n new: [...flakyNowKeys].filter(k => !flakyPreviousKeys.has(k)),\n fixed: [...flakyPreviousKeys].filter(k => !flakyNowKeys.has(k)),\n unchanged: [...flakyNowKeys].filter(k => flakyPreviousKeys.has(k)),\n };\n\n return {\n window,\n runsAnalyzed: windowSnaps.length,\n totalCases: caseKeys.size,\n flakyCases: flakyNowKeys.size,\n delta,\n byCategory,\n top: flakyEntries.slice(0, 5),\n };\n}\n","import type {\n RunSnapshot,\n CheckSnapshot,\n StatsSnapshot,\n TrendAnalysis,\n RegressionDetection,\n BaselineData,\n BaselineCheckDiff,\n} from '@kb-labs/qa-contracts';\n\nexport interface ReportSection {\n header: string;\n lines: string[];\n}\n\nexport function formatTaskName(task: string): string {\n return task\n .split(/[-_]/)\n .map(w => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nexport function buildRunReport(snap: RunSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Run', lines: ['No run data available.'] }];}\n\n const sections: ReportSection[] = [];\n const tasks = [...new Set(snap.raw.results.map(r => r.Task))];\n\n for (const task of tasks) {\n const results = snap.raw.results.filter(r => r.Task === task);\n const passed = results.filter(r => r.OK && !r.Cached).length;\n const failed = results.filter(r => !r.OK && !r.Cached).length;\n const cached = results.filter(r => r.Cached).length;\n const failedPkgs = results.filter(r => !r.OK && !r.Cached).map(r => r.Package);\n\n const lines: string[] = [`pass ${passed} fail ${failed} cached ${cached}`];\n if (failedPkgs.length > 0) {\n const shown = failedPkgs.slice(0, 5);\n lines.push(...shown.map(p => ` ✗ ${p}`));\n if (failedPkgs.length > 5) {lines.push(` ... ${failedPkgs.length - 5} more`);}\n }\n\n sections.push({ header: formatTaskName(task), lines });\n }\n\n const status = snap.raw.ok ? 'passed' : 'failed';\n const { total, passed: p, failed: f, cached: c } = snap.raw.summary;\n sections.push({\n header: 'Summary',\n lines: [`${status.toUpperCase()} total ${total} pass ${p} fail ${f} cached ${c} (${snap.raw.elapsed})`],\n });\n\n return sections;\n}\n\nexport function buildCheckReport(snap: CheckSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Check', lines: ['No check data available.'] }];}\n\n const sections: ReportSection[] = [];\n\n for (const [pkg, pkgData] of Object.entries(snap.raw.packages)) {\n const issues = pkgData.issues ?? [];\n if (issues.length === 0) {continue;}\n\n const errors = issues.filter(i => i.severity === 'error').length;\n const warnings = issues.filter(i => i.severity === 'warning').length;\n const infos = issues.filter(i => i.severity === 'info').length;\n\n const lines: string[] = [`errors ${errors} warnings ${warnings} info ${infos}`];\n for (const issue of issues.slice(0, 5)) {\n lines.push(` [${issue.severity}] ${issue.check}: ${issue.message}`);\n }\n if (issues.length > 5) {lines.push(` ... ${issues.length - 5} more`);}\n\n sections.push({ header: pkg, lines });\n }\n\n if (sections.length === 0) {\n sections.push({ header: 'Check', lines: ['All packages OK.'] });\n }\n\n return sections;\n}\n\nexport function buildStatsReport(snap: StatsSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Stats', lines: ['No stats data available.'] }];}\n\n const { score, grade, summary, by_category, coverage } = snap.raw;\n\n const sections: ReportSection[] = [];\n\n sections.push({\n header: 'Score',\n lines: [`${score}/100 Grade: ${grade} (${summary.healthy} healthy / ${summary.warning} warning / ${summary.error} error)`],\n });\n\n const catLines = Object.entries(by_category).map(([cat, data]) => {\n const pct = data.total > 0 ? Math.round((data.healthy / data.total) * 100) : 0;\n return ` ${cat.padEnd(20)} ${data.grade} ${pct}% (${data.healthy}/${data.total})`;\n });\n sections.push({ header: 'By Category', lines: catLines });\n\n if (Object.keys(coverage).length > 0) {\n const covLines = Object.entries(coverage).map(([k, v]) => ` ${k.padEnd(20)} ${v.pct}% (${v.pass}/${v.total})`);\n sections.push({ header: 'Coverage', lines: covLines });\n }\n\n return sections;\n}\n\nexport function buildHistoryTable(history: RunSnapshot[], limit = 20): ReportSection[] {\n const rows = [...history].reverse().slice(0, limit);\n if (rows.length === 0) {return [{ header: 'History', lines: ['No history available.'] }];}\n\n const lines = rows.map(snap => {\n const status = snap.raw.ok ? 'pass' : 'fail';\n const tasks = snap.tasks.join(', ');\n const commit = snap.git?.commit ?? '-------';\n const date = new Date(snap.timestamp).toLocaleString();\n return ` ${date} ${commit} ${status} [${tasks}]`;\n });\n\n return [{ header: `History (last ${rows.length})`, lines }];\n}\n\nexport function buildTrendsReport(analysis: TrendAnalysis): ReportSection[] {\n if (analysis.tasks.length === 0) {\n return [{ header: 'Trends', lines: ['Not enough history for trend analysis.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const trend of analysis.tasks) {\n const arrow = trend.direction === 'regression' ? '↑' : trend.direction === 'improvement' ? '↓' : '→';\n const lines: string[] = [\n `${arrow} ${trend.direction} prev ${trend.previous} curr ${trend.current} delta ${trend.delta > 0 ? '+' : ''}${trend.delta} velocity ${trend.velocity}`,\n ];\n\n if (trend.changelog.length > 0) {\n const last = trend.changelog[trend.changelog.length - 1]!;\n if (last.newFailures.length > 0) {lines.push(` last regression: ${last.newFailures.slice(0, 3).join(', ')}`);}\n if (last.fixed.length > 0) {lines.push(` last fixed: ${last.fixed.slice(0, 3).join(', ')}`);}\n }\n\n sections.push({ header: formatTaskName(trend.task), lines });\n }\n\n return sections;\n}\n\nexport function buildRegressionsReport(detection: RegressionDetection): ReportSection[] {\n if (!detection.hasRegressions) {\n return [{ header: 'Regressions', lines: ['No regressions detected.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const reg of detection.regressions) {\n const lines = [\n `delta +${reg.delta}`,\n ...reg.newFailures.slice(0, 5).map(p => ` ✗ ${p}`),\n ];\n if (reg.newFailures.length > 5) {lines.push(` ... ${reg.newFailures.length - 5} more`);}\n sections.push({ header: formatTaskName(reg.task), lines });\n }\n\n const prev = new Date(detection.comparedAt.previous).toLocaleString();\n const curr = new Date(detection.comparedAt.current).toLocaleString();\n sections.push({ header: 'Compared', lines: [`${prev} → ${curr}`] });\n\n return sections;\n}\n\nexport function buildBaselineReport(baseline: BaselineData | null): ReportSection[] {\n if (!baseline) {return [{ header: 'Baseline', lines: ['No baseline set. Run `qa baseline update` to set one.'] }];}\n\n const { score, grade } = baseline.stats;\n const totalIssues = Object.values(baseline.check.packages)\n .reduce((sum, pkg) => sum + (pkg.issues?.length ?? 0), 0);\n const commit = baseline.git?.commit ?? 'unknown';\n const date = new Date(baseline.timestamp).toLocaleString();\n\n return [{\n header: 'Baseline',\n lines: [`score ${score}/100 grade ${grade} issues ${totalIssues} commit ${commit} set ${date}`],\n }];\n}\n\nexport function buildBaselineDiffReport(diff: BaselineCheckDiff): ReportSection[] {\n const sections: ReportSection[] = [];\n\n const scoreDir = diff.scoreDelta > 0 ? '+' : '';\n sections.push({\n header: 'Score Delta',\n lines: [`${scoreDir}${diff.scoreDelta} ${diff.gradeDelta} new ${diff.newIssueCount} fixed ${diff.fixedIssueCount}`],\n });\n\n if (diff.newIssues.length > 0) {\n const lines = diff.newIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.newIssues.length > 10) {lines.push(` ... ${diff.newIssues.length - 10} more`);}\n sections.push({ header: 'New Issues', lines });\n }\n\n if (diff.fixedIssues.length > 0) {\n const lines = diff.fixedIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.fixedIssues.length > 10) {lines.push(` ... ${diff.fixedIssues.length - 10} more`);}\n sections.push({ header: 'Fixed Issues', lines });\n }\n\n if (diff.persistingIssues.length > 0) {\n sections.push({ header: 'Persisting Issues', lines: [`${diff.persistingIssues.length} issues unchanged`] });\n }\n\n return sections;\n}\n","import type { RunSnapshot, CheckSnapshot, StatsSnapshot } from '@kb-labs/qa-contracts';\n\nexport function buildRunJsonReport(snap: RunSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n tasks: snap.tasks,\n ok: snap.raw.ok,\n elapsed: snap.raw.elapsed,\n summary: snap.raw.summary,\n results: snap.raw.results,\n };\n}\n\nexport function buildCheckJsonReport(snap: CheckSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n packages: snap.raw.packages,\n };\n}\n\nexport function buildStatsJsonReport(snap: StatsSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n score: snap.raw.score,\n grade: snap.raw.grade,\n summary: snap.raw.summary,\n by_category: snap.raw.by_category,\n issues_by_type: snap.raw.issues_by_type,\n coverage: snap.raw.coverage,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/devkit/devkit-discovery.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/devkit/devkit-adapter.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/devkit/git-capture.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/ci/github-actions-provider.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/ci/reliability-analyzer.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/ci/dossier-store.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/snapshot/snapshot-store.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/analysis/trend-analyzer.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/analysis/regression-detector.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/analysis/baseline-comparator.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/analysis/package-timeline.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/analysis/case-timeline.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/report/text-reporter.ts","../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/report/json-reporter.ts"],"names":["join","existsSync","readFileSync","r","TRENDS_WINDOW","p"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Resolve the kb-devkit binary path.\n *\n * Resolution order:\n * 1. configPath (from QAPluginConfig.devkitPath) — absolute or relative to rootDir\n * 2. tools/kb-devkit/kb-devkit relative to rootDir (workspace-local copy)\n * 3. \"kb-devkit\" — resolved from PATH at spawn time\n *\n * The shell permission whitelist matches by basename, so passing a full path\n * to shell.exec() works correctly when allow: ['kb-devkit'] is declared.\n */\nexport function resolveDevkitBin(rootDir: string, configPath?: string): string {\n if (configPath) {\n const full = configPath.startsWith('/') ? configPath : join(rootDir, configPath);\n if (!existsSync(full)) {\n throw new Error(`devkitPath \"${configPath}\" not found at ${full}`);\n }\n return full;\n }\n\n const local = join(rootDir, 'tools', 'kb-devkit', 'kb-devkit');\n if (existsSync(local)) {return local;}\n\n return 'kb-devkit';\n}\n","import type { ShellAPI } from '@kb-labs/sdk';\nimport type {\n DevkitRunOutput,\n DevkitCheckOutput,\n DevkitStatsOutput,\n DevkitStatusOutput,\n DevkitGateOutput,\n} from '@kb-labs/qa-contracts';\n\nexport interface DevkitAdapterOptions {\n binaryPath: string;\n cwd: string;\n shell: ShellAPI;\n timeoutMs?: number;\n}\n\nexport class DevkitAdapter {\n private readonly bin: string;\n private readonly cwd: string;\n private readonly shell: ShellAPI;\n private readonly timeout: number;\n\n constructor(opts: DevkitAdapterOptions) {\n this.bin = opts.binaryPath;\n this.cwd = opts.cwd;\n this.shell = opts.shell;\n this.timeout = opts.timeoutMs ?? 600_000;\n }\n\n async run(tasks: string[]): Promise<DevkitRunOutput> {\n if (tasks.length === 0) {throw new Error('DevkitAdapter.run: tasks must not be empty');}\n return this.invoke<DevkitRunOutput>(['run', ...tasks]);\n }\n\n async check(): Promise<DevkitCheckOutput> {\n return this.invoke<DevkitCheckOutput>(['check']);\n }\n\n async stats(): Promise<DevkitStatsOutput> {\n return this.invoke<DevkitStatsOutput>(['stats']);\n }\n\n async status(): Promise<DevkitStatusOutput> {\n return this.invoke<DevkitStatusOutput>(['status']);\n }\n\n async gate(): Promise<DevkitGateOutput> {\n return this.invoke<DevkitGateOutput>(['gate']);\n }\n\n async version(): Promise<string> {\n const result = await this.shell.exec(this.bin, ['--version'], {\n cwd: this.cwd,\n timeout: 5_000,\n throwOnError: false,\n });\n if (!result.ok) {\n throw new Error(\n `kb-devkit not found or not executable at \"${this.bin}\". ` +\n `Set QAPluginConfig.devkitPath or ensure kb-devkit is on PATH.`\n );\n }\n return result.stdout.trim();\n }\n\n private async invoke<T>(args: string[]): Promise<T> {\n const result = await this.shell.exec(this.bin, [...args, '--json'], {\n cwd: this.cwd,\n timeout: this.timeout,\n throwOnError: false,\n });\n\n if (result.code !== 0 && !result.stdout.trim()) {\n throw new Error(\n `kb-devkit ${args[0]} failed (exit ${result.code}): ${result.stderr.slice(0, 500)}`\n );\n }\n\n try {\n return JSON.parse(result.stdout) as T;\n } catch {\n throw new Error(\n `kb-devkit ${args[0]} produced non-JSON output (exit ${result.code}). ` +\n `stderr: ${result.stderr.slice(0, 300)}`\n );\n }\n }\n}\n","import type { ShellAPI } from '@kb-labs/sdk';\nimport type { SnapshotGit } from '@kb-labs/qa-contracts';\n\n/**\n * Capture current git context using ctx.api.shell.\n * Returns undefined if the directory is not a git repo or git is unavailable.\n */\nexport async function captureGit(shell: ShellAPI, cwd: string): Promise<SnapshotGit | undefined> {\n try {\n const [commitRes, branchRes, messageRes] = await Promise.all([\n shell.exec('git', ['rev-parse', '--short', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['log', '-1', '--format=%s'], { cwd, throwOnError: false }),\n ]);\n\n if (!commitRes.ok) {return undefined;}\n\n return {\n commit: commitRes.stdout.trim(),\n branch: branchRes.stdout.trim() || 'HEAD',\n message: messageRes.stdout.trim(),\n };\n } catch {\n return undefined;\n }\n}\n","import type { ShellAPI } from '@kb-labs/sdk';\nimport type { CiEvidenceSyncResult, CiFailureEvidence, CiJobEvidence, CiRunDossier, CiStepEvidence } from '@kb-labs/qa-contracts';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\ninterface GithubRun {\n id: number;\n run_attempt: number;\n event: string;\n status: string;\n conclusion: string | null;\n run_started_at: string | null;\n updated_at: string | null;\n head_sha: string;\n head_branch: string | null;\n html_url: string;\n name: string;\n path?: string;\n}\n\ninterface GithubJob {\n id: number;\n name: string;\n conclusion: string | null;\n started_at: string | null;\n completed_at: string | null;\n html_url: string;\n runner_name?: string;\n runner_group_name?: string;\n steps?: Array<{ number: number; name: string; conclusion: string | null; started_at: string | null; completed_at: string | null }>;\n}\n\ninterface GithubJobsResponse { jobs: GithubJob[]; }\ntype GithubStep = NonNullable<GithubJob['steps']>[number];\ninterface GithubRunListEntry { databaseId: number; }\n\nexport interface CiProvider {\n captureRun(input: {\n repository: string;\n runId: string;\n workflowPath?: string;\n workflowSha?: string;\n excludeJobNames?: string[];\n }): Promise<CiRunDossier>;\n}\n\n/** GitHub Actions adapter. The only external requirement is the GitHub CLI already present on Actions runners. */\nexport class GithubActionsProvider implements CiProvider {\n constructor(private readonly shell: ShellAPI, private readonly cwd: string) {}\n\n async captureRun(input: {\n repository: string;\n runId: string;\n workflowPath?: string;\n workflowSha?: string;\n excludeJobNames?: string[];\n }): Promise<CiRunDossier> {\n const run = await this.api<GithubRun>(`repos/${input.repository}/actions/runs/${input.runId}`);\n const jobsResponse = await this.api<GithubJobsResponse>(`repos/${input.repository}/actions/runs/${input.runId}/jobs?per_page=100`);\n const failedLog = await this.getFailedLog(input.repository, input.runId);\n const excludedJobs = new Set(input.excludeJobNames ?? []);\n const jobs = jobsResponse.jobs\n .filter(job => !excludedJobs.has(job.name))\n .map(job => this.toEvidence(job, failedLog));\n const complete = jobs.length > 0 && jobs.every(job => job.conclusion !== null);\n return {\n schemaVersion: 1,\n provider: 'github-actions',\n collectedAt: new Date().toISOString(),\n collectionStatus: complete ? 'complete' : 'partial',\n run: {\n id: String(run.id), attempt: run.run_attempt, event: run.event, status: run.status,\n conclusion: run.conclusion, startedAt: run.run_started_at, completedAt: run.updated_at,\n headSha: run.head_sha, headBranch: run.head_branch, htmlUrl: run.html_url,\n },\n workflow: { name: run.name, path: input.workflowPath, sha: input.workflowSha },\n jobs,\n sourceRefs: [\n { kind: 'run', url: run.html_url, label: `GitHub Actions run ${run.id}` },\n ...jobs.map(job => ({ kind: 'job-log' as const, url: job.htmlUrl, label: job.name })),\n ],\n };\n }\n\n /** Downloads immutable run artifacts only when this workspace has not seen them yet. */\n async syncDossiers(input: { repository: string; workflow: string; limit: number; outputDir: string }): Promise<CiEvidenceSyncResult> {\n const list = await this.shell.exec('gh', [\n 'run', 'list', '--repo', input.repository, '--workflow', input.workflow,\n '--limit', String(input.limit), '--json', 'databaseId',\n ], { cwd: this.cwd, throwOnError: false });\n if (!list.ok) {\n throw new Error(`Unable to list GitHub Actions runs: ${list.stderr.trim() || list.stdout.trim()}`);\n }\n const runs = JSON.parse(list.stdout) as GithubRunListEntry[];\n const result: CiEvidenceSyncResult = { requestedRuns: runs.length, downloadedRunIds: [], cachedRunIds: [], unavailableRunIds: [] };\n for (const run of runs) {\n const runId = String(run.databaseId);\n const target = join(input.outputDir, runId, 'dossier.json');\n if (existsSync(target)) {\n result.cachedRunIds.push(runId);\n continue;\n }\n const download = await this.shell.exec('gh', [\n 'run', 'download', runId, '--repo', input.repository,\n '--name', `qa-ci-evidence-${runId}`, '--dir', join(input.outputDir, runId),\n ], { cwd: this.cwd, throwOnError: false });\n if (download.ok && existsSync(target)) {result.downloadedRunIds.push(runId);}\n else {result.unavailableRunIds.push(runId);}\n }\n return result;\n }\n\n private async api<T>(path: string): Promise<T> {\n const result = await this.shell.exec('gh', ['api', `/${path}`], { cwd: this.cwd, throwOnError: false });\n if (!result.ok) {\n throw new Error(`GitHub Actions API request failed for ${path}: ${result.stderr.trim() || result.stdout.trim()}`);\n }\n return JSON.parse(result.stdout) as T;\n }\n\n private async getFailedLog(repository: string, runId: string): Promise<string | undefined> {\n const result = await this.shell.exec('gh', ['run', 'view', runId, '--repo', repository, '--log-failed'], {\n cwd: this.cwd, throwOnError: false,\n });\n return result.ok && result.stdout.trim() ? result.stdout : undefined;\n }\n\n private toEvidence(job: GithubJob, failedLog?: string): CiJobEvidence {\n const steps = (job.steps ?? []).map(step => this.toStep(step));\n const failedStep = steps.find(step => step.conclusion === 'failure');\n return {\n id: String(job.id), name: job.name, conclusion: job.conclusion,\n startedAt: job.started_at, completedAt: job.completed_at,\n durationMs: duration(job.started_at, job.completed_at), htmlUrl: job.html_url,\n runner: { name: job.runner_name, group: job.runner_group_name },\n steps,\n failure: failedStep ? classifyFailure(failedStep.name, failedLog) : undefined,\n };\n }\n\n private toStep(step: GithubStep): CiStepEvidence {\n return {\n number: step.number, name: step.name, conclusion: step.conclusion,\n startedAt: step.started_at, completedAt: step.completed_at,\n durationMs: duration(step.started_at, step.completed_at),\n };\n }\n}\n\nfunction duration(startedAt: string | null, completedAt: string | null): number | null {\n if (!startedAt || !completedAt) {return null;}\n const value = Date.parse(completedAt) - Date.parse(startedAt);\n return Number.isFinite(value) && value >= 0 ? value : null;\n}\n\nfunction classifyFailure(stepName: string, failedLog?: string): CiFailureEvidence {\n const normalized = stepName.toLowerCase();\n const log = failedLog?.toLowerCase() ?? '';\n if (log.includes('registry-1.docker.io') || log.includes('docker hub') || log.includes('client.timeout exceeded')) {\n return {\n phase: 'setup', fingerprint: 'network.registry.docker-hub-timeout',\n summary: 'Container registry request timed out before tests started',\n excerpt: excerpt(failedLog, /registry-1\\.docker\\.io|Client\\.Timeout exceeded|docker hub/i), confidence: 0.95,\n };\n }\n if (log.includes('permission_denied') || log.includes('denied:')) {\n return {\n phase: 'publish', fingerprint: 'permissions.registry.denied', summary: 'Container registry permission was denied',\n excerpt: excerpt(failedLog, /permission_denied|denied:/i), confidence: 0.9,\n };\n }\n if (log.includes('e403') || log.includes('forbidden')) {\n return {\n phase: 'publish', fingerprint: 'permissions.package-publish-forbidden', summary: 'Package publish was forbidden',\n excerpt: excerpt(failedLog, /E403|forbidden/i), confidence: 0.9,\n };\n }\n if (normalized.includes('test') || normalized.includes('playwright')) {\n return { phase: 'test', fingerprint: 'test.failure.unclassified', summary: `Test step failed: ${stepName}`, confidence: 0.45 };\n }\n if (normalized.includes('build') || normalized.includes('pack')) {\n return { phase: 'build', fingerprint: 'build.failure.unclassified', summary: `Build step failed: ${stepName}`, confidence: 0.45 };\n }\n if (normalized.includes('publish') || normalized.includes('deploy')) {\n return { phase: 'publish', fingerprint: 'publish.failure.unclassified', summary: `Publish step failed: ${stepName}`, confidence: 0.45 };\n }\n return { phase: 'setup', fingerprint: 'setup.failure.unclassified', summary: `Setup step failed: ${stepName}`, confidence: 0.35 };\n}\n\nfunction excerpt(log: string | undefined, pattern: RegExp): string | undefined {\n if (!log) {return undefined;}\n const line = log.split('\\n').find(value => pattern.test(value));\n return line?.trim().slice(0, 500);\n}\n","import type { CiReliabilityFinding, CiReliabilityOverview, CiRunDossier } from '@kb-labs/qa-contracts';\n\nexport function analyzeCiReliability(dossiers: CiRunDossier[]): CiReliabilityOverview {\n const findings = new Map<string, CiReliabilityFinding>();\n let failedRuns = 0;\n let failedBeforeTests = 0;\n let complete = 0;\n for (const dossier of dossiers) {\n if (dossier.collectionStatus === 'complete') {complete++;}\n const failures = dossier.jobs.filter(job => job.failure);\n if (failures.length > 0) {failedRuns++;}\n if (failures.some(job => job.failure?.phase !== 'test')) {failedBeforeTests++;}\n for (const job of failures) {\n const failure = job.failure!;\n const existing = findings.get(failure.fingerprint);\n if (existing) {\n existing.occurrences++;\n existing.affectedJobs = unique([...existing.affectedJobs, job.name]);\n existing.sampleRunIds = unique([...existing.sampleRunIds, dossier.run.id]).slice(-5);\n existing.lastSeenAt = dossier.collectedAt;\n existing.confidence = Math.max(existing.confidence, failure.confidence);\n } else {\n findings.set(failure.fingerprint, {\n fingerprint: failure.fingerprint, phase: failure.phase, summary: failure.summary,\n confidence: failure.confidence, occurrences: 1, affectedJobs: [job.name],\n sampleRunIds: [dossier.run.id], firstSeenAt: dossier.collectedAt, lastSeenAt: dossier.collectedAt,\n });\n }\n }\n }\n const ordered = [...findings.values()].sort((a, b) => b.occurrences - a.occurrences || b.confidence - a.confidence);\n return {\n schemaVersion: 1, generatedAt: new Date().toISOString(), runsAnalyzed: dossiers.length,\n failedRuns, failedBeforeTests, collection: { complete, partial: dossiers.length - complete },\n findings: ordered, drillDown: { runIds: unique(ordered.flatMap(finding => finding.sampleRunIds)) },\n };\n}\n\nfunction unique(values: string[]): string[] { return [...new Set(values)]; }\n","import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CiRunDossier } from '@kb-labs/qa-contracts';\n\n/** Reads only dossier-shaped files; a partial artifact never breaks an investigation. */\nexport function loadCiDossiers(path: string): CiRunDossier[] {\n const dossiers: CiRunDossier[] = [];\n for (const file of findDossierFiles(path)) {\n try {\n const parsed = JSON.parse(readFileSync(file, 'utf8')) as Partial<CiRunDossier>;\n if (parsed.schemaVersion === 1 && parsed.provider === 'github-actions' && parsed.run?.id) {\n dossiers.push(parsed as CiRunDossier);\n }\n } catch { /* ignore incomplete or manually corrupted evidence */ }\n }\n return dossiers;\n}\n\nfunction findDossierFiles(path: string): string[] {\n if (!existsSync(path)) {return [];}\n if (!statSync(path).isDirectory()) {return [path];}\n const files: string[] = [];\n for (const entry of readdirSync(path, { withFileTypes: true })) {\n const child = join(path, entry.name);\n if (entry.isDirectory()) {files.push(...findDossierFiles(child));}\n if (entry.isFile() && entry.name === 'dossier.json') {files.push(child);}\n }\n return files;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport {\n PATHS,\n HISTORY_MAX_ENTRIES,\n} from '@kb-labs/qa-contracts';\nimport type {\n RunSnapshot,\n CheckSnapshot,\n StatsSnapshot,\n GateSnapshot,\n E2eFlakySnapshot,\n E2eCaseResult,\n SnapshotMeta,\n SnapshotGit,\n BaselineData,\n DevkitRunOutput,\n DevkitCheckOutput,\n DevkitStatsOutput,\n DevkitGateOutput,\n} from '@kb-labs/qa-contracts';\n\nfunction readJson<T>(filePath: string): T[] {\n if (!existsSync(filePath)) {return [];}\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8')) as T[];\n } catch {\n return [];\n }\n}\n\nfunction writeJson(filePath: string, data: unknown): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {mkdirSync(dir, { recursive: true });}\n writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\nfunction buildMeta(\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n): SnapshotMeta {\n return {\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n durationMs,\n ...(git ? { git } : {}),\n ...(runContext ? { runContext } : {}),\n };\n}\n\nexport class SnapshotStore {\n private readonly rootDir: string;\n private readonly maxEntries: number;\n\n constructor(rootDir: string, maxEntries = HISTORY_MAX_ENTRIES) {\n this.rootDir = rootDir;\n this.maxEntries = maxEntries;\n }\n\n // ── Run snapshots ──────────────────────────────────────────────────────────\n\n loadRunHistory(): RunSnapshot[] {\n return readJson<RunSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_RUN));\n }\n\n saveRun(\n raw: DevkitRunOutput,\n tasks: string[],\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): RunSnapshot {\n const snap: RunSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'run',\n tasks,\n raw,\n };\n const history = this.loadRunHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_RUN), history);\n return snap;\n }\n\n latestRun(): RunSnapshot | null {\n const h = this.loadRunHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Check snapshots ────────────────────────────────────────────────────────\n\n loadCheckHistory(): CheckSnapshot[] {\n return readJson<CheckSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_CHECK));\n }\n\n saveCheck(\n raw: DevkitCheckOutput,\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): CheckSnapshot {\n const snap: CheckSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'check',\n raw,\n };\n const history = this.loadCheckHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_CHECK), history);\n return snap;\n }\n\n latestCheck(): CheckSnapshot | null {\n const h = this.loadCheckHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Stats snapshots ────────────────────────────────────────────────────────\n\n loadStatsHistory(): StatsSnapshot[] {\n return readJson<StatsSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_STATS));\n }\n\n saveStats(\n raw: DevkitStatsOutput,\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): StatsSnapshot {\n const snap: StatsSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'stats',\n raw,\n };\n const history = this.loadStatsHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_STATS), history);\n return snap;\n }\n\n latestStats(): StatsSnapshot | null {\n const h = this.loadStatsHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Gate snapshots ─────────────────────────────────────────────────────────\n\n loadGateHistory(): GateSnapshot[] {\n return readJson<GateSnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_GATE));\n }\n\n saveGate(\n raw: DevkitGateOutput,\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): GateSnapshot {\n const snap: GateSnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'gate',\n raw,\n };\n const history = this.loadGateHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_GATE), history);\n return snap;\n }\n\n // ── E2E flaky snapshots ───────────────────────────────────────────────────────\n\n loadE2eFlakyHistory(): E2eFlakySnapshot[] {\n return readJson<E2eFlakySnapshot>(join(this.rootDir, PATHS.SNAPSHOTS_E2E_FLAKY));\n }\n\n saveE2eFlaky(\n cases: E2eCaseResult[],\n durationMs: number,\n git?: SnapshotGit,\n runContext?: Record<string, unknown>,\n ): E2eFlakySnapshot {\n const snap: E2eFlakySnapshot = {\n ...buildMeta(durationMs, git, runContext),\n kind: 'e2e-flaky',\n cases,\n };\n const history = this.loadE2eFlakyHistory();\n history.push(snap);\n while (history.length > this.maxEntries) {history.shift();}\n writeJson(join(this.rootDir, PATHS.SNAPSHOTS_E2E_FLAKY), history);\n return snap;\n }\n\n latestE2eFlaky(): E2eFlakySnapshot | null {\n const h = this.loadE2eFlakyHistory();\n return h.length > 0 ? h[h.length - 1]! : null;\n }\n\n // ── Baseline ───────────────────────────────────────────────────────────────\n\n loadBaseline(): BaselineData | null {\n const p = join(this.rootDir, PATHS.BASELINE);\n if (!existsSync(p)) {return null;}\n try {\n return JSON.parse(readFileSync(p, 'utf-8')) as BaselineData;\n } catch {\n return null;\n }\n }\n\n saveBaseline(\n check: DevkitCheckOutput,\n stats: DevkitStatsOutput,\n git?: SnapshotGit,\n ): BaselineData {\n const baseline: BaselineData = {\n timestamp: new Date().toISOString(),\n ...(git ? { git } : {}),\n check,\n stats,\n };\n writeJson(join(this.rootDir, PATHS.BASELINE), baseline);\n return baseline;\n }\n}\n","import type {\n RunSnapshot,\n TaskTrend,\n TaskTrendPoint,\n TaskTrendChangelog,\n TrendAnalysis,\n} from '@kb-labs/qa-contracts';\nimport { TRENDS_WINDOW } from '@kb-labs/qa-contracts';\n\nfunction extractFailed(snap: RunSnapshot, task: string): string[] {\n return snap.raw.results\n .filter(r => r.Task === task && !r.OK && !r.Cached)\n .map(r => r.Package);\n}\n\nfunction collectTasks(snapshots: RunSnapshot[]): string[] {\n const s = new Set<string>();\n for (const snap of snapshots) {\n for (const r of snap.raw.results) {s.add(r.Task);}\n }\n return [...s];\n}\n\nfunction buildTimeSeries(snapshots: RunSnapshot[], task: string): TaskTrendPoint[] {\n return snapshots.map(snap => {\n const results = snap.raw.results.filter(r => r.Task === task);\n const failed = results.filter(r => !r.OK && !r.Cached).length;\n const cached = results.filter(r => r.Cached).length;\n const passed = results.filter(r => r.OK && !r.Cached).length;\n return {\n timestamp: snap.timestamp,\n gitCommit: snap.git?.commit ?? 'unknown',\n gitBranch: snap.git?.branch ?? 'unknown',\n gitMessage: snap.git?.message ?? '',\n failed,\n cached,\n passed,\n total: results.length,\n };\n });\n}\n\nfunction buildChangelog(snapshots: RunSnapshot[], task: string): TaskTrendChangelog[] {\n const changelog: TaskTrendChangelog[] = [];\n for (let i = 1; i < snapshots.length; i++) {\n const prev = snapshots[i - 1]!;\n const curr = snapshots[i]!;\n const prevFailed = new Set(extractFailed(prev, task));\n const currFailed = extractFailed(curr, task);\n const currFailedSet = new Set(currFailed);\n const newFailures = currFailed.filter(p => !prevFailed.has(p));\n const fixed = [...prevFailed].filter(p => !currFailedSet.has(p));\n const delta = currFailed.length - prevFailed.size;\n if (newFailures.length > 0 || fixed.length > 0) {\n changelog.push({\n timestamp: curr.timestamp,\n gitCommit: curr.git?.commit ?? 'unknown',\n gitMessage: curr.git?.message ?? '',\n newFailures,\n fixed,\n delta,\n });\n }\n }\n return changelog;\n}\n\nexport function analyzeTrends(\n history: RunSnapshot[],\n window: number = TRENDS_WINDOW,\n): TrendAnalysis {\n if (history.length < 2) {\n return { window, historyCount: history.length, tasks: [] };\n }\n\n const windowSnaps = history.slice(-window);\n const first = windowSnaps[0]!;\n const last = windowSnaps[windowSnaps.length - 1]!;\n const tasks = collectTasks(windowSnaps);\n\n const taskTrends: TaskTrend[] = tasks.map(task => {\n const timeSeries = buildTimeSeries(windowSnaps, task);\n const changelog = buildChangelog(windowSnaps, task);\n const previous = extractFailed(first, task).length;\n const current = extractFailed(last, task).length;\n const delta = current - previous;\n const deltas = changelog.map(c => c.delta);\n const velocity = deltas.length > 0\n ? Math.round((deltas.reduce((s, d) => s + d, 0) / deltas.length) * 100) / 100\n : 0;\n const direction: TaskTrend['direction'] =\n delta > 0 ? 'regression' : delta < 0 ? 'improvement' : 'no-change';\n return { task, previous, current, delta, direction, velocity, timeSeries, changelog };\n });\n\n return { window, historyCount: history.length, tasks: taskTrends };\n}\n","import type { RunSnapshot, RegressionDetection, RunRegression } from '@kb-labs/qa-contracts';\n\nexport function detectRegressions(history: RunSnapshot[]): RegressionDetection {\n if (history.length < 2) {\n return {\n hasRegressions: false,\n regressions: [],\n comparedAt: { previous: '', current: '' },\n };\n }\n\n const prev = history[history.length - 2]!;\n const curr = history[history.length - 1]!;\n\n const allTasks = new Set([\n ...prev.raw.results.map(r => r.Task),\n ...curr.raw.results.map(r => r.Task),\n ]);\n\n const regressions: RunRegression[] = [];\n\n for (const task of allTasks) {\n const prevFailed = new Set(\n prev.raw.results.filter(r => r.Task === task && !r.OK && !r.Cached).map(r => r.Package)\n );\n const currFailed = curr.raw.results\n .filter(r => r.Task === task && !r.OK && !r.Cached)\n .map(r => r.Package);\n const newFailures = currFailed.filter(p => !prevFailed.has(p));\n if (newFailures.length > 0) {\n regressions.push({\n task,\n delta: currFailed.length - prevFailed.size,\n newFailures,\n });\n }\n }\n\n return {\n hasRegressions: regressions.length > 0,\n regressions,\n comparedAt: { previous: prev.timestamp, current: curr.timestamp },\n };\n}\n","import type {\n BaselineData,\n BaselineCheckDiff,\n CheckIssueDiff,\n DevkitCheckOutput,\n DevkitStatsOutput,\n} from '@kb-labs/qa-contracts';\n\nfunction issueKey(pkg: string, check: string, message: string): string {\n return `${pkg}::${check}::${message}`;\n}\n\nexport function compareWithBaseline(\n currentCheck: DevkitCheckOutput,\n currentStats: DevkitStatsOutput,\n baseline: BaselineData,\n): BaselineCheckDiff {\n const baselineIssues = new Map<string, CheckIssueDiff>();\n for (const [pkg, pkgData] of Object.entries(baseline.check.packages)) {\n for (const issue of pkgData.issues ?? []) {\n const key = issueKey(pkg, issue.check, issue.message);\n baselineIssues.set(key, {\n pkg, check: issue.check, status: 'fixed', severity: issue.severity, message: issue.message,\n });\n }\n }\n\n const currentIssues = new Map<string, CheckIssueDiff>();\n for (const [pkg, pkgData] of Object.entries(currentCheck.packages)) {\n for (const issue of pkgData.issues ?? []) {\n const key = issueKey(pkg, issue.check, issue.message);\n currentIssues.set(key, {\n pkg, check: issue.check, status: 'new', severity: issue.severity, message: issue.message,\n });\n }\n }\n\n const newIssues: CheckIssueDiff[] = [];\n const fixedIssues: CheckIssueDiff[] = [];\n const persistingIssues: CheckIssueDiff[] = [];\n\n for (const [key, issue] of currentIssues) {\n if (baselineIssues.has(key)) {\n persistingIssues.push({ ...issue, status: 'persisting' });\n } else {\n newIssues.push({ ...issue, status: 'new' });\n }\n }\n for (const [key, issue] of baselineIssues) {\n if (!currentIssues.has(key)) {\n fixedIssues.push({ ...issue, status: 'fixed' });\n }\n }\n\n return {\n newIssues,\n fixedIssues,\n persistingIssues,\n newIssueCount: newIssues.length,\n fixedIssueCount: fixedIssues.length,\n scoreDelta: currentStats.score - baseline.stats.score,\n gradeDelta: `${baseline.stats.grade} → ${currentStats.grade}`,\n };\n}\n","import type { RunSnapshot, PackageTimeline, PackageTaskHistory } from '@kb-labs/qa-contracts';\n\nexport function buildPackageTimeline(\n history: RunSnapshot[],\n packageName: string,\n): PackageTimeline {\n const entries: PackageTaskHistory[] = [];\n\n for (const snap of [...history].reverse()) {\n for (const r of snap.raw.results.filter(r => r.Package === packageName)) {\n entries.push({\n timestamp: snap.timestamp,\n gitCommit: snap.git?.commit ?? 'unknown',\n task: r.Task,\n status: r.Cached ? 'cached' : r.OK ? 'passed' : 'failed',\n });\n }\n }\n\n const taskNames = [...new Set(entries.map(e => e.task))];\n let totalFlips = 0;\n let totalTransitions = 0;\n const flakyTasks: string[] = [];\n\n for (const task of taskNames) {\n const taskEntries = entries.filter(e => e.task === task && e.status !== 'cached');\n let flips = 0;\n for (let i = 1; i < taskEntries.length; i++) {\n totalTransitions++;\n if (taskEntries[i]!.status !== taskEntries[i - 1]!.status) {\n flips++;\n totalFlips++;\n }\n }\n if (taskEntries.length > 1 && flips / (taskEntries.length - 1) > 0.3) {\n flakyTasks.push(task);\n }\n }\n\n const flakyScore = totalTransitions > 0\n ? Math.round((totalFlips / totalTransitions) * 100) / 100\n : 0;\n\n const latest = entries[0];\n let streakStatus: 'passing' | 'failing' = 'passing';\n let streakCount = 0;\n\n if (latest) {\n streakStatus = latest.status === 'failed' ? 'failing' : 'passing';\n streakCount = 1;\n for (let i = 1; i < entries.length; i++) {\n const s = entries[i]!.status === 'failed' ? 'failing' : 'passing';\n if (s !== streakStatus) {break;}\n streakCount++;\n }\n }\n\n let firstFailure: string | undefined;\n for (const e of [...entries].reverse()) {\n if (e.status === 'failed') {\n firstFailure = e.timestamp;\n break;\n }\n }\n\n return {\n packageName,\n history: entries,\n flakyScore,\n flakyTasks,\n currentStreak: { status: streakStatus, count: streakCount },\n firstFailure,\n };\n}\n","import type {\n E2eFlakySnapshot,\n E2eCaseResult,\n E2eErrorCategory,\n CaseHistoryEntry,\n CaseTimeline,\n FlakyOverview,\n FlakyOverviewEntry,\n} from '@kb-labs/qa-contracts';\nimport { TRENDS_WINDOW } from '@kb-labs/qa-contracts';\n\nexport function caseKeyOf(caseResult: Pick<E2eCaseResult, 'suite' | 'spec' | 'testId'>): string {\n return `${caseResult.suite}/${caseResult.spec}#${caseResult.testId}`;\n}\n\nfunction lastErrorOf(caseResult: E2eCaseResult): { category?: E2eErrorCategory; message?: string } {\n const failedAttempt = [...caseResult.attempts].reverse().find(a => a.status === 'failed');\n return { category: failedAttempt?.errorCategory, message: failedAttempt?.errorMessage };\n}\n\nexport function buildCaseTimeline(\n history: E2eFlakySnapshot[],\n caseKey: string,\n): CaseTimeline | null {\n const entries: CaseHistoryEntry[] = [];\n let suite = '';\n let spec = '';\n let testId = '';\n let title = '';\n\n for (const snap of [...history].reverse()) {\n const match = snap.cases.find(c => caseKeyOf(c) === caseKey);\n if (!match) {continue;}\n suite = match.suite;\n spec = match.spec;\n testId = match.testId;\n title = match.title;\n const { category, message } = lastErrorOf(match);\n entries.push({\n timestamp: snap.timestamp,\n gitCommit: snap.git?.commit ?? 'unknown',\n status: match.outcome,\n retries: match.attempts.length > 0 ? match.attempts.length - 1 : 0,\n errorCategory: category,\n errorMessage: message,\n });\n }\n\n if (entries.length === 0) {return null;}\n\n const nonSkipped = entries.filter(e => e.status !== 'skipped');\n let flips = 0;\n for (let i = 1; i < nonSkipped.length; i++) {\n if (nonSkipped[i]!.status !== nonSkipped[i - 1]!.status) {flips++;}\n }\n const flakyScore = nonSkipped.length > 1\n ? Math.round((flips / (nonSkipped.length - 1)) * 100) / 100\n : 0;\n\n // Uses nonSkipped (not entries) so a run of 'skipped' outcomes doesn't\n // fabricate a passing streak — same exclusion flakyScore applies above.\n const latest = nonSkipped[0];\n let streakStatus: 'passing' | 'failing' = 'passing';\n let streakCount = 0;\n if (latest) {\n streakStatus = latest.status === 'failed' ? 'failing' : 'passing';\n streakCount = 1;\n for (let i = 1; i < nonSkipped.length; i++) {\n const s = nonSkipped[i]!.status === 'failed' ? 'failing' : 'passing';\n if (s !== streakStatus) {break;}\n streakCount++;\n }\n }\n\n let firstFailure: string | undefined;\n for (const e of [...entries].reverse()) {\n if (e.status === 'failed' || e.status === 'flaky') {\n firstFailure = e.timestamp;\n break;\n }\n }\n\n return {\n caseKey,\n suite,\n spec,\n testId,\n title,\n history: entries,\n flakyScore,\n currentStreak: { status: streakStatus, count: streakCount },\n firstFailure,\n };\n}\n\nexport function analyzeFlakyCases(\n history: E2eFlakySnapshot[],\n window: number = TRENDS_WINDOW,\n): FlakyOverview {\n const windowSnaps = history.slice(-window);\n if (windowSnaps.length === 0) {\n return {\n window,\n runsAnalyzed: 0,\n totalCases: 0,\n flakyCases: 0,\n delta: { new: [], fixed: [], unchanged: [] },\n byCategory: { 'infra-timeout': 0, 'assertion-race': 0, 'ws-flake': 0, unknown: 0 },\n top: [],\n };\n }\n\n const caseKeys = new Set<string>();\n for (const snap of windowSnaps) {\n for (const c of snap.cases) {caseKeys.add(caseKeyOf(c));}\n }\n\n const byCategory: Record<E2eErrorCategory, number> = {\n 'infra-timeout': 0,\n 'assertion-race': 0,\n 'ws-flake': 0,\n unknown: 0,\n };\n const flakyEntries: FlakyOverviewEntry[] = [];\n const flakyNowKeys = new Set<string>();\n\n for (const key of caseKeys) {\n const timeline = buildCaseTimeline(windowSnaps, key);\n if (!timeline || timeline.flakyScore === 0) {continue;}\n\n flakyNowKeys.add(key);\n const category = timeline.history[0]?.errorCategory ?? 'unknown';\n byCategory[category]++;\n flakyEntries.push({\n case: key,\n flakyScore: timeline.flakyScore,\n streak: `${timeline.currentStreak.status} x${timeline.currentStreak.count}`,\n category,\n });\n }\n\n flakyEntries.sort((a, b) => b.flakyScore - a.flakyScore);\n\n const previousSnaps = history.slice(-2 * window, -window);\n // Collect previous-window keys independently of `caseKeys` (current window)\n // — a case that was flaky before but has since disappeared entirely (spec\n // renamed/deleted) must still be checkable, or it can never show up as \"fixed\".\n const previousCaseKeys = new Set<string>();\n for (const snap of previousSnaps) {\n for (const c of snap.cases) {previousCaseKeys.add(caseKeyOf(c));}\n }\n const flakyPreviousKeys = new Set<string>();\n for (const key of previousCaseKeys) {\n const timeline = buildCaseTimeline(previousSnaps, key);\n if (timeline && timeline.flakyScore > 0) {flakyPreviousKeys.add(key);}\n }\n\n const delta = {\n new: [...flakyNowKeys].filter(k => !flakyPreviousKeys.has(k)),\n fixed: [...flakyPreviousKeys].filter(k => !flakyNowKeys.has(k)),\n unchanged: [...flakyNowKeys].filter(k => flakyPreviousKeys.has(k)),\n };\n\n return {\n window,\n runsAnalyzed: windowSnaps.length,\n totalCases: caseKeys.size,\n flakyCases: flakyNowKeys.size,\n delta,\n byCategory,\n top: flakyEntries.slice(0, 5),\n };\n}\n","import type {\n RunSnapshot,\n CheckSnapshot,\n StatsSnapshot,\n TrendAnalysis,\n RegressionDetection,\n BaselineData,\n BaselineCheckDiff,\n} from '@kb-labs/qa-contracts';\n\nexport interface ReportSection {\n header: string;\n lines: string[];\n}\n\nexport function formatTaskName(task: string): string {\n return task\n .split(/[-_]/)\n .map(w => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nexport function buildRunReport(snap: RunSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Run', lines: ['No run data available.'] }];}\n\n const sections: ReportSection[] = [];\n const tasks = [...new Set(snap.raw.results.map(r => r.Task))];\n\n for (const task of tasks) {\n const results = snap.raw.results.filter(r => r.Task === task);\n const passed = results.filter(r => r.OK && !r.Cached).length;\n const failed = results.filter(r => !r.OK && !r.Cached).length;\n const cached = results.filter(r => r.Cached).length;\n const failedPkgs = results.filter(r => !r.OK && !r.Cached).map(r => r.Package);\n\n const lines: string[] = [`pass ${passed} fail ${failed} cached ${cached}`];\n if (failedPkgs.length > 0) {\n const shown = failedPkgs.slice(0, 5);\n lines.push(...shown.map(p => ` ✗ ${p}`));\n if (failedPkgs.length > 5) {lines.push(` ... ${failedPkgs.length - 5} more`);}\n }\n\n sections.push({ header: formatTaskName(task), lines });\n }\n\n const status = snap.raw.ok ? 'passed' : 'failed';\n const { total, passed: p, failed: f, cached: c } = snap.raw.summary;\n sections.push({\n header: 'Summary',\n lines: [`${status.toUpperCase()} total ${total} pass ${p} fail ${f} cached ${c} (${snap.raw.elapsed})`],\n });\n\n return sections;\n}\n\nexport function buildCheckReport(snap: CheckSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Check', lines: ['No check data available.'] }];}\n\n const sections: ReportSection[] = [];\n\n for (const [pkg, pkgData] of Object.entries(snap.raw.packages)) {\n const issues = pkgData.issues ?? [];\n if (issues.length === 0) {continue;}\n\n const errors = issues.filter(i => i.severity === 'error').length;\n const warnings = issues.filter(i => i.severity === 'warning').length;\n const infos = issues.filter(i => i.severity === 'info').length;\n\n const lines: string[] = [`errors ${errors} warnings ${warnings} info ${infos}`];\n for (const issue of issues.slice(0, 5)) {\n lines.push(` [${issue.severity}] ${issue.check}: ${issue.message}`);\n }\n if (issues.length > 5) {lines.push(` ... ${issues.length - 5} more`);}\n\n sections.push({ header: pkg, lines });\n }\n\n if (sections.length === 0) {\n sections.push({ header: 'Check', lines: ['All packages OK.'] });\n }\n\n return sections;\n}\n\nexport function buildStatsReport(snap: StatsSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Stats', lines: ['No stats data available.'] }];}\n\n const { score, grade, summary, by_category, coverage } = snap.raw;\n\n const sections: ReportSection[] = [];\n\n sections.push({\n header: 'Score',\n lines: [`${score}/100 Grade: ${grade} (${summary.healthy} healthy / ${summary.warning} warning / ${summary.error} error)`],\n });\n\n const catLines = Object.entries(by_category).map(([cat, data]) => {\n const pct = data.total > 0 ? Math.round((data.healthy / data.total) * 100) : 0;\n return ` ${cat.padEnd(20)} ${data.grade} ${pct}% (${data.healthy}/${data.total})`;\n });\n sections.push({ header: 'By Category', lines: catLines });\n\n if (Object.keys(coverage).length > 0) {\n const covLines = Object.entries(coverage).map(([k, v]) => ` ${k.padEnd(20)} ${v.pct}% (${v.pass}/${v.total})`);\n sections.push({ header: 'Coverage', lines: covLines });\n }\n\n return sections;\n}\n\nexport function buildHistoryTable(history: RunSnapshot[], limit = 20): ReportSection[] {\n const rows = [...history].reverse().slice(0, limit);\n if (rows.length === 0) {return [{ header: 'History', lines: ['No history available.'] }];}\n\n const lines = rows.map(snap => {\n const status = snap.raw.ok ? 'pass' : 'fail';\n const tasks = snap.tasks.join(', ');\n const commit = snap.git?.commit ?? '-------';\n const date = new Date(snap.timestamp).toLocaleString();\n return ` ${date} ${commit} ${status} [${tasks}]`;\n });\n\n return [{ header: `History (last ${rows.length})`, lines }];\n}\n\nexport function buildTrendsReport(analysis: TrendAnalysis): ReportSection[] {\n if (analysis.tasks.length === 0) {\n return [{ header: 'Trends', lines: ['Not enough history for trend analysis.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const trend of analysis.tasks) {\n const arrow = trend.direction === 'regression' ? '↑' : trend.direction === 'improvement' ? '↓' : '→';\n const lines: string[] = [\n `${arrow} ${trend.direction} prev ${trend.previous} curr ${trend.current} delta ${trend.delta > 0 ? '+' : ''}${trend.delta} velocity ${trend.velocity}`,\n ];\n\n if (trend.changelog.length > 0) {\n const last = trend.changelog[trend.changelog.length - 1]!;\n if (last.newFailures.length > 0) {lines.push(` last regression: ${last.newFailures.slice(0, 3).join(', ')}`);}\n if (last.fixed.length > 0) {lines.push(` last fixed: ${last.fixed.slice(0, 3).join(', ')}`);}\n }\n\n sections.push({ header: formatTaskName(trend.task), lines });\n }\n\n return sections;\n}\n\nexport function buildRegressionsReport(detection: RegressionDetection): ReportSection[] {\n if (!detection.hasRegressions) {\n return [{ header: 'Regressions', lines: ['No regressions detected.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const reg of detection.regressions) {\n const lines = [\n `delta +${reg.delta}`,\n ...reg.newFailures.slice(0, 5).map(p => ` ✗ ${p}`),\n ];\n if (reg.newFailures.length > 5) {lines.push(` ... ${reg.newFailures.length - 5} more`);}\n sections.push({ header: formatTaskName(reg.task), lines });\n }\n\n const prev = new Date(detection.comparedAt.previous).toLocaleString();\n const curr = new Date(detection.comparedAt.current).toLocaleString();\n sections.push({ header: 'Compared', lines: [`${prev} → ${curr}`] });\n\n return sections;\n}\n\nexport function buildBaselineReport(baseline: BaselineData | null): ReportSection[] {\n if (!baseline) {return [{ header: 'Baseline', lines: ['No baseline set. Run `qa baseline update` to set one.'] }];}\n\n const { score, grade } = baseline.stats;\n const totalIssues = Object.values(baseline.check.packages)\n .reduce((sum, pkg) => sum + (pkg.issues?.length ?? 0), 0);\n const commit = baseline.git?.commit ?? 'unknown';\n const date = new Date(baseline.timestamp).toLocaleString();\n\n return [{\n header: 'Baseline',\n lines: [`score ${score}/100 grade ${grade} issues ${totalIssues} commit ${commit} set ${date}`],\n }];\n}\n\nexport function buildBaselineDiffReport(diff: BaselineCheckDiff): ReportSection[] {\n const sections: ReportSection[] = [];\n\n const scoreDir = diff.scoreDelta > 0 ? '+' : '';\n sections.push({\n header: 'Score Delta',\n lines: [`${scoreDir}${diff.scoreDelta} ${diff.gradeDelta} new ${diff.newIssueCount} fixed ${diff.fixedIssueCount}`],\n });\n\n if (diff.newIssues.length > 0) {\n const lines = diff.newIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.newIssues.length > 10) {lines.push(` ... ${diff.newIssues.length - 10} more`);}\n sections.push({ header: 'New Issues', lines });\n }\n\n if (diff.fixedIssues.length > 0) {\n const lines = diff.fixedIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.fixedIssues.length > 10) {lines.push(` ... ${diff.fixedIssues.length - 10} more`);}\n sections.push({ header: 'Fixed Issues', lines });\n }\n\n if (diff.persistingIssues.length > 0) {\n sections.push({ header: 'Persisting Issues', lines: [`${diff.persistingIssues.length} issues unchanged`] });\n }\n\n return sections;\n}\n","import type { RunSnapshot, CheckSnapshot, StatsSnapshot } from '@kb-labs/qa-contracts';\n\nexport function buildRunJsonReport(snap: RunSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n tasks: snap.tasks,\n ok: snap.raw.ok,\n elapsed: snap.raw.elapsed,\n summary: snap.raw.summary,\n results: snap.raw.results,\n };\n}\n\nexport function buildCheckJsonReport(snap: CheckSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n packages: snap.raw.packages,\n };\n}\n\nexport function buildStatsJsonReport(snap: StatsSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n score: snap.raw.score,\n grade: snap.raw.grade,\n summary: snap.raw.summary,\n by_category: snap.raw.by_category,\n issues_by_type: snap.raw.issues_by_type,\n coverage: snap.raw.coverage,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/report/text-reporter.ts","../../src/report/json-reporter.ts"],"names":["p"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RunSnapshot,\n CheckSnapshot,\n StatsSnapshot,\n TrendAnalysis,\n RegressionDetection,\n BaselineData,\n BaselineCheckDiff,\n} from '@kb-labs/qa-contracts';\n\nexport interface ReportSection {\n header: string;\n lines: string[];\n}\n\nexport function formatTaskName(task: string): string {\n return task\n .split(/[-_]/)\n .map(w => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nexport function buildRunReport(snap: RunSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Run', lines: ['No run data available.'] }];}\n\n const sections: ReportSection[] = [];\n const tasks = [...new Set(snap.raw.results.map(r => r.Task))];\n\n for (const task of tasks) {\n const results = snap.raw.results.filter(r => r.Task === task);\n const passed = results.filter(r => r.OK && !r.Cached).length;\n const failed = results.filter(r => !r.OK && !r.Cached).length;\n const cached = results.filter(r => r.Cached).length;\n const failedPkgs = results.filter(r => !r.OK && !r.Cached).map(r => r.Package);\n\n const lines: string[] = [`pass ${passed} fail ${failed} cached ${cached}`];\n if (failedPkgs.length > 0) {\n const shown = failedPkgs.slice(0, 5);\n lines.push(...shown.map(p => ` ✗ ${p}`));\n if (failedPkgs.length > 5) {lines.push(` ... ${failedPkgs.length - 5} more`);}\n }\n\n sections.push({ header: formatTaskName(task), lines });\n }\n\n const status = snap.raw.ok ? 'passed' : 'failed';\n const { total, passed: p, failed: f, cached: c } = snap.raw.summary;\n sections.push({\n header: 'Summary',\n lines: [`${status.toUpperCase()} total ${total} pass ${p} fail ${f} cached ${c} (${snap.raw.elapsed})`],\n });\n\n return sections;\n}\n\nexport function buildCheckReport(snap: CheckSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Check', lines: ['No check data available.'] }];}\n\n const sections: ReportSection[] = [];\n\n for (const [pkg, pkgData] of Object.entries(snap.raw.packages)) {\n const issues = pkgData.issues ?? [];\n if (issues.length === 0) {continue;}\n\n const errors = issues.filter(i => i.severity === 'error').length;\n const warnings = issues.filter(i => i.severity === 'warning').length;\n const infos = issues.filter(i => i.severity === 'info').length;\n\n const lines: string[] = [`errors ${errors} warnings ${warnings} info ${infos}`];\n for (const issue of issues.slice(0, 5)) {\n lines.push(` [${issue.severity}] ${issue.check}: ${issue.message}`);\n }\n if (issues.length > 5) {lines.push(` ... ${issues.length - 5} more`);}\n\n sections.push({ header: pkg, lines });\n }\n\n if (sections.length === 0) {\n sections.push({ header: 'Check', lines: ['All packages OK.'] });\n }\n\n return sections;\n}\n\nexport function buildStatsReport(snap: StatsSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Stats', lines: ['No stats data available.'] }];}\n\n const { score, grade, summary, by_category, coverage } = snap.raw;\n\n const sections: ReportSection[] = [];\n\n sections.push({\n header: 'Score',\n lines: [`${score}/100 Grade: ${grade} (${summary.healthy} healthy / ${summary.warning} warning / ${summary.error} error)`],\n });\n\n const catLines = Object.entries(by_category).map(([cat, data]) => {\n const pct = data.total > 0 ? Math.round((data.healthy / data.total) * 100) : 0;\n return ` ${cat.padEnd(20)} ${data.grade} ${pct}% (${data.healthy}/${data.total})`;\n });\n sections.push({ header: 'By Category', lines: catLines });\n\n if (Object.keys(coverage).length > 0) {\n const covLines = Object.entries(coverage).map(([k, v]) => ` ${k.padEnd(20)} ${v.pct}% (${v.pass}/${v.total})`);\n sections.push({ header: 'Coverage', lines: covLines });\n }\n\n return sections;\n}\n\nexport function buildHistoryTable(history: RunSnapshot[], limit = 20): ReportSection[] {\n const rows = [...history].reverse().slice(0, limit);\n if (rows.length === 0) {return [{ header: 'History', lines: ['No history available.'] }];}\n\n const lines = rows.map(snap => {\n const status = snap.raw.ok ? 'pass' : 'fail';\n const tasks = snap.tasks.join(', ');\n const commit = snap.git?.commit ?? '-------';\n const date = new Date(snap.timestamp).toLocaleString();\n return ` ${date} ${commit} ${status} [${tasks}]`;\n });\n\n return [{ header: `History (last ${rows.length})`, lines }];\n}\n\nexport function buildTrendsReport(analysis: TrendAnalysis): ReportSection[] {\n if (analysis.tasks.length === 0) {\n return [{ header: 'Trends', lines: ['Not enough history for trend analysis.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const trend of analysis.tasks) {\n const arrow = trend.direction === 'regression' ? '↑' : trend.direction === 'improvement' ? '↓' : '→';\n const lines: string[] = [\n `${arrow} ${trend.direction} prev ${trend.previous} curr ${trend.current} delta ${trend.delta > 0 ? '+' : ''}${trend.delta} velocity ${trend.velocity}`,\n ];\n\n if (trend.changelog.length > 0) {\n const last = trend.changelog[trend.changelog.length - 1]!;\n if (last.newFailures.length > 0) {lines.push(` last regression: ${last.newFailures.slice(0, 3).join(', ')}`);}\n if (last.fixed.length > 0) {lines.push(` last fixed: ${last.fixed.slice(0, 3).join(', ')}`);}\n }\n\n sections.push({ header: formatTaskName(trend.task), lines });\n }\n\n return sections;\n}\n\nexport function buildRegressionsReport(detection: RegressionDetection): ReportSection[] {\n if (!detection.hasRegressions) {\n return [{ header: 'Regressions', lines: ['No regressions detected.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const reg of detection.regressions) {\n const lines = [\n `delta +${reg.delta}`,\n ...reg.newFailures.slice(0, 5).map(p => ` ✗ ${p}`),\n ];\n if (reg.newFailures.length > 5) {lines.push(` ... ${reg.newFailures.length - 5} more`);}\n sections.push({ header: formatTaskName(reg.task), lines });\n }\n\n const prev = new Date(detection.comparedAt.previous).toLocaleString();\n const curr = new Date(detection.comparedAt.current).toLocaleString();\n sections.push({ header: 'Compared', lines: [`${prev} → ${curr}`] });\n\n return sections;\n}\n\nexport function buildBaselineReport(baseline: BaselineData | null): ReportSection[] {\n if (!baseline) {return [{ header: 'Baseline', lines: ['No baseline set. Run `qa baseline update` to set one.'] }];}\n\n const { score, grade } = baseline.stats;\n const totalIssues = Object.values(baseline.check.packages)\n .reduce((sum, pkg) => sum + (pkg.issues?.length ?? 0), 0);\n const commit = baseline.git?.commit ?? 'unknown';\n const date = new Date(baseline.timestamp).toLocaleString();\n\n return [{\n header: 'Baseline',\n lines: [`score ${score}/100 grade ${grade} issues ${totalIssues} commit ${commit} set ${date}`],\n }];\n}\n\nexport function buildBaselineDiffReport(diff: BaselineCheckDiff): ReportSection[] {\n const sections: ReportSection[] = [];\n\n const scoreDir = diff.scoreDelta > 0 ? '+' : '';\n sections.push({\n header: 'Score Delta',\n lines: [`${scoreDir}${diff.scoreDelta} ${diff.gradeDelta} new ${diff.newIssueCount} fixed ${diff.fixedIssueCount}`],\n });\n\n if (diff.newIssues.length > 0) {\n const lines = diff.newIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.newIssues.length > 10) {lines.push(` ... ${diff.newIssues.length - 10} more`);}\n sections.push({ header: 'New Issues', lines });\n }\n\n if (diff.fixedIssues.length > 0) {\n const lines = diff.fixedIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.fixedIssues.length > 10) {lines.push(` ... ${diff.fixedIssues.length - 10} more`);}\n sections.push({ header: 'Fixed Issues', lines });\n }\n\n if (diff.persistingIssues.length > 0) {\n sections.push({ header: 'Persisting Issues', lines: [`${diff.persistingIssues.length} issues unchanged`] });\n }\n\n return sections;\n}\n","import type { RunSnapshot, CheckSnapshot, StatsSnapshot } from '@kb-labs/qa-contracts';\n\nexport function buildRunJsonReport(snap: RunSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n tasks: snap.tasks,\n ok: snap.raw.ok,\n elapsed: snap.raw.elapsed,\n summary: snap.raw.summary,\n results: snap.raw.results,\n };\n}\n\nexport function buildCheckJsonReport(snap: CheckSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n packages: snap.raw.packages,\n };\n}\n\nexport function buildStatsJsonReport(snap: StatsSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n score: snap.raw.score,\n grade: snap.raw.grade,\n summary: snap.raw.summary,\n by_category: snap.raw.by_category,\n issues_by_type: snap.raw.issues_by_type,\n coverage: snap.raw.coverage,\n };\n}\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/report/text-reporter.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/qa/core/src/report/json-reporter.ts"],"names":["p"],"mappings":";AAeO,SAAS,eAAe,IAAA,EAAsB;AACnD,EAAA,OAAO,KACJ,KAAA,CAAM,MAAM,EACZ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAC/C,KAAK,GAAG,CAAA;AACb;AAEO,SAAS,eAAe,IAAA,EAA2C;AACxE,EAAA,IAAI,CAAC,IAAA,EAAM;AAAC,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAC,wBAAwB,GAAG,CAAA;AAAA,EAAE;AAE1E,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAE5D,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,EAAA,IAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AACtD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,EAAA,IAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AACvD,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAE7E,IAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,KAAA,EAAQ,MAAM,UAAU,MAAM,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AAC3E,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA,CAAI,CAAAA,EAAAA,KAAK,CAAA,SAAA,EAAOA,EAAC,CAAA,CAAE,CAAC,CAAA;AACxC,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAAC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,MAAE;AAAA,IAChF;AAEA,IAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,eAAe,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,QAAA,GAAW,QAAA;AACxC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAA,EAAE,GAAI,IAAA,CAAK,GAAA,CAAI,OAAA;AAC5D,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,OAAO,CAAC,CAAA,EAAG,OAAO,WAAA,EAAa,WAAW,KAAK,CAAA,OAAA,EAAU,CAAC,CAAA,OAAA,EAAU,CAAC,CAAA,SAAA,EAAY,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,CAAA,CAAG;AAAA,GAC5G,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAiB,IAAA,EAA6C;AAC5E,EAAA,IAAI,CAAC,IAAA,EAAM;AAAC,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,0BAA0B,GAAG,CAAA;AAAA,EAAE;AAE9E,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,CAAC,KAAK,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,EAAC;AAClC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAEnC,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,KAAa,OAAO,CAAA,CAAE,MAAA;AAC1D,IAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,KAAa,SAAS,CAAA,CAAE,MAAA;AAC9D,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,KAAa,MAAM,CAAA,CAAE,MAAA;AAExD,IAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,OAAA,EAAU,MAAM,cAAc,QAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAChF,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK,MAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAAC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,IAAE;AAEtE,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,kBAAkB,GAAG,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAiB,IAAA,EAA6C;AAC5E,EAAA,IAAI,CAAC,IAAA,EAAM;AAAC,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,0BAA0B,GAAG,CAAA;AAAA,EAAE;AAE9E,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,SAAS,WAAA,EAAa,QAAA,KAAa,IAAA,CAAK,GAAA;AAE9D,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,OAAA;AAAA,IACR,KAAA,EAAO,CAAC,CAAA,EAAG,KAAK,gBAAgB,KAAK,CAAA,GAAA,EAAM,OAAA,CAAQ,OAAO,cAAc,OAAA,CAAQ,OAAO,CAAA,WAAA,EAAc,OAAA,CAAQ,KAAK,CAAA,OAAA,CAAS;AAAA,GAC5H,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,IAAI,CAAA,KAAM;AAChE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAA,GAAS,GAAG,CAAA,GAAI,CAAA;AAC7E,IAAA,OAAO,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,IAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EACnF,CAAC,CAAA;AACD,EAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,aAAA,EAAe,KAAA,EAAO,UAAU,CAAA;AAExD,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,EAAE,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,CAAG,CAAA;AAC/G,IAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,UAAU,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAA,CAAkB,OAAA,EAAwB,KAAA,GAAQ,EAAA,EAAqB;AACrF,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,OAAO,EAAE,OAAA,EAAQ,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAClD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAAC,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC,uBAAuB,GAAG,CAAA;AAAA,EAAE;AAEzF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,IAAA,KAAQ;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,MAAA,GAAS,MAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAK,MAAA,IAAU,SAAA;AACnC,IAAA,MAAM,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,cAAA,EAAe;AACrD,IAAA,OAAO,KAAK,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,MAAM,MAAM,KAAK,CAAA,CAAA,CAAA;AAAA,EACnD,CAAC,CAAA;AAED,EAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,CAAA,cAAA,EAAiB,KAAK,MAAM,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AAC5D;AAEO,SAAS,kBAAkB,QAAA,EAA0C;AAC1E,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,wCAAwC,GAAG,CAAA;AAAA,EACjF;AAEA,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,KAAA,EAAO;AAClC,IAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,KAAc,YAAA,GAAe,WAAM,KAAA,CAAM,SAAA,KAAc,gBAAgB,QAAA,GAAM,QAAA;AACjG,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,OAAA,EAAU,KAAA,CAAM,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,OAAO,WAAW,KAAA,CAAM,KAAA,GAAQ,IAAI,GAAA,GAAM,EAAE,GAAG,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,KAAA,CAAM,QAAQ,CAAA;AAAA,KAC3J;AAEA,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,OAAO,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,SAAS,CAAC,CAAA;AACvD,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAAC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAAE;AAC9G,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAAC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAAE;AAAA,IAC/F;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,cAAA,CAAe,MAAM,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,uBAAuB,SAAA,EAAiD;AACtF,EAAA,IAAI,CAAC,UAAU,cAAA,EAAgB;AAC7B,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,aAAA,EAAe,OAAO,CAAC,0BAA0B,GAAG,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,GAAA,IAAO,UAAU,WAAA,EAAa;AACvC,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,CAAA,OAAA,EAAU,IAAI,KAAK,CAAA,CAAA;AAAA,MACnB,GAAG,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,SAAA,EAAO,CAAC,CAAA,CAAE;AAAA,KACpD;AACA,IAAA,IAAI,GAAA,CAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAAC,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,GAAA,CAAI,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,KAAA,CAAO,CAAA;AAAA,IAAE;AACxF,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,cAAA,CAAe,IAAI,IAAI,CAAA,EAAG,OAAO,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,UAAU,UAAA,CAAW,QAAQ,EAAE,cAAA,EAAe;AACpE,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,UAAU,UAAA,CAAW,OAAO,EAAE,cAAA,EAAe;AACnE,EAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,CAAC,CAAA,EAAG,IAAI,CAAA,QAAA,EAAM,IAAI,CAAA,CAAE,CAAA,EAAG,CAAA;AAElE,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,oBAAoB,QAAA,EAAgD;AAClF,EAAA,IAAI,CAAC,QAAA,EAAU;AAAC,IAAA,OAAO,CAAC,EAAE,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAC,uDAAuD,GAAG,CAAA;AAAA,EAAE;AAElH,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,QAAA,CAAS,KAAA;AAClC,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,CACtD,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,IAAO,GAAA,CAAI,MAAA,EAAQ,MAAA,IAAU,IAAI,CAAC,CAAA;AAC1D,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,EAAK,MAAA,IAAU,SAAA;AACvC,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,EAAE,cAAA,EAAe;AAEzD,EAAA,OAAO,CAAC;AAAA,IACN,MAAA,EAAQ,UAAA;AAAA,IACR,KAAA,EAAO,CAAC,CAAA,MAAA,EAAS,KAAK,CAAA,YAAA,EAAe,KAAK,CAAA,SAAA,EAAY,WAAW,CAAA,SAAA,EAAY,MAAM,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE;AAAA,GACnG,CAAA;AACH;AAEO,SAAS,wBAAwB,IAAA,EAA0C;AAChF,EAAA,MAAM,WAA4B,EAAC;AAEnC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,EAAA;AAC7C,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,aAAA;AAAA,IACR,OAAO,CAAC,CAAA,EAAG,QAAQ,CAAA,EAAG,KAAK,UAAU,CAAA,EAAA,EAAK,IAAA,CAAK,UAAU,SAAS,IAAA,CAAK,aAAa,CAAA,QAAA,EAAW,IAAA,CAAK,eAAe,CAAA,CAAE;AAAA,GACtH,CAAA;AAED,EAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,CAAU,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,GAAA,EAAM,EAAE,QAAQ,CAAA,EAAA,EAAK,EAAE,GAAG,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACzG,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,EAAA,EAAI;AAAC,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,IAAE;AACxF,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,YAAA,EAAc,OAAO,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,GAAA,EAAM,EAAE,QAAQ,CAAA,EAAA,EAAK,EAAE,GAAG,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAC3G,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,EAAA,EAAI;AAAC,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,EAAE,CAAA,KAAA,CAAO,CAAA;AAAA,IAAE;AAC5F,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,cAAA,EAAgB,OAAO,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACpC,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,mBAAA,EAAqB,KAAA,EAAO,CAAC,CAAA,EAAG,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAA,iBAAA,CAAmB,CAAA,EAAG,CAAA;AAAA,EAC5G;AAEA,EAAA,OAAO,QAAA;AACT;;;ACpNO,SAAS,mBAAmB,IAAA,EAA2B;AAC5D,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA;AAAA,IACb,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,IAClB,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,IAClB,OAAA,EAAS,KAAK,GAAA,CAAI;AAAA,GACpB;AACF;AAEO,SAAS,qBAAqB,IAAA,EAA6B;AAChE,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA;AAAA,IACb,QAAA,EAAU,KAAK,GAAA,CAAI;AAAA,GACrB;AACF;AAEO,SAAS,qBAAqB,IAAA,EAA6B;AAChE,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA;AAAA,IACb,KAAA,EAAO,KAAK,GAAA,CAAI,KAAA;AAAA,IAChB,KAAA,EAAO,KAAK,GAAA,CAAI,KAAA;AAAA,IAChB,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,IAClB,WAAA,EAAa,KAAK,GAAA,CAAI,WAAA;AAAA,IACtB,cAAA,EAAgB,KAAK,GAAA,CAAI,cAAA;AAAA,IACzB,QAAA,EAAU,KAAK,GAAA,CAAI;AAAA,GACrB;AACF","file":"index.js","sourcesContent":["import type {\n RunSnapshot,\n CheckSnapshot,\n StatsSnapshot,\n TrendAnalysis,\n RegressionDetection,\n BaselineData,\n BaselineCheckDiff,\n} from '@kb-labs/qa-contracts';\n\nexport interface ReportSection {\n header: string;\n lines: string[];\n}\n\nexport function formatTaskName(task: string): string {\n return task\n .split(/[-_]/)\n .map(w => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\nexport function buildRunReport(snap: RunSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Run', lines: ['No run data available.'] }];}\n\n const sections: ReportSection[] = [];\n const tasks = [...new Set(snap.raw.results.map(r => r.Task))];\n\n for (const task of tasks) {\n const results = snap.raw.results.filter(r => r.Task === task);\n const passed = results.filter(r => r.OK && !r.Cached).length;\n const failed = results.filter(r => !r.OK && !r.Cached).length;\n const cached = results.filter(r => r.Cached).length;\n const failedPkgs = results.filter(r => !r.OK && !r.Cached).map(r => r.Package);\n\n const lines: string[] = [`pass ${passed} fail ${failed} cached ${cached}`];\n if (failedPkgs.length > 0) {\n const shown = failedPkgs.slice(0, 5);\n lines.push(...shown.map(p => ` ✗ ${p}`));\n if (failedPkgs.length > 5) {lines.push(` ... ${failedPkgs.length - 5} more`);}\n }\n\n sections.push({ header: formatTaskName(task), lines });\n }\n\n const status = snap.raw.ok ? 'passed' : 'failed';\n const { total, passed: p, failed: f, cached: c } = snap.raw.summary;\n sections.push({\n header: 'Summary',\n lines: [`${status.toUpperCase()} total ${total} pass ${p} fail ${f} cached ${c} (${snap.raw.elapsed})`],\n });\n\n return sections;\n}\n\nexport function buildCheckReport(snap: CheckSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Check', lines: ['No check data available.'] }];}\n\n const sections: ReportSection[] = [];\n\n for (const [pkg, pkgData] of Object.entries(snap.raw.packages)) {\n const issues = pkgData.issues ?? [];\n if (issues.length === 0) {continue;}\n\n const errors = issues.filter(i => i.severity === 'error').length;\n const warnings = issues.filter(i => i.severity === 'warning').length;\n const infos = issues.filter(i => i.severity === 'info').length;\n\n const lines: string[] = [`errors ${errors} warnings ${warnings} info ${infos}`];\n for (const issue of issues.slice(0, 5)) {\n lines.push(` [${issue.severity}] ${issue.check}: ${issue.message}`);\n }\n if (issues.length > 5) {lines.push(` ... ${issues.length - 5} more`);}\n\n sections.push({ header: pkg, lines });\n }\n\n if (sections.length === 0) {\n sections.push({ header: 'Check', lines: ['All packages OK.'] });\n }\n\n return sections;\n}\n\nexport function buildStatsReport(snap: StatsSnapshot | null): ReportSection[] {\n if (!snap) {return [{ header: 'Stats', lines: ['No stats data available.'] }];}\n\n const { score, grade, summary, by_category, coverage } = snap.raw;\n\n const sections: ReportSection[] = [];\n\n sections.push({\n header: 'Score',\n lines: [`${score}/100 Grade: ${grade} (${summary.healthy} healthy / ${summary.warning} warning / ${summary.error} error)`],\n });\n\n const catLines = Object.entries(by_category).map(([cat, data]) => {\n const pct = data.total > 0 ? Math.round((data.healthy / data.total) * 100) : 0;\n return ` ${cat.padEnd(20)} ${data.grade} ${pct}% (${data.healthy}/${data.total})`;\n });\n sections.push({ header: 'By Category', lines: catLines });\n\n if (Object.keys(coverage).length > 0) {\n const covLines = Object.entries(coverage).map(([k, v]) => ` ${k.padEnd(20)} ${v.pct}% (${v.pass}/${v.total})`);\n sections.push({ header: 'Coverage', lines: covLines });\n }\n\n return sections;\n}\n\nexport function buildHistoryTable(history: RunSnapshot[], limit = 20): ReportSection[] {\n const rows = [...history].reverse().slice(0, limit);\n if (rows.length === 0) {return [{ header: 'History', lines: ['No history available.'] }];}\n\n const lines = rows.map(snap => {\n const status = snap.raw.ok ? 'pass' : 'fail';\n const tasks = snap.tasks.join(', ');\n const commit = snap.git?.commit ?? '-------';\n const date = new Date(snap.timestamp).toLocaleString();\n return ` ${date} ${commit} ${status} [${tasks}]`;\n });\n\n return [{ header: `History (last ${rows.length})`, lines }];\n}\n\nexport function buildTrendsReport(analysis: TrendAnalysis): ReportSection[] {\n if (analysis.tasks.length === 0) {\n return [{ header: 'Trends', lines: ['Not enough history for trend analysis.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const trend of analysis.tasks) {\n const arrow = trend.direction === 'regression' ? '↑' : trend.direction === 'improvement' ? '↓' : '→';\n const lines: string[] = [\n `${arrow} ${trend.direction} prev ${trend.previous} curr ${trend.current} delta ${trend.delta > 0 ? '+' : ''}${trend.delta} velocity ${trend.velocity}`,\n ];\n\n if (trend.changelog.length > 0) {\n const last = trend.changelog[trend.changelog.length - 1]!;\n if (last.newFailures.length > 0) {lines.push(` last regression: ${last.newFailures.slice(0, 3).join(', ')}`);}\n if (last.fixed.length > 0) {lines.push(` last fixed: ${last.fixed.slice(0, 3).join(', ')}`);}\n }\n\n sections.push({ header: formatTaskName(trend.task), lines });\n }\n\n return sections;\n}\n\nexport function buildRegressionsReport(detection: RegressionDetection): ReportSection[] {\n if (!detection.hasRegressions) {\n return [{ header: 'Regressions', lines: ['No regressions detected.'] }];\n }\n\n const sections: ReportSection[] = [];\n\n for (const reg of detection.regressions) {\n const lines = [\n `delta +${reg.delta}`,\n ...reg.newFailures.slice(0, 5).map(p => ` ✗ ${p}`),\n ];\n if (reg.newFailures.length > 5) {lines.push(` ... ${reg.newFailures.length - 5} more`);}\n sections.push({ header: formatTaskName(reg.task), lines });\n }\n\n const prev = new Date(detection.comparedAt.previous).toLocaleString();\n const curr = new Date(detection.comparedAt.current).toLocaleString();\n sections.push({ header: 'Compared', lines: [`${prev} → ${curr}`] });\n\n return sections;\n}\n\nexport function buildBaselineReport(baseline: BaselineData | null): ReportSection[] {\n if (!baseline) {return [{ header: 'Baseline', lines: ['No baseline set. Run `qa baseline update` to set one.'] }];}\n\n const { score, grade } = baseline.stats;\n const totalIssues = Object.values(baseline.check.packages)\n .reduce((sum, pkg) => sum + (pkg.issues?.length ?? 0), 0);\n const commit = baseline.git?.commit ?? 'unknown';\n const date = new Date(baseline.timestamp).toLocaleString();\n\n return [{\n header: 'Baseline',\n lines: [`score ${score}/100 grade ${grade} issues ${totalIssues} commit ${commit} set ${date}`],\n }];\n}\n\nexport function buildBaselineDiffReport(diff: BaselineCheckDiff): ReportSection[] {\n const sections: ReportSection[] = [];\n\n const scoreDir = diff.scoreDelta > 0 ? '+' : '';\n sections.push({\n header: 'Score Delta',\n lines: [`${scoreDir}${diff.scoreDelta} ${diff.gradeDelta} new ${diff.newIssueCount} fixed ${diff.fixedIssueCount}`],\n });\n\n if (diff.newIssues.length > 0) {\n const lines = diff.newIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.newIssues.length > 10) {lines.push(` ... ${diff.newIssues.length - 10} more`);}\n sections.push({ header: 'New Issues', lines });\n }\n\n if (diff.fixedIssues.length > 0) {\n const lines = diff.fixedIssues.slice(0, 10).map(i => ` [${i.severity}] ${i.pkg} ${i.check}: ${i.message}`);\n if (diff.fixedIssues.length > 10) {lines.push(` ... ${diff.fixedIssues.length - 10} more`);}\n sections.push({ header: 'Fixed Issues', lines });\n }\n\n if (diff.persistingIssues.length > 0) {\n sections.push({ header: 'Persisting Issues', lines: [`${diff.persistingIssues.length} issues unchanged`] });\n }\n\n return sections;\n}\n","import type { RunSnapshot, CheckSnapshot, StatsSnapshot } from '@kb-labs/qa-contracts';\n\nexport function buildRunJsonReport(snap: RunSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n tasks: snap.tasks,\n ok: snap.raw.ok,\n elapsed: snap.raw.elapsed,\n summary: snap.raw.summary,\n results: snap.raw.results,\n };\n}\n\nexport function buildCheckJsonReport(snap: CheckSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n packages: snap.raw.packages,\n };\n}\n\nexport function buildStatsJsonReport(snap: StatsSnapshot): object {\n return {\n id: snap.id,\n timestamp: snap.timestamp,\n git: snap.git,\n durationMs: snap.durationMs,\n ok: snap.raw.ok,\n score: snap.raw.score,\n grade: snap.raw.grade,\n summary: snap.raw.summary,\n by_category: snap.raw.by_category,\n issues_by_type: snap.raw.issues_by_type,\n coverage: snap.raw.coverage,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/qa-core",
3
3
  "description": "Core business logic for KB Labs QA Plugin — runner, baseline, history, and reporting.",
4
- "version": "2.119.0-canary.f8394d5fd",
4
+ "version": "2.119.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -23,7 +23,7 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "@kb-labs/sdk": "2.115.4",
26
- "@kb-labs/qa-contracts": "2.119.0-canary.f8394d5fd"
26
+ "@kb-labs/qa-contracts": "2.119.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "^24.3.3",
@@ -32,10 +32,10 @@
32
32
  "tsup": "^8.5.0",
33
33
  "typescript": "^5.6.3",
34
34
  "vitest": "^3.2.6",
35
- "@kb-labs/devkit": "2.119.0-canary.f8394d5fd"
35
+ "@kb-labs/devkit": "2.119.0"
36
36
  },
37
37
  "engines": {
38
- "node": ">=22.0.0",
38
+ "node": ">=24.0.0",
39
39
  "pnpm": ">=9.0.0"
40
40
  },
41
41
  "sideEffects": false,