@kb-labs/quality-entry 2.119.0-canary.e120bc0ee → 2.119.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 (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/rest/handlers/build-order-handler.js.map +1 -1
  22. package/dist/rest/handlers/builds-handler.js.map +1 -1
  23. package/dist/rest/handlers/coupling-handler.js.map +1 -1
  24. package/dist/rest/handlers/cycles-handler.js.map +1 -1
  25. package/dist/rest/handlers/dependencies-handler.js.map +1 -1
  26. package/dist/rest/handlers/graph-handler.js.map +1 -1
  27. package/dist/rest/handlers/health-handler.js.map +1 -1
  28. package/dist/rest/handlers/history-handler.js.map +1 -1
  29. package/dist/rest/handlers/knip-handler.js.map +1 -1
  30. package/dist/rest/handlers/layers-handler.js.map +1 -1
  31. package/dist/rest/handlers/snapshot-handler.js.map +1 -1
  32. package/dist/rest/handlers/stale-handler.js.map +1 -1
  33. package/dist/rest/handlers/stats-handler.js.map +1 -1
  34. package/dist/rest/handlers/tests-handler.js.map +1 -1
  35. package/dist/rest/handlers/types-handler.js.map +1 -1
  36. package/package.json +8 -8
  37. package/dist/manifest.json +0 -1394
  38. package/dist/widgets/117.js +0 -32
  39. package/dist/widgets/165.js +0 -1
  40. package/dist/widgets/326.js +0 -1
  41. package/dist/widgets/370.js +0 -1
  42. package/dist/widgets/405.js +0 -1
  43. package/dist/widgets/46.js +0 -445
  44. package/dist/widgets/50.js +0 -1
  45. package/dist/widgets/546.js +0 -1
  46. package/dist/widgets/648.js +0 -1
  47. package/dist/widgets/669.js +0 -1
  48. package/dist/widgets/707.js +0 -1
  49. package/dist/widgets/775.js +0 -1
  50. package/dist/widgets/78.js +0 -1
  51. package/dist/widgets/832.js +0 -96
  52. package/dist/widgets/875.js +0 -25
  53. package/dist/widgets/945.js +0 -1
  54. package/dist/widgets/968.js +0 -9
  55. package/dist/widgets/__federation_expose_QualityOverview.js +0 -1
  56. package/dist/widgets/mf-manifest.json +0 -229
  57. package/dist/widgets/mf-stats.json +0 -253
  58. package/dist/widgets/remoteEntry.js +0 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/graph-handler.ts"],"names":[],"mappings":"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","file":"graph-handler.js","sourcesContent":["/**\n * POST /graph handler\n *\n * Visualize dependency graph in different modes:\n * - tree: dependency tree for package\n * - reverse: who depends on this package\n * - impact: what will be affected by changes\n * - stats: graph statistics\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n buildDependencyGraph,\n getReverseDependencies,\n getImpactAnalysis,\n type DependencyGraph,\n} from '@kb-labs/quality-core/graph';\n\nexport type GraphRequest = {\n packageName?: string;\n mode: 'tree' | 'reverse' | 'impact' | 'stats';\n};\n\nexport type GraphResponse = {\n mode: string;\n packageName?: string;\n tree?: DependencyTree;\n packages?: string[];\n stats?: GraphStats;\n};\n\nexport type DependencyTree = {\n name: string;\n children: DependencyTree[];\n};\n\nexport type GraphStats = {\n totalPackages: number;\n maxDepth: number;\n avgDependencies: number;\n mostDepended: Array<{ name: string; count: number }>;\n};\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<GraphRequest, unknown>\n ): Promise<GraphResponse> {\n try {\n const { packageName, mode } = input.query ?? { mode: 'stats' };\n\n // Build dependency graph (cached with Map serialization)\n const cacheKey = `quality:graph:${ctx.cwd}`;\n const cached = await ctx.platform.cache.get<any>(cacheKey);\n\n let graph: DependencyGraph;\n\n if (cached) {\n // Deserialize: convert plain object back to Map\n graph = {\n nodes: new Map(Object.entries(cached.nodes).map(([key, value]: [string, any]) => [\n key,\n {\n ...value,\n deps: new Set(value.deps),\n devDeps: value.devDeps ? new Set(value.devDeps) : undefined,\n dependents: new Set(value.dependents),\n },\n ])),\n workspacePackages: new Set(cached.workspacePackages),\n };\n } else {\n graph = buildDependencyGraph(ctx.cwd);\n\n // Serialize: convert Map to plain object for Redis\n const serialized = {\n nodes: Object.fromEntries(\n Array.from(graph.nodes.entries()).map(([key, value]) => [\n key,\n {\n ...value,\n deps: Array.from(value.deps),\n devDeps: value.devDeps ? Array.from(value.devDeps) : undefined,\n dependents: Array.from(value.dependents),\n },\n ])\n ),\n workspacePackages: Array.from(graph.workspacePackages),\n };\n\n // Cache for 2 minutes\n await ctx.platform.cache.set(cacheKey, serialized, 120000);\n }\n\n // Handle different modes\n if (mode === 'stats') {\n return {\n mode,\n stats: calculateGraphStats(graph),\n };\n }\n\n if (mode === 'tree') {\n if (!packageName) {\n // Find root packages (packages that have no dependents - nothing depends on them)\n const rootPackages: string[] = [];\n for (const [name, node] of graph.nodes) {\n if (node.dependents.size === 0) {\n rootPackages.push(name);\n }\n }\n\n return {\n mode,\n tree: {\n name: 'Root Packages',\n children: rootPackages.map(pkg => buildDependencyTree(graph, pkg)),\n },\n };\n }\n return {\n mode,\n packageName,\n tree: buildDependencyTree(graph, packageName),\n };\n }\n\n if (!packageName) {\n throw new Error('packageName is required for reverse and impact modes');\n }\n\n if (mode === 'reverse') {\n const reverseDeps = getReverseDependencies(graph, packageName);\n return {\n mode,\n packageName,\n packages: Array.from(reverseDeps),\n };\n }\n\n if (mode === 'impact') {\n const affected = getImpactAnalysis(graph, packageName);\n return {\n mode,\n packageName,\n packages: Array.from(affected),\n };\n }\n\n throw new Error(`Unknown mode: ${mode}`);\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n\n/**\n * Build dependency tree recursively\n */\nfunction buildDependencyTree(\n graph: DependencyGraph,\n packageName: string,\n visited: Set<string> = new Set()\n): DependencyTree {\n const node = graph.nodes.get(packageName);\n if (!node) {\n return { name: packageName, children: [] };\n }\n\n if (visited.has(packageName)) {\n return { name: `${packageName} (circular)`, children: [] };\n }\n\n visited.add(packageName);\n\n const children = Array.from(node.deps).map(dep =>\n buildDependencyTree(graph, dep, new Set(visited))\n );\n\n return {\n name: packageName,\n children,\n };\n}\n\n/**\n * Calculate graph statistics\n */\nfunction calculateGraphStats(graph: DependencyGraph): GraphStats {\n const { nodes } = graph;\n\n // Calculate average dependencies\n let totalDeps = 0;\n for (const node of nodes.values()) {\n totalDeps += node.deps.size;\n }\n const avgDeps = nodes.size > 0 ? totalDeps / nodes.size : 0;\n\n // Calculate max depth (longest dependency chain)\n let maxDepth = 0;\n for (const [name] of nodes) {\n const depth = calculateDepth(graph, name, new Set());\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n }\n\n // Find most depended on packages (packages with most dependents)\n const dependentCounts = new Map<string, number>();\n for (const node of nodes.values()) {\n for (const dep of node.deps) {\n dependentCounts.set(dep, (dependentCounts.get(dep) ?? 0) + 1);\n }\n }\n\n const mostDepended = Array.from(dependentCounts.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5); // Top 5\n\n return {\n totalPackages: nodes.size,\n maxDepth,\n avgDependencies: Number.parseFloat(avgDeps.toFixed(2)),\n mostDepended,\n };\n}\n\n/**\n * Calculate depth of dependency chain from a package\n */\nfunction calculateDepth(\n graph: DependencyGraph,\n packageName: string,\n visited: Set<string>\n): number {\n const node = graph.nodes.get(packageName);\n if (!node || visited.has(packageName)) {\n return 0;\n }\n\n visited.add(packageName);\n\n let maxChildDepth = 0;\n for (const dep of node.deps) {\n const depth = calculateDepth(graph, dep, new Set(visited));\n if (depth > maxChildDepth) {\n maxChildDepth = depth;\n }\n }\n\n return 1 + maxChildDepth;\n}\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/graph-handler.ts"],"names":[],"mappings":"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","file":"graph-handler.js","sourcesContent":["/**\n * POST /graph handler\n *\n * Visualize dependency graph in different modes:\n * - tree: dependency tree for package\n * - reverse: who depends on this package\n * - impact: what will be affected by changes\n * - stats: graph statistics\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n buildDependencyGraph,\n getReverseDependencies,\n getImpactAnalysis,\n type DependencyGraph,\n} from '@kb-labs/quality-core/graph';\n\nexport type GraphRequest = {\n packageName?: string;\n mode: 'tree' | 'reverse' | 'impact' | 'stats';\n};\n\nexport type GraphResponse = {\n mode: string;\n packageName?: string;\n tree?: DependencyTree;\n packages?: string[];\n stats?: GraphStats;\n};\n\nexport type DependencyTree = {\n name: string;\n children: DependencyTree[];\n};\n\nexport type GraphStats = {\n totalPackages: number;\n maxDepth: number;\n avgDependencies: number;\n mostDepended: Array<{ name: string; count: number }>;\n};\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<GraphRequest, unknown>\n ): Promise<GraphResponse> {\n try {\n const { packageName, mode } = input.query ?? { mode: 'stats' };\n\n // Build dependency graph (cached with Map serialization)\n const cacheKey = `quality:graph:${ctx.cwd}`;\n const cached = await ctx.platform.cache.get<any>(cacheKey);\n\n let graph: DependencyGraph;\n\n if (cached) {\n // Deserialize: convert plain object back to Map\n graph = {\n nodes: new Map(Object.entries(cached.nodes).map(([key, value]: [string, any]) => [\n key,\n {\n ...value,\n deps: new Set(value.deps),\n devDeps: value.devDeps ? new Set(value.devDeps) : undefined,\n dependents: new Set(value.dependents),\n },\n ])),\n workspacePackages: new Set(cached.workspacePackages),\n };\n } else {\n graph = buildDependencyGraph(ctx.cwd);\n\n // Serialize: convert Map to plain object for Redis\n const serialized = {\n nodes: Object.fromEntries(\n Array.from(graph.nodes.entries()).map(([key, value]) => [\n key,\n {\n ...value,\n deps: Array.from(value.deps),\n devDeps: value.devDeps ? Array.from(value.devDeps) : undefined,\n dependents: Array.from(value.dependents),\n },\n ])\n ),\n workspacePackages: Array.from(graph.workspacePackages),\n };\n\n // Cache for 2 minutes\n await ctx.platform.cache.set(cacheKey, serialized, 120000);\n }\n\n // Handle different modes\n if (mode === 'stats') {\n return {\n mode,\n stats: calculateGraphStats(graph),\n };\n }\n\n if (mode === 'tree') {\n if (!packageName) {\n // Find root packages (packages that have no dependents - nothing depends on them)\n const rootPackages: string[] = [];\n for (const [name, node] of graph.nodes) {\n if (node.dependents.size === 0) {\n rootPackages.push(name);\n }\n }\n\n return {\n mode,\n tree: {\n name: 'Root Packages',\n children: rootPackages.map(pkg => buildDependencyTree(graph, pkg)),\n },\n };\n }\n return {\n mode,\n packageName,\n tree: buildDependencyTree(graph, packageName),\n };\n }\n\n if (!packageName) {\n throw new Error('packageName is required for reverse and impact modes');\n }\n\n if (mode === 'reverse') {\n const reverseDeps = getReverseDependencies(graph, packageName);\n return {\n mode,\n packageName,\n packages: Array.from(reverseDeps),\n };\n }\n\n if (mode === 'impact') {\n const affected = getImpactAnalysis(graph, packageName);\n return {\n mode,\n packageName,\n packages: Array.from(affected),\n };\n }\n\n throw new Error(`Unknown mode: ${mode}`);\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n\n/**\n * Build dependency tree recursively\n */\nfunction buildDependencyTree(\n graph: DependencyGraph,\n packageName: string,\n visited: Set<string> = new Set()\n): DependencyTree {\n const node = graph.nodes.get(packageName);\n if (!node) {\n return { name: packageName, children: [] };\n }\n\n if (visited.has(packageName)) {\n return { name: `${packageName} (circular)`, children: [] };\n }\n\n visited.add(packageName);\n\n const children = Array.from(node.deps).map(dep =>\n buildDependencyTree(graph, dep, new Set(visited))\n );\n\n return {\n name: packageName,\n children,\n };\n}\n\n/**\n * Calculate graph statistics\n */\nfunction calculateGraphStats(graph: DependencyGraph): GraphStats {\n const { nodes } = graph;\n\n // Calculate average dependencies\n let totalDeps = 0;\n for (const node of nodes.values()) {\n totalDeps += node.deps.size;\n }\n const avgDeps = nodes.size > 0 ? totalDeps / nodes.size : 0;\n\n // Calculate max depth (longest dependency chain)\n let maxDepth = 0;\n for (const [name] of nodes) {\n const depth = calculateDepth(graph, name, new Set());\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n }\n\n // Find most depended on packages (packages with most dependents)\n const dependentCounts = new Map<string, number>();\n for (const node of nodes.values()) {\n for (const dep of node.deps) {\n dependentCounts.set(dep, (dependentCounts.get(dep) ?? 0) + 1);\n }\n }\n\n const mostDepended = Array.from(dependentCounts.entries())\n .map(([name, count]) => ({ name, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 5); // Top 5\n\n return {\n totalPackages: nodes.size,\n maxDepth,\n avgDependencies: Number.parseFloat(avgDeps.toFixed(2)),\n mostDepended,\n };\n}\n\n/**\n * Calculate depth of dependency chain from a package\n */\nfunction calculateDepth(\n graph: DependencyGraph,\n packageName: string,\n visited: Set<string>\n): number {\n const node = graph.nodes.get(packageName);\n if (!node || visited.has(packageName)) {\n return 0;\n }\n\n visited.add(packageName);\n\n let maxChildDepth = 0;\n for (const dep of node.deps) {\n const depth = calculateDepth(graph, dep, new Set(visited));\n if (depth > maxChildDepth) {\n maxChildDepth = depth;\n }\n }\n\n return 1 + maxChildDepth;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/health-handler.ts"],"names":[],"mappings":";;;;;AAUA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,IAAA,IAAI;AACF,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;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAM,CAAA;AAC7D,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,MAAM,CAAC,QAAA,EAAU,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC1C,gBAAgB,EAAE,OAAA,EAAS,KAAK,QAAA,EAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,QACtD,aAAa,GAAG;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,gBAAgB,EAAE,OAAA,EAAS,KAAK,QAAA,EAAU,GAAA,CAAI,QAAQ,CAAA;AAEvE,MAAA,IAAI,IAAA,GAAmB,EAAE,WAAA,EAAa,IAAI,aAAA,EAAe,EAAC,EAAG,kBAAA,EAAoB,EAAC,EAAG,oBAAA,EAAsB,EAAC,EAAG,aAAa,CAAA,EAAE;AAC9H,MAAA,IAAI,GAAA,CAAI,KAAK,OAAA,EAAS;AACpB,QAAA,IAAA,GAAO,MAAM,QAAQ,EAAE,KAAA,EAAO,IAAI,GAAA,CAAI,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,MAC7D;AAEA,MAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,QAC7B,QAAA;AAAA,QAAU,QAAA;AAAA,QAAU,KAAA;AAAA,QAAO,IAAA;AAAA,QAC3B,aAAA,EAAe,SAAS,QAAA,CAAS,MAAA;AAAA,QACjC,eAAA,EAAiB,IAAA;AAAA,QACjB,YAAY,GAAA,CAAI;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAA,EAAQ,MAAA,EAAQ,WAAW,IAAI,CAAA;AACvE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"health-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n analyzeLayering,\n analyzeCoupling,\n runKnip,\n analyzeTypes,\n calculateHealth,\n} from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig, type KnipReport } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ refresh?: boolean }, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n const refresh = input.query?.refresh;\n\n if (!refresh) {\n const cached = await ctx.platform.cache.get(CACHE_KEYS.HEALTH);\n if (cached) return cached;\n }\n\n const [layering, types] = await Promise.all([\n analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),\n analyzeTypes(cwd),\n ]);\n\n const coupling = analyzeCoupling({ rootDir: cwd, layerMap: cfg.layers });\n\n let knip: KnipReport = { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n if (cfg.knip.enabled) {\n knip = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n }\n\n const health = calculateHealth({\n layering, coupling, types, knip,\n totalPackages: coupling.packages.length,\n avgTestCoverage: null,\n thresholds: cfg.thresholds,\n });\n\n await ctx.platform.cache.set(CACHE_KEYS.HEALTH, health, CACHE_TTLS.FAST);\n return health;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/health-handler.ts"],"names":[],"mappings":";;;;;AAUA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,IAAA,IAAI;AACF,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;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAM,CAAA;AAC7D,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,MAAM,CAAC,QAAA,EAAU,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC1C,gBAAgB,EAAE,OAAA,EAAS,KAAK,QAAA,EAAU,GAAA,CAAI,QAAQ,CAAA;AAAA,QACtD,aAAa,GAAG;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,gBAAgB,EAAE,OAAA,EAAS,KAAK,QAAA,EAAU,GAAA,CAAI,QAAQ,CAAA;AAEvE,MAAA,IAAI,IAAA,GAAmB,EAAE,WAAA,EAAa,IAAI,aAAA,EAAe,EAAC,EAAG,kBAAA,EAAoB,EAAC,EAAG,oBAAA,EAAsB,EAAC,EAAG,aAAa,CAAA,EAAE;AAC9H,MAAA,IAAI,GAAA,CAAI,KAAK,OAAA,EAAS;AACpB,QAAA,IAAA,GAAO,MAAM,QAAQ,EAAE,KAAA,EAAO,IAAI,GAAA,CAAI,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,MAC7D;AAEA,MAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,QAC7B,QAAA;AAAA,QAAU,QAAA;AAAA,QAAU,KAAA;AAAA,QAAO,IAAA;AAAA,QAC3B,aAAA,EAAe,SAAS,QAAA,CAAS,MAAA;AAAA,QACjC,eAAA,EAAiB,IAAA;AAAA,QACjB,YAAY,GAAA,CAAI;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAA,EAAQ,MAAA,EAAQ,WAAW,IAAI,CAAA;AACvE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"health-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n analyzeLayering,\n analyzeCoupling,\n runKnip,\n analyzeTypes,\n calculateHealth,\n} from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig, type KnipReport } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ refresh?: boolean }, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n const refresh = input.query?.refresh;\n\n if (!refresh) {\n const cached = await ctx.platform.cache.get(CACHE_KEYS.HEALTH);\n if (cached) return cached;\n }\n\n const [layering, types] = await Promise.all([\n analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),\n analyzeTypes(cwd),\n ]);\n\n const coupling = analyzeCoupling({ rootDir: cwd, layerMap: cfg.layers });\n\n let knip: KnipReport = { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n if (cfg.knip.enabled) {\n knip = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n }\n\n const health = calculateHealth({\n layering, coupling, types, knip,\n totalPackages: coupling.packages.length,\n avgTestCoverage: null,\n thresholds: cfg.thresholds,\n });\n\n await ctx.platform.cache.set(CACHE_KEYS.HEALTH, health, CACHE_TTLS.FAST);\n return health;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/history-handler.ts"],"names":[],"mappings":";;;;;AAIA,IAAO,0BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,MAAA,EAAqC;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAQ,IAAI,oBAAA,CAAqB,KAAK,MAAA,EAAQ,YAAA,IAAgB,qBAAqB,YAAY,CAAA;AACrG,MAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"history-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { QualitySnapshotStore } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, _input: RestInput<unknown, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const store = new QualitySnapshotStore(cwd, config?.maxSnapshots ?? defaultQualityConfig.maxSnapshots);\n return store.history();\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/history-handler.ts"],"names":[],"mappings":";;;;;AAIA,IAAO,0BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,MAAA,EAAqC;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAA+B;AACpD,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAQ,IAAI,oBAAA,CAAqB,KAAK,MAAA,EAAQ,YAAA,IAAgB,qBAAqB,YAAY,CAAA;AACrG,MAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"history-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { QualitySnapshotStore } from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, _input: RestInput<unknown, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const store = new QualitySnapshotStore(cwd, config?.maxSnapshots ?? defaultQualityConfig.maxSnapshots);\n return store.history();\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/knip-handler.ts"],"names":[],"mappings":";;;;;AAIA,IAAO,uBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,IAAA,IAAI;AACF,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;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,IAAI,CAAA;AAC3D,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS;AACrB,QAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,eAAe,EAAC,EAAG,kBAAA,EAAoB,EAAC,EAAG,oBAAA,EAAsB,EAAC,EAAG,aAAa,CAAA,EAAE;AAAA,MAChH;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAI,GAAA,CAAI,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,CAAA;AACnE,MAAA,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,IAAA,EAAM,MAAA,EAAQ,WAAW,IAAI,CAAA;AACrE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"knip-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { runKnip } from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ refresh?: boolean }, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n const refresh = input.query?.refresh;\n\n if (!refresh) {\n const cached = await ctx.platform.cache.get(CACHE_KEYS.KNIP);\n if (cached) return cached;\n }\n\n if (!cfg.knip.enabled) {\n return { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n }\n\n const report = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n await ctx.platform.cache.set(CACHE_KEYS.KNIP, report, CACHE_TTLS.SLOW);\n return report;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/knip-handler.ts"],"names":[],"mappings":";;;;;AAIA,IAAO,uBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,IAAA,IAAI;AACF,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;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,IAAI,CAAA;AAC3D,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS;AACrB,QAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,eAAe,EAAC,EAAG,kBAAA,EAAoB,EAAC,EAAG,oBAAA,EAAsB,EAAC,EAAG,aAAa,CAAA,EAAE;AAAA,MAChH;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,IAAI,GAAA,CAAI,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,CAAA;AACnE,MAAA,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,IAAA,EAAM,MAAA,EAAQ,WAAW,IAAI,CAAA;AACrE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"knip-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { runKnip } from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ refresh?: boolean }, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n const refresh = input.query?.refresh;\n\n if (!refresh) {\n const cached = await ctx.platform.cache.get(CACHE_KEYS.KNIP);\n if (cached) return cached;\n }\n\n if (!cfg.knip.enabled) {\n return { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n }\n\n const report = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n await ctx.platform.cache.set(CACHE_KEYS.KNIP, report, CACHE_TTLS.SLOW);\n return report;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/layers-handler.ts"],"names":[],"mappings":";;;;;AAIA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,IAAA,IAAI;AACF,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;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAM,CAAA;AAC7D,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,EAAE,SAAS,GAAA,EAAK,QAAA,EAAU,GAAA,CAAI,MAAA,EAAQ,CAAA;AAC3E,MAAA,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAA,EAAQ,MAAA,EAAQ,WAAW,IAAI,CAAA;AACvE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"layers-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { analyzeLayering } from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ refresh?: boolean }, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n const refresh = input.query?.refresh;\n\n if (!refresh) {\n const cached = await ctx.platform.cache.get(CACHE_KEYS.LAYERS);\n if (cached) return cached;\n }\n\n const report = await analyzeLayering({ rootDir: cwd, layerMap: cfg.layers });\n await ctx.platform.cache.set(CACHE_KEYS.LAYERS, report, CACHE_TTLS.FAST);\n return report;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/layers-handler.ts"],"names":[],"mappings":";;;;;AAIA,IAAO,yBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,IAAA,IAAI;AACF,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;AACnC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAO,OAAA;AAE7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,SAAS,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAM,CAAA;AAC7D,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,EAAE,SAAS,GAAA,EAAK,QAAA,EAAU,GAAA,CAAI,MAAA,EAAQ,CAAA;AAC3E,MAAA,MAAM,GAAA,CAAI,SAAS,KAAA,CAAM,GAAA,CAAI,WAAW,MAAA,EAAQ,MAAA,EAAQ,WAAW,IAAI,CAAA;AACvE,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"layers-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { analyzeLayering } from '@kb-labs/quality-core';\nimport { CACHE_KEYS, CACHE_TTLS, defaultQualityConfig, type QualityPluginConfig } from '@kb-labs/quality-contracts';\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, input: RestInput<{ refresh?: boolean }, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cfg = config ?? defaultQualityConfig;\n const cwd = ctx.cwd ?? process.cwd();\n const refresh = input.query?.refresh;\n\n if (!refresh) {\n const cached = await ctx.platform.cache.get(CACHE_KEYS.LAYERS);\n if (cached) return cached;\n }\n\n const report = await analyzeLayering({ rootDir: cwd, layerMap: cfg.layers });\n await ctx.platform.cache.set(CACHE_KEYS.LAYERS, report, CACHE_TTLS.FAST);\n return report;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/snapshot-handler.ts"],"names":[],"mappings":"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","file":"snapshot-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput, type ShellAPI } from '@kb-labs/sdk';\nimport {\n analyzeLayering,\n analyzeCoupling,\n runKnip,\n analyzeTypes,\n calculateHealth,\n QualitySnapshotStore,\n} from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig, type KnipReport } from '@kb-labs/quality-contracts';\n\nasync function captureGit(shell: ShellAPI, cwd: string) {\n try {\n const [c, b, m] = await Promise.all([\n shell.exec('git', ['rev-parse', '--short', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['log', '-1', '--format=%s'], { cwd, throwOnError: false }),\n ]);\n if (!c.ok) return undefined;\n return { commit: c.stdout.trim(), branch: b.stdout.trim() || 'HEAD', message: m.stdout.trim() };\n } catch {\n return undefined;\n }\n}\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, _input: RestInput<unknown, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n const [layering, types, git] = await Promise.all([\n analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),\n analyzeTypes(cwd),\n captureGit(ctx.api.shell, cwd),\n ]);\n\n const coupling = analyzeCoupling({ rootDir: cwd, layerMap: cfg.layers });\n\n let knip: KnipReport = { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n if (cfg.knip.enabled) {\n knip = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n }\n\n const health = calculateHealth({\n layering, coupling, types, knip,\n totalPackages: coupling.packages.length,\n avgTestCoverage: null,\n thresholds: cfg.thresholds,\n });\n\n const store = new QualitySnapshotStore(cwd, cfg.maxSnapshots);\n return store.save({\n score: health.score,\n grade: health.grade,\n dimensions: health.dimensions,\n counters: {\n layeringViolations: layering.totalViolations,\n avgInstability: coupling.avgInstability,\n anyCount: types.packages.reduce((s: number, p: { anyCount: number }) => s + p.anyCount, 0),\n tsIgnoreCount: types.packages.reduce((s: number, p: { tsIgnoreCount: number }) => s + p.tsIgnoreCount, 0),\n unusedFiles: knip.unusedFiles.length,\n unusedDeps: knip.unusedDependencies.length,\n },\n git: git ?? { commit: '', branch: '', message: '' },\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/snapshot-handler.ts"],"names":[],"mappings":"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","file":"snapshot-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useConfig, type PluginContextV3, type RestInput, type ShellAPI } from '@kb-labs/sdk';\nimport {\n analyzeLayering,\n analyzeCoupling,\n runKnip,\n analyzeTypes,\n calculateHealth,\n QualitySnapshotStore,\n} from '@kb-labs/quality-core';\nimport { defaultQualityConfig, type QualityPluginConfig, type KnipReport } from '@kb-labs/quality-contracts';\n\nasync function captureGit(shell: ShellAPI, cwd: string) {\n try {\n const [c, b, m] = await Promise.all([\n shell.exec('git', ['rev-parse', '--short', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd, throwOnError: false }),\n shell.exec('git', ['log', '-1', '--format=%s'], { cwd, throwOnError: false }),\n ]);\n if (!c.ok) return undefined;\n return { commit: c.stdout.trim(), branch: b.stdout.trim() || 'HEAD', message: m.stdout.trim() };\n } catch {\n return undefined;\n }\n}\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, _input: RestInput<unknown, unknown>) {\n try {\n const config = await useConfig<QualityPluginConfig>();\n const cwd = ctx.cwd ?? process.cwd();\n const cfg = config ?? defaultQualityConfig;\n\n const [layering, types, git] = await Promise.all([\n analyzeLayering({ rootDir: cwd, layerMap: cfg.layers }),\n analyzeTypes(cwd),\n captureGit(ctx.api.shell, cwd),\n ]);\n\n const coupling = analyzeCoupling({ rootDir: cwd, layerMap: cfg.layers });\n\n let knip: KnipReport = { unusedFiles: [], unusedExports: [], unusedDependencies: [], unlistedDependencies: [], totalIssues: 0 };\n if (cfg.knip.enabled) {\n knip = await runKnip({ shell: ctx.api.shell, rootDir: cwd });\n }\n\n const health = calculateHealth({\n layering, coupling, types, knip,\n totalPackages: coupling.packages.length,\n avgTestCoverage: null,\n thresholds: cfg.thresholds,\n });\n\n const store = new QualitySnapshotStore(cwd, cfg.maxSnapshots);\n return store.save({\n score: health.score,\n grade: health.grade,\n dimensions: health.dimensions,\n counters: {\n layeringViolations: layering.totalViolations,\n avgInstability: coupling.avgInstability,\n anyCount: types.packages.reduce((s: number, p: { anyCount: number }) => s + p.anyCount, 0),\n tsIgnoreCount: types.packages.reduce((s: number, p: { tsIgnoreCount: number }) => s + p.tsIgnoreCount, 0),\n unusedFiles: knip.unusedFiles.length,\n unusedDeps: knip.unusedDependencies.length,\n },\n git: git ?? { commit: '', branch: '', message: '' },\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/stale-handler.ts"],"names":[],"mappings":";;;;AAwCA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,KAAA,CAAM,SAAS,EAAC;AAErC,MAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,GAAA,CAAI,KAAK,QAAQ,CAAA;AAE7D,MAAA,OAAO;AAAA,QACL,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,cAAA,EAAgB,QAAA,GAAW,QAAA,CAAS,cAAA,GAAiB,KAAA;AAAA,OACvD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"stale-handler.js","sourcesContent":["/**\n * GET /stale handler\n *\n * Detect stale packages that need rebuilding.\n * Shows packages where source is newer than dist, or dependencies were rebuilt.\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n analyzeStalePackages,\n} from '@kb-labs/quality-core/stale';\n\nexport type StaleRequest = {\n detailed?: boolean;\n};\n\nexport type StalePackage = {\n name: string;\n path: string;\n reason: 'source-newer' | 'dependency-rebuilt' | 'missing-dist';\n sourceModified?: string;\n distModified?: string;\n affectedPackages: string[];\n affectedCount: number;\n severity: 'critical' | 'high' | 'medium' | 'low';\n};\n\nexport type StaleChain = {\n root: string;\n affected: string[];\n depth: number;\n};\n\nexport type StaleResponse = {\n stalePackages: StalePackage[];\n totalStale: number;\n totalAffected: number;\n criticalChains?: StaleChain[];\n};\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<StaleRequest, unknown>\n ): Promise<StaleResponse> {\n try {\n const { detailed } = input.query ?? {};\n\n const analysis = await analyzeStalePackages(ctx.cwd, detailed);\n\n return {\n stalePackages: analysis.stalePackages,\n totalStale: analysis.totalStale,\n totalAffected: analysis.totalAffected,\n criticalChains: detailed ? analysis.criticalChains : undefined,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/stale-handler.ts"],"names":[],"mappings":";;;;AAwCA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,KAAA,CAAM,SAAS,EAAC;AAErC,MAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,GAAA,CAAI,KAAK,QAAQ,CAAA;AAE7D,MAAA,OAAO;AAAA,QACL,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,eAAe,QAAA,CAAS,aAAA;AAAA,QACxB,cAAA,EAAgB,QAAA,GAAW,QAAA,CAAS,cAAA,GAAiB,KAAA;AAAA,OACvD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"stale-handler.js","sourcesContent":["/**\n * GET /stale handler\n *\n * Detect stale packages that need rebuilding.\n * Shows packages where source is newer than dist, or dependencies were rebuilt.\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport {\n analyzeStalePackages,\n} from '@kb-labs/quality-core/stale';\n\nexport type StaleRequest = {\n detailed?: boolean;\n};\n\nexport type StalePackage = {\n name: string;\n path: string;\n reason: 'source-newer' | 'dependency-rebuilt' | 'missing-dist';\n sourceModified?: string;\n distModified?: string;\n affectedPackages: string[];\n affectedCount: number;\n severity: 'critical' | 'high' | 'medium' | 'low';\n};\n\nexport type StaleChain = {\n root: string;\n affected: string[];\n depth: number;\n};\n\nexport type StaleResponse = {\n stalePackages: StalePackage[];\n totalStale: number;\n totalAffected: number;\n criticalChains?: StaleChain[];\n};\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<StaleRequest, unknown>\n ): Promise<StaleResponse> {\n try {\n const { detailed } = input.query ?? {};\n\n const analysis = await analyzeStalePackages(ctx.cwd, detailed);\n\n return {\n stalePackages: analysis.stalePackages,\n totalStale: analysis.totalStale,\n totalAffected: analysis.totalAffected,\n criticalChains: detailed ? analysis.criticalChains : undefined,\n };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/stats-handler.ts"],"names":[],"mappings":";;;;AAGA,IAAM,SAAA,GAAY,eAAA;AAClB,IAAM,YAAA,GAAe,IAAI,EAAA,GAAK,GAAA;AAQ9B,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,MAAA,EAAqC;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,QAAA,EAAS;AAEvB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAiB,SAAS,CAAA;AACrD,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM;AAAA,OACd;AAEA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,MAAA,EAAQ,YAAY,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"stats-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useCache, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { calculateStats } from '@kb-labs/quality-core/stats';\n\nconst CACHE_KEY = 'quality:stats';\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\ninterface StatsResult {\n packages: number;\n loc: number;\n size: string;\n}\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, _input: RestInput<unknown, unknown>) {\n try {\n const cache = useCache();\n\n if (cache) {\n const cached = await cache.get<StatsResult>(CACHE_KEY);\n if (cached) return cached;\n }\n\n const stats = await calculateStats(ctx.cwd);\n const result: StatsResult = {\n packages: stats.packages,\n loc: stats.loc,\n size: stats.sizeFormatted,\n };\n\n if (cache) {\n await cache.set(CACHE_KEY, result, CACHE_TTL_MS);\n }\n\n return result;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/stats-handler.ts"],"names":[],"mappings":";;;;AAGA,IAAM,SAAA,GAAY,eAAA;AAClB,IAAM,YAAA,GAAe,IAAI,EAAA,GAAK,GAAA;AAQ9B,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CAAQ,GAAA,EAAsB,MAAA,EAAqC;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,QAAA,EAAS;AAEvB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAiB,SAAS,CAAA;AACrD,QAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,MACrB;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,MAAM,KAAA,CAAM;AAAA,OACd;AAEA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,MAAA,EAAQ,YAAY,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"stats-handler.js","sourcesContent":["import { defineHandler, rethrowForRest, useCache, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { calculateStats } from '@kb-labs/quality-core/stats';\n\nconst CACHE_KEY = 'quality:stats';\nconst CACHE_TTL_MS = 5 * 60 * 1000;\n\ninterface StatsResult {\n packages: number;\n loc: number;\n size: string;\n}\n\nexport default defineHandler({\n async execute(ctx: PluginContextV3, _input: RestInput<unknown, unknown>) {\n try {\n const cache = useCache();\n\n if (cache) {\n const cached = await cache.get<StatsResult>(CACHE_KEY);\n if (cached) return cached;\n }\n\n const stats = await calculateStats(ctx.cwd);\n const result: StatsResult = {\n packages: stats.packages,\n loc: stats.loc,\n size: stats.sizeFormatted,\n };\n\n if (cache) {\n await cache.set(CACHE_KEY, result, CACHE_TTL_MS);\n }\n\n return result;\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/tests-handler.ts"],"names":[],"mappings":";;;;AAmBA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,SAAS,aAAA,EAAe,OAAA,EAAS,cAAc,YAAA,EAAa,GAAI,KAAA,CAAM,KAAA,IAAS,EAAC;AAExF,MAAA,OAAO,QAAA,CAAS,IAAI,GAAA,EAAK;AAAA,QACvB,aAAA;AAAA,QACA,SAAS,OAAA,IAAW,GAAA;AAAA,QACpB,cAAc,YAAA,IAAgB,KAAA;AAAA,QAC9B,cAAc,YAAA,IAAgB;AAAA,OAC/B,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"tests-handler.js","sourcesContent":["/**\n * GET /tests handler\n *\n * Test execution and coverage tracking across monorepo\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { runTests } from '@kb-labs/quality-core/tests';\nimport type { TestRunResult } from '@kb-labs/quality-contracts';\n\nexport type TestsRequest = {\n package?: string;\n timeout?: number;\n withCoverage?: boolean;\n coverageOnly?: boolean;\n};\n\nexport type TestsResponse = TestRunResult;\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<TestsRequest, unknown>\n ): Promise<TestsResponse> {\n try {\n const { package: packageFilter, timeout, withCoverage, coverageOnly } = input.query ?? {};\n\n return runTests(ctx.cwd, {\n packageFilter,\n timeout: timeout || 60000,\n withCoverage: withCoverage ?? false,\n coverageOnly: coverageOnly ?? false,\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/tests-handler.ts"],"names":[],"mappings":";;;;AAmBA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,SAAS,aAAA,EAAe,OAAA,EAAS,cAAc,YAAA,EAAa,GAAI,KAAA,CAAM,KAAA,IAAS,EAAC;AAExF,MAAA,OAAO,QAAA,CAAS,IAAI,GAAA,EAAK;AAAA,QACvB,aAAA;AAAA,QACA,SAAS,OAAA,IAAW,GAAA;AAAA,QACpB,cAAc,YAAA,IAAgB,KAAA;AAAA,QAC9B,cAAc,YAAA,IAAgB;AAAA,OAC/B,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"tests-handler.js","sourcesContent":["/**\n * GET /tests handler\n *\n * Test execution and coverage tracking across monorepo\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { runTests } from '@kb-labs/quality-core/tests';\nimport type { TestRunResult } from '@kb-labs/quality-contracts';\n\nexport type TestsRequest = {\n package?: string;\n timeout?: number;\n withCoverage?: boolean;\n coverageOnly?: boolean;\n};\n\nexport type TestsResponse = TestRunResult;\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<TestsRequest, unknown>\n ): Promise<TestsResponse> {\n try {\n const { package: packageFilter, timeout, withCoverage, coverageOnly } = input.query ?? {};\n\n return runTests(ctx.cwd, {\n packageFilter,\n timeout: timeout || 60000,\n withCoverage: withCoverage ?? false,\n coverageOnly: coverageOnly ?? false,\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/rest/handlers/types-handler.ts"],"names":[],"mappings":";;;;AAiBA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAe,YAAW,GAAI,KAAA,CAAM,SAAS,EAAC;AAE/D,MAAA,OAAO,YAAA,CAAa,IAAI,GAAA,EAAK;AAAA,QAC3B,aAAA;AAAA,QACA,YAAY,UAAA,IAAc;AAAA,OAC3B,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"types-handler.js","sourcesContent":["/**\n * GET /types handler\n *\n * TypeScript type safety analysis across monorepo\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { analyzeTypes } from '@kb-labs/quality-core/types';\nimport type { TypeAnalysisResult } from '@kb-labs/quality-contracts';\n\nexport type TypesRequest = {\n package?: string;\n errorsOnly?: boolean;\n};\n\nexport type TypesResponse = TypeAnalysisResult;\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<TypesRequest, unknown>\n ): Promise<TypesResponse> {\n try {\n const { package: packageFilter, errorsOnly } = input.query ?? {};\n\n return analyzeTypes(ctx.cwd, {\n packageFilter,\n errorsOnly: errorsOnly ?? false,\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/quality/entry/src/rest/handlers/types-handler.ts"],"names":[],"mappings":";;;;AAiBA,IAAO,wBAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAe,YAAW,GAAI,KAAA,CAAM,SAAS,EAAC;AAE/D,MAAA,OAAO,YAAA,CAAa,IAAI,GAAA,EAAK;AAAA,QAC3B,aAAA;AAAA,QACA,YAAY,UAAA,IAAc;AAAA,OAC3B,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"types-handler.js","sourcesContent":["/**\n * GET /types handler\n *\n * TypeScript type safety analysis across monorepo\n */\n\nimport { defineHandler, rethrowForRest, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { analyzeTypes } from '@kb-labs/quality-core/types';\nimport type { TypeAnalysisResult } from '@kb-labs/quality-contracts';\n\nexport type TypesRequest = {\n package?: string;\n errorsOnly?: boolean;\n};\n\nexport type TypesResponse = TypeAnalysisResult;\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<TypesRequest, unknown>\n ): Promise<TypesResponse> {\n try {\n const { package: packageFilter, errorsOnly } = input.query ?? {};\n\n return analyzeTypes(ctx.cwd, {\n packageFilter,\n errorsOnly: errorsOnly ?? false,\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/quality-entry",
3
3
  "description": "Quality Plugin CLI commands for monorepo analysis, health checks, and automated fixes.",
4
- "version": "2.119.0-canary.e120bc0ee",
4
+ "version": "2.119.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -23,9 +23,9 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "zod": "^3.25.76",
26
- "@kb-labs/plugin-contracts": "2.119.0-canary.e120bc0ee",
27
- "@kb-labs/quality-contracts": "2.119.0-canary.e120bc0ee",
28
- "@kb-labs/quality-core": "2.119.0-canary.e120bc0ee",
26
+ "@kb-labs/plugin-contracts": "2.119.0",
27
+ "@kb-labs/quality-contracts": "2.119.0",
28
+ "@kb-labs/quality-core": "2.119.0",
29
29
  "@kb-labs/sdk": "2.115.4"
30
30
  },
31
31
  "devDependencies": {
@@ -41,12 +41,12 @@
41
41
  "tsup": "^8.5.0",
42
42
  "typescript": "^5.6.3",
43
43
  "vitest": "^3.2.6",
44
- "@kb-labs/devkit": "2.119.0-canary.e120bc0ee",
45
- "@kb-labs/plugin-runtime": "2.119.0-canary.e120bc0ee",
46
- "@kb-labs/studio-plugin-tools": "2.119.0-canary.e120bc0ee"
44
+ "@kb-labs/devkit": "2.119.0",
45
+ "@kb-labs/plugin-runtime": "2.119.0",
46
+ "@kb-labs/studio-plugin-tools": "2.119.0"
47
47
  },
48
48
  "engines": {
49
- "node": ">=22.0.0",
49
+ "node": ">=24.0.0",
50
50
  "pnpm": ">=9.0.0"
51
51
  },
52
52
  "kb": {