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.
Files changed (66) hide show
  1. package/__tests__/threshold-handler.test.ts +175 -0
  2. package/dist/packages/cli/src/commands/scan.d.ts +11 -0
  3. package/dist/packages/cli/src/commands/scan.d.ts.map +1 -1
  4. package/dist/packages/cli/src/commands/scan.js +74 -5
  5. package/dist/packages/cli/src/commands/scan.js.map +1 -1
  6. package/dist/packages/cli/src/config/config-loader.d.ts +11 -0
  7. package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -1
  8. package/dist/packages/cli/src/config/config-loader.js.map +1 -1
  9. package/dist/packages/cli/src/reporters/cli-reporter.d.ts +18 -0
  10. package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -1
  11. package/dist/packages/cli/src/reporters/cli-reporter.js +115 -0
  12. package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -1
  13. package/dist/packages/cli/src/utils/test-runner.d.ts +84 -0
  14. package/dist/packages/cli/src/utils/test-runner.d.ts.map +1 -0
  15. package/dist/packages/cli/src/utils/test-runner.js +209 -0
  16. package/dist/packages/cli/src/utils/test-runner.js.map +1 -0
  17. package/dist/packages/cli/src/utils/threshold-handler.d.ts +40 -0
  18. package/dist/packages/cli/src/utils/threshold-handler.d.ts.map +1 -0
  19. package/dist/packages/cli/src/utils/threshold-handler.js +85 -0
  20. package/dist/packages/cli/src/utils/threshold-handler.js.map +1 -0
  21. package/dist/src/lib/analyzers/go-analyzer.d.ts +5 -0
  22. package/dist/src/lib/analyzers/go-analyzer.d.ts.map +1 -1
  23. package/dist/src/lib/analyzers/go-analyzer.js +47 -0
  24. package/dist/src/lib/analyzers/go-analyzer.js.map +1 -1
  25. package/dist/src/lib/analyzers/java-analyzer.d.ts +5 -0
  26. package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -1
  27. package/dist/src/lib/analyzers/java-analyzer.js +48 -0
  28. package/dist/src/lib/analyzers/java-analyzer.js.map +1 -1
  29. package/dist/src/lib/analyzers/javascript-analyzer.d.ts +5 -0
  30. package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -1
  31. package/dist/src/lib/analyzers/javascript-analyzer.js +48 -0
  32. package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -1
  33. package/dist/src/lib/analyzers/python-analyzer.d.ts +5 -0
  34. package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -1
  35. package/dist/src/lib/analyzers/python-analyzer.js +55 -0
  36. package/dist/src/lib/analyzers/python-analyzer.js.map +1 -1
  37. package/dist/src/lib/analyzers/types.d.ts +4 -0
  38. package/dist/src/lib/analyzers/types.d.ts.map +1 -1
  39. package/dist/src/lib/analyzers/typescript-analyzer.d.ts +5 -0
  40. package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -1
  41. package/dist/src/lib/analyzers/typescript-analyzer.js +48 -0
  42. package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -1
  43. package/dist/src/lib/github/types.d.ts +112 -0
  44. package/dist/src/lib/github/types.d.ts.map +1 -0
  45. package/dist/src/lib/github/types.js +34 -0
  46. package/dist/src/lib/github/types.js.map +1 -0
  47. package/dist/src/lib/security/epss-service.d.ts +63 -0
  48. package/dist/src/lib/security/epss-service.d.ts.map +1 -0
  49. package/dist/src/lib/security/epss-service.js +256 -0
  50. package/dist/src/lib/security/epss-service.js.map +1 -0
  51. package/dist/src/lib/security/threshold-evaluator.d.ts +73 -0
  52. package/dist/src/lib/security/threshold-evaluator.d.ts.map +1 -0
  53. package/dist/src/lib/security/threshold-evaluator.js +234 -0
  54. package/dist/src/lib/security/threshold-evaluator.js.map +1 -0
  55. package/dist/src/lib/security/triage-service.d.ts +76 -0
  56. package/dist/src/lib/security/triage-service.d.ts.map +1 -0
  57. package/dist/src/lib/security/triage-service.js +318 -0
  58. package/dist/src/lib/security/triage-service.js.map +1 -0
  59. package/dist/src/lib/types/index.d.ts +4 -0
  60. package/dist/src/lib/types/index.d.ts.map +1 -1
  61. package/package.json +1 -1
  62. package/src/commands/scan.ts +100 -7
  63. package/src/config/config-loader.ts +15 -0
  64. package/src/reporters/cli-reporter.ts +132 -0
  65. package/src/utils/test-runner.ts +249 -0
  66. 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":"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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codeslick-cli",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "CodeSlick CLI tool for pre-commit security scanning",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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, exceedsThreshold, type ScannerConfig } from '../scanner/local-scanner';
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
- if (shouldBlock) {
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
- printCommitBlocked(threshold, totalCritical, totalHigh, totalMedium, totalLow);
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
  /**