@kb-labs/quality-contracts 2.93.0 → 2.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,26 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ // src/types/config.ts
4
+ var defaultQualityConfig = {
5
+ maxSnapshots: 30,
6
+ knip: {
7
+ enabled: true
8
+ },
9
+ layers: {
10
+ "core/": 0,
11
+ "sdk/": 1,
12
+ "shared/": 1,
13
+ "cli/": 2,
14
+ "adapters/": 2,
15
+ "plugins/": 3,
16
+ "studio/": 4
17
+ },
18
+ thresholds: {
19
+ health: 70,
20
+ instability: 0.85
21
+ }
22
+ };
23
+
3
24
  // src/constants.ts
4
25
  var QUALITY_ENV_VARS = [
5
26
  "KB_QUALITY_CACHE_TTL",
@@ -16,27 +37,26 @@ var CACHE_KEYS = {
16
37
  BUILDS: "quality:builds",
17
38
  TYPE_ANALYSIS: "quality:type-analysis",
18
39
  TESTS: "quality:tests",
19
- DEAD_CODE: "quality:dead-code"
40
+ DEAD_CODE: "quality:dead-code",
41
+ KNIP: "quality:knip",
42
+ LAYERS: "quality:layers",
43
+ COUPLING: "quality:coupling"
44
+ };
45
+ var CACHE_TTLS = {
46
+ FAST: 5 * 60 * 1e3,
47
+ // 5 min — stats, health, coupling, layers
48
+ SLOW: 10 * 60 * 1e3
49
+ // 10 min — knip, builds, tests
20
50
  };
21
51
  var DEFAULT_TIMEOUTS = {
22
52
  STATS: 6e4,
23
- // 1 min
24
53
  HEALTH: 12e4,
25
- // 2 min
26
- CHECK_IMPORTS: 6e4,
27
- // 1 min
28
- CHECK_EXPORTS: 6e4,
29
- // 1 min
54
+ LAYERS: 6e4,
55
+ COUPLING: 3e4,
56
+ KNIP: 18e4,
30
57
  CHECK_TYPES: 9e4,
31
- // 1.5 min
32
- TYPES_AUDIT: 18e4,
33
- // 3 min
34
58
  FIX_DEPS: 3e5,
35
- // 5 min
36
- CI: 6e5,
37
- // 10 min
38
- DEAD_CODE: 12e4
39
- // 2 min
59
+ CI: 6e5
40
60
  };
41
61
  var HEALTH_GRADES = {
42
62
  A: { min: 90, max: 100, label: "Excellent" },
@@ -45,43 +65,48 @@ var HEALTH_GRADES = {
45
65
  D: { min: 60, max: 69, label: "Poor" },
46
66
  F: { min: 0, max: 59, label: "Failing" }
47
67
  };
68
+ var DIMENSION_WEIGHTS = {
69
+ architecture: 0.3,
70
+ typescript: 0.25,
71
+ deadCode: 0.2,
72
+ depHygiene: 0.15,
73
+ testCoverage: 0.1
74
+ };
75
+ var SNAPSHOT_DIR = ".kb/quality/snapshots";
76
+ var SNAPSHOT_FILE = "quality.json";
77
+ var MAX_SNAPSHOTS_DEFAULT = 30;
48
78
 
49
79
  // src/routes.ts
50
80
  var QUALITY_BASE_PATH = "/v1/plugins/quality";
51
81
  var QUALITY_ROUTES = {
52
- /** GET /stats - Get monorepo statistics */
82
+ /** GET /stats */
53
83
  STATS: "/stats",
54
- /** GET /health - Get health score */
84
+ /** GET /health */
55
85
  HEALTH: "/health",
56
- /** GET /dependencies - Get dependency issues */
86
+ /** GET /dependencies */
57
87
  DEPENDENCIES: "/dependencies",
58
- /** GET /build-order - Get build order */
88
+ /** GET /build-order */
59
89
  BUILD_ORDER: "/build-order",
60
- /** GET /cycles - Get circular dependencies */
90
+ /** GET /cycles */
61
91
  CYCLES: "/cycles",
62
- /** GET /graph - Get dependency graph */
92
+ /** GET /graph */
63
93
  GRAPH: "/graph",
64
- /** GET /stale - Get stale packages */
94
+ /** GET /stale */
65
95
  STALE: "/stale",
66
- /** GET /builds - Get build status */
67
- BUILDS: "/builds",
68
- /** GET /types - Get type safety analysis */
69
- TYPES: "/types",
70
- /** GET /tests - Get test results and coverage */
71
- TESTS: "/tests"
72
- };
73
- var QUALITY_FULL_ROUTES = {
74
- STATS: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.STATS}`,
75
- HEALTH: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.HEALTH}`,
76
- DEPENDENCIES: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.DEPENDENCIES}`,
77
- BUILD_ORDER: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.BUILD_ORDER}`,
78
- CYCLES: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.CYCLES}`,
79
- GRAPH: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.GRAPH}`,
80
- STALE: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.STALE}`,
81
- BUILDS: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.BUILDS}`,
82
- TYPES: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.TYPES}`,
83
- TESTS: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.TESTS}`
96
+ /** GET /layers layering violation report */
97
+ LAYERS: "/layers",
98
+ /** GET /coupling coupling metrics */
99
+ COUPLING: "/coupling",
100
+ /** GET /dead-code knip report */
101
+ DEAD_CODE: "/dead-code",
102
+ /** GET /history — snapshot history */
103
+ HISTORY: "/history",
104
+ /** POST /snapshot — save snapshot */
105
+ SNAPSHOT: "/snapshot"
84
106
  };
107
+ var QUALITY_FULL_ROUTES = Object.fromEntries(
108
+ Object.entries(QUALITY_ROUTES).map(([k, v]) => [k, `${QUALITY_BASE_PATH}${v}`])
109
+ );
85
110
  var StatsRequestSchema = z.object({
86
111
  includeHealth: z.boolean().optional()
87
112
  });
@@ -204,7 +229,99 @@ var StaleResponseSchema = z.object({
204
229
  totalAffected: z.number(),
205
230
  criticalChains: z.array(StaleChainSchema).optional()
206
231
  });
232
+ var DimensionScoreSchema = z.object({
233
+ score: z.number(),
234
+ grade: z.enum(["A", "B", "C", "D", "F"]),
235
+ details: z.array(z.string())
236
+ });
237
+ var DimensionScoresSchema = z.object({
238
+ architecture: DimensionScoreSchema,
239
+ typescript: DimensionScoreSchema,
240
+ deadCode: DimensionScoreSchema,
241
+ depHygiene: DimensionScoreSchema,
242
+ testCoverage: DimensionScoreSchema
243
+ });
244
+ var HealthV2ResponseSchema = z.object({
245
+ score: z.number(),
246
+ grade: z.enum(["A", "B", "C", "D", "F"]),
247
+ dimensions: DimensionScoresSchema
248
+ });
249
+ var LayeringViolationSchema = z.object({
250
+ file: z.string(),
251
+ fromPackage: z.string(),
252
+ fromLayer: z.number(),
253
+ toPackage: z.string(),
254
+ toLayer: z.number(),
255
+ importSpecifier: z.string()
256
+ });
257
+ var LayeringResponseSchema = z.object({
258
+ violations: z.array(LayeringViolationSchema),
259
+ totalViolations: z.number(),
260
+ affectedPackages: z.array(z.string()),
261
+ layerMap: z.record(z.number())
262
+ });
263
+ var PackageCouplingSchema = z.object({
264
+ name: z.string(),
265
+ afferent: z.number(),
266
+ efferent: z.number(),
267
+ instability: z.number()
268
+ });
269
+ var CouplingResponseSchema = z.object({
270
+ packages: z.array(PackageCouplingSchema),
271
+ avgInstability: z.number(),
272
+ mostUnstable: z.array(PackageCouplingSchema),
273
+ mostCoupled: z.array(PackageCouplingSchema)
274
+ });
275
+ var KnipUnusedExportSchema = z.object({
276
+ file: z.string(),
277
+ symbol: z.string()
278
+ });
279
+ var KnipUnusedDependencySchema = z.object({
280
+ package: z.string(),
281
+ workspace: z.string()
282
+ });
283
+ var DeadCodeResponseSchema = z.object({
284
+ unusedFiles: z.array(z.string()),
285
+ unusedExports: z.array(KnipUnusedExportSchema),
286
+ unusedDependencies: z.array(KnipUnusedDependencySchema),
287
+ unlistedDependencies: z.array(KnipUnusedDependencySchema),
288
+ totalIssues: z.number()
289
+ });
290
+ var QualitySnapshotSchema = z.object({
291
+ id: z.string(),
292
+ timestamp: z.string(),
293
+ git: z.object({
294
+ commit: z.string(),
295
+ branch: z.string(),
296
+ message: z.string()
297
+ }),
298
+ score: z.number(),
299
+ grade: z.enum(["A", "B", "C", "D", "F"]),
300
+ dimensions: DimensionScoresSchema,
301
+ counters: z.object({
302
+ layeringViolations: z.number(),
303
+ avgInstability: z.number(),
304
+ anyCount: z.number(),
305
+ tsIgnoreCount: z.number(),
306
+ unusedFiles: z.number(),
307
+ unusedDeps: z.number()
308
+ })
309
+ });
310
+ var SnapshotDeltaSchema = z.object({
311
+ score: z.number(),
312
+ layeringViolations: z.number(),
313
+ anyCount: z.number(),
314
+ tsIgnoreCount: z.number(),
315
+ unusedFiles: z.number(),
316
+ unusedDeps: z.number(),
317
+ avgInstability: z.number()
318
+ });
319
+ var HistoryResponseSchema = z.object({
320
+ snapshots: z.array(QualitySnapshotSchema),
321
+ delta: SnapshotDeltaSchema.nullable(),
322
+ latest: QualitySnapshotSchema.nullable()
323
+ });
207
324
 
208
- export { BuildOrderRequestSchema, BuildOrderResponseSchema, CACHE_KEYS, CyclesRequestSchema, CyclesResponseSchema, DEFAULT_TIMEOUTS, DependenciesRequestSchema, DependenciesResponseSchema, DuplicateDependencySchema, GraphModeSchema, GraphNodeSchema, GraphRequestSchema, GraphResponseSchema, GraphStatsSchema, HEALTH_GRADES, HealthIssueSchema, HealthRequestSchema, HealthResponseSchema, MissingDependencySchema, QUALITY_BASE_PATH, QUALITY_CACHE_PREFIX, QUALITY_ENV_VARS, QUALITY_FULL_ROUTES, QUALITY_ROUTES, StaleChainSchema, StalePackageSchema, StaleRequestSchema, StaleResponseSchema, StatsRequestSchema, StatsResponseSchema, UnusedDependencySchema, VersionInfoSchema };
325
+ export { BuildOrderRequestSchema, BuildOrderResponseSchema, CACHE_KEYS, CACHE_TTLS, CouplingResponseSchema, CyclesRequestSchema, CyclesResponseSchema, DEFAULT_TIMEOUTS, DIMENSION_WEIGHTS, DeadCodeResponseSchema, DependenciesRequestSchema, DependenciesResponseSchema, DimensionScoreSchema, DimensionScoresSchema, DuplicateDependencySchema, GraphModeSchema, GraphNodeSchema, GraphRequestSchema, GraphResponseSchema, GraphStatsSchema, HEALTH_GRADES, HealthIssueSchema, HealthRequestSchema, HealthResponseSchema, HealthV2ResponseSchema, HistoryResponseSchema, KnipUnusedDependencySchema, KnipUnusedExportSchema, LayeringResponseSchema, LayeringViolationSchema, MAX_SNAPSHOTS_DEFAULT, MissingDependencySchema, PackageCouplingSchema, QUALITY_BASE_PATH, QUALITY_CACHE_PREFIX, QUALITY_ENV_VARS, QUALITY_FULL_ROUTES, QUALITY_ROUTES, QualitySnapshotSchema, SNAPSHOT_DIR, SNAPSHOT_FILE, SnapshotDeltaSchema, StaleChainSchema, StalePackageSchema, StaleRequestSchema, StaleResponseSchema, StatsRequestSchema, StatsResponseSchema, UnusedDependencySchema, VersionInfoSchema, defaultQualityConfig };
209
326
  //# sourceMappingURL=index.js.map
210
327
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/routes.ts","../src/types/rest-api.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Constants for Quality Plugin\n */\n\n/**\n * Environment variables\n */\nexport const QUALITY_ENV_VARS = [\n 'KB_QUALITY_CACHE_TTL',\n 'KB_QUALITY_MAX_PACKAGES',\n] as const;\n\n/**\n * Cache namespace prefix\n */\nexport const QUALITY_CACHE_PREFIX = 'quality:';\n\n/**\n * Cache keys\n */\nexport const CACHE_KEYS = {\n STATS: 'quality:stats',\n HEALTH: 'quality:health',\n IMPORTS: 'quality:imports',\n EXPORTS: 'quality:exports',\n TYPES: 'quality:types',\n DUPLICATES: 'quality:duplicates',\n BUILDS: 'quality:builds',\n TYPE_ANALYSIS: 'quality:type-analysis',\n TESTS: 'quality:tests',\n DEAD_CODE: 'quality:dead-code',\n} as const;\n\n/**\n * Default timeouts (milliseconds)\n */\nexport const DEFAULT_TIMEOUTS = {\n STATS: 60000, // 1 min\n HEALTH: 120000, // 2 min\n CHECK_IMPORTS: 60000, // 1 min\n CHECK_EXPORTS: 60000, // 1 min\n CHECK_TYPES: 90000, // 1.5 min\n TYPES_AUDIT: 180000, // 3 min\n FIX_DEPS: 300000, // 5 min\n CI: 600000, // 10 min\n DEAD_CODE: 120000, // 2 min\n} as const;\n\n/**\n * Health score grades\n */\nexport const HEALTH_GRADES = {\n A: { min: 90, max: 100, label: 'Excellent' },\n B: { min: 80, max: 89, label: 'Good' },\n C: { min: 70, max: 79, label: 'Fair' },\n D: { min: 60, max: 69, label: 'Poor' },\n F: { min: 0, max: 59, label: 'Failing' },\n} as const;\n","/**\n * @module @kb-labs/quality-contracts/routes\n * REST API route constants for quality plugin\n */\n\n/**\n * REST API base path for quality plugin\n */\nexport const QUALITY_BASE_PATH = '/v1/plugins/quality' as const;\n\n/**\n * REST API route paths (relative to basePath)\n */\nexport const QUALITY_ROUTES = {\n /** GET /stats - Get monorepo statistics */\n STATS: '/stats',\n\n /** GET /health - Get health score */\n HEALTH: '/health',\n\n /** GET /dependencies - Get dependency issues */\n DEPENDENCIES: '/dependencies',\n\n /** GET /build-order - Get build order */\n BUILD_ORDER: '/build-order',\n\n /** GET /cycles - Get circular dependencies */\n CYCLES: '/cycles',\n\n /** GET /graph - Get dependency graph */\n GRAPH: '/graph',\n\n /** GET /stale - Get stale packages */\n STALE: '/stale',\n\n /** GET /builds - Get build status */\n BUILDS: '/builds',\n\n /** GET /types - Get type safety analysis */\n TYPES: '/types',\n\n /** GET /tests - Get test results and coverage */\n TESTS: '/tests',\n} as const;\n\n/**\n * Full REST API URLs (basePath + route)\n * Useful for testing and documentation\n */\nexport const QUALITY_FULL_ROUTES = {\n STATS: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.STATS}`,\n HEALTH: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.HEALTH}`,\n DEPENDENCIES: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.DEPENDENCIES}`,\n BUILD_ORDER: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.BUILD_ORDER}`,\n CYCLES: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.CYCLES}`,\n GRAPH: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.GRAPH}`,\n STALE: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.STALE}`,\n BUILDS: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.BUILDS}`,\n TYPES: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.TYPES}`,\n TESTS: `${QUALITY_BASE_PATH}${QUALITY_ROUTES.TESTS}`,\n} as const;\n\nexport type QualityRoute = typeof QUALITY_ROUTES[keyof typeof QUALITY_ROUTES];\n","/**\n * REST API Request/Response Types and Zod Schemas for Quality Plugin\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Stats API\n// ============================================================================\n\nexport const StatsRequestSchema = z.object({\n includeHealth: z.boolean().optional(),\n});\n\nexport type StatsRequest = z.infer<typeof StatsRequestSchema>;\n\nexport const StatsResponseSchema = z.object({\n packages: z.number(),\n loc: z.number(),\n size: z.string(),\n health: z.number().optional(),\n grade: z.string().optional(),\n});\n\nexport type StatsResponse = z.infer<typeof StatsResponseSchema>;\n\n// ============================================================================\n// Health API\n// ============================================================================\n\nexport const HealthRequestSchema = z.object({\n detailed: z.boolean().optional(),\n});\n\nexport type HealthRequest = z.infer<typeof HealthRequestSchema>;\n\nexport const HealthIssueSchema = z.object({\n type: z.string(),\n severity: z.number(),\n description: z.string(),\n packages: z.array(z.string()).optional(),\n count: z.number().optional(),\n});\n\nexport type HealthIssue = z.infer<typeof HealthIssueSchema>;\n\nexport const HealthResponseSchema = z.object({\n score: z.number(),\n grade: z.string(),\n issues: z.array(HealthIssueSchema).optional(),\n});\n\nexport type HealthResponse = z.infer<typeof HealthResponseSchema>;\n\n// ============================================================================\n// Dependencies API\n// ============================================================================\n\nexport const DependenciesRequestSchema = z.object({});\n\nexport type DependenciesRequest = z.infer<typeof DependenciesRequestSchema>;\n\nexport const VersionInfoSchema = z.object({\n version: z.string(),\n packages: z.array(z.string()),\n count: z.number(),\n});\n\nexport type VersionInfo = z.infer<typeof VersionInfoSchema>;\n\nexport const DuplicateDependencySchema = z.object({\n name: z.string(),\n versions: z.array(VersionInfoSchema),\n totalPackages: z.number(),\n});\n\nexport type DuplicateDependency = z.infer<typeof DuplicateDependencySchema>;\n\nexport const UnusedDependencySchema = z.object({\n name: z.string(),\n packages: z.array(z.string()),\n});\n\nexport type UnusedDependency = z.infer<typeof UnusedDependencySchema>;\n\nexport const MissingDependencySchema = z.object({\n name: z.string(),\n packages: z.array(z.string()),\n importedIn: z.array(z.string()),\n});\n\nexport type MissingDependency = z.infer<typeof MissingDependencySchema>;\n\nexport const DependenciesResponseSchema = z.object({\n duplicates: z.array(DuplicateDependencySchema),\n unused: z.array(UnusedDependencySchema),\n missing: z.array(MissingDependencySchema),\n totalIssues: z.number(),\n});\n\nexport type DependenciesResponse = z.infer<typeof DependenciesResponseSchema>;\n\n// ============================================================================\n// Build Order API\n// ============================================================================\n\nexport const BuildOrderRequestSchema = z.object({\n packageName: z.string().optional(),\n});\n\nexport type BuildOrderRequest = z.infer<typeof BuildOrderRequestSchema>;\n\nexport const BuildOrderResponseSchema = z.object({\n layers: z.array(z.array(z.string())),\n sorted: z.array(z.string()),\n circular: z.array(z.array(z.string())),\n packageCount: z.number(),\n layerCount: z.number(),\n hasCircular: z.boolean(),\n});\n\nexport type BuildOrderResponse = z.infer<typeof BuildOrderResponseSchema>;\n\n// ============================================================================\n// Cycles API\n// ============================================================================\n\nexport const CyclesRequestSchema = z.object({});\n\nexport type CyclesRequest = z.infer<typeof CyclesRequestSchema>;\n\nexport const CyclesResponseSchema = z.object({\n cycles: z.array(z.array(z.string())),\n count: z.number(),\n hasCircular: z.boolean(),\n affected: z.array(z.string()),\n});\n\nexport type CyclesResponse = z.infer<typeof CyclesResponseSchema>;\n\n// ============================================================================\n// Graph API\n// ============================================================================\n\nexport const GraphModeSchema = z.enum(['tree', 'reverse', 'impact', 'stats']);\n\nexport type GraphMode = z.infer<typeof GraphModeSchema>;\n\nexport const GraphRequestSchema = z.object({\n packageName: z.string().optional(),\n mode: GraphModeSchema,\n});\n\nexport type GraphRequest = z.infer<typeof GraphRequestSchema>;\n\nexport const GraphNodeSchema: z.ZodType<GraphNode> = z.lazy(() =>\n z.object({\n name: z.string(),\n children: z.array(GraphNodeSchema).optional(),\n })\n);\n\nexport type GraphNode = {\n name: string;\n children?: GraphNode[];\n};\n\nexport const GraphStatsSchema = z.object({\n totalPackages: z.number(),\n maxDepth: z.number(),\n avgDependencies: z.number(),\n mostDepended: z.array(\n z.object({\n name: z.string(),\n count: z.number(),\n })\n ),\n});\n\nexport type GraphStats = z.infer<typeof GraphStatsSchema>;\n\nexport const GraphResponseSchema = z.object({\n mode: GraphModeSchema,\n packageName: z.string().optional(),\n tree: GraphNodeSchema.optional(),\n packages: z.array(z.string()).optional(),\n stats: GraphStatsSchema.optional(),\n});\n\nexport type GraphResponse = z.infer<typeof GraphResponseSchema>;\n\n// ============================================================================\n// Stale API\n// ============================================================================\n\nexport const StaleRequestSchema = z.object({\n detailed: z.boolean().optional(),\n});\n\nexport type StaleRequest = z.infer<typeof StaleRequestSchema>;\n\nexport const StalePackageSchema = z.object({\n name: z.string(),\n path: z.string(),\n reason: z.enum(['source-newer', 'dependency-rebuilt', 'missing-dist']),\n sourceModified: z.string().optional(),\n distModified: z.string().optional(),\n affectedPackages: z.array(z.string()),\n affectedCount: z.number(),\n severity: z.enum(['critical', 'high', 'medium', 'low']),\n});\n\nexport type StalePackage = z.infer<typeof StalePackageSchema>;\n\nexport const StaleChainSchema = z.object({\n root: z.string(),\n affected: z.array(z.string()),\n depth: z.number(),\n});\n\nexport type StaleChain = z.infer<typeof StaleChainSchema>;\n\nexport const StaleResponseSchema = z.object({\n stalePackages: z.array(StalePackageSchema),\n totalStale: z.number(),\n totalAffected: z.number(),\n criticalChains: z.array(StaleChainSchema).optional(),\n});\n\nexport type StaleResponse = z.infer<typeof StaleResponseSchema>;\n"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/constants.ts","../src/routes.ts","../src/types/rest-api.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Quality plugin configuration — stored in kb.config.json under \"quality\" section\n */\n\nexport interface QualityLayerMap {\n [pathPrefix: string]: number;\n}\n\nexport interface QualityThresholds {\n /** Minimum health score before exit 1. Default: 70 */\n health: number;\n /** Instability threshold for warning. Default: 0.85 */\n instability: number;\n}\n\nexport interface QualityKnipConfig {\n /** Whether to run knip for dead code / dep analysis. Default: true */\n enabled: boolean;\n}\n\nexport interface QualityPluginConfig {\n /** Max snapshots to retain in history. Default: 30 */\n maxSnapshots: number;\n knip: QualityKnipConfig;\n /**\n * Layer map: path prefix → layer index.\n * Defaults to KB Labs standard layers from CLAUDE.md.\n */\n layers: QualityLayerMap;\n thresholds: QualityThresholds;\n}\n\nexport const defaultQualityConfig: QualityPluginConfig = {\n maxSnapshots: 30,\n knip: {\n enabled: true,\n },\n layers: {\n 'core/': 0,\n 'sdk/': 1,\n 'shared/': 1,\n 'cli/': 2,\n 'adapters/': 2,\n 'plugins/': 3,\n 'studio/': 4,\n },\n thresholds: {\n health: 70,\n instability: 0.85,\n },\n};\n","/**\n * Constants for Quality Plugin\n */\n\nexport const QUALITY_ENV_VARS = [\n 'KB_QUALITY_CACHE_TTL',\n 'KB_QUALITY_MAX_PACKAGES',\n] as const;\n\nexport const QUALITY_CACHE_PREFIX = 'quality:';\n\nexport const CACHE_KEYS = {\n STATS: 'quality:stats',\n HEALTH: 'quality:health',\n IMPORTS: 'quality:imports',\n EXPORTS: 'quality:exports',\n TYPES: 'quality:types',\n DUPLICATES: 'quality:duplicates',\n BUILDS: 'quality:builds',\n TYPE_ANALYSIS: 'quality:type-analysis',\n TESTS: 'quality:tests',\n DEAD_CODE: 'quality:dead-code',\n KNIP: 'quality:knip',\n LAYERS: 'quality:layers',\n COUPLING: 'quality:coupling',\n} as const;\n\n/** Cache TTLs in milliseconds */\nexport const CACHE_TTLS = {\n FAST: 5 * 60 * 1000, // 5 min — stats, health, coupling, layers\n SLOW: 10 * 60 * 1000, // 10 min — knip, builds, tests\n} as const;\n\nexport const DEFAULT_TIMEOUTS = {\n STATS: 60_000,\n HEALTH: 120_000,\n LAYERS: 60_000,\n COUPLING: 30_000,\n KNIP: 180_000,\n CHECK_TYPES: 90_000,\n FIX_DEPS: 300_000,\n CI: 600_000,\n} as const;\n\nexport const HEALTH_GRADES = {\n A: { min: 90, max: 100, label: 'Excellent' },\n B: { min: 80, max: 89, label: 'Good' },\n C: { min: 70, max: 79, label: 'Fair' },\n D: { min: 60, max: 69, label: 'Poor' },\n F: { min: 0, max: 59, label: 'Failing' },\n} as const;\n\n/** Dimension weights for composite health score */\nexport const DIMENSION_WEIGHTS = {\n architecture: 0.30,\n typescript: 0.25,\n deadCode: 0.20,\n depHygiene: 0.15,\n testCoverage: 0.10,\n} as const;\n\nexport const SNAPSHOT_DIR = '.kb/quality/snapshots';\nexport const SNAPSHOT_FILE = 'quality.json';\nexport const MAX_SNAPSHOTS_DEFAULT = 30;\n","/**\n * @module @kb-labs/quality-contracts/routes\n * REST API route constants for quality plugin\n */\n\nexport const QUALITY_BASE_PATH = '/v1/plugins/quality' as const;\n\nexport const QUALITY_ROUTES = {\n /** GET /stats */\n STATS: '/stats',\n /** GET /health */\n HEALTH: '/health',\n /** GET /dependencies */\n DEPENDENCIES: '/dependencies',\n /** GET /build-order */\n BUILD_ORDER: '/build-order',\n /** GET /cycles */\n CYCLES: '/cycles',\n /** GET /graph */\n GRAPH: '/graph',\n /** GET /stale */\n STALE: '/stale',\n /** GET /layers — layering violation report */\n LAYERS: '/layers',\n /** GET /coupling — coupling metrics */\n COUPLING: '/coupling',\n /** GET /dead-code — knip report */\n DEAD_CODE: '/dead-code',\n /** GET /history — snapshot history */\n HISTORY: '/history',\n /** POST /snapshot — save snapshot */\n SNAPSHOT: '/snapshot',\n} as const;\n\nexport const QUALITY_FULL_ROUTES = Object.fromEntries(\n Object.entries(QUALITY_ROUTES).map(([k, v]) => [k, `${QUALITY_BASE_PATH}${v}`])\n) as { [K in keyof typeof QUALITY_ROUTES]: string };\n\nexport type QualityRoute = (typeof QUALITY_ROUTES)[keyof typeof QUALITY_ROUTES];\n","/**\n * REST API Request/Response Types and Zod Schemas for Quality Plugin\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Stats API\n// ============================================================================\n\nexport const StatsRequestSchema = z.object({\n includeHealth: z.boolean().optional(),\n});\n\nexport type StatsRequest = z.infer<typeof StatsRequestSchema>;\n\nexport const StatsResponseSchema = z.object({\n packages: z.number(),\n loc: z.number(),\n size: z.string(),\n health: z.number().optional(),\n grade: z.string().optional(),\n});\n\nexport type StatsResponse = z.infer<typeof StatsResponseSchema>;\n\n// ============================================================================\n// Health API\n// ============================================================================\n\nexport const HealthRequestSchema = z.object({\n detailed: z.boolean().optional(),\n});\n\nexport type HealthRequest = z.infer<typeof HealthRequestSchema>;\n\nexport const HealthIssueSchema = z.object({\n type: z.string(),\n severity: z.number(),\n description: z.string(),\n packages: z.array(z.string()).optional(),\n count: z.number().optional(),\n});\n\nexport type HealthIssue = z.infer<typeof HealthIssueSchema>;\n\nexport const HealthResponseSchema = z.object({\n score: z.number(),\n grade: z.string(),\n issues: z.array(HealthIssueSchema).optional(),\n});\n\nexport type HealthResponse = z.infer<typeof HealthResponseSchema>;\n\n// ============================================================================\n// Dependencies API\n// ============================================================================\n\nexport const DependenciesRequestSchema = z.object({});\n\nexport type DependenciesRequest = z.infer<typeof DependenciesRequestSchema>;\n\nexport const VersionInfoSchema = z.object({\n version: z.string(),\n packages: z.array(z.string()),\n count: z.number(),\n});\n\nexport type VersionInfo = z.infer<typeof VersionInfoSchema>;\n\nexport const DuplicateDependencySchema = z.object({\n name: z.string(),\n versions: z.array(VersionInfoSchema),\n totalPackages: z.number(),\n});\n\nexport type DuplicateDependency = z.infer<typeof DuplicateDependencySchema>;\n\nexport const UnusedDependencySchema = z.object({\n name: z.string(),\n packages: z.array(z.string()),\n});\n\nexport type UnusedDependency = z.infer<typeof UnusedDependencySchema>;\n\nexport const MissingDependencySchema = z.object({\n name: z.string(),\n packages: z.array(z.string()),\n importedIn: z.array(z.string()),\n});\n\nexport type MissingDependency = z.infer<typeof MissingDependencySchema>;\n\nexport const DependenciesResponseSchema = z.object({\n duplicates: z.array(DuplicateDependencySchema),\n unused: z.array(UnusedDependencySchema),\n missing: z.array(MissingDependencySchema),\n totalIssues: z.number(),\n});\n\nexport type DependenciesResponse = z.infer<typeof DependenciesResponseSchema>;\n\n// ============================================================================\n// Build Order API\n// ============================================================================\n\nexport const BuildOrderRequestSchema = z.object({\n packageName: z.string().optional(),\n});\n\nexport type BuildOrderRequest = z.infer<typeof BuildOrderRequestSchema>;\n\nexport const BuildOrderResponseSchema = z.object({\n layers: z.array(z.array(z.string())),\n sorted: z.array(z.string()),\n circular: z.array(z.array(z.string())),\n packageCount: z.number(),\n layerCount: z.number(),\n hasCircular: z.boolean(),\n});\n\nexport type BuildOrderResponse = z.infer<typeof BuildOrderResponseSchema>;\n\n// ============================================================================\n// Cycles API\n// ============================================================================\n\nexport const CyclesRequestSchema = z.object({});\n\nexport type CyclesRequest = z.infer<typeof CyclesRequestSchema>;\n\nexport const CyclesResponseSchema = z.object({\n cycles: z.array(z.array(z.string())),\n count: z.number(),\n hasCircular: z.boolean(),\n affected: z.array(z.string()),\n});\n\nexport type CyclesResponse = z.infer<typeof CyclesResponseSchema>;\n\n// ============================================================================\n// Graph API\n// ============================================================================\n\nexport const GraphModeSchema = z.enum(['tree', 'reverse', 'impact', 'stats']);\n\nexport type GraphMode = z.infer<typeof GraphModeSchema>;\n\nexport const GraphRequestSchema = z.object({\n packageName: z.string().optional(),\n mode: GraphModeSchema,\n});\n\nexport type GraphRequest = z.infer<typeof GraphRequestSchema>;\n\nexport const GraphNodeSchema: z.ZodType<GraphNode> = z.lazy(() =>\n z.object({\n name: z.string(),\n children: z.array(GraphNodeSchema).optional(),\n })\n);\n\nexport type GraphNode = {\n name: string;\n children?: GraphNode[];\n};\n\nexport const GraphStatsSchema = z.object({\n totalPackages: z.number(),\n maxDepth: z.number(),\n avgDependencies: z.number(),\n mostDepended: z.array(\n z.object({\n name: z.string(),\n count: z.number(),\n })\n ),\n});\n\nexport type GraphStats = z.infer<typeof GraphStatsSchema>;\n\nexport const GraphResponseSchema = z.object({\n mode: GraphModeSchema,\n packageName: z.string().optional(),\n tree: GraphNodeSchema.optional(),\n packages: z.array(z.string()).optional(),\n stats: GraphStatsSchema.optional(),\n});\n\nexport type GraphResponse = z.infer<typeof GraphResponseSchema>;\n\n// ============================================================================\n// Stale API\n// ============================================================================\n\nexport const StaleRequestSchema = z.object({\n detailed: z.boolean().optional(),\n});\n\nexport type StaleRequest = z.infer<typeof StaleRequestSchema>;\n\nexport const StalePackageSchema = z.object({\n name: z.string(),\n path: z.string(),\n reason: z.enum(['source-newer', 'dependency-rebuilt', 'missing-dist']),\n sourceModified: z.string().optional(),\n distModified: z.string().optional(),\n affectedPackages: z.array(z.string()),\n affectedCount: z.number(),\n severity: z.enum(['critical', 'high', 'medium', 'low']),\n});\n\nexport type StalePackage = z.infer<typeof StalePackageSchema>;\n\nexport const StaleChainSchema = z.object({\n root: z.string(),\n affected: z.array(z.string()),\n depth: z.number(),\n});\n\nexport type StaleChain = z.infer<typeof StaleChainSchema>;\n\nexport const StaleResponseSchema = z.object({\n stalePackages: z.array(StalePackageSchema),\n totalStale: z.number(),\n totalAffected: z.number(),\n criticalChains: z.array(StaleChainSchema).optional(),\n});\n\nexport type StaleResponse = z.infer<typeof StaleResponseSchema>;\n\n// ============================================================================\n// Health (multidimensional) API\n// ============================================================================\n\nexport const DimensionScoreSchema = z.object({\n score: z.number(),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n details: z.array(z.string()),\n});\n\nexport const DimensionScoresSchema = z.object({\n architecture: DimensionScoreSchema,\n typescript: DimensionScoreSchema,\n deadCode: DimensionScoreSchema,\n depHygiene: DimensionScoreSchema,\n testCoverage: DimensionScoreSchema,\n});\n\nexport const HealthV2ResponseSchema = z.object({\n score: z.number(),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n dimensions: DimensionScoresSchema,\n});\n\nexport type HealthV2Response = z.infer<typeof HealthV2ResponseSchema>;\n\n// ============================================================================\n// Layering API\n// ============================================================================\n\nexport const LayeringViolationSchema = z.object({\n file: z.string(),\n fromPackage: z.string(),\n fromLayer: z.number(),\n toPackage: z.string(),\n toLayer: z.number(),\n importSpecifier: z.string(),\n});\n\nexport const LayeringResponseSchema = z.object({\n violations: z.array(LayeringViolationSchema),\n totalViolations: z.number(),\n affectedPackages: z.array(z.string()),\n layerMap: z.record(z.number()),\n});\n\nexport type LayeringResponse = z.infer<typeof LayeringResponseSchema>;\n\n// ============================================================================\n// Coupling API\n// ============================================================================\n\nexport const PackageCouplingSchema = z.object({\n name: z.string(),\n afferent: z.number(),\n efferent: z.number(),\n instability: z.number(),\n});\n\nexport const CouplingResponseSchema = z.object({\n packages: z.array(PackageCouplingSchema),\n avgInstability: z.number(),\n mostUnstable: z.array(PackageCouplingSchema),\n mostCoupled: z.array(PackageCouplingSchema),\n});\n\nexport type CouplingResponse = z.infer<typeof CouplingResponseSchema>;\n\n// ============================================================================\n// Dead code (Knip) API\n// ============================================================================\n\nexport const KnipUnusedExportSchema = z.object({\n file: z.string(),\n symbol: z.string(),\n});\n\nexport const KnipUnusedDependencySchema = z.object({\n package: z.string(),\n workspace: z.string(),\n});\n\nexport const DeadCodeResponseSchema = z.object({\n unusedFiles: z.array(z.string()),\n unusedExports: z.array(KnipUnusedExportSchema),\n unusedDependencies: z.array(KnipUnusedDependencySchema),\n unlistedDependencies: z.array(KnipUnusedDependencySchema),\n totalIssues: z.number(),\n});\n\nexport type DeadCodeResponse = z.infer<typeof DeadCodeResponseSchema>;\n\n// ============================================================================\n// Snapshot / History API\n// ============================================================================\n\nexport const QualitySnapshotSchema = z.object({\n id: z.string(),\n timestamp: z.string(),\n git: z.object({\n commit: z.string(),\n branch: z.string(),\n message: z.string(),\n }),\n score: z.number(),\n grade: z.enum(['A', 'B', 'C', 'D', 'F']),\n dimensions: DimensionScoresSchema,\n counters: z.object({\n layeringViolations: z.number(),\n avgInstability: z.number(),\n anyCount: z.number(),\n tsIgnoreCount: z.number(),\n unusedFiles: z.number(),\n unusedDeps: z.number(),\n }),\n});\n\nexport const SnapshotDeltaSchema = z.object({\n score: z.number(),\n layeringViolations: z.number(),\n anyCount: z.number(),\n tsIgnoreCount: z.number(),\n unusedFiles: z.number(),\n unusedDeps: z.number(),\n avgInstability: z.number(),\n});\n\nexport const HistoryResponseSchema = z.object({\n snapshots: z.array(QualitySnapshotSchema),\n delta: SnapshotDeltaSchema.nullable(),\n latest: QualitySnapshotSchema.nullable(),\n});\n\nexport type HistoryResponse = z.infer<typeof HistoryResponseSchema>;\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/quality-contracts",
3
3
  "description": "Type-safe contracts for Quality Plugin. Types, schemas, and constants for monorepo analysis and quality checks.",
4
- "version": "2.93.0",
4
+ "version": "2.96.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -30,8 +30,8 @@
30
30
  "rimraf": "^6.0.1",
31
31
  "tsup": "^8.5.0",
32
32
  "typescript": "^5.6.3",
33
- "vitest": "^3.2.4",
34
- "@kb-labs/devkit": "2.93.0"
33
+ "vitest": "^3.2.6",
34
+ "@kb-labs/devkit": "2.96.0"
35
35
  },
36
36
  "engines": {
37
37
  "node": ">=20.0.0",