@kairoaisec/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/api/client.d.ts +128 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +153 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +42 -0
- package/dist/api/index.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +72 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +13 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +174 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +56 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/whoami.d.ts +3 -0
- package/dist/commands/auth/whoami.d.ts.map +1 -0
- package/dist/commands/auth/whoami.js +110 -0
- package/dist/commands/auth/whoami.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +102 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/project/create.d.ts +3 -0
- package/dist/commands/project/create.d.ts.map +1 -0
- package/dist/commands/project/create.js +146 -0
- package/dist/commands/project/create.js.map +1 -0
- package/dist/commands/project/index.d.ts +3 -0
- package/dist/commands/project/index.d.ts.map +1 -0
- package/dist/commands/project/index.js +14 -0
- package/dist/commands/project/index.js.map +1 -0
- package/dist/commands/project/list.d.ts +3 -0
- package/dist/commands/project/list.d.ts.map +1 -0
- package/dist/commands/project/list.js +116 -0
- package/dist/commands/project/list.js.map +1 -0
- package/dist/commands/project/select.d.ts +3 -0
- package/dist/commands/project/select.d.ts.map +1 -0
- package/dist/commands/project/select.js +147 -0
- package/dist/commands/project/select.js.map +1 -0
- package/dist/commands/scan.d.ts +3 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +401 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/config/index.d.ts +44 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +237 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/file-discovery.d.ts +17 -0
- package/dist/lib/file-discovery.d.ts.map +1 -0
- package/dist/lib/file-discovery.js +218 -0
- package/dist/lib/file-discovery.js.map +1 -0
- package/dist/lib/patterns.d.ts +18 -0
- package/dist/lib/patterns.d.ts.map +1 -0
- package/dist/lib/patterns.js +187 -0
- package/dist/lib/patterns.js.map +1 -0
- package/dist/lib/sarif.d.ts +61 -0
- package/dist/lib/sarif.d.ts.map +1 -0
- package/dist/lib/sarif.js +169 -0
- package/dist/lib/sarif.js.map +1 -0
- package/dist/lib/scanner.d.ts +43 -0
- package/dist/lib/scanner.d.ts.map +1 -0
- package/dist/lib/scanner.js +163 -0
- package/dist/lib/scanner.js.map +1 -0
- package/dist/lib/slither.d.ts +112 -0
- package/dist/lib/slither.d.ts.map +1 -0
- package/dist/lib/slither.js +463 -0
- package/dist/lib/slither.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +44 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/spinner.d.ts +15 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +55 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +79 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.scanCommand = void 0;
|
|
40
|
+
const promises_1 = require("fs/promises");
|
|
41
|
+
const path_1 = require("path");
|
|
42
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
43
|
+
const commander_1 = require("commander");
|
|
44
|
+
const client_js_1 = require("../api/client.js");
|
|
45
|
+
const index_js_1 = require("../config/index.js");
|
|
46
|
+
const file_discovery_js_1 = require("../lib/file-discovery.js");
|
|
47
|
+
const scanner_js_1 = require("../lib/scanner.js");
|
|
48
|
+
const slither_js_1 = require("../lib/slither.js");
|
|
49
|
+
const logger_js_1 = require("../utils/logger.js");
|
|
50
|
+
const spinner_js_1 = require("../utils/spinner.js");
|
|
51
|
+
exports.scanCommand = new commander_1.Command('scan')
|
|
52
|
+
.argument('[path]', 'Directory or file to scan', '.')
|
|
53
|
+
.description('Scan smart contracts for security vulnerabilities')
|
|
54
|
+
.option('-f, --format <fmt>', 'Output format: text, json, sarif', 'text')
|
|
55
|
+
.option('-o, --output <file>', 'Write results to file')
|
|
56
|
+
.option('-s, --severity <level>', 'Minimum severity: low, medium, high, critical', 'medium')
|
|
57
|
+
.option('--no-upload', 'Skip uploading results to dashboard')
|
|
58
|
+
.option('--no-slither', 'Skip Slither analysis (use only Kairo patterns)')
|
|
59
|
+
.option('--slither-only', 'Run only Slither analysis (skip Kairo patterns)')
|
|
60
|
+
.option('--slither-timeout <ms>', 'Slither timeout in milliseconds', '120000')
|
|
61
|
+
.option('--fail-on <severities>', 'Exit 1 if findings match severities (critical,high,medium,low)')
|
|
62
|
+
.option('-v, --verbose', 'Verbose output')
|
|
63
|
+
.action(async (scanPath = '.', options) => {
|
|
64
|
+
await runScan(scanPath, options);
|
|
65
|
+
});
|
|
66
|
+
async function runScan(scanPath, options) {
|
|
67
|
+
const fullPath = (0, path_1.resolve)(scanPath);
|
|
68
|
+
// Validate the target path
|
|
69
|
+
const pathInfo = await (0, file_discovery_js_1.validatePath)(fullPath);
|
|
70
|
+
if (!pathInfo.exists) {
|
|
71
|
+
logger_js_1.Logger.error(`Path does not exist: ${scanPath}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
logger_js_1.Logger.info(`🔍 Scanning for vulnerabilities in: ${chalk_1.default.cyan(scanPath)}`);
|
|
75
|
+
logger_js_1.Logger.log('');
|
|
76
|
+
// Find Solidity files
|
|
77
|
+
const spinner = new spinner_js_1.Spinner('Discovering Solidity files...').start();
|
|
78
|
+
let solidityFiles = [];
|
|
79
|
+
try {
|
|
80
|
+
if (pathInfo.isFile) {
|
|
81
|
+
if (await (0, file_discovery_js_1.isSolidityFile)(fullPath)) {
|
|
82
|
+
solidityFiles = [fullPath];
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
spinner.fail('Target file is not a Solidity file (.sol)');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
solidityFiles = await (0, file_discovery_js_1.findSolidityFiles)(fullPath);
|
|
91
|
+
}
|
|
92
|
+
if (solidityFiles.length === 0) {
|
|
93
|
+
spinner.fail('No Solidity files found');
|
|
94
|
+
logger_js_1.Logger.warn("Make sure you're in a directory containing .sol files");
|
|
95
|
+
process.exit(0);
|
|
96
|
+
}
|
|
97
|
+
spinner.succeed(`Found ${solidityFiles.length} Solidity file${solidityFiles.length === 1 ? '' : 's'}`);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
spinner.fail('Failed to discover files');
|
|
101
|
+
logger_js_1.Logger.error('Error:', error.message);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
// Run Slither analysis first (unless disabled or slither-only)
|
|
105
|
+
const slitherFindings = [];
|
|
106
|
+
if (options.slither !== false) {
|
|
107
|
+
try {
|
|
108
|
+
const isInstalled = await slither_js_1.SlitherAnalyzer.isInstalled();
|
|
109
|
+
if (!isInstalled) {
|
|
110
|
+
if (options.verbose) {
|
|
111
|
+
logger_js_1.Logger.warn('⚠️ Slither is not installed');
|
|
112
|
+
logger_js_1.Logger.log('');
|
|
113
|
+
logger_js_1.Logger.log(slither_js_1.SlitherAnalyzer.getInstallInstructions());
|
|
114
|
+
logger_js_1.Logger.log('');
|
|
115
|
+
}
|
|
116
|
+
if (options.slitherOnly) {
|
|
117
|
+
logger_js_1.Logger.error('Slither is required for --slither-only mode');
|
|
118
|
+
process.exit(2);
|
|
119
|
+
}
|
|
120
|
+
if (!options.slitherOnly) {
|
|
121
|
+
logger_js_1.Logger.warn('Continuing with pattern scanning only...');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const slitherSpinner = new spinner_js_1.Spinner('Running Slither analysis...').start();
|
|
126
|
+
const slitherTimeout = parseInt(String(options.slitherTimeout || '120000'));
|
|
127
|
+
const result = await slither_js_1.SlitherAnalyzer.analyze(fullPath, { timeout: slitherTimeout });
|
|
128
|
+
if (result.success) {
|
|
129
|
+
slitherSpinner.succeed(`Slither found ${result.findings.length} issues`);
|
|
130
|
+
slitherFindings.push(...result.findings);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
slitherSpinner.warn(`Slither analysis completed with warnings`);
|
|
134
|
+
if (options.verbose && result.errors) {
|
|
135
|
+
result.errors.forEach((error) => logger_js_1.Logger.warn(`Slither warning: ${error}`));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logger_js_1.Logger.warn('Slither analysis failed:', error.message);
|
|
142
|
+
if (options.slitherOnly) {
|
|
143
|
+
process.exit(2);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Scan files for vulnerabilities with Kairo patterns (unless slither-only)
|
|
148
|
+
const allFindings = [];
|
|
149
|
+
if (!options.slitherOnly) {
|
|
150
|
+
const scanSpinner = new spinner_js_1.Spinner('Analyzing contracts for vulnerabilities...').start();
|
|
151
|
+
try {
|
|
152
|
+
let completedFiles = 0;
|
|
153
|
+
for (const filePath of solidityFiles) {
|
|
154
|
+
completedFiles++;
|
|
155
|
+
scanSpinner.updateText(`Scanning ${(0, path_1.basename)(filePath)} (${completedFiles}/${solidityFiles.length})`);
|
|
156
|
+
const findings = await (0, scanner_js_1.scanFile)(filePath);
|
|
157
|
+
allFindings.push(...findings);
|
|
158
|
+
}
|
|
159
|
+
scanSpinner.succeed(`Analyzed ${solidityFiles.length} files`);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
scanSpinner.fail('Failed to scan files');
|
|
163
|
+
logger_js_1.Logger.error('Error:', error.message);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Combine pattern and Slither findings
|
|
168
|
+
const allCombinedFindings = [...allFindings];
|
|
169
|
+
// Convert Slither findings to our Finding format
|
|
170
|
+
for (const slitherFinding of slitherFindings) {
|
|
171
|
+
const finding = {
|
|
172
|
+
id: `slither-${Date.now()}-${Math.random()}`,
|
|
173
|
+
severity: slitherFinding.severity.toUpperCase(),
|
|
174
|
+
title: slitherFinding.title,
|
|
175
|
+
description: slitherFinding.description,
|
|
176
|
+
file_path: slitherFinding.file_path || '',
|
|
177
|
+
line_start: parseInt(slitherFinding.affected_lines?.split('-')[0] || '1'),
|
|
178
|
+
line_end: parseInt(slitherFinding.affected_lines?.split('-')[1] ||
|
|
179
|
+
slitherFinding.affected_lines?.split('-')[0] ||
|
|
180
|
+
'1'),
|
|
181
|
+
code_snippet: '',
|
|
182
|
+
recommendation: slitherFinding.recommendation,
|
|
183
|
+
confidence: slitherFinding.confidence === 'high'
|
|
184
|
+
? 0.9
|
|
185
|
+
: slitherFinding.confidence === 'medium'
|
|
186
|
+
? 0.7
|
|
187
|
+
: 0.5,
|
|
188
|
+
cwe: undefined,
|
|
189
|
+
pattern_id: `slither-${slitherFinding.check_name || 'unknown'}`,
|
|
190
|
+
category: 'Slither',
|
|
191
|
+
fingerprint: `slither-${slitherFinding.file_path}-${slitherFinding.check_name}-${slitherFinding.affected_lines}`,
|
|
192
|
+
};
|
|
193
|
+
allCombinedFindings.push(finding);
|
|
194
|
+
}
|
|
195
|
+
// Filter findings by severity
|
|
196
|
+
const severityMap = { critical: 'CRITICAL', high: 'HIGH', medium: 'MEDIUM', low: 'LOW' };
|
|
197
|
+
const minSeverity = severityMap[options.severity] || 'MEDIUM';
|
|
198
|
+
const filteredFindings = (0, scanner_js_1.filterBySeverity)(allCombinedFindings, minSeverity);
|
|
199
|
+
const sortedFindings = (0, scanner_js_1.sortFindings)(filteredFindings);
|
|
200
|
+
// Aggregate results
|
|
201
|
+
const stats = (0, scanner_js_1.aggregateFindings)(allCombinedFindings);
|
|
202
|
+
// Display results
|
|
203
|
+
displayScanResults(sortedFindings, stats, scanPath);
|
|
204
|
+
// Save to file if requested
|
|
205
|
+
if (options.output) {
|
|
206
|
+
await saveResults(sortedFindings, options.output, options.format);
|
|
207
|
+
}
|
|
208
|
+
// Upload to dashboard unless disabled
|
|
209
|
+
if (!options.noUpload && (await index_js_1.configManager.isAuthenticated())) {
|
|
210
|
+
await uploadFindings(allCombinedFindings, solidityFiles, scanPath);
|
|
211
|
+
}
|
|
212
|
+
else if (!options.noUpload && options.verbose) {
|
|
213
|
+
logger_js_1.Logger.warn('Not authenticated. Use `kairo auth login` to upload results to dashboard.');
|
|
214
|
+
}
|
|
215
|
+
// Handle --fail-on exit codes
|
|
216
|
+
if (options.failOn) {
|
|
217
|
+
const failOnSeverities = options.failOn
|
|
218
|
+
.toLowerCase()
|
|
219
|
+
.split(',')
|
|
220
|
+
.map((s) => s.trim());
|
|
221
|
+
let shouldFail = false;
|
|
222
|
+
if (failOnSeverities.includes('critical') && stats.CRITICAL > 0) {
|
|
223
|
+
shouldFail = true;
|
|
224
|
+
}
|
|
225
|
+
if (failOnSeverities.includes('high') && stats.HIGH > 0) {
|
|
226
|
+
shouldFail = true;
|
|
227
|
+
}
|
|
228
|
+
if (failOnSeverities.includes('medium') && stats.MEDIUM > 0) {
|
|
229
|
+
shouldFail = true;
|
|
230
|
+
}
|
|
231
|
+
if (failOnSeverities.includes('low') && stats.LOW > 0) {
|
|
232
|
+
shouldFail = true;
|
|
233
|
+
}
|
|
234
|
+
if (shouldFail) {
|
|
235
|
+
if (options.verbose) {
|
|
236
|
+
logger_js_1.Logger.error(`Failing due to --fail-on ${options.failOn} with findings`);
|
|
237
|
+
}
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Standard exit codes: 0=clean, 1=findings, 2=error
|
|
242
|
+
const hasFindings = stats.CRITICAL > 0 || stats.HIGH > 0 || stats.MEDIUM > 0 || stats.LOW > 0;
|
|
243
|
+
process.exit(hasFindings ? 1 : 0);
|
|
244
|
+
}
|
|
245
|
+
function displayScanResults(findings, stats, scanPath) {
|
|
246
|
+
logger_js_1.Logger.log('');
|
|
247
|
+
logger_js_1.Logger.log(chalk_1.default.bold('📊 Scan Results'));
|
|
248
|
+
logger_js_1.Logger.log('');
|
|
249
|
+
// Display summary
|
|
250
|
+
const total = stats.total;
|
|
251
|
+
const criticalColor = stats.CRITICAL > 0 ? chalk_1.default.red : chalk_1.default.gray;
|
|
252
|
+
const highColor = stats.HIGH > 0 ? chalk_1.default.yellow : chalk_1.default.gray;
|
|
253
|
+
const mediumColor = stats.MEDIUM > 0 ? chalk_1.default.blue : chalk_1.default.gray;
|
|
254
|
+
const lowColor = stats.LOW > 0 ? chalk_1.default.green : chalk_1.default.gray;
|
|
255
|
+
logger_js_1.Logger.log(` ${criticalColor('●')} Critical: ${stats.CRITICAL}`);
|
|
256
|
+
logger_js_1.Logger.log(` ${highColor('●')} High: ${stats.HIGH}`);
|
|
257
|
+
logger_js_1.Logger.log(` ${mediumColor('●')} Medium: ${stats.MEDIUM}`);
|
|
258
|
+
logger_js_1.Logger.log(` ${lowColor('●')} Low: ${stats.LOW}`);
|
|
259
|
+
logger_js_1.Logger.log(` Total: ${total}`);
|
|
260
|
+
logger_js_1.Logger.log('');
|
|
261
|
+
if (findings.length === 0) {
|
|
262
|
+
logger_js_1.Logger.success('No vulnerabilities found! 🎉');
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// Display top findings (limit to 10)
|
|
266
|
+
const topFindings = findings.slice(0, 10);
|
|
267
|
+
logger_js_1.Logger.log(chalk_1.default.bold(`🚨 Top ${Math.min(findings.length, 10)} Issues:`));
|
|
268
|
+
logger_js_1.Logger.log('');
|
|
269
|
+
for (let i = 0; i < topFindings.length; i++) {
|
|
270
|
+
const finding = topFindings[i];
|
|
271
|
+
const severityColor = getSeverityColor(finding.severity);
|
|
272
|
+
const relativePath = finding.file_path.replace(process.cwd(), '.');
|
|
273
|
+
logger_js_1.Logger.log(`${i + 1}. ${severityColor(finding.severity)} - ${finding.title}`);
|
|
274
|
+
logger_js_1.Logger.log(` ${chalk_1.default.dim(`${relativePath}:${finding.line_start}`)}`);
|
|
275
|
+
logger_js_1.Logger.log(` ${finding.description}`);
|
|
276
|
+
logger_js_1.Logger.log('');
|
|
277
|
+
}
|
|
278
|
+
if (findings.length > 10) {
|
|
279
|
+
logger_js_1.Logger.log(chalk_1.default.dim(`... and ${findings.length - 10} more issues`));
|
|
280
|
+
logger_js_1.Logger.log('');
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function getSeverityColor(severity) {
|
|
284
|
+
switch (severity) {
|
|
285
|
+
case 'CRITICAL':
|
|
286
|
+
return chalk_1.default.red.bold;
|
|
287
|
+
case 'HIGH':
|
|
288
|
+
return chalk_1.default.yellow.bold;
|
|
289
|
+
case 'MEDIUM':
|
|
290
|
+
return chalk_1.default.blue;
|
|
291
|
+
case 'LOW':
|
|
292
|
+
return chalk_1.default.green;
|
|
293
|
+
default:
|
|
294
|
+
return chalk_1.default.gray;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
async function saveResults(findings, outputPath, format) {
|
|
298
|
+
const spinner = new spinner_js_1.Spinner('Saving results...').start();
|
|
299
|
+
try {
|
|
300
|
+
let content;
|
|
301
|
+
switch (format) {
|
|
302
|
+
case 'json':
|
|
303
|
+
content = JSON.stringify(findings, null, 2);
|
|
304
|
+
break;
|
|
305
|
+
case 'sarif':
|
|
306
|
+
content = JSON.stringify(convertToSarif(findings), null, 2);
|
|
307
|
+
break;
|
|
308
|
+
default: // table
|
|
309
|
+
content = formatAsTable(findings);
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
await (0, promises_1.writeFile)(outputPath, content);
|
|
313
|
+
spinner.succeed(`Results saved to ${outputPath}`);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
spinner.fail('Failed to save results');
|
|
317
|
+
logger_js_1.Logger.error('Error:', error.message);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
async function uploadFindings(findings, files, scanPath) {
|
|
321
|
+
const spinner = new spinner_js_1.Spinner('Uploading findings to dashboard...').start();
|
|
322
|
+
try {
|
|
323
|
+
const client = new client_js_1.KairoApiClient();
|
|
324
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
325
|
+
// Prepare files for upload
|
|
326
|
+
const fileContents = await Promise.all(files.map(async (filePath) => ({
|
|
327
|
+
path: filePath.replace(process.cwd(), '.'),
|
|
328
|
+
content: await fs.readFile(filePath, 'utf8'),
|
|
329
|
+
})));
|
|
330
|
+
const currentProject = index_js_1.configManager.getCurrentProject();
|
|
331
|
+
const response = await client.analyzeCode({
|
|
332
|
+
source: {
|
|
333
|
+
type: 'inline',
|
|
334
|
+
files: fileContents,
|
|
335
|
+
},
|
|
336
|
+
project_id: currentProject?.id,
|
|
337
|
+
config: {
|
|
338
|
+
severity_threshold: 'low',
|
|
339
|
+
include_suggestions: true,
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
const dashboardUrl = `${index_js_1.configManager.get('apiUrl')}/client/projects/${response.scan_id}`;
|
|
343
|
+
spinner.succeed('Results uploaded successfully');
|
|
344
|
+
logger_js_1.Logger.log('');
|
|
345
|
+
logger_js_1.Logger.info(`🌐 View detailed results: ${chalk_1.default.cyan(dashboardUrl)}`);
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
spinner.fail('Failed to upload results');
|
|
349
|
+
logger_js_1.Logger.warn(`Upload error: ${error.message}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
function formatAsTable(findings) {
|
|
353
|
+
if (findings.length === 0) {
|
|
354
|
+
return 'No vulnerabilities found.\n';
|
|
355
|
+
}
|
|
356
|
+
let output = 'File\tLine\tSeverity\tIssue\tDescription\n';
|
|
357
|
+
output += ''.padEnd(80, '-') + '\n';
|
|
358
|
+
for (const finding of findings) {
|
|
359
|
+
const relativePath = finding.file_path.replace(process.cwd(), '.');
|
|
360
|
+
output += `${relativePath}\t${finding.line_start}\t${finding.severity}\t${finding.title}\t${finding.description}\n`;
|
|
361
|
+
}
|
|
362
|
+
return output;
|
|
363
|
+
}
|
|
364
|
+
function convertToSarif(findings) {
|
|
365
|
+
return {
|
|
366
|
+
version: '2.1.0',
|
|
367
|
+
$schema: 'https://json.schemastore.org/sarif-2.1.0.json',
|
|
368
|
+
runs: [
|
|
369
|
+
{
|
|
370
|
+
tool: {
|
|
371
|
+
driver: {
|
|
372
|
+
name: 'Kairo CLI',
|
|
373
|
+
version: '0.1.0',
|
|
374
|
+
informationUri: 'https://kairoaisec.com',
|
|
375
|
+
},
|
|
376
|
+
},
|
|
377
|
+
results: findings.map((finding) => ({
|
|
378
|
+
ruleId: finding.pattern_id,
|
|
379
|
+
level: finding.severity.toLowerCase(),
|
|
380
|
+
message: {
|
|
381
|
+
text: finding.description,
|
|
382
|
+
},
|
|
383
|
+
locations: [
|
|
384
|
+
{
|
|
385
|
+
physicalLocation: {
|
|
386
|
+
artifactLocation: {
|
|
387
|
+
uri: finding.file_path,
|
|
388
|
+
},
|
|
389
|
+
region: {
|
|
390
|
+
startLine: finding.line_start,
|
|
391
|
+
endLine: finding.line_end,
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
],
|
|
396
|
+
})),
|
|
397
|
+
},
|
|
398
|
+
],
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export interface KairoConfig {
|
|
2
|
+
apiUrl?: string;
|
|
3
|
+
currentProject?: string;
|
|
4
|
+
userId?: string;
|
|
5
|
+
email?: string;
|
|
6
|
+
lastLogin?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface Project {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class ConfigManager {
|
|
15
|
+
private static instance;
|
|
16
|
+
private constructor();
|
|
17
|
+
static getInstance(): ConfigManager;
|
|
18
|
+
get<K extends keyof KairoConfig>(key: K): KairoConfig[K];
|
|
19
|
+
set<K extends keyof KairoConfig>(key: K, value: KairoConfig[K]): void;
|
|
20
|
+
getAll(): KairoConfig;
|
|
21
|
+
clear(): void;
|
|
22
|
+
private saveConfig;
|
|
23
|
+
private loadConfig;
|
|
24
|
+
getAuthToken(): Promise<string | null>;
|
|
25
|
+
setAuthToken(token: string): Promise<boolean>;
|
|
26
|
+
clearAuthToken(): Promise<boolean>;
|
|
27
|
+
getApiKey(): Promise<string | null>;
|
|
28
|
+
setApiKey(apiKey: string): Promise<boolean>;
|
|
29
|
+
clearApiKey(): Promise<boolean>;
|
|
30
|
+
private getTokenFromFile;
|
|
31
|
+
private setTokenToFile;
|
|
32
|
+
private clearTokenFromFile;
|
|
33
|
+
private getTokensPath;
|
|
34
|
+
getProjects(): Project[];
|
|
35
|
+
setProjects(projects: Project[]): void;
|
|
36
|
+
addProject(project: Project): void;
|
|
37
|
+
removeProject(projectId: string): void;
|
|
38
|
+
getCurrentProject(): Project | null;
|
|
39
|
+
setCurrentProject(projectId: string): void;
|
|
40
|
+
isAuthenticated(): Promise<boolean>;
|
|
41
|
+
getConfigPath(): string;
|
|
42
|
+
}
|
|
43
|
+
export declare const configManager: ConfigManager;
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IAEvC,OAAO;WAIO,WAAW,IAAI,aAAa;IAQ1C,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAIxD,GAAG,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAKrE,MAAM,IAAI,WAAW;IAIrB,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,UAAU;IAcZ,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUtC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW7C,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAclC,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUnC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAcrC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,aAAa;IAKrB,WAAW,IAAI,OAAO,EAAE;IAIxB,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAKtC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAMlC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKtC,iBAAiB,IAAI,OAAO,GAAG,IAAI;IAQnC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAK1C,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,aAAa,IAAI,MAAM;CAGxB;AAED,eAAO,MAAM,aAAa,eAA8B,CAAC"}
|