@kb-labs/quality-entry 2.89.0 → 2.93.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.
@@ -10,7 +10,7 @@ var stats_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
  if (!flags.refresh) {
15
15
  const cached = await platform.cache.get(CACHE_KEYS.STATS);
16
16
  if (cached) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":"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","file":"stats.js","sourcesContent":["/**\n * quality:stats - Monorepo statistics and health score\n *\n * Collects comprehensive statistics about the monorepo including:\n * - Package count by repository\n * - Total lines of code\n * - File counts\n * - Dependency statistics\n * - Health score (if --health flag provided)\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { StatsResult, Issue } from '@kb-labs/quality-contracts';\nimport { CACHE_KEYS } from '@kb-labs/quality-contracts';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { StatsFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype StatsInput = StatsFlags & { argv?: string[] };\n\ntype StatsCommandResult = {\n exitCode: number;\n result?: StatsResult;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'quality:stats',\n description: 'Show monorepo statistics and health score',\n\n handler: {\n async execute(ctx: PluginContextV3, input: StatsInput): Promise<StatsCommandResult> {\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 // Check cache unless refresh requested\n if (!flags.refresh) {\n const cached = await platform.cache.get<StatsResult>(CACHE_KEYS.STATS);\n if (cached) {\n outputStats(cached, flags, ui);\n return { exitCode: 0 };\n }\n }\n\n // Collect statistics\n const stats = await collectStats(ctx.cwd);\n\n // Calculate health score if requested\n if (flags.health) {\n stats.health = calculateHealthScore(stats);\n }\n\n // Cache results for 5 minutes\n await platform.cache.set(CACHE_KEYS.STATS, stats, 5 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:stats', {\n packages: stats.overview.totalPackages,\n repositories: stats.overview.totalRepositories,\n withHealth: flags.health ?? false,\n });\n\n // Output results\n outputStats(stats, flags, ui);\n\n return { exitCode: 0 };\n },\n },\n});\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: 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 packages.push(packageJsonPath);\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Calculate package size (files, lines, bytes)\n */\nfunction calculateSize(packageDir: string): { files: number; lines: number; bytes: number } {\n const srcDir = path.join(packageDir, 'src');\n if (!fs.existsSync(srcDir)) {\n return { files: 0, lines: 0, bytes: 0 };\n }\n\n let files = 0;\n let lines = 0;\n let bytes = 0;\n\n function walk(dir: string) {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n files++;\n const content = fs.readFileSync(fullPath, 'utf-8');\n lines += content.split('\\n').length;\n bytes += Buffer.byteLength(content, 'utf-8');\n }\n }\n }\n\n walk(srcDir);\n return { files, lines, bytes };\n}\n\n/**\n * Collect comprehensive statistics\n */\nasync function collectStats(rootDir: string): Promise<StatsResult> {\n const packages = findPackages(rootDir);\n\n const stats: StatsResult = {\n overview: {\n totalPackages: 0,\n totalRepositories: 0,\n totalFiles: 0,\n totalLines: 0,\n totalBytes: 0,\n },\n byRepository: {},\n dependencies: {\n total: 0,\n workspace: 0,\n external: 0,\n duplicates: 0,\n topUsed: [],\n },\n health: {\n score: 0,\n grade: 'F',\n issues: [],\n },\n largestPackages: [],\n };\n\n const repos = new Set<string>();\n const allDeps = new Map<string, number>();\n\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/')) {continue;}\n\n stats.overview.totalPackages++;\n\n const packageDir = path.dirname(packagePath);\n const repoName = path.basename(path.dirname(path.dirname(packageDir)));\n\n repos.add(repoName);\n\n const size = calculateSize(packageDir);\n stats.overview.totalFiles += size.files;\n stats.overview.totalLines += size.lines;\n stats.overview.totalBytes += size.bytes;\n\n // Track by repository\n if (!stats.byRepository[repoName]) {\n stats.byRepository[repoName] = {\n name: repoName,\n packages: 0,\n files: 0,\n lines: 0,\n bytes: 0,\n };\n }\n\n stats.byRepository[repoName].packages++;\n stats.byRepository[repoName].files += size.files;\n stats.byRepository[repoName].lines += size.lines;\n stats.byRepository[repoName].bytes += size.bytes;\n\n // Track dependencies\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const dep of Object.keys(deps)) {\n stats.dependencies.total++;\n\n if (dep.startsWith('@kb-labs/')) {\n stats.dependencies.workspace++;\n } else {\n stats.dependencies.external++;\n }\n\n allDeps.set(dep, (allDeps.get(dep) || 0) + 1);\n }\n\n // Track package for largest packages list\n stats.largestPackages.push({\n name: packageName,\n repository: repoName,\n files: size.files,\n lines: size.lines,\n bytes: size.bytes,\n });\n }\n\n stats.overview.totalRepositories = repos.size;\n\n // Find duplicates\n stats.dependencies.duplicates = Array.from(allDeps.values()).filter(count => count > 1).length;\n\n // Top 10 most used dependencies\n stats.dependencies.topUsed = Array.from(allDeps.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, count]) => ({ name, count }));\n\n // Sort largest packages by lines\n stats.largestPackages.sort((a, b) => b.lines - a.lines);\n stats.largestPackages = stats.largestPackages.slice(0, 10);\n\n return stats;\n}\n\n/**\n * Calculate health score\n */\nfunction calculateHealthScore(stats: StatsResult) {\n let score = 100;\n const issues: Issue[] = [];\n\n // Penalize for duplicate dependencies\n if (stats.dependencies.duplicates > 0) {\n const penalty = Math.min(20, stats.dependencies.duplicates * 2);\n score -= penalty;\n issues.push({\n type: 'duplicates',\n severity: 'warning',\n message: `${stats.dependencies.duplicates} duplicate dependencies (-${penalty})`,\n });\n }\n\n // Penalize for missing README files (would need to check, simplified here)\n // This is a placeholder - real implementation would scan for README files\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,\n grade,\n issues,\n };\n}\n\n/**\n * Output statistics in requested format\n */\nfunction outputStats(stats: StatsResult, flags: any, ui: any) {\n if (flags.json) {\n ui?.json?.(stats);\n return;\n }\n\n if (flags.md) {\n outputMarkdown(stats);\n return;\n }\n\n // Default: formatted output using V3 ctx.ui API\n const overviewItems = [\n `Packages: ${stats.overview.totalPackages}`,\n `Repositories: ${stats.overview.totalRepositories}`,\n `Lines of Code: ${stats.overview.totalLines.toLocaleString()}`,\n `Total Size: ${formatBytes(stats.overview.totalBytes)}`,\n ];\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: 'Overview', items: overviewItems },\n ];\n\n // Add health section if requested\n if (flags.health && stats.health) {\n const healthItems = [\n `Score: ${stats.health.score}/100 (Grade ${stats.health.grade})`,\n ];\n\n if (stats.health.issues.length > 0) {\n healthItems.push('');\n healthItems.push('Issues:');\n stats.health.issues.forEach(issue => {\n healthItems.push(` ${issue.message}`);\n });\n }\n\n sections.push({ header: 'Health Score', items: healthItems });\n }\n\n // Add top repositories\n const topRepos = Object.values(stats.byRepository)\n .sort((a, b) => b.lines - a.lines)\n .slice(0, 5)\n .map(repo => `${repo.name}: ${repo.lines.toLocaleString()} lines, ${repo.packages} pkg(s)`);\n\n if (topRepos.length > 0) {\n sections.push({ header: 'Top Repositories', items: topRepos });\n }\n\n ui?.success?.('Statistics collected successfully', {\n title: '📊 KB Labs Monorepo Statistics',\n sections,\n });\n}\n\n/**\n * Output Markdown table\n */\nfunction outputMarkdown(stats: StatsResult) {\n console.log('# KB Labs Monorepo Statistics\\n');\n console.log('## Overview\\n');\n console.log('| Metric | Value |');\n console.log('|--------|-------|');\n console.log(`| Packages | ${stats.overview.totalPackages} |`);\n console.log(`| Repositories | ${stats.overview.totalRepositories} |`);\n console.log(`| Lines of Code | ${stats.overview.totalLines.toLocaleString()} |`);\n console.log(`| Total Size | ${formatBytes(stats.overview.totalBytes)} |\\n`);\n\n if (stats.health) {\n console.log('## Health Score\\n');\n console.log(`**${stats.health.score}/100** (Grade ${stats.health.grade})\\n`);\n\n if (stats.health.issues.length > 0) {\n console.log('### Issues\\n');\n for (const issue of stats.health.issues) {\n console.log(`- ${issue.message}`);\n }\n console.log('');\n }\n }\n\n console.log('## By Repository\\n');\n console.log('| Repository | Packages | Lines | Size |');\n console.log('|------------|----------|-------|------|');\n for (const [name, repo] of Object.entries(stats.byRepository)) {\n console.log(`| ${name} | ${repo.packages} | ${repo.lines.toLocaleString()} | ${formatBytes(repo.bytes)} |`);\n }\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {return '0 B';}\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/stats.ts"],"names":[],"mappings":";;;;;;AA2BA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,eAAA;AAAA,EACJ,WAAA,EAAa,2CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAgD;AAClF,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,CAAgC,KAAA,GACjC,KAAA;AAGJ,MAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,QAAA,MAAM,SAAS,MAAM,QAAA,CAAS,KAAA,CAAM,GAAA,CAAiB,WAAW,KAAK,CAAA;AACrE,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,WAAA,CAAY,MAAA,EAAQ,OAAO,EAAE,CAAA;AAC7B,UAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,QACvB;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAGxC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,KAAA,CAAM,MAAA,GAAS,qBAAqB,KAAK,CAAA;AAAA,MAC3C;AAGA,MAAA,MAAM,QAAA,CAAS,MAAM,GAAA,CAAI,UAAA,CAAW,OAAO,KAAA,EAAO,CAAA,GAAI,KAAK,GAAI,CAAA;AAG/D,MAAA,MAAM,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,eAAA,EAAiB;AAAA,QAC9C,QAAA,EAAU,MAAM,QAAA,CAAS,aAAA;AAAA,QACzB,YAAA,EAAc,MAAM,QAAA,CAAS,iBAAA;AAAA,QAC7B,UAAA,EAAY,MAAM,MAAA,IAAU;AAAA,OAC7B,CAAA;AAGD,MAAA,WAAA,CAAY,KAAA,EAAO,OAAO,EAAE,CAAA;AAE5B,MAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,IACvB;AAAA;AAEJ,CAAC;AAKD,SAAS,aAAa,OAAA,EAA2B;AAC/C,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;AAClC,QAAA,QAAA,CAAS,KAAK,eAAe,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,cAAc,UAAA,EAAqE;AAC1F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAC1C,EAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,EACxC;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,SAAS,KAAK,GAAA,EAAa;AACzB,IAAA,MAAM,UAAU,EAAA,CAAG,WAAA,CAAY,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE3D,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,MAAM,IAAI,CAAA;AAE1C,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,QAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,MACf,CAAA,MAAA,IAAW,MAAM,MAAA,EAAO,IAAK,qBAAqB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAClE,QAAA,KAAA,EAAA;AACA,QAAA,MAAM,OAAA,GAAU,EAAA,CAAG,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AACjD,QAAA,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA;AAC7B,QAAA,KAAA,IAAS,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,MAAM,CAAA;AACX,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAC/B;AAKA,eAAe,aAAa,OAAA,EAAuC;AACjE,EAAA,MAAM,QAAA,GAAW,aAAa,OAAO,CAAA;AAErC,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,QAAA,EAAU;AAAA,MACR,aAAA,EAAe,CAAA;AAAA,MACf,iBAAA,EAAmB,CAAA;AAAA,MACnB,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,IACA,cAAc,EAAC;AAAA,IACf,YAAA,EAAc;AAAA,MACZ,KAAA,EAAO,CAAA;AAAA,MACP,SAAA,EAAW,CAAA;AAAA,MACX,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY,CAAA;AAAA,MACZ,SAAS;AAAC,KACZ;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,GAAA;AAAA,MACP,QAAQ;AAAC,KACX;AAAA,IACA,iBAAiB;AAAC,GACpB;AAEA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AAExC,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;AAAC,MAAA;AAAA,IAAS;AAEpE,IAAA,KAAA,CAAM,QAAA,CAAS,aAAA,EAAA;AAEf,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA,CAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAC,CAAC,CAAA;AAErE,IAAA,KAAA,CAAM,IAAI,QAAQ,CAAA;AAElB,IAAA,MAAM,IAAA,GAAO,cAAc,UAAU,CAAA;AACrC,IAAA,KAAA,CAAM,QAAA,CAAS,cAAc,IAAA,CAAK,KAAA;AAClC,IAAA,KAAA,CAAM,QAAA,CAAS,cAAc,IAAA,CAAK,KAAA;AAClC,IAAA,KAAA,CAAM,QAAA,CAAS,cAAc,IAAA,CAAK,KAAA;AAGlC,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,GAAI;AAAA,QAC7B,IAAA,EAAM,QAAA;AAAA,QACN,QAAA,EAAU,CAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,CAAE,QAAA,EAAA;AAC7B,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,KAAA;AAC3C,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,KAAA;AAC3C,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,KAAA;AAG3C,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAG,WAAA,CAAY,YAAA;AAAA,MACf,GAAG,WAAA,CAAY;AAAA,KACjB;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,KAAA,CAAM,YAAA,CAAa,KAAA,EAAA;AAEnB,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,QAAA,KAAA,CAAM,YAAA,CAAa,SAAA,EAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,YAAA,CAAa,QAAA,EAAA;AAAA,MACrB;AAEA,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAA,CAAM,OAAA,CAAQ,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IAC9C;AAGA,IAAA,KAAA,CAAM,gBAAgB,IAAA,CAAK;AAAA,MACzB,IAAA,EAAM,WAAA;AAAA,MACN,UAAA,EAAY,QAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,CAAM,QAAA,CAAS,oBAAoB,KAAA,CAAM,IAAA;AAGzC,EAAA,KAAA,CAAM,YAAA,CAAa,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,GAAQ,CAAC,CAAA,CAAE,MAAA;AAGxF,EAAA,KAAA,CAAM,YAAA,CAAa,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAA,EAAS,CAAA,CACtD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,EACX,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,MAAO,EAAE,IAAA,EAAM,OAAM,CAAE,CAAA;AAG3C,EAAA,KAAA,CAAM,eAAA,CAAgB,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACtD,EAAA,KAAA,CAAM,eAAA,GAAkB,KAAA,CAAM,eAAA,CAAgB,KAAA,CAAM,GAAG,EAAE,CAAA;AAEzD,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,qBAAqB,KAAA,EAAoB;AAChD,EAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,EAAA,MAAM,SAAkB,EAAC;AAGzB,EAAA,IAAI,KAAA,CAAM,YAAA,CAAa,UAAA,GAAa,CAAA,EAAG;AACrC,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,CAAM,YAAA,CAAa,aAAa,CAAC,CAAA;AAC9D,IAAA,KAAA,IAAS,OAAA;AACT,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,SAAS,CAAA,EAAG,KAAA,CAAM,YAAA,CAAa,UAAU,6BAA6B,OAAO,CAAA,CAAA;AAAA,KAC9E,CAAA;AAAA,EACH;AAMA,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;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,SAAS,WAAA,CAAY,KAAA,EAAoB,KAAA,EAAgC,EAAA,EAA2B;AAClG,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,EAAA,EAAI,OAAO,KAAK,CAAA;AAChB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,CAAA,UAAA,EAAa,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,CAAA;AAAA,IACzC,CAAA,cAAA,EAAiB,KAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,CAAA;AAAA,IACjD,CAAA,eAAA,EAAkB,KAAA,CAAM,QAAA,CAAS,UAAA,CAAW,gBAAgB,CAAA,CAAA;AAAA,IAC5D,CAAA,YAAA,EAAe,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,GACvD;AAEA,EAAA,MAAM,QAAA,GAAuD;AAAA,IAC3D,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,aAAA;AAAc,GAC7C;AAGA,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,MAAA,EAAQ;AAChC,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,UAAU,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,YAAA,EAAe,KAAA,CAAM,OAAO,KAAK,CAAA,CAAA;AAAA,KAC/D;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,MAAA,WAAA,CAAY,KAAK,SAAS,CAAA;AAC1B,MAAA,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAA,KAAA,KAAS;AACnC,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACvC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,aAAa,CAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,CAC9C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAA,IAAA,KAAQ,CAAA,EAAG,KAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB,CAAA,QAAA,EAAW,IAAA,CAAK,QAAQ,CAAA,OAAA,CAAS,CAAA;AAE5F,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,kBAAA,EAAoB,KAAA,EAAO,UAAU,CAAA;AAAA,EAC/D;AAEA,EAAA,EAAA,EAAI,UAAU,mCAAA,EAAqC;AAAA,IACjD,KAAA,EAAO,uCAAA;AAAA,IACP;AAAA,GACD,CAAA;AACH;AAKA,SAAS,eAAe,KAAA,EAAoB;AAC1C,EAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,EAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,EAAA,CAAI,CAAA;AAC5D,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,KAAA,CAAM,QAAA,CAAS,iBAAiB,CAAA,EAAA,CAAI,CAAA;AACpE,EAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqB,KAAA,CAAM,SAAS,UAAA,CAAW,cAAA,EAAgB,CAAA,EAAA,CAAI,CAAA;AAC/E,EAAA,OAAA,CAAQ,IAAI,CAAA,eAAA,EAAkB,WAAA,CAAY,KAAA,CAAM,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,CAAM,CAAA;AAE1E,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,CAAK,CAAA;AAE3E,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAC1B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ;AACvC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAClC;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,EAAA,KAAA,MAAW,CAAC,MAAM,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAC7D,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,GAAA,EAAM,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB,CAAA,GAAA,EAAM,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAC5G;AACF;AAKA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,UAAU,CAAA,EAAG;AAAC,IAAA,OAAO,KAAA;AAAA,EAAM;AAC/B,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC3D","file":"stats.js","sourcesContent":["/**\n * quality:stats - Monorepo statistics and health score\n *\n * Collects comprehensive statistics about the monorepo including:\n * - Package count by repository\n * - Total lines of code\n * - File counts\n * - Dependency statistics\n * - Health score (if --health flag provided)\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { StatsResult, Issue } from '@kb-labs/quality-contracts';\nimport { CACHE_KEYS } from '@kb-labs/quality-contracts';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { StatsFlags } from './flags.js';\n\n// Input type with backward compatibility\ntype StatsInput = StatsFlags & { argv?: string[] };\n\ntype StatsCommandResult = {\n exitCode: number;\n result?: StatsResult;\n meta?: Record<string, unknown>;\n};\n\nexport default defineCommand({\n id: 'quality:stats',\n description: 'Show monorepo statistics and health score',\n\n handler: {\n async execute(ctx: PluginContextV3, input: StatsInput): Promise<StatsCommandResult> {\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: StatsInput }).flags\n : input;\n\n // Check cache unless refresh requested\n if (!flags.refresh) {\n const cached = await platform.cache.get<StatsResult>(CACHE_KEYS.STATS);\n if (cached) {\n outputStats(cached, flags, ui);\n return { exitCode: 0 };\n }\n }\n\n // Collect statistics\n const stats = await collectStats(ctx.cwd);\n\n // Calculate health score if requested\n if (flags.health) {\n stats.health = calculateHealthScore(stats);\n }\n\n // Cache results for 5 minutes\n await platform.cache.set(CACHE_KEYS.STATS, stats, 5 * 60 * 1000);\n\n // Track analytics\n await platform.analytics.track('quality:stats', {\n packages: stats.overview.totalPackages,\n repositories: stats.overview.totalRepositories,\n withHealth: flags.health ?? false,\n });\n\n // Output results\n outputStats(stats, flags, ui);\n\n return { exitCode: 0 };\n },\n },\n});\n\n/**\n * Find all packages in the monorepo\n */\nfunction findPackages(rootDir: 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 packages.push(packageJsonPath);\n }\n }\n }\n\n return packages;\n}\n\n/**\n * Calculate package size (files, lines, bytes)\n */\nfunction calculateSize(packageDir: string): { files: number; lines: number; bytes: number } {\n const srcDir = path.join(packageDir, 'src');\n if (!fs.existsSync(srcDir)) {\n return { files: 0, lines: 0, bytes: 0 };\n }\n\n let files = 0;\n let lines = 0;\n let bytes = 0;\n\n function walk(dir: string) {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx|js|jsx)$/.test(entry.name)) {\n files++;\n const content = fs.readFileSync(fullPath, 'utf-8');\n lines += content.split('\\n').length;\n bytes += Buffer.byteLength(content, 'utf-8');\n }\n }\n }\n\n walk(srcDir);\n return { files, lines, bytes };\n}\n\n/**\n * Collect comprehensive statistics\n */\nasync function collectStats(rootDir: string): Promise<StatsResult> {\n const packages = findPackages(rootDir);\n\n const stats: StatsResult = {\n overview: {\n totalPackages: 0,\n totalRepositories: 0,\n totalFiles: 0,\n totalLines: 0,\n totalBytes: 0,\n },\n byRepository: {},\n dependencies: {\n total: 0,\n workspace: 0,\n external: 0,\n duplicates: 0,\n topUsed: [],\n },\n health: {\n score: 0,\n grade: 'F',\n issues: [],\n },\n largestPackages: [],\n };\n\n const repos = new Set<string>();\n const allDeps = new Map<string, number>();\n\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/')) {continue;}\n\n stats.overview.totalPackages++;\n\n const packageDir = path.dirname(packagePath);\n const repoName = path.basename(path.dirname(path.dirname(packageDir)));\n\n repos.add(repoName);\n\n const size = calculateSize(packageDir);\n stats.overview.totalFiles += size.files;\n stats.overview.totalLines += size.lines;\n stats.overview.totalBytes += size.bytes;\n\n // Track by repository\n if (!stats.byRepository[repoName]) {\n stats.byRepository[repoName] = {\n name: repoName,\n packages: 0,\n files: 0,\n lines: 0,\n bytes: 0,\n };\n }\n\n stats.byRepository[repoName].packages++;\n stats.byRepository[repoName].files += size.files;\n stats.byRepository[repoName].lines += size.lines;\n stats.byRepository[repoName].bytes += size.bytes;\n\n // Track dependencies\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n for (const dep of Object.keys(deps)) {\n stats.dependencies.total++;\n\n if (dep.startsWith('@kb-labs/')) {\n stats.dependencies.workspace++;\n } else {\n stats.dependencies.external++;\n }\n\n allDeps.set(dep, (allDeps.get(dep) || 0) + 1);\n }\n\n // Track package for largest packages list\n stats.largestPackages.push({\n name: packageName,\n repository: repoName,\n files: size.files,\n lines: size.lines,\n bytes: size.bytes,\n });\n }\n\n stats.overview.totalRepositories = repos.size;\n\n // Find duplicates\n stats.dependencies.duplicates = Array.from(allDeps.values()).filter(count => count > 1).length;\n\n // Top 10 most used dependencies\n stats.dependencies.topUsed = Array.from(allDeps.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([name, count]) => ({ name, count }));\n\n // Sort largest packages by lines\n stats.largestPackages.sort((a, b) => b.lines - a.lines);\n stats.largestPackages = stats.largestPackages.slice(0, 10);\n\n return stats;\n}\n\n/**\n * Calculate health score\n */\nfunction calculateHealthScore(stats: StatsResult) {\n let score = 100;\n const issues: Issue[] = [];\n\n // Penalize for duplicate dependencies\n if (stats.dependencies.duplicates > 0) {\n const penalty = Math.min(20, stats.dependencies.duplicates * 2);\n score -= penalty;\n issues.push({\n type: 'duplicates',\n severity: 'warning',\n message: `${stats.dependencies.duplicates} duplicate dependencies (-${penalty})`,\n });\n }\n\n // Penalize for missing README files (would need to check, simplified here)\n // This is a placeholder - real implementation would scan for README files\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,\n grade,\n issues,\n };\n}\n\n/**\n * Output statistics in requested format\n */\nfunction outputStats(stats: StatsResult, flags: Record<string, unknown>, ui: PluginContextV3['ui']) {\n if (flags.json) {\n ui?.json?.(stats);\n return;\n }\n\n if (flags.md) {\n outputMarkdown(stats);\n return;\n }\n\n // Default: formatted output using V3 ctx.ui API\n const overviewItems = [\n `Packages: ${stats.overview.totalPackages}`,\n `Repositories: ${stats.overview.totalRepositories}`,\n `Lines of Code: ${stats.overview.totalLines.toLocaleString()}`,\n `Total Size: ${formatBytes(stats.overview.totalBytes)}`,\n ];\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: 'Overview', items: overviewItems },\n ];\n\n // Add health section if requested\n if (flags.health && stats.health) {\n const healthItems = [\n `Score: ${stats.health.score}/100 (Grade ${stats.health.grade})`,\n ];\n\n if (stats.health.issues.length > 0) {\n healthItems.push('');\n healthItems.push('Issues:');\n stats.health.issues.forEach(issue => {\n healthItems.push(` ${issue.message}`);\n });\n }\n\n sections.push({ header: 'Health Score', items: healthItems });\n }\n\n // Add top repositories\n const topRepos = Object.values(stats.byRepository)\n .sort((a, b) => b.lines - a.lines)\n .slice(0, 5)\n .map(repo => `${repo.name}: ${repo.lines.toLocaleString()} lines, ${repo.packages} pkg(s)`);\n\n if (topRepos.length > 0) {\n sections.push({ header: 'Top Repositories', items: topRepos });\n }\n\n ui?.success?.('Statistics collected successfully', {\n title: '📊 KB Labs Monorepo Statistics',\n sections,\n });\n}\n\n/**\n * Output Markdown table\n */\nfunction outputMarkdown(stats: StatsResult) {\n console.log('# KB Labs Monorepo Statistics\\n');\n console.log('## Overview\\n');\n console.log('| Metric | Value |');\n console.log('|--------|-------|');\n console.log(`| Packages | ${stats.overview.totalPackages} |`);\n console.log(`| Repositories | ${stats.overview.totalRepositories} |`);\n console.log(`| Lines of Code | ${stats.overview.totalLines.toLocaleString()} |`);\n console.log(`| Total Size | ${formatBytes(stats.overview.totalBytes)} |\\n`);\n\n if (stats.health) {\n console.log('## Health Score\\n');\n console.log(`**${stats.health.score}/100** (Grade ${stats.health.grade})\\n`);\n\n if (stats.health.issues.length > 0) {\n console.log('### Issues\\n');\n for (const issue of stats.health.issues) {\n console.log(`- ${issue.message}`);\n }\n console.log('');\n }\n }\n\n console.log('## By Repository\\n');\n console.log('| Repository | Packages | Lines | Size |');\n console.log('|------------|----------|-------|------|');\n for (const [name, repo] of Object.entries(stats.byRepository)) {\n console.log(`| ${name} | ${repo.packages} | ${repo.lines.toLocaleString()} | ${formatBytes(repo.bytes)} |`);\n }\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {return '0 B';}\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n"]}
@@ -8,7 +8,7 @@ var visualize_default = defineCommand({
8
8
  handler: {
9
9
  async execute(ctx, input) {
10
10
  const { ui } = ctx;
11
- const flags = input.flags ?? input;
11
+ const flags = "flags" in input && typeof input.flags === "object" && input.flags !== null ? input.flags : input;
12
12
  const graph = buildDependencyGraph(ctx.cwd);
13
13
  if (flags.dot) {
14
14
  outputDot(graph, flags, ui);
@@ -31,7 +31,7 @@ function outputTree(graph, packageName, flags, ui) {
31
31
  const { nodes } = graph;
32
32
  const node = nodes.get(packageName);
33
33
  if (!node) {
34
- ui?.fatal?.(`Package not found: ${packageName}`);
34
+ ui?.error?.(`Package not found: ${packageName}`);
35
35
  return;
36
36
  }
37
37
  const sections = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/visualize.ts"],"names":[],"mappings":"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","file":"visualize.js","sourcesContent":["/**\n * quality:visualize - Visualize dependency graph\n *\n * Shows dependency graph in various formats:\n * - Tree view for specific package\n * - DOT format for graphviz\n * - Statistics about the graph\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport {\n buildDependencyGraph,\n getReverseDependencies,\n getImpactAnalysis,\n type DependencyGraph,\n} from '@kb-labs/quality-core/graph';\n\ntype VisualizeFlags = {\n package?: string;\n tree?: boolean;\n dot?: boolean;\n stats?: boolean;\n reverse?: boolean;\n impact?: boolean;\n json?: boolean;\n argv?: string[];\n};\n\ntype VisualizeInput = VisualizeFlags & { argv?: string[] };\n\ntype VisualizeCommandResult = {\n exitCode: number;\n graph?: any;\n};\n\nexport default defineCommand({\n id: 'quality:visualize',\n description: 'Visualize dependency graph',\n\n handler: {\n async execute(ctx: PluginContextV3, input: VisualizeInput): Promise<VisualizeCommandResult> {\n const { ui } = ctx;\n\n // V3: Flags come in input.flags object (not auto-merged)\n const flags = (input as any).flags ?? input;\n\n // Build dependency graph\n const graph = buildDependencyGraph(ctx.cwd);\n\n // Handle different output modes\n if (flags.dot) {\n outputDot(graph, flags, ui);\n } else if (flags.tree && flags.package) {\n outputTree(graph, flags.package, flags, ui);\n } else if (flags.reverse && flags.package) {\n outputReverse(graph, flags.package, flags, ui);\n } else if (flags.impact && flags.package) {\n outputImpact(graph, flags.package, flags, ui);\n } else if (flags.stats) {\n outputStats(graph, flags, ui);\n } else {\n // Default: show stats\n outputStats(graph, flags, ui);\n }\n\n return { exitCode: 0 };\n },\n },\n});\n\n/**\n * Output dependency tree for a package\n */\nfunction outputTree(graph: DependencyGraph, packageName: string, flags: any, ui: any) {\n const { nodes } = graph;\n const node = nodes.get(packageName);\n\n if (!node) {\n ui?.fatal?.(`Package not found: ${packageName}`);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Build tree recursively\n const visited = new Set<string>();\n const treeItems: string[] = [];\n\n function buildTree(pkg: string, depth: number, prefix: string) {\n if (visited.has(pkg)) {\n treeItems.push(`${prefix}${pkg} (circular)`);\n return;\n }\n visited.add(pkg);\n\n const pkgNode = nodes.get(pkg);\n if (!pkgNode) {return;}\n\n treeItems.push(`${prefix}${pkg}`);\n\n const deps = Array.from(pkgNode.deps);\n for (let i = 0; i < deps.length; i++) {\n const dep = deps[i];\n if (!dep) {continue;}\n const isLast = i === deps.length - 1;\n const newPrefix = prefix + (isLast ? ' └─ ' : ' ├─ ');\n buildTree(dep, depth + 1, newPrefix);\n }\n }\n\n buildTree(packageName, 0, '');\n\n sections.push({\n header: 'Dependency Tree',\n items: treeItems,\n });\n\n ui?.success?.('Dependency tree generated', {\n title: `📦 Dependency Tree for ${packageName}`,\n sections,\n });\n}\n\n/**\n * Output reverse dependencies (who depends on this package)\n */\nfunction outputReverse(graph: DependencyGraph, packageName: string, flags: any, ui: any) {\n const reverseDeps = getReverseDependencies(graph, packageName);\n\n if (flags.json) {\n ui?.json?.({ package: packageName, reverseDependencies: Array.from(reverseDeps) });\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n if (reverseDeps.size === 0) {\n sections.push({\n header: 'Result',\n items: ['No packages depend on this package'],\n });\n } else {\n sections.push({\n header: `Packages that depend on ${packageName}`,\n items: Array.from(reverseDeps).map(dep => `• ${dep}`),\n });\n }\n\n ui?.success?.('Reverse dependencies found', {\n title: `⬅️ Reverse Dependencies for ${packageName}`,\n sections,\n });\n}\n\n/**\n * Output impact analysis (all packages affected by changes)\n */\nfunction outputImpact(graph: DependencyGraph, packageName: string, flags: any, ui: any) {\n const affected = getImpactAnalysis(graph, packageName);\n\n if (flags.json) {\n ui?.json?.({ package: packageName, affectedPackages: Array.from(affected) });\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n if (affected.size === 0) {\n sections.push({\n header: 'Result',\n items: ['No other packages affected by changes to this package'],\n });\n } else {\n sections.push({\n header: `Impact Analysis for ${packageName}`,\n items: [\n `Changes to this package will affect ${affected.size} other packages:`,\n '',\n ...Array.from(affected).map(dep => `• ${dep}`),\n ],\n });\n\n sections.push({\n header: 'Recommendations',\n items: [\n '🧪 Run tests in affected packages',\n '🔨 Rebuild affected packages',\n '📝 Update documentation if API changed',\n ],\n });\n }\n\n ui?.success?.('Impact analysis completed', {\n title: `💥 Impact Analysis for ${packageName}`,\n sections,\n });\n}\n\n/**\n * Output dependency graph statistics\n */\nfunction outputStats(graph: DependencyGraph, flags: any, ui: any) {\n const { nodes } = graph;\n\n // Calculate statistics\n let totalDeps = 0;\n let maxDeps = 0;\n let maxDepsPackage = '';\n const depCounts = new Map<number, number>();\n\n for (const [name, node] of nodes) {\n const depCount = node.deps.size;\n totalDeps += depCount;\n\n if (depCount > maxDeps) {\n maxDeps = depCount;\n maxDepsPackage = name;\n }\n\n depCounts.set(depCount, (depCounts.get(depCount) ?? 0) + 1);\n }\n\n const avgDeps = nodes.size > 0 ? (totalDeps / nodes.size).toFixed(2) : '0';\n\n if (flags.json) {\n ui?.json?.({\n totalPackages: nodes.size,\n totalDependencies: totalDeps,\n averageDependencies: Number.parseFloat(avgDeps),\n maxDependencies: maxDeps,\n maxDependenciesPackage: maxDepsPackage,\n });\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Graph Statistics',\n items: [\n `Total packages: ${nodes.size}`,\n `Total dependencies: ${totalDeps}`,\n `Average dependencies per package: ${avgDeps}`,\n `Max dependencies: ${maxDeps} (${maxDepsPackage})`,\n ],\n });\n\n // Dependency distribution\n const distributionItems: string[] = [];\n const sortedCounts = Array.from(depCounts.entries()).sort((a, b) => a[0] - b[0]);\n for (const [count, packages] of sortedCounts) {\n const bar = '█'.repeat(Math.min(packages, 20));\n distributionItems.push(`${count} deps: ${bar} ${packages} packages`);\n }\n\n sections.push({\n header: 'Dependency Distribution',\n items: distributionItems,\n });\n\n ui?.success?.('Graph statistics calculated', {\n title: '📊 Dependency Graph Statistics',\n sections,\n });\n}\n\n/**\n * Output DOT format for graphviz\n */\nfunction outputDot(graph: DependencyGraph, flags: any, ui: any) {\n const { nodes } = graph;\n\n const lines: string[] = [];\n lines.push('digraph dependencies {');\n lines.push(' rankdir=LR;');\n lines.push(' node [shape=box];');\n lines.push('');\n\n for (const [name, node] of nodes) {\n for (const dep of node.deps) {\n const safeName = name.replace(/[@\\/]/g, '_');\n const safeDep = dep.replace(/[@\\/]/g, '_');\n lines.push(` \"${safeName}\" -> \"${safeDep}\";`);\n }\n }\n\n lines.push('}');\n\n if (flags.json) {\n ui?.json?.({ dot: lines.join('\\n') });\n } else {\n for (const line of lines) {\n ui?.write?.(line);\n }\n ui?.write?.('');\n ui?.write?.('# Save to file and visualize with:');\n ui?.write?.('# dot -Tpng dependencies.dot -o dependencies.png');\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/cli/commands/visualize.ts"],"names":[],"mappings":"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","file":"visualize.js","sourcesContent":["/**\n * quality:visualize - Visualize dependency graph\n *\n * Shows dependency graph in various formats:\n * - Tree view for specific package\n * - DOT format for graphviz\n * - Statistics about the graph\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { UIFacade } from '@kb-labs/sdk';\nimport {\n buildDependencyGraph,\n getReverseDependencies,\n getImpactAnalysis,\n type DependencyGraph,\n} from '@kb-labs/quality-core/graph';\n\ntype VisualizeFlags = {\n package?: string;\n tree?: boolean;\n dot?: boolean;\n stats?: boolean;\n reverse?: boolean;\n impact?: boolean;\n json?: boolean;\n argv?: string[];\n};\n\ntype VisualizeInput = VisualizeFlags & { argv?: string[] };\n\ntype VisualizeCommandResult = {\n exitCode: number;\n graph?: DependencyGraph;\n};\n\nexport default defineCommand({\n id: 'quality:visualize',\n description: 'Visualize dependency graph',\n\n handler: {\n async execute(ctx: PluginContextV3, input: VisualizeInput): Promise<VisualizeCommandResult> {\n const { ui } = ctx;\n\n // V3: Flags may come wrapped in input.flags or passed directly\n const flags = ('flags' in input && typeof (input as { flags?: unknown }).flags === 'object' && (input as { flags?: unknown }).flags !== null)\n ? (input as { flags: VisualizeInput }).flags\n : input;\n\n // Build dependency graph\n const graph = buildDependencyGraph(ctx.cwd);\n\n // Handle different output modes\n if (flags.dot) {\n outputDot(graph, flags, ui);\n } else if (flags.tree && flags.package) {\n outputTree(graph, flags.package, flags, ui);\n } else if (flags.reverse && flags.package) {\n outputReverse(graph, flags.package, flags, ui);\n } else if (flags.impact && flags.package) {\n outputImpact(graph, flags.package, flags, ui);\n } else if (flags.stats) {\n outputStats(graph, flags, ui);\n } else {\n // Default: show stats\n outputStats(graph, flags, ui);\n }\n\n return { exitCode: 0 };\n },\n },\n});\n\n/**\n * Output dependency tree for a package\n */\nfunction outputTree(graph: DependencyGraph, packageName: string, flags: VisualizeFlags, ui: UIFacade | undefined) {\n const { nodes } = graph;\n const node = nodes.get(packageName);\n\n if (!node) {\n ui?.error?.(`Package not found: ${packageName}`);\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n // Build tree recursively\n const visited = new Set<string>();\n const treeItems: string[] = [];\n\n function buildTree(pkg: string, depth: number, prefix: string) {\n if (visited.has(pkg)) {\n treeItems.push(`${prefix}${pkg} (circular)`);\n return;\n }\n visited.add(pkg);\n\n const pkgNode = nodes.get(pkg);\n if (!pkgNode) {return;}\n\n treeItems.push(`${prefix}${pkg}`);\n\n const deps = Array.from(pkgNode.deps);\n for (let i = 0; i < deps.length; i++) {\n const dep = deps[i];\n if (!dep) {continue;}\n const isLast = i === deps.length - 1;\n const newPrefix = prefix + (isLast ? ' └─ ' : ' ├─ ');\n buildTree(dep, depth + 1, newPrefix);\n }\n }\n\n buildTree(packageName, 0, '');\n\n sections.push({\n header: 'Dependency Tree',\n items: treeItems,\n });\n\n ui?.success?.('Dependency tree generated', {\n title: `📦 Dependency Tree for ${packageName}`,\n sections,\n });\n}\n\n/**\n * Output reverse dependencies (who depends on this package)\n */\nfunction outputReverse(graph: DependencyGraph, packageName: string, flags: VisualizeFlags, ui: UIFacade | undefined) {\n const reverseDeps = getReverseDependencies(graph, packageName);\n\n if (flags.json) {\n ui?.json?.({ package: packageName, reverseDependencies: Array.from(reverseDeps) });\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n if (reverseDeps.size === 0) {\n sections.push({\n header: 'Result',\n items: ['No packages depend on this package'],\n });\n } else {\n sections.push({\n header: `Packages that depend on ${packageName}`,\n items: Array.from(reverseDeps).map(dep => `• ${dep}`),\n });\n }\n\n ui?.success?.('Reverse dependencies found', {\n title: `⬅️ Reverse Dependencies for ${packageName}`,\n sections,\n });\n}\n\n/**\n * Output impact analysis (all packages affected by changes)\n */\nfunction outputImpact(graph: DependencyGraph, packageName: string, flags: VisualizeFlags, ui: UIFacade | undefined) {\n const affected = getImpactAnalysis(graph, packageName);\n\n if (flags.json) {\n ui?.json?.({ package: packageName, affectedPackages: Array.from(affected) });\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n if (affected.size === 0) {\n sections.push({\n header: 'Result',\n items: ['No other packages affected by changes to this package'],\n });\n } else {\n sections.push({\n header: `Impact Analysis for ${packageName}`,\n items: [\n `Changes to this package will affect ${affected.size} other packages:`,\n '',\n ...Array.from(affected).map(dep => `• ${dep}`),\n ],\n });\n\n sections.push({\n header: 'Recommendations',\n items: [\n '🧪 Run tests in affected packages',\n '🔨 Rebuild affected packages',\n '📝 Update documentation if API changed',\n ],\n });\n }\n\n ui?.success?.('Impact analysis completed', {\n title: `💥 Impact Analysis for ${packageName}`,\n sections,\n });\n}\n\n/**\n * Output dependency graph statistics\n */\nfunction outputStats(graph: DependencyGraph, flags: VisualizeFlags, ui: UIFacade | undefined) {\n const { nodes } = graph;\n\n // Calculate statistics\n let totalDeps = 0;\n let maxDeps = 0;\n let maxDepsPackage = '';\n const depCounts = new Map<number, number>();\n\n for (const [name, node] of nodes) {\n const depCount = node.deps.size;\n totalDeps += depCount;\n\n if (depCount > maxDeps) {\n maxDeps = depCount;\n maxDepsPackage = name;\n }\n\n depCounts.set(depCount, (depCounts.get(depCount) ?? 0) + 1);\n }\n\n const avgDeps = nodes.size > 0 ? (totalDeps / nodes.size).toFixed(2) : '0';\n\n if (flags.json) {\n ui?.json?.({\n totalPackages: nodes.size,\n totalDependencies: totalDeps,\n averageDependencies: Number.parseFloat(avgDeps),\n maxDependencies: maxDeps,\n maxDependenciesPackage: maxDepsPackage,\n });\n return;\n }\n\n const sections: Array<{ header: string; items: string[] }> = [];\n\n sections.push({\n header: 'Graph Statistics',\n items: [\n `Total packages: ${nodes.size}`,\n `Total dependencies: ${totalDeps}`,\n `Average dependencies per package: ${avgDeps}`,\n `Max dependencies: ${maxDeps} (${maxDepsPackage})`,\n ],\n });\n\n // Dependency distribution\n const distributionItems: string[] = [];\n const sortedCounts = Array.from(depCounts.entries()).sort((a, b) => a[0] - b[0]);\n for (const [count, packages] of sortedCounts) {\n const bar = '█'.repeat(Math.min(packages, 20));\n distributionItems.push(`${count} deps: ${bar} ${packages} packages`);\n }\n\n sections.push({\n header: 'Dependency Distribution',\n items: distributionItems,\n });\n\n ui?.success?.('Graph statistics calculated', {\n title: '📊 Dependency Graph Statistics',\n sections,\n });\n}\n\n/**\n * Output DOT format for graphviz\n */\nfunction outputDot(graph: DependencyGraph, flags: VisualizeFlags, ui: UIFacade | undefined) {\n const { nodes } = graph;\n\n const lines: string[] = [];\n lines.push('digraph dependencies {');\n lines.push(' rankdir=LR;');\n lines.push(' node [shape=box];');\n lines.push('');\n\n for (const [name, node] of nodes) {\n for (const dep of node.deps) {\n const safeName = name.replace(/[@\\/]/g, '_');\n const safeDep = dep.replace(/[@\\/]/g, '_');\n lines.push(` \"${safeName}\" -> \"${safeDep}\";`);\n }\n }\n\n lines.push('}');\n\n if (flags.json) {\n ui?.json?.({ dot: lines.join('\\n') });\n } else {\n for (const line of lines) {\n ui?.write?.(line);\n }\n ui?.write?.('');\n ui?.write?.('# Save to file and visualize with:');\n ui?.write?.('# dot -Tpng dependencies.dot -o dependencies.png');\n }\n}\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"index.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","/**\n * Quality Plugin Manifest V3\n *\n * Monorepo quality analysis and automated fixes\n */\n\nimport {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n QUALITY_BASE_PATH,\n QUALITY_ROUTES,\n} from '@kb-labs/quality-contracts';\nimport {\n statsFlags,\n healthFlags,\n fixDepsFlags,\n buildOrderFlags,\n cyclesFlags,\n visualizeFlags,\n checkBuildsFlags,\n checkTypesFlags,\n checkTestsFlags,\n deadCodeFlags,\n} from './cli/commands/flags.js';\n\n/**\n * Build permissions using V3 combinePermissions builder pattern.\n * Quality plugin needs read/write access to entire monorepo for analysis and fixes.\n */\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'], // Access to entire monorepo\n })\n .withPlatform({\n cache: ['quality:'], // Cache namespace prefix\n analytics: true, // Track command usage\n })\n .withQuotas({\n timeoutMs: 300000, // 5 minutes for long-running operations\n memoryMb: 1024, // 1GB memory\n })\n .build();\n\n/**\n * Heavy operations permissions (builds, types, tests)\n * These operations scan the entire monorepo and can take a long time\n */\nconst heavyOperationsPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'],\n })\n .withPlatform({\n cache: ['quality:'],\n analytics: true,\n })\n .withQuotas({\n timeoutMs: 600000, // 10 minutes for heavy operations\n memoryMb: 2048, // 2GB memory\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/quality',\n version: '0.1.0',\n\n display: {\n name: 'Quality Tools',\n description: 'Monorepo quality analysis and automated fixes',\n tags: ['quality', 'monorepo', 'analysis', 'devtools'],\n },\n\n platform: {\n requires: ['storage', 'cache'],\n optional: ['analytics', 'logger'],\n },\n\n cli: {\n commands: [\n // ======================================================================\n // quality:stats - Monorepo statistics and health score\n // ======================================================================\n {\n id: 'stats',\n group: 'quality',\n describe: 'Get monorepo statistics and health score',\n longDescription:\n 'Analyzes monorepo structure, collects package statistics, dependency info, and calculates health score. ' +\n 'Results are cached for 5 minutes.',\n\n handler: './cli/commands/stats.js#default',\n handlerPath: './cli/commands/stats.js',\n\n flags: defineCommandFlags(statsFlags),\n\n examples: [\n 'kb quality:stats',\n 'kb quality:stats --health',\n 'kb quality:stats --json',\n 'kb quality:stats --md',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:health - Monorepo health check\n // ======================================================================\n {\n id: 'health',\n group: 'quality',\n describe: 'Check monorepo health score',\n longDescription:\n 'Analyzes monorepo health including dependency issues, structure problems, and build health. ' +\n 'Returns health score (0-100) with grade (A-F) and actionable recommendations.',\n\n handler: './cli/commands/health.js#default',\n handlerPath: './cli/commands/health.js',\n\n flags: defineCommandFlags(healthFlags),\n\n examples: [\n 'kb quality:health',\n 'kb quality:health --detailed',\n 'kb quality:health --package @kb-labs/core',\n 'kb quality:health --json',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:fix-deps - Dependency auto-fixer\n // ======================================================================\n {\n id: 'fix-deps',\n group: 'quality',\n describe: 'Auto-fix dependency issues',\n longDescription:\n 'Automatically fixes dependency issues including removing unused deps, adding missing workspace deps, ' +\n 'and aligning duplicate versions. Supports --dry-run for previewing changes.',\n\n handler: './cli/commands/fix-deps.js#default',\n handlerPath: './cli/commands/fix-deps.js',\n\n flags: defineCommandFlags(fixDepsFlags),\n\n examples: [\n 'kb quality:fix-deps --stats',\n 'kb quality:fix-deps --remove-unused --dry-run',\n 'kb quality:fix-deps --align-versions',\n 'kb quality:fix-deps --all --dry-run',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:build-order - Calculate build order with topological sort\n // ======================================================================\n {\n id: 'build-order',\n group: 'quality',\n describe: 'Calculate build order using topological sort',\n longDescription:\n 'Analyzes package dependencies and calculates correct build order using topological sort. ' +\n 'Shows build layers where each layer can be built in parallel. Detects circular dependencies.',\n\n handler: './cli/commands/build-order.js#default',\n handlerPath: './cli/commands/build-order.js',\n\n flags: defineCommandFlags(buildOrderFlags),\n\n examples: [\n 'kb quality:build-order',\n 'kb quality:build-order --layers',\n 'kb quality:build-order --package @kb-labs/core',\n 'kb quality:build-order --script > build.sh',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:cycles - Detect circular dependencies\n // ======================================================================\n {\n id: 'cycles',\n group: 'quality',\n describe: 'Detect circular dependencies',\n longDescription:\n 'Uses DFS to find all circular dependency chains in the monorepo. ' +\n 'Shows complete dependency cycles with recommendations for breaking them.',\n\n handler: './cli/commands/cycles.js#default',\n handlerPath: './cli/commands/cycles.js',\n\n flags: defineCommandFlags(cyclesFlags),\n\n examples: [\n 'kb quality:cycles',\n 'kb quality:cycles --json',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:visualize - Visualize dependency graph\n // ======================================================================\n {\n id: 'visualize',\n group: 'quality',\n describe: 'Visualize dependency graph',\n longDescription:\n 'Visualize monorepo dependency graph in various formats: tree view, DOT format for graphviz, ' +\n 'reverse dependencies (who depends on this), impact analysis (what will be affected by changes), ' +\n 'and comprehensive graph statistics.',\n\n handler: './cli/commands/visualize.js#default',\n handlerPath: './cli/commands/visualize.js',\n\n flags: defineCommandFlags(visualizeFlags),\n\n examples: [\n 'kb quality:visualize --stats',\n 'kb quality:visualize --tree --package @kb-labs/core',\n 'kb quality:visualize --reverse --package @kb-labs/sdk',\n 'kb quality:visualize --impact --package @kb-labs/core',\n 'kb quality:visualize --dot > deps.dot',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:check-builds - Check build status across monorepo\n // ======================================================================\n {\n id: 'check-builds',\n group: 'quality',\n describe: 'Check build status across monorepo',\n longDescription:\n 'Analyzes build status across all packages with build scripts. ' +\n 'Detects build failures with error messages and stale builds (dist/ older than src/). ' +\n 'Results are cached for 10 minutes.',\n\n handler: './cli/commands/check-builds.js#default',\n handlerPath: './cli/commands/check-builds.js',\n\n flags: defineCommandFlags(checkBuildsFlags),\n\n examples: [\n 'kb quality:check-builds',\n 'kb quality:check-builds --package @kb-labs/core',\n 'kb quality:check-builds --timeout 60000',\n 'kb quality:check-builds --json',\n 'kb quality:check-builds --refresh',\n ],\n\n permissions: heavyOperationsPermissions,\n },\n\n // ======================================================================\n // quality:check-types - TypeScript type safety analysis\n // ======================================================================\n {\n id: 'check-types',\n group: 'quality',\n describe: 'Analyze TypeScript type safety across monorepo',\n longDescription:\n 'Analyzes TypeScript type errors, warnings, and type coverage using TypeScript Compiler API. ' +\n 'Detects any usage, @ts-ignore comments, and calculates type coverage percentage. ' +\n 'Results are cached for 10 minutes.',\n\n handler: './cli/commands/check-types.js#default',\n handlerPath: './cli/commands/check-types.js',\n\n flags: defineCommandFlags(checkTypesFlags),\n\n examples: [\n 'kb quality:check-types',\n 'kb quality:check-types --package @kb-labs/core',\n 'kb quality:check-types --errors-only',\n 'kb quality:check-types --json',\n 'kb quality:check-types --refresh',\n ],\n\n permissions: heavyOperationsPermissions,\n },\n\n // ======================================================================\n // quality:check-tests - Test execution and coverage tracking\n // ======================================================================\n {\n id: 'check-tests',\n group: 'quality',\n describe: 'Run tests and track coverage across monorepo',\n longDescription:\n 'Runs tests across all packages with test scripts and collects coverage statistics. ' +\n 'Parses test output (vitest/jest) to extract test counts and reads coverage-summary.json. ' +\n 'Results are cached for 5 minutes.',\n\n handler: './cli/commands/check-tests.js#default',\n handlerPath: './cli/commands/check-tests.js',\n\n flags: defineCommandFlags(checkTestsFlags),\n\n examples: [\n 'kb quality:check-tests',\n 'kb quality:check-tests --package @kb-labs/core',\n 'kb quality:check-tests --with-coverage',\n 'kb quality:check-tests --coverage-only',\n 'kb quality:check-tests --timeout 120000',\n 'kb quality:check-tests --json',\n ],\n\n permissions: heavyOperationsPermissions,\n },\n\n // ======================================================================\n // quality:dead-code - Dead code file detection\n // ======================================================================\n {\n id: 'dead-code',\n group: 'quality',\n describe: 'Detect dead (unreachable) source files',\n longDescription:\n 'Analyzes import graph to find source files not reachable from any entry point ' +\n '(package.json, tsup.config.ts, manifest.ts). Supports automated removal with ' +\n 'backup and restore capabilities. Zero false positives by design.',\n\n handler: './cli/commands/dead-code.js#default',\n handlerPath: './cli/commands/dead-code.js',\n\n flags: defineCommandFlags(deadCodeFlags),\n\n examples: [\n 'kb quality:dead-code',\n 'kb quality:dead-code --package @kb-labs/core',\n 'kb quality:dead-code --auto-remove --dry-run',\n 'kb quality:dead-code --auto-remove',\n 'kb quality:dead-code --list-backups',\n 'kb quality:dead-code --restore 2026-02-15T10-30-00',\n 'kb quality:dead-code --json',\n ],\n\n permissions: pluginPermissions,\n },\n ],\n },\n\n // REST API routes\n rest: {\n basePath: QUALITY_BASE_PATH,\n routes: [\n // GET /stats\n {\n method: 'GET',\n path: QUALITY_ROUTES.STATS,\n handler: './rest/handlers/stats-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#StatsRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#StatsResponseSchema',\n },\n },\n // GET /health\n {\n method: 'GET',\n path: QUALITY_ROUTES.HEALTH,\n handler: './rest/handlers/health-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#HealthRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#HealthResponseSchema',\n },\n },\n // GET /dependencies\n {\n method: 'GET',\n path: QUALITY_ROUTES.DEPENDENCIES,\n handler: './rest/handlers/dependencies-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#DependenciesRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#DependenciesResponseSchema',\n },\n },\n // GET /build-order\n {\n method: 'GET',\n path: QUALITY_ROUTES.BUILD_ORDER,\n handler: './rest/handlers/build-order-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#BuildOrderRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#BuildOrderResponseSchema',\n },\n },\n // GET /cycles\n {\n method: 'GET',\n path: QUALITY_ROUTES.CYCLES,\n handler: './rest/handlers/cycles-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#CyclesRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#CyclesResponseSchema',\n },\n },\n // GET /graph\n {\n method: 'GET',\n path: QUALITY_ROUTES.GRAPH,\n handler: './rest/handlers/graph-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#GraphRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#GraphResponseSchema',\n },\n },\n // GET /stale\n {\n method: 'GET',\n path: QUALITY_ROUTES.STALE,\n handler: './rest/handlers/stale-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#StaleRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#StaleResponseSchema',\n },\n },\n // GET /builds\n {\n method: 'GET',\n path: QUALITY_ROUTES.BUILDS,\n handler: './rest/handlers/builds-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#BuildsRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#BuildsResponseSchema',\n },\n },\n // GET /types\n {\n method: 'GET',\n path: QUALITY_ROUTES.TYPES,\n handler: './rest/handlers/types-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#TypesRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#TypesResponseSchema',\n },\n },\n // GET /tests\n {\n method: 'GET',\n path: QUALITY_ROUTES.TESTS,\n handler: './rest/handlers/tests-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#TestsRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#TestsResponseSchema',\n },\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'qualityPlugin',\n pages: [\n {\n id: 'quality.overview',\n title: 'Quality',\n icon: 'CheckCircleOutlined',\n route: '/p/quality',\n entry: './QualityOverview',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'quality',\n label: 'Quality',\n icon: 'CheckCircleOutlined',\n target: 'quality.overview',\n order: 40,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
1
+ {"version":3,"sources":["../src/cli/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"index.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","/**\n * Quality Plugin Manifest V3\n *\n * Monorepo quality analysis and automated fixes\n */\n\nimport {\n combinePermissions,\n kbPlatformPreset,\n defineCommandFlags,\n} from '@kb-labs/sdk';\nimport {\n QUALITY_BASE_PATH,\n QUALITY_ROUTES,\n} from '@kb-labs/quality-contracts';\nimport {\n statsFlags,\n healthFlags,\n fixDepsFlags,\n buildOrderFlags,\n cyclesFlags,\n visualizeFlags,\n checkBuildsFlags,\n checkTypesFlags,\n checkTestsFlags,\n deadCodeFlags,\n} from './cli/commands/flags.js';\n\n/**\n * Build permissions using V3 combinePermissions builder pattern.\n * Quality plugin needs read/write access to entire monorepo for analysis and fixes.\n */\nconst pluginPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'], // Access to entire monorepo\n })\n .withPlatform({\n cache: ['quality:'], // Cache namespace prefix\n analytics: true, // Track command usage\n })\n .withQuotas({\n timeoutMs: 300000, // 5 minutes for long-running operations\n memoryMb: 1024, // 1GB memory\n })\n .build();\n\n/**\n * Heavy operations permissions (builds, types, tests)\n * These operations scan the entire monorepo and can take a long time\n */\nconst heavyOperationsPermissions = combinePermissions()\n .with(kbPlatformPreset)\n .withFs({\n mode: 'readWrite',\n allow: ['**'],\n })\n .withPlatform({\n cache: ['quality:'],\n analytics: true,\n })\n .withQuotas({\n timeoutMs: 600000, // 10 minutes for heavy operations\n memoryMb: 2048, // 2GB memory\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/quality',\n version: '0.1.0',\n\n display: {\n name: 'Quality Tools',\n description: 'Monorepo quality analysis and automated fixes',\n tags: ['quality', 'monorepo', 'analysis', 'devtools'],\n },\n\n platform: {\n requires: ['storage', 'cache'],\n optional: ['analytics', 'logger'],\n },\n\n cli: {\n commands: [\n // ======================================================================\n // quality:stats - Monorepo statistics and health score\n // ======================================================================\n {\n id: 'stats',\n group: 'quality',\n describe: 'Get monorepo statistics and health score',\n longDescription:\n 'Analyzes monorepo structure, collects package statistics, dependency info, and calculates health score. ' +\n 'Results are cached for 5 minutes.',\n\n handler: './cli/commands/stats.js#default',\n handlerPath: './cli/commands/stats.js',\n\n flags: defineCommandFlags(statsFlags),\n\n examples: [\n 'kb quality:stats',\n 'kb quality:stats --health',\n 'kb quality:stats --json',\n 'kb quality:stats --md',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:health - Monorepo health check\n // ======================================================================\n {\n id: 'health',\n group: 'quality',\n describe: 'Check monorepo health score',\n longDescription:\n 'Analyzes monorepo health including dependency issues, structure problems, and build health. ' +\n 'Returns health score (0-100) with grade (A-F) and actionable recommendations.',\n\n handler: './cli/commands/health.js#default',\n handlerPath: './cli/commands/health.js',\n\n flags: defineCommandFlags(healthFlags),\n\n examples: [\n 'kb quality:health',\n 'kb quality:health --detailed',\n 'kb quality:health --package @kb-labs/core',\n 'kb quality:health --json',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:fix-deps - Dependency auto-fixer\n // ======================================================================\n {\n id: 'fix-deps',\n group: 'quality',\n describe: 'Auto-fix dependency issues',\n longDescription:\n 'Automatically fixes dependency issues including removing unused deps, adding missing workspace deps, ' +\n 'and aligning duplicate versions. Supports --dry-run for previewing changes.',\n\n handler: './cli/commands/fix-deps.js#default',\n handlerPath: './cli/commands/fix-deps.js',\n\n flags: defineCommandFlags(fixDepsFlags),\n\n examples: [\n 'kb quality:fix-deps --stats',\n 'kb quality:fix-deps --remove-unused --dry-run',\n 'kb quality:fix-deps --align-versions',\n 'kb quality:fix-deps --all --dry-run',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:build-order - Calculate build order with topological sort\n // ======================================================================\n {\n id: 'build-order',\n group: 'quality',\n describe: 'Calculate build order using topological sort',\n longDescription:\n 'Analyzes package dependencies and calculates correct build order using topological sort. ' +\n 'Shows build layers where each layer can be built in parallel. Detects circular dependencies.',\n\n handler: './cli/commands/build-order.js#default',\n handlerPath: './cli/commands/build-order.js',\n\n flags: defineCommandFlags(buildOrderFlags),\n\n examples: [\n 'kb quality:build-order',\n 'kb quality:build-order --layers',\n 'kb quality:build-order --package @kb-labs/core',\n 'kb quality:build-order --script > build.sh',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:cycles - Detect circular dependencies\n // ======================================================================\n {\n id: 'cycles',\n group: 'quality',\n describe: 'Detect circular dependencies',\n longDescription:\n 'Uses DFS to find all circular dependency chains in the monorepo. ' +\n 'Shows complete dependency cycles with recommendations for breaking them.',\n\n handler: './cli/commands/cycles.js#default',\n handlerPath: './cli/commands/cycles.js',\n\n flags: defineCommandFlags(cyclesFlags),\n\n examples: [\n 'kb quality:cycles',\n 'kb quality:cycles --json',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:visualize - Visualize dependency graph\n // ======================================================================\n {\n id: 'visualize',\n group: 'quality',\n describe: 'Visualize dependency graph',\n longDescription:\n 'Visualize monorepo dependency graph in various formats: tree view, DOT format for graphviz, ' +\n 'reverse dependencies (who depends on this), impact analysis (what will be affected by changes), ' +\n 'and comprehensive graph statistics.',\n\n handler: './cli/commands/visualize.js#default',\n handlerPath: './cli/commands/visualize.js',\n\n flags: defineCommandFlags(visualizeFlags),\n\n examples: [\n 'kb quality:visualize --stats',\n 'kb quality:visualize --tree --package @kb-labs/core',\n 'kb quality:visualize --reverse --package @kb-labs/sdk',\n 'kb quality:visualize --impact --package @kb-labs/core',\n 'kb quality:visualize --dot > deps.dot',\n ],\n\n permissions: pluginPermissions,\n },\n\n // ======================================================================\n // quality:check-builds - Check build status across monorepo\n // ======================================================================\n {\n id: 'check-builds',\n group: 'quality',\n describe: 'Check build status across monorepo',\n longDescription:\n 'Analyzes build status across all packages with build scripts. ' +\n 'Detects build failures with error messages and stale builds (dist/ older than src/). ' +\n 'Results are cached for 10 minutes.',\n\n handler: './cli/commands/check-builds.js#default',\n handlerPath: './cli/commands/check-builds.js',\n\n flags: defineCommandFlags(checkBuildsFlags),\n\n examples: [\n 'kb quality:check-builds',\n 'kb quality:check-builds --package @kb-labs/core',\n 'kb quality:check-builds --timeout 60000',\n 'kb quality:check-builds --json',\n 'kb quality:check-builds --refresh',\n ],\n\n permissions: heavyOperationsPermissions,\n },\n\n // ======================================================================\n // quality:check-types - TypeScript type safety analysis\n // ======================================================================\n {\n id: 'check-types',\n group: 'quality',\n describe: 'Analyze TypeScript type safety across monorepo',\n longDescription:\n 'Analyzes TypeScript type errors, warnings, and type coverage using TypeScript Compiler API. ' +\n 'Detects any usage, @ts-ignore comments, and calculates type coverage percentage. ' +\n 'Results are cached for 10 minutes.',\n\n handler: './cli/commands/check-types.js#default',\n handlerPath: './cli/commands/check-types.js',\n\n flags: defineCommandFlags(checkTypesFlags),\n\n examples: [\n 'kb quality:check-types',\n 'kb quality:check-types --package @kb-labs/core',\n 'kb quality:check-types --errors-only',\n 'kb quality:check-types --json',\n 'kb quality:check-types --refresh',\n ],\n\n permissions: heavyOperationsPermissions,\n },\n\n // ======================================================================\n // quality:check-tests - Test execution and coverage tracking\n // ======================================================================\n {\n id: 'check-tests',\n group: 'quality',\n describe: 'Run tests and track coverage across monorepo',\n longDescription:\n 'Runs tests across all packages with test scripts and collects coverage statistics. ' +\n 'Parses test output (vitest/jest) to extract test counts and reads coverage-summary.json. ' +\n 'Results are cached for 5 minutes.',\n\n handler: './cli/commands/check-tests.js#default',\n handlerPath: './cli/commands/check-tests.js',\n\n flags: defineCommandFlags(checkTestsFlags),\n\n examples: [\n 'kb quality:check-tests',\n 'kb quality:check-tests --package @kb-labs/core',\n 'kb quality:check-tests --with-coverage',\n 'kb quality:check-tests --coverage-only',\n 'kb quality:check-tests --timeout 120000',\n 'kb quality:check-tests --json',\n ],\n\n permissions: heavyOperationsPermissions,\n },\n\n // ======================================================================\n // quality:dead-code - Dead code file detection\n // ======================================================================\n {\n id: 'dead-code',\n group: 'quality',\n describe: 'Detect dead (unreachable) source files',\n longDescription:\n 'Analyzes import graph to find source files not reachable from any entry point ' +\n '(package.json, tsup.config.ts, manifest.ts). Supports automated removal with ' +\n 'backup and restore capabilities. Zero false positives by design.',\n\n handler: './cli/commands/dead-code.js#default',\n handlerPath: './cli/commands/dead-code.js',\n\n flags: defineCommandFlags(deadCodeFlags),\n\n examples: [\n 'kb quality:dead-code',\n 'kb quality:dead-code --package @kb-labs/core',\n 'kb quality:dead-code --auto-remove --dry-run',\n 'kb quality:dead-code --auto-remove',\n 'kb quality:dead-code --list-backups',\n 'kb quality:dead-code --restore 2026-02-15T10-30-00',\n 'kb quality:dead-code --json',\n ],\n\n permissions: pluginPermissions,\n },\n ],\n },\n\n // REST API routes\n rest: {\n basePath: QUALITY_BASE_PATH,\n routes: [\n // GET /stats\n {\n method: 'GET',\n path: QUALITY_ROUTES.STATS,\n handler: './rest/handlers/stats-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#StatsRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#StatsResponseSchema',\n },\n },\n // GET /health\n {\n method: 'GET',\n path: QUALITY_ROUTES.HEALTH,\n handler: './rest/handlers/health-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#HealthRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#HealthResponseSchema',\n },\n },\n // GET /dependencies\n {\n method: 'GET',\n path: QUALITY_ROUTES.DEPENDENCIES,\n handler: './rest/handlers/dependencies-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#DependenciesRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#DependenciesResponseSchema',\n },\n },\n // GET /build-order\n {\n method: 'GET',\n path: QUALITY_ROUTES.BUILD_ORDER,\n handler: './rest/handlers/build-order-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#BuildOrderRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#BuildOrderResponseSchema',\n },\n },\n // GET /cycles\n {\n method: 'GET',\n path: QUALITY_ROUTES.CYCLES,\n handler: './rest/handlers/cycles-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#CyclesRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#CyclesResponseSchema',\n },\n },\n // GET /graph\n {\n method: 'GET',\n path: QUALITY_ROUTES.GRAPH,\n handler: './rest/handlers/graph-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#GraphRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#GraphResponseSchema',\n },\n },\n // GET /stale\n {\n method: 'GET',\n path: QUALITY_ROUTES.STALE,\n handler: './rest/handlers/stale-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#StaleRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#StaleResponseSchema',\n },\n },\n // GET /builds\n {\n method: 'GET',\n path: QUALITY_ROUTES.BUILDS,\n handler: './rest/handlers/builds-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#BuildsRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#BuildsResponseSchema',\n },\n },\n // GET /types\n {\n method: 'GET',\n path: QUALITY_ROUTES.TYPES,\n handler: './rest/handlers/types-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#TypesRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#TypesResponseSchema',\n },\n },\n // GET /tests\n {\n method: 'GET',\n path: QUALITY_ROUTES.TESTS,\n handler: './rest/handlers/tests-handler.js#default',\n input: {\n zod: '@kb-labs/quality-contracts#TestsRequestSchema',\n },\n output: {\n zod: '@kb-labs/quality-contracts#TestsResponseSchema',\n },\n },\n ],\n },\n\n // Studio V2 — Module Federation pages\n studio: {\n version: 2 as const,\n remoteName: 'qualityPlugin',\n pages: [\n {\n id: 'quality.overview',\n title: 'Quality',\n icon: 'CheckCircleOutlined',\n route: '/p/quality',\n entry: './QualityOverview',\n order: 1,\n },\n ],\n menus: [\n {\n id: 'quality',\n label: 'Quality',\n icon: 'CheckCircleOutlined',\n target: 'quality.overview',\n order: 40,\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}