circle-ir-ai 2.7.1 → 2.7.2

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 (146) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/package.json +2 -2
  3. package/dist/cli/args.d.ts +0 -86
  4. package/dist/cli/args.d.ts.map +0 -1
  5. package/dist/cli/args.js +0 -653
  6. package/dist/cli/args.js.map +0 -1
  7. package/dist/cli/colors.d.ts +0 -31
  8. package/dist/cli/colors.d.ts.map +0 -1
  9. package/dist/cli/colors.js +0 -80
  10. package/dist/cli/colors.js.map +0 -1
  11. package/dist/cli/commands/analyze-skill.d.ts +0 -33
  12. package/dist/cli/commands/analyze-skill.d.ts.map +0 -1
  13. package/dist/cli/commands/analyze-skill.js +0 -217
  14. package/dist/cli/commands/analyze-skill.js.map +0 -1
  15. package/dist/cli/commands/analyze.d.ts +0 -19
  16. package/dist/cli/commands/analyze.d.ts.map +0 -1
  17. package/dist/cli/commands/analyze.js +0 -303
  18. package/dist/cli/commands/analyze.js.map +0 -1
  19. package/dist/cli/commands/benchmark-runner.d.ts +0 -42
  20. package/dist/cli/commands/benchmark-runner.d.ts.map +0 -1
  21. package/dist/cli/commands/benchmark-runner.js +0 -18
  22. package/dist/cli/commands/benchmark-runner.js.map +0 -1
  23. package/dist/cli/commands/benchmark.d.ts +0 -11
  24. package/dist/cli/commands/benchmark.d.ts.map +0 -1
  25. package/dist/cli/commands/benchmark.js +0 -90
  26. package/dist/cli/commands/benchmark.js.map +0 -1
  27. package/dist/cli/commands/cluster.d.ts +0 -12
  28. package/dist/cli/commands/cluster.d.ts.map +0 -1
  29. package/dist/cli/commands/cluster.js +0 -203
  30. package/dist/cli/commands/cluster.js.map +0 -1
  31. package/dist/cli/commands/compare.d.ts +0 -13
  32. package/dist/cli/commands/compare.d.ts.map +0 -1
  33. package/dist/cli/commands/compare.js +0 -109
  34. package/dist/cli/commands/compare.js.map +0 -1
  35. package/dist/cli/commands/dead-code.d.ts +0 -11
  36. package/dist/cli/commands/dead-code.d.ts.map +0 -1
  37. package/dist/cli/commands/dead-code.js +0 -75
  38. package/dist/cli/commands/dead-code.js.map +0 -1
  39. package/dist/cli/commands/generate-spec.d.ts +0 -11
  40. package/dist/cli/commands/generate-spec.d.ts.map +0 -1
  41. package/dist/cli/commands/generate-spec.js +0 -120
  42. package/dist/cli/commands/generate-spec.js.map +0 -1
  43. package/dist/cli/commands/health.d.ts +0 -11
  44. package/dist/cli/commands/health.d.ts.map +0 -1
  45. package/dist/cli/commands/health.js +0 -76
  46. package/dist/cli/commands/health.js.map +0 -1
  47. package/dist/cli/commands/index.d.ts +0 -30
  48. package/dist/cli/commands/index.d.ts.map +0 -1
  49. package/dist/cli/commands/index.js +0 -36
  50. package/dist/cli/commands/index.js.map +0 -1
  51. package/dist/cli/commands/metrics.d.ts +0 -12
  52. package/dist/cli/commands/metrics.d.ts.map +0 -1
  53. package/dist/cli/commands/metrics.js +0 -231
  54. package/dist/cli/commands/metrics.js.map +0 -1
  55. package/dist/cli/commands/project.d.ts +0 -21
  56. package/dist/cli/commands/project.d.ts.map +0 -1
  57. package/dist/cli/commands/project.js +0 -92
  58. package/dist/cli/commands/project.js.map +0 -1
  59. package/dist/cli/commands/quality.d.ts +0 -15
  60. package/dist/cli/commands/quality.d.ts.map +0 -1
  61. package/dist/cli/commands/quality.js +0 -86
  62. package/dist/cli/commands/quality.js.map +0 -1
  63. package/dist/cli/commands/scan.d.ts +0 -11
  64. package/dist/cli/commands/scan.d.ts.map +0 -1
  65. package/dist/cli/commands/scan.js +0 -102
  66. package/dist/cli/commands/scan.js.map +0 -1
  67. package/dist/cli/commands/secrets.d.ts +0 -11
  68. package/dist/cli/commands/secrets.d.ts.map +0 -1
  69. package/dist/cli/commands/secrets.js +0 -79
  70. package/dist/cli/commands/secrets.js.map +0 -1
  71. package/dist/cli/commands/spec-diff.d.ts +0 -12
  72. package/dist/cli/commands/spec-diff.d.ts.map +0 -1
  73. package/dist/cli/commands/spec-diff.js +0 -150
  74. package/dist/cli/commands/spec-diff.js.map +0 -1
  75. package/dist/cli/commands/swarm.d.ts +0 -21
  76. package/dist/cli/commands/swarm.d.ts.map +0 -1
  77. package/dist/cli/commands/swarm.js +0 -175
  78. package/dist/cli/commands/swarm.js.map +0 -1
  79. package/dist/cli/commands/trust.d.ts +0 -23
  80. package/dist/cli/commands/trust.d.ts.map +0 -1
  81. package/dist/cli/commands/trust.js +0 -397
  82. package/dist/cli/commands/trust.js.map +0 -1
  83. package/dist/cli/commands/understand.d.ts +0 -12
  84. package/dist/cli/commands/understand.d.ts.map +0 -1
  85. package/dist/cli/commands/understand.js +0 -188
  86. package/dist/cli/commands/understand.js.map +0 -1
  87. package/dist/cli/config.d.ts +0 -161
  88. package/dist/cli/config.d.ts.map +0 -1
  89. package/dist/cli/config.js +0 -383
  90. package/dist/cli/config.js.map +0 -1
  91. package/dist/cli/discovery.d.ts +0 -31
  92. package/dist/cli/discovery.d.ts.map +0 -1
  93. package/dist/cli/discovery.js +0 -212
  94. package/dist/cli/discovery.js.map +0 -1
  95. package/dist/cli/effective-options.d.ts +0 -42
  96. package/dist/cli/effective-options.d.ts.map +0 -1
  97. package/dist/cli/effective-options.js +0 -80
  98. package/dist/cli/effective-options.js.map +0 -1
  99. package/dist/cli/file-collection.d.ts +0 -49
  100. package/dist/cli/file-collection.d.ts.map +0 -1
  101. package/dist/cli/file-collection.js +0 -142
  102. package/dist/cli/file-collection.js.map +0 -1
  103. package/dist/cli/formatters/index.d.ts +0 -15
  104. package/dist/cli/formatters/index.d.ts.map +0 -1
  105. package/dist/cli/formatters/index.js +0 -51
  106. package/dist/cli/formatters/index.js.map +0 -1
  107. package/dist/cli/formatters/json.d.ts +0 -11
  108. package/dist/cli/formatters/json.d.ts.map +0 -1
  109. package/dist/cli/formatters/json.js +0 -12
  110. package/dist/cli/formatters/json.js.map +0 -1
  111. package/dist/cli/formatters/project-json.d.ts +0 -11
  112. package/dist/cli/formatters/project-json.d.ts.map +0 -1
  113. package/dist/cli/formatters/project-json.js +0 -12
  114. package/dist/cli/formatters/project-json.js.map +0 -1
  115. package/dist/cli/formatters/project-sarif.d.ts +0 -11
  116. package/dist/cli/formatters/project-sarif.d.ts.map +0 -1
  117. package/dist/cli/formatters/project-sarif.js +0 -127
  118. package/dist/cli/formatters/project-sarif.js.map +0 -1
  119. package/dist/cli/formatters/project-summary.d.ts +0 -11
  120. package/dist/cli/formatters/project-summary.d.ts.map +0 -1
  121. package/dist/cli/formatters/project-summary.js +0 -202
  122. package/dist/cli/formatters/project-summary.js.map +0 -1
  123. package/dist/cli/formatters/sarif-shared.d.ts +0 -101
  124. package/dist/cli/formatters/sarif-shared.d.ts.map +0 -1
  125. package/dist/cli/formatters/sarif-shared.js +0 -57
  126. package/dist/cli/formatters/sarif-shared.js.map +0 -1
  127. package/dist/cli/formatters/sarif.d.ts +0 -12
  128. package/dist/cli/formatters/sarif.d.ts.map +0 -1
  129. package/dist/cli/formatters/sarif.js +0 -92
  130. package/dist/cli/formatters/sarif.js.map +0 -1
  131. package/dist/cli/formatters/summary.d.ts +0 -11
  132. package/dist/cli/formatters/summary.d.ts.map +0 -1
  133. package/dist/cli/formatters/summary.js +0 -240
  134. package/dist/cli/formatters/summary.js.map +0 -1
  135. package/dist/cli/formatters/two-phase-summary.d.ts +0 -11
  136. package/dist/cli/formatters/two-phase-summary.d.ts.map +0 -1
  137. package/dist/cli/formatters/two-phase-summary.js +0 -188
  138. package/dist/cli/formatters/two-phase-summary.js.map +0 -1
  139. package/dist/cli/index.d.ts +0 -10
  140. package/dist/cli/index.d.ts.map +0 -1
  141. package/dist/cli/index.js +0 -72
  142. package/dist/cli/index.js.map +0 -1
  143. package/dist/cli/program.d.ts +0 -117
  144. package/dist/cli/program.d.ts.map +0 -1
  145. package/dist/cli/program.js +0 -825
  146. package/dist/cli/program.js.map +0 -1
@@ -1,175 +0,0 @@
1
- /**
2
- * Swarm Command - Parallel multi-file analysis using Mastra
3
- */
4
- import * as fs from 'fs';
5
- import * as path from 'path';
6
- import { analyzeFilesSwarm } from '../../agents/mastra/swarm.js';
7
- import { discoverFiles } from '../discovery.js';
8
- import { FileCache } from '../../cache/file-cache.js';
9
- import { logger } from '../../utils/logger.js';
10
- import { colors } from '../colors.js';
11
- const { cyan, green, yellow, red, dim, bold } = colors;
12
- export async function runSwarmAnalysis(options) {
13
- const startTime = Date.now();
14
- // Discover files
15
- if (!options.quiet) {
16
- console.error(cyan(`Discovering files in ${options.directory}...`));
17
- }
18
- const discoveryOpts = {
19
- include: options.include.length > 0 ? options.include : [
20
- '**/*.java',
21
- '**/*.js', '**/*.ts', '**/*.jsx', '**/*.tsx',
22
- '**/*.py',
23
- '**/*.rs',
24
- '**/*.c', '**/*.cpp', '**/*.h', '**/*.hpp',
25
- ],
26
- exclude: options.exclude.length > 0 ? options.exclude : [
27
- '**/test/**', '**/tests/**', '**/*Test.java', '**/*_test.rs',
28
- '**/node_modules/**', '**/target/**', '**/build/**',
29
- ],
30
- };
31
- const discoveredFiles = discoverFiles(options.directory, discoveryOpts);
32
- if (discoveredFiles.length === 0) {
33
- console.error(yellow('No files found to analyze.'));
34
- return {
35
- results: [],
36
- summary: {
37
- totalFiles: 0,
38
- totalVulnerabilities: 0,
39
- totalSources: 0,
40
- totalSinks: 0,
41
- filesWithVulnerabilities: 0,
42
- totalTimeMs: 0,
43
- avgTimePerFile: 0,
44
- },
45
- };
46
- }
47
- // Initialize cache if enabled
48
- const cacheEnabled = options.cacheEnabled !== false;
49
- let cache;
50
- if (cacheEnabled) {
51
- cache = new FileCache({
52
- cacheDir: options.cacheDir || path.join(path.resolve(options.directory), '.circle-ir-cache'),
53
- enabled: true,
54
- });
55
- // Clear cache if requested
56
- if (options.clearCache) {
57
- cache.clear();
58
- if (!options.quiet) {
59
- console.error(cyan('Cache cleared'));
60
- }
61
- }
62
- if (!options.quiet) {
63
- console.error(cyan('Cache enabled'));
64
- }
65
- }
66
- if (!options.quiet) {
67
- console.error(cyan(`Found ${discoveredFiles.length} files to analyze`));
68
- console.error(cyan(`Using ${options.maxConcurrency} parallel workers`));
69
- console.error('');
70
- }
71
- // Use lazy file loading to reduce peak memory usage
72
- // Content is loaded on-demand as files enter the worker queue
73
- const files = discoveredFiles.map(file => ({
74
- path: file.path,
75
- getContent: () => fs.readFileSync(file.path, 'utf-8'),
76
- }));
77
- // Progress tracking
78
- let completed = 0;
79
- const progressInterval = options.quiet ? null : setInterval(() => {
80
- const percent = Math.round((completed / files.length) * 100);
81
- process.stderr.write(`\r${cyan(`Progress: ${completed}/${files.length} (${percent}%)`)}`);
82
- }, 500);
83
- try {
84
- // Run swarm analysis (language auto-detected per file from extension)
85
- const result = await analyzeFilesSwarm(files, {
86
- enableEnrichment: options.enableEnrichment,
87
- enableVerification: options.enableVerification,
88
- maxConcurrency: options.maxConcurrency,
89
- cache,
90
- cacheEnabled,
91
- streamToFile: options.streamOutput,
92
- memoryEfficient: options.memoryEfficient,
93
- disabledPasses: options.disabledPasses,
94
- onFileComplete: (file, index, total) => {
95
- completed = index + 1;
96
- logger.debug(`Completed ${file}`, { index, total });
97
- },
98
- onResultWritten: options.streamOutput && !options.quiet
99
- ? (file, index) => logger.debug(`Streamed result for ${file}`)
100
- : undefined,
101
- });
102
- if (progressInterval) {
103
- clearInterval(progressInterval);
104
- process.stderr.write('\r' + ' '.repeat(60) + '\r');
105
- }
106
- // Print summary
107
- if (!options.quiet) {
108
- printSummary(result, Date.now() - startTime, cache);
109
- }
110
- return result;
111
- }
112
- finally {
113
- if (progressInterval) {
114
- clearInterval(progressInterval);
115
- }
116
- }
117
- }
118
- function printSummary(result, totalTimeMs, cache) {
119
- console.error('');
120
- console.error(bold('═══════════════════════════════════════════════════════════════'));
121
- console.error(bold(' SWARM ANALYSIS COMPLETE '));
122
- console.error(bold('═══════════════════════════════════════════════════════════════'));
123
- console.error('');
124
- const { summary } = result;
125
- console.error(` ${cyan('Files Analyzed:')} ${summary.totalFiles}`);
126
- console.error(` ${cyan('Total Time:')} ${(totalTimeMs / 1000).toFixed(2)}s`);
127
- console.error(` ${cyan('Avg Time per File:')} ${(summary.avgTimePerFile / 1000).toFixed(2)}s`);
128
- if (result.streamFile) {
129
- console.error(` ${cyan('Stream Output:')} ${result.streamFile}`);
130
- }
131
- console.error('');
132
- // Show cache stats if available
133
- if (summary.cacheHits !== undefined && summary.cacheMisses !== undefined) {
134
- const total = summary.cacheHits + summary.cacheMisses;
135
- const hitRate = total > 0 ? ((summary.cacheHits / total) * 100).toFixed(1) : '0.0';
136
- console.error(` ${cyan('Cache Hits:')} ${summary.cacheHits}`);
137
- console.error(` ${cyan('Cache Misses:')} ${summary.cacheMisses}`);
138
- console.error(` ${cyan('Cache Hit Rate:')} ${hitRate}%`);
139
- console.error('');
140
- }
141
- console.error(` ${cyan('Sources Found:')} ${summary.totalSources}`);
142
- console.error(` ${cyan('Sinks Found:')} ${summary.totalSinks}`);
143
- console.error('');
144
- if (summary.totalVulnerabilities > 0) {
145
- console.error(` ${red('Vulnerabilities:')} ${summary.totalVulnerabilities}`);
146
- console.error(` ${red('Files with Vulns:')} ${summary.filesWithVulnerabilities}`);
147
- }
148
- else {
149
- console.error(` ${green('Vulnerabilities:')} 0`);
150
- }
151
- console.error('');
152
- // List files with vulnerabilities
153
- const filesWithVulns = result.results.filter(r => r.vulnerabilities.length > 0);
154
- if (filesWithVulns.length > 0) {
155
- console.error(bold('Files with vulnerabilities:'));
156
- for (const file of filesWithVulns) {
157
- console.error(` ${red('•')} ${file.file} (${file.vulnerabilities.length} vulns)`);
158
- }
159
- console.error('');
160
- }
161
- // List errors
162
- const filesWithErrors = result.results.filter(r => r.error);
163
- if (filesWithErrors.length > 0) {
164
- console.error(yellow(`Files with errors: ${filesWithErrors.length}`));
165
- for (const file of filesWithErrors.slice(0, 5)) {
166
- console.error(` ${yellow('!')} ${file.file}: ${file.error}`);
167
- }
168
- if (filesWithErrors.length > 5) {
169
- console.error(dim(` ... and ${filesWithErrors.length - 5} more`));
170
- }
171
- console.error('');
172
- }
173
- console.error(bold('═══════════════════════════════════════════════════════════════'));
174
- }
175
- //# sourceMappingURL=swarm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../../src/cli/commands/swarm.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- /**
2
- * Trust Score Command
3
- *
4
- * Runs all trust passes (Sprint 0-3) against a project and produces
5
- * a composite trust score, tier, findings, and optional badge/artifacts.
6
- *
7
- * Usage:
8
- * cognium-ai trust <path>
9
- * cognium-ai trust <path> --format json
10
- * cognium-ai trust <path> --format markdown -o trust-badge.svg
11
- */
12
- import { type AnalyzerOptions } from 'circle-ir';
13
- import type { CliArgs } from '../args.js';
14
- import { type TrustPassResult } from '../../trust/types.js';
15
- import type { TrustScoreResult } from '../../trust/types.js';
16
- export interface TrustAnalysisResult {
17
- passResults: TrustPassResult[];
18
- trustResult: TrustScoreResult;
19
- totalDuration: number;
20
- }
21
- export declare function runTrustAnalysis(targetPath: string, quiet: boolean, analyzerOptions?: AnalyzerOptions, trustDisabledPasses?: string[], include?: string[], exclude?: string[], maxFiles?: number): Promise<TrustAnalysisResult>;
22
- export declare function executeTrust(args: CliArgs): Promise<number>;
23
- //# sourceMappingURL=trust.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/trust.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,sBAAsB,CAAC;AAgS9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,EACd,eAAe,CAAC,EAAE,eAAe,EACjC,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAC9B,OAAO,GAAE,MAAM,EAAO,EACtB,OAAO,GAAE,MAAM,EAAO,EACtB,QAAQ,SAAO,GACd,OAAO,CAAC,mBAAmB,CAAC,CA2D9B;AAMD,wBAAsB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAkHjE"}
@@ -1,397 +0,0 @@
1
- /**
2
- * Trust Score Command
3
- *
4
- * Runs all trust passes (Sprint 0-3) against a project and produces
5
- * a composite trust score, tier, findings, and optional badge/artifacts.
6
- *
7
- * Usage:
8
- * cognium-ai trust <path>
9
- * cognium-ai trust <path> --format json
10
- * cognium-ai trust <path> --format markdown -o trust-badge.svg
11
- */
12
- import * as fs from 'fs';
13
- import * as path from 'path';
14
- import { analyze } from 'circle-ir';
15
- import { ensureAnalyzerInitialized } from '../../utils/analyzer-init.js';
16
- import { getEffectiveOptions } from '../effective-options.js';
17
- import { collectFiles } from '../file-collection.js';
18
- // Import all trust passes
19
- import { hardcodedSecretsPass } from '../../trust/passes/hardcoded-secrets.js';
20
- import { licenseCompliancePass } from '../../trust/passes/license-compliance.js';
21
- import { typosquatDetectionPass } from '../../trust/passes/typosquat-detection.js';
22
- import { promptInjectionPass } from '../../trust/passes/prompt-injection.js';
23
- import { maliciousInstallScriptPass } from '../../trust/passes/malicious-install-script.js';
24
- import { dependencyStalenessPass } from '../../trust/passes/dependency-staleness.js';
25
- import { excessivePermissionsPass } from '../../trust/passes/excessive-permissions.js';
26
- import { dataExfiltrationPass } from '../../trust/passes/data-exfiltration.js';
27
- import { agentInventoryPass } from '../../trust/passes/agent-inventory.js';
28
- import { sbomGenerationPass } from '../../trust/passes/sbom-generation.js';
29
- import { auditTrailPass } from '../../trust/passes/audit-trail.js';
30
- import { vexGenerationPass } from '../../trust/passes/vex-generation.js';
31
- import { dependencyAuditPass } from '../../trust/passes/dependency-audit.js';
32
- import { codeComplexityPass } from '../../trust/passes/code-complexity.js';
33
- import { inputValidationPass } from '../../trust/passes/input-validation.js';
34
- import { euAiActFlagsPass } from '../../trust/passes/eu-ai-act-flags.js';
35
- import { toolPoisoningPass } from '../../trust/passes/tool-poisoning.js';
36
- import { aiGeneratedFingerprintPass } from '../../trust/passes/ai-generated-fingerprint.js';
37
- import { cacheInvalidationPass } from '../../trust/passes/performance-passes.js';
38
- import { adaptCircleIRFindings } from '../../trust/passes/circlir-findings-adapter.js';
39
- import { missingGuardDomPass } from '../../trust/passes/missing-guard-dom.js';
40
- import { featureEnvyPass } from '../../trust/passes/feature-envy.js';
41
- import { specGapReportPass } from '../../trust/passes/spec-gap-report.js';
42
- import { deprecatedUsagePass } from '../../trust/passes/deprecated-usage.js';
43
- import { throwsMismatchPass } from '../../trust/passes/throws-mismatch.js';
44
- import { inconsistentNamingPass } from '../../trust/passes/inconsistent-naming.js';
45
- import { deprecationNoReplacementPass } from '../../trust/passes/deprecation-no-replacement.js';
46
- import { docCoveragePass } from '../../trust/passes/doc-coverage.js';
47
- import { inconsistentParamOrderPass } from '../../trust/passes/inconsistent-param-order.js';
48
- import { inconsistentErrorHandlingPass } from '../../trust/passes/inconsistent-error-handling.js';
49
- import { unnecessaryObjectHotspotPass } from '../../trust/passes/unnecessary-object-hotspot.js';
50
- import { crossSkillInteractionPass } from '../../trust/passes/cross-skill-interaction.js';
51
- import { generateBadgeFromScore } from '../../trust/badge.js';
52
- import { computeTrustScore } from '../../trust/scoring.js';
53
- const TRUST_PASSES = [
54
- // Sprint 0
55
- { name: 'hardcoded-secrets', sprint: 0, run: (p) => hardcodedSecretsPass(p) },
56
- { name: 'license-compliance', sprint: 0, run: (p) => licenseCompliancePass(p) },
57
- { name: 'typosquat-detection', sprint: 0, run: (p) => typosquatDetectionPass(p) },
58
- // Sprint 1
59
- { name: 'prompt-injection', sprint: 1, run: (p) => promptInjectionPass(p) },
60
- { name: 'malicious-install', sprint: 1, run: (p) => maliciousInstallScriptPass(p) },
61
- { name: 'dependency-staleness', sprint: 1, run: (p) => dependencyStalenessPass(p) },
62
- // Sprint 2 — forward CircleIR to eligible passes
63
- { name: 'excessive-permissions', sprint: 2, run: (p, ir) => excessivePermissionsPass(p, { circleIRResults: ir }) },
64
- { name: 'data-exfiltration', sprint: 2, run: (p, ir) => dataExfiltrationPass(p, { circleIRResults: ir }) },
65
- { name: 'agent-inventory', sprint: 2, run: (p) => agentInventoryPass(p) },
66
- // Sprint 3 (artifact generators) — forward CircleIR
67
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- CircleIR structurally compatible with pass-specific interfaces
68
- { name: 'sbom-generation', sprint: 3, run: (p, ir) => sbomGenerationPass(p, { circleIRResults: ir }) },
69
- { name: 'vex-generation', sprint: 3, run: (p, ir) => vexGenerationPass(p, { circleIRResults: ir }) },
70
- // Sprint 4 — advanced passes
71
- { name: 'dependency-audit', sprint: 4, run: (p) => dependencyAuditPass(p) },
72
- { name: 'code-complexity', sprint: 4, run: (p, ir) => codeComplexityPass(p, { circleIRResults: ir }) },
73
- { name: 'input-validation', sprint: 4, run: (p, ir) => inputValidationPass(p, { circleIRResults: ir }) },
74
- // Sprint 5
75
- { name: 'eu-ai-act-flags', sprint: 5, run: (p) => euAiActFlagsPass(p) },
76
- // Sprint 6 (Phase 3)
77
- { name: 'tool-poisoning', sprint: 6, run: (p, ir) => toolPoisoningPass(p, { circleIRResults: ir }) },
78
- { name: 'ai-generated-fingerprint', sprint: 6, run: (p) => aiGeneratedFingerprintPass(p) },
79
- // Sprint 7 — Performance (P30-P32 via circle-ir findings adapter, P33 standalone)
80
- { name: 'blocking-main-thread', sprint: 7, run: (_p, ir) => Promise.resolve(adaptCircleIRFindings('blocking-main-thread', { circleIRResults: ir })) },
81
- { name: 'excessive-allocation', sprint: 7, run: (_p, ir) => Promise.resolve(adaptCircleIRFindings('excessive-allocation', { circleIRResults: ir })) },
82
- { name: 'missing-stream', sprint: 7, run: (_p, ir) => Promise.resolve(adaptCircleIRFindings('missing-stream', { circleIRResults: ir })) },
83
- { name: 'cache-invalidation', sprint: 7, run: (p, ir) => cacheInvalidationPass(p, { circleIRResults: ir }) },
84
- // Sprint 8 — LLM-enhanced replacements (circle-ir 3.14.0)
85
- { name: 'missing-guard-dom', sprint: 8, run: (p, ir) => missingGuardDomPass(p, { circleIRResults: ir }) },
86
- { name: 'feature-envy', sprint: 8, run: (p, ir) => featureEnvyPass(p, { circleIRResults: ir }) },
87
- // Sprint 9 — Circle-IR architecture/maintainability passes
88
- { name: 'god-class', sprint: 9, run: (_p, ir) => Promise.resolve(adaptCircleIRFindings('god-class', { circleIRResults: ir })) },
89
- { name: 'naming-convention', sprint: 9, run: (_p, ir) => Promise.resolve(adaptCircleIRFindings('naming-convention', { circleIRResults: ir })) },
90
- // Sprint 10 — Semantic Understanding
91
- { name: 'spec-gap-report', sprint: 10, run: (p, ir) => specGapReportPass(p, { circleIRResults: ir }) },
92
- // Sprint 11 — Documentation/API Health
93
- { name: 'deprecated-usage', sprint: 11, run: (p, ir) => deprecatedUsagePass(p, { circleIRResults: ir }) },
94
- { name: 'throws-mismatch', sprint: 11, run: (p, ir) => throwsMismatchPass(p, { circleIRResults: ir }) },
95
- { name: 'inconsistent-naming', sprint: 11, run: (p, ir) => inconsistentNamingPass(p, { circleIRResults: ir }) },
96
- { name: 'deprecation-no-replacement', sprint: 11, run: (p, ir) => deprecationNoReplacementPass(p, { circleIRResults: ir }) },
97
- { name: 'doc-coverage', sprint: 11, run: (p, ir) => docCoveragePass(p, { circleIRResults: ir }) },
98
- // Sprint 12 — Patterns & Performance
99
- { name: 'inconsistent-param-order', sprint: 12, run: (p, ir) => inconsistentParamOrderPass(p, { circleIRResults: ir }) },
100
- { name: 'inconsistent-error-handling', sprint: 12, run: (p, ir) => inconsistentErrorHandlingPass(p, { circleIRResults: ir }) },
101
- { name: 'unnecessary-object-hotspot', sprint: 12, run: (p, ir) => unnecessaryObjectHotspotPass(p, { circleIRResults: ir }) },
102
- // Sprint 12 — Agent Security
103
- { name: 'cross-skill-interaction', sprint: 12, run: (p, ir) => crossSkillInteractionPass(p, { circleIRResults: ir }) },
104
- // audit-trail is a meta-pass — runs last with all results
105
- ];
106
- // ---------------------------------------------------------------------------
107
- // Report formatting
108
- // ---------------------------------------------------------------------------
109
- const TIER_ICONS = {
110
- VERIFIED: '[VERIFIED]',
111
- PASSING: '[PASSING]',
112
- ADVISORY: '[ADVISORY]',
113
- FAILING: '[FAILING]',
114
- BLOCKED: '[BLOCKED]',
115
- };
116
- function severityIcon(severity) {
117
- switch (severity) {
118
- case 'critical': return 'CRIT';
119
- case 'high': return 'HIGH';
120
- case 'medium': return 'MED ';
121
- case 'low': return 'LOW ';
122
- case 'info': return 'INFO';
123
- default: return ' ';
124
- }
125
- }
126
- function formatTrustReport(passResults, compositeScore, tier, durationMs, scoreComponents) {
127
- const lines = [];
128
- lines.push('===============================================================');
129
- lines.push(' TRUST SCORE REPORT');
130
- lines.push('===============================================================');
131
- lines.push('');
132
- // Composite score + tier
133
- lines.push(` Score: ${compositeScore}/100 Tier: ${TIER_ICONS[tier]} ${tier}`);
134
- lines.push(` Time: ${(durationMs / 1000).toFixed(2)}s`);
135
- lines.push('');
136
- // Score components (v2)
137
- if (scoreComponents) {
138
- lines.push('---------------------------------------------------------------');
139
- lines.push(' SCORE COMPONENTS');
140
- lines.push('---------------------------------------------------------------');
141
- lines.push(` Vulnerability: ${renderScoreBar(scoreComponents.vulnerability_score)} ${scoreComponents.vulnerability_score}`);
142
- lines.push(` Supply Chain: ${renderScoreBar(scoreComponents.supply_chain_score)} ${scoreComponents.supply_chain_score}`);
143
- lines.push(` Exfiltration: ${renderScoreBar(scoreComponents.exfiltration_score)} ${scoreComponents.exfiltration_score}`);
144
- lines.push(` Instructions: ${renderScoreBar(scoreComponents.instruction_score)} ${scoreComponents.instruction_score}`);
145
- lines.push(` Permissions: ${renderScoreBar(scoreComponents.permission_score)} ${scoreComponents.permission_score}`);
146
- lines.push(` Secrets: ${renderScoreBar(scoreComponents.secrets_score)} ${scoreComponents.secrets_score}`);
147
- lines.push(` License: ${renderScoreBar(scoreComponents.license_score)} ${scoreComponents.license_score}`);
148
- lines.push(` Compliance: ${renderScoreBar(scoreComponents.compliance_score)} ${scoreComponents.compliance_score}`);
149
- lines.push(` Hygiene: ${renderScoreBar(scoreComponents.hygiene_score)} ${scoreComponents.hygiene_score}`);
150
- lines.push(` Poisoning: ${renderScoreBar(scoreComponents.poisoning_score)} ${scoreComponents.poisoning_score}`);
151
- lines.push(` Provenance: ${renderScoreBar(scoreComponents.provenance_score)} ${scoreComponents.provenance_score}`);
152
- lines.push(` Performance: ${renderScoreBar(scoreComponents.performance_score)} ${scoreComponents.performance_score}`);
153
- lines.push('');
154
- }
155
- // Per-pass scores
156
- lines.push('---------------------------------------------------------------');
157
- lines.push(' PASS SCORES');
158
- lines.push('---------------------------------------------------------------');
159
- for (const result of passResults) {
160
- const scoreBar = renderScoreBar(result.score);
161
- const findingCount = result.findings.filter((f) => f.severity !== 'info').length;
162
- const findingText = findingCount > 0 ? ` (${findingCount} finding${findingCount > 1 ? 's' : ''})` : '';
163
- lines.push(` ${scoreBar} ${pad(result.score.toString(), 3)} ${pad(result.pass, 24)}${findingText}`);
164
- }
165
- lines.push('');
166
- // Findings summary (non-info only)
167
- const allFindings = passResults.flatMap((r) => r.findings);
168
- const nonInfoFindings = allFindings.filter((f) => f.severity !== 'info');
169
- if (nonInfoFindings.length > 0) {
170
- lines.push('---------------------------------------------------------------');
171
- lines.push(' FINDINGS');
172
- lines.push('---------------------------------------------------------------');
173
- // Group by severity
174
- const bySeverity = ['critical', 'high', 'medium', 'low'];
175
- for (const sev of bySeverity) {
176
- const findings = nonInfoFindings.filter((f) => f.severity === sev);
177
- if (findings.length === 0)
178
- continue;
179
- lines.push('');
180
- lines.push(` ${severityIcon(sev)} (${findings.length}):`);
181
- for (const f of findings) {
182
- const loc = f.location?.file ? ` [${f.location.file}${f.location.line ? ':' + f.location.line : ''}]` : '';
183
- lines.push(` - ${f.message}${loc}`);
184
- }
185
- }
186
- lines.push('');
187
- }
188
- // Info summary counts
189
- const infoFindings = allFindings.filter((f) => f.severity === 'info');
190
- if (infoFindings.length > 0) {
191
- lines.push('---------------------------------------------------------------');
192
- lines.push(` INFO: ${infoFindings.length} informational finding${infoFindings.length > 1 ? 's' : ''} (AI-BOM, SBOM, VEX, etc.)`);
193
- }
194
- // Artifacts summary
195
- const artifacts = passResults.filter((r) => r.artifacts && Object.keys(r.artifacts).length > 0);
196
- if (artifacts.length > 0) {
197
- lines.push('');
198
- lines.push('---------------------------------------------------------------');
199
- lines.push(' ARTIFACTS');
200
- lines.push('---------------------------------------------------------------');
201
- for (const r of artifacts) {
202
- for (const key of Object.keys(r.artifacts)) {
203
- lines.push(` - ${key} (from ${r.pass})`);
204
- }
205
- }
206
- }
207
- lines.push('');
208
- lines.push('===============================================================');
209
- return lines.join('\n');
210
- }
211
- function renderScoreBar(score) {
212
- const width = 20;
213
- const filled = Math.round((score / 100) * width);
214
- return '[' + '#'.repeat(filled) + '-'.repeat(width - filled) + ']';
215
- }
216
- function pad(str, len) {
217
- return str.padEnd(len);
218
- }
219
- // ---------------------------------------------------------------------------
220
- // File collection + CircleIR analysis
221
- // ---------------------------------------------------------------------------
222
- function collectSourceFiles(dir, include, exclude, maxFiles = 1000) {
223
- return collectFiles(dir, { include, exclude, maxFiles })
224
- .map(f => ({ path: f.path, language: f.language }));
225
- }
226
- async function runCircleIRAnalysis(files, quiet, analyzerOptions) {
227
- const results = [];
228
- for (const file of files) {
229
- try {
230
- const content = fs.readFileSync(file.path, 'utf-8');
231
- const ir = await analyze(content, path.basename(file.path), file.language, analyzerOptions);
232
- results.push(ir);
233
- }
234
- catch {
235
- // Skip files that fail analysis — don't block trust scoring
236
- }
237
- }
238
- return results;
239
- }
240
- export async function runTrustAnalysis(targetPath, quiet, analyzerOptions, trustDisabledPasses, include = [], exclude = [], maxFiles = 1000) {
241
- const overallStart = Date.now();
242
- // Step 1: Initialize circle-ir analyzer
243
- if (!quiet) {
244
- console.error(' Initializing analyzer...');
245
- }
246
- await ensureAnalyzerInitialized();
247
- // Step 2: Collect source files and run CircleIR analysis
248
- const sourceFiles = collectSourceFiles(targetPath, include, exclude, maxFiles);
249
- if (!quiet) {
250
- console.error(` Analyzing ${sourceFiles.length} source file(s) with CircleIR...`);
251
- }
252
- const circleIRResults = await runCircleIRAnalysis(sourceFiles, quiet, analyzerOptions);
253
- if (!quiet) {
254
- console.error(` CircleIR analysis complete: ${circleIRResults.length} file(s) analyzed`);
255
- }
256
- // Step 3: Filter trust passes based on config/CLI disable list
257
- const activePasses = trustDisabledPasses && trustDisabledPasses.length > 0
258
- ? TRUST_PASSES.filter(p => !trustDisabledPasses.includes(p.name))
259
- : TRUST_PASSES;
260
- if (!quiet && trustDisabledPasses && trustDisabledPasses.length > 0) {
261
- console.error(` Disabled trust passes: ${trustDisabledPasses.join(', ')}`);
262
- }
263
- // Step 4: Run active trust passes (forwarding CircleIR to eligible passes)
264
- const passResults = [];
265
- for (const pass of activePasses) {
266
- if (!quiet) {
267
- console.error(` [${pass.name}] running...`);
268
- }
269
- const result = await pass.run(targetPath, circleIRResults);
270
- passResults.push(result);
271
- if (!quiet) {
272
- const findingCount = result.findings.filter((f) => f.severity !== 'info').length;
273
- console.error(` [${pass.name}] score: ${result.score} findings: ${findingCount} (${result.durationMs}ms)`);
274
- }
275
- }
276
- // Run audit-trail meta-pass last (pass a snapshot, not the live array)
277
- if (!quiet) {
278
- console.error(` [audit-trail] running...`);
279
- }
280
- const auditResult = await auditTrailPass(targetPath, { passResults: [...passResults] });
281
- passResults.push(auditResult);
282
- if (!quiet) {
283
- console.error(` [audit-trail] score: ${auditResult.score} (${auditResult.durationMs}ms)`);
284
- }
285
- // Compute weighted composite score (v2)
286
- const trustResult = computeTrustScore(passResults);
287
- const totalDuration = Date.now() - overallStart;
288
- return { passResults, trustResult, totalDuration };
289
- }
290
- // ---------------------------------------------------------------------------
291
- // Main command
292
- // ---------------------------------------------------------------------------
293
- export async function executeTrust(args) {
294
- const targetPath = args.directory || process.cwd();
295
- if (!fs.existsSync(targetPath)) {
296
- console.error(`Error: Path not found: ${targetPath}`);
297
- return 1;
298
- }
299
- if (!args.quiet) {
300
- console.error(`Running trust score analysis on ${targetPath}...`);
301
- }
302
- const eff = getEffectiveOptions(args, targetPath);
303
- try {
304
- const { passResults, trustResult, totalDuration } = await runTrustAnalysis(targetPath, args.quiet === true, eff.analyzerOptions, eff.trustDisabledPasses, eff.include, eff.exclude, args.maxFiles ?? 1000);
305
- const compositeScore = trustResult.score;
306
- const tier = trustResult.tier;
307
- // Output based on format
308
- if (args.format === 'json') {
309
- // Strip embedded passes from audit log to avoid bloated duplicate data
310
- const jsonResults = passResults.map((r) => {
311
- if (r.pass === 'audit-trail' && r.artifacts?.auditLog) {
312
- const { passes, ...summaryOnly } = r.artifacts.auditLog;
313
- return { ...r, artifacts: { ...r.artifacts, auditLog: summaryOnly } };
314
- }
315
- return r;
316
- });
317
- const output = JSON.stringify({
318
- score: compositeScore,
319
- tier,
320
- vulnerability_score: trustResult.vulnerability_score,
321
- supply_chain_score: trustResult.supply_chain_score,
322
- exfiltration_score: trustResult.exfiltration_score,
323
- instruction_score: trustResult.instruction_score,
324
- permission_score: trustResult.permission_score,
325
- secrets_score: trustResult.secrets_score,
326
- crypto_score: trustResult.crypto_score,
327
- license_score: trustResult.license_score,
328
- compliance_score: trustResult.compliance_score,
329
- hygiene_score: trustResult.hygiene_score,
330
- poisoning_score: trustResult.poisoning_score,
331
- provenance_score: trustResult.provenance_score,
332
- performance_score: trustResult.performance_score,
333
- passResults: jsonResults,
334
- totalDurationMs: totalDuration,
335
- timestamp: new Date().toISOString(),
336
- }, null, 2);
337
- if (args.output) {
338
- fs.writeFileSync(args.output, output);
339
- if (!args.quiet) {
340
- console.error(`Output written to ${args.output}`);
341
- }
342
- }
343
- else {
344
- console.log(output);
345
- }
346
- }
347
- else if (args.format === 'sarif') {
348
- const { generateTrustSARIF } = await import('../../trust/sarif.js');
349
- const output = generateTrustSARIF(passResults, compositeScore, tier);
350
- if (args.output) {
351
- fs.writeFileSync(args.output, output);
352
- if (!args.quiet) {
353
- console.error(`SARIF output written to ${args.output}`);
354
- }
355
- }
356
- else {
357
- console.log(output);
358
- }
359
- }
360
- else if (args.format === 'markdown') {
361
- // Badge SVG output
362
- const svg = generateBadgeFromScore(compositeScore);
363
- if (args.output) {
364
- fs.writeFileSync(args.output, svg);
365
- if (!args.quiet) {
366
- console.error(`Badge written to ${args.output}`);
367
- }
368
- }
369
- else {
370
- console.log(svg);
371
- }
372
- }
373
- else {
374
- // Summary format with score components
375
- const report = formatTrustReport(passResults, compositeScore, tier, totalDuration, trustResult);
376
- if (args.output) {
377
- fs.writeFileSync(args.output, report);
378
- if (!args.quiet) {
379
- console.error(`Output written to ${args.output}`);
380
- }
381
- }
382
- else {
383
- console.log(report);
384
- }
385
- }
386
- // Exit with error code if score below 40 (FAILING tier)
387
- if (args.exitCode && compositeScore < args.threshold) {
388
- return 1;
389
- }
390
- return 0;
391
- }
392
- catch (error) {
393
- console.error('Error:', error instanceof Error ? error.message : error);
394
- return 1;
395
- }
396
- }
397
- //# sourceMappingURL=trust.js.map