@vibgrate/cli 1.0.45 → 1.0.47
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/DOCS.md +293 -95
- package/README.md +212 -206
- package/dist/{baseline-FDWMBM2O.js → baseline-K7V6GAP3.js} +2 -2
- package/dist/{chunk-LO66M6OC.js → chunk-NASGRGXK.js} +1 -1
- package/dist/{chunk-GN3IWKSY.js → chunk-PTMLMDZU.js} +20 -0
- package/dist/{chunk-YFJC5JSQ.js → chunk-UVFIFNYG.js} +966 -305
- package/dist/cli.js +190 -10
- package/dist/index.d.ts +69 -0
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<p align="center">
|
|
2
2
|
<strong>@vibgrate/cli</strong>
|
|
3
3
|
<br />
|
|
4
|
-
Continuous Upgrade Drift Intelligence for
|
|
4
|
+
Continuous Upgrade Drift Intelligence for engineering teams
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
@@ -11,230 +11,249 @@
|
|
|
11
11
|
<img src="https://img.shields.io/node/v/@vibgrate/cli" alt="node version" />
|
|
12
12
|
</p>
|
|
13
13
|
|
|
14
|
+
Vibgrate gives you a clear answer to one question:
|
|
15
|
+
**How far behind is this repo, and what should we upgrade first?**
|
|
16
|
+
|
|
17
|
+
In one command, you get:
|
|
18
|
+
|
|
19
|
+
- A deterministic **Upgrade Drift Score** (0–100)
|
|
20
|
+
- A clear risk level (**Low / Moderate / High**)
|
|
21
|
+
- Runtime + framework major-version lag
|
|
22
|
+
- Dependency age distribution + EOL proximity
|
|
23
|
+
- Priority actions for what to fix next
|
|
24
|
+
|
|
25
|
+
Supported ecosystems today: **Node.js/TypeScript, .NET, Python, and Java**.
|
|
26
|
+
|
|
14
27
|
---
|
|
15
28
|
|
|
16
|
-
|
|
29
|
+
## Why teams adopt Vibgrate
|
|
30
|
+
|
|
31
|
+
Most systems do not fail all at once. They accumulate upgrade debt silently until migrations become expensive.
|
|
17
32
|
|
|
18
|
-
|
|
33
|
+
Vibgrate makes drift measurable and repeatable:
|
|
34
|
+
|
|
35
|
+
- **Developers** run a one-off scan to understand current debt.
|
|
36
|
+
- **CI pipelines** run every PR/build to stop regression.
|
|
37
|
+
- **Engineering leaders** track trends over time in the dashboard (optional push).
|
|
19
38
|
|
|
20
39
|
---
|
|
21
40
|
|
|
22
|
-
##
|
|
41
|
+
## One-off scan vs CI-integrated drift tracking
|
|
42
|
+
|
|
43
|
+
| Mode | What you get | Best for |
|
|
44
|
+
| ---------------------- | ----------------------------------------------------------------- | -------------------------------------------- |
|
|
45
|
+
| **One-off scan** | Fast snapshot of score, lag, and findings | Audits, due diligence, migration planning |
|
|
46
|
+
| **CI-integrated scan** | Continuous drift signal, SARIF annotations, regression guardrails | Keeping upgrade debt under control long-term |
|
|
23
47
|
|
|
24
|
-
|
|
48
|
+
Recommended rollout: start with a one-off scan now, then add Vibgrate to CI this week.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Quick start
|
|
53
|
+
|
|
54
|
+
Run instantly (no install):
|
|
25
55
|
|
|
26
56
|
```bash
|
|
27
|
-
npx @vibgrate/cli scan
|
|
57
|
+
npx @vibgrate/cli scan .
|
|
28
58
|
```
|
|
29
59
|
|
|
30
|
-
Or install
|
|
60
|
+
Or install locally:
|
|
31
61
|
|
|
32
62
|
```bash
|
|
33
63
|
npm install -D @vibgrate/cli
|
|
64
|
+
npx vibgrate scan .
|
|
34
65
|
```
|
|
35
66
|
|
|
36
|
-
|
|
67
|
+
Add an npm script:
|
|
37
68
|
|
|
38
|
-
```
|
|
39
|
-
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"scripts": {
|
|
72
|
+
"drift": "vibgrate scan ."
|
|
73
|
+
}
|
|
74
|
+
}
|
|
40
75
|
```
|
|
41
76
|
|
|
42
|
-
>
|
|
43
|
-
>
|
|
44
|
-
> ```json
|
|
45
|
-
> "scripts": {
|
|
46
|
-
> "drift": "vibgrate scan"
|
|
47
|
-
> }
|
|
48
|
-
> ```
|
|
49
|
-
>
|
|
50
|
-
> Then run `npm run drift`. Alternatively, install globally with `npm install -g @vibgrate/cli` to use `vibgrate` directly.
|
|
51
|
-
|
|
52
|
-
That's it. You'll see a full drift report in seconds.
|
|
77
|
+
> Local binaries are in `node_modules/.bin`, so use `npx` (or an npm script) unless you install globally.
|
|
53
78
|
|
|
54
79
|
---
|
|
55
80
|
|
|
56
|
-
## What
|
|
81
|
+
## What the report contains
|
|
57
82
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
Drift Score: 72/100
|
|
69
|
-
Risk Level: LOW
|
|
70
|
-
Projects: 3
|
|
71
|
-
VCS: git main a1b2c3d
|
|
72
|
-
|
|
73
|
-
Score Breakdown
|
|
74
|
-
Runtime: ████████████████████ 100
|
|
75
|
-
Frameworks: ████████████████░░░░ 78
|
|
76
|
-
Dependencies: ██████████████░░░░░░ 64
|
|
77
|
-
EOL Risk: ████████████████████ 100
|
|
78
|
-
|
|
79
|
-
── my-api (node) src/api
|
|
80
|
-
Runtime: 20.11.0 (current)
|
|
81
|
-
Frameworks:
|
|
82
|
-
NestJS: 10.3.0 → 11.0.0 (1 behind)
|
|
83
|
-
Dependencies:
|
|
84
|
-
42 current 8 1-behind 3 2+ behind
|
|
85
|
-
|
|
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)
|
|
119
|
-
⚠ Framework "NestJS" is 1 major version(s) behind
|
|
120
|
-
framework/outdated in src/api/package.json
|
|
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
|
-
./src/api
|
|
134
|
-
NestJS: 10.3.0 → 11.0.0 (1 behind)
|
|
135
|
-
Impact: +5–15 points (framework score)
|
|
136
|
-
|
|
137
|
-
2. Reduce dependency rot in my-api (42% severely outdated)
|
|
138
|
-
3 of 53 dependencies are 2+ majors behind. Run `npm outdated`
|
|
139
|
-
and prioritise packages with known CVEs.
|
|
140
|
-
./src/api
|
|
141
|
-
express: 3.4.0 → 5.0.0 (2 majors behind)
|
|
142
|
-
lodash: 3.10.1 → 4.17.21 (1 major behind)
|
|
143
|
-
... and 1 more
|
|
144
|
-
Impact: +5–10 points (dependency score)
|
|
145
|
-
|
|
146
|
-
Scanned at 2026-02-16T00:00:00.000Z · 1.2s · 48 files scanned
|
|
147
|
-
```
|
|
83
|
+
Every scan includes:
|
|
84
|
+
|
|
85
|
+
- **Overall score** and risk level
|
|
86
|
+
- **Score breakdown** (runtime, frameworks, dependencies, EOL)
|
|
87
|
+
- **Per-project details** across Node, .NET, Python, and Java
|
|
88
|
+
- **Actionable findings** (warnings/errors/notes)
|
|
89
|
+
- **Top Priority Actions** ranked by likely impact
|
|
90
|
+
|
|
91
|
+
We keep output plain and operational: easy to convert into backlog items and CI policy.
|
|
148
92
|
|
|
149
93
|
---
|
|
150
94
|
|
|
151
|
-
##
|
|
95
|
+
## New capabilities included in this release
|
|
152
96
|
|
|
153
|
-
###
|
|
97
|
+
### 1) Multi-language workspace scanning
|
|
154
98
|
|
|
155
|
-
|
|
99
|
+
Vibgrate recursively scans mixed repositories and supports:
|
|
156
100
|
|
|
157
|
-
|
|
101
|
+
- Node.js / TypeScript (`package.json`)
|
|
102
|
+
- .NET (`.sln`, `.csproj`)
|
|
103
|
+
- Python (`requirements.txt`, `pyproject.toml` style ecosystems)
|
|
104
|
+
- Java (`pom.xml`, Gradle-style manifest ecosystems)
|
|
158
105
|
|
|
159
|
-
|
|
106
|
+
### 2) Extended scanner suite
|
|
160
107
|
|
|
161
|
-
|
|
108
|
+
Beyond core drift scoring, Vibgrate can also detect:
|
|
162
109
|
|
|
163
|
-
|
|
110
|
+
- Platform matrix and native-module risk
|
|
111
|
+
- Dependency risk, graph duplication, and phantom dependencies
|
|
112
|
+
- Full tooling inventory and build/deploy surface
|
|
113
|
+
- TypeScript modernity and breaking-change exposure
|
|
114
|
+
- File hotspots and structural security posture
|
|
115
|
+
- Security scanner readiness and local policy coverage checks
|
|
116
|
+
- Service dependency mapping (cloud, db, auth, messaging, etc.)
|
|
117
|
+
- Architecture layer mapping
|
|
118
|
+
- Code-quality metrics (complexity, nesting, cycles, god files)
|
|
119
|
+
- OWASP category mapping from security findings
|
|
164
120
|
|
|
165
|
-
###
|
|
121
|
+
### 3) SBOM Export & Delta
|
|
166
122
|
|
|
167
|
-
|
|
123
|
+
Vibgrate now emits rich dependency inventory data in the JSON artifact, including lockfile-derived package graphs, duplicate-version hotspots, and phantom dependencies.
|
|
168
124
|
|
|
169
|
-
|
|
170
|
-
|---------|---------------|
|
|
171
|
-
| **Platform Matrix** | Native modules, OS assumptions, Docker base images, architecture risks |
|
|
172
|
-
| **Dependency Risk** | Deprecated packages, native module flags, platform-specific dependencies |
|
|
173
|
-
| **Dependency Graph** | Duplicated packages, phantom dependencies, lockfile analysis |
|
|
174
|
-
| **Tooling Inventory** | Full tech stack map — frameworks, bundlers, ORMs, testing tools |
|
|
175
|
-
| **Build & Deploy** | CI systems, Docker, IaC, release tooling, monorepo tools |
|
|
176
|
-
| **TypeScript Modernity** | Strict mode, module system, ESM readiness |
|
|
177
|
-
| **Breaking Change Exposure** | Packages known to cause upgrade pain, legacy polyfills |
|
|
178
|
-
| **File Hotspots** | Codebase shape — file counts, sizes, depth, shared packages |
|
|
179
|
-
| **Security Posture** | Lockfile hygiene, `.gitignore` coverage, audit severity counts |
|
|
180
|
-
| **Security Scanners** | Semgrep (SAST) + Gitleaks/TruffleHog readiness, version risk checks, heuristic secret signals |
|
|
181
|
-
| **Service Dependencies** | External SDK detection — payment, auth, cloud, databases, messaging |
|
|
182
|
-
| **Code Quality** | Cyclomatic complexity, function length, nesting depth, god files, dead-code estimate, circular imports |
|
|
183
|
-
| **OWASP Category Mapping** | Semgrep OSS findings mapped to OWASP Top 10 categories (fast or cache-input mode) |
|
|
125
|
+
This gives teams practical **SBOM-ready supply-chain visibility** for governance workflows while keeping the scan fast and CI-friendly.
|
|
184
126
|
|
|
185
|
-
|
|
127
|
+
Use scan artifacts as operational SBOM intelligence in either CycloneDX or SPDX format:
|
|
186
128
|
|
|
187
|
-
|
|
129
|
+
```bash
|
|
130
|
+
npx vibgrate sbom export --format cyclonedx --out sbom.cdx.json
|
|
131
|
+
npx vibgrate sbom export --format spdx --out sbom.spdx.json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Compare two scan artifacts to see dependency additions/removals/version changes between releases:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
npx vibgrate sbom delta --from .vibgrate/baseline.json --to .vibgrate/scan_result.json --out sbom-delta.txt
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
This keeps reports plain and actionable, so teams can go from scan output to backlog tasks quickly.
|
|
141
|
+
|
|
142
|
+
### 4) Baseline, Drift Budgets & Fitness Gates
|
|
143
|
+
|
|
144
|
+
Take a baseline snapshot, then enforce dependency drift fitness functions in CI:
|
|
188
145
|
|
|
189
146
|
```bash
|
|
190
147
|
npx vibgrate baseline .
|
|
191
|
-
npx vibgrate scan --baseline .vibgrate/baseline.json
|
|
148
|
+
npx vibgrate scan --baseline .vibgrate/baseline.json --drift-worsening 5 --drift-budget 40
|
|
192
149
|
```
|
|
193
150
|
|
|
194
|
-
|
|
151
|
+
- `--drift-budget <score>` fails the build if absolute drift score exceeds your budget.
|
|
152
|
+
- `--drift-worsening <percent>` fails the build if drift worsens by more than X% relative to baseline.
|
|
195
153
|
|
|
196
|
-
|
|
197
|
-
|--------|----------|
|
|
198
|
-
| `text` | Terminal output, local development |
|
|
199
|
-
| `json` | Programmatic consumption, artifact storage |
|
|
200
|
-
| `sarif` | GitHub Code Scanning, Azure DevOps integration |
|
|
201
|
-
| `md` | PR comments, documentation, wikis |
|
|
154
|
+
This turns drift scoring into a quality gate instead of passive reporting.
|
|
202
155
|
|
|
203
|
-
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
## Privacy & offline-first workflows
|
|
160
|
+
|
|
161
|
+
Vibgrate now supports explicit privacy controls:
|
|
204
162
|
|
|
205
|
-
|
|
163
|
+
- `--no-local-artifacts` prevents writing `.vibgrate/*.json` files to disk.
|
|
164
|
+
- `--max-privacy` enables a hardened profile (suppresses local artifact writes and disables high-context scanners such as UI-purpose evidence and architecture/code-quality enrichment).
|
|
165
|
+
- `--offline` disables live registry/network lookups and never uploads scan results.
|
|
166
|
+
- `--package-manifest <file>` accepts a local JSON or ZIP package-version manifest so drift can still be calculated offline. Download the latest bundle at `https://github.com/vibgrate/manifests/latest-packages.zip`.
|
|
206
167
|
|
|
207
|
-
|
|
168
|
+
Example:
|
|
208
169
|
|
|
209
170
|
```bash
|
|
210
|
-
|
|
171
|
+
vibgrate scan . --offline --package-manifest ./package-versions.zip --max-privacy --format json --out scan.json
|
|
211
172
|
```
|
|
212
173
|
|
|
213
|
-
|
|
174
|
+
When offline mode runs without a package manifest, package freshness is marked as unknown and drift scoring is necessarily partial.
|
|
175
|
+
|
|
176
|
+
## Core commands
|
|
214
177
|
|
|
215
178
|
```bash
|
|
216
|
-
|
|
179
|
+
vibgrate scan [path] [--format text|json|sarif] [--out <file>] [--fail-on warn|error] [--offline] [--package-manifest <file>] [--no-local-artifacts] [--max-privacy]
|
|
180
|
+
vibgrate baseline [path]
|
|
181
|
+
vibgrate report [--in <artifact.json>] [--format md|text|json]
|
|
182
|
+
vibgrate push [--dsn <dsn>] [--file <artifact.json>] [--strict]
|
|
183
|
+
vibgrate init [path] [--baseline] [--yes]
|
|
184
|
+
vibgrate dsn create --workspace <id> [--region us|eu] [--write <path>]
|
|
217
185
|
```
|
|
218
186
|
|
|
219
|
-
|
|
187
|
+
### Command examples with expected results
|
|
220
188
|
|
|
221
189
|
```bash
|
|
222
|
-
|
|
190
|
+
# 1) Scan current repo (text output)
|
|
191
|
+
npx @vibgrate/cli scan .
|
|
223
192
|
```
|
|
224
193
|
|
|
225
|
-
|
|
194
|
+
Expected result:
|
|
195
|
+
|
|
196
|
+
- Prints overall score + risk level
|
|
197
|
+
- Shows detected projects (Node/.NET/Python/Java)
|
|
198
|
+
- Writes `.vibgrate/scan_result.json` unless disabled
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# 2) Scan with CI gating
|
|
202
|
+
npx @vibgrate/cli scan . --fail-on error --drift-budget 40
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Expected result:
|
|
206
|
+
|
|
207
|
+
- Exit code `0` when no error-level finding and score is within budget
|
|
208
|
+
- Exit code `2` when the configured gate is exceeded
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# 3) Offline scan using local package-version bundle
|
|
212
|
+
npx @vibgrate/cli scan . --offline --package-manifest ./latest-packages.zip --format json --out scan.json
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Expected result:
|
|
216
|
+
|
|
217
|
+
- No registry/network lookup
|
|
218
|
+
- JSON artifact in `scan.json`
|
|
219
|
+
- Package freshness may be marked unknown if manifest lacks entries
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
# 4) Export SBOM and compare two runs
|
|
223
|
+
npx @vibgrate/cli sbom export --format cyclonedx --out sbom.cdx.json
|
|
224
|
+
npx @vibgrate/cli sbom delta --from .vibgrate/baseline.json --to .vibgrate/scan_result.json --out sbom-delta.txt
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Expected result:
|
|
228
|
+
|
|
229
|
+
- CycloneDX (or SPDX) JSON export file
|
|
230
|
+
- Human-readable delta report with added/removed/changed dependencies
|
|
231
|
+
|
|
232
|
+
Common usage:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# Standard scan
|
|
236
|
+
npx @vibgrate/cli scan .
|
|
237
|
+
|
|
238
|
+
# CI-ready SARIF output
|
|
239
|
+
npx @vibgrate/cli scan . --format sarif --out vibgrate.sarif --fail-on error
|
|
240
|
+
|
|
241
|
+
# Baseline and compare drift deltas over time
|
|
242
|
+
npx @vibgrate/cli baseline .
|
|
243
|
+
npx @vibgrate/cli scan . --baseline .vibgrate/baseline.json
|
|
244
|
+
```
|
|
226
245
|
|
|
227
246
|
---
|
|
228
247
|
|
|
229
|
-
## CI
|
|
248
|
+
## CI integration (recommended)
|
|
230
249
|
|
|
231
250
|
### GitHub Actions
|
|
232
251
|
|
|
233
252
|
```yaml
|
|
234
|
-
- name: Vibgrate
|
|
253
|
+
- name: Vibgrate scan
|
|
235
254
|
env:
|
|
236
255
|
VIBGRATE_DSN: ${{ secrets.VIBGRATE_DSN }}
|
|
237
|
-
run: npx @vibgrate/cli scan --push --format sarif --out vibgrate.sarif --fail-on error
|
|
256
|
+
run: npx @vibgrate/cli scan . --push --format sarif --out vibgrate.sarif --fail-on error
|
|
238
257
|
|
|
239
258
|
- name: Upload SARIF
|
|
240
259
|
if: always()
|
|
@@ -243,63 +262,55 @@ VIBGRATE_DSN="..." vibgrate push
|
|
|
243
262
|
sarif_file: vibgrate.sarif
|
|
244
263
|
```
|
|
245
264
|
|
|
246
|
-
> **Setup:** Add your DSN as a repository secret named `VIBGRATE_DSN` under **Settings → Secrets and variables → Actions**. Get your DSN from [vibgrate.com](https://vibgrate.com) — it's generated automatically when you create a workspace.
|
|
247
|
-
|
|
248
265
|
### Azure DevOps
|
|
249
266
|
|
|
250
267
|
```yaml
|
|
251
|
-
- script: npx @vibgrate/cli scan --format sarif --out vibgrate.sarif --fail-on error
|
|
252
|
-
displayName: Vibgrate
|
|
268
|
+
- script: npx @vibgrate/cli scan . --format sarif --out vibgrate.sarif --fail-on error
|
|
269
|
+
displayName: Vibgrate scan
|
|
253
270
|
```
|
|
254
271
|
|
|
255
|
-
|
|
272
|
+
### GitLab CI
|
|
273
|
+
|
|
274
|
+
```yaml
|
|
275
|
+
vibgrate:
|
|
276
|
+
image: node:20
|
|
277
|
+
script:
|
|
278
|
+
- npx @vibgrate/cli scan . --push --fail-on error
|
|
279
|
+
```
|
|
256
280
|
|
|
257
281
|
---
|
|
258
282
|
|
|
259
|
-
##
|
|
283
|
+
## Dashboard upload (optional)
|
|
260
284
|
|
|
261
|
-
|
|
285
|
+
The CLI is fully useful offline. Upload is opt-in.
|
|
286
|
+
|
|
287
|
+
If you want trend analysis across runs/repos, push scan artifacts with a DSN:
|
|
262
288
|
|
|
263
289
|
```bash
|
|
264
|
-
vibgrate
|
|
290
|
+
VIBGRATE_DSN="vibgrate+https://<key_id>:<secret>@us.ingest.vibgrate.com/<workspace_id>" \
|
|
291
|
+
npx @vibgrate/cli scan . --push
|
|
265
292
|
```
|
|
266
293
|
|
|
267
|
-
|
|
268
|
-
import type { VibgrateConfig } from '@vibgrate/cli';
|
|
269
|
-
|
|
270
|
-
const config: VibgrateConfig = {
|
|
271
|
-
exclude: ['legacy/**'],
|
|
272
|
-
thresholds: {
|
|
273
|
-
failOnError: {
|
|
274
|
-
eolDays: 180,
|
|
275
|
-
frameworkMajorLag: 3,
|
|
276
|
-
dependencyTwoPlusPercent: 50,
|
|
277
|
-
},
|
|
278
|
-
},
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
export default config;
|
|
282
|
-
```
|
|
294
|
+
You can also upload an existing artifact:
|
|
283
295
|
|
|
284
|
-
|
|
296
|
+
```bash
|
|
297
|
+
VIBGRATE_DSN="..." npx @vibgrate/cli push --file .vibgrate/scan_result.json
|
|
298
|
+
```
|
|
285
299
|
|
|
286
|
-
|
|
300
|
+
Get your DSN from [vibgrate.com](https://vibgrate.com). For CI, always store it as a secret (never commit it).
|
|
287
301
|
|
|
288
|
-
|
|
302
|
+
---
|
|
289
303
|
|
|
290
|
-
|
|
291
|
-
- **Source code is only read when explicitly needed** — core drift scanners use manifests/configs; OWASP mapping can inspect source files via Semgrep
|
|
292
|
-
- **No secrets are scanned** — ever
|
|
293
|
-
- **No git history, authors, or commit messages** — only HEAD SHA and branch name for traceability
|
|
294
|
-
- **No data leaves your machine** unless you explicitly run `vibgrate push` or `vibgrate scan --push`
|
|
295
|
-
- **No login required** — works fully offline
|
|
304
|
+
## Privacy and safety
|
|
296
305
|
|
|
297
|
-
|
|
306
|
+
- No data leaves your machine unless you run `--push` / `vibgrate push`
|
|
307
|
+
- Core drift analysis is based on manifests/configs
|
|
308
|
+
- Works without login and without SaaS dependencies
|
|
309
|
+
- `.vibgrate/` artifacts are local outputs and may be gitignored
|
|
298
310
|
|
|
299
|
-
|
|
311
|
+
Add this to `.gitignore`:
|
|
300
312
|
|
|
301
313
|
```gitignore
|
|
302
|
-
# Vibgrate scan results (do not commit)
|
|
303
314
|
.vibgrate/
|
|
304
315
|
```
|
|
305
316
|
|
|
@@ -315,6 +326,8 @@ The CLI writes per-project score files to `.vibgrate/` inside each detected proj
|
|
|
315
326
|
| `vibgrate scan --push` | Scan and auto-push to dashboard |
|
|
316
327
|
| `vibgrate baseline [path]` | Create a drift baseline |
|
|
317
328
|
| `vibgrate report` | Generate a report from a scan artifact |
|
|
329
|
+
| `vibgrate sbom export` | Export scan artifact as CycloneDX or SPDX SBOM |
|
|
330
|
+
| `vibgrate sbom delta` | Compare two artifacts and report SBOM drift delta |
|
|
318
331
|
| `vibgrate init [path]` | Initialise config and `.vibgrate/` directory |
|
|
319
332
|
| `vibgrate push` | Upload scan results to dashboard |
|
|
320
333
|
| `vibgrate dsn create` | Generate a DSN token |
|
|
@@ -324,22 +337,15 @@ The CLI writes per-project score files to `.vibgrate/` inside each detected proj
|
|
|
324
337
|
|
|
325
338
|
## Requirements
|
|
326
339
|
|
|
327
|
-
-
|
|
328
|
-
-
|
|
329
|
-
|
|
330
|
-
---
|
|
331
|
-
|
|
332
|
-
## Full Documentation
|
|
333
|
-
|
|
334
|
-
See [DOCS.md](https://github.com/crowers/vibgrate-cli/blob/main/packages/vibgrate-cli/DOCS.md) for the complete reference — all commands, all flags, configuration options, extended scanner details, CI examples, and more.
|
|
340
|
+
- Node.js **20+**
|
|
341
|
+
- macOS, Linux, Windows
|
|
335
342
|
|
|
336
343
|
---
|
|
337
344
|
|
|
338
|
-
##
|
|
345
|
+
## Full docs
|
|
339
346
|
|
|
340
|
-
|
|
341
|
-
- [Documentation](https://github.com/crowers/vibgrate-cli/blob/main/packages/vibgrate-cli/DOCS.md)
|
|
347
|
+
For full command reference, configuration, scanner details, and advanced examples, see [DOCS.md](./DOCS.md).
|
|
342
348
|
|
|
343
349
|
---
|
|
344
350
|
|
|
345
|
-
Copyright © 2026 Vibgrate. All rights reserved. See [LICENSE.md](./LICENSE) for terms.
|
|
351
|
+
Copyright © 2026 Vibgrate. All rights reserved. See [LICENSE.md](./LICENSE.md) for terms.
|
|
@@ -51,6 +51,26 @@ function formatMarkdown(artifact) {
|
|
|
51
51
|
}
|
|
52
52
|
lines.push("");
|
|
53
53
|
}
|
|
54
|
+
if (artifact.extended?.uiPurpose) {
|
|
55
|
+
const up = artifact.extended.uiPurpose;
|
|
56
|
+
lines.push("## Product Purpose Signals");
|
|
57
|
+
lines.push("");
|
|
58
|
+
lines.push(`- **Frameworks:** ${up.detectedFrameworks.length > 0 ? up.detectedFrameworks.join(", ") : "unknown"}`);
|
|
59
|
+
lines.push(`- **Evidence Items:** ${up.topEvidence.length}${up.capped ? ` (capped from ${up.evidenceCount})` : ""}`);
|
|
60
|
+
if (up.topEvidence.length > 0) {
|
|
61
|
+
lines.push("- **Top Evidence:**");
|
|
62
|
+
for (const item of up.topEvidence.slice(0, 10)) {
|
|
63
|
+
lines.push(` - [${item.kind}] ${item.value} (${item.file})`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (up.unknownSignals.length > 0) {
|
|
67
|
+
lines.push("- **Unknowns:**");
|
|
68
|
+
for (const u of up.unknownSignals.slice(0, 5)) {
|
|
69
|
+
lines.push(` - ${u}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
lines.push("");
|
|
73
|
+
}
|
|
54
74
|
if (artifact.findings.length > 0) {
|
|
55
75
|
lines.push("## Findings");
|
|
56
76
|
lines.push("");
|