avana-cli 2.11.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 +32 -0
- package/LICENSE +21 -0
- package/README.md +584 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +153 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +101 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/scan.d.ts +19 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +383 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/uninstall.d.ts +6 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +80 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/index.d.ts +97 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +475 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/additional-patterns.d.ts +12 -0
- package/dist/rules/additional-patterns.d.ts.map +1 -0
- package/dist/rules/additional-patterns.js +170 -0
- package/dist/rules/additional-patterns.js.map +1 -0
- package/dist/rules/code-patterns.d.ts +26 -0
- package/dist/rules/code-patterns.d.ts.map +1 -0
- package/dist/rules/code-patterns.js +220 -0
- package/dist/rules/code-patterns.js.map +1 -0
- package/dist/rules/secret-patterns.d.ts +28 -0
- package/dist/rules/secret-patterns.d.ts.map +1 -0
- package/dist/rules/secret-patterns.js +1729 -0
- package/dist/rules/secret-patterns.js.map +1 -0
- package/dist/scanners/secret-scanner.d.ts +34 -0
- package/dist/scanners/secret-scanner.d.ts.map +1 -0
- package/dist/scanners/secret-scanner.js +281 -0
- package/dist/scanners/secret-scanner.js.map +1 -0
- package/dist/types/index.d.ts +116 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/error-handler.d.ts +126 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +222 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/exit-codes.d.ts +52 -0
- package/dist/utils/exit-codes.d.ts.map +1 -0
- package/dist/utils/exit-codes.js +89 -0
- package/dist/utils/exit-codes.js.map +1 -0
- package/dist/utils/file-stream-scanner.d.ts +31 -0
- package/dist/utils/file-stream-scanner.d.ts.map +1 -0
- package/dist/utils/file-stream-scanner.js +159 -0
- package/dist/utils/file-stream-scanner.js.map +1 -0
- package/dist/utils/file-type-detector.d.ts +45 -0
- package/dist/utils/file-type-detector.d.ts.map +1 -0
- package/dist/utils/file-type-detector.js +237 -0
- package/dist/utils/file-type-detector.js.map +1 -0
- package/dist/utils/ignore-pattern-manager.d.ts +61 -0
- package/dist/utils/ignore-pattern-manager.d.ts.map +1 -0
- package/dist/utils/ignore-pattern-manager.js +204 -0
- package/dist/utils/ignore-pattern-manager.js.map +1 -0
- package/dist/utils/json-output-formatter.d.ts +232 -0
- package/dist/utils/json-output-formatter.d.ts.map +1 -0
- package/dist/utils/json-output-formatter.js +367 -0
- package/dist/utils/json-output-formatter.js.map +1 -0
- package/dist/utils/logger.d.ts +181 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +414 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-output-formatter.d.ts +65 -0
- package/dist/utils/markdown-output-formatter.d.ts.map +1 -0
- package/dist/utils/markdown-output-formatter.js +316 -0
- package/dist/utils/markdown-output-formatter.js.map +1 -0
- package/dist/utils/memory-manager.d.ts +77 -0
- package/dist/utils/memory-manager.d.ts.map +1 -0
- package/dist/utils/memory-manager.js +157 -0
- package/dist/utils/memory-manager.js.map +1 -0
- package/dist/utils/parallel-scanner-worker.d.ts +19 -0
- package/dist/utils/parallel-scanner-worker.d.ts.map +1 -0
- package/dist/utils/parallel-scanner-worker.js +51 -0
- package/dist/utils/parallel-scanner-worker.js.map +1 -0
- package/dist/utils/parallel-scanner.d.ts +82 -0
- package/dist/utils/parallel-scanner.d.ts.map +1 -0
- package/dist/utils/parallel-scanner.js +229 -0
- package/dist/utils/parallel-scanner.js.map +1 -0
- package/dist/utils/pattern-validator.d.ts +108 -0
- package/dist/utils/pattern-validator.d.ts.map +1 -0
- package/dist/utils/pattern-validator.js +315 -0
- package/dist/utils/pattern-validator.js.map +1 -0
- package/dist/utils/progress-reporter.d.ts +68 -0
- package/dist/utils/progress-reporter.d.ts.map +1 -0
- package/dist/utils/progress-reporter.js +194 -0
- package/dist/utils/progress-reporter.js.map +1 -0
- package/dist/utils/result-cache.d.ts +99 -0
- package/dist/utils/result-cache.d.ts.map +1 -0
- package/dist/utils/result-cache.js +335 -0
- package/dist/utils/result-cache.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Avana CLI - Scan Command
|
|
4
|
+
* Scans project for security issues
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.scanCommand = scanCommand;
|
|
41
|
+
const index_1 = require("../index");
|
|
42
|
+
const json_output_formatter_1 = require("../utils/json-output-formatter");
|
|
43
|
+
const markdown_output_formatter_1 = require("../utils/markdown-output-formatter");
|
|
44
|
+
const exit_codes_1 = require("../utils/exit-codes");
|
|
45
|
+
const child_process_1 = require("child_process");
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const fs = __importStar(require("fs"));
|
|
48
|
+
/**
|
|
49
|
+
* Format memory size in human-readable format
|
|
50
|
+
*/
|
|
51
|
+
function formatMemorySize(bytes) {
|
|
52
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
53
|
+
let size = bytes;
|
|
54
|
+
let unitIndex = 0;
|
|
55
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
56
|
+
size /= 1024;
|
|
57
|
+
unitIndex++;
|
|
58
|
+
}
|
|
59
|
+
return `${size.toFixed(2)} ${units[unitIndex]}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get list of Git staged files
|
|
63
|
+
*/
|
|
64
|
+
function getStagedFiles() {
|
|
65
|
+
try {
|
|
66
|
+
const output = (0, child_process_1.execSync)('git diff --cached --name-only --diff-filter=ACM', {
|
|
67
|
+
encoding: 'utf-8',
|
|
68
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
69
|
+
});
|
|
70
|
+
return output
|
|
71
|
+
.split('\n')
|
|
72
|
+
.filter(file => file.trim() !== '')
|
|
73
|
+
.map(file => path.resolve(process.cwd(), file))
|
|
74
|
+
.filter(file => fs.existsSync(file) && fs.statSync(file).isFile());
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
// Not a git repository or no staged files
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Save results to file
|
|
83
|
+
*/
|
|
84
|
+
async function saveResults(result, score, outputJson, outputMd, rootPath) {
|
|
85
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
86
|
+
const reportsDir = path.join(rootPath, 'scan-reports');
|
|
87
|
+
// Create scan-reports directory if it doesn't exist
|
|
88
|
+
if (!fs.existsSync(reportsDir)) {
|
|
89
|
+
fs.mkdirSync(reportsDir, { recursive: true });
|
|
90
|
+
}
|
|
91
|
+
const savedPaths = {};
|
|
92
|
+
if (outputJson) {
|
|
93
|
+
const jsonFormatter = new json_output_formatter_1.JSONOutputFormatter();
|
|
94
|
+
const jsonContent = jsonFormatter.format(result, {
|
|
95
|
+
pretty: true,
|
|
96
|
+
includeMetadata: true,
|
|
97
|
+
includeDebugInfo: false
|
|
98
|
+
});
|
|
99
|
+
const jsonFilename = `avana-security-report-${timestamp}.json`;
|
|
100
|
+
const jsonPath = path.join(reportsDir, jsonFilename);
|
|
101
|
+
try {
|
|
102
|
+
fs.writeFileSync(jsonPath, jsonContent, 'utf-8');
|
|
103
|
+
console.log(`📄 JSON report saved: ${jsonFilename}`);
|
|
104
|
+
savedPaths.jsonPath = jsonPath;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error(`❌ Failed to save JSON report: ${error instanceof Error ? error.message : String(error)}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (outputMd) {
|
|
111
|
+
const mdFormatter = new markdown_output_formatter_1.MarkdownOutputFormatter();
|
|
112
|
+
const mdContent = mdFormatter.format(result, score);
|
|
113
|
+
const mdFilename = `avana-security-report-${timestamp}.md`;
|
|
114
|
+
const mdPath = path.join(reportsDir, mdFilename);
|
|
115
|
+
try {
|
|
116
|
+
fs.writeFileSync(mdPath, mdContent, 'utf-8');
|
|
117
|
+
console.log(`📝 Markdown report saved: ${mdFilename}`);
|
|
118
|
+
savedPaths.mdPath = mdPath;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(`❌ Failed to save Markdown report: ${error instanceof Error ? error.message : String(error)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return savedPaths;
|
|
125
|
+
}
|
|
126
|
+
async function scanCommand(options) {
|
|
127
|
+
const projectPath = options.path || process.cwd();
|
|
128
|
+
const rootPath = process.cwd(); // Always save reports to root directory
|
|
129
|
+
// Handle --staged flag
|
|
130
|
+
if (options.staged) {
|
|
131
|
+
const stagedFiles = getStagedFiles();
|
|
132
|
+
if (stagedFiles.length === 0) {
|
|
133
|
+
if (!options.quiet) {
|
|
134
|
+
console.log('ℹ️ No staged files to scan\n');
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!options.quiet) {
|
|
139
|
+
console.log(`🔍 Scanning ${stagedFiles.length} staged file(s)...\n`);
|
|
140
|
+
}
|
|
141
|
+
// Create Avana instance with robust options
|
|
142
|
+
const avana = new index_1.Avana({
|
|
143
|
+
debugMode: options.debug || false,
|
|
144
|
+
maxMemoryMB: options.maxMemory || 500,
|
|
145
|
+
cacheDir: path.join(rootPath, '.avana-cache'),
|
|
146
|
+
workerCount: options.workers
|
|
147
|
+
});
|
|
148
|
+
const scanOptions = {
|
|
149
|
+
path: projectPath,
|
|
150
|
+
verbose: options.verbose && !options.quiet,
|
|
151
|
+
includeFiles: stagedFiles,
|
|
152
|
+
config: {
|
|
153
|
+
enabled: true,
|
|
154
|
+
scanOnCommit: false,
|
|
155
|
+
scanOnPush: false,
|
|
156
|
+
blockOnCritical: false,
|
|
157
|
+
rules: {
|
|
158
|
+
secrets: {
|
|
159
|
+
enabled: true,
|
|
160
|
+
patterns: []
|
|
161
|
+
},
|
|
162
|
+
dependencies: {
|
|
163
|
+
enabled: false,
|
|
164
|
+
checkVulnerabilities: false,
|
|
165
|
+
minSeverity: 'low'
|
|
166
|
+
},
|
|
167
|
+
codePatterns: {
|
|
168
|
+
enabled: false,
|
|
169
|
+
checks: []
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
ignore: options.ignorePatterns || [],
|
|
173
|
+
notifications: {
|
|
174
|
+
cli: true,
|
|
175
|
+
web: false,
|
|
176
|
+
email: false
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const result = await avana.scan(scanOptions);
|
|
181
|
+
const scoreResult = avana.calculateSecurityScore(result);
|
|
182
|
+
// Save results to files
|
|
183
|
+
const savedPaths = await saveResults(result, scoreResult.score, options.outputJson || false, !options.outputJson, projectPath);
|
|
184
|
+
// Display results for staged files
|
|
185
|
+
displayStagedResults(result, scoreResult.score, savedPaths, options);
|
|
186
|
+
// Cleanup resources
|
|
187
|
+
await avana.cleanup();
|
|
188
|
+
// Determine and use proper exit code
|
|
189
|
+
const exitCode = (0, exit_codes_1.determineExitCode)(result, { failOnHigh: options.failOnHigh });
|
|
190
|
+
process.exit(exitCode);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (!options.quiet) {
|
|
194
|
+
console.log('🔍 Scanning project for security issues...\n');
|
|
195
|
+
console.log(`📁 Path: ${projectPath}\n`);
|
|
196
|
+
}
|
|
197
|
+
// Create Avana instance with robust options
|
|
198
|
+
const avana = new index_1.Avana({
|
|
199
|
+
debugMode: options.debug || false,
|
|
200
|
+
maxMemoryMB: options.maxMemory || 500,
|
|
201
|
+
cacheDir: path.join(rootPath, '.avana-cache'),
|
|
202
|
+
workerCount: options.workers
|
|
203
|
+
});
|
|
204
|
+
const scanOptions = {
|
|
205
|
+
path: projectPath,
|
|
206
|
+
verbose: (options.verbose && !options.quiet) || false,
|
|
207
|
+
config: {
|
|
208
|
+
enabled: true,
|
|
209
|
+
scanOnCommit: false,
|
|
210
|
+
scanOnPush: false,
|
|
211
|
+
blockOnCritical: false,
|
|
212
|
+
rules: {
|
|
213
|
+
secrets: {
|
|
214
|
+
enabled: true,
|
|
215
|
+
patterns: []
|
|
216
|
+
},
|
|
217
|
+
dependencies: {
|
|
218
|
+
enabled: false,
|
|
219
|
+
checkVulnerabilities: false,
|
|
220
|
+
minSeverity: 'low'
|
|
221
|
+
},
|
|
222
|
+
codePatterns: {
|
|
223
|
+
enabled: false,
|
|
224
|
+
checks: []
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
ignore: options.ignorePatterns || [],
|
|
228
|
+
notifications: {
|
|
229
|
+
cli: true,
|
|
230
|
+
web: false,
|
|
231
|
+
email: false
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
const result = await avana.scan(scanOptions);
|
|
236
|
+
const scoreResult = avana.calculateSecurityScore(result);
|
|
237
|
+
// Save results to files
|
|
238
|
+
const savedPaths = await saveResults(result, scoreResult.score, options.outputJson || false, !options.outputJson, projectPath);
|
|
239
|
+
// Display results
|
|
240
|
+
if (!options.quiet) {
|
|
241
|
+
console.log(`✅ Scan complete in ${result.duration}ms\n`);
|
|
242
|
+
// Show statistics if debug mode
|
|
243
|
+
if (options.debug) {
|
|
244
|
+
const memoryStats = avana.getMemoryStats();
|
|
245
|
+
const cacheStats = avana.getCacheStats();
|
|
246
|
+
const errorStats = avana.getErrorStats();
|
|
247
|
+
console.log('🔧 Debug Information:');
|
|
248
|
+
console.log(` Memory: ${formatMemorySize(memoryStats.currentUsage)} / ${formatMemorySize(memoryStats.limit)}`);
|
|
249
|
+
console.log(` Cache: ${cacheStats.hitRate.toFixed(1)}% hit rate (${cacheStats.hitCount} hits, ${cacheStats.missCount} misses)`);
|
|
250
|
+
console.log(` Errors: ${errorStats.totalErrors} total errors`);
|
|
251
|
+
console.log('');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (result.issues.length === 0) {
|
|
255
|
+
if (!options.quiet) {
|
|
256
|
+
console.log('🎉 No security issues found!\n');
|
|
257
|
+
console.log(`📊 Security Score: ${scoreResult.score}/100 (Excellent)\n`);
|
|
258
|
+
// Show file output message with paths
|
|
259
|
+
console.log(`📋 Reports have been saved:`);
|
|
260
|
+
if (savedPaths.jsonPath) {
|
|
261
|
+
console.log(` 📄 JSON: ${savedPaths.jsonPath}`);
|
|
262
|
+
}
|
|
263
|
+
if (savedPaths.mdPath) {
|
|
264
|
+
console.log(` 📝 Markdown: ${savedPaths.mdPath}`);
|
|
265
|
+
}
|
|
266
|
+
console.log('');
|
|
267
|
+
}
|
|
268
|
+
// Cleanup resources
|
|
269
|
+
await avana.cleanup();
|
|
270
|
+
// Exit with success code
|
|
271
|
+
process.exit(exit_codes_1.ExitCode.SUCCESS);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
// Display summary
|
|
275
|
+
if (!options.quiet) {
|
|
276
|
+
console.log('🚨 SECURITY ISSUES FOUND\n');
|
|
277
|
+
console.log(`┌─────────────────────────────────────────┐`);
|
|
278
|
+
console.log(`│ 🔴 Critical: ${result.summary.critical.toString().padEnd(27)}│`);
|
|
279
|
+
console.log(`│ 🟠 High: ${result.summary.high.toString().padEnd(27)}│`);
|
|
280
|
+
console.log(`│ 🟡 Medium: ${result.summary.medium.toString().padEnd(27)}│`);
|
|
281
|
+
console.log(`│ 🟢 Low: ${result.summary.low.toString().padEnd(27)}│`);
|
|
282
|
+
console.log(`└─────────────────────────────────────────┘\n`);
|
|
283
|
+
// Display critical, high, and medium issues
|
|
284
|
+
const criticalIssues = result.issues.filter(i => i.severity === 'critical' || i.severity === 'high' || i.severity === 'medium');
|
|
285
|
+
if (criticalIssues.length > 0) {
|
|
286
|
+
console.log('Critical, High & Medium Severity Issues:\n');
|
|
287
|
+
criticalIssues.slice(0, 10).forEach((issue) => {
|
|
288
|
+
const icon = issue.severity === 'critical' ? '🔴' : issue.severity === 'high' ? '🟠' : '🟡';
|
|
289
|
+
console.log(`${icon} ${issue.title}`);
|
|
290
|
+
console.log(` File: ${issue.file}:${issue.line}`);
|
|
291
|
+
console.log(` ${issue.description}`);
|
|
292
|
+
if (issue.suggestion) {
|
|
293
|
+
console.log(` ✅ Fix: ${issue.suggestion}`);
|
|
294
|
+
}
|
|
295
|
+
console.log('');
|
|
296
|
+
});
|
|
297
|
+
if (criticalIssues.length > 10) {
|
|
298
|
+
console.log(`... and ${criticalIssues.length - 10} more issues\n`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
console.log(`📊 Security Score: ${scoreResult.score}/100\n`);
|
|
302
|
+
if (scoreResult.score < 50) {
|
|
303
|
+
console.log('⚠️ Your security score is low. Please address critical issues immediately.\n');
|
|
304
|
+
}
|
|
305
|
+
else if (scoreResult.score < 80) {
|
|
306
|
+
console.log('💡 Your security score is moderate. Consider addressing high-priority issues.\n');
|
|
307
|
+
}
|
|
308
|
+
// Show file output message with paths
|
|
309
|
+
console.log(`📋 Detailed reports have been saved for easy review:`);
|
|
310
|
+
if (savedPaths.jsonPath) {
|
|
311
|
+
console.log(` 📄 JSON: ${savedPaths.jsonPath}`);
|
|
312
|
+
}
|
|
313
|
+
if (savedPaths.mdPath) {
|
|
314
|
+
console.log(` 📝 Markdown: ${savedPaths.mdPath}`);
|
|
315
|
+
}
|
|
316
|
+
console.log('');
|
|
317
|
+
}
|
|
318
|
+
// Cleanup resources
|
|
319
|
+
await avana.cleanup();
|
|
320
|
+
// Determine and use proper exit code
|
|
321
|
+
const exitCode = (0, exit_codes_1.determineExitCode)(result, { failOnHigh: options.failOnHigh });
|
|
322
|
+
process.exit(exitCode);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Display results for staged files (pre-commit hook)
|
|
326
|
+
*/
|
|
327
|
+
function displayStagedResults(result, score, savedPaths, options) {
|
|
328
|
+
if (result.issues.length === 0) {
|
|
329
|
+
console.log('✅ No security issues found in staged files\n');
|
|
330
|
+
// Show file output message with paths for staged scans
|
|
331
|
+
console.log(`📋 Reports have been saved:`);
|
|
332
|
+
if (savedPaths.jsonPath) {
|
|
333
|
+
console.log(` 📄 JSON: ${savedPaths.jsonPath}`);
|
|
334
|
+
}
|
|
335
|
+
if (savedPaths.mdPath) {
|
|
336
|
+
console.log(` 📝 Markdown: ${savedPaths.mdPath}`);
|
|
337
|
+
}
|
|
338
|
+
console.log('');
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
const criticalCount = result.summary.critical;
|
|
342
|
+
const highCount = result.summary.high;
|
|
343
|
+
const mediumCount = result.summary.medium;
|
|
344
|
+
// Display critical, high, and medium issues
|
|
345
|
+
const criticalIssues = result.issues.filter((i) => i.severity === 'critical' || i.severity === 'high' || i.severity === 'medium');
|
|
346
|
+
if (criticalIssues.length > 0) {
|
|
347
|
+
console.log('🚨 COMMIT BLOCKED - Security Issues Found\n');
|
|
348
|
+
console.log(`Found ${criticalCount} critical, ${highCount} high, and ${mediumCount} medium severity issue(s):\n`);
|
|
349
|
+
criticalIssues.forEach((issue) => {
|
|
350
|
+
const icon = issue.severity === 'critical' ? '🔴' : issue.severity === 'high' ? '🟠' : '🟡';
|
|
351
|
+
console.log(`${icon} ${issue.title}`);
|
|
352
|
+
console.log(` File: ${issue.file}:${issue.line}`);
|
|
353
|
+
console.log(` ${issue.description}`);
|
|
354
|
+
if (issue.suggestion) {
|
|
355
|
+
console.log(` ✅ Fix: ${issue.suggestion}`);
|
|
356
|
+
}
|
|
357
|
+
console.log('');
|
|
358
|
+
});
|
|
359
|
+
console.log('❌ Please fix these issues before committing\n');
|
|
360
|
+
console.log('💡 Tips:');
|
|
361
|
+
console.log(' • Fix the issues and try again');
|
|
362
|
+
console.log(' • Check the detailed security report for more information');
|
|
363
|
+
console.log(' • To bypass (not recommended): git commit --no-verify\n');
|
|
364
|
+
// Don't exit here - let the caller handle the exit code
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
// Only low issues - allow commit with warning
|
|
369
|
+
console.log('⚠️ Found security issues in staged files:\n');
|
|
370
|
+
console.log(`🟢 Low: ${result.summary.low}\n`);
|
|
371
|
+
console.log('💡 Consider fixing these issues soon\n');
|
|
372
|
+
// Show file output message with paths for staged scans
|
|
373
|
+
console.log(`📋 Reports have been saved:`);
|
|
374
|
+
if (savedPaths.jsonPath) {
|
|
375
|
+
console.log(` 📄 JSON: ${savedPaths.jsonPath}`);
|
|
376
|
+
}
|
|
377
|
+
if (savedPaths.mdPath) {
|
|
378
|
+
console.log(` 📝 Markdown: ${savedPaths.mdPath}`);
|
|
379
|
+
}
|
|
380
|
+
console.log('');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCtD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Avana CLI - Uninstall Command
|
|
4
|
+
* Removes Git hooks installed by Avana
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.uninstallCommand = uninstallCommand;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const exit_codes_1 = require("../utils/exit-codes");
|
|
44
|
+
async function uninstallCommand() {
|
|
45
|
+
console.log('🔓 Uninstalling Avana Git hooks...\n');
|
|
46
|
+
try {
|
|
47
|
+
// Check if .husky directory exists
|
|
48
|
+
const huskyDir = path.join(process.cwd(), '.husky');
|
|
49
|
+
if (!fs.existsSync(huskyDir)) {
|
|
50
|
+
console.log('ℹ️ No Git hooks found to uninstall\n');
|
|
51
|
+
process.exit(exit_codes_1.ExitCode.SUCCESS);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Remove pre-commit hook
|
|
55
|
+
const preCommitPath = path.join(huskyDir, 'pre-commit');
|
|
56
|
+
if (fs.existsSync(preCommitPath)) {
|
|
57
|
+
// Check if it's an Avana hook
|
|
58
|
+
const content = fs.readFileSync(preCommitPath, 'utf-8');
|
|
59
|
+
if (content.includes('avana scan')) {
|
|
60
|
+
fs.unlinkSync(preCommitPath);
|
|
61
|
+
console.log('✅ Removed pre-commit hook\n');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log('ℹ️ Pre-commit hook exists but was not created by Avana');
|
|
65
|
+
console.log(' Skipping removal to preserve your custom hook\n');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log('ℹ️ No pre-commit hook found\n');
|
|
70
|
+
}
|
|
71
|
+
console.log('✅ Avana Git hooks uninstalled successfully!\n');
|
|
72
|
+
console.log('💡 To reinstall: avana install\n');
|
|
73
|
+
process.exit(exit_codes_1.ExitCode.SUCCESS);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('❌ Error uninstalling Git hooks:', error.message);
|
|
77
|
+
(0, exit_codes_1.handleUnexpectedError)(error instanceof Error ? error : new Error(String(error)));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMH,4CAoCC;AAxCD,uCAAyB;AACzB,2CAA6B;AAC7B,oDAAsE;AAE/D,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,qBAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,8BAA8B;YAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,OAAO,CAAC,IAAI,CAAC,qBAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAChE,IAAA,kCAAqB,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avana - Core Engine
|
|
3
|
+
* Main entry point for security scanning functionality
|
|
4
|
+
*/
|
|
5
|
+
export * from './types';
|
|
6
|
+
export * from './scanners/secret-scanner';
|
|
7
|
+
export * from './rules/secret-patterns';
|
|
8
|
+
export * from './rules/additional-patterns';
|
|
9
|
+
import type { ScanResult, ScanOptions, ScoreBreakdown } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* Main Avana Engine with robust file handling and performance optimization
|
|
12
|
+
*/
|
|
13
|
+
export declare class Avana {
|
|
14
|
+
private secretScanner;
|
|
15
|
+
private fileTypeDetector;
|
|
16
|
+
private fileStreamScanner;
|
|
17
|
+
private errorHandler;
|
|
18
|
+
private memoryManager;
|
|
19
|
+
private resultCache;
|
|
20
|
+
private parallelScanner;
|
|
21
|
+
private jsonFormatter;
|
|
22
|
+
constructor(options?: {
|
|
23
|
+
debugMode?: boolean;
|
|
24
|
+
maxMemoryMB?: number;
|
|
25
|
+
cacheDir?: string;
|
|
26
|
+
workerCount?: number;
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Perform a complete security scan with robust file handling
|
|
30
|
+
*/
|
|
31
|
+
scan(options: ScanOptions): Promise<ScanResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Scan specific files with robust handling
|
|
34
|
+
*/
|
|
35
|
+
private scanSpecificFiles;
|
|
36
|
+
/**
|
|
37
|
+
* Scan directory with robust handling and parallel processing
|
|
38
|
+
*/
|
|
39
|
+
private scanDirectoryRobust;
|
|
40
|
+
/**
|
|
41
|
+
* Calculate security score (0-100) with detailed breakdown
|
|
42
|
+
* - Start with base score of 100
|
|
43
|
+
* - Deduct points based on severity:
|
|
44
|
+
* - Critical: -20 points each
|
|
45
|
+
* - High: -10 points each
|
|
46
|
+
* - Medium: -5 points each
|
|
47
|
+
* - Low: -2 points each
|
|
48
|
+
* - Minimum score is 0
|
|
49
|
+
*
|
|
50
|
+
* This calculation is deterministic - same inputs always produce same output
|
|
51
|
+
*/
|
|
52
|
+
calculateSecurityScore(result: ScanResult): {
|
|
53
|
+
score: number;
|
|
54
|
+
breakdown: ScoreBreakdown;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Get total pattern count
|
|
58
|
+
*/
|
|
59
|
+
getPatternCount(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Get memory statistics
|
|
62
|
+
*/
|
|
63
|
+
getMemoryStats(): import("./utils/memory-manager").MemoryStats;
|
|
64
|
+
/**
|
|
65
|
+
* Get cache statistics
|
|
66
|
+
*/
|
|
67
|
+
getCacheStats(): import("./utils/result-cache").CacheStats;
|
|
68
|
+
/**
|
|
69
|
+
* Get error statistics
|
|
70
|
+
*/
|
|
71
|
+
getErrorStats(): {
|
|
72
|
+
totalErrors: number;
|
|
73
|
+
errorsByType: Record<string, number>;
|
|
74
|
+
hasErrors: boolean;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Format scan result as JSON
|
|
78
|
+
*/
|
|
79
|
+
formatAsJSON(result: ScanResult, options?: {
|
|
80
|
+
pretty?: boolean;
|
|
81
|
+
includeMetadata?: boolean;
|
|
82
|
+
includeDebugInfo?: boolean;
|
|
83
|
+
}): string;
|
|
84
|
+
/**
|
|
85
|
+
* Clear all caches and reset state
|
|
86
|
+
*/
|
|
87
|
+
clearCache(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Cleanup resources
|
|
90
|
+
*/
|
|
91
|
+
cleanup(): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Convert ScanResult to JSONOutputFormatter format
|
|
94
|
+
*/
|
|
95
|
+
private convertToFormatterResult;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAG5C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAiB,cAAc,EAAE,MAAM,SAAS,CAAC;AActF;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAsB;gBAE/B,OAAO,CAAC,EAAE;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;IAWD;;OAEG;IACU,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAgG5D;;OAEG;YACW,iBAAiB;IA0E/B;;OAEG;YACW,mBAAmB;IAgIjC;;;;;;;;;;;OAWG;IACI,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,cAAc,CAAA;KAAE;IA+B/F;;OAEG;IACI,eAAe,IAAI,MAAM;IAIhC;;OAEG;IACI,cAAc;IAIrB;;OAEG;IACI,aAAa;IAIpB;;OAEG;IACI,aAAa;;;;;IAQpB;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QAChD,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,GAAG,MAAM;IAMV;;OAEG;IACI,UAAU,IAAI,IAAI;IAMzB;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAyDjC"}
|