coverme-security-scanner 3.0.0 → 3.2.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/README.md +55 -65
- package/bin/coverme.js +44 -0
- package/bin/install-command.js +90 -0
- package/commands/coverme.md +326 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -124
- package/dist/pdf/generator.d.ts +48 -0
- package/dist/pdf/generator.js +1235 -0
- package/dist/pdf/styles.d.ts +84 -0
- package/dist/pdf/styles.js +89 -0
- package/dist/pdf/types.d.ts +203 -0
- package/dist/pdf/types.js +1 -0
- package/package.json +24 -23
- package/.claude/commands/coverme.md +0 -349
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/pdf-generator.d.ts +0 -32
- package/dist/pdf-generator.d.ts.map +0 -1
- package/dist/pdf-generator.js +0 -564
- package/dist/pdf-generator.js.map +0 -1
- package/dist/types.d.ts +0 -141
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/src/index.ts +0 -137
- package/src/pdf-generator.ts +0 -684
- package/src/types.ts +0 -204
- package/tsconfig.json +0 -20
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clean, professional palette with subtle color accents
|
|
3
|
+
*/
|
|
4
|
+
export declare const colors: {
|
|
5
|
+
readonly background: "#FFFFFF";
|
|
6
|
+
readonly text: {
|
|
7
|
+
readonly primary: "#1a1a1a";
|
|
8
|
+
readonly secondary: "#4a4a4a";
|
|
9
|
+
readonly muted: "#7a7a7a";
|
|
10
|
+
};
|
|
11
|
+
readonly severity: {
|
|
12
|
+
readonly critical: {
|
|
13
|
+
readonly bg: "#FFFFFF";
|
|
14
|
+
readonly text: "#C41E3A";
|
|
15
|
+
readonly border: "#E8E8E8";
|
|
16
|
+
};
|
|
17
|
+
readonly high: {
|
|
18
|
+
readonly bg: "#FFFFFF";
|
|
19
|
+
readonly text: "#D2691E";
|
|
20
|
+
readonly border: "#E8E8E8";
|
|
21
|
+
};
|
|
22
|
+
readonly medium: {
|
|
23
|
+
readonly bg: "#FFFFFF";
|
|
24
|
+
readonly text: "#B8860B";
|
|
25
|
+
readonly border: "#E8E8E8";
|
|
26
|
+
};
|
|
27
|
+
readonly low: {
|
|
28
|
+
readonly bg: "#FFFFFF";
|
|
29
|
+
readonly text: "#2E8B57";
|
|
30
|
+
readonly border: "#E8E8E8";
|
|
31
|
+
};
|
|
32
|
+
readonly info: {
|
|
33
|
+
readonly bg: "#FFFFFF";
|
|
34
|
+
readonly text: "#4682B4";
|
|
35
|
+
readonly border: "#E8E8E8";
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
readonly border: "#E0E0E0";
|
|
39
|
+
readonly borderLight: "#F0F0F0";
|
|
40
|
+
readonly accent: "#2C5282";
|
|
41
|
+
readonly accentMuted: "#F7FAFC";
|
|
42
|
+
readonly table: {
|
|
43
|
+
readonly header: "#F7F7F7";
|
|
44
|
+
readonly headerText: "#1a1a1a";
|
|
45
|
+
readonly border: "#E0E0E0";
|
|
46
|
+
readonly altRow: "#FAFAFA";
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
export declare const fonts: {
|
|
50
|
+
readonly primary: "Helvetica";
|
|
51
|
+
readonly mono: "Courier";
|
|
52
|
+
readonly sizes: {
|
|
53
|
+
readonly title: 28;
|
|
54
|
+
readonly h1: 22;
|
|
55
|
+
readonly h2: 16;
|
|
56
|
+
readonly h3: 13;
|
|
57
|
+
readonly body: 10;
|
|
58
|
+
readonly small: 9;
|
|
59
|
+
readonly caption: 8;
|
|
60
|
+
};
|
|
61
|
+
readonly weights: {
|
|
62
|
+
readonly normal: "Helvetica";
|
|
63
|
+
readonly bold: "Helvetica-Bold";
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
export declare const spacing: {
|
|
67
|
+
readonly page: {
|
|
68
|
+
readonly margin: 50;
|
|
69
|
+
readonly top: 60;
|
|
70
|
+
readonly bottom: 50;
|
|
71
|
+
};
|
|
72
|
+
readonly section: 30;
|
|
73
|
+
readonly paragraph: 12;
|
|
74
|
+
readonly line: 4;
|
|
75
|
+
};
|
|
76
|
+
export declare const layout: {
|
|
77
|
+
readonly page: {
|
|
78
|
+
readonly width: 595.28;
|
|
79
|
+
readonly height: 841.89;
|
|
80
|
+
};
|
|
81
|
+
readonly content: {
|
|
82
|
+
readonly width: number;
|
|
83
|
+
};
|
|
84
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clean, professional palette with subtle color accents
|
|
3
|
+
*/
|
|
4
|
+
export const colors = {
|
|
5
|
+
// Base
|
|
6
|
+
background: '#FFFFFF',
|
|
7
|
+
text: {
|
|
8
|
+
primary: '#1a1a1a',
|
|
9
|
+
secondary: '#4a4a4a',
|
|
10
|
+
muted: '#7a7a7a',
|
|
11
|
+
},
|
|
12
|
+
// Severity - subtle, professional
|
|
13
|
+
severity: {
|
|
14
|
+
critical: {
|
|
15
|
+
bg: '#FFFFFF',
|
|
16
|
+
text: '#C41E3A', // Subtle red
|
|
17
|
+
border: '#E8E8E8',
|
|
18
|
+
},
|
|
19
|
+
high: {
|
|
20
|
+
bg: '#FFFFFF',
|
|
21
|
+
text: '#D2691E', // Subtle orange
|
|
22
|
+
border: '#E8E8E8',
|
|
23
|
+
},
|
|
24
|
+
medium: {
|
|
25
|
+
bg: '#FFFFFF',
|
|
26
|
+
text: '#B8860B', // Subtle gold
|
|
27
|
+
border: '#E8E8E8',
|
|
28
|
+
},
|
|
29
|
+
low: {
|
|
30
|
+
bg: '#FFFFFF',
|
|
31
|
+
text: '#2E8B57', // Subtle green
|
|
32
|
+
border: '#E8E8E8',
|
|
33
|
+
},
|
|
34
|
+
info: {
|
|
35
|
+
bg: '#FFFFFF',
|
|
36
|
+
text: '#4682B4', // Subtle blue
|
|
37
|
+
border: '#E8E8E8',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
// UI elements
|
|
41
|
+
border: '#E0E0E0',
|
|
42
|
+
borderLight: '#F0F0F0',
|
|
43
|
+
accent: '#2C5282', // Professional blue
|
|
44
|
+
accentMuted: '#F7FAFC',
|
|
45
|
+
// Table
|
|
46
|
+
table: {
|
|
47
|
+
header: '#F7F7F7',
|
|
48
|
+
headerText: '#1a1a1a',
|
|
49
|
+
border: '#E0E0E0',
|
|
50
|
+
altRow: '#FAFAFA',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
export const fonts = {
|
|
54
|
+
// Using system fonts for clean rendering
|
|
55
|
+
primary: 'Helvetica',
|
|
56
|
+
mono: 'Courier',
|
|
57
|
+
sizes: {
|
|
58
|
+
title: 28,
|
|
59
|
+
h1: 22,
|
|
60
|
+
h2: 16,
|
|
61
|
+
h3: 13,
|
|
62
|
+
body: 10,
|
|
63
|
+
small: 9,
|
|
64
|
+
caption: 8,
|
|
65
|
+
},
|
|
66
|
+
weights: {
|
|
67
|
+
normal: 'Helvetica',
|
|
68
|
+
bold: 'Helvetica-Bold',
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
export const spacing = {
|
|
72
|
+
page: {
|
|
73
|
+
margin: 50,
|
|
74
|
+
top: 60,
|
|
75
|
+
bottom: 50,
|
|
76
|
+
},
|
|
77
|
+
section: 30,
|
|
78
|
+
paragraph: 12,
|
|
79
|
+
line: 4,
|
|
80
|
+
};
|
|
81
|
+
export const layout = {
|
|
82
|
+
page: {
|
|
83
|
+
width: 595.28, // A4
|
|
84
|
+
height: 841.89, // A4
|
|
85
|
+
},
|
|
86
|
+
content: {
|
|
87
|
+
width: 595.28 - (50 * 2), // page width - margins
|
|
88
|
+
},
|
|
89
|
+
};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
2
|
+
export interface CodeEvidence {
|
|
3
|
+
file: string;
|
|
4
|
+
startLine: number;
|
|
5
|
+
endLine?: number;
|
|
6
|
+
code: string;
|
|
7
|
+
highlight?: number[];
|
|
8
|
+
annotation?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Exploitability {
|
|
11
|
+
skillLevel: 'novice' | 'intermediate' | 'expert';
|
|
12
|
+
accessRequired: 'network' | 'adjacent' | 'local' | 'physical';
|
|
13
|
+
authRequired: 'none' | 'low' | 'high';
|
|
14
|
+
userInteraction: 'none' | 'required';
|
|
15
|
+
hasPublicExploit: boolean;
|
|
16
|
+
exploitMaturity: 'theoretical' | 'poc' | 'weaponized';
|
|
17
|
+
automatable: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface BlastRadius {
|
|
20
|
+
affectedUsers: 'none' | 'single' | 'subset' | 'all';
|
|
21
|
+
affectedData: string[];
|
|
22
|
+
affectedServices: string[];
|
|
23
|
+
cascadeRisk: boolean;
|
|
24
|
+
containment: 'isolated' | 'component' | 'system' | 'infrastructure';
|
|
25
|
+
}
|
|
26
|
+
export interface BusinessImpact {
|
|
27
|
+
confidentiality: 'none' | 'low' | 'high';
|
|
28
|
+
integrity: 'none' | 'low' | 'high';
|
|
29
|
+
availability: 'none' | 'low' | 'high';
|
|
30
|
+
financialExposure?: string;
|
|
31
|
+
complianceViolations?: string[];
|
|
32
|
+
reputationalRisk: 'low' | 'medium' | 'high';
|
|
33
|
+
slaImpact?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface Finding {
|
|
36
|
+
id: string;
|
|
37
|
+
title: string;
|
|
38
|
+
severity: Severity;
|
|
39
|
+
file?: string;
|
|
40
|
+
line?: number;
|
|
41
|
+
issue?: string;
|
|
42
|
+
why?: string;
|
|
43
|
+
fix?: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
impact?: string;
|
|
46
|
+
recommendation?: string;
|
|
47
|
+
status?: 'open' | 'resolved' | 'accepted' | 'partial';
|
|
48
|
+
dreadScore?: number;
|
|
49
|
+
codeEvidence?: CodeEvidence[];
|
|
50
|
+
exploitability?: Exploitability;
|
|
51
|
+
blastRadius?: BlastRadius;
|
|
52
|
+
businessImpact?: BusinessImpact;
|
|
53
|
+
cwe?: string;
|
|
54
|
+
cvssVector?: string;
|
|
55
|
+
cvssScore?: number;
|
|
56
|
+
relatedFindings?: string[];
|
|
57
|
+
attackChainPosition?: 'entry' | 'pivot' | 'objective';
|
|
58
|
+
proofOfConcept?: string;
|
|
59
|
+
references?: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface ThreatModelEntry {
|
|
62
|
+
id: string;
|
|
63
|
+
severity: Severity;
|
|
64
|
+
dread?: number;
|
|
65
|
+
status: 'mitigated' | 'partial' | 'accepted' | 'open';
|
|
66
|
+
finding: string;
|
|
67
|
+
}
|
|
68
|
+
export interface ArchitectureComponent {
|
|
69
|
+
name: string;
|
|
70
|
+
technology: string;
|
|
71
|
+
description: string;
|
|
72
|
+
}
|
|
73
|
+
export interface NetworkConnection {
|
|
74
|
+
flow: string;
|
|
75
|
+
description: string;
|
|
76
|
+
}
|
|
77
|
+
export interface PortEntry {
|
|
78
|
+
port: number;
|
|
79
|
+
protocol: string;
|
|
80
|
+
component: string;
|
|
81
|
+
binding: string;
|
|
82
|
+
purpose: string;
|
|
83
|
+
}
|
|
84
|
+
export interface RemediationItem {
|
|
85
|
+
action: string;
|
|
86
|
+
finding: string;
|
|
87
|
+
owner: string;
|
|
88
|
+
}
|
|
89
|
+
export interface AttackChain {
|
|
90
|
+
id: string;
|
|
91
|
+
name: string;
|
|
92
|
+
description: string;
|
|
93
|
+
likelihood: 'low' | 'medium' | 'high' | 'critical';
|
|
94
|
+
impact: 'low' | 'medium' | 'high' | 'critical';
|
|
95
|
+
steps: {
|
|
96
|
+
order: number;
|
|
97
|
+
findingId: string;
|
|
98
|
+
action: string;
|
|
99
|
+
outcome: string;
|
|
100
|
+
}[];
|
|
101
|
+
mitigationStrategy: string;
|
|
102
|
+
}
|
|
103
|
+
export interface RiskMatrix {
|
|
104
|
+
category: string;
|
|
105
|
+
currentRisk: 'low' | 'medium' | 'high' | 'critical';
|
|
106
|
+
residualRisk: 'low' | 'medium' | 'high' | 'critical';
|
|
107
|
+
trend: 'improving' | 'stable' | 'worsening';
|
|
108
|
+
}
|
|
109
|
+
export interface QualityItem {
|
|
110
|
+
type: 'dead-code' | 'dry-violation' | 'deprecated';
|
|
111
|
+
action: 'DELETE' | 'MERGE' | 'REFACTOR';
|
|
112
|
+
file: string;
|
|
113
|
+
line?: number;
|
|
114
|
+
description: string;
|
|
115
|
+
relatedFiles?: string[];
|
|
116
|
+
}
|
|
117
|
+
export interface ResolvedIssue {
|
|
118
|
+
id: string;
|
|
119
|
+
title: string;
|
|
120
|
+
severity: Severity;
|
|
121
|
+
resolvedDate?: string;
|
|
122
|
+
resolution: string;
|
|
123
|
+
}
|
|
124
|
+
export interface SecurityReport {
|
|
125
|
+
project: string;
|
|
126
|
+
date: string;
|
|
127
|
+
branch?: string;
|
|
128
|
+
scope?: string;
|
|
129
|
+
components?: string[];
|
|
130
|
+
methodology?: string;
|
|
131
|
+
reviewType?: string;
|
|
132
|
+
author?: string;
|
|
133
|
+
summary: {
|
|
134
|
+
critical: number;
|
|
135
|
+
high: number;
|
|
136
|
+
medium: number;
|
|
137
|
+
low: number;
|
|
138
|
+
total: number;
|
|
139
|
+
};
|
|
140
|
+
executiveSummary: string;
|
|
141
|
+
overallRiskLevel: 'critical' | 'high' | 'medium' | 'low';
|
|
142
|
+
topPriorities?: {
|
|
143
|
+
finding: string;
|
|
144
|
+
severity: Severity;
|
|
145
|
+
action: string;
|
|
146
|
+
}[];
|
|
147
|
+
attackChains?: AttackChain[];
|
|
148
|
+
riskMatrix?: RiskMatrix[];
|
|
149
|
+
architecture?: {
|
|
150
|
+
overview?: string;
|
|
151
|
+
components?: ArchitectureComponent[];
|
|
152
|
+
trustBoundaries?: {
|
|
153
|
+
id: string;
|
|
154
|
+
boundary: string;
|
|
155
|
+
trustLevel: string;
|
|
156
|
+
description: string;
|
|
157
|
+
}[];
|
|
158
|
+
};
|
|
159
|
+
network?: {
|
|
160
|
+
diagram?: string;
|
|
161
|
+
connections?: NetworkConnection[];
|
|
162
|
+
ports?: PortEntry[];
|
|
163
|
+
externalDeps?: {
|
|
164
|
+
service: string;
|
|
165
|
+
endpoint: string;
|
|
166
|
+
auth: string;
|
|
167
|
+
risk?: string;
|
|
168
|
+
}[];
|
|
169
|
+
};
|
|
170
|
+
findings: Finding[];
|
|
171
|
+
threatModel?: ThreatModelEntry[];
|
|
172
|
+
positiveObservations?: {
|
|
173
|
+
title: string;
|
|
174
|
+
description: string;
|
|
175
|
+
}[];
|
|
176
|
+
remediation?: {
|
|
177
|
+
p0?: RemediationItem[];
|
|
178
|
+
p1?: RemediationItem[];
|
|
179
|
+
p2?: RemediationItem[];
|
|
180
|
+
p3?: RemediationItem[];
|
|
181
|
+
};
|
|
182
|
+
complianceMapping?: {
|
|
183
|
+
framework: string;
|
|
184
|
+
controls: {
|
|
185
|
+
controlId: string;
|
|
186
|
+
name: string;
|
|
187
|
+
status: 'compliant' | 'partial' | 'non-compliant';
|
|
188
|
+
relatedFindings?: string[];
|
|
189
|
+
}[];
|
|
190
|
+
}[];
|
|
191
|
+
qualityReview?: {
|
|
192
|
+
deadCode?: QualityItem[];
|
|
193
|
+
dryViolations?: QualityItem[];
|
|
194
|
+
deprecated?: QualityItem[];
|
|
195
|
+
};
|
|
196
|
+
resolvedIssues?: ResolvedIssue[];
|
|
197
|
+
privacyAnalysis?: {
|
|
198
|
+
category: string;
|
|
199
|
+
risk: 'low' | 'medium' | 'high';
|
|
200
|
+
description: string;
|
|
201
|
+
mitigation?: string;
|
|
202
|
+
}[];
|
|
203
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,43 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "coverme-security-scanner",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.2.0",
|
|
4
|
+
"description": "AI-powered security assessment reports with beautiful PDF output",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
6
|
"bin": {
|
|
8
|
-
"coverme": "
|
|
7
|
+
"coverme": "./bin/coverme.js",
|
|
8
|
+
"coverme-install": "./bin/install-command.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
}
|
|
9
17
|
},
|
|
10
18
|
"scripts": {
|
|
11
19
|
"build": "tsc",
|
|
12
|
-
"start": "node dist/index.js",
|
|
13
|
-
"dev": "tsx src/index.ts",
|
|
14
|
-
"typecheck": "tsc --noEmit",
|
|
15
|
-
"clean": "rm -rf dist",
|
|
16
20
|
"prepublishOnly": "npm run build"
|
|
17
21
|
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"bin",
|
|
25
|
+
"commands"
|
|
26
|
+
],
|
|
18
27
|
"keywords": [
|
|
19
28
|
"security",
|
|
20
|
-
"scanner",
|
|
21
29
|
"assessment",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
30
|
+
"pdf",
|
|
31
|
+
"claude",
|
|
32
|
+
"audit"
|
|
24
33
|
],
|
|
25
|
-
"author": "
|
|
34
|
+
"author": "",
|
|
26
35
|
"license": "MIT",
|
|
27
|
-
"publishConfig": {
|
|
28
|
-
"access": "public"
|
|
29
|
-
},
|
|
30
36
|
"dependencies": {
|
|
31
|
-
"commander": "^12.1.0",
|
|
32
37
|
"pdfkit": "^0.15.0"
|
|
33
38
|
},
|
|
34
39
|
"devDependencies": {
|
|
35
|
-
"@types/node": "^
|
|
36
|
-
"@types/pdfkit": "^0.13.
|
|
37
|
-
"
|
|
38
|
-
"typescript": "^5.6.0"
|
|
39
|
-
},
|
|
40
|
-
"engines": {
|
|
41
|
-
"node": ">=20.0.0"
|
|
40
|
+
"@types/node": "^20.0.0",
|
|
41
|
+
"@types/pdfkit": "^0.13.0",
|
|
42
|
+
"typescript": "^5.0.0"
|
|
42
43
|
}
|
|
43
44
|
}
|