@kb-labs/impact-core 2.109.0 → 2.111.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/check.js +3 -3
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/docs.js +3 -3
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/packages.js +3 -3
- package/dist/cli/commands/packages.js.map +1 -1
- package/dist/cli/index.js +9 -9
- package/dist/cli/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -651,7 +651,7 @@ var check_default = defineCommand({
|
|
|
651
651
|
} else {
|
|
652
652
|
ctx.ui?.warn?.("Could not find workspace root");
|
|
653
653
|
}
|
|
654
|
-
return {
|
|
654
|
+
return { ok: false, error: "Could not find workspace root" };
|
|
655
655
|
}
|
|
656
656
|
const changed = detectChangedPackages(root);
|
|
657
657
|
if (changed.length === 0) {
|
|
@@ -660,7 +660,7 @@ var check_default = defineCommand({
|
|
|
660
660
|
} else {
|
|
661
661
|
ctx.ui?.success?.("No changes detected");
|
|
662
662
|
}
|
|
663
|
-
return {
|
|
663
|
+
return { ok: true, result: EMPTY_RESULT };
|
|
664
664
|
}
|
|
665
665
|
const graph = buildReverseDependencyGraph(root);
|
|
666
666
|
const packages = analyzePackageImpact(changed, graph);
|
|
@@ -684,7 +684,7 @@ var check_default = defineCommand({
|
|
|
684
684
|
} else {
|
|
685
685
|
ctx.ui?.write?.(formatHumanReadable(result));
|
|
686
686
|
}
|
|
687
|
-
return {
|
|
687
|
+
return { ok: true, result };
|
|
688
688
|
}
|
|
689
689
|
}
|
|
690
690
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/doc-analyzer.ts","../../../src/core/test-analyzer.ts","../../../src/core/build-analyzer.ts","../../../src/core/impact-rules.ts","../../../src/core/formatter.ts","../../../src/cli/commands/check.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":"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","file":"check.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageImpact, TestImpact } from '@kb-labs/impact-contracts';\n\nconst TEST_DIRS = ['tests', 'test', '__tests__'];\nconst TEST_PATTERNS = ['.test.ts', '.spec.ts', '.test.tsx', '.spec.tsx'];\n\nfunction findPackageDir(workspaceRoot: string, repo: string, packageName: string): string | null {\n const repoPath = join(workspaceRoot, repo);\n const packagesDir = join(repoPath, 'packages');\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — the repo itself is the package\n return repoPath;\n }\n\n // Search for the package by name in package.json files\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name === packageName) {\n return join(packagesDir, entry.name);\n }\n } catch { /* skip */ }\n }\n\n return null;\n}\n\nfunction countTestFiles(dir: string): number {\n let count = 0;\n\n function walk(d: string): void {\n if (!existsSync(d)) {return;}\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {continue;}\n const full = join(d, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (TEST_PATTERNS.some((p) => entry.name.endsWith(p))) {\n count++;\n }\n }\n }\n\n walk(dir);\n return count;\n}\n\nfunction detectTests(packageDir: string): { hasTests: boolean; testCount: number } {\n // Check dedicated test directories\n for (const testDir of TEST_DIRS) {\n const fullPath = join(packageDir, testDir);\n if (existsSync(fullPath)) {\n const count = countTestFiles(fullPath);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n }\n\n // Also check src/ for co-located test files\n const srcDir = join(packageDir, 'src');\n if (existsSync(srcDir)) {\n const count = countTestFiles(srcDir);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n\n return { hasTests: false, testCount: 0 };\n}\n\nexport function analyzeTestImpact(\n allImpacted: PackageImpact[],\n workspaceRoot: string,\n): { mustRun: TestImpact[]; noTests: TestImpact[] } {\n const mustRun: TestImpact[] = [];\n const noTests: TestImpact[] = [];\n\n for (const pkg of allImpacted) {\n const pkgDir = findPackageDir(workspaceRoot, pkg.repo, pkg.name);\n const { hasTests, testCount } = pkgDir ? detectTests(pkgDir) : { hasTests: false, testCount: 0 };\n\n const impact: TestImpact = {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n reason: pkg.reason,\n hasTests,\n testCount: hasTests ? testCount : undefined,\n command: hasTests ? `pnpm --filter ${pkg.name} run test` : undefined,\n };\n\n if (hasTests) {\n mustRun.push(impact);\n } else {\n noTests.push(impact);\n }\n }\n\n return { mustRun, noTests };\n}\n","import type { BuildImpact, BuildPlan, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\n/**\n * Topological sort of impacted packages — returns correct build order.\n * Uses Kahn's algorithm on the subgraph of only affected packages.\n */\nexport function analyzeBuildImpact(\n allImpacted: PackageImpact[],\n graph: Map<string, DepGraphNode>,\n): BuildPlan {\n const impactedNames = new Set(allImpacted.map((p) => p.name));\n const impactedMap = new Map(allImpacted.map((p) => [p.name, p]));\n\n // Build subgraph of only impacted packages\n const inDegree = new Map<string, number>();\n const deps = new Map<string, string[]>(); // name → deps that are also impacted\n\n for (const name of impactedNames) {\n const node = graph.get(name);\n const filteredDeps = (node?.dependsOn ?? []).filter((d) => impactedNames.has(d));\n deps.set(name, filteredDeps);\n inDegree.set(name, filteredDeps.length);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {queue.push(name);}\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n // Find packages that depend on current (and are in our impacted set)\n const node = graph.get(current);\n if (node) {\n for (const dependent of node.dependedBy) {\n if (!impactedNames.has(dependent)) {continue;}\n const deg = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, deg);\n if (deg === 0) {queue.push(dependent);}\n }\n }\n }\n\n // If some packages weren't reached (circular deps), append them at the end\n for (const name of impactedNames) {\n if (!sorted.includes(name)) {sorted.push(name);}\n }\n\n const steps: BuildImpact[] = sorted.map((name, idx) => {\n const pkg = impactedMap.get(name)!;\n return {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n order: idx + 1,\n reason: pkg.reason,\n };\n });\n\n // Generate a single command that builds in order\n const filterArgs = sorted.map((name) => `--filter ${name}`).join(' ');\n const command = sorted.length > 0\n ? `pnpm ${filterArgs} run build`\n : '';\n\n return {\n steps,\n command,\n totalPackages: steps.length,\n };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactAnalysisResult, ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n generateRecommendations,\n analyzeDocImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface CheckFlags {\n json?: boolean;\n}\n\ninterface CheckInput {\n argv: string[];\n flags: CheckFlags;\n}\n\nconst EMPTY_RESULT: ImpactAnalysisResult = {\n packages: { direct: [], dependent: [], transitive: [] },\n docs: { stale: [], review: [], reindex: [] },\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations: [],\n};\n\nexport default defineCommand<unknown, CheckInput, ImpactAnalysisResult>({\n id: 'impact:check',\n description: 'Full impact analysis (packages + docs)',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: CheckInput,\n ): Promise<CommandResult<ImpactAnalysisResult>> {\n const flags = input.flags ?? (input as unknown as CheckFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: EMPTY_RESULT };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const docs = analyzeDocImpact(allImpacted, rules);\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, docs);\n const result: ImpactAnalysisResult = { packages, docs, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable(result));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/doc-analyzer.ts","../../../src/core/test-analyzer.ts","../../../src/core/build-analyzer.ts","../../../src/core/impact-rules.ts","../../../src/core/formatter.ts","../../../src/cli/commands/check.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":"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","file":"check.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageImpact, TestImpact } from '@kb-labs/impact-contracts';\n\nconst TEST_DIRS = ['tests', 'test', '__tests__'];\nconst TEST_PATTERNS = ['.test.ts', '.spec.ts', '.test.tsx', '.spec.tsx'];\n\nfunction findPackageDir(workspaceRoot: string, repo: string, packageName: string): string | null {\n const repoPath = join(workspaceRoot, repo);\n const packagesDir = join(repoPath, 'packages');\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — the repo itself is the package\n return repoPath;\n }\n\n // Search for the package by name in package.json files\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name === packageName) {\n return join(packagesDir, entry.name);\n }\n } catch { /* skip */ }\n }\n\n return null;\n}\n\nfunction countTestFiles(dir: string): number {\n let count = 0;\n\n function walk(d: string): void {\n if (!existsSync(d)) {return;}\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {continue;}\n const full = join(d, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (TEST_PATTERNS.some((p) => entry.name.endsWith(p))) {\n count++;\n }\n }\n }\n\n walk(dir);\n return count;\n}\n\nfunction detectTests(packageDir: string): { hasTests: boolean; testCount: number } {\n // Check dedicated test directories\n for (const testDir of TEST_DIRS) {\n const fullPath = join(packageDir, testDir);\n if (existsSync(fullPath)) {\n const count = countTestFiles(fullPath);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n }\n\n // Also check src/ for co-located test files\n const srcDir = join(packageDir, 'src');\n if (existsSync(srcDir)) {\n const count = countTestFiles(srcDir);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n\n return { hasTests: false, testCount: 0 };\n}\n\nexport function analyzeTestImpact(\n allImpacted: PackageImpact[],\n workspaceRoot: string,\n): { mustRun: TestImpact[]; noTests: TestImpact[] } {\n const mustRun: TestImpact[] = [];\n const noTests: TestImpact[] = [];\n\n for (const pkg of allImpacted) {\n const pkgDir = findPackageDir(workspaceRoot, pkg.repo, pkg.name);\n const { hasTests, testCount } = pkgDir ? detectTests(pkgDir) : { hasTests: false, testCount: 0 };\n\n const impact: TestImpact = {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n reason: pkg.reason,\n hasTests,\n testCount: hasTests ? testCount : undefined,\n command: hasTests ? `pnpm --filter ${pkg.name} run test` : undefined,\n };\n\n if (hasTests) {\n mustRun.push(impact);\n } else {\n noTests.push(impact);\n }\n }\n\n return { mustRun, noTests };\n}\n","import type { BuildImpact, BuildPlan, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\n/**\n * Topological sort of impacted packages — returns correct build order.\n * Uses Kahn's algorithm on the subgraph of only affected packages.\n */\nexport function analyzeBuildImpact(\n allImpacted: PackageImpact[],\n graph: Map<string, DepGraphNode>,\n): BuildPlan {\n const impactedNames = new Set(allImpacted.map((p) => p.name));\n const impactedMap = new Map(allImpacted.map((p) => [p.name, p]));\n\n // Build subgraph of only impacted packages\n const inDegree = new Map<string, number>();\n const deps = new Map<string, string[]>(); // name → deps that are also impacted\n\n for (const name of impactedNames) {\n const node = graph.get(name);\n const filteredDeps = (node?.dependsOn ?? []).filter((d) => impactedNames.has(d));\n deps.set(name, filteredDeps);\n inDegree.set(name, filteredDeps.length);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {queue.push(name);}\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n // Find packages that depend on current (and are in our impacted set)\n const node = graph.get(current);\n if (node) {\n for (const dependent of node.dependedBy) {\n if (!impactedNames.has(dependent)) {continue;}\n const deg = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, deg);\n if (deg === 0) {queue.push(dependent);}\n }\n }\n }\n\n // If some packages weren't reached (circular deps), append them at the end\n for (const name of impactedNames) {\n if (!sorted.includes(name)) {sorted.push(name);}\n }\n\n const steps: BuildImpact[] = sorted.map((name, idx) => {\n const pkg = impactedMap.get(name)!;\n return {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n order: idx + 1,\n reason: pkg.reason,\n };\n });\n\n // Generate a single command that builds in order\n const filterArgs = sorted.map((name) => `--filter ${name}`).join(' ');\n const command = sorted.length > 0\n ? `pnpm ${filterArgs} run build`\n : '';\n\n return {\n steps,\n command,\n totalPackages: steps.length,\n };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactAnalysisResult, ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n generateRecommendations,\n analyzeDocImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface CheckFlags {\n json?: boolean;\n}\n\ninterface CheckInput {\n argv: string[];\n flags: CheckFlags;\n}\n\nconst EMPTY_RESULT: ImpactAnalysisResult = {\n packages: { direct: [], dependent: [], transitive: [] },\n docs: { stale: [], review: [], reindex: [] },\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations: [],\n};\n\nexport default defineCommand<unknown, CheckInput, ImpactAnalysisResult>({\n id: 'impact:check',\n description: 'Full impact analysis (packages + docs)',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: CheckInput,\n ): Promise<CommandResult<ImpactAnalysisResult>> {\n const flags = input.flags ?? (input as unknown as CheckFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { ok: false, error: 'Could not find workspace root' };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.success?.('No changes detected');}\n return { ok: true, result: EMPTY_RESULT };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const docs = analyzeDocImpact(allImpacted, rules);\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, docs);\n const result: ImpactAnalysisResult = { packages, docs, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable(result));\n }\n\n return { ok: true, result };\n },\n },\n});\n"]}
|
|
@@ -451,7 +451,7 @@ var docs_default = defineCommand({
|
|
|
451
451
|
} else {
|
|
452
452
|
ctx.ui?.warn?.("Could not find workspace root");
|
|
453
453
|
}
|
|
454
|
-
return {
|
|
454
|
+
return { ok: false, error: "Could not find workspace root" };
|
|
455
455
|
}
|
|
456
456
|
const changed = detectChangedPackages(root);
|
|
457
457
|
if (changed.length === 0) {
|
|
@@ -461,7 +461,7 @@ var docs_default = defineCommand({
|
|
|
461
461
|
} else {
|
|
462
462
|
ctx.ui?.success?.("No changes detected");
|
|
463
463
|
}
|
|
464
|
-
return {
|
|
464
|
+
return { ok: true, result: empty };
|
|
465
465
|
}
|
|
466
466
|
const graph = buildReverseDependencyGraph(root);
|
|
467
467
|
const packages = analyzePackageImpact(changed, graph);
|
|
@@ -498,7 +498,7 @@ var docs_default = defineCommand({
|
|
|
498
498
|
recommendations
|
|
499
499
|
}));
|
|
500
500
|
}
|
|
501
|
-
return {
|
|
501
|
+
return { ok: true, result };
|
|
502
502
|
}
|
|
503
503
|
}
|
|
504
504
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/doc-analyzer.ts","../../../src/core/impact-rules.ts","../../../src/core/formatter.ts","../../../src/cli/commands/docs.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":";;;;;;;AAIO,SAAS,kBAAkB,GAAA,EAAsB;AACtD,EAAA,IAAI,GAAA,GAAM,OAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,aAAa,CAAC,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,gBAAgB,CAAC,CAAA,EAAG;AAC1F,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAChC,IAAA,IAAI,WAAW,GAAA,EAAK;AAAC,MAAA;AAAA,IAAM;AAC3B,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAC9F;AAOO,SAAS,aAAa,aAAA,EAAkC;AAC7D,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,aAAA,EAAe,aAAa,CAAA;AAExD,EAAA,IAAI,UAAA,CAAW,cAAc,CAAA,EAAG;AAC9B,IAAA,OAAO,2BAAA,CAA4B,gBAAgB,aAAa,CAAA;AAAA,EAClE;AAGA,EAAA,OAAO,eAAe,aAAa,CAAA;AACrC;AAEA,SAAS,2BAAA,CAA4B,gBAAwB,aAAA,EAAkC;AAC7F,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,cAAA,EAAgB,OAAO,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,CAAS,wBAAwB,CAAA;AAC7D,IAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,MAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,IAAA,EAAK;AACtC,MAAA,IAAI,CAAC,OAAA,EAAS;AAAC,QAAA;AAAA,MAAS;AAExB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,EAAe,OAAO,CAAA;AAC5C,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA,IAAK,CAAC,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,cAAc,CAAC,CAAA,EAAG;AACtF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,EAAA,CAAG,CAAA,CAAE,CAAA,IAAK,OAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AACnE,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,aAAA,EAAkC;AACxD,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,SAAS,WAAA,CAAY,aAAA,EAAe,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AACvE,MAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,IAAK,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,KAAA,CAAM,IAAA,KAAS,cAAA,EAAgB;AAAC,QAAA;AAAA,MAAS;AACnG,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,EAAe,KAAA,CAAM,IAAI,CAAA;AAC/C,MAAA,IAAI,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA,IAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,cAAc,CAAC,CAAA,EAAG;AACpF,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,UAAU,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AClEA,SAAS,GAAA,CAAI,KAAa,IAAA,EAAsB;AAC9C,EAAA,IAAI;AACF,IAAA,OAAO,SAAS,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA,EAAI,EAAE,KAAK,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,CAAC,QAAQ,MAAA,EAAQ,MAAM,CAAA,EAAG,EAAE,IAAA,EAAK;AAAA,EACnG,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEA,SAAS,mBAAA,CAAoB,eAAuB,QAAA,EAA0B;AAC5E,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,EAAe,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAE,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACrB;AAEA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,OAAO,GAAA,CAAI,UAAU,gBAAgB,CAAA;AACvC;AAEA,SAAS,kBAAA,CAAmB,eAAuB,IAAA,EAAiC;AAClF,EAAA,MAAM,YAAA,GAAeA,IAAAA,CAAK,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AAClD,EAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AACjD,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,IAAI,CAACC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAE5B,IAAA,MAAM,WAAA,GAAcD,IAAAA,CAAK,YAAA,EAAc,cAAc,CAAA;AACrD,IAAA,IAAI,CAACC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAAC,MAAA,OAAO,EAAC;AAAA,IAAE;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AACzD,MAAA,IAAI,GAAA,CAAI,IAAA,EAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACrC,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,MAAM,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,CAAA,EAAG,CAAA;AAAA,MACnE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAa;AACrB,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAASC,WAAAA,CAAY,WAAA,EAAa,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,EAAG;AACrE,IAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAClE,IAAA,MAAM,WAAA,GAAcH,IAAAA,CAAK,WAAA,EAAa,KAAA,CAAM,MAAM,cAAc,CAAA;AAChE,IAAA,IAAI,CAACC,UAAAA,CAAW,WAAW,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AACzD,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAGlD,MAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AAC/D,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,IAAA,GAAO,IAAI,YAAA,EAAc,CAAA,KAAA,EAAQ,UAAU,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,KAAA,CAAO,CAAA;AACpG,QAAA,YAAA,GAAe,IAAA,GAAO,KAAK,KAAA,CAAM,IAAI,EAAE,MAAA,CAAO,OAAO,EAAE,MAAA,GAAS,CAAA;AAAA,MAClE,CAAA,MAAO;AAEL,QAAA,MAAM,SAAS,GAAA,CAAI,YAAA,EAAc,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,KAAA,CAAO,CAAA;AACpF,QAAA,YAAA,GAAe,MAAA,GAAS,OAAO,KAAA,CAAM,IAAI,EAAE,MAAA,CAAO,OAAO,EAAE,MAAA,GAAS,CAAA;AAAA,MACtE;AAEA,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,CAAA;AAAA,MAChE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAa;AAAA,EACvB;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,sBAAsB,aAAA,EAAyC;AAC7E,EAAA,MAAM,KAAA,GAAQ,aAAa,aAAa,CAAA;AACxC,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAA,GAAWF,IAAAA,CAAK,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,CAACC,UAAAA,CAAWD,IAAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAEnD,IAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,cAAc,QAAQ,CAAA;AAGxC,IAAA,IAAI,UAAA,IAAc,eAAe,SAAA,EAAW;AAAC,MAAA;AAAA,IAAS;AAGtD,IAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,QAAA,EAAU,oBAAoB,CAAA;AAChD,MAAA,IAAI,CAAC,KAAA,EAAO;AAAC,QAAA;AAAA,MAAS;AAAA,IACxB;AAEA,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,aAAA,EAAe,IAAI,CAAA;AACnD,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,OAAA;AACT;AC3FA,SAAS,iBAAiB,aAAA,EAA8E;AACtG,EAAA,MAAM,KAAA,GAAQ,aAAa,aAAa,CAAA;AACxC,EAAA,MAAM,WAAkE,EAAC;AAEzE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,YAAA,GAAeA,IAAAA,CAAK,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AAClD,IAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AAEjD,IAAA,MAAM,IAAA,GAAOC,UAAAA,CAAW,WAAW,CAAA,GAC/BE,YAAY,WAAA,EAAa,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA,CAC7C,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,WAAA,EAAY,IAAK,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,GAAG,CAAC,EACxD,GAAA,CAAI,CAAC,CAAA,KAAMH,IAAAA,CAAK,aAAa,CAAA,CAAE,IAAI,CAAC,CAAA,GACvC,CAAC,YAAY,CAAA;AAEjB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AACxC,MAAA,IAAI,CAACC,UAAAA,CAAW,OAAO,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AACrD,QAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AAAC,UAAA;AAAA,QAAS;AAClD,QAAA,MAAM,OAAA,GAAU,EAAE,GAAG,GAAA,CAAI,YAAA,EAAa;AACtC,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAC3E,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,MAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,MACjE,CAAA,CAAA,MAAQ;AAAA,MAAa;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,4BAA4B,aAAA,EAAkD;AAC5F,EAAA,MAAM,QAAA,GAAW,iBAAiB,aAAa,CAAA;AAC/C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA0B;AAG5C,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,CAAM,GAAA,CAAI,IAAI,IAAA,EAAM;AAAA,MAClB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,WAAW,GAAA,CAAI,IAAA;AAAA,MACf,YAAY;AAAC,KACd,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAI,IAAA,EAAM;AAC1B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;AC1DO,SAAS,oBAAA,CACd,SACA,KAAA,EACsF;AACtF,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,MAAM,YAA6B,EAAC;AACpC,EAAA,MAAM,aAA8B,EAAC;AAErC,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACvD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAG7B,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,KAAA,EAAO,QAAA;AAAA,MACP,cAAc,GAAA,CAAI;AAAA,KACnB,CAAA;AACD,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,QAAgD,EAAC;AAEvD,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAAC,MAAA;AAAA,IAAS;AACrB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,UAAA,EAAY;AACjC,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,GAAG,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM;AACpC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAC9B,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAEb,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAAC,MAAA;AAAA,IAAS;AAGrB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/E,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAA,EAAO,KAAA,KAAU,CAAA,GAAI,WAAA,GAAc,YAAA;AAAA,MACnC,MAAA,EAAQ,SAAA,GAAY,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,GAAK;AAAA,KAClD;AAEA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AAAA,IACxB;AAGA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,UAAA,EAAY;AACjC,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,KAAK,KAAA,EAAO,KAAA,GAAQ,GAAG,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAW;AACzC;;;ACnEA,SAAS,WAAA,CAAY,aAAqB,OAAA,EAA0B;AAClE,EAAA,IAAI,YAAY,WAAA,EAAa;AAAC,IAAA,OAAO,IAAA;AAAA,EAAK;AAC1C,EAAA,IAAI,YAAY,iBAAA,EAAmB;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAGjD,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,IAAA,OAAO,YAAY,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,gBAAA,CACd,kBACA,MAAA,EACmE;AACnE,EAAA,MAAM,QAAqB,EAAC;AAC5B,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,MAAM,UAAuB,EAAC;AAE9B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,EAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,QAAA,EAAU;AAClC,MAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AAAC,QAAA;AAAA,MAAS;AAElD,MAAA,IAAI,IAAA,CAAK,WAAW,SAAA,EAAW;AAC7B,QAAA,MAAM,GAAA,GAAM,CAAA,QAAA,EAAW,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,CAAA;AACzC,QAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,UAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAChB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,MAAA,EAAQ,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,QAAA,CAAA;AAAA,YACnB,MAAA,EAAQ,SAAA;AAAA,YACR,SAAS,IAAA,CAAK;AAAA,WACf,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,IAAQ,EAAC,EAAG;AACjC,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAM,IAAI,GAAG,CAAA,CAAA;AACjC,QAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AAAC,UAAA;AAAA,QAAS;AACjC,QAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAEhB,QAAA,MAAM,MAAA,GAAoB;AAAA,UACxB,IAAA,EAAM,GAAA;AAAA,UACN,MAAA,EAAQ,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,QAAA,CAAA;AAAA,UACnB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,SAAS,IAAA,CAAK;AAAA,SAChB;AAEA,QAAA,IAAI,IAAA,CAAK,WAAW,YAAA,EAAc;AAAC,UAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,QAAE,CAAA,MACjD;AAAC,UAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,QAAE;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ;AAClC;AC7DA,eAAsB,gBAAgB,WAAA,EAAmG;AACvI,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AACjC,MAAA,IAAI,MAAA,EAAQ,UAAU,MAAA,EAAQ;AAAC,QAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS;AAAA,MAAE;AAAA,IACtE,CAAA,CAAA,MAAQ;AAAA,IAA6B;AAAA,EACvC;AACA,EAAA,OAAO,qBAAA;AACT;;;ACRA,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,KAAA,GAAQ,SAAA;AACd,IAAM,GAAA,GAAM,UAAA;AACZ,IAAM,MAAA,GAAS,UAAA;AACf,IAAM,KAAA,GAAQ,UAAA;AACd,IAAM,IAAA,GAAO,UAAA;AAEN,SAAS,oBAAoB,MAAA,EAAsC;AACxE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,yBAAA,EAAqB,KAAK,CAAA,CAAE,CAAA;AAC9C,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,UAAA,KAAe,MAAA,CAAO,QAAA;AACjD,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,GAAS,SAAA,CAAU,SAAS,UAAA,CAAW,MAAA;AAEhE,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,wBAAA,EAAoB,KAAK,CAAA,CAAE,CAAA;AAE7C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AACzD,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,CAAE,IAAI,IAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,QAAA,EAAM,CAAA,CAAE,YAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,iBAAiB,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,QAAA,CAAU,CAAA;AAAA,MACzH;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,WAAA,EAAc,UAAU,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAChE,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,OAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,YAAA,EAAe,WAAW,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,OAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAoBA,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY,MAAA,CAAO,IAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAEzD,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,oBAAA,EAAgB,KAAK,CAAA,CAAE,CAAA;AAEzC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,OAAA,EAAU,MAAM,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AACxD,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,QAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AACxC,QAAA,IAAI,EAAE,OAAA,EAAS;AAAC,UAAA,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA,YAAA,EAAU,EAAE,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,QAAE;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AACzD,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,QAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,QAAA,EAAM,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,MAC1C;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC1D,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAC5B,QAAA,IAAI,EAAE,OAAA,EAAS;AAAC,UAAA,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA,YAAA,EAAU,EAAE,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,QAAE;AAAA,MACvE;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,MAAA,CAAO,KAAA;AACpC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,MAAA;AAE5C,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,qBAAA,EAAiB,KAAK,CAAA,CAAE,CAAA;AAE1C,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,KAAK,CAAA,UAAA,EAAa,QAAQ,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC5D,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,SAAA,GAAY,CAAA,QAAA,EAAM,CAAA,CAAE,SAAS,CAAA,UAAA,EAAa,CAAA,CAAE,SAAA,KAAc,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAC3F,QAAA,MAAM,SAAS,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,SAAA,GAAY,EAAE,MAAA,IAAU,EAAA;AAC9D,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,OAAA,EAAK,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC5D,QAAA,IAAI,EAAE,OAAA,EAAS;AAAC,UAAA,KAAA,CAAM,IAAA,CAAK,OAAO,IAAI,CAAA,OAAA,EAAK,EAAE,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,QAAE;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,wBAAA,EAAiB,QAAQ,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAC9D,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,SAAS,CAAA,CAAE,KAAA,KAAU,WAAW,mBAAA,GAAsB,CAAA,EAAG,EAAE,MAAM,CAAA,UAAA,CAAA;AACvE,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,GAAG,CAAA,EAAG,EAAE,IAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,OAAA,EAAK,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,MACpE;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,IAAI,MAAA,CAAO,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,8BAAA,EAAuB,KAAK,CAAA,CAAE,CAAA;AAChD,IAAA,KAAA,MAAW,GAAA,IAAO,OAAO,eAAA,EAAiB;AACxC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,IACzB;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,SAAA,KAAc,CAAA,IAAK,SAAA,KAAc,CAAA,IAAK,eAAe,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,0BAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACtHA,IAAO,eAAQ,aAAA,CAA2C;AAAA,EACxD,EAAA,EAAI,aAAA;AAAA,EACJ,WAAA,EAAa,+BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACiC;AACjC,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAU,KAAA;AAE9B,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,iBAAA,EAAkB;AAAA,MAC3B,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,MAAM,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,EAAC,IAAK,CAAA;AAAA,QAAE,CAAA,MAC7E;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,+BAA+B,CAAA;AAAA,QAAE;AACtD,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB;AAEA,MAAA,MAAM,OAAA,GAAU,sBAAsB,IAAI,CAAA;AAC1C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,MAAM,QAAQ,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,SAAS,EAAC,EAAE,EAAG,eAAA,EAAiB,EAAC,EAAE;AAClF,QAAA,IAAI,MAAM,IAAA,EAAM;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,KAAK,CAAA;AAAA,QAAE,CAAA,MAClC;AAAC,UAAA,GAAA,CAAI,EAAA,EAAI,UAAU,qBAAqB,CAAA;AAAA,QAAE;AAC/C,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAM;AAAA,MACtC;AAEA,MAAA,MAAM,KAAA,GAAQ,4BAA4B,IAAI,CAAA;AAC9C,MAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,OAAA,EAAS,KAAK,CAAA;AAEpD,MAAA,MAAM,cAAc,YAAY;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,OAAO,cAAc,CAAA;AACjD,UAAA,OAAO,MAAM,SAAA,EAAuC;AAAA,QACtD,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,WAAW,CAAA;AAC/C,MAAA,MAAM,cAAc,CAAC,GAAG,SAAS,MAAA,EAAQ,GAAG,SAAS,SAAS,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,WAAA,EAAa,KAAK,CAAA;AAChD,MAAA,MAAM,kBAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,KAAA,EAAO;AAC1B,QAAA,IAAI,EAAE,OAAA,EAAS;AAAC,UAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,QAAE;AAAA,MAC5D;AACA,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,OAAA,EAAS;AAC5B,QAAA,IAAI,EAAE,OAAA,EAAS;AAAC,UAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,KAAA,EAAQ,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,QAAE;AAAA,MAC5D;AAEA,MAAA,MAAM,MAAA,GAAS,EAAE,IAAA,EAAM,eAAA,EAAgB;AAEvC,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,mBAAA,CAAoB;AAAA,UAClC,QAAA,EAAU,EAAE,MAAA,EAAQ,EAAC,EAAG,WAAW,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,UACtD,IAAA;AAAA,UACA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,UAElC;AAAA,SACD,CAAC,CAAA;AAAA,MACJ;AAEA,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAA,EAAO;AAAA,IAC/B;AAAA;AAEJ,CAAC","file":"docs.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeDocImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface DocsFlags {\n json?: boolean;\n}\n\ninterface DocsInput {\n argv: string[];\n flags: DocsFlags;\n}\n\nexport default defineCommand<unknown, DocsInput, unknown>({\n id: 'impact:docs',\n description: 'Documentation impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: DocsInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as DocsFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ docs: { stale: [], review: [], reindex: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { docs: { stale: [], review: [], reindex: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent];\n const docs = analyzeDocImpact(allImpacted, rules);\n const recommendations: string[] = [];\n for (const d of docs.stale) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n for (const d of docs.reindex) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n\n const result = { docs, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages: { direct: [], dependent: [], transitive: [] },\n docs,\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations,\n }));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/doc-analyzer.ts","../../../src/core/impact-rules.ts","../../../src/core/formatter.ts","../../../src/cli/commands/docs.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":"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","file":"docs.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeDocImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface DocsFlags {\n json?: boolean;\n}\n\ninterface DocsInput {\n argv: string[];\n flags: DocsFlags;\n}\n\nexport default defineCommand<unknown, DocsInput, unknown>({\n id: 'impact:docs',\n description: 'Documentation impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: DocsInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as DocsFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ docs: { stale: [], review: [], reindex: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { ok: false, error: 'Could not find workspace root' };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { docs: { stale: [], review: [], reindex: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { ok: true, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent];\n const docs = analyzeDocImpact(allImpacted, rules);\n const recommendations: string[] = [];\n for (const d of docs.stale) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n for (const d of docs.reindex) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n\n const result = { docs, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages: { direct: [], dependent: [], transitive: [] },\n docs,\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations,\n }));\n }\n\n return { ok: true, result };\n },\n },\n});\n"]}
|
|
@@ -570,7 +570,7 @@ var packages_default = defineCommand({
|
|
|
570
570
|
} else {
|
|
571
571
|
ctx.ui?.warn?.("Could not find workspace root");
|
|
572
572
|
}
|
|
573
|
-
return {
|
|
573
|
+
return { ok: false, error: "Could not find workspace root" };
|
|
574
574
|
}
|
|
575
575
|
const changed = detectChangedPackages(root);
|
|
576
576
|
if (changed.length === 0) {
|
|
@@ -580,7 +580,7 @@ var packages_default = defineCommand({
|
|
|
580
580
|
} else {
|
|
581
581
|
ctx.ui?.success?.("No changes detected");
|
|
582
582
|
}
|
|
583
|
-
return {
|
|
583
|
+
return { ok: true, result: empty };
|
|
584
584
|
}
|
|
585
585
|
const graph = buildReverseDependencyGraph(root);
|
|
586
586
|
const packages = analyzePackageImpact(changed, graph);
|
|
@@ -600,7 +600,7 @@ var packages_default = defineCommand({
|
|
|
600
600
|
recommendations
|
|
601
601
|
}));
|
|
602
602
|
}
|
|
603
|
-
return {
|
|
603
|
+
return { ok: true, result };
|
|
604
604
|
}
|
|
605
605
|
}
|
|
606
606
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/test-analyzer.ts","../../../src/core/build-analyzer.ts","../../../src/core/formatter.ts","../../../src/cli/commands/packages.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":"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","file":"packages.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageImpact, TestImpact } from '@kb-labs/impact-contracts';\n\nconst TEST_DIRS = ['tests', 'test', '__tests__'];\nconst TEST_PATTERNS = ['.test.ts', '.spec.ts', '.test.tsx', '.spec.tsx'];\n\nfunction findPackageDir(workspaceRoot: string, repo: string, packageName: string): string | null {\n const repoPath = join(workspaceRoot, repo);\n const packagesDir = join(repoPath, 'packages');\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — the repo itself is the package\n return repoPath;\n }\n\n // Search for the package by name in package.json files\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name === packageName) {\n return join(packagesDir, entry.name);\n }\n } catch { /* skip */ }\n }\n\n return null;\n}\n\nfunction countTestFiles(dir: string): number {\n let count = 0;\n\n function walk(d: string): void {\n if (!existsSync(d)) {return;}\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {continue;}\n const full = join(d, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (TEST_PATTERNS.some((p) => entry.name.endsWith(p))) {\n count++;\n }\n }\n }\n\n walk(dir);\n return count;\n}\n\nfunction detectTests(packageDir: string): { hasTests: boolean; testCount: number } {\n // Check dedicated test directories\n for (const testDir of TEST_DIRS) {\n const fullPath = join(packageDir, testDir);\n if (existsSync(fullPath)) {\n const count = countTestFiles(fullPath);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n }\n\n // Also check src/ for co-located test files\n const srcDir = join(packageDir, 'src');\n if (existsSync(srcDir)) {\n const count = countTestFiles(srcDir);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n\n return { hasTests: false, testCount: 0 };\n}\n\nexport function analyzeTestImpact(\n allImpacted: PackageImpact[],\n workspaceRoot: string,\n): { mustRun: TestImpact[]; noTests: TestImpact[] } {\n const mustRun: TestImpact[] = [];\n const noTests: TestImpact[] = [];\n\n for (const pkg of allImpacted) {\n const pkgDir = findPackageDir(workspaceRoot, pkg.repo, pkg.name);\n const { hasTests, testCount } = pkgDir ? detectTests(pkgDir) : { hasTests: false, testCount: 0 };\n\n const impact: TestImpact = {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n reason: pkg.reason,\n hasTests,\n testCount: hasTests ? testCount : undefined,\n command: hasTests ? `pnpm --filter ${pkg.name} run test` : undefined,\n };\n\n if (hasTests) {\n mustRun.push(impact);\n } else {\n noTests.push(impact);\n }\n }\n\n return { mustRun, noTests };\n}\n","import type { BuildImpact, BuildPlan, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\n/**\n * Topological sort of impacted packages — returns correct build order.\n * Uses Kahn's algorithm on the subgraph of only affected packages.\n */\nexport function analyzeBuildImpact(\n allImpacted: PackageImpact[],\n graph: Map<string, DepGraphNode>,\n): BuildPlan {\n const impactedNames = new Set(allImpacted.map((p) => p.name));\n const impactedMap = new Map(allImpacted.map((p) => [p.name, p]));\n\n // Build subgraph of only impacted packages\n const inDegree = new Map<string, number>();\n const deps = new Map<string, string[]>(); // name → deps that are also impacted\n\n for (const name of impactedNames) {\n const node = graph.get(name);\n const filteredDeps = (node?.dependsOn ?? []).filter((d) => impactedNames.has(d));\n deps.set(name, filteredDeps);\n inDegree.set(name, filteredDeps.length);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {queue.push(name);}\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n // Find packages that depend on current (and are in our impacted set)\n const node = graph.get(current);\n if (node) {\n for (const dependent of node.dependedBy) {\n if (!impactedNames.has(dependent)) {continue;}\n const deg = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, deg);\n if (deg === 0) {queue.push(dependent);}\n }\n }\n }\n\n // If some packages weren't reached (circular deps), append them at the end\n for (const name of impactedNames) {\n if (!sorted.includes(name)) {sorted.push(name);}\n }\n\n const steps: BuildImpact[] = sorted.map((name, idx) => {\n const pkg = impactedMap.get(name)!;\n return {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n order: idx + 1,\n reason: pkg.reason,\n };\n });\n\n // Generate a single command that builds in order\n const filterArgs = sorted.map((name) => `--filter ${name}`).join(' ');\n const command = sorted.length > 0\n ? `pnpm ${filterArgs} run build`\n : '';\n\n return {\n steps,\n command,\n totalPackages: steps.length,\n };\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n formatHumanReadable,\n generateRecommendations,\n} from '../../core/index.js';\n\ninterface PkgFlags {\n json?: boolean;\n}\n\ninterface PkgInput {\n argv: string[];\n flags: PkgFlags;\n}\n\nexport default defineCommand<unknown, PkgInput, unknown>({\n id: 'impact:packages',\n description: 'Package dependency impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: PkgInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as PkgFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ packages: { direct: [], dependent: [], transitive: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { packages: { direct: [], dependent: [], transitive: [] }, tests: { mustRun: [], noTests: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, { stale: [], review: [], reindex: [] });\n const result = { packages, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages,\n docs: { stale: [], review: [], reindex: [] },\n tests,\n build,\n recommendations,\n }));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/core/workspace.ts","../../../src/core/changed-packages.ts","../../../src/core/dependency-graph.ts","../../../src/core/package-analyzer.ts","../../../src/core/test-analyzer.ts","../../../src/core/build-analyzer.ts","../../../src/core/formatter.ts","../../../src/cli/commands/packages.ts"],"names":["join","existsSync","readFileSync","readdirSync"],"mappings":"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","file":"packages.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageImpact, TestImpact } from '@kb-labs/impact-contracts';\n\nconst TEST_DIRS = ['tests', 'test', '__tests__'];\nconst TEST_PATTERNS = ['.test.ts', '.spec.ts', '.test.tsx', '.spec.tsx'];\n\nfunction findPackageDir(workspaceRoot: string, repo: string, packageName: string): string | null {\n const repoPath = join(workspaceRoot, repo);\n const packagesDir = join(repoPath, 'packages');\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — the repo itself is the package\n return repoPath;\n }\n\n // Search for the package by name in package.json files\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name === packageName) {\n return join(packagesDir, entry.name);\n }\n } catch { /* skip */ }\n }\n\n return null;\n}\n\nfunction countTestFiles(dir: string): number {\n let count = 0;\n\n function walk(d: string): void {\n if (!existsSync(d)) {return;}\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {continue;}\n const full = join(d, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (TEST_PATTERNS.some((p) => entry.name.endsWith(p))) {\n count++;\n }\n }\n }\n\n walk(dir);\n return count;\n}\n\nfunction detectTests(packageDir: string): { hasTests: boolean; testCount: number } {\n // Check dedicated test directories\n for (const testDir of TEST_DIRS) {\n const fullPath = join(packageDir, testDir);\n if (existsSync(fullPath)) {\n const count = countTestFiles(fullPath);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n }\n\n // Also check src/ for co-located test files\n const srcDir = join(packageDir, 'src');\n if (existsSync(srcDir)) {\n const count = countTestFiles(srcDir);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n\n return { hasTests: false, testCount: 0 };\n}\n\nexport function analyzeTestImpact(\n allImpacted: PackageImpact[],\n workspaceRoot: string,\n): { mustRun: TestImpact[]; noTests: TestImpact[] } {\n const mustRun: TestImpact[] = [];\n const noTests: TestImpact[] = [];\n\n for (const pkg of allImpacted) {\n const pkgDir = findPackageDir(workspaceRoot, pkg.repo, pkg.name);\n const { hasTests, testCount } = pkgDir ? detectTests(pkgDir) : { hasTests: false, testCount: 0 };\n\n const impact: TestImpact = {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n reason: pkg.reason,\n hasTests,\n testCount: hasTests ? testCount : undefined,\n command: hasTests ? `pnpm --filter ${pkg.name} run test` : undefined,\n };\n\n if (hasTests) {\n mustRun.push(impact);\n } else {\n noTests.push(impact);\n }\n }\n\n return { mustRun, noTests };\n}\n","import type { BuildImpact, BuildPlan, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\n/**\n * Topological sort of impacted packages — returns correct build order.\n * Uses Kahn's algorithm on the subgraph of only affected packages.\n */\nexport function analyzeBuildImpact(\n allImpacted: PackageImpact[],\n graph: Map<string, DepGraphNode>,\n): BuildPlan {\n const impactedNames = new Set(allImpacted.map((p) => p.name));\n const impactedMap = new Map(allImpacted.map((p) => [p.name, p]));\n\n // Build subgraph of only impacted packages\n const inDegree = new Map<string, number>();\n const deps = new Map<string, string[]>(); // name → deps that are also impacted\n\n for (const name of impactedNames) {\n const node = graph.get(name);\n const filteredDeps = (node?.dependsOn ?? []).filter((d) => impactedNames.has(d));\n deps.set(name, filteredDeps);\n inDegree.set(name, filteredDeps.length);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {queue.push(name);}\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n // Find packages that depend on current (and are in our impacted set)\n const node = graph.get(current);\n if (node) {\n for (const dependent of node.dependedBy) {\n if (!impactedNames.has(dependent)) {continue;}\n const deg = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, deg);\n if (deg === 0) {queue.push(dependent);}\n }\n }\n }\n\n // If some packages weren't reached (circular deps), append them at the end\n for (const name of impactedNames) {\n if (!sorted.includes(name)) {sorted.push(name);}\n }\n\n const steps: BuildImpact[] = sorted.map((name, idx) => {\n const pkg = impactedMap.get(name)!;\n return {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n order: idx + 1,\n reason: pkg.reason,\n };\n });\n\n // Generate a single command that builds in order\n const filterArgs = sorted.map((name) => `--filter ${name}`).join(' ');\n const command = sorted.length > 0\n ? `pnpm ${filterArgs} run build`\n : '';\n\n return {\n steps,\n command,\n totalPackages: steps.length,\n };\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n formatHumanReadable,\n generateRecommendations,\n} from '../../core/index.js';\n\ninterface PkgFlags {\n json?: boolean;\n}\n\ninterface PkgInput {\n argv: string[];\n flags: PkgFlags;\n}\n\nexport default defineCommand<unknown, PkgInput, unknown>({\n id: 'impact:packages',\n description: 'Package dependency impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: PkgInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as PkgFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ packages: { direct: [], dependent: [], transitive: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { ok: false, error: 'Could not find workspace root' };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { packages: { direct: [], dependent: [], transitive: [] }, tests: { mustRun: [], noTests: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { ok: true, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, { stale: [], review: [], reindex: [] });\n const result = { packages, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages,\n docs: { stale: [], review: [], reindex: [] },\n tests,\n build,\n recommendations,\n }));\n }\n\n return { ok: true, result };\n },\n },\n});\n"]}
|
package/dist/cli/index.js
CHANGED
|
@@ -651,7 +651,7 @@ var check_default = defineCommand({
|
|
|
651
651
|
} else {
|
|
652
652
|
ctx.ui?.warn?.("Could not find workspace root");
|
|
653
653
|
}
|
|
654
|
-
return {
|
|
654
|
+
return { ok: false, error: "Could not find workspace root" };
|
|
655
655
|
}
|
|
656
656
|
const changed = detectChangedPackages(root);
|
|
657
657
|
if (changed.length === 0) {
|
|
@@ -660,7 +660,7 @@ var check_default = defineCommand({
|
|
|
660
660
|
} else {
|
|
661
661
|
ctx.ui?.success?.("No changes detected");
|
|
662
662
|
}
|
|
663
|
-
return {
|
|
663
|
+
return { ok: true, result: EMPTY_RESULT };
|
|
664
664
|
}
|
|
665
665
|
const graph = buildReverseDependencyGraph(root);
|
|
666
666
|
const packages = analyzePackageImpact(changed, graph);
|
|
@@ -684,7 +684,7 @@ var check_default = defineCommand({
|
|
|
684
684
|
} else {
|
|
685
685
|
ctx.ui?.write?.(formatHumanReadable(result));
|
|
686
686
|
}
|
|
687
|
-
return {
|
|
687
|
+
return { ok: true, result };
|
|
688
688
|
}
|
|
689
689
|
}
|
|
690
690
|
});
|
|
@@ -703,7 +703,7 @@ var packages_default = defineCommand({
|
|
|
703
703
|
} else {
|
|
704
704
|
ctx.ui?.warn?.("Could not find workspace root");
|
|
705
705
|
}
|
|
706
|
-
return {
|
|
706
|
+
return { ok: false, error: "Could not find workspace root" };
|
|
707
707
|
}
|
|
708
708
|
const changed = detectChangedPackages(root);
|
|
709
709
|
if (changed.length === 0) {
|
|
@@ -713,7 +713,7 @@ var packages_default = defineCommand({
|
|
|
713
713
|
} else {
|
|
714
714
|
ctx.ui?.success?.("No changes detected");
|
|
715
715
|
}
|
|
716
|
-
return {
|
|
716
|
+
return { ok: true, result: empty };
|
|
717
717
|
}
|
|
718
718
|
const graph = buildReverseDependencyGraph(root);
|
|
719
719
|
const packages = analyzePackageImpact(changed, graph);
|
|
@@ -733,7 +733,7 @@ var packages_default = defineCommand({
|
|
|
733
733
|
recommendations
|
|
734
734
|
}));
|
|
735
735
|
}
|
|
736
|
-
return {
|
|
736
|
+
return { ok: true, result };
|
|
737
737
|
}
|
|
738
738
|
}
|
|
739
739
|
});
|
|
@@ -752,7 +752,7 @@ var docs_default = defineCommand({
|
|
|
752
752
|
} else {
|
|
753
753
|
ctx.ui?.warn?.("Could not find workspace root");
|
|
754
754
|
}
|
|
755
|
-
return {
|
|
755
|
+
return { ok: false, error: "Could not find workspace root" };
|
|
756
756
|
}
|
|
757
757
|
const changed = detectChangedPackages(root);
|
|
758
758
|
if (changed.length === 0) {
|
|
@@ -762,7 +762,7 @@ var docs_default = defineCommand({
|
|
|
762
762
|
} else {
|
|
763
763
|
ctx.ui?.success?.("No changes detected");
|
|
764
764
|
}
|
|
765
|
-
return {
|
|
765
|
+
return { ok: true, result: empty };
|
|
766
766
|
}
|
|
767
767
|
const graph = buildReverseDependencyGraph(root);
|
|
768
768
|
const packages = analyzePackageImpact(changed, graph);
|
|
@@ -800,7 +800,7 @@ var docs_default = defineCommand({
|
|
|
800
800
|
recommendations
|
|
801
801
|
}));
|
|
802
802
|
}
|
|
803
|
-
return {
|
|
803
|
+
return { ok: true, result };
|
|
804
804
|
}
|
|
805
805
|
}
|
|
806
806
|
});
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/workspace.ts","../../src/core/changed-packages.ts","../../src/core/dependency-graph.ts","../../src/core/package-analyzer.ts","../../src/core/doc-analyzer.ts","../../src/core/test-analyzer.ts","../../src/core/build-analyzer.ts","../../src/core/impact-rules.ts","../../src/core/formatter.ts","../../src/cli/commands/check.ts","../../src/cli/commands/packages.ts","../../src/cli/commands/docs.ts"],"names":["join","existsSync","readFileSync","readdirSync","defineCommand"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageImpact, TestImpact } from '@kb-labs/impact-contracts';\n\nconst TEST_DIRS = ['tests', 'test', '__tests__'];\nconst TEST_PATTERNS = ['.test.ts', '.spec.ts', '.test.tsx', '.spec.tsx'];\n\nfunction findPackageDir(workspaceRoot: string, repo: string, packageName: string): string | null {\n const repoPath = join(workspaceRoot, repo);\n const packagesDir = join(repoPath, 'packages');\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — the repo itself is the package\n return repoPath;\n }\n\n // Search for the package by name in package.json files\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name === packageName) {\n return join(packagesDir, entry.name);\n }\n } catch { /* skip */ }\n }\n\n return null;\n}\n\nfunction countTestFiles(dir: string): number {\n let count = 0;\n\n function walk(d: string): void {\n if (!existsSync(d)) {return;}\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {continue;}\n const full = join(d, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (TEST_PATTERNS.some((p) => entry.name.endsWith(p))) {\n count++;\n }\n }\n }\n\n walk(dir);\n return count;\n}\n\nfunction detectTests(packageDir: string): { hasTests: boolean; testCount: number } {\n // Check dedicated test directories\n for (const testDir of TEST_DIRS) {\n const fullPath = join(packageDir, testDir);\n if (existsSync(fullPath)) {\n const count = countTestFiles(fullPath);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n }\n\n // Also check src/ for co-located test files\n const srcDir = join(packageDir, 'src');\n if (existsSync(srcDir)) {\n const count = countTestFiles(srcDir);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n\n return { hasTests: false, testCount: 0 };\n}\n\nexport function analyzeTestImpact(\n allImpacted: PackageImpact[],\n workspaceRoot: string,\n): { mustRun: TestImpact[]; noTests: TestImpact[] } {\n const mustRun: TestImpact[] = [];\n const noTests: TestImpact[] = [];\n\n for (const pkg of allImpacted) {\n const pkgDir = findPackageDir(workspaceRoot, pkg.repo, pkg.name);\n const { hasTests, testCount } = pkgDir ? detectTests(pkgDir) : { hasTests: false, testCount: 0 };\n\n const impact: TestImpact = {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n reason: pkg.reason,\n hasTests,\n testCount: hasTests ? testCount : undefined,\n command: hasTests ? `pnpm --filter ${pkg.name} run test` : undefined,\n };\n\n if (hasTests) {\n mustRun.push(impact);\n } else {\n noTests.push(impact);\n }\n }\n\n return { mustRun, noTests };\n}\n","import type { BuildImpact, BuildPlan, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\n/**\n * Topological sort of impacted packages — returns correct build order.\n * Uses Kahn's algorithm on the subgraph of only affected packages.\n */\nexport function analyzeBuildImpact(\n allImpacted: PackageImpact[],\n graph: Map<string, DepGraphNode>,\n): BuildPlan {\n const impactedNames = new Set(allImpacted.map((p) => p.name));\n const impactedMap = new Map(allImpacted.map((p) => [p.name, p]));\n\n // Build subgraph of only impacted packages\n const inDegree = new Map<string, number>();\n const deps = new Map<string, string[]>(); // name → deps that are also impacted\n\n for (const name of impactedNames) {\n const node = graph.get(name);\n const filteredDeps = (node?.dependsOn ?? []).filter((d) => impactedNames.has(d));\n deps.set(name, filteredDeps);\n inDegree.set(name, filteredDeps.length);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {queue.push(name);}\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n // Find packages that depend on current (and are in our impacted set)\n const node = graph.get(current);\n if (node) {\n for (const dependent of node.dependedBy) {\n if (!impactedNames.has(dependent)) {continue;}\n const deg = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, deg);\n if (deg === 0) {queue.push(dependent);}\n }\n }\n }\n\n // If some packages weren't reached (circular deps), append them at the end\n for (const name of impactedNames) {\n if (!sorted.includes(name)) {sorted.push(name);}\n }\n\n const steps: BuildImpact[] = sorted.map((name, idx) => {\n const pkg = impactedMap.get(name)!;\n return {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n order: idx + 1,\n reason: pkg.reason,\n };\n });\n\n // Generate a single command that builds in order\n const filterArgs = sorted.map((name) => `--filter ${name}`).join(' ');\n const command = sorted.length > 0\n ? `pnpm ${filterArgs} run build`\n : '';\n\n return {\n steps,\n command,\n totalPackages: steps.length,\n };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactAnalysisResult, ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n generateRecommendations,\n analyzeDocImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface CheckFlags {\n json?: boolean;\n}\n\ninterface CheckInput {\n argv: string[];\n flags: CheckFlags;\n}\n\nconst EMPTY_RESULT: ImpactAnalysisResult = {\n packages: { direct: [], dependent: [], transitive: [] },\n docs: { stale: [], review: [], reindex: [] },\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations: [],\n};\n\nexport default defineCommand<unknown, CheckInput, ImpactAnalysisResult>({\n id: 'impact:check',\n description: 'Full impact analysis (packages + docs)',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: CheckInput,\n ): Promise<CommandResult<ImpactAnalysisResult>> {\n const flags = input.flags ?? (input as unknown as CheckFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: EMPTY_RESULT };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const docs = analyzeDocImpact(allImpacted, rules);\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, docs);\n const result: ImpactAnalysisResult = { packages, docs, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable(result));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n formatHumanReadable,\n generateRecommendations,\n} from '../../core/index.js';\n\ninterface PkgFlags {\n json?: boolean;\n}\n\ninterface PkgInput {\n argv: string[];\n flags: PkgFlags;\n}\n\nexport default defineCommand<unknown, PkgInput, unknown>({\n id: 'impact:packages',\n description: 'Package dependency impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: PkgInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as PkgFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ packages: { direct: [], dependent: [], transitive: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { packages: { direct: [], dependent: [], transitive: [] }, tests: { mustRun: [], noTests: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, { stale: [], review: [], reindex: [] });\n const result = { packages, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages,\n docs: { stale: [], review: [], reindex: [] },\n tests,\n build,\n recommendations,\n }));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeDocImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface DocsFlags {\n json?: boolean;\n}\n\ninterface DocsInput {\n argv: string[];\n flags: DocsFlags;\n}\n\nexport default defineCommand<unknown, DocsInput, unknown>({\n id: 'impact:docs',\n description: 'Documentation impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: DocsInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as DocsFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ docs: { stale: [], review: [], reindex: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { exitCode: 1 };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { docs: { stale: [], review: [], reindex: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { exitCode: 0, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent];\n const docs = analyzeDocImpact(allImpacted, rules);\n const recommendations: string[] = [];\n for (const d of docs.stale) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n for (const d of docs.reindex) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n\n const result = { docs, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages: { direct: [], dependent: [], transitive: [] },\n docs,\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations,\n }));\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/workspace.ts","../../src/core/changed-packages.ts","../../src/core/dependency-graph.ts","../../src/core/package-analyzer.ts","../../src/core/doc-analyzer.ts","../../src/core/test-analyzer.ts","../../src/core/build-analyzer.ts","../../src/core/impact-rules.ts","../../src/core/formatter.ts","../../src/cli/commands/check.ts","../../src/cli/commands/packages.ts","../../src/cli/commands/docs.ts"],"names":["join","existsSync","readFileSync","readdirSync","defineCommand"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { SubRepo } from '@kb-labs/impact-contracts';\n\nexport function findWorkspaceRoot(cwd?: string): string {\n let dir = resolve(cwd ?? process.cwd());\n for (let i = 0; i < 10; i++) {\n if (existsSync(join(dir, '.gitmodules')) || existsSync(join(dir, '.kb', 'kb.config.json'))) {\n return dir;\n }\n const parent = resolve(dir, '..');\n if (parent === dir) {break;}\n dir = parent;\n }\n throw new Error('Could not find workspace root (no .gitmodules or .kb/kb.config.json found)');\n}\n\n/**\n * Parse .gitmodules to get submodule paths.\n * Returns entries like { path: \"platform/kb-labs-core\", name: \"kb-labs-core\", category: \"platform\" }.\n * Falls back to scanning top-level dirs for .git (flat layout).\n */\nexport function listSubRepos(workspaceRoot: string): SubRepo[] {\n const gitmodulesPath = join(workspaceRoot, '.gitmodules');\n\n if (existsSync(gitmodulesPath)) {\n return parseSubReposFromGitmodules(gitmodulesPath, workspaceRoot);\n }\n\n // Fallback: flat layout — top-level dirs with .git\n return scanFlatLayout(workspaceRoot);\n}\n\nfunction parseSubReposFromGitmodules(gitmodulesPath: string, workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n const content = readFileSync(gitmodulesPath, 'utf-8');\n const pathMatches = content.matchAll(/^\\s*path\\s*=\\s*(.+)$/gm);\n for (const match of pathMatches) {\n const relPath = (match[1] ?? '').trim();\n if (!relPath) {continue;}\n\n const fullPath = join(workspaceRoot, relPath);\n if (!existsSync(join(fullPath, '.git')) && !existsSync(join(fullPath, 'package.json'))) {\n continue;\n }\n\n const parts = relPath.split('/');\n const name = parts.at(-1) ?? relPath;\n const category = parts.length > 1 ? parts.slice(0, -1).join('/') : '';\n repos.push({ path: relPath, category, name });\n }\n } catch {\n // ignore parse errors\n }\n return repos;\n}\n\nfunction scanFlatLayout(workspaceRoot: string): SubRepo[] {\n const repos: SubRepo[] = [];\n try {\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'node_modules') {continue;}\n const fullPath = join(workspaceRoot, entry.name);\n if (existsSync(join(fullPath, '.git')) || existsSync(join(fullPath, 'package.json'))) {\n repos.push({ path: entry.name, category: '', name: entry.name });\n }\n }\n } catch {\n // ignore\n }\n return repos;\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ChangedPackage, SubRepo } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction git(cwd: string, args: string): string {\n try {\n return execSync(`git ${args}`, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return '';\n }\n}\n\nfunction getSubmodulePointer(workspaceRoot: string, repoPath: string): string {\n const out = git(workspaceRoot, `ls-tree HEAD ${repoPath}`);\n const parts = out.split(/\\s+/);\n return parts[2] || '';\n}\n\nfunction getActualHead(fullPath: string): string {\n return git(fullPath, 'rev-parse HEAD');\n}\n\nfunction findPackagesInRepo(workspaceRoot: string, repo: SubRepo): ChangedPackage[] {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n const results: ChangedPackage[] = [];\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — treat entire repo as one package\n const pkgJsonPath = join(fullRepoPath, 'package.json');\n if (!existsSync(pkgJsonPath)) {return [];}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name?.startsWith('@kb-labs/')) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles: 1 });\n }\n } catch { /* skip */ }\n return results;\n }\n\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n\n // Count changed files in this package\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n let changedFiles = 0;\n if (pointerSha) {\n const diff = git(fullRepoPath, `diff ${pointerSha}..HEAD --name-only -- packages/${entry.name}/src/`);\n changedFiles = diff ? diff.split('\\n').filter(Boolean).length : 0;\n } else {\n // Fallback: count dirty files\n const status = git(fullRepoPath, `status --porcelain -- packages/${entry.name}/src/`);\n changedFiles = status ? status.split('\\n').filter(Boolean).length : 0;\n }\n\n if (changedFiles > 0) {\n results.push({ name: pkg.name, repo: repo.path, changedFiles });\n }\n } catch { /* skip */ }\n }\n\n return results;\n}\n\nexport function detectChangedPackages(workspaceRoot: string): ChangedPackage[] {\n const repos = listSubRepos(workspaceRoot);\n const changed: ChangedPackage[] = [];\n\n for (const repo of repos) {\n const fullPath = join(workspaceRoot, repo.path);\n if (!existsSync(join(fullPath, '.git'))) {continue;}\n\n const pointerSha = getSubmodulePointer(workspaceRoot, repo.path);\n const actualSha = getActualHead(fullPath);\n\n // Skip if no changes\n if (pointerSha && pointerSha === actualSha) {continue;}\n\n // Also check dirty working tree\n if (pointerSha === actualSha) {\n const dirty = git(fullPath, 'status --porcelain');\n if (!dirty) {continue;}\n }\n\n const pkgs = findPackagesInRepo(workspaceRoot, repo);\n changed.push(...pkgs);\n }\n\n return changed;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { DepGraphNode } from '@kb-labs/impact-contracts';\nimport { listSubRepos } from './workspace.js';\n\nfunction discoverPackages(workspaceRoot: string): Array<{ name: string; repo: string; deps: string[] }> {\n const repos = listSubRepos(workspaceRoot);\n const packages: Array<{ name: string; repo: string; deps: string[] }> = [];\n\n for (const repo of repos) {\n const fullRepoPath = join(workspaceRoot, repo.path);\n const packagesDir = join(fullRepoPath, 'packages');\n\n const dirs = existsSync(packagesDir)\n ? readdirSync(packagesDir, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith('.'))\n .map((d) => join(packagesDir, d.name))\n : [fullRepoPath]; // repo without packages/\n\n for (const dir of dirs) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n if (!pkg.name?.startsWith('@kb-labs/')) {continue;}\n const allDeps = { ...pkg.dependencies };\n const kbDeps = Object.keys(allDeps).filter((d) => d.startsWith('@kb-labs/'));\n packages.push({ name: pkg.name, repo: repo.path, deps: kbDeps });\n } catch { /* skip */ }\n }\n }\n\n return packages;\n}\n\nexport function buildReverseDependencyGraph(workspaceRoot: string): Map<string, DepGraphNode> {\n const packages = discoverPackages(workspaceRoot);\n const graph = new Map<string, DepGraphNode>();\n\n // Initialize nodes\n for (const pkg of packages) {\n graph.set(pkg.name, {\n name: pkg.name,\n repo: pkg.repo,\n dependsOn: pkg.deps,\n dependedBy: [],\n });\n }\n\n // Build reverse edges\n for (const pkg of packages) {\n for (const dep of pkg.deps) {\n const node = graph.get(dep);\n if (node) {\n node.dependedBy.push(pkg.name);\n }\n }\n }\n\n return graph;\n}\n","import type { ChangedPackage, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\nexport function analyzePackageImpact(\n changed: ChangedPackage[],\n graph: Map<string, DepGraphNode>,\n): { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] } {\n const direct: PackageImpact[] = [];\n const dependent: PackageImpact[] = [];\n const transitive: PackageImpact[] = [];\n\n const changedNames = new Set(changed.map((c) => c.name));\n const seen = new Set<string>();\n\n // Direct — packages that changed\n for (const pkg of changed) {\n direct.push({\n name: pkg.name,\n repo: pkg.repo,\n level: 'direct',\n changedFiles: pkg.changedFiles,\n });\n seen.add(pkg.name);\n }\n\n // BFS from direct to find dependent and transitive\n const queue: Array<{ name: string; depth: number }> = [];\n\n for (const name of changedNames) {\n const node = graph.get(name);\n if (!node) {continue;}\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: 1 });\n }\n }\n }\n\n while (queue.length > 0) {\n const { name, depth } = queue.shift()!;\n if (seen.has(name)) {continue;}\n seen.add(name);\n\n const node = graph.get(name);\n if (!node) {continue;}\n\n // Find reason (which direct/dependent package it depends on)\n const reasonPkg = node.dependsOn.find((d) => changedNames.has(d) || seen.has(d));\n const impact: PackageImpact = {\n name: node.name,\n repo: node.repo,\n level: depth === 1 ? 'dependent' : 'transitive',\n reason: reasonPkg ? `depends on ${reasonPkg}` : undefined,\n };\n\n if (depth === 1) {\n dependent.push(impact);\n } else {\n transitive.push(impact);\n }\n\n // Enqueue next level\n for (const dep of node.dependedBy) {\n if (!seen.has(dep)) {\n queue.push({ name: dep, depth: depth + 1 });\n }\n }\n }\n\n return { direct, dependent, transitive };\n}\n\nexport function generateRecommendations(\n packages: { direct: PackageImpact[]; dependent: PackageImpact[]; transitive: PackageImpact[] },\n docs: { stale: Array<{ file?: string }>; review: Array<{ file?: string }>; reindex: Array<{ command?: string }> },\n): string[] {\n const recs: string[] = [];\n\n if (packages.dependent.length > 0) {\n const names = packages.dependent.map((p) => p.name).join(', ');\n recs.push(`Rebuild ${names}`);\n }\n\n // Collect unique repos that need testing\n const testRepos = new Set([\n ...packages.dependent.map((p) => p.repo),\n ...packages.transitive.map((p) => p.repo),\n ]);\n if (testRepos.size > 0) {\n recs.push(`Run tests in ${[...testRepos].join(', ')}`);\n }\n\n for (const doc of docs.stale) {\n if (doc.file) {recs.push(`Regenerate ${doc.file}`);}\n }\n\n for (const doc of docs.review) {\n if (doc.file) {recs.push(`Review ${doc.file}`);}\n }\n\n for (const doc of docs.reindex) {\n if (doc.command) {recs.push(`Run: ${doc.command}`);}\n }\n\n return recs;\n}\n","import type { DocImpact, ImpactPluginConfig, PackageImpact } from '@kb-labs/impact-contracts';\n\nfunction matchesRule(packageName: string, pattern: string): boolean {\n if (pattern === packageName) {return true;}\n if (pattern === '__new_package__') {return false;} // handled separately\n\n // Simple glob: *-cli matches @kb-labs/agent-cli\n if (pattern.startsWith('*')) {\n return packageName.endsWith(pattern.slice(1));\n }\n if (pattern.endsWith('*')) {\n return packageName.startsWith(pattern.slice(0, -1));\n }\n\n return false;\n}\n\nexport function analyzeDocImpact(\n impactedPackages: PackageImpact[],\n config: ImpactPluginConfig,\n): { stale: DocImpact[]; review: DocImpact[]; reindex: DocImpact[] } {\n const stale: DocImpact[] = [];\n const review: DocImpact[] = [];\n const reindex: DocImpact[] = [];\n\n const seenDocs = new Set<string>();\n\n for (const pkg of impactedPackages) {\n for (const rule of config.docRules) {\n if (!matchesRule(pkg.name, rule.match)) {continue;}\n\n if (rule.action === 'reindex') {\n const key = `reindex:${rule.command ?? ''}`;\n if (!seenDocs.has(key)) {\n seenDocs.add(key);\n reindex.push({\n reason: `${pkg.name} changed`,\n action: 'reindex',\n command: rule.command,\n });\n }\n continue;\n }\n\n for (const doc of rule.docs ?? []) {\n const key = `${rule.action}:${doc}`;\n if (seenDocs.has(key)) {continue;}\n seenDocs.add(key);\n\n const impact: DocImpact = {\n file: doc,\n reason: `${pkg.name} changed`,\n action: rule.action,\n command: rule.command,\n };\n\n if (rule.action === 'regenerate') {stale.push(impact);}\n else {review.push(impact);}\n }\n }\n }\n\n return { stale, review, reindex };\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { PackageImpact, TestImpact } from '@kb-labs/impact-contracts';\n\nconst TEST_DIRS = ['tests', 'test', '__tests__'];\nconst TEST_PATTERNS = ['.test.ts', '.spec.ts', '.test.tsx', '.spec.tsx'];\n\nfunction findPackageDir(workspaceRoot: string, repo: string, packageName: string): string | null {\n const repoPath = join(workspaceRoot, repo);\n const packagesDir = join(repoPath, 'packages');\n\n if (!existsSync(packagesDir)) {\n // Repo without packages/ — the repo itself is the package\n return repoPath;\n }\n\n // Search for the package by name in package.json files\n for (const entry of readdirSync(packagesDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) {continue;}\n const pkgJsonPath = join(packagesDir, entry.name, 'package.json');\n if (!existsSync(pkgJsonPath)) {continue;}\n try {\n const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n if (pkg.name === packageName) {\n return join(packagesDir, entry.name);\n }\n } catch { /* skip */ }\n }\n\n return null;\n}\n\nfunction countTestFiles(dir: string): number {\n let count = 0;\n\n function walk(d: string): void {\n if (!existsSync(d)) {return;}\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.name === 'node_modules' || entry.name === 'dist') {continue;}\n const full = join(d, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (TEST_PATTERNS.some((p) => entry.name.endsWith(p))) {\n count++;\n }\n }\n }\n\n walk(dir);\n return count;\n}\n\nfunction detectTests(packageDir: string): { hasTests: boolean; testCount: number } {\n // Check dedicated test directories\n for (const testDir of TEST_DIRS) {\n const fullPath = join(packageDir, testDir);\n if (existsSync(fullPath)) {\n const count = countTestFiles(fullPath);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n }\n\n // Also check src/ for co-located test files\n const srcDir = join(packageDir, 'src');\n if (existsSync(srcDir)) {\n const count = countTestFiles(srcDir);\n if (count > 0) {return { hasTests: true, testCount: count };}\n }\n\n return { hasTests: false, testCount: 0 };\n}\n\nexport function analyzeTestImpact(\n allImpacted: PackageImpact[],\n workspaceRoot: string,\n): { mustRun: TestImpact[]; noTests: TestImpact[] } {\n const mustRun: TestImpact[] = [];\n const noTests: TestImpact[] = [];\n\n for (const pkg of allImpacted) {\n const pkgDir = findPackageDir(workspaceRoot, pkg.repo, pkg.name);\n const { hasTests, testCount } = pkgDir ? detectTests(pkgDir) : { hasTests: false, testCount: 0 };\n\n const impact: TestImpact = {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n reason: pkg.reason,\n hasTests,\n testCount: hasTests ? testCount : undefined,\n command: hasTests ? `pnpm --filter ${pkg.name} run test` : undefined,\n };\n\n if (hasTests) {\n mustRun.push(impact);\n } else {\n noTests.push(impact);\n }\n }\n\n return { mustRun, noTests };\n}\n","import type { BuildImpact, BuildPlan, DepGraphNode, PackageImpact } from '@kb-labs/impact-contracts';\n\n/**\n * Topological sort of impacted packages — returns correct build order.\n * Uses Kahn's algorithm on the subgraph of only affected packages.\n */\nexport function analyzeBuildImpact(\n allImpacted: PackageImpact[],\n graph: Map<string, DepGraphNode>,\n): BuildPlan {\n const impactedNames = new Set(allImpacted.map((p) => p.name));\n const impactedMap = new Map(allImpacted.map((p) => [p.name, p]));\n\n // Build subgraph of only impacted packages\n const inDegree = new Map<string, number>();\n const deps = new Map<string, string[]>(); // name → deps that are also impacted\n\n for (const name of impactedNames) {\n const node = graph.get(name);\n const filteredDeps = (node?.dependsOn ?? []).filter((d) => impactedNames.has(d));\n deps.set(name, filteredDeps);\n inDegree.set(name, filteredDeps.length);\n }\n\n // Kahn's algorithm\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {queue.push(name);}\n }\n\n const sorted: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n // Find packages that depend on current (and are in our impacted set)\n const node = graph.get(current);\n if (node) {\n for (const dependent of node.dependedBy) {\n if (!impactedNames.has(dependent)) {continue;}\n const deg = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, deg);\n if (deg === 0) {queue.push(dependent);}\n }\n }\n }\n\n // If some packages weren't reached (circular deps), append them at the end\n for (const name of impactedNames) {\n if (!sorted.includes(name)) {sorted.push(name);}\n }\n\n const steps: BuildImpact[] = sorted.map((name, idx) => {\n const pkg = impactedMap.get(name)!;\n return {\n name: pkg.name,\n repo: pkg.repo,\n level: pkg.level,\n order: idx + 1,\n reason: pkg.reason,\n };\n });\n\n // Generate a single command that builds in order\n const filterArgs = sorted.map((name) => `--filter ${name}`).join(' ');\n const command = sorted.length > 0\n ? `pnpm ${filterArgs} run build`\n : '';\n\n return {\n steps,\n command,\n totalPackages: steps.length,\n };\n}\n","import { DEFAULT_IMPACT_CONFIG, type ImpactPluginConfig } from '@kb-labs/impact-contracts';\n\nexport async function loadImpactRules(useConfigFn?: () => Promise<Partial<ImpactPluginConfig> | undefined>): Promise<ImpactPluginConfig> {\n if (useConfigFn) {\n try {\n const config = await useConfigFn();\n if (config?.docRules?.length) {return { docRules: config.docRules };}\n } catch { /* fallback to defaults */ }\n }\n return DEFAULT_IMPACT_CONFIG;\n}\n","import type { ImpactAnalysisResult } from '@kb-labs/impact-contracts';\n\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst YELLOW = '\\x1b[33m';\nconst GREEN = '\\x1b[32m';\nconst CYAN = '\\x1b[36m';\n\nexport function formatHumanReadable(result: ImpactAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`${BOLD}📊 Impact Analysis${RESET}`);\n lines.push('');\n\n // ── Package Impact ──\n const { direct, dependent, transitive } = result.packages;\n const totalPkgs = direct.length + dependent.length + transitive.length;\n\n if (totalPkgs > 0) {\n lines.push(`${BOLD}📦 Package Impact${RESET}`);\n\n if (direct.length > 0) {\n lines.push(` ${GREEN}Direct (${direct.length}):${RESET}`);\n for (const p of direct) {\n lines.push(` ${p.name} ${DIM}(${p.repo})${RESET} — ${p.changedFiles} file${p.changedFiles === 1 ? '' : 's'} changed`);\n }\n }\n\n if (dependent.length > 0) {\n lines.push(` ${YELLOW}Dependent (${dependent.length}):${RESET}`);\n for (const p of dependent) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n if (transitive.length > 0) {\n lines.push(` ${DIM}Transitive (${transitive.length}):${RESET}`);\n for (const p of transitive) {\n lines.push(` ${p.name} ${DIM}← ${p.reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Build Impact ──\n const { steps: buildSteps, command: buildCommand, totalPackages: buildTotal } = result.build;\n\n if (buildTotal > 0) {\n lines.push(`${BOLD}🔨 Build Impact${RESET}`);\n lines.push(` ${YELLOW}Rebuild (${buildTotal} packages in order):${RESET}`);\n for (const b of buildSteps) {\n const reason = b.level === 'direct' ? 'changed' : b.reason ?? '';\n lines.push(` ${DIM}${b.order}.${RESET} ${b.name} ${DIM}← ${reason}${RESET}`);\n }\n if (buildCommand) {\n lines.push('');\n lines.push(` ${CYAN}→ ${buildCommand}${RESET}`);\n }\n lines.push('');\n }\n\n // ── Doc Impact ──\n const { stale, review, reindex } = result.docs;\n const totalDocs = stale.length + review.length + reindex.length;\n\n if (totalDocs > 0) {\n lines.push(`${BOLD}📄 Doc Impact${RESET}`);\n\n if (stale.length > 0) {\n lines.push(` ${YELLOW}Stale (${stale.length}):${RESET}`);\n for (const d of stale) {\n lines.push(` ${d.file} — ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n if (review.length > 0) {\n lines.push(` ${GREEN}Review (${review.length}):${RESET}`);\n for (const d of review) {\n lines.push(` ${d.file} — ${d.reason}`);\n }\n }\n\n if (reindex.length > 0) {\n lines.push(` ${CYAN}Reindex (${reindex.length}):${RESET}`);\n for (const d of reindex) {\n lines.push(` ${d.reason}`);\n if (d.command) {lines.push(` ${CYAN}→ Run: ${d.command}${RESET}`);}\n }\n }\n\n lines.push('');\n }\n\n // ── Test Impact ──\n const { mustRun, noTests } = result.tests;\n const totalTests = mustRun.length + noTests.length;\n\n if (totalTests > 0) {\n lines.push(`${BOLD}🧪 Test Impact${RESET}`);\n\n if (mustRun.length > 0) {\n lines.push(` ${GREEN}Must run (${mustRun.length}):${RESET}`);\n for (const t of mustRun) {\n const count = t.testCount ? ` — ${t.testCount} test file${t.testCount === 1 ? '' : 's'}` : '';\n const reason = t.level === 'direct' ? 'changed' : t.reason ?? '';\n lines.push(` ${t.name}${count} ${DIM}← ${reason}${RESET}`);\n if (t.command) {lines.push(` ${CYAN}→ ${t.command}${RESET}`);}\n }\n }\n\n if (noTests.length > 0) {\n lines.push(` ${RED}⚠️ No tests (${noTests.length}):${RESET}`);\n for (const t of noTests) {\n const reason = t.level === 'direct' ? 'changed, NO TESTS' : `${t.reason}, NO TESTS`;\n lines.push(` ${RED}${t.name}${RESET} ${DIM}← ${reason}${RESET}`);\n }\n }\n\n lines.push('');\n }\n\n // ── Recommendations ──\n if (result.recommendations.length > 0) {\n lines.push(`${BOLD}⚠️ Recommendations:${RESET}`);\n for (const rec of result.recommendations) {\n lines.push(` • ${rec}`);\n }\n lines.push('');\n }\n\n if (totalPkgs === 0 && totalDocs === 0 && totalTests === 0) {\n lines.push(`${GREEN}✅ No impact detected.${RESET}`);\n }\n\n return lines.join('\\n');\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactAnalysisResult, ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n generateRecommendations,\n analyzeDocImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface CheckFlags {\n json?: boolean;\n}\n\ninterface CheckInput {\n argv: string[];\n flags: CheckFlags;\n}\n\nconst EMPTY_RESULT: ImpactAnalysisResult = {\n packages: { direct: [], dependent: [], transitive: [] },\n docs: { stale: [], review: [], reindex: [] },\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations: [],\n};\n\nexport default defineCommand<unknown, CheckInput, ImpactAnalysisResult>({\n id: 'impact:check',\n description: 'Full impact analysis (packages + docs)',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: CheckInput,\n ): Promise<CommandResult<ImpactAnalysisResult>> {\n const flags = input.flags ?? (input as unknown as CheckFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { ok: false, error: 'Could not find workspace root' };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n if (flags.json) {ctx.ui?.json?.(EMPTY_RESULT);}\n else {ctx.ui?.success?.('No changes detected');}\n return { ok: true, result: EMPTY_RESULT };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const docs = analyzeDocImpact(allImpacted, rules);\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, docs);\n const result: ImpactAnalysisResult = { packages, docs, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable(result));\n }\n\n return { ok: true, result };\n },\n },\n});\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeTestImpact,\n analyzeBuildImpact,\n formatHumanReadable,\n generateRecommendations,\n} from '../../core/index.js';\n\ninterface PkgFlags {\n json?: boolean;\n}\n\ninterface PkgInput {\n argv: string[];\n flags: PkgFlags;\n}\n\nexport default defineCommand<unknown, PkgInput, unknown>({\n id: 'impact:packages',\n description: 'Package dependency impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: PkgInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as PkgFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ packages: { direct: [], dependent: [], transitive: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { ok: false, error: 'Could not find workspace root' };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { packages: { direct: [], dependent: [], transitive: [] }, tests: { mustRun: [], noTests: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { ok: true, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n const allImpacted = [...packages.direct, ...packages.dependent, ...packages.transitive];\n const tests = analyzeTestImpact(allImpacted, root);\n const build = analyzeBuildImpact(allImpacted, graph);\n const recommendations = generateRecommendations(packages, { stale: [], review: [], reindex: [] });\n const result = { packages, tests, build, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages,\n docs: { stale: [], review: [], reindex: [] },\n tests,\n build,\n recommendations,\n }));\n }\n\n return { ok: true, result };\n },\n },\n});\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { ImpactPluginConfig } from '@kb-labs/impact-contracts';\nimport {\n findWorkspaceRoot,\n detectChangedPackages,\n buildReverseDependencyGraph,\n analyzePackageImpact,\n analyzeDocImpact,\n loadImpactRules,\n formatHumanReadable,\n} from '../../core/index.js';\n\ninterface DocsFlags {\n json?: boolean;\n}\n\ninterface DocsInput {\n argv: string[];\n flags: DocsFlags;\n}\n\nexport default defineCommand<unknown, DocsInput, unknown>({\n id: 'impact:docs',\n description: 'Documentation impact analysis',\n\n handler: {\n async execute(\n ctx: PluginContextV3<unknown>,\n input: DocsInput,\n ): Promise<CommandResult<unknown>> {\n const flags = input.flags ?? (input as unknown as DocsFlags);\n\n let root: string;\n try {\n root = findWorkspaceRoot();\n } catch {\n if (flags.json) {ctx.ui?.json?.({ docs: { stale: [], review: [], reindex: [] } });}\n else {ctx.ui?.warn?.('Could not find workspace root');}\n return { ok: false, error: 'Could not find workspace root' };\n }\n\n const changed = detectChangedPackages(root);\n if (changed.length === 0) {\n const empty = { docs: { stale: [], review: [], reindex: [] }, recommendations: [] };\n if (flags.json) {ctx.ui?.json?.(empty);}\n else {ctx.ui?.success?.('No changes detected');}\n return { ok: true, result: empty };\n }\n\n const graph = buildReverseDependencyGraph(root);\n const packages = analyzePackageImpact(changed, graph);\n\n const useConfigFn = async () => {\n try {\n const { useConfig } = await import('@kb-labs/sdk');\n return await useConfig<Partial<ImpactPluginConfig>>();\n } catch {\n return undefined;\n }\n };\n\n const rules = await loadImpactRules(useConfigFn);\n const allImpacted = [...packages.direct, ...packages.dependent];\n const docs = analyzeDocImpact(allImpacted, rules);\n const recommendations: string[] = [];\n for (const d of docs.stale) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n for (const d of docs.reindex) {\n if (d.command) {recommendations.push(`Run: ${d.command}`);}\n }\n\n const result = { docs, recommendations };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.write?.(formatHumanReadable({\n packages: { direct: [], dependent: [], transitive: [] },\n docs,\n tests: { mustRun: [], noTests: [] },\n build: { steps: [], command: '', totalPackages: 0 },\n recommendations,\n }));\n }\n\n return { ok: true, result };\n },\n },\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/impact-core",
|
|
3
3
|
"description": "Core implementation of KB Labs Impact Analysis Plugin.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.111.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"type-check": "tsc --noEmit"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@kb-labs/impact-contracts": "^2.
|
|
38
|
+
"@kb-labs/impact-contracts": "^2.111.0",
|
|
39
39
|
"@kb-labs/sdk": "workspace:*",
|
|
40
40
|
"zod": "^3.25.76"
|
|
41
41
|
},
|