@kb-labs/quality-entry 2.89.0 → 2.94.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.
@@ -28,7 +28,13 @@ declare const statsFlags: {
28
28
  readonly default: false;
29
29
  };
30
30
  };
31
- type StatsFlags = typeof statsFlags;
31
+ /** Parsed value type for StatsFlags */
32
+ type StatsFlags = {
33
+ json?: boolean;
34
+ md?: boolean;
35
+ health?: boolean;
36
+ refresh?: boolean;
37
+ };
32
38
  /**
33
39
  * Flags for quality:health command
34
40
  */
@@ -50,7 +56,12 @@ declare const healthFlags: {
50
56
  readonly alias: "d";
51
57
  };
52
58
  };
53
- type HealthFlags = typeof healthFlags;
59
+ /** Parsed value type for HealthFlags */
60
+ type HealthFlags = {
61
+ json?: boolean;
62
+ package?: string;
63
+ detailed?: boolean;
64
+ };
54
65
  /**
55
66
  * Flags for quality:fix-deps command
56
67
  */
@@ -91,7 +102,16 @@ declare const fixDepsFlags: {
91
102
  readonly default: false;
92
103
  };
93
104
  };
94
- type FixDepsFlags = typeof fixDepsFlags;
105
+ /** Parsed value type for FixDepsFlags */
106
+ type FixDepsFlags = {
107
+ 'dry-run'?: boolean;
108
+ 'remove-unused'?: boolean;
109
+ 'add-missing'?: boolean;
110
+ 'align-versions'?: boolean;
111
+ all?: boolean;
112
+ stats?: boolean;
113
+ json?: boolean;
114
+ };
95
115
  /**
96
116
  * Flags for quality:run command
97
117
  */
@@ -127,7 +147,15 @@ declare const runFlags: {
127
147
  readonly alias: "v";
128
148
  };
129
149
  };
130
- type RunFlags = typeof runFlags;
150
+ /** Parsed value type for RunFlags */
151
+ type RunFlags = {
152
+ script?: string;
153
+ 'continue-on-error'?: boolean;
154
+ parallel?: boolean;
155
+ filter?: string;
156
+ json?: boolean;
157
+ verbose?: boolean;
158
+ };
131
159
  /**
132
160
  * Flags for quality:build-order command
133
161
  */
@@ -153,7 +181,13 @@ declare const buildOrderFlags: {
153
181
  readonly default: false;
154
182
  };
155
183
  };
156
- type BuildOrderFlags = typeof buildOrderFlags;
184
+ /** Parsed value type for BuildOrderFlags */
185
+ type BuildOrderFlags = {
186
+ package?: string;
187
+ layers?: boolean;
188
+ script?: boolean;
189
+ json?: boolean;
190
+ };
157
191
  /**
158
192
  * Flags for quality:cycles command
159
193
  */
@@ -164,7 +198,10 @@ declare const cyclesFlags: {
164
198
  readonly default: false;
165
199
  };
166
200
  };
167
- type CyclesFlags = typeof cyclesFlags;
201
+ /** Parsed value type for CyclesFlags */
202
+ type CyclesFlags = {
203
+ json?: boolean;
204
+ };
168
205
  /**
169
206
  * Flags for quality:visualize command
170
207
  */
@@ -205,7 +242,16 @@ declare const visualizeFlags: {
205
242
  readonly default: false;
206
243
  };
207
244
  };
208
- type VisualizeFlags = typeof visualizeFlags;
245
+ /** Parsed value type for VisualizeFlags */
246
+ type VisualizeFlags = {
247
+ package?: string;
248
+ tree?: boolean;
249
+ dot?: boolean;
250
+ stats?: boolean;
251
+ reverse?: boolean;
252
+ impact?: boolean;
253
+ json?: boolean;
254
+ };
209
255
  /**
210
256
  * Flags for quality:check-builds command
211
257
  */
@@ -231,7 +277,13 @@ declare const checkBuildsFlags: {
231
277
  readonly default: false;
232
278
  };
233
279
  };
234
- type CheckBuildsFlags = typeof checkBuildsFlags;
280
+ /** Parsed value type for CheckBuildsFlags */
281
+ type CheckBuildsFlags = {
282
+ package?: string;
283
+ timeout?: number;
284
+ json?: boolean;
285
+ refresh?: boolean;
286
+ };
235
287
  /**
236
288
  * Flags for quality:check-types command
237
289
  */
@@ -257,7 +309,13 @@ declare const checkTypesFlags: {
257
309
  readonly default: false;
258
310
  };
259
311
  };
260
- type CheckTypesFlags = typeof checkTypesFlags;
312
+ /** Parsed value type for CheckTypesFlags */
313
+ type CheckTypesFlags = {
314
+ package?: string;
315
+ 'errors-only'?: boolean;
316
+ json?: boolean;
317
+ refresh?: boolean;
318
+ };
261
319
  /**
262
320
  * Flags for quality:check-tests command
263
321
  */
@@ -293,7 +351,15 @@ declare const checkTestsFlags: {
293
351
  readonly default: false;
294
352
  };
295
353
  };
296
- type CheckTestsFlags = typeof checkTestsFlags;
354
+ /** Parsed value type for CheckTestsFlags */
355
+ type CheckTestsFlags = {
356
+ package?: string;
357
+ timeout?: number;
358
+ 'with-coverage'?: boolean;
359
+ 'coverage-only'?: boolean;
360
+ json?: boolean;
361
+ refresh?: boolean;
362
+ };
297
363
  /**
298
364
  * Flags for quality:dead-code command
299
365
  */
@@ -339,6 +405,16 @@ declare const deadCodeFlags: {
339
405
  readonly default: false;
340
406
  };
341
407
  };
342
- type DeadCodeFlags = typeof deadCodeFlags;
408
+ /** Parsed value type for DeadCodeFlags */
409
+ type DeadCodeFlags = {
410
+ package?: string;
411
+ json?: boolean;
412
+ verbose?: boolean;
413
+ 'auto-remove'?: boolean;
414
+ 'dry-run'?: boolean;
415
+ restore?: string;
416
+ 'list-backups'?: boolean;
417
+ refresh?: boolean;
418
+ };
343
419
 
344
420
  export { type BuildOrderFlags, type CheckBuildsFlags, type CheckTestsFlags, type CheckTypesFlags, type CyclesFlags, type DeadCodeFlags, type FixDepsFlags, type HealthFlags, type RunFlags, type StatsFlags, type VisualizeFlags, buildOrderFlags, checkBuildsFlags, checkTestsFlags, checkTypesFlags, cyclesFlags, deadCodeFlags, fixDepsFlags, healthFlags, runFlags, statsFlags, visualizeFlags };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/flags.ts"],"names":[],"mappings":"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","file":"flags.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for quality:stats command\n */\nexport const statsFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n md: {\n type: 'boolean',\n description: 'Output Markdown table',\n default: false,\n },\n health: {\n type: 'boolean',\n description: 'Show health score',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and recalculate',\n default: false,\n },\n} as const;\n\nexport type StatsFlags = typeof statsFlags;\n\n/**\n * Flags for quality:health command\n */\nexport const healthFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n package: {\n type: 'string',\n description: 'Check health for specific package',\n alias: 'p',\n },\n detailed: {\n type: 'boolean',\n description: 'Show detailed breakdown',\n default: false,\n alias: 'd',\n },\n} as const;\n\nexport type HealthFlags = typeof healthFlags;\n\n/**\n * Flags for quality:fix-deps command\n */\nexport const fixDepsFlags = {\n 'dry-run': {\n type: 'boolean',\n description: 'Preview changes without applying them',\n default: false,\n },\n 'remove-unused': {\n type: 'boolean',\n description: 'Remove unused dependencies',\n default: false,\n },\n 'add-missing': {\n type: 'boolean',\n description: 'Add missing workspace dependencies',\n default: false,\n },\n 'align-versions': {\n type: 'boolean',\n description: 'Align duplicate dependency versions',\n default: false,\n },\n all: {\n type: 'boolean',\n description: 'Apply all fixes (remove-unused + add-missing + align-versions)',\n default: false,\n },\n stats: {\n type: 'boolean',\n description: 'Show dependency statistics',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\nexport type FixDepsFlags = typeof fixDepsFlags;\n\n/**\n * Flags for quality:run command\n */\nexport const runFlags = {\n script: {\n type: 'string',\n description: 'Script to run (build, test, type-check, lint)',\n required: true,\n },\n 'continue-on-error': {\n type: 'boolean',\n description: 'Continue even if packages fail',\n default: true,\n },\n parallel: {\n type: 'boolean',\n description: 'Run in parallel (respects dependencies)',\n default: false,\n },\n filter: {\n type: 'string',\n description: 'Filter packages by pattern (@kb-labs/*)',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Show full output for each package',\n default: false,\n alias: 'v',\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Flags for quality:build-order command\n */\nexport const buildOrderFlags = {\n package: {\n type: 'string',\n description: 'Calculate build order for specific package',\n alias: 'p',\n },\n layers: {\n type: 'boolean',\n description: 'Show build layers (parallel groups)',\n default: false,\n },\n script: {\n type: 'boolean',\n description: 'Output as shell script',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\nexport type BuildOrderFlags = typeof buildOrderFlags;\n\n/**\n * Flags for quality:cycles command\n */\nexport const cyclesFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\nexport type CyclesFlags = typeof cyclesFlags;\n\n/**\n * Flags for quality:visualize command\n */\nexport const visualizeFlags = {\n package: {\n type: 'string',\n description: 'Focus on specific package',\n alias: 'p',\n },\n tree: {\n type: 'boolean',\n description: 'Show dependency tree',\n default: false,\n },\n dot: {\n type: 'boolean',\n description: 'Output DOT format for graphviz',\n default: false,\n },\n stats: {\n type: 'boolean',\n description: 'Show graph statistics',\n default: false,\n },\n reverse: {\n type: 'boolean',\n description: 'Show reverse dependencies (who depends on this)',\n default: false,\n },\n impact: {\n type: 'boolean',\n description: 'Show impact analysis (what will be affected)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\nexport type VisualizeFlags = typeof visualizeFlags;\n\n/**\n * Flags for quality:check-builds command\n */\nexport const checkBuildsFlags = {\n package: {\n type: 'string',\n description: 'Check builds for specific package',\n alias: 'p',\n },\n timeout: {\n type: 'number',\n description: 'Timeout per package in milliseconds',\n default: 30000,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and check fresh',\n default: false,\n },\n} as const;\n\nexport type CheckBuildsFlags = typeof checkBuildsFlags;\n\n/**\n * Flags for quality:check-types command\n */\nexport const checkTypesFlags = {\n package: {\n type: 'string',\n description: 'Analyze types for specific package',\n alias: 'p',\n },\n 'errors-only': {\n type: 'boolean',\n description: 'Show only packages with errors',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and analyze fresh',\n default: false,\n },\n} as const;\n\nexport type CheckTypesFlags = typeof checkTypesFlags;\n\n/**\n * Flags for quality:check-tests command\n */\nexport const checkTestsFlags = {\n package: {\n type: 'string',\n description: 'Run tests for specific package',\n alias: 'p',\n },\n timeout: {\n type: 'number',\n description: 'Timeout per package in milliseconds',\n default: 60000,\n },\n 'with-coverage': {\n type: 'boolean',\n description: 'Collect coverage statistics',\n default: false,\n },\n 'coverage-only': {\n type: 'boolean',\n description: 'Only show existing coverage (skip test execution)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and run fresh',\n default: false,\n },\n} as const;\n\nexport type CheckTestsFlags = typeof checkTestsFlags;\n\n/**\n * Flags for quality:dead-code command\n */\nexport const deadCodeFlags = {\n package: {\n type: 'string',\n description: 'Scan specific package only',\n alias: 'p',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Show entry points and alive reasons',\n default: false,\n alias: 'v',\n },\n 'auto-remove': {\n type: 'boolean',\n description: 'Remove dead files (creates backup first)',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be removed without actually deleting',\n default: false,\n },\n restore: {\n type: 'string',\n description: 'Restore files from backup ID',\n },\n 'list-backups': {\n type: 'boolean',\n description: 'List available backups',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and rescan',\n default: false,\n },\n} as const;\n\nexport type DeadCodeFlags = typeof deadCodeFlags;\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/flags.ts"],"names":[],"mappings":"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","file":"flags.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\n/**\n * Flags for quality:stats command\n */\nexport const statsFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n md: {\n type: 'boolean',\n description: 'Output Markdown table',\n default: false,\n },\n health: {\n type: 'boolean',\n description: 'Show health score',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and recalculate',\n default: false,\n },\n} as const;\n\n/** Parsed value type for StatsFlags */\nexport type StatsFlags = {\n json?: boolean;\n md?: boolean;\n health?: boolean;\n refresh?: boolean;\n};\n\n/**\n * Flags for quality:health command\n */\nexport const healthFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n package: {\n type: 'string',\n description: 'Check health for specific package',\n alias: 'p',\n },\n detailed: {\n type: 'boolean',\n description: 'Show detailed breakdown',\n default: false,\n alias: 'd',\n },\n} as const;\n\n/** Parsed value type for HealthFlags */\nexport type HealthFlags = {\n json?: boolean;\n package?: string;\n detailed?: boolean;\n};\n\n/**\n * Flags for quality:fix-deps command\n */\nexport const fixDepsFlags = {\n 'dry-run': {\n type: 'boolean',\n description: 'Preview changes without applying them',\n default: false,\n },\n 'remove-unused': {\n type: 'boolean',\n description: 'Remove unused dependencies',\n default: false,\n },\n 'add-missing': {\n type: 'boolean',\n description: 'Add missing workspace dependencies',\n default: false,\n },\n 'align-versions': {\n type: 'boolean',\n description: 'Align duplicate dependency versions',\n default: false,\n },\n all: {\n type: 'boolean',\n description: 'Apply all fixes (remove-unused + add-missing + align-versions)',\n default: false,\n },\n stats: {\n type: 'boolean',\n description: 'Show dependency statistics',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\n/** Parsed value type for FixDepsFlags */\nexport type FixDepsFlags = {\n 'dry-run'?: boolean;\n 'remove-unused'?: boolean;\n 'add-missing'?: boolean;\n 'align-versions'?: boolean;\n all?: boolean;\n stats?: boolean;\n json?: boolean;\n};\n\n/**\n * Flags for quality:run command\n */\nexport const runFlags = {\n script: {\n type: 'string',\n description: 'Script to run (build, test, type-check, lint)',\n required: true,\n },\n 'continue-on-error': {\n type: 'boolean',\n description: 'Continue even if packages fail',\n default: true,\n },\n parallel: {\n type: 'boolean',\n description: 'Run in parallel (respects dependencies)',\n default: false,\n },\n filter: {\n type: 'string',\n description: 'Filter packages by pattern (@kb-labs/*)',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Show full output for each package',\n default: false,\n alias: 'v',\n },\n} as const;\n\n/** Parsed value type for RunFlags */\nexport type RunFlags = {\n script?: string;\n 'continue-on-error'?: boolean;\n parallel?: boolean;\n filter?: string;\n json?: boolean;\n verbose?: boolean;\n};\n\n/**\n * Flags for quality:build-order command\n */\nexport const buildOrderFlags = {\n package: {\n type: 'string',\n description: 'Calculate build order for specific package',\n alias: 'p',\n },\n layers: {\n type: 'boolean',\n description: 'Show build layers (parallel groups)',\n default: false,\n },\n script: {\n type: 'boolean',\n description: 'Output as shell script',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\n/** Parsed value type for BuildOrderFlags */\nexport type BuildOrderFlags = {\n package?: string;\n layers?: boolean;\n script?: boolean;\n json?: boolean;\n};\n\n/**\n * Flags for quality:cycles command\n */\nexport const cyclesFlags = {\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\n/** Parsed value type for CyclesFlags */\nexport type CyclesFlags = {\n json?: boolean;\n};\n\n/**\n * Flags for quality:visualize command\n */\nexport const visualizeFlags = {\n package: {\n type: 'string',\n description: 'Focus on specific package',\n alias: 'p',\n },\n tree: {\n type: 'boolean',\n description: 'Show dependency tree',\n default: false,\n },\n dot: {\n type: 'boolean',\n description: 'Output DOT format for graphviz',\n default: false,\n },\n stats: {\n type: 'boolean',\n description: 'Show graph statistics',\n default: false,\n },\n reverse: {\n type: 'boolean',\n description: 'Show reverse dependencies (who depends on this)',\n default: false,\n },\n impact: {\n type: 'boolean',\n description: 'Show impact analysis (what will be affected)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n} as const;\n\n/** Parsed value type for VisualizeFlags */\nexport type VisualizeFlags = {\n package?: string;\n tree?: boolean;\n dot?: boolean;\n stats?: boolean;\n reverse?: boolean;\n impact?: boolean;\n json?: boolean;\n};\n\n/**\n * Flags for quality:check-builds command\n */\nexport const checkBuildsFlags = {\n package: {\n type: 'string',\n description: 'Check builds for specific package',\n alias: 'p',\n },\n timeout: {\n type: 'number',\n description: 'Timeout per package in milliseconds',\n default: 30000,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and check fresh',\n default: false,\n },\n} as const;\n\n/** Parsed value type for CheckBuildsFlags */\nexport type CheckBuildsFlags = {\n package?: string;\n timeout?: number;\n json?: boolean;\n refresh?: boolean;\n};\n\n/**\n * Flags for quality:check-types command\n */\nexport const checkTypesFlags = {\n package: {\n type: 'string',\n description: 'Analyze types for specific package',\n alias: 'p',\n },\n 'errors-only': {\n type: 'boolean',\n description: 'Show only packages with errors',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and analyze fresh',\n default: false,\n },\n} as const;\n\n/** Parsed value type for CheckTypesFlags */\nexport type CheckTypesFlags = {\n package?: string;\n 'errors-only'?: boolean;\n json?: boolean;\n refresh?: boolean;\n};\n\n/**\n * Flags for quality:check-tests command\n */\nexport const checkTestsFlags = {\n package: {\n type: 'string',\n description: 'Run tests for specific package',\n alias: 'p',\n },\n timeout: {\n type: 'number',\n description: 'Timeout per package in milliseconds',\n default: 60000,\n },\n 'with-coverage': {\n type: 'boolean',\n description: 'Collect coverage statistics',\n default: false,\n },\n 'coverage-only': {\n type: 'boolean',\n description: 'Only show existing coverage (skip test execution)',\n default: false,\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and run fresh',\n default: false,\n },\n} as const;\n\n/** Parsed value type for CheckTestsFlags */\nexport type CheckTestsFlags = {\n package?: string;\n timeout?: number;\n 'with-coverage'?: boolean;\n 'coverage-only'?: boolean;\n json?: boolean;\n refresh?: boolean;\n};\n\n/**\n * Flags for quality:dead-code command\n */\nexport const deadCodeFlags = {\n package: {\n type: 'string',\n description: 'Scan specific package only',\n alias: 'p',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON format',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Show entry points and alive reasons',\n default: false,\n alias: 'v',\n },\n 'auto-remove': {\n type: 'boolean',\n description: 'Remove dead files (creates backup first)',\n default: false,\n },\n 'dry-run': {\n type: 'boolean',\n description: 'Show what would be removed without actually deleting',\n default: false,\n },\n restore: {\n type: 'string',\n description: 'Restore files from backup ID',\n },\n 'list-backups': {\n type: 'boolean',\n description: 'List available backups',\n default: false,\n },\n refresh: {\n type: 'boolean',\n description: 'Bypass cache and rescan',\n default: false,\n },\n} as const;\n\n/** Parsed value type for DeadCodeFlags */\nexport type DeadCodeFlags = {\n package?: string;\n json?: boolean;\n verbose?: boolean;\n 'auto-remove'?: boolean;\n 'dry-run'?: boolean;\n restore?: string;\n 'list-backups'?: boolean;\n refresh?: boolean;\n};\n"]}
@@ -10,7 +10,7 @@ var health_default = defineCommand({
10
10
  handler: {
11
11
  async execute(ctx, input) {
12
12
  const { ui, platform } = ctx;
13
- const flags = input.flags ?? input;
13
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
14
14
  const health = await calculateHealth(ctx.cwd, flags.package);
15
15
  await platform.cache.set(CACHE_KEYS.HEALTH, health, 5 * 60 * 1e3);
16
16
  await platform.analytics.track("quality:health", {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":"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","file":"health.js","sourcesContent":["/**\n * quality:health - Monorepo health check\n *\n * Analyzes monorepo health including:\n * - Dependency issues (duplicates, unused, missing)\n * - Structure problems (missing READMEs, inconsistent naming)\n * - Build health (TypeScript errors, missing types)\n * - Overall health score with grade (A-F)\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { HealthScore, Issue } from '@kb-labs/quality-contracts';\nimport { CACHE_KEYS } from '@kb-labs/quality-contracts';\nimport type { HealthFlags } from './flags.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// Input type with backward compatibility\ntype HealthInput = HealthFlags & { argv?: string[] };\n\ntype HealthCommandResult = {\n exitCode: number;\n result?: HealthScore;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'quality:health',\n description: 'Check monorepo health score',\n\n handler: {\n async execute(ctx: PluginContextV3, input: HealthInput): Promise<HealthCommandResult> {\n const { ui, platform } = ctx;\n\n // V3: Flags come in input.flags object (not auto-merged)\n const flags = (input as any).flags ?? input;\n\n // Calculate health score\n const health = await calculateHealth(ctx.cwd, flags.package);\n\n // Cache results for 5 minutes\n await platform.cache.set(CACHE_KEYS.HEALTH, health, 5 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:health', {\n score: health.score,\n grade: health.grade,\n issueCount: health.issues.length,\n packageSpecific: !!flags.package,\n });\n\n // Output results\n outputHealth(health, flags, ui);\n\n return {\n exitCode: health.score < 60 ? 1 : 0,\n result: health,\n };\n },\n },\n});\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: string, specificPackage?: string): string[] {\n const packages: string[] = [];\n\n if (!fs.existsSync(rootDir)) {\n return packages;\n }\n\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('kb-labs-')) {continue;}\n\n const repoPath = path.join(rootDir, entry.name);\n const packagesDir = path.join(repoPath, 'packages');\n\n if (!fs.existsSync(packagesDir)) {continue;}\n\n const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });\n\n for (const pkgDir of packageDirs) {\n if (!pkgDir.isDirectory()) {continue;}\n\n const packageJsonPath = path.join(packagesDir, pkgDir.name, 'package.json');\n\n if (fs.existsSync(packageJsonPath)) {\n // If specific package requested, filter\n if (specificPackage) {\n const pkgJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkgJson.name === specificPackage || pkgDir.name === specificPackage) {\n packages.push(packageJsonPath);\n }\n } else {\n packages.push(packageJsonPath);\n }\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Calculate comprehensive health score\n */\nasync function calculateHealth(rootDir: string, specificPackage?: string): Promise<HealthScore> {\n const packages = findPackages(rootDir, specificPackage);\n let score = 100;\n const issues: Issue[] = [];\n\n // 1. Check for duplicate dependencies\n const allDeps = new Map<string, Set<string>>();\n\n for (const packagePath of packages) {\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (!allDeps.has(dep)) {\n allDeps.set(dep, new Set());\n }\n allDeps.get(dep)!.add(version as string);\n }\n }\n\n const duplicates = Array.from(allDeps.entries())\n .filter(([_, versions]) => versions.size > 1)\n .filter(([dep]) => !dep.startsWith('@kb-labs/')); // Ignore workspace deps\n\n if (duplicates.length > 0) {\n const penalty = Math.min(20, duplicates.length * 2);\n score -= penalty;\n issues.push({\n type: 'duplicates',\n severity: 'warning',\n message: `${duplicates.length} duplicate dependencies (-${penalty})`,\n });\n }\n\n // 2. Check for missing READMEs\n let missingReadmes = 0;\n for (const packagePath of packages) {\n const packageDir = path.dirname(packagePath);\n const readmePath = path.join(packageDir, 'README.md');\n if (!fs.existsSync(readmePath)) {\n missingReadmes++;\n }\n }\n\n if (missingReadmes > 0) {\n const penalty = Math.min(15, missingReadmes);\n score -= penalty;\n issues.push({\n type: 'missing-docs',\n severity: 'warning',\n message: `${missingReadmes} packages missing README (-${penalty})`,\n });\n }\n\n // 3. Check for inconsistent naming\n let namingIssues = 0;\n for (const packagePath of packages) {\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const packageName = packageJson.name;\n\n if (!packageName || !packageName.startsWith('@kb-labs/')) {\n namingIssues++;\n }\n }\n\n if (namingIssues > 0) {\n const penalty = Math.min(10, namingIssues * 2);\n score -= penalty;\n issues.push({\n type: 'naming',\n severity: 'critical',\n message: `${namingIssues} packages with naming issues (-${penalty})`,\n });\n }\n\n // 4. Check for missing type definitions\n let missingTypes = 0;\n for (const packagePath of packages) {\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n\n if (!packageJson.types && !packageJson.typings) {\n missingTypes++;\n }\n }\n\n if (missingTypes > 0) {\n const penalty = Math.min(15, missingTypes);\n score -= penalty;\n issues.push({\n type: 'missing-types',\n severity: 'warning',\n message: `${missingTypes} packages missing types field (-${penalty})`,\n });\n }\n\n // Determine grade\n let grade: 'A' | 'B' | 'C' | 'D' | 'F';\n if (score >= 90) {grade = 'A';}\n else if (score >= 80) {grade = 'B';}\n else if (score >= 70) {grade = 'C';}\n else if (score >= 60) {grade = 'D';}\n else {grade = 'F';}\n\n return {\n score: Math.max(0, score),\n grade,\n issues,\n };\n}\n\n/**\n * Output health check results\n */\nfunction outputHealth(health: HealthScore, flags: any, ui: any) {\n if (flags.json) {\n ui?.json?.(health);\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Score section\n const scoreItems = [\n `Score: ${health.score}/100`,\n `Grade: ${health.grade}`,\n `Status: ${health.score >= 80 ? '✅ Healthy' : health.score >= 60 ? '⚠️ Needs Attention' : '❌ Critical'}`,\n ];\n sections.push({ header: 'Health Score', items: scoreItems });\n\n // Issues section\n if (health.issues.length > 0) {\n const issueItems = health.issues.map(issue => {\n const icon = issue.severity === 'critical' ? '❌' : issue.severity === 'warning' ? '⚠️' : 'ℹ️';\n return `${icon} ${issue.message}`;\n });\n\n if (flags.detailed) {\n sections.push({ header: 'Issues (Detailed)', items: issueItems });\n } else {\n sections.push({ header: 'Issues', items: issueItems });\n }\n } else {\n sections.push({ header: 'Issues', items: ['✅ No issues found!'] });\n }\n\n // Recommendations\n if (health.score < 90) {\n const recommendations: string[] = [];\n\n if (health.issues.some(i => i.type === 'duplicates')) {\n recommendations.push('Run `kb quality:fix-deps --align-versions` to fix duplicates');\n }\n if (health.issues.some(i => i.type === 'missing-docs')) {\n recommendations.push('Add README.md files to packages');\n }\n if (health.issues.some(i => i.type === 'missing-types')) {\n recommendations.push('Add \"types\" field to package.json or enable dts generation');\n }\n\n if (recommendations.length > 0) {\n sections.push({ header: 'Recommendations', items: recommendations });\n }\n }\n\n const title = health.score >= 80\n ? '💚 Monorepo Health Check - Healthy'\n : health.score >= 60\n ? '💛 Monorepo Health Check - Needs Attention'\n : '❤️ Monorepo Health Check - Critical';\n\n ui?.success?.('Health check completed', {\n title,\n sections,\n });\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/health.ts"],"names":[],"mappings":";;;;;;AA0BA,IAAO,iBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EAAa,6BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAkD;AACpF,MAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAS,GAAI,GAAA;AAGzB,MAAA,MAAM,KAAA,GAAS,OAAA,IAAW,KAAA,IAAS,OAAQ,KAAA,CAA8B,KAAA,KAAU,QAAA,IAAa,KAAA,CAA8B,KAAA,KAAU,IAAA,GACnI,KAAA,CAAiC,KAAA,GAClC,KAAA;AAGJ,MAAA,MAAM,SAAS,MAAM,eAAA,CAAgB,GAAA,CAAI,GAAA,EAAK,MAAM,OAAO,CAAA;AAG3D,MAAA,MAAM,QAAA,CAAS,MAAM,GAAA,CAAI,UAAA,CAAW,QAAQ,MAAA,EAAQ,CAAA,GAAI,KAAK,GAAI,CAAA;AAGjE,MAAA,MAAM,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,gBAAA,EAAkB;AAAA,QAC/C,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,UAAA,EAAY,OAAO,MAAA,CAAO,MAAA;AAAA,QAC1B,eAAA,EAAiB,CAAC,CAAC,KAAA,CAAM;AAAA,OAC1B,CAAA;AAGD,MAAA,YAAA,CAAa,MAAA,EAAQ,OAAO,EAAE,CAAA;AAE9B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,MAAA,CAAO,KAAA,GAAQ,EAAA,GAAK,CAAA,GAAI,CAAA;AAAA,QAClC,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA;AAEJ,CAAC;AAKD,SAAS,YAAA,CAAa,SAAiB,eAAA,EAAoC;AACzE,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,EAAA,CAAG,WAAA,CAAY,SAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAE/D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,MAAM,WAAA,EAAY,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAE1E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAElD,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAAC,MAAA;AAAA,IAAS;AAE3C,IAAA,MAAM,cAAc,EAAA,CAAG,WAAA,CAAY,aAAa,EAAE,aAAA,EAAe,MAAM,CAAA;AAEvE,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AAAC,QAAA;AAAA,MAAS;AAErC,MAAA,MAAM,kBAAkB,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,MAAM,cAAc,CAAA;AAE1E,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,eAAe,CAAA,EAAG;AAElC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,eAAA,EAAiB,OAAO,CAAC,CAAA;AACpE,UAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,eAAA,IAAmB,MAAA,CAAO,SAAS,eAAA,EAAiB;AACvE,YAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,UAC/B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,eAAe,eAAA,CAAgB,SAAiB,eAAA,EAAgD;AAC9F,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,EAAS,eAAe,CAAA;AACtD,EAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,EAAA,MAAM,SAAkB,EAAC;AAGzB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAE7C,EAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AACpE,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,WAAA,CAAY,YAAA;AAAA,MACf,GAAG,WAAA,CAAY;AAAA,KACjB;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,CAAG,GAAA,CAAI,OAAiB,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,CAC5C,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,QAAQ,CAAA,KAAM,SAAS,IAAA,GAAO,CAAC,CAAA,CAC3C,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,GAAA,CAAI,UAAA,CAAW,WAAW,CAAC,CAAA;AAEjD,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,UAAA,CAAW,SAAS,CAAC,CAAA;AAClD,IAAA,KAAA,IAAS,OAAA;AACT,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAA,EAAG,UAAA,CAAW,MAAM,6BAA6B,OAAO,CAAA,CAAA;AAAA,KAClE,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA;AACpD,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,cAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,cAAc,CAAA;AAC3C,IAAA,KAAA,IAAS,OAAA;AACT,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,cAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA;AAAA,KAChE,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AACpE,IAAA,MAAM,cAAc,WAAA,CAAY,IAAA;AAEhC,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,CAAY,UAAA,CAAW,WAAW,CAAA,EAAG;AACxD,MAAA,YAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,eAAe,CAAC,CAAA;AAC7C,IAAA,KAAA,IAAS,OAAA;AACT,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,CAAA,EAAG,YAAY,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAA;AAAA,KAClE,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AAEpE,IAAA,IAAI,CAAC,WAAA,CAAY,KAAA,IAAS,CAAC,YAAY,OAAA,EAAS;AAC9C,MAAA,YAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,YAAY,CAAA;AACzC,IAAA,KAAA,IAAS,OAAA;AACT,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,eAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,CAAA,EAAG,YAAY,CAAA,gCAAA,EAAmC,OAAO,CAAA,CAAA;AAAA,KACnE,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAS,EAAA,EAAI;AAAC,IAAA,KAAA,GAAQ,GAAA;AAAA,EAAI,CAAA,MAAA,IACrB,SAAS,EAAA,EAAI;AAAC,IAAA,KAAA,GAAQ,GAAA;AAAA,EAAI,CAAA,MAAA,IAC1B,SAAS,EAAA,EAAI;AAAC,IAAA,KAAA,GAAQ,GAAA;AAAA,EAAI,CAAA,MAAA,IAC1B,SAAS,EAAA,EAAI;AAAC,IAAA,KAAA,GAAQ,GAAA;AAAA,EAAI,CAAA,MAC9B;AAAC,IAAA,KAAA,GAAQ,GAAA;AAAA,EAAI;AAElB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA,IACxB,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,SAAS,YAAA,CAAa,MAAA,EAAqB,KAAA,EAAgC,EAAA,EAA2B;AACpG,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,EAAA,EAAI,OAAO,MAAM,CAAA;AACjB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,WAAuD,EAAC;AAG9D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA,IAAA,CAAA;AAAA,IACtB,CAAA,OAAA,EAAU,OAAO,KAAK,CAAA,CAAA;AAAA,IACtB,CAAA,QAAA,EAAW,OAAO,KAAA,IAAS,EAAA,GAAK,mBAAc,MAAA,CAAO,KAAA,IAAS,EAAA,GAAK,8BAAA,GAAuB,iBAAY,CAAA;AAAA,GACxG;AACA,EAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,YAAY,CAAA;AAG3D,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,KAAa,UAAA,GAAa,WAAM,KAAA,CAAM,QAAA,KAAa,YAAY,cAAA,GAAO,cAAA;AACzF,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,IACjC,CAAC,CAAA;AAED,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,mBAAA,EAAqB,KAAA,EAAO,YAAY,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA;AAAA,IACvD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,yBAAoB,GAAG,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,MAAA,CAAO,QAAQ,EAAA,EAAI;AACrB,IAAA,MAAM,kBAA4B,EAAC;AAEnC,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,EAAG;AACpD,MAAA,eAAA,CAAgB,KAAK,8DAA8D,CAAA;AAAA,IACrF;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,cAAc,CAAA,EAAG;AACtD,MAAA,eAAA,CAAgB,KAAK,iCAAiC,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,eAAe,CAAA,EAAG;AACvD,MAAA,eAAA,CAAgB,KAAK,4DAA4D,CAAA;AAAA,IACnF;AAEA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,iBAAA,EAAmB,KAAA,EAAO,iBAAiB,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,EAAA,GAC1B,8CACA,MAAA,CAAO,KAAA,IAAS,KAChB,mDAAA,GACA,+CAAA;AAEJ,EAAA,EAAA,EAAI,UAAU,wBAAA,EAA0B;AAAA,IACtC,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH","file":"health.js","sourcesContent":["/**\n * quality:health - Monorepo health check\n *\n * Analyzes monorepo health including:\n * - Dependency issues (duplicates, unused, missing)\n * - Structure problems (missing READMEs, inconsistent naming)\n * - Build health (TypeScript errors, missing types)\n * - Overall health score with grade (A-F)\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { HealthScore, Issue } from '@kb-labs/quality-contracts';\nimport { CACHE_KEYS } from '@kb-labs/quality-contracts';\nimport type { HealthFlags } from './flags.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// Input type with backward compatibility\ntype HealthInput = HealthFlags & { argv?: string[] };\n\ntype HealthCommandResult = {\n exitCode: number;\n result?: HealthScore;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'quality:health',\n description: 'Check monorepo health score',\n\n handler: {\n async execute(ctx: PluginContextV3, input: HealthInput): Promise<HealthCommandResult> {\n const { ui, platform } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: HealthInput }).flags\n : input;\n\n // Calculate health score\n const health = await calculateHealth(ctx.cwd, flags.package);\n\n // Cache results for 5 minutes\n await platform.cache.set(CACHE_KEYS.HEALTH, health, 5 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:health', {\n score: health.score,\n grade: health.grade,\n issueCount: health.issues.length,\n packageSpecific: !!flags.package,\n });\n\n // Output results\n outputHealth(health, flags, ui);\n\n return {\n exitCode: health.score < 60 ? 1 : 0,\n result: health,\n };\n },\n },\n});\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: string, specificPackage?: string): string[] {\n const packages: string[] = [];\n\n if (!fs.existsSync(rootDir)) {\n return packages;\n }\n\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory() || !entry.name.startsWith('kb-labs-')) {continue;}\n\n const repoPath = path.join(rootDir, entry.name);\n const packagesDir = path.join(repoPath, 'packages');\n\n if (!fs.existsSync(packagesDir)) {continue;}\n\n const packageDirs = fs.readdirSync(packagesDir, { withFileTypes: true });\n\n for (const pkgDir of packageDirs) {\n if (!pkgDir.isDirectory()) {continue;}\n\n const packageJsonPath = path.join(packagesDir, pkgDir.name, 'package.json');\n\n if (fs.existsSync(packageJsonPath)) {\n // If specific package requested, filter\n if (specificPackage) {\n const pkgJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));\n if (pkgJson.name === specificPackage || pkgDir.name === specificPackage) {\n packages.push(packageJsonPath);\n }\n } else {\n packages.push(packageJsonPath);\n }\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Calculate comprehensive health score\n */\nasync function calculateHealth(rootDir: string, specificPackage?: string): Promise<HealthScore> {\n const packages = findPackages(rootDir, specificPackage);\n let score = 100;\n const issues: Issue[] = [];\n\n // 1. Check for duplicate dependencies\n const allDeps = new Map<string, Set<string>>();\n\n for (const packagePath of packages) {\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const [dep, version] of Object.entries(deps)) {\n if (!allDeps.has(dep)) {\n allDeps.set(dep, new Set());\n }\n allDeps.get(dep)!.add(version as string);\n }\n }\n\n const duplicates = Array.from(allDeps.entries())\n .filter(([_, versions]) => versions.size > 1)\n .filter(([dep]) => !dep.startsWith('@kb-labs/')); // Ignore workspace deps\n\n if (duplicates.length > 0) {\n const penalty = Math.min(20, duplicates.length * 2);\n score -= penalty;\n issues.push({\n type: 'duplicates',\n severity: 'warning',\n message: `${duplicates.length} duplicate dependencies (-${penalty})`,\n });\n }\n\n // 2. Check for missing READMEs\n let missingReadmes = 0;\n for (const packagePath of packages) {\n const packageDir = path.dirname(packagePath);\n const readmePath = path.join(packageDir, 'README.md');\n if (!fs.existsSync(readmePath)) {\n missingReadmes++;\n }\n }\n\n if (missingReadmes > 0) {\n const penalty = Math.min(15, missingReadmes);\n score -= penalty;\n issues.push({\n type: 'missing-docs',\n severity: 'warning',\n message: `${missingReadmes} packages missing README (-${penalty})`,\n });\n }\n\n // 3. Check for inconsistent naming\n let namingIssues = 0;\n for (const packagePath of packages) {\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const packageName = packageJson.name;\n\n if (!packageName || !packageName.startsWith('@kb-labs/')) {\n namingIssues++;\n }\n }\n\n if (namingIssues > 0) {\n const penalty = Math.min(10, namingIssues * 2);\n score -= penalty;\n issues.push({\n type: 'naming',\n severity: 'critical',\n message: `${namingIssues} packages with naming issues (-${penalty})`,\n });\n }\n\n // 4. Check for missing type definitions\n let missingTypes = 0;\n for (const packagePath of packages) {\n const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n\n if (!packageJson.types && !packageJson.typings) {\n missingTypes++;\n }\n }\n\n if (missingTypes > 0) {\n const penalty = Math.min(15, missingTypes);\n score -= penalty;\n issues.push({\n type: 'missing-types',\n severity: 'warning',\n message: `${missingTypes} packages missing types field (-${penalty})`,\n });\n }\n\n // Determine grade\n let grade: 'A' | 'B' | 'C' | 'D' | 'F';\n if (score >= 90) {grade = 'A';}\n else if (score >= 80) {grade = 'B';}\n else if (score >= 70) {grade = 'C';}\n else if (score >= 60) {grade = 'D';}\n else {grade = 'F';}\n\n return {\n score: Math.max(0, score),\n grade,\n issues,\n };\n}\n\n/**\n * Output health check results\n */\nfunction outputHealth(health: HealthScore, flags: Record<string, unknown>, ui: PluginContextV3['ui']) {\n if (flags.json) {\n ui?.json?.(health);\n return;\n }\n\n // Build sections\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Score section\n const scoreItems = [\n `Score: ${health.score}/100`,\n `Grade: ${health.grade}`,\n `Status: ${health.score >= 80 ? '✅ Healthy' : health.score >= 60 ? '⚠️ Needs Attention' : '❌ Critical'}`,\n ];\n sections.push({ header: 'Health Score', items: scoreItems });\n\n // Issues section\n if (health.issues.length > 0) {\n const issueItems = health.issues.map(issue => {\n const icon = issue.severity === 'critical' ? '❌' : issue.severity === 'warning' ? '⚠️' : 'ℹ️';\n return `${icon} ${issue.message}`;\n });\n\n if (flags.detailed) {\n sections.push({ header: 'Issues (Detailed)', items: issueItems });\n } else {\n sections.push({ header: 'Issues', items: issueItems });\n }\n } else {\n sections.push({ header: 'Issues', items: ['✅ No issues found!'] });\n }\n\n // Recommendations\n if (health.score < 90) {\n const recommendations: string[] = [];\n\n if (health.issues.some(i => i.type === 'duplicates')) {\n recommendations.push('Run `kb quality:fix-deps --align-versions` to fix duplicates');\n }\n if (health.issues.some(i => i.type === 'missing-docs')) {\n recommendations.push('Add README.md files to packages');\n }\n if (health.issues.some(i => i.type === 'missing-types')) {\n recommendations.push('Add \"types\" field to package.json or enable dts generation');\n }\n\n if (recommendations.length > 0) {\n sections.push({ header: 'Recommendations', items: recommendations });\n }\n }\n\n const title = health.score >= 80\n ? '💚 Monorepo Health Check - Healthy'\n : health.score >= 60\n ? '💛 Monorepo Health Check - Needs Attention'\n : '❤️ Monorepo Health Check - Critical';\n\n ui?.success?.('Health check completed', {\n title,\n sections,\n });\n}\n"]}
@@ -15,7 +15,7 @@ var build_order_default = defineCommand({
15
15
  handler: {
16
16
  async execute(ctx, input) {
17
17
  const { ui } = ctx;
18
- const flags = input.flags ?? input;
18
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
19
19
  const graph = buildDependencyGraph(ctx.cwd);
20
20
  let result;
21
21
  if (flags.package) {
@@ -120,7 +120,7 @@ var check_builds_default = defineCommand({
120
120
  handler: {
121
121
  async execute(ctx, input) {
122
122
  const { ui, platform } = ctx;
123
- const flags = input.flags ?? input;
123
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
124
124
  const cacheKey = `${CACHE_KEYS.BUILDS}:${flags.package || "all"}`;
125
125
  if (!flags.refresh) {
126
126
  const cached = await platform.cache.get(cacheKey);
@@ -204,7 +204,7 @@ var check_tests_default = defineCommand({
204
204
  handler: {
205
205
  async execute(ctx, input) {
206
206
  const { ui, platform } = ctx;
207
- const flags = input.flags ?? input;
207
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
208
208
  const cacheKey = `${CACHE_KEYS.TESTS}:${flags.package || "all"}`;
209
209
  if (!flags.refresh) {
210
210
  const cached = await platform.cache.get(cacheKey);
@@ -309,7 +309,7 @@ var check_types_default = defineCommand({
309
309
  handler: {
310
310
  async execute(ctx, input) {
311
311
  const { ui, platform } = ctx;
312
- const flags = input.flags ?? input;
312
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
313
313
  const cacheKey = `${CACHE_KEYS.TYPE_ANALYSIS}:${flags.package || "all"}`;
314
314
  if (!flags.refresh) {
315
315
  const cached = await platform.cache.get(cacheKey);
@@ -408,7 +408,7 @@ var cycles_default = defineCommand({
408
408
  handler: {
409
409
  async execute(ctx, input) {
410
410
  const { ui } = ctx;
411
- const flags = input.flags ?? input;
411
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
412
412
  const graph = buildDependencyGraph(ctx.cwd);
413
413
  const cycles = findCircularDependencies(graph);
414
414
  outputCycles(cycles, flags, ui);
@@ -485,7 +485,7 @@ var dead_code_default = defineCommand({
485
485
  handler: {
486
486
  async execute(ctx, input) {
487
487
  const { ui, platform } = ctx;
488
- const flags = input.flags ?? input;
488
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
489
489
  if (flags["list-backups"]) {
490
490
  const backups = listBackups(ctx.cwd);
491
491
  if (flags.json) {
@@ -509,9 +509,9 @@ var dead_code_default = defineCommand({
509
509
  return { exitCode: 0 };
510
510
  } catch (err) {
511
511
  if (flags.json) {
512
- ui?.json?.({ error: err.message });
512
+ ui?.json?.({ error: err instanceof Error ? err.message : String(err) });
513
513
  } else {
514
- ui?.error?.(err.message);
514
+ ui?.error?.(err instanceof Error ? err.message : String(err));
515
515
  }
516
516
  return { exitCode: 1 };
517
517
  }
@@ -693,7 +693,7 @@ var fix_deps_default = defineCommand({
693
693
  handler: {
694
694
  async execute(ctx, input) {
695
695
  const { ui, platform } = ctx;
696
- const flags = input.flags ?? input;
696
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
697
697
  const dryRun = flags["dry-run"] ?? false;
698
698
  const removeUnused = flags["remove-unused"] || flags.all;
699
699
  const addMissing = flags["add-missing"] || flags.all;
@@ -1073,7 +1073,7 @@ var health_default = defineCommand({
1073
1073
  handler: {
1074
1074
  async execute(ctx, input) {
1075
1075
  const { ui, platform } = ctx;
1076
- const flags = input.flags ?? input;
1076
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
1077
1077
  const health = await calculateHealth(ctx.cwd, flags.package);
1078
1078
  await platform.cache.set(CACHE_KEYS.HEALTH, health, 5 * 60 * 1e3);
1079
1079
  await platform.analytics.track("quality:health", {
@@ -1273,7 +1273,7 @@ var stats_default = defineCommand({
1273
1273
  handler: {
1274
1274
  async execute(ctx, input) {
1275
1275
  const { ui, platform } = ctx;
1276
- const flags = input.flags ?? input;
1276
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
1277
1277
  if (!flags.refresh) {
1278
1278
  const cached = await platform.cache.get(CACHE_KEYS.STATS);
1279
1279
  if (cached) {
@@ -1545,7 +1545,7 @@ var visualize_default = defineCommand({
1545
1545
  handler: {
1546
1546
  async execute(ctx, input) {
1547
1547
  const { ui } = ctx;
1548
- const flags = input.flags ?? input;
1548
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
1549
1549
  const graph = buildDependencyGraph(ctx.cwd);
1550
1550
  if (flags.dot) {
1551
1551
  outputDot(graph, flags, ui);
@@ -1568,7 +1568,7 @@ function outputTree(graph, packageName, flags, ui) {
1568
1568
  const { nodes } = graph;
1569
1569
  const node = nodes.get(packageName);
1570
1570
  if (!node) {
1571
- ui?.fatal?.(`Package not found: ${packageName}`);
1571
+ ui?.error?.(`Package not found: ${packageName}`);
1572
1572
  return;
1573
1573
  }
1574
1574
  const sections = [];