@kb-labs/quality-entry 2.107.0 → 2.110.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.
Files changed (51) hide show
  1. package/dist/cli/commands/build-order.d.ts +1 -3
  2. package/dist/cli/commands/build-order.js +4 -4
  3. package/dist/cli/commands/build-order.js.map +1 -1
  4. package/dist/cli/commands/check-builds.js +2 -5
  5. package/dist/cli/commands/check-builds.js.map +1 -1
  6. package/dist/cli/commands/check-layers.d.ts +1 -3
  7. package/dist/cli/commands/check-layers.js +3 -3
  8. package/dist/cli/commands/check-layers.js.map +1 -1
  9. package/dist/cli/commands/check-tests.js +2 -6
  10. package/dist/cli/commands/check-tests.js.map +1 -1
  11. package/dist/cli/commands/check-types.js +2 -6
  12. package/dist/cli/commands/check-types.js.map +1 -1
  13. package/dist/cli/commands/context.d.ts +1 -3
  14. package/dist/cli/commands/context.js +5 -5
  15. package/dist/cli/commands/context.js.map +1 -1
  16. package/dist/cli/commands/coupling.d.ts +1 -3
  17. package/dist/cli/commands/coupling.js +2 -2
  18. package/dist/cli/commands/coupling.js.map +1 -1
  19. package/dist/cli/commands/cycles.d.ts +3 -1
  20. package/dist/cli/commands/cycles.js +1 -4
  21. package/dist/cli/commands/cycles.js.map +1 -1
  22. package/dist/cli/commands/dead-code.d.ts +1 -3
  23. package/dist/cli/commands/dead-code.js +4 -4
  24. package/dist/cli/commands/dead-code.js.map +1 -1
  25. package/dist/cli/commands/fix-deps.js +3 -3
  26. package/dist/cli/commands/fix-deps.js.map +1 -1
  27. package/dist/cli/commands/gate.d.ts +1 -3
  28. package/dist/cli/commands/gate.js +3 -3
  29. package/dist/cli/commands/gate.js.map +1 -1
  30. package/dist/cli/commands/health.d.ts +1 -3
  31. package/dist/cli/commands/health.js +2 -2
  32. package/dist/cli/commands/health.js.map +1 -1
  33. package/dist/cli/commands/history.d.ts +1 -3
  34. package/dist/cli/commands/history.js +3 -3
  35. package/dist/cli/commands/history.js.map +1 -1
  36. package/dist/cli/commands/index.d.ts +1 -0
  37. package/dist/cli/commands/index.js +32 -46
  38. package/dist/cli/commands/index.js.map +1 -1
  39. package/dist/cli/commands/snapshot.d.ts +1 -3
  40. package/dist/cli/commands/snapshot.js +1 -1
  41. package/dist/cli/commands/snapshot.js.map +1 -1
  42. package/dist/cli/commands/stats.d.ts +1 -3
  43. package/dist/cli/commands/stats.js +2 -2
  44. package/dist/cli/commands/stats.js.map +1 -1
  45. package/dist/cli/commands/visualize.d.ts +4 -9
  46. package/dist/cli/commands/visualize.js +1 -1
  47. package/dist/cli/commands/visualize.js.map +1 -1
  48. package/dist/widgets/mf-manifest.json +5 -5
  49. package/dist/widgets/mf-stats.json +5 -5
  50. package/dist/widgets/remoteEntry.js +2 -2
  51. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/dead-code.ts"],"names":[],"mappings":"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","file":"dead-code.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n} from '@kb-labs/sdk';\nimport { runKnip } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { DeadCodeFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<DeadCodeFlags>, { exitCode: number }>({\n id: 'quality:dead-code',\n description: 'Detect unused files, exports, and deps via knip',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<DeadCodeFlags>): Promise<{ exitCode: number }> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n if (!cfg.knip.enabled) {\n ctx.ui?.success?.('knip is disabled in config (knip.enabled = false)');\n return { exitCode: 0 };\n }\n\n const report = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n\n if (flags.json) {\n ctx.ui?.json?.(report);\n return { exitCode: report.totalIssues > 0 ? 1 : 0 };\n }\n\n if (report.totalIssues === 0) {\n ctx.ui?.success?.('No dead code detected');\n return { exitCode: 0 };\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n if (report.unusedFiles.length > 0) {\n sections.push({\n header: `Unused files (${report.unusedFiles.length})`,\n items: report.unusedFiles,\n });\n }\n\n if (report.unusedExports.length > 0) {\n sections.push({\n header: `Unused exports (${report.unusedExports.length})`,\n items: report.unusedExports.map(e => `${e.file} ${e.symbol}`),\n });\n }\n\n if (report.unusedDependencies.length > 0) {\n sections.push({\n header: `Unused dependencies (${report.unusedDependencies.length})`,\n items: report.unusedDependencies.map(d => `${d.package} in ${d.workspace}`),\n });\n }\n\n if (report.unlistedDependencies.length > 0) {\n sections.push({\n header: `Unlisted dependencies (${report.unlistedDependencies.length})`,\n items: report.unlistedDependencies.map(d => `${d.package} in ${d.workspace}`),\n });\n }\n\n ctx.ui?.error?.(`${report.totalIssues} dead code issue(s) found`, { sections });\n return { exitCode: 1 };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/dead-code.ts"],"names":[],"mappings":"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","file":"dead-code.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { runKnip } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { DeadCodeFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<DeadCodeFlags>, unknown>({\n id: 'quality:dead-code',\n description: 'Detect unused files, exports, and deps via knip',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<DeadCodeFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n if (!cfg.knip.enabled) {\n ctx.ui?.success?.('knip is disabled in config (knip.enabled = false)');\n return { ok: true };\n }\n\n const report = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n\n if (flags.json) {\n ctx.ui?.json?.(report);\n return report.totalIssues > 0\n ? { ok: false, error: 'Dead code found', result: report }\n : { ok: true, result: report };\n }\n\n if (report.totalIssues === 0) {\n ctx.ui?.success?.('No dead code detected');\n return { ok: true };\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n if (report.unusedFiles.length > 0) {\n sections.push({\n header: `Unused files (${report.unusedFiles.length})`,\n items: report.unusedFiles,\n });\n }\n\n if (report.unusedExports.length > 0) {\n sections.push({\n header: `Unused exports (${report.unusedExports.length})`,\n items: report.unusedExports.map(e => `${e.file} ${e.symbol}`),\n });\n }\n\n if (report.unusedDependencies.length > 0) {\n sections.push({\n header: `Unused dependencies (${report.unusedDependencies.length})`,\n items: report.unusedDependencies.map(d => `${d.package} in ${d.workspace}`),\n });\n }\n\n if (report.unlistedDependencies.length > 0) {\n sections.push({\n header: `Unlisted dependencies (${report.unlistedDependencies.length})`,\n items: report.unlistedDependencies.map(d => `${d.package} in ${d.workspace}`),\n });\n }\n\n ctx.ui?.error?.(`${report.totalIssues} dead code issue(s) found`, { sections });\n return { ok: false, error: 'Command failed' };\n },\n },\n});\n"]}
@@ -47,11 +47,11 @@ var fix_deps_default = defineCommand({
47
47
  if (showStats) {
48
48
  const stats = await getDependencyStats(ctx.cwd);
49
49
  outputStats(stats, flags, ui);
50
- return { exitCode: 0 };
50
+ return { ok: true };
51
51
  }
52
52
  if (!removeUnused && !addMissing && !alignVersions) {
53
53
  validationError(ctx, "No fix options specified", "Use --remove-unused, --add-missing, --align-versions, or --all", flags.json);
54
- return { exitCode: 1 };
54
+ return { ok: false, error: "Command failed" };
55
55
  }
56
56
  const loader = useLoader("Scanning packages...");
57
57
  loader.start();
@@ -67,7 +67,7 @@ var fix_deps_default = defineCommand({
67
67
  alignedCount: result.alignedDeps.length
68
68
  });
69
69
  outputResults({ ...result, dryRun: false }, flags, ui);
70
- return { exitCode: 0, result };
70
+ return { ok: true, result };
71
71
  }
72
72
  }
73
73
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/fix-deps.ts"],"names":[],"mappings":"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","file":"fix-deps.js","sourcesContent":["/**\n * quality:fix-deps - Dependency auto-fixer\n *\n * Automatically fixes dependency issues:\n * - Remove unused dependencies\n * - Add missing workspace dependencies\n * - Align duplicate dependency versions\n *\n * Supports --dry-run via intent() for previewing changes without applying\n */\n\nimport { defineCommand, validationError, type PluginContextV3, useLoader, type CLIInput } from '@kb-labs/sdk';\nimport type { UIFacade } from '@kb-labs/sdk';\nimport type { FixDepsFlags } from './flags.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/** Minimal package.json structure used by fix-deps */\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\n/** Parsed package entry */\ninterface PackageEntry {\n name: string;\n path: string;\n json: PackageJson;\n}\n\ninterface FixResult {\n packagesScanned: number;\n removedDeps: Array<{ package: string; dep: string }>;\n addedDeps: Array<{ package: string; dep: string; version: string }>;\n alignedDeps: Array<{ dep: string; from: string; to: string; packages: string[] }>;\n}\n\ntype FixDepsCommandResult = {\n exitCode: number;\n result?: FixResult;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'quality:fix-deps',\n description: 'Auto-fix dependency issues',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FixDepsFlags>) {\n const flags = input.flags;\n const removeUnused = flags['remove-unused'] || flags.all;\n const addMissing = flags['add-missing'] || flags.all;\n const alignVersions = flags['align-versions'] || flags.all;\n\n const packages = findPackages(_ctx.cwd);\n const preview = await runAnalysis(packages, { removeUnused, addMissing, alignVersions, dryRun: true });\n\n const operations = [\n ...preview.alignedDeps.map(a => ({\n type: 'update' as const,\n resource: 'dependency',\n details: { dep: a.dep, from: a.from, to: a.to, packages: a.packages },\n })),\n ...preview.addedDeps.map(a => ({\n type: 'create' as const,\n resource: 'dependency',\n details: { package: a.package, dep: a.dep, version: a.version },\n })),\n ...preview.removedDeps.map(r => ({\n type: 'delete' as const,\n resource: 'dependency',\n details: { package: r.package, dep: r.dep },\n })),\n ];\n\n const total = operations.length;\n return {\n summary: total > 0\n ? `Fix ${total} dependency issue(s) across ${preview.packagesScanned} packages`\n : `No dependency issues found in ${preview.packagesScanned} packages`,\n operations,\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FixDepsFlags>): Promise<FixDepsCommandResult> {\n const { ui, platform } = ctx;\n const flags = input.flags;\n const removeUnused = flags['remove-unused'] || flags.all;\n const addMissing = flags['add-missing'] || flags.all;\n const alignVersions = flags['align-versions'] || flags.all;\n const showStats = flags.stats;\n\n if (showStats) {\n const stats = await getDependencyStats(ctx.cwd);\n outputStats(stats, flags, ui);\n return { exitCode: 0 };\n }\n\n if (!removeUnused && !addMissing && !alignVersions) {\n validationError(ctx, 'No fix options specified', 'Use --remove-unused, --add-missing, --align-versions, or --all', flags.json);\n return { exitCode: 1 };\n }\n\n const loader = useLoader('Scanning packages...');\n loader.start();\n\n const packages = findPackages(ctx.cwd);\n loader.update({ text: `Scanned ${packages.length} packages` });\n\n const result = await runAnalysis(packages, { removeUnused, addMissing, alignVersions, dryRun: false });\n\n loader.succeed('Dependency analysis completed');\n\n await platform.analytics.track('quality:fix-deps', {\n dryRun: false,\n packagesScanned: result.packagesScanned,\n removedCount: result.removedDeps.length,\n addedCount: result.addedDeps.length,\n alignedCount: result.alignedDeps.length,\n });\n\n outputResults({ ...result, dryRun: false }, flags, ui);\n\n return { exitCode: 0, result };\n },\n },\n});\n\nasync function runAnalysis(\n packages: PackageEntry[],\n opts: { removeUnused?: boolean | null; addMissing?: boolean | null; alignVersions?: boolean | null; dryRun: boolean },\n): Promise<FixResult & { packagesScanned: number }> {\n const result: FixResult & { packagesScanned: number } = {\n packagesScanned: packages.length,\n removedDeps: [],\n addedDeps: [],\n alignedDeps: [],\n };\n\n if (opts.alignVersions) {\n result.alignedDeps = await alignDuplicateVersions(packages, opts.dryRun);\n }\n if (opts.addMissing) {\n result.addedDeps = await addMissingWorkspaceDeps(packages, opts.dryRun);\n }\n if (opts.removeUnused) {\n result.removedDeps = await removeUnusedDeps(packages, opts.dryRun);\n }\n\n return result;\n}\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: string): PackageEntry[] {\n const packages: PackageEntry[] = [];\n\n if (!fs.existsSync(rootDir)) {\n return packages;\n }\n\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('kb-labs-')) {continue;}\n\n const repoPath = path.join(rootDir, entry.name);\n const packagesDir = path.join(repoPath, 'packages');\n\n if (!fs.existsSync(packagesDir)) {continue;}\n\n const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });\n\n for (const pkgDir of packageDirs) {\n if (!pkgDir.isDirectory()) {continue;}\n\n const packageJsonPath = path.join(packagesDir, pkgDir.name, 'package.json');\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n packages.push({\n name: packageJson.name || pkgDir.name,\n path: packageJsonPath,\n json: packageJson,\n });\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Get dependency statistics\n */\ninterface DependencyStats {\n totalPackages: number;\n totalDeps: number;\n duplicates: number;\n topUsed: Array<{ name: string; count: number }>;\n}\n\nasync function getDependencyStats(rootDir: string): Promise<DependencyStats> {\n const packages = findPackages(rootDir);\n const allDeps = new Map<string, Set<string>>();\n\n for (const pkg of packages) {\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (!allDeps.has(dep)) {\n allDeps.set(dep, new Set());\n }\n allDeps.get(dep)!.add(version as string);\n }\n }\n\n const duplicates = Array.from(allDeps.entries())\n .filter(([_, versions]) => versions.size > 1)\n .filter(([dep]) => !dep.startsWith('@kb-labs/'));\n\n const topUsed = Array.from(allDeps.entries())\n .map(([name, versions]) => ({ name, count: versions.size > 1 ? versions.size : 1 }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n totalPackages: packages.length,\n totalDeps: allDeps.size,\n duplicates: duplicates.length,\n topUsed,\n };\n}\n\n/**\n * Align duplicate dependency versions to most common version\n */\nasync function alignDuplicateVersions(\n packages: PackageEntry[],\n dryRun: boolean\n): Promise<Array<{ dep: string; from: string; to: string; packages: string[] }>> {\n const aligned: Array<{ dep: string; from: string; to: string; packages: string[] }> = [];\n\n const depVersions = new Map<string, Map<string, Set<string>>>();\n\n for (const pkg of packages) {\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (dep.startsWith('@kb-labs/')) {continue;}\n\n if (!depVersions.has(dep)) {\n depVersions.set(dep, new Map());\n }\n\n const versions = depVersions.get(dep)!;\n if (!versions.has(version as string)) {\n versions.set(version as string, new Set());\n }\n versions.get(version as string)!.add(pkg.name);\n }\n }\n\n for (const [dep, versions] of depVersions.entries()) {\n if (versions.size <= 1) {continue;}\n\n const versionCounts = Array.from(versions.entries()).map(([ver, pkgs]) => ({\n version: ver,\n count: pkgs.size,\n packages: Array.from(pkgs),\n }));\n\n versionCounts.sort((a, b) => b.count - a.count);\n const targetVersion = versionCounts[0]?.version;\n if (!targetVersion) {continue;}\n\n for (const { version, packages: pkgNames } of versionCounts.slice(1)) {\n aligned.push({ dep, from: version, to: targetVersion, packages: pkgNames });\n\n if (!dryRun) {\n for (const pkgName of pkgNames) {\n const pkg = packages.find(p => p.name === pkgName);\n if (!pkg) {continue;}\n\n if (pkg.json.dependencies?.[dep]) {\n pkg.json.dependencies[dep] = targetVersion;\n }\n if (pkg.json.devDependencies?.[dep]) {\n pkg.json.devDependencies[dep] = targetVersion;\n }\n\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return aligned;\n}\n\n/**\n * Add missing workspace dependencies\n */\nasync function addMissingWorkspaceDeps(\n packages: PackageEntry[],\n dryRun: boolean\n): Promise<Array<{ package: string; dep: string; version: string }>> {\n const added: Array<{ package: string; dep: string; version: string }> = [];\n\n const workspacePackages = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.name.startsWith('@kb-labs/')) {\n workspacePackages.set(pkg.name, 'workspace:*');\n }\n }\n\n for (const pkg of packages) {\n const packageDir = path.dirname(pkg.path);\n const srcDir = path.join(packageDir, 'src');\n\n if (!fs.existsSync(srcDir)) {continue;}\n\n const imports = scanImports(srcDir);\n const currentDeps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const imp of imports) {\n if (imp.startsWith('@kb-labs/') && workspacePackages.has(imp) && !currentDeps[imp]) {\n added.push({ package: pkg.name, dep: imp, version: 'workspace:*' });\n\n if (!dryRun) {\n if (!pkg.json.dependencies) {\n pkg.json.dependencies = {};\n }\n pkg.json.dependencies[imp] = 'workspace:*';\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return added;\n}\n\n/**\n * Remove unused dependencies\n */\nasync function removeUnusedDeps(\n packages: PackageEntry[],\n dryRun: boolean\n): Promise<Array<{ package: string; dep: string }>> {\n const removed: Array<{ package: string; dep: string }> = [];\n\n for (const pkg of packages) {\n const packageDir = path.dirname(pkg.path);\n const srcDir = path.join(packageDir, 'src');\n\n if (!fs.existsSync(srcDir)) {continue;}\n\n const imports = new Set(scanImports(srcDir));\n\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const dep of Object.keys(deps)) {\n if (isProtectedDep(dep)) {continue;}\n\n if (!imports.has(dep)) {\n removed.push({ package: pkg.name, dep });\n\n if (!dryRun) {\n delete pkg.json.dependencies?.[dep];\n delete pkg.json.devDependencies?.[dep];\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return removed;\n}\n\n/**\n * Scan directory for imports\n */\nfunction scanImports(dir: string): string[] {\n const imports: string[] = [];\n\n function walk(currentDir: string) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n\n const importRegex = /(?:import|require)\\s*\\(?['\"]([^'\"]+)['\"]\\)?/g;\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const imp = match[1];\n if (!imp) {continue;}\n const pkgName = imp.startsWith('@') ? imp.split('/').slice(0, 2).join('/') : imp.split('/')[0];\n if (pkgName) {\n imports.push(pkgName);\n }\n }\n }\n }\n }\n\n walk(dir);\n return Array.from(new Set(imports));\n}\n\n/**\n * Check if dependency is protected (build tools, etc.)\n */\nfunction isProtectedDep(dep: string): boolean {\n const protectedDeps = [\n 'typescript', 'tsup', 'esbuild', 'vite', 'rollup', 'rimraf',\n 'vitest', 'jest', 'playwright', 'eslint', 'prettier',\n ];\n\n return protectedDeps.some(p => dep === p || dep.startsWith(`${p}-`) || dep.startsWith(`@${p}/`));\n}\n\n/**\n * Output dependency statistics\n */\nfunction outputStats(stats: DependencyStats, flags: FixDepsFlags, ui: UIFacade | undefined) {\n if (flags.json) {\n ui?.json?.(stats);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Overview',\n items: [\n `Total Packages: ${stats.totalPackages}`,\n `Total Dependencies: ${stats.totalDeps}`,\n `Duplicate Versions: ${stats.duplicates}`,\n ],\n });\n\n if (stats.topUsed.length > 0) {\n sections.push({\n header: 'Top 10 Most Used',\n items: stats.topUsed.map((d) => `${d.name} (${d.count} packages)`),\n });\n }\n\n ui?.success?.('Dependency statistics', {\n title: 'Dependency Statistics',\n sections,\n });\n}\n\n/**\n * Output fix results\n */\nfunction outputResults(result: FixResult & { dryRun: boolean }, flags: FixDepsFlags, ui: UIFacade | undefined) {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Summary',\n items: [`Packages Scanned: ${result.packagesScanned}`],\n });\n\n if (result.alignedDeps.length > 0) {\n const items = result.alignedDeps\n .slice(0, 10)\n .map(a => `${a.dep}: ${a.from} → ${a.to} (${a.packages.length} packages)`);\n if (result.alignedDeps.length > 10) {\n items.push(`... and ${result.alignedDeps.length - 10} more`);\n }\n sections.push({ header: 'Aligned Versions', items });\n }\n\n if (result.addedDeps.length > 0) {\n const items = result.addedDeps.slice(0, 10).map(a => `${a.package}: +${a.dep}`);\n if (result.addedDeps.length > 10) {\n items.push(`... and ${result.addedDeps.length - 10} more`);\n }\n sections.push({ header: 'Added Dependencies', items });\n }\n\n if (result.removedDeps.length > 0) {\n const items = result.removedDeps.slice(0, 10).map(r => `${r.package}: -${r.dep}`);\n if (result.removedDeps.length > 10) {\n items.push(`... and ${result.removedDeps.length - 10} more`);\n }\n sections.push({ header: 'Removed Dependencies', items });\n }\n\n if (result.alignedDeps.length === 0 && result.addedDeps.length === 0 && result.removedDeps.length === 0) {\n sections.push({ header: 'Result', items: ['No issues found!'] });\n }\n\n ui?.success?.('Dependency fix completed', {\n title: 'Dependency Fix Complete',\n sections,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/fix-deps.ts"],"names":[],"mappings":"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","file":"fix-deps.js","sourcesContent":["/**\n * quality:fix-deps - Dependency auto-fixer\n *\n * Automatically fixes dependency issues:\n * - Remove unused dependencies\n * - Add missing workspace dependencies\n * - Align duplicate dependency versions\n *\n * Supports --dry-run via intent() for previewing changes without applying\n */\n\nimport { defineCommand, validationError, type PluginContextV3, useLoader, type CLIInput, type CommandResult } from '@kb-labs/sdk';\nimport type { UIFacade } from '@kb-labs/sdk';\nimport type { FixDepsFlags } from './flags.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/** Minimal package.json structure used by fix-deps */\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\n/** Parsed package entry */\ninterface PackageEntry {\n name: string;\n path: string;\n json: PackageJson;\n}\n\ninterface FixResult {\n packagesScanned: number;\n removedDeps: Array<{ package: string; dep: string }>;\n addedDeps: Array<{ package: string; dep: string; version: string }>;\n alignedDeps: Array<{ dep: string; from: string; to: string; packages: string[] }>;\n}\n\nexport default defineCommand({\n id: 'quality:fix-deps',\n description: 'Auto-fix dependency issues',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FixDepsFlags>) {\n const flags = input.flags;\n const removeUnused = flags['remove-unused'] || flags.all;\n const addMissing = flags['add-missing'] || flags.all;\n const alignVersions = flags['align-versions'] || flags.all;\n\n const packages = findPackages(_ctx.cwd);\n const preview = await runAnalysis(packages, { removeUnused, addMissing, alignVersions, dryRun: true });\n\n const operations = [\n ...preview.alignedDeps.map(a => ({\n type: 'update' as const,\n resource: 'dependency',\n details: { dep: a.dep, from: a.from, to: a.to, packages: a.packages },\n })),\n ...preview.addedDeps.map(a => ({\n type: 'create' as const,\n resource: 'dependency',\n details: { package: a.package, dep: a.dep, version: a.version },\n })),\n ...preview.removedDeps.map(r => ({\n type: 'delete' as const,\n resource: 'dependency',\n details: { package: r.package, dep: r.dep },\n })),\n ];\n\n const total = operations.length;\n return {\n summary: total > 0\n ? `Fix ${total} dependency issue(s) across ${preview.packagesScanned} packages`\n : `No dependency issues found in ${preview.packagesScanned} packages`,\n operations,\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FixDepsFlags>): Promise<CommandResult<FixResult>> {\n const { ui, platform } = ctx;\n const flags = input.flags;\n const removeUnused = flags['remove-unused'] || flags.all;\n const addMissing = flags['add-missing'] || flags.all;\n const alignVersions = flags['align-versions'] || flags.all;\n const showStats = flags.stats;\n\n if (showStats) {\n const stats = await getDependencyStats(ctx.cwd);\n outputStats(stats, flags, ui);\n return { ok: true };\n }\n\n if (!removeUnused && !addMissing && !alignVersions) {\n validationError(ctx, 'No fix options specified', 'Use --remove-unused, --add-missing, --align-versions, or --all', flags.json);\n return { ok: false, error: 'Command failed' };\n }\n\n const loader = useLoader('Scanning packages...');\n loader.start();\n\n const packages = findPackages(ctx.cwd);\n loader.update({ text: `Scanned ${packages.length} packages` });\n\n const result = await runAnalysis(packages, { removeUnused, addMissing, alignVersions, dryRun: false });\n\n loader.succeed('Dependency analysis completed');\n\n await platform.analytics.track('quality:fix-deps', {\n dryRun: false,\n packagesScanned: result.packagesScanned,\n removedCount: result.removedDeps.length,\n addedCount: result.addedDeps.length,\n alignedCount: result.alignedDeps.length,\n });\n\n outputResults({ ...result, dryRun: false }, flags, ui);\n\n return { ok: true, result };\n },\n },\n});\n\nasync function runAnalysis(\n packages: PackageEntry[],\n opts: { removeUnused?: boolean | null; addMissing?: boolean | null; alignVersions?: boolean | null; dryRun: boolean },\n): Promise<FixResult & { packagesScanned: number }> {\n const result: FixResult & { packagesScanned: number } = {\n packagesScanned: packages.length,\n removedDeps: [],\n addedDeps: [],\n alignedDeps: [],\n };\n\n if (opts.alignVersions) {\n result.alignedDeps = await alignDuplicateVersions(packages, opts.dryRun);\n }\n if (opts.addMissing) {\n result.addedDeps = await addMissingWorkspaceDeps(packages, opts.dryRun);\n }\n if (opts.removeUnused) {\n result.removedDeps = await removeUnusedDeps(packages, opts.dryRun);\n }\n\n return result;\n}\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: string): PackageEntry[] {\n const packages: PackageEntry[] = [];\n\n if (!fs.existsSync(rootDir)) {\n return packages;\n }\n\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('kb-labs-')) {continue;}\n\n const repoPath = path.join(rootDir, entry.name);\n const packagesDir = path.join(repoPath, 'packages');\n\n if (!fs.existsSync(packagesDir)) {continue;}\n\n const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });\n\n for (const pkgDir of packageDirs) {\n if (!pkgDir.isDirectory()) {continue;}\n\n const packageJsonPath = path.join(packagesDir, pkgDir.name, 'package.json');\n\n if (fs.existsSync(packageJsonPath)) {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n packages.push({\n name: packageJson.name || pkgDir.name,\n path: packageJsonPath,\n json: packageJson,\n });\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Get dependency statistics\n */\ninterface DependencyStats {\n totalPackages: number;\n totalDeps: number;\n duplicates: number;\n topUsed: Array<{ name: string; count: number }>;\n}\n\nasync function getDependencyStats(rootDir: string): Promise<DependencyStats> {\n const packages = findPackages(rootDir);\n const allDeps = new Map<string, Set<string>>();\n\n for (const pkg of packages) {\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (!allDeps.has(dep)) {\n allDeps.set(dep, new Set());\n }\n allDeps.get(dep)!.add(version as string);\n }\n }\n\n const duplicates = Array.from(allDeps.entries())\n .filter(([_, versions]) => versions.size > 1)\n .filter(([dep]) => !dep.startsWith('@kb-labs/'));\n\n const topUsed = Array.from(allDeps.entries())\n .map(([name, versions]) => ({ name, count: versions.size > 1 ? versions.size : 1 }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return {\n totalPackages: packages.length,\n totalDeps: allDeps.size,\n duplicates: duplicates.length,\n topUsed,\n };\n}\n\n/**\n * Align duplicate dependency versions to most common version\n */\nasync function alignDuplicateVersions(\n packages: PackageEntry[],\n dryRun: boolean\n): Promise<Array<{ dep: string; from: string; to: string; packages: string[] }>> {\n const aligned: Array<{ dep: string; from: string; to: string; packages: string[] }> = [];\n\n const depVersions = new Map<string, Map<string, Set<string>>>();\n\n for (const pkg of packages) {\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (dep.startsWith('@kb-labs/')) {continue;}\n\n if (!depVersions.has(dep)) {\n depVersions.set(dep, new Map());\n }\n\n const versions = depVersions.get(dep)!;\n if (!versions.has(version as string)) {\n versions.set(version as string, new Set());\n }\n versions.get(version as string)!.add(pkg.name);\n }\n }\n\n for (const [dep, versions] of depVersions.entries()) {\n if (versions.size <= 1) {continue;}\n\n const versionCounts = Array.from(versions.entries()).map(([ver, pkgs]) => ({\n version: ver,\n count: pkgs.size,\n packages: Array.from(pkgs),\n }));\n\n versionCounts.sort((a, b) => b.count - a.count);\n const targetVersion = versionCounts[0]?.version;\n if (!targetVersion) {continue;}\n\n for (const { version, packages: pkgNames } of versionCounts.slice(1)) {\n aligned.push({ dep, from: version, to: targetVersion, packages: pkgNames });\n\n if (!dryRun) {\n for (const pkgName of pkgNames) {\n const pkg = packages.find(p => p.name === pkgName);\n if (!pkg) {continue;}\n\n if (pkg.json.dependencies?.[dep]) {\n pkg.json.dependencies[dep] = targetVersion;\n }\n if (pkg.json.devDependencies?.[dep]) {\n pkg.json.devDependencies[dep] = targetVersion;\n }\n\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return aligned;\n}\n\n/**\n * Add missing workspace dependencies\n */\nasync function addMissingWorkspaceDeps(\n packages: PackageEntry[],\n dryRun: boolean\n): Promise<Array<{ package: string; dep: string; version: string }>> {\n const added: Array<{ package: string; dep: string; version: string }> = [];\n\n const workspacePackages = new Map<string, string>();\n for (const pkg of packages) {\n if (pkg.name.startsWith('@kb-labs/')) {\n workspacePackages.set(pkg.name, 'workspace:*');\n }\n }\n\n for (const pkg of packages) {\n const packageDir = path.dirname(pkg.path);\n const srcDir = path.join(packageDir, 'src');\n\n if (!fs.existsSync(srcDir)) {continue;}\n\n const imports = scanImports(srcDir);\n const currentDeps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const imp of imports) {\n if (imp.startsWith('@kb-labs/') && workspacePackages.has(imp) && !currentDeps[imp]) {\n added.push({ package: pkg.name, dep: imp, version: 'workspace:*' });\n\n if (!dryRun) {\n if (!pkg.json.dependencies) {\n pkg.json.dependencies = {};\n }\n pkg.json.dependencies[imp] = 'workspace:*';\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return added;\n}\n\n/**\n * Remove unused dependencies\n */\nasync function removeUnusedDeps(\n packages: PackageEntry[],\n dryRun: boolean\n): Promise<Array<{ package: string; dep: string }>> {\n const removed: Array<{ package: string; dep: string }> = [];\n\n for (const pkg of packages) {\n const packageDir = path.dirname(pkg.path);\n const srcDir = path.join(packageDir, 'src');\n\n if (!fs.existsSync(srcDir)) {continue;}\n\n const imports = new Set(scanImports(srcDir));\n\n const deps = {\n ...pkg.json.dependencies,\n ...pkg.json.devDependencies,\n };\n\n for (const dep of Object.keys(deps)) {\n if (isProtectedDep(dep)) {continue;}\n\n if (!imports.has(dep)) {\n removed.push({ package: pkg.name, dep });\n\n if (!dryRun) {\n delete pkg.json.dependencies?.[dep];\n delete pkg.json.devDependencies?.[dep];\n fs.writeFileSync(pkg.path, JSON.stringify(pkg.json, null, 2) + '\\n');\n }\n }\n }\n }\n\n return removed;\n}\n\n/**\n * Scan directory for imports\n */\nfunction scanImports(dir: string): string[] {\n const imports: string[] = [];\n\n function walk(currentDir: string) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n const content = fs.readFileSync(fullPath, 'utf-8');\n\n const importRegex = /(?:import|require)\\s*\\(?['\"]([^'\"]+)['\"]\\)?/g;\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const imp = match[1];\n if (!imp) {continue;}\n const pkgName = imp.startsWith('@') ? imp.split('/').slice(0, 2).join('/') : imp.split('/')[0];\n if (pkgName) {\n imports.push(pkgName);\n }\n }\n }\n }\n }\n\n walk(dir);\n return Array.from(new Set(imports));\n}\n\n/**\n * Check if dependency is protected (build tools, etc.)\n */\nfunction isProtectedDep(dep: string): boolean {\n const protectedDeps = [\n 'typescript', 'tsup', 'esbuild', 'vite', 'rollup', 'rimraf',\n 'vitest', 'jest', 'playwright', 'eslint', 'prettier',\n ];\n\n return protectedDeps.some(p => dep === p || dep.startsWith(`${p}-`) || dep.startsWith(`@${p}/`));\n}\n\n/**\n * Output dependency statistics\n */\nfunction outputStats(stats: DependencyStats, flags: FixDepsFlags, ui: UIFacade | undefined) {\n if (flags.json) {\n ui?.json?.(stats);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Overview',\n items: [\n `Total Packages: ${stats.totalPackages}`,\n `Total Dependencies: ${stats.totalDeps}`,\n `Duplicate Versions: ${stats.duplicates}`,\n ],\n });\n\n if (stats.topUsed.length > 0) {\n sections.push({\n header: 'Top 10 Most Used',\n items: stats.topUsed.map((d) => `${d.name} (${d.count} packages)`),\n });\n }\n\n ui?.success?.('Dependency statistics', {\n title: 'Dependency Statistics',\n sections,\n });\n}\n\n/**\n * Output fix results\n */\nfunction outputResults(result: FixResult & { dryRun: boolean }, flags: FixDepsFlags, ui: UIFacade | undefined) {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Summary',\n items: [`Packages Scanned: ${result.packagesScanned}`],\n });\n\n if (result.alignedDeps.length > 0) {\n const items = result.alignedDeps\n .slice(0, 10)\n .map(a => `${a.dep}: ${a.from} → ${a.to} (${a.packages.length} packages)`);\n if (result.alignedDeps.length > 10) {\n items.push(`... and ${result.alignedDeps.length - 10} more`);\n }\n sections.push({ header: 'Aligned Versions', items });\n }\n\n if (result.addedDeps.length > 0) {\n const items = result.addedDeps.slice(0, 10).map(a => `${a.package}: +${a.dep}`);\n if (result.addedDeps.length > 10) {\n items.push(`... and ${result.addedDeps.length - 10} more`);\n }\n sections.push({ header: 'Added Dependencies', items });\n }\n\n if (result.removedDeps.length > 0) {\n const items = result.removedDeps.slice(0, 10).map(r => `${r.package}: -${r.dep}`);\n if (result.removedDeps.length > 10) {\n items.push(`... and ${result.removedDeps.length - 10} more`);\n }\n sections.push({ header: 'Removed Dependencies', items });\n }\n\n if (result.alignedDeps.length === 0 && result.addedDeps.length === 0 && result.removedDeps.length === 0) {\n sections.push({ header: 'Result', items: ['No issues found!'] });\n }\n\n ui?.success?.('Dependency fix completed', {\n title: 'Dependency Fix Complete',\n sections,\n });\n}\n"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { GateFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<GateFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<GateFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -29,12 +29,12 @@ var gate_default = defineCommand({
29
29
  };
30
30
  if (flags.json) {
31
31
  ctx.ui?.json?.(result);
32
- return { exitCode: failed ? 1 : 0 };
32
+ return failed ? { ok: false, error: "Quality gate failed", result: { failed } } : { ok: true, result: { failed } };
33
33
  }
34
34
  if (!failed) {
35
35
  const msg = baseline !== null ? `Gate passed \u2014 no new violations (${current} pre-existing)` : "Gate passed \u2014 no layering violations";
36
36
  ctx.ui?.success?.(msg);
37
- return { exitCode: 0 };
37
+ return { ok: true };
38
38
  }
39
39
  const sections = [];
40
40
  if (newViolations !== null && newViolations > 0) {
@@ -49,7 +49,7 @@ var gate_default = defineCommand({
49
49
  });
50
50
  }
51
51
  ctx.ui?.error?.("Gate failed \u2014 architecture violations detected", { sections });
52
- return { exitCode: 1 };
52
+ return { ok: false, error: "Command failed" };
53
53
  }
54
54
  }
55
55
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/gate.ts"],"names":[],"mappings":"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","file":"gate.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n} from '@kb-labs/sdk';\nimport { analyzeLayering, QualitySnapshotStore } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { GateFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<GateFlags>, { exitCode: number }>({\n id: 'quality:gate',\n description: 'Architecture gate: fail if new layering violations introduced',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<GateFlags>): Promise<{ exitCode: number }> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n const report = await analyzeLayering({ rootDir: cwd, layerMap: cfg.layers });\n const current = report.totalViolations;\n\n // Compare against last snapshot if available\n const store = new QualitySnapshotStore(cwd, cfg.maxSnapshots);\n const { latest } = store.history();\n const baseline = latest?.counters.layeringViolations ?? null;\n\n const newViolations = baseline !== null ? current - baseline : null;\n const failed = flags.strict\n ? current > 0\n : newViolations !== null\n ? newViolations > 0\n : current > 0;\n\n const result = {\n passed: !failed,\n current,\n baseline,\n newViolations,\n violations: report.violations,\n affectedPackages: report.affectedPackages,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n return { exitCode: failed ? 1 : 0 };\n }\n\n if (!failed) {\n const msg =\n baseline !== null\n ? `Gate passed — no new violations (${current} pre-existing)`\n : 'Gate passed — no layering violations';\n ctx.ui?.success?.(msg);\n return { exitCode: 0 };\n }\n\n const sections = [];\n\n if (newViolations !== null && newViolations > 0) {\n sections.push({\n header: `New violations introduced: ${newViolations} (was ${baseline}, now ${current})`,\n items: report.violations\n .map(v => `${v.fromPackage} → ${v.toPackage} ${v.importSpecifier}`)\n .slice(0, 20),\n });\n } else {\n sections.push({\n header: `${current} layering violation(s) in ${report.affectedPackages.length} package(s)`,\n items: report.affectedPackages,\n });\n }\n\n ctx.ui?.error?.('Gate failed — architecture violations detected', { sections });\n return { exitCode: 1 };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/gate.ts"],"names":[],"mappings":"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","file":"gate.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { analyzeLayering, QualitySnapshotStore } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { GateFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<GateFlags>, unknown>({\n id: 'quality:gate',\n description: 'Architecture gate: fail if new layering violations introduced',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<GateFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n const report = await analyzeLayering({ rootDir: cwd, layerMap: cfg.layers });\n const current = report.totalViolations;\n\n // Compare against last snapshot if available\n const store = new QualitySnapshotStore(cwd, cfg.maxSnapshots);\n const { latest } = store.history();\n const baseline = latest?.counters.layeringViolations ?? null;\n\n const newViolations = baseline !== null ? current - baseline : null;\n const failed = flags.strict\n ? current > 0\n : newViolations !== null\n ? newViolations > 0\n : current > 0;\n\n const result = {\n passed: !failed,\n current,\n baseline,\n newViolations,\n violations: report.violations,\n affectedPackages: report.affectedPackages,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n return failed\n ? { ok: false, error: 'Quality gate failed', result: { failed } }\n : { ok: true, result: { failed } };\n }\n\n if (!failed) {\n const msg =\n baseline !== null\n ? `Gate passed — no new violations (${current} pre-existing)`\n : 'Gate passed — no layering violations';\n ctx.ui?.success?.(msg);\n return { ok: true };\n }\n\n const sections = [];\n\n if (newViolations !== null && newViolations > 0) {\n sections.push({\n header: `New violations introduced: ${newViolations} (was ${baseline}, now ${current})`,\n items: report.violations\n .map(v => `${v.fromPackage} → ${v.toPackage} ${v.importSpecifier}`)\n .slice(0, 20),\n });\n } else {\n sections.push({\n header: `${current} layering violation(s) in ${report.affectedPackages.length} package(s)`,\n items: report.affectedPackages,\n });\n }\n\n ctx.ui?.error?.('Gate failed — architecture violations detected', { sections });\n return { ok: false, error: 'Command failed' };\n },\n },\n});\n"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { HealthFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<HealthFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<HealthFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -16,7 +16,7 @@ var health_default = defineCommand({
16
16
  if (cached && !flags.refresh) {
17
17
  const health2 = cached;
18
18
  outputHealth(health2, flags, ctx);
19
- return { exitCode: health2.score < cfg.thresholds.health ? 1 : 0 };
19
+ return health2.score < cfg.thresholds.health ? { ok: false, error: "Health score is below threshold", result: health2 } : { ok: true, result: health2 };
20
20
  }
21
21
  const [layering, types] = await Promise.all([
22
22
  analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),
@@ -38,7 +38,7 @@ var health_default = defineCommand({
38
38
  });
39
39
  await ctx.platform.cache.set(CACHE_KEYS.HEALTH, health, CACHE_TTLS.FAST);
40
40
  outputHealth(health, flags, ctx);
41
- return { exitCode: health.score < cfg.thresholds.health ? 1 : 0 };
41
+ return health.score < cfg.thresholds.health ? { ok: false, error: "Health score is below threshold", result: health } : { ok: true, result: health };
42
42
  }
43
43
  }
44
44
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/health.ts"],"names":["health"],"mappings":"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","file":"health.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n} from '@kb-labs/sdk';\nimport {\n analyzeLayering,\n analyzeCoupling,\n runKnip,\n analyzeTypes,\n calculateHealth,\n} from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig, type HealthScore, type KnipReport } from '@kb-labs/quality-contracts';\nimport type { HealthFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<HealthFlags>, { exitCode: number }>({\n id: 'quality:health',\n description: 'Multidimensional health score: architecture, TypeScript, dead code, dependencies',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<HealthFlags>): Promise<{ exitCode: number }> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n const cached = await ctx.platform.cache.get(CACHE_KEYS.HEALTH);\n if (cached && !flags.refresh) {\n const health = cached as HealthScore;\n outputHealth(health, flags, ctx);\n return { exitCode: health.score < cfg.thresholds.health ? 1 : 0 };\n }\n\n const [layering, types] = await Promise.all([\n analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),\n analyzeTypes(cwd),\n ]);\n\n const coupling = analyzeCoupling({ rootDir: cwd, layerMap: cfg.layers });\n\n let knip: KnipReport = { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n if (cfg.knip.enabled) {\n knip = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n }\n\n const health = calculateHealth({\n layering,\n coupling,\n types,\n knip,\n totalPackages: coupling.packages.length,\n avgTestCoverage: null,\n thresholds: cfg.thresholds,\n });\n\n await ctx.platform.cache.set(CACHE_KEYS.HEALTH, health, CACHE_TTLS.FAST);\n\n outputHealth(health, flags, ctx);\n return { exitCode: health.score < cfg.thresholds.health ? 1 : 0 };\n },\n },\n});\n\nfunction outputHealth(health: Awaited<ReturnType<typeof calculateHealth>>, flags: { json?: boolean; detailed?: boolean }, ctx: PluginContextV3) {\n if (flags.json) {\n ctx.ui?.json?.(health);\n return;\n }\n\n const dimItems = Object.entries(health.dimensions).map(([key, dim]) => {\n const details = dim.details.length > 0 ? `: ${dim.details.join(', ')}` : '';\n return `${key} ${dim.score}/100 (${dim.grade})${details}`;\n });\n\n ctx.ui?.success?.(`Health score: ${health.score}/100 (${health.grade})`, {\n sections: [{ header: 'Dimensions', items: dimItems }],\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/health.ts"],"names":["health"],"mappings":"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","file":"health.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport {\n analyzeLayering,\n analyzeCoupling,\n runKnip,\n analyzeTypes,\n calculateHealth,\n} from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig, type HealthScore, type KnipReport } from '@kb-labs/quality-contracts';\nimport type { HealthFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<HealthFlags>, unknown>({\n id: 'quality:health',\n description: 'Multidimensional health score: architecture, TypeScript, dead code, dependencies',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<HealthFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n const cached = await ctx.platform.cache.get(CACHE_KEYS.HEALTH);\n if (cached && !flags.refresh) {\n const health = cached as HealthScore;\n outputHealth(health, flags, ctx);\n return health.score < cfg.thresholds.health\n ? { ok: false, error: 'Health score is below threshold', result: health }\n : { ok: true, result: health };\n }\n\n const [layering, types] = await Promise.all([\n analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),\n analyzeTypes(cwd),\n ]);\n\n const coupling = analyzeCoupling({ rootDir: cwd, layerMap: cfg.layers });\n\n let knip: KnipReport = { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n if (cfg.knip.enabled) {\n knip = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n }\n\n const health = calculateHealth({\n layering,\n coupling,\n types,\n knip,\n totalPackages: coupling.packages.length,\n avgTestCoverage: null,\n thresholds: cfg.thresholds,\n });\n\n await ctx.platform.cache.set(CACHE_KEYS.HEALTH, health, CACHE_TTLS.FAST);\n\n outputHealth(health, flags, ctx);\n return health.score < cfg.thresholds.health\n ? { ok: false, error: 'Health score is below threshold', result: health }\n : { ok: true, result: health };\n },\n },\n});\n\nfunction outputHealth(health: Awaited<ReturnType<typeof calculateHealth>>, flags: { json?: boolean; detailed?: boolean }, ctx: PluginContextV3) {\n if (flags.json) {\n ctx.ui?.json?.(health);\n return;\n }\n\n const dimItems = Object.entries(health.dimensions).map(([key, dim]) => {\n const details = dim.details.length > 0 ? `: ${dim.details.join(', ')}` : '';\n return `${key} ${dim.score}/100 (${dim.grade})${details}`;\n });\n\n ctx.ui?.success?.(`Health score: ${health.score}/100 (${health.grade})`, {\n sections: [{ header: 'Dimensions', items: dimItems }],\n });\n}\n"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { HistoryFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<HistoryFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<HistoryFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -15,13 +15,13 @@ var history_default = defineCommand({
15
15
  const { snapshots, delta, latest } = store.history();
16
16
  if (snapshots.length === 0) {
17
17
  ctx.ui?.success?.("No snapshots yet. Run `kb quality snapshot` first.");
18
- return { exitCode: 0 };
18
+ return { ok: true };
19
19
  }
20
20
  const limit = flags.limit ?? 10;
21
21
  const recent = snapshots.slice(-limit).reverse();
22
22
  if (flags.json) {
23
23
  ctx.ui?.json?.({ snapshots: recent, delta, latest });
24
- return { exitCode: 0 };
24
+ return { ok: true };
25
25
  }
26
26
  const items = recent.map((s) => {
27
27
  const date = new Date(s.timestamp).toLocaleString();
@@ -45,7 +45,7 @@ var history_default = defineCommand({
45
45
  });
46
46
  }
47
47
  ctx.ui?.success?.(`Quality history (${recent.length} snapshots)`, { sections });
48
- return { exitCode: 0 };
48
+ return { ok: true };
49
49
  }
50
50
  }
51
51
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"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","file":"history.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n} from '@kb-labs/sdk';\nimport { QualitySnapshotStore } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { HistoryFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<HistoryFlags>, { exitCode: number }>({\n id: 'quality:history',\n description: 'Show quality snapshot history and trends',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<HistoryFlags>): Promise<{ exitCode: number }> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new QualitySnapshotStore(cwd, config?.maxSnapshots ?? defaultQualityConfig.maxSnapshots);\n const { snapshots, delta, latest } = store.history();\n\n if (snapshots.length === 0) {\n ctx.ui?.success?.('No snapshots yet. Run `kb quality snapshot` first.');\n return { exitCode: 0 };\n }\n\n const limit = flags.limit ?? 10;\n const recent = snapshots.slice(-limit).reverse();\n\n if (flags.json) {\n ctx.ui?.json?.({ snapshots: recent, delta, latest });\n return { exitCode: 0 };\n }\n\n const items = recent.map(s => {\n const date = new Date(s.timestamp).toLocaleString();\n const branch = s.git.branch ? ` [${s.git.branch}]` : '';\n return `${date}${branch} — ${s.score}/100 (${s.grade}) violations: ${s.counters.layeringViolations} any: ${s.counters.anyCount}`;\n });\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: `Last ${recent.length} snapshots`, items },\n ];\n\n if (delta) {\n const sign = (n: number) => (n > 0 ? `+${n}` : `${n}`);\n sections.push({\n header: 'Delta vs previous snapshot',\n items: [\n `Score: ${sign(delta.score)}`,\n `Layering violations: ${sign(delta.layeringViolations)}`,\n `Any count: ${sign(delta.anyCount)}`,\n `Unused files: ${sign(delta.unusedFiles)}`,\n `Avg instability: ${sign(delta.avgInstability)}`,\n ],\n });\n }\n\n ctx.ui?.success?.(`Quality history (${recent.length} snapshots)`, { sections });\n return { exitCode: 0 };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"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","file":"history.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { QualitySnapshotStore } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { HistoryFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<HistoryFlags>, unknown>({\n id: 'quality:history',\n description: 'Show quality snapshot history and trends',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<HistoryFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const store = new QualitySnapshotStore(cwd, config?.maxSnapshots ?? defaultQualityConfig.maxSnapshots);\n const { snapshots, delta, latest } = store.history();\n\n if (snapshots.length === 0) {\n ctx.ui?.success?.('No snapshots yet. Run `kb quality snapshot` first.');\n return { ok: true };\n }\n\n const limit = flags.limit ?? 10;\n const recent = snapshots.slice(-limit).reverse();\n\n if (flags.json) {\n ctx.ui?.json?.({ snapshots: recent, delta, latest });\n return { ok: true };\n }\n\n const items = recent.map(s => {\n const date = new Date(s.timestamp).toLocaleString();\n const branch = s.git.branch ? ` [${s.git.branch}]` : '';\n return `${date}${branch} — ${s.score}/100 (${s.grade}) violations: ${s.counters.layeringViolations} any: ${s.counters.anyCount}`;\n });\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: `Last ${recent.length} snapshots`, items },\n ];\n\n if (delta) {\n const sign = (n: number) => (n > 0 ? `+${n}` : `${n}`);\n sections.push({\n header: 'Delta vs previous snapshot',\n items: [\n `Score: ${sign(delta.score)}`,\n `Layering violations: ${sign(delta.layeringViolations)}`,\n `Any count: ${sign(delta.anyCount)}`,\n `Unused files: ${sign(delta.unusedFiles)}`,\n `Avg instability: ${sign(delta.avgInstability)}`,\n ],\n });\n }\n\n ctx.ui?.success?.(`Quality history (${recent.length} snapshots)`, { sections });\n return { ok: true };\n },\n },\n});\n"]}
@@ -16,3 +16,4 @@ import '@kb-labs/shared-command-kit';
16
16
  import '@kb-labs/sdk';
17
17
  import './flags.js';
18
18
  import '@kb-labs/quality-contracts';
19
+ import '@kb-labs/quality-core/graph';