@kb-labs/quality-entry 2.119.0 → 2.119.1-canary.b53bbee1d

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 (58) hide show
  1. package/dist/cli/commands/build-order.js.map +1 -1
  2. package/dist/cli/commands/check-builds.js.map +1 -1
  3. package/dist/cli/commands/check-layers.js.map +1 -1
  4. package/dist/cli/commands/check-tests.js.map +1 -1
  5. package/dist/cli/commands/check-types.js.map +1 -1
  6. package/dist/cli/commands/context.js.map +1 -1
  7. package/dist/cli/commands/coupling.js.map +1 -1
  8. package/dist/cli/commands/cycles.js.map +1 -1
  9. package/dist/cli/commands/dead-code.js.map +1 -1
  10. package/dist/cli/commands/fix-deps.js.map +1 -1
  11. package/dist/cli/commands/flags.js.map +1 -1
  12. package/dist/cli/commands/gate.js.map +1 -1
  13. package/dist/cli/commands/health.js.map +1 -1
  14. package/dist/cli/commands/history.js.map +1 -1
  15. package/dist/cli/commands/index.js.map +1 -1
  16. package/dist/cli/commands/snapshot.js.map +1 -1
  17. package/dist/cli/commands/stats.js.map +1 -1
  18. package/dist/cli/commands/visualize.js.map +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/manifest.js.map +1 -1
  21. package/dist/manifest.json +1394 -0
  22. package/dist/rest/handlers/build-order-handler.js.map +1 -1
  23. package/dist/rest/handlers/builds-handler.js.map +1 -1
  24. package/dist/rest/handlers/coupling-handler.js.map +1 -1
  25. package/dist/rest/handlers/cycles-handler.js.map +1 -1
  26. package/dist/rest/handlers/dependencies-handler.js.map +1 -1
  27. package/dist/rest/handlers/graph-handler.js.map +1 -1
  28. package/dist/rest/handlers/health-handler.js.map +1 -1
  29. package/dist/rest/handlers/history-handler.js.map +1 -1
  30. package/dist/rest/handlers/knip-handler.js.map +1 -1
  31. package/dist/rest/handlers/layers-handler.js.map +1 -1
  32. package/dist/rest/handlers/snapshot-handler.js.map +1 -1
  33. package/dist/rest/handlers/stale-handler.js.map +1 -1
  34. package/dist/rest/handlers/stats-handler.js.map +1 -1
  35. package/dist/rest/handlers/tests-handler.js.map +1 -1
  36. package/dist/rest/handlers/types-handler.js.map +1 -1
  37. package/dist/widgets/117.js +32 -0
  38. package/dist/widgets/165.js +1 -0
  39. package/dist/widgets/326.js +1 -0
  40. package/dist/widgets/370.js +1 -0
  41. package/dist/widgets/405.js +1 -0
  42. package/dist/widgets/46.js +445 -0
  43. package/dist/widgets/50.js +1 -0
  44. package/dist/widgets/546.js +1 -0
  45. package/dist/widgets/648.js +1 -0
  46. package/dist/widgets/669.js +1 -0
  47. package/dist/widgets/707.js +1 -0
  48. package/dist/widgets/775.js +1 -0
  49. package/dist/widgets/78.js +1 -0
  50. package/dist/widgets/832.js +96 -0
  51. package/dist/widgets/875.js +25 -0
  52. package/dist/widgets/945.js +1 -0
  53. package/dist/widgets/968.js +9 -0
  54. package/dist/widgets/__federation_expose_QualityOverview.js +1 -0
  55. package/dist/widgets/mf-manifest.json +229 -0
  56. package/dist/widgets/mf-stats.json +253 -0
  57. package/dist/widgets/remoteEntry.js +7 -0
  58. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/build-order.ts"],"names":[],"mappings":";;;;;AAYA,IAAO,sBAAQ,aAAA,CAA2D;AAAA,EACxE,EAAA,EAAI,qBAAA;AAAA,EACJ,WAAA,EAAa,8CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA0D;AAC5F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,MAAM,MAAA,IAAU,oBAAA;AACtB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,SAAS,iBAAA,CAAkB;AAAA,QAC/B,OAAA,EAAS,GAAA;AAAA,QACT,UAAU,GAAA,CAAI,MAAA;AAAA,QACd,eAAe,KAAA,CAAM;AAAA,OACtB,CAAA;AAED,MAAA,IAAI,OAAO,WAAA,EAAa;AACtB,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,GAAG,MAAA,EAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,QACzC,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,CAAA,4EAAA,CAAA,EAA2E;AAAA,YACzF,UAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,cAC3C,MAAA,EAAQ,CAAA,MAAA,EAAS,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,cACtB,KAAA,EAAO;AAAA,aACT,CAAE;AAAA,WACH,CAAA;AAAA,QACH;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AACrB,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC7C,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAC7B,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAA,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA,QAAA,EAAW,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,IAAI,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,CAAA,eAAA,EAAkB,CAAC,CAAA,WAAA,CAAa,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,QAC/H;AACA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GACnB,MAAA,CAAO,OAAO,GAAA,CAAI,CAAC,OAAO,CAAA,MAAO;AAAA,QAC/B,QAAQ,CAAA,MAAA,EAAS,CAAA,GAAI,CAAC,CAAA,QAAA,EAAM,MAAM,MAAM,CAAA,sBAAA,CAAA;AAAA,QACxC,KAAA,EAAO;AAAA,OACT,CAAE,IACF,CAAC,EAAE,QAAQ,aAAA,EAAe,KAAA,EAAO,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,GAAG,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA,CAAE,GAAG,CAAA;AAEpF,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,CAAC,CAAA,EAAG,MAAA,CAAO,YAAY,CAAA,aAAA,EAAgB,MAAA,CAAO,UAAU,CAAA,OAAA,CAAS;AAAA,OACzE,CAAA;AAED,MAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAO,CAAA,CAAA,GAAK,sBAAA,EAAwB,EAAE,QAAA,EAAU,CAAA;AAC3G,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"build-order.js","sourcesContent":["/**\n * quality:build-order - Calculate build order and dependency layers\n *\n * Uses topological sort to determine correct build order.\n * Shows build layers where each layer can build in parallel.\n */\n\nimport { defineCommand, useConfig, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { analyzeBuildOrder } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { BuildOrderFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<BuildOrderFlags>, unknown>({\n id: 'quality:build-order',\n description: 'Calculate build order using topological sort',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BuildOrderFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n\n const result = analyzeBuildOrder({\n rootDir: cwd,\n layerMap: cfg.layers,\n filterPackage: flags.package,\n });\n\n if (result.hasCircular) {\n if (flags.json) {\n ctx.ui?.json?.({ ...result, ok: false });\n } else {\n ctx.ui?.error?.(`Circular dependencies detected — build order cannot be fully determined`, {\n sections: result.circular.map((cycle, i) => ({\n header: `Cycle ${i + 1}`,\n items: cycle,\n })),\n });\n }\n return { ok: false, error: 'Command failed' };\n }\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n return { ok: true };\n }\n\n if (flags.script) {\n for (let i = 0; i < result.layers.length; i++) {\n const layer = result.layers[i];\n if (!layer) continue;\n ctx.ui?.success?.(`# Layer ${i + 1}`, { sections: [{ header: '', items: layer.map(p => `pnpm --filter \"${p}\" run build`) }] });\n }\n return { ok: true };\n }\n\n const sections = flags.layers\n ? result.layers.map((layer, i) => ({\n header: `Layer ${i + 1} — ${layer.length} package(s) (parallel)`,\n items: layer,\n }))\n : [{ header: 'Build order', items: result.sorted.map((p, i) => `${i + 1}. ${p}`) }];\n\n sections.push({\n header: 'Summary',\n items: [`${result.packageCount} packages in ${result.layerCount} layers`],\n });\n\n ctx.ui?.success?.(flags.package ? `Build order for ${flags.package}` : 'Monorepo build order', { sections });\n return { ok: true };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/build-order.ts"],"names":[],"mappings":"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","file":"build-order.js","sourcesContent":["/**\n * quality:build-order - Calculate build order and dependency layers\n *\n * Uses topological sort to determine correct build order.\n * Shows build layers where each layer can build in parallel.\n */\n\nimport { defineCommand, useConfig, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { analyzeBuildOrder } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { BuildOrderFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<BuildOrderFlags>, unknown>({\n id: 'quality:build-order',\n description: 'Calculate build order using topological sort',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<BuildOrderFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n\n const result = analyzeBuildOrder({\n rootDir: cwd,\n layerMap: cfg.layers,\n filterPackage: flags.package,\n });\n\n if (result.hasCircular) {\n if (flags.json) {\n ctx.ui?.json?.({ ...result, ok: false });\n } else {\n ctx.ui?.error?.(`Circular dependencies detected — build order cannot be fully determined`, {\n sections: result.circular.map((cycle, i) => ({\n header: `Cycle ${i + 1}`,\n items: cycle,\n })),\n });\n }\n return { ok: false, error: 'Command failed' };\n }\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n return { ok: true };\n }\n\n if (flags.script) {\n for (let i = 0; i < result.layers.length; i++) {\n const layer = result.layers[i];\n if (!layer) continue;\n ctx.ui?.success?.(`# Layer ${i + 1}`, { sections: [{ header: '', items: layer.map(p => `pnpm --filter \"${p}\" run build`) }] });\n }\n return { ok: true };\n }\n\n const sections = flags.layers\n ? result.layers.map((layer, i) => ({\n header: `Layer ${i + 1} — ${layer.length} package(s) (parallel)`,\n items: layer,\n }))\n : [{ header: 'Build order', items: result.sorted.map((p, i) => `${i + 1}. ${p}`) }];\n\n sections.push({\n header: 'Summary',\n items: [`${result.packageCount} packages in ${result.layerCount} layers`],\n });\n\n ctx.ui?.success?.(flags.package ? `Build order for ${flags.package}` : 'Monorepo build order', { sections });\n return { ok: true };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/check-builds.ts"],"names":[],"mappings":"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","file":"check-builds.js","sourcesContent":["/**\n * quality:check-builds - Check build status across monorepo\n *\n * Analyzes build status including:\n * - Build failures with error messages\n * - Stale builds (dist/ older than src/)\n * - Build duration tracking\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { BuildCheckResult } from '@kb-labs/quality-contracts';\nimport { CACHE_KEYS } from '@kb-labs/quality-contracts';\nimport { checkBuilds } from '@kb-labs/quality-core/builds';\nimport type { CheckBuildsFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype CheckBuildsInput = CheckBuildsFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:check-builds',\n description: 'Check build status across monorepo',\n\n handler: {\n async execute(\n ctx: PluginContextV3,\n input: CheckBuildsInput\n ): Promise<CommandResult<BuildCheckResult>> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CheckBuildsInput }).flags\n : input;\n\n // Check cache unless refresh requested\n const cacheKey = `${CACHE_KEYS.BUILDS}:${flags.package || 'all'}`;\n\n if (!flags.refresh) {\n const cached = await platform.cache.get<BuildCheckResult>(cacheKey);\n if (cached) {\n outputBuildCheck({ ...cached, cached: true }, flags, ui);\n return cached.failing > 0\n ? { ok: false, error: 'Build failures found', result: cached }\n : { ok: true, result: cached };\n }\n }\n\n // Run build check\n const result = await checkBuilds(ctx.cwd, {\n packageFilter: flags.package,\n timeout: flags.timeout ? Number(flags.timeout) : 30000,\n });\n\n // Cache results for 10 minutes\n await platform.cache.set(cacheKey, result, 10 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:check-builds', {\n totalPackages: result.totalPackages,\n passing: result.passing,\n failing: result.failing,\n staleBuilds: result.staleBuilds.length,\n duration: result.duration,\n packageSpecific: !!flags.package,\n });\n\n // Output results\n outputBuildCheck({ ...result, cached: false }, flags, ui);\n\n return result.failing > 0\n ? { ok: false, error: 'Build failures found', result }\n : { ok: true, result };\n },\n },\n});\n\n/**\n * Output build check results\n */\nfunction outputBuildCheck(\n result: BuildCheckResult & { cached?: boolean },\n flags: Record<string, unknown>,\n ui: PluginContextV3['ui']\n) {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Status section\n const statusIcon = result.failing === 0 ? '✅' : '❌';\n const statusText = result.failing === 0 ? 'All builds passing' : 'Build failures detected';\n const statusItems = [\n `${statusIcon} ${statusText}`,\n `Passing: ${result.passing} package(s)`,\n result.failing > 0 ? `Failing: ${result.failing} package(s)` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Build Status', items: statusItems });\n\n // Failed packages\n if (result.failures.length > 0) {\n const failureItems: string[] = [];\n for (const failure of result.failures.slice(0, 5)) {\n failureItems.push(`• ${failure.package}`);\n // Show first line of error\n const firstLine = failure.error.split('\\n')[0];\n failureItems.push(` ${firstLine?.substring(0, 80) || 'Build failed'}`);\n }\n\n if (result.failures.length > 5) {\n failureItems.push(`... and ${result.failures.length - 5} more failures`);\n }\n\n sections.push({ header: '❌ Failed Packages', items: failureItems });\n }\n\n // Stale builds\n if (result.staleBuilds.length > 0) {\n const staleItems = result.staleBuilds.slice(0, 5).map((s) => `• ${s.package}`);\n\n if (result.staleBuilds.length > 5) {\n staleItems.push(`... and ${result.staleBuilds.length - 5} more`);\n }\n\n sections.push({\n header: '⚠️ Stale Builds (dist/ older than src/)',\n items: staleItems,\n });\n }\n\n // Summary\n const summaryItems = [\n `Total packages: ${result.totalPackages}`,\n `Duration: ${(result.duration / 1000).toFixed(1)}s`,\n result.cached ? '💾 Cached (use --refresh to recheck)' : '🔄 Fresh check',\n ];\n\n sections.push({ header: 'Summary', items: summaryItems });\n\n const title =\n result.failing === 0\n ? '✅ All Builds Passing'\n : `❌ ${result.failing} Build Failure(s) Detected`;\n\n ui?.success?.('Build check completed', {\n title,\n sections,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/check-builds.ts"],"names":[],"mappings":"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","file":"check-builds.js","sourcesContent":["/**\n * quality:check-builds - Check build status across monorepo\n *\n * Analyzes build status including:\n * - Build failures with error messages\n * - Stale builds (dist/ older than src/)\n * - Build duration tracking\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport type { BuildCheckResult } from '@kb-labs/quality-contracts';\nimport { CACHE_KEYS } from '@kb-labs/quality-contracts';\nimport { checkBuilds } from '@kb-labs/quality-core/builds';\nimport type { CheckBuildsFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype CheckBuildsInput = CheckBuildsFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:check-builds',\n description: 'Check build status across monorepo',\n\n handler: {\n async execute(\n ctx: PluginContextV3,\n input: CheckBuildsInput\n ): Promise<CommandResult<BuildCheckResult>> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CheckBuildsInput }).flags\n : input;\n\n // Check cache unless refresh requested\n const cacheKey = `${CACHE_KEYS.BUILDS}:${flags.package || 'all'}`;\n\n if (!flags.refresh) {\n const cached = await platform.cache.get<BuildCheckResult>(cacheKey);\n if (cached) {\n outputBuildCheck({ ...cached, cached: true }, flags, ui);\n return cached.failing > 0\n ? { ok: false, error: 'Build failures found', result: cached }\n : { ok: true, result: cached };\n }\n }\n\n // Run build check\n const result = await checkBuilds(ctx.cwd, {\n packageFilter: flags.package,\n timeout: flags.timeout ? Number(flags.timeout) : 30000,\n });\n\n // Cache results for 10 minutes\n await platform.cache.set(cacheKey, result, 10 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:check-builds', {\n totalPackages: result.totalPackages,\n passing: result.passing,\n failing: result.failing,\n staleBuilds: result.staleBuilds.length,\n duration: result.duration,\n packageSpecific: !!flags.package,\n });\n\n // Output results\n outputBuildCheck({ ...result, cached: false }, flags, ui);\n\n return result.failing > 0\n ? { ok: false, error: 'Build failures found', result }\n : { ok: true, result };\n },\n },\n});\n\n/**\n * Output build check results\n */\nfunction outputBuildCheck(\n result: BuildCheckResult & { cached?: boolean },\n flags: Record<string, unknown>,\n ui: PluginContextV3['ui']\n) {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Status section\n const statusIcon = result.failing === 0 ? '✅' : '❌';\n const statusText = result.failing === 0 ? 'All builds passing' : 'Build failures detected';\n const statusItems = [\n `${statusIcon} ${statusText}`,\n `Passing: ${result.passing} package(s)`,\n result.failing > 0 ? `Failing: ${result.failing} package(s)` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Build Status', items: statusItems });\n\n // Failed packages\n if (result.failures.length > 0) {\n const failureItems: string[] = [];\n for (const failure of result.failures.slice(0, 5)) {\n failureItems.push(`• ${failure.package}`);\n // Show first line of error\n const firstLine = failure.error.split('\\n')[0];\n failureItems.push(` ${firstLine?.substring(0, 80) || 'Build failed'}`);\n }\n\n if (result.failures.length > 5) {\n failureItems.push(`... and ${result.failures.length - 5} more failures`);\n }\n\n sections.push({ header: '❌ Failed Packages', items: failureItems });\n }\n\n // Stale builds\n if (result.staleBuilds.length > 0) {\n const staleItems = result.staleBuilds.slice(0, 5).map((s) => `• ${s.package}`);\n\n if (result.staleBuilds.length > 5) {\n staleItems.push(`... and ${result.staleBuilds.length - 5} more`);\n }\n\n sections.push({\n header: '⚠️ Stale Builds (dist/ older than src/)',\n items: staleItems,\n });\n }\n\n // Summary\n const summaryItems = [\n `Total packages: ${result.totalPackages}`,\n `Duration: ${(result.duration / 1000).toFixed(1)}s`,\n result.cached ? '💾 Cached (use --refresh to recheck)' : '🔄 Fresh check',\n ];\n\n sections.push({ header: 'Summary', items: summaryItems });\n\n const title =\n result.failing === 0\n ? '✅ All Builds Passing'\n : `❌ ${result.failing} Build Failure(s) Detected`;\n\n ui?.success?.('Build check completed', {\n title,\n sections,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/check-layers.ts"],"names":[],"mappings":";;;;AAWA,IAAO,uBAAQ,aAAA,CAA4D;AAAA,EACzE,EAAA,EAAI,sBAAA;AAAA,EACJ,WAAA,EAAa,iEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA2D;AAC7F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,QACnC,OAAA,EAAS,GAAA;AAAA,QACT,UAAU,MAAA,EAAQ;AAAA,OACnB,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,GACnB;AAAA,QACE,GAAG,MAAA;AAAA,QACH,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAyB,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,OAAQ,CAAC,CAAA;AAAA,QACrG,eAAA,EAAiB,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAyB,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,OAAQ,CAAC,CAAA,CAAE;AAAA,OAC9G,GACA,MAAA;AAEJ,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AACvB,QAAA,OAAO,QAAA,CAAS,eAAA,GAAkB,CAAA,GAC9B,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,wBAAA,EAA0B,MAAA,EAAQ,UAAS,GAC/D,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,QAAA,EAAS;AAAA,MACnC;AAEA,MAAA,IAAI,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAClC,QAAA,GAAA,CAAI,EAAA,EAAI,UAAU,8BAA8B,CAAA;AAChD,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwC;AAC9D,MAAA,KAAA,MAAW,CAAA,IAAK,SAAS,UAAA,EAAY;AACnC,QAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,WAAW,KAAK,EAAC;AAC9C,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,QAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAAA,MACnC;AAEA,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,EAAE,CAAA,MAAO;AAAA,QAC5D,QAAQ,CAAA,EAAG,GAAG,WAAW,EAAA,CAAG,CAAC,GAAG,SAAS,CAAA,CAAA,CAAA;AAAA,QACzC,KAAA,EAAO,EAAA,CAAG,GAAA,CAAI,CAAC,MAAyB,CAAA,OAAA,EAAK,CAAA,CAAE,SAAS,CAAA,QAAA,EAAW,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,CAAA,CAAE,eAAe,CAAA,CAAE;AAAA,OACvG,CAAE,CAAA;AAEF,MAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,eAAe,CAAA,0BAAA,EAA6B,QAAA,CAAS,gBAAA,CAAiB,MAAM,CAAA,WAAA,CAAA,EAAe,EAAE,QAAA,EAAU,CAAA;AACnI,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAC9C;AAAA;AAEJ,CAAC","file":"check-layers.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { analyzeLayering } from '@kb-labs/quality-core';\nimport { type QualityPluginConfig, type LayeringViolation } from '@kb-labs/quality-contracts';\nimport type { CheckLayersFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<CheckLayersFlags>, unknown>({\n id: 'quality:check-layers',\n description: 'Detect layering violations (lower layer importing higher layer)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<CheckLayersFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const report = await analyzeLayering({\n rootDir: cwd,\n layerMap: config?.layers,\n });\n\n const filtered = flags.package\n ? {\n ...report,\n violations: report.violations.filter((v: LayeringViolation) => v.fromPackage.includes(flags.package!)),\n totalViolations: report.violations.filter((v: LayeringViolation) => v.fromPackage.includes(flags.package!)).length,\n }\n : report;\n\n if (flags.json) {\n ctx.ui?.json?.(filtered);\n return filtered.totalViolations > 0\n ? { ok: false, error: 'Layer violations found', result: filtered }\n : { ok: true, result: filtered };\n }\n\n if (filtered.totalViolations === 0) {\n ctx.ui?.success?.('No layering violations found');\n return { ok: true };\n }\n\n const byPackage = new Map<string, typeof filtered.violations>();\n for (const v of filtered.violations) {\n const list = byPackage.get(v.fromPackage) ?? [];\n list.push(v);\n byPackage.set(v.fromPackage, list);\n }\n\n const sections = [...byPackage.entries()].map(([pkg, vs]) => ({\n header: `${pkg} (Layer ${vs[0]?.fromLayer})`,\n items: vs.map((v: LayeringViolation) => `→ ${v.toPackage} (Layer ${v.toLayer}) ${v.importSpecifier}`),\n }));\n\n ctx.ui?.error?.(`${filtered.totalViolations} layering violation(s) in ${filtered.affectedPackages.length} package(s)`, { sections });\n return { ok: false, error: 'Command failed' };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/check-layers.ts"],"names":[],"mappings":";;;;AAWA,IAAO,uBAAQ,aAAA,CAA4D;AAAA,EACzE,EAAA,EAAI,sBAAA;AAAA,EACJ,WAAA,EAAa,iEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA2D;AAC7F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB;AAAA,QACnC,OAAA,EAAS,GAAA;AAAA,QACT,UAAU,MAAA,EAAQ;AAAA,OACnB,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,GACnB;AAAA,QACE,GAAG,MAAA;AAAA,QACH,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAyB,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,OAAQ,CAAC,CAAA;AAAA,QACrG,eAAA,EAAiB,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAyB,CAAA,CAAE,WAAA,CAAY,QAAA,CAAS,KAAA,CAAM,OAAQ,CAAC,CAAA,CAAE;AAAA,OAC9G,GACA,MAAA;AAEJ,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AACvB,QAAA,OAAO,QAAA,CAAS,eAAA,GAAkB,CAAA,GAC9B,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,wBAAA,EAA0B,MAAA,EAAQ,UAAS,GAC/D,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,QAAA,EAAS;AAAA,MACnC;AAEA,MAAA,IAAI,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAClC,QAAA,GAAA,CAAI,EAAA,EAAI,UAAU,8BAA8B,CAAA;AAChD,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,MAAM,SAAA,uBAAgB,GAAA,EAAwC;AAC9D,MAAA,KAAA,MAAW,CAAA,IAAK,SAAS,UAAA,EAAY;AACnC,QAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,WAAW,KAAK,EAAC;AAC9C,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,QAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAAA,MACnC;AAEA,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,EAAE,CAAA,MAAO;AAAA,QAC5D,QAAQ,CAAA,EAAG,GAAG,WAAW,EAAA,CAAG,CAAC,GAAG,SAAS,CAAA,CAAA,CAAA;AAAA,QACzC,KAAA,EAAO,EAAA,CAAG,GAAA,CAAI,CAAC,MAAyB,CAAA,OAAA,EAAK,CAAA,CAAE,SAAS,CAAA,QAAA,EAAW,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,CAAA,CAAE,eAAe,CAAA,CAAE;AAAA,OACvG,CAAE,CAAA;AAEF,MAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,eAAe,CAAA,0BAAA,EAA6B,QAAA,CAAS,gBAAA,CAAiB,MAAM,CAAA,WAAA,CAAA,EAAe,EAAE,QAAA,EAAU,CAAA;AACnI,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,IAC9C;AAAA;AAEJ,CAAC","file":"check-layers.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { analyzeLayering } from '@kb-labs/quality-core';\nimport { type QualityPluginConfig, type LayeringViolation } from '@kb-labs/quality-contracts';\nimport type { CheckLayersFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<CheckLayersFlags>, unknown>({\n id: 'quality:check-layers',\n description: 'Detect layering violations (lower layer importing higher layer)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<CheckLayersFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const report = await analyzeLayering({\n rootDir: cwd,\n layerMap: config?.layers,\n });\n\n const filtered = flags.package\n ? {\n ...report,\n violations: report.violations.filter((v: LayeringViolation) => v.fromPackage.includes(flags.package!)),\n totalViolations: report.violations.filter((v: LayeringViolation) => v.fromPackage.includes(flags.package!)).length,\n }\n : report;\n\n if (flags.json) {\n ctx.ui?.json?.(filtered);\n return filtered.totalViolations > 0\n ? { ok: false, error: 'Layer violations found', result: filtered }\n : { ok: true, result: filtered };\n }\n\n if (filtered.totalViolations === 0) {\n ctx.ui?.success?.('No layering violations found');\n return { ok: true };\n }\n\n const byPackage = new Map<string, typeof filtered.violations>();\n for (const v of filtered.violations) {\n const list = byPackage.get(v.fromPackage) ?? [];\n list.push(v);\n byPackage.set(v.fromPackage, list);\n }\n\n const sections = [...byPackage.entries()].map(([pkg, vs]) => ({\n header: `${pkg} (Layer ${vs[0]?.fromLayer})`,\n items: vs.map((v: LayeringViolation) => `→ ${v.toPackage} (Layer ${v.toLayer}) ${v.importSpecifier}`),\n }));\n\n ctx.ui?.error?.(`${filtered.totalViolations} layering violation(s) in ${filtered.affectedPackages.length} package(s)`, { sections });\n return { ok: false, error: 'Command failed' };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/check-tests.ts"],"names":["summaryItems"],"mappings":"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","file":"check-tests.js","sourcesContent":["/**\n * quality:check-tests - Test execution and coverage tracking\n *\n * Runs tests across monorepo packages and collects coverage statistics.\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { runTests } from '@kb-labs/quality-core/tests';\nimport { CACHE_KEYS, type TestRunResult } from '@kb-labs/quality-contracts';\nimport { type CheckTestsFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype CheckTestsInput = CheckTestsFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:check-tests',\n description: 'Run tests and track coverage across monorepo',\n\n handler: {\n async execute(\n ctx: PluginContextV3,\n input: CheckTestsInput\n ): Promise<CommandResult<TestRunResult>> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CheckTestsInput }).flags\n : input;\n\n const cacheKey = `${CACHE_KEYS.TESTS}:${flags.package || 'all'}`;\n\n // Check cache unless refresh requested\n if (!flags.refresh) {\n const cached = await platform.cache.get<TestRunResult>(cacheKey);\n if (cached) {\n outputTestResults({ ...cached, cached: true }, flags, ui);\n return cached.failing > 0\n ? { ok: false, error: 'Test failures found', result: cached }\n : { ok: true, result: cached };\n }\n }\n\n // Run tests\n const result = await runTests(ctx.cwd, {\n packageFilter: flags.package,\n timeout: flags.timeout ? Number(flags.timeout) : 60000,\n withCoverage: flags['with-coverage'],\n coverageOnly: flags['coverage-only'],\n });\n\n // Cache result (5 min TTL - tests are slower)\n await platform.cache.set(cacheKey, result, 5 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:check-tests', {\n packageFilter: flags.package || 'all',\n totalPackages: result.totalPackages,\n passing: result.passing,\n failing: result.failing,\n withCoverage: flags['with-coverage'],\n cached: false,\n });\n\n // Output results\n outputTestResults({ ...result, cached: false }, flags, ui);\n\n return result.failing > 0\n ? { ok: false, error: 'Test failures found', result, meta: { cached: false } }\n : { ok: true, result, meta: { cached: false } };\n },\n },\n});\n\n/**\n * Output test results\n */\nfunction outputTestResults(\n result: TestRunResult & { cached: boolean },\n flags: CheckTestsInput,\n ui: PluginContextV3['ui']\n): void {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Status section\n const statusIcon = result.failing === 0 ? '✅' : '❌';\n const statusText = result.failing === 0 ? 'All tests passing' : 'Test failures detected';\n const statusItems = [\n `${statusIcon} ${statusText}`,\n `Total packages: ${result.totalPackages}`,\n `Passing: ${result.passing}`,\n result.failing > 0 ? `Failing: ${result.failing}` : null,\n result.skipped > 0 ? `Skipped: ${result.skipped} (no test script)` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Test Status', items: statusItems });\n\n // Test summary\n if (result.summary.totalTests > 0) {\n const summaryItems = [\n `Total tests: ${result.summary.totalTests}`,\n `Passed: ${result.summary.passedTests}`,\n result.summary.failedTests > 0 ? `Failed: ${result.summary.failedTests}` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Test Summary', items: summaryItems });\n }\n\n // Failed packages\n if (result.failures.length > 0) {\n const failureItems: string[] = [];\n for (const failure of result.failures.slice(0, 5)) {\n failureItems.push(`❌ ${failure.package}`);\n if (failure.failedTests && failure.totalTests) {\n failureItems.push(` ${failure.failedTests}/${failure.totalTests} tests failed`);\n }\n // Show first line of error\n const firstLine = failure.error.split('\\n')[0];\n failureItems.push(` ${firstLine?.substring(0, 80) || 'Test failed'}`);\n }\n\n if (result.failures.length > 5) {\n failureItems.push(`... and ${result.failures.length - 5} more failures`);\n }\n\n sections.push({ header: 'Failed Packages', items: failureItems });\n }\n\n // Coverage section (if available)\n if (result.coverage.packages.length > 0) {\n const coverageItems: string[] = [];\n coverageItems.push(`Average coverage: ${result.coverage.avgCoverage.toFixed(1)}%`);\n coverageItems.push('');\n\n const topPackages = result.coverage.packages\n .sort((a, b) => b.lines - a.lines)\n .slice(0, 5);\n\n for (const pkg of topPackages) {\n coverageItems.push(`${pkg.name}`);\n coverageItems.push(\n ` Lines: ${pkg.lines.toFixed(1)}% | Statements: ${pkg.statements.toFixed(1)}% | Functions: ${pkg.functions.toFixed(1)}% | Branches: ${pkg.branches.toFixed(1)}%`\n );\n }\n\n if (result.coverage.packages.length > 5) {\n coverageItems.push(`... and ${result.coverage.packages.length - 5} more packages`);\n }\n\n sections.push({ header: 'Coverage', items: coverageItems });\n }\n\n // Summary\n const summaryItems = [\n `Duration: ${(result.duration / 1000).toFixed(1)}s`,\n result.cached ? '💾 Cached (use --refresh to re-run)' : '🔄 Fresh run',\n ];\n\n sections.push({ header: 'Summary', items: summaryItems });\n\n const title =\n result.failing === 0\n ? '✅ All Tests Passed'\n : `❌ ${result.failing} Package(s) with Test Failures`;\n\n ui?.success?.('Test run completed', {\n title,\n sections,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/check-tests.ts"],"names":["summaryItems"],"mappings":"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","file":"check-tests.js","sourcesContent":["/**\n * quality:check-tests - Test execution and coverage tracking\n *\n * Runs tests across monorepo packages and collects coverage statistics.\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { runTests } from '@kb-labs/quality-core/tests';\nimport { CACHE_KEYS, type TestRunResult } from '@kb-labs/quality-contracts';\nimport { type CheckTestsFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype CheckTestsInput = CheckTestsFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:check-tests',\n description: 'Run tests and track coverage across monorepo',\n\n handler: {\n async execute(\n ctx: PluginContextV3,\n input: CheckTestsInput\n ): Promise<CommandResult<TestRunResult>> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CheckTestsInput }).flags\n : input;\n\n const cacheKey = `${CACHE_KEYS.TESTS}:${flags.package || 'all'}`;\n\n // Check cache unless refresh requested\n if (!flags.refresh) {\n const cached = await platform.cache.get<TestRunResult>(cacheKey);\n if (cached) {\n outputTestResults({ ...cached, cached: true }, flags, ui);\n return cached.failing > 0\n ? { ok: false, error: 'Test failures found', result: cached }\n : { ok: true, result: cached };\n }\n }\n\n // Run tests\n const result = await runTests(ctx.cwd, {\n packageFilter: flags.package,\n timeout: flags.timeout ? Number(flags.timeout) : 60000,\n withCoverage: flags['with-coverage'],\n coverageOnly: flags['coverage-only'],\n });\n\n // Cache result (5 min TTL - tests are slower)\n await platform.cache.set(cacheKey, result, 5 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:check-tests', {\n packageFilter: flags.package || 'all',\n totalPackages: result.totalPackages,\n passing: result.passing,\n failing: result.failing,\n withCoverage: flags['with-coverage'],\n cached: false,\n });\n\n // Output results\n outputTestResults({ ...result, cached: false }, flags, ui);\n\n return result.failing > 0\n ? { ok: false, error: 'Test failures found', result, meta: { cached: false } }\n : { ok: true, result, meta: { cached: false } };\n },\n },\n});\n\n/**\n * Output test results\n */\nfunction outputTestResults(\n result: TestRunResult & { cached: boolean },\n flags: CheckTestsInput,\n ui: PluginContextV3['ui']\n): void {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Status section\n const statusIcon = result.failing === 0 ? '✅' : '❌';\n const statusText = result.failing === 0 ? 'All tests passing' : 'Test failures detected';\n const statusItems = [\n `${statusIcon} ${statusText}`,\n `Total packages: ${result.totalPackages}`,\n `Passing: ${result.passing}`,\n result.failing > 0 ? `Failing: ${result.failing}` : null,\n result.skipped > 0 ? `Skipped: ${result.skipped} (no test script)` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Test Status', items: statusItems });\n\n // Test summary\n if (result.summary.totalTests > 0) {\n const summaryItems = [\n `Total tests: ${result.summary.totalTests}`,\n `Passed: ${result.summary.passedTests}`,\n result.summary.failedTests > 0 ? `Failed: ${result.summary.failedTests}` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Test Summary', items: summaryItems });\n }\n\n // Failed packages\n if (result.failures.length > 0) {\n const failureItems: string[] = [];\n for (const failure of result.failures.slice(0, 5)) {\n failureItems.push(`❌ ${failure.package}`);\n if (failure.failedTests && failure.totalTests) {\n failureItems.push(` ${failure.failedTests}/${failure.totalTests} tests failed`);\n }\n // Show first line of error\n const firstLine = failure.error.split('\\n')[0];\n failureItems.push(` ${firstLine?.substring(0, 80) || 'Test failed'}`);\n }\n\n if (result.failures.length > 5) {\n failureItems.push(`... and ${result.failures.length - 5} more failures`);\n }\n\n sections.push({ header: 'Failed Packages', items: failureItems });\n }\n\n // Coverage section (if available)\n if (result.coverage.packages.length > 0) {\n const coverageItems: string[] = [];\n coverageItems.push(`Average coverage: ${result.coverage.avgCoverage.toFixed(1)}%`);\n coverageItems.push('');\n\n const topPackages = result.coverage.packages\n .sort((a, b) => b.lines - a.lines)\n .slice(0, 5);\n\n for (const pkg of topPackages) {\n coverageItems.push(`${pkg.name}`);\n coverageItems.push(\n ` Lines: ${pkg.lines.toFixed(1)}% | Statements: ${pkg.statements.toFixed(1)}% | Functions: ${pkg.functions.toFixed(1)}% | Branches: ${pkg.branches.toFixed(1)}%`\n );\n }\n\n if (result.coverage.packages.length > 5) {\n coverageItems.push(`... and ${result.coverage.packages.length - 5} more packages`);\n }\n\n sections.push({ header: 'Coverage', items: coverageItems });\n }\n\n // Summary\n const summaryItems = [\n `Duration: ${(result.duration / 1000).toFixed(1)}s`,\n result.cached ? '💾 Cached (use --refresh to re-run)' : '🔄 Fresh run',\n ];\n\n sections.push({ header: 'Summary', items: summaryItems });\n\n const title =\n result.failing === 0\n ? '✅ All Tests Passed'\n : `❌ ${result.failing} Package(s) with Test Failures`;\n\n ui?.success?.('Test run completed', {\n title,\n sections,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/check-types.ts"],"names":[],"mappings":"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","file":"check-types.js","sourcesContent":["/**\n * quality:check-types - TypeScript type safety analysis\n *\n * Analyzes TypeScript type errors, warnings, and coverage across monorepo.\n * Uses TypeScript Compiler API for semantic analysis.\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { analyzeTypes } from '@kb-labs/quality-core/types';\nimport { CACHE_KEYS, type TypeAnalysisResult } from '@kb-labs/quality-contracts';\nimport { type CheckTypesFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype CheckTypesInput = CheckTypesFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:check-types',\n description: 'Analyze TypeScript type safety across monorepo',\n\n handler: {\n async execute(\n ctx: PluginContextV3,\n input: CheckTypesInput\n ): Promise<CommandResult<TypeAnalysisResult>> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CheckTypesInput }).flags\n : input;\n\n const cacheKey = `${CACHE_KEYS.TYPE_ANALYSIS}:${flags.package || 'all'}`;\n\n // Check cache unless refresh requested\n if (!flags.refresh) {\n const cached = await platform.cache.get<TypeAnalysisResult>(cacheKey);\n if (cached) {\n outputTypeAnalysis({ ...cached, cached: true }, flags, ui);\n return cached.totalErrors > 0\n ? { ok: false, error: 'Type errors found', result: cached }\n : { ok: true, result: cached };\n }\n }\n\n // Run type analysis\n const result = await analyzeTypes(ctx.cwd, {\n packageFilter: flags.package,\n errorsOnly: flags['errors-only'],\n });\n\n // Cache result (10 min TTL)\n await platform.cache.set(cacheKey, result, 10 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:check-types', {\n packageFilter: flags.package || 'all',\n totalPackages: result.totalPackages,\n totalErrors: result.totalErrors,\n avgCoverage: result.avgCoverage,\n cached: false,\n });\n\n // Output results\n outputTypeAnalysis({ ...result, cached: false }, flags, ui);\n\n return result.totalErrors > 0\n ? { ok: false, error: 'Type errors found', result, meta: { cached: false } }\n : { ok: true, result, meta: { cached: false } };\n },\n },\n});\n\n/**\n * Output type analysis results\n */\nfunction outputTypeAnalysis(\n result: TypeAnalysisResult & { cached: boolean },\n flags: CheckTypesInput,\n ui: PluginContextV3['ui']\n): void {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n const errorsOnly = flags['errors-only'] || false;\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Status section\n const statusIcon = result.totalErrors === 0 ? '✅' : '❌';\n const statusText =\n result.totalErrors === 0 ? 'All packages passed type checks' : 'Type errors detected';\n const statusItems = [\n `${statusIcon} ${statusText}`,\n `Analyzed: ${result.totalPackages} package(s)`,\n `Errors: ${result.totalErrors}`,\n `Warnings: ${result.totalWarnings}`,\n `Avg Coverage: ${result.avgCoverage.toFixed(1)}%`,\n ];\n\n sections.push({ header: 'Type Safety Status', items: statusItems });\n\n // Packages with errors\n if (result.packagesWithErrors > 0) {\n const errorItems: string[] = [];\n const packagesToShow = result.packages\n .filter((pkg) => !errorsOnly || pkg.errors > 0)\n .slice(0, 10);\n\n for (const pkg of packagesToShow) {\n const status = pkg.errors > 0 ? '❌' : '✅';\n errorItems.push(`${status} ${pkg.name}`);\n\n const details = [\n pkg.errors > 0 ? `${pkg.errors} error(s)` : null,\n pkg.warnings > 0 ? `${pkg.warnings} warning(s)` : null,\n `${pkg.coverage.toFixed(1)}% coverage`,\n pkg.anyCount > 0 ? `${pkg.anyCount} any` : null,\n pkg.tsIgnoreCount > 0 ? `${pkg.tsIgnoreCount} @ts-ignore` : null,\n ]\n .filter(Boolean)\n .join(', ');\n\n errorItems.push(` ${details}`);\n }\n\n if (result.packages.length > 10) {\n errorItems.push(`... and ${result.packages.length - 10} more packages`);\n }\n\n sections.push({\n header: `Packages with Type Errors (${result.packagesWithErrors})`,\n items: errorItems,\n });\n }\n\n // Coverage distribution\n const excellent = result.packages.filter((p) => p.coverage >= 90).length;\n const good = result.packages.filter((p) => p.coverage >= 70 && p.coverage < 90).length;\n const poor = result.packages.filter((p) => p.coverage < 70).length;\n\n if (result.packages.length > 0) {\n const coverageItems = [\n `✅ Excellent (≥90%): ${excellent} package(s)`,\n `⚠️ Good (70-90%): ${good} package(s)`,\n poor > 0 ? `❌ Poor (<70%): ${poor} package(s)` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Type Coverage Distribution', items: coverageItems });\n }\n\n // Summary\n const summaryItems = [\n `Total packages: ${result.totalPackages}`,\n `Duration: ${(result.duration / 1000).toFixed(1)}s`,\n result.cached ? '💾 Cached (use --refresh to recheck)' : '🔄 Fresh analysis',\n ];\n\n sections.push({ header: 'Summary', items: summaryItems });\n\n const title =\n result.totalErrors === 0\n ? '✅ All Type Checks Passed'\n : `❌ ${result.packagesWithErrors} Package(s) with Type Errors`;\n\n ui?.success?.('Type analysis completed', {\n title,\n sections,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/check-types.ts"],"names":[],"mappings":"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","file":"check-types.js","sourcesContent":["/**\n * quality:check-types - TypeScript type safety analysis\n *\n * Analyzes TypeScript type errors, warnings, and coverage across monorepo.\n * Uses TypeScript Compiler API for semantic analysis.\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { analyzeTypes } from '@kb-labs/quality-core/types';\nimport { CACHE_KEYS, type TypeAnalysisResult } from '@kb-labs/quality-contracts';\nimport { type CheckTypesFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype CheckTypesInput = CheckTypesFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:check-types',\n description: 'Analyze TypeScript type safety across monorepo',\n\n handler: {\n async execute(\n ctx: PluginContextV3,\n input: CheckTypesInput\n ): Promise<CommandResult<TypeAnalysisResult>> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CheckTypesInput }).flags\n : input;\n\n const cacheKey = `${CACHE_KEYS.TYPE_ANALYSIS}:${flags.package || 'all'}`;\n\n // Check cache unless refresh requested\n if (!flags.refresh) {\n const cached = await platform.cache.get<TypeAnalysisResult>(cacheKey);\n if (cached) {\n outputTypeAnalysis({ ...cached, cached: true }, flags, ui);\n return cached.totalErrors > 0\n ? { ok: false, error: 'Type errors found', result: cached }\n : { ok: true, result: cached };\n }\n }\n\n // Run type analysis\n const result = await analyzeTypes(ctx.cwd, {\n packageFilter: flags.package,\n errorsOnly: flags['errors-only'],\n });\n\n // Cache result (10 min TTL)\n await platform.cache.set(cacheKey, result, 10 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:check-types', {\n packageFilter: flags.package || 'all',\n totalPackages: result.totalPackages,\n totalErrors: result.totalErrors,\n avgCoverage: result.avgCoverage,\n cached: false,\n });\n\n // Output results\n outputTypeAnalysis({ ...result, cached: false }, flags, ui);\n\n return result.totalErrors > 0\n ? { ok: false, error: 'Type errors found', result, meta: { cached: false } }\n : { ok: true, result, meta: { cached: false } };\n },\n },\n});\n\n/**\n * Output type analysis results\n */\nfunction outputTypeAnalysis(\n result: TypeAnalysisResult & { cached: boolean },\n flags: CheckTypesInput,\n ui: PluginContextV3['ui']\n): void {\n if (flags.json) {\n ui?.json?.(result);\n return;\n }\n\n const errorsOnly = flags['errors-only'] || false;\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Status section\n const statusIcon = result.totalErrors === 0 ? '✅' : '❌';\n const statusText =\n result.totalErrors === 0 ? 'All packages passed type checks' : 'Type errors detected';\n const statusItems = [\n `${statusIcon} ${statusText}`,\n `Analyzed: ${result.totalPackages} package(s)`,\n `Errors: ${result.totalErrors}`,\n `Warnings: ${result.totalWarnings}`,\n `Avg Coverage: ${result.avgCoverage.toFixed(1)}%`,\n ];\n\n sections.push({ header: 'Type Safety Status', items: statusItems });\n\n // Packages with errors\n if (result.packagesWithErrors > 0) {\n const errorItems: string[] = [];\n const packagesToShow = result.packages\n .filter((pkg) => !errorsOnly || pkg.errors > 0)\n .slice(0, 10);\n\n for (const pkg of packagesToShow) {\n const status = pkg.errors > 0 ? '❌' : '✅';\n errorItems.push(`${status} ${pkg.name}`);\n\n const details = [\n pkg.errors > 0 ? `${pkg.errors} error(s)` : null,\n pkg.warnings > 0 ? `${pkg.warnings} warning(s)` : null,\n `${pkg.coverage.toFixed(1)}% coverage`,\n pkg.anyCount > 0 ? `${pkg.anyCount} any` : null,\n pkg.tsIgnoreCount > 0 ? `${pkg.tsIgnoreCount} @ts-ignore` : null,\n ]\n .filter(Boolean)\n .join(', ');\n\n errorItems.push(` ${details}`);\n }\n\n if (result.packages.length > 10) {\n errorItems.push(`... and ${result.packages.length - 10} more packages`);\n }\n\n sections.push({\n header: `Packages with Type Errors (${result.packagesWithErrors})`,\n items: errorItems,\n });\n }\n\n // Coverage distribution\n const excellent = result.packages.filter((p) => p.coverage >= 90).length;\n const good = result.packages.filter((p) => p.coverage >= 70 && p.coverage < 90).length;\n const poor = result.packages.filter((p) => p.coverage < 70).length;\n\n if (result.packages.length > 0) {\n const coverageItems = [\n `✅ Excellent (≥90%): ${excellent} package(s)`,\n `⚠️ Good (70-90%): ${good} package(s)`,\n poor > 0 ? `❌ Poor (<70%): ${poor} package(s)` : null,\n ].filter(Boolean) as string[];\n\n sections.push({ header: 'Type Coverage Distribution', items: coverageItems });\n }\n\n // Summary\n const summaryItems = [\n `Total packages: ${result.totalPackages}`,\n `Duration: ${(result.duration / 1000).toFixed(1)}s`,\n result.cached ? '💾 Cached (use --refresh to recheck)' : '🔄 Fresh analysis',\n ];\n\n sections.push({ header: 'Summary', items: summaryItems });\n\n const title =\n result.totalErrors === 0\n ? '✅ All Type Checks Passed'\n : `❌ ${result.packagesWithErrors} Package(s) with Type Errors`;\n\n ui?.success?.('Type analysis completed', {\n title,\n sections,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/context.ts"],"names":[],"mappings":"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","file":"context.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { scanWorkspace, buildPackageMap } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { ContextFlags } from './flags.js';\n\nconst LAYER_NAMES: Record<number, string> = {\n 0: 'core',\n 1: 'sdk / shared',\n 2: 'cli / adapters',\n 3: 'plugins',\n 4: 'studio',\n};\n\nexport default defineCommand<unknown, CLIInput<ContextFlags>, unknown>({\n id: 'quality:context',\n description: 'Package context for agents: layer, dependents, dependencies, coupling',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ContextFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const layerMap = config?.layers ?? defaultQualityConfig.layers;\n\n const packages = scanWorkspace(cwd, layerMap);\n const packageMap = buildPackageMap(packages);\n const allNames = new Set(packageMap.keys());\n\n const pkgName = flags.package;\n\n if (!pkgName) {\n // No package specified — show workspace summary\n const byLayer = new Map<number, string[]>();\n for (const p of packages) {\n const list = byLayer.get(p.layer) ?? [];\n list.push(p.name);\n byLayer.set(p.layer, list);\n }\n\n if (flags.json) {\n const summary = Object.fromEntries(\n [...byLayer.entries()].map(([l, names]) => [LAYER_NAMES[l] ?? `layer-${l}`, names])\n );\n ctx.ui?.json?.({ totalPackages: packages.length, byLayer: summary });\n return { ok: true };\n }\n\n const sections = [...byLayer.entries()]\n .sort(([a], [b]) => a - b)\n .map(([layer, names]) => ({\n header: `Layer ${layer}: ${LAYER_NAMES[layer] ?? 'unknown'} (${names.length})`,\n items: names,\n }));\n\n ctx.ui?.success?.(`Workspace: ${packages.length} packages`, { sections });\n return { ok: true };\n }\n\n const pkg = packageMap.get(pkgName);\n if (!pkg) {\n ctx.ui?.error?.(`Package not found: ${pkgName}`);\n return { ok: false, error: 'Command failed' };\n }\n\n // Workspace deps (efferent)\n const wsDeps = pkg.deps.filter(d => allNames.has(d));\n const wsDevDeps = pkg.devDeps.filter(d => allNames.has(d));\n\n // Who depends on this package (afferent) — scan all packages\n const dependents = packages\n .filter(p => p.name !== pkgName && (p.deps.includes(pkgName) || p.devDeps.includes(pkgName)))\n .map(p => p.name);\n\n const ce = wsDeps.length + wsDevDeps.length;\n const ca = dependents.length;\n const instability = ca + ce === 0 ? 0 : Math.round((ce / (ca + ce)) * 100) / 100;\n\n const context = {\n name: pkgName,\n layer: pkg.layer,\n layerName: LAYER_NAMES[pkg.layer] ?? 'unknown',\n dir: pkg.dir.replace(cwd + '/', ''),\n coupling: { afferent: ca, efferent: ce, instability },\n dependents,\n dependencies: wsDeps,\n devDependencies: wsDevDeps,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(context);\n return { ok: true };\n }\n\n ctx.ui?.success?.(`Context: ${pkgName}`, {\n sections: [\n {\n header: 'Package info',\n items: [\n `Layer: ${pkg.layer} (${LAYER_NAMES[pkg.layer] ?? 'unknown'})`,\n `Dir: ${context.dir}`,\n `Instability: ${instability} Ca: ${ca} Ce: ${ce}`,\n ],\n },\n ...(dependents.length > 0\n ? [{ header: `Dependents (${ca}) — packages that import this`, items: dependents }]\n : [{ header: 'Dependents', items: ['none — this package is a leaf'] }]),\n ...(wsDeps.length > 0\n ? [{ header: `Dependencies (${wsDeps.length}) — workspace packages this imports`, items: wsDeps }]\n : []),\n ...(wsDevDeps.length > 0\n ? [{ header: `Dev dependencies (${wsDevDeps.length})`, items: wsDevDeps }]\n : []),\n ],\n });\n\n return { ok: true };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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","file":"context.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { scanWorkspace, buildPackageMap } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { ContextFlags } from './flags.js';\n\nconst LAYER_NAMES: Record<number, string> = {\n 0: 'core',\n 1: 'sdk / shared',\n 2: 'cli / adapters',\n 3: 'plugins',\n 4: 'studio',\n};\n\nexport default defineCommand<unknown, CLIInput<ContextFlags>, unknown>({\n id: 'quality:context',\n description: 'Package context for agents: layer, dependents, dependencies, coupling',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ContextFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const layerMap = config?.layers ?? defaultQualityConfig.layers;\n\n const packages = scanWorkspace(cwd, layerMap);\n const packageMap = buildPackageMap(packages);\n const allNames = new Set(packageMap.keys());\n\n const pkgName = flags.package;\n\n if (!pkgName) {\n // No package specified — show workspace summary\n const byLayer = new Map<number, string[]>();\n for (const p of packages) {\n const list = byLayer.get(p.layer) ?? [];\n list.push(p.name);\n byLayer.set(p.layer, list);\n }\n\n if (flags.json) {\n const summary = Object.fromEntries(\n [...byLayer.entries()].map(([l, names]) => [LAYER_NAMES[l] ?? `layer-${l}`, names])\n );\n ctx.ui?.json?.({ totalPackages: packages.length, byLayer: summary });\n return { ok: true };\n }\n\n const sections = [...byLayer.entries()]\n .sort(([a], [b]) => a - b)\n .map(([layer, names]) => ({\n header: `Layer ${layer}: ${LAYER_NAMES[layer] ?? 'unknown'} (${names.length})`,\n items: names,\n }));\n\n ctx.ui?.success?.(`Workspace: ${packages.length} packages`, { sections });\n return { ok: true };\n }\n\n const pkg = packageMap.get(pkgName);\n if (!pkg) {\n ctx.ui?.error?.(`Package not found: ${pkgName}`);\n return { ok: false, error: 'Command failed' };\n }\n\n // Workspace deps (efferent)\n const wsDeps = pkg.deps.filter(d => allNames.has(d));\n const wsDevDeps = pkg.devDeps.filter(d => allNames.has(d));\n\n // Who depends on this package (afferent) — scan all packages\n const dependents = packages\n .filter(p => p.name !== pkgName && (p.deps.includes(pkgName) || p.devDeps.includes(pkgName)))\n .map(p => p.name);\n\n const ce = wsDeps.length + wsDevDeps.length;\n const ca = dependents.length;\n const instability = ca + ce === 0 ? 0 : Math.round((ce / (ca + ce)) * 100) / 100;\n\n const context = {\n name: pkgName,\n layer: pkg.layer,\n layerName: LAYER_NAMES[pkg.layer] ?? 'unknown',\n dir: pkg.dir.replace(cwd + '/', ''),\n coupling: { afferent: ca, efferent: ce, instability },\n dependents,\n dependencies: wsDeps,\n devDependencies: wsDevDeps,\n };\n\n if (flags.json) {\n ctx.ui?.json?.(context);\n return { ok: true };\n }\n\n ctx.ui?.success?.(`Context: ${pkgName}`, {\n sections: [\n {\n header: 'Package info',\n items: [\n `Layer: ${pkg.layer} (${LAYER_NAMES[pkg.layer] ?? 'unknown'})`,\n `Dir: ${context.dir}`,\n `Instability: ${instability} Ca: ${ca} Ce: ${ce}`,\n ],\n },\n ...(dependents.length > 0\n ? [{ header: `Dependents (${ca}) — packages that import this`, items: dependents }]\n : [{ header: 'Dependents', items: ['none — this package is a leaf'] }]),\n ...(wsDeps.length > 0\n ? [{ header: `Dependencies (${wsDeps.length}) — workspace packages this imports`, items: wsDeps }]\n : []),\n ...(wsDevDeps.length > 0\n ? [{ header: `Dev dependencies (${wsDevDeps.length})`, items: wsDevDeps }]\n : []),\n ],\n });\n\n return { ok: true };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/coupling.ts"],"names":[],"mappings":";;;;AAWA,IAAO,mBAAQ,aAAA,CAAyD;AAAA,EACtE,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,mEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwD;AAC1F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,GAAA,EAAK,CAAA;AAE1F,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AACrB,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,MAAM,MAAA,GACJ,KAAA,CAAM,IAAA,KAAS,SAAA,GACX,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,CAAS,CAAA,GACvF,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,GAAc,EAAE,WAAW,CAAA;AAEvE,MAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,OAAO,EAAE,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,UAAA,EAAY,WAAA,IAAe,IAAA;AAErD,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK;AACzB,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,WAAA,GAAc,SAAA,GAAY,kBAAA,GAAgB,EAAA;AACzD,QAAA,OAAO,GAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAQ,EAAE,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,GAAG,IAAI,CAAA,CAAA;AAAA,MAC/F,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA,iCAAA,EAA+B,MAAA,CAAO,eAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,QACnF,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,OAAO,GAAA,CAAI,MAAM,CAAA,eAAA,CAAA,EAAmB,KAAA,EAAO;AAAA,OACjE,CAAA;AAED,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"coupling.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { analyzeCoupling } from '@kb-labs/quality-core';\nimport { type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { CouplingFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<CouplingFlags>, unknown>({\n id: 'quality:coupling',\n description: 'Show coupling metrics per package (afferent/efferent/instability)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<CouplingFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const report = analyzeCoupling({ rootDir: cwd, layerMap: config?.layers, topN: flags.top });\n\n if (flags.json) {\n ctx.ui?.json?.(report);\n return { ok: true };\n }\n\n const sorted =\n flags.sort === 'coupled'\n ? [...report.packages].sort((a, b) => b.afferent + b.efferent - (a.afferent + a.efferent))\n : [...report.packages].sort((a, b) => b.instability - a.instability);\n\n const top = sorted.slice(0, flags.top ?? 10);\n const threshold = config?.thresholds?.instability ?? 0.85;\n\n const items = top.map(p => {\n const warn = p.instability > threshold ? ' ⚠ unstable' : '';\n return `${p.name} Ca: ${p.afferent} Ce: ${p.efferent} I: ${p.instability.toFixed(2)}${warn}`;\n });\n\n ctx.ui?.success?.(`Coupling — avg instability: ${report.avgInstability.toFixed(2)}`, {\n sections: [{ header: `Top ${top.length} by instability`, items }],\n });\n\n return { ok: true };\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/coupling.ts"],"names":[],"mappings":";;;;AAWA,IAAO,mBAAQ,aAAA,CAAyD;AAAA,EACtE,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,mEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAwD;AAC1F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,GAAA,EAAK,CAAA;AAE1F,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,MAAM,CAAA;AACrB,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB;AAEA,MAAA,MAAM,MAAA,GACJ,KAAA,CAAM,IAAA,KAAS,SAAA,GACX,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,CAAS,CAAA,GACvF,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,WAAA,GAAc,EAAE,WAAW,CAAA;AAEvE,MAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,OAAO,EAAE,CAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,MAAA,EAAQ,UAAA,EAAY,WAAA,IAAe,IAAA;AAErD,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK;AACzB,QAAA,MAAM,IAAA,GAAO,CAAA,CAAE,WAAA,GAAc,SAAA,GAAY,kBAAA,GAAgB,EAAA;AACzD,QAAA,OAAO,GAAG,CAAA,CAAE,IAAI,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,MAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,KAAA,EAAQ,EAAE,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,GAAG,IAAI,CAAA,CAAA;AAAA,MAC/F,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA,iCAAA,EAA+B,MAAA,CAAO,eAAe,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI;AAAA,QACnF,QAAA,EAAU,CAAC,EAAE,MAAA,EAAQ,OAAO,GAAA,CAAI,MAAM,CAAA,eAAA,CAAA,EAAmB,KAAA,EAAO;AAAA,OACjE,CAAA;AAED,MAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,IACpB;AAAA;AAEJ,CAAC","file":"coupling.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport { analyzeCoupling } from '@kb-labs/quality-core';\nimport { type QualityPluginConfig } from '@kb-labs/quality-contracts';\nimport type { CouplingFlags } from './flags.js';\n\nexport default defineCommand<unknown, CLIInput<CouplingFlags>, unknown>({\n id: 'quality:coupling',\n description: 'Show coupling metrics per package (afferent/efferent/instability)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<CouplingFlags>): Promise<CommandResult> {\n const { flags } = input;\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n\n const report = analyzeCoupling({ rootDir: cwd, layerMap: config?.layers, topN: flags.top });\n\n if (flags.json) {\n ctx.ui?.json?.(report);\n return { ok: true };\n }\n\n const sorted =\n flags.sort === 'coupled'\n ? [...report.packages].sort((a, b) => b.afferent + b.efferent - (a.afferent + a.efferent))\n : [...report.packages].sort((a, b) => b.instability - a.instability);\n\n const top = sorted.slice(0, flags.top ?? 10);\n const threshold = config?.thresholds?.instability ?? 0.85;\n\n const items = top.map(p => {\n const warn = p.instability > threshold ? ' ⚠ unstable' : '';\n return `${p.name} Ca: ${p.afferent} Ce: ${p.efferent} I: ${p.instability.toFixed(2)}${warn}`;\n });\n\n ctx.ui?.success?.(`Coupling — avg instability: ${report.avgInstability.toFixed(2)}`, {\n sections: [{ header: `Top ${top.length} by instability`, items }],\n });\n\n return { ok: true };\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/cli/commands/cycles.ts"],"names":[],"mappings":"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","file":"cycles.js","sourcesContent":["/**\n * quality:cycles - Detect circular dependencies\n *\n * Uses DFS to find all circular dependency chains in the monorepo.\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport {\n buildDependencyGraph,\n findCircularDependencies,\n} from '@kb-labs/quality-core/graph';\n\ntype CyclesFlags = {\n json?: boolean;\n argv?: string[];\n};\n\ntype CyclesInput = CyclesFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:cycles',\n description: 'Detect circular dependencies in monorepo',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CyclesInput): Promise<CommandResult<{ cycles: string[][] }>> {\n const { ui } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CyclesInput }).flags\n : input;\n\n // Build dependency graph\n const graph = buildDependencyGraph(ctx.cwd);\n\n // Find circular dependencies\n const cycles = findCircularDependencies(graph);\n\n // Output results\n outputCycles(cycles, flags, ui);\n\n return cycles.length > 0\n ? { ok: false, error: 'Circular dependencies found', result: { cycles } }\n : { ok: true, result: { cycles } };\n },\n },\n});\n\n/**\n * Output circular dependencies\n */\nfunction outputCycles(cycles: string[][], flags: Record<string, unknown>, ui: PluginContextV3['ui']) {\n if (flags.json) {\n ui?.json?.({ cycles, count: cycles.length });\n return;\n }\n\n if (cycles.length === 0) {\n ui?.success?.('No circular dependencies found', {\n title: '✅ Circular Dependencies Check',\n sections: [\n {\n header: 'Result',\n items: ['✅ No circular dependencies detected'],\n },\n ],\n });\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Summary\n sections.push({\n header: 'Summary',\n items: [\n `⚠️ Found ${cycles.length} circular dependency chain(s)`,\n 'These must be broken to enable clean builds',\n ],\n });\n\n // Show each cycle\n for (let i = 0; i < cycles.length; i++) {\n const cycle = cycles[i];\n if (!cycle) {continue;}\n const cycleItems: string[] = [];\n\n for (let j = 0; j < cycle.length; j++) {\n const pkg = cycle[j];\n if (j === cycle.length - 1) {\n cycleItems.push(` ${j + 1}. ${pkg}`);\n const firstPkg = cycle[0];\n cycleItems.push(` ${j + 2}. ${firstPkg ?? '?'} ⬅ circular!`);\n } else {\n cycleItems.push(` ${j + 1}. ${pkg}`);\n }\n }\n\n sections.push({\n header: `Cycle ${i + 1} (${cycle.length} packages)`,\n items: cycleItems,\n });\n }\n\n // Recommendations\n sections.push({\n header: 'Recommendations',\n items: [\n '1. Extract shared code into a new package',\n '2. Move one dependency to devDependencies',\n '3. Refactor to remove bidirectional dependencies',\n '4. Use dependency injection patterns',\n ],\n });\n\n ui?.error?.('Circular dependencies detected', {\n title: `⚠️ Circular Dependencies Detected (${cycles.length})`,\n sections,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/cycles.ts"],"names":[],"mappings":"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","file":"cycles.js","sourcesContent":["/**\n * quality:cycles - Detect circular dependencies\n *\n * Uses DFS to find all circular dependency chains in the monorepo.\n */\n\nimport { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport {\n buildDependencyGraph,\n findCircularDependencies,\n} from '@kb-labs/quality-core/graph';\n\ntype CyclesFlags = {\n json?: boolean;\n argv?: string[];\n};\n\ntype CyclesInput = CyclesFlags & { argv?: string[] };\n\nexport default defineCommand({\n id: 'quality:cycles',\n description: 'Detect circular dependencies in monorepo',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CyclesInput): Promise<CommandResult<{ cycles: string[][] }>> {\n const { ui } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: CyclesInput }).flags\n : input;\n\n // Build dependency graph\n const graph = buildDependencyGraph(ctx.cwd);\n\n // Find circular dependencies\n const cycles = findCircularDependencies(graph);\n\n // Output results\n outputCycles(cycles, flags, ui);\n\n return cycles.length > 0\n ? { ok: false, error: 'Circular dependencies found', result: { cycles } }\n : { ok: true, result: { cycles } };\n },\n },\n});\n\n/**\n * Output circular dependencies\n */\nfunction outputCycles(cycles: string[][], flags: Record<string, unknown>, ui: PluginContextV3['ui']) {\n if (flags.json) {\n ui?.json?.({ cycles, count: cycles.length });\n return;\n }\n\n if (cycles.length === 0) {\n ui?.success?.('No circular dependencies found', {\n title: '✅ Circular Dependencies Check',\n sections: [\n {\n header: 'Result',\n items: ['✅ No circular dependencies detected'],\n },\n ],\n });\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Summary\n sections.push({\n header: 'Summary',\n items: [\n `⚠️ Found ${cycles.length} circular dependency chain(s)`,\n 'These must be broken to enable clean builds',\n ],\n });\n\n // Show each cycle\n for (let i = 0; i < cycles.length; i++) {\n const cycle = cycles[i];\n if (!cycle) {continue;}\n const cycleItems: string[] = [];\n\n for (let j = 0; j < cycle.length; j++) {\n const pkg = cycle[j];\n if (j === cycle.length - 1) {\n cycleItems.push(` ${j + 1}. ${pkg}`);\n const firstPkg = cycle[0];\n cycleItems.push(` ${j + 2}. ${firstPkg ?? '?'} ⬅ circular!`);\n } else {\n cycleItems.push(` ${j + 1}. ${pkg}`);\n }\n }\n\n sections.push({\n header: `Cycle ${i + 1} (${cycle.length} packages)`,\n items: cycleItems,\n });\n }\n\n // Recommendations\n sections.push({\n header: 'Recommendations',\n items: [\n '1. Extract shared code into a new package',\n '2. Move one dependency to devDependencies',\n '3. Refactor to remove bidirectional dependencies',\n '4. Use dependency injection patterns',\n ],\n });\n\n ui?.error?.('Circular dependencies detected', {\n title: `⚠️ Circular Dependencies Detected (${cycles.length})`,\n sections,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/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"]}
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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/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"]}
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"]}