@vibgrate/cli 2026.701.1 → 2026.701.3

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/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-JSRJCKDX.js';import {d,c,e,f,b as b$1,a as a$1,h}from'./chunk-JW5BRLSC.js';import {b,fb,Xa,ib,hb,gb,kb,eb}from'./chunk-2GHB73ES.js';import {a}from'./chunk-MKDRULJ6.js';import {p,b as b$3}from'./chunk-XTHPCEME.js';import {b as b$2}from'./chunk-EK7ODJWE.js';import {Command}from'commander';import l from'chalk';import*as S from'path';import {createRequire}from'module';import*as Ne from'crypto';import {randomUUID}from'crypto';import*as Ut from'os';import*as ee from'fs';import {rmSync,existsSync}from'fs';import {execSync,spawn,spawnSync}from'child_process';import*as ln from'zlib';import {promisify}from'util';import*as K from'fs/promises';import {mkdtemp,rm}from'fs/promises';import {fileURLToPath}from'url';var Ft=new Command("init").description("Initialize vibgrate in a project").argument("[path]","Path to initialize",".").option("--baseline","Create initial baseline after init").option("--yes","Skip confirmation prompts").action(async(t,e)=>{let n=S.resolve(t),o=S.join(n,".vibgrate");await d(o),console.log(l.green("\u2714")+` Created ${l.bold(".vibgrate/")} directory`);let r=S.join(n,"vibgrate.config.ts");if(await c(r)?console.log(l.dim(" vibgrate.config.ts already exists, skipping")):(await b(n),console.log(l.green("\u2714")+` Created ${l.bold("vibgrate.config.ts")}`)),e.baseline){let{runBaseline:a}=await import('./baseline-JOD5BTND.js');await a(n);}console.log(""),console.log(l.bold("Next steps:")),console.log(` ${l.cyan("vibgrate scan")} Scan for upgrade drift`),console.log(` ${l.cyan("vibgrate baseline")} Create a drift baseline`),console.log("");});var So=createRequire(import.meta.url),ko=So("../package.json"),E=ko.version;var et=[{id:"us",label:"United States",ingestHost:"us.ingest.vibgrate.com",dashHost:"dash.vibgrate.com",available:true},{id:"eu",label:"European Union",ingestHost:"eu.ingest.vibgrate.com",dashHost:"dash.vibgrate.eu",available:true},{id:"apac",label:"Asia-Pacific (coming soon)",ingestHost:"apac.ingest.vibgrate.com",dashHost:"dash.vibgrate.com",available:false}],xo="us";function ae(){return et.filter(t=>t.available).map(t=>t.id)}function Mt(t){return et.find(e=>e.id===t)}function ne(t,e){if(e)try{return new URL(e).host}catch{throw new Error(`Invalid ingest URL: ${e}`)}let n=(t??xo).toLowerCase(),o=Mt(n);if(!o)throw new Error(`Unknown region "${n}". Supported: ${ae().join(", ")}`);if(!o.available)throw new Error(`Region "${n}" (${o.label}) is not yet available. Supported: ${ae().join(", ")}`);return o.ingestHost}function ge(t){return et.find(n=>n.ingestHost===t)?.dashHost??"dash.vibgrate.com"}function Lt(t){return Mt(t.toLowerCase())?.ingestHost}async function Co(t,e,n,o,r){let a=`https://${o}/v1/provision`;try{let s=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Connection:"close"},body:JSON.stringify(r?{keyId:t,secret:e,workspaceId:n,region:r}:{keyId:t,secret:e,workspaceId:n})});return s.ok?{success:!0}:{success:!1,error:(await s.json()).error||`HTTP ${s.status}`}}catch(s){return {success:false,error:s instanceof Error?s.message:String(s)}}}var tt=new Command("dsn").description("Manage DSN tokens");tt.command("create").description("Create a new DSN token").option("--ingest <url>","Ingest API URL (overrides --region)").option("--region <region>",`Data residency region (${ae().join(", ")})`,"us").requiredOption("--workspace <id>",'Workspace ID (use "new" to auto-generate)').option("--write <path>","Write DSN to file").action(async t=>{let e$1=Ne.randomBytes(12).toString("hex"),n=Ne.randomBytes(32).toString("hex"),o;try{o=ne(t.region,t.ingest);}catch(c){console.error(l.red(c instanceof Error?c.message:String(c))),process.exit(1);}let r=t.workspace,a=t.workspace.toLowerCase()==="new";a&&(r=Ne.randomBytes(8).toString("hex"),console.log(l.dim(`Provisioning new workspace ${r}...`)));let s=t.ingest?void 0:t.region.toLowerCase();if(a){let c=await Co(e$1,n,r,o,s);c.success||(console.error(l.red(`Failed to provision DSN: ${c.error}`)),process.exit(1));}let i=`vibgrate+https://${e$1}:${n}@${o}/${r}`;if(console.log(l.green("\u2714")+" DSN created"),console.log(""),console.log(l.bold("Region:")),console.log(` ${s??"custom"} (${o})`),console.log(""),console.log(l.bold("DSN:")),console.log(` ${i}`),console.log(""),console.log(l.bold("Key ID:")),console.log(` ${e$1}`),a&&(console.log(""),console.log(l.bold("Workspace ID:")),console.log(` ${r}`)),console.log(""),console.log(l.dim("Set this as VIBGRATE_DSN in your CI environment.")),a||console.log(l.dim("The secret must be registered on your Vibgrate ingest API.")),t.write){let c=S.resolve(t.write);await e(c,i+`
2
+ import'./chunk-MDXZ22QE.js';import {d,c,e,f,b as b$1,a as a$1,h}from'./chunk-4CCVMPJI.js';import {b,fb,Xa,ib,hb,gb,kb,eb}from'./chunk-VJR7ZTM5.js';import {a}from'./chunk-MKDRULJ6.js';import {p,b as b$3}from'./chunk-XTHPCEME.js';import {b as b$2}from'./chunk-EK7ODJWE.js';import {Command}from'commander';import l from'chalk';import*as S from'path';import {createRequire}from'module';import*as Ne from'crypto';import {randomUUID}from'crypto';import*as Ut from'os';import*as ee from'fs';import {rmSync,existsSync}from'fs';import {execSync,spawn,spawnSync}from'child_process';import*as ln from'zlib';import {promisify}from'util';import*as K from'fs/promises';import {mkdtemp,rm}from'fs/promises';import {fileURLToPath}from'url';var Ft=new Command("init").description("Initialize vibgrate in a project").argument("[path]","Path to initialize",".").option("--baseline","Create initial baseline after init").option("--yes","Skip confirmation prompts").action(async(t,e)=>{let n=S.resolve(t),o=S.join(n,".vibgrate");await d(o),console.log(l.green("\u2714")+` Created ${l.bold(".vibgrate/")} directory`);let r=S.join(n,"vibgrate.config.ts");if(await c(r)?console.log(l.dim(" vibgrate.config.ts already exists, skipping")):(await b(n),console.log(l.green("\u2714")+` Created ${l.bold("vibgrate.config.ts")}`)),e.baseline){let{runBaseline:a}=await import('./baseline-XEV4GNTD.js');await a(n);}console.log(""),console.log(l.bold("Next steps:")),console.log(` ${l.cyan("vibgrate scan")} Scan for upgrade drift`),console.log(` ${l.cyan("vibgrate baseline")} Create a drift baseline`),console.log("");});var So=createRequire(import.meta.url),ko=So("../package.json"),E=ko.version;var et=[{id:"us",label:"United States",ingestHost:"us.ingest.vibgrate.com",dashHost:"dash.vibgrate.com",available:true},{id:"eu",label:"European Union",ingestHost:"eu.ingest.vibgrate.com",dashHost:"dash.vibgrate.eu",available:true},{id:"apac",label:"Asia-Pacific (coming soon)",ingestHost:"apac.ingest.vibgrate.com",dashHost:"dash.vibgrate.com",available:false}],xo="us";function ae(){return et.filter(t=>t.available).map(t=>t.id)}function Mt(t){return et.find(e=>e.id===t)}function ne(t,e){if(e)try{return new URL(e).host}catch{throw new Error(`Invalid ingest URL: ${e}`)}let n=(t??xo).toLowerCase(),o=Mt(n);if(!o)throw new Error(`Unknown region "${n}". Supported: ${ae().join(", ")}`);if(!o.available)throw new Error(`Region "${n}" (${o.label}) is not yet available. Supported: ${ae().join(", ")}`);return o.ingestHost}function ge(t){return et.find(n=>n.ingestHost===t)?.dashHost??"dash.vibgrate.com"}function Lt(t){return Mt(t.toLowerCase())?.ingestHost}async function Co(t,e,n,o,r){let a=`https://${o}/v1/provision`;try{let s=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Connection:"close"},body:JSON.stringify(r?{keyId:t,secret:e,workspaceId:n,region:r}:{keyId:t,secret:e,workspaceId:n})});return s.ok?{success:!0}:{success:!1,error:(await s.json()).error||`HTTP ${s.status}`}}catch(s){return {success:false,error:s instanceof Error?s.message:String(s)}}}var tt=new Command("dsn").description("Manage DSN tokens");tt.command("create").description("Create a new DSN token").option("--ingest <url>","Ingest API URL (overrides --region)").option("--region <region>",`Data residency region (${ae().join(", ")})`,"us").requiredOption("--workspace <id>",'Workspace ID (use "new" to auto-generate)').option("--write <path>","Write DSN to file").action(async t=>{let e$1=Ne.randomBytes(12).toString("hex"),n=Ne.randomBytes(32).toString("hex"),o;try{o=ne(t.region,t.ingest);}catch(c){console.error(l.red(c instanceof Error?c.message:String(c))),process.exit(1);}let r=t.workspace,a=t.workspace.toLowerCase()==="new";a&&(r=Ne.randomBytes(8).toString("hex"),console.log(l.dim(`Provisioning new workspace ${r}...`)));let s=t.ingest?void 0:t.region.toLowerCase();if(a){let c=await Co(e$1,n,r,o,s);c.success||(console.error(l.red(`Failed to provision DSN: ${c.error}`)),process.exit(1));}let i=`vibgrate+https://${e$1}:${n}@${o}/${r}`;if(console.log(l.green("\u2714")+" DSN created"),console.log(""),console.log(l.bold("Region:")),console.log(` ${s??"custom"} (${o})`),console.log(""),console.log(l.bold("DSN:")),console.log(` ${i}`),console.log(""),console.log(l.bold("Key ID:")),console.log(` ${e$1}`),a&&(console.log(""),console.log(l.bold("Workspace ID:")),console.log(` ${r}`)),console.log(""),console.log(l.dim("Set this as VIBGRATE_DSN in your CI environment.")),a||console.log(l.dim("The secret must be registered on your Vibgrate ingest API.")),t.write){let c=S.resolve(t.write);await e(c,i+`
3
3
  `),console.log(""),console.log(l.green("\u2714")+` DSN written to ${t.write}`),console.log(l.yellow("\u26A0")+" Add this file to .gitignore!");}});function Vt(){return S.join(Ut.homedir(),".vibgrate")}function de(){return S.join(Vt(),"credentials.json")}function Io(){try{let t=ee.readFileSync(de(),"utf8"),e=JSON.parse(t);return e&&typeof e.dsn=="string"&&e.dsn?e:null}catch{return null}}function Ht(t){let e=Vt();ee.mkdirSync(e,{recursive:true});let n=de();ee.writeFileSync(n,JSON.stringify(t,null,2)+`
4
4
  `,"utf8");try{ee.chmodSync(n,384);}catch{}}function Gt(){try{return ee.rmSync(de()),!0}catch{return false}}function fe(t){return t||(process.env.VIBGRATE_DSN?process.env.VIBGRATE_DSN:Io()?.dsn??void 0)}function Oe(t,e){console.log(`VIBGRATE_INGEST_ID=${t}`),e?.unchanged&&console.log("VIBGRATE_INGEST_UNCHANGED=1");}function Wt(t,e){let n=`${t.scheme}://${e}/v1/ingest/scan`;return fetch(n,{method:"POST",headers:{"Content-Type":"application/json","Content-Encoding":t.contentEncoding,"X-Vibgrate-Timestamp":t.timestamp,Authorization:`VibgrateDSN ${t.keyId}:${t.secret}`,Connection:"close"},body:t.body})}async function Ro(t){try{let e=await t.clone().json();return e?.code!=="REGION_MISMATCH"||!e.region?void 0:Lt(e.region)}catch{return}}async function Fe(t){let e=t.host,n=await Wt(t,e);if(n.status===409){let o=await Ro(n);o&&o!==e&&(console.log(l.yellow(`\u21BB Workspace is pinned to a different region \u2014 retrying upload to ${o}...`)),e=o,n=await Wt(t,e));}return {response:n,host:e}}var Eo=[{files:["CLAUDE.md",".claude"],name:"claude"},{files:[".cursor",".cursorrules"],name:"cursor"},{files:[".windsurf"],name:"windsurf"},{files:[".github/copilot-instructions.md",".copilot"],name:"copilot"},{files:[".gemini"],name:"gemini"},{files:[".continuerc.json"],name:"continue"},{files:[".codex"],name:"codex"}];async function Xt(t){for(let e of Eo)for(let n of e.files)if(await p(S.join(t,n)))return e.name;return null}function Kt(t){let e=l.hex("#3FB0A4"),n=l.hex("#4FE3C1"),o=t?`vg install ${t}`:"vg install --all",r=t?l.dim(` (${t} config detected)`):"";console.log(""),console.log(e(" \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\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557")),console.log(e(" \u2551")+" "+n("\u25C6")+" "+l.bold.white("Get AI-aware answers in your editor")+" "+e("\u2551")),console.log(e(" \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\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),console.log(""),console.log(" "+l.bold.white(o)+r),console.log(""),console.log(" "+e("\xB7")+" "+l.white("Code map in your assistant")+l.dim(" \u2014 call trees, impact surfaces, import paths")),console.log(" "+e("\xB7")+" "+l.white("Offline drift")+l.dim(" \u2014 DriftScore and upgrade priorities, right inside your editor")),console.log(" "+e("\xB7")+" "+l.white("Version-correct library docs")+l.dim(" \u2014 pinned to your lockfile, no hallucinated APIs")),console.log("");}async function Do(t,e,n){let o=fe(n.dsn);if(!o){console.error(l.red("No DSN provided for push.")),console.error(l.dim('Run "vibgrate login", set VIBGRATE_DSN, or use the --dsn flag.')),n.strict&&process.exit(1);return}let r=fb(o);if(!r){console.error(l.red("Invalid DSN format.")),n.strict&&process.exit(1);return}let{body:a,contentEncoding:s}=await eb(t),i=String(Date.now()),c=r.host;if(n.region)try{c=ne(n.region);}catch(u){console.error(l.red(u instanceof Error?u.message:String(u))),n.strict&&process.exit(1);return}let p=JSON.stringify(t).length,g=a.length,m=((1-g/p)*100).toFixed(0);console.log(l.dim(`Uploading to ${c}... (${(g/1024).toFixed(0)} KB, ${m}% smaller)`));try{let{response:u,host:f}=await Fe({scheme:r.scheme,host:c,keyId:r.keyId,secret:r.secret,body:a,contentEncoding:s,timestamp:i});if(c=f,!u.ok){let $=await u.text();throw new Error(`HTTP ${u.status}: ${$}`)}let v=await u.json();if(v.unchanged){if(console.log(l.green("\u2714")+` Repository unchanged since ${v.lastScannedAt??"last scan"} \u2014 skipped upload (no credit used).`),v.previousIngestId){Oe(v.previousIngestId,{unchanged:!0});let $=`https://${ge(c)}/${r.workspaceId}/scan/${v.previousIngestId}`;console.log(l.dim(` Previous report: ${$}`));}else n.strict&&(console.error(l.red("Repository unchanged but no previous ingest id returned.")),process.exit(1));return}if(console.log(l.green("\u2714")+` Scan queued for processing (${v.ingestId??"ok"})`),v.ingestId){Oe(v.ingestId);let $=`https://${ge(c)}/${r.workspaceId}/scan/${v.ingestId}`,k=process.platform==="win32"?"\x1B[0G\x1B[2K":"";console.log(""),console.log(k+l.dim(" Processing continues in the background. Results available shortly.")),console.log(""),console.log(k+l.cyan("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(k+l.bold(" \u{1F4CA} View Scan Report")),console.log(k+" "+l.underline.cyan($)),console.log(k+l.cyan("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log("");}}catch(u){let f=u instanceof Error?u.message:String(u);console.error(l.red(`Upload failed: ${f}`)),n.strict&&process.exit(1);}}function To(t,e){return [...e,...b$3(t)]}function zt(t,e){if(t===void 0)return;let n=Number(t);if(!Number.isFinite(n)||n<0)throw new Error(`${e} must be a non-negative number.`);return n}var qt=new Command("scan").description("Scan a project for upgrade drift").argument("[path]","Path to scan",".").option("--out <file>","Output file path").option("--format <format>","Output format (text|json|sarif|md)","text").option("--fail-on <level>","Fail on warn or error").option("--baseline <file>","Compare against baseline").option("--changed-only","Only scan changed files").option("-e, --exclude <glob>",'Exclude paths matching a glob pattern. Repeatable, and a single value may list several patterns separated by commas or semicolons (e.g. --exclude "legacy/**,vendor/**"). Merged with excludes from the config file.',To,[]).option("--concurrency <n>","Max concurrent npm calls","8").option("--push","Auto-push results to Vibgrate API after scan").option("--dsn <dsn>","DSN token for push (or use VIBGRATE_DSN env)").option("--region <region>","Override data residency region for push (us, eu)").option("--strict","Fail on push errors").option("--ui-purpose","Enable optional UI purpose evidence extraction (slower)").option("--no-local-artifacts","Do not write .vibgrate JSON artifacts to disk").option("--max-privacy","Enable strongest privacy mode (minimal scanners, no local artifacts)").option("--offline","Run without network calls; do not upload results").option("--package-manifest <file>","Use local package-version manifest JSON/ZIP (for offline mode)").option("--project-scan-timeout <seconds>","Per-project scan timeout in seconds (default: 180)").option("--drift-budget <score>","Fail if drift score is above budget (0-100)").option("--drift-worsening <percent>","Fail if drift worsens by more than % since baseline").option("--repository-name <name>","Override the repository name recorded for this scan (defaults to the directory or package.json name)").action(async(t,e)=>{let n=S.resolve(t);await p(n)||(console.error(l.red(`Path does not exist: ${n}`)),process.exit(1));let o=!!fe(e.dsn),r=!e.offline&&(e.push||o),a=!await p(S.join(n,".vibgrate","scan_result.json")),s;if(r&&o){let m=fe(e.dsn),u=fb(m);if(u){let f=e.region?ne(e.region):u.host,v=await Xa(n),$=await ib(n,v),k=e.repositoryName?.trim()||await hb(n);try{let w=await gb(u,f,{repositoryName:k,vcsSha:$.vcsSha});if(s=w.region,w.vm&&!w.vm.allowed&&(console.error(l.red(w.error??"VM meter usage exhausted")),console.error(l.dim(`VM minutes: ${w.vm.used}/${w.vm.limit} (${w.plan.label} plan) \u2014 enable overages or upgrade your plan.`)),process.exit(1)),w.repositories&&!w.repositories.allowed){console.error(l.red(w.error??`Repository limit reached for the ${w.plan.label} plan \u2014 cannot scan a new repository.`));let U=w.repositories.max<0?"unlimited":String(w.repositories.max);console.error(l.dim(`Repositories: ${w.repositories.total}/${U} (${w.plan.label} plan) \u2014 archive a repository or upgrade your plan.`)),w.upgradeUrl&&console.error(l.dim(` Upgrade: ${w.upgradeUrl}`)),process.exit(1);}if((w.status==="error"||!w.scans.allowed)&&(console.error(l.red(w.error??"Scan ingestion not allowed for this workspace.")),console.error(l.dim(`Credits: ${w.scans.used}/${w.scans.limit} (${w.plan.label} plan)`)),e.strict&&process.exit(1),process.exit(1)),console.log(l.dim(`Plan: ${w.plan.label} \u2014 scan credits ${w.scans.used}/${w.scans.limit} this month`)),w.repository?.unchanged){if(console.log(l.green("\u2714")+` Repository unchanged at ${w.repository.lastVcsSha?.slice(0,7)??"same revision"} \u2014 skipping scan.`),w.repository.lastIngestId){Oe(w.repository.lastIngestId,{unchanged:!0});let U=`https://${ge(f)}/${u.workspaceId}/scan/${w.repository.lastIngestId}`;console.log(l.dim(` Latest report: ${U}`));}else e.strict&&(console.error(l.red("Repository unchanged but no previous ingest id available.")),process.exit(1));return}}catch(w){let U=w instanceof Error?w.message:String(w);console.error(l.yellow(`Preflight check failed: ${U}`)),e.strict&&process.exit(1);}}}let i={vibgrateVersion:E,out:e.out,format:e.format||"text",failOn:e.failOn,baseline:e.baseline,changedOnly:e.changedOnly,exclude:e.exclude,concurrency:parseInt(e.concurrency,10)||8,push:e.push,dsn:e.dsn,region:e.region??s,strict:e.strict,uiPurpose:e.uiPurpose,noLocalArtifacts:e.noLocalArtifacts,maxPrivacy:e.maxPrivacy,offline:e.offline,packageManifest:e.packageManifest,driftBudget:zt(e.driftBudget,"--drift-budget"),driftWorseningPercent:zt(e.driftWorsening,"--drift-worsening"),projectScanTimeout:e.projectScanTimeout&&parseInt(e.projectScanTimeout,10)||void 0,repositoryName:e.repositoryName?.trim()||void 0},c=await f(),p$1=await kb(n,i,c);if(e.failOn){let m=p$1.findings.some(f=>f.level==="error"),u=p$1.findings.some(f=>f.level==="warning");e.failOn==="error"&&m&&(console.error(l.red(`
5
5
  Failing: ${p$1.findings.filter(f=>f.level==="error").length} error finding(s) detected.`)),process.exit(2)),e.failOn==="warn"&&(m||u)&&(console.error(l.red(`
@@ -1 +1 @@
1
- export{U as BANDED_RATES,V as BAND_EDGES,h as BENCHMARK_COHORT_MIN,m as COMPLIANCE_THRESHOLDS,b as DRIFT_COLORS,a as DRIFT_THRESHOLDS,W as FREE_BILLABLE_CAP,q as RISK_SCORE_METHODOLOGY_VERSION,Y as advancedScanHook,J as aggregateSolutionArchitecture,v as analyzeCompliance,u as analyzeComplianceOffline,o as buildComplianceReport,j as buildExecutiveReport,H as buildProjectArchitectureMermaid,n as complianceState,X as computePrice,r as computeRiskScore,f as deltaTone,c as driftBand,e as driftBandLabel,d as driftColor,k as escapeHtml,S as findProjectFavicon,w as formatComplianceMarkdown,g as formatDeltaChip,s as inferProjectPurpose,i as quarterLabel,t as recommendStandards,p as renderComplianceReportHtml,l as renderExecutiveReportHtml,Z as runScan,P as scanApiSurface,K as scanArchitecture,R as scanAssetBranding,D as scanBreakingChangeExposure,B as scanBuildDeploy,L as scanCodeQuality,O as scanDataStores,z as scanDependencyGraph,y as scanDependencyRisk,E as scanFileHotspots,Q as scanOperationalResilience,T as scanOssGovernance,x as scanPlatformMatrix,I as scanProjectArchitecture,N as scanRuntimeConfiguration,F as scanSecurityPosture,G as scanServiceDependencies,A as scanToolingInventory,C as scanTsModernity,M as scanUiPurpose}from'./chunk-JSRJCKDX.js';export{Ua as CargoCache,Va as ComposerCache,Ia as DEFAULT_CRA_SLA_DAYS,xa as DEFAULT_MAX_COMMITS,n as DRIFT_SCORE_AMBER_MAX,m as DRIFT_SCORE_GREEN_MAX,h as DRIFT_SCORE_METHODOLOGY_VERSION,Ta as GoCache,p as LABEL_BACKGROUND,Y as MICRO_BILLING_RATIO,T as MICRO_MAX_DEPENDENCIES,R as MICRO_MAX_FILES,S as MICRO_MAX_SIZE_BYTES,Qa as MavenCache,X as NANO_BILLING_RATIO,Q as NANO_MAX_DEPENDENCIES,O as NANO_MAX_FILES,P as NANO_MAX_SIZE_BYTES,x as NpmCache,Oa as NuGetCache,Wa as PubCache,Pa as PyPICache,Ra as RubyGemsCache,Z as SMALL_BILLING_RATIO,W as SMALL_MAX_DEPENDENCIES,U as SMALL_MAX_FILES,V as SMALL_MAX_SIZE_BYTES,_ as STANDARD_BILLING_RATIO,o as STATUS_COLOURS,Sa as SwiftCache,ma as VULN_RULE_ID,d as ageDaysBetween,f as aggregateLibyears,La as analyzeExposureWindows,oa as analyzeUsage,c as appendExcludePatterns,Na as attributeVulnerabilities,Fa as buildVersionTimelines,y as checkRegistryAccess,ba as classificationBillingWeight,$ as classifyProject,ia as collectVulnTargets,db as compactUiPurpose,Ma as computeCra,i as computeDriftScore,k as computeProjectId,ib as computeRepoFingerprint,l as computeSolutionId,jb as computeTreeMetadataHash,qa as computeUpgradeImpact,pa as computeVersionJump,da as cvssV3BaseScore,e as daysToLibyears,Xa as detectVcs,q as driftBadgeStatusFromScore,ra as extractBreakingSignals,cb as fetchLatestVersion,gb as fetchScanPreflight,Ca as fileAtCommit,Ba as fileCommits,Ka as findIntroduced,Ha as findPackageAnyEcosystem,Ga as findPackageTimeline,_a as findVersionCrossings,r as formatDriftBadgeScore,v as formatMarkdown,u as formatSarif,t as formatText,g as freshnessScoreFromLibyears,j as generateFindings,ab as generateProjectRelationshipMermaid,bb as generateSolutionRelationshipMermaid,na as generateVulnerabilityFindings,$a as generateWorkspaceRelationshipMermaid,wa as getChangelogSignals,za as gitHistoryAvailable,ua as inUpgradeRange,Ja as isAffectedByAdvisory,ja as isVersionAffected,a as loadConfig,w as loadPackageVersionManifest,aa as normalizeClassification,Ya as normalizeConstraint,ga as normalizeSeverityLabel,fb as parseDsn,sa as parseGitHubRepo,Ea as parseLockfile,Da as parseNpmLockfile,ka as parseOsvAdvisory,eb as prepareCompressedUpload,ha as projectTypeToVulnEcosystem,Aa as resolveHead,hb as resolveRepositoryName,ya as resolveToplevel,kb as runCoreScan,I as scanDartProjects,K as scanDockerProjects,A as scanDotnetProjects,J as scanElixirProjects,F as scanGoProjects,L as scanHelmProjects,C as scanJavaProjects,z as scanNodeProjects,H as scanPhpProjects,N as scanPolyglotProjects,B as scanPythonProjects,D as scanRubyProjects,G as scanRustProjects,E as scanSwiftProjects,M as scanTerraformProjects,la as scanVulnerabilities,ea as severityFromCvss,fa as severityRank,va as signalsFromReleases,s as statusColour,ca as summarizeBilling,ta as versionFromTag,Za as versionSatisfies,b as writeDefaultConfig}from'./chunk-2GHB73ES.js';import'./chunk-MKDRULJ6.js';export{d as FileCache,a as Semaphore,c as compileGlobs,q as ensureDir,i as findFiles,j as findPackageJsonFiles,b as parseExcludePatterns,p as pathExists,e as quickTreeCount,n as readJsonFile,o as readTextFile,r as writeJsonFile,s as writeTextFile}from'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';
1
+ export{U as BANDED_RATES,V as BAND_EDGES,h as BENCHMARK_COHORT_MIN,m as COMPLIANCE_THRESHOLDS,b as DRIFT_COLORS,a as DRIFT_THRESHOLDS,W as FREE_BILLABLE_CAP,q as RISK_SCORE_METHODOLOGY_VERSION,Y as advancedScanHook,J as aggregateSolutionArchitecture,v as analyzeCompliance,u as analyzeComplianceOffline,o as buildComplianceReport,j as buildExecutiveReport,H as buildProjectArchitectureMermaid,n as complianceState,X as computePrice,r as computeRiskScore,f as deltaTone,c as driftBand,e as driftBandLabel,d as driftColor,k as escapeHtml,S as findProjectFavicon,w as formatComplianceMarkdown,g as formatDeltaChip,s as inferProjectPurpose,i as quarterLabel,t as recommendStandards,p as renderComplianceReportHtml,l as renderExecutiveReportHtml,Z as runScan,P as scanApiSurface,K as scanArchitecture,R as scanAssetBranding,D as scanBreakingChangeExposure,B as scanBuildDeploy,L as scanCodeQuality,O as scanDataStores,z as scanDependencyGraph,y as scanDependencyRisk,E as scanFileHotspots,Q as scanOperationalResilience,T as scanOssGovernance,x as scanPlatformMatrix,I as scanProjectArchitecture,N as scanRuntimeConfiguration,F as scanSecurityPosture,G as scanServiceDependencies,A as scanToolingInventory,C as scanTsModernity,M as scanUiPurpose}from'./chunk-MDXZ22QE.js';export{Ua as CargoCache,Va as ComposerCache,Ia as DEFAULT_CRA_SLA_DAYS,xa as DEFAULT_MAX_COMMITS,n as DRIFT_SCORE_AMBER_MAX,m as DRIFT_SCORE_GREEN_MAX,h as DRIFT_SCORE_METHODOLOGY_VERSION,Ta as GoCache,p as LABEL_BACKGROUND,Y as MICRO_BILLING_RATIO,T as MICRO_MAX_DEPENDENCIES,R as MICRO_MAX_FILES,S as MICRO_MAX_SIZE_BYTES,Qa as MavenCache,X as NANO_BILLING_RATIO,Q as NANO_MAX_DEPENDENCIES,O as NANO_MAX_FILES,P as NANO_MAX_SIZE_BYTES,x as NpmCache,Oa as NuGetCache,Wa as PubCache,Pa as PyPICache,Ra as RubyGemsCache,Z as SMALL_BILLING_RATIO,W as SMALL_MAX_DEPENDENCIES,U as SMALL_MAX_FILES,V as SMALL_MAX_SIZE_BYTES,_ as STANDARD_BILLING_RATIO,o as STATUS_COLOURS,Sa as SwiftCache,ma as VULN_RULE_ID,d as ageDaysBetween,f as aggregateLibyears,La as analyzeExposureWindows,oa as analyzeUsage,c as appendExcludePatterns,Na as attributeVulnerabilities,Fa as buildVersionTimelines,y as checkRegistryAccess,ba as classificationBillingWeight,$ as classifyProject,ia as collectVulnTargets,db as compactUiPurpose,Ma as computeCra,i as computeDriftScore,k as computeProjectId,ib as computeRepoFingerprint,l as computeSolutionId,jb as computeTreeMetadataHash,qa as computeUpgradeImpact,pa as computeVersionJump,da as cvssV3BaseScore,e as daysToLibyears,Xa as detectVcs,q as driftBadgeStatusFromScore,ra as extractBreakingSignals,cb as fetchLatestVersion,gb as fetchScanPreflight,Ca as fileAtCommit,Ba as fileCommits,Ka as findIntroduced,Ha as findPackageAnyEcosystem,Ga as findPackageTimeline,_a as findVersionCrossings,r as formatDriftBadgeScore,v as formatMarkdown,u as formatSarif,t as formatText,g as freshnessScoreFromLibyears,j as generateFindings,ab as generateProjectRelationshipMermaid,bb as generateSolutionRelationshipMermaid,na as generateVulnerabilityFindings,$a as generateWorkspaceRelationshipMermaid,wa as getChangelogSignals,za as gitHistoryAvailable,ua as inUpgradeRange,Ja as isAffectedByAdvisory,ja as isVersionAffected,a as loadConfig,w as loadPackageVersionManifest,aa as normalizeClassification,Ya as normalizeConstraint,ga as normalizeSeverityLabel,fb as parseDsn,sa as parseGitHubRepo,Ea as parseLockfile,Da as parseNpmLockfile,ka as parseOsvAdvisory,eb as prepareCompressedUpload,ha as projectTypeToVulnEcosystem,Aa as resolveHead,hb as resolveRepositoryName,ya as resolveToplevel,kb as runCoreScan,I as scanDartProjects,K as scanDockerProjects,A as scanDotnetProjects,J as scanElixirProjects,F as scanGoProjects,L as scanHelmProjects,C as scanJavaProjects,z as scanNodeProjects,H as scanPhpProjects,N as scanPolyglotProjects,B as scanPythonProjects,D as scanRubyProjects,G as scanRustProjects,E as scanSwiftProjects,M as scanTerraformProjects,la as scanVulnerabilities,ea as severityFromCvss,fa as severityRank,va as signalsFromReleases,s as statusColour,ca as summarizeBilling,ta as versionFromTag,Za as versionSatisfies,b as writeDefaultConfig}from'./chunk-VJR7ZTM5.js';import'./chunk-MKDRULJ6.js';export{d as FileCache,a as Semaphore,c as compileGlobs,q as ensureDir,i as findFiles,j as findPackageJsonFiles,b as parseExcludePatterns,p as pathExists,e as quickTreeCount,n as readJsonFile,o as readTextFile,r as writeJsonFile,s as writeTextFile}from'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export{Z as runScan}from'./chunk-JSRJCKDX.js';export{i as computeDriftScore,v as formatMarkdown,u as formatSarif,t as formatText,j as generateFindings}from'./chunk-2GHB73ES.js';import'./chunk-MKDRULJ6.js';import'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';
1
+ export{Z as runScan}from'./chunk-MDXZ22QE.js';export{i as computeDriftScore,v as formatMarkdown,u as formatSarif,t as formatText,j as generateFindings}from'./chunk-VJR7ZTM5.js';import'./chunk-MKDRULJ6.js';import'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibgrate/cli",
3
- "version": "2026.701.1",
3
+ "version": "2026.701.3",
4
4
  "description": "CLI for measuring upgrade drift across Node, .NET, Python & Java projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- export{h as baselineCommand,g as runBaseline}from'./chunk-JW5BRLSC.js';import'./chunk-2GHB73ES.js';import'./chunk-MKDRULJ6.js';import'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';