codeslick-cli 1.2.2 → 1.2.4
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/__tests__/threshold-handler.test.ts +175 -0
- package/dist/packages/cli/src/commands/scan.d.ts +11 -0
- package/dist/packages/cli/src/commands/scan.d.ts.map +1 -1
- package/dist/packages/cli/src/commands/scan.js +74 -5
- package/dist/packages/cli/src/commands/scan.js.map +1 -1
- package/dist/packages/cli/src/config/config-loader.d.ts +11 -0
- package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -1
- package/dist/packages/cli/src/config/config-loader.js.map +1 -1
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts +18 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -1
- package/dist/packages/cli/src/reporters/cli-reporter.js +115 -0
- package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -1
- package/dist/packages/cli/src/utils/test-runner.d.ts +84 -0
- package/dist/packages/cli/src/utils/test-runner.d.ts.map +1 -0
- package/dist/packages/cli/src/utils/test-runner.js +209 -0
- package/dist/packages/cli/src/utils/test-runner.js.map +1 -0
- package/dist/packages/cli/src/utils/threshold-handler.d.ts +40 -0
- package/dist/packages/cli/src/utils/threshold-handler.d.ts.map +1 -0
- package/dist/packages/cli/src/utils/threshold-handler.js +85 -0
- package/dist/packages/cli/src/utils/threshold-handler.js.map +1 -0
- package/dist/src/lib/analyzers/go-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/go-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/go-analyzer.js +47 -0
- package/dist/src/lib/analyzers/go-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/java-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/java-analyzer.js +48 -0
- package/dist/src/lib/analyzers/java-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript-analyzer.js +48 -0
- package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/python-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/python-analyzer.js +55 -0
- package/dist/src/lib/analyzers/python-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/types.d.ts +4 -0
- package/dist/src/lib/analyzers/types.d.ts.map +1 -1
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/typescript-analyzer.js +48 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -1
- package/dist/src/lib/github/types.d.ts +112 -0
- package/dist/src/lib/github/types.d.ts.map +1 -0
- package/dist/src/lib/github/types.js +34 -0
- package/dist/src/lib/github/types.js.map +1 -0
- package/dist/src/lib/security/epss-service.d.ts +63 -0
- package/dist/src/lib/security/epss-service.d.ts.map +1 -0
- package/dist/src/lib/security/epss-service.js +256 -0
- package/dist/src/lib/security/epss-service.js.map +1 -0
- package/dist/src/lib/security/threshold-evaluator.d.ts +73 -0
- package/dist/src/lib/security/threshold-evaluator.d.ts.map +1 -0
- package/dist/src/lib/security/threshold-evaluator.js +234 -0
- package/dist/src/lib/security/threshold-evaluator.js.map +1 -0
- package/dist/src/lib/security/triage-service.d.ts +76 -0
- package/dist/src/lib/security/triage-service.d.ts.map +1 -0
- package/dist/src/lib/security/triage-service.js +318 -0
- package/dist/src/lib/security/triage-service.js.map +1 -0
- package/dist/src/lib/types/index.d.ts +4 -0
- package/dist/src/lib/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/commands/scan.ts +100 -7
- package/src/config/config-loader.ts +15 -0
- package/src/reporters/cli-reporter.ts +132 -0
- package/src/utils/test-runner.ts +249 -0
- package/src/utils/threshold-handler.ts +99 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Smart Triage Service
|
|
4
|
+
*
|
|
5
|
+
* Computes priority scores for security issues using multiple signals:
|
|
6
|
+
* - CVSS Score (base severity)
|
|
7
|
+
* - EPSS Score (exploit prediction)
|
|
8
|
+
* - OWASP Category (criticality weight)
|
|
9
|
+
* - Environment Context (production vs dev)
|
|
10
|
+
*
|
|
11
|
+
* Feature 1 Phase 1 (Q1 2026): Alert Deduplication & AutoTriage
|
|
12
|
+
*
|
|
13
|
+
* Priority Formula:
|
|
14
|
+
* priority = cvss * 0.5 + epss * 0.3 + owasp_weight * 0.2
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.triageSecurityIssues = triageSecurityIssues;
|
|
18
|
+
exports.getTriageStats = getTriageStats;
|
|
19
|
+
exports.filterByPriority = filterByPriority;
|
|
20
|
+
const epss_service_1 = require("./epss-service");
|
|
21
|
+
/**
|
|
22
|
+
* OWASP category weights for triage prioritization
|
|
23
|
+
* Based on OWASP Top 10 2025 criticality
|
|
24
|
+
*/
|
|
25
|
+
const OWASP_WEIGHTS = {
|
|
26
|
+
// Critical (10.0)
|
|
27
|
+
'A03:2021 - Injection': 10.0,
|
|
28
|
+
'A01:2021 - Broken Access Control': 10.0,
|
|
29
|
+
'A07:2021 - Identification and Authentication Failures': 10.0,
|
|
30
|
+
// High (8.0)
|
|
31
|
+
'A02:2021 - Cryptographic Failures': 8.0,
|
|
32
|
+
'A04:2021 - Insecure Design': 8.0,
|
|
33
|
+
'A05:2021 - Security Misconfiguration': 8.0,
|
|
34
|
+
'A08:2021 - Software and Data Integrity Failures': 8.0,
|
|
35
|
+
// Medium (6.0)
|
|
36
|
+
'A06:2021 - Vulnerable and Outdated Components': 6.0,
|
|
37
|
+
'A09:2021 - Security Logging and Monitoring Failures': 6.0,
|
|
38
|
+
'A10:2021 - Server-Side Request Forgery': 6.0,
|
|
39
|
+
// Default (5.0)
|
|
40
|
+
default: 5.0,
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Convert severity to CVSS-like score (0-10)
|
|
44
|
+
*
|
|
45
|
+
* @param severity - Security severity level
|
|
46
|
+
* @param cvssScore - Existing CVSS score if available
|
|
47
|
+
* @returns CVSS score (0.0-10.0)
|
|
48
|
+
*/
|
|
49
|
+
function severityToCVSS(severity, cvssScore) {
|
|
50
|
+
if (cvssScore !== undefined) {
|
|
51
|
+
return cvssScore;
|
|
52
|
+
}
|
|
53
|
+
switch (severity) {
|
|
54
|
+
case 'critical':
|
|
55
|
+
return 9.5;
|
|
56
|
+
case 'high':
|
|
57
|
+
return 8.0;
|
|
58
|
+
case 'medium':
|
|
59
|
+
return 5.5;
|
|
60
|
+
case 'low':
|
|
61
|
+
return 3.0;
|
|
62
|
+
default:
|
|
63
|
+
return 1.0;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get OWASP weight for issue
|
|
68
|
+
*
|
|
69
|
+
* @param issue - Security issue
|
|
70
|
+
* @returns OWASP weight (0.0-10.0)
|
|
71
|
+
*/
|
|
72
|
+
function getOwaspWeight(issue) {
|
|
73
|
+
if (!issue.owasp) {
|
|
74
|
+
return OWASP_WEIGHTS.default;
|
|
75
|
+
}
|
|
76
|
+
// Extract OWASP category (e.g., "A03:2021 - Injection")
|
|
77
|
+
const category = issue.owasp;
|
|
78
|
+
return OWASP_WEIGHTS[category] || OWASP_WEIGHTS.default;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Extract CVE ID from security issue message
|
|
82
|
+
*
|
|
83
|
+
* @param issue - Security issue
|
|
84
|
+
* @returns CVE ID or null
|
|
85
|
+
*/
|
|
86
|
+
function extractCVE(issue) {
|
|
87
|
+
const cveMatch = issue.message.match(/CVE-\d{4}-\d{4,7}/i);
|
|
88
|
+
return cveMatch ? cveMatch[0].toUpperCase() : null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Map priority score to priority level
|
|
92
|
+
*
|
|
93
|
+
* @param score - Priority score (0.0-10.0)
|
|
94
|
+
* @returns Priority level
|
|
95
|
+
*/
|
|
96
|
+
function mapScoreToPriority(score) {
|
|
97
|
+
if (score >= 8.5)
|
|
98
|
+
return 'critical';
|
|
99
|
+
if (score >= 6.5)
|
|
100
|
+
return 'high';
|
|
101
|
+
if (score >= 4.0)
|
|
102
|
+
return 'medium';
|
|
103
|
+
if (score >= 2.0)
|
|
104
|
+
return 'low';
|
|
105
|
+
return 'info';
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate human-readable triage reason
|
|
109
|
+
*
|
|
110
|
+
* @param issue - Security issue
|
|
111
|
+
* @param cvss - CVSS score
|
|
112
|
+
* @param epss - EPSS score (optional)
|
|
113
|
+
* @param owaspWeight - OWASP weight
|
|
114
|
+
* @param context - Environment context
|
|
115
|
+
* @returns Triage reason explanation
|
|
116
|
+
*/
|
|
117
|
+
function generateTriageReason(issue, cvss, epss, owaspWeight, context) {
|
|
118
|
+
const reasons = [];
|
|
119
|
+
// CVSS component
|
|
120
|
+
if (cvss >= 9.0) {
|
|
121
|
+
reasons.push(`CVSS ${cvss.toFixed(1)} (critical)`);
|
|
122
|
+
}
|
|
123
|
+
else if (cvss >= 7.0) {
|
|
124
|
+
reasons.push(`CVSS ${cvss.toFixed(1)} (high)`);
|
|
125
|
+
}
|
|
126
|
+
else if (cvss >= 4.0) {
|
|
127
|
+
reasons.push(`CVSS ${cvss.toFixed(1)}`);
|
|
128
|
+
}
|
|
129
|
+
// EPSS component
|
|
130
|
+
if (epss !== undefined) {
|
|
131
|
+
if (epss >= 0.7) {
|
|
132
|
+
reasons.push(`EPSS ${(epss * 100).toFixed(1)}% (high exploit probability)`);
|
|
133
|
+
}
|
|
134
|
+
else if (epss >= 0.3) {
|
|
135
|
+
reasons.push(`EPSS ${(epss * 100).toFixed(1)}% (medium exploit probability)`);
|
|
136
|
+
}
|
|
137
|
+
else if (epss >= 0.1) {
|
|
138
|
+
reasons.push(`EPSS ${(epss * 100).toFixed(1)}%`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// OWASP component
|
|
142
|
+
if (issue.owasp) {
|
|
143
|
+
const category = issue.owasp.split(' - ')[1] || issue.owasp;
|
|
144
|
+
if (owaspWeight >= 9.0) {
|
|
145
|
+
reasons.push(`${category} (OWASP critical)`);
|
|
146
|
+
}
|
|
147
|
+
else if (owaspWeight >= 7.0) {
|
|
148
|
+
reasons.push(`${category} (OWASP high)`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
reasons.push(category);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Environment context
|
|
155
|
+
if (context?.isProduction) {
|
|
156
|
+
reasons.push('production code');
|
|
157
|
+
}
|
|
158
|
+
if (context?.hasPublicExposure) {
|
|
159
|
+
reasons.push('public exposure');
|
|
160
|
+
}
|
|
161
|
+
if (context?.hasSensitiveData) {
|
|
162
|
+
reasons.push('sensitive data');
|
|
163
|
+
}
|
|
164
|
+
if (reasons.length === 0) {
|
|
165
|
+
return `${issue.severity} severity issue`;
|
|
166
|
+
}
|
|
167
|
+
return reasons.join(' + ');
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Compute priority score for a single security issue
|
|
171
|
+
*
|
|
172
|
+
* @param issue - Security issue
|
|
173
|
+
* @param epssScore - EPSS score (optional)
|
|
174
|
+
* @param config - Triage configuration
|
|
175
|
+
* @returns Priority score (0.0-10.0)
|
|
176
|
+
*/
|
|
177
|
+
function computePriorityScore(issue, epssScore, config) {
|
|
178
|
+
const cvssWeight = config.cvssWeight ?? 0.5;
|
|
179
|
+
const epssWeight = config.epssWeight ?? 0.3;
|
|
180
|
+
const owaspWeight = config.owaspWeight ?? 0.2;
|
|
181
|
+
// Component scores
|
|
182
|
+
const cvss = severityToCVSS(issue.severity, issue.cvssScore);
|
|
183
|
+
const epss = epssScore ?? 0.0; // Default to 0 if no EPSS data
|
|
184
|
+
const owasp = getOwaspWeight(issue);
|
|
185
|
+
// Compute weighted priority score
|
|
186
|
+
let priorityScore = (cvss * cvssWeight) + (epss * 10 * epssWeight) + (owasp * owaspWeight);
|
|
187
|
+
// Environment context modifiers
|
|
188
|
+
if (config.environmentContext?.isProduction) {
|
|
189
|
+
priorityScore *= 1.2; // +20% for production
|
|
190
|
+
}
|
|
191
|
+
if (config.environmentContext?.hasPublicExposure) {
|
|
192
|
+
priorityScore *= 1.15; // +15% for public exposure
|
|
193
|
+
}
|
|
194
|
+
if (config.environmentContext?.hasSensitiveData) {
|
|
195
|
+
priorityScore *= 1.1; // +10% for sensitive data
|
|
196
|
+
}
|
|
197
|
+
// Cap at 10.0
|
|
198
|
+
return Math.min(priorityScore, 10.0);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Triage a single security issue
|
|
202
|
+
*
|
|
203
|
+
* @param issue - Security issue to triage
|
|
204
|
+
* @param epssScores - Map of CVE -> EPSS score
|
|
205
|
+
* @param config - Triage configuration
|
|
206
|
+
* @returns Triage result with priority and reasoning
|
|
207
|
+
*/
|
|
208
|
+
function triageSingleIssue(issue, epssScores, config) {
|
|
209
|
+
// Extract CVE and get EPSS score
|
|
210
|
+
const cve = extractCVE(issue);
|
|
211
|
+
const epssData = cve ? epssScores.get(cve) : undefined;
|
|
212
|
+
const epssScore = epssData?.epssScore;
|
|
213
|
+
// Compute priority score
|
|
214
|
+
const priorityScore = computePriorityScore(issue, epssScore, config);
|
|
215
|
+
const priority = mapScoreToPriority(priorityScore);
|
|
216
|
+
// Generate triage reason
|
|
217
|
+
const cvss = severityToCVSS(issue.severity, issue.cvssScore);
|
|
218
|
+
const owaspWeight = getOwaspWeight(issue);
|
|
219
|
+
const triageReason = generateTriageReason(issue, cvss, epssScore, owaspWeight, config.environmentContext);
|
|
220
|
+
return {
|
|
221
|
+
issue: {
|
|
222
|
+
...issue,
|
|
223
|
+
priority,
|
|
224
|
+
triageReason,
|
|
225
|
+
epssScore,
|
|
226
|
+
epssPercentile: epssData?.percentile,
|
|
227
|
+
},
|
|
228
|
+
priorityScore,
|
|
229
|
+
priority,
|
|
230
|
+
triageReason,
|
|
231
|
+
epssScore,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Triage multiple security issues with smart prioritization
|
|
236
|
+
*
|
|
237
|
+
* @param issues - Array of security issues to triage
|
|
238
|
+
* @param config - Triage configuration
|
|
239
|
+
* @returns Array of triage results sorted by priority (highest first)
|
|
240
|
+
*/
|
|
241
|
+
async function triageSecurityIssues(issues, config = {}) {
|
|
242
|
+
console.log('[TRIAGE] Service called with', issues.length, 'issues');
|
|
243
|
+
console.log('[TRIAGE] Config:', config);
|
|
244
|
+
if (!issues || issues.length === 0) {
|
|
245
|
+
console.log('[TRIAGE] No issues to triage, returning empty array');
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
// Extract all CVEs from issues
|
|
249
|
+
const cves = issues
|
|
250
|
+
.map(extractCVE)
|
|
251
|
+
.filter((cve) => cve !== null);
|
|
252
|
+
console.log('[TRIAGE] Extracted CVEs:', cves);
|
|
253
|
+
// Fetch EPSS scores for all CVEs
|
|
254
|
+
let epssScores = new Map();
|
|
255
|
+
if (cves.length > 0) {
|
|
256
|
+
try {
|
|
257
|
+
const scores = await (0, epss_service_1.getEPSSScores)(cves);
|
|
258
|
+
epssScores = new Map(scores.map(score => [score.cve, score]));
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
console.warn('[TRIAGE] Failed to fetch EPSS scores:', error);
|
|
262
|
+
// Continue without EPSS data
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Triage each issue
|
|
266
|
+
const results = issues.map(issue => triageSingleIssue(issue, epssScores, config));
|
|
267
|
+
// Sort by priority score (highest first)
|
|
268
|
+
results.sort((a, b) => b.priorityScore - a.priorityScore);
|
|
269
|
+
console.log('[TRIAGE] Triage complete. Returning', results.length, 'results');
|
|
270
|
+
console.log('[TRIAGE] Sample result:', results[0] ? {
|
|
271
|
+
priority: results[0].priority,
|
|
272
|
+
triageReason: results[0].triageReason,
|
|
273
|
+
epssScore: results[0].epssScore,
|
|
274
|
+
priorityScore: results[0].priorityScore
|
|
275
|
+
} : 'No results');
|
|
276
|
+
return results;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get triage statistics for a set of results
|
|
280
|
+
*
|
|
281
|
+
* @param results - Triage results
|
|
282
|
+
* @returns Triage statistics
|
|
283
|
+
*/
|
|
284
|
+
function getTriageStats(results) {
|
|
285
|
+
const stats = {
|
|
286
|
+
total: results.length,
|
|
287
|
+
critical: 0,
|
|
288
|
+
high: 0,
|
|
289
|
+
medium: 0,
|
|
290
|
+
low: 0,
|
|
291
|
+
info: 0,
|
|
292
|
+
withEPSS: 0,
|
|
293
|
+
averagePriority: 0,
|
|
294
|
+
};
|
|
295
|
+
let totalPriority = 0;
|
|
296
|
+
for (const result of results) {
|
|
297
|
+
stats[result.priority]++;
|
|
298
|
+
if (result.epssScore !== undefined) {
|
|
299
|
+
stats.withEPSS++;
|
|
300
|
+
}
|
|
301
|
+
totalPriority += result.priorityScore;
|
|
302
|
+
}
|
|
303
|
+
stats.averagePriority = stats.total > 0 ? totalPriority / stats.total : 0;
|
|
304
|
+
return stats;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Filter triage results by minimum priority level
|
|
308
|
+
*
|
|
309
|
+
* @param results - Triage results
|
|
310
|
+
* @param minPriority - Minimum priority level ('critical' | 'high' | 'medium' | 'low')
|
|
311
|
+
* @returns Filtered results
|
|
312
|
+
*/
|
|
313
|
+
function filterByPriority(results, minPriority) {
|
|
314
|
+
const priorityOrder = { critical: 4, high: 3, medium: 2, low: 1, info: 0 };
|
|
315
|
+
const minLevel = priorityOrder[minPriority];
|
|
316
|
+
return results.filter(result => priorityOrder[result.priority] >= minLevel);
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=triage-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage-service.js","sourceRoot":"","sources":["../../../../../../src/lib/security/triage-service.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAqSH,oDAgDC;AAQD,wCAkCC;AASD,4CAQC;AA5YD,iDAA0D;AAE1D;;;GAGG;AACH,MAAM,aAAa,GAA2B;IAC5C,kBAAkB;IAClB,sBAAsB,EAAE,IAAI;IAC5B,kCAAkC,EAAE,IAAI;IACxC,uDAAuD,EAAE,IAAI;IAE7D,aAAa;IACb,mCAAmC,EAAE,GAAG;IACxC,4BAA4B,EAAE,GAAG;IACjC,sCAAsC,EAAE,GAAG;IAC3C,iDAAiD,EAAE,GAAG;IAEtD,eAAe;IACf,+CAA+C,EAAE,GAAG;IACpD,qDAAqD,EAAE,GAAG;IAC1D,wCAAwC,EAAE,GAAG;IAE7C,gBAAgB;IAChB,OAAO,EAAE,GAAG;CACb,CAAC;AAiCF;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,QAA0B,EAAE,SAAkB;IACpE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC;QACb,KAAK,KAAK;YACR,OAAO,GAAG,CAAC;QACb;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAA4B;IAClD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,aAAa,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,wDAAwD;IACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7B,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,KAA4B;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,oBAAoB,CAC3B,KAA4B,EAC5B,IAAY,EACZ,IAAwB,EACxB,WAAmB,EACnB,OAA4B;IAE5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,iBAAiB;IACjB,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,iBAAiB;IACjB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;QAChF,CAAC;aAAM,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;QAC5D,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,mBAAmB,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,KAAK,CAAC,QAAQ,iBAAiB,CAAC;IAC5C,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,oBAAoB,CAC3B,KAA4B,EAC5B,SAA6B,EAC7B,MAAoB;IAEpB,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;IAE9C,mBAAmB;IACnB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC,CAAC,+BAA+B;IAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEpC,kCAAkC;IAClC,IAAI,aAAa,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;IAE3F,gCAAgC;IAChC,IAAI,MAAM,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC;QAC5C,aAAa,IAAI,GAAG,CAAC,CAAC,sBAAsB;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;QACjD,aAAa,IAAI,IAAI,CAAC,CAAC,2BAA2B;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;QAChD,aAAa,IAAI,GAAG,CAAC,CAAC,0BAA0B;IAClD,CAAC;IAED,cAAc;IACd,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CACxB,KAA4B,EAC5B,UAAkC,EAClC,MAAoB;IAEpB,iCAAiC;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,MAAM,SAAS,GAAG,QAAQ,EAAE,SAAS,CAAC;IAEtC,yBAAyB;IACzB,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAEnD,yBAAyB;IACzB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,oBAAoB,CACvC,KAAK,EACL,IAAI,EACJ,SAAS,EACT,WAAW,EACX,MAAM,CAAC,kBAAkB,CAC1B,CAAC;IAEF,OAAO;QACL,KAAK,EAAE;YACL,GAAG,KAAK;YACR,QAAQ;YACR,YAAY;YACZ,SAAS;YACT,cAAc,EAAE,QAAQ,EAAE,UAAU;SACrC;QACD,aAAa;QACb,QAAQ;QACR,YAAY;QACZ,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CACxC,MAA+B,EAC/B,SAAuB,EAAE;IAEzB,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+BAA+B;IAC/B,MAAM,IAAI,GAAG,MAAM;SAChB,GAAG,CAAC,UAAU,CAAC;SACf,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IAEhD,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAE9C,iCAAiC;IACjC,IAAI,UAAU,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAa,EAAC,IAAI,CAAC,CAAC;YACzC,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC7D,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACjC,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAC7C,CAAC;IAEF,yCAAyC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;QAC7B,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY;QACrC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/B,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;KACxC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAElB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,OAAuB;IAUpD,MAAM,KAAK,GAAG;QACZ,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;QACP,QAAQ,EAAE,CAAC;QACX,eAAe,EAAE,CAAC;KACnB,CAAC;IAEF,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,CAAC;QACD,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAC9B,OAAuB,EACvB,WAAmD;IAEnD,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -91,6 +91,10 @@ export interface SecurityIssue {
|
|
|
91
91
|
cvssScore?: number;
|
|
92
92
|
exploitLikelihood?: ExploitLikelihood;
|
|
93
93
|
impact?: SecurityImpact;
|
|
94
|
+
epssScore?: number;
|
|
95
|
+
epssPercentile?: number;
|
|
96
|
+
priority?: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
97
|
+
triageReason?: string;
|
|
94
98
|
owasp?: string;
|
|
95
99
|
cwe?: string;
|
|
96
100
|
pciDss?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/types/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/commands/scan.ts
CHANGED
|
@@ -22,7 +22,7 @@ import { resolve } from 'path';
|
|
|
22
22
|
import { glob } from 'glob';
|
|
23
23
|
import ora from 'ora';
|
|
24
24
|
import chalk from 'chalk';
|
|
25
|
-
import { scanFiles,
|
|
25
|
+
import { scanFiles, type ScannerConfig } from '../scanner/local-scanner';
|
|
26
26
|
import {
|
|
27
27
|
printScanStart,
|
|
28
28
|
printScanComplete,
|
|
@@ -34,14 +34,24 @@ import {
|
|
|
34
34
|
printJSONResults,
|
|
35
35
|
generateMarkdownReport,
|
|
36
36
|
printBriefSummary,
|
|
37
|
+
printTestStart,
|
|
38
|
+
printTestResult,
|
|
37
39
|
} from '../reporters/cli-reporter';
|
|
40
|
+
import { runTests, detectTestCommand } from '../utils/test-runner';
|
|
38
41
|
import { loadConfig } from '../config/config-loader';
|
|
39
42
|
import { trackScan } from '../utils/telemetry';
|
|
43
|
+
import {
|
|
44
|
+
evaluateCLIThresholds,
|
|
45
|
+
printThresholdResult,
|
|
46
|
+
} from '../utils/threshold-handler';
|
|
47
|
+
import { DEFAULT_THRESHOLD_CONFIG, type ThresholdConfig } from '../../../../src/lib/security/threshold-evaluator';
|
|
40
48
|
|
|
41
49
|
const execAsync = promisify(exec);
|
|
42
50
|
|
|
43
51
|
/**
|
|
44
52
|
* Command arguments type
|
|
53
|
+
*
|
|
54
|
+
* Winter Roadmap WR2: Added threshold configuration flags
|
|
45
55
|
*/
|
|
46
56
|
interface ScanArgs {
|
|
47
57
|
files?: string[];
|
|
@@ -52,6 +62,19 @@ interface ScanArgs {
|
|
|
52
62
|
severity?: 'critical' | 'high' | 'medium' | 'low';
|
|
53
63
|
fix?: boolean;
|
|
54
64
|
json?: boolean;
|
|
65
|
+
|
|
66
|
+
// WR2: Threshold configuration flags
|
|
67
|
+
thresholdEnabled?: boolean;
|
|
68
|
+
thresholdBlockCritical?: boolean;
|
|
69
|
+
thresholdBlockHigh?: boolean;
|
|
70
|
+
thresholdMaxVulnerabilities?: number;
|
|
71
|
+
thresholdMaxEpss?: number;
|
|
72
|
+
thresholdExemptPaths?: string[];
|
|
73
|
+
thresholdFailureMessage?: string;
|
|
74
|
+
|
|
75
|
+
// WR2: Test execution integration
|
|
76
|
+
verify?: boolean; // Run tests after scan
|
|
77
|
+
testCommand?: string; // Custom test command
|
|
55
78
|
}
|
|
56
79
|
|
|
57
80
|
/**
|
|
@@ -259,10 +282,6 @@ export async function scanCommand(args: ScanArgs): Promise<void> {
|
|
|
259
282
|
}
|
|
260
283
|
}
|
|
261
284
|
|
|
262
|
-
// Check if results exceed threshold
|
|
263
|
-
const threshold = scannerConfig.severityThreshold || 'critical';
|
|
264
|
-
const shouldBlock = exceedsThreshold(results, threshold);
|
|
265
|
-
|
|
266
285
|
// Calculate totals for telemetry and display
|
|
267
286
|
const totalCritical = results.reduce((sum, r) => sum + r.critical, 0);
|
|
268
287
|
const totalHigh = results.reduce((sum, r) => sum + r.high, 0);
|
|
@@ -285,15 +304,89 @@ export async function scanCommand(args: ScanArgs): Promise<void> {
|
|
|
285
304
|
scanDuration: duration,
|
|
286
305
|
}).catch(() => {}); // Ignore telemetry errors
|
|
287
306
|
|
|
288
|
-
|
|
307
|
+
// WR2: Build threshold configuration from CLI args or use defaults
|
|
308
|
+
const thresholdConfig: ThresholdConfig = {
|
|
309
|
+
enabled: args.thresholdEnabled ?? config.thresholdEnabled ?? DEFAULT_THRESHOLD_CONFIG.enabled,
|
|
310
|
+
blockOnCritical: args.thresholdBlockCritical ?? config.thresholdBlockCritical ?? DEFAULT_THRESHOLD_CONFIG.blockOnCritical,
|
|
311
|
+
blockOnHigh: args.thresholdBlockHigh ?? config.thresholdBlockHigh ?? DEFAULT_THRESHOLD_CONFIG.blockOnHigh,
|
|
312
|
+
maxVulnerabilities: args.thresholdMaxVulnerabilities ?? config.thresholdMaxVulnerabilities ?? DEFAULT_THRESHOLD_CONFIG.maxVulnerabilities,
|
|
313
|
+
maxEpss: args.thresholdMaxEpss ?? config.thresholdMaxEpss ?? DEFAULT_THRESHOLD_CONFIG.maxEpss,
|
|
314
|
+
exemptPaths: args.thresholdExemptPaths ?? config.thresholdExemptPaths ?? DEFAULT_THRESHOLD_CONFIG.exemptPaths,
|
|
315
|
+
failureMessage: args.thresholdFailureMessage ?? config.thresholdFailureMessage,
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
// WR2: Evaluate thresholds using comprehensive threshold system
|
|
319
|
+
const thresholdResult = evaluateCLIThresholds(results, thresholdConfig);
|
|
320
|
+
|
|
321
|
+
// Print threshold evaluation result (if thresholds enabled and not JSON mode)
|
|
322
|
+
if (thresholdConfig.enabled && !args.json) {
|
|
323
|
+
printThresholdResult(thresholdResult);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Check if scan failed based on threshold evaluation
|
|
327
|
+
const shouldBlock = !thresholdResult.passed;
|
|
328
|
+
|
|
329
|
+
// WR2: Test execution integration (--verify flag)
|
|
330
|
+
let testsPassed = true;
|
|
331
|
+
if (args.verify && !args.json) {
|
|
332
|
+
try {
|
|
333
|
+
// Get test command from args, config, or auto-detect
|
|
334
|
+
const testCommand = args.testCommand || config.testCommand || detectTestCommand();
|
|
335
|
+
|
|
336
|
+
if (!testCommand) {
|
|
337
|
+
console.log('');
|
|
338
|
+
console.log(chalk.yellow(' ⚠ No test command found'));
|
|
339
|
+
console.log(chalk.gray(' Specify a test command using --test-command or add "testCommand" to .codeslick.json'));
|
|
340
|
+
console.log('');
|
|
341
|
+
} else {
|
|
342
|
+
printTestStart(testCommand);
|
|
343
|
+
|
|
344
|
+
const testResult = await runTests(testCommand, {
|
|
345
|
+
cwd: process.cwd(),
|
|
346
|
+
timeout: config.testTimeout || 300000, // 5 minutes default
|
|
347
|
+
verbose: args.verbose,
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
printTestResult(testResult);
|
|
351
|
+
testsPassed = testResult.success;
|
|
352
|
+
}
|
|
353
|
+
} catch (error) {
|
|
354
|
+
console.log('');
|
|
355
|
+
console.log(chalk.red.bold(' ✖ Test execution failed'));
|
|
356
|
+
console.log(chalk.red(` ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
357
|
+
console.log('');
|
|
358
|
+
testsPassed = false;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Determine final exit code
|
|
363
|
+
// Both security scan and tests must pass
|
|
364
|
+
const finalSuccess = !shouldBlock && testsPassed;
|
|
365
|
+
|
|
366
|
+
if (!finalSuccess) {
|
|
289
367
|
if (!args.json) {
|
|
290
|
-
|
|
368
|
+
// Print failure summary
|
|
369
|
+
if (shouldBlock && !testsPassed) {
|
|
370
|
+
console.log(chalk.red.bold('\n Both security scan and tests failed\n'));
|
|
371
|
+
} else if (shouldBlock) {
|
|
372
|
+
// Threshold failure message already printed by printThresholdResult
|
|
373
|
+
// Just show commit blocked banner if using legacy severity threshold
|
|
374
|
+
if (!thresholdConfig.enabled) {
|
|
375
|
+
const threshold = scannerConfig.severityThreshold || 'critical';
|
|
376
|
+
printCommitBlocked(threshold, totalCritical, totalHigh, totalMedium, totalLow);
|
|
377
|
+
}
|
|
378
|
+
} else if (!testsPassed) {
|
|
379
|
+
console.log(chalk.red.bold('\n Tests failed - commit blocked\n'));
|
|
380
|
+
}
|
|
291
381
|
}
|
|
292
382
|
|
|
293
383
|
process.exit(1); // Exit with failure
|
|
294
384
|
} else {
|
|
295
385
|
if (!args.json) {
|
|
296
386
|
printCommitAllowed();
|
|
387
|
+
if (args.verify && testsPassed) {
|
|
388
|
+
console.log(chalk.green(' ✓ Tests passed'));
|
|
389
|
+
}
|
|
297
390
|
}
|
|
298
391
|
|
|
299
392
|
process.exit(0); // Exit with success
|
|
@@ -24,6 +24,8 @@ import { existsSync } from 'fs';
|
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* CodeSlick configuration interface
|
|
27
|
+
*
|
|
28
|
+
* Winter Roadmap WR2: Added threshold configuration fields
|
|
27
29
|
*/
|
|
28
30
|
export interface CodeSlickConfig {
|
|
29
31
|
version: string;
|
|
@@ -32,6 +34,19 @@ export interface CodeSlickConfig {
|
|
|
32
34
|
exclude: string[];
|
|
33
35
|
languages: ('javascript' | 'typescript' | 'python' | 'java' | 'go')[];
|
|
34
36
|
telemetry?: boolean; // Enable/disable anonymous usage tracking (default: true)
|
|
37
|
+
|
|
38
|
+
// WR2: Threshold configuration (Pass/Fail Gates)
|
|
39
|
+
thresholdEnabled?: boolean;
|
|
40
|
+
thresholdBlockCritical?: boolean;
|
|
41
|
+
thresholdBlockHigh?: boolean;
|
|
42
|
+
thresholdMaxVulnerabilities?: number;
|
|
43
|
+
thresholdMaxEpss?: number;
|
|
44
|
+
thresholdExemptPaths?: string[];
|
|
45
|
+
thresholdFailureMessage?: string;
|
|
46
|
+
|
|
47
|
+
// WR2: Test execution (Verify mode)
|
|
48
|
+
testCommand?: string; // Command to run tests (e.g., "npm test", "pytest", "go test")
|
|
49
|
+
testTimeout?: number; // Test timeout in milliseconds (default: 300000 = 5 min)
|
|
35
50
|
}
|
|
36
51
|
|
|
37
52
|
/**
|