@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":"corpus-loader.js","sourceRoot":"","sources":["../src/corpus-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixture Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Validates actual analyzer violations against expected fixture outputs.
|
|
5
|
+
*/
|
|
6
|
+
import type { ExpectedViolations, FixtureTestResult } from '../../corpus/types/index.js';
|
|
7
|
+
import type { Violation } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Validates actual violations against expected patterns
|
|
10
|
+
*
|
|
11
|
+
* @param actual - Violations found by the analyzer
|
|
12
|
+
* @param expected - Expected violation patterns
|
|
13
|
+
* @returns Test result with pass/fail and discrepancies
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateFixtureViolations(actual: Violation[], expected: ExpectedViolations): FixtureTestResult;
|
|
16
|
+
/**
|
|
17
|
+
* Formats discrepancies for human-readable output
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatDiscrepancies(result: FixtureTestResult): string;
|
|
20
|
+
/**
|
|
21
|
+
* Groups violations by function name for easier analysis
|
|
22
|
+
*/
|
|
23
|
+
export declare function groupViolationsByFunction(violations: Violation[]): Map<string, Violation[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Helper for analyzing violation patterns (useful for creating expectations)
|
|
26
|
+
*/
|
|
27
|
+
export declare function analyzeViolationPatterns(violations: Violation[]): void;
|
|
28
|
+
//# sourceMappingURL=fixture-tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture-tester.d.ts","sourceRoot":"","sources":["../src/fixture-tester.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAElB,iBAAiB,EAElB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,SAAS,EAAE,EACnB,QAAQ,EAAE,kBAAkB,GAC3B,iBAAiB,CAsBnB;AA0ID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAWrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAY3F;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAoBtE"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixture Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Validates actual analyzer violations against expected fixture outputs.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Validates actual violations against expected patterns
|
|
8
|
+
*
|
|
9
|
+
* @param actual - Violations found by the analyzer
|
|
10
|
+
* @param expected - Expected violation patterns
|
|
11
|
+
* @returns Test result with pass/fail and discrepancies
|
|
12
|
+
*/
|
|
13
|
+
export function validateFixtureViolations(actual, expected) {
|
|
14
|
+
const discrepancies = [];
|
|
15
|
+
// Check summary counts
|
|
16
|
+
validateSummaryCounts(actual, expected, discrepancies);
|
|
17
|
+
// Check each individual expectation
|
|
18
|
+
for (const expectation of expected.expectations) {
|
|
19
|
+
if (expectation.pending) {
|
|
20
|
+
continue; // Skip pending expectations
|
|
21
|
+
}
|
|
22
|
+
validateExpectation(actual, expectation, discrepancies);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
fixtureFile: expected.fixtures,
|
|
26
|
+
passed: discrepancies.length === 0,
|
|
27
|
+
actualViolations: actual.length,
|
|
28
|
+
expectedViolations: expected.expectations.length,
|
|
29
|
+
discrepancies
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validates that violation counts match expected ranges
|
|
34
|
+
*/
|
|
35
|
+
function validateSummaryCounts(actual, expected, discrepancies) {
|
|
36
|
+
const errorCount = actual.filter(v => v.severity === 'error').length;
|
|
37
|
+
const warningCount = actual.filter(v => v.severity === 'warning').length;
|
|
38
|
+
const infoCount = actual.filter(v => v.severity === 'info').length;
|
|
39
|
+
const { expectedErrorCount, expectedWarningCount, expectedInfoCount } = expected.summary;
|
|
40
|
+
// Check error count
|
|
41
|
+
if (errorCount < expectedErrorCount.min || errorCount > expectedErrorCount.max) {
|
|
42
|
+
discrepancies.push({
|
|
43
|
+
type: 'count-mismatch',
|
|
44
|
+
message: `Error count: expected ${expectedErrorCount.min}-${expectedErrorCount.max}, got ${errorCount}`
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// Check warning count
|
|
48
|
+
if (warningCount < expectedWarningCount.min || warningCount > expectedWarningCount.max) {
|
|
49
|
+
discrepancies.push({
|
|
50
|
+
type: 'count-mismatch',
|
|
51
|
+
message: `Warning count: expected ${expectedWarningCount.min}-${expectedWarningCount.max}, got ${warningCount}`
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Check info count
|
|
55
|
+
if (infoCount < expectedInfoCount.min || infoCount > expectedInfoCount.max) {
|
|
56
|
+
discrepancies.push({
|
|
57
|
+
type: 'count-mismatch',
|
|
58
|
+
message: `Info count: expected ${expectedInfoCount.min}-${expectedInfoCount.max}, got ${infoCount}`
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validates a single expectation against actual violations
|
|
64
|
+
*/
|
|
65
|
+
function validateExpectation(actual, expectation, discrepancies) {
|
|
66
|
+
// Find matching violations
|
|
67
|
+
const matchingViolations = actual.filter(v => matchesExpectation(v, expectation));
|
|
68
|
+
const maxViolations = expectation.maxViolations ?? expectation.minViolations;
|
|
69
|
+
// Check if we have too few violations
|
|
70
|
+
if (matchingViolations.length < expectation.minViolations) {
|
|
71
|
+
discrepancies.push({
|
|
72
|
+
type: 'missing',
|
|
73
|
+
expectation,
|
|
74
|
+
message: `${expectation.id}: Expected at least ${expectation.minViolations} violations, found ${matchingViolations.length}${expectation.description ? ` (${expectation.description})` : ''}`
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Check if we have too many violations
|
|
78
|
+
if (matchingViolations.length > maxViolations) {
|
|
79
|
+
discrepancies.push({
|
|
80
|
+
type: 'unexpected',
|
|
81
|
+
expectation,
|
|
82
|
+
message: `${expectation.id}: Expected at most ${maxViolations} violations, found ${matchingViolations.length}${expectation.description ? ` (${expectation.description})` : ''}`
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Check line numbers (if specified)
|
|
86
|
+
if (expectation.approximateLines && matchingViolations.length > 0) {
|
|
87
|
+
const [minLine, maxLine] = expectation.approximateLines;
|
|
88
|
+
const tolerance = 5; // ±5 lines
|
|
89
|
+
const outOfRange = matchingViolations.filter(v => v.line < minLine - tolerance || v.line > maxLine + tolerance);
|
|
90
|
+
if (outOfRange.length > 0) {
|
|
91
|
+
for (const v of outOfRange) {
|
|
92
|
+
discrepancies.push({
|
|
93
|
+
type: 'wrong-line',
|
|
94
|
+
expectation,
|
|
95
|
+
actualViolation: v,
|
|
96
|
+
message: `${expectation.id}: Violation at line ${v.line} outside expected range [${minLine}, ${maxLine}] (±${tolerance})`
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Check severity (if violations found)
|
|
102
|
+
if (matchingViolations.length > 0) {
|
|
103
|
+
const wrongSeverity = matchingViolations.filter(v => v.severity !== expectation.severity);
|
|
104
|
+
if (wrongSeverity.length > 0) {
|
|
105
|
+
for (const v of wrongSeverity) {
|
|
106
|
+
discrepancies.push({
|
|
107
|
+
type: 'wrong-severity',
|
|
108
|
+
expectation,
|
|
109
|
+
actualViolation: v,
|
|
110
|
+
message: `${expectation.id}: Expected severity '${expectation.severity}', got '${v.severity}' at line ${v.line}`
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Checks if a violation matches an expectation
|
|
118
|
+
*/
|
|
119
|
+
function matchesExpectation(violation, expectation) {
|
|
120
|
+
// Check function name (if specified)
|
|
121
|
+
if (expectation.functionName && violation.function !== expectation.functionName) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
// Check if contract clause is in expected list
|
|
125
|
+
if (!expectation.expectedClauses.includes(violation.contract_clause)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Formats discrepancies for human-readable output
|
|
132
|
+
*/
|
|
133
|
+
export function formatDiscrepancies(result) {
|
|
134
|
+
if (result.discrepancies.length === 0) {
|
|
135
|
+
return ' No discrepancies - all expectations met! ✅';
|
|
136
|
+
}
|
|
137
|
+
const lines = result.discrepancies.map((d, index) => {
|
|
138
|
+
const prefix = ` ${index + 1}. [${d.type}]`;
|
|
139
|
+
return `${prefix} ${d.message}`;
|
|
140
|
+
});
|
|
141
|
+
return lines.join('\n');
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Groups violations by function name for easier analysis
|
|
145
|
+
*/
|
|
146
|
+
export function groupViolationsByFunction(violations) {
|
|
147
|
+
const groups = new Map();
|
|
148
|
+
for (const v of violations) {
|
|
149
|
+
const functionName = v.function || 'unknown';
|
|
150
|
+
if (!groups.has(functionName)) {
|
|
151
|
+
groups.set(functionName, []);
|
|
152
|
+
}
|
|
153
|
+
groups.get(functionName).push(v);
|
|
154
|
+
}
|
|
155
|
+
return groups;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Helper for analyzing violation patterns (useful for creating expectations)
|
|
159
|
+
*/
|
|
160
|
+
export function analyzeViolationPatterns(violations) {
|
|
161
|
+
console.log('\n=== Violation Analysis ===');
|
|
162
|
+
console.log(`Total violations: ${violations.length}\n`);
|
|
163
|
+
const byFunction = groupViolationsByFunction(violations);
|
|
164
|
+
for (const [functionName, viols] of byFunction.entries()) {
|
|
165
|
+
console.log(`Function: ${functionName}`);
|
|
166
|
+
console.log(` Violations: ${viols.length}`);
|
|
167
|
+
const clauses = [...new Set(viols.map(v => v.contract_clause))];
|
|
168
|
+
console.log(` Clauses: ${clauses.join(', ')}`);
|
|
169
|
+
const severities = [...new Set(viols.map(v => v.severity))];
|
|
170
|
+
console.log(` Severities: ${severities.join(', ')}`);
|
|
171
|
+
const lines = viols.map(v => v.line);
|
|
172
|
+
console.log(` Line range: ${Math.min(...lines)}-${Math.max(...lines)}`);
|
|
173
|
+
console.log('');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=fixture-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture-tester.js","sourceRoot":"","sources":["../src/fixture-tester.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI Entry Point - behavioral contract verification tool
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { loadCorpus } from './corpus-loader.js';
|
|
11
|
+
import { Analyzer } from './analyzer.js';
|
|
12
|
+
import { PackageDiscovery } from './package-discovery.js';
|
|
13
|
+
import { generateAuditRecord, generateEnhancedAuditRecord, writeAuditRecord, printTerminalReport, printEnhancedTerminalReport, printCorpusErrors, } from './reporter.js';
|
|
14
|
+
import { printPositiveEvidenceReport, writePositiveEvidenceReport, writePositiveEvidenceReportMarkdown, writeD3Visualization, calculateHealthScore, buildPackageBreakdown, compareAgainstBenchmark, loadBenchmark, } from './reporters/index.js';
|
|
15
|
+
import { ensureTsconfig } from './tsconfig-generator.js';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(__filename);
|
|
18
|
+
const program = new Command();
|
|
19
|
+
program
|
|
20
|
+
.name('verify-cli')
|
|
21
|
+
.description('Verify TypeScript code against behavioral contracts')
|
|
22
|
+
.version('0.1.0');
|
|
23
|
+
program
|
|
24
|
+
.option('--tsconfig <path>', 'Path to tsconfig.json or project directory (default: ./tsconfig.json)', './tsconfig.json')
|
|
25
|
+
.option('--corpus <path>', 'Path to corpus directory', findDefaultCorpusPath())
|
|
26
|
+
.option('--output <path>', 'Output path for audit record JSON (default: auto-generated in output/runs/)')
|
|
27
|
+
.option('--project <path>', 'Path to project root (for package.json discovery)', process.cwd())
|
|
28
|
+
.option('--no-terminal', 'Disable terminal output (JSON only)')
|
|
29
|
+
.option('--fail-on-warnings', 'Exit with error code if warnings are found')
|
|
30
|
+
.option('--discover-packages', 'Enable package discovery and coverage reporting', true)
|
|
31
|
+
.option('--include-tests', 'Include test files in analysis (default: excludes test files)', false)
|
|
32
|
+
.option('--include-drafts', 'Include draft and in-development contracts (default: excludes draft/in-development)', false)
|
|
33
|
+
.option('--include-deprecated', 'Include deprecated contracts (default: excludes deprecated)', false)
|
|
34
|
+
.option('--positive-report', 'Generate positive evidence report (default: true)', true)
|
|
35
|
+
.option('--no-positive-report', 'Disable positive evidence report')
|
|
36
|
+
.parse(process.argv);
|
|
37
|
+
const options = program.opts();
|
|
38
|
+
/**
|
|
39
|
+
* Find git repository root by walking up from a given path
|
|
40
|
+
*/
|
|
41
|
+
function findGitRepoRoot(startPath) {
|
|
42
|
+
let currentDir = path.dirname(path.resolve(startPath));
|
|
43
|
+
const root = path.parse(currentDir).root;
|
|
44
|
+
while (currentDir !== root) {
|
|
45
|
+
const gitPath = path.join(currentDir, '.git');
|
|
46
|
+
if (fs.existsSync(gitPath)) {
|
|
47
|
+
return currentDir;
|
|
48
|
+
}
|
|
49
|
+
currentDir = path.dirname(currentDir);
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get repository name from tsconfig path
|
|
55
|
+
* Walks up to find git repo root, then uses that directory name
|
|
56
|
+
*/
|
|
57
|
+
function getRepoNameFromTsconfig(tsconfigPath) {
|
|
58
|
+
// First, try to find git repo root
|
|
59
|
+
const gitRoot = findGitRepoRoot(tsconfigPath);
|
|
60
|
+
if (gitRoot) {
|
|
61
|
+
return path.basename(gitRoot);
|
|
62
|
+
}
|
|
63
|
+
// Fallback: look for package.json
|
|
64
|
+
let currentDir = path.dirname(path.resolve(tsconfigPath));
|
|
65
|
+
const root = path.parse(currentDir).root;
|
|
66
|
+
while (currentDir !== root) {
|
|
67
|
+
const packageJsonPath = path.join(currentDir, 'package.json');
|
|
68
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
69
|
+
return path.basename(currentDir);
|
|
70
|
+
}
|
|
71
|
+
currentDir = path.dirname(currentDir);
|
|
72
|
+
}
|
|
73
|
+
// Last resort: use directory name where tsconfig lives
|
|
74
|
+
const resolved = path.resolve(tsconfigPath);
|
|
75
|
+
const parts = resolved.split(path.sep);
|
|
76
|
+
return parts[parts.length - 2] || 'unknown-repo';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get git hash from the analyzed repository (not verify-cli)
|
|
80
|
+
*/
|
|
81
|
+
function getGitHashFromRepo(tsconfigPath) {
|
|
82
|
+
try {
|
|
83
|
+
const { execSync } = require('child_process');
|
|
84
|
+
// Get the directory containing the tsconfig (the repo root)
|
|
85
|
+
const repoDir = path.dirname(path.resolve(tsconfigPath));
|
|
86
|
+
// Run git command in the analyzed repo's directory
|
|
87
|
+
const gitHash = execSync('git rev-parse --short HEAD', {
|
|
88
|
+
cwd: repoDir,
|
|
89
|
+
encoding: 'utf-8',
|
|
90
|
+
}).trim();
|
|
91
|
+
return gitHash;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Not a git repo or git not available
|
|
95
|
+
return 'nogit';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Generate organized output path
|
|
100
|
+
*/
|
|
101
|
+
function generateOutputPath(tsconfigPath) {
|
|
102
|
+
const repoName = getRepoNameFromTsconfig(tsconfigPath);
|
|
103
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 19);
|
|
104
|
+
// Get git commit hash from the analyzed repo
|
|
105
|
+
const gitHash = getGitHashFromRepo(tsconfigPath);
|
|
106
|
+
const runDir = `${timestamp.replace(/T/, '-').replace(/-/g, '').substring(0, 13)}-${gitHash}`;
|
|
107
|
+
const outputDir = path.join(__dirname, '../output/runs', runDir, repoName);
|
|
108
|
+
// Create directory if it doesn't exist
|
|
109
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
110
|
+
return path.join(outputDir, 'audit.json');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Setup output logging to capture all terminal output to output.txt
|
|
114
|
+
*/
|
|
115
|
+
function setupOutputLogging(outputDir) {
|
|
116
|
+
const outputTxtPath = path.join(outputDir, 'output.txt');
|
|
117
|
+
const logStream = fs.createWriteStream(outputTxtPath, { flags: 'w' });
|
|
118
|
+
// Store original console methods
|
|
119
|
+
const originalLog = console.log;
|
|
120
|
+
const originalError = console.error;
|
|
121
|
+
// Strip ANSI codes for file output
|
|
122
|
+
const stripAnsi = (str) => str.replace(/\x1b\[[0-9;]*m/g, '');
|
|
123
|
+
// Override console.log
|
|
124
|
+
console.log = (...args) => {
|
|
125
|
+
const message = args.map(arg => typeof arg === 'string' ? arg : JSON.stringify(arg)).join(' ');
|
|
126
|
+
originalLog(...args); // Original output to terminal (with colors)
|
|
127
|
+
logStream.write(stripAnsi(message) + '\n'); // Clean output to file
|
|
128
|
+
};
|
|
129
|
+
// Override console.error
|
|
130
|
+
console.error = (...args) => {
|
|
131
|
+
const message = args.map(arg => typeof arg === 'string' ? arg : JSON.stringify(arg)).join(' ');
|
|
132
|
+
originalError(...args); // Original output to terminal (with colors)
|
|
133
|
+
logStream.write(stripAnsi(message) + '\n'); // Clean output to file
|
|
134
|
+
};
|
|
135
|
+
// Return cleanup function
|
|
136
|
+
return () => {
|
|
137
|
+
console.log = originalLog;
|
|
138
|
+
console.error = originalError;
|
|
139
|
+
logStream.end();
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Normalize tsconfig path (accept directory or file)
|
|
144
|
+
* If directory is provided, append /tsconfig.json
|
|
145
|
+
*/
|
|
146
|
+
function normalizeTsconfigPath(tsconfigPath) {
|
|
147
|
+
const resolved = path.resolve(tsconfigPath);
|
|
148
|
+
// If it's a directory, append tsconfig.json
|
|
149
|
+
if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
|
|
150
|
+
return path.join(resolved, 'tsconfig.json');
|
|
151
|
+
}
|
|
152
|
+
// Otherwise assume it's already pointing to tsconfig.json
|
|
153
|
+
return resolved;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Main execution
|
|
157
|
+
*/
|
|
158
|
+
async function main() {
|
|
159
|
+
console.log(chalk.bold('\nBehavioral Contract Verification\n'));
|
|
160
|
+
// Normalize tsconfig path (allow directory or file)
|
|
161
|
+
const tsconfigPath = normalizeTsconfigPath(options.tsconfig);
|
|
162
|
+
// Ensure tsconfig exists (generate if missing)
|
|
163
|
+
ensureTsconfig(tsconfigPath);
|
|
164
|
+
// Validate corpus exists
|
|
165
|
+
if (!fs.existsSync(options.corpus)) {
|
|
166
|
+
console.error(chalk.red(`Error: Corpus directory not found at ${options.corpus}`));
|
|
167
|
+
console.error(chalk.yellow('Tip: Use --corpus <path> to specify corpus location'));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
// Generate organized output path if not specified
|
|
171
|
+
const outputPath = options.output || generateOutputPath(tsconfigPath);
|
|
172
|
+
const outputDir = path.dirname(outputPath);
|
|
173
|
+
// Setup output logging (capture all terminal output to output.txt)
|
|
174
|
+
const cleanupLogging = setupOutputLogging(outputDir);
|
|
175
|
+
console.log(chalk.gray(` tsconfig: ${tsconfigPath}`));
|
|
176
|
+
console.log(chalk.gray(` corpus: ${options.corpus}`));
|
|
177
|
+
// Show corpus source (npm package vs local)
|
|
178
|
+
if (options.corpus === findDefaultCorpusPath()) {
|
|
179
|
+
try {
|
|
180
|
+
require.resolve('@behavioral-contracts/corpus');
|
|
181
|
+
console.log(chalk.dim(` (using npm package @behavioral-contracts/corpus)`));
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
console.log(chalk.dim(` (using local corpus for development)`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
console.log(chalk.dim(` (using custom corpus path)`));
|
|
189
|
+
}
|
|
190
|
+
console.log(chalk.gray(` output: ${outputPath}\n`));
|
|
191
|
+
// Load corpus
|
|
192
|
+
console.log(chalk.dim('Loading behavioral contracts...'));
|
|
193
|
+
const corpusResult = await loadCorpus(options.corpus, {
|
|
194
|
+
includeDrafts: options.includeDrafts,
|
|
195
|
+
includeDeprecated: options.includeDeprecated,
|
|
196
|
+
includeInDevelopment: options.includeDrafts, // in-development included with drafts
|
|
197
|
+
});
|
|
198
|
+
if (corpusResult.errors.length > 0) {
|
|
199
|
+
printCorpusErrors(corpusResult.errors);
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
if (corpusResult.contracts.size === 0) {
|
|
203
|
+
console.error(chalk.red('Error: No contracts loaded from corpus'));
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
console.log(chalk.green(`✓ Loaded ${corpusResult.contracts.size} package contracts`));
|
|
207
|
+
// Show skipped contracts (if any)
|
|
208
|
+
if (corpusResult.skipped && corpusResult.skipped.length > 0) {
|
|
209
|
+
const draftCount = corpusResult.skipped.filter(s => s.status === 'draft').length;
|
|
210
|
+
const inDevCount = corpusResult.skipped.filter(s => s.status === 'in-development').length;
|
|
211
|
+
const deprecatedCount = corpusResult.skipped.filter(s => s.status === 'deprecated').length;
|
|
212
|
+
const skippedParts = [];
|
|
213
|
+
if (draftCount > 0)
|
|
214
|
+
skippedParts.push(`${draftCount} draft`);
|
|
215
|
+
if (inDevCount > 0)
|
|
216
|
+
skippedParts.push(`${inDevCount} in-development`);
|
|
217
|
+
if (deprecatedCount > 0)
|
|
218
|
+
skippedParts.push(`${deprecatedCount} deprecated`);
|
|
219
|
+
console.log(chalk.dim(` (Skipped ${skippedParts.join(', ')} - use --include-drafts to include)`));
|
|
220
|
+
}
|
|
221
|
+
console.log();
|
|
222
|
+
// Discover packages (if enabled)
|
|
223
|
+
let packageDiscovery;
|
|
224
|
+
if (options.discoverPackages !== false) {
|
|
225
|
+
console.log(chalk.dim('Discovering packages...'));
|
|
226
|
+
const discoveryTool = new PackageDiscovery(corpusResult.contracts);
|
|
227
|
+
packageDiscovery = await discoveryTool.discoverPackages(options.project, path.resolve(tsconfigPath));
|
|
228
|
+
console.log(chalk.green(`✓ Discovered ${packageDiscovery.total} packages\n`));
|
|
229
|
+
}
|
|
230
|
+
// Create analyzer
|
|
231
|
+
const config = {
|
|
232
|
+
tsconfigPath: path.resolve(tsconfigPath),
|
|
233
|
+
corpusPath: path.resolve(options.corpus),
|
|
234
|
+
includeTests: options.includeTests,
|
|
235
|
+
};
|
|
236
|
+
console.log(chalk.dim('Analyzing TypeScript code...'));
|
|
237
|
+
const analyzer = new Analyzer(config, corpusResult.contracts);
|
|
238
|
+
// Run analysis
|
|
239
|
+
const violations = analyzer.analyze();
|
|
240
|
+
const stats = analyzer.getStats();
|
|
241
|
+
console.log(chalk.green(`✓ Analyzed ${stats.filesAnalyzed} files\n`));
|
|
242
|
+
// Generate audit record
|
|
243
|
+
const packagesAnalyzed = Array.from(corpusResult.contracts.keys());
|
|
244
|
+
const auditRecord = await generateAuditRecord(violations, {
|
|
245
|
+
tsconfigPath: options.tsconfig,
|
|
246
|
+
packagesAnalyzed,
|
|
247
|
+
contractsApplied: stats.contractsApplied,
|
|
248
|
+
filesAnalyzed: stats.filesAnalyzed,
|
|
249
|
+
corpusVersion: '1.0.0', // TODO: Read from corpus metadata
|
|
250
|
+
});
|
|
251
|
+
// Generate enhanced audit record if package discovery was run
|
|
252
|
+
const finalRecord = packageDiscovery
|
|
253
|
+
? generateEnhancedAuditRecord(auditRecord, packageDiscovery)
|
|
254
|
+
: auditRecord;
|
|
255
|
+
// Write JSON output
|
|
256
|
+
writeAuditRecord(finalRecord, outputPath);
|
|
257
|
+
console.log(chalk.gray(`Audit record written to ${outputPath}`));
|
|
258
|
+
// Print terminal report
|
|
259
|
+
if (options.terminal !== false) {
|
|
260
|
+
if (packageDiscovery) {
|
|
261
|
+
printEnhancedTerminalReport(finalRecord);
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
printTerminalReport(auditRecord);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Generate and print positive evidence report (default: on)
|
|
268
|
+
if (options.positiveReport !== false && options.terminal !== false) {
|
|
269
|
+
console.log(''); // Add spacing
|
|
270
|
+
const reportOptions = {
|
|
271
|
+
showHealthScore: true,
|
|
272
|
+
showPackageBreakdown: true,
|
|
273
|
+
showInsights: true,
|
|
274
|
+
showRecommendations: true,
|
|
275
|
+
showBenchmarking: true, // Phase 2 - now enabled!
|
|
276
|
+
};
|
|
277
|
+
await printPositiveEvidenceReport(finalRecord, reportOptions);
|
|
278
|
+
// Write positive evidence report to file (both .txt and .md)
|
|
279
|
+
const positiveReportTxtPath = path.join(outputDir, 'positive-report.txt');
|
|
280
|
+
const positiveReportMdPath = path.join(outputDir, 'positive-report.md');
|
|
281
|
+
await writePositiveEvidenceReport(finalRecord, positiveReportTxtPath, reportOptions);
|
|
282
|
+
await writePositiveEvidenceReportMarkdown(finalRecord, positiveReportMdPath, reportOptions);
|
|
283
|
+
// Generate D3.js interactive visualization
|
|
284
|
+
const d3HtmlPath = path.join(outputDir, 'index.html');
|
|
285
|
+
// Calculate metrics for D3 visualization
|
|
286
|
+
const healthMetrics = calculateHealthScore(finalRecord);
|
|
287
|
+
const packageBreakdown = buildPackageBreakdown(finalRecord);
|
|
288
|
+
// Load benchmark if available
|
|
289
|
+
let benchmarkComparison;
|
|
290
|
+
let benchmarkData;
|
|
291
|
+
try {
|
|
292
|
+
const benchmarkPath = path.join(__dirname, '../data/benchmarks.json');
|
|
293
|
+
benchmarkData = await loadBenchmark(benchmarkPath);
|
|
294
|
+
if (benchmarkData) {
|
|
295
|
+
benchmarkComparison = compareAgainstBenchmark(finalRecord, benchmarkData);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// Benchmark not available
|
|
300
|
+
}
|
|
301
|
+
await writeD3Visualization({
|
|
302
|
+
audit: finalRecord,
|
|
303
|
+
health: healthMetrics,
|
|
304
|
+
packageBreakdown,
|
|
305
|
+
benchmarking: benchmarkComparison,
|
|
306
|
+
benchmark: benchmarkData || undefined,
|
|
307
|
+
}, d3HtmlPath);
|
|
308
|
+
const outputTxtPath = path.join(outputDir, 'output.txt');
|
|
309
|
+
console.log(chalk.gray(`Reports written to:`));
|
|
310
|
+
console.log(chalk.gray(` - ${outputTxtPath} (full terminal output)`));
|
|
311
|
+
console.log(chalk.gray(` - ${positiveReportTxtPath}`));
|
|
312
|
+
console.log(chalk.gray(` - ${positiveReportMdPath}`));
|
|
313
|
+
console.log(chalk.green(` - ${d3HtmlPath} (interactive visualization)\n`));
|
|
314
|
+
}
|
|
315
|
+
// Cleanup logging
|
|
316
|
+
cleanupLogging();
|
|
317
|
+
// Exit with appropriate code
|
|
318
|
+
const hasErrors = auditRecord.summary.error_count > 0;
|
|
319
|
+
const hasWarnings = auditRecord.summary.warning_count > 0;
|
|
320
|
+
if (hasErrors) {
|
|
321
|
+
process.exit(1);
|
|
322
|
+
}
|
|
323
|
+
if (options.failOnWarnings && hasWarnings) {
|
|
324
|
+
process.exit(1);
|
|
325
|
+
}
|
|
326
|
+
process.exit(0);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Finds the default corpus path by trying:
|
|
330
|
+
* 1. Published npm package (@behavioral-contracts/corpus)
|
|
331
|
+
* 2. Local development paths (for contributors)
|
|
332
|
+
*/
|
|
333
|
+
function findDefaultCorpusPath() {
|
|
334
|
+
// Try 1: Use published npm package (production use)
|
|
335
|
+
try {
|
|
336
|
+
// Dynamic import to avoid issues if package not installed
|
|
337
|
+
const corpusModule = require('@behavioral-contracts/corpus');
|
|
338
|
+
const corpusPath = corpusModule.getCorpusPath();
|
|
339
|
+
if (fs.existsSync(corpusPath)) {
|
|
340
|
+
return corpusPath;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
// Package not installed - fall through to local paths
|
|
345
|
+
}
|
|
346
|
+
// Try 2: Look for local corpus repo (development use)
|
|
347
|
+
const possiblePaths = [
|
|
348
|
+
path.join(process.cwd(), '../corpus'),
|
|
349
|
+
path.join(process.cwd(), '../../corpus'),
|
|
350
|
+
path.join(__dirname, '../../corpus'),
|
|
351
|
+
];
|
|
352
|
+
for (const p of possiblePaths) {
|
|
353
|
+
if (fs.existsSync(path.join(p, 'packages'))) {
|
|
354
|
+
return p;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Fallback: assume npm package will be installed
|
|
358
|
+
// (This path will error if neither npm package nor local corpus exists)
|
|
359
|
+
return path.join(process.cwd(), '../corpus');
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Handle errors
|
|
363
|
+
*/
|
|
364
|
+
process.on('uncaughtException', (error) => {
|
|
365
|
+
console.error(chalk.red('\nUnexpected error:'));
|
|
366
|
+
console.error(error);
|
|
367
|
+
process.exit(1);
|
|
368
|
+
});
|
|
369
|
+
// Run
|
|
370
|
+
main().catch((error) => {
|
|
371
|
+
console.error(chalk.red('\nError during execution:'));
|
|
372
|
+
console.error(error);
|
|
373
|
+
process.exit(1);
|
|
374
|
+
});
|
|
375
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|