@kb-labs/quality-contracts 0.6.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 ADDED
@@ -0,0 +1,210 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/constants.ts
4
+ var QUALITY_ENV_VARS = [
5
+ "KB_QUALITY_CACHE_TTL",
6
+ "KB_QUALITY_MAX_PACKAGES"
7
+ ];
8
+ var QUALITY_CACHE_PREFIX = "quality:";
9
+ var CACHE_KEYS = {
10
+ STATS: "quality:stats",
11
+ HEALTH: "quality:health",
12
+ IMPORTS: "quality:imports",
13
+ EXPORTS: "quality:exports",
14
+ TYPES: "quality:types",
15
+ DUPLICATES: "quality:duplicates",
16
+ BUILDS: "quality:builds",
17
+ TYPE_ANALYSIS: "quality:type-analysis",
18
+ TESTS: "quality:tests",
19
+ DEAD_CODE: "quality:dead-code"
20
+ };
21
+ var DEFAULT_TIMEOUTS = {
22
+ STATS: 6e4,
23
+ // 1 min
24
+ HEALTH: 12e4,
25
+ // 2 min
26
+ CHECK_IMPORTS: 6e4,
27
+ // 1 min
28
+ CHECK_EXPORTS: 6e4,
29
+ // 1 min
30
+ CHECK_TYPES: 9e4,
31
+ // 1.5 min
32
+ TYPES_AUDIT: 18e4,
33
+ // 3 min
34
+ FIX_DEPS: 3e5,
35
+ // 5 min
36
+ CI: 6e5,
37
+ // 10 min
38
+ DEAD_CODE: 12e4
39
+ // 2 min
40
+ };
41
+ var HEALTH_GRADES = {
42
+ A: { min: 90, max: 100, label: "Excellent" },
43
+ B: { min: 80, max: 89, label: "Good" },
44
+ C: { min: 70, max: 79, label: "Fair" },
45
+ D: { min: 60, max: 69, label: "Poor" },
46
+ F: { min: 0, max: 59, label: "Failing" }
47
+ };
48
+
49
+ // src/routes.ts
50
+ var QUALITY_BASE_PATH = "/v1/plugins/quality";
51
+ var QUALITY_ROUTES = {
52
+ /** GET /stats - Get monorepo statistics */
53
+ STATS: "/stats",
54
+ /** GET /health - Get health score */
55
+ HEALTH: "/health",
56
+ /** GET /dependencies - Get dependency issues */
57
+ DEPENDENCIES: "/dependencies",
58
+ /** GET /build-order - Get build order */
59
+ BUILD_ORDER: "/build-order",
60
+ /** GET /cycles - Get circular dependencies */
61
+ CYCLES: "/cycles",
62
+ /** GET /graph - Get dependency graph */
63
+ GRAPH: "/graph",
64
+ /** GET /stale - Get stale packages */
65
+ 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}`
84
+ };
85
+ var StatsRequestSchema = z.object({
86
+ includeHealth: z.boolean().optional()
87
+ });
88
+ var StatsResponseSchema = z.object({
89
+ packages: z.number(),
90
+ loc: z.number(),
91
+ size: z.string(),
92
+ health: z.number().optional(),
93
+ grade: z.string().optional()
94
+ });
95
+ var HealthRequestSchema = z.object({
96
+ detailed: z.boolean().optional()
97
+ });
98
+ var HealthIssueSchema = z.object({
99
+ type: z.string(),
100
+ severity: z.number(),
101
+ description: z.string(),
102
+ packages: z.array(z.string()).optional(),
103
+ count: z.number().optional()
104
+ });
105
+ var HealthResponseSchema = z.object({
106
+ score: z.number(),
107
+ grade: z.string(),
108
+ issues: z.array(HealthIssueSchema).optional()
109
+ });
110
+ var DependenciesRequestSchema = z.object({});
111
+ var VersionInfoSchema = z.object({
112
+ version: z.string(),
113
+ packages: z.array(z.string()),
114
+ count: z.number()
115
+ });
116
+ var DuplicateDependencySchema = z.object({
117
+ name: z.string(),
118
+ versions: z.array(VersionInfoSchema),
119
+ totalPackages: z.number()
120
+ });
121
+ var UnusedDependencySchema = z.object({
122
+ name: z.string(),
123
+ packages: z.array(z.string())
124
+ });
125
+ var MissingDependencySchema = z.object({
126
+ name: z.string(),
127
+ packages: z.array(z.string()),
128
+ importedIn: z.array(z.string())
129
+ });
130
+ var DependenciesResponseSchema = z.object({
131
+ duplicates: z.array(DuplicateDependencySchema),
132
+ unused: z.array(UnusedDependencySchema),
133
+ missing: z.array(MissingDependencySchema),
134
+ totalIssues: z.number()
135
+ });
136
+ var BuildOrderRequestSchema = z.object({
137
+ packageName: z.string().optional()
138
+ });
139
+ var BuildOrderResponseSchema = z.object({
140
+ layers: z.array(z.array(z.string())),
141
+ sorted: z.array(z.string()),
142
+ circular: z.array(z.array(z.string())),
143
+ packageCount: z.number(),
144
+ layerCount: z.number(),
145
+ hasCircular: z.boolean()
146
+ });
147
+ var CyclesRequestSchema = z.object({});
148
+ var CyclesResponseSchema = z.object({
149
+ cycles: z.array(z.array(z.string())),
150
+ count: z.number(),
151
+ hasCircular: z.boolean(),
152
+ affected: z.array(z.string())
153
+ });
154
+ var GraphModeSchema = z.enum(["tree", "reverse", "impact", "stats"]);
155
+ var GraphRequestSchema = z.object({
156
+ packageName: z.string().optional(),
157
+ mode: GraphModeSchema
158
+ });
159
+ var GraphNodeSchema = z.lazy(
160
+ () => z.object({
161
+ name: z.string(),
162
+ children: z.array(GraphNodeSchema).optional()
163
+ })
164
+ );
165
+ var GraphStatsSchema = z.object({
166
+ totalPackages: z.number(),
167
+ maxDepth: z.number(),
168
+ avgDependencies: z.number(),
169
+ mostDepended: z.array(
170
+ z.object({
171
+ name: z.string(),
172
+ count: z.number()
173
+ })
174
+ )
175
+ });
176
+ var GraphResponseSchema = z.object({
177
+ mode: GraphModeSchema,
178
+ packageName: z.string().optional(),
179
+ tree: GraphNodeSchema.optional(),
180
+ packages: z.array(z.string()).optional(),
181
+ stats: GraphStatsSchema.optional()
182
+ });
183
+ var StaleRequestSchema = z.object({
184
+ detailed: z.boolean().optional()
185
+ });
186
+ var StalePackageSchema = z.object({
187
+ name: z.string(),
188
+ path: z.string(),
189
+ reason: z.enum(["source-newer", "dependency-rebuilt", "missing-dist"]),
190
+ sourceModified: z.string().optional(),
191
+ distModified: z.string().optional(),
192
+ affectedPackages: z.array(z.string()),
193
+ affectedCount: z.number(),
194
+ severity: z.enum(["critical", "high", "medium", "low"])
195
+ });
196
+ var StaleChainSchema = z.object({
197
+ root: z.string(),
198
+ affected: z.array(z.string()),
199
+ depth: z.number()
200
+ });
201
+ var StaleResponseSchema = z.object({
202
+ stalePackages: z.array(StalePackageSchema),
203
+ totalStale: z.number(),
204
+ totalAffected: z.number(),
205
+ criticalChains: z.array(StaleChainSchema).optional()
206
+ });
207
+
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 };
209
+ //# sourceMappingURL=index.js.map
210
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@kb-labs/quality-contracts",
3
+ "version": "0.6.0",
4
+ "type": "module",
5
+ "description": "Type-safe contracts for Quality Plugin. Types, schemas, and constants for monorepo analysis and quality checks.",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./contract": {
14
+ "import": "./dist/contract.js",
15
+ "types": "./dist/contract.d.ts"
16
+ },
17
+ "./schema": {
18
+ "import": "./dist/schema.js",
19
+ "types": "./dist/schema.d.ts"
20
+ },
21
+ "./dist/*": "./dist/*"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "sideEffects": false,
29
+ "scripts": {
30
+ "pretype-check": "pnpm --filter @kb-labs/quality-contracts build",
31
+ "clean": "rimraf dist",
32
+ "build": "tsup --config tsup.config.ts",
33
+ "dev": "tsup --config tsup.config.ts --watch",
34
+ "lint": "eslint src --ext .ts",
35
+ "lint:fix": "eslint . --fix",
36
+ "type-check": "tsc --noEmit",
37
+ "test": "vitest run --passWithNoTests",
38
+ "test:watch": "vitest"
39
+ },
40
+ "dependencies": {
41
+ "zod": "^3.23.8"
42
+ },
43
+ "devDependencies": {
44
+ "@kb-labs/devkit": "link:../../../../infra/kb-labs-devkit",
45
+ "@types/node": "^24.3.3",
46
+ "eslint": "^9",
47
+ "rimraf": "^6.0.1",
48
+ "tsup": "^8.5.0",
49
+ "typescript": "^5.6.3",
50
+ "vitest": "^3.2.4"
51
+ },
52
+ "engines": {
53
+ "node": ">=20.0.0",
54
+ "pnpm": ">=9.0.0"
55
+ }
56
+ }