@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.
- package/LICENSE +119 -0
- package/README.md +694 -0
- package/dist/analyze-results.js +253 -0
- package/dist/analyzer.d.ts +366 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +2592 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/analyzers/async-error-analyzer.d.ts +72 -0
- package/dist/analyzers/async-error-analyzer.d.ts.map +1 -0
- package/dist/analyzers/async-error-analyzer.js +243 -0
- package/dist/analyzers/async-error-analyzer.js.map +1 -0
- package/dist/analyzers/event-listener-analyzer.d.ts +102 -0
- package/dist/analyzers/event-listener-analyzer.d.ts.map +1 -0
- package/dist/analyzers/event-listener-analyzer.js +253 -0
- package/dist/analyzers/event-listener-analyzer.js.map +1 -0
- package/dist/analyzers/react-query-analyzer.d.ts +66 -0
- package/dist/analyzers/react-query-analyzer.d.ts.map +1 -0
- package/dist/analyzers/react-query-analyzer.js +341 -0
- package/dist/analyzers/react-query-analyzer.js.map +1 -0
- package/dist/analyzers/return-value-analyzer.d.ts +61 -0
- package/dist/analyzers/return-value-analyzer.d.ts.map +1 -0
- package/dist/analyzers/return-value-analyzer.js +225 -0
- package/dist/analyzers/return-value-analyzer.js.map +1 -0
- package/dist/code-snippet.d.ts +48 -0
- package/dist/code-snippet.d.ts.map +1 -0
- package/dist/code-snippet.js +84 -0
- package/dist/code-snippet.js.map +1 -0
- package/dist/corpus-loader.d.ts +33 -0
- package/dist/corpus-loader.d.ts.map +1 -0
- package/dist/corpus-loader.js +155 -0
- package/dist/corpus-loader.js.map +1 -0
- package/dist/fixture-tester.d.ts +28 -0
- package/dist/fixture-tester.d.ts.map +1 -0
- package/dist/fixture-tester.js +176 -0
- package/dist/fixture-tester.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +375 -0
- package/dist/index.js.map +1 -0
- package/dist/package-discovery.d.ts +62 -0
- package/dist/package-discovery.d.ts.map +1 -0
- package/dist/package-discovery.js +299 -0
- package/dist/package-discovery.js.map +1 -0
- package/dist/reporter.d.ts +43 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +347 -0
- package/dist/reporter.js.map +1 -0
- package/dist/reporters/benchmarking.d.ts +70 -0
- package/dist/reporters/benchmarking.d.ts.map +1 -0
- package/dist/reporters/benchmarking.js +191 -0
- package/dist/reporters/benchmarking.js.map +1 -0
- package/dist/reporters/d3-visualizer.d.ts +40 -0
- package/dist/reporters/d3-visualizer.d.ts.map +1 -0
- package/dist/reporters/d3-visualizer.js +803 -0
- package/dist/reporters/d3-visualizer.js.map +1 -0
- package/dist/reporters/health-score.d.ts +33 -0
- package/dist/reporters/health-score.d.ts.map +1 -0
- package/dist/reporters/health-score.js +149 -0
- package/dist/reporters/health-score.js.map +1 -0
- package/dist/reporters/index.d.ts +11 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +11 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/package-breakdown.d.ts +48 -0
- package/dist/reporters/package-breakdown.d.ts.map +1 -0
- package/dist/reporters/package-breakdown.js +185 -0
- package/dist/reporters/package-breakdown.js.map +1 -0
- package/dist/reporters/positive-evidence.d.ts +42 -0
- package/dist/reporters/positive-evidence.d.ts.map +1 -0
- package/dist/reporters/positive-evidence.js +436 -0
- package/dist/reporters/positive-evidence.js.map +1 -0
- package/dist/tsconfig-generator.d.ts +17 -0
- package/dist/tsconfig-generator.d.ts.map +1 -0
- package/dist/tsconfig-generator.js +107 -0
- package/dist/tsconfig-generator.js.map +1 -0
- package/dist/types.d.ts +298 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- 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"}
|