bardscan 0.1.4 → 0.1.5

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/index.js CHANGED
@@ -44,6 +44,11 @@ export async function runCli(rawArgs, deps = defaultDeps) {
44
44
  .option('fail-on', {
45
45
  choices: ['critical', 'high', 'medium', 'low', 'none'],
46
46
  default: 'high'
47
+ })
48
+ .option('fail-on-unknown', {
49
+ type: 'boolean',
50
+ default: false,
51
+ describe: 'Fail when unresolved findings exist (unknown severity/lookup)'
47
52
  })
48
53
  .option('privacy', {
49
54
  choices: ['strict', 'standard'],
@@ -53,7 +58,7 @@ export async function runCli(rawArgs, deps = defaultDeps) {
53
58
  .option('online', {
54
59
  type: 'boolean',
55
60
  default: false,
56
- describe: 'Enable online advisory lookups during scan'
61
+ describe: 'Deprecated: scan is offline-only; use "db update" to fetch advisories'
57
62
  })
58
63
  .option('offline', {
59
64
  type: 'boolean',
@@ -66,6 +71,11 @@ export async function runCli(rawArgs, deps = defaultDeps) {
66
71
  .option('refresh-cache', {
67
72
  type: 'boolean',
68
73
  default: false
74
+ })
75
+ .option('update-db', {
76
+ type: 'boolean',
77
+ default: false,
78
+ describe: 'Run db update before offline scan (single-command workflow)'
69
79
  })
70
80
  .option('osv-url', {
71
81
  type: 'string',
@@ -109,6 +119,16 @@ export async function runCli(rawArgs, deps = defaultDeps) {
109
119
  telemetry: argv.telemetry
110
120
  });
111
121
  await deps.mkdir(outDir, { recursive: true });
122
+ if (Boolean(argv.updateDb)) {
123
+ const update = await deps.updateAdvisoryDb({
124
+ projectPath,
125
+ outDir,
126
+ refreshCache: Boolean(argv.refreshCache),
127
+ osvUrl: argv.osvUrl ? String(argv.osvUrl) : undefined,
128
+ enableNetworkFallbacks: settings.enableNetworkFallbacks
129
+ });
130
+ deps.stdout.write(buildDbUpdateSummary(update, useColor(deps.stdout)));
131
+ }
112
132
  const report = await deps.runScan({
113
133
  projectPath,
114
134
  outDir,
@@ -139,7 +159,9 @@ export async function runCli(rawArgs, deps = defaultDeps) {
139
159
  }
140
160
  const thresholdHit = argv.failOn !== 'none' &&
141
161
  report.findings.some((f) => deps.shouldFail(argv.failOn, f.severity));
142
- deps.stdout.write(buildCliSummary(displayReport, String(argv.failOn), thresholdHit, useColor(deps.stdout)));
162
+ const unknownHit = Boolean(argv.failOnUnknown) &&
163
+ report.findings.some((f) => f.severity === 'unknown' || typeof f.unknownReason === 'string');
164
+ deps.stdout.write(buildCliSummary(displayReport, String(argv.failOn), thresholdHit, unknownHit, useColor(deps.stdout)));
143
165
  deps.stdout.write(buildFindingsList(displayReport, argv.listFindings, useColor(deps.stdout)));
144
166
  if (argv.findingsJson) {
145
167
  const findingsJsonPath = path.resolve(String(argv.findingsJson));
@@ -147,7 +169,7 @@ export async function runCli(rawArgs, deps = defaultDeps) {
147
169
  await deps.writeFile(findingsJsonPath, JSON.stringify(filteredFindings, null, 2));
148
170
  deps.stdout.write(`${findingsJsonPath}\n`);
149
171
  }
150
- if (thresholdHit) {
172
+ if (thresholdHit || unknownHit) {
151
173
  exitCode = 1;
152
174
  return;
153
175
  }
@@ -228,12 +250,13 @@ function resolveScanSettings(input) {
228
250
  telemetry: 'off'
229
251
  };
230
252
  let offline = preset.offline;
231
- if (input.online)
232
- offline = false;
253
+ if (input.online) {
254
+ throw new Error('scan is offline-only. Run "bardscan db update <path>" first, then run "bardscan scan".');
255
+ }
233
256
  if (typeof input.offline === 'boolean')
234
257
  offline = input.offline;
235
- if (input.privacy === 'strict' && !offline) {
236
- throw new Error('privacy strict disallows online scanning. Remove --online or use --privacy standard.');
258
+ if (!offline) {
259
+ throw new Error('scan is offline-only. Remove online settings and refresh advisories via "bardscan db update".');
237
260
  }
238
261
  if ((input.telemetry ?? preset.telemetry) === 'on' && input.privacy === 'strict') {
239
262
  throw new Error('privacy strict disallows telemetry.');
@@ -245,7 +268,7 @@ function resolveScanSettings(input) {
245
268
  evidenceMode: input.evidence ?? preset.evidenceMode
246
269
  };
247
270
  }
248
- function buildCliSummary(report, failOn, thresholdHit, color) {
271
+ function buildCliSummary(report, failOn, thresholdHit, unknownHit, color) {
249
272
  const sev = report.summary.bySeverity;
250
273
  const conf = report.summary.byConfidence;
251
274
  const lines = [
@@ -257,7 +280,8 @@ function buildCliSummary(report, failOn, thresholdHit, color) {
257
280
  `severity: critical=${colorize(String(sev.critical), 'magenta', color)} high=${colorize(String(sev.high), 'red', color)} medium=${colorize(String(sev.medium), 'yellow', color)} low=${colorize(String(sev.low), 'green', color)} unknown=${colorize(String(sev.unknown), 'gray', color)}`,
258
281
  `confidence: high=${colorize(String(conf.high), 'green', color)} medium=${colorize(String(conf.medium), 'yellow', color)} low=${colorize(String(conf.low), 'red', color)} unknown=${colorize(String(conf.unknown), 'gray', color)}`,
259
282
  `fail-on: ${failOn}`,
260
- `threshold hit: ${thresholdHit ? colorize('yes', 'red', color) : colorize('no', 'green', color)}`
283
+ `threshold hit: ${thresholdHit ? colorize('yes', 'red', color) : colorize('no', 'green', color)}`,
284
+ `unknown hit: ${unknownHit ? colorize('yes', 'red', color) : colorize('no', 'green', color)}`
261
285
  ];
262
286
  return `${lines.join('\n')}\n`;
263
287
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.1.4",
2
+ "version": "0.1.5",
3
3
  "name": "bardscan",
4
4
  "type": "module",
5
5
  "bin": {
package/src/index.ts CHANGED
@@ -72,6 +72,11 @@ export async function runCli(rawArgs: string[], deps: CliDeps = defaultDeps): Pr
72
72
  choices: ['critical', 'high', 'medium', 'low', 'none'] as const,
73
73
  default: 'high'
74
74
  })
75
+ .option('fail-on-unknown', {
76
+ type: 'boolean',
77
+ default: false,
78
+ describe: 'Fail when unresolved findings exist (unknown severity/lookup)'
79
+ })
75
80
  .option('privacy', {
76
81
  choices: ['strict', 'standard'] as const,
77
82
  default: 'strict',
@@ -80,7 +85,7 @@ export async function runCli(rawArgs: string[], deps: CliDeps = defaultDeps): Pr
80
85
  .option('online', {
81
86
  type: 'boolean',
82
87
  default: false,
83
- describe: 'Enable online advisory lookups during scan'
88
+ describe: 'Deprecated: scan is offline-only; use "db update" to fetch advisories'
84
89
  })
85
90
  .option('offline', {
86
91
  type: 'boolean',
@@ -94,6 +99,11 @@ export async function runCli(rawArgs: string[], deps: CliDeps = defaultDeps): Pr
94
99
  type: 'boolean',
95
100
  default: false
96
101
  })
102
+ .option('update-db', {
103
+ type: 'boolean',
104
+ default: false,
105
+ describe: 'Run db update before offline scan (single-command workflow)'
106
+ })
97
107
  .option('osv-url', {
98
108
  type: 'string',
99
109
  describe: 'Custom OSV API base URL (for mirrors/proxies)'
@@ -139,6 +149,17 @@ export async function runCli(rawArgs: string[], deps: CliDeps = defaultDeps): Pr
139
149
 
140
150
  await deps.mkdir(outDir, { recursive: true });
141
151
 
152
+ if (Boolean(argv.updateDb)) {
153
+ const update = await deps.updateAdvisoryDb({
154
+ projectPath,
155
+ outDir,
156
+ refreshCache: Boolean(argv.refreshCache),
157
+ osvUrl: argv.osvUrl ? String(argv.osvUrl) : undefined,
158
+ enableNetworkFallbacks: settings.enableNetworkFallbacks
159
+ });
160
+ deps.stdout.write(buildDbUpdateSummary(update, useColor(deps.stdout)));
161
+ }
162
+
142
163
  const report = await deps.runScan({
143
164
  projectPath,
144
165
  outDir,
@@ -173,7 +194,12 @@ export async function runCli(rawArgs: string[], deps: CliDeps = defaultDeps): Pr
173
194
  const thresholdHit =
174
195
  argv.failOn !== 'none' &&
175
196
  report.findings.some((f) => deps.shouldFail(argv.failOn as FailOn, f.severity));
176
- deps.stdout.write(buildCliSummary(displayReport, String(argv.failOn), thresholdHit, useColor(deps.stdout)));
197
+ const unknownHit =
198
+ Boolean(argv.failOnUnknown) &&
199
+ report.findings.some((f) => f.severity === 'unknown' || typeof f.unknownReason === 'string');
200
+ deps.stdout.write(
201
+ buildCliSummary(displayReport, String(argv.failOn), thresholdHit, unknownHit, useColor(deps.stdout))
202
+ );
177
203
  deps.stdout.write(buildFindingsList(displayReport, argv.listFindings as ListFindingsMode, useColor(deps.stdout)));
178
204
  if (argv.findingsJson) {
179
205
  const findingsJsonPath = path.resolve(String(argv.findingsJson));
@@ -182,7 +208,7 @@ export async function runCli(rawArgs: string[], deps: CliDeps = defaultDeps): Pr
182
208
  deps.stdout.write(`${findingsJsonPath}\n`);
183
209
  }
184
210
 
185
- if (thresholdHit) {
211
+ if (thresholdHit || unknownHit) {
186
212
  exitCode = 1;
187
213
  return;
188
214
  }
@@ -288,11 +314,13 @@ function resolveScanSettings(input: {
288
314
  };
289
315
 
290
316
  let offline = preset.offline;
291
- if (input.online) offline = false;
317
+ if (input.online) {
318
+ throw new Error('scan is offline-only. Run "bardscan db update <path>" first, then run "bardscan scan".');
319
+ }
292
320
  if (typeof input.offline === 'boolean') offline = input.offline;
293
321
 
294
- if (input.privacy === 'strict' && !offline) {
295
- throw new Error('privacy strict disallows online scanning. Remove --online or use --privacy standard.');
322
+ if (!offline) {
323
+ throw new Error('scan is offline-only. Remove online settings and refresh advisories via "bardscan db update".');
296
324
  }
297
325
  if ((input.telemetry ?? preset.telemetry) === 'on' && input.privacy === 'strict') {
298
326
  throw new Error('privacy strict disallows telemetry.');
@@ -310,6 +338,7 @@ function buildCliSummary(
310
338
  report: Awaited<ReturnType<typeof core.runScan>>,
311
339
  failOn: string,
312
340
  thresholdHit: boolean,
341
+ unknownHit: boolean,
313
342
  color: boolean
314
343
  ): string {
315
344
  const sev = report.summary.bySeverity;
@@ -323,7 +352,8 @@ function buildCliSummary(
323
352
  `severity: critical=${colorize(String(sev.critical), 'magenta', color)} high=${colorize(String(sev.high), 'red', color)} medium=${colorize(String(sev.medium), 'yellow', color)} low=${colorize(String(sev.low), 'green', color)} unknown=${colorize(String(sev.unknown), 'gray', color)}`,
324
353
  `confidence: high=${colorize(String(conf.high), 'green', color)} medium=${colorize(String(conf.medium), 'yellow', color)} low=${colorize(String(conf.low), 'red', color)} unknown=${colorize(String(conf.unknown), 'gray', color)}`,
325
354
  `fail-on: ${failOn}`,
326
- `threshold hit: ${thresholdHit ? colorize('yes', 'red', color) : colorize('no', 'green', color)}`
355
+ `threshold hit: ${thresholdHit ? colorize('yes', 'red', color) : colorize('no', 'green', color)}`,
356
+ `unknown hit: ${unknownHit ? colorize('yes', 'red', color) : colorize('no', 'green', color)}`
327
357
  ];
328
358
  return `${lines.join('\n')}\n`;
329
359
  }
package/test/cli.test.ts CHANGED
@@ -379,3 +379,215 @@ test('runCli writes filtered findings JSON when findings-json is set', async ()
379
379
  assert.equal(parsed.length, 1);
380
380
  assert.equal(parsed[0]?.packageName, 'high-pkg');
381
381
  });
382
+
383
+ test('runCli strict defaults enforce offline scan settings and redacted output', async () => {
384
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'bardscan-cli-strict-defaults-'));
385
+ const writes: Array<{ filePath: string; content: string }> = [];
386
+ let captured:
387
+ | {
388
+ offline: boolean;
389
+ enableNetworkFallbacks: boolean | undefined;
390
+ evidenceMode: 'none' | 'imports' | undefined;
391
+ }
392
+ | undefined;
393
+ const deps: CliDeps = {
394
+ mkdir: async () => undefined,
395
+ writeFile: async (filePath, content) => {
396
+ writes.push({ filePath: String(filePath), content: String(content) });
397
+ },
398
+ runScan: async (options) => {
399
+ captured = {
400
+ offline: options.offline,
401
+ enableNetworkFallbacks: options.enableNetworkFallbacks,
402
+ evidenceMode: options.evidenceMode
403
+ };
404
+ return makeReport('low');
405
+ },
406
+ updateAdvisoryDb: async () => ({
407
+ projectPath: '/tmp/project',
408
+ generatedAt: '2026-02-19T00:00:00.000Z',
409
+ dependencyCount: 0,
410
+ queriedCount: 0,
411
+ bySource: { osv: 0, cache: 0, unknown: 0 }
412
+ }),
413
+ buildMarkdownReport: () => '# report',
414
+ buildSarifReport: () => ({ version: '2.1.0', runs: [] }),
415
+ shouldFail: () => false,
416
+ redactReportPaths: (report) => ({
417
+ ...report,
418
+ targetPath: '[redacted]',
419
+ findings: report.findings.map((f) => ({ ...f, evidence: f.evidence.map(() => '[redacted]') }))
420
+ }),
421
+ stdout: { write: () => undefined },
422
+ stderr: { write: () => undefined }
423
+ };
424
+
425
+ const code = await runCli(['scan', '.', '--format', 'json', '--out-dir', outDir, '--fail-on', 'none'], deps);
426
+ assert.equal(code, 0);
427
+ assert.equal(captured?.offline, true);
428
+ assert.equal(captured?.enableNetworkFallbacks, false);
429
+ assert.equal(captured?.evidenceMode, 'none');
430
+ assert.match(writes[0]?.content ?? '', /"\[redacted\]"/);
431
+ assert.doesNotMatch(writes[0]?.content ?? '', /\/tmp\/project/);
432
+ });
433
+
434
+ test('runCli fail-on-unknown returns exit code 1 when unresolved findings exist', async () => {
435
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'bardscan-cli-fail-unknown-'));
436
+ const deps: CliDeps = {
437
+ mkdir: async () => undefined,
438
+ writeFile: async () => undefined,
439
+ runScan: async () => ({
440
+ ...makeReport('unknown'),
441
+ summary: {
442
+ dependencyCount: 1,
443
+ scannedFiles: 1,
444
+ findingsCount: 1,
445
+ bySeverity: { critical: 0, high: 0, medium: 0, low: 0, unknown: 1 },
446
+ byConfidence: { high: 0, medium: 0, low: 0, unknown: 1 }
447
+ },
448
+ findings: [
449
+ {
450
+ ...makeReport('unknown').findings[0],
451
+ unknownReason: 'lookup_failed'
452
+ }
453
+ ]
454
+ }),
455
+ updateAdvisoryDb: async () => ({
456
+ projectPath: '/tmp/project',
457
+ generatedAt: '2026-02-19T00:00:00.000Z',
458
+ dependencyCount: 0,
459
+ queriedCount: 0,
460
+ bySource: { osv: 0, cache: 0, unknown: 0 }
461
+ }),
462
+ buildMarkdownReport: () => '# report',
463
+ buildSarifReport: () => ({ version: '2.1.0', runs: [] }),
464
+ shouldFail: () => false,
465
+ redactReportPaths: (report) => report,
466
+ stdout: { write: () => undefined },
467
+ stderr: { write: () => undefined }
468
+ };
469
+
470
+ const code = await runCli(
471
+ ['scan', '.', '--format', 'json', '--out-dir', outDir, '--fail-on', 'none', '--fail-on-unknown'],
472
+ deps
473
+ );
474
+ assert.equal(code, 1);
475
+ });
476
+
477
+ test('runCli db update prints update summary and returns exit code 0', async () => {
478
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'bardscan-cli-db-update-'));
479
+ const stdout: string[] = [];
480
+ const deps: CliDeps = {
481
+ mkdir: async () => undefined,
482
+ writeFile: async () => undefined,
483
+ runScan: async () => makeReport('low'),
484
+ updateAdvisoryDb: async () => ({
485
+ projectPath: '/tmp/project',
486
+ generatedAt: '2026-02-19T00:00:00.000Z',
487
+ dependencyCount: 3,
488
+ queriedCount: 3,
489
+ bySource: { osv: 2, cache: 1, unknown: 0 }
490
+ }),
491
+ buildMarkdownReport: () => '# report',
492
+ buildSarifReport: () => ({ version: '2.1.0', runs: [] }),
493
+ shouldFail: () => false,
494
+ redactReportPaths: (report) => report,
495
+ stdout: { write: (text: string) => stdout.push(text) },
496
+ stderr: { write: () => undefined }
497
+ };
498
+
499
+ const code = await runCli(['db', 'update', '.', '--out-dir', outDir], deps);
500
+ assert.equal(code, 0);
501
+ assert.match(stdout.join(''), /bardscan db update/);
502
+ assert.match(stdout.join(''), /dependencies: 3/);
503
+ assert.match(stdout.join(''), /sources: osv=2 cache=1 unknown=0/);
504
+ });
505
+
506
+ test('runCli db update returns exit code 2 on updater error', async () => {
507
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'bardscan-cli-db-update-err-'));
508
+ const stderr: string[] = [];
509
+ const deps: CliDeps = {
510
+ mkdir: async () => undefined,
511
+ writeFile: async () => undefined,
512
+ runScan: async () => makeReport('low'),
513
+ updateAdvisoryDb: async () => {
514
+ throw new Error('update failed');
515
+ },
516
+ buildMarkdownReport: () => '# report',
517
+ buildSarifReport: () => ({ version: '2.1.0', runs: [] }),
518
+ shouldFail: () => false,
519
+ redactReportPaths: (report) => report,
520
+ stdout: { write: () => undefined },
521
+ stderr: { write: (text: string) => stderr.push(text) }
522
+ };
523
+
524
+ const code = await runCli(['db', 'update', '.', '--out-dir', outDir], deps);
525
+ assert.equal(code, 2);
526
+ assert.match(stderr.join(''), /update failed/);
527
+ });
528
+
529
+ test('runCli rejects --online for scan and instructs using db update', async () => {
530
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'bardscan-cli-online-reject-'));
531
+ const stderr: string[] = [];
532
+ const deps: CliDeps = {
533
+ mkdir: async () => undefined,
534
+ writeFile: async () => undefined,
535
+ runScan: async () => makeReport('low'),
536
+ updateAdvisoryDb: async () => ({
537
+ projectPath: '/tmp/project',
538
+ generatedAt: '2026-02-19T00:00:00.000Z',
539
+ dependencyCount: 0,
540
+ queriedCount: 0,
541
+ bySource: { osv: 0, cache: 0, unknown: 0 }
542
+ }),
543
+ buildMarkdownReport: () => '# report',
544
+ buildSarifReport: () => ({ version: '2.1.0', runs: [] }),
545
+ shouldFail: () => false,
546
+ redactReportPaths: (report) => report,
547
+ stdout: { write: () => undefined },
548
+ stderr: { write: (text: string) => stderr.push(text) }
549
+ };
550
+
551
+ const code = await runCli(['scan', '.', '--online', '--out-dir', outDir], deps);
552
+ assert.equal(code, 2);
553
+ assert.match(stderr.join(''), /scan is offline-only/);
554
+ assert.match(stderr.join(''), /db update/);
555
+ });
556
+
557
+ test('runCli can run db update and scan in one command with --update-db', async () => {
558
+ const outDir = await mkdtemp(path.join(os.tmpdir(), 'bardscan-cli-update-db-scan-'));
559
+ const stdout: string[] = [];
560
+ let updateCalled = 0;
561
+ let scanCalled = 0;
562
+ const deps: CliDeps = {
563
+ mkdir: async () => undefined,
564
+ writeFile: async () => undefined,
565
+ runScan: async () => {
566
+ scanCalled += 1;
567
+ return makeReport('low');
568
+ },
569
+ updateAdvisoryDb: async () => {
570
+ updateCalled += 1;
571
+ return {
572
+ projectPath: '/tmp/project',
573
+ generatedAt: '2026-02-19T00:00:00.000Z',
574
+ dependencyCount: 1,
575
+ queriedCount: 1,
576
+ bySource: { osv: 1, cache: 0, unknown: 0 }
577
+ };
578
+ },
579
+ buildMarkdownReport: () => '# report',
580
+ buildSarifReport: () => ({ version: '2.1.0', runs: [] }),
581
+ shouldFail: () => false,
582
+ redactReportPaths: (report) => report,
583
+ stdout: { write: (text: string) => stdout.push(text) },
584
+ stderr: { write: () => undefined }
585
+ };
586
+
587
+ const code = await runCli(['scan', '.', '--update-db', '--out-dir', outDir, '--format', 'json', '--fail-on', 'none'], deps);
588
+ assert.equal(code, 0);
589
+ assert.equal(updateCalled, 1);
590
+ assert.equal(scanCalled, 1);
591
+ assert.match(stdout.join(''), /bardscan db update/);
592
+ assert.match(stdout.join(''), /bardscan summary/);
593
+ });