pcu 0.3.5 → 0.3.6
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/dist/cli/commands/SecurityCommand.d.ts +113 -0
- package/dist/cli/commands/SecurityCommand.d.ts.map +1 -0
- package/dist/cli/commands/SecurityCommand.js +412 -0
- package/dist/cli/commands/SecurityCommand.js.map +1 -0
- package/dist/cli/formatters/OutputFormatter.d.ts +17 -0
- package/dist/cli/formatters/OutputFormatter.d.ts.map +1 -1
- package/dist/cli/formatters/OutputFormatter.js +113 -0
- package/dist/cli/formatters/OutputFormatter.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +45 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/common/config/Config.d.ts +2 -2
- package/dist/common/config/Config.d.ts.map +1 -1
- package/dist/common/config/Config.js +31 -4
- package/dist/common/config/Config.js.map +1 -1
- package/dist/common/utils/validation.d.ts.map +1 -1
- package/dist/common/utils/validation.js +29 -2
- package/dist/common/utils/validation.js.map +1 -1
- package/package.json +23 -23
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command to perform security vulnerability scanning and automated fixes.
|
|
5
|
+
* Integrates with npm audit and snyk for comprehensive security analysis.
|
|
6
|
+
*/
|
|
7
|
+
import { OutputFormatter, OutputFormat } from '../formatters/OutputFormatter.js';
|
|
8
|
+
export interface SecurityCommandOptions {
|
|
9
|
+
workspace?: string;
|
|
10
|
+
format?: OutputFormat;
|
|
11
|
+
audit?: boolean;
|
|
12
|
+
fixVulns?: boolean;
|
|
13
|
+
severity?: 'low' | 'moderate' | 'high' | 'critical';
|
|
14
|
+
includeDev?: boolean;
|
|
15
|
+
snyk?: boolean;
|
|
16
|
+
verbose?: boolean;
|
|
17
|
+
color?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface SecurityReport {
|
|
20
|
+
summary: {
|
|
21
|
+
totalVulnerabilities: number;
|
|
22
|
+
critical: number;
|
|
23
|
+
high: number;
|
|
24
|
+
moderate: number;
|
|
25
|
+
low: number;
|
|
26
|
+
info: number;
|
|
27
|
+
};
|
|
28
|
+
vulnerabilities: Vulnerability[];
|
|
29
|
+
recommendations: SecurityRecommendation[];
|
|
30
|
+
metadata: {
|
|
31
|
+
scanDate: string;
|
|
32
|
+
scanTools: string[];
|
|
33
|
+
workspacePath: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface Vulnerability {
|
|
37
|
+
id: string;
|
|
38
|
+
package: string;
|
|
39
|
+
severity: 'low' | 'moderate' | 'high' | 'critical';
|
|
40
|
+
title: string;
|
|
41
|
+
url: string;
|
|
42
|
+
range: string;
|
|
43
|
+
fixAvailable: boolean | string;
|
|
44
|
+
fixVersion?: string;
|
|
45
|
+
paths: string[];
|
|
46
|
+
cwe?: string[];
|
|
47
|
+
cve?: string[];
|
|
48
|
+
}
|
|
49
|
+
export interface SecurityRecommendation {
|
|
50
|
+
package: string;
|
|
51
|
+
currentVersion: string;
|
|
52
|
+
recommendedVersion: string;
|
|
53
|
+
type: 'update' | 'remove' | 'replace';
|
|
54
|
+
reason: string;
|
|
55
|
+
impact: string;
|
|
56
|
+
}
|
|
57
|
+
export declare class SecurityCommand {
|
|
58
|
+
private readonly outputFormatter;
|
|
59
|
+
constructor(outputFormatter: OutputFormatter);
|
|
60
|
+
/**
|
|
61
|
+
* Execute the security command
|
|
62
|
+
*/
|
|
63
|
+
execute(options?: SecurityCommandOptions): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Perform comprehensive security scan
|
|
66
|
+
*/
|
|
67
|
+
private performSecurityScan;
|
|
68
|
+
/**
|
|
69
|
+
* Run npm audit scan
|
|
70
|
+
*/
|
|
71
|
+
private runNpmAudit;
|
|
72
|
+
/**
|
|
73
|
+
* Run snyk scan
|
|
74
|
+
*/
|
|
75
|
+
private runSnykScan;
|
|
76
|
+
/**
|
|
77
|
+
* Parse npm audit results
|
|
78
|
+
*/
|
|
79
|
+
private parseNpmAuditResults;
|
|
80
|
+
/**
|
|
81
|
+
* Parse snyk results
|
|
82
|
+
*/
|
|
83
|
+
private parseSnykResults;
|
|
84
|
+
/**
|
|
85
|
+
* Generate security recommendations
|
|
86
|
+
*/
|
|
87
|
+
private generateRecommendations;
|
|
88
|
+
/**
|
|
89
|
+
* Generate summary from vulnerabilities
|
|
90
|
+
*/
|
|
91
|
+
private generateSummary;
|
|
92
|
+
/**
|
|
93
|
+
* Convert severity string to number for filtering
|
|
94
|
+
*/
|
|
95
|
+
private severityToNumber;
|
|
96
|
+
/**
|
|
97
|
+
* Show security recommendations
|
|
98
|
+
*/
|
|
99
|
+
private showRecommendations;
|
|
100
|
+
/**
|
|
101
|
+
* Auto-fix vulnerabilities
|
|
102
|
+
*/
|
|
103
|
+
private autoFixVulnerabilities;
|
|
104
|
+
/**
|
|
105
|
+
* Validate command options
|
|
106
|
+
*/
|
|
107
|
+
static validateOptions(options: SecurityCommandOptions): string[];
|
|
108
|
+
/**
|
|
109
|
+
* Get command help text
|
|
110
|
+
*/
|
|
111
|
+
static getHelpText(): string;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=SecurityCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityCommand.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/SecurityCommand.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAIjF,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QACP,oBAAoB,EAAE,MAAM,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,eAAe,EAAE,sBAAsB,EAAE,CAAC;IAC1C,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAE7D;;OAEG;IACG,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DlE;;OAEG;YACW,mBAAmB;IA6CjC;;OAEG;YACW,WAAW;IAkCzB;;OAEG;YACW,WAAW;IA+BzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAoC/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAqCvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;YACW,sBAAsB;IAuDpC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE;IAgBjE;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM;CA+B7B"}
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command to perform security vulnerability scanning and automated fixes.
|
|
5
|
+
* Integrates with npm audit and snyk for comprehensive security analysis.
|
|
6
|
+
*/
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import * as fs from 'fs-extra';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { EnhancedProgressBar } from '../formatters/ProgressBar.js';
|
|
11
|
+
import { StyledText, ThemeManager } from '../themes/ColorTheme.js';
|
|
12
|
+
export class SecurityCommand {
|
|
13
|
+
outputFormatter;
|
|
14
|
+
constructor(outputFormatter) {
|
|
15
|
+
this.outputFormatter = outputFormatter;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute the security command
|
|
19
|
+
*/
|
|
20
|
+
async execute(options = {}) {
|
|
21
|
+
let progressBar;
|
|
22
|
+
try {
|
|
23
|
+
// Initialize theme
|
|
24
|
+
ThemeManager.setTheme('default');
|
|
25
|
+
// Show loading with progress bar
|
|
26
|
+
progressBar = new EnhancedProgressBar({
|
|
27
|
+
text: 'Performing security analysis...',
|
|
28
|
+
color: 'cyan',
|
|
29
|
+
spinner: 'dots',
|
|
30
|
+
});
|
|
31
|
+
progressBar.start();
|
|
32
|
+
if (options.verbose) {
|
|
33
|
+
console.log(StyledText.iconAnalysis('Security vulnerability scanning'));
|
|
34
|
+
console.log(StyledText.muted(`Workspace: ${options.workspace || process.cwd()}`));
|
|
35
|
+
console.log(StyledText.muted(`Severity filter: ${options.severity || 'all'}`));
|
|
36
|
+
console.log('');
|
|
37
|
+
}
|
|
38
|
+
// Execute security scan
|
|
39
|
+
const report = await this.performSecurityScan(options);
|
|
40
|
+
progressBar.succeed('Security analysis completed');
|
|
41
|
+
// Format and display results
|
|
42
|
+
const formattedOutput = this.outputFormatter.formatSecurityReport(report);
|
|
43
|
+
console.log(formattedOutput);
|
|
44
|
+
// Show recommendations if available
|
|
45
|
+
if (report.recommendations.length > 0) {
|
|
46
|
+
this.showRecommendations(report);
|
|
47
|
+
}
|
|
48
|
+
// Auto-fix vulnerabilities if requested
|
|
49
|
+
if (options.fixVulns) {
|
|
50
|
+
await this.autoFixVulnerabilities(report, options);
|
|
51
|
+
}
|
|
52
|
+
// Exit with appropriate code based on findings
|
|
53
|
+
const exitCode = report.summary.critical > 0 ? 1 : 0;
|
|
54
|
+
process.exit(exitCode);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (progressBar) {
|
|
58
|
+
progressBar.fail('Security analysis failed');
|
|
59
|
+
}
|
|
60
|
+
console.error(StyledText.iconError('Error performing security scan:'));
|
|
61
|
+
console.error(StyledText.error(String(error)));
|
|
62
|
+
if (options.verbose && error instanceof Error) {
|
|
63
|
+
console.error(StyledText.muted('Stack trace:'));
|
|
64
|
+
console.error(StyledText.muted(error.stack || 'No stack trace available'));
|
|
65
|
+
}
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Perform comprehensive security scan
|
|
71
|
+
*/
|
|
72
|
+
async performSecurityScan(options) {
|
|
73
|
+
const workspacePath = options.workspace || process.cwd();
|
|
74
|
+
const vulnerabilities = [];
|
|
75
|
+
const recommendations = [];
|
|
76
|
+
// Check if package.json exists
|
|
77
|
+
const packageJsonPath = path.join(workspacePath, 'package.json');
|
|
78
|
+
if (!(await fs.pathExists(packageJsonPath))) {
|
|
79
|
+
throw new Error(`No package.json found in ${workspacePath}`);
|
|
80
|
+
}
|
|
81
|
+
// Run npm audit
|
|
82
|
+
if (options.audit !== false) {
|
|
83
|
+
const npmVulns = await this.runNpmAudit(workspacePath, options);
|
|
84
|
+
vulnerabilities.push(...npmVulns);
|
|
85
|
+
}
|
|
86
|
+
// Run snyk scan if available
|
|
87
|
+
if (options.snyk) {
|
|
88
|
+
const snykVulns = await this.runSnykScan(workspacePath, options);
|
|
89
|
+
vulnerabilities.push(...snykVulns);
|
|
90
|
+
}
|
|
91
|
+
// Generate recommendations
|
|
92
|
+
recommendations.push(...this.generateRecommendations(vulnerabilities));
|
|
93
|
+
// Filter by severity if specified
|
|
94
|
+
const filteredVulnerabilities = options.severity
|
|
95
|
+
? vulnerabilities.filter((v) => this.severityToNumber(v.severity) >= this.severityToNumber(options.severity))
|
|
96
|
+
: vulnerabilities;
|
|
97
|
+
return {
|
|
98
|
+
summary: this.generateSummary(filteredVulnerabilities),
|
|
99
|
+
vulnerabilities: filteredVulnerabilities,
|
|
100
|
+
recommendations: recommendations,
|
|
101
|
+
metadata: {
|
|
102
|
+
scanDate: new Date().toISOString(),
|
|
103
|
+
scanTools: ['npm-audit', ...(options.snyk ? ['snyk'] : [])],
|
|
104
|
+
workspacePath: workspacePath,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Run npm audit scan
|
|
110
|
+
*/
|
|
111
|
+
async runNpmAudit(workspacePath, options) {
|
|
112
|
+
try {
|
|
113
|
+
const auditArgs = ['audit', '--json'];
|
|
114
|
+
if (!options.includeDev) {
|
|
115
|
+
auditArgs.push('--omit=dev');
|
|
116
|
+
}
|
|
117
|
+
const auditOutput = execSync(`npm ${auditArgs.join(' ')}`, {
|
|
118
|
+
cwd: workspacePath,
|
|
119
|
+
encoding: 'utf8',
|
|
120
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
121
|
+
});
|
|
122
|
+
const auditData = JSON.parse(auditOutput);
|
|
123
|
+
return this.parseNpmAuditResults(auditData);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error.status === 1) {
|
|
127
|
+
// npm audit returns 1 when vulnerabilities are found
|
|
128
|
+
try {
|
|
129
|
+
const auditData = JSON.parse(error.stdout);
|
|
130
|
+
return this.parseNpmAuditResults(auditData);
|
|
131
|
+
}
|
|
132
|
+
catch (parseError) {
|
|
133
|
+
throw new Error(`Failed to parse npm audit output: ${error.message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
throw new Error(`npm audit failed: ${error.message}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Run snyk scan
|
|
143
|
+
*/
|
|
144
|
+
async runSnykScan(workspacePath, options) {
|
|
145
|
+
try {
|
|
146
|
+
// Check if snyk is installed
|
|
147
|
+
execSync('snyk --version', { stdio: 'pipe' });
|
|
148
|
+
const snykArgs = ['test', '--json'];
|
|
149
|
+
if (!options.includeDev) {
|
|
150
|
+
snykArgs.push('--dev');
|
|
151
|
+
}
|
|
152
|
+
const snykOutput = execSync(`snyk ${snykArgs.join(' ')}`, {
|
|
153
|
+
cwd: workspacePath,
|
|
154
|
+
encoding: 'utf8',
|
|
155
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
156
|
+
});
|
|
157
|
+
const snykData = JSON.parse(snykOutput);
|
|
158
|
+
return this.parseSnykResults(snykData);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
if (error.code === 'ENOENT') {
|
|
162
|
+
console.warn(StyledText.iconWarning('Snyk not found. Install with: npm install -g snyk'));
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
throw new Error(`Snyk scan failed: ${error.message}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Parse npm audit results
|
|
170
|
+
*/
|
|
171
|
+
parseNpmAuditResults(auditData) {
|
|
172
|
+
const vulnerabilities = [];
|
|
173
|
+
if (!auditData.vulnerabilities) {
|
|
174
|
+
return vulnerabilities;
|
|
175
|
+
}
|
|
176
|
+
for (const [id, vuln] of Object.entries(auditData.vulnerabilities)) {
|
|
177
|
+
const vulnerability = vuln;
|
|
178
|
+
vulnerabilities.push({
|
|
179
|
+
id: id,
|
|
180
|
+
package: vulnerability.name,
|
|
181
|
+
severity: vulnerability.severity,
|
|
182
|
+
title: vulnerability.title || vulnerability.name,
|
|
183
|
+
url: vulnerability.url || `https://npmjs.com/advisories/${id}`,
|
|
184
|
+
range: vulnerability.range,
|
|
185
|
+
fixAvailable: vulnerability.fixAvailable,
|
|
186
|
+
fixVersion: vulnerability.fixAvailable === true ? vulnerability.fixAvailable : undefined,
|
|
187
|
+
paths: vulnerability.via?.map((v) => v.source || v.name) || [vulnerability.name],
|
|
188
|
+
cwe: vulnerability.cwe,
|
|
189
|
+
cve: vulnerability.cve,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return vulnerabilities;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Parse snyk results
|
|
196
|
+
*/
|
|
197
|
+
parseSnykResults(snykData) {
|
|
198
|
+
const vulnerabilities = [];
|
|
199
|
+
if (!snykData.vulnerabilities) {
|
|
200
|
+
return vulnerabilities;
|
|
201
|
+
}
|
|
202
|
+
for (const vuln of snykData.vulnerabilities) {
|
|
203
|
+
vulnerabilities.push({
|
|
204
|
+
id: vuln.id,
|
|
205
|
+
package: vuln.packageName,
|
|
206
|
+
severity: vuln.severity,
|
|
207
|
+
title: vuln.title,
|
|
208
|
+
url: vuln.url,
|
|
209
|
+
range: vuln.semver?.vulnerable?.join(' || ') || vuln.version,
|
|
210
|
+
fixAvailable: vuln.fixedIn?.length > 0,
|
|
211
|
+
fixVersion: vuln.fixedIn?.[0],
|
|
212
|
+
paths: vuln.from || [vuln.packageName],
|
|
213
|
+
cwe: vuln.identifiers?.CWE || [],
|
|
214
|
+
cve: vuln.identifiers?.CVE || [],
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
return vulnerabilities;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Generate security recommendations
|
|
221
|
+
*/
|
|
222
|
+
generateRecommendations(vulnerabilities) {
|
|
223
|
+
const recommendations = [];
|
|
224
|
+
const packages = new Set(vulnerabilities.map((v) => v.package));
|
|
225
|
+
for (const pkg of packages) {
|
|
226
|
+
const pkgVulns = vulnerabilities.filter((v) => v.package === pkg);
|
|
227
|
+
const criticalVulns = pkgVulns.filter((v) => v.severity === 'critical' || v.severity === 'high');
|
|
228
|
+
if (criticalVulns.length > 0) {
|
|
229
|
+
const fixVersions = [
|
|
230
|
+
...new Set(criticalVulns.map((v) => v.fixVersion).filter((v) => v && typeof v === 'string')),
|
|
231
|
+
];
|
|
232
|
+
if (fixVersions.length > 0) {
|
|
233
|
+
const currentVersion = pkgVulns[0]?.range?.split(' ')[0] || 'unknown';
|
|
234
|
+
const recommendedVersion = fixVersions[0] || 'unknown';
|
|
235
|
+
recommendations.push({
|
|
236
|
+
package: pkg,
|
|
237
|
+
currentVersion: currentVersion,
|
|
238
|
+
recommendedVersion: recommendedVersion,
|
|
239
|
+
type: 'update',
|
|
240
|
+
reason: `${criticalVulns.length} critical vulnerabilities found`,
|
|
241
|
+
impact: 'High - Security vulnerability fix',
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return recommendations;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Generate summary from vulnerabilities
|
|
250
|
+
*/
|
|
251
|
+
generateSummary(vulnerabilities) {
|
|
252
|
+
const summary = {
|
|
253
|
+
totalVulnerabilities: vulnerabilities.length,
|
|
254
|
+
critical: 0,
|
|
255
|
+
high: 0,
|
|
256
|
+
moderate: 0,
|
|
257
|
+
low: 0,
|
|
258
|
+
info: 0,
|
|
259
|
+
};
|
|
260
|
+
for (const vuln of vulnerabilities) {
|
|
261
|
+
const severity = vuln.severity;
|
|
262
|
+
switch (severity) {
|
|
263
|
+
case 'critical':
|
|
264
|
+
summary.critical++;
|
|
265
|
+
break;
|
|
266
|
+
case 'high':
|
|
267
|
+
summary.high++;
|
|
268
|
+
break;
|
|
269
|
+
case 'moderate':
|
|
270
|
+
summary.moderate++;
|
|
271
|
+
break;
|
|
272
|
+
case 'low':
|
|
273
|
+
summary.low++;
|
|
274
|
+
break;
|
|
275
|
+
case 'info':
|
|
276
|
+
summary.info++;
|
|
277
|
+
break;
|
|
278
|
+
default:
|
|
279
|
+
summary.info++;
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return summary;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Convert severity string to number for filtering
|
|
287
|
+
*/
|
|
288
|
+
severityToNumber(severity) {
|
|
289
|
+
switch (severity) {
|
|
290
|
+
case 'critical':
|
|
291
|
+
return 4;
|
|
292
|
+
case 'high':
|
|
293
|
+
return 3;
|
|
294
|
+
case 'moderate':
|
|
295
|
+
return 2;
|
|
296
|
+
case 'low':
|
|
297
|
+
return 1;
|
|
298
|
+
case 'info':
|
|
299
|
+
return 0;
|
|
300
|
+
default:
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Show security recommendations
|
|
306
|
+
*/
|
|
307
|
+
showRecommendations(report) {
|
|
308
|
+
if (report.recommendations.length === 0) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
console.log('\n' + StyledText.iconInfo('Security Recommendations:'));
|
|
312
|
+
for (const rec of report.recommendations) {
|
|
313
|
+
console.log(` ${StyledText.iconWarning()} ${rec.package}: ${rec.currentVersion} → ${rec.recommendedVersion}`);
|
|
314
|
+
console.log(` ${StyledText.muted(rec.reason)}`);
|
|
315
|
+
console.log(` ${StyledText.muted(rec.impact)}`);
|
|
316
|
+
}
|
|
317
|
+
console.log('');
|
|
318
|
+
console.log(StyledText.iconUpdate('Run with --fix-vulns to apply automatic fixes'));
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Auto-fix vulnerabilities
|
|
322
|
+
*/
|
|
323
|
+
async autoFixVulnerabilities(report, options) {
|
|
324
|
+
if (report.recommendations.length === 0) {
|
|
325
|
+
console.log(StyledText.iconSuccess('No security fixes available'));
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
console.log('\n' + StyledText.iconUpdate('Applying security fixes...'));
|
|
329
|
+
const workspacePath = options.workspace || process.cwd();
|
|
330
|
+
const fixableVulns = report.recommendations.filter((r) => r.type === 'update');
|
|
331
|
+
if (fixableVulns.length === 0) {
|
|
332
|
+
console.log(StyledText.iconInfo('No automatic fixes available'));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
try {
|
|
336
|
+
// Run npm audit fix
|
|
337
|
+
const fixArgs = ['audit', 'fix'];
|
|
338
|
+
if (!options.includeDev) {
|
|
339
|
+
fixArgs.push('--omit=dev');
|
|
340
|
+
}
|
|
341
|
+
execSync(`npm ${fixArgs.join(' ')}`, {
|
|
342
|
+
cwd: workspacePath,
|
|
343
|
+
encoding: 'utf8',
|
|
344
|
+
stdio: 'inherit',
|
|
345
|
+
});
|
|
346
|
+
console.log(StyledText.iconSuccess('Security fixes applied successfully'));
|
|
347
|
+
// Re-run scan to verify fixes
|
|
348
|
+
console.log(StyledText.iconInfo('Re-running security scan to verify fixes...'));
|
|
349
|
+
const newReport = await this.performSecurityScan({ ...options, fixVulns: false });
|
|
350
|
+
if (newReport.summary.critical === 0 && newReport.summary.high === 0) {
|
|
351
|
+
console.log(StyledText.iconSuccess('All critical and high severity vulnerabilities have been fixed!'));
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
console.log(StyledText.iconWarning(`${newReport.summary.critical} critical and ${newReport.summary.high} high severity vulnerabilities remain`));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
console.error(StyledText.iconError('Failed to apply security fixes:'));
|
|
359
|
+
console.error(StyledText.error(error.message));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Validate command options
|
|
364
|
+
*/
|
|
365
|
+
static validateOptions(options) {
|
|
366
|
+
const errors = [];
|
|
367
|
+
// Validate format
|
|
368
|
+
if (options.format && !['table', 'json', 'yaml', 'minimal'].includes(options.format)) {
|
|
369
|
+
errors.push('Invalid format. Must be one of: table, json, yaml, minimal');
|
|
370
|
+
}
|
|
371
|
+
// Validate severity
|
|
372
|
+
if (options.severity && !['low', 'moderate', 'high', 'critical'].includes(options.severity)) {
|
|
373
|
+
errors.push('Invalid severity. Must be one of: low, moderate, high, critical');
|
|
374
|
+
}
|
|
375
|
+
return errors;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Get command help text
|
|
379
|
+
*/
|
|
380
|
+
static getHelpText() {
|
|
381
|
+
return `
|
|
382
|
+
Security vulnerability scanning and automated fixes
|
|
383
|
+
|
|
384
|
+
Usage:
|
|
385
|
+
pcu security [options]
|
|
386
|
+
|
|
387
|
+
Options:
|
|
388
|
+
--workspace <path> Workspace directory (default: current directory)
|
|
389
|
+
--format <type> Output format: table, json, yaml, minimal (default: table)
|
|
390
|
+
--audit Perform npm audit scan (default: true)
|
|
391
|
+
--fix-vulns Automatically fix vulnerabilities
|
|
392
|
+
--severity <level> Filter by severity: low, moderate, high, critical
|
|
393
|
+
--include-dev Include dev dependencies in scan
|
|
394
|
+
--snyk Include Snyk scan (requires snyk CLI)
|
|
395
|
+
--verbose Show detailed information
|
|
396
|
+
--no-color Disable colored output
|
|
397
|
+
|
|
398
|
+
Examples:
|
|
399
|
+
pcu security # Basic security scan
|
|
400
|
+
pcu security --fix-vulns # Scan and fix vulnerabilities
|
|
401
|
+
pcu security --severity high # Show only high severity issues
|
|
402
|
+
pcu security --snyk # Include Snyk scan
|
|
403
|
+
pcu security --format json # Output as JSON
|
|
404
|
+
|
|
405
|
+
Exit Codes:
|
|
406
|
+
0 No vulnerabilities found
|
|
407
|
+
1 Vulnerabilities found
|
|
408
|
+
2 Error occurred
|
|
409
|
+
`;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=SecurityCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityCommand.js","sourceRoot":"","sources":["../../../src/cli/commands/SecurityCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { ImpactAnalysis, OutdatedReport, UpdateResult } from '../../application/services/CatalogUpdateService.js';
|
|
8
8
|
import { WorkspaceStats, WorkspaceValidationReport } from '../../application/services/WorkspaceService.js';
|
|
9
|
+
import { SecurityReport } from '../commands/SecurityCommand.js';
|
|
9
10
|
export type OutputFormat = 'table' | 'json' | 'yaml' | 'minimal';
|
|
10
11
|
export declare class OutputFormatter {
|
|
11
12
|
private readonly format;
|
|
@@ -31,6 +32,10 @@ export declare class OutputFormatter {
|
|
|
31
32
|
* Format workspace statistics
|
|
32
33
|
*/
|
|
33
34
|
formatWorkspaceStats(stats: WorkspaceStats): string;
|
|
35
|
+
/**
|
|
36
|
+
* Format security report
|
|
37
|
+
*/
|
|
38
|
+
formatSecurityReport(report: SecurityReport): string;
|
|
34
39
|
/**
|
|
35
40
|
* Format simple message with optional styling
|
|
36
41
|
*/
|
|
@@ -75,6 +80,18 @@ export declare class OutputFormatter {
|
|
|
75
80
|
* Format workspace statistics minimally
|
|
76
81
|
*/
|
|
77
82
|
private formatStatsMinimal;
|
|
83
|
+
/**
|
|
84
|
+
* Format security report as table
|
|
85
|
+
*/
|
|
86
|
+
private formatSecurityTable;
|
|
87
|
+
/**
|
|
88
|
+
* Format security report minimally
|
|
89
|
+
*/
|
|
90
|
+
private formatSecurityMinimal;
|
|
91
|
+
/**
|
|
92
|
+
* Get color for severity level
|
|
93
|
+
*/
|
|
94
|
+
private getSeverityColor;
|
|
78
95
|
/**
|
|
79
96
|
* Apply color if color is enabled
|
|
80
97
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutputFormatter.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/OutputFormatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,EACd,YAAY,EACb,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,yBAAyB,EAC1B,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"OutputFormatter.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/OutputFormatter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,cAAc,EACd,cAAc,EACd,YAAY,EACb,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EACL,cAAc,EACd,yBAAyB,EAC1B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMhE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAMjE,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBADR,MAAM,GAAE,YAAsB,EAC9B,QAAQ,GAAE,OAAc;IAG3C;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAcpD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAchD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM;IActD;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM;IAcjE;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM;IAcnD;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAcpD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAe,GAAG,MAAM;IAkB/F;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsD3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwD7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsEzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+C3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4EzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgD7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAQ/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA6E3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAe7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA6E5B"}
|