@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.
@@ -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"],"names":["existsSync","join","readFileSync","readdirSync","statSync","execSync","PATHS","dirname","mkdirSync","writeFileSync"],"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"]}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@kb-labs/qa-core",
3
+ "version": "0.6.0",
4
+ "type": "module",
5
+ "description": "Core business logic for KB Labs QA Plugin — runner, baseline, history, and reporting.",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./runner": {
14
+ "import": "./dist/runner/index.js",
15
+ "types": "./dist/runner/index.d.ts"
16
+ },
17
+ "./baseline": {
18
+ "import": "./dist/baseline/index.js",
19
+ "types": "./dist/baseline/index.d.ts"
20
+ },
21
+ "./history": {
22
+ "import": "./dist/history/index.js",
23
+ "types": "./dist/history/index.d.ts"
24
+ },
25
+ "./report": {
26
+ "import": "./dist/report/index.js",
27
+ "types": "./dist/report/index.d.ts"
28
+ },
29
+ "./dist/*": "./dist/*"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "sideEffects": false,
37
+ "scripts": {
38
+ "pretype-check": "pnpm --filter @kb-labs/qa-core build",
39
+ "clean": "rimraf dist",
40
+ "build": "tsup --config tsup.config.ts",
41
+ "dev": "tsup --config tsup.config.ts --watch",
42
+ "lint": "eslint src --ext .ts",
43
+ "lint:fix": "eslint . --fix",
44
+ "type-check": "tsc --noEmit",
45
+ "test": "vitest run --passWithNoTests",
46
+ "test:watch": "vitest"
47
+ },
48
+ "dependencies": {
49
+ "@kb-labs/qa-contracts": "^0.6.0"
50
+ },
51
+ "devDependencies": {
52
+ "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
53
+ "@types/node": "^24.3.3",
54
+ "eslint": "^9",
55
+ "rimraf": "^6.0.1",
56
+ "tsup": "^8.5.0",
57
+ "typescript": "^5.6.3",
58
+ "vitest": "^3.2.4"
59
+ },
60
+ "engines": {
61
+ "node": ">=20.0.0",
62
+ "pnpm": ">=9.0.0"
63
+ }
64
+ }