@vyuhlabs/dxkit 2.3.1 → 2.4.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +187 -0
  2. package/README.md +34 -19
  3. package/dist/analyzers/bom/index.d.ts.map +1 -1
  4. package/dist/analyzers/bom/index.js +85 -2
  5. package/dist/analyzers/bom/index.js.map +1 -1
  6. package/dist/analyzers/bom/pm-signals.d.ts +63 -0
  7. package/dist/analyzers/bom/pm-signals.d.ts.map +1 -0
  8. package/dist/analyzers/bom/pm-signals.js +200 -0
  9. package/dist/analyzers/bom/pm-signals.js.map +1 -0
  10. package/dist/analyzers/bom/types.d.ts +11 -0
  11. package/dist/analyzers/bom/types.d.ts.map +1 -1
  12. package/dist/analyzers/security/gather.d.ts.map +1 -1
  13. package/dist/analyzers/security/gather.js +15 -0
  14. package/dist/analyzers/security/gather.js.map +1 -1
  15. package/dist/analyzers/tools/fingerprint.d.ts +63 -0
  16. package/dist/analyzers/tools/fingerprint.d.ts.map +1 -0
  17. package/dist/analyzers/tools/fingerprint.js +82 -0
  18. package/dist/analyzers/tools/fingerprint.js.map +1 -0
  19. package/dist/analyzers/tools/osv-scanner-fix.d.ts +63 -0
  20. package/dist/analyzers/tools/osv-scanner-fix.d.ts.map +1 -0
  21. package/dist/analyzers/tools/osv-scanner-fix.js +202 -0
  22. package/dist/analyzers/tools/osv-scanner-fix.js.map +1 -0
  23. package/dist/analyzers/tools/semver-bump.d.ts +17 -0
  24. package/dist/analyzers/tools/semver-bump.d.ts.map +1 -0
  25. package/dist/analyzers/tools/semver-bump.js +30 -0
  26. package/dist/analyzers/tools/semver-bump.js.map +1 -0
  27. package/dist/analyzers/tools/tool-registry.d.ts.map +1 -1
  28. package/dist/analyzers/tools/tool-registry.js +20 -0
  29. package/dist/analyzers/tools/tool-registry.js.map +1 -1
  30. package/dist/analyzers/tools/upgrade-plan-resolver.d.ts +64 -0
  31. package/dist/analyzers/tools/upgrade-plan-resolver.d.ts.map +1 -0
  32. package/dist/analyzers/tools/upgrade-plan-resolver.js +146 -0
  33. package/dist/analyzers/tools/upgrade-plan-resolver.js.map +1 -0
  34. package/dist/analyzers/xlsx/bom.d.ts +29 -18
  35. package/dist/analyzers/xlsx/bom.d.ts.map +1 -1
  36. package/dist/analyzers/xlsx/bom.js +386 -71
  37. package/dist/analyzers/xlsx/bom.js.map +1 -1
  38. package/dist/languages/capabilities/types.d.ts +46 -2
  39. package/dist/languages/capabilities/types.d.ts.map +1 -1
  40. package/dist/languages/csharp.d.ts +33 -0
  41. package/dist/languages/csharp.d.ts.map +1 -1
  42. package/dist/languages/csharp.js +77 -38
  43. package/dist/languages/csharp.js.map +1 -1
  44. package/dist/languages/python.d.ts.map +1 -1
  45. package/dist/languages/python.js +13 -0
  46. package/dist/languages/python.js.map +1 -1
  47. package/dist/languages/rust.d.ts.map +1 -1
  48. package/dist/languages/rust.js +17 -1
  49. package/dist/languages/rust.js.map +1 -1
  50. package/dist/languages/typescript.d.ts.map +1 -1
  51. package/dist/languages/typescript.js +12 -1
  52. package/dist/languages/typescript.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,27 +1,38 @@
1
1
  /**
2
- * XLSX converter — bom report.
2
+ * XLSX converter — bom report (2.3.2 PM-grade restructure).
3
3
  *
4
- * Same 15-column header as the licenses converter (10h.2.3) so the
5
- * file is a drop-in replacement for the customer's hand-built sheet,
6
- * but cols 11/12/13 are now mechanically populated from the joined
7
- * dep-vuln data:
8
- * - col 11 "Criticality of usage of this version" — max severity
9
- * across the package's advisories ("Critical (3 vulns)") or
10
- * blank when no known vulns.
11
- * - col 12 "Vulnerability Issues" — semicolon-joined advisory list
12
- * ("GHSA-XXXX: title; CVE-YYYY: title; ..."). Truncated per
13
- * advisory to keep the cell readable.
14
- * - col 13 "Resolution" — the bom entry's `upgradeAdvice` (Tier-1
15
- * "PROPOSAL: Upgrade to ..." or "No fix available — ...").
4
+ * Produces a 4-sheet workbook tuned for a PM / security reviewer:
16
5
  *
17
- * Cols 1-10, 14, 15 mirror the licenses converter exactly so any
18
- * downstream Excel formulas referencing those columns stay valid.
6
+ * 1. `Executive Summary` KV grid on one screen: totals, severity
7
+ * breakdown, top upgrade, license-class counts, staleness counts,
8
+ * tool provenance, analysis time.
9
+ *
10
+ * 2. `Triage` — top 10 findings ranked by composite riskScore, with
11
+ * PM-friendly columns (Priority / Risk / Severity / KEV / Reach /
12
+ * Package@Version / Advisory / CVSS / EPSS / Upgrade to / Effort /
13
+ * Rationale). Sort key is `riskScore desc`; ties resolve by
14
+ * severity then package name. The list shown here is the same
15
+ * one the markdown's "This Week's Triage" section surfaces, so
16
+ * markdown + xlsx tell the same story.
17
+ *
18
+ * 3. `Inventory` — legacy 15-col customer-format sheet with 4 columns
19
+ * appended (cols 16–19): Risk / KEV / Reachable / EPSS. Sorting
20
+ * by col 16 desc gives the same triage order as sheet 2; the
21
+ * legacy cols 1–15 stay byte-identical to the pre-2.3.2 format
22
+ * for reviewers who have hand-built dashboards on specific cells.
23
+ *
24
+ * 4. `License Breakdown` — pivot: license type × count × risk class
25
+ * × sample packages. Lets a PM filter for "copyleft-strong" or
26
+ * "unknown" licenses without eyeballing the full inventory.
27
+ *
28
+ * All derivations (license class, staleness tier, effort estimate)
29
+ * live in `src/analyzers/bom/pm-signals.ts` so the markdown renderer
30
+ * shares the same classification logic — PM sees consistent labels
31
+ * regardless of which report surface they're reading.
19
32
  */
20
33
  import type { BomReport } from '../bom/types';
21
34
  /**
22
- * Render a `BomReport` as an XLSX workbook and return the serialized
23
- * bytes. Sort matches the licenses converter (alphabetical by package)
24
- * for diff-stable output across runs.
35
+ * Render a `BomReport` as a multi-sheet XLSX workbook.
25
36
  */
26
37
  export declare function toBomXlsx(report: BomReport): Promise<Buffer>;
27
38
  //# sourceMappingURL=bom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bom.d.ts","sourceRoot":"","sources":["../../../src/analyzers/xlsx/bom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,cAAc,CAAC;AAqC3D;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFlE"}
1
+ {"version":3,"file":"bom.d.ts","sourceRoot":"","sources":["../../../src/analyzers/xlsx/bom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,EAAY,SAAS,EAAe,MAAM,cAAc,CAAC;AAoHrE;;GAEG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAYlE"}
@@ -1,22 +1,35 @@
1
1
  "use strict";
2
2
  /**
3
- * XLSX converter — bom report.
3
+ * XLSX converter — bom report (2.3.2 PM-grade restructure).
4
4
  *
5
- * Same 15-column header as the licenses converter (10h.2.3) so the
6
- * file is a drop-in replacement for the customer's hand-built sheet,
7
- * but cols 11/12/13 are now mechanically populated from the joined
8
- * dep-vuln data:
9
- * - col 11 "Criticality of usage of this version" — max severity
10
- * across the package's advisories ("Critical (3 vulns)") or
11
- * blank when no known vulns.
12
- * - col 12 "Vulnerability Issues" — semicolon-joined advisory list
13
- * ("GHSA-XXXX: title; CVE-YYYY: title; ..."). Truncated per
14
- * advisory to keep the cell readable.
15
- * - col 13 "Resolution" — the bom entry's `upgradeAdvice` (Tier-1
16
- * "PROPOSAL: Upgrade to ..." or "No fix available — ...").
5
+ * Produces a 4-sheet workbook tuned for a PM / security reviewer:
17
6
  *
18
- * Cols 1-10, 14, 15 mirror the licenses converter exactly so any
19
- * downstream Excel formulas referencing those columns stay valid.
7
+ * 1. `Executive Summary` KV grid on one screen: totals, severity
8
+ * breakdown, top upgrade, license-class counts, staleness counts,
9
+ * tool provenance, analysis time.
10
+ *
11
+ * 2. `Triage` — top 10 findings ranked by composite riskScore, with
12
+ * PM-friendly columns (Priority / Risk / Severity / KEV / Reach /
13
+ * Package@Version / Advisory / CVSS / EPSS / Upgrade to / Effort /
14
+ * Rationale). Sort key is `riskScore desc`; ties resolve by
15
+ * severity then package name. The list shown here is the same
16
+ * one the markdown's "This Week's Triage" section surfaces, so
17
+ * markdown + xlsx tell the same story.
18
+ *
19
+ * 3. `Inventory` — legacy 15-col customer-format sheet with 4 columns
20
+ * appended (cols 16–19): Risk / KEV / Reachable / EPSS. Sorting
21
+ * by col 16 desc gives the same triage order as sheet 2; the
22
+ * legacy cols 1–15 stay byte-identical to the pre-2.3.2 format
23
+ * for reviewers who have hand-built dashboards on specific cells.
24
+ *
25
+ * 4. `License Breakdown` — pivot: license type × count × risk class
26
+ * × sample packages. Lets a PM filter for "copyleft-strong" or
27
+ * "unknown" licenses without eyeballing the full inventory.
28
+ *
29
+ * All derivations (license class, staleness tier, effort estimate)
30
+ * live in `src/analyzers/bom/pm-signals.ts` so the markdown renderer
31
+ * shares the same classification logic — PM sees consistent labels
32
+ * regardless of which report surface they're reading.
20
33
  */
21
34
  var __importDefault = (this && this.__importDefault) || function (mod) {
22
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -24,17 +37,46 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
24
37
  Object.defineProperty(exports, "__esModule", { value: true });
25
38
  exports.toBomXlsx = toBomXlsx;
26
39
  const exceljs_1 = __importDefault(require("exceljs"));
40
+ const pm_signals_1 = require("../bom/pm-signals");
27
41
  const licenses_1 = require("./licenses");
28
- /** Excel's hard per-cell character limit. Some advisory summaries
29
- * (e.g. octokit ReDoS write-ups) blow past this when concatenated
30
- * across 5+ vulns on the same package. */
42
+ /** Excel's hard per-cell character limit. */
31
43
  const EXCEL_CELL_MAX = 32767;
32
- /** Per-advisory truncation in col 12 keeps the joined cell readable
33
- * and well under the per-cell limit even on packages with 10+ vulns. */
44
+ /** Per-advisory truncation in the legacy "Vulnerability Issues" cell. */
34
45
  const ADVISORY_SUMMARY_MAX = 200;
35
- /** Same control-char + length scrub as licenses.ts. Inlined rather
36
- * than exported because the rule lives at the xlsx-write boundary,
37
- * not as a general-purpose utility. */
46
+ const SEV_RANK = {
47
+ critical: 0,
48
+ high: 1,
49
+ medium: 2,
50
+ low: 3,
51
+ };
52
+ const SEV_LABEL = {
53
+ critical: 'Critical',
54
+ high: 'High',
55
+ medium: 'Medium',
56
+ low: 'Low',
57
+ };
58
+ const LICENSE_CLASS_LABEL = {
59
+ permissive: 'Permissive',
60
+ 'copyleft-weak': 'Copyleft (weak)',
61
+ 'copyleft-strong': 'Copyleft (strong)',
62
+ proprietary: 'Proprietary',
63
+ unknown: 'Unknown',
64
+ };
65
+ const STALENESS_LABEL = {
66
+ fresh: 'Fresh (< 1y)',
67
+ aging: 'Aging (1–3y)',
68
+ stale: 'Stale (≥ 3y)',
69
+ unknown: 'Unknown',
70
+ };
71
+ const EFFORT_LABEL = {
72
+ trivial: 'Trivial (patch bump)',
73
+ moderate: 'Moderate (minor bump)',
74
+ major: 'Major (breaking)',
75
+ blocked: 'Blocked (no fix)',
76
+ };
77
+ /** XML 1.0 forbids most C0 control chars; Excel refuses to open a sheet
78
+ * containing them. Same scrub as licenses.ts, inlined here so the xlsx
79
+ * write boundary owns the rule. */
38
80
  function xlsxSafe(v) {
39
81
  if (!v)
40
82
  return '';
@@ -51,54 +93,266 @@ function xlsxSafe(v) {
51
93
  }
52
94
  return s;
53
95
  }
54
- const SEV_LABEL = {
55
- critical: 'Critical',
56
- high: 'High',
57
- medium: 'Medium',
58
- low: 'Low',
59
- };
96
+ function pct(n) {
97
+ return typeof n === 'number' ? `${(n * 100).toFixed(2)}%` : '';
98
+ }
99
+ function maxRiskAcrossVulns(e) {
100
+ let best = -1;
101
+ for (const v of e.vulns) {
102
+ if (typeof v.riskScore === 'number' && v.riskScore > best)
103
+ best = v.riskScore;
104
+ }
105
+ return best;
106
+ }
107
+ function maxCvssAcrossVulns(e) {
108
+ let best = -1;
109
+ for (const v of e.vulns) {
110
+ if (typeof v.cvssScore === 'number' && v.cvssScore > best)
111
+ best = v.cvssScore;
112
+ }
113
+ return best;
114
+ }
115
+ function maxEpssAcrossVulns(e) {
116
+ let best = -1;
117
+ for (const v of e.vulns) {
118
+ if (typeof v.epssScore === 'number' && v.epssScore > best)
119
+ best = v.epssScore;
120
+ }
121
+ return best;
122
+ }
123
+ function anyKev(e) {
124
+ return e.vulns.some((v) => v.kev === true);
125
+ }
126
+ function anyReachable(e) {
127
+ let sawTrue = false;
128
+ let sawFalse = false;
129
+ for (const v of e.vulns) {
130
+ if (v.reachable === true)
131
+ sawTrue = true;
132
+ else if (v.reachable === false)
133
+ sawFalse = true;
134
+ }
135
+ if (sawTrue)
136
+ return 'yes';
137
+ if (sawFalse)
138
+ return 'no';
139
+ return 'unknown';
140
+ }
60
141
  /**
61
- * Render a `BomReport` as an XLSX workbook and return the serialized
62
- * bytes. Sort matches the licenses converter (alphabetical by package)
63
- * for diff-stable output across runs.
142
+ * Render a `BomReport` as a multi-sheet XLSX workbook.
64
143
  */
65
144
  async function toBomXlsx(report) {
66
145
  const wb = new exceljs_1.default.Workbook();
67
146
  wb.creator = 'vyuh-dxkit';
68
147
  wb.created = new Date(report.analyzedAt);
69
- const ws = wb.addWorksheet('platform');
70
- ws.addRow(licenses_1.BOM_COLUMNS);
148
+ writeExecutiveSummary(wb, report);
149
+ writeTriage(wb, report);
150
+ writeInventory(wb, report);
151
+ writeLicenseBreakdown(wb, report);
152
+ const buf = await wb.xlsx.writeBuffer();
153
+ return Buffer.from(buf);
154
+ }
155
+ // ─── Sheet 1: Executive Summary ─────────────────────────────────────────────
156
+ function writeExecutiveSummary(wb, report) {
157
+ const ws = wb.addWorksheet('Executive Summary');
158
+ ws.columns = [
159
+ { header: '', key: 'label', width: 42 },
160
+ { header: '', key: 'value', width: 60 },
161
+ ];
162
+ const s = report.summary;
163
+ const now = new Date();
164
+ // Top-line identity
165
+ ws.addRow(['Repository', report.repo]);
166
+ ws.addRow(['Branch', `${report.branch} (${report.commitSha})`]);
167
+ ws.addRow(['Scan date', report.analyzedAt.slice(0, 10)]);
168
+ ws.addRow([
169
+ 'Scope',
170
+ s.filter === 'top-level'
171
+ ? `Top-level packages only (${s.totalPackages} of ${s.unfilteredTotalPackages} installed)`
172
+ : `All installed packages (${s.totalPackages})`,
173
+ ]);
174
+ if (s.projectRoots.length > 1) {
175
+ ws.addRow(['Project roots', `${s.projectRoots.length} — ${s.projectRoots.join(', ')}`]);
176
+ }
177
+ ws.addRow([]);
178
+ // Risk posture
179
+ ws.addRow(['Risk posture', '']).font = { bold: true };
180
+ ws.addRow(['Vulnerable packages', `${s.vulnerablePackages} (of ${s.totalPackages})`]);
181
+ ws.addRow(['Total advisories', `${s.totalAdvisories}`]);
182
+ ws.addRow([
183
+ 'Severity breakdown (worst-of-package)',
184
+ `Critical ${s.bySeverity.critical} · High ${s.bySeverity.high} · Medium ${s.bySeverity.medium} · Low ${s.bySeverity.low}`,
185
+ ]);
186
+ // Highest-risk advisory + top upgrade
187
+ const triage = buildTriageRows(report);
188
+ if (triage.length > 0) {
189
+ const top = triage[0];
190
+ ws.addRow([
191
+ 'Top ship-blocker',
192
+ `${top.packageAtVersion} — ${top.advisoryId} (Risk ${top.risk.toFixed(0)})`,
193
+ ]);
194
+ }
195
+ else {
196
+ ws.addRow(['Top ship-blocker', 'None — no advisory crossed the moderate-risk threshold']);
197
+ }
198
+ // byTopLevelDep: the single upgrade with the biggest blast-radius win
199
+ const rollupEntries = Object.entries(s.byTopLevelDep).sort((a, b) => SEV_RANK[a[1].maxSeverity] - SEV_RANK[b[1].maxSeverity] ||
200
+ b[1].advisoryCount - a[1].advisoryCount);
201
+ if (rollupEntries.length > 0) {
202
+ const [name, r] = rollupEntries[0];
203
+ ws.addRow([
204
+ 'Highest-leverage upgrade',
205
+ `${name} — resolves up to ${r.advisoryCount} transitive advisories (worst ${SEV_LABEL[r.maxSeverity]})`,
206
+ ]);
207
+ }
208
+ ws.addRow([]);
209
+ // License risk
210
+ ws.addRow(['License risk', '']).font = { bold: true };
211
+ const licBuckets = new Map();
212
+ for (const e of report.entries) {
213
+ const c = (0, pm_signals_1.licenseClass)(e.licenseType);
214
+ licBuckets.set(c, (licBuckets.get(c) ?? 0) + 1);
215
+ }
216
+ for (const c of [
217
+ 'permissive',
218
+ 'copyleft-weak',
219
+ 'copyleft-strong',
220
+ 'proprietary',
221
+ 'unknown',
222
+ ]) {
223
+ ws.addRow([LICENSE_CLASS_LABEL[c], licBuckets.get(c) ?? 0]);
224
+ }
225
+ ws.addRow([]);
226
+ // Staleness
227
+ ws.addRow(['Staleness', '']).font = { bold: true };
228
+ const staleBuckets = new Map();
229
+ for (const e of report.entries) {
230
+ const t = (0, pm_signals_1.stalenessTier)(e.releaseDate, now);
231
+ staleBuckets.set(t, (staleBuckets.get(t) ?? 0) + 1);
232
+ }
233
+ for (const t of ['fresh', 'aging', 'stale', 'unknown']) {
234
+ ws.addRow([STALENESS_LABEL[t], staleBuckets.get(t) ?? 0]);
235
+ }
236
+ ws.addRow([]);
237
+ // Tools + provenance
238
+ ws.addRow(['Tools used', report.toolsUsed.join(', ') || '(none)']);
239
+ if (report.toolsUnavailable.length > 0) {
240
+ ws.addRow(['Tools unavailable', report.toolsUnavailable.join(', ')]);
241
+ }
242
+ ws.addRow(['Schema version', report.schemaVersion]);
243
+ // Bold the label column
244
+ for (let i = 1; i <= ws.rowCount; i++) {
245
+ const cell = ws.getRow(i).getCell(1);
246
+ if (!cell.font?.bold)
247
+ cell.font = { bold: true };
248
+ }
249
+ }
250
+ function buildTriageRows(report, limit = 10, minRisk = 15) {
251
+ const flat = [];
252
+ for (const e of report.entries) {
253
+ if (e.vulns.length === 0)
254
+ continue;
255
+ const effort = (0, pm_signals_1.effortEstimate)(e);
256
+ for (const v of e.vulns) {
257
+ if (typeof v.riskScore !== 'number' || v.riskScore < minRisk)
258
+ continue;
259
+ const rationale = buildRationale(v);
260
+ flat.push({
261
+ risk: v.riskScore,
262
+ severity: v.severity,
263
+ kev: v.kev === true,
264
+ reachable: v.reachable === true ? 'yes' : v.reachable === false ? 'no' : 'unknown',
265
+ packageAtVersion: `${e.package}@${e.version}`,
266
+ advisoryId: v.id,
267
+ cvss: v.cvssScore,
268
+ epss: v.epssScore,
269
+ fix: v.fixedVersion ?? e.upgradeAdvice.replace(/^PROPOSAL:\s*/, '') ?? undefined,
270
+ effort,
271
+ rationale,
272
+ });
273
+ }
274
+ }
275
+ flat.sort((a, b) => b.risk - a.risk ||
276
+ SEV_RANK[a.severity] - SEV_RANK[b.severity] ||
277
+ a.packageAtVersion.localeCompare(b.packageAtVersion));
278
+ return flat.slice(0, limit);
279
+ }
280
+ function buildRationale(v) {
281
+ const parts = [];
282
+ if (v.kev)
283
+ parts.push('KEV');
284
+ if (v.reachable === true)
285
+ parts.push('reachable');
286
+ if (v.reachable === false)
287
+ parts.push('not reachable');
288
+ if (typeof v.cvssScore === 'number')
289
+ parts.push(`CVSS ${v.cvssScore.toFixed(1)}`);
290
+ if (typeof v.epssScore === 'number' && v.epssScore >= 0.01) {
291
+ parts.push(`EPSS ${(v.epssScore * 100).toFixed(1)}%`);
292
+ }
293
+ return parts.length > 0 ? parts.join(', ') : '—';
294
+ }
295
+ function writeTriage(wb, report) {
296
+ const ws = wb.addWorksheet('Triage');
297
+ ws.columns = [
298
+ { header: 'Priority', key: 'priority', width: 10 },
299
+ { header: 'Risk', key: 'risk', width: 8 },
300
+ { header: 'Severity', key: 'severity', width: 12 },
301
+ { header: 'KEV', key: 'kev', width: 6 },
302
+ { header: 'Reachable', key: 'reachable', width: 12 },
303
+ { header: 'Package@Version', key: 'pkg', width: 40 },
304
+ { header: 'Advisory', key: 'id', width: 24 },
305
+ { header: 'CVSS', key: 'cvss', width: 8 },
306
+ { header: 'EPSS', key: 'epss', width: 10 },
307
+ { header: 'Upgrade to', key: 'fix', width: 14 },
308
+ { header: 'Effort', key: 'effort', width: 22 },
309
+ { header: 'Rationale', key: 'rationale', width: 42 },
310
+ ];
311
+ ws.getRow(1).font = { bold: true };
312
+ const triage = buildTriageRows(report);
313
+ triage.forEach((t, i) => {
314
+ ws.addRow({
315
+ priority: i + 1,
316
+ risk: Math.round(t.risk),
317
+ severity: SEV_LABEL[t.severity],
318
+ kev: t.kev ? '⚠' : '',
319
+ reachable: t.reachable,
320
+ pkg: t.packageAtVersion,
321
+ id: t.advisoryId,
322
+ cvss: typeof t.cvss === 'number' ? t.cvss.toFixed(1) : '—',
323
+ epss: pct(t.epss),
324
+ fix: t.fix ? xlsxSafe(t.fix) : '—',
325
+ effort: EFFORT_LABEL[t.effort],
326
+ rationale: t.rationale,
327
+ });
328
+ });
329
+ if (triage.length === 0) {
330
+ ws.addRow({
331
+ priority: '—',
332
+ rationale: 'No advisories crossed the moderate-risk threshold (Risk ≥ 15).',
333
+ });
334
+ }
335
+ }
336
+ // ─── Sheet 3: Inventory (legacy 15 + 4 appended) ────────────────────────────
337
+ function writeInventory(wb, report) {
338
+ const ws = wb.addWorksheet('Inventory');
339
+ // Append the 4 PM-signal columns to the legacy header.
340
+ const header = [...licenses_1.BOM_COLUMNS, 'Risk', 'KEV', 'Reachable', 'EPSS'];
341
+ ws.addRow(header);
71
342
  ws.getRow(1).font = { bold: true };
72
343
  const reportDate = report.analyzedAt.slice(0, 10);
73
344
  const rows = [...report.entries].sort((a, b) => a.package.localeCompare(b.package));
74
- // Non-vulnerable rows still need a signal in cols 11/12/13 so a reviewer
75
- // can distinguish "scanned, clean" from "not scanned / unknown". Blank
76
- // leaves the same ambiguity the customer's hand-built sheet had.
77
345
  const NO_VULNS_CRITICALITY = 'None';
78
346
  const NO_VULNS_ISSUES = 'None';
79
347
  const NO_VULNS_RESOLUTION = 'No action required';
80
348
  for (const e of rows) {
81
- // col 11: severity badge + count, e.g. "Critical (3 vulns)".
82
349
  const criticality = e.maxSeverity
83
350
  ? `${SEV_LABEL[e.maxSeverity]} (${e.vulns.length} vuln${e.vulns.length === 1 ? '' : 's'})`
84
351
  : NO_VULNS_CRITICALITY;
85
- // col 12: per-advisory list. "ID: summary" with summary truncated
86
- // per entry. Sorted by severity within the package so the most
87
- // serious issues appear first when the cell is rendered.
88
- const SEV_RANK = {
89
- critical: 0,
90
- high: 1,
91
- medium: 2,
92
- low: 3,
93
- };
94
352
  const sortedVulns = [...e.vulns].sort((a, b) => SEV_RANK[a.severity] - SEV_RANK[b.severity] || a.id.localeCompare(b.id));
95
353
  const vulnLines = sortedVulns.map((v) => {
96
354
  const title = (v.summary ?? '').replace(/\s+/g, ' ').trim().slice(0, ADVISORY_SUMMARY_MAX);
97
355
  const cvss = v.cvssScore !== undefined ? ` [CVSS ${v.cvssScore.toFixed(1)}]` : '';
98
- // Top-level attribution: tells the reviewer which direct manifest
99
- // dep to upgrade. Missing when the pack couldn't parse the graph
100
- // (e.g. TS repo with no lockfile) — silent in that case so the
101
- // column stays clean.
102
356
  const tops = v.topLevelDep ?? [];
103
357
  let via = '';
104
358
  if (tops.length === 1)
@@ -109,32 +363,93 @@ async function toBomXlsx(report) {
109
363
  });
110
364
  const vulnerabilityIssues = e.vulns.length === 0 ? NO_VULNS_ISSUES : vulnLines.join('; ');
111
365
  const resolution = e.vulns.length === 0 ? NO_VULNS_RESOLUTION : e.upgradeAdvice;
366
+ // PM signals — appended cols 16–19. Use max-across-vulns for sortability.
367
+ const risk = maxRiskAcrossVulns(e);
368
+ const cvssMax = maxCvssAcrossVulns(e);
369
+ const epssMax = maxEpssAcrossVulns(e);
370
+ const kevCell = anyKev(e) ? 'Yes' : '';
371
+ const reachCell = anyReachable(e);
112
372
  ws.addRow([
113
- xlsxSafe(e.package), // col 1
114
- xlsxSafe(e.version), // col 2
115
- xlsxSafe(e.description), // col 3
116
- 'Dependency', // col 4 — static
117
- `Reported ${reportDate}`, // col 5 — freshness stamp
118
- xlsxSafe(e.sourceUrl), // col 6
119
- xlsxSafe(e.licenseType), // col 7
120
- xlsxSafe(e.licenseText), // col 8
121
- xlsxSafe(e.supplier), // col 9
122
- xlsxSafe(e.releaseDate ? e.releaseDate.slice(0, 10) : ''), // col 10 — ISO date truncated to YYYY-MM-DD; populated by npm-registry enrichment (10h.5.1, closes D006)
123
- xlsxSafe(criticality), // col 11 — bom-only
124
- xlsxSafe(vulnerabilityIssues), // col 12 — bom-only
125
- xlsxSafe(resolution), // col 13 — bom-only
126
- '', // col 14 — intentionally blank (human workflow: OK/Pending/etc)
127
- `${e.package}@${e.version}`, // col 15
373
+ xlsxSafe(e.package),
374
+ xlsxSafe(e.version),
375
+ xlsxSafe(e.description),
376
+ 'Dependency',
377
+ `Reported ${reportDate}`,
378
+ xlsxSafe(e.sourceUrl),
379
+ xlsxSafe(e.licenseType),
380
+ xlsxSafe(e.licenseText),
381
+ xlsxSafe(e.supplier),
382
+ xlsxSafe(e.releaseDate ? e.releaseDate.slice(0, 10) : ''),
383
+ xlsxSafe(criticality),
384
+ xlsxSafe(vulnerabilityIssues),
385
+ xlsxSafe(resolution),
386
+ '',
387
+ `${e.package}@${e.version}`,
388
+ // 16–19: PM-signals (numeric so sort asc/desc works correctly)
389
+ risk >= 0 ? Math.round(risk) : '',
390
+ kevCell,
391
+ reachCell === 'unknown' ? '' : reachCell,
392
+ epssMax >= 0 ? pct(epssMax) : '',
393
+ // Keep CVSS-max for power users; col 20 is an extra that helps
394
+ // pivot tables without cluttering the main table.
395
+ cvssMax >= 0 ? cvssMax.toFixed(1) : '',
128
396
  ]);
129
397
  }
130
- // Same widths as the licenses converter preserves visual fidelity
131
- // when reviewers diff a licenses-only sheet against a bom sheet.
132
- const widths = [30, 14, 50, 14, 18, 50, 18, 50, 24, 18, 22, 50, 40, 12, 40];
398
+ // Legacy widths (15 cols) + PM-signal widths (4 + 1 for cvss-max).
399
+ const widths = [30, 14, 50, 14, 18, 50, 18, 50, 24, 18, 22, 50, 40, 12, 40, 8, 6, 12, 10, 8];
133
400
  ws.columns.forEach((col, i) => {
134
401
  if (col && widths[i])
135
402
  col.width = widths[i];
136
403
  });
137
- const buf = await wb.xlsx.writeBuffer();
138
- return Buffer.from(buf);
404
+ // Header for the bonus col 20 (CVSS max)
405
+ ws.getRow(1).getCell(20).value = 'CVSS (max)';
406
+ ws.getRow(1).getCell(20).font = { bold: true };
407
+ }
408
+ // ─── Sheet 4: License Breakdown ─────────────────────────────────────────────
409
+ function writeLicenseBreakdown(wb, report) {
410
+ const ws = wb.addWorksheet('License Breakdown');
411
+ ws.columns = [
412
+ { header: 'License', key: 'license', width: 30 },
413
+ { header: 'Class', key: 'class', width: 22 },
414
+ { header: 'Count', key: 'count', width: 8 },
415
+ { header: 'Sample packages', key: 'samples', width: 80 },
416
+ ];
417
+ ws.getRow(1).font = { bold: true };
418
+ // Group entries by license type, remember up to 5 sample package names
419
+ const buckets = new Map();
420
+ for (const e of report.entries) {
421
+ const lic = e.licenseType || '(empty)';
422
+ const list = buckets.get(lic) ?? [];
423
+ list.push(e.package);
424
+ buckets.set(lic, list);
425
+ }
426
+ // Sort: worst class first (copyleft-strong), then count desc, then name
427
+ const rows = [...buckets.entries()]
428
+ .map(([lic, pkgs]) => ({
429
+ license: lic,
430
+ cls: (0, pm_signals_1.licenseClass)(lic),
431
+ count: pkgs.length,
432
+ samples: pkgs.slice(0, 5).join(', ') + (pkgs.length > 5 ? `, +${pkgs.length - 5} more` : ''),
433
+ }))
434
+ .sort((a, b) => {
435
+ const classRank = {
436
+ 'copyleft-strong': 0,
437
+ 'copyleft-weak': 1,
438
+ proprietary: 2,
439
+ unknown: 3,
440
+ permissive: 4,
441
+ };
442
+ return (classRank[a.cls] - classRank[b.cls] ||
443
+ b.count - a.count ||
444
+ a.license.localeCompare(b.license));
445
+ });
446
+ for (const r of rows) {
447
+ ws.addRow({
448
+ license: r.license,
449
+ class: LICENSE_CLASS_LABEL[r.cls],
450
+ count: r.count,
451
+ samples: r.samples,
452
+ });
453
+ }
139
454
  }
140
455
  //# sourceMappingURL=bom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bom.js","sourceRoot":"","sources":["../../../src/analyzers/xlsx/bom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bom.js","sourceRoot":"","sources":["../../../src/analyzers/xlsx/bom.ts"],"names":[],"mappings":"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"}