@vibgrate/cli 0.1.4 → 1.0.1

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 CHANGED
@@ -56,13 +56,19 @@ That's it. You'll see a full drift report in seconds.
56
56
  ## What You Get
57
57
 
58
58
  ```
59
+ ╭───╮➜
60
+ ╭┤◉ ◉├╮ V I B G R A T E
61
+ ╰┤───├╯ Drift Intelligence Engine v1.x.x
62
+ ╰───╯
63
+
59
64
  ╔══════════════════════════════════════════╗
60
65
  ║ Vibgrate Drift Report ║
61
66
  ╚══════════════════════════════════════════╝
62
67
 
63
68
  Drift Score: 72/100
64
- Risk Level: Low
69
+ Risk Level: LOW
65
70
  Projects: 3
71
+ VCS: git main a1b2c3d
66
72
 
67
73
  Score Breakdown
68
74
  Runtime: ████████████████████ 100
@@ -77,9 +83,61 @@ That's it. You'll see a full drift report in seconds.
77
83
  Dependencies:
78
84
  42 current 8 1-behind 3 2+ behind
79
85
 
80
- Findings
86
+ ── web-app (node) src/web
87
+ Runtime: 20.11.0 (current)
88
+ Frameworks:
89
+ React: 18.2.0 → 19.0.0 (1 behind)
90
+ Dependencies:
91
+ 31 current 5 1-behind 2 2+ behind
92
+
93
+ Tech Stack
94
+ Frontend: React, Tailwind CSS
95
+ Bundlers: Vite
96
+ Testing: Vitest, Playwright
97
+ Lint & Format: ESLint, Prettier
98
+
99
+ Services & Integrations
100
+ Cloud: AWS SDK v3
101
+ Databases: PostgreSQL
102
+
103
+ TypeScript
104
+ v5.4.2 · strict ✔ · ESM · target: ES2022
105
+
106
+ Build & Deploy
107
+ CI: GitHub Actions
108
+ Docker: 2 Dockerfiles (node:20-alpine)
109
+ Package Managers: pnpm
110
+
111
+ Security Posture
112
+ Lockfile ✔ · .env ✔ · node_modules ✔
113
+
114
+ Dependency Graph
115
+ pnpm-lock.yaml: 312 unique, 487 installed
116
+ 5 duplicated packages
117
+
118
+ Findings (2 warnings, 1 note)
81
119
  ⚠ Framework "NestJS" is 1 major version(s) behind
120
+ framework/outdated in src/api/package.json
82
121
  ⚠ 12% of dependencies are 2+ major versions behind
122
+ dependency/outdated in src/api/package.json
123
+ ℹ TypeScript target is ES2022
124
+ ts/target in tsconfig.json
125
+
126
+ ╔══════════════════════════════════════════╗
127
+ ║ Top Priority Actions ║
128
+ ╚══════════════════════════════════════════╝
129
+
130
+ 1. Upgrade NestJS 10.3.0 → 11.0.0 in my-api
131
+ 1 major version behind. Major framework drift increases
132
+ breaking change risk and blocks access to security fixes.
133
+ Impact: +5–15 points (framework score)
134
+
135
+ 2. Reduce dependency rot in my-api (42% severely outdated)
136
+ 3 of 53 dependencies are 2+ majors behind. Run `npm outdated`
137
+ and prioritise packages with known CVEs.
138
+ Impact: +5–10 points (dependency score)
139
+
140
+ Scanned at 2026-02-16T00:00:00.000Z · 1.2s · 48 files scanned
83
141
  ```
84
142
 
85
143
  ---
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  baselineCommand,
3
3
  runBaseline
4
- } from "./chunk-BTIIFIOD.js";
5
- import "./chunk-WO6EZ6AF.js";
4
+ } from "./chunk-NTRKEIKP.js";
5
+ import "./chunk-VMNBKARQ.js";
6
6
  export {
7
7
  baselineCommand,
8
8
  runBaseline
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  runScan,
3
3
  writeJsonFile
4
- } from "./chunk-WO6EZ6AF.js";
4
+ } from "./chunk-VMNBKARQ.js";
5
5
 
6
6
  // src/commands/baseline.ts
7
7
  import * as path from "path";
@@ -275,11 +275,22 @@ function generateFindings(projects, config) {
275
275
  return findings;
276
276
  }
277
277
 
278
+ // src/version.ts
279
+ import { createRequire } from "module";
280
+ var require2 = createRequire(import.meta.url);
281
+ var pkg = require2("../package.json");
282
+ var VERSION = pkg.version;
283
+
278
284
  // src/formatters/text.ts
279
285
  import chalk from "chalk";
280
286
  function formatText(artifact) {
281
287
  const lines = [];
282
288
  lines.push("");
289
+ lines.push(chalk.cyan(" \u256D\u2500\u2500\u2500\u256E") + chalk.greenBright("\u279C"));
290
+ lines.push(chalk.cyan(" \u256D\u2524") + chalk.greenBright("\u25C9 \u25C9") + chalk.cyan("\u251C\u256E") + " " + chalk.bold.white("V I B G R A T E"));
291
+ lines.push(chalk.cyan(" \u2570\u2524") + chalk.dim("\u2500\u2500\u2500") + chalk.cyan("\u251C\u256F") + " " + chalk.dim(`Drift Intelligence Engine v${VERSION}`));
292
+ lines.push(chalk.cyan(" \u2570\u2500\u2500\u2500\u256F"));
293
+ lines.push("");
283
294
  lines.push(chalk.bold.cyan("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
284
295
  lines.push(chalk.bold.cyan("\u2551 Vibgrate Drift Report \u2551"));
285
296
  lines.push(chalk.bold.cyan("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
@@ -366,7 +377,15 @@ function formatText(artifact) {
366
377
  lines.push("");
367
378
  }
368
379
  }
369
- lines.push(chalk.dim(` Scanned at ${artifact.timestamp}`));
380
+ const scannedParts = [`Scanned at ${artifact.timestamp}`];
381
+ if (artifact.durationMs !== void 0) {
382
+ const secs = (artifact.durationMs / 1e3).toFixed(1);
383
+ scannedParts.push(`${secs}s`);
384
+ }
385
+ if (artifact.filesScanned !== void 0) {
386
+ scannedParts.push(`${artifact.filesScanned} file${artifact.filesScanned !== 1 ? "s" : ""} scanned`);
387
+ }
388
+ lines.push(chalk.dim(` ${scannedParts.join(" \xB7 ")}`));
370
389
  lines.push("");
371
390
  return lines.join("\n");
372
391
  }
@@ -753,12 +772,6 @@ function toSarifResult(finding) {
753
772
  };
754
773
  }
755
774
 
756
- // src/version.ts
757
- import { createRequire } from "module";
758
- var require2 = createRequire(import.meta.url);
759
- var pkg = require2("../package.json");
760
- var VERSION = pkg.version;
761
-
762
775
  // src/commands/scan.ts
763
776
  import * as path12 from "path";
764
777
  import { Command } from "commander";
@@ -1549,7 +1562,7 @@ var ROBOT = [
1549
1562
  ];
1550
1563
  var BRAND = [
1551
1564
  chalk2.bold.white(" V I B G R A T E"),
1552
- chalk2.dim(" Drift Intelligence Engine")
1565
+ chalk2.dim(` Drift Intelligence Engine`) + chalk2.dim(` v${VERSION}`)
1553
1566
  ];
1554
1567
  var SPINNER_FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
1555
1568
  var ScanProgress = class {
@@ -3650,10 +3663,12 @@ function scanServiceDependencies(projects) {
3650
3663
 
3651
3664
  // src/commands/scan.ts
3652
3665
  async function runScan(rootDir, opts) {
3666
+ const scanStart = Date.now();
3653
3667
  const config = await loadConfig(rootDir);
3654
3668
  const sem = new Semaphore(opts.concurrency);
3655
3669
  const npmCache = new NpmCache(rootDir, sem);
3656
3670
  const scanners = config.scanners;
3671
+ let filesScanned = 0;
3657
3672
  const progress = new ScanProgress(rootDir);
3658
3673
  const steps = [
3659
3674
  { id: "config", label: "Loading configuration" },
@@ -3687,6 +3702,7 @@ async function runScan(rootDir, opts) {
3687
3702
  progress.addDependencies(p.dependencies.length);
3688
3703
  progress.addFrameworks(p.frameworks.length);
3689
3704
  }
3705
+ filesScanned += nodeProjects.length;
3690
3706
  progress.addProjects(nodeProjects.length);
3691
3707
  progress.completeStep("node", `${nodeProjects.length} project${nodeProjects.length !== 1 ? "s" : ""}`, nodeProjects.length);
3692
3708
  progress.startStep("dotnet");
@@ -3695,91 +3711,130 @@ async function runScan(rootDir, opts) {
3695
3711
  progress.addDependencies(p.dependencies.length);
3696
3712
  progress.addFrameworks(p.frameworks.length);
3697
3713
  }
3714
+ filesScanned += dotnetProjects.length;
3698
3715
  progress.addProjects(dotnetProjects.length);
3699
3716
  progress.completeStep("dotnet", `${dotnetProjects.length} project${dotnetProjects.length !== 1 ? "s" : ""}`, dotnetProjects.length);
3700
3717
  const allProjects = [...nodeProjects, ...dotnetProjects];
3701
3718
  const extended = {};
3702
3719
  if (scanners !== false) {
3720
+ const scannerTasks = [];
3703
3721
  if (scanners?.platformMatrix?.enabled !== false) {
3704
3722
  progress.startStep("platform");
3705
- extended.platformMatrix = await scanPlatformMatrix(rootDir);
3706
- const nativeCount = extended.platformMatrix.nativeModules.length;
3707
- const dockerCount = extended.platformMatrix.dockerBaseImages.length;
3708
- const parts = [];
3709
- if (nativeCount > 0) parts.push(`${nativeCount} native`);
3710
- if (dockerCount > 0) parts.push(`${dockerCount} docker`);
3711
- progress.completeStep("platform", parts.join(", ") || "clean", nativeCount + dockerCount);
3723
+ scannerTasks.push(
3724
+ scanPlatformMatrix(rootDir).then((result) => {
3725
+ extended.platformMatrix = result;
3726
+ const nativeCount = result.nativeModules.length;
3727
+ const dockerCount = result.dockerBaseImages.length;
3728
+ const parts = [];
3729
+ if (nativeCount > 0) parts.push(`${nativeCount} native`);
3730
+ if (dockerCount > 0) parts.push(`${dockerCount} docker`);
3731
+ progress.completeStep("platform", parts.join(", ") || "clean", nativeCount + dockerCount);
3732
+ })
3733
+ );
3712
3734
  }
3713
3735
  if (scanners?.toolingInventory?.enabled !== false) {
3714
3736
  progress.startStep("tooling");
3715
- extended.toolingInventory = scanToolingInventory(allProjects);
3716
- const toolCount = Object.values(extended.toolingInventory).reduce((sum, arr) => sum + arr.length, 0);
3717
- progress.completeStep("tooling", `${toolCount} tool${toolCount !== 1 ? "s" : ""} mapped`, toolCount);
3737
+ scannerTasks.push(
3738
+ Promise.resolve().then(() => {
3739
+ extended.toolingInventory = scanToolingInventory(allProjects);
3740
+ const toolCount = Object.values(extended.toolingInventory).reduce((sum, arr) => sum + arr.length, 0);
3741
+ progress.completeStep("tooling", `${toolCount} tool${toolCount !== 1 ? "s" : ""} mapped`, toolCount);
3742
+ })
3743
+ );
3718
3744
  }
3719
3745
  if (scanners?.serviceDependencies?.enabled !== false) {
3720
3746
  progress.startStep("services");
3721
- extended.serviceDependencies = scanServiceDependencies(allProjects);
3722
- const svcCount = Object.values(extended.serviceDependencies).reduce((sum, arr) => sum + arr.length, 0);
3723
- progress.completeStep("services", `${svcCount} service${svcCount !== 1 ? "s" : ""} detected`, svcCount);
3747
+ scannerTasks.push(
3748
+ Promise.resolve().then(() => {
3749
+ extended.serviceDependencies = scanServiceDependencies(allProjects);
3750
+ const svcCount = Object.values(extended.serviceDependencies).reduce((sum, arr) => sum + arr.length, 0);
3751
+ progress.completeStep("services", `${svcCount} service${svcCount !== 1 ? "s" : ""} detected`, svcCount);
3752
+ })
3753
+ );
3724
3754
  }
3725
3755
  if (scanners?.breakingChangeExposure?.enabled !== false) {
3726
3756
  progress.startStep("breaking");
3727
- extended.breakingChangeExposure = scanBreakingChangeExposure(allProjects);
3728
- const bc = extended.breakingChangeExposure;
3729
- const bcTotal = bc.deprecatedPackages.length + bc.legacyPolyfills.length;
3730
- progress.completeStep(
3731
- "breaking",
3732
- bcTotal > 0 ? `${bc.deprecatedPackages.length} deprecated, ${bc.legacyPolyfills.length} polyfills` : "none found",
3733
- bcTotal
3757
+ scannerTasks.push(
3758
+ Promise.resolve().then(() => {
3759
+ extended.breakingChangeExposure = scanBreakingChangeExposure(allProjects);
3760
+ const bc = extended.breakingChangeExposure;
3761
+ const bcTotal = bc.deprecatedPackages.length + bc.legacyPolyfills.length;
3762
+ progress.completeStep(
3763
+ "breaking",
3764
+ bcTotal > 0 ? `${bc.deprecatedPackages.length} deprecated, ${bc.legacyPolyfills.length} polyfills` : "none found",
3765
+ bcTotal
3766
+ );
3767
+ })
3734
3768
  );
3735
3769
  }
3736
3770
  if (scanners?.securityPosture?.enabled !== false) {
3737
3771
  progress.startStep("security");
3738
- extended.securityPosture = await scanSecurityPosture(rootDir);
3739
- const sec = extended.securityPosture;
3740
- const secDetail = sec.lockfilePresent ? `lockfile \u2714${sec.gitignoreCoversEnv ? " \xB7 .env \u2714" : " \xB7 .env \u2716"}` : "no lockfile";
3741
- progress.completeStep("security", secDetail);
3772
+ scannerTasks.push(
3773
+ scanSecurityPosture(rootDir).then((result) => {
3774
+ extended.securityPosture = result;
3775
+ const secDetail = result.lockfilePresent ? `lockfile \u2714${result.gitignoreCoversEnv ? " \xB7 .env \u2714" : " \xB7 .env \u2716"}` : "no lockfile";
3776
+ progress.completeStep("security", secDetail);
3777
+ })
3778
+ );
3742
3779
  }
3743
3780
  if (scanners?.buildDeploy?.enabled !== false) {
3744
3781
  progress.startStep("build");
3745
- extended.buildDeploy = await scanBuildDeploy(rootDir);
3746
- const bd = extended.buildDeploy;
3747
- const bdParts = [];
3748
- if (bd.ci.length > 0) bdParts.push(bd.ci.join(", "));
3749
- if (bd.docker.dockerfileCount > 0) bdParts.push(`${bd.docker.dockerfileCount} Dockerfile${bd.docker.dockerfileCount !== 1 ? "s" : ""}`);
3750
- progress.completeStep("build", bdParts.join(" \xB7 ") || "none detected");
3782
+ scannerTasks.push(
3783
+ scanBuildDeploy(rootDir).then((result) => {
3784
+ extended.buildDeploy = result;
3785
+ const bdParts = [];
3786
+ if (result.ci.length > 0) bdParts.push(result.ci.join(", "));
3787
+ if (result.docker.dockerfileCount > 0) bdParts.push(`${result.docker.dockerfileCount} Dockerfile${result.docker.dockerfileCount !== 1 ? "s" : ""}`);
3788
+ progress.completeStep("build", bdParts.join(" \xB7 ") || "none detected");
3789
+ })
3790
+ );
3751
3791
  }
3752
3792
  if (scanners?.tsModernity?.enabled !== false) {
3753
3793
  progress.startStep("ts");
3754
- extended.tsModernity = await scanTsModernity(rootDir);
3755
- const ts = extended.tsModernity;
3756
- const tsParts = [];
3757
- if (ts.typescriptVersion) tsParts.push(`v${ts.typescriptVersion}`);
3758
- if (ts.strict === true) tsParts.push("strict");
3759
- if (ts.moduleType) tsParts.push(ts.moduleType.toUpperCase());
3760
- progress.completeStep("ts", tsParts.join(" \xB7 ") || "no tsconfig");
3794
+ scannerTasks.push(
3795
+ scanTsModernity(rootDir).then((result) => {
3796
+ extended.tsModernity = result;
3797
+ const tsParts = [];
3798
+ if (result.typescriptVersion) tsParts.push(`v${result.typescriptVersion}`);
3799
+ if (result.strict === true) tsParts.push("strict");
3800
+ if (result.moduleType) tsParts.push(result.moduleType.toUpperCase());
3801
+ progress.completeStep("ts", tsParts.join(" \xB7 ") || "no tsconfig");
3802
+ })
3803
+ );
3761
3804
  }
3762
3805
  if (scanners?.fileHotspots?.enabled !== false) {
3763
3806
  progress.startStep("hotspots");
3764
- extended.fileHotspots = await scanFileHotspots(rootDir);
3765
- progress.completeStep("hotspots", `${extended.fileHotspots.totalFiles} files`, extended.fileHotspots.totalFiles);
3807
+ scannerTasks.push(
3808
+ scanFileHotspots(rootDir).then((result) => {
3809
+ extended.fileHotspots = result;
3810
+ progress.completeStep("hotspots", `${result.totalFiles} files`, result.totalFiles);
3811
+ })
3812
+ );
3766
3813
  }
3767
3814
  if (scanners?.dependencyGraph?.enabled !== false) {
3768
3815
  progress.startStep("depgraph");
3769
- extended.dependencyGraph = await scanDependencyGraph(rootDir);
3770
- const dg = extended.dependencyGraph;
3771
- const dgDetail = dg.lockfileType ? `${dg.lockfileType} \xB7 ${dg.totalUnique} unique` : "no lockfile";
3772
- progress.completeStep("depgraph", dgDetail, dg.totalUnique);
3816
+ scannerTasks.push(
3817
+ scanDependencyGraph(rootDir).then((result) => {
3818
+ extended.dependencyGraph = result;
3819
+ const dgDetail = result.lockfileType ? `${result.lockfileType} \xB7 ${result.totalUnique} unique` : "no lockfile";
3820
+ progress.completeStep("depgraph", dgDetail, result.totalUnique);
3821
+ })
3822
+ );
3773
3823
  }
3774
3824
  if (scanners?.dependencyRisk?.enabled !== false) {
3775
3825
  progress.startStep("deprisk");
3776
- extended.dependencyRisk = scanDependencyRisk(allProjects);
3777
- const dr = extended.dependencyRisk;
3778
- const drParts = [];
3779
- if (dr.deprecatedPackages.length > 0) drParts.push(`${dr.deprecatedPackages.length} deprecated`);
3780
- if (dr.nativeModulePackages.length > 0) drParts.push(`${dr.nativeModulePackages.length} native`);
3781
- progress.completeStep("deprisk", drParts.join(", ") || "low risk");
3826
+ scannerTasks.push(
3827
+ Promise.resolve().then(() => {
3828
+ extended.dependencyRisk = scanDependencyRisk(allProjects);
3829
+ const dr = extended.dependencyRisk;
3830
+ const drParts = [];
3831
+ if (dr.deprecatedPackages.length > 0) drParts.push(`${dr.deprecatedPackages.length} deprecated`);
3832
+ if (dr.nativeModulePackages.length > 0) drParts.push(`${dr.nativeModulePackages.length} native`);
3833
+ progress.completeStep("deprisk", drParts.join(", ") || "low risk");
3834
+ })
3835
+ );
3782
3836
  }
3837
+ await Promise.all(scannerTasks);
3783
3838
  }
3784
3839
  progress.startStep("drift");
3785
3840
  const drift = computeDriftScore(allProjects);
@@ -3799,6 +3854,15 @@ async function runScan(rootDir, opts) {
3799
3854
  if (allProjects.length === 0) {
3800
3855
  console.log(chalk3.yellow("No projects found."));
3801
3856
  }
3857
+ if (extended.fileHotspots) filesScanned += extended.fileHotspots.totalFiles;
3858
+ if (extended.securityPosture) filesScanned += 1;
3859
+ if (extended.tsModernity?.typescriptVersion) filesScanned += 1;
3860
+ if (extended.dependencyGraph?.lockfileType) filesScanned += 1;
3861
+ if (extended.buildDeploy) {
3862
+ filesScanned += extended.buildDeploy.docker.dockerfileCount;
3863
+ filesScanned += extended.buildDeploy.ci.length;
3864
+ }
3865
+ const durationMs = Date.now() - scanStart;
3802
3866
  const artifact = {
3803
3867
  schemaVersion: "1.0",
3804
3868
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -3808,7 +3872,9 @@ async function runScan(rootDir, opts) {
3808
3872
  projects: allProjects,
3809
3873
  drift,
3810
3874
  findings,
3811
- ...Object.keys(extended).length > 0 ? { extended } : {}
3875
+ ...Object.keys(extended).length > 0 ? { extended } : {},
3876
+ durationMs,
3877
+ filesScanned
3812
3878
  };
3813
3879
  if (opts.baseline) {
3814
3880
  const baselinePath = path12.resolve(opts.baseline);
@@ -3892,9 +3958,9 @@ export {
3892
3958
  writeDefaultConfig,
3893
3959
  computeDriftScore,
3894
3960
  generateFindings,
3961
+ VERSION,
3895
3962
  formatText,
3896
3963
  formatSarif,
3897
- VERSION,
3898
3964
  runScan,
3899
3965
  scanCommand
3900
3966
  };
@@ -8,7 +8,10 @@ function formatMarkdown(artifact) {
8
8
  lines.push(`| **Drift Score** | ${artifact.drift.score}/100 |`);
9
9
  lines.push(`| **Risk Level** | ${artifact.drift.riskLevel.toUpperCase()} |`);
10
10
  lines.push(`| **Projects** | ${artifact.projects.length} |`);
11
- lines.push(`| **Scanned** | ${artifact.timestamp} |`);
11
+ const scannedMeta = [artifact.timestamp];
12
+ if (artifact.durationMs !== void 0) scannedMeta.push(`${(artifact.durationMs / 1e3).toFixed(1)}s`);
13
+ if (artifact.filesScanned !== void 0) scannedMeta.push(`${artifact.filesScanned} files`);
14
+ lines.push(`| **Scanned** | ${scannedMeta.join(" \xB7 ")} |`);
12
15
  if (artifact.vcs) {
13
16
  lines.push(`| **VCS** | ${artifact.vcs.type} |`);
14
17
  if (artifact.vcs.branch) lines.push(`| **Branch** | ${artifact.vcs.branch} |`);
package/dist/cli.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  formatMarkdown
4
- } from "./chunk-AMOJCCF5.js";
4
+ } from "./chunk-VXZT34Y5.js";
5
5
  import {
6
6
  baselineCommand
7
- } from "./chunk-BTIIFIOD.js";
7
+ } from "./chunk-NTRKEIKP.js";
8
8
  import {
9
9
  VERSION,
10
10
  ensureDir,
@@ -15,7 +15,7 @@ import {
15
15
  scanCommand,
16
16
  writeDefaultConfig,
17
17
  writeTextFile
18
- } from "./chunk-WO6EZ6AF.js";
18
+ } from "./chunk-VMNBKARQ.js";
19
19
 
20
20
  // src/cli.ts
21
21
  import { Command as Command6 } from "commander";
@@ -38,7 +38,7 @@ var initCommand = new Command("init").description("Initialize vibgrate in a proj
38
38
  console.log(chalk.green("\u2714") + ` Created ${chalk.bold("vibgrate.config.ts")}`);
39
39
  }
40
40
  if (opts.baseline) {
41
- const { runBaseline } = await import("./baseline-45AWVXG4.js");
41
+ const { runBaseline } = await import("./baseline-35XRSRAD.js");
42
42
  await runBaseline(rootDir);
43
43
  }
44
44
  console.log("");
package/dist/index.d.ts CHANGED
@@ -72,6 +72,10 @@ interface ScanArtifact {
72
72
  baseline?: string;
73
73
  delta?: number;
74
74
  extended?: ExtendedScanResults;
75
+ /** Scan wall-clock duration in milliseconds */
76
+ durationMs?: number;
77
+ /** Number of manifest/config files scanned */
78
+ filesScanned?: number;
75
79
  }
76
80
  interface ScanOptions {
77
81
  out?: string;
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  formatMarkdown
3
- } from "./chunk-AMOJCCF5.js";
3
+ } from "./chunk-VXZT34Y5.js";
4
4
  import {
5
5
  computeDriftScore,
6
6
  formatSarif,
7
7
  formatText,
8
8
  generateFindings,
9
9
  runScan
10
- } from "./chunk-WO6EZ6AF.js";
10
+ } from "./chunk-VMNBKARQ.js";
11
11
  export {
12
12
  computeDriftScore,
13
13
  formatMarkdown,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibgrate/cli",
3
- "version": "0.1.4",
3
+ "version": "1.0.1",
4
4
  "description": "CLI for measuring upgrade drift across Node & .NET projects",
5
5
  "type": "module",
6
6
  "bin": {