@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":"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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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI Entry Point - behavioral contract verification tool
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}