@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/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 Node & .NET
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
- Modern codebases don't break all at once — they decay silently. Node runtimes fall behind LTS. .NET frameworks approach end-of-life. Core dependencies lag multiple major versions. Upgrade cost compounds until it becomes a project in itself.
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
- **Vibgrate turns that invisible decay into a measurable signal.** One CLI command gives you an Upgrade Drift Score (0–100), actionable findings, and a clear picture of where your upgrade debt lives.
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
- ## Quick Start
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
- Run instantly with npx no install required:
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 as a dev dependency:
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
- Then scan your project:
67
+ Add an npm script:
37
68
 
38
- ```bash
39
- npx vibgrate scan
69
+ ```json
70
+ {
71
+ "scripts": {
72
+ "drift": "vibgrate scan ."
73
+ }
74
+ }
40
75
  ```
41
76
 
42
- > **Why `npx`?** Installing with `-D` places the binary in `node_modules/.bin/`, which isn't on your system PATH. Use `npx` to run it, or add a script to your `package.json`:
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 You Get
81
+ ## What the report contains
57
82
 
58
- ```
59
- ╭───╮➜
60
- ╭┤◉ ◉├╮ V I B G R A T E
61
- ╰┤───├╯ Drift Intelligence Engine v1.x.x
62
- ╰───╯
63
-
64
- ╔══════════════════════════════════════════╗
65
- ║ Vibgrate Drift Report ║
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
- ## Key Features
95
+ ## New capabilities included in this release
152
96
 
153
- ### Upgrade Drift Score
97
+ ### 1) Multi-language workspace scanning
154
98
 
155
- A single 0–100 number that tells you how upgrade-ready your codebase is. Computed from runtime lag, framework versions, dependency age distribution, and EOL proximity. Deterministic and comparable across repos.
99
+ Vibgrate recursively scans mixed repositories and supports:
156
100
 
157
- ### Multi-Platform Scanning
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
- Works across **Node.js/TypeScript** and **.NET** projects in the same scan. Detects `package.json`, `.sln`, and `.csproj` files recursively.
106
+ ### 2) Extended scanner suite
160
107
 
161
- ### CI-Native
108
+ Beyond core drift scoring, Vibgrate can also detect:
162
109
 
163
- Designed to live in your build pipeline. Returns meaningful exit codes, produces SARIF output for GitHub Code Scanning and Azure DevOps, and requires zero configuration to get started.
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
- ### 13 Extended Scanners
121
+ ### 3) SBOM Export & Delta
166
122
 
167
- Beyond the core drift score, Vibgrate runs a suite of extended scanners all optional, all privacy-safe:
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
- | Scanner | What It Finds |
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
- ### Baseline & Delta Tracking
127
+ Use scan artifacts as operational SBOM intelligence in either CycloneDX or SPDX format:
186
128
 
187
- Take a baseline snapshot, then measure drift over time:
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
- ### Multiple Output Formats
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
- | Format | Use Case |
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
- ### Dashboard Upload (Optional)
156
+ ---
157
+
158
+
159
+ ## Privacy & offline-first workflows
160
+
161
+ Vibgrate now supports explicit privacy controls:
204
162
 
205
- Push scan results to the [Vibgrate Dashboard](https://vibgrate.com) for trend analysis, cross-repo comparison, and team-wide visibility. Upload is always opt-in the CLI provides full value offline.
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
- The easiest way is to combine scan and push in a single command:
168
+ Example:
208
169
 
209
170
  ```bash
210
- VIBGRATE_DSN="..." npx @vibgrate/cli scan --push
171
+ vibgrate scan . --offline --package-manifest ./package-versions.zip --max-privacy --format json --out scan.json
211
172
  ```
212
173
 
213
- Or pass the DSN directly:
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
- npx @vibgrate/cli scan --push --dsn "vibgrate+https://<key_id>:<secret>@us.ingest.vibgrate.com/<workspace_id>"
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
- You can also push a previously generated artifact separately:
187
+ ### Command examples with expected results
220
188
 
221
189
  ```bash
222
- VIBGRATE_DSN="..." vibgrate push
190
+ # 1) Scan current repo (text output)
191
+ npx @vibgrate/cli scan .
223
192
  ```
224
193
 
225
- > **Get your DSN:** Sign up at [vibgrate.com](https://vibgrate.com) and your workspace will be created automatically with a ready-to-paste code snippet containing your DSN.
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 Integration
248
+ ## CI integration (recommended)
230
249
 
231
250
  ### GitHub Actions
232
251
 
233
252
  ```yaml
234
- - name: Vibgrate Scan
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 Scan
268
+ - script: npx @vibgrate/cli scan . --format sarif --out vibgrate.sarif --fail-on error
269
+ displayName: Vibgrate scan
253
270
  ```
254
271
 
255
- Works in any CI environment. No login required. No configuration needed.
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
- ## Configuration
283
+ ## Dashboard upload (optional)
260
284
 
261
- Optionally create a `vibgrate.config.ts` to customise thresholds and scanner toggles:
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 init
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
- ```typescript
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
- ## Privacy First
300
+ Get your DSN from [vibgrate.com](https://vibgrate.com). For CI, always store it as a secret (never commit it).
287
301
 
288
- Vibgrate is designed to be safe to run on any codebase:
302
+ ---
289
303
 
290
- - **No source code content is exfiltrated** — code-quality metrics are computed locally and only aggregated numbers are emitted
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
- ### `.gitignore`
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
- The `.vibgrate/` directory contains ephemeral scan results and should not be committed to version control. Add it to your `.gitignore`:
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
- - **Node.js** >= 20.0.0
328
- - Works on macOS, Linux, and Windows
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
- ## Links
345
+ ## Full docs
339
346
 
340
- - [Website](https://vibgrate.com)
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.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  baselineCommand,
3
3
  runBaseline
4
- } from "./chunk-LO66M6OC.js";
5
- import "./chunk-YFJC5JSQ.js";
4
+ } from "./chunk-NASGRGXK.js";
5
+ import "./chunk-UVFIFNYG.js";
6
6
  import "./chunk-RNVZIZNL.js";
7
7
  export {
8
8
  baselineCommand,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runScan
3
- } from "./chunk-YFJC5JSQ.js";
3
+ } from "./chunk-UVFIFNYG.js";
4
4
  import {
5
5
  writeJsonFile
6
6
  } from "./chunk-RNVZIZNL.js";
@@ -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("");