@kb-labs/quality-entry 2.109.0 → 2.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/cli/commands/build-order.d.ts +1 -3
  2. package/dist/cli/commands/build-order.js +4 -4
  3. package/dist/cli/commands/build-order.js.map +1 -1
  4. package/dist/cli/commands/check-builds.js +2 -5
  5. package/dist/cli/commands/check-builds.js.map +1 -1
  6. package/dist/cli/commands/check-layers.d.ts +1 -3
  7. package/dist/cli/commands/check-layers.js +3 -3
  8. package/dist/cli/commands/check-layers.js.map +1 -1
  9. package/dist/cli/commands/check-tests.js +2 -6
  10. package/dist/cli/commands/check-tests.js.map +1 -1
  11. package/dist/cli/commands/check-types.js +2 -6
  12. package/dist/cli/commands/check-types.js.map +1 -1
  13. package/dist/cli/commands/context.d.ts +1 -3
  14. package/dist/cli/commands/context.js +5 -5
  15. package/dist/cli/commands/context.js.map +1 -1
  16. package/dist/cli/commands/coupling.d.ts +1 -3
  17. package/dist/cli/commands/coupling.js +2 -2
  18. package/dist/cli/commands/coupling.js.map +1 -1
  19. package/dist/cli/commands/cycles.d.ts +3 -1
  20. package/dist/cli/commands/cycles.js +1 -4
  21. package/dist/cli/commands/cycles.js.map +1 -1
  22. package/dist/cli/commands/dead-code.d.ts +1 -3
  23. package/dist/cli/commands/dead-code.js +4 -4
  24. package/dist/cli/commands/dead-code.js.map +1 -1
  25. package/dist/cli/commands/fix-deps.js +3 -3
  26. package/dist/cli/commands/fix-deps.js.map +1 -1
  27. package/dist/cli/commands/gate.d.ts +1 -3
  28. package/dist/cli/commands/gate.js +3 -3
  29. package/dist/cli/commands/gate.js.map +1 -1
  30. package/dist/cli/commands/health.d.ts +1 -3
  31. package/dist/cli/commands/health.js +2 -2
  32. package/dist/cli/commands/health.js.map +1 -1
  33. package/dist/cli/commands/history.d.ts +1 -3
  34. package/dist/cli/commands/history.js +3 -3
  35. package/dist/cli/commands/history.js.map +1 -1
  36. package/dist/cli/commands/index.d.ts +1 -0
  37. package/dist/cli/commands/index.js +32 -46
  38. package/dist/cli/commands/index.js.map +1 -1
  39. package/dist/cli/commands/snapshot.d.ts +1 -3
  40. package/dist/cli/commands/snapshot.js +1 -1
  41. package/dist/cli/commands/snapshot.js.map +1 -1
  42. package/dist/cli/commands/stats.d.ts +1 -3
  43. package/dist/cli/commands/stats.js +2 -2
  44. package/dist/cli/commands/stats.js.map +1 -1
  45. package/dist/cli/commands/visualize.d.ts +4 -9
  46. package/dist/cli/commands/visualize.js +1 -1
  47. package/dist/cli/commands/visualize.js.map +1 -1
  48. package/dist/widgets/mf-manifest.json +5 -5
  49. package/dist/widgets/mf-stats.json +5 -5
  50. package/dist/widgets/remoteEntry.js +2 -2
  51. package/package.json +4 -4
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { BuildOrderFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<BuildOrderFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<BuildOrderFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -28,11 +28,11 @@ var build_order_default = defineCommand({
28
28
  }))
29
29
  });
30
30
  }
31
- return { exitCode: 1 };
31
+ return { ok: false, error: "Command failed" };
32
32
  }
33
33
  if (flags.json) {
34
34
  ctx.ui?.json?.(result);
35
- return { exitCode: 0 };
35
+ return { ok: true };
36
36
  }
37
37
  if (flags.script) {
38
38
  for (let i = 0; i < result.layers.length; i++) {
@@ -40,7 +40,7 @@ var build_order_default = defineCommand({
40
40
  if (!layer) continue;
41
41
  ctx.ui?.success?.(`# Layer ${i + 1}`, { sections: [{ header: "", items: layer.map((p) => `pnpm --filter "${p}" run build`) }] });
42
42
  }
43
- return { exitCode: 0 };
43
+ return { ok: true };
44
44
  }
45
45
  const sections = flags.layers ? result.layers.map((layer, i) => ({
46
46
  header: `Layer ${i + 1} \u2014 ${layer.length} package(s) (parallel)`,
@@ -51,7 +51,7 @@ var build_order_default = defineCommand({
51
51
  items: [`${result.packageCount} packages in ${result.layerCount} layers`]
52
52
  });
53
53
  ctx.ui?.success?.(flags.package ? `Build order for ${flags.package}` : "Monorepo build order", { sections });
54
- return { exitCode: 0 };
54
+ return { ok: true };
55
55
  }
56
56
  }
57
57
  });
@@ -1 +1 @@
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 } 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>, { exitCode: number }>({\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<{ exitCode: number }> {\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 { exitCode: 1 };\n }\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n return { exitCode: 0 };\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 { exitCode: 0 };\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 { exitCode: 0 };\n },\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"]}
@@ -15,7 +15,7 @@ var check_builds_default = defineCommand({
15
15
  const cached = await platform.cache.get(cacheKey);
16
16
  if (cached) {
17
17
  outputBuildCheck({ ...cached, cached: true }, flags, ui);
18
- return { exitCode: cached.failing > 0 ? 1 : 0, result: cached };
18
+ return cached.failing > 0 ? { ok: false, error: "Build failures found", result: cached } : { ok: true, result: cached };
19
19
  }
20
20
  }
21
21
  const result = await checkBuilds(ctx.cwd, {
@@ -32,10 +32,7 @@ var check_builds_default = defineCommand({
32
32
  packageSpecific: !!flags.package
33
33
  });
34
34
  outputBuildCheck({ ...result, cached: false }, flags, ui);
35
- return {
36
- exitCode: result.failing > 0 ? 1 : 0,
37
- result
38
- };
35
+ return result.failing > 0 ? { ok: false, error: "Build failures found", result } : { ok: true, result };
39
36
  }
40
37
  }
41
38
  });
@@ -1 +1 @@
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 } 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\ntype CheckBuildsCommandResult = {\n exitCode: number;\n result?: BuildCheckResult;\n meta?: Record<string, unknown>;\n};\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<CheckBuildsCommandResult> {\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 { exitCode: cached.failing > 0 ? 1 : 0, 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 {\n exitCode: result.failing > 0 ? 1 : 0,\n result,\n };\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"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { CheckLayersFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<CheckLayersFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<CheckLayersFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -21,11 +21,11 @@ var check_layers_default = defineCommand({
21
21
  } : report;
22
22
  if (flags.json) {
23
23
  ctx.ui?.json?.(filtered);
24
- return { exitCode: filtered.totalViolations > 0 ? 1 : 0 };
24
+ return filtered.totalViolations > 0 ? { ok: false, error: "Layer violations found", result: filtered } : { ok: true, result: filtered };
25
25
  }
26
26
  if (filtered.totalViolations === 0) {
27
27
  ctx.ui?.success?.("No layering violations found");
28
- return { exitCode: 0 };
28
+ return { ok: true };
29
29
  }
30
30
  const byPackage = /* @__PURE__ */ new Map();
31
31
  for (const v of filtered.violations) {
@@ -38,7 +38,7 @@ var check_layers_default = defineCommand({
38
38
  items: vs.map((v) => `\u2192 ${v.toPackage} (Layer ${v.toLayer}) ${v.importSpecifier}`)
39
39
  }));
40
40
  ctx.ui?.error?.(`${filtered.totalViolations} layering violation(s) in ${filtered.affectedPackages.length} package(s)`, { sections });
41
- return { exitCode: 1 };
41
+ return { ok: false, error: "Command failed" };
42
42
  }
43
43
  }
44
44
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/check-layers.ts"],"names":[],"mappings":";;;;AAUA,IAAO,uBAAQ,aAAA,CAAyE;AAAA,EACtF,EAAA,EAAI,sBAAA;AAAA,EACJ,WAAA,EAAa,iEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkE;AACpG,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,EAAE,QAAA,EAAU,QAAA,CAAS,eAAA,GAAkB,CAAA,GAAI,IAAI,CAAA,EAAE;AAAA,MAC1D;AAEA,MAAA,IAAI,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAClC,QAAA,GAAA,CAAI,EAAA,EAAI,UAAU,8BAA8B,CAAA;AAChD,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB;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,UAAU,CAAA,EAAE;AAAA,IACvB;AAAA;AAEJ,CAAC","file":"check-layers.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\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>, { exitCode: number }>({\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<{ exitCode: number }> {\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 { exitCode: filtered.totalViolations > 0 ? 1 : 0 };\n }\n\n if (filtered.totalViolations === 0) {\n ctx.ui?.success?.('No layering violations found');\n return { exitCode: 0 };\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 { exitCode: 1 };\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"]}
@@ -15,7 +15,7 @@ var check_tests_default = defineCommand({
15
15
  const cached = await platform.cache.get(cacheKey);
16
16
  if (cached) {
17
17
  outputTestResults({ ...cached, cached: true }, flags, ui);
18
- return { exitCode: cached.failing > 0 ? 1 : 0, result: cached };
18
+ return cached.failing > 0 ? { ok: false, error: "Test failures found", result: cached } : { ok: true, result: cached };
19
19
  }
20
20
  }
21
21
  const result = await runTests(ctx.cwd, {
@@ -34,11 +34,7 @@ var check_tests_default = defineCommand({
34
34
  cached: false
35
35
  });
36
36
  outputTestResults({ ...result, cached: false }, flags, ui);
37
- return {
38
- exitCode: result.failing > 0 ? 1 : 0,
39
- result,
40
- meta: { cached: false }
41
- };
37
+ return result.failing > 0 ? { ok: false, error: "Test failures found", result, meta: { cached: false } } : { ok: true, result, meta: { cached: false } };
42
38
  }
43
39
  }
44
40
  });
@@ -1 +1 @@
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 } 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\ntype CheckTestsCommandResult = {\n exitCode: number;\n result?: TestRunResult;\n meta?: Record<string, unknown>;\n};\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<CheckTestsCommandResult> {\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 { exitCode: cached.failing > 0 ? 1 : 0, 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 {\n exitCode: result.failing > 0 ? 1 : 0,\n result,\n meta: { cached: false },\n };\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"]}
@@ -15,7 +15,7 @@ var check_types_default = defineCommand({
15
15
  const cached = await platform.cache.get(cacheKey);
16
16
  if (cached) {
17
17
  outputTypeAnalysis({ ...cached, cached: true }, flags, ui);
18
- return { exitCode: cached.totalErrors > 0 ? 1 : 0, result: cached };
18
+ return cached.totalErrors > 0 ? { ok: false, error: "Type errors found", result: cached } : { ok: true, result: cached };
19
19
  }
20
20
  }
21
21
  const result = await analyzeTypes(ctx.cwd, {
@@ -31,11 +31,7 @@ var check_types_default = defineCommand({
31
31
  cached: false
32
32
  });
33
33
  outputTypeAnalysis({ ...result, cached: false }, flags, ui);
34
- return {
35
- exitCode: result.totalErrors > 0 ? 1 : 0,
36
- result,
37
- meta: { cached: false }
38
- };
34
+ return result.totalErrors > 0 ? { ok: false, error: "Type errors found", result, meta: { cached: false } } : { ok: true, result, meta: { cached: false } };
39
35
  }
40
36
  }
41
37
  });
@@ -1 +1 @@
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 } 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\ntype CheckTypesCommandResult = {\n exitCode: number;\n result?: TypeAnalysisResult;\n meta?: Record<string, unknown>;\n};\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<CheckTypesCommandResult> {\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 { exitCode: cached.totalErrors > 0 ? 1 : 0, 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 {\n exitCode: result.totalErrors > 0 ? 1 : 0,\n result,\n meta: { cached: false },\n };\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"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { ContextFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<ContextFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<ContextFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -35,19 +35,19 @@ var context_default = defineCommand({
35
35
  [...byLayer.entries()].map(([l, names]) => [LAYER_NAMES[l] ?? `layer-${l}`, names])
36
36
  );
37
37
  ctx.ui?.json?.({ totalPackages: packages.length, byLayer: summary });
38
- return { exitCode: 0 };
38
+ return { ok: true };
39
39
  }
40
40
  const sections = [...byLayer.entries()].sort(([a], [b]) => a - b).map(([layer, names]) => ({
41
41
  header: `Layer ${layer}: ${LAYER_NAMES[layer] ?? "unknown"} (${names.length})`,
42
42
  items: names
43
43
  }));
44
44
  ctx.ui?.success?.(`Workspace: ${packages.length} packages`, { sections });
45
- return { exitCode: 0 };
45
+ return { ok: true };
46
46
  }
47
47
  const pkg = packageMap.get(pkgName);
48
48
  if (!pkg) {
49
49
  ctx.ui?.error?.(`Package not found: ${pkgName}`);
50
- return { exitCode: 1 };
50
+ return { ok: false, error: "Command failed" };
51
51
  }
52
52
  const wsDeps = pkg.deps.filter((d) => allNames.has(d));
53
53
  const wsDevDeps = pkg.devDeps.filter((d) => allNames.has(d));
@@ -67,7 +67,7 @@ var context_default = defineCommand({
67
67
  };
68
68
  if (flags.json) {
69
69
  ctx.ui?.json?.(context);
70
- return { exitCode: 0 };
70
+ return { ok: true };
71
71
  }
72
72
  ctx.ui?.success?.(`Context: ${pkgName}`, {
73
73
  sections: [
@@ -84,7 +84,7 @@ var context_default = defineCommand({
84
84
  ...wsDevDeps.length > 0 ? [{ header: `Dev dependencies (${wsDevDeps.length})`, items: wsDevDeps }] : []
85
85
  ]
86
86
  });
87
- return { exitCode: 0 };
87
+ return { ok: true };
88
88
  }
89
89
  }
90
90
  });
@@ -1 +1 @@
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} 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>, { exitCode: number }>({\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<{ exitCode: number }> {\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 { exitCode: 0 };\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 { exitCode: 0 };\n }\n\n const pkg = packageMap.get(pkgName);\n if (!pkg) {\n ctx.ui?.error?.(`Package not found: ${pkgName}`);\n return { exitCode: 1 };\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 { exitCode: 0 };\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 { exitCode: 0 };\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"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { CouplingFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<CouplingFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<CouplingFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -13,7 +13,7 @@ var coupling_default = defineCommand({
13
13
  const report = analyzeCoupling({ rootDir: cwd, layerMap: config?.layers, topN: flags.top });
14
14
  if (flags.json) {
15
15
  ctx.ui?.json?.(report);
16
- return { exitCode: 0 };
16
+ return { ok: true };
17
17
  }
18
18
  const sorted = flags.sort === "coupled" ? [...report.packages].sort((a, b) => b.afferent + b.efferent - (a.afferent + a.efferent)) : [...report.packages].sort((a, b) => b.instability - a.instability);
19
19
  const top = sorted.slice(0, flags.top ?? 10);
@@ -25,7 +25,7 @@ var coupling_default = defineCommand({
25
25
  ctx.ui?.success?.(`Coupling \u2014 avg instability: ${report.avgInstability.toFixed(2)}`, {
26
26
  sections: [{ header: `Top ${top.length} by instability`, items }]
27
27
  });
28
- return { exitCode: 0 };
28
+ return { ok: true };
29
29
  }
30
30
  }
31
31
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/coupling.ts"],"names":[],"mappings":";;;;AAUA,IAAO,mBAAQ,aAAA,CAAsE;AAAA,EACnF,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,mEAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA+D;AACjG,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,UAAU,CAAA,EAAE;AAAA,MACvB;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,UAAU,CAAA,EAAE;AAAA,IACvB;AAAA;AAEJ,CAAC","file":"coupling.js","sourcesContent":["import {\n defineCommand,\n useConfig,\n type CLIInput,\n type PluginContextV3,\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>, { exitCode: number }>({\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<{ exitCode: number }> {\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 { exitCode: 0 };\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 { exitCode: 0 };\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"]}
@@ -12,6 +12,8 @@ type CyclesFlags = {
12
12
  type CyclesInput = CyclesFlags & {
13
13
  argv?: string[];
14
14
  };
15
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CyclesInput, unknown>;
15
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CyclesInput, {
16
+ cycles: string[][];
17
+ }>;
16
18
 
17
19
  export { _default as default };
@@ -12,10 +12,7 @@ var cycles_default = defineCommand({
12
12
  const graph = buildDependencyGraph(ctx.cwd);
13
13
  const cycles = findCircularDependencies(graph);
14
14
  outputCycles(cycles, flags, ui);
15
- return {
16
- exitCode: cycles.length > 0 ? 1 : 0,
17
- cycles
18
- };
15
+ return cycles.length > 0 ? { ok: false, error: "Circular dependencies found", result: { cycles } } : { ok: true, result: { cycles } };
19
16
  }
20
17
  }
21
18
  });
@@ -1 +1 @@
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 } 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\ntype CyclesCommandResult = {\n exitCode: number;\n cycles?: string[][];\n};\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<CyclesCommandResult> {\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 {\n exitCode: cycles.length > 0 ? 1 : 0,\n cycles,\n };\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"]}
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { DeadCodeFlags } from './flags.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<DeadCodeFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<DeadCodeFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -14,16 +14,16 @@ var dead_code_default = defineCommand({
14
14
  const cfg = config ?? defaultQualityConfig;
15
15
  if (!cfg.knip.enabled) {
16
16
  ctx.ui?.success?.("knip is disabled in config (knip.enabled = false)");
17
- return { exitCode: 0 };
17
+ return { ok: true };
18
18
  }
19
19
  const report = await runKnip({ shell: ctx.api.shell, rootDir: cwd });
20
20
  if (flags.json) {
21
21
  ctx.ui?.json?.(report);
22
- return { exitCode: report.totalIssues > 0 ? 1 : 0 };
22
+ return report.totalIssues > 0 ? { ok: false, error: "Dead code found", result: report } : { ok: true, result: report };
23
23
  }
24
24
  if (report.totalIssues === 0) {
25
25
  ctx.ui?.success?.("No dead code detected");
26
- return { exitCode: 0 };
26
+ return { ok: true };
27
27
  }
28
28
  const sections = [];
29
29
  if (report.unusedFiles.length > 0) {
@@ -51,7 +51,7 @@ var dead_code_default = defineCommand({
51
51
  });
52
52
  }
53
53
  ctx.ui?.error?.(`${report.totalIssues} dead code issue(s) found`, { sections });
54
- return { exitCode: 1 };
54
+ return { ok: false, error: "Command failed" };
55
55
  }
56
56
  }
57
57
  });