@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.
- package/dist/baseline-JOD5BTND.js +1 -0
- package/dist/chunk-2GHB73ES.js +143 -0
- package/dist/{chunk-BSZ73KTR.js → chunk-JSRJCKDX.js} +2 -2
- package/dist/{chunk-F3VR44AL.js → chunk-JW5BRLSC.js} +2 -2
- package/dist/cli.js +2 -2
- package/dist/dist-FEZOAZJW.js +1 -0
- package/dist/hcs-worker.js +2 -2
- package/dist/index.js +1 -1
- package/package.json +3 -2
- package/dist/baseline-KWDD25OS.js +0 -1
- package/dist/chunk-NHYABBIJ.js +0 -76
- package/dist/dist-L4434H3J.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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 {
|
|
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-
|
|
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-
|
|
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';
|
package/dist/hcs-worker.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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-
|
|
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.
|
|
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';
|