@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/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runner/submodule-info.ts","../src/runner/workspace.ts","../src/runner/build-order.ts","../src/runner/custom-check-runner.ts","../src/runner/cache.ts","../src/runner/build-runner.ts","../src/runner/lint-runner.ts","../src/runner/type-runner.ts","../src/runner/test-runner.ts","../src/runner/last-run-store.ts","../src/runner/qa-orchestrator.ts","../src/baseline/baseline-store.ts","../src/baseline/baseline-updater.ts","../src/baseline/baseline-comparator.ts","../src/history/trend-store.ts","../src/history/history-store.ts","../src/history/trend-analyzer.ts","../src/history/regression-detector.ts","../src/history/package-timeline.ts","../src/report/json-reporter.ts","../src/report/text-reporter.ts","../src/report/grouped-reporter.ts","../src/report/error-grouping.ts","../src/categories/category-resolver.ts"],"names":["existsSync","join","readFileSync","execSync","readdirSync","statSync","PATHS","dirname","mkdirSync","writeFileSync","HISTORY_MAX_ENTRIES","delta","getCheckIcon","getCheckLabel","label","matchesPattern"],"mappings":"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","file":"index.js","sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SubmoduleInfo } from '@kb-labs/qa-contracts';\n\n/**\n * Get git submodule info for a repo directory.\n * Returns null if the directory is not a git repo.\n */\nexport function getSubmoduleInfo(repoDir: string, repoName: string): SubmoduleInfo | null {\n const gitDir = join(repoDir, '.git');\n if (!existsSync(gitDir)) {return null;}\n\n try {\n const commit = execSync('git rev-parse --short HEAD', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const message = execSync('git log -1 --format=%s', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n const statusOutput = execSync('git status --porcelain', {\n cwd: repoDir,\n encoding: 'utf-8',\n timeout: 5000,\n stdio: ['pipe', 'pipe', 'pipe'],\n }).trim();\n\n return {\n name: repoName,\n commit,\n branch,\n dirty: statusOutput.length > 0,\n message,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Collect submodule info for all unique repos from a list of packages.\n * Caches by repo name to avoid redundant git calls.\n */\nexport function collectSubmoduleInfo(\n rootDir: string,\n repos: string[],\n): Record<string, SubmoduleInfo> {\n const result: Record<string, SubmoduleInfo> = {};\n\n for (const repo of repos) {\n const repoDir = join(rootDir, repo);\n const info = getSubmoduleInfo(repoDir, repo);\n if (info) {\n result[repo] = info;\n }\n }\n\n return result;\n}\n","import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { WorkspacePackage, PackageFilter, SubmoduleInfo } from '@kb-labs/qa-contracts';\nimport type { PackagesConfig } from '@kb-labs/qa-contracts';\nimport { getSubmoduleInfo } from './submodule-info.js';\n\nfunction hasWorkspace(dir: string): boolean {\n return existsSync(join(dir, 'pnpm-workspace.yaml'));\n}\n\nfunction isDir(p: string): boolean {\n return existsSync(p) && statSync(p).isDirectory();\n}\n\nfunction buildCandidatesFromConfig(rootDir: string, paths: string[]): string[] {\n const candidates: string[] = [];\n for (const pattern of paths) {\n const parts = pattern.split('/');\n if (parts.length === 2 && parts[1] === '*' && parts[0]) {\n const categoryDir = join(rootDir, parts[0]);\n if (!isDir(categoryDir)) { continue; }\n try {\n for (const sub of readdirSync(categoryDir)) {\n if (sub.startsWith('.') || sub === 'node_modules') { continue; }\n const subPath = join(categoryDir, sub);\n if (isDir(subPath) && hasWorkspace(subPath)) { candidates.push(subPath); }\n }\n } catch { /* skip unreadable dirs */ }\n } else {\n const exactPath = join(rootDir, pattern);\n if (isDir(exactPath) && hasWorkspace(exactPath)) { candidates.push(exactPath); }\n }\n }\n return candidates;\n}\n\nfunction buildCandidatesAutoScan(rootDir: string): string[] {\n const candidates: string[] = [];\n for (const entry of readdirSync(rootDir)) {\n if (entry.startsWith('.') || entry === 'node_modules' || entry === 'dist') { continue; }\n const entryPath = join(rootDir, entry);\n if (!isDir(entryPath)) { continue; }\n if (hasWorkspace(entryPath)) {\n candidates.push(entryPath);\n } else {\n try {\n for (const sub of readdirSync(entryPath)) {\n if (sub.startsWith('.') || sub === 'node_modules') { continue; }\n const subPath = join(entryPath, sub);\n if (isDir(subPath) && hasWorkspace(subPath)) { candidates.push(subPath); }\n }\n } catch { /* skip unreadable dirs */ }\n }\n }\n return candidates;\n}\n\nfunction scanSubDir(\n parentDir: string,\n entryPath: string,\n repoName: string,\n rootDir: string,\n submodule: SubmoduleInfo | undefined,\n packages: WorkspacePackage[],\n): void {\n if (!isDir(parentDir)) { return; }\n for (const pkgDir of readdirSync(parentDir)) {\n const pkgPath = join(parentDir, pkgDir);\n const pkgJsonPath = join(pkgPath, 'package.json');\n if (!existsSync(pkgJsonPath)) { continue; }\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n packages.push({\n name: pkgJson.name || pkgDir,\n dir: pkgPath,\n relativePath: relative(rootDir, pkgPath),\n repo: repoName,\n submodule,\n });\n } catch { /* skip invalid package.json */ }\n }\n}\n\n/**\n * Discover all workspace packages in the monorepo.\n *\n * If packagesConfig.paths is set, use those glob-expanded paths to find sub-monorepos.\n * Otherwise fall back to auto-scan (supports both flat and nested layouts).\n */\nexport function getWorkspacePackages(\n rootDir: string,\n filter?: PackageFilter,\n packagesConfig?: PackagesConfig,\n): WorkspacePackage[] {\n const packages: WorkspacePackage[] = [];\n const submoduleCache = new Map<string, SubmoduleInfo | null>();\n\n function getSubmoduleCached(entryPath: string, repoName: string): SubmoduleInfo | undefined {\n if (!submoduleCache.has(repoName)) {\n submoduleCache.set(repoName, getSubmoduleInfo(entryPath, repoName));\n }\n return submoduleCache.get(repoName) ?? undefined;\n }\n\n const candidates =\n packagesConfig?.paths && packagesConfig.paths.length > 0\n ? buildCandidatesFromConfig(rootDir, packagesConfig.paths)\n : buildCandidatesAutoScan(rootDir);\n\n for (const entryPath of candidates) {\n const repoName = relative(rootDir, entryPath);\n const submodule = getSubmoduleCached(entryPath, repoName);\n scanSubDir(join(entryPath, 'packages'), entryPath, repoName, rootDir, submodule, packages);\n scanSubDir(join(entryPath, 'apps'), entryPath, repoName, rootDir, submodule, packages);\n }\n\n let filtered = packages;\n if (packagesConfig?.include && packagesConfig.include.length > 0) {\n filtered = filtered.filter(pkg =>\n packagesConfig.include!.some(pattern => matchesPattern(pkg.name, pkg.repo, pattern))\n );\n }\n if (packagesConfig?.exclude && packagesConfig.exclude.length > 0) {\n filtered = filtered.filter(pkg =>\n !packagesConfig.exclude!.some(pattern => matchesPattern(pkg.name, pkg.repo, pattern))\n );\n }\n\n if (!filter) { return filtered; }\n\n return filtered.filter((pkg) => {\n if (filter.package && !pkg.name.includes(filter.package)) { return false; }\n if (filter.repo && pkg.repo !== filter.repo) { return false; }\n if (filter.scope) {\n const scope = filter.scope.startsWith('@') ? filter.scope : `@${filter.scope}`;\n if (!pkg.name.startsWith(scope)) { return false; }\n }\n return true;\n });\n}\n\n/**\n * Match a package against a pattern.\n * Supports: exact name, \"@kb-labs/core-*\" glob, \"kb-labs-cli/*\" repo prefix.\n */\nfunction matchesPattern(name: string, repo: string, pattern: string): boolean {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n return repo === prefix || repo.startsWith(prefix + '/');\n }\n if (pattern.endsWith('*')) {\n return name.startsWith(pattern.slice(0, -1));\n }\n return name === pattern || repo === pattern;\n}\n","/**\n * Topological sort for workspace packages (Kahn's algorithm).\n * Computes build layers from package.json dependencies.\n * No external dependencies — standalone implementation.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { WorkspacePackage } from '@kb-labs/qa-contracts';\n\nexport interface BuildLayer {\n index: number;\n packages: WorkspacePackage[];\n}\n\n/**\n * Read workspace-internal dependencies from a package.json.\n * Returns only dependency names that exist in the workspace package set.\n */\nfunction readWorkspaceDeps(pkgDir: string, workspaceNames: Set<string>): string[] {\n try {\n const raw = readFileSync(join(pkgDir, 'package.json'), 'utf-8');\n const pkgJson = JSON.parse(raw);\n const allDeps = { ...pkgJson.dependencies, ...pkgJson.devDependencies };\n return Object.keys(allDeps).filter(dep => workspaceNames.has(dep));\n } catch {\n return [];\n }\n}\n\n/**\n * Compute build layers via topological sort (Kahn's algorithm).\n *\n * Layer 0 = packages with no workspace dependencies (can build first).\n * Layer N = packages whose deps are all in layers 0..N-1.\n *\n * Circular dependencies are appended as the last layer with a warning.\n */\ninterface DepGraph {\n nameMap: Map<string, WorkspacePackage>;\n inDegree: Map<string, number>;\n dependents: Map<string, string[]>;\n}\n\nfunction buildDepGraph(packages: WorkspacePackage[]): DepGraph {\n const nameMap = new Map<string, WorkspacePackage>();\n const workspaceNames = new Set<string>();\n for (const pkg of packages) {\n nameMap.set(pkg.name, pkg);\n workspaceNames.add(pkg.name);\n }\n\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const pkg of packages) {\n inDegree.set(pkg.name, 0);\n dependents.set(pkg.name, []);\n }\n for (const pkg of packages) {\n const deps = readWorkspaceDeps(pkg.dir, workspaceNames);\n inDegree.set(pkg.name, deps.length);\n for (const dep of deps) {\n dependents.get(dep)!.push(pkg.name);\n }\n }\n return { nameMap, inDegree, dependents };\n}\n\nexport function computeBuildLayers(packages: WorkspacePackage[]): BuildLayer[] {\n if (packages.length === 0) { return []; }\n\n const { nameMap, inDegree, dependents } = buildDepGraph(packages);\n const layers: BuildLayer[] = [];\n const remaining = new Set(packages.map(p => p.name));\n\n while (remaining.size > 0) {\n const layerNames: string[] = [];\n for (const name of remaining) {\n if ((inDegree.get(name) ?? 0) === 0) { layerNames.push(name); }\n }\n\n if (layerNames.length === 0) {\n const circular = [...remaining].map(n => nameMap.get(n)!).filter(Boolean);\n layers.push({ index: layers.length, packages: circular });\n break;\n }\n\n layerNames.sort();\n layers.push({ index: layers.length, packages: layerNames.map(n => nameMap.get(n)!) });\n\n for (const name of layerNames) {\n remaining.delete(name);\n for (const dependent of (dependents.get(name) ?? [])) {\n inDegree.set(dependent, (inDegree.get(dependent) ?? 0) - 1);\n }\n }\n }\n\n return layers;\n}\n\n/**\n * Sort packages in dependency order (topological sort).\n * Packages with no deps come first, dependents come after their deps.\n */\nexport function sortByBuildLayers(packages: WorkspacePackage[]): WorkspacePackage[] {\n return computeBuildLayers(packages).flatMap(l => l.packages);\n}\n","import { spawnSync, execSync } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport type { QACheckConfig, QAResults, WorkspacePackage, CheckItem } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ntype Bucket = { passed: string[]; failed: string[]; skipped: string[]; errors: Record<string, string>; details: Record<string, CheckItem[]> };\ntype ProgressFn = (checkId: string, pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n\nconst ID_MAP: Record<string, string> = {\n build: 'build', lint: 'lint',\n typecheck: 'typeCheck', 'type-check': 'typeCheck',\n test: 'test', tests: 'test',\n};\n\nfunction emptyResult(): Bucket {\n return { passed: [], failed: [], skipped: [], errors: {}, details: {} };\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n timeoutMs: number,\n extraEnv?: Record<string, string>,\n): { ok: boolean; stdout: string; stderr: string; exitCode: number } {\n try {\n const env = extraEnv ? { ...process.env, ...extraEnv } : undefined;\n const result = spawnSync(command, args, { cwd, timeout: timeoutMs, encoding: 'utf-8', shell: false, env });\n const stdout = result.stdout ?? '';\n const stderr = result.stderr ?? '';\n const exitCode = result.status ?? 1;\n return { ok: exitCode === 0, stdout, stderr, exitCode };\n } catch (e: unknown) {\n return { ok: false, stdout: '', stderr: e instanceof Error ? e.message : String(e), exitCode: 1 };\n }\n}\n\nfunction parseTypedOutput(stdout: string): { ok: boolean; items: CheckItem[] } | null {\n try {\n const parsed = JSON.parse(stdout);\n if (typeof parsed === 'object' && parsed !== null && 'ok' in parsed) {\n return {\n ok: parsed.ok === true,\n items: Array.isArray(parsed.items) ? parsed.items : [],\n };\n }\n } catch {\n // not JSON\n }\n return null;\n}\n\nfunction evaluate(check: QACheckConfig, stdout: string, stderr: string, exitCode: number): boolean {\n if ((check.parser ?? 'exitcode') === 'json') {\n const typed = parseTypedOutput(stdout);\n if (typed !== null) { return typed.ok; }\n // fallback: legacy json format\n try {\n const parsed = JSON.parse(stdout);\n return parsed.ok === true || parsed.success === true || parsed.status === 'ok';\n } catch {\n return false;\n }\n }\n return exitCode === 0;\n}\n\nfunction recordResult(\n bucket: Bucket, key: string, passed: boolean,\n stdout: string, stderr: string, exitCode: number,\n check: QACheckConfig, canonicalId: string,\n onProgress: ProgressFn | undefined, durationMs: number,\n): void {\n if (passed) {\n bucket.passed.push(key);\n onProgress?.(canonicalId, key, 'pass', durationMs);\n } else {\n bucket.failed.push(key);\n bucket.errors[key] = stderr || stdout || `Exit code ${exitCode}`;\n // Capture structured items for json parser\n if ((check.parser ?? 'exitcode') === 'json') {\n const typed = parseTypedOutput(stdout);\n if (typed && typed.items.length > 0) {\n bucket.details[key] = typed.items;\n }\n }\n onProgress?.(canonicalId, key, 'fail', durationMs);\n }\n}\n\n/**\n * Get the set of package relative paths touched by the current branch diff.\n * diffFilter: '' = all changed, 'A' = only added files.\n */\nfunction getDiffPackageDirs(rootDir: string, base: string, diffFilter: string): Set<string> {\n try {\n const filter = diffFilter ? `--diff-filter=${diffFilter}` : '';\n const args = ['diff', filter, `${base}...HEAD`, '--name-only'].filter(Boolean);\n const output = execSync(`git ${args.join(' ')}`, { cwd: rootDir, encoding: 'utf-8' }).trim();\n if (!output) { return new Set(); }\n return new Set(output.split('\\n').map(f => f.split('/')[0]).filter((s): s is string => Boolean(s)));\n } catch {\n return new Set();\n }\n}\n\nfunction filterPackagesByDiff(packages: WorkspacePackage[], rootDir: string, diffFilter: string, base: string): WorkspacePackage[] {\n const touchedDirs = getDiffPackageDirs(rootDir, base, diffFilter);\n if (touchedDirs.size === 0) { return []; }\n return packages.filter(pkg => {\n const relParts = pkg.relativePath.split('/');\n // Match if any path segment prefix matches touched top-level dirs\n return relParts.some((_, i) => touchedDirs.has(relParts.slice(0, i + 1).join('/')));\n });\n}\n\nfunction runInRepoRoot(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n diffBase?: string,\n): void {\n const startMs = Date.now();\n const env = diffBase ? { KB_QA_BASE: diffBase } : undefined;\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, rootDir, check.timeoutMs ?? 120_000, env);\n recordResult(bucket, rootDir, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);\n}\n\nfunction runInScopePath(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n packages: WorkspacePackage[], rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n diffBase?: string,\n): void {\n const seen = new Set<string>();\n const env = diffBase ? { KB_QA_BASE: diffBase } : undefined;\n for (const pkg of packages) {\n if (seen.has(pkg.repo)) { continue; }\n seen.add(pkg.repo);\n const scopeDir = resolve(rootDir, pkg.repo);\n if (!existsSync(scopeDir)) { continue; }\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, scopeDir, check.timeoutMs ?? 120_000, env);\n recordResult(bucket, pkg.repo, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nfunction getPnpmScriptName(check: QACheckConfig): string | undefined {\n if (check.command !== 'pnpm') { return undefined; }\n const args = check.args ?? [];\n if (args[0] === 'run' && args[1]) { return args[1]; }\n return undefined;\n}\n\nfunction hasNpmScript(pkgDir: string, scriptName: string): boolean {\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf-8'));\n return typeof pkgJson?.scripts?.[scriptName] === 'string';\n } catch {\n return false;\n }\n}\n\nfunction runPerPackage(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n packages: WorkspacePackage[], bucket: Bucket, onProgress: ProgressFn | undefined,\n diffBase?: string,\n): void {\n const sortedPackages = check.ordered ? sortByBuildLayers(packages) : packages;\n const scriptName = getPnpmScriptName(check);\n const env = diffBase ? { KB_QA_BASE: diffBase } : undefined;\n\n for (const pkg of sortedPackages) {\n if (scriptName && !hasNpmScript(pkg.dir, scriptName)) {\n bucket.skipped.push(pkg.name);\n onProgress?.(canonicalId, pkg.name, 'skip');\n continue;\n }\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, pkg.dir, check.timeoutMs ?? 120_000, env);\n recordResult(bucket, pkg.name, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, check, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nexport function runCustomChecks(\n checks: QACheckConfig[],\n packages: WorkspacePackage[],\n rootDir: string,\n onProgress?: ProgressFn,\n diffBase?: string,\n): QAResults {\n const results: QAResults = {};\n\n for (const check of checks) {\n const canonicalId = ID_MAP[check.id.toLowerCase()] ?? check.id;\n if (!results[canonicalId]) { results[canonicalId] = emptyResult(); }\n const bucket = results[canonicalId]! as Bucket;\n\n const args = check.args ?? [];\n const resolvedArgs = args.map(arg =>\n (arg.match(/\\.(sh|js|ts|mjs|cjs)$/) && !arg.startsWith('/')) ? join(rootDir, arg) : arg\n );\n\n const runIn = check.runIn ?? 'perPackage';\n\n if (runIn === 'repoRoot') {\n runInRepoRoot(check, canonicalId, resolvedArgs, rootDir, bucket, onProgress, diffBase);\n } else if (runIn === 'scopePath') {\n runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress, diffBase);\n } else if (runIn === 'diffOnly' || runIn === 'newFiles') {\n const base = diffBase ?? 'main';\n const diffFilter = runIn === 'newFiles' ? 'A' : '';\n const filteredPackages = filterPackagesByDiff(packages, rootDir, diffFilter, base);\n if (filteredPackages.length === 0) {\n // No affected packages — skip entirely, not a failure\n bucket.skipped.push(...packages.map(p => p.name));\n for (const pkg of packages) { onProgress?.(canonicalId, pkg.name, 'skip'); }\n } else {\n // Packages not touched by diff → skip them\n const filteredNames = new Set(filteredPackages.map(p => p.name));\n for (const pkg of packages) {\n if (!filteredNames.has(pkg.name)) {\n bucket.skipped.push(pkg.name);\n onProgress?.(canonicalId, pkg.name, 'skip');\n }\n }\n runPerPackage(check, canonicalId, resolvedArgs, filteredPackages, bucket, onProgress, base);\n }\n } else {\n runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress);\n }\n\n // Promote details to CheckResult if any items were captured\n if (Object.keys(bucket.details).length > 0) {\n results[canonicalId]!.details = bucket.details;\n }\n }\n\n return results;\n}\n","import { createHash } from 'node:crypto';\nimport { readFileSync, writeFileSync, existsSync, readdirSync, statSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\n\ninterface CacheEntry {\n hash: string;\n timestamp: string;\n}\n\nexport type PackageCache = Record<string, CacheEntry>;\n\n/**\n * Load package hash cache from disk.\n */\nexport function loadCache(rootDir: string): PackageCache {\n const cachePath = join(rootDir, PATHS.CACHE);\n if (!existsSync(cachePath)) {return {};}\n try {\n return JSON.parse(readFileSync(cachePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\n/**\n * Save package hash cache to disk.\n */\nexport function saveCache(rootDir: string, cache: PackageCache): void {\n const cachePath = join(rootDir, PATHS.CACHE);\n const dir = dirname(cachePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(cachePath, JSON.stringify(cache, null, 2));\n}\n\n/**\n * Compute SHA256 hash for a package based on its source files and package.json.\n */\nexport function computePackageHash(pkgDir: string): string {\n const hash = createHash('sha256');\n\n // Hash package.json\n const pkgJsonPath = join(pkgDir, 'package.json');\n if (existsSync(pkgJsonPath)) {\n hash.update(readFileSync(pkgJsonPath));\n }\n\n // Hash all files in src/\n const srcDir = join(pkgDir, 'src');\n if (existsSync(srcDir)) {\n hashDirectory(srcDir, hash);\n }\n\n return hash.digest('hex');\n}\n\nfunction hashDirectory(dir: string, hash: ReturnType<typeof createHash>): void {\n const entries = readdirSync(dir).sort();\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n hashDirectory(fullPath, hash);\n } else if (stat.isFile()) {\n hash.update(fullPath);\n hash.update(readFileSync(fullPath));\n }\n }\n}\n\n/**\n * Check if a package has changed since last cached hash.\n */\nexport function hasPackageChanged(pkgDir: string, pkgName: string, cache: PackageCache): boolean {\n const currentHash = computePackageHash(pkgDir);\n const cached = cache[pkgName];\n if (!cached) {return true;}\n return cached.hash !== currentHash;\n}\n\n/**\n * Update cache entry for a package.\n */\nexport function updateCacheEntry(pkgDir: string, pkgName: string, cache: PackageCache): PackageCache {\n const hash = computePackageHash(pkgDir);\n return {\n ...cache,\n [pkgName]: { hash, timestamp: new Date().toISOString() },\n };\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, statSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ninterface BuildRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n noCache?: boolean;\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Check if a package needs rebuilding by comparing src/ mtime vs dist/ mtime.\n */\nfunction needsRebuild(pkgDir: string): boolean {\n const srcDir = join(pkgDir, 'src');\n const distDir = join(pkgDir, 'dist');\n\n if (!existsSync(distDir)) {return true;}\n if (!existsSync(srcDir)) {return false;}\n\n const srcMtime = getLatestMtime(srcDir);\n const distMtime = getLatestMtime(distDir);\n\n return srcMtime > distMtime;\n}\n\nfunction getLatestMtime(dir: string): number {\n let latest = 0;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n latest = Math.max(latest, getLatestMtime(fullPath));\n } else {\n latest = Math.max(latest, statSync(fullPath).mtimeMs);\n }\n }\n } catch {\n // ignore\n }\n return latest;\n}\n\n/**\n * Run build checks across all packages.\n * Uses incremental builds — only rebuilds packages where src/ is newer than dist/.\n * Builds in dependency order (topological sort) so DTS files are available for downstream packages.\n */\nexport function runBuildCheck(options: BuildRunnerOptions): CheckResult {\n const { packages, noCache, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n const sorted = sortByBuildLayers(packages);\n\n for (const pkg of sorted) {\n // Check if rebuild needed (incremental)\n if (!noCache && !needsRebuild(pkg.dir)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm run build', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n const durationMs = Date.now() - startMs;\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', durationMs);\n } catch (err: unknown) {\n const durationMs = Date.now() - startMs;\n result.failed.push(pkg.name);\n const spawnErr = err as { stderr?: string; stdout?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stderr || spawnErr.stdout || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Build failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', durationMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface LintRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run ESLint check on all packages.\n */\nexport function runLintCheck(options: LintRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n const srcDir = join(pkg.dir, 'src');\n if (!existsSync(srcDir)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm exec eslint .', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 60000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: unknown) {\n result.failed.push(pkg.name);\n const spawnErr = err as { stdout?: string; stderr?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Lint failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface TypeRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run TypeScript type checking on all packages.\n */\nexport function runTypeCheck(options: TypeRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n const tsconfigPath = join(pkg.dir, 'tsconfig.json');\n if (!existsSync(tsconfigPath)) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm exec tsc --noEmit', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: unknown) {\n result.failed.push(pkg.name);\n const spawnErr = err as { stdout?: string; stderr?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Type check failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { CheckResult, WorkspacePackage } from '@kb-labs/qa-contracts';\n\ninterface TestRunnerOptions {\n rootDir: string;\n packages: WorkspacePackage[];\n onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;\n}\n\n/**\n * Run Vitest tests on all packages.\n * Uses --passWithNoTests so packages without tests pass.\n */\nexport function runTestCheck(options: TestRunnerOptions): CheckResult {\n const { packages, onProgress } = options;\n const result: CheckResult = { passed: [], failed: [], skipped: [], errors: {} };\n\n for (const pkg of packages) {\n // Check if package has test script\n let pkgJson: Record<string, unknown>;\n try {\n pkgJson = JSON.parse(\n readFileSync(join(pkg.dir, 'package.json'), 'utf-8')\n );\n } catch {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n if (!(pkgJson.scripts as Record<string, unknown> | undefined)?.test) {\n result.skipped.push(pkg.name);\n onProgress?.(pkg.name, 'skip');\n continue;\n }\n\n const startMs = Date.now();\n try {\n execSync('pnpm run test', {\n cwd: pkg.dir,\n encoding: 'utf-8',\n timeout: 120000,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n result.passed.push(pkg.name);\n onProgress?.(pkg.name, 'pass', Date.now() - startMs);\n } catch (err: unknown) {\n result.failed.push(pkg.name);\n const spawnErr = err as { stdout?: string; stderr?: string; message?: string; status?: number };\n const rawErr = (spawnErr.stdout || spawnErr.stderr || spawnErr.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Test failed (exit code ${spawnErr.status ?? 1})`;\n onProgress?.(pkg.name, 'fail', Date.now() - startMs);\n }\n }\n\n return result;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\nimport type { QAResults, WorkspacePackage, SubmoduleInfo } from '@kb-labs/qa-contracts';\n\n/**\n * Stored last-run data: full results + package metadata.\n */\nexport interface LastRunData {\n timestamp: string;\n results: QAResults;\n packages: WorkspacePackage[];\n submodules?: Record<string, SubmoduleInfo>;\n}\n\n/**\n * Save full QA results to disk for the details endpoint.\n */\nexport function saveLastRun(\n rootDir: string,\n results: QAResults,\n packages: WorkspacePackage[],\n submodules?: Record<string, SubmoduleInfo>,\n): void {\n const filePath = join(rootDir, PATHS.LAST_RUN);\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const data: LastRunData = {\n timestamp: new Date().toISOString(),\n results,\n packages: packages.map((p) => ({\n name: p.name,\n dir: p.dir,\n relativePath: p.relativePath,\n repo: p.repo,\n submodule: p.submodule,\n })),\n submodules,\n };\n\n writeFileSync(filePath, JSON.stringify(data, null, 2));\n}\n\n/**\n * Load last-run data from disk.\n */\nexport function loadLastRun(rootDir: string): LastRunData | null {\n const filePath = join(rootDir, PATHS.LAST_RUN);\n if (!existsSync(filePath)) {return null;}\n\n try {\n return JSON.parse(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n","import type { QARunOptions, QAResults, QARunResult, SubmoduleInfo, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { getWorkspacePackages } from './workspace.js';\nimport { runCustomChecks } from './custom-check-runner.js';\nimport { loadCache, saveCache, updateCacheEntry } from './cache.js';\nimport { runBuildCheck } from './build-runner.js';\nimport { runLintCheck } from './lint-runner.js';\nimport { runTypeCheck } from './type-runner.js';\nimport { runTestCheck } from './test-runner.js';\nimport { saveLastRun } from './last-run-store.js';\n\nconst SKIP_ALIASES: Record<string, string> = {\n types: 'typecheck',\n 'type-check': 'typecheck',\n tests: 'test',\n};\n\nfunction runBuiltinChecks(\n options: QARunOptions,\n packages: WorkspacePackage[],\n skipSet: Set<string>,\n results: QAResults,\n): void {\n const { rootDir, noCache } = options;\n if (!skipSet.has('build')) {\n results.build = runBuildCheck({\n rootDir, packages, noCache,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('build', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('lint')) {\n results.lint = runLintCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('lint', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('typecheck')) {\n results.typeCheck = runTypeCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('typeCheck', pkg, status, durationMs),\n });\n }\n if (!skipSet.has('test')) {\n results.test = runTestCheck({\n rootDir, packages,\n onProgress: (pkg, status, durationMs) => options.onProgress?.('test', pkg, status, durationMs),\n });\n }\n}\n\n/**\n * Run all QA checks in order: build → lint → typeCheck → test.\n * Respects skip flags and package filters.\n * If options.checks is provided, uses custom check runners instead of built-ins.\n */\nexport async function runQA(options: QARunOptions): Promise<QARunResult> {\n const { rootDir, noCache } = options;\n\n const skipSet = new Set(\n (options.skipChecks ?? []).map(s => SKIP_ALIASES[s.toLowerCase()] ?? s.toLowerCase()),\n );\n\n const filter = { package: options.package, repo: options.repo, scope: options.scope };\n const packages = getWorkspacePackages(rootDir, filter, options.packagesConfig);\n let cache = noCache ? {} : loadCache(rootDir);\n\n const results: QAResults = {};\n\n if (options.checks && options.checks.length > 0) {\n const activeChecks = skipSet.size > 0\n ? options.checks.filter(c => !skipSet.has(c.id.toLowerCase()))\n : options.checks;\n Object.assign(results, runCustomChecks(activeChecks, packages, rootDir,\n (checkId, pkg, status, durationMs) => { options.onProgress?.(checkId, pkg, status, durationMs); },\n ));\n } else {\n runBuiltinChecks(options, packages, skipSet, results);\n }\n\n if (!noCache) {\n for (const pkg of packages) {\n cache = updateCacheEntry(pkg.dir, pkg.name, cache);\n }\n saveCache(rootDir, cache);\n }\n\n const submodules: Record<string, SubmoduleInfo> = {};\n for (const pkg of packages) {\n if (pkg.submodule && !submodules[pkg.repo]) {\n submodules[pkg.repo] = pkg.submodule;\n }\n }\n saveLastRun(rootDir, results, packages, Object.keys(submodules).length > 0 ? submodules : undefined);\n\n return { results, packages };\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS } from '@kb-labs/qa-contracts';\nimport type { BaselineSnapshot } from '@kb-labs/qa-contracts';\n\n/**\n * Load baseline snapshot from disk.\n */\nexport function loadBaseline(rootDir: string): BaselineSnapshot | null {\n const path = join(rootDir, PATHS.BASELINE);\n if (!existsSync(path)) {return null;}\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Save baseline snapshot to disk.\n */\nexport function saveBaseline(rootDir: string, snapshot: BaselineSnapshot): void {\n const path = join(rootDir, PATHS.BASELINE);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(snapshot, null, 2));\n}\n","import { execSync } from 'node:child_process';\nimport type { BaselineSnapshot, QAResults } from '@kb-labs/qa-contracts';\nimport { runQA } from '../runner/qa-orchestrator.js';\nimport { saveBaseline } from './baseline-store.js';\n\nfunction getGitInfo(rootDir: string): { commit: string; branch: string } {\n try {\n const commit = execSync('git rev-parse --short HEAD', {\n cwd: rootDir,\n encoding: 'utf-8',\n }).trim();\n const branch = execSync('git rev-parse --abbrev-ref HEAD', {\n cwd: rootDir,\n encoding: 'utf-8',\n }).trim();\n return { commit, branch };\n } catch {\n return { commit: 'unknown', branch: 'unknown' };\n }\n}\n\n/**\n * Create a baseline snapshot from QA results.\n */\nexport function createBaselineFromResults(\n results: QAResults,\n rootDir: string,\n): BaselineSnapshot {\n const git = getGitInfo(rootDir);\n const snapshot: BaselineSnapshot = {\n timestamp: new Date().toISOString(),\n git,\n results: {} as BaselineSnapshot['results'],\n };\n\n for (const ct of Object.keys(results)) {\n const r = results[ct]!;\n snapshot.results[ct] = {\n passed: r.passed.length,\n failed: r.failed.length,\n failedPackages: [...r.failed],\n };\n }\n\n return snapshot;\n}\n\n/**\n * Run full QA and capture baseline.\n */\nexport async function captureBaseline(rootDir: string): Promise<BaselineSnapshot> {\n const { results } = await runQA({ rootDir });\n const snapshot = createBaselineFromResults(results, rootDir);\n saveBaseline(rootDir, snapshot);\n return snapshot;\n}\n","import type { QAResults, BaselineSnapshot, BaselineDiff } from '@kb-labs/qa-contracts';\n\n/**\n * Compare current QA results with a baseline snapshot.\n * Returns per-check-type diff with newFailures, fixed, stillFailing, delta.\n */\nexport function compareWithBaseline(\n results: QAResults,\n baseline: BaselineSnapshot,\n): BaselineDiff {\n const diff = {} as BaselineDiff;\n\n const checkTypes = [...new Set([...Object.keys(results), ...Object.keys(baseline.results)])];\n\n for (const ct of checkTypes) {\n const current = new Set(results[ct]?.failed ?? []);\n const baselineFailed = new Set(baseline.results[ct]?.failedPackages ?? []);\n\n const newFailures = [...current].filter((p) => !baselineFailed.has(p));\n const fixed = [...baselineFailed].filter((p) => !current.has(p));\n const stillFailing = [...current].filter((p) => baselineFailed.has(p));\n\n diff[ct] = {\n newFailures,\n fixed,\n stillFailing,\n delta: current.size - baselineFailed.size,\n };\n }\n\n return diff;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { QA_DATA_DIR, HISTORY_MAX_ENTRIES } from '@kb-labs/qa-contracts';\nimport type { HistoryEntry } from '@kb-labs/qa-contracts';\n\nfunction trendPath(rootDir: string, checkId: string): string {\n return join(rootDir, QA_DATA_DIR, 'trends', `${checkId}.json`);\n}\n\n/**\n * Load per-check trend history from disk.\n */\nexport function loadTrendHistory(rootDir: string, checkId: string): HistoryEntry[] {\n const path = trendPath(rootDir, checkId);\n if (!existsSync(path)) { return []; }\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return [];\n }\n}\n\n/**\n * Append a history entry to the per-check trend store.\n * Keeps max HISTORY_MAX_ENTRIES entries per check.\n */\nexport function appendTrendEntry(rootDir: string, checkId: string, entry: HistoryEntry): void {\n const path = trendPath(rootDir, checkId);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const entries = loadTrendHistory(rootDir, checkId);\n entries.push(entry);\n while (entries.length > HISTORY_MAX_ENTRIES) {\n entries.shift();\n }\n writeFileSync(path, JSON.stringify(entries, null, 2));\n}\n","import { execSync } from 'node:child_process';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { PATHS, HISTORY_MAX_ENTRIES } from '@kb-labs/qa-contracts';\nimport type { HistoryEntry, QAResults, SubmoduleInfo, WorkspacePackage, QACheckConfig } from '@kb-labs/qa-contracts';\nimport { appendTrendEntry } from './trend-store.js';\n\n/**\n * Load history entries from disk.\n */\nexport function loadHistory(rootDir: string): HistoryEntry[] {\n const path = join(rootDir, PATHS.HISTORY);\n if (!existsSync(path)) {return [];}\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return [];\n }\n}\n\n/**\n * Save history entries to disk.\n */\nexport function saveHistory(rootDir: string, entries: HistoryEntry[]): void {\n const path = join(rootDir, PATHS.HISTORY);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(entries, null, 2));\n}\n\n/**\n * Create a history entry from QA results.\n */\nexport function createHistoryEntry(\n results: QAResults,\n rootDir: string,\n packages?: WorkspacePackage[],\n runContext?: HistoryEntry['runContext'],\n): HistoryEntry {\n let commit = 'unknown';\n let branch = 'unknown';\n let message = '';\n\n try {\n commit = execSync('git rev-parse --short HEAD', { cwd: rootDir, encoding: 'utf-8' }).trim();\n branch = execSync('git rev-parse --abbrev-ref HEAD', { cwd: rootDir, encoding: 'utf-8' }).trim();\n message = execSync('git log -1 --format=%s', { cwd: rootDir, encoding: 'utf-8' }).trim();\n } catch {\n // git not available\n }\n\n const hasFailures = Object.values(results).some(r => r.failed.length > 0);\n\n const summary = {} as HistoryEntry['summary'];\n const failedPackages = {} as HistoryEntry['failedPackages'];\n\n for (const ct of Object.keys(results)) {\n const r = results[ct]!;\n summary[ct] = {\n passed: r.passed.length,\n failed: r.failed.length,\n skipped: r.skipped.length,\n };\n failedPackages[ct] = [...r.failed];\n }\n\n // Collect submodule info from packages (deduplicated by repo)\n let submodules: Record<string, SubmoduleInfo> | undefined;\n if (packages) {\n const subs: Record<string, SubmoduleInfo> = {};\n for (const pkg of packages) {\n if (pkg.submodule && !subs[pkg.repo]) {\n subs[pkg.repo] = pkg.submodule;\n }\n }\n if (Object.keys(subs).length > 0) {\n submodules = subs;\n }\n }\n\n return {\n timestamp: new Date().toISOString(),\n git: { commit, branch, message },\n submodules,\n status: hasFailures ? 'failed' : 'passed',\n summary,\n failedPackages,\n ...(runContext ? { runContext } : {}),\n };\n}\n\n/**\n * Append a history entry, keeping max HISTORY_MAX_ENTRIES.\n * If checks config is provided, also writes to per-check trend store for checks with trending:true.\n */\nexport function appendEntry(rootDir: string, entry: HistoryEntry, checks?: QACheckConfig[]): void {\n const history = loadHistory(rootDir);\n history.push(entry);\n\n // Trim to max entries\n while (history.length > HISTORY_MAX_ENTRIES) {\n history.shift();\n }\n\n saveHistory(rootDir, history);\n\n // Write to per-check trend store for trending checks\n if (checks) {\n for (const check of checks) {\n if (check.trending && entry.summary[check.id] !== undefined) {\n appendTrendEntry(rootDir, check.id, entry);\n }\n }\n }\n}\n","import type { HistoryEntry, TrendResult, EnrichedTrendResult, TrendChangelogEntry } from '@kb-labs/qa-contracts';\nimport { TRENDS_WINDOW, getCheckLabel, getCheckIcon } from '@kb-labs/qa-contracts';\n\n/**\n * Collect all unique check type keys across a set of history entries.\n */\nfunction collectCheckTypes(entries: HistoryEntry[]): string[] {\n const s = new Set<string>();\n for (const e of entries) {\n for (const k of Object.keys(e.summary)) {s.add(k);}\n }\n return [...s];\n}\n\n/**\n * Analyze trends over a window of history entries.\n * Compares failure counts between first and last entry in the window.\n */\nexport function analyzeTrends(\n history: HistoryEntry[],\n window: number = TRENDS_WINDOW,\n): TrendResult[] {\n if (history.length < 2) {return [];}\n\n const windowEntries = history.slice(-window);\n const first = windowEntries[0]!;\n const last = windowEntries[windowEntries.length - 1]!;\n\n const results: TrendResult[] = [];\n\n for (const ct of collectCheckTypes([first, last])) {\n const previous = first.summary[ct]?.failed ?? 0;\n const current = last.summary[ct]?.failed ?? 0;\n const delta = current - previous;\n\n let trend: TrendResult['trend'];\n if (delta > 0) {trend = 'regression';}\n else if (delta < 0) {trend = 'improvement';}\n else {trend = 'no-change';}\n\n results.push({ checkType: ct, label: getCheckLabel(ct), icon: getCheckIcon(ct), previous, current, delta, trend });\n }\n\n return results;\n}\n\n/**\n * Enriched trend analysis — full time-series, per-entry changelog, velocity.\n *\n * For each check type, provides:\n * - timeSeries: all data points in the window (for charts)\n * - changelog: what changed between consecutive entries (new failures / fixes)\n * - velocity: average delta per entry (rate of change)\n */\nexport function analyzeEnrichedTrends(\n history: HistoryEntry[],\n window: number = TRENDS_WINDOW,\n): EnrichedTrendResult[] {\n if (history.length < 2) {return [];}\n\n const windowEntries = history.slice(-window);\n const first = windowEntries[0]!;\n const last = windowEntries[windowEntries.length - 1]!;\n\n const results: EnrichedTrendResult[] = [];\n\n for (const ct of collectCheckTypes(windowEntries)) {\n // Build time-series: map each entry to a data point\n const timeSeries = windowEntries.map((entry) => ({\n timestamp: entry.timestamp,\n gitCommit: entry.git.commit,\n gitBranch: entry.git.branch,\n gitMessage: entry.git.message,\n passed: entry.summary[ct]?.passed ?? 0,\n failed: entry.summary[ct]?.failed ?? 0,\n skipped: entry.summary[ct]?.skipped ?? 0,\n }));\n\n // Build changelog: diff failedPackages between consecutive entries\n const changelog: TrendChangelogEntry[] = [];\n const deltas: number[] = [];\n\n for (let i = 1; i < windowEntries.length; i++) {\n const prev = windowEntries[i - 1]!;\n const curr = windowEntries[i]!;\n\n const prevFailed = new Set(prev.failedPackages[ct] ?? []);\n const currFailed = curr.failedPackages[ct] ?? [];\n const currFailedSet = new Set(currFailed);\n\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\n deltas.push(delta);\n\n // Only include entries that actually had changes\n if (newFailures.length > 0 || fixed.length > 0) {\n changelog.push({\n timestamp: curr.timestamp,\n gitCommit: curr.git.commit,\n gitMessage: curr.git.message,\n newFailures,\n fixed,\n delta,\n });\n }\n }\n\n // Summary metrics\n const previous = first.summary[ct]?.failed ?? 0;\n const current = last.summary[ct]?.failed ?? 0;\n const delta = current - previous;\n\n let trend: EnrichedTrendResult['trend'];\n if (delta > 0) {trend = 'regression';}\n else if (delta < 0) {trend = 'improvement';}\n else {trend = 'no-change';}\n\n // Velocity: average delta per entry transition\n const velocity = deltas.length > 0\n ? deltas.reduce((sum, d) => sum + d, 0) / deltas.length\n : 0;\n\n results.push({\n checkType: ct,\n label: getCheckLabel(ct),\n icon: getCheckIcon(ct),\n timeSeries,\n changelog,\n current,\n previous,\n delta,\n trend,\n velocity: Math.round(velocity * 100) / 100,\n });\n }\n\n return results;\n}\n","import type { HistoryEntry, RegressionResult } from '@kb-labs/qa-contracts';\n\n/**\n * Detect regressions by comparing the last 2 history entries.\n * A regression = new packages failing that weren't failing before.\n */\nexport function detectRegressions(history: HistoryEntry[]): RegressionResult {\n if (history.length < 2) {\n return { hasRegressions: false, regressions: [] };\n }\n\n const previous = history[history.length - 2]!;\n const current = history[history.length - 1]!;\n\n const regressions: RegressionResult['regressions'] = [];\n\n const checkTypes = [...new Set([...Object.keys(previous.failedPackages), ...Object.keys(current.failedPackages)])];\n\n for (const ct of checkTypes) {\n const prevFailed = new Set(previous.failedPackages[ct] ?? []);\n const currFailed = current.failedPackages[ct] ?? [];\n\n const newFailures = currFailed.filter((p) => !prevFailed.has(p));\n const delta = currFailed.length - prevFailed.size;\n\n if (newFailures.length > 0) {\n regressions.push({\n checkType: ct,\n delta,\n newFailures,\n });\n }\n }\n\n return {\n hasRegressions: regressions.length > 0,\n regressions,\n };\n}\n","import type { HistoryEntry, CheckType } from '@kb-labs/qa-contracts';\nimport type { PackageTimelineEntry, PackageTimelineResponse } from '@kb-labs/qa-contracts';\n\nfunction buildEntries(history: HistoryEntry[], packageName: string): { entries: PackageTimelineEntry[]; repo: string } {\n let repo = 'unknown';\n const entries: PackageTimelineEntry[] = [];\n\n for (let i = history.length - 1; i >= 0; i--) {\n const h = history[i]!;\n const checks: Record<string, 'passed' | 'failed' | 'skipped'> = {};\n let found = false;\n\n for (const ct of Object.keys(h.summary)) {\n const failedList = h.failedPackages[ct] ?? [];\n const summaryEntry = h.summary[ct];\n if (failedList.includes(packageName)) {\n checks[ct] = 'failed'; found = true;\n } else if (summaryEntry && (summaryEntry.passed > 0 || summaryEntry.failed > 0)) {\n checks[ct] = 'passed'; found = true;\n } else {\n checks[ct] = 'skipped';\n }\n }\n\n if (!found) { continue; }\n\n let submoduleCommit: string | undefined;\n if (h.submodules) {\n for (const [repoName, info] of Object.entries(h.submodules)) {\n if (repoName === repo || repo === 'unknown') {\n submoduleCommit = info.commit;\n if (repo === 'unknown') { repo = repoName; }\n }\n }\n }\n\n entries.push({\n timestamp: h.timestamp,\n git: h.git,\n submoduleCommit,\n checks: checks as Record<CheckType, 'passed' | 'failed' | 'skipped'>,\n });\n }\n\n return { entries, repo };\n}\n\nfunction computeFlakyScore(entries: PackageTimelineEntry[]): { flakyScore: number; flakyChecks: CheckType[] } {\n const allCheckTypes = new Set<string>();\n for (const entry of entries) {\n for (const k of Object.keys(entry.checks)) { allCheckTypes.add(k); }\n }\n\n const flakyChecks: CheckType[] = [];\n let totalFlips = 0;\n let totalTransitions = 0;\n\n for (const ct of allCheckTypes) {\n let flips = 0;\n let transitions = 0;\n for (let i = 1; i < entries.length; i++) {\n const prev = entries[i - 1]!.checks[ct];\n const curr = entries[i]!.checks[ct];\n if (prev === 'skipped' || curr === 'skipped' || !prev || !curr) { continue; }\n transitions++;\n if (prev !== curr) { flips++; }\n }\n if (transitions > 0 && flips / transitions > 0.3) { flakyChecks.push(ct as CheckType); }\n totalFlips += flips;\n totalTransitions += transitions;\n }\n\n return {\n flakyScore: totalTransitions > 0 ? Math.min(1, totalFlips / totalTransitions) : 0,\n flakyChecks,\n };\n}\n\nfunction computeStreak(entries: PackageTimelineEntry[]): { status: 'passing' | 'failing'; count: number } {\n const latest = entries[0];\n if (!latest) { return { status: 'passing', count: 0 }; }\n\n const streakStatus: 'passing' | 'failing' = Object.values(latest.checks).some((v) => v === 'failed') ? 'failing' : 'passing';\n let count = 1;\n for (let i = 1; i < entries.length; i++) {\n const eFail = Object.values(entries[i]!.checks).some((v) => v === 'failed');\n if ((eFail ? 'failing' : 'passing') !== streakStatus) { break; }\n count++;\n }\n return { status: streakStatus, count };\n}\n\n/**\n * Build a timeline for a specific package across QA history.\n * Computes flaky score, current streak, and first failure timestamp.\n */\nexport function getPackageTimeline(\n history: HistoryEntry[],\n packageName: string,\n): PackageTimelineResponse {\n const { entries, repo } = buildEntries(history, packageName);\n const { flakyScore, flakyChecks } = computeFlakyScore(entries);\n\n let firstFailure: string | undefined;\n for (let i = entries.length - 1; i >= 0; i--) {\n if (Object.values(entries[i]!.checks).some((v) => v === 'failed')) {\n firstFailure = entries[i]!.timestamp;\n }\n }\n\n return {\n packageName,\n repo,\n entries,\n flakyScore: Math.round(flakyScore * 100) / 100,\n flakyChecks,\n firstFailure,\n currentStreak: computeStreak(entries),\n };\n}\n","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","import type { WorkspacePackage, QAPluginConfig } from '@kb-labs/qa-contracts';\n\n/**\n * Match a package name against a pattern.\n * Supports: exact match, glob with trailing * (e.g., \"@kb-labs/core-*\"), repo prefix (\"kb-labs-cli/*\").\n */\nfunction matchesPattern(packageName: string, repo: string, pattern: string): boolean {\n // Repo prefix pattern: \"kb-labs-cli/*\" matches all packages in that repo\n if (pattern.includes('/') && pattern.endsWith('/*')) {\n const repoPrefix = pattern.slice(0, -2);\n return repo === repoPrefix;\n }\n\n // Exact match\n if (!pattern.includes('*')) {\n return packageName === pattern;\n }\n\n // Glob with trailing *: \"@kb-labs/core-*\" matches \"@kb-labs/core-types\", \"@kb-labs/core-sys\", etc.\n const prefix = pattern.slice(0, pattern.indexOf('*'));\n return packageName.startsWith(prefix);\n}\n\n/**\n * Resolve which categories each package belongs to.\n * Returns a Map of packageName → categoryName[].\n *\n * A package can belong to multiple categories (e.g., a repo listed in both \"core\" and \"hosts\").\n * If no config or no categories defined, all packages map to ['uncategorized'].\n * Packages that don't match any category go to ['uncategorized'].\n */\nexport function resolveCategories(\n packages: WorkspacePackage[],\n config?: QAPluginConfig,\n): Map<string, string[]> {\n const map = new Map<string, string[]>();\n\n if (!config?.categories) {\n for (const pkg of packages) {\n map.set(pkg.name, ['uncategorized']);\n }\n return map;\n }\n\n const categoryEntries = Object.entries(config.categories);\n\n for (const pkg of packages) {\n const matched: string[] = [];\n for (const [categoryKey, categoryConfig] of categoryEntries) {\n for (const pattern of categoryConfig.packages) {\n if (matchesPattern(pkg.name, pkg.repo, pattern)) {\n matched.push(categoryKey);\n break; // Don't match same category twice for same package\n }\n }\n }\n map.set(pkg.name, matched.length > 0 ? matched : ['uncategorized']);\n }\n\n return map;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/devkit/devkit-discovery.ts","../src/devkit/devkit-adapter.ts","../src/devkit/git-capture.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/report/text-reporter.ts","../src/report/json-reporter.ts"],"names":["existsSync","join","r","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 { 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 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 // ── 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 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/dist/report/index.d.ts
CHANGED
|
@@ -1,52 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Build a structured JSON report from QA results.
|
|
5
|
-
* Pass checks config to populate blockers/warnings with severity info.
|
|
6
|
-
*/
|
|
7
|
-
declare function buildJsonReport(results: QAResults, diff?: BaselineDiff | null, checks?: QACheckConfig[]): QAReport;
|
|
8
|
-
/**
|
|
9
|
-
* Build a detailed JSON report with grouped results.
|
|
10
|
-
*/
|
|
11
|
-
declare function buildDetailedJsonReport(results: QAResults, grouped: GroupedResults, diff?: BaselineDiff | null, checks?: QACheckConfig[]): QAReport & {
|
|
12
|
-
grouped: GroupedResults;
|
|
13
|
-
};
|
|
1
|
+
import { BaselineCheckDiff, BaselineData, CheckSnapshot, RunSnapshot, RegressionDetection, StatsSnapshot, TrendAnalysis } from '@kb-labs/qa-contracts';
|
|
14
2
|
|
|
15
3
|
interface ReportSection {
|
|
16
4
|
header: string;
|
|
17
5
|
lines: string[];
|
|
18
6
|
}
|
|
19
|
-
declare function
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
declare function buildHistoryTable(history:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
declare function
|
|
28
|
-
/**
|
|
29
|
-
* Build regressions report.
|
|
30
|
-
*/
|
|
31
|
-
declare function buildRegressionsReport(result: RegressionResult, history: HistoryEntry[]): ReportSection[];
|
|
32
|
-
/**
|
|
33
|
-
* Build baseline status report.
|
|
34
|
-
*/
|
|
35
|
-
declare function buildBaselineReport(baseline: BaselineSnapshot | null): ReportSection[];
|
|
36
|
-
declare function buildDetailedRunReport(grouped: GroupedResults, diff?: BaselineDiff | null): ReportSection[];
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Group QA results by category → repo → packages.
|
|
40
|
-
*
|
|
41
|
-
* A package can appear in multiple categories if its repo is listed
|
|
42
|
-
* in multiple category configs (e.g., kb-labs-cli in both "core" and "hosts").
|
|
43
|
-
*/
|
|
44
|
-
declare function groupResults(results: QAResults, packages: WorkspacePackage[], categoryMap: Map<string, string[]>, config?: QAPluginConfig): GroupedResults;
|
|
7
|
+
declare function formatTaskName(task: string): string;
|
|
8
|
+
declare function buildRunReport(snap: RunSnapshot | null): ReportSection[];
|
|
9
|
+
declare function buildCheckReport(snap: CheckSnapshot | null): ReportSection[];
|
|
10
|
+
declare function buildStatsReport(snap: StatsSnapshot | null): ReportSection[];
|
|
11
|
+
declare function buildHistoryTable(history: RunSnapshot[], limit?: number): ReportSection[];
|
|
12
|
+
declare function buildTrendsReport(analysis: TrendAnalysis): ReportSection[];
|
|
13
|
+
declare function buildRegressionsReport(detection: RegressionDetection): ReportSection[];
|
|
14
|
+
declare function buildBaselineReport(baseline: BaselineData | null): ReportSection[];
|
|
15
|
+
declare function buildBaselineDiffReport(diff: BaselineCheckDiff): ReportSection[];
|
|
45
16
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*/
|
|
50
|
-
declare function groupErrors(results: QAResults): QAErrorGroupsResponse;
|
|
17
|
+
declare function buildRunJsonReport(snap: RunSnapshot): object;
|
|
18
|
+
declare function buildCheckJsonReport(snap: CheckSnapshot): object;
|
|
19
|
+
declare function buildStatsJsonReport(snap: StatsSnapshot): object;
|
|
51
20
|
|
|
52
|
-
export { type ReportSection, buildBaselineReport,
|
|
21
|
+
export { type ReportSection, buildBaselineDiffReport, buildBaselineReport, buildCheckJsonReport, buildCheckReport, buildHistoryTable, buildRegressionsReport, buildRunJsonReport, buildRunReport, buildStatsJsonReport, buildStatsReport, buildTrendsReport, formatTaskName };
|