@kb-labs/qa-core 2.93.0 → 2.96.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.d.ts +72 -6
- package/dist/index.js +562 -1553
- package/dist/index.js.map +1 -1
- package/dist/report/index.d.ts +14 -45
- package/dist/report/index.js +180 -410
- package/dist/report/index.js.map +1 -1
- package/package.json +5 -16
- package/dist/baseline/index.d.ts +0 -27
- package/dist/baseline/index.js +0 -838
- package/dist/baseline/index.js.map +0 -1
- package/dist/categories/index.d.ts +0 -13
- package/dist/categories/index.js +0 -39
- package/dist/categories/index.js.map +0 -1
- package/dist/history/index.d.ts +0 -58
- package/dist/history/index.js +0 -361
- package/dist/history/index.js.map +0 -1
- package/dist/last-run-store-C1AkskWI.d.ts +0 -81
- package/dist/runner/index.d.ts +0 -43
- package/dist/runner/index.js +0 -789
- package/dist/runner/index.js.map +0 -1
package/dist/report/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/report/json-reporter.ts","../../src/report/text-reporter.ts","../../src/report/grouped-reporter.ts","../../src/report/error-grouping.ts"],"names":["label"],"mappings":"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","file":"index.js","sourcesContent":["import type { QAResults, QAReport, BaselineDiff, GroupedResults, QACheckConfig, ReportCheckFindings } from '@kb-labs/qa-contracts';\n\n/**\n * Build a structured JSON report from QA results.\n * Pass checks config to populate blockers/warnings with severity info.\n */\nexport function buildJsonReport(\n results: QAResults,\n diff?: BaselineDiff | null,\n checks?: QACheckConfig[],\n): QAReport {\n // Build severity map from check config (default: blocker)\n const severityMap: Record<string, 'blocker' | 'warning' | 'info'> = {};\n if (checks) {\n for (const c of checks) {\n severityMap[c.id] = c.severity ?? 'blocker';\n }\n }\n\n // Only non-info failures affect status\n const hasBlockerFailures = Object.entries(results).some(([ct, r]) => {\n const sev = severityMap[ct] ?? 'blocker';\n return sev !== 'info' && sev !== 'warning' && r.failed.length > 0;\n });\n\n const summary = {} as QAReport['summary'];\n const failures = {} as QAReport['failures'];\n const errors = {} as QAReport['errors'];\n const blockers: ReportCheckFindings[] = [];\n const warnings: ReportCheckFindings[] = [];\n\n for (const ct of Object.keys(results)) {\n const r = results[ct]!;\n const total = r.passed.length + r.failed.length + r.skipped.length;\n summary[ct] = {\n total,\n passed: r.passed.length,\n failed: r.failed.length,\n skipped: r.skipped.length,\n };\n failures[ct] = [...r.failed];\n errors[ct] = { ...r.errors };\n\n if (r.failed.length > 0) {\n const sev = severityMap[ct] ?? 'blocker';\n // Collect structured items from details, or synthesize from errors\n const items = r.failed.flatMap(target => {\n const detailItems = r.details?.[target];\n if (detailItems && detailItems.length > 0) { return detailItems; }\n const msg = r.errors[target];\n return msg ? [{ target, message: msg }] : [{ target, message: `check ${ct} failed` }];\n });\n\n if (sev === 'blocker') {\n blockers.push({ check: ct, items });\n } else if (sev === 'warning') {\n warnings.push({ check: ct, items });\n }\n // info: skip\n }\n }\n\n return {\n status: hasBlockerFailures ? 'failed' : 'passed',\n timestamp: new Date().toISOString(),\n summary,\n failures,\n errors,\n baseline: diff ?? null,\n blockers,\n warnings,\n };\n}\n\n/**\n * Build a detailed JSON report with grouped results.\n */\nexport function buildDetailedJsonReport(\n results: QAResults,\n grouped: GroupedResults,\n diff?: BaselineDiff | null,\n checks?: QACheckConfig[],\n): QAReport & { grouped: GroupedResults } {\n const base = buildJsonReport(results, diff, checks);\n return { ...base, grouped };\n}\n","import type { QAResults, BaselineDiff, HistoryEntry, TrendResult, RegressionResult, BaselineSnapshot, GroupedResults } from '@kb-labs/qa-contracts';\nimport { getCheckLabel, getCheckIcon } from '@kb-labs/qa-contracts';\n\nexport interface ReportSection {\n header: string;\n lines: string[];\n}\n\nfunction icon(ct: string): string {\n return getCheckIcon(ct);\n}\n\nfunction label(ct: string): string {\n return getCheckLabel(ct);\n}\n\n/**\n * Build text report for a QA run.\n * Returns structured sections — CLI layer adds ANSI colors.\n */\nfunction buildBaselineDiffLines(diff: BaselineDiff): string[] {\n const lines: string[] = [];\n for (const ct of Object.keys(diff)) {\n const d = diff[ct]!;\n if (d.newFailures.length > 0) {\n lines.push(`${icon(ct)} ${label(ct)}: +${d.newFailures.length} new failures`);\n for (const pkg of d.newFailures) { lines.push(` - ${pkg}`); }\n }\n if (d.fixed.length > 0) {\n lines.push(`${icon(ct)} ${label(ct)}: -${d.fixed.length} fixed`);\n }\n }\n return lines;\n}\n\nexport function buildRunReport(results: QAResults, diff?: BaselineDiff | null): ReportSection[] {\n const sections: ReportSection[] = [];\n\n const summaryLines: string[] = [];\n let totalPassed = 0;\n let totalFailed = 0;\n let totalSkipped = 0;\n for (const ct of Object.keys(results)) {\n const r = results[ct]!;\n const total = r.passed.length + r.failed.length + r.skipped.length;\n const pct = total > 0 ? Math.round((r.passed.length / total) * 100) : 100;\n const status = r.failed.length === 0 ? 'PASS' : 'FAIL';\n summaryLines.push(`${status} ${icon(ct)} ${label(ct).padEnd(12)} ${r.passed.length}/${total} passed (${pct}%)`);\n if (r.failed.length > 0) {\n for (const pkg of r.failed.slice(0, 5)) { summaryLines.push(` - ${pkg}`); }\n if (r.failed.length > 5) { summaryLines.push(` ... and ${r.failed.length - 5} more`); }\n }\n totalPassed += r.passed.length;\n totalFailed += r.failed.length;\n totalSkipped += r.skipped.length;\n }\n sections.push({ header: 'QA Summary Report', lines: summaryLines });\n\n if (diff) {\n const diffLines = buildBaselineDiffLines(diff);\n if (diffLines.length > 0) { sections.push({ header: 'Baseline Comparison', lines: diffLines }); }\n }\n\n sections.push({\n header: 'Totals',\n lines: [`Total: ${totalPassed} passed, ${totalFailed} failed, ${totalSkipped} skipped`],\n });\n\n return sections;\n}\n\n/**\n * Build history table for display.\n */\nexport function buildHistoryTable(history: HistoryEntry[], limit: number = 20): ReportSection[] {\n const entries = history.slice(-limit);\n const lines: string[] = [];\n\n for (const entry of entries) {\n const date = new Date(entry.timestamp).toLocaleDateString();\n const status = entry.status === 'passed' ? 'PASS' : 'FAIL';\n const summary = Object.keys(entry.summary).map((ct) => {\n const s = entry.summary[ct]!;\n return `${icon(ct)} ${s.failed}F`;\n }).join(' ');\n\n lines.push(`${date} ${entry.git.commit} ${status} ${summary} ${entry.git.message.slice(0, 40)}`);\n }\n\n return [{ header: `QA History (last ${entries.length})`, lines }];\n}\n\n/**\n * Build trends report.\n */\nexport function buildTrendsReport(trends: TrendResult[], history: HistoryEntry[]): ReportSection[] {\n if (trends.length === 0) {\n return [{ header: 'QA Trends', lines: ['Not enough history (need at least 2 entries)'] }];\n }\n\n const lines: string[] = [];\n for (const t of trends) {\n const arrow = t.delta > 0 ? `+${t.delta} (regression)` : t.delta < 0 ? `${t.delta} (improvement)` : '→ no change';\n lines.push(`${icon(t.checkType)} ${label(t.checkType).padEnd(12)} ${t.previous} → ${t.current} ${arrow}`);\n }\n\n if (history.length >= 2) {\n const first = history[Math.max(0, history.length - 10)]!;\n const last = history[history.length - 1]!;\n lines.push('');\n lines.push(`Period: ${new Date(first.timestamp).toLocaleDateString()} → ${new Date(last.timestamp).toLocaleDateString()}`);\n }\n\n return [{ header: 'QA Trends', lines }];\n}\n\n/**\n * Build regressions report.\n */\nexport function buildRegressionsReport(result: RegressionResult, history: HistoryEntry[]): ReportSection[] {\n if (history.length < 2) {\n return [{ header: 'Regression Detection', lines: ['Not enough history (need at least 2 entries)'] }];\n }\n\n const prev = history[history.length - 2]!;\n const curr = history[history.length - 1]!;\n const lines: string[] = [\n `Comparing: ${prev.git.commit} → ${curr.git.commit}`,\n '',\n ];\n\n if (!result.hasRegressions) {\n lines.push('No regressions detected.');\n return [{ header: 'Regression Detection', lines }];\n }\n\n for (const r of result.regressions) {\n lines.push(`${r.checkType}: +${r.newFailures.length} new failures`);\n for (const pkg of r.newFailures) {\n lines.push(` - ${pkg}`);\n }\n }\n\n lines.push('');\n lines.push('REGRESSIONS DETECTED!');\n\n return [{ header: 'Regression Detection', lines }];\n}\n\n/**\n * Build baseline status report.\n */\nexport function buildBaselineReport(baseline: BaselineSnapshot | null): ReportSection[] {\n if (!baseline) {\n return [{ header: 'Baseline Status', lines: ['No baseline captured yet. Run baseline:update first.'] }];\n }\n\n const lines: string[] = [\n `Captured: ${new Date(baseline.timestamp).toLocaleString()}`,\n `Git: ${baseline.git.commit} (${baseline.git.branch})`,\n '',\n ];\n\n for (const ct of Object.keys(baseline.results)) {\n const r = baseline.results[ct]!;\n lines.push(`${icon(ct)} ${label(ct).padEnd(12)} ${r.passed} passed, ${r.failed} failed`);\n if (r.failedPackages.length > 0) {\n const shown = r.failedPackages.slice(0, 3);\n for (const pkg of shown) {\n lines.push(` - ${pkg}`);\n }\n if (r.failedPackages.length > 3) {\n lines.push(` ... and ${r.failedPackages.length - 3} more`);\n }\n }\n }\n\n return [{ header: 'Baseline Status', lines }];\n}\n\n/**\n * Format a check status tag. Failed checks are UPPERCASED.\n */\nfunction checkTag(status: 'passed' | 'failed' | 'skipped', ct: string): string {\n const short = ct === 'typeCheck' ? 'types' : ct;\n if (status === 'failed') {return short.toUpperCase();}\n if (status === 'skipped') {return `-${short}-`;}\n return short;\n}\n\n/**\n * Build a detailed report grouped by category → repo → packages.\n */\ntype PackageEntry = GroupedResults['categories'][string]['repos'][string]['packages'][number];\n\nfunction getErrorPreview(raw: string): string {\n const errLines = raw.split('\\n').filter((l) => l.trim().length > 0);\n for (const el of errLines) {\n const cleaned = el.replace(/^Command failed: .*/, '').trim();\n if (cleaned.length > 0) {\n return cleaned.replace(/\\/[^\\s]*\\/kb-labs\\//g, '').slice(0, 100);\n }\n }\n return '';\n}\n\nfunction renderPackageLines(pkg: PackageEntry, lines: string[]): void {\n const hasFail = Object.values(pkg.checks).some((v) => v === 'failed');\n const status = hasFail ? 'FAIL' : 'PASS';\n const tags = Object.keys(pkg.checks).map((ct) => checkTag(pkg.checks[ct]!, ct)).join(' ');\n lines.push(` ${status} ${pkg.name.padEnd(40)} ${tags}`);\n if (hasFail) {\n for (const ct of Object.keys(pkg.checks)) {\n if (pkg.checks[ct] === 'failed') {\n const preview = getErrorPreview((pkg.errors[ct] ?? '').trim());\n lines.push(` ${ct}: ${preview || 'failed'}`);\n }\n }\n }\n}\n\nfunction renderCategoryLines(catKey: string, grouped: GroupedResults): string[] {\n const cat = grouped.categories[catKey]!;\n const lines: string[] = [`PASS ${cat.summary.passed} | FAIL ${cat.summary.failed}`, ''];\n\n for (const repoKey of Object.keys(cat.repos).sort()) {\n const repo = cat.repos[repoKey]!;\n lines.push(` ${repoKey} (${repo.summary.total} packages)`);\n\n const sorted = [...repo.packages].sort((a, b) => {\n const aFail = Object.values(a.checks).some((v) => v === 'failed') ? 0 : 1;\n const bFail = Object.values(b.checks).some((v) => v === 'failed') ? 0 : 1;\n if (aFail !== bFail) { return aFail - bFail; }\n return a.name.localeCompare(b.name);\n });\n\n for (const pkg of sorted) { renderPackageLines(pkg, lines); }\n lines.push('');\n }\n return lines;\n}\n\nexport function buildDetailedRunReport(grouped: GroupedResults, diff?: BaselineDiff | null): ReportSection[] {\n const sections: ReportSection[] = [];\n\n const categoryKeys = Object.keys(grouped.categories).sort((a, b) => {\n if (a === 'uncategorized') { return 1; }\n if (b === 'uncategorized') { return -1; }\n return a.localeCompare(b);\n });\n\n for (const catKey of categoryKeys) {\n const cat = grouped.categories[catKey]!;\n sections.push({ header: `${cat.label} (${cat.summary.total} packages)`, lines: renderCategoryLines(catKey, grouped) });\n }\n\n if (diff) {\n const diffLines = buildBaselineDiffLines(diff);\n if (diffLines.length > 0) { sections.push({ header: 'Baseline Comparison', lines: diffLines }); }\n }\n\n let totalPassed = 0;\n let totalFailed = 0;\n for (const catKey of categoryKeys) {\n totalPassed += grouped.categories[catKey]!.summary.passed;\n totalFailed += grouped.categories[catKey]!.summary.failed;\n }\n sections.push({\n header: 'Totals',\n lines: [`Total: ${totalPassed} passed, ${totalFailed} failed (${categoryKeys.length} categories)`],\n });\n\n return sections;\n}\n","import type {\n QAResults,\n WorkspacePackage,\n QAPluginConfig,\n PackageStatus,\n GroupedResults,\n GroupSummary,\n} from '@kb-labs/qa-contracts';\n\nfunction emptyGroupSummary(checkTypes: string[]): GroupSummary {\n const checks = {} as GroupSummary['checks'];\n for (const ct of checkTypes) {\n checks[ct] = { passed: 0, failed: 0, skipped: 0 };\n }\n return { total: 0, passed: 0, failed: 0, checks };\n}\n\nfunction resolveCheckStatus(\n pkgName: string,\n ct: string,\n results: QAResults,\n): 'passed' | 'failed' | 'skipped' {\n const r = results[ct];\n if (!r) {return 'skipped';}\n if (r.failed.includes(pkgName)) {return 'failed';}\n if (r.passed.includes(pkgName)) {return 'passed';}\n return 'skipped';\n}\n\n/**\n * Build per-package status from QA results.\n */\nfunction buildPackageStatus(\n pkg: WorkspacePackage,\n results: QAResults,\n category: string,\n): PackageStatus {\n const checks = {} as PackageStatus['checks'];\n const errors: Record<string, string> = {};\n\n for (const ct of Object.keys(results)) {\n checks[ct] = resolveCheckStatus(pkg.name, ct, results);\n if (checks[ct] === 'failed' && results[ct]?.errors[pkg.name]) {\n errors[ct] = results[ct]!.errors[pkg.name]!;\n }\n }\n\n return {\n name: pkg.name,\n repo: pkg.repo,\n category,\n checks,\n errors,\n };\n}\n\n/**\n * Add a PackageStatus to a GroupSummary.\n */\nfunction addToSummary(summary: GroupSummary, status: PackageStatus): void {\n summary.total++;\n\n const hasFail = Object.values(status.checks).some((v) => v === 'failed');\n if (hasFail) {\n summary.failed++;\n } else {\n summary.passed++;\n }\n\n for (const ct of Object.keys(status.checks)) {\n const s = status.checks[ct];\n if (!summary.checks[ct]) {\n summary.checks[ct] = { passed: 0, failed: 0, skipped: 0 };\n }\n if (s === 'passed') {summary.checks[ct].passed++;}\n else if (s === 'failed') {summary.checks[ct].failed++;}\n else {summary.checks[ct].skipped++;}\n }\n}\n\n/**\n * Group QA results by category → repo → packages.\n *\n * A package can appear in multiple categories if its repo is listed\n * in multiple category configs (e.g., kb-labs-cli in both \"core\" and \"hosts\").\n */\nexport function groupResults(\n results: QAResults,\n packages: WorkspacePackage[],\n categoryMap: Map<string, string[]>,\n config?: QAPluginConfig,\n): GroupedResults {\n const checkTypes = Object.keys(results);\n const grouped: GroupedResults = { categories: {} };\n\n for (const pkg of packages) {\n const categoryKeys = categoryMap.get(pkg.name) ?? ['uncategorized'];\n\n for (const categoryKey of categoryKeys) {\n const status = buildPackageStatus(pkg, results, categoryKey);\n\n // Ensure category exists\n if (!grouped.categories[categoryKey]) {\n const label =\n categoryKey === 'uncategorized'\n ? 'Uncategorized'\n : config?.categories?.[categoryKey]?.label ?? categoryKey;\n\n grouped.categories[categoryKey] = {\n label,\n repos: {},\n summary: emptyGroupSummary(checkTypes),\n };\n }\n\n const categoryGroup = grouped.categories[categoryKey]!;\n\n // Ensure repo exists within category\n if (!categoryGroup.repos[pkg.repo]) {\n categoryGroup.repos[pkg.repo] = {\n packages: [],\n summary: emptyGroupSummary(checkTypes),\n };\n }\n\n const repoGroup = categoryGroup.repos[pkg.repo]!;\n\n repoGroup.packages.push(status);\n addToSummary(repoGroup.summary, status);\n addToSummary(categoryGroup.summary, status);\n }\n }\n\n return grouped;\n}\n","import type { QAResults } from '@kb-labs/qa-contracts';\nimport type { ErrorGroup, QAErrorGroupsResponse } from '@kb-labs/qa-contracts';\n\n/**\n * Extract an error pattern from raw error text.\n * Tries to identify ESLint rules, TS error codes, or common patterns.\n */\nfunction extractPattern(errorText: string, checkType: string): string {\n if (checkType === 'lint') {\n // ESLint: look for rule names like \"@typescript-eslint/no-explicit-any\"\n const ruleMatch = errorText.match(/(\\S+\\/[\\w-]+|no-[\\w-]+)/);\n if (ruleMatch?.[1]) {return ruleMatch[1];}\n }\n\n if (checkType === 'typeCheck') {\n // TypeScript: look for error codes like \"TS2345\" or \"error TS2345\"\n const tsMatch = errorText.match(/TS(\\d{4,5})/);\n if (tsMatch) {return `TS${tsMatch[1]}`;}\n }\n\n if (checkType === 'test') {\n // Test failures: look for \"FAIL\" + test file pattern\n const failMatch = errorText.match(/FAIL\\s+(\\S+)/);\n if (failMatch) {return `FAIL: ${failMatch[1]}`;}\n }\n\n if (checkType === 'build') {\n // Build: \"Module not found\", \"Cannot find module\"\n if (errorText.includes('Cannot find module')) {return 'Cannot find module';}\n if (errorText.includes('Module not found')) {return 'Module not found';}\n }\n\n // Fallback: first meaningful line (skip empty lines, trim)\n const firstLine = errorText.split('\\n').find((l) => l.trim().length > 0)?.trim() ?? '';\n return firstLine.slice(0, 100) || 'Unknown error';\n}\n\n/**\n * Group errors from QA results by error pattern.\n * Packages with the same error pattern (e.g., same ESLint rule) are grouped together.\n */\nexport function groupErrors(results: QAResults): QAErrorGroupsResponse {\n const groupMap = new Map<string, ErrorGroup>();\n let ungrouped = 0;\n\n for (const ct of Object.keys(results)) {\n const check = results[ct]!;\n if (!check.errors) {continue;}\n\n for (const [pkgName, errorText] of Object.entries(check.errors)) {\n const pattern = extractPattern(errorText, ct);\n const key = `${ct}::${pattern}`;\n\n const existing = groupMap.get(key);\n if (existing) {\n existing.count++;\n existing.packages.push(pkgName);\n } else {\n groupMap.set(key, {\n pattern,\n count: 1,\n packages: [pkgName],\n checkType: ct,\n example: errorText.slice(0, 200),\n });\n }\n }\n }\n\n // Groups with count=1 are \"ungrouped\" (unique errors)\n const groups: ErrorGroup[] = [];\n for (const group of groupMap.values()) {\n if (group.count === 1) {\n ungrouped++;\n } else {\n groups.push(group);\n }\n }\n\n // Sort by count descending\n groups.sort((a, b) => b.count - a.count);\n\n return { groups, ungrouped };\n}\n"]}
|
|
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"]}
|
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.
|
|
4
|
+
"version": "2.96.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -10,18 +10,6 @@
|
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
},
|
|
13
|
-
"./runner": {
|
|
14
|
-
"types": "./dist/runner/index.d.ts",
|
|
15
|
-
"import": "./dist/runner/index.js"
|
|
16
|
-
},
|
|
17
|
-
"./baseline": {
|
|
18
|
-
"types": "./dist/baseline/index.d.ts",
|
|
19
|
-
"import": "./dist/baseline/index.js"
|
|
20
|
-
},
|
|
21
|
-
"./history": {
|
|
22
|
-
"types": "./dist/history/index.d.ts",
|
|
23
|
-
"import": "./dist/history/index.js"
|
|
24
|
-
},
|
|
25
13
|
"./report": {
|
|
26
14
|
"types": "./dist/report/index.d.ts",
|
|
27
15
|
"import": "./dist/report/index.js"
|
|
@@ -34,7 +22,8 @@
|
|
|
34
22
|
"LICENSE"
|
|
35
23
|
],
|
|
36
24
|
"dependencies": {
|
|
37
|
-
"@kb-labs/
|
|
25
|
+
"@kb-labs/sdk": "2.21.2",
|
|
26
|
+
"@kb-labs/qa-contracts": "2.96.0"
|
|
38
27
|
},
|
|
39
28
|
"devDependencies": {
|
|
40
29
|
"@types/node": "^24.3.3",
|
|
@@ -42,8 +31,8 @@
|
|
|
42
31
|
"rimraf": "^6.0.1",
|
|
43
32
|
"tsup": "^8.5.0",
|
|
44
33
|
"typescript": "^5.6.3",
|
|
45
|
-
"vitest": "^3.2.
|
|
46
|
-
"@kb-labs/devkit": "2.
|
|
34
|
+
"vitest": "^3.2.6",
|
|
35
|
+
"@kb-labs/devkit": "2.96.0"
|
|
47
36
|
},
|
|
48
37
|
"engines": {
|
|
49
38
|
"node": ">=20.0.0",
|
package/dist/baseline/index.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { BaselineSnapshot, QAResults, BaselineDiff } from '@kb-labs/qa-contracts';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Load baseline snapshot from disk.
|
|
5
|
-
*/
|
|
6
|
-
declare function loadBaseline(rootDir: string): BaselineSnapshot | null;
|
|
7
|
-
/**
|
|
8
|
-
* Save baseline snapshot to disk.
|
|
9
|
-
*/
|
|
10
|
-
declare function saveBaseline(rootDir: string, snapshot: BaselineSnapshot): void;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create a baseline snapshot from QA results.
|
|
14
|
-
*/
|
|
15
|
-
declare function createBaselineFromResults(results: QAResults, rootDir: string): BaselineSnapshot;
|
|
16
|
-
/**
|
|
17
|
-
* Run full QA and capture baseline.
|
|
18
|
-
*/
|
|
19
|
-
declare function captureBaseline(rootDir: string): Promise<BaselineSnapshot>;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Compare current QA results with a baseline snapshot.
|
|
23
|
-
* Returns per-check-type diff with newFailures, fixed, stillFailing, delta.
|
|
24
|
-
*/
|
|
25
|
-
declare function compareWithBaseline(results: QAResults, baseline: BaselineSnapshot): BaselineDiff;
|
|
26
|
-
|
|
27
|
-
export { captureBaseline, compareWithBaseline, createBaselineFromResults, loadBaseline, saveBaseline };
|