@behavioral-contracts/verify-cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +119 -0
  2. package/README.md +694 -0
  3. package/dist/analyze-results.js +253 -0
  4. package/dist/analyzer.d.ts +366 -0
  5. package/dist/analyzer.d.ts.map +1 -0
  6. package/dist/analyzer.js +2592 -0
  7. package/dist/analyzer.js.map +1 -0
  8. package/dist/analyzers/async-error-analyzer.d.ts +72 -0
  9. package/dist/analyzers/async-error-analyzer.d.ts.map +1 -0
  10. package/dist/analyzers/async-error-analyzer.js +243 -0
  11. package/dist/analyzers/async-error-analyzer.js.map +1 -0
  12. package/dist/analyzers/event-listener-analyzer.d.ts +102 -0
  13. package/dist/analyzers/event-listener-analyzer.d.ts.map +1 -0
  14. package/dist/analyzers/event-listener-analyzer.js +253 -0
  15. package/dist/analyzers/event-listener-analyzer.js.map +1 -0
  16. package/dist/analyzers/react-query-analyzer.d.ts +66 -0
  17. package/dist/analyzers/react-query-analyzer.d.ts.map +1 -0
  18. package/dist/analyzers/react-query-analyzer.js +341 -0
  19. package/dist/analyzers/react-query-analyzer.js.map +1 -0
  20. package/dist/analyzers/return-value-analyzer.d.ts +61 -0
  21. package/dist/analyzers/return-value-analyzer.d.ts.map +1 -0
  22. package/dist/analyzers/return-value-analyzer.js +225 -0
  23. package/dist/analyzers/return-value-analyzer.js.map +1 -0
  24. package/dist/code-snippet.d.ts +48 -0
  25. package/dist/code-snippet.d.ts.map +1 -0
  26. package/dist/code-snippet.js +84 -0
  27. package/dist/code-snippet.js.map +1 -0
  28. package/dist/corpus-loader.d.ts +33 -0
  29. package/dist/corpus-loader.d.ts.map +1 -0
  30. package/dist/corpus-loader.js +155 -0
  31. package/dist/corpus-loader.js.map +1 -0
  32. package/dist/fixture-tester.d.ts +28 -0
  33. package/dist/fixture-tester.d.ts.map +1 -0
  34. package/dist/fixture-tester.js +176 -0
  35. package/dist/fixture-tester.js.map +1 -0
  36. package/dist/index.d.ts +6 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +375 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/package-discovery.d.ts +62 -0
  41. package/dist/package-discovery.d.ts.map +1 -0
  42. package/dist/package-discovery.js +299 -0
  43. package/dist/package-discovery.js.map +1 -0
  44. package/dist/reporter.d.ts +43 -0
  45. package/dist/reporter.d.ts.map +1 -0
  46. package/dist/reporter.js +347 -0
  47. package/dist/reporter.js.map +1 -0
  48. package/dist/reporters/benchmarking.d.ts +70 -0
  49. package/dist/reporters/benchmarking.d.ts.map +1 -0
  50. package/dist/reporters/benchmarking.js +191 -0
  51. package/dist/reporters/benchmarking.js.map +1 -0
  52. package/dist/reporters/d3-visualizer.d.ts +40 -0
  53. package/dist/reporters/d3-visualizer.d.ts.map +1 -0
  54. package/dist/reporters/d3-visualizer.js +803 -0
  55. package/dist/reporters/d3-visualizer.js.map +1 -0
  56. package/dist/reporters/health-score.d.ts +33 -0
  57. package/dist/reporters/health-score.d.ts.map +1 -0
  58. package/dist/reporters/health-score.js +149 -0
  59. package/dist/reporters/health-score.js.map +1 -0
  60. package/dist/reporters/index.d.ts +11 -0
  61. package/dist/reporters/index.d.ts.map +1 -0
  62. package/dist/reporters/index.js +11 -0
  63. package/dist/reporters/index.js.map +1 -0
  64. package/dist/reporters/package-breakdown.d.ts +48 -0
  65. package/dist/reporters/package-breakdown.d.ts.map +1 -0
  66. package/dist/reporters/package-breakdown.js +185 -0
  67. package/dist/reporters/package-breakdown.js.map +1 -0
  68. package/dist/reporters/positive-evidence.d.ts +42 -0
  69. package/dist/reporters/positive-evidence.d.ts.map +1 -0
  70. package/dist/reporters/positive-evidence.js +436 -0
  71. package/dist/reporters/positive-evidence.js.map +1 -0
  72. package/dist/tsconfig-generator.d.ts +17 -0
  73. package/dist/tsconfig-generator.d.ts.map +1 -0
  74. package/dist/tsconfig-generator.js +107 -0
  75. package/dist/tsconfig-generator.js.map +1 -0
  76. package/dist/types.d.ts +298 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +5 -0
  79. package/dist/types.js.map +1 -0
  80. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d3-visualizer.js","sourceRoot":"","sources":["../../src/reporters/d3-visualizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Health Score Calculator - Positive Evidence Metrics
3
+ *
4
+ * Calculates metrics that show value even when zero violations are found.
5
+ * Focuses on "what DID pass" rather than just "what failed".
6
+ */
7
+ import type { AuditRecord, EnhancedAuditRecord } from '../types.js';
8
+ export interface HealthMetrics {
9
+ overallScore: number;
10
+ errorHandlingCompliance: number;
11
+ packageCoverage: number;
12
+ codeMaturity: 'LOW' | 'MEDIUM' | 'HIGH';
13
+ riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL';
14
+ checksPerformed: number;
15
+ checksPassed: number;
16
+ checksPassedPercent: number;
17
+ hasGlobalErrorHandlers: boolean;
18
+ hasConsistentPatterns: boolean;
19
+ violationsPerKLOC?: number;
20
+ }
21
+ /**
22
+ * Calculate health score from audit record
23
+ */
24
+ export declare function calculateHealthScore(audit: AuditRecord | EnhancedAuditRecord): HealthMetrics;
25
+ /**
26
+ * Calculate violations per 1,000 lines of code (if LOC available)
27
+ */
28
+ export declare function calculateViolationsPerKLOC(violations: number, linesOfCode: number): number;
29
+ /**
30
+ * Format health score for display
31
+ */
32
+ export declare function formatHealthScore(metrics: HealthMetrics): string;
33
+ //# sourceMappingURL=health-score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-score.d.ts","sourceRoot":"","sources":["../../src/reporters/health-score.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,MAAM,CAAC;IAGrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAGlD,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAG5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,qBAAqB,EAAE,OAAO,CAAC;IAG/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,GAAG,mBAAmB,GACvC,aAAa,CA0Cf;AAoED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAWhE"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Health Score Calculator - Positive Evidence Metrics
3
+ *
4
+ * Calculates metrics that show value even when zero violations are found.
5
+ * Focuses on "what DID pass" rather than just "what failed".
6
+ */
7
+ /**
8
+ * Calculate health score from audit record
9
+ */
10
+ export function calculateHealthScore(audit) {
11
+ const totalChecks = audit.contracts_applied;
12
+ const violations = audit.violations.length;
13
+ const checksPassed = totalChecks - violations;
14
+ // Error handling compliance: What % of checks passed?
15
+ const errorHandlingCompliance = totalChecks > 0
16
+ ? (checksPassed / totalChecks) * 100
17
+ : 100;
18
+ // Package coverage: What % of packages have contracts?
19
+ const enhanced = audit;
20
+ const packageCoverage = enhanced.package_discovery
21
+ ? (enhanced.package_discovery.withContracts / enhanced.package_discovery.total) * 100
22
+ : 0;
23
+ // Code maturity (based on error handling compliance)
24
+ const codeMaturity = getCodeMaturity(errorHandlingCompliance);
25
+ // Risk level (based on violation count and severity)
26
+ const riskLevel = getRiskLevel(audit);
27
+ // Overall composite score
28
+ // Weighted: Error handling (70%), Package coverage (30%)
29
+ const overallScore = (errorHandlingCompliance * 0.7) + (packageCoverage * 0.3);
30
+ // Pattern detection (simplified for now)
31
+ const hasGlobalErrorHandlers = detectGlobalErrorHandlers(audit);
32
+ const hasConsistentPatterns = detectConsistentPatterns(audit);
33
+ return {
34
+ overallScore: Math.round(overallScore),
35
+ errorHandlingCompliance: Math.round(errorHandlingCompliance),
36
+ packageCoverage: Math.round(packageCoverage),
37
+ codeMaturity,
38
+ riskLevel,
39
+ checksPerformed: totalChecks,
40
+ checksPassed,
41
+ checksPassedPercent: Math.round(errorHandlingCompliance),
42
+ hasGlobalErrorHandlers,
43
+ hasConsistentPatterns,
44
+ };
45
+ }
46
+ /**
47
+ * Determine code maturity level
48
+ */
49
+ function getCodeMaturity(compliance) {
50
+ if (compliance >= 95)
51
+ return 'HIGH';
52
+ if (compliance >= 80)
53
+ return 'MEDIUM';
54
+ return 'LOW';
55
+ }
56
+ /**
57
+ * Determine risk level based on violations
58
+ */
59
+ function getRiskLevel(audit) {
60
+ const errorCount = audit.violations.filter(v => v.severity === 'error').length;
61
+ const warningCount = audit.violations.filter(v => v.severity === 'warning').length;
62
+ // Risk matrix
63
+ if (errorCount === 0 && warningCount === 0)
64
+ return 'LOW';
65
+ if (errorCount === 0 && warningCount < 5)
66
+ return 'LOW';
67
+ if (errorCount < 5)
68
+ return 'MEDIUM';
69
+ if (errorCount < 20)
70
+ return 'HIGH';
71
+ return 'CRITICAL';
72
+ }
73
+ /**
74
+ * Detect if repo has global error handlers (positive pattern)
75
+ *
76
+ * This is a simplified heuristic - looks for common global error handling setups.
77
+ * Future enhancement: Actually parse code to detect these patterns.
78
+ */
79
+ function detectGlobalErrorHandlers(audit) {
80
+ // Check for axios interceptors (positive pattern)
81
+ const hasAxiosInterceptors = audit.violations.some(v => v.package === 'axios' &&
82
+ v.description.includes('interceptor'));
83
+ // Check for global query cache handlers in React Query
84
+ const hasReactQueryGlobalHandlers = audit.violations.some(v => v.package === '@tanstack/react-query' &&
85
+ v.description.includes('QueryCache'));
86
+ // If we have many checks but few violations, likely has global handlers
87
+ const hasHighCompliance = audit.contracts_applied > 50 && audit.violations.length < 5;
88
+ return hasAxiosInterceptors || hasReactQueryGlobalHandlers || hasHighCompliance;
89
+ }
90
+ /**
91
+ * Detect if error handling patterns are consistent (positive pattern)
92
+ *
93
+ * Simplified: If violations are low despite many checks, patterns are likely consistent.
94
+ * Future: Analyze actual error handling code for style consistency.
95
+ */
96
+ function detectConsistentPatterns(audit) {
97
+ // If high compliance, patterns are likely consistent
98
+ const checksPerformed = audit.contracts_applied;
99
+ const violations = audit.violations.length;
100
+ if (checksPerformed < 10)
101
+ return false; // Too few to judge
102
+ const complianceRate = (checksPerformed - violations) / checksPerformed;
103
+ return complianceRate >= 0.90; // 90%+ compliance = consistent patterns
104
+ }
105
+ /**
106
+ * Calculate violations per 1,000 lines of code (if LOC available)
107
+ */
108
+ export function calculateViolationsPerKLOC(violations, linesOfCode) {
109
+ if (linesOfCode === 0)
110
+ return 0;
111
+ return (violations / linesOfCode) * 1000;
112
+ }
113
+ /**
114
+ * Format health score for display
115
+ */
116
+ export function formatHealthScore(metrics) {
117
+ const scoreColor = getScoreColor(metrics.overallScore);
118
+ const riskColor = getRiskColor(metrics.riskLevel);
119
+ return `
120
+ Health Score: ${scoreColor}${metrics.overallScore}/100${resetColor()}
121
+ • Error Handling Compliance: ${metrics.errorHandlingCompliance}%
122
+ • Package Coverage: ${metrics.packageCoverage}%
123
+ • Code Maturity: ${metrics.codeMaturity}
124
+ • Risk Level: ${riskColor}${metrics.riskLevel}${resetColor()}
125
+ `;
126
+ }
127
+ /**
128
+ * ANSI color helpers
129
+ */
130
+ function getScoreColor(score) {
131
+ if (score >= 90)
132
+ return '\x1b[32m'; // Green
133
+ if (score >= 70)
134
+ return '\x1b[33m'; // Yellow
135
+ return '\x1b[31m'; // Red
136
+ }
137
+ function getRiskColor(risk) {
138
+ if (risk === 'LOW')
139
+ return '\x1b[32m'; // Green
140
+ if (risk === 'MEDIUM')
141
+ return '\x1b[33m'; // Yellow
142
+ if (risk === 'HIGH')
143
+ return '\x1b[31m'; // Red
144
+ return '\x1b[35m'; // Magenta for CRITICAL
145
+ }
146
+ function resetColor() {
147
+ return '\x1b[0m';
148
+ }
149
+ //# sourceMappingURL=health-score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-score.js","sourceRoot":"","sources":["../../src/reporters/health-score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reporters Module - Positive Evidence Reporting
3
+ *
4
+ * Export all reporting functionality for external use
5
+ */
6
+ export { calculateHealthScore, calculateViolationsPerKLOC, formatHealthScore, type HealthMetrics, } from './health-score.js';
7
+ export { buildPackageBreakdown, formatPackageBreakdown, getTopPackages, getFailingPackages, getPassingPackages, type PackageUsageStats, type PackageBreakdownSummary, } from './package-breakdown.js';
8
+ export { calculateBenchmark, compareAgainstBenchmark, formatBenchmarkComparison, loadBenchmark, saveBenchmark, type BenchmarkData, type ComparisonMetrics, } from './benchmarking.js';
9
+ export { generatePositiveEvidenceReport, printPositiveEvidenceReport, writePositiveEvidenceReport, writePositiveEvidenceReportMarkdown, type PositiveEvidenceReportOptions, type PositiveEvidenceReport, } from './positive-evidence.js';
10
+ export { generateD3Dashboard, writeD3Visualization, type D3VisualizationData, } from './d3-visualizer.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC3B,2BAA2B,EAC3B,mCAAmC,EACnC,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Reporters Module - Positive Evidence Reporting
3
+ *
4
+ * Export all reporting functionality for external use
5
+ */
6
+ export { calculateHealthScore, calculateViolationsPerKLOC, formatHealthScore, } from './health-score.js';
7
+ export { buildPackageBreakdown, formatPackageBreakdown, getTopPackages, getFailingPackages, getPassingPackages, } from './package-breakdown.js';
8
+ export { calculateBenchmark, compareAgainstBenchmark, formatBenchmarkComparison, loadBenchmark, saveBenchmark, } from './benchmarking.js';
9
+ export { generatePositiveEvidenceReport, printPositiveEvidenceReport, writePositiveEvidenceReport, writePositiveEvidenceReportMarkdown, } from './positive-evidence.js';
10
+ export { generateD3Dashboard, writeD3Visualization, } from './d3-visualizer.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,aAAa,GAGd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC3B,2BAA2B,EAC3B,mCAAmC,GAGpC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Package Breakdown Analyzer
3
+ *
4
+ * Shows per-package usage statistics - what was checked and what passed.
5
+ * The goal is to prove value by showing all the work that was done, not just errors found.
6
+ */
7
+ import type { AuditRecord, EnhancedAuditRecord } from '../types.js';
8
+ export interface PackageUsageStats {
9
+ packageName: string;
10
+ contractsApplied: number;
11
+ violationsFound: number;
12
+ checksPassedCount: number;
13
+ status: 'PASS' | 'FAIL';
14
+ compliancePercent: number;
15
+ violationBreakdown: {
16
+ errors: number;
17
+ warnings: number;
18
+ info: number;
19
+ };
20
+ }
21
+ export interface PackageBreakdownSummary {
22
+ packages: PackageUsageStats[];
23
+ totalPackagesAnalyzed: number;
24
+ packagesWithContracts: number;
25
+ packagesWithViolations: number;
26
+ packagesFullyCompliant: number;
27
+ }
28
+ /**
29
+ * Build package breakdown from audit record
30
+ */
31
+ export declare function buildPackageBreakdown(audit: AuditRecord | EnhancedAuditRecord): PackageBreakdownSummary;
32
+ /**
33
+ * Format package breakdown for terminal display
34
+ */
35
+ export declare function formatPackageBreakdown(breakdown: PackageBreakdownSummary): string;
36
+ /**
37
+ * Get top N packages by usage (most checks applied)
38
+ */
39
+ export declare function getTopPackages(breakdown: PackageBreakdownSummary, limit: number): PackageUsageStats[];
40
+ /**
41
+ * Get only failing packages (with violations)
42
+ */
43
+ export declare function getFailingPackages(breakdown: PackageBreakdownSummary): PackageUsageStats[];
44
+ /**
45
+ * Get only passing packages (zero violations)
46
+ */
47
+ export declare function getPassingPackages(breakdown: PackageBreakdownSummary): PackageUsageStats[];
48
+ //# sourceMappingURL=package-breakdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-breakdown.d.ts","sourceRoot":"","sources":["../../src/reporters/package-breakdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAa,MAAM,aAAa,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,GAAG,mBAAmB,GACvC,uBAAuB,CAkDzB;AA4ED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,uBAAuB,GAAG,MAAM,CA6DjF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAErG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,uBAAuB,GAAG,iBAAiB,EAAE,CAE1F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,uBAAuB,GAAG,iBAAiB,EAAE,CAE1F"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Package Breakdown Analyzer
3
+ *
4
+ * Shows per-package usage statistics - what was checked and what passed.
5
+ * The goal is to prove value by showing all the work that was done, not just errors found.
6
+ */
7
+ /**
8
+ * Build package breakdown from audit record
9
+ */
10
+ export function buildPackageBreakdown(audit) {
11
+ // Group violations by package
12
+ const violationsByPackage = groupViolationsByPackage(audit.violations);
13
+ // Get list of all packages analyzed (with contracts)
14
+ const packagesWithContracts = getPackagesWithContracts(audit);
15
+ // Build stats for each package
16
+ const packages = packagesWithContracts.map(pkgName => {
17
+ const violations = violationsByPackage.get(pkgName) || [];
18
+ // Estimate contracts applied per package
19
+ // (This is approximate - exact tracking requires analyzer changes)
20
+ const contractsApplied = estimateContractsForPackage(pkgName, audit, violations);
21
+ const checksPassedCount = contractsApplied - violations.length;
22
+ const compliancePercent = contractsApplied > 0
23
+ ? (checksPassedCount / contractsApplied) * 100
24
+ : 100;
25
+ const violationBreakdown = {
26
+ errors: violations.filter(v => v.severity === 'error').length,
27
+ warnings: violations.filter(v => v.severity === 'warning').length,
28
+ info: violations.filter(v => v.severity === 'info').length,
29
+ };
30
+ return {
31
+ packageName: pkgName,
32
+ contractsApplied,
33
+ violationsFound: violations.length,
34
+ checksPassedCount,
35
+ status: violations.length === 0 ? 'PASS' : 'FAIL',
36
+ compliancePercent: Math.round(compliancePercent),
37
+ violationBreakdown,
38
+ };
39
+ });
40
+ // Sort by most checks applied (most interesting packages first)
41
+ packages.sort((a, b) => b.contractsApplied - a.contractsApplied);
42
+ const packagesWithViolations = packages.filter(p => p.violationsFound > 0).length;
43
+ const packagesFullyCompliant = packages.filter(p => p.violationsFound === 0).length;
44
+ return {
45
+ packages,
46
+ totalPackagesAnalyzed: audit.packages_analyzed.length,
47
+ packagesWithContracts: packagesWithContracts.length,
48
+ packagesWithViolations,
49
+ packagesFullyCompliant,
50
+ };
51
+ }
52
+ /**
53
+ * Group violations by package name
54
+ */
55
+ function groupViolationsByPackage(violations) {
56
+ const grouped = new Map();
57
+ for (const violation of violations) {
58
+ const pkgName = violation.package;
59
+ if (!grouped.has(pkgName)) {
60
+ grouped.set(pkgName, []);
61
+ }
62
+ grouped.get(pkgName).push(violation);
63
+ }
64
+ return grouped;
65
+ }
66
+ /**
67
+ * Get list of packages that have contracts (were actually analyzed)
68
+ */
69
+ function getPackagesWithContracts(audit) {
70
+ const enhanced = audit;
71
+ // If we have package discovery data, use it
72
+ if (enhanced.package_discovery) {
73
+ return enhanced.package_discovery.packages
74
+ .filter(p => p.hasContract)
75
+ .map(p => p.name);
76
+ }
77
+ // Fallback: Get unique packages from violations + packages_analyzed
78
+ // (packages_analyzed includes all packages checked, even those with no violations)
79
+ // Filter to only packages we actually have contracts for
80
+ // (heuristic: if in packages_analyzed list, we have a contract)
81
+ return audit.packages_analyzed.filter(pkg => pkg !== '');
82
+ }
83
+ /**
84
+ * Estimate contracts applied for a specific package
85
+ *
86
+ * This is approximate - exact tracking requires analyzer to count each check.
87
+ * For now, we estimate based on:
88
+ * 1. Number of violations found (minimum)
89
+ * 2. Proportional share of total contracts applied
90
+ */
91
+ function estimateContractsForPackage(packageName, audit, violations) {
92
+ const enhanced = audit;
93
+ // If we have violations_by_package (enhanced record), use that data
94
+ if (enhanced.violations_by_package && enhanced.violations_by_package[packageName]) {
95
+ // We know violations, estimate total checks as violations + estimate of passing checks
96
+ // Heuristic: For every violation, there are likely 3-5 passing checks
97
+ // (This is conservative - real ratio could be higher)
98
+ const estimatedPassingChecks = violations.length * 4;
99
+ return violations.length + estimatedPassingChecks;
100
+ }
101
+ // Fallback: Distribute total contracts_applied proportionally
102
+ const packagesWithContracts = getPackagesWithContracts(audit);
103
+ const totalPackages = packagesWithContracts.length;
104
+ if (totalPackages === 0)
105
+ return violations.length;
106
+ // Simple proportional estimate
107
+ const avgContractsPerPackage = Math.floor(audit.contracts_applied / totalPackages);
108
+ // Use at least the violation count (we know we checked those)
109
+ return Math.max(violations.length, avgContractsPerPackage);
110
+ }
111
+ /**
112
+ * Format package breakdown for terminal display
113
+ */
114
+ export function formatPackageBreakdown(breakdown) {
115
+ const lines = [];
116
+ lines.push('\nšŸ” PACKAGE USAGE BREAKDOWN');
117
+ lines.push('─'.repeat(80));
118
+ if (breakdown.packages.length === 0) {
119
+ lines.push(' No packages with contracts found.');
120
+ return lines.join('\n');
121
+ }
122
+ // Show each package
123
+ for (const pkg of breakdown.packages) {
124
+ const statusIcon = pkg.status === 'PASS' ? 'āœ“' : 'āœ—';
125
+ const statusColor = pkg.status === 'PASS' ? '\x1b[32m' : '\x1b[31m';
126
+ const reset = '\x1b[0m';
127
+ // Format package name (truncate if too long)
128
+ const pkgDisplay = pkg.packageName.length > 30
129
+ ? pkg.packageName.substring(0, 27) + '...'
130
+ : pkg.packageName.padEnd(30);
131
+ // Build status line
132
+ const statusLine = [
133
+ ` ${pkgDisplay}`,
134
+ `${statusColor}${statusIcon}${reset}`,
135
+ `${pkg.contractsApplied.toString().padStart(4)} checks`,
136
+ `${pkg.violationsFound.toString().padStart(3)} issues`,
137
+ `${pkg.compliancePercent}% pass`,
138
+ ].join(' ');
139
+ lines.push(statusLine);
140
+ // If violations exist, show breakdown
141
+ if (pkg.violationsFound > 0) {
142
+ const breakdown = [];
143
+ if (pkg.violationBreakdown.errors > 0) {
144
+ breakdown.push(`${pkg.violationBreakdown.errors} errors`);
145
+ }
146
+ if (pkg.violationBreakdown.warnings > 0) {
147
+ breakdown.push(`${pkg.violationBreakdown.warnings} warnings`);
148
+ }
149
+ if (pkg.violationBreakdown.info > 0) {
150
+ breakdown.push(`${pkg.violationBreakdown.info} info`);
151
+ }
152
+ if (breakdown.length > 0) {
153
+ lines.push(` ↳ ${breakdown.join(', ')}`);
154
+ }
155
+ }
156
+ }
157
+ // Summary stats
158
+ lines.push('');
159
+ lines.push(` Total packages analyzed: ${breakdown.totalPackagesAnalyzed}`);
160
+ lines.push(` Packages with contracts: ${breakdown.packagesWithContracts}`);
161
+ lines.push(` Fully compliant: ${breakdown.packagesFullyCompliant} āœ“`);
162
+ if (breakdown.packagesWithViolations > 0) {
163
+ lines.push(` With violations: ${breakdown.packagesWithViolations} āœ—`);
164
+ }
165
+ return lines.join('\n');
166
+ }
167
+ /**
168
+ * Get top N packages by usage (most checks applied)
169
+ */
170
+ export function getTopPackages(breakdown, limit) {
171
+ return breakdown.packages.slice(0, limit);
172
+ }
173
+ /**
174
+ * Get only failing packages (with violations)
175
+ */
176
+ export function getFailingPackages(breakdown) {
177
+ return breakdown.packages.filter(p => p.status === 'FAIL');
178
+ }
179
+ /**
180
+ * Get only passing packages (zero violations)
181
+ */
182
+ export function getPassingPackages(breakdown) {
183
+ return breakdown.packages.filter(p => p.status === 'PASS');
184
+ }
185
+ //# sourceMappingURL=package-breakdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-breakdown.js","sourceRoot":"","sources":["../../src/reporters/package-breakdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Positive Evidence Reporter
3
+ *
4
+ * Generates reports that show value even when zero violations are found.
5
+ * Focus: "Here's what we checked and validated" vs "Here's what broke"
6
+ */
7
+ import type { AuditRecord, EnhancedAuditRecord } from '../types.js';
8
+ import { type HealthMetrics } from './health-score.js';
9
+ import { type PackageBreakdownSummary } from './package-breakdown.js';
10
+ import { type ComparisonMetrics } from './benchmarking.js';
11
+ export interface PositiveEvidenceReportOptions {
12
+ showHealthScore: boolean;
13
+ showPackageBreakdown: boolean;
14
+ showInsights: boolean;
15
+ showRecommendations: boolean;
16
+ showBenchmarking: boolean;
17
+ }
18
+ export interface PositiveEvidenceReport {
19
+ healthMetrics: HealthMetrics;
20
+ packageBreakdown: PackageBreakdownSummary;
21
+ benchmarking?: ComparisonMetrics;
22
+ insights: string[];
23
+ recommendations: string[];
24
+ formattedReport: string;
25
+ }
26
+ /**
27
+ * Generate complete positive evidence report
28
+ */
29
+ export declare function generatePositiveEvidenceReport(audit: AuditRecord | EnhancedAuditRecord, options?: PositiveEvidenceReportOptions): Promise<PositiveEvidenceReport>;
30
+ /**
31
+ * Print positive evidence report to console
32
+ */
33
+ export declare function printPositiveEvidenceReport(audit: AuditRecord | EnhancedAuditRecord, options?: PositiveEvidenceReportOptions): Promise<void>;
34
+ /**
35
+ * Write positive evidence report to file
36
+ */
37
+ export declare function writePositiveEvidenceReport(audit: AuditRecord | EnhancedAuditRecord, outputPath: string, options?: PositiveEvidenceReportOptions): Promise<void>;
38
+ /**
39
+ * Write positive evidence report to file as Markdown
40
+ */
41
+ export declare function writePositiveEvidenceReportMarkdown(audit: AuditRecord | EnhancedAuditRecord, outputPath: string, options?: PositiveEvidenceReportOptions): Promise<void>;
42
+ //# sourceMappingURL=positive-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"positive-evidence.d.ts","sourceRoot":"","sources":["../../src/reporters/positive-evidence.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,6BAA6B;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,WAAW,GAAG,mBAAmB,EACxC,OAAO,GAAE,6BAMR,GACA,OAAO,CAAC,sBAAsB,CAAC,CAsDjC;AAsQD;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,WAAW,GAAG,mBAAmB,EACxC,OAAO,CAAC,EAAE,6BAA6B,GACtC,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,WAAW,GAAG,mBAAmB,EACxC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,6BAA6B,GACtC,OAAO,CAAC,IAAI,CAAC,CAIf;AA4ID;;GAEG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,WAAW,GAAG,mBAAmB,EACxC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,6BAA6B,GACtC,OAAO,CAAC,IAAI,CAAC,CA+Bf"}