@kb-labs/qa-core 0.6.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/README.md +120 -0
- package/dist/baseline/index.d.ts +27 -0
- package/dist/baseline/index.js +762 -0
- package/dist/baseline/index.js.map +1 -0
- package/dist/categories/index.d.ts +13 -0
- package/dist/categories/index.js +39 -0
- package/dist/categories/index.js.map +1 -0
- package/dist/history/index.d.ts +47 -0
- package/dist/history/index.js +324 -0
- package/dist/history/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1550 -0
- package/dist/index.js.map +1 -0
- package/dist/last-run-store-CQ_6ai40.d.ts +78 -0
- package/dist/report/index.d.ts +51 -0
- package/dist/report/index.js +423 -0
- package/dist/report/index.js.map +1 -0
- package/dist/runner/index.d.ts +43 -0
- package/dist/runner/index.js +713 -0
- package/dist/runner/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +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/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","readdirSync","statSync","execSync","PATHS","dirname","mkdirSync","writeFileSync","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 } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\nimport type { QACheckConfig, QAResults, WorkspacePackage } from '@kb-labs/qa-contracts';\nimport { sortByBuildLayers } from './build-order.js';\n\ntype Bucket = { passed: string[]; failed: string[]; skipped: string[]; errors: Record<string, string> };\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: {} };\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n timeoutMs: number,\n): { ok: boolean; stdout: string; stderr: string; exitCode: number } {\n try {\n const result = spawnSync(command, args, { cwd, timeout: timeoutMs, encoding: 'utf-8', shell: false });\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: any) {\n return { ok: false, stdout: '', stderr: e.message ?? String(e), exitCode: 1 };\n }\n}\n\nfunction evaluate(check: QACheckConfig, stdout: string, stderr: string, exitCode: number): boolean {\n if ((check.parser ?? 'exitcode') === 'json') {\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 canonicalId: string, 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 onProgress?.(canonicalId, key, 'fail', durationMs);\n }\n}\n\nfunction runInRepoRoot(\n check: QACheckConfig, canonicalId: string, resolvedArgs: string[],\n rootDir: string, bucket: Bucket, onProgress: ProgressFn | undefined,\n): void {\n const startMs = Date.now();\n const { stderr, exitCode, stdout } = runCommand(check.command, resolvedArgs, rootDir, check.timeoutMs ?? 120_000);\n recordResult(bucket, rootDir, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, 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): void {\n const seen = new Set<string>();\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);\n recordResult(bucket, pkg.repo, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, 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): void {\n const sortedPackages = check.ordered ? sortByBuildLayers(packages) : packages;\n const scriptName = getPnpmScriptName(check);\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);\n recordResult(bucket, pkg.name, evaluate(check, stdout, stderr, exitCode), stdout, stderr, exitCode, canonicalId, onProgress, Date.now() - startMs);\n }\n}\n\nexport function runCustomChecks(\n checks: QACheckConfig[],\n packages: WorkspacePackage[],\n rootDir: string,\n onProgress?: ProgressFn,\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]!;\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);\n } else if (runIn === 'scopePath') {\n runInScopePath(check, canonicalId, resolvedArgs, packages, rootDir, bucket, onProgress);\n } else {\n runPerPackage(check, canonicalId, resolvedArgs, packages, bucket, onProgress);\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: any) {\n const durationMs = Date.now() - startMs;\n result.failed.push(pkg.name);\n const rawErr = (err.stderr || err.stdout || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Build failed (exit code ${err.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: any) {\n result.failed.push(pkg.name);\n const rawErr = (err.stdout || err.stderr || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Lint failed (exit code ${err.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: any) {\n result.failed.push(pkg.name);\n const rawErr = (err.stdout || err.stderr || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Type check failed (exit code ${err.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: any;\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?.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: any) {\n result.failed.push(pkg.name);\n const rawErr = (err.stdout || err.stderr || err.message || '').trim();\n result.errors[pkg.name] = rawErr.slice(0, 2000) || `Test failed (exit code ${err.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 { 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 } from '@kb-labs/qa-contracts';\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): 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 };\n}\n\n/**\n * Append a history entry, keeping max HISTORY_MAX_ENTRIES.\n */\nexport function appendEntry(rootDir: string, entry: HistoryEntry): 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","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 } from '@kb-labs/qa-contracts';\n\n/**\n * Build a structured JSON report from QA results.\n */\nexport function buildJsonReport(\n results: QAResults,\n diff?: BaselineDiff | null,\n): QAReport {\n const hasFailures = Object.values(results).some((r) => r.failed.length > 0);\n\n const summary = {} as QAReport['summary'];\n const failures = {} as QAReport['failures'];\n const errors = {} as QAReport['errors'];\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\n return {\n status: hasFailures ? 'failed' : 'passed',\n timestamp: new Date().toISOString(),\n summary,\n failures,\n errors,\n baseline: diff ?? null,\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): QAReport & { grouped: GroupedResults } {\n const base = buildJsonReport(results, diff);\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"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { QARunOptions, QARunResult, PackageFilter, PackagesConfig, WorkspacePackage, CheckResult, SubmoduleInfo, QAResults } from '@kb-labs/qa-contracts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Run all QA checks in order: build → lint → typeCheck → test.
|
|
5
|
+
* Respects skip flags and package filters.
|
|
6
|
+
* If options.checks is provided, uses custom check runners instead of built-ins.
|
|
7
|
+
*/
|
|
8
|
+
declare function runQA(options: QARunOptions): Promise<QARunResult>;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Discover all workspace packages in the monorepo.
|
|
12
|
+
*
|
|
13
|
+
* If packagesConfig.paths is set, use those glob-expanded paths to find sub-monorepos.
|
|
14
|
+
* Otherwise fall back to auto-scan (supports both flat and nested layouts).
|
|
15
|
+
*/
|
|
16
|
+
declare function getWorkspacePackages(rootDir: string, filter?: PackageFilter, packagesConfig?: PackagesConfig): WorkspacePackage[];
|
|
17
|
+
|
|
18
|
+
interface LintRunnerOptions {
|
|
19
|
+
rootDir: string;
|
|
20
|
+
packages: WorkspacePackage[];
|
|
21
|
+
onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Run ESLint check on all packages.
|
|
25
|
+
*/
|
|
26
|
+
declare function runLintCheck(options: LintRunnerOptions): CheckResult;
|
|
27
|
+
|
|
28
|
+
interface TypeRunnerOptions {
|
|
29
|
+
rootDir: string;
|
|
30
|
+
packages: WorkspacePackage[];
|
|
31
|
+
onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Run TypeScript type checking on all packages.
|
|
35
|
+
*/
|
|
36
|
+
declare function runTypeCheck(options: TypeRunnerOptions): CheckResult;
|
|
37
|
+
|
|
38
|
+
interface TestRunnerOptions {
|
|
39
|
+
rootDir: string;
|
|
40
|
+
packages: WorkspacePackage[];
|
|
41
|
+
onProgress?: (pkg: string, status: 'pass' | 'fail' | 'skip', durationMs?: number) => void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run Vitest tests on all packages.
|
|
45
|
+
* Uses --passWithNoTests so packages without tests pass.
|
|
46
|
+
*/
|
|
47
|
+
declare function runTestCheck(options: TestRunnerOptions): CheckResult;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get git submodule info for a repo directory.
|
|
51
|
+
* Returns null if the directory is not a git repo.
|
|
52
|
+
*/
|
|
53
|
+
declare function getSubmoduleInfo(repoDir: string, repoName: string): SubmoduleInfo | null;
|
|
54
|
+
/**
|
|
55
|
+
* Collect submodule info for all unique repos from a list of packages.
|
|
56
|
+
* Caches by repo name to avoid redundant git calls.
|
|
57
|
+
*/
|
|
58
|
+
declare function collectSubmoduleInfo(rootDir: string, repos: string[]): Record<string, SubmoduleInfo>;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Stored last-run data: full results + package metadata.
|
|
62
|
+
*/
|
|
63
|
+
interface LastRunData {
|
|
64
|
+
timestamp: string;
|
|
65
|
+
results: QAResults;
|
|
66
|
+
packages: WorkspacePackage[];
|
|
67
|
+
submodules?: Record<string, SubmoduleInfo>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Save full QA results to disk for the details endpoint.
|
|
71
|
+
*/
|
|
72
|
+
declare function saveLastRun(rootDir: string, results: QAResults, packages: WorkspacePackage[], submodules?: Record<string, SubmoduleInfo>): void;
|
|
73
|
+
/**
|
|
74
|
+
* Load last-run data from disk.
|
|
75
|
+
*/
|
|
76
|
+
declare function loadLastRun(rootDir: string): LastRunData | null;
|
|
77
|
+
|
|
78
|
+
export { type LastRunData as L, getSubmoduleInfo as a, runLintCheck as b, collectSubmoduleInfo as c, runTypeCheck as d, runTestCheck as e, getWorkspacePackages as g, loadLastRun as l, runQA as r, saveLastRun as s };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { QAResults, BaselineDiff, QAReport, GroupedResults, HistoryEntry, TrendResult, RegressionResult, BaselineSnapshot, WorkspacePackage, QAPluginConfig, QAErrorGroupsResponse } from '@kb-labs/qa-contracts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Build a structured JSON report from QA results.
|
|
5
|
+
*/
|
|
6
|
+
declare function buildJsonReport(results: QAResults, diff?: BaselineDiff | null): QAReport;
|
|
7
|
+
/**
|
|
8
|
+
* Build a detailed JSON report with grouped results.
|
|
9
|
+
*/
|
|
10
|
+
declare function buildDetailedJsonReport(results: QAResults, grouped: GroupedResults, diff?: BaselineDiff | null): QAReport & {
|
|
11
|
+
grouped: GroupedResults;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
interface ReportSection {
|
|
15
|
+
header: string;
|
|
16
|
+
lines: string[];
|
|
17
|
+
}
|
|
18
|
+
declare function buildRunReport(results: QAResults, diff?: BaselineDiff | null): ReportSection[];
|
|
19
|
+
/**
|
|
20
|
+
* Build history table for display.
|
|
21
|
+
*/
|
|
22
|
+
declare function buildHistoryTable(history: HistoryEntry[], limit?: number): ReportSection[];
|
|
23
|
+
/**
|
|
24
|
+
* Build trends report.
|
|
25
|
+
*/
|
|
26
|
+
declare function buildTrendsReport(trends: TrendResult[], history: HistoryEntry[]): ReportSection[];
|
|
27
|
+
/**
|
|
28
|
+
* Build regressions report.
|
|
29
|
+
*/
|
|
30
|
+
declare function buildRegressionsReport(result: RegressionResult, history: HistoryEntry[]): ReportSection[];
|
|
31
|
+
/**
|
|
32
|
+
* Build baseline status report.
|
|
33
|
+
*/
|
|
34
|
+
declare function buildBaselineReport(baseline: BaselineSnapshot | null): ReportSection[];
|
|
35
|
+
declare function buildDetailedRunReport(grouped: GroupedResults, diff?: BaselineDiff | null): ReportSection[];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Group QA results by category → repo → packages.
|
|
39
|
+
*
|
|
40
|
+
* A package can appear in multiple categories if its repo is listed
|
|
41
|
+
* in multiple category configs (e.g., kb-labs-cli in both "core" and "hosts").
|
|
42
|
+
*/
|
|
43
|
+
declare function groupResults(results: QAResults, packages: WorkspacePackage[], categoryMap: Map<string, string[]>, config?: QAPluginConfig): GroupedResults;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Group errors from QA results by error pattern.
|
|
47
|
+
* Packages with the same error pattern (e.g., same ESLint rule) are grouped together.
|
|
48
|
+
*/
|
|
49
|
+
declare function groupErrors(results: QAResults): QAErrorGroupsResponse;
|
|
50
|
+
|
|
51
|
+
export { type ReportSection, buildBaselineReport, buildDetailedJsonReport, buildDetailedRunReport, buildHistoryTable, buildJsonReport, buildRegressionsReport, buildRunReport, buildTrendsReport, groupErrors, groupResults };
|