@vibgrate/cli 2026.630.3 → 2026.701.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.
@@ -1,4 +1,4 @@
1
- import {Sa as Sa$1,Za as Za$1}from'./chunk-NHYABBIJ.js';import {a}from'./chunk-MKDRULJ6.js';import {j as j$1,n,i,o,p,d}from'./chunk-XTHPCEME.js';import {b}from'./chunk-EK7ODJWE.js';import*as I from'path';import*as V from'fs/promises';import*as w from'typescript';var Y={healthyMax:33,elevatedMax:66},D={healthy:"#3FB0A4",elevated:"#D9A441",critical:"#D0463B"},na={healthy:"Healthy",elevated:"Elevated",critical:"Critical"};function X(e){return e==null||Number.isNaN(e)?null:e<=Y.healthyMax?"healthy":e<=Y.elevatedMax?"elevated":"critical"}function H(e){let a=X(e);return a?D[a]:"#6B7785"}function le(e){let a=X(e);return a?na[a]:"Not scored"}function de(e){return e==null||Number.isNaN(e)||e===0?"flat":e<0?"good":"bad"}function ce(e){if(e==null||Number.isNaN(e))return "\u2014";if(e===0)return "\xB1 0";let a=Math.abs(e);return e>0?`\u25B2 +${a}`:`\u25BC \u2212${a}`}var Ce=8;function ue(e){return `Q${Math.floor(e.getUTCMonth()/3)+1} ${e.getUTCFullYear()}`}function sa(e){return e<=30?30:e<=60?60:e<=90?90:180}function oa(e){return e>0?"breached":e>=-5?"at-risk":"on-track"}function ra(e){let a=e.kpis;if(!a||a.estateDriftScore==null)return "No scan data yet \u2014 run a scan to establish a baseline.";let s=e.budgets.filter(r=>r.current-r.budget>0).length,n=[],t=de(a.driftDelta);return t==="good"&&a.driftDelta!=null?n.push(`Portfolio drift improved ${Math.abs(a.driftDelta)} pts`):t==="bad"&&a.driftDelta!=null?n.push(`Portfolio drift rose ${a.driftDelta} pts`):n.push(`Portfolio drift held at ${a.estateDriftScore}`),s>0?n.push(`${s} ${s===1?"scope is":"scopes are"} over budget`):n.push("all scopes within budget"),`${n.join("; ")}.`}function ia(e){if(e.length<2)return null;let a=e[e.length-1],s=e[e.length-2],n=a.score-s.score;if(n<=0)return "At current pace, portfolio drift is flat or improving \u2014 no band crossing forecast.";let t=Y.healthyMax+1;if(a.score>=t)return "Portfolio is already in the amber band \u2014 prioritise remediation to return to healthy.";let r=Math.ceil((t-a.score)/n);return `At current pace, portfolio crosses into amber in ~${r} period${r===1?"":"s"}.`}function la(e){let a=e.generatedAt??new Date,s=e.period??ue(a),n=e.kpis,t=ca(e.trend),r=e.topRisks.slice(0,5).map((i,d)=>({rank:d+1,label:i.label,scope:i.scope,score:i.score,delta:i.delta??null,driver:i.driver,owner:i.owner})),o=e.budgets.map(i=>{let d=i.current-i.budget;return {...i,variance:d,state:oa(d)}}).sort((i,d)=>d.variance-i.variance),c=e.horizon.filter(i=>i.daysRemaining>=0).map(i=>({...i,lane:sa(i.daysRemaining)})).sort((i,d)=>i.daysRemaining-d.daysRemaining),u=o.filter(i=>i.state==="breached").length,p=e.benchmark?{...e.benchmark,anonymitySatisfied:e.benchmark.cohortSize>=Ce}:null;return {instanceId:`${s}-${(e.asOf??a.toISOString()).slice(0,10)}`,org:e.org,period:s,preparedFor:e.preparedFor,asOf:e.asOf??a.toISOString(),generatedAt:a.toISOString(),confidentiality:"Confidential",headline:{score:n?.estateDriftScore??null,priorScore:n?.priorScore??null,delta:n?.driftDelta??null,breachCount:u,verdict:ra(e)},commentary:e.commentary,trajectory:t,forecastNote:ia(t),risks:r,budgets:o,horizon:c,benchmark:p,roi:e.roi}}function ca(e){if(e.length===0)return [];let a=[...e].sort((t,r)=>t.day.localeCompare(r.day)),s=[],n=null;for(let t of a){let r=Math.round(t.avg_score),o=n==null?0:r-n;s.push({period:t.day,score:r,added:o>0?o:0,remediated:o<0?-o:0}),n=r;}return s}var N={navy:"#182346",teal:"#3FB0A4",ink:"#0E2330",paper:"#F4F6F5"};function x(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function we(e,a){if(!e)return "\u2014";try{return new Date(e).toLocaleDateString(a,{year:"numeric",month:"short",day:"numeric"})}catch{return x(e)}}function Re(e,a){if(!e)return "\u2014";try{return new Date(e).toLocaleString(a,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",timeZoneName:"short"})}catch{return x(e)}}function pa(e){if(e.length<2)return '<div class="chart-empty">Baseline established \u2014 trend available next cycle.</div>';let t=e.map(b=>b.score),r=Math.min(...t,0),c=Math.max(...t,100)-r||1,u=592/(e.length-1),p=b=>24+b*u,i=b=>156-(b-r)/c*132,d=e.map((b,C)=>`${C===0?"M":"L"}${p(C).toFixed(1)},${i(b.score).toFixed(1)}`).join(" "),g=e[e.length-1],m=e[e.length-2],y=g.score-m.score,l={x:p(e.length-1)+u,v:g.score+y},f={x:l.x+u,v:g.score+y*2},h=`M${p(e.length-1).toFixed(1)},${i(g.score).toFixed(1)} L${l.x.toFixed(1)},${i(l.v).toFixed(1)} L${f.x.toFixed(1)},${i(f.v).toFixed(1)}`,k=i(34),v=e.map((b,C)=>`<circle cx="${p(C).toFixed(1)}" cy="${i(b.score).toFixed(1)}" r="2.5" fill="${H(b.score)}" />`).join("");return `<svg viewBox="0 0 ${640+u*2} 180" width="100%" role="img" aria-label="DriftScore trend with forecast">
1
+ import {db,kb}from'./chunk-2GHB73ES.js';import {a}from'./chunk-MKDRULJ6.js';import {j as j$1,n,i,o,p,d}from'./chunk-XTHPCEME.js';import {b}from'./chunk-EK7ODJWE.js';import*as I from'path';import*as V from'fs/promises';import*as w from'typescript';var Y={healthyMax:33,elevatedMax:66},D={healthy:"#3FB0A4",elevated:"#D9A441",critical:"#D0463B"},na={healthy:"Healthy",elevated:"Elevated",critical:"Critical"};function X(e){return e==null||Number.isNaN(e)?null:e<=Y.healthyMax?"healthy":e<=Y.elevatedMax?"elevated":"critical"}function H(e){let a=X(e);return a?D[a]:"#6B7785"}function le(e){let a=X(e);return a?na[a]:"Not scored"}function de(e){return e==null||Number.isNaN(e)||e===0?"flat":e<0?"good":"bad"}function ce(e){if(e==null||Number.isNaN(e))return "\u2014";if(e===0)return "\xB1 0";let a=Math.abs(e);return e>0?`\u25B2 +${a}`:`\u25BC \u2212${a}`}var Ce=8;function ue(e){return `Q${Math.floor(e.getUTCMonth()/3)+1} ${e.getUTCFullYear()}`}function sa(e){return e<=30?30:e<=60?60:e<=90?90:180}function oa(e){return e>0?"breached":e>=-5?"at-risk":"on-track"}function ra(e){let a=e.kpis;if(!a||a.estateDriftScore==null)return "No scan data yet \u2014 run a scan to establish a baseline.";let s=e.budgets.filter(r=>r.current-r.budget>0).length,n=[],t=de(a.driftDelta);return t==="good"&&a.driftDelta!=null?n.push(`Portfolio drift improved ${Math.abs(a.driftDelta)} pts`):t==="bad"&&a.driftDelta!=null?n.push(`Portfolio drift rose ${a.driftDelta} pts`):n.push(`Portfolio drift held at ${a.estateDriftScore}`),s>0?n.push(`${s} ${s===1?"scope is":"scopes are"} over budget`):n.push("all scopes within budget"),`${n.join("; ")}.`}function ia(e){if(e.length<2)return null;let a=e[e.length-1],s=e[e.length-2],n=a.score-s.score;if(n<=0)return "At current pace, portfolio drift is flat or improving \u2014 no band crossing forecast.";let t=Y.healthyMax+1;if(a.score>=t)return "Portfolio is already in the amber band \u2014 prioritise remediation to return to healthy.";let r=Math.ceil((t-a.score)/n);return `At current pace, portfolio crosses into amber in ~${r} period${r===1?"":"s"}.`}function la(e){let a=e.generatedAt??new Date,s=e.period??ue(a),n=e.kpis,t=ca(e.trend),r=e.topRisks.slice(0,5).map((i,d)=>({rank:d+1,label:i.label,scope:i.scope,score:i.score,delta:i.delta??null,driver:i.driver,owner:i.owner})),o=e.budgets.map(i=>{let d=i.current-i.budget;return {...i,variance:d,state:oa(d)}}).sort((i,d)=>d.variance-i.variance),c=e.horizon.filter(i=>i.daysRemaining>=0).map(i=>({...i,lane:sa(i.daysRemaining)})).sort((i,d)=>i.daysRemaining-d.daysRemaining),u=o.filter(i=>i.state==="breached").length,p=e.benchmark?{...e.benchmark,anonymitySatisfied:e.benchmark.cohortSize>=Ce}:null;return {instanceId:`${s}-${(e.asOf??a.toISOString()).slice(0,10)}`,org:e.org,period:s,preparedFor:e.preparedFor,asOf:e.asOf??a.toISOString(),generatedAt:a.toISOString(),confidentiality:"Confidential",headline:{score:n?.estateDriftScore??null,priorScore:n?.priorScore??null,delta:n?.driftDelta??null,breachCount:u,verdict:ra(e)},commentary:e.commentary,trajectory:t,forecastNote:ia(t),risks:r,budgets:o,horizon:c,benchmark:p,roi:e.roi}}function ca(e){if(e.length===0)return [];let a=[...e].sort((t,r)=>t.day.localeCompare(r.day)),s=[],n=null;for(let t of a){let r=Math.round(t.avg_score),o=n==null?0:r-n;s.push({period:t.day,score:r,added:o>0?o:0,remediated:o<0?-o:0}),n=r;}return s}var N={navy:"#182346",teal:"#3FB0A4",ink:"#0E2330",paper:"#F4F6F5"};function x(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function we(e,a){if(!e)return "\u2014";try{return new Date(e).toLocaleDateString(a,{year:"numeric",month:"short",day:"numeric"})}catch{return x(e)}}function Re(e,a){if(!e)return "\u2014";try{return new Date(e).toLocaleString(a,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",timeZoneName:"short"})}catch{return x(e)}}function pa(e){if(e.length<2)return '<div class="chart-empty">Baseline established \u2014 trend available next cycle.</div>';let t=e.map(b=>b.score),r=Math.min(...t,0),c=Math.max(...t,100)-r||1,u=592/(e.length-1),p=b=>24+b*u,i=b=>156-(b-r)/c*132,d=e.map((b,C)=>`${C===0?"M":"L"}${p(C).toFixed(1)},${i(b.score).toFixed(1)}`).join(" "),g=e[e.length-1],m=e[e.length-2],y=g.score-m.score,l={x:p(e.length-1)+u,v:g.score+y},f={x:l.x+u,v:g.score+y*2},h=`M${p(e.length-1).toFixed(1)},${i(g.score).toFixed(1)} L${l.x.toFixed(1)},${i(l.v).toFixed(1)} L${f.x.toFixed(1)},${i(f.v).toFixed(1)}`,k=i(34),v=e.map((b,C)=>`<circle cx="${p(C).toFixed(1)}" cy="${i(b.score).toFixed(1)}" r="2.5" fill="${H(b.score)}" />`).join("");return `<svg viewBox="0 0 ${640+u*2} 180" width="100%" role="img" aria-label="DriftScore trend with forecast">
2
2
  <line x1="24" y1="${k.toFixed(1)}" x2="${640+u*2-24}" y2="${k.toFixed(1)}" stroke="${D.elevated}" stroke-width="1" stroke-dasharray="2 3" opacity="0.6" />
3
3
  <path d="${d}" fill="none" stroke="${N.teal}" stroke-width="2.5" />
4
4
  <path d="${h}" fill="none" stroke="${N.teal}" stroke-width="2" stroke-dasharray="4 4" opacity="0.7" />
@@ -320,4 +320,4 @@ ${je(e,2,o,s)}
320
320
  `)){let R=C.trim();if(/^FROM\s+/i.test(R)){let P=R.split(/\s+/),E=1;P[1]?.startsWith("--")&&(E=P[1].includes("=")?2:3),P[E]&&p$1.add(P[E]);}}}catch{}s.docker.baseImages=[...p$1].sort();let i$1=new Set;for(let[v,b]of Object.entries(pt))(await t(e,R=>R.endsWith(v))).length>0&&i$1.add(b);(await t(e,v=>v.endsWith(".cfn.json")||v.endsWith(".cfn.yaml"))).length>0&&i$1.add("cloudformation"),await n$1(I.join(e,"Pulumi.yaml"))&&i$1.add("pulumi"),s.iac=[...i$1].sort();let g=new Set;for(let[v,b]of Object.entries(lt))await n$1(I.join(e,v))&&g.add(b);let m=a?await a.findPackageJsonFiles(e):await j$1(e);for(let v of m)try{let b=a?await a.readJsonFile(v):await n(v);for(let C of ["dependencies","devDependencies"]){let R=b[C];if(R)for(let P of Object.keys(R))it.has(P)&&g.add(P);}}catch{}s.releaseTooling=[...g].sort();let y={"pnpm-lock.yaml":"pnpm","package-lock.json":"npm","yarn.lock":"yarn","bun.lockb":"bun"},l=new Set;for(let[v,b]of Object.entries(y))await n$1(I.join(e,v))&&l.add(b);let f=null,h=I.join(e,"package.json");if(await n$1(h))try{f=a?await a.readJsonFile(h):await n(h);}catch{}if(f?.packageManager){let v=f.packageManager.split("@")[0]?.toLowerCase();v&&["pnpm","yarn","npm","bun"].includes(v)&&l.add(v);}s.packageManagers=[...l].sort();let k=new Set;for(let[v,b]of Object.entries(ct))await n$1(I.join(e,v))&&k.add(b);return f?.workspaces&&k.add(l.has("yarn")?"yarn-workspaces":"npm-workspaces"),s.monorepoTools=[...k].sort(),s}async function ut(e,a){let s={typescriptVersion:null,strict:null,noImplicitAny:null,strictNullChecks:null,module:null,moduleResolution:null,target:null,moduleType:null,exportsField:false},n$1=a?await a.findPackageJsonFiles(e):await j$1(e),t=false,r=false;for(let u of n$1)try{let p=a?await a.readJsonFile(u):await n(u);if(!s.typescriptVersion){let d=p.devDependencies?.typescript??p.dependencies?.typescript;d&&(s.typescriptVersion=d.replace(/^[\^~>=<\s]+/,""));}let i=p.type;i==="module"?t=!0:i==="commonjs"?r=!0:i||(r=!0),p.exports&&(s.exportsField=!0);}catch{}t&&r?s.moduleType="mixed":t?s.moduleType="esm":r&&(s.moduleType="cjs");let o$1=I.join(e,"tsconfig.json");if(!(a?await a.pathExists(o$1):await p(o$1))){let u=a?await a.findFiles(e,p=>p==="tsconfig.json"):await i(e,p=>p==="tsconfig.json");if(u.length>0)o$1=u[0];else return s}try{let p=(a?await a.readTextFile(o$1):await o(o$1)).replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/,(\s*[}\]])/g,"$1"),d=JSON.parse(p)?.compilerOptions;d&&(typeof d.strict=="boolean"&&(s.strict=d.strict),typeof d.noImplicitAny=="boolean"&&(s.noImplicitAny=d.noImplicitAny),typeof d.strictNullChecks=="boolean"&&(s.strictNullChecks=d.strictNullChecks),typeof d.module=="string"&&(s.module=d.module),typeof d.moduleResolution=="string"&&(s.moduleResolution=d.moduleResolution),typeof d.target=="string"&&(s.target=d.target));}catch{}return s}var ft=new Set(["request","request-promise","request-promise-native","moment","node-sass","tslint","aws-sdk","babel-core","babel-preset-env","babel-preset-react","babel-loader","core-js","istanbul","istanbul-instrumenter-loader","left-pad","popper.js","create-react-class","react-addons-css-transition-group","react-addons-test-utils","@types/express-serve-static-core","enzyme","enzyme-adapter-react-16","enzyme-adapter-react-17","react-hot-loader","react-loadable","react-router-dom-v5-compat","redux-thunk","redux-saga","recompose","classnames","glamor","radium","material-ui","@material-ui/core","bower","grunt","gulp","browserify","coffee-script","coffeescript","jade","nomnom","optimist","minimist","colors","faker","event-stream","ua-parser-js","caniuse-db","circular-json","mkdirp","rimraf","glob","swig","dustjs-linkedin","hogan.js","passport-local-mongoose","@angular/http","rxjs-compat","protractor","karma","karma-jasmine","jasmine"]),mt=new Set(["node-fetch","cross-fetch","isomorphic-fetch","whatwg-fetch","abort-controller","form-data","formdata-polyfill","web-streams-polyfill","whatwg-url","url-parse","domexception","abortcontroller-polyfill","querystring","string_decoder","buffer","events","path-browserify","stream-browserify","stream-http","https-browserify","os-browserify","crypto-browserify","assert","util","process","timers-browserify","tty-browserify","vm-browserify","domain-browser","punycode","readable-stream","es6-promise","promise-polyfill","es6-symbol","es6-map","es6-set","es6-weak-map","es6-iterator","object-assign","object.assign","array.prototype.find","array.prototype.findindex","array.prototype.flat","array.prototype.flatmap","array-includes","string.prototype.startswith","string.prototype.endswith","string.prototype.includes","string.prototype.padstart","string.prototype.padend","string.prototype.matchall","string.prototype.replaceall","string.prototype.trimstart","string.prototype.trimend","string.prototype.at","object.entries","object.values","object.fromentries","globalthis","symbol-observable","setimmediate","regenerator-runtime","@babel/polyfill","whatwg-encoding","text-encoding","encoding","unorm","number.isnan","is-nan","has-symbols","has","hasown","safe-buffer","safer-buffer"]),gt=["BREAKING","Breaking Change","Removed","Deprecated","Migration","Rename","Drop support"],We={vue:{impactedFeatures:["Options API-heavy components","Deprecated hooks","Template filters","$listeners / $attrs merge behavior","Mixin-heavy architecture"],usagePatterns:[/\bexport\s+default\s*\{/,/\bmixins\s*:/,/\bfilters\s*:/,/\$listeners\b/,/beforeDestroy\b/,/destroyed\b/],automation:"manual"},"react-router-dom":{impactedFeatures:["Switch/Route v5 patterns","history prop mutation flows","withRouter HOC usage"],usagePatterns:[/\bSwitch\b/,/\bwithRouter\b/,/\bhistory\./,/<Route\s+component=/],automation:"deterministic-recipe"},eslint:{impactedFeatures:["Flat config migration",".eslintrc plugin resolution","legacy parser/plugin options"],usagePatterns:[/\.eslintrc/,/eslintConfig/,/module\.exports\s*=\s*\[/,/extends\s*:/],automation:"deterministic-recipe"},typescript:{impactedFeatures:["Stricter type checks","tsconfig option removals","moduleResolution defaults changes"],usagePatterns:[/tsconfig\.json/,/strictNullChecks/,/noImplicitAny/,/moduleResolution/],automation:"manual"},"@angular/core":{impactedFeatures:["NgModule bootstrap assumptions","Standalone component migration","Deprecated lifecycle signatures"],usagePatterns:[/@NgModule\b/,/ngOnInit\(/,/providers\s*:/],automation:"codemod-available",codemod:"ng update"}};function fe(e,a,s){return e===0?"do-nothing":s>0&&a===0?"codemod-available":a>0?"manual-hotspots":e<=2?"upgrade-safely-now":"plan-major-upgrade"}function Ue(e){return e?_.coerce(e)?.major??null:null}function yt(e){return e.resolvedVersion&&_.valid(_.coerce(e.resolvedVersion))?_.coerce(e.resolvedVersion)?.version??null:_.minVersion(e.currentSpec)?.version??null}function ht(e,a){if(a<=e+1)return [];let s=[];for(let n=e+1;n<a;n++)s.push(`${n}.x`);return s}async function vt(e,a,s,n){let t=new Map;for(let p of n)t.set(p,{importSites:0,filesTouched:0,patternHits:0});let r=await s.walkDir(a),o=e.path.replace(/\\/g,"/").replace(/^\.\//,""),u=r.filter(p=>p.isFile&&p.relPath.replace(/\\/g,"/").startsWith(o)).filter(p=>/\.(ts|tsx|js|jsx|vue|mjs|cjs|json)$/.test(p.name));for(let p of u){let i="";try{i=await s.readTextFile(I.join(a,p.relPath));}catch{continue}for(let d of n){let g=t.get(d);if(!g)continue;let m=d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),y=new RegExp(`(?:from\\s+['"]${m}['"]|require\\(\\s*['"]${m}['"]\\s*\\)|import\\(\\s*['"]${m}['"]\\s*\\))`,"g"),l=i.match(y)??[];l.length>0&&(g.importSites+=l.length,g.filesTouched+=1);let f=We[d];if(f)for(let h of f.usagePatterns){let k=i.match(new RegExp(h.source,"g"));k&&(g.patternHits+=k.length);}}}return t}async function kt(e,a,s){let n=new Set,t=new Set,r=false;for(let m of e)for(let y of m.dependencies)ft.has(y.package)&&n.add(y.package),mt.has(y.package)&&t.add(y.package),y.section==="peerDependencies"&&y.majorsBehind!==null&&y.majorsBehind>=2&&(r=true);let o=0;o+=Math.min(n.size*10,40),o+=Math.min(t.size*5,30),o+=r?20:0,o=Math.min(o,100);let c=[],u=new Map,p=0,i=0,d=0;for(let m of e){let y=m.dependencies.filter(k=>(k.majorsBehind??0)>=1&&k.latestStable);if(y.length===0){c.push({project:m.name,projectPath:m.path,packages:[],recommendation:"do-nothing"});continue}let l=await vt(m,a,s,y.map(k=>k.package)),f=y.map(k=>{let v=yt(k),b=k.latestStable,C=Ue(v),R=Ue(b),P=C!==null&&R!==null?ht(C,R):[],E=l.get(k.package)??{importSites:0,filesTouched:0,patternHits:0},oe=Math.max(1,m.fileCount??1),re=Math.min(100,Math.round((E.filesTouched+E.patternHits)/oe*100)),U=We[k.package],ea=U?.impactedFeatures??["Public API usage patterns","Configuration surface","Runtime compatibility expectations"],ie=U?.automation??(E.patternHits>0?"manual":"deterministic-recipe");return p++,ie==="manual"&&i++,ie==="codemod-available"&&d++,{package:k.package,currentVersion:v,targetVersion:b,majorJumpCount:k.majorsBehind??0,interimMajors:P,releaseNoteSources:["GitHub Releases","Repository tags","CHANGELOG.md"],parsedSignals:[...gt],impactedFeatures:ea,usage:{importSites:E.importSites,filesTouchedEstimate:E.filesTouched,functionsTouchedEstimate:E.patternHits,touchedPercent:re},automatable:ie,codemod:U?.codemod}}),h=fe(f.length,f.filter(k=>k.automatable==="manual").length,f.filter(k=>k.automatable==="codemod-available").length);if(c.push({project:m.name,projectPath:m.path,packages:f,recommendation:h}),m.solutionId){let k=m.solutionId,v=u.get(k)??{solutionId:k,solutionName:m.solutionName??k,projectCount:0,majorPackages:0,recommendation:"do-nothing"};v.projectCount+=1,v.majorPackages+=f.length,v.recommendation=fe(v.majorPackages,i,d),u.set(k,v);}}let g=fe(p,i,d);return {deprecatedPackages:[...n].sort(),legacyPolyfills:[...t].sort(),peerConflictsDetected:r,exposureScore:o,projectIntelligence:c,solutionIntelligence:[...u.values()],overallRecommendation:g}}var bt=new Set(["node_modules",".git",".wrangler",".next","dist","build","out",".turbo",".cache","coverage","bin","obj",".vs","TestResults",".nuxt",".output",".svelte-kit"]),Me=new Set([".map",".lock",".png",".jpg",".jpeg",".gif",".ico",".svg",".woff",".woff2",".ttf",".otf",".eot",".mp4",".webm"]);async function wt(e,a){let s={},n=[],t=0;if(a){let o=await a.walkDir(e);for(let c of o){if(!c.isFile)continue;let u=I.extname(c.name).toLowerCase();if(Me.has(u))continue;let p=c.relPath.split(I.sep).length-1;p>t&&(t=p),s[u]=(s[u]??0)+1;try{let i=await V.stat(c.absPath);n.push({path:c.relPath,bytes:i.size});}catch{}}}else {async function o(c,u){u>t&&(t=u);let p;try{p=(await V.readdir(c,{withFileTypes:!0})).map(d=>({name:d.name,isDirectory:d.isDirectory(),isFile:d.isFile()}));}catch{return}for(let i of p)if(i.isDirectory){if(bt.has(i.name))continue;await o(I.join(c,i.name),u+1);}else if(i.isFile){let d=I.extname(i.name).toLowerCase();if(Me.has(d))continue;s[d]=(s[d]??0)+1;try{let g=await V.stat(I.join(c,i.name));n.push({path:I.relative(e,I.join(c,i.name)),bytes:g.size});}catch{}}}await o(e,0);}n.sort((o,c)=>c.bytes-o.bytes);let r=n.slice(0,20);return {fileCountByExtension:s,largestFiles:r,totalFiles:n.length,maxDirectoryDepth:t,mostUsedPackages:[]}}var St={"pnpm-lock.yaml":"pnpm","package-lock.json":"npm","yarn.lock":"yarn","bun.lockb":"bun","packages.lock.json":"nuget"};async function xt(e,a){let s={lockfilePresent:false,multipleLockfileTypes:false,gitignoreCoversEnv:false,gitignoreCoversNodeModules:false,envFilesTracked:false,lockfileTypes:[]},n=a?c=>a.pathExists(c):p,t=a?c=>a.readTextFile(c):o,r=[];for(let[c,u]of Object.entries(St))await n(I.join(e,c))&&r.push(u);s.lockfilePresent=r.length>0,s.multipleLockfileTypes=r.length>1,s.lockfileTypes=r.sort();let o$1=I.join(e,".gitignore");if(await n(o$1))try{let u=(await t(o$1)).split(`
321
321
  `).map(p=>p.trim());s.gitignoreCoversEnv=u.some(p=>p===".env"||p===".env*"||p===".env.*"||p===".env.local"||p==="*.env"),s.gitignoreCoversNodeModules=u.some(p=>p==="node_modules"||p==="node_modules/"||p==="/node_modules");}catch{}for(let c of [".env",".env.local",".env.development",".env.production"])if(await n(I.join(e,c))&&!s.gitignoreCoversEnv){s.envFilesTracked=true;break}return s}var jt={payment:{stripe:"Stripe","@stripe/stripe-js":"Stripe.js","@stripe/react-stripe-js":"Stripe React",braintree:"Braintree","braintree-web":"Braintree Web","@paypal/checkout-server-sdk":"PayPal","@paypal/react-paypal-js":"PayPal React","@paypal/paypal-js":"PayPal.js",square:"Square",razorpay:"Razorpay","adyen-api-library":"Adyen","@adyen/api-library":"Adyen","@adyen/adyen-web":"Adyen Web","mollie-api-node":"Mollie","@lemonsqueezy/lemonsqueezy.js":"Lemon Squeezy","paddle-sdk":"Paddle","@paddle/paddle-node-sdk":"Paddle","coinbase-commerce-node":"Coinbase Commerce","gocardless-nodejs":"GoCardless","klarna-checkout":"Klarna","@recurly/recurly-js":"Recurly",chargebee:"Chargebee"},auth:{"@auth0/auth0-spa-js":"Auth0 SPA","@auth0/auth0-react":"Auth0 React","@auth0/nextjs-auth0":"Auth0 Next.js",auth0:"Auth0","@clerk/clerk-js":"Clerk.js","@clerk/clerk-sdk-node":"Clerk (Node)","@clerk/nextjs":"Clerk (Next.js)","@clerk/react-router":"Clerk (React Router)","@clerk/tanstack-react-start":"Clerk (TanStack Start)","@clerk/expo":"Clerk (Expo)","@clerk/astro":"Clerk (Astro)","@clerk/chrome-extension":"Clerk (Chrome Extension)","@clerk/express":"Clerk (Express)","@clerk/fastify":"Clerk (Fastify)","@clerk/hono":"Clerk (Hono)","@clerk/nuxt":"Clerk (Nuxt)","@clerk/react":"Clerk (React)","@clerk/vue":"Clerk (Vue)","@clerk/clerk-react":"Clerk (React)","firebase-admin":"Firebase Admin",firebase:"Firebase","@firebase/auth":"Firebase Auth",passport:"Passport.js","passport-local":"Passport Local","passport-google-oauth20":"Passport Google","passport-github2":"Passport GitHub","next-auth":"NextAuth","@auth/core":"Auth.js","@supabase/supabase-js":"Supabase","@supabase/auth-helpers-nextjs":"Supabase Auth (Next.js)","@supabase/ssr":"Supabase SSR",jsonwebtoken:"JWT",jose:"JOSE","@okta/okta-auth-js":"Okta","@okta/okta-react":"Okta React","oidc-client-ts":"OIDC Client","@casl/ability":"CASL",casbin:"Casbin","keycloak-js":"Keycloak","@keycloak/keycloak-admin-client":"Keycloak Admin",lucia:"Lucia Auth","@lucia-auth/adapter-prisma":"Lucia (Prisma)",arctic:"Arctic (OAuth)","better-auth":"Better Auth",grant:"Grant (OAuth)","@workos-inc/node":"WorkOS",stytch:"Stytch",frontegg:"Frontegg","@descope/node-sdk":"Descope","kinde-auth-nextjs":"Kinde"},email:{"@sendgrid/mail":"SendGrid","@sendgrid/client":"SendGrid Client",nodemailer:"Nodemailer",twilio:"Twilio","@aws-sdk/client-ses":"AWS SES","@aws-sdk/client-sesv2":"AWS SES v2",postmark:"Postmark","mailgun.js":"Mailgun",resend:"Resend","@react-email/components":"React Email","react-email":"React Email",mjml:"MJML","email-templates":"Email Templates","@mailchimp/mailchimp_marketing":"Mailchimp","@mailchimp/mailchimp_transactional":"Mailchimp Transactional","plunk-node":"Plunk",brevo:"Brevo (Sendinblue)","sib-api-v3-sdk":"Brevo v3","@customer.io/node":"Customer.io",sparkpost:"SparkPost","mandrill-api":"Mandrill","mail-listener5":"Mail Listener","@azure/communication-email":"Azure Email"},cloud:{"aws-sdk":"AWS SDK v2","@aws-sdk/client-s3":"AWS S3","@aws-sdk/client-lambda":"AWS Lambda","@aws-sdk/client-dynamodb":"AWS DynamoDB","@aws-sdk/client-ec2":"AWS EC2","@aws-sdk/client-ecs":"AWS ECS","@aws-sdk/client-ecr":"AWS ECR","@aws-sdk/client-cloudformation":"AWS CloudFormation","@aws-sdk/client-cloudwatch":"AWS CloudWatch","@aws-sdk/client-cloudfront":"AWS CloudFront","@aws-sdk/client-iam":"AWS IAM","@aws-sdk/client-secrets-manager":"AWS Secrets Manager","@aws-sdk/client-ssm":"AWS SSM","@aws-sdk/client-sts":"AWS STS","@aws-sdk/client-cognito-identity-provider":"AWS Cognito","@aws-sdk/client-route-53":"AWS Route 53","@aws-sdk/client-step-functions":"AWS Step Functions","@aws-sdk/client-eventbridge":"AWS EventBridge","@aws-sdk/client-kinesis":"AWS Kinesis","@aws-sdk/client-kms":"AWS KMS","@aws-sdk/client-athena":"AWS Athena","@aws-sdk/client-bedrock-runtime":"AWS Bedrock","@aws-sdk/lib-dynamodb":"AWS DynamoDB Doc","@azure/storage-blob":"Azure Blob","@azure/identity":"Azure Identity","@azure/cosmos":"Azure Cosmos DB","@azure/keyvault-secrets":"Azure Key Vault","@azure/service-bus":"Azure Service Bus","@azure/event-hubs":"Azure Event Hubs","@azure/functions":"Azure Functions","@azure/ai-form-recognizer":"Azure Form Recognizer","@azure/openai":"Azure OpenAI","@azure/app-configuration":"Azure App Config","@azure/monitor-opentelemetry":"Azure Monitor OTel","@azure/container-registry":"Azure Container Registry","@google-cloud/storage":"GCP Storage","@google-cloud/functions-framework":"GCP Functions","@google-cloud/bigquery":"GCP BigQuery","@google-cloud/firestore":"GCP Firestore","@google-cloud/pubsub":"GCP Pub/Sub","@google-cloud/secret-manager":"GCP Secret Manager","@google-cloud/tasks":"GCP Cloud Tasks","@google-cloud/run":"GCP Cloud Run","@google-cloud/logging":"GCP Logging","@google-cloud/translate":"GCP Translate","@google-cloud/vertexai":"GCP Vertex AI","@vercel/sdk":"Vercel","@vercel/kv":"Vercel KV","@vercel/blob":"Vercel Blob","@vercel/postgres":"Vercel Postgres","@vercel/edge-config":"Vercel Edge Config","@netlify/functions":"Netlify Functions","@cloudflare/workers-types":"Cloudflare Workers",wrangler:"Wrangler","@railway/cli":"Railway","@fly/apps":"Fly.io","heroku-client":"Heroku","@pulumi/pulumi":"Pulumi","@pulumi/aws":"Pulumi AWS",cdktf:"CDK for Terraform","aws-cdk-lib":"AWS CDK",sst:"SST"},databases:{pg:"PostgreSQL",postgres:"Postgres.js",mysql2:"MySQL",mysql:"MySQL (legacy)",mongodb:"MongoDB",ioredis:"Redis (ioredis)",redis:"Redis","better-sqlite3":"SQLite","sql.js":"sql.js","@prisma/client":"Prisma","drizzle-orm":"Drizzle",typeorm:"TypeORM",sequelize:"Sequelize",knex:"Knex",kysely:"Kysely",objection:"Objection.js",slonik:"Slonik",massive:"Massive.js",mongoose:"Mongoose","@mikro-orm/core":"MikroORM",mssql:"SQL Server",oracledb:"Oracle","cassandra-driver":"Cassandra","neo4j-driver":"Neo4j",arangojs:"ArangoDB","@clickhouse/client":"ClickHouse",influx:"InfluxDB","@libsql/client":"libSQL (Turso)","@neondatabase/serverless":"Neon","@planetscale/database":"PlanetScale","@electric-sql/pglite":"PGlite","@upstash/redis":"Upstash Redis","@upstash/kafka":"Upstash Kafka","@upstash/qstash":"Upstash QStash","@upstash/vector":"Upstash Vector",dynamoose:"Dynamoose",fauna:"Fauna",faunadb:"FaunaDB","@supabase/postgrest-js":"Supabase PostgREST",couchbase:"Couchbase","couchdb-nano":"CouchDB",duckdb:"DuckDB","@tidbcloud/serverless":"TiDB Serverless"},messaging:{"@aws-sdk/client-sqs":"AWS SQS","@aws-sdk/client-sns":"AWS SNS",amqplib:"RabbitMQ",kafkajs:"Kafka",bullmq:"BullMQ",bull:"Bull","@google-cloud/pubsub":"GCP Pub/Sub","bee-queue":"Bee Queue","pg-boss":"pg-boss",agenda:"Agenda","@azure/service-bus":"Azure Service Bus","@azure/event-hubs":"Azure Event Hubs",nats:"NATS",mqtt:"MQTT",zeromq:"ZeroMQ","@temporalio/client":"Temporal Client","@temporalio/worker":"Temporal Worker",inngest:"Inngest","@trigger.dev/sdk":"Trigger.dev","@defer/client":"Defer","graphile-worker":"Graphile Worker","@quirrel/quirrel":"Quirrel",rhea:"AMQP 1.0 (rhea)",stompit:"STOMP","@eventstore/db-client":"EventStoreDB","@aws-sdk/client-eventbridge":"AWS EventBridge","@aws-sdk/client-kinesis":"AWS Kinesis","@aws-sdk/client-firehose":"AWS Firehose"},observability:{"@sentry/node":"Sentry (Node)","@sentry/browser":"Sentry (Browser)","@sentry/react":"Sentry (React)","@sentry/nextjs":"Sentry (Next.js)","@sentry/vue":"Sentry (Vue)","@sentry/angular":"Sentry (Angular)","@opentelemetry/api":"OpenTelemetry API","@opentelemetry/sdk-node":"OpenTelemetry SDK","@opentelemetry/auto-instrumentations-node":"OpenTelemetry Auto",applicationinsights:"App Insights","dd-trace":"Datadog","@datadog/browser-rum":"Datadog RUM",newrelic:"New Relic","@newrelic/browser-agent":"New Relic Browser",pino:"Pino",winston:"Winston",bunyan:"Bunyan",consola:"Consola",loglevel:"loglevel",roarr:"Roarr","prom-client":"Prometheus","elastic-apm-node":"Elastic APM","@logtail/node":"Logtail","@axiomhq/pino":"Axiom (Pino)","@axiomhq/winston":"Axiom (Winston)","@baselime/node-opentelemetry":"Baselime","highlight.run":"Highlight","@google-cloud/trace-agent":"GCP Trace","@google-cloud/logging":"GCP Logging","@azure/monitor-opentelemetry":"Azure Monitor","lightstep-tracer":"Lightstep","honeycomb-beeline":"Honeycomb","@honeycombio/opentelemetry-node":"Honeycomb OTel","posthog-node":"PostHog","@amplitude/node":"Amplitude",mixpanel:"Mixpanel","@segment/analytics-node":"Segment","analytics-node":"Segment (legacy)","@rudderstack/rudder-sdk-node":"RudderStack","heap-api":"Heap","@fullstory/browser":"FullStory","@logrocket/react":"LogRocket",logrocket:"LogRocket","hotjar-js":"Hotjar","@clarity-ai/clarity":"Microsoft Clarity"},crm:{"xero-node":"Xero","hubspot-api-client":"HubSpot","@hubspot/api-client":"HubSpot","@slack/web-api":"Slack Web API","@slack/bolt":"Slack Bolt","@slack/events-api":"Slack Events","discord.js":"Discord","intercom-client":"Intercom","salesforce-sdk":"Salesforce",jsforce:"JSforce (Salesforce)","@zendesk/sell-client":"Zendesk","node-zendesk":"Zendesk","freshdesk-api":"Freshdesk",pipedrive:"Pipedrive",airtable:"Airtable","@notionhq/client":"Notion","@linear/sdk":"Linear","jira-client":"Jira","jira.js":"Jira.js","@octokit/rest":"GitHub (Octokit)","@octokit/core":"GitHub (Octokit Core)",gitlab:"GitLab","@gitbeaker/rest":"GitLab (Gitbeaker)","clickup.js":"ClickUp",asana:"Asana","monday-sdk-js":"Monday.com","telegram-bot-api":"Telegram",telegraf:"Telegraf (Telegram)","@microsoft/microsoft-graph-client":"Microsoft Graph",googleapis:"Google APIs","@google-cloud/aiplatform":"Google AI Platform"},storage:{"@aws-sdk/client-s3":"AWS S3","@aws-sdk/s3-request-presigner":"AWS S3 Presigner","@azure/storage-blob":"Azure Blob","@azure/storage-queue":"Azure Storage Queue","@azure/storage-file-share":"Azure File Share","@google-cloud/storage":"GCP Storage",minio:"MinIO","@supabase/storage-js":"Supabase Storage",cloudinary:"Cloudinary",uploadthing:"UploadThing","@uploadthing/react":"UploadThing React",multer:"Multer","multer-s3":"Multer S3",formidable:"Formidable",busboy:"Busboy","@vercel/blob":"Vercel Blob",imagekit:"ImageKit",sharp:"Sharp (image)",jimp:"Jimp (image)","fluent-ffmpeg":"FFmpeg","@google-cloud/vision":"GCP Vision","@aws-sdk/client-rekognition":"AWS Rekognition","file-type":"file-type","@backblaze-b2/sdk":"Backblaze B2","wasabi-sdk":"Wasabi"},search:{"@elastic/elasticsearch":"Elasticsearch",algoliasearch:"Algolia","@algolia/client-search":"Algolia Client","react-instantsearch":"Algolia InstantSearch",meilisearch:"Meilisearch",typesense:"Typesense","@opensearch-project/opensearch":"OpenSearch","solr-client":"Solr",lunr:"Lunr",flexsearch:"FlexSearch","fuse.js":"Fuse.js",minisearch:"MiniSearch",orama:"Orama","@orama/orama":"Orama","@trieve/trieve-ts-sdk":"Trieve",pagefind:"Pagefind","@pinecone-database/pinecone":"Pinecone",chromadb:"Chroma","@qdrant/js-client-rest":"Qdrant","weaviate-ts-client":"Weaviate","@zilliz/milvus2-sdk-node":"Milvus",openai:"OpenAI","@anthropic-ai/sdk":"Anthropic","@langchain/core":"LangChain",langchain:"LangChain","@google/generative-ai":"Google Gemini","cohere-ai":"Cohere",replicate:"Replicate","@huggingface/inference":"Hugging Face",ai:"Vercel AI SDK","@ai-sdk/openai":"AI SDK (OpenAI)"}};function Ct(e){let a=new Map;for(let n of e)for(let t of n.dependencies)a.has(t.package)||a.set(t.package,t.resolvedVersion);let s={payment:[],auth:[],email:[],cloud:[],databases:[],messaging:[],observability:[],crm:[],storage:[],search:[]};for(let[n,t]of Object.entries(jt)){let r=[];for(let[o,c]of Object.entries(t))a.has(o)&&r.push({name:c,package:o,version:a.get(o)??null});r.sort((o,c)=>o.name.localeCompare(c.name)),s[n]=r;}return s}var Rt=[{packages:["next","@next/core"],archetype:"nextjs",weight:10},{packages:["@remix-run/react","@remix-run/node","@remix-run/dev"],archetype:"remix",weight:10},{packages:["@sveltejs/kit"],archetype:"sveltekit",weight:10},{packages:["nuxt"],archetype:"nuxt",weight:10},{packages:["@nestjs/core","@nestjs/common"],archetype:"nestjs",weight:9},{packages:["fastify"],archetype:"fastify",weight:8},{packages:["hono"],archetype:"hono",weight:8},{packages:["koa"],archetype:"koa",weight:8},{packages:["express"],archetype:"express",weight:7},{packages:["serverless","aws-lambda","@aws-sdk/client-lambda","middy","@cloudflare/workers-types"],archetype:"serverless",weight:6},{packages:["commander","yargs","meow","cac","clipanion","oclif"],archetype:"cli",weight:5}];function Tt(e){let a=new Set;for(let r of e)for(let o of r.dependencies)a.add(o.package);if(e.length>2)return {archetype:"monorepo",confidence:.8};let s="unknown",n=0;for(let r of Rt){let o=r.packages.filter(c=>a.has(c)).length;if(o>0){let c=o*r.weight;c>n&&(n=c,s=r.archetype);}}s==="unknown"&&(s="library",n=3);let t=Math.min(n/15,1);return {archetype:s,confidence:Math.round(t*100)/100}}var Pt=[{pattern:/\/__tests__\//,layer:"testing",confidence:.95,signal:"__tests__ directory"},{pattern:/\.test\.[jt]sx?$/,layer:"testing",confidence:.95,signal:".test.* file"},{pattern:/\.spec\.[jt]sx?$/,layer:"testing",confidence:.95,signal:".spec.* file"},{pattern:/\/test\//,layer:"testing",confidence:.85,signal:"test/ directory"},{pattern:/\/tests\//,layer:"testing",confidence:.85,signal:"tests/ directory"},{pattern:/\/__mocks__\//,layer:"testing",confidence:.9,signal:"__mocks__ directory"},{pattern:/\/fixtures\//,layer:"testing",confidence:.8,signal:"fixtures/ directory"},{pattern:/\/config\.[jt]sx?$/,layer:"config",confidence:.85,signal:"config.* file"},{pattern:/\/config\//,layer:"config",confidence:.8,signal:"config/ directory"},{pattern:/\.config\.[jt]sx?$/,layer:"config",confidence:.9,signal:".config.* file"},{pattern:/\/env\.[jt]sx?$/,layer:"config",confidence:.85,signal:"env.* file"},{pattern:/\/bootstrap\.[jt]sx?$/,layer:"config",confidence:.85,signal:"bootstrap file"},{pattern:/\/setup\.[jt]sx?$/,layer:"config",confidence:.8,signal:"setup file"},{pattern:/(^|\/)app\/.*\/route\.[jt]sx?$/,layer:"routing",confidence:.95,signal:"Next.js App Router route",archetypes:["nextjs"]},{pattern:/(^|\/)pages\/api\//,layer:"routing",confidence:.95,signal:"Next.js Pages API route",archetypes:["nextjs"]},{pattern:/(^|\/)app\/.*page\.[jt]sx?$/,layer:"presentation",confidence:.9,signal:"Next.js page component",archetypes:["nextjs"]},{pattern:/(^|\/)app\/.*layout\.[jt]sx?$/,layer:"presentation",confidence:.9,signal:"Next.js layout component",archetypes:["nextjs"]},{pattern:/(^|\/)app\/.*loading\.[jt]sx?$/,layer:"presentation",confidence:.85,signal:"Next.js loading component",archetypes:["nextjs"]},{pattern:/(^|\/)app\/.*error\.[jt]sx?$/,layer:"presentation",confidence:.85,signal:"Next.js error component",archetypes:["nextjs"]},{pattern:/(^|\/)middleware\.[jt]sx?$/,layer:"middleware",confidence:.9,signal:"Next.js middleware",archetypes:["nextjs"]},{pattern:/\/app\/routes\//,layer:"routing",confidence:.95,signal:"Remix route file",archetypes:["remix"]},{pattern:/\/app\/root\.[jt]sx?$/,layer:"presentation",confidence:.9,signal:"Remix root",archetypes:["remix"]},{pattern:/\/src\/routes\/.*\+server\.[jt]s$/,layer:"routing",confidence:.95,signal:"SvelteKit API route",archetypes:["sveltekit"]},{pattern:/\/src\/routes\/.*\+page\.svelte$/,layer:"presentation",confidence:.9,signal:"SvelteKit page",archetypes:["sveltekit"]},{pattern:/\/src\/routes\/.*\+layout\.svelte$/,layer:"presentation",confidence:.9,signal:"SvelteKit layout",archetypes:["sveltekit"]},{pattern:/\/src\/hooks\.server\.[jt]s$/,layer:"middleware",confidence:.9,signal:"SvelteKit server hooks",archetypes:["sveltekit"]},{pattern:/\/server\/api\//,layer:"routing",confidence:.95,signal:"Nuxt server API",archetypes:["nuxt"]},{pattern:/\/server\/routes\//,layer:"routing",confidence:.95,signal:"Nuxt server route",archetypes:["nuxt"]},{pattern:/\/server\/middleware\//,layer:"middleware",confidence:.95,signal:"Nuxt server middleware",archetypes:["nuxt"]},{pattern:/\/pages\//,layer:"presentation",confidence:.85,signal:"Nuxt pages directory",archetypes:["nuxt"]},{pattern:/\.controller\.[jt]sx?$/,layer:"routing",confidence:.95,signal:"NestJS controller",archetypes:["nestjs"]},{pattern:/\.service\.[jt]sx?$/,layer:"services",confidence:.95,signal:"NestJS service",archetypes:["nestjs"]},{pattern:/\.module\.[jt]sx?$/,layer:"config",confidence:.9,signal:"NestJS module",archetypes:["nestjs"]},{pattern:/\.guard\.[jt]sx?$/,layer:"middleware",confidence:.9,signal:"NestJS guard",archetypes:["nestjs"]},{pattern:/\.interceptor\.[jt]sx?$/,layer:"middleware",confidence:.9,signal:"NestJS interceptor",archetypes:["nestjs"]},{pattern:/\.pipe\.[jt]sx?$/,layer:"middleware",confidence:.85,signal:"NestJS pipe",archetypes:["nestjs"]},{pattern:/\.middleware\.[jt]sx?$/,layer:"middleware",confidence:.9,signal:"NestJS middleware",archetypes:["nestjs"]},{pattern:/\.entity\.[jt]sx?$/,layer:"domain",confidence:.9,signal:"NestJS entity",archetypes:["nestjs"]},{pattern:/\.dto\.[jt]sx?$/,layer:"domain",confidence:.85,signal:"NestJS DTO",archetypes:["nestjs"]},{pattern:/\.repository\.[jt]sx?$/,layer:"data-access",confidence:.9,signal:"NestJS repository",archetypes:["nestjs"]},{pattern:/\/routes\//,layer:"routing",confidence:.8,signal:"routes/ directory"},{pattern:/\/router\//,layer:"routing",confidence:.8,signal:"router/ directory"},{pattern:/\/controllers\//,layer:"routing",confidence:.8,signal:"controllers/ directory"},{pattern:/\/handlers\//,layer:"routing",confidence:.75,signal:"handlers/ directory"},{pattern:/\/api\//,layer:"routing",confidence:.7,signal:"api/ directory"},{pattern:/\/endpoints\//,layer:"routing",confidence:.8,signal:"endpoints/ directory"},{pattern:/\/middleware\//,layer:"middleware",confidence:.85,signal:"middleware/ directory"},{pattern:/\/middlewares\//,layer:"middleware",confidence:.85,signal:"middlewares/ directory"},{pattern:/\/hooks\//,layer:"middleware",confidence:.6,signal:"hooks/ directory"},{pattern:/\/plugins\//,layer:"middleware",confidence:.6,signal:"plugins/ directory"},{pattern:/\/guards\//,layer:"middleware",confidence:.85,signal:"guards/ directory"},{pattern:/\/interceptors\//,layer:"middleware",confidence:.85,signal:"interceptors/ directory"},{pattern:/\/services\//,layer:"services",confidence:.85,signal:"services/ directory"},{pattern:/\/service\//,layer:"services",confidence:.8,signal:"service/ directory"},{pattern:/\/usecases\//,layer:"services",confidence:.85,signal:"usecases/ directory"},{pattern:/\/use-cases\//,layer:"services",confidence:.85,signal:"use-cases/ directory"},{pattern:/\/application\//,layer:"services",confidence:.7,signal:"application/ directory"},{pattern:/\/actions\//,layer:"services",confidence:.65,signal:"actions/ directory"},{pattern:/\/domain\//,layer:"domain",confidence:.85,signal:"domain/ directory"},{pattern:/\/models\//,layer:"domain",confidence:.8,signal:"models/ directory"},{pattern:/\/entities\//,layer:"domain",confidence:.85,signal:"entities/ directory"},{pattern:/\/types\//,layer:"domain",confidence:.7,signal:"types/ directory"},{pattern:/\/schemas\//,layer:"domain",confidence:.7,signal:"schemas/ directory"},{pattern:/\/validators\//,layer:"domain",confidence:.7,signal:"validators/ directory"},{pattern:/\/repositories\//,layer:"data-access",confidence:.9,signal:"repositories/ directory"},{pattern:/\/repository\//,layer:"data-access",confidence:.85,signal:"repository/ directory"},{pattern:/\/dao\//,layer:"data-access",confidence:.9,signal:"dao/ directory"},{pattern:/\/db\//,layer:"data-access",confidence:.8,signal:"db/ directory"},{pattern:/\/database\//,layer:"data-access",confidence:.8,signal:"database/ directory"},{pattern:/\/persistence\//,layer:"data-access",confidence:.85,signal:"persistence/ directory"},{pattern:/\/migrations\//,layer:"data-access",confidence:.9,signal:"migrations/ directory"},{pattern:/\/seeds\//,layer:"data-access",confidence:.85,signal:"seeds/ directory"},{pattern:/\/prisma\//,layer:"data-access",confidence:.85,signal:"prisma/ directory"},{pattern:/\/drizzle\//,layer:"data-access",confidence:.85,signal:"drizzle/ directory"},{pattern:/\/infra\//,layer:"infrastructure",confidence:.85,signal:"infra/ directory"},{pattern:/\/infrastructure\//,layer:"infrastructure",confidence:.85,signal:"infrastructure/ directory"},{pattern:/\/adapters\//,layer:"infrastructure",confidence:.8,signal:"adapters/ directory"},{pattern:/\/clients\//,layer:"infrastructure",confidence:.75,signal:"clients/ directory"},{pattern:/\/integrations\//,layer:"infrastructure",confidence:.8,signal:"integrations/ directory"},{pattern:/\/external\//,layer:"infrastructure",confidence:.75,signal:"external/ directory"},{pattern:/\/queue\//,layer:"infrastructure",confidence:.8,signal:"queue/ directory"},{pattern:/\/jobs\//,layer:"infrastructure",confidence:.75,signal:"jobs/ directory"},{pattern:/\/workers\//,layer:"infrastructure",confidence:.75,signal:"workers/ directory"},{pattern:/\/cron\//,layer:"infrastructure",confidence:.8,signal:"cron/ directory"},{pattern:/\/components\//,layer:"presentation",confidence:.85,signal:"components/ directory"},{pattern:/\/views\//,layer:"presentation",confidence:.85,signal:"views/ directory"},{pattern:/\/pages\//,layer:"presentation",confidence:.8,signal:"pages/ directory"},{pattern:/\/layouts\//,layer:"presentation",confidence:.85,signal:"layouts/ directory"},{pattern:/\/templates\//,layer:"presentation",confidence:.8,signal:"templates/ directory"},{pattern:/\/widgets\//,layer:"presentation",confidence:.8,signal:"widgets/ directory"},{pattern:/\/ui\//,layer:"presentation",confidence:.75,signal:"ui/ directory"},{pattern:/\/utils\//,layer:"shared",confidence:.7,signal:"utils/ directory"},{pattern:/\/helpers\//,layer:"shared",confidence:.7,signal:"helpers/ directory"},{pattern:/\/lib\//,layer:"shared",confidence:.6,signal:"lib/ directory"},{pattern:/\/common\//,layer:"shared",confidence:.65,signal:"common/ directory"},{pattern:/\/shared\//,layer:"shared",confidence:.75,signal:"shared/ directory"},{pattern:/\/constants\//,layer:"shared",confidence:.7,signal:"constants/ directory"},{pattern:/\/commands\//,layer:"routing",confidence:.8,signal:"commands/ directory",archetypes:["cli"]},{pattern:/\/formatters\//,layer:"presentation",confidence:.8,signal:"formatters/ directory",archetypes:["cli"]},{pattern:/\/scanners\//,layer:"services",confidence:.8,signal:"scanners/ directory",archetypes:["cli"]},{pattern:/\/scoring\//,layer:"domain",confidence:.8,signal:"scoring/ directory",archetypes:["cli"]},{pattern:/\/functions\//,layer:"routing",confidence:.8,signal:"functions/ directory",archetypes:["serverless"]},{pattern:/\/lambdas\//,layer:"routing",confidence:.85,signal:"lambdas/ directory",archetypes:["serverless"]},{pattern:/\/layers\//,layer:"shared",confidence:.7,signal:"Lambda layers/ directory",archetypes:["serverless"]}],At=[{suffix:".controller",layer:"routing",confidence:.85,signal:"controller suffix"},{suffix:".route",layer:"routing",confidence:.85,signal:"route suffix"},{suffix:".router",layer:"routing",confidence:.85,signal:"router suffix"},{suffix:".handler",layer:"routing",confidence:.8,signal:"handler suffix"},{suffix:".middleware",layer:"middleware",confidence:.85,signal:"middleware suffix"},{suffix:".guard",layer:"middleware",confidence:.85,signal:"guard suffix"},{suffix:".interceptor",layer:"middleware",confidence:.85,signal:"interceptor suffix"},{suffix:".service",layer:"services",confidence:.85,signal:"service suffix"},{suffix:".usecase",layer:"services",confidence:.85,signal:"usecase suffix"},{suffix:".model",layer:"domain",confidence:.8,signal:"model suffix"},{suffix:".entity",layer:"domain",confidence:.85,signal:"entity suffix"},{suffix:".dto",layer:"domain",confidence:.8,signal:"DTO suffix"},{suffix:".schema",layer:"domain",confidence:.75,signal:"schema suffix"},{suffix:".validator",layer:"domain",confidence:.75,signal:"validator suffix"},{suffix:".repository",layer:"data-access",confidence:.9,signal:"repository suffix"},{suffix:".repo",layer:"data-access",confidence:.85,signal:"repo suffix"},{suffix:".dao",layer:"data-access",confidence:.9,signal:"dao suffix"},{suffix:".migration",layer:"data-access",confidence:.85,signal:"migration suffix"},{suffix:".adapter",layer:"infrastructure",confidence:.8,signal:"adapter suffix"},{suffix:".client",layer:"infrastructure",confidence:.75,signal:"client suffix"},{suffix:".provider",layer:"infrastructure",confidence:.7,signal:"provider suffix"},{suffix:".config",layer:"config",confidence:.8,signal:"config suffix"},{suffix:".component",layer:"presentation",confidence:.8,signal:"component suffix"},{suffix:".page",layer:"presentation",confidence:.85,signal:"page suffix"},{suffix:".view",layer:"presentation",confidence:.8,signal:"view suffix"},{suffix:".layout",layer:"presentation",confidence:.85,signal:"layout suffix"},{suffix:".util",layer:"shared",confidence:.7,signal:"util suffix"},{suffix:".helper",layer:"shared",confidence:.7,signal:"helper suffix"},{suffix:".constant",layer:"shared",confidence:.7,signal:"constant suffix"}],ge={express:"routing",fastify:"routing","@nestjs/core":"routing",hono:"routing",koa:"routing","koa-router":"routing","@hapi/hapi":"routing",h3:"routing",cors:"middleware",helmet:"middleware",passport:"middleware","express-rate-limit":"middleware","cookie-parser":"middleware","body-parser":"middleware",multer:"middleware",morgan:"middleware",compression:"middleware","express-session":"middleware",bullmq:"services",bull:"services",agenda:"services","pg-boss":"services",inngest:"services",zod:"domain",joi:"domain",yup:"domain","class-validator":"domain","class-transformer":"domain",superstruct:"domain",valibot:"domain",prisma:"data-access","@prisma/client":"data-access","drizzle-orm":"data-access",typeorm:"data-access",sequelize:"data-access",knex:"data-access",pg:"data-access",mysql2:"data-access",mongodb:"data-access",mongoose:"data-access",ioredis:"data-access",redis:"data-access","better-sqlite3":"data-access",kysely:"data-access","@mikro-orm/core":"data-access","@aws-sdk/client-s3":"infrastructure","@aws-sdk/client-sqs":"infrastructure","@aws-sdk/client-sns":"infrastructure","@aws-sdk/client-ses":"infrastructure","@aws-sdk/client-lambda":"infrastructure","@google-cloud/storage":"infrastructure","@azure/storage-blob":"infrastructure",nodemailer:"infrastructure","@sendgrid/mail":"infrastructure",stripe:"infrastructure",kafkajs:"infrastructure",amqplib:"infrastructure",react:"presentation","react-dom":"presentation",vue:"presentation","@angular/core":"presentation",svelte:"presentation",lodash:"shared",dayjs:"shared","date-fns":"shared",uuid:"shared",nanoid:"shared",vitest:"testing",jest:"testing",mocha:"testing","@playwright/test":"testing",cypress:"testing",supertest:"testing","@sentry/node":"infrastructure","@opentelemetry/api":"infrastructure",pino:"infrastructure",winston:"infrastructure","dd-trace":"infrastructure"},$e=new Set([".ts",".tsx",".js",".jsx",".mts",".mjs",".cts",".cjs",".svelte",".vue"]),Et=new Set(["node_modules",".git",".wrangler","dist","build",".next",".nuxt",".output",".svelte-kit","coverage",".vibgrate"]);async function He(e,a){if(a)return (await a.walkDir(e)).filter(r=>{if(!r.isFile)return false;let o=I.basename(r.absPath);if(o.startsWith(".")&&o!==".")return false;let c=I.extname(o);return $e.has(c)}).map(r=>r.relPath);let s=[];async function n(t){let r;try{r=await V.readdir(t,{withFileTypes:!0});}catch{return}for(let o of r){if(o.name.startsWith(".")&&o.name!==".")continue;let c=I.join(t,o.name);if(o.isDirectory())Et.has(o.name)||await n(c);else if(o.isFile()){let u=I.extname(o.name);$e.has(u)&&s.push(I.relative(e,c));}}}return await n(e),s}function Ve(e,a){let s=e.replace(/\\/g,"/"),n=null;for(let t of Pt)if(!(t.archetypes&&t.archetypes.length>0&&!t.archetypes.includes(a))&&t.pattern.test(s)){let r=t.archetypes?.05:0,o=Math.min(t.confidence+r,1);(!n||o>n.confidence)&&(n={layer:t.layer,confidence:o,signal:t.signal});}if(!n||n.confidence<.7){let r=I.basename(e,I.extname(e)).replace(/\.(test|spec)$/,"");for(let o of At)r.endsWith(o.suffix)&&(!n||o.confidence>n.confidence)&&(n={layer:o.layer,confidence:o.confidence,signal:o.signal});}return n?{filePath:e,layer:n.layer,confidence:n.confidence,signals:[n.signal]}:null}function Qe(e){if(e.length===0)return {score:0,riskLevel:"none"};let a=0,s=0,n=0,t=0;for(let g of e)g.majorsBehind===null?t++:g.majorsBehind===0?a++:g.majorsBehind===1?s++:n++;let r=a+s+n;if(r===0)return {score:0,riskLevel:"none"};let o=a/r,c=s/r,u=n/r,i=100-Math.round(Math.max(0,Math.min(100,o*100-c*10-u*40))),d=i<=30?"low":i<=60?"moderate":"high";return {score:i,riskLevel:d}}function It(e,a,s){let n=new Map,t=new Map,r=new Map;for(let[o,c]of s)for(let u of c)r.set(u,o);if(e)for(let[,o]of Object.entries(e))for(let c of o){let u=r.get(c.package)??ge[c.package]??"shared";n.has(u)||n.set(u,[]);let p=n.get(u);p.some(i=>i.package===c.package)||p.push(c);}if(a)for(let[,o]of Object.entries(a))for(let c of o){let u=r.get(c.package)??ge[c.package]??"infrastructure";t.has(u)||t.set(u,[]);let p=t.get(u);p.some(i=>i.package===c.package)||p.push(c);}return {layerTooling:n,layerServices:t}}function Ft(e){let a={presentation:"Presentation",routing:"Routing",middleware:"Middleware",services:"Services",domain:"Domain","data-access":"Data Access",infrastructure:"Infrastructure",config:"Config",shared:"Shared",testing:"Testing"};if(e.length===0)return `flowchart TD
322
322
  APP["Project"]`;let s=[...e],n=["flowchart TD"];for(let t=0;t<s.length;t++){let r=s[t];n.push(` L${t}["${a[r]}"]`),t>0&&n.push(` L${t-1} --> L${t}`);}return n.join(`
323
- `)}async function Ut(e,a,s,n){let t=I.resolve(e,a.path||"."),r=await He(t,n),o=new Set;for(let p of r){let i=Ve(p,s);i&&o.add(i.layer);}let u=["presentation","routing","middleware","services","domain","data-access","infrastructure","config","shared","testing"].filter(p=>o.has(p));return Ft(u)}async function Mt(e,a,s){let n=I.resolve(e,a.path||".");return Je(n,[a],void 0,void 0,s)}function $t(e){if(e.length===0)return {archetype:"unknown",archetypeConfidence:0,layers:[],totalClassified:0,unclassified:0};if(e.length===1)return e[0];let a="unknown",s=0;for(let u of e)(u.archetypeConfidence>s||u.archetypeConfidence===s&&u.archetype!=="monorepo")&&(a=u.archetype,s=u.archetypeConfidence);let n=new Map;for(let u of e)for(let p of u.layers){let i=n.get(p.layer);if(!i)n.set(p.layer,{...p,packages:[...p.packages],techStack:[...p.techStack],services:[...p.services]});else {i.fileCount+=p.fileCount;let d=new Set(i.packages.map(f=>f.name));for(let f of p.packages)d.has(f.name)||(i.packages.push(f),d.add(f.name));let g=new Set(i.techStack.map(f=>f.package));for(let f of p.techStack)g.has(f.package)||(i.techStack.push(f),g.add(f.package));let m=new Set(i.services.map(f=>f.package));for(let f of p.services)m.has(f.package)||(i.services.push(f),m.add(f.package));let{score:y,riskLevel:l}=Qe(i.packages);i.driftScore=y,i.riskLevel=l;}}let t={presentation:0,routing:1,middleware:2,services:3,domain:4,"data-access":5,infrastructure:6,config:7,shared:8,testing:9},r=[...n.values()].sort((u,p)=>(t[u.layer]??99)-(t[p.layer]??99)),o=e.reduce((u,p)=>u+p.totalClassified,0),c=e.reduce((u,p)=>u+p.unclassified,0);return {archetype:a,archetypeConfidence:s,layers:r,totalClassified:o,unclassified:c}}async function Je(e,a,s,n,t){let{archetype:r,confidence:o}=Tt(a),c=await He(e,t),u=[],p=0;for(let k of c){let v=Ve(k,r);v?u.push(v):p++;}let i=new Map;for(let k of a)for(let v of k.dependencies)i.has(v.package)||i.set(v.package,v);let d=new Map;for(let[k]of i){let v=ge[k];v&&(d.has(v)||d.set(v,new Set),d.get(v).add(k));}let{layerTooling:g,layerServices:m}=It(s,n,d),y=["routing","middleware","services","domain","data-access","infrastructure","presentation","config","testing","shared"],l=new Map;for(let k of u)l.set(k.layer,(l.get(k.layer)??0)+1);let f=[];for(let k of y){let v=l.get(k)??0,b=d.get(k)??new Set,C=g.get(k)??[],R=m.get(k)??[];if(v===0&&b.size===0&&C.length===0&&R.length===0)continue;let P=[];for(let re of b){let U=i.get(re);U&&P.push({name:U.package,version:U.resolvedVersion,latestStable:U.latestStable,majorsBehind:U.majorsBehind,drift:U.drift});}let{score:E,riskLevel:oe}=Qe(P);f.push({layer:k,fileCount:v,driftScore:E,riskLevel:oe,techStack:C,services:R,packages:P});}let h={presentation:0,routing:1,middleware:2,services:3,domain:4,"data-access":5,infrastructure:6,config:7,shared:8,testing:9};return f.sort((k,v)=>(h[k.layer]??99)-(h[v.layer]??99)),{archetype:r,archetypeConfidence:o,layers:f,totalClassified:u.length,unclassified:p}}var Le=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Lt={filesAnalyzed:0,functionsAnalyzed:0,avgCyclomaticComplexity:0,avgFunctionLength:0,maxNestingDepth:0,godFiles:[],circularDependencies:0,deadCodePercent:0};async function Ot(e,a){let s=await Dt(e,a);if(s.length===0)return {...Lt};let n=0,t=0,r=0,o$1=0,c=0,u=[],p=new Map;for(let g of s){let m="";try{m=a?await a.readTextFile(g):await o(g);}catch{continue}if(!m.trim())continue;let y=Ze(I.relative(e,g)),l=w.createSourceFile(g,m,w.ScriptTarget.Latest,true),f=Bt(l,I.dirname(g),e);p.set(y,f);let h=Nt(l,m);n+=h.functionsAnalyzed,t+=h.totalComplexity,r+=h.totalFunctionLength,o$1=Math.max(o$1,h.maxNestingDepth),c+=h.deadFunctionCount;let k=h.functionsAnalyzed>0?h.totalComplexity/h.functionsAnalyzed:0;(h.lines>=450||h.functionsAnalyzed>=25||h.functionsAnalyzed>=10&&k>=8)&&u.push({path:y,lines:h.lines,functionCount:h.functionsAnalyzed,averageComplexity:ee(k)});}let i=_t(p),d=n>0?c/n*100:0;return {filesAnalyzed:p.size,functionsAnalyzed:n,avgCyclomaticComplexity:n>0?ee(t/n):0,avgFunctionLength:n>0?ee(r/n):0,maxNestingDepth:o$1,godFiles:u.sort((g,m)=>m.lines-g.lines||m.functionCount-g.functionCount).slice(0,10),circularDependencies:i,deadCodePercent:ee(d)}}async function Dt(e,a){return a?(await a.walkDir(e)).filter(t=>t.isFile&&Le.has(I.extname(t.name).toLowerCase())).map(t=>t.absPath):await i(e,n=>Le.has(I.extname(n).toLowerCase()))}function Bt(e,a,s){let n=new Set,t=r=>{if(w.isImportDeclaration(r)&&w.isStringLiteral(r.moduleSpecifier)){let o=Oe(r.moduleSpecifier.text,a,s);o&&n.add(o);}if(w.isCallExpression(r)&&r.expression.kind===w.SyntaxKind.ImportKeyword&&r.arguments[0]&&w.isStringLiteral(r.arguments[0])){let o=Oe(r.arguments[0].text,a,s);o&&n.add(o);}se(r,t);};return t(e),[...n]}function Oe(e,a,s){if(!e.startsWith("."))return null;let n=I.resolve(a,e),t=I.relative(s,n).replace(/\\/g,"/");return !t||t.startsWith("..")?null:Ze(t)}function Ze(e){return e.replace(/\\/g,"/").replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/,"").replace(/\/index$/,"")}function Nt(e,a){let s=0,n=0,t=0,r=0,o=0,c=[],u=i=>{if(Wt(i)){let d=zt(i),g=Gt(e,i),m=qt(i);s++,n+=d,t+=g,r=Math.max(r,m);}w.isFunctionDeclaration(i)&&i.name&&c.push(i),se(i,u);};u(e);let p=a;for(let i of c){if(Ht(i))continue;let d=i.name?.text;if(!d)continue;Vt(p,d)<=1&&o++;}return {lines:a.split(/\r?\n/).length,functionsAnalyzed:s,totalComplexity:n,totalFunctionLength:t,maxNestingDepth:r,deadFunctionCount:o}}function zt(e){let a=1,s=n=>{switch(n.kind){case w.SyntaxKind.IfStatement:case w.SyntaxKind.ForStatement:case w.SyntaxKind.ForOfStatement:case w.SyntaxKind.ForInStatement:case w.SyntaxKind.WhileStatement:case w.SyntaxKind.DoStatement:case w.SyntaxKind.CaseClause:case w.SyntaxKind.CatchClause:case w.SyntaxKind.ConditionalExpression:a++;break;case w.SyntaxKind.BinaryExpression:{let t=n;(t.operatorToken.kind===w.SyntaxKind.AmpersandAmpersandToken||t.operatorToken.kind===w.SyntaxKind.BarBarToken||t.operatorToken.kind===w.SyntaxKind.QuestionQuestionToken)&&a++;break}}se(n,s);};return s(e),a}function qt(e){let a=0,s=(n,t)=>{let r=Kt(n)?t+1:t;a=Math.max(a,r),se(n,o=>s(o,r));};return s(e,0),Math.max(0,a-1)}function _t(e){let a=0,s=new Set,n=new Set,t=r=>{s.add(r),n.add(r);let o=e.get(r)??[];for(let c of o)e.has(c)&&(s.has(c)?n.has(c)&&a++:t(c));n.delete(r);};for(let r of e.keys())s.has(r)||t(r);return a}function Gt(e,a){let s=e.getLineAndCharacterOfPosition(a.getStart(e)).line;return e.getLineAndCharacterOfPosition(a.getEnd()).line-s+1}function Wt(e){return w.isFunctionDeclaration(e)||w.isMethodDeclaration(e)||w.isFunctionExpression(e)||w.isArrowFunction(e)||w.isConstructorDeclaration(e)}function Kt(e){return e.kind===w.SyntaxKind.IfStatement||e.kind===w.SyntaxKind.ForStatement||e.kind===w.SyntaxKind.ForOfStatement||e.kind===w.SyntaxKind.ForInStatement||e.kind===w.SyntaxKind.WhileStatement||e.kind===w.SyntaxKind.DoStatement||e.kind===w.SyntaxKind.SwitchStatement||e.kind===w.SyntaxKind.TryStatement||e.kind===w.SyntaxKind.CatchClause}function Ht(e){return w.canHaveModifiers(e)?!!w.getModifiers(e)?.some(s=>s.kind===w.SyntaxKind.ExportKeyword):false}function Vt(e,a){let s=new RegExp(`\\b${Qt(a)}\\b`,"g");return e.match(s)?.length??0}function Qt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ee(e){return Math.round(e*100)/100}function se(e,a){e.forEachChild(a);}var Jt=new Set([".tsx",".jsx",".ts",".js",".vue",".svelte",".html",".mdx",".json",".yml",".yaml"]),Zt=new Set(["stripe","posthog-js","posthog-node","@sentry/node","@sentry/browser","@sentry/react","next-auth","firebase","auth0","@auth0/auth0-react","@supabase/supabase-js","supabase","clerk","@clerk/clerk-js","@clerk/react"]),Yt=new Set(["welcome","home","click here","learn more","submit","cancel"]);async function De(e,a,s=300){let t=(await a.walkDir(e)).filter(g=>g.isFile),r=t.filter(g=>g.relPath.endsWith("package.json")&&!g.relPath.includes("node_modules")),o=[];for(let g of r)try{o.push(JSON.parse(await a.readTextFile(g.absPath)));}catch{}let c=an(o),u=[];for(let g of t){let m=Xt(g.relPath);if(!Jt.has(m))continue;if(!en(g.relPath)){let h=Be(g.relPath,c);h.length>0&&u.push(...h.map(k=>({...k,file:g.relPath})));continue}let y=Be(g.relPath,c);y.length>0&&u.push(...y.map(h=>({...h,file:g.relPath})));let l=await a.readTextFile(g.absPath);if(!l||l.length>512e3)continue;let f=tn(l);for(let h of f){let k=nn(h),v=sn(k,h);u.push({kind:k,value:h,file:g.relPath,weight:v});}/(featureFlag|FEATURE_FLAG|launchDarkly|isFeatureEnabled|flags\.)/.test(l)&&u.push({kind:"feature_flag",value:`flags in ${g.relPath}`,file:g.relPath,weight:2});}for(let g of o){let m=ln(g);for(let[y,l]of m)Zt.has(y)&&u.push({kind:"dependency",value:`${y}@${l}`,file:"package.json",weight:4});}let p=on(u).sort((g,m)=>m.weight-g.weight||g.value.localeCompare(m.value)),i=p.slice(0,s),d=rn(i);return {enabled:true,detectedFrameworks:c,evidenceCount:p.length,capped:p.length>i.length,topEvidence:i,unknownSignals:d}}function Xt(e){let a=e.lastIndexOf(".");return a===-1?"":e.slice(a).toLowerCase()}function en(e){let a=e.toLowerCase();return a.startsWith("pages/")||a.includes("/pages/")||a.startsWith("app/")||a.includes("/app/")||a.startsWith("components/")||a.includes("/components/")||a.startsWith("ui/")||a.includes("/ui/")||a.startsWith("views/")||a.includes("/views/")||a.includes("/routes")||a.startsWith("routes")||a.includes("/router")||a.startsWith("router")||a.startsWith("locales/")||a.includes("/locales/")||a.startsWith("i18n/")||a.includes("/i18n/")||a.endsWith(".html")||a.endsWith(".mdx")}function an(e){let a=new Set;for(let s of e){let n={...ye(s.dependencies),...ye(s.devDependencies)};n.next&&a.add("nextjs"),(n.nuxt||n.nuxt3)&&a.add("nuxt"),n.react&&a.add("react"),n.vue&&a.add("vue"),n.svelte&&a.add("svelte"),n["@angular/core"]&&a.add("angular");}return Array.from(a)}function Be(e,a){let s=[];if(a.includes("nextjs")){let n=e.match(/^(?:src\/)?(pages|app)\/(.+)\.(tsx|jsx|ts|js)$/);if(n){let t="/"+n[2].replace(/(^|\/)page$/i,"").replace(/(^|\/)route$/i,"").replace(/index$/i,"").replace(/\[(?:\.\.\.)?(.+?)\]/g,":$1").replace(/\/+/g,"/");t!=="/"&&t.endsWith("/")&&(t=t.slice(0,-1)),s.push({kind:"route",value:t||"/",weight:5});}}return (/(^|\/)(routes?|router)\.(ts|js|json)$/.test(e)||e.includes("/router/"))&&s.push({kind:"route",value:`route config: ${e}`,weight:3}),s}function tn(e){let a=[],s=/>\s*([A-Za-z0-9][^<>]{2,120}?)\s*</g;for(let o of e.matchAll(s)){let c=ae(o[1]??"");te(c)&&a.push(c);}let n=/<title>\s*([^<]{2,120})\s*<\/title>|title\s*[:=]\s*["'`](.{2,120}?)["'`]/g;for(let o of e.matchAll(n)){let c=ae((o[1]??o[2]??"").trim());te(c)&&a.push(c);}let t=/(?:aria-label|label|placeholder|alt)\s*=\s*["'`](.{2,120}?)["'`]/g;for(let o of e.matchAll(t)){let c=ae(o[1]??"");te(c)&&a.push(c);}let r=/:\s*["'`](.{2,140}?)["'`]\s*[,\n]/g;for(let o of e.matchAll(r)){let c=ae(o[1]??"");te(c)&&a.push(c);}return a}function nn(e){let a=e.toLowerCase();return /(pricing|plan|billing|subscription|trial|credit)/.test(a)||/(sign in|sign up|log in|register|invite|workspace|organization|sso|oauth)/.test(a)?"copy":/(dashboard|reports|settings|integrations|users|roles|permissions)/.test(a)?"heading":/(get started|start|scan|generate|export|run|deploy|upgrade|analy[sz]e)/.test(a)?"cta":/(overview|features|about|documentation|docs)/.test(a)?"title":/(menu|navigation|sidebar|breadcrumb)/.test(a)?"nav":"copy"}function sn(e,a){let s=a.toLowerCase();if(Yt.has(s))return 0;let n=1;return e==="route"&&(n+=4),e==="nav"&&(n+=3),e==="title"&&(n+=2),e==="heading"&&(n+=2),e==="cta"&&(n+=2),/(pricing|billing|subscription|auth|security|integration)/.test(s)&&(n+=2),/(dashboard|report|scan|workspace|project|repository)/.test(s)&&(n+=1),n}function on(e){let a=new Map;for(let s of e){let n=`${s.kind}::${s.value.toLowerCase()}`,t=a.get(n);(!t||s.weight>t.weight)&&a.set(n,s);}return Array.from(a.values()).filter(s=>s.weight>0)}function rn(e){let a=[],s=e.some(o=>/pricing|billing|subscription|trial|credit/i.test(o.value)),n=e.some(o=>/sign in|sign up|login|auth|sso|oauth|invite/i.test(o.value)),t=e.some(o=>/integration|webhook|api key|connector/i.test(o.value)),r=e.some(o=>o.kind==="route");return s||a.push("No pricing or billing evidence found."),n||a.push("No authentication or user access flow evidence found."),t||a.push("No integrations/connectors evidence found."),r||a.push("No route structure evidence found."),a}function ye(e){return !e||typeof e!="object"?{}:e}function ln(e){return Object.entries(ye(e.dependencies))}function ae(e){return e.replace(/\s+/g," ").trim()}function te(e){return !(!e||e.length<3||e.length>160||/^[0-9_./-]+$/.test(e)||/^(true|false|null|undefined)$/i.test(e)||/[<>{}]/.test(e)||/function\s*\(|=>|console\.|import\s+|export\s+/.test(e))}var cn=75e4;function j(e){return [...new Set(e)].sort((a,s)=>a.localeCompare(s))}function pn(e,a,s){if(!a)return;let n=a.trim();n&&e.push(`${n} (${s})`);}function he(e){let a=new Set;return e.filter(s=>{let n=s.lastIndexOf(" ("),t=n>0?s.slice(0,n).trim():s.trim();return a.has(t)?false:(a.add(t),true)})}function S(e,a,s){let n=[],t;for(;(t=a.exec(e))!==null;){let r=t.slice(1).find(o=>typeof o=="string"&&o.length>0);pn(n,r??t[0],s);}return n}function dn(e){let a=e.trim();if(/^@(?:yearly|monthly|weekly|daily|hourly|reboot)$/.test(a))return true;let s=/^(?:\*(?:\/\d+)?|\d+(?:[,\-]\d+)*(?:\/\d+)?|[?LW]|[\dLW]#\d)$/,n=a.split(/\s+/);return n.length!==5&&n.length!==6?false:n.every(t=>s.test(t))}function un(e,a){let s=[],n=/['"`]((?:[\d*\/,\-?LW#@A-Za-z]+[ \t]+){4,5}[\d*\/,\-?LW#@A-Za-z]+)['"`]/g,t;for(;(t=n.exec(e))!==null;){let r=t[1].trim();dn(r)&&s.push(`${r} (${a})`);}return s}var fn=new Set(["AED","AFN","ALL","AMD","ANG","AOA","ARS","AUD","AWG","AZN","BAM","BBD","BDT","BGN","BHD","BIF","BMD","BND","BOB","BRL","BSD","BTN","BWP","BYN","BZD","CAD","CDF","CHF","CLP","CNY","COP","CRC","CUP","CVE","CZK","DJF","DKK","DOP","DZD","EGP","ERN","ETB","EUR","FJD","FKP","GBP","GEL","GHS","GIP","GMD","GNF","GTQ","GYD","HKD","HNL","HRK","HTG","HUF","IDR","ILS","INR","IQD","IRR","ISK","JMD","JOD","JPY","KES","KGS","KHR","KMF","KPW","KRW","KWD","KYD","KZT","LAK","LBP","LKR","LRD","LSL","LYD","MAD","MDL","MGA","MKD","MMK","MNT","MOP","MRU","MUR","MVR","MWK","MXN","MYR","MZN","NAD","NGN","NIO","NOK","NPR","NZD","OMR","PAB","PEN","PGK","PHP","PKR","PLN","PYG","QAR","RON","RSD","RUB","RWF","SAR","SBD","SCR","SDG","SEK","SGD","SHP","SLE","SOS","SRD","SSP","STN","SVC","SYP","SZL","THB","TJS","TMT","TND","TOP","TRY","TTD","TWD","TZS","UAH","UGX","USD","UYU","UZS","VES","VND","VUV","WST","XAF","XCD","XOF","XPF","YER","ZAR","ZMW","ZWL"]);function mn(e){let a=new Set,s=/\b([A-Z]{3})\b/g,n;for(;(n=s.exec(e))!==null;){let t=n[1];fn.has(t)&&a.add(t);}return [...a]}var gn=new Set(["af-ZA","am-ET","ar-AE","ar-BH","ar-DZ","ar-EG","ar-IQ","ar-JO","ar-KW","ar-LB","ar-LY","ar-MA","ar-OM","ar-QA","ar-SA","ar-SY","ar-TN","ar-YE","az-AZ","be-BY","bg-BG","bn-BD","bn-IN","bs-BA","ca-ES","cs-CZ","cy-GB","da-DK","de-AT","de-CH","de-DE","de-LI","de-LU","el-CY","el-GR","en-AU","en-BZ","en-CA","en-CB","en-GB","en-GH","en-HK","en-IE","en-IN","en-JM","en-KE","en-MT","en-MY","en-NG","en-NZ","en-PH","en-SG","en-TT","en-US","en-ZA","en-ZW","es-AR","es-BO","es-CL","es-CO","es-CR","es-CU","es-DO","es-EC","es-ES","es-GT","es-HN","es-MX","es-NI","es-PA","es-PE","es-PR","es-PY","es-SV","es-US","es-UY","es-VE","et-EE","eu-ES","fa-IR","fi-FI","fil-PH","fo-FO","fr-BE","fr-CA","fr-CH","fr-FR","fr-LU","fr-MC","ga-IE","gl-ES","gu-IN","ha-NG","he-IL","hi-IN","hr-BA","hr-HR","hu-HU","hy-AM","id-ID","ig-NG","is-IS","it-CH","it-IT","ja-JP","ka-GE","kk-KZ","km-KH","kn-IN","ko-KR","ky-KG","lb-LU","lo-LA","lt-LT","lv-LV","mi-NZ","mk-MK","ml-IN","mn-MN","mr-IN","ms-BN","ms-MY","mt-MT","my-MM","nb-NO","ne-NP","nl-BE","nl-NL","nn-NO","or-IN","pa-IN","pl-PL","ps-AF","pt-BR","pt-PT","ro-MD","ro-RO","ru-RU","rw-RW","si-LK","sk-SK","sl-SI","so-SO","sq-AL","sr-BA","sr-ME","sr-RS","sv-FI","sv-SE","sw-KE","sw-TZ","ta-IN","ta-LK","te-IN","tg-TJ","th-TH","ti-ER","ti-ET","tk-TM","tr-TR","uk-UA","ur-IN","ur-PK","uz-UZ","vi-VN","yo-NG","zh-CN","zh-HK","zh-MO","zh-SG","zh-TW","zu-ZA"]);function yn(e){let a=new Set,s=/\b([a-z]{2}-[A-Z]{2})\b/g,n;for(;(n=s.exec(e))!==null;){let t=n[1];gn.has(t)&&a.add(t);}return [...a]}function hn(e){let a=new Set,s=/\b((?:Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)\/[A-Z][A-Za-z0-9_]+(?:\/[A-Z][A-Za-z0-9_]+)?)\b/g,n=/\b(UTC|GMT)([+-]\d{1,2}(?::?\d{2})?)?\b/g,t;for(;(t=s.exec(e))!==null;)a.add(t[1]);for(;(t=n.exec(e))!==null;)a.add(t[0]);return [...a]}function vn(e){let a=new Set,s=/\b(UTF-?8|UTF-?16(?:BE|LE)?|UTF-?32(?:BE|LE)?|ISO-8859-(?:1[0-5]?|[2-9])|US-ASCII|ASCII|Windows-125[0-8]|Shift[_-]?JIS|EUC-(?:JP|KR|CN)|Big5|GB2312|GBK|GB18030|KOI8-[RU]|ISO-2022-JP|Latin-?[1-9])\b/gi,n;for(;(n=s.exec(e))!==null;)a.add(n[1].toUpperCase());return [...a]}function kn(e){let a=e.split("/");return a.length===1?"root":a[0]==="packages"&&a.length>=2?a[1]:a[0]}var bn=new Set(["package-lock.json","pnpm-lock.yaml","yarn.lock","composer.lock","Gemfile.lock","Cargo.lock","poetry.lock","Pipfile.lock","packages.lock.json"]);function wn(e){let a=e.toLowerCase();return a.includes("postgres")?{kind:"sql",brand:"PostgreSQL",version:null,evidence:e}:a.includes("mysql")||a.includes("mariadb")?{kind:"sql",brand:"MySQL/MariaDB",version:null,evidence:e}:a.includes("mssql")||a.includes("sqlserver")?{kind:"sql",brand:"SQL Server",version:null,evidence:e}:a.includes("oracle")?{kind:"sql",brand:"Oracle",version:null,evidence:e}:a.includes("sqlite")?{kind:"sql",brand:"SQLite",version:null,evidence:e}:a.includes("mongodb")?{kind:"nosql",brand:"MongoDB",version:null,evidence:e}:a.includes("redis")?{kind:"nosql",brand:"Redis",version:null,evidence:e}:a.includes("cassandra")?{kind:"nosql",brand:"Cassandra",version:null,evidence:e}:a.includes("cosmosdb")||a.includes("@azure/cosmos")||a.includes("cosmos")?{kind:"nosql",brand:"CosmosDB",version:null,evidence:e}:a.includes("dynamodb")?{kind:"nosql",brand:"DynamoDB",version:null,evidence:e}:a.includes("neo4j")?{kind:"nosql",brand:"Neo4j",version:null,evidence:e}:a.includes("clickhouse")?{kind:"sql",brand:"ClickHouse",version:null,evidence:e}:a.includes("snowflake")?{kind:"sql",brand:"Snowflake",version:null,evidence:e}:a.includes("bigquery")?{kind:"sql",brand:"BigQuery",version:null,evidence:e}:a.includes("firestore")?{kind:"nosql",brand:"Firestore",version:null,evidence:e}:a.includes("cockroach")?{kind:"sql",brand:"CockroachDB",version:null,evidence:e}:a.includes("planetscale")?{kind:"sql",brand:"PlanetScale",version:null,evidence:e}:a.includes("supabase")?{kind:"sql",brand:"Supabase",version:null,evidence:e}:a.includes("tidb")?{kind:"sql",brand:"TiDB",version:null,evidence:e}:a.includes("couchdb")?{kind:"nosql",brand:"CouchDB",version:null,evidence:e}:a.includes("elasticsearch")||a.includes("opensearch")?{kind:"nosql",brand:"Elasticsearch",version:null,evidence:e}:a.includes("influxdb")?{kind:"nosql",brand:"InfluxDB",version:null,evidence:e}:a.includes("memcached")?{kind:"nosql",brand:"Memcached",version:null,evidence:e}:a.includes("cockroachdb")?{kind:"sql",brand:"CockroachDB",version:null,evidence:e}:null}async function J(e,a){let n=(await a.walkDir(e)).filter(r=>r.isFile).map(r=>r.absPath),t=[];for(let r of n)try{let o=I.relative(e,r).replace(/\\/g,"/"),c=await a.readTextFile(r);if(!c||c.length>cn)continue;t.push({relPath:o,content:c});}catch{}return t}async function Sn(e,a){let s=await J(e,a),n={environmentVariables:[],featureFlags:[],hiddenConfigFiles:[],dotEnvFiles:[],secretsInjectionPaths:[],containerEntrypoints:[],startupArguments:[],jvmFlags:[],threadPoolSettings:[]};for(let t of s)t.relPath.split("/").some(r=>r.startsWith("."))&&n.hiddenConfigFiles.push(t.relPath),/\.env(\.|$)/i.test(t.relPath)&&n.dotEnvFiles.push(t.relPath),n.environmentVariables.push(...S(t.content,/(?:process\.env\.([A-Z0-9_]{3,})|process\.env\[['"]([A-Z0-9_]{3,})['"]\]|System\.getenv\(['"]([A-Z0-9_]{3,})['"]\)|os\.environ\[['"]([A-Z0-9_]{3,})['"]\]|getenv\(['"]([A-Z0-9_]{3,})['"]\))/g,t.relPath)),n.featureFlags.push(...S(t.content,/\b(?:feature[_-]?flag|ff_|is[A-Z][A-Za-z0-9]+Enabled|launchdarkly|unleash)\b/gi,t.relPath)),n.secretsInjectionPaths.push(...S(t.content,/\b(?:vault|secrets?\/(?:mount|inject|path)|aws\/secretsmanager|gcp\/secretmanager)\b/gi,t.relPath)),n.containerEntrypoints.push(...S(t.content,/\b(?:ENTRYPOINT|CMD)\s+([^\n]+)/g,t.relPath)),n.jvmFlags.push(...S(t.content,/\b(-Xmx\S+|-Xms\S+|-XX:[^\s'"\]]+)/g,t.relPath)),n.threadPoolSettings.push(...S(t.content,/\b(?:thread[_-]?pool|max[_-]?threads|min[_-]?threads|worker[_-]?threads)\b[^\n]*/gi,t.relPath));return n.environmentVariables=j(n.environmentVariables),n.featureFlags=he(n.featureFlags),n.hiddenConfigFiles=[...new Set(n.hiddenConfigFiles)],n.dotEnvFiles=j(n.dotEnvFiles),n.secretsInjectionPaths=j(n.secretsInjectionPaths),n.containerEntrypoints=j(n.containerEntrypoints),n.startupArguments=j(n.startupArguments).slice(0,250),n.jvmFlags=j(n.jvmFlags),n.threadPoolSettings=j(n.threadPoolSettings),n}async function xn(e,a){let s=await J(e,a),n=[],t={databaseTechnologies:[],connectionStrings:[],connectionPoolSettings:[],replicationSettings:[],readReplicaSettings:[],failoverSettings:[],collationAndEncoding:[],queryTimeoutDefaults:[],manualIndexes:[],tables:[],views:[],storedProcedures:[],triggers:[],rowLevelSecurityPolicies:[],otherServices:[]};for(let o of s){let c=S(o.content,/\b(?:postgres(?:ql)?:\/\/[^\s'"`]+|mysql:\/\/[^\s'"`]+|mongodb(?:\+srv)?:\/\/[^\s'"`]+|redis:\/\/[^\s'"`]+|clickhouse:\/\/[^\s'"`]+|cockroachdb:\/\/[^\s'"`]+|snowflake:\/\/[^\s'"`]+)\b/gi,o.relPath);if(t.connectionStrings.push(...c),!bn.has(I.basename(o.relPath))){let p=[...S(o.content,/\b(?:postgres|postgresql|mysql|mariadb|mssql|sqlserver|oracle|sqlite|mongodb|redis|cassandra|cosmosdb|cosmos|dynamodb|neo4j|clickhouse|snowflake|bigquery|firestore|cockroach|cockroachdb|planetscale|supabase|tidb|couchdb|elasticsearch|opensearch|influxdb|memcached)\b/gi,o.relPath),...c];for(let i of p){let d=wn(i);d&&n.push(d);}}t.replicationSettings.push(...S(o.content,/\b(?:replication|cluster|replicaSet)\b[^\n]*/gi,o.relPath)),t.readReplicaSettings.push(...S(o.content,/\b(?:read[_-]?replica|reader[_-]?endpoint)\b[^\n]*/gi,o.relPath)),t.failoverSettings.push(...S(o.content,/\b(?:failover|multi[_-]?az|secondary[_-]?host)\b[^\n]*/gi,o.relPath)),t.collationAndEncoding.push(...S(o.content,/\b(UTF-?8|UTF-?16(?:BE|LE)?|UTF-?32(?:BE|LE)?|Unicode|ASCII|US-ASCII|ISO-8859-(?:1[0-5]?|[2-9])|Windows-125[0-8]|Shift[_-]?JIS|EUC-(?:JP|KR|CN)|Big5|GB2312|GBK|GB18030|KOI8-[RU]|Latin-?[1-9]|SQL_Latin1_General_CP1_C[IS]_AS|Latin1_General_C[IS]_A[IS])\b/gi,o.relPath)),t.manualIndexes.push(...S(o.content,/\bcreate\s+(?:unique\s+)?index\s+[^;\n]+/gi,o.relPath)),t.tables.push(...S(o.content,/\bcreate\s+table\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.views.push(...S(o.content,/\bcreate\s+view\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.storedProcedures.push(...S(o.content,/\bcreate\s+(?:or\s+replace\s+)?procedure\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.triggers.push(...S(o.content,/\bcreate\s+trigger\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.rowLevelSecurityPolicies.push(...S(o.content,/\b(?:row\s+level\s+security|create\s+policy|alter\s+table\s+.*\s+enable\s+row\s+level\s+security)\b[^;\n]*/gi,o.relPath)),t.otherServices.push(...S(o.content,/\b(?:redis:\/\/[^\s'"`]+|amqp:\/\/[^\s'"`]+|kafka:\/\/[^\s'"`]+|elasticsearch:\/\/[^\s'"`]+)\b/gi,o.relPath));}let r=new Map;for(let o of n){if(/\.xml\b/i.test(o.evidence))continue;let c=`${o.kind}:${o.brand}`;r.has(c)||r.set(c,o);}return t.databaseTechnologies=[...r.values()].sort((o,c)=>o.brand.localeCompare(c.brand)),t.connectionStrings=j(t.connectionStrings),t.connectionPoolSettings=j(t.connectionPoolSettings),t.replicationSettings=j(t.replicationSettings),t.readReplicaSettings=j(t.readReplicaSettings),t.failoverSettings=j(t.failoverSettings),t.collationAndEncoding=he(t.collationAndEncoding),t.queryTimeoutDefaults=j(t.queryTimeoutDefaults),t.manualIndexes=j(t.manualIndexes),t.tables=j(t.tables),t.views=j(t.views),t.storedProcedures=j(t.storedProcedures),t.triggers=j(t.triggers),t.rowLevelSecurityPolicies=j(t.rowLevelSecurityPolicies),t.otherServices=j(t.otherServices),t}function jn(e,a){let s=e.toLowerCase(),n=s.endsWith(".json")?"json":s.endsWith(".yaml")?"yaml":s.endsWith(".yml")?"yml":null;if(!n)return null;let t=/\bopenapi\s*[:=]\s*['"]?3\./i.test(a)||/\bswagger\s*[:=]\s*['"]?2\.0/i.test(a)||/"openapi"\s*:\s*"3\./i.test(a),r=/(openapi|swagger).*(\.ya?ml|\.json)$/i.test(s)||/\/api-docs\b/i.test(s);if(!t&&!r)return null;let o=a.match(/\bopenapi\s*[:=]\s*['"]?([^'"\s,]+)/i)?.[1]??a.match(/\bswagger\s*[:=]\s*['"]?([^'"\s,]+)/i)?.[1]??null,c=a.match(/\btitle\s*[:=]\s*['"]([^'"]+)['"]/i)?.[1]??a.match(/\btitle\s*[:=]\s*([^\n#]+)/i)?.[1]?.trim()??a.match(/"title"\s*:\s*"([^"]+)"/i)?.[1]??null,u=a.match(/(^|\n)\s*\/[^\n:]+:\s*(get|post|put|patch|delete|options|head)/gim)?.length??a.match(/"\/[^"]+"\s*:\s*\{/g)?.length??null;return {path:e,format:n,version:o,title:c,endpointCount:u}}function Cn(e){let a=e.toLowerCase();return !!(a==="localhost"||a==="127.0.0.1"||a==="::1"||a==="0.0.0.0"||/^192\.168\./.test(a)||/^10\./.test(a)||/^172\.(1[6-9]|2\d|3[01])\./.test(a)||!a.includes(".")||/^(example|test|localhost|local|internal)\b/.test(a))}function Rn(e){return e.replace(/[\u0000-\u001F\u007F-\u009F\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g,"").trim()}async function Tn(e,a){let s=await J(e,a),n=[],t={integrations:[],openApiSpecifications:[],webhookUrls:[],callbackEndpoints:[],apiVersionPins:[],tokenExpirationPolicies:[],rateLimitOverrides:[],customHeaders:[],corsPolicies:[],oauthScopes:[],apiTokens:[]};for(let o of s){let c=jn(o.relPath,o.content);c&&t.openApiSpecifications.push(c);let u=/\bhttps?:\/\/[^\s'"`]+/gi,p;for(;(p=u.exec(o.content))!==null;){let i=p[0].replace(/[,;)\]}"'`]+$/,""),d=Rn(i);if(!d.startsWith("http"))continue;let g;try{g=new URL(d).hostname;}catch{continue}if(Cn(g))continue;let m=d.match(/\/(v\d+(?:\.\d+)?)\b/i),y=d.match(/[?&]([a-zA-Z0-9_.-]+)=/g)?.map(l=>l.replace(/[?&=]/g,""))??[];n.push({provider:g,endpoint:d,version:m?m[1]:null,parameters:y,configOptions:S(o.content,/\b(?:baseUrl|apiUrl|endpoint|timeout|retries|apiVersion)\b[^\n]*/gi,o.relPath),authHints:S(o.content,/\b(?:api[_-]?key|bearer\s+[a-z0-9_.-]+|client[_-]?secret|oauth)\b[^\n]*/gi,o.relPath),files:[o.relPath]});}t.webhookUrls.push(...S(o.content,/\bhttps?:\/\/[^\s'"`]*(?:webhook|hooks?)[^\s'"`]*/gi,o.relPath)),t.callbackEndpoints.push(...S(o.content,/\bhttps?:\/\/[^\s'"`]*(?:callback|redirect_uri)[^\s'"`]*/gi,o.relPath)),t.apiVersionPins.push(...S(o.content,/\bapi[_-]?version\b[^\n]*/gi,o.relPath)),t.tokenExpirationPolicies.push(...S(o.content,/\b(?:token[_-]?expiry|expires[_-]?in|refresh[_-]?token[_-]?ttl)\b[^\n]*/gi,o.relPath)),t.apiTokens.push(...S(o.content,/\b(?:api[_-]?token|access[_-]?token|bearer[_-]?token)\b[^\n]*/gi,o.relPath));}let r=new Map;for(let o of n){let c=o.endpoint,u=r.get(c);u?(u.files=j([...u.files,...o.files]),u.parameters=j([...u.parameters,...o.parameters]),u.configOptions=j([...u.configOptions,...o.configOptions]),u.authHints=j([...u.authHints,...o.authHints])):r.set(c,{...o,parameters:j(o.parameters),configOptions:j(o.configOptions),authHints:j(o.authHints),files:[...o.files]});}return t.integrations=[...r.values()].filter(o=>o.files.some(c=>!Ye.has(I.extname(c).toLowerCase()))).filter(o=>o.provider!=="www.w3.org").filter(o=>!o.files.some(c=>/\.(js|xml)$/i.test(c))).sort((o,c)=>o.provider.localeCompare(c.provider)),t.openApiSpecifications=[...new Map(t.openApiSpecifications.map(o=>[o.path,o])).values()].sort((o,c)=>o.path.localeCompare(c.path)),t.webhookUrls=j(t.webhookUrls),t.callbackEndpoints=j(t.callbackEndpoints),t.apiVersionPins=j(t.apiVersionPins),t.tokenExpirationPolicies=j(t.tokenExpirationPolicies),t.rateLimitOverrides=j(t.rateLimitOverrides),t.customHeaders=j(t.customHeaders),t.corsPolicies=j(t.corsPolicies),t.oauthScopes=j(t.oauthScopes),t.apiTokens=he(t.apiTokens),t}var Ye=new Set([".md",".mdx",".markdown",".txt",".rst",".adoc",".asciidoc",".html",".htm",".pdf",".docx",".doc",".rtf"]);async function Pn(e,a){let n=(await J(e,a)).filter(r=>{let o=I.extname(r.relPath).toLowerCase();return !Ye.has(o)}),t={implicitTimeouts:[],defaultPaginationSize:[],implicitRetryLogic:[],defaultLocale:[],defaultCurrency:[],implicitTimezone:[],defaultCharacterEncoding:[],sessionStores:[],distributedLocks:[],jobSchedulers:[],idempotencyKeys:[],rateLimitingCounters:[],circuitBreakerState:[],abTestToggles:[],regionalEnablementRules:[],betaAccessGroups:[],licensingEnforcementLogic:[],killSwitches:[],connectorRetryLogic:[],apiPollingIntervals:[],fieldMappings:[],schemaRegistryRules:[],deadLetterQueueBehavior:[],dataMaskingRules:[],transformationLogic:[],timezoneHandling:[],encryptionSettings:[],hardcodedSecretSignals:[]};for(let r of n){t.defaultLocale.push(...yn(r.content)),t.defaultCurrency.push(...mn(r.content)),t.implicitTimezone.push(...hn(r.content)),t.defaultCharacterEncoding.push(...vn(r.content)),t.sessionStores.push(...S(r.content,/\b(?:sessionStore|redisStore|memoryStore)\b[^\n]*/gi,r.relPath)),t.distributedLocks.push(...S(r.content,/\b(?:distributed[_-]?lock|redlock|mutex)\b[^\n]*/gi,r.relPath));for(let o of un(r.content,r.relPath)){let c=kn(r.relPath);t.jobSchedulers.push(`[${c}] ${o}`);}t.idempotencyKeys.push(...S(r.content,/\b(?:idempotency[_-]?key|Idempotency-Key)\b[^\n]*/gi,r.relPath)),t.circuitBreakerState.push(...S(r.content,/\b(?:circuit[_-]?breaker|half[_-]?open|open[_-]?state)\b[^\n]*/gi,r.relPath)),t.abTestToggles.push(...S(r.content,/\b(?:a\/b|ab[_-]?test|experiment[_-]?flag)\b[^\n]*/gi,r.relPath)),t.regionalEnablementRules.push(...S(r.content,/\b(?:region[_-]?enabled|geo[_-]?fence|country[_-]?allow)\b[^\n]*/gi,r.relPath)),t.betaAccessGroups.push(...S(r.content,/\b(?:beta[_-]?users?|early[_-]?access|allowlist)\b[^\n]*/gi,r.relPath)),t.licensingEnforcementLogic.push(...S(r.content,/\b(?:license[_-]?key|entitlement|plan[_-]?check)\b[^\n]*/gi,r.relPath)),t.killSwitches.push(...S(r.content,/\b(?:kill[_-]?switch|disable[_-]?all|emergency[_-]?stop)\b[^\n]*/gi,r.relPath)),t.connectorRetryLogic.push(...S(r.content,/\b(?:connector|integration)\b[^\n]*(?:retry|backoff)/gi,r.relPath)),t.apiPollingIntervals.push(...S(r.content,/\b(?:poll(?:ing)?[_-]?interval|sync[_-]?interval)\b[^\n]*/gi,r.relPath)),t.fieldMappings.push(...S(r.content,/\b(?:field[_-]?mapping|mapFields?|column[_-]?map)\b[^\n]*/gi,r.relPath)),t.schemaRegistryRules.push(...S(r.content,/\b(?:schema[_-]?registry|avro|protobuf)\b[^\n]*/gi,r.relPath)),t.deadLetterQueueBehavior.push(...S(r.content,/\b(?:dead[_-]?letter|dlq)\b[^\n]*/gi,r.relPath)),t.dataMaskingRules.push(...S(r.content,/\b(?:data[_-]?mask|redact|pii[_-]?mask)\b[^\n]*/gi,r.relPath)),t.timezoneHandling.push(...S(r.content,/\b(?:convertTimezone|tz\(|moment\.tz|DateTimeZone)\b[^\n]*/gi,r.relPath)),t.encryptionSettings.push(...S(r.content,/(aes-(?:128|192|256)-(?:gcm|cbc|ctr|cfb8?|ofb|ecb|ccm|ocb|wrap(?:-pad)?)|chacha20-poly1305|des-ede3?(?:-(?:cbc|cfb8?|ofb))?|bf-(?:cbc|cfb|ecb|ofb)|aria-(?:128|192|256)-(?:gcm|cbc|ctr|cfb8?|ofb|ecb|ccm)|camellia-(?:128|192|256)-(?:cbc|cfb8?|ofb|ecb)|seed-cbc|rc4(?:-(?:40|hmac-md5))?|rc2-(?:(?:40|64|128)-)?cbc)/gi,r.relPath)),t.hardcodedSecretSignals.push(...S(r.content,/\b(?:password|passwd|connectionString|api[_-]?key|secret)\b\s*[:=]\s*['"][^'"]{4,}['"]/gi,r.relPath));}return Object.keys(t).forEach(r=>{t[r]=j(t[r]);}),t}async function An(e,a){let s=await a.walkDir(e),n=s.filter(o=>o.isFile&&/favicon/i.test(o.name)),t=s.filter(o=>o.isFile&&/logo/i.test(o.name)),r=[];for(let o of n.slice(0,10))try{let c=await a.readTextFile(o.absPath);if(!c)continue;let u=Buffer.from(c).toString("base64");r.push({path:o.relPath,base64:u.slice(0,1e4)});}catch{}return {faviconFiles:r,productLogos:j(t.map(o=>o.relPath))}}async function En(e){let a=new d;try{let n=(await a.walkDir(e)).find(r=>r.isFile&&/favicon/i.test(r.name));if(!n)return null;let t=await a.readTextFile(n.absPath);return t?Buffer.from(t).toString("base64").slice(0,1e4):null}catch{return null}}async function In(e,a){let s=await J(e,a),n=new Set,t=new Set,r=[],o=[];for(let c of s)/package(-lock)?\.json$|pnpm-lock\.yaml$|poetry\.lock$|pom\.xml$/i.test(c.relPath)&&(c.content.match(/"([@a-zA-Z0-9_.\/-]+)"\s*:/g)??[]).forEach(p=>t.add(p.replace(/["\s:]/g,""))),/package\.json$/i.test(c.relPath)&&(c.content.match(/"([@a-zA-Z0-9_.\/-]+)"\s*:\s*"[~^0-9*><=.-]+"/g)??[]).forEach(p=>{let i=p.split(":")[0]?.replace(/"/g,"").trim();i&&n.add(i);}),r.push(...S(c.content,/\b(?:CVE-\d{4}-\d{4,}|critical vulnerability|high severity)\b[^\n]*/gi,c.relPath)),/package(-lock)?\.json$|pnpm-lock\.yaml$|yarn\.lock$|poetry\.lock$|pom\.xml$|build\.gradle(\.kts)?$|Cargo\.(toml|lock)$|composer\.(json|lock)$|requirements\.txt$|\.csproj$|\.nuspec$/i.test(c.relPath)&&o.push(...S(c.content,/\b(?:GPL-3\.0|AGPL|SSPL|BUSL|source[- ]available)\b[^\n]*/gi,c.relPath));return {directDependencies:n.size,transitiveDependencies:Math.max(t.size,n.size),knownVulnerabilities:j(r),licenseRisks:j(o)}}var Fn={team:[6,5,4,3.5],business:[15,12,10,8]},Ne=[0,25,100,300,500],Wn=10;function Kn(e,a){let s=Fn[a],n=0,t=[];for(let r=0;r<4;r++){let o=Ne[r],c=r===3?1/0:Ne[r+1];if(e>o){let u=Math.min(e,c)-o;n+=u*s[r],t.push({cnt:u,rate:s[r]});}}return {total:n,lines:t}}async function Xe(e){let{rootDir:a,opts:s,scanners:n,maxPrivacyMode:t,allProjects:r,solutions:o,projectsByPath:c,fileCache:u,progress:p,extended:i}=e;if(n===false){i.standards=Fe(r,i);return}let d={platformMatrix:!t,serviceDependencies:!t,breakingChangeExposure:!t,buildDeploy:!t,tsModernity:!t,fileHotspots:!t,architecture:!t,codeQuality:!t,runtimeConfiguration:!t,apiSurface:!t,operationalResilience:!t},g=[...d.platformMatrix&&n?.platformMatrix?.enabled!==false?[{id:"platform",label:"Platform matrix"}]:[],...n?.toolingInventory?.enabled!==false?[{id:"tooling",label:"Tooling inventory"}]:[],...d.serviceDependencies&&n?.serviceDependencies?.enabled!==false?[{id:"services",label:"Service dependencies"}]:[],...d.breakingChangeExposure&&n?.breakingChangeExposure?.enabled!==false?[{id:"breaking",label:"Breaking change exposure"}]:[],...n?.securityPosture?.enabled!==false?[{id:"security",label:"Security posture"}]:[],...d.buildDeploy&&n?.buildDeploy?.enabled!==false?[{id:"build",label:"Build & deploy analysis"}]:[],...d.tsModernity&&n?.tsModernity?.enabled!==false?[{id:"ts",label:"TypeScript modernity"}]:[],...d.fileHotspots&&n?.fileHotspots?.enabled!==false?[{id:"hotspots",label:"File hotspots"}]:[],...n?.dependencyGraph?.enabled!==false?[{id:"depgraph",label:"Dependency graph"}]:[],...n?.dependencyRisk?.enabled!==false?[{id:"deprisk",label:"Dependency risk"}]:[],...d.architecture&&n?.architecture?.enabled!==false?[{id:"architecture",label:"Architecture layers"}]:[],...d.codeQuality&&n?.codeQuality?.enabled!==false?[{id:"codequality",label:"Code quality metrics"}]:[],...!t&&(s.uiPurpose||n?.uiPurpose?.enabled===true)?[{id:"uipurpose",label:"UI purpose evidence"}]:[],...d.runtimeConfiguration&&n?.runtimeConfiguration?.enabled!==false?[{id:"runtimecfg",label:"Runtime configuration"}]:[],...n?.dataStores?.enabled!==false?[{id:"datastores",label:"Data stores & schema"}]:[],...d.apiSurface&&n?.apiSurface?.enabled!==false?[{id:"apisurface",label:"API integrations"}]:[],...d.operationalResilience&&n?.operationalResilience?.enabled!==false?[{id:"resilience",label:"Operational resilience"}]:[],...n?.assetBranding?.enabled!==false?[{id:"branding",label:"Branding assets"}]:[],...n?.ossGovernance?.enabled!==false?[{id:"ossgov",label:"OSS governance"}]:[]];for(let l of g)p.insertStepBefore("drift",l);let m=[];if(d.platformMatrix&&n?.platformMatrix?.enabled!==false&&(p.startStep("platform"),m.push(Ja(a,u).then(l=>{i.platformMatrix=l;let f=l.nativeModules.length,h=l.dockerBaseImages.length,k=[];f>0&&k.push(`${f} native`),h>0&&k.push(`${h} docker`),p.completeStep("platform",k.join(", ")||"clean",f+h);}))),n?.toolingInventory?.enabled!==false&&(p.startStep("tooling"),m.push(Promise.resolve().then(()=>{i.toolingInventory=ot(r);let l=Object.values(i.toolingInventory).reduce((f,h)=>f+h.length,0);p.completeStep("tooling",`${l} tool${l!==1?"s":""} mapped`,l);}))),d.serviceDependencies&&n?.serviceDependencies?.enabled!==false&&(p.startStep("services"),m.push(Promise.resolve().then(()=>{i.serviceDependencies=Ct(r);let l=Object.values(i.serviceDependencies).reduce((f,h)=>f+h.length,0);p.completeStep("services",`${l} service${l!==1?"s":""} detected`,l);}))),d.breakingChangeExposure&&n?.breakingChangeExposure?.enabled!==false&&(p.startStep("breaking"),m.push(Promise.resolve().then(async()=>{i.breakingChangeExposure=await kt(r,a,u);let l=i.breakingChangeExposure,f=l.deprecatedPackages.length+l.legacyPolyfills.length;p.completeStep("breaking",f>0?`${l.deprecatedPackages.length} deprecated, ${l.legacyPolyfills.length} polyfills`:"none found",f);}))),n?.securityPosture?.enabled!==false&&(p.startStep("security"),m.push(xt(a,u).then(l=>{i.securityPosture=l;let f=l.lockfilePresent?`lockfile \u2714${l.gitignoreCoversEnv?" \xB7 .env \u2714":" \xB7 .env \u2716"}`:"no lockfile";p.completeStep("security",f);}))),d.buildDeploy&&n?.buildDeploy?.enabled!==false&&(p.startStep("build"),m.push(dt(a,u).then(l=>{i.buildDeploy=l;let f=[];l.ci.length>0&&f.push(l.ci.join(", ")),l.docker.dockerfileCount>0&&f.push(`${l.docker.dockerfileCount} Dockerfile${l.docker.dockerfileCount!==1?"s":""}`),p.completeStep("build",f.join(" \xB7 ")||"none detected");}))),d.tsModernity&&n?.tsModernity?.enabled!==false&&(p.startStep("ts"),m.push(ut(a,u).then(l=>{i.tsModernity=l;let f=[];l.typescriptVersion&&f.push(`v${l.typescriptVersion}`),l.strict===true&&f.push("strict"),l.moduleType&&f.push(l.moduleType.toUpperCase()),p.completeStep("ts",f.join(" \xB7 ")||"no tsconfig");}))),d.fileHotspots&&n?.fileHotspots?.enabled!==false&&(p.startStep("hotspots"),m.push(wt(a,u).then(l=>{i.fileHotspots=l,p.completeStep("hotspots",`${l.totalFiles} files`,l.totalFiles);}))),n?.dependencyGraph?.enabled!==false&&(p.startStep("depgraph"),m.push(nt(a,u).then(l=>{i.dependencyGraph=l;let f=l.lockfileType?`${l.lockfileType} \xB7 ${l.totalUnique} unique`:"no lockfile";p.completeStep("depgraph",f,l.totalUnique);}))),d.codeQuality&&n?.codeQuality?.enabled!==false&&(p.startStep("codequality"),m.push(Ot(a,u).then(l=>{i.codeQuality=l;let f=[];f.push(`${l.filesAnalyzed} files`),f.push(`${l.functionsAnalyzed} functions`),l.circularDependencies>0&&f.push(`${l.circularDependencies} cycles`),p.completeStep("codequality",f.join(" \xB7 "),l.functionsAnalyzed);}))),d.runtimeConfiguration&&n?.runtimeConfiguration?.enabled!==false&&(p.startStep("runtimecfg"),m.push(Sn(a,u).then(l=>{i.runtimeConfiguration=l;let f=l.environmentVariables.length+l.featureFlags.length+l.dotEnvFiles.length;p.completeStep("runtimecfg",`${f} runtime signals`,f);}))),n?.dataStores?.enabled!==false&&(p.startStep("datastores"),m.push(xn(a,u).then(l=>{i.dataStores=l;let f=l.databaseTechnologies.length+l.tables.length+l.views.length;p.completeStep("datastores",`${l.databaseTechnologies.length} engines \xB7 ${l.tables.length} tables`,f);}))),d.apiSurface&&n?.apiSurface?.enabled!==false&&(p.startStep("apisurface"),m.push(Tn(a,u).then(l=>{i.apiSurface=l;let f=l.integrations.length+l.webhookUrls.length;p.completeStep("apisurface",`${l.integrations.length} integrations`,f);}))),d.operationalResilience&&n?.operationalResilience?.enabled!==false&&(p.startStep("resilience"),m.push(Pn(a,u).then(l=>{i.operationalResilience=l;let f=l.killSwitches.length;p.completeStep("resilience",`${f} resilience signals`,f);}))),n?.assetBranding?.enabled!==false&&(p.startStep("branding"),m.push(An(a,u).then(l=>{i.assetBranding=l;let f=l.faviconFiles.length+l.productLogos.length;p.completeStep("branding",`${l.faviconFiles.length} favicons \xB7 ${l.productLogos.length} logos`,f);}))),n?.ossGovernance?.enabled!==false&&(p.startStep("ossgov"),m.push(In(a,u).then(l=>{i.ossGovernance=l;let f=l.directDependencies+l.knownVulnerabilities.length+l.licenseRisks.length;p.completeStep("ossgov",`${l.directDependencies} direct deps`,f);}))),n?.dependencyRisk?.enabled!==false&&(p.startStep("deprisk"),m.push(Promise.resolve().then(()=>{i.dependencyRisk=Xa(r);let l=i.dependencyRisk,f=[];l.deprecatedPackages.length>0&&f.push(`${l.deprecatedPackages.length} deprecated`),l.nativeModulePackages.length>0&&f.push(`${l.nativeModulePackages.length} native`),p.completeStep("deprisk",f.join(", ")||"low risk");}))),await Promise.all(m),!t&&n?.uiPurpose?.enabled!==false){p.startStep("uipurpose"),i.uiPurpose=await De(a,u);let l=i.uiPurpose,f=[`${l.topEvidence.length} evidence`,...l.capped?["capped"]:[]].join(" \xB7 ");p.completeStep("uipurpose",f,l.topEvidence.length),await Promise.all(r.map(async h=>{let k=I.join(a,h.path),v=await De(k,u,150);v.topEvidence.length>0&&(h.uiPurpose=Sa$1(v));}));}if(await Promise.all(r.map(async l=>{let f=I.join(a,l.path),h=await En(f);h&&(l.faviconBase64=h);})),d.architecture&&n?.architecture?.enabled!==false){p.startStep("architecture"),i.architecture=await Je(a,r,i.toolingInventory,i.serviceDependencies,u);let l=i.architecture,f=l.layers.filter(h=>h.fileCount>0).length;await Promise.all(r.map(async h=>{h.architectureMermaid=await Ut(a,h,l.archetype,u),h.architecture=await Mt(a,h,u);}));for(let h of o){let v=h.projectPaths.map(b=>c.get(b)??c.get(I.dirname(b).replace(/\\/g,"/"))).filter(b=>!!b).map(b=>b.architecture).filter(b=>!!b);v.length>0&&(h.architecture=$t(v));}p.completeStep("architecture",`${l.archetype} \xB7 ${f} layer${f!==1?"s":""} \xB7 ${l.totalClassified} files`,f);}i.standards=Fe(r,i);let y=0;i.fileHotspots&&(y+=i.fileHotspots.totalFiles),i.securityPosture&&(y+=1),i.tsModernity?.typescriptVersion&&(y+=1),i.dependencyGraph?.lockfileType&&(y+=1),i.buildDeploy&&(y+=i.buildDeploy.docker.dockerfileCount,y+=i.buildDeploy.ci.length),i.codeQuality&&(y+=i.codeQuality.filesAnalyzed),i.uiPurpose&&(y+=i.uiPurpose.topEvidence.length),i.runtimeConfiguration&&(y+=i.runtimeConfiguration.hiddenConfigFiles.length),i.dataStores&&(y+=i.dataStores.databaseTechnologies.length+i.dataStores.tables.length),i.apiSurface&&(y+=i.apiSurface.integrations.length),i.operationalResilience&&(y+=i.operationalResilience.implicitTimeouts.length),i.assetBranding&&(y+=i.assetBranding.faviconFiles.length+i.assetBranding.productLogos.length),i.ossGovernance&&(y+=i.ossGovernance.directDependencies),y>0&&e.addFilesScanned(y);}var Qn=Xe;async function Jn(e,a){return Za$1(e,a,Xe)}export{ot as A,dt as B,ut as C,kt as D,wt as E,xt as F,Ct as G,Ut as H,Mt as I,$t as J,Je as K,Ot as L,De as M,Sn as N,xn as O,Tn as P,Pn as Q,An as R,En as S,In as T,Fn as U,Ne as V,Wn as W,Kn as X,Qn as Y,Jn as Z,Y as a,D as b,X as c,H as d,le as e,de as f,ce as g,Ce as h,ue as i,la as j,x as k,fa as l,G as m,pe as n,ya as o,Ta as p,Pa as q,$n as r,Na as s,Fe as t,Ka as u,Ln as v,On as w,Ja as x,Xa as y,nt as z};
323
+ `)}async function Ut(e,a,s,n){let t=I.resolve(e,a.path||"."),r=await He(t,n),o=new Set;for(let p of r){let i=Ve(p,s);i&&o.add(i.layer);}let u=["presentation","routing","middleware","services","domain","data-access","infrastructure","config","shared","testing"].filter(p=>o.has(p));return Ft(u)}async function Mt(e,a,s){let n=I.resolve(e,a.path||".");return Je(n,[a],void 0,void 0,s)}function $t(e){if(e.length===0)return {archetype:"unknown",archetypeConfidence:0,layers:[],totalClassified:0,unclassified:0};if(e.length===1)return e[0];let a="unknown",s=0;for(let u of e)(u.archetypeConfidence>s||u.archetypeConfidence===s&&u.archetype!=="monorepo")&&(a=u.archetype,s=u.archetypeConfidence);let n=new Map;for(let u of e)for(let p of u.layers){let i=n.get(p.layer);if(!i)n.set(p.layer,{...p,packages:[...p.packages],techStack:[...p.techStack],services:[...p.services]});else {i.fileCount+=p.fileCount;let d=new Set(i.packages.map(f=>f.name));for(let f of p.packages)d.has(f.name)||(i.packages.push(f),d.add(f.name));let g=new Set(i.techStack.map(f=>f.package));for(let f of p.techStack)g.has(f.package)||(i.techStack.push(f),g.add(f.package));let m=new Set(i.services.map(f=>f.package));for(let f of p.services)m.has(f.package)||(i.services.push(f),m.add(f.package));let{score:y,riskLevel:l}=Qe(i.packages);i.driftScore=y,i.riskLevel=l;}}let t={presentation:0,routing:1,middleware:2,services:3,domain:4,"data-access":5,infrastructure:6,config:7,shared:8,testing:9},r=[...n.values()].sort((u,p)=>(t[u.layer]??99)-(t[p.layer]??99)),o=e.reduce((u,p)=>u+p.totalClassified,0),c=e.reduce((u,p)=>u+p.unclassified,0);return {archetype:a,archetypeConfidence:s,layers:r,totalClassified:o,unclassified:c}}async function Je(e,a,s,n,t){let{archetype:r,confidence:o}=Tt(a),c=await He(e,t),u=[],p=0;for(let k of c){let v=Ve(k,r);v?u.push(v):p++;}let i=new Map;for(let k of a)for(let v of k.dependencies)i.has(v.package)||i.set(v.package,v);let d=new Map;for(let[k]of i){let v=ge[k];v&&(d.has(v)||d.set(v,new Set),d.get(v).add(k));}let{layerTooling:g,layerServices:m}=It(s,n,d),y=["routing","middleware","services","domain","data-access","infrastructure","presentation","config","testing","shared"],l=new Map;for(let k of u)l.set(k.layer,(l.get(k.layer)??0)+1);let f=[];for(let k of y){let v=l.get(k)??0,b=d.get(k)??new Set,C=g.get(k)??[],R=m.get(k)??[];if(v===0&&b.size===0&&C.length===0&&R.length===0)continue;let P=[];for(let re of b){let U=i.get(re);U&&P.push({name:U.package,version:U.resolvedVersion,latestStable:U.latestStable,majorsBehind:U.majorsBehind,drift:U.drift});}let{score:E,riskLevel:oe}=Qe(P);f.push({layer:k,fileCount:v,driftScore:E,riskLevel:oe,techStack:C,services:R,packages:P});}let h={presentation:0,routing:1,middleware:2,services:3,domain:4,"data-access":5,infrastructure:6,config:7,shared:8,testing:9};return f.sort((k,v)=>(h[k.layer]??99)-(h[v.layer]??99)),{archetype:r,archetypeConfidence:o,layers:f,totalClassified:u.length,unclassified:p}}var Le=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Lt={filesAnalyzed:0,functionsAnalyzed:0,avgCyclomaticComplexity:0,avgFunctionLength:0,maxNestingDepth:0,godFiles:[],circularDependencies:0,deadCodePercent:0};async function Ot(e,a){let s=await Dt(e,a);if(s.length===0)return {...Lt};let n=0,t=0,r=0,o$1=0,c=0,u=[],p=new Map;for(let g of s){let m="";try{m=a?await a.readTextFile(g):await o(g);}catch{continue}if(!m.trim())continue;let y=Ze(I.relative(e,g)),l=w.createSourceFile(g,m,w.ScriptTarget.Latest,true),f=Bt(l,I.dirname(g),e);p.set(y,f);let h=Nt(l,m);n+=h.functionsAnalyzed,t+=h.totalComplexity,r+=h.totalFunctionLength,o$1=Math.max(o$1,h.maxNestingDepth),c+=h.deadFunctionCount;let k=h.functionsAnalyzed>0?h.totalComplexity/h.functionsAnalyzed:0;(h.lines>=450||h.functionsAnalyzed>=25||h.functionsAnalyzed>=10&&k>=8)&&u.push({path:y,lines:h.lines,functionCount:h.functionsAnalyzed,averageComplexity:ee(k)});}let i=_t(p),d=n>0?c/n*100:0;return {filesAnalyzed:p.size,functionsAnalyzed:n,avgCyclomaticComplexity:n>0?ee(t/n):0,avgFunctionLength:n>0?ee(r/n):0,maxNestingDepth:o$1,godFiles:u.sort((g,m)=>m.lines-g.lines||m.functionCount-g.functionCount).slice(0,10),circularDependencies:i,deadCodePercent:ee(d)}}async function Dt(e,a){return a?(await a.walkDir(e)).filter(t=>t.isFile&&Le.has(I.extname(t.name).toLowerCase())).map(t=>t.absPath):await i(e,n=>Le.has(I.extname(n).toLowerCase()))}function Bt(e,a,s){let n=new Set,t=r=>{if(w.isImportDeclaration(r)&&w.isStringLiteral(r.moduleSpecifier)){let o=Oe(r.moduleSpecifier.text,a,s);o&&n.add(o);}if(w.isCallExpression(r)&&r.expression.kind===w.SyntaxKind.ImportKeyword&&r.arguments[0]&&w.isStringLiteral(r.arguments[0])){let o=Oe(r.arguments[0].text,a,s);o&&n.add(o);}se(r,t);};return t(e),[...n]}function Oe(e,a,s){if(!e.startsWith("."))return null;let n=I.resolve(a,e),t=I.relative(s,n).replace(/\\/g,"/");return !t||t.startsWith("..")?null:Ze(t)}function Ze(e){return e.replace(/\\/g,"/").replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/,"").replace(/\/index$/,"")}function Nt(e,a){let s=0,n=0,t=0,r=0,o=0,c=[],u=i=>{if(Wt(i)){let d=zt(i),g=Gt(e,i),m=qt(i);s++,n+=d,t+=g,r=Math.max(r,m);}w.isFunctionDeclaration(i)&&i.name&&c.push(i),se(i,u);};u(e);let p=a;for(let i of c){if(Ht(i))continue;let d=i.name?.text;if(!d)continue;Vt(p,d)<=1&&o++;}return {lines:a.split(/\r?\n/).length,functionsAnalyzed:s,totalComplexity:n,totalFunctionLength:t,maxNestingDepth:r,deadFunctionCount:o}}function zt(e){let a=1,s=n=>{switch(n.kind){case w.SyntaxKind.IfStatement:case w.SyntaxKind.ForStatement:case w.SyntaxKind.ForOfStatement:case w.SyntaxKind.ForInStatement:case w.SyntaxKind.WhileStatement:case w.SyntaxKind.DoStatement:case w.SyntaxKind.CaseClause:case w.SyntaxKind.CatchClause:case w.SyntaxKind.ConditionalExpression:a++;break;case w.SyntaxKind.BinaryExpression:{let t=n;(t.operatorToken.kind===w.SyntaxKind.AmpersandAmpersandToken||t.operatorToken.kind===w.SyntaxKind.BarBarToken||t.operatorToken.kind===w.SyntaxKind.QuestionQuestionToken)&&a++;break}}se(n,s);};return s(e),a}function qt(e){let a=0,s=(n,t)=>{let r=Kt(n)?t+1:t;a=Math.max(a,r),se(n,o=>s(o,r));};return s(e,0),Math.max(0,a-1)}function _t(e){let a=0,s=new Set,n=new Set,t=r=>{s.add(r),n.add(r);let o=e.get(r)??[];for(let c of o)e.has(c)&&(s.has(c)?n.has(c)&&a++:t(c));n.delete(r);};for(let r of e.keys())s.has(r)||t(r);return a}function Gt(e,a){let s=e.getLineAndCharacterOfPosition(a.getStart(e)).line;return e.getLineAndCharacterOfPosition(a.getEnd()).line-s+1}function Wt(e){return w.isFunctionDeclaration(e)||w.isMethodDeclaration(e)||w.isFunctionExpression(e)||w.isArrowFunction(e)||w.isConstructorDeclaration(e)}function Kt(e){return e.kind===w.SyntaxKind.IfStatement||e.kind===w.SyntaxKind.ForStatement||e.kind===w.SyntaxKind.ForOfStatement||e.kind===w.SyntaxKind.ForInStatement||e.kind===w.SyntaxKind.WhileStatement||e.kind===w.SyntaxKind.DoStatement||e.kind===w.SyntaxKind.SwitchStatement||e.kind===w.SyntaxKind.TryStatement||e.kind===w.SyntaxKind.CatchClause}function Ht(e){return w.canHaveModifiers(e)?!!w.getModifiers(e)?.some(s=>s.kind===w.SyntaxKind.ExportKeyword):false}function Vt(e,a){let s=new RegExp(`\\b${Qt(a)}\\b`,"g");return e.match(s)?.length??0}function Qt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ee(e){return Math.round(e*100)/100}function se(e,a){e.forEachChild(a);}var Jt=new Set([".tsx",".jsx",".ts",".js",".vue",".svelte",".html",".mdx",".json",".yml",".yaml"]),Zt=new Set(["stripe","posthog-js","posthog-node","@sentry/node","@sentry/browser","@sentry/react","next-auth","firebase","auth0","@auth0/auth0-react","@supabase/supabase-js","supabase","clerk","@clerk/clerk-js","@clerk/react"]),Yt=new Set(["welcome","home","click here","learn more","submit","cancel"]);async function De(e,a,s=300){let t=(await a.walkDir(e)).filter(g=>g.isFile),r=t.filter(g=>g.relPath.endsWith("package.json")&&!g.relPath.includes("node_modules")),o=[];for(let g of r)try{o.push(JSON.parse(await a.readTextFile(g.absPath)));}catch{}let c=an(o),u=[];for(let g of t){let m=Xt(g.relPath);if(!Jt.has(m))continue;if(!en(g.relPath)){let h=Be(g.relPath,c);h.length>0&&u.push(...h.map(k=>({...k,file:g.relPath})));continue}let y=Be(g.relPath,c);y.length>0&&u.push(...y.map(h=>({...h,file:g.relPath})));let l=await a.readTextFile(g.absPath);if(!l||l.length>512e3)continue;let f=tn(l);for(let h of f){let k=nn(h),v=sn(k,h);u.push({kind:k,value:h,file:g.relPath,weight:v});}/(featureFlag|FEATURE_FLAG|launchDarkly|isFeatureEnabled|flags\.)/.test(l)&&u.push({kind:"feature_flag",value:`flags in ${g.relPath}`,file:g.relPath,weight:2});}for(let g of o){let m=ln(g);for(let[y,l]of m)Zt.has(y)&&u.push({kind:"dependency",value:`${y}@${l}`,file:"package.json",weight:4});}let p=on(u).sort((g,m)=>m.weight-g.weight||g.value.localeCompare(m.value)),i=p.slice(0,s),d=rn(i);return {enabled:true,detectedFrameworks:c,evidenceCount:p.length,capped:p.length>i.length,topEvidence:i,unknownSignals:d}}function Xt(e){let a=e.lastIndexOf(".");return a===-1?"":e.slice(a).toLowerCase()}function en(e){let a=e.toLowerCase();return a.startsWith("pages/")||a.includes("/pages/")||a.startsWith("app/")||a.includes("/app/")||a.startsWith("components/")||a.includes("/components/")||a.startsWith("ui/")||a.includes("/ui/")||a.startsWith("views/")||a.includes("/views/")||a.includes("/routes")||a.startsWith("routes")||a.includes("/router")||a.startsWith("router")||a.startsWith("locales/")||a.includes("/locales/")||a.startsWith("i18n/")||a.includes("/i18n/")||a.endsWith(".html")||a.endsWith(".mdx")}function an(e){let a=new Set;for(let s of e){let n={...ye(s.dependencies),...ye(s.devDependencies)};n.next&&a.add("nextjs"),(n.nuxt||n.nuxt3)&&a.add("nuxt"),n.react&&a.add("react"),n.vue&&a.add("vue"),n.svelte&&a.add("svelte"),n["@angular/core"]&&a.add("angular");}return Array.from(a)}function Be(e,a){let s=[];if(a.includes("nextjs")){let n=e.match(/^(?:src\/)?(pages|app)\/(.+)\.(tsx|jsx|ts|js)$/);if(n){let t="/"+n[2].replace(/(^|\/)page$/i,"").replace(/(^|\/)route$/i,"").replace(/index$/i,"").replace(/\[(?:\.\.\.)?(.+?)\]/g,":$1").replace(/\/+/g,"/");t!=="/"&&t.endsWith("/")&&(t=t.slice(0,-1)),s.push({kind:"route",value:t||"/",weight:5});}}return (/(^|\/)(routes?|router)\.(ts|js|json)$/.test(e)||e.includes("/router/"))&&s.push({kind:"route",value:`route config: ${e}`,weight:3}),s}function tn(e){let a=[],s=/>\s*([A-Za-z0-9][^<>]{2,120}?)\s*</g;for(let o of e.matchAll(s)){let c=ae(o[1]??"");te(c)&&a.push(c);}let n=/<title>\s*([^<]{2,120})\s*<\/title>|title\s*[:=]\s*["'`](.{2,120}?)["'`]/g;for(let o of e.matchAll(n)){let c=ae((o[1]??o[2]??"").trim());te(c)&&a.push(c);}let t=/(?:aria-label|label|placeholder|alt)\s*=\s*["'`](.{2,120}?)["'`]/g;for(let o of e.matchAll(t)){let c=ae(o[1]??"");te(c)&&a.push(c);}let r=/:\s*["'`](.{2,140}?)["'`]\s*[,\n]/g;for(let o of e.matchAll(r)){let c=ae(o[1]??"");te(c)&&a.push(c);}return a}function nn(e){let a=e.toLowerCase();return /(pricing|plan|billing|subscription|trial|credit)/.test(a)||/(sign in|sign up|log in|register|invite|workspace|organization|sso|oauth)/.test(a)?"copy":/(dashboard|reports|settings|integrations|users|roles|permissions)/.test(a)?"heading":/(get started|start|scan|generate|export|run|deploy|upgrade|analy[sz]e)/.test(a)?"cta":/(overview|features|about|documentation|docs)/.test(a)?"title":/(menu|navigation|sidebar|breadcrumb)/.test(a)?"nav":"copy"}function sn(e,a){let s=a.toLowerCase();if(Yt.has(s))return 0;let n=1;return e==="route"&&(n+=4),e==="nav"&&(n+=3),e==="title"&&(n+=2),e==="heading"&&(n+=2),e==="cta"&&(n+=2),/(pricing|billing|subscription|auth|security|integration)/.test(s)&&(n+=2),/(dashboard|report|scan|workspace|project|repository)/.test(s)&&(n+=1),n}function on(e){let a=new Map;for(let s of e){let n=`${s.kind}::${s.value.toLowerCase()}`,t=a.get(n);(!t||s.weight>t.weight)&&a.set(n,s);}return Array.from(a.values()).filter(s=>s.weight>0)}function rn(e){let a=[],s=e.some(o=>/pricing|billing|subscription|trial|credit/i.test(o.value)),n=e.some(o=>/sign in|sign up|login|auth|sso|oauth|invite/i.test(o.value)),t=e.some(o=>/integration|webhook|api key|connector/i.test(o.value)),r=e.some(o=>o.kind==="route");return s||a.push("No pricing or billing evidence found."),n||a.push("No authentication or user access flow evidence found."),t||a.push("No integrations/connectors evidence found."),r||a.push("No route structure evidence found."),a}function ye(e){return !e||typeof e!="object"?{}:e}function ln(e){return Object.entries(ye(e.dependencies))}function ae(e){return e.replace(/\s+/g," ").trim()}function te(e){return !(!e||e.length<3||e.length>160||/^[0-9_./-]+$/.test(e)||/^(true|false|null|undefined)$/i.test(e)||/[<>{}]/.test(e)||/function\s*\(|=>|console\.|import\s+|export\s+/.test(e))}var cn=75e4;function j(e){return [...new Set(e)].sort((a,s)=>a.localeCompare(s))}function pn(e,a,s){if(!a)return;let n=a.trim();n&&e.push(`${n} (${s})`);}function he(e){let a=new Set;return e.filter(s=>{let n=s.lastIndexOf(" ("),t=n>0?s.slice(0,n).trim():s.trim();return a.has(t)?false:(a.add(t),true)})}function S(e,a,s){let n=[],t;for(;(t=a.exec(e))!==null;){let r=t.slice(1).find(o=>typeof o=="string"&&o.length>0);pn(n,r??t[0],s);}return n}function dn(e){let a=e.trim();if(/^@(?:yearly|monthly|weekly|daily|hourly|reboot)$/.test(a))return true;let s=/^(?:\*(?:\/\d+)?|\d+(?:[,\-]\d+)*(?:\/\d+)?|[?LW]|[\dLW]#\d)$/,n=a.split(/\s+/);return n.length!==5&&n.length!==6?false:n.every(t=>s.test(t))}function un(e,a){let s=[],n=/['"`]((?:[\d*\/,\-?LW#@A-Za-z]+[ \t]+){4,5}[\d*\/,\-?LW#@A-Za-z]+)['"`]/g,t;for(;(t=n.exec(e))!==null;){let r=t[1].trim();dn(r)&&s.push(`${r} (${a})`);}return s}var fn=new Set(["AED","AFN","ALL","AMD","ANG","AOA","ARS","AUD","AWG","AZN","BAM","BBD","BDT","BGN","BHD","BIF","BMD","BND","BOB","BRL","BSD","BTN","BWP","BYN","BZD","CAD","CDF","CHF","CLP","CNY","COP","CRC","CUP","CVE","CZK","DJF","DKK","DOP","DZD","EGP","ERN","ETB","EUR","FJD","FKP","GBP","GEL","GHS","GIP","GMD","GNF","GTQ","GYD","HKD","HNL","HRK","HTG","HUF","IDR","ILS","INR","IQD","IRR","ISK","JMD","JOD","JPY","KES","KGS","KHR","KMF","KPW","KRW","KWD","KYD","KZT","LAK","LBP","LKR","LRD","LSL","LYD","MAD","MDL","MGA","MKD","MMK","MNT","MOP","MRU","MUR","MVR","MWK","MXN","MYR","MZN","NAD","NGN","NIO","NOK","NPR","NZD","OMR","PAB","PEN","PGK","PHP","PKR","PLN","PYG","QAR","RON","RSD","RUB","RWF","SAR","SBD","SCR","SDG","SEK","SGD","SHP","SLE","SOS","SRD","SSP","STN","SVC","SYP","SZL","THB","TJS","TMT","TND","TOP","TRY","TTD","TWD","TZS","UAH","UGX","USD","UYU","UZS","VES","VND","VUV","WST","XAF","XCD","XOF","XPF","YER","ZAR","ZMW","ZWL"]);function mn(e){let a=new Set,s=/\b([A-Z]{3})\b/g,n;for(;(n=s.exec(e))!==null;){let t=n[1];fn.has(t)&&a.add(t);}return [...a]}var gn=new Set(["af-ZA","am-ET","ar-AE","ar-BH","ar-DZ","ar-EG","ar-IQ","ar-JO","ar-KW","ar-LB","ar-LY","ar-MA","ar-OM","ar-QA","ar-SA","ar-SY","ar-TN","ar-YE","az-AZ","be-BY","bg-BG","bn-BD","bn-IN","bs-BA","ca-ES","cs-CZ","cy-GB","da-DK","de-AT","de-CH","de-DE","de-LI","de-LU","el-CY","el-GR","en-AU","en-BZ","en-CA","en-CB","en-GB","en-GH","en-HK","en-IE","en-IN","en-JM","en-KE","en-MT","en-MY","en-NG","en-NZ","en-PH","en-SG","en-TT","en-US","en-ZA","en-ZW","es-AR","es-BO","es-CL","es-CO","es-CR","es-CU","es-DO","es-EC","es-ES","es-GT","es-HN","es-MX","es-NI","es-PA","es-PE","es-PR","es-PY","es-SV","es-US","es-UY","es-VE","et-EE","eu-ES","fa-IR","fi-FI","fil-PH","fo-FO","fr-BE","fr-CA","fr-CH","fr-FR","fr-LU","fr-MC","ga-IE","gl-ES","gu-IN","ha-NG","he-IL","hi-IN","hr-BA","hr-HR","hu-HU","hy-AM","id-ID","ig-NG","is-IS","it-CH","it-IT","ja-JP","ka-GE","kk-KZ","km-KH","kn-IN","ko-KR","ky-KG","lb-LU","lo-LA","lt-LT","lv-LV","mi-NZ","mk-MK","ml-IN","mn-MN","mr-IN","ms-BN","ms-MY","mt-MT","my-MM","nb-NO","ne-NP","nl-BE","nl-NL","nn-NO","or-IN","pa-IN","pl-PL","ps-AF","pt-BR","pt-PT","ro-MD","ro-RO","ru-RU","rw-RW","si-LK","sk-SK","sl-SI","so-SO","sq-AL","sr-BA","sr-ME","sr-RS","sv-FI","sv-SE","sw-KE","sw-TZ","ta-IN","ta-LK","te-IN","tg-TJ","th-TH","ti-ER","ti-ET","tk-TM","tr-TR","uk-UA","ur-IN","ur-PK","uz-UZ","vi-VN","yo-NG","zh-CN","zh-HK","zh-MO","zh-SG","zh-TW","zu-ZA"]);function yn(e){let a=new Set,s=/\b([a-z]{2}-[A-Z]{2})\b/g,n;for(;(n=s.exec(e))!==null;){let t=n[1];gn.has(t)&&a.add(t);}return [...a]}function hn(e){let a=new Set,s=/\b((?:Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)\/[A-Z][A-Za-z0-9_]+(?:\/[A-Z][A-Za-z0-9_]+)?)\b/g,n=/\b(UTC|GMT)([+-]\d{1,2}(?::?\d{2})?)?\b/g,t;for(;(t=s.exec(e))!==null;)a.add(t[1]);for(;(t=n.exec(e))!==null;)a.add(t[0]);return [...a]}function vn(e){let a=new Set,s=/\b(UTF-?8|UTF-?16(?:BE|LE)?|UTF-?32(?:BE|LE)?|ISO-8859-(?:1[0-5]?|[2-9])|US-ASCII|ASCII|Windows-125[0-8]|Shift[_-]?JIS|EUC-(?:JP|KR|CN)|Big5|GB2312|GBK|GB18030|KOI8-[RU]|ISO-2022-JP|Latin-?[1-9])\b/gi,n;for(;(n=s.exec(e))!==null;)a.add(n[1].toUpperCase());return [...a]}function kn(e){let a=e.split("/");return a.length===1?"root":a[0]==="packages"&&a.length>=2?a[1]:a[0]}var bn=new Set(["package-lock.json","pnpm-lock.yaml","yarn.lock","composer.lock","Gemfile.lock","Cargo.lock","poetry.lock","Pipfile.lock","packages.lock.json"]);function wn(e){let a=e.toLowerCase();return a.includes("postgres")?{kind:"sql",brand:"PostgreSQL",version:null,evidence:e}:a.includes("mysql")||a.includes("mariadb")?{kind:"sql",brand:"MySQL/MariaDB",version:null,evidence:e}:a.includes("mssql")||a.includes("sqlserver")?{kind:"sql",brand:"SQL Server",version:null,evidence:e}:a.includes("oracle")?{kind:"sql",brand:"Oracle",version:null,evidence:e}:a.includes("sqlite")?{kind:"sql",brand:"SQLite",version:null,evidence:e}:a.includes("mongodb")?{kind:"nosql",brand:"MongoDB",version:null,evidence:e}:a.includes("redis")?{kind:"nosql",brand:"Redis",version:null,evidence:e}:a.includes("cassandra")?{kind:"nosql",brand:"Cassandra",version:null,evidence:e}:a.includes("cosmosdb")||a.includes("@azure/cosmos")||a.includes("cosmos")?{kind:"nosql",brand:"CosmosDB",version:null,evidence:e}:a.includes("dynamodb")?{kind:"nosql",brand:"DynamoDB",version:null,evidence:e}:a.includes("neo4j")?{kind:"nosql",brand:"Neo4j",version:null,evidence:e}:a.includes("clickhouse")?{kind:"sql",brand:"ClickHouse",version:null,evidence:e}:a.includes("snowflake")?{kind:"sql",brand:"Snowflake",version:null,evidence:e}:a.includes("bigquery")?{kind:"sql",brand:"BigQuery",version:null,evidence:e}:a.includes("firestore")?{kind:"nosql",brand:"Firestore",version:null,evidence:e}:a.includes("cockroach")?{kind:"sql",brand:"CockroachDB",version:null,evidence:e}:a.includes("planetscale")?{kind:"sql",brand:"PlanetScale",version:null,evidence:e}:a.includes("supabase")?{kind:"sql",brand:"Supabase",version:null,evidence:e}:a.includes("tidb")?{kind:"sql",brand:"TiDB",version:null,evidence:e}:a.includes("couchdb")?{kind:"nosql",brand:"CouchDB",version:null,evidence:e}:a.includes("elasticsearch")||a.includes("opensearch")?{kind:"nosql",brand:"Elasticsearch",version:null,evidence:e}:a.includes("influxdb")?{kind:"nosql",brand:"InfluxDB",version:null,evidence:e}:a.includes("memcached")?{kind:"nosql",brand:"Memcached",version:null,evidence:e}:a.includes("cockroachdb")?{kind:"sql",brand:"CockroachDB",version:null,evidence:e}:null}async function J(e,a){let n=(await a.walkDir(e)).filter(r=>r.isFile).map(r=>r.absPath),t=[];for(let r of n)try{let o=I.relative(e,r).replace(/\\/g,"/"),c=await a.readTextFile(r);if(!c||c.length>cn)continue;t.push({relPath:o,content:c});}catch{}return t}async function Sn(e,a){let s=await J(e,a),n={environmentVariables:[],featureFlags:[],hiddenConfigFiles:[],dotEnvFiles:[],secretsInjectionPaths:[],containerEntrypoints:[],startupArguments:[],jvmFlags:[],threadPoolSettings:[]};for(let t of s)t.relPath.split("/").some(r=>r.startsWith("."))&&n.hiddenConfigFiles.push(t.relPath),/\.env(\.|$)/i.test(t.relPath)&&n.dotEnvFiles.push(t.relPath),n.environmentVariables.push(...S(t.content,/(?:process\.env\.([A-Z0-9_]{3,})|process\.env\[['"]([A-Z0-9_]{3,})['"]\]|System\.getenv\(['"]([A-Z0-9_]{3,})['"]\)|os\.environ\[['"]([A-Z0-9_]{3,})['"]\]|getenv\(['"]([A-Z0-9_]{3,})['"]\))/g,t.relPath)),n.featureFlags.push(...S(t.content,/\b(?:feature[_-]?flag|ff_|is[A-Z][A-Za-z0-9]+Enabled|launchdarkly|unleash)\b/gi,t.relPath)),n.secretsInjectionPaths.push(...S(t.content,/\b(?:vault|secrets?\/(?:mount|inject|path)|aws\/secretsmanager|gcp\/secretmanager)\b/gi,t.relPath)),n.containerEntrypoints.push(...S(t.content,/\b(?:ENTRYPOINT|CMD)\s+([^\n]+)/g,t.relPath)),n.jvmFlags.push(...S(t.content,/\b(-Xmx\S+|-Xms\S+|-XX:[^\s'"\]]+)/g,t.relPath)),n.threadPoolSettings.push(...S(t.content,/\b(?:thread[_-]?pool|max[_-]?threads|min[_-]?threads|worker[_-]?threads)\b[^\n]*/gi,t.relPath));return n.environmentVariables=j(n.environmentVariables),n.featureFlags=he(n.featureFlags),n.hiddenConfigFiles=[...new Set(n.hiddenConfigFiles)],n.dotEnvFiles=j(n.dotEnvFiles),n.secretsInjectionPaths=j(n.secretsInjectionPaths),n.containerEntrypoints=j(n.containerEntrypoints),n.startupArguments=j(n.startupArguments).slice(0,250),n.jvmFlags=j(n.jvmFlags),n.threadPoolSettings=j(n.threadPoolSettings),n}async function xn(e,a){let s=await J(e,a),n=[],t={databaseTechnologies:[],connectionStrings:[],connectionPoolSettings:[],replicationSettings:[],readReplicaSettings:[],failoverSettings:[],collationAndEncoding:[],queryTimeoutDefaults:[],manualIndexes:[],tables:[],views:[],storedProcedures:[],triggers:[],rowLevelSecurityPolicies:[],otherServices:[]};for(let o of s){let c=S(o.content,/\b(?:postgres(?:ql)?:\/\/[^\s'"`]+|mysql:\/\/[^\s'"`]+|mongodb(?:\+srv)?:\/\/[^\s'"`]+|redis:\/\/[^\s'"`]+|clickhouse:\/\/[^\s'"`]+|cockroachdb:\/\/[^\s'"`]+|snowflake:\/\/[^\s'"`]+)\b/gi,o.relPath);if(t.connectionStrings.push(...c),!bn.has(I.basename(o.relPath))){let p=[...S(o.content,/\b(?:postgres|postgresql|mysql|mariadb|mssql|sqlserver|oracle|sqlite|mongodb|redis|cassandra|cosmosdb|cosmos|dynamodb|neo4j|clickhouse|snowflake|bigquery|firestore|cockroach|cockroachdb|planetscale|supabase|tidb|couchdb|elasticsearch|opensearch|influxdb|memcached)\b/gi,o.relPath),...c];for(let i of p){let d=wn(i);d&&n.push(d);}}t.replicationSettings.push(...S(o.content,/\b(?:replication|cluster|replicaSet)\b[^\n]*/gi,o.relPath)),t.readReplicaSettings.push(...S(o.content,/\b(?:read[_-]?replica|reader[_-]?endpoint)\b[^\n]*/gi,o.relPath)),t.failoverSettings.push(...S(o.content,/\b(?:failover|multi[_-]?az|secondary[_-]?host)\b[^\n]*/gi,o.relPath)),t.collationAndEncoding.push(...S(o.content,/\b(UTF-?8|UTF-?16(?:BE|LE)?|UTF-?32(?:BE|LE)?|Unicode|ASCII|US-ASCII|ISO-8859-(?:1[0-5]?|[2-9])|Windows-125[0-8]|Shift[_-]?JIS|EUC-(?:JP|KR|CN)|Big5|GB2312|GBK|GB18030|KOI8-[RU]|Latin-?[1-9]|SQL_Latin1_General_CP1_C[IS]_AS|Latin1_General_C[IS]_A[IS])\b/gi,o.relPath)),t.manualIndexes.push(...S(o.content,/\bcreate\s+(?:unique\s+)?index\s+[^;\n]+/gi,o.relPath)),t.tables.push(...S(o.content,/\bcreate\s+table\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.views.push(...S(o.content,/\bcreate\s+view\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.storedProcedures.push(...S(o.content,/\bcreate\s+(?:or\s+replace\s+)?procedure\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.triggers.push(...S(o.content,/\bcreate\s+trigger\s+([a-zA-Z0-9_."]+)/gi,o.relPath)),t.rowLevelSecurityPolicies.push(...S(o.content,/\b(?:row\s+level\s+security|create\s+policy|alter\s+table\s+.*\s+enable\s+row\s+level\s+security)\b[^;\n]*/gi,o.relPath)),t.otherServices.push(...S(o.content,/\b(?:redis:\/\/[^\s'"`]+|amqp:\/\/[^\s'"`]+|kafka:\/\/[^\s'"`]+|elasticsearch:\/\/[^\s'"`]+)\b/gi,o.relPath));}let r=new Map;for(let o of n){if(/\.xml\b/i.test(o.evidence))continue;let c=`${o.kind}:${o.brand}`;r.has(c)||r.set(c,o);}return t.databaseTechnologies=[...r.values()].sort((o,c)=>o.brand.localeCompare(c.brand)),t.connectionStrings=j(t.connectionStrings),t.connectionPoolSettings=j(t.connectionPoolSettings),t.replicationSettings=j(t.replicationSettings),t.readReplicaSettings=j(t.readReplicaSettings),t.failoverSettings=j(t.failoverSettings),t.collationAndEncoding=he(t.collationAndEncoding),t.queryTimeoutDefaults=j(t.queryTimeoutDefaults),t.manualIndexes=j(t.manualIndexes),t.tables=j(t.tables),t.views=j(t.views),t.storedProcedures=j(t.storedProcedures),t.triggers=j(t.triggers),t.rowLevelSecurityPolicies=j(t.rowLevelSecurityPolicies),t.otherServices=j(t.otherServices),t}function jn(e,a){let s=e.toLowerCase(),n=s.endsWith(".json")?"json":s.endsWith(".yaml")?"yaml":s.endsWith(".yml")?"yml":null;if(!n)return null;let t=/\bopenapi\s*[:=]\s*['"]?3\./i.test(a)||/\bswagger\s*[:=]\s*['"]?2\.0/i.test(a)||/"openapi"\s*:\s*"3\./i.test(a),r=/(openapi|swagger).*(\.ya?ml|\.json)$/i.test(s)||/\/api-docs\b/i.test(s);if(!t&&!r)return null;let o=a.match(/\bopenapi\s*[:=]\s*['"]?([^'"\s,]+)/i)?.[1]??a.match(/\bswagger\s*[:=]\s*['"]?([^'"\s,]+)/i)?.[1]??null,c=a.match(/\btitle\s*[:=]\s*['"]([^'"]+)['"]/i)?.[1]??a.match(/\btitle\s*[:=]\s*([^\n#]+)/i)?.[1]?.trim()??a.match(/"title"\s*:\s*"([^"]+)"/i)?.[1]??null,u=a.match(/(^|\n)\s*\/[^\n:]+:\s*(get|post|put|patch|delete|options|head)/gim)?.length??a.match(/"\/[^"]+"\s*:\s*\{/g)?.length??null;return {path:e,format:n,version:o,title:c,endpointCount:u}}function Cn(e){let a=e.toLowerCase();return !!(a==="localhost"||a==="127.0.0.1"||a==="::1"||a==="0.0.0.0"||/^192\.168\./.test(a)||/^10\./.test(a)||/^172\.(1[6-9]|2\d|3[01])\./.test(a)||!a.includes(".")||/^(example|test|localhost|local|internal)\b/.test(a))}function Rn(e){return e.replace(/[\u0000-\u001F\u007F-\u009F\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g,"").trim()}async function Tn(e,a){let s=await J(e,a),n=[],t={integrations:[],openApiSpecifications:[],webhookUrls:[],callbackEndpoints:[],apiVersionPins:[],tokenExpirationPolicies:[],rateLimitOverrides:[],customHeaders:[],corsPolicies:[],oauthScopes:[],apiTokens:[]};for(let o of s){let c=jn(o.relPath,o.content);c&&t.openApiSpecifications.push(c);let u=/\bhttps?:\/\/[^\s'"`]+/gi,p;for(;(p=u.exec(o.content))!==null;){let i=p[0].replace(/[,;)\]}"'`]+$/,""),d=Rn(i);if(!d.startsWith("http"))continue;let g;try{g=new URL(d).hostname;}catch{continue}if(Cn(g))continue;let m=d.match(/\/(v\d+(?:\.\d+)?)\b/i),y=d.match(/[?&]([a-zA-Z0-9_.-]+)=/g)?.map(l=>l.replace(/[?&=]/g,""))??[];n.push({provider:g,endpoint:d,version:m?m[1]:null,parameters:y,configOptions:S(o.content,/\b(?:baseUrl|apiUrl|endpoint|timeout|retries|apiVersion)\b[^\n]*/gi,o.relPath),authHints:S(o.content,/\b(?:api[_-]?key|bearer\s+[a-z0-9_.-]+|client[_-]?secret|oauth)\b[^\n]*/gi,o.relPath),files:[o.relPath]});}t.webhookUrls.push(...S(o.content,/\bhttps?:\/\/[^\s'"`]*(?:webhook|hooks?)[^\s'"`]*/gi,o.relPath)),t.callbackEndpoints.push(...S(o.content,/\bhttps?:\/\/[^\s'"`]*(?:callback|redirect_uri)[^\s'"`]*/gi,o.relPath)),t.apiVersionPins.push(...S(o.content,/\bapi[_-]?version\b[^\n]*/gi,o.relPath)),t.tokenExpirationPolicies.push(...S(o.content,/\b(?:token[_-]?expiry|expires[_-]?in|refresh[_-]?token[_-]?ttl)\b[^\n]*/gi,o.relPath)),t.apiTokens.push(...S(o.content,/\b(?:api[_-]?token|access[_-]?token|bearer[_-]?token)\b[^\n]*/gi,o.relPath));}let r=new Map;for(let o of n){let c=o.endpoint,u=r.get(c);u?(u.files=j([...u.files,...o.files]),u.parameters=j([...u.parameters,...o.parameters]),u.configOptions=j([...u.configOptions,...o.configOptions]),u.authHints=j([...u.authHints,...o.authHints])):r.set(c,{...o,parameters:j(o.parameters),configOptions:j(o.configOptions),authHints:j(o.authHints),files:[...o.files]});}return t.integrations=[...r.values()].filter(o=>o.files.some(c=>!Ye.has(I.extname(c).toLowerCase()))).filter(o=>o.provider!=="www.w3.org").filter(o=>!o.files.some(c=>/\.(js|xml)$/i.test(c))).sort((o,c)=>o.provider.localeCompare(c.provider)),t.openApiSpecifications=[...new Map(t.openApiSpecifications.map(o=>[o.path,o])).values()].sort((o,c)=>o.path.localeCompare(c.path)),t.webhookUrls=j(t.webhookUrls),t.callbackEndpoints=j(t.callbackEndpoints),t.apiVersionPins=j(t.apiVersionPins),t.tokenExpirationPolicies=j(t.tokenExpirationPolicies),t.rateLimitOverrides=j(t.rateLimitOverrides),t.customHeaders=j(t.customHeaders),t.corsPolicies=j(t.corsPolicies),t.oauthScopes=j(t.oauthScopes),t.apiTokens=he(t.apiTokens),t}var Ye=new Set([".md",".mdx",".markdown",".txt",".rst",".adoc",".asciidoc",".html",".htm",".pdf",".docx",".doc",".rtf"]);async function Pn(e,a){let n=(await J(e,a)).filter(r=>{let o=I.extname(r.relPath).toLowerCase();return !Ye.has(o)}),t={implicitTimeouts:[],defaultPaginationSize:[],implicitRetryLogic:[],defaultLocale:[],defaultCurrency:[],implicitTimezone:[],defaultCharacterEncoding:[],sessionStores:[],distributedLocks:[],jobSchedulers:[],idempotencyKeys:[],rateLimitingCounters:[],circuitBreakerState:[],abTestToggles:[],regionalEnablementRules:[],betaAccessGroups:[],licensingEnforcementLogic:[],killSwitches:[],connectorRetryLogic:[],apiPollingIntervals:[],fieldMappings:[],schemaRegistryRules:[],deadLetterQueueBehavior:[],dataMaskingRules:[],transformationLogic:[],timezoneHandling:[],encryptionSettings:[],hardcodedSecretSignals:[]};for(let r of n){t.defaultLocale.push(...yn(r.content)),t.defaultCurrency.push(...mn(r.content)),t.implicitTimezone.push(...hn(r.content)),t.defaultCharacterEncoding.push(...vn(r.content)),t.sessionStores.push(...S(r.content,/\b(?:sessionStore|redisStore|memoryStore)\b[^\n]*/gi,r.relPath)),t.distributedLocks.push(...S(r.content,/\b(?:distributed[_-]?lock|redlock|mutex)\b[^\n]*/gi,r.relPath));for(let o of un(r.content,r.relPath)){let c=kn(r.relPath);t.jobSchedulers.push(`[${c}] ${o}`);}t.idempotencyKeys.push(...S(r.content,/\b(?:idempotency[_-]?key|Idempotency-Key)\b[^\n]*/gi,r.relPath)),t.circuitBreakerState.push(...S(r.content,/\b(?:circuit[_-]?breaker|half[_-]?open|open[_-]?state)\b[^\n]*/gi,r.relPath)),t.abTestToggles.push(...S(r.content,/\b(?:a\/b|ab[_-]?test|experiment[_-]?flag)\b[^\n]*/gi,r.relPath)),t.regionalEnablementRules.push(...S(r.content,/\b(?:region[_-]?enabled|geo[_-]?fence|country[_-]?allow)\b[^\n]*/gi,r.relPath)),t.betaAccessGroups.push(...S(r.content,/\b(?:beta[_-]?users?|early[_-]?access|allowlist)\b[^\n]*/gi,r.relPath)),t.licensingEnforcementLogic.push(...S(r.content,/\b(?:license[_-]?key|entitlement|plan[_-]?check)\b[^\n]*/gi,r.relPath)),t.killSwitches.push(...S(r.content,/\b(?:kill[_-]?switch|disable[_-]?all|emergency[_-]?stop)\b[^\n]*/gi,r.relPath)),t.connectorRetryLogic.push(...S(r.content,/\b(?:connector|integration)\b[^\n]*(?:retry|backoff)/gi,r.relPath)),t.apiPollingIntervals.push(...S(r.content,/\b(?:poll(?:ing)?[_-]?interval|sync[_-]?interval)\b[^\n]*/gi,r.relPath)),t.fieldMappings.push(...S(r.content,/\b(?:field[_-]?mapping|mapFields?|column[_-]?map)\b[^\n]*/gi,r.relPath)),t.schemaRegistryRules.push(...S(r.content,/\b(?:schema[_-]?registry|avro|protobuf)\b[^\n]*/gi,r.relPath)),t.deadLetterQueueBehavior.push(...S(r.content,/\b(?:dead[_-]?letter|dlq)\b[^\n]*/gi,r.relPath)),t.dataMaskingRules.push(...S(r.content,/\b(?:data[_-]?mask|redact|pii[_-]?mask)\b[^\n]*/gi,r.relPath)),t.timezoneHandling.push(...S(r.content,/\b(?:convertTimezone|tz\(|moment\.tz|DateTimeZone)\b[^\n]*/gi,r.relPath)),t.encryptionSettings.push(...S(r.content,/(aes-(?:128|192|256)-(?:gcm|cbc|ctr|cfb8?|ofb|ecb|ccm|ocb|wrap(?:-pad)?)|chacha20-poly1305|des-ede3?(?:-(?:cbc|cfb8?|ofb))?|bf-(?:cbc|cfb|ecb|ofb)|aria-(?:128|192|256)-(?:gcm|cbc|ctr|cfb8?|ofb|ecb|ccm)|camellia-(?:128|192|256)-(?:cbc|cfb8?|ofb|ecb)|seed-cbc|rc4(?:-(?:40|hmac-md5))?|rc2-(?:(?:40|64|128)-)?cbc)/gi,r.relPath)),t.hardcodedSecretSignals.push(...S(r.content,/\b(?:password|passwd|connectionString|api[_-]?key|secret)\b\s*[:=]\s*['"][^'"]{4,}['"]/gi,r.relPath));}return Object.keys(t).forEach(r=>{t[r]=j(t[r]);}),t}async function An(e,a){let s=await a.walkDir(e),n=s.filter(o=>o.isFile&&/favicon/i.test(o.name)),t=s.filter(o=>o.isFile&&/logo/i.test(o.name)),r=[];for(let o of n.slice(0,10))try{let c=await a.readTextFile(o.absPath);if(!c)continue;let u=Buffer.from(c).toString("base64");r.push({path:o.relPath,base64:u.slice(0,1e4)});}catch{}return {faviconFiles:r,productLogos:j(t.map(o=>o.relPath))}}async function En(e){let a=new d;try{let n=(await a.walkDir(e)).find(r=>r.isFile&&/favicon/i.test(r.name));if(!n)return null;let t=await a.readTextFile(n.absPath);return t?Buffer.from(t).toString("base64").slice(0,1e4):null}catch{return null}}async function In(e,a){let s=await J(e,a),n=new Set,t=new Set,r=[],o=[];for(let c of s)/package(-lock)?\.json$|pnpm-lock\.yaml$|poetry\.lock$|pom\.xml$/i.test(c.relPath)&&(c.content.match(/"([@a-zA-Z0-9_.\/-]+)"\s*:/g)??[]).forEach(p=>t.add(p.replace(/["\s:]/g,""))),/package\.json$/i.test(c.relPath)&&(c.content.match(/"([@a-zA-Z0-9_.\/-]+)"\s*:\s*"[~^0-9*><=.-]+"/g)??[]).forEach(p=>{let i=p.split(":")[0]?.replace(/"/g,"").trim();i&&n.add(i);}),r.push(...S(c.content,/\b(?:CVE-\d{4}-\d{4,}|critical vulnerability|high severity)\b[^\n]*/gi,c.relPath)),/package(-lock)?\.json$|pnpm-lock\.yaml$|yarn\.lock$|poetry\.lock$|pom\.xml$|build\.gradle(\.kts)?$|Cargo\.(toml|lock)$|composer\.(json|lock)$|requirements\.txt$|\.csproj$|\.nuspec$/i.test(c.relPath)&&o.push(...S(c.content,/\b(?:GPL-3\.0|AGPL|SSPL|BUSL|source[- ]available)\b[^\n]*/gi,c.relPath));return {directDependencies:n.size,transitiveDependencies:Math.max(t.size,n.size),knownVulnerabilities:j(r),licenseRisks:j(o)}}var Fn={team:[6,5,4,3.5],business:[15,12,10,8]},Ne=[0,25,100,300,500],Wn=10;function Kn(e,a){let s=Fn[a],n=0,t=[];for(let r=0;r<4;r++){let o=Ne[r],c=r===3?1/0:Ne[r+1];if(e>o){let u=Math.min(e,c)-o;n+=u*s[r],t.push({cnt:u,rate:s[r]});}}return {total:n,lines:t}}async function Xe(e){let{rootDir:a,opts:s,scanners:n,maxPrivacyMode:t,allProjects:r,solutions:o,projectsByPath:c,fileCache:u,progress:p,extended:i}=e;if(n===false){i.standards=Fe(r,i);return}let d={platformMatrix:!t,serviceDependencies:!t,breakingChangeExposure:!t,buildDeploy:!t,tsModernity:!t,fileHotspots:!t,architecture:!t,codeQuality:!t,runtimeConfiguration:!t,apiSurface:!t,operationalResilience:!t},g=[...d.platformMatrix&&n?.platformMatrix?.enabled!==false?[{id:"platform",label:"Platform matrix"}]:[],...n?.toolingInventory?.enabled!==false?[{id:"tooling",label:"Tooling inventory"}]:[],...d.serviceDependencies&&n?.serviceDependencies?.enabled!==false?[{id:"services",label:"Service dependencies"}]:[],...d.breakingChangeExposure&&n?.breakingChangeExposure?.enabled!==false?[{id:"breaking",label:"Breaking change exposure"}]:[],...n?.securityPosture?.enabled!==false?[{id:"security",label:"Security posture"}]:[],...d.buildDeploy&&n?.buildDeploy?.enabled!==false?[{id:"build",label:"Build & deploy analysis"}]:[],...d.tsModernity&&n?.tsModernity?.enabled!==false?[{id:"ts",label:"TypeScript modernity"}]:[],...d.fileHotspots&&n?.fileHotspots?.enabled!==false?[{id:"hotspots",label:"File hotspots"}]:[],...n?.dependencyGraph?.enabled!==false?[{id:"depgraph",label:"Dependency graph"}]:[],...n?.dependencyRisk?.enabled!==false?[{id:"deprisk",label:"Dependency risk"}]:[],...d.architecture&&n?.architecture?.enabled!==false?[{id:"architecture",label:"Architecture layers"}]:[],...d.codeQuality&&n?.codeQuality?.enabled!==false?[{id:"codequality",label:"Code quality metrics"}]:[],...!t&&(s.uiPurpose||n?.uiPurpose?.enabled===true)?[{id:"uipurpose",label:"UI purpose evidence"}]:[],...d.runtimeConfiguration&&n?.runtimeConfiguration?.enabled!==false?[{id:"runtimecfg",label:"Runtime configuration"}]:[],...n?.dataStores?.enabled!==false?[{id:"datastores",label:"Data stores & schema"}]:[],...d.apiSurface&&n?.apiSurface?.enabled!==false?[{id:"apisurface",label:"API integrations"}]:[],...d.operationalResilience&&n?.operationalResilience?.enabled!==false?[{id:"resilience",label:"Operational resilience"}]:[],...n?.assetBranding?.enabled!==false?[{id:"branding",label:"Branding assets"}]:[],...n?.ossGovernance?.enabled!==false?[{id:"ossgov",label:"OSS governance"}]:[]];for(let l of g)p.insertStepBefore("drift",l);let m=[];if(d.platformMatrix&&n?.platformMatrix?.enabled!==false&&(p.startStep("platform"),m.push(Ja(a,u).then(l=>{i.platformMatrix=l;let f=l.nativeModules.length,h=l.dockerBaseImages.length,k=[];f>0&&k.push(`${f} native`),h>0&&k.push(`${h} docker`),p.completeStep("platform",k.join(", ")||"clean",f+h);}))),n?.toolingInventory?.enabled!==false&&(p.startStep("tooling"),m.push(Promise.resolve().then(()=>{i.toolingInventory=ot(r);let l=Object.values(i.toolingInventory).reduce((f,h)=>f+h.length,0);p.completeStep("tooling",`${l} tool${l!==1?"s":""} mapped`,l);}))),d.serviceDependencies&&n?.serviceDependencies?.enabled!==false&&(p.startStep("services"),m.push(Promise.resolve().then(()=>{i.serviceDependencies=Ct(r);let l=Object.values(i.serviceDependencies).reduce((f,h)=>f+h.length,0);p.completeStep("services",`${l} service${l!==1?"s":""} detected`,l);}))),d.breakingChangeExposure&&n?.breakingChangeExposure?.enabled!==false&&(p.startStep("breaking"),m.push(Promise.resolve().then(async()=>{i.breakingChangeExposure=await kt(r,a,u);let l=i.breakingChangeExposure,f=l.deprecatedPackages.length+l.legacyPolyfills.length;p.completeStep("breaking",f>0?`${l.deprecatedPackages.length} deprecated, ${l.legacyPolyfills.length} polyfills`:"none found",f);}))),n?.securityPosture?.enabled!==false&&(p.startStep("security"),m.push(xt(a,u).then(l=>{i.securityPosture=l;let f=l.lockfilePresent?`lockfile \u2714${l.gitignoreCoversEnv?" \xB7 .env \u2714":" \xB7 .env \u2716"}`:"no lockfile";p.completeStep("security",f);}))),d.buildDeploy&&n?.buildDeploy?.enabled!==false&&(p.startStep("build"),m.push(dt(a,u).then(l=>{i.buildDeploy=l;let f=[];l.ci.length>0&&f.push(l.ci.join(", ")),l.docker.dockerfileCount>0&&f.push(`${l.docker.dockerfileCount} Dockerfile${l.docker.dockerfileCount!==1?"s":""}`),p.completeStep("build",f.join(" \xB7 ")||"none detected");}))),d.tsModernity&&n?.tsModernity?.enabled!==false&&(p.startStep("ts"),m.push(ut(a,u).then(l=>{i.tsModernity=l;let f=[];l.typescriptVersion&&f.push(`v${l.typescriptVersion}`),l.strict===true&&f.push("strict"),l.moduleType&&f.push(l.moduleType.toUpperCase()),p.completeStep("ts",f.join(" \xB7 ")||"no tsconfig");}))),d.fileHotspots&&n?.fileHotspots?.enabled!==false&&(p.startStep("hotspots"),m.push(wt(a,u).then(l=>{i.fileHotspots=l,p.completeStep("hotspots",`${l.totalFiles} files`,l.totalFiles);}))),n?.dependencyGraph?.enabled!==false&&(p.startStep("depgraph"),m.push(nt(a,u).then(l=>{i.dependencyGraph=l;let f=l.lockfileType?`${l.lockfileType} \xB7 ${l.totalUnique} unique`:"no lockfile";p.completeStep("depgraph",f,l.totalUnique);}))),d.codeQuality&&n?.codeQuality?.enabled!==false&&(p.startStep("codequality"),m.push(Ot(a,u).then(l=>{i.codeQuality=l;let f=[];f.push(`${l.filesAnalyzed} files`),f.push(`${l.functionsAnalyzed} functions`),l.circularDependencies>0&&f.push(`${l.circularDependencies} cycles`),p.completeStep("codequality",f.join(" \xB7 "),l.functionsAnalyzed);}))),d.runtimeConfiguration&&n?.runtimeConfiguration?.enabled!==false&&(p.startStep("runtimecfg"),m.push(Sn(a,u).then(l=>{i.runtimeConfiguration=l;let f=l.environmentVariables.length+l.featureFlags.length+l.dotEnvFiles.length;p.completeStep("runtimecfg",`${f} runtime signals`,f);}))),n?.dataStores?.enabled!==false&&(p.startStep("datastores"),m.push(xn(a,u).then(l=>{i.dataStores=l;let f=l.databaseTechnologies.length+l.tables.length+l.views.length;p.completeStep("datastores",`${l.databaseTechnologies.length} engines \xB7 ${l.tables.length} tables`,f);}))),d.apiSurface&&n?.apiSurface?.enabled!==false&&(p.startStep("apisurface"),m.push(Tn(a,u).then(l=>{i.apiSurface=l;let f=l.integrations.length+l.webhookUrls.length;p.completeStep("apisurface",`${l.integrations.length} integrations`,f);}))),d.operationalResilience&&n?.operationalResilience?.enabled!==false&&(p.startStep("resilience"),m.push(Pn(a,u).then(l=>{i.operationalResilience=l;let f=l.killSwitches.length;p.completeStep("resilience",`${f} resilience signals`,f);}))),n?.assetBranding?.enabled!==false&&(p.startStep("branding"),m.push(An(a,u).then(l=>{i.assetBranding=l;let f=l.faviconFiles.length+l.productLogos.length;p.completeStep("branding",`${l.faviconFiles.length} favicons \xB7 ${l.productLogos.length} logos`,f);}))),n?.ossGovernance?.enabled!==false&&(p.startStep("ossgov"),m.push(In(a,u).then(l=>{i.ossGovernance=l;let f=l.directDependencies+l.knownVulnerabilities.length+l.licenseRisks.length;p.completeStep("ossgov",`${l.directDependencies} direct deps`,f);}))),n?.dependencyRisk?.enabled!==false&&(p.startStep("deprisk"),m.push(Promise.resolve().then(()=>{i.dependencyRisk=Xa(r);let l=i.dependencyRisk,f=[];l.deprecatedPackages.length>0&&f.push(`${l.deprecatedPackages.length} deprecated`),l.nativeModulePackages.length>0&&f.push(`${l.nativeModulePackages.length} native`),p.completeStep("deprisk",f.join(", ")||"low risk");}))),await Promise.all(m),!t&&n?.uiPurpose?.enabled!==false){p.startStep("uipurpose"),i.uiPurpose=await De(a,u);let l=i.uiPurpose,f=[`${l.topEvidence.length} evidence`,...l.capped?["capped"]:[]].join(" \xB7 ");p.completeStep("uipurpose",f,l.topEvidence.length),await Promise.all(r.map(async h=>{let k=I.join(a,h.path),v=await De(k,u,150);v.topEvidence.length>0&&(h.uiPurpose=db(v));}));}if(await Promise.all(r.map(async l=>{let f=I.join(a,l.path),h=await En(f);h&&(l.faviconBase64=h);})),d.architecture&&n?.architecture?.enabled!==false){p.startStep("architecture"),i.architecture=await Je(a,r,i.toolingInventory,i.serviceDependencies,u);let l=i.architecture,f=l.layers.filter(h=>h.fileCount>0).length;await Promise.all(r.map(async h=>{h.architectureMermaid=await Ut(a,h,l.archetype,u),h.architecture=await Mt(a,h,u);}));for(let h of o){let v=h.projectPaths.map(b=>c.get(b)??c.get(I.dirname(b).replace(/\\/g,"/"))).filter(b=>!!b).map(b=>b.architecture).filter(b=>!!b);v.length>0&&(h.architecture=$t(v));}p.completeStep("architecture",`${l.archetype} \xB7 ${f} layer${f!==1?"s":""} \xB7 ${l.totalClassified} files`,f);}i.standards=Fe(r,i);let y=0;i.fileHotspots&&(y+=i.fileHotspots.totalFiles),i.securityPosture&&(y+=1),i.tsModernity?.typescriptVersion&&(y+=1),i.dependencyGraph?.lockfileType&&(y+=1),i.buildDeploy&&(y+=i.buildDeploy.docker.dockerfileCount,y+=i.buildDeploy.ci.length),i.codeQuality&&(y+=i.codeQuality.filesAnalyzed),i.uiPurpose&&(y+=i.uiPurpose.topEvidence.length),i.runtimeConfiguration&&(y+=i.runtimeConfiguration.hiddenConfigFiles.length),i.dataStores&&(y+=i.dataStores.databaseTechnologies.length+i.dataStores.tables.length),i.apiSurface&&(y+=i.apiSurface.integrations.length),i.operationalResilience&&(y+=i.operationalResilience.implicitTimeouts.length),i.assetBranding&&(y+=i.assetBranding.faviconFiles.length+i.assetBranding.productLogos.length),i.ossGovernance&&(y+=i.ossGovernance.directDependencies),y>0&&e.addFilesScanned(y);}var Qn=Xe;async function Jn(e,a){return kb(e,a,Xe)}export{ot as A,dt as B,ut as C,kt as D,wt as E,xt as F,Ct as G,Ut as H,Mt as I,$t as J,Je as K,Ot as L,De as M,Sn as N,xn as O,Tn as P,Pn as Q,An as R,En as S,In as T,Fn as U,Ne as V,Wn as W,Kn as X,Qn as Y,Jn as Z,Y as a,D as b,X as c,H as d,le as e,de as f,ce as g,Ce as h,ue as i,la as j,x as k,fa as l,G as m,pe as n,ya as o,Ta as p,Pa as q,$n as r,Na as s,Fe as t,Ka as u,Ln as v,On as w,Ja as x,Xa as y,nt as z};
@@ -1,2 +1,2 @@
1
- import {Za}from'./chunk-NHYABBIJ.js';import*as s from'path';import {Command}from'commander';import r from'chalk';import {execFile}from'child_process';import*as i from'fs/promises';import'os';import {promisify}from'util';var o=class{available;queue=[];constructor(t){this.available=t;}async run(t){await this.acquire();try{return await t()}finally{this.release();}}acquire(){return this.available>0?(this.available--,Promise.resolve()):new Promise(t=>this.queue.push(t))}release(){let t=this.queue.shift();t?t():this.available++;}};promisify(execFile);function v(e){return e.charCodeAt(0)===65279?e.slice(1):e}async function j(e){let t=await i.readFile(e,"utf8");return JSON.parse(v(t))}async function D(e){try{return await i.access(e),!0}catch{return false}}async function m(e){await i.mkdir(e,{recursive:true});}async function h(e,t){await m(s.dirname(e)),await i.writeFile(e,JSON.stringify(t,null,2)+`
2
- `,"utf8");}async function E(e,t){await m(s.dirname(e)),await i.writeFile(e,t,"utf8");}var n;async function f(){if(n!==void 0)return n??void 0;try{n=(await import('./dist-L4434H3J.js')).advancedScanHook??null;}catch{n=null;}return n??void 0}async function b(e){console.log(r.dim("Creating baseline..."));let t=await f(),c=await Za(e,{format:"text",concurrency:8},t),p=s.join(e,".vibgrate","baseline.json");await h(p,c),console.log(r.green("\u2714")+` Baseline saved to ${r.bold(".vibgrate/baseline.json")}`),console.log(r.dim(` Baseline score: ${c.drift.score}/100`));}var N=new Command("baseline").description("Create a drift baseline snapshot").argument("[path]","Path to baseline",".").action(async e=>{let t=s.resolve(e);await b(t);});export{o as a,j as b,D as c,m as d,E as e,f,b as g,N as h};
1
+ import {kb}from'./chunk-2GHB73ES.js';import*as s from'path';import {Command}from'commander';import r from'chalk';import {execFile}from'child_process';import*as i from'fs/promises';import'os';import {promisify}from'util';var o=class{available;queue=[];constructor(t){this.available=t;}async run(t){await this.acquire();try{return await t()}finally{this.release();}}acquire(){return this.available>0?(this.available--,Promise.resolve()):new Promise(t=>this.queue.push(t))}release(){let t=this.queue.shift();t?t():this.available++;}};promisify(execFile);function v(e){return e.charCodeAt(0)===65279?e.slice(1):e}async function j(e){let t=await i.readFile(e,"utf8");return JSON.parse(v(t))}async function D(e){try{return await i.access(e),!0}catch{return false}}async function m(e){await i.mkdir(e,{recursive:true});}async function h(e,t){await m(s.dirname(e)),await i.writeFile(e,JSON.stringify(t,null,2)+`
2
+ `,"utf8");}async function E(e,t){await m(s.dirname(e)),await i.writeFile(e,t,"utf8");}var n;async function f(){if(n!==void 0)return n??void 0;try{n=(await import('./dist-FEZOAZJW.js')).advancedScanHook??null;}catch{n=null;}return n??void 0}async function b(e){console.log(r.dim("Creating baseline..."));let t=await f(),c=await kb(e,{format:"text",concurrency:8},t),p=s.join(e,".vibgrate","baseline.json");await h(p,c),console.log(r.green("\u2714")+` Baseline saved to ${r.bold(".vibgrate/baseline.json")}`),console.log(r.dim(` Baseline score: ${c.drift.score}/100`));}var N=new Command("baseline").description("Create a drift baseline snapshot").argument("[path]","Path to baseline",".").action(async e=>{let t=s.resolve(e);await b(t);});export{o as a,j as b,D as c,m as d,E as e,f,b as g,N as h};
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import'./chunk-BSZ73KTR.js';import {d,c,e,f,b as b$1,a as a$1,h}from'./chunk-F3VR44AL.js';import {b,Ua,Fa,Xa,Wa,Va,Za,Ta}from'./chunk-NHYABBIJ.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-KWDD25OS.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-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+`
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
- `,"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=Ua(o);if(!r){console.error(l.red("Invalid DSN format.")),n.strict&&process.exit(1);return}let{body:a,contentEncoding:s}=await Ta(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=Ua(m);if(u){let f=e.region?ne(e.region):u.host,v=await Fa(n),$=await Xa(n,v),k=e.repositoryName?.trim()||await Wa(n);try{let w=await Va(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 Za(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(`
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(`
6
6
  Failing: findings detected at warn level or above.`)),process.exit(2));}if(i.driftBudget!==void 0&&p$1.drift.score>i.driftBudget&&(console.error(l.red(`
7
7
  Failing fitness function: drift score ${p$1.drift.score}/100 exceeds budget ${i.driftBudget}.`)),process.exit(2)),i.driftWorseningPercent!==void 0&&(p$1.delta===void 0&&(console.error(l.red(`
@@ -0,0 +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';
@@ -36,12 +36,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  mod
37
37
  ));
38
38
 
39
- // ../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.16_tsx@4.22.4_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js
39
+ // ../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.16_tsx@4.22.4_typescript@5.9.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js
40
40
  import path from "path";
41
41
  import { fileURLToPath } from "url";
42
42
  var getFilename, getDirname, __dirname, __filename;
43
43
  var init_esm_shims = __esm({
44
- "../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.16_tsx@4.22.4_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js"() {
44
+ "../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.7.0_postcss@8.5.16_tsx@4.22.4_typescript@5.9.3_yaml@2.9.0/node_modules/tsup/assets/esm_shims.js"() {
45
45
  "use strict";
46
46
  getFilename = () => fileURLToPath(import.meta.url);
47
47
  getDirname = () => path.dirname(getFilename());
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export{Z as runScan}from'./chunk-BSZ73KTR.js';export{i as computeDriftScore,v as formatMarkdown,u as formatSarif,t as formatText,j as generateFindings}from'./chunk-NHYABBIJ.js';import'./chunk-MKDRULJ6.js';import'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';
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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibgrate/cli",
3
- "version": "2026.630.3",
3
+ "version": "2026.701.1",
4
4
  "description": "CLI for measuring upgrade drift across Node, .NET, Python & Java projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -60,7 +60,8 @@
60
60
  "chalk": "^5.3.0",
61
61
  "commander": "^15.0.0",
62
62
  "typescript": "^5.4.0",
63
- "zod": "^4.4.3"
63
+ "zod": "^4.4.3",
64
+ "yaml": "^2.6.1"
64
65
  },
65
66
  "engines": {
66
67
  "node": ">=20.0.0"
@@ -1 +0,0 @@
1
- export{h as baselineCommand,g as runBaseline}from'./chunk-F3VR44AL.js';import'./chunk-NHYABBIJ.js';import'./chunk-MKDRULJ6.js';import'./chunk-XTHPCEME.js';import'./chunk-EK7ODJWE.js';