@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 +60 -2
- package/dist/{baseline-45AWVXG4.js → baseline-35XRSRAD.js} +2 -2
- package/dist/{chunk-BTIIFIOD.js → chunk-NTRKEIKP.js} +1 -1
- package/dist/{chunk-WO6EZ6AF.js → chunk-VMNBKARQ.js} +125 -59
- package/dist/{chunk-AMOJCCF5.js → chunk-VXZT34Y5.js} +4 -1
- package/dist/cli.js +4 -4
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -2
- package/package.json +1 -1
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:
|
|
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
|
-
|
|
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
|
---
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
|
|
3710
|
-
|
|
3711
|
-
|
|
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
|
-
|
|
3716
|
-
|
|
3717
|
-
|
|
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
|
-
|
|
3722
|
-
|
|
3723
|
-
|
|
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
|
-
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3733
|
-
|
|
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
|
-
|
|
3739
|
-
|
|
3740
|
-
|
|
3741
|
-
|
|
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
|
-
|
|
3746
|
-
|
|
3747
|
-
|
|
3748
|
-
|
|
3749
|
-
|
|
3750
|
-
|
|
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
|
-
|
|
3755
|
-
|
|
3756
|
-
|
|
3757
|
-
|
|
3758
|
-
|
|
3759
|
-
|
|
3760
|
-
|
|
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
|
-
|
|
3765
|
-
|
|
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
|
-
|
|
3770
|
-
|
|
3771
|
-
|
|
3772
|
-
|
|
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
|
-
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
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
|
-
|
|
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-
|
|
4
|
+
} from "./chunk-VXZT34Y5.js";
|
|
5
5
|
import {
|
|
6
6
|
baselineCommand
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
10
|
+
} from "./chunk-VMNBKARQ.js";
|
|
11
11
|
export {
|
|
12
12
|
computeDriftScore,
|
|
13
13
|
formatMarkdown,
|