@omfalos/mokosh 0.2.0 → 0.3.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/mcp.js CHANGED
@@ -1,30 +1,34 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var jn=Object.create;var ke=Object.defineProperty;var Wn=Object.getOwnPropertyDescriptor;var zn=Object.getOwnPropertyNames;var $n=Object.getPrototypeOf,Bn=Object.prototype.hasOwnProperty;var Un=(t,e)=>{for(var r in e)ke(t,r,{get:e[r],enumerable:!0})},fr=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of zn(e))!Bn.call(t,n)&&n!==r&&ke(t,n,{get:()=>e[n],enumerable:!(s=Wn(e,n))||s.enumerable});return t};var f=(t,e,r)=>(r=t!=null?jn($n(t)):{},fr(e||!t||!t.__esModule?ke(r,"default",{value:t,enumerable:!0}):r,t)),Kn=t=>fr(ke({},"__esModule",{value:!0}),t);var tp={};Un(tp,{createMcpServer:()=>Ze});module.exports=Kn(tp);var On=require("@modelcontextprotocol/sdk/server/stdio.js");var Ln=require("@modelcontextprotocol/sdk/server/index.js"),Ye=require("@modelcontextprotocol/sdk/types.js");var ln=f(require("fs"));var Fe=f(require("fs")),nt=f(require("path"));var Jn=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],mr=[];function Ce(t){mr.push(t)}function gr(t){return[...Jn,...mr].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var Hn=[".test.",".spec.","-test.","-spec."],dr=[];function we(t){dr.push(t)}function ee(){return[...Hn,...dr]}var Qn=["jest","vitest","playwright","cypress","@testing-library/"],hr=[];function Ee(t){hr.push(t)}function tt(){return[...Qn,...hr]}var yr=.8;function rt(t){yr=t}function st(){return yr}var Vn=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function te(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let s=nt.default.resolve(t);return Fe.default.existsSync(s)?s.endsWith(".json")?xr(s):e?Sr(s):{}:{}}for(let s of Vn){let n=nt.default.resolve(t,s);if(Fe.default.existsSync(n)){if(s.endsWith(".json"))return xr(n);if(e)return Sr(n)}}return{}}function xr(t){return JSON.parse(Fe.default.readFileSync(t,"utf-8"))}function Sr(t){let e=require(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function ot(t){for(let e of t.configMatchers??[])Ce(e);for(let e of t.testPatterns??[])we(e);for(let e of t.testLibraries??[])Ee(e);t.barrelThreshold!==void 0&&rt(t.barrelThreshold)}function z(t){return{gitStats:t?.gitStats??!1,parallelParsing:t?.parallelParsing,pathAliases:t?.pathAliases}}var it=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],at=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];var br=f(require("fs")),pt=f(require("path"));function ct(t,e){let r=pt.default.resolve(t,e);try{let s=br.default.readFileSync(r,"utf-8"),n=JSON.parse(s),o=new Map;for(let[i,a]of Object.entries(n)){if(i==="total")continue;let p=a?.lines?.pct;if(typeof p!="number")continue;let c=pt.default.relative(t,i);o.set(c,p)}return o}catch{return new Map}}var Te={serialize(t){let e=["graph TD"],r=new Set;for(let s of t.nodes.values()){let n=`"${s.path}"`;for(let o of s.imports){if(!o.toPath)continue;let i=`"${o.toPath}"`,a=`${s.path} -> ${o.toPath}`;if(!r.has(a)){let p=o.isStyle?"-- styles -->":"-->";e.push(` ${n} ${p} ${i}`),r.add(a)}}}return e.join(`
3
- `)}};var lt=f(require("fs")),vr=f(require("path"));function ut(t,e){let r=t.replace(/^\.\//,"");if(e.nodes.has(r))return r;let s=r.replace(/^dist\//,"src/").replace(/\.(js|mjs|cjs)$/,".ts");return e.nodes.has(s)?s:null}function kr(t,e){if(typeof t=="string")return ut(t,e);if(t&&typeof t=="object"){let r=t;for(let s of["import","require","default"]){let n=kr(r[s],e);if(n)return n}}return null}function Xn(t){if(!t)return"unknown";let e=t.trimStart();return e.startsWith("interface ")?"interface":e.startsWith("class ")?"class":e.startsWith("enum ")?"enum":e.startsWith("type ")?"type":e.startsWith("namespace ")?"namespace":e.startsWith("const ")||e.startsWith("let ")||e.startsWith("var ")||e.startsWith("readonly ")?"const":e.startsWith("(")||e.startsWith("async ")||e.startsWith("function ")||e.includes("=>")?"function":"unknown"}function Yn(t,e){let r=new Set,s=new Set,n=[...e];for(;n.length;){let o=n.shift();if(s.has(o))continue;s.add(o);let i=t.nodes.get(o);if(i){for(let a of i.exports)r.add(a.name);for(let a of i.imports){if(a.type!=="re-export"||a.isExternal||!a.toPath)continue;if(!a.symbols?.length||a.symbols.includes("*")){let c=t.nodes.get(a.toPath);if(c)for(let m of c.exports)r.add(m.name);n.push(a.toPath)}else for(let c of a.symbols)r.add(c)}}}return r}function ft(t,e){let r=[],s=vr.default.join(e,"package.json");if(lt.default.existsSync(s))try{let n=JSON.parse(lt.default.readFileSync(s,"utf8"));if(n.exports&&typeof n.exports=="object"&&!Array.isArray(n.exports))for(let o of Object.values(n.exports)){let i=kr(o,t);i&&!r.includes(i)&&r.push(i)}else if(typeof n.exports=="string"){let o=ut(n.exports,t);o&&r.push(o)}if(r.length===0)for(let o of[n.main,n.module].filter(Boolean)){let i=ut(o,t);i&&!r.includes(i)&&r.push(i)}}catch{}if(r.length===0){for(let n of["src/index.ts","src/index.js","index.ts","index.js"])if(t.nodes.has(n)){r.push(n);break}}return r}function Zn(t,e){let r=new Set(e);for(let s of e)t.traverse(s,n=>(r.add(n.path),!0),{direction:"outgoing"});return r}function eo(t,e,r){let s=new Map;for(let n of e){if(r.includes(n))continue;let o=t.nodes.get(n);if(!o)continue;let i=o.category==="barrel";for(let a of o.exports){let p=s.get(a.name),c=!!(a.signature||a.doc);(!p||c&&!i)&&s.set(a.name,{file:n,symbol:a})}}return s}function to(t,e,r,s){let n=[];for(let o of t){let i=e.get(o),a=s.flatMap(g=>r.nodes.get(g)?.exports??[]).find(g=>g.name===o),p=i?.symbol??a,c=i?.file??s.find(g=>r.nodes.get(g)?.exports.some(d=>d.name===o))??s[0],m={name:o,definedIn:c,kind:Xn(p?.signature)};p?.doc&&(m.doc=p.doc),p?.signature&&(m.signature=p.signature),n.push(m)}return n.sort((o,i)=>o.name.localeCompare(i.name)),n}function ro(t,e,r){let s=p=>t.nodes.get(p)?.category==="test",n=[...e].filter(p=>!r.includes(p)&&!s(p)),o=[...t.nodes.keys()].filter(p=>!e.has(p)),i=o.filter(p=>!s(p)),a=o.filter(p=>s(p));return{internalFiles:n,unreachableFromEntry:i,testFiles:a}}function mt(t,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let c of e)if(!t.nodes.has(c))throw new Error(`Entry point not found in graph: ${c}`);let r=Zn(t,e),s=eo(t,r,e),n=Yn(t,e),o=to(n,s,t,e),{internalFiles:i,unreachableFromEntry:a,testFiles:p}=ro(t,r,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:p}}function gt(t,e){let r=null,s=[];for(let o of t.nodes.values()){o.exports.some(i=>i.name===e)&&(r=o.path);for(let i of o.callEdges??[])i.to===e&&s.push({file:o.path,callerFunction:i.from})}let n=[];if(r){let o=t.nodes.get(r);for(let i of o?.callEdges??[])i.from===e&&n.push({file:i.toFile,calleeFunction:i.to})}return{functionName:e,definedIn:r,callers:s,callees:n}}var so=f(require("fs")),no=f(require("path"));function Cr(t){let e=[...t.nodes.entries()].sort(([s],[n])=>s.localeCompare(n)).map(([s,n])=>`${s}:${n.mtime}:${n.size}`).join("|"),r=2166136261;for(let s=0;s<e.length;s++)r^=e.charCodeAt(s),r=Math.imul(r,16777619)>>>0;return r.toString(16).padStart(8,"0")}function dt(t){let e=new Map;for(let r of t.nodes.keys()){let s=[];t.traverse(r,n=>(n.path!==r&&s.push(n.path),!0),{direction:"incoming"}),e.set(r,s)}return{impact:e,graphHash:Cr(t)}}function ht(t,e){return t.impact.get(e)??[]}var re=f(require("path"));function oo(t){let e=new Map;for(let[r,s]of t){let n=s.imports.filter(o=>o.toPath&&!o.isExternal).length;n>0&&e.set(r,n)}return e}function io(t,e,r){let s=new Map;for(let[n,o]of e){if(o<r)continue;let i=t.get(n);if(!i||i.category==="test"||i.category==="barrel")continue;let a=re.default.extname(n),p=re.default.basename(n,a),c=p==="index"?re.default.basename(re.default.dirname(n)):p;s.set(n,{path:n,outDegree:o,tag:`feature:${c}`})}return s}function G(t,e){let r=e?.minOutDegree??5;return io(t,oo(t),r)}var ao=(t,e)=>t.outDegree-e.outDegree;function po(t,e){let r=new Map;for(let s of e.values()){let n=new Set;t.traverse(s.path,o=>(o.path!==s.path&&n.add(o.path),!0),{direction:"outgoing"}),r.set(s.path,n)}return r}function co(t,e,r,s){let n=new Map;for(let[o]of t){if(e.has(o))continue;let i=null;for(let a of e.values())r.get(a.path)?.has(o)&&(!i||s(a,i)<0)&&(i=a);i&&n.set(o,i.path)}return n}function lo(t,e){let r=new Map;for(let s of t.values()){let n=s.tag.replace("feature:",""),o=[];for(let[i,a]of e)a===s.path&&o.push(i);r.set(n,{hub:s.path,outDegree:s.outDegree,files:o})}return r}function uo(t,e,r){let s=[];for(let n of t.keys())!e.has(n)&&!r.has(n)&&s.push(n);return s}function se(t,e){let r=e?.detectFn??G,s=e?.hubComparator??ao,n=r(t.nodes,e),o=po(t,n),i=co(t.nodes,n,o,s);return{features:lo(n,i),unassigned:uo(t.nodes,n,i)}}var wr=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),Pe=new Set(["typescript","javascript","python"]),Ae=new Set(["typescript","javascript"]);function yt(t){let e=new Map;for(let r of t.nodes.values())e.set(r.type,(e.get(r.type)??0)+1);return[...e.entries()].map(([r,s])=>({type:r,fileCount:s,exportsTracked:wr.has(r),importSymbolsTracked:Pe.has(r),callEdgesTracked:Ae.has(r)})).sort((r,s)=>s.fileCount-r.fileCount)}var ne=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let r=new Set(this.nodes.keys());return e.filter(s=>!r.has(s))}findHighExportUsage(e){let r=[];for(let s of this.nodes.values()){if(s.maxExportUsage===void 0||s.maxExportUsage<e)continue;let n=s.imports.reduce((o,i)=>(i.exportUsageRatio??0)>(o?.exportUsageRatio??0)?i:o,null);r.push({path:s.path,maxExportUsage:s.maxExportUsage,tightestDep:n?.toPath??""})}return r.sort((s,n)=>n.maxExportUsage-s.maxExportUsage)}findCycles(){let e=[],r=new Set,s=new Set,n=[],o=i=>{r.add(i),s.add(i),n.push(i);let a=this.nodes.get(i);if(a){for(let p of a.imports)if(!(!p.toPath||p.isExternal))if(s.has(p.toPath)){let c=n.indexOf(p.toPath);e.push([...n.slice(c),p.toPath])}else r.has(p.toPath)||o(p.toPath)}s.delete(i),n.pop()};for(let i of this.nodes.keys())r.has(i)||o(i);return e}};var P=class t{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let r=new Map;for(let s of e.nodes)r.set(s.path,s);return new t(r)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let r of this.nodes.values())for(let s of r.imports)if(s.toPath){let n=e.get(s.toPath)||[];n.push(r.path),e.set(s.toPath,n)}return this._incomingEdgesCache=e,e}dfs(e,r,s,n){let o=new Set,i=s.maxDepth??1/0,a=(p,c,m)=>{if(c>i||o.has(p))return;let g=this.nodes.get(p);if(g&&(o.add(p),r(g,c,m)!==!1))for(let d of n(p))a(d,c+1,p)};a(e,0,null)}traverse(e,r,s={}){let n=s.direction??"outgoing",o=n==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,r,s,i=>n==="outgoing"?this.nodes.get(i)?.imports.map(a=>a.toPath).filter(Boolean)??[]:o?.get(i)??[])}getCallIncomingCache(){if(this._callIncomingCache)return this._callIncomingCache;let e=new Map;for(let r of this.nodes.values())for(let s of r.callEdges??[]){let n=e.get(s.toFile)??[];n.push(r.path),e.set(s.toFile,n)}return this._callIncomingCache=e,e}traverseCalls(e,r,s={}){let n=s.direction??"outgoing",o=n==="incoming"?this.getCallIncomingCache():null;this.dfs(e,r,s,i=>n==="outgoing"?this.nodes.get(i)?.callEdges?.map(a=>a.toFile)??[]:o?.get(i)??[])}getCallers(e){let r=[];return this.traverseCalls(e,s=>(s.path!==e&&r.push(s.path),!0),{direction:"incoming",maxDepth:1}),r}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let r=this.nodes.get(e);return r?r.imports.map(s=>this.nodes.get(s.toPath)).filter(s=>s!==void 0):[]}findUnusedFiles(e){return new ne(this.nodes).findUnusedFiles(e)}findCycles(){return new ne(this.nodes).findCycles()}};var D=class{affectedSymbols=new Map;constructor(e,r){this.affectedSymbols.set(e,new Set(["default",...r]))}updateAffectedSymbols(e,r){let s=this.affectedSymbols.get(r)||new Set,n=e.imports.find(p=>p.toPath===r);if(!n)return!1;let o=n.symbols||["*"],i=new Set;for(let p of o)(p==="*"||s.has("*")||s.has(p))&&i.add("*");if(i.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let p of i)a.add(p);return this.affectedSymbols.set(e.path,a),!0}};function oe(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(s=>s.name)}}function xt(t,e,r=1){let s=[];return t.traverse(e,(n,o,i)=>{if(n.path===e)return!0;let a=i?t.nodes.get(i)?.imports.find(p=>p.toPath===n.path):void 0;return s.push({path:n.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:r}),s}function ie(t,e){let r=[];return t.traverse(e,s=>{if(s.path===e)return!0;let n=s.imports.find(o=>o.toPath===e);return r.push({path:s.path,...n?.symbols?{symbols:n.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),r}function St(t,e,r={}){let{testsOnly:s=!1,changedSymbols:n}=r,o=n?new D(e,n):null,i=[];return t.traverse(e,(a,p,c)=>{if(a.path===e)return!0;if(o&&c&&!o.updateAffectedSymbols(a,c))return!1;let m=a.category==="test"||a.tags.some(g=>g.name==="test");return(!s||m)&&i.push(a.path),!0},{direction:"incoming"}),i}function bt(t,e,r={}){let{depth:s=1,withEdgeDetail:n=!1}=r,o=[];return t.traverseCalls(e,i=>{if(i.path===e)return!0;let a={file:i.path};return n&&(a.edges=(i.callEdges??[]).filter(p=>p.toFile===e).map(p=>({from:p.from,to:p.to}))),o.push(a),!0},{direction:"incoming",maxDepth:s}),o}function vt(t,e={}){let{metric:r="cognitiveComplexity",threshold:s=10,limit:n=20}=e;return[...t.nodes.values()].flatMap(o=>(o.functions??[]).filter(i=>i[r]>=s).map(i=>({file:o.path,name:i.name,line:i.line,complexity:i.complexity,cognitiveComplexity:i.cognitiveComplexity}))).sort((o,i)=>i[r]-o[r]).slice(0,n)}function kt(t){return{nodes:t.nodes.map(r=>({path:r.path,type:r.type,category:r.category,exports:r.exports.map(s=>s.name),tags:r.tags.filter(s=>s.kind==="comment-marker"||s.kind==="import").map(s=>s.name),importsFiles:r.imports.filter(s=>!s.isExternal&&s.toPath).map(s=>s.toPath),...r.description!==void 0&&{description:r.description},...r.testedBy!==void 0&&{testedBy:r.testedBy},...r.coveragePct!==void 0&&{coveragePct:r.coveragePct},...r.avgExportUsage!==void 0&&{avgExportUsage:r.avgExportUsage},...r.maxExportUsage!==void 0&&{maxExportUsage:r.maxExportUsage}})),cycles:t.cycles}}function Ct(t){let e=t.getPackageDependencies(),r=Array.from(t.packages.values()).map(({graph:s,pkg:n})=>({name:n.name,relativeRoot:n.relativeRoot,nodeCount:s.nodes.size,dependsOn:e.get(n.name)??[]}));return{monorepoType:t.type,packageCount:r.length,packages:r}}function wt(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function Er(t){if(t.category==="test")return"test";if(t.category==="config")return"config";if(t.category==="type-only")return"types";let e=t.path;return x(e,"component")||x(e,"components")?"component":x(e,"controller")||x(e,"controllers")?"controller":x(e,"middleware")?"middleware":x(e,"router")||x(e,"routes")||x(e,"route")?"router":x(e,"store")||x(e,"stores")?"store":x(e,"service")||x(e,"services")?"service":x(e,"handler")||x(e,"handlers")?"handler":x(e,"adapter")||x(e,"adapters")?"adapter":x(e,"plugin")||x(e,"plugins")?"plugin":x(e,"api")?"api":x(e,"cli")||x(e,"commands")||ae(e)==="cli"?"cli":x(e,"util")||x(e,"utils")||x(e,"helper")||x(e,"helpers")?"util":x(e,"model")||x(e,"models")||ae(e)==="model"?"model":x(e,"parser")||x(e,"parsers")||ae(e)==="parser"?"parser":ae(e)==="builder"?"builder":ae(e)==="resolver"?"resolver":"other"}function x(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function ae(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function Et(t,e){let r=se(t,e),s=new Map;for(let[o,i]of r.features){for(let a of i.files)s.set(a,o);s.set(i.hub,o)}let n=new Map;for(let o of t.nodes.values()){let i=s.get(o.path);n.set(o.path,{path:o.path,role:Er(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return n}function Ft(t,e){let r=[];for(let s of t.nodes.values())if(s.exports.some(n=>n.name===e))if(Ae.has(s.type)){let n=[];for(let o of t.nodes.values())for(let i of o.callEdges??[])i.to===e&&n.push({file:o.path,callerFunction:i.from});r.push({path:s.path,category:s.category,precision:"call",callers:n})}else if(Pe.has(s.type)){let n=[];for(let o of t.nodes.values())for(let i of o.imports)i.toPath===s.path&&i.symbols?.includes(e)&&n.push({file:o.path,symbols:i.symbols});r.push({path:s.path,category:s.category,precision:"import-symbol",importers:n})}else{let n=ie(t,s.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));r.push({path:s.path,category:s.category,precision:"file-level",importers:n})}return r}function fo(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function mo(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function Tt(t){let e=new Map;for(let s of t.nodes.values())if(!(s.type!=="typescript"&&s.type!=="javascript"))for(let n of s.exports){if(!mo(n,s.category))continue;let o=`${s.path}::${n.name}`;e.set(o,{name:n.name,file:s.path,kind:fo(n.signature),...n.doc?{doc:n.doc}:{}})}let r=[];for(let s of t.nodes.values())if(!(s.type!=="typescript"&&s.type!=="javascript")){for(let n of s.imports)if(!(!n.toPath||n.isExternal||!n.symbols?.length))for(let o of n.symbols)e.has(`${n.toPath}::${o}`)&&r.push({fromFile:s.path,toType:o,toFile:n.toPath})}return{types:e,edges:r}}function Pt(t,e){let r=null;for(let o of t.types.values())if(o.name===e){r=o;break}if(!r)return{type:null,usedByFiles:[],uses:[]};let s=new Set,n=new Map;for(let o of t.edges)if(o.toType===e&&o.toFile===r.file&&s.add(o.fromFile),o.fromFile===r.file){let i=t.types.get(`${o.toFile}::${o.toType}`);i&&n.set(`${i.file}::${i.name}`,i)}return{type:r,usedByFiles:Array.from(s),uses:Array.from(n.values())}}var Wr=f(require("path"));var Ie=f(require("fs")),It=f(require("path"));var $=f(require("fs")),w=f(require("path"));var At=f(require("fs")),go=f(require("path"));function Fr(t){try{return At.default.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Me(t){try{return At.default.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Mt(t,e){let r=w.default.join(e,"package.json");if(!$.default.existsSync(r))return null;let s={};try{s=JSON.parse($.default.readFileSync(r,"utf-8"))}catch{return null}let n=s.name;return n?{name:n,root:e,relativeRoot:w.default.relative(t,e),entryPoints:ho(e,s)}:null}function ho(t,e){let r=[];if(e.exports){let n=e.exports;if(typeof n=="string")r.push(w.default.join(t,n));else if(typeof n=="object"&&n!==null){let o=n["."];if(typeof o=="string")r.push(w.default.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(w.default.join(t,i))}}}e.main&&r.push(w.default.join(t,e.main));for(let n of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(w.default.join(t,n));let s=r.filter(Me);return s.length>0?s.slice(0,1):r.slice(0,1)}function B(t,e){let r=[],s=new Set;for(let n of e){let o=n.replace(/\/$/,"").replace(/^\.\//,"");yo(t,o,s,r)}return r}function yo(t,e,r,s){if(!e.includes("*")){xo(t,e,r,s);return}let n=e.split("/");n.includes("**")?So(t,n,r,s):bo(t,n,r,s)}function xo(t,e,r,s){let n=w.default.join(t,e);if(r.has(n)||!Fr(n))return;r.add(n);let o=Mt(t,n);o&&s.push(o)}function So(t,e,r,s){let n=w.default.join(t,e[0]==="**"?"":e[0]??"");Tr(t,n,r,s)}function bo(t,e,r,s){let n=e.findIndex(a=>a.includes("*")),o=w.default.join(t,...e.slice(0,n)),i;try{i=$.default.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let p=w.default.join(o,a.name);if(r.has(p))continue;r.add(p);let c=Mt(t,p);c&&s.push(c)}}function Tr(t,e,r,s){let n;try{n=$.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of n){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=w.default.join(e,o.name);if($.default.existsSync(w.default.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=Mt(t,i);a&&s.push(a)}else Tr(t,i,r,s)}}var Pr={type:"npm",detect(t){let e=It.default.join(t,"package.json");if(!Ie.default.existsSync(e))return null;let r;try{r=JSON.parse(Ie.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||Ie.default.existsSync(It.default.join(t,"yarn.lock")))return null;let s=Array.isArray(r)?r:r.packages??[];return s.length===0?null:B(t,s)}};var _=f(require("fs")),v=f(require("path"));var Ar={type:"nx",detect(t){return _.default.existsSync(v.default.join(t,"nx.json"))?Mr(t,t,new Set,0).map(r=>vo(t,r,v.default.join(r,"project.json"))).filter(r=>r!==null):null}};function Mr(t,e,r,s){if(s>4)return[];let n;try{n=_.default.readdirSync(e,{withFileTypes:!0})}catch{return[]}let o=[];for(let i of n){if(!i.isDirectory())continue;let a=i.name;if(a.startsWith(".")||a==="node_modules"||a==="dist"||a===".nx")continue;let p=v.default.join(e,a);_.default.existsSync(v.default.join(p,"project.json"))&&!r.has(p)?(r.add(p),o.push(p)):o.push(...Mr(t,p,r,s+1))}return o}function vo(t,e,r){let s={};try{s=JSON.parse(_.default.readFileSync(r,"utf-8"))}catch{return null}let n=s.name,o,i,a=v.default.join(e,"package.json");if(_.default.existsSync(a))try{let p=JSON.parse(_.default.readFileSync(a,"utf-8"));n=p.name??n,o=p.main,i=p.exports}catch{}return n?{name:n,root:e,relativeRoot:v.default.relative(t,e),entryPoints:ko(e,s,o,i)}:null}function ko(t,e,r,s){let n=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=v.default.resolve(t,"../..");n.push(v.default.resolve(a,o)),n.push(v.default.resolve(t,o))}if(s){let a=s;if(typeof a=="string")n.push(v.default.join(t,a));else if(typeof a=="object"&&a!==null){let p=a["."];typeof p=="string"&&n.push(v.default.join(t,p))}}if(r&&n.push(v.default.join(t,r)),e.sourceRoot){let a=v.default.resolve(t,"../.."),p=v.default.resolve(a,e.sourceRoot);n.push(v.default.join(p,"index.ts"),v.default.join(p,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])n.push(v.default.join(t,a));let i=n.filter(Me);return i.length>0?i.slice(0,1):n.slice(0,1)}var Nt=f(require("fs")),Ir=f(require("path")),Nr=require("js-yaml");var Rr={type:"pnpm",detect(t){let e=Ir.default.join(t,"pnpm-workspace.yaml");if(!Nt.default.existsSync(e))return null;let r=[];try{r=(0,Nr.load)(Nt.default.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return B(t,r)}};var Gr=f(require("fs")),Dr=f(require("path")),_r={type:"turborepo",detect(t){return Gr.default.existsSync(Dr.default.join(t,"turbo.json"))?[]:null}};var Ne=f(require("fs")),Rt=f(require("path"));var Lr={type:"yarn",detect(t){if(!Ne.default.existsSync(Rt.default.join(t,"yarn.lock")))return null;let e=Rt.default.join(t,"package.json");if(!Ne.default.existsSync(e))return null;let r;try{r=JSON.parse(Ne.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r)return null;let s=Array.isArray(r)?r:r.packages??[];return s.length===0?null:B(t,s)}};var Or=[];function M(t){Or.push(t)}function jr(){return Or}M(_r);M(Ar);M(Rr);M(Lr);M(Pr);function pe(t,e=jr()){let r=Wr.default.resolve(t),s=new Map,n=[];for(let i of e){let a=i.detect(r);if(a!==null){n.push(i.type);for(let p of a)s.has(p.name)||s.set(p.name,p)}}if(n.length===0)return{root:r,type:"none",types:[],packages:[],packageMap:new Map};let o=Array.from(s.values());return{root:r,type:n[0],types:n,packages:o,packageMap:new Map(o.map(i=>[i.name,i]))}}var ce=class t{constructor(e,r){this.monorepoRoot=e;this.type=r}monorepoRoot;type;packages=new Map;addPackage(e,r){this.packages.set(e.name,{graph:r,pkg:e})}getPackageForFile(e){for(let{pkg:r}of this.packages.values())if(e===r.relativeRoot||e.startsWith(`${r.relativeRoot}/`))return r}getPackageDependencies(){let e=new Map;for(let{graph:r,pkg:s}of this.packages.values()){let n=new Set;for(let o of r.nodes.values())for(let i of o.imports)i.isWorkspace&&i.workspacePackage&&n.add(i.workspacePackage);e.set(s.name,[...n])}return e}getAffectedAcrossPackages(e){let r=this.getPackageForFile(e);if(!r)return[];let s=this.packages.get(r.name);if(!s)return[];let n=[];s.graph.traverse(e,o=>(o.path!==e&&n.push({file:o.path,package:r.name}),!0),{direction:"incoming"});for(let{graph:o,pkg:i}of this.packages.values())if(i.name!==r.name)for(let a of o.nodes.values())a.imports.some(c=>c.isWorkspace&&c.workspacePackage===r.name)&&n.push({file:a.path,package:i.name});return n}serialize(){return{monorepoRoot:this.monorepoRoot,type:this.type,packages:Array.from(this.packages.values()).map(({graph:e,pkg:r})=>({pkg:{name:r.name,relativeRoot:r.relativeRoot,entryPoints:r.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let r=new t(e.monorepoRoot,e.type);for(let{pkg:s,nodes:n}of e.packages){let o=new Map(n.map(a=>[a.path,a])),i=new P(o);r.packages.set(s.name,{graph:i,pkg:{...s,root:""}})}return r}};var zr=new Map;function U(t,e){zr.set(t,e)}function $r(t){return zr.get(t)}function Br(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function Co(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var wo=(t,e)=>!e.category||Br(t.category,e.category),Eo=(t,e)=>!e.type||Br(t.type,e.type),Fo=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,To=(t,e)=>!e.path||Co(t.path,e.path),Po=(t,e)=>e.isExternal===void 0?!0:t.imports.some(s=>s.isExternal)===e.isExternal,Ao=(t,e)=>{if(!e.tags||e.tags.length===0)return!0;let r=e.tags.filter(n=>!n.startsWith("!")),s=e.tags.filter(n=>n.startsWith("!")).map(n=>n.slice(1));return!(r.length>0&&!r.some(n=>t.tags.some(o=>o.name===n))||s.some(n=>t.tags.some(o=>o.name===n)))},Mo=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(s=>s.name===r)),Io=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),No=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(n=>n.includes(e.importedBy)),Ro=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,Go=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,Do=(t,e)=>e.minSize===void 0||t.size>=e.minSize,_o=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,Lo=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,Oo=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,jo=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,Wo=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,zo=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,$o=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,Bo=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,Uo=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Ko=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Jo=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,Ho=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Qo=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,Vo=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,qo=(t,e,r)=>!e.any?.length||e.any.some(s=>le(t,s,r)),Xo=[wo,Eo,Fo,To,Po,Ao,Mo,Io,No,Ro,Go,Do,_o,Lo,Oo,jo,Wo,zo,$o,Bo,Uo,Ko,Jo,Ho,Qo,Vo,qo];function le(t,e,r){return Xo.every(s=>s(t,e,r))}function Re(t,e){let r=new Map;if(e.importedBy!==void 0){for(let i of t.nodes)for(let a of i.imports)if(a.toPath){let p=r.get(a.toPath)??[];p.push(i.path),r.set(a.toPath,p)}}let s=t.nodes.filter(i=>le(i,e,r)),n=new Set(s.map(i=>i.path)),o=s.map(i=>({...i,imports:i.imports.filter(a=>!a.toPath||n.has(a.toPath))}));if(e.sort){let i=e.sortDir==="asc"?-1:1;o.sort((a,p)=>{let c=0;return e.sort==="size"?c=p.size-a.size:e.sort==="imports"?c=p.imports.length-a.imports.length:e.sort==="commitCount90d"?c=(p.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?c=(p.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?c=(p.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(c=(p.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),c*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:t.cycles?.filter(i=>i.every(a=>n.has(a)))??void 0}}function Ur(t,e){let r=e.indexOf(":");if(r===-1)return;let s=e.slice(0,r).trim().toLowerCase(),n=e.slice(r+1).trim();if(!(!s||!n))switch(s){case"category":t.category=n;break;case"type":t.type=n;break;case"tag":case"tags":n.includes("+")?t.allTags=[...t.allTags??[],...n.split("+")]:t.tags=[...t.tags??[],n];break;case"path":t.path=n;break;case"external":t.isExternal=n.toLowerCase()==="true";break;case"importsfile":t.importsFile=n;break;case"importedby":t.importedBy=n;break;case"minimports":t.minImports=parseInt(n,10);break;case"maximports":t.maxImports=parseInt(n,10);break;case"minsize":t.minSize=parseInt(n,10);break;case"maxsize":t.maxSize=parseInt(n,10);break;case"sort":t.sort=n;break;case"sortdir":t.sortDir=n.toLowerCase()==="asc"?"asc":"desc";break;case"limit":t.limit=parseInt(n,10);break;case"hasdocstring":t.hasDocstring=n.toLowerCase()!=="false";break;case"mincoverage":t.minCoverage=parseInt(n,10);break;case"maxcoverage":t.maxCoverage=parseInt(n,10);break;case"minexportusage":t.minExportUsage=parseFloat(n);break;case"maxexportusage":t.maxExportUsage=parseFloat(n);break;case"mincomplexity":t.minComplexity=parseInt(n,10);break;case"maxcomplexity":t.maxComplexity=parseInt(n,10);break;case"mincognitivecomplexity":t.minCognitiveComplexity=parseInt(n,10);break;case"maxcognitivecomplexity":t.maxCognitiveComplexity=parseInt(n,10);break;case"mincommits":t.minCommits=parseInt(n,10);break;case"maxcommits":t.maxCommits=parseInt(n,10);break;case"isdocumented":t.isDocumented=n.toLowerCase()!=="false";break;case"isstale":t.isStale=n.toLowerCase()!=="false";break;case"lastauthor":t.lastAuthor=n;break}}function Yo(t){let e=[];for(let r of t.split("|")){let s=r.trim();if(!s)continue;let n={};Ur(n,s),Object.keys(n).length>0&&e.push(n)}return e}function Ge(t){let e={},r=t.split(",");for(let s of r){let n=s.trim();if(n.toLowerCase().startsWith("any(")&&n.endsWith(")")){let o=n.slice(4,-1),i=Yo(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}Ur(e,s)}return e}var Jt=f(require("fs/promises")),es=f(require("path"));var $e=f(require("path")),ue=f(require("typescript"));var Gt=f(require("path")),Dt=f(require("typescript"));var k=f(require("typescript")),Kr=new Set(["describe","test","it"]);function K(t){let e=[];for(let r of t.statements){if(!k.default.isExpressionStatement(r))continue;let s=r.expression;if(!k.default.isCallExpression(s))continue;let n=s.expression;k.default.isIdentifier(n)&&Kr.has(n.text)&&e.push(s),k.default.isPropertyAccessExpression(n)&&k.default.isIdentifier(n.expression)&&Kr.has(n.expression.text)&&e.push(s)}return e}function J(t,e,r){for(let s of t.arguments){if(!k.default.isObjectLiteralExpression(s))continue;let n=s.properties.find(o=>k.default.isPropertyAssignment(o)&&k.default.isIdentifier(o.name)&&o.name.text===e);if(!(!n||!k.default.isArrayLiteralExpression(n.initializer)))return n.initializer.elements.filter(k.default.isStringLiteral).map(o=>o.text)}return null}function H(t,e,r,s){if(t.arguments.length===0)return null;for(let o=1;o<t.arguments.length;o++){let i=t.arguments[o];if(!k.default.isObjectLiteralExpression(i))continue;let a=i.properties.find(c=>k.default.isPropertyAssignment(c)&&k.default.isIdentifier(c.name)&&c.name.text===e);if(a)return{start:a.initializer.getStart(s),end:a.initializer.getEnd(),text:r};let p=i.getEnd()-1;return{start:p,end:p,text:`${i.properties.length>0?", ":""}${e}: ${r}`}}let n=t.arguments[t.arguments.length-1];return{start:n.getStart(s),end:n.getStart(s),text:`{ ${e}: ${r} }, `}}function Q(t,e,r){let s=t.arguments;for(let n=1;n<s.length;n++){let o=s[n];if(!k.default.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(p=>k.default.isPropertyAssignment(p)&&k.default.isIdentifier(p.name)&&p.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:s[n-1].getEnd(),end:o.getEnd(),text:""};let a=o.properties[i];return i===o.properties.length-1?{start:o.properties[i-1].getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:o.properties[i+1].getStart(r),text:""}}return null}function V(t,e){let r=[...e].sort((n,o)=>o.start-n.start),s=t;for(let n of r)s=s.slice(0,n.start)+n.text+s.slice(n.end);return s}function q(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var T=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function Zo(t){return q(t.map(e=>`@${e}`))}function ei(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}var De=class{name="cypress";canHandle(e){return T.has(Gt.default.extname(e).toLowerCase())}apply(e,r,s){let n=Dt.default.createSourceFile(Gt.default.basename(e),r,Dt.default.ScriptTarget.Latest,!0),o=K(n);if(o.length===0)return r;let i=J(o[0],"tags",n),a=[...s].sort();if(i!==null&&JSON.stringify(ei(i).sort())===JSON.stringify(a))return r;let p=o.flatMap(c=>{let m=s.length===0?Q(c,"tags",n):H(c,"tags",Zo(a),n);return m?[m]:[]});return p.length>0?V(r,p):r}};var Jr=f(require("path")),_t=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Lt=/^@([a-zA-Z0-9_-]+)/gm;function ti(t){return["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
4
- `)+`
2
+ "use strict";var lo=Object.create;var Pe=Object.defineProperty;var fo=Object.getOwnPropertyDescriptor;var uo=Object.getOwnPropertyNames;var mo=Object.getPrototypeOf,go=Object.prototype.hasOwnProperty;var ho=(r,e)=>{for(var t in e)Pe(r,t,{get:e[t],enumerable:!0})},Cr=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of uo(e))!go.call(r,s)&&s!==t&&Pe(r,s,{get:()=>e[s],enumerable:!(n=fo(e,s))||n.enumerable});return r};var g=(r,e,t)=>(t=r!=null?lo(mo(r)):{},Cr(e||!r||!r.__esModule?Pe(t,"default",{value:r,enumerable:!0}):t,r)),yo=r=>Cr(Pe({},"__esModule",{value:!0}),r);var Oc={};ho(Oc,{createMcpServer:()=>at});module.exports=yo(Oc);var po=require("@modelcontextprotocol/sdk/server/stdio.js");var co=require("@modelcontextprotocol/sdk/server/index.js"),it=require("@modelcontextprotocol/sdk/types.js");var Ds=g(require("fs"));var Me=g(require("fs")),ft=g(require("path"));var xo=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],Fr=[];function Ae(r){Fr.push(r)}function Er(r){return[...xo,...Fr].some(e=>typeof e=="string"?r.includes(e):e instanceof RegExp?e.test(r):e(r))}var So=[".test.",".spec.","-test.","-spec."],Tr=[];function Ne(r){Tr.push(r)}function oe(){return[...So,...Tr]}var bo=["jest","vitest","playwright","cypress","@testing-library/"],Pr=[];function Ie(r){Pr.push(r)}function ct(){return[...bo,...Pr]}var Ar=.8;function pt(r){Ar=r}function lt(){return Ar}var vo=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function ie(r,{allowJs:e=!0,isExplicitPath:t=!1}={}){if(t){let n=ft.default.resolve(r);return Me.default.existsSync(n)?n.endsWith(".json")?Nr(n):e?Ir(n):{}:{}}for(let n of vo){let s=ft.default.resolve(r,n);if(Me.default.existsSync(s)){if(n.endsWith(".json"))return Nr(s);if(e)return Ir(s)}}return{}}function Nr(r){return JSON.parse(Me.default.readFileSync(r,"utf-8"))}function Ir(r){let e=require(r);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function ut(r){for(let e of r.configMatchers??[])Ae(e);for(let e of r.testPatterns??[])Ne(e);for(let e of r.testLibraries??[])Ie(e);r.barrelThreshold!==void 0&&pt(r.barrelThreshold)}function q(r){return{gitStats:r?.gitStats??!1,parallelParsing:r?.parallelParsing,pathAliases:r?.pathAliases}}var O=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],mt=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];var Mr=g(require("fs")),gt=g(require("path"));function dt(r,e){let t=gt.default.resolve(r,e);try{let n=Mr.default.readFileSync(t,"utf-8"),s=JSON.parse(n),o=new Map;for(let[i,a]of Object.entries(s)){if(i==="total")continue;let c=a?.lines?.pct;if(typeof c!="number")continue;let p=gt.default.relative(r,i);o.set(p,c)}return o}catch{return new Map}}var De={serialize(r){let e=["graph TD"],t=new Set;for(let n of r.nodes.values()){let s=`"${n.path}"`;for(let o of n.imports){if(!o.toPath)continue;let i=`"${o.toPath}"`,a=`${n.path} -> ${o.toPath}`;if(!t.has(a)){let c=o.isStyle?"-- styles -->":"-->";e.push(` ${s} ${c} ${i}`),t.add(a)}}}return e.join(`
3
+ `)}};var ht=g(require("fs")),Dr=g(require("path"));function yt(r,e){let t=r.replace(/^\.\//,"");if(e.nodes.has(t))return t;let n=t.replace(/^dist\//,"src/").replace(/\.(js|mjs|cjs)$/,".ts");return e.nodes.has(n)?n:null}function Rr(r,e){if(typeof r=="string")return yt(r,e);if(r&&typeof r=="object"){let t=r;for(let n of["import","require","default"]){let s=Rr(t[n],e);if(s)return s}}return null}function wo(r){if(!r)return"unknown";let e=r.trimStart();return e.startsWith("interface ")?"interface":e.startsWith("class ")?"class":e.startsWith("enum ")?"enum":e.startsWith("type ")?"type":e.startsWith("namespace ")?"namespace":e.startsWith("const ")||e.startsWith("let ")||e.startsWith("var ")||e.startsWith("readonly ")?"const":e.startsWith("(")||e.startsWith("async ")||e.startsWith("function ")||e.includes("=>")?"function":"unknown"}function Co(r,e){let t=new Set,n=new Set,s=[...e];for(;s.length;){let o=s.shift();if(n.has(o))continue;n.add(o);let i=r.nodes.get(o);if(i){for(let a of i.exports)t.add(a.name);for(let a of i.imports){if(a.type!=="re-export"||a.isExternal||!a.toPath)continue;if(!a.symbols?.length||a.symbols.includes("*")){let p=r.nodes.get(a.toPath);if(p)for(let l of p.exports)t.add(l.name);s.push(a.toPath)}else for(let p of a.symbols)t.add(p)}}}return t}function xt(r,e){let t=[],n=Dr.default.join(e,"package.json");if(ht.default.existsSync(n))try{let s=JSON.parse(ht.default.readFileSync(n,"utf8"));if(s.exports&&typeof s.exports=="object"&&!Array.isArray(s.exports))for(let o of Object.values(s.exports)){let i=Rr(o,r);i&&!t.includes(i)&&t.push(i)}else if(typeof s.exports=="string"){let o=yt(s.exports,r);o&&t.push(o)}if(t.length===0)for(let o of[s.main,s.module].filter(Boolean)){let i=yt(o,r);i&&!t.includes(i)&&t.push(i)}}catch{}if(t.length===0){for(let s of["src/index.ts","src/index.js","index.ts","index.js"])if(r.nodes.has(s)){t.push(s);break}}return t}function Fo(r,e){let t=new Set(e);for(let n of e)r.traverse(n,s=>(t.add(s.path),!0),{direction:"outgoing"});return t}function Eo(r,e,t){let n=new Map;for(let s of e){if(t.includes(s))continue;let o=r.nodes.get(s);if(!o)continue;let i=o.category==="barrel";for(let a of o.exports){let c=n.get(a.name),p=!!(a.signature||a.doc);(!c||p&&!i)&&n.set(a.name,{file:s,symbol:a})}}return n}function To(r,e,t,n){let s=[];for(let o of r){let i=e.get(o),a=n.flatMap(f=>t.nodes.get(f)?.exports??[]).find(f=>f.name===o),c=i?.symbol??a,p=i?.file??n.find(f=>t.nodes.get(f)?.exports.some(d=>d.name===o))??n[0],l={name:o,definedIn:p,kind:wo(c?.signature)};c?.doc&&(l.doc=c.doc),c?.signature&&(l.signature=c.signature),s.push(l)}return s.sort((o,i)=>o.name.localeCompare(i.name)),s}function Po(r,e,t){let n=c=>r.nodes.get(c)?.category==="test",s=[...e].filter(c=>!t.includes(c)&&!n(c)),o=[...r.nodes.keys()].filter(c=>!e.has(c)),i=o.filter(c=>!n(c)),a=o.filter(c=>n(c));return{internalFiles:s,unreachableFromEntry:i,testFiles:a}}function St(r,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let p of e)if(!r.nodes.has(p))throw new Error(`Entry point not found in graph: ${p}`);let t=Fo(r,e),n=Eo(r,t,e),s=Co(r,e),o=To(s,n,r,e),{internalFiles:i,unreachableFromEntry:a,testFiles:c}=Po(r,t,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:c}}function bt(r,e){let t=null,n=[];for(let o of r.nodes.values()){o.exports.some(i=>i.name===e)&&(t=o.path);for(let i of o.callEdges??[])i.to===e&&n.push({file:o.path,callerFunction:i.from})}let s=[];if(t){let o=r.nodes.get(t);for(let i of o?.callEdges??[])i.from===e&&s.push({file:i.toFile,calleeFunction:i.to})}return{functionName:e,definedIn:t,callers:n,callees:s}}var Ao=g(require("fs")),No=g(require("path"));function Gr(r){let e=[...r.nodes.entries()].sort(([n],[s])=>n.localeCompare(s)).map(([n,s])=>`${n}:${s.mtime}:${s.size}`).join("|"),t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")}function vt(r){let e=new Map;for(let t of r.nodes.keys()){let n=[];r.traverse(t,s=>(s.path!==t&&n.push(s.path),!0),{direction:"incoming"}),e.set(t,n)}return{impact:e,graphHash:Gr(r)}}function kt(r,e){return r.impact.get(e)??[]}var Br=require("fs/promises"),Re=g(require("path"));var ae=g(require("fs")),Lr=g(require("path")),wt=require("js-yaml"),Ct=["package-lock.json","yarn.lock","pnpm-lock.yaml"];function _r(r){let e=r.lastIndexOf("@");return e>0?r.substring(0,e):r}function Io(r){return r.replace(/:$/,"").split(",").map(e=>{let t=e.trim();return t.startsWith('"')&&(t=t.slice(1)),t.endsWith('"')&&(t=t.slice(0,-1)),_r(t)}).filter(Boolean)}function Mo(r,e){let t=r.startsWith("/")?r.slice(1):r,n=t.lastIndexOf("@");return n>0?{name:t.substring(0,n),version:e||t.substring(n+1)}:{name:t,version:e}}function Do(r){try{let e=(0,wt.load)(r),t={dependencies:{}};for(let[n,s]of Object.entries(e))if(!(n==="__metadata"||!s?.version))for(let o of n.split(", ")){let i=_r(o);i&&(t.dependencies[i]={version:s.version,...s.dependencies!==void 0&&{dependencies:s.dependencies}})}return t}catch{return null}}function Ro(r){let e={dependencies:{}};for(let t of r.split(/\n\n+/)){let n=t.split(`
4
+ `).filter(c=>c.trim().length>0&&!c.trim().startsWith("#"));if(n.length<2)continue;let s=n[0];if(!s||s.startsWith(" "))continue;let o=Io(s);if(o.length===0)continue;let a=n.find(c=>c.trim().startsWith('version "'))?.match(/version "(.*?)"/)?.[1]??"";for(let c of o)e.dependencies[c]={version:a}}return e}function Go(r){let e=ae.default.readFileSync(r,"utf-8"),t=JSON.parse(e),n={dependencies:{}};if(t.packages)for(let[s,o]of Object.entries(t.packages)){if(!s.startsWith("node_modules/"))continue;let i=s.replace("node_modules/","");i.includes("node_modules/")||(n.dependencies[i]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}else if(t.dependencies)for(let[s,o]of Object.entries(t.dependencies))n.dependencies[s]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}};return n}function Lo(r){let e=ae.default.readFileSync(r,"utf-8");if(e.includes("__metadata:")){let t=Do(e);if(t!==null)return t}return Ro(e)}function _o(r){let e=ae.default.readFileSync(r,"utf-8"),t={dependencies:{}};try{let n=(0,wt.load)(e);if(n.packages)for(let[s,o]of Object.entries(n.packages)){let{name:i,version:a}=Mo(s,o.version);i&&(t.dependencies[i]={version:a,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}if(n.dependencies)for(let[s,o]of Object.entries(n.dependencies)){if(t.dependencies[s])continue;let i=typeof o=="string"?o:o.version;t.dependencies[s]={version:i||""}}}catch{}return t}function Or(r){let e={"package-lock.json":Go,"yarn.lock":Lo,"pnpm-lock.yaml":_o},t=Ct.map(n=>[n,e[n]]);for(let[n,s]of t){let o=Lr.default.join(r,n);if(ae.default.existsSync(o))return s(o)}return null}function Oo(r){let e=5381;for(let t=0;t<r.length;t++)e=e*33+r.charCodeAt(t)>>>0;return e.toString(36)}function jo(r,e){let t=[];for(let n=0;n<=r.length-e;n++)t.push(Oo(r.slice(n,n+e).map(s=>s.text).join(" ")));return t}function Wo(r,e,t){let n=r.get(e.file),s=r.get(t.file);if(!n||!s)return 0;let o=0;for(;e.windowIndex+o+1<n.length&&t.windowIndex+o+1<s.length&&n[e.windowIndex+o+1]===s[t.windowIndex+o+1];)o++;return o}function zo(r,e,t){if(e.windowIndex===0||t.windowIndex===0)return!0;let n=r.get(e.file),s=r.get(t.file);return!n||!s?!0:n[e.windowIndex-1]!==s[t.windowIndex-1]}function jr(r,e,t){let n=new Map,s=new Map,o=new Map;for(let{file:a,tokens:c}of r){if(c.length<e)continue;s.set(a,c);let p=jo(c,e);n.set(a,p);for(let l=0;l<p.length;l++){let f={file:a,windowIndex:l},d=o.get(p[l]);d?d.push(f):o.set(p[l],[f])}}let i=[];for(let a of o.values())if(!(a.length<2))for(let c=0;c<a.length;c++)for(let p=c+1;p<a.length;p++){let l=a[c],f=a[p];if(l.file===f.file&&l.windowIndex===f.windowIndex||!zo(n,l,f))continue;let d=Wo(n,l,f),h=e+d;if(l.file===f.file){let[R,Q]=l.windowIndex<f.windowIndex?[l,f]:[f,l];if(R.windowIndex+h>Q.windowIndex)continue}let v=s.get(l.file),x=s.get(f.file),k={file:l.file,startLine:v[l.windowIndex].line,endLine:v[l.windowIndex+h-1].line},T={file:f.file,startLine:x[f.windowIndex].line,endLine:x[f.windowIndex+h-1].line},I=Math.min(k.endLine-k.startLine+1,T.endLine-T.startLine+1);I<t||i.push({occurrences:[k,T],lines:I,tokens:h})}return i.sort((a,c)=>c.lines-a.lines)}var $o={typescript:{line:["//"],block:[["/*","*/"]]},javascript:{line:["//"],block:[["/*","*/"]]},go:{line:["//"],block:[["/*","*/"]]},css:{block:[["/*","*/"]]},scss:{line:["//"],block:[["/*","*/"]]},less:{line:["//"],block:[["/*","*/"]]},stylus:{line:["//"],block:[["/*","*/"]]},python:{line:["#"]},gherkin:{line:["#"]},coffeescript:{line:["#"],block:[["###","###"]]},livescript:{line:["#"],block:[["###","###"]]},lua:{line:["--"],block:[["--[[","]]"]]},markdown:{block:[["<!--","-->"]]}};function Wr(r,e,t){let n=r.slice(e,t).replace(/[^\n]/g," ");return r.slice(0,e)+n+r.slice(t)}function Bo(r,e){if(!e)return r;let t=r;for(let[n,s]of e.block??[]){let o=0;for(;;){let i=t.indexOf(n,o);if(i===-1)break;let a=t.indexOf(s,i+n.length),c=a===-1?t.length:a+s.length;t=Wr(t,i,c),o=c}}for(let n of e.line??[]){let s=0;for(;;){let o=t.indexOf(n,s);if(o===-1)break;let i=t.indexOf(`
5
+ `,o),a=i===-1?t.length:i;t=Wr(t,o,a),s=a}}return t}var Uo=["===","!==","...","=>","==","!=","<=",">=","&&","||","::","->","..","+=","-=","*=","/="],Ft=new RegExp(`${Uo.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")}|[A-Za-z_$][A-Za-z0-9_$]*|\\d+(?:\\.\\d+)?|"(?:\\\\.|[^"\\\\])*"|'(?:\\\\.|[^'\\\\])*'|\`(?:\\\\.|[^\`\\\\])*\`|\\S`,"g"),Ko=/^[A-Za-z_$][A-Za-z0-9_$]*$/,zr=/^\d+(?:\.\d+)?$/,Jo=/^(".*"|'.*'|`.*`)$/s,Vo=new Set(["if","else","elif","for","while","do","switch","case","default","break","continue","return","function","def","class","struct","interface","const","let","var","local","import","export","from","package","try","catch","except","finally","throw","raise","new","this","self","end","then","yield","async","await","nil","null","None","true","false","True","False","and","or","not","in","of","is"]);function $r(r,e,t=!0){let n=Bo(r,$o[e]),s=[],o=1,i=0;Ft.lastIndex=0;let a=Ft.exec(n);for(;a!==null;){for(let l=i;l<a.index;l++)n[l]===`
6
+ `&&o++;i=a.index;let c=a[0],p=c;Ko.test(c)&&!Vo.has(c)?p="ID":t&&(zr.test(c)||Jo.test(c))&&(p=zr.test(c)?"NUM":"STR"),s.push({text:p,line:o});for(let l=i;l<a.index+c.length;l++)n[l]===`
7
+ `&&o++;i=a.index+c.length,a=Ft.exec(n)}return s}function Ho(r){return Ct.includes(Re.default.basename(r))}function Qo(r,e){if(e.length===0)return!1;let t=new Set(e);return r.split(Re.default.sep).some(n=>t.has(n))}async function Et(r,e,t={}){let{minLines:n=6,windowSize:s=15,ignoreLiterals:o=!0,limit:i=50,ignoreDirs:a=O}=t,c=[...r.nodes.values()].filter(l=>!Ho(l.path)&&!Qo(l.path,a)),p=(await Promise.all(c.map(async l=>{try{let f=await(0,Br.readFile)(Re.default.join(e,l.path),"utf8");return{file:l.path,tokens:$r(f,l.type,o)}}catch{return}}))).filter(l=>l!==void 0);return jr(p,s,n).slice(0,i)}var ce=g(require("path"));function qo(r){let e=new Map;for(let[t,n]of r){let s=n.imports.filter(o=>o.toPath&&!o.isExternal).length;s>0&&e.set(t,s)}return e}function Xo(r,e,t){let n=new Map;for(let[s,o]of e){if(o<t)continue;let i=r.get(s);if(!i||i.category==="test"||i.category==="barrel")continue;let a=ce.default.extname(s),c=ce.default.basename(s,a),p=c==="index"?ce.default.basename(ce.default.dirname(s)):c;n.set(s,{path:s,outDegree:o,tag:`feature:${p}`})}return n}function j(r,e){let t=e?.minOutDegree??5;return Xo(r,qo(r),t)}var Yo=(r,e)=>r.outDegree-e.outDegree;function Zo(r,e){let t=new Map;for(let n of e.values()){let s=new Set;r.traverse(n.path,o=>(o.path!==n.path&&s.add(o.path),!0),{direction:"outgoing"}),t.set(n.path,s)}return t}function ei(r,e,t,n){let s=new Map;for(let[o]of r){if(e.has(o))continue;let i=null;for(let a of e.values())t.get(a.path)?.has(o)&&(!i||n(a,i)<0)&&(i=a);i&&s.set(o,i.path)}return s}function ti(r,e){let t=new Map;for(let n of r.values()){let s=n.tag.replace("feature:",""),o=[];for(let[i,a]of e)a===n.path&&o.push(i);t.set(s,{hub:n.path,outDegree:n.outDegree,files:o})}return t}function ri(r,e,t){let n=[];for(let s of r.keys())!e.has(s)&&!t.has(s)&&n.push(s);return n}function pe(r,e){let t=e?.detectFn??j,n=e?.hubComparator??Yo,s=t(r.nodes,e),o=Zo(r,s),i=ei(r.nodes,s,o,n);return{features:ti(s,i),unassigned:ri(r.nodes,s,i)}}var Ur=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),Kr=new Set(["typescript","javascript","python"]),Ge=new Set(["typescript","javascript","go","python"]);function Tt(r){let e=new Map;for(let t of r.nodes.values())e.set(t.type,(e.get(t.type)??0)+1);return[...e.entries()].map(([t,n])=>({type:t,fileCount:n,exportsTracked:Ur.has(t),importSymbolsTracked:Kr.has(t),callEdgesTracked:Ge.has(t)})).sort((t,n)=>n.fileCount-t.fileCount)}var le=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let t=new Set(this.nodes.keys());return e.filter(n=>!t.has(n))}findHighExportUsage(e){let t=[];for(let n of this.nodes.values()){if(n.maxExportUsage===void 0||n.maxExportUsage<e)continue;let s=n.imports.reduce((o,i)=>(i.exportUsageRatio??0)>(o?.exportUsageRatio??0)?i:o,null);t.push({path:n.path,maxExportUsage:n.maxExportUsage,tightestDep:s?.toPath??""})}return t.sort((n,s)=>s.maxExportUsage-n.maxExportUsage)}findCycles(){let e=[],t=new Set,n=new Set,s=[],o=i=>{t.add(i),n.add(i),s.push(i);let a=this.nodes.get(i);if(a){for(let c of a.imports)if(!(!c.toPath||c.isExternal))if(n.has(c.toPath)){let p=s.indexOf(c.toPath);e.push([...s.slice(p),c.toPath])}else t.has(c.toPath)||o(c.toPath)}n.delete(i),s.pop()};for(let i of this.nodes.keys())t.has(i)||o(i);return e}};var M=class r{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let t=new Map;for(let n of e.nodes)t.set(n.path,n);return new r(t)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let t of this.nodes.values())for(let n of t.imports)if(n.toPath){let s=e.get(n.toPath)||[];s.push(t.path),e.set(n.toPath,s)}return this._incomingEdgesCache=e,e}dfs(e,t,n,s){let o=new Set,i=n.maxDepth??1/0,a=(c,p,l)=>{if(p>i||o.has(c))return;let f=this.nodes.get(c);if(f&&(o.add(c),t(f,p,l)!==!1))for(let d of s(c))a(d,p+1,c)};a(e,0,null)}traverse(e,t,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,t,n,i=>s==="outgoing"?this.nodes.get(i)?.imports.map(a=>a.toPath).filter(Boolean)??[]:o?.get(i)??[])}getCallIncomingCache(){if(this._callIncomingCache)return this._callIncomingCache;let e=new Map;for(let t of this.nodes.values())for(let n of t.callEdges??[]){let s=e.get(n.toFile)??[];s.push(t.path),e.set(n.toFile,s)}return this._callIncomingCache=e,e}traverseCalls(e,t,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getCallIncomingCache():null;this.dfs(e,t,n,i=>s==="outgoing"?this.nodes.get(i)?.callEdges?.map(a=>a.toFile)??[]:o?.get(i)??[])}getCallers(e){let t=[];return this.traverseCalls(e,n=>(n.path!==e&&t.push(n.path),!0),{direction:"incoming",maxDepth:1}),t}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let t=this.nodes.get(e);return t?t.imports.map(n=>this.nodes.get(n.toPath)).filter(n=>n!==void 0):[]}findUnusedFiles(e){return new le(this.nodes).findUnusedFiles(e)}findCycles(){return new le(this.nodes).findCycles()}};var W=class{affectedSymbols=new Map;constructor(e,t){this.affectedSymbols.set(e,new Set(["default",...t]))}updateAffectedSymbols(e,t){let n=this.affectedSymbols.get(t)||new Set,s=e.imports.find(c=>c.toPath===t);if(!s)return!1;let o=s.symbols||["*"],i=new Set;for(let c of o)(c==="*"||n.has("*")||n.has(c))&&i.add("*");if(i.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let c of i)a.add(c);return this.affectedSymbols.set(e.path,a),!0}};function fe(r,e){let t=r.nodes.get(e);if(t)return{category:t.category,exports:t.exports.map(n=>n.name)}}function Pt(r,e,t=1){let n=[];return r.traverse(e,(s,o,i)=>{if(s.path===e)return!0;let a=i?r.nodes.get(i)?.imports.find(c=>c.toPath===s.path):void 0;return n.push({path:s.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:t}),n}function ue(r,e){let t=[];return r.traverse(e,n=>{if(n.path===e)return!0;let s=n.imports.find(o=>o.toPath===e);return t.push({path:n.path,...s?.symbols?{symbols:s.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),t}function At(r,e,t={}){let{testsOnly:n=!1,changedSymbols:s}=t,o=s?new W(e,s):null,i=[];return r.traverse(e,(a,c,p)=>{if(a.path===e)return!0;if(o&&p&&!o.updateAffectedSymbols(a,p))return!1;let l=a.category==="test"||a.tags.some(f=>f.name==="test");return(!n||l)&&i.push(a.path),!0},{direction:"incoming"}),i}function Nt(r,e,t={}){let{depth:n=1,withEdgeDetail:s=!1}=t,o=[];return r.traverseCalls(e,i=>{if(i.path===e)return!0;let a={file:i.path};return s&&(a.edges=(i.callEdges??[]).filter(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),o.push(a),!0},{direction:"incoming",maxDepth:n}),o}function It(r,e={}){let{metric:t="cognitiveComplexity",threshold:n=10,limit:s=20}=e;return[...r.nodes.values()].flatMap(o=>(o.functions??[]).filter(i=>i[t]>=n).map(i=>({file:o.path,name:i.name,line:i.line,complexity:i.complexity,cognitiveComplexity:i.cognitiveComplexity}))).sort((o,i)=>i[t]-o[t]).slice(0,s)}function Mt(r){return{nodes:r.nodes.map(t=>({path:t.path,type:t.type,category:t.category,exports:t.exports.map(n=>n.name),tags:t.tags.filter(n=>n.kind==="comment-marker"||n.kind==="import").map(n=>n.name),importsFiles:t.imports.filter(n=>!n.isExternal&&n.toPath).map(n=>n.toPath),...t.description!==void 0&&{description:t.description},...t.testedBy!==void 0&&{testedBy:t.testedBy},...t.coveragePct!==void 0&&{coveragePct:t.coveragePct},...t.avgExportUsage!==void 0&&{avgExportUsage:t.avgExportUsage},...t.maxExportUsage!==void 0&&{maxExportUsage:t.maxExportUsage}})),cycles:r.cycles}}function Dt(r){let e=r.getPackageDependencies(),t=Array.from(r.packages.values()).map(({graph:n,pkg:s})=>({name:s.name,relativeRoot:s.relativeRoot,nodeCount:n.nodes.size,dependsOn:e.get(s.name)??[]}));return{monorepoType:r.type,packageCount:t.length,packages:t}}function Rt(r){return[...r.nodes.values()].some(e=>e.coveragePct!==void 0)}function Jr(r){if(r.category==="test")return"test";if(r.category==="config")return"config";if(r.category==="type-only")return"types";let e=r.path;return b(e,"component")||b(e,"components")?"component":b(e,"controller")||b(e,"controllers")?"controller":b(e,"middleware")?"middleware":b(e,"router")||b(e,"routes")||b(e,"route")?"router":b(e,"store")||b(e,"stores")?"store":b(e,"service")||b(e,"services")?"service":b(e,"handler")||b(e,"handlers")?"handler":b(e,"adapter")||b(e,"adapters")?"adapter":b(e,"plugin")||b(e,"plugins")?"plugin":b(e,"api")?"api":b(e,"cli")||b(e,"commands")||me(e)==="cli"?"cli":b(e,"util")||b(e,"utils")||b(e,"helper")||b(e,"helpers")?"util":b(e,"model")||b(e,"models")||me(e)==="model"?"model":b(e,"parser")||b(e,"parsers")||me(e)==="parser"?"parser":me(e)==="builder"?"builder":me(e)==="resolver"?"resolver":"other"}function b(r,e){return r.includes(`/${e}/`)||r.includes(`/${e}.`)}function me(r){let e=r.slice(r.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function Gt(r,e){let t=pe(r,e),n=new Map;for(let[o,i]of t.features){for(let a of i.files)n.set(a,o);n.set(i.hub,o)}let s=new Map;for(let o of r.nodes.values()){let i=n.get(o.path);s.set(o.path,{path:o.path,role:Jr(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function Lt(r,e){let t=[];for(let n of r.nodes.values())if(n.exports.some(s=>s.name===e))if(Ge.has(n.type)){let s=[];for(let o of r.nodes.values())for(let i of o.callEdges??[])i.to===e&&s.push({file:o.path,callerFunction:i.from});t.push({path:n.path,category:n.category,precision:"call",callers:s})}else{let s=ue(r,n.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));t.push({path:n.path,category:n.category,precision:"file-level",importers:s})}return t}function ni(r){return r?r.startsWith("interface ")?"interface":r.startsWith("class ")?"class":r.startsWith("enum ")?"enum":"type":"type"}function si(r,e){if(e==="type-only")return!0;let t=r.signature??"";return t.startsWith("interface ")||t.startsWith("class ")||t.startsWith("enum ")}function _t(r){let e=new Map;for(let n of r.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript"))for(let s of n.exports){if(!si(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:ni(s.signature),...s.doc?{doc:s.doc}:{}})}let t=[];for(let n of r.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript")){for(let s of n.imports)if(!(!s.toPath||s.isExternal||!s.symbols?.length))for(let o of s.symbols)e.has(`${s.toPath}::${o}`)&&t.push({fromFile:n.path,toType:o,toFile:s.toPath})}return{types:e,edges:t}}function Ot(r,e){let t=null;for(let o of r.types.values())if(o.name===e){t=o;break}if(!t)return{type:null,usedByFiles:[],uses:[]};let n=new Set,s=new Map;for(let o of r.edges)if(o.toType===e&&o.toFile===t.file&&n.add(o.fromFile),o.fromFile===t.file){let i=r.types.get(`${o.toFile}::${o.toType}`);i&&s.set(`${i.file}::${i.name}`,i)}return{type:t,usedByFiles:Array.from(n),uses:Array.from(s.values())}}var cn=g(require("path"));var _e=g(require("fs")),zt=g(require("path"));var X=g(require("fs")),P=g(require("path"));var jt=g(require("fs")),oi=g(require("path"));function Vr(r){try{return jt.default.statSync(r,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Le(r){try{return jt.default.statSync(r,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Wt(r,e){let t=P.default.join(e,"package.json");if(!X.default.existsSync(t))return null;let n={};try{n=JSON.parse(X.default.readFileSync(t,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:P.default.relative(r,e),entryPoints:ii(e,n)}:null}function ii(r,e){let t=[];if(e.exports){let s=e.exports;if(typeof s=="string")t.push(P.default.join(r,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")t.push(P.default.join(r,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&t.push(P.default.join(r,i))}}}e.main&&t.push(P.default.join(r,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])t.push(P.default.join(r,s));let n=t.filter(Le);return n.length>0?n.slice(0,1):t.slice(0,1)}function Y(r,e){let t=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");ai(r,o,n,t)}return t}function ai(r,e,t,n){if(!e.includes("*")){ci(r,e,t,n);return}let s=e.split("/");s.includes("**")?pi(r,s,t,n):li(r,s,t,n)}function ci(r,e,t,n){let s=P.default.join(r,e);if(t.has(s)||!Vr(s))return;t.add(s);let o=Wt(r,s);o&&n.push(o)}function pi(r,e,t,n){let s=P.default.join(r,e[0]==="**"?"":e[0]??"");Hr(r,s,t,n)}function li(r,e,t,n){let s=e.findIndex(a=>a.includes("*")),o=P.default.join(r,...e.slice(0,s)),i;try{i=X.default.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=P.default.join(o,a.name);if(t.has(c))continue;t.add(c);let p=Wt(r,c);p&&n.push(p)}}function Hr(r,e,t,n){let s;try{s=X.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=P.default.join(e,o.name);if(X.default.existsSync(P.default.join(i,"package.json"))&&!t.has(i)){t.add(i);let a=Wt(r,i);a&&n.push(a)}else Hr(r,i,t,n)}}var Qr={type:"npm",detect(r){let e=zt.default.join(r,"package.json");if(!_e.default.existsSync(e))return null;let t;try{t=JSON.parse(_e.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!t||_e.default.existsSync(zt.default.join(r,"yarn.lock")))return null;let n=Array.isArray(t)?t:t.packages??[];return n.length===0?null:Y(r,n)}};var z=g(require("fs")),F=g(require("path"));var qr={type:"nx",detect(r){return z.default.existsSync(F.default.join(r,"nx.json"))?Xr(r,r,new Set,0).map(t=>fi(r,t,F.default.join(t,"project.json"))).filter(t=>t!==null):null}};function Xr(r,e,t,n){if(n>4)return[];let s;try{s=z.default.readdirSync(e,{withFileTypes:!0})}catch{return[]}let o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name;if(a.startsWith(".")||a==="node_modules"||a==="dist"||a===".nx")continue;let c=F.default.join(e,a);z.default.existsSync(F.default.join(c,"project.json"))&&!t.has(c)?(t.add(c),o.push(c)):o.push(...Xr(r,c,t,n+1))}return o}function fi(r,e,t){let n={};try{n=JSON.parse(z.default.readFileSync(t,"utf-8"))}catch{return null}let s=n.name,o,i,a=F.default.join(e,"package.json");if(z.default.existsSync(a))try{let c=JSON.parse(z.default.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:F.default.relative(r,e),entryPoints:ui(e,n,o,i)}:null}function ui(r,e,t,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=F.default.resolve(r,"../..");s.push(F.default.resolve(a,o)),s.push(F.default.resolve(r,o))}if(n){let a=n;if(typeof a=="string")s.push(F.default.join(r,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(F.default.join(r,c))}}if(t&&s.push(F.default.join(r,t)),e.sourceRoot){let a=F.default.resolve(r,"../.."),c=F.default.resolve(a,e.sourceRoot);s.push(F.default.join(c,"index.ts"),F.default.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(F.default.join(r,a));let i=s.filter(Le);return i.length>0?i.slice(0,1):s.slice(0,1)}var $t=g(require("fs")),Yr=g(require("path")),Zr=require("js-yaml");var en={type:"pnpm",detect(r){let e=Yr.default.join(r,"pnpm-workspace.yaml");if(!$t.default.existsSync(e))return null;let t=[];try{t=(0,Zr.load)($t.default.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return Y(r,t)}};var tn=g(require("fs")),rn=g(require("path")),nn={type:"turborepo",detect(r){return tn.default.existsSync(rn.default.join(r,"turbo.json"))?[]:null}};var Oe=g(require("fs")),Bt=g(require("path"));var sn={type:"yarn",detect(r){if(!Oe.default.existsSync(Bt.default.join(r,"yarn.lock")))return null;let e=Bt.default.join(r,"package.json");if(!Oe.default.existsSync(e))return null;let t;try{t=JSON.parse(Oe.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!t)return null;let n=Array.isArray(t)?t:t.packages??[];return n.length===0?null:Y(r,n)}};var on=[];function G(r){on.push(r)}function an(){return on}G(nn);G(qr);G(en);G(sn);G(Qr);function ge(r,e=an()){let t=cn.default.resolve(r),n=new Map,s=[];for(let i of e){let a=i.detect(t);if(a!==null){s.push(i.type);for(let c of a)n.has(c.name)||n.set(c.name,c)}}if(s.length===0)return{root:t,type:"none",types:[],packages:[],packageMap:new Map};let o=Array.from(n.values());return{root:t,type:s[0],types:s,packages:o,packageMap:new Map(o.map(i=>[i.name,i]))}}var de=class r{constructor(e,t){this.monorepoRoot=e;this.type=t}monorepoRoot;type;packages=new Map;addPackage(e,t){this.packages.set(e.name,{graph:t,pkg:e})}getPackageForFile(e){for(let{pkg:t}of this.packages.values())if(e===t.relativeRoot||e.startsWith(`${t.relativeRoot}/`))return t}getPackageDependencies(){let e=new Map;for(let{graph:t,pkg:n}of this.packages.values()){let s=new Set;for(let o of t.nodes.values())for(let i of o.imports)i.isWorkspace&&i.workspacePackage&&s.add(i.workspacePackage);e.set(n.name,[...s])}return e}getAffectedAcrossPackages(e){let t=this.getPackageForFile(e);if(!t)return[];let n=this.packages.get(t.name);if(!n)return[];let s=[];n.graph.traverse(e,o=>(o.path!==e&&s.push({file:o.path,package:t.name}),!0),{direction:"incoming"});for(let{graph:o,pkg:i}of this.packages.values())if(i.name!==t.name)for(let a of o.nodes.values())a.imports.some(p=>p.isWorkspace&&p.workspacePackage===t.name)&&s.push({file:a.path,package:i.name});return s}serialize(){return{monorepoRoot:this.monorepoRoot,type:this.type,packages:Array.from(this.packages.values()).map(({graph:e,pkg:t})=>({pkg:{name:t.name,relativeRoot:t.relativeRoot,entryPoints:t.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let t=new r(e.monorepoRoot,e.type);for(let{pkg:n,nodes:s}of e.packages){let o=new Map(s.map(a=>[a.path,a])),i=new M(o);t.packages.set(n.name,{graph:i,pkg:{...n,root:""}})}return t}};var pn=new Map;function Z(r,e){pn.set(r,e)}function ln(r){return pn.get(r)}function fn(r,e){return e.startsWith("!")?r!==e.slice(1):r===e}function mi(r,e){return e.startsWith("!")?!r.includes(e.slice(1)):r.includes(e)}var gi=(r,e)=>!e.category||fn(r.category,e.category),di=(r,e)=>!e.type||fn(r.type,e.type),hi=(r,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?r.lastAuthor!==e.lastAuthor.slice(1):r.lastAuthor!==void 0&&r.lastAuthor===e.lastAuthor:!0,yi=(r,e)=>!e.path||mi(r.path,e.path),xi=(r,e)=>e.isExternal===void 0?!0:r.imports.some(n=>n.isExternal)===e.isExternal,Si=(r,e)=>{if(!e.tags||e.tags.length===0)return!0;let t=e.tags.filter(s=>!s.startsWith("!")),n=e.tags.filter(s=>s.startsWith("!")).map(s=>s.slice(1));return!(t.length>0&&!t.some(s=>r.tags.some(o=>o.name===s))||n.some(s=>r.tags.some(o=>o.name===s)))},bi=(r,e)=>!e.allTags?.length||e.allTags.every(t=>r.tags.some(n=>n.name===t)),vi=(r,e)=>!e.importsFile||r.imports.some(t=>t.toPath?.includes(e.importsFile)),ki=(r,e,t)=>e.importedBy===void 0?!0:(t?.get(r.path)??[]).some(s=>s.includes(e.importedBy)),wi=(r,e)=>e.minImports===void 0||r.imports.length>=e.minImports,Ci=(r,e)=>e.maxImports===void 0||r.imports.length<=e.maxImports,Fi=(r,e)=>e.minSize===void 0||r.size>=e.minSize,Ei=(r,e)=>e.maxSize===void 0||r.size<=e.maxSize,Ti=(r,e)=>e.hasDocstring===void 0||!!r.description===e.hasDocstring,Pi=(r,e)=>e.isDocumented===void 0||!!r.documentedBy?.length===e.isDocumented,Ai=(r,e)=>e.isStale===void 0||!!r.staleFor?.length===e.isStale,Ni=(r,e)=>e.minCoverage===void 0||(r.coveragePct??101)>=e.minCoverage,Ii=(r,e)=>e.maxCoverage===void 0||(r.coveragePct??0)<=e.maxCoverage,Mi=(r,e)=>e.minExportUsage===void 0||(r.avgExportUsage??-1)>=e.minExportUsage,Di=(r,e)=>e.maxExportUsage===void 0||(r.avgExportUsage??0)<=e.maxExportUsage,Ri=(r,e)=>e.minComplexity===void 0||(r.complexity??-1/0)>=e.minComplexity,Gi=(r,e)=>e.maxComplexity===void 0||(r.complexity??0)<=e.maxComplexity,Li=(r,e)=>e.minCognitiveComplexity===void 0||(r.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,_i=(r,e)=>e.maxCognitiveComplexity===void 0||(r.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Oi=(r,e)=>e.minCommits===void 0||(r.commitCount90d??-1/0)>=e.minCommits,ji=(r,e)=>e.maxCommits===void 0||(r.commitCount90d??0)<=e.maxCommits,Wi=(r,e,t)=>!e.any?.length||e.any.some(n=>he(r,n,t)),zi=[gi,di,hi,yi,xi,Si,bi,vi,ki,wi,Ci,Fi,Ei,Ti,Pi,Ai,Ni,Ii,Mi,Di,Ri,Gi,Li,_i,Oi,ji,Wi];function he(r,e,t){return zi.every(n=>n(r,e,t))}function je(r,e){let t=new Map;if(e.importedBy!==void 0){for(let i of r.nodes)for(let a of i.imports)if(a.toPath){let c=t.get(a.toPath)??[];c.push(i.path),t.set(a.toPath,c)}}let n=r.nodes.filter(i=>he(i,e,t)),s=new Set(n.map(i=>i.path)),o=n.map(i=>({...i,imports:i.imports.filter(a=>!a.toPath||s.has(a.toPath))}));if(e.sort){let i=e.sortDir==="asc"?-1:1;o.sort((a,c)=>{let p=0;return e.sort==="size"?p=c.size-a.size:e.sort==="imports"?p=c.imports.length-a.imports.length:e.sort==="commitCount90d"?p=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?p=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?p=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(p=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),p*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:r.cycles?.filter(i=>i.every(a=>s.has(a)))??void 0}}function un(r,e){let t=e.indexOf(":");if(t===-1)return;let n=e.slice(0,t).trim().toLowerCase(),s=e.slice(t+1).trim();if(!(!n||!s))switch(n){case"category":r.category=s;break;case"type":r.type=s;break;case"tag":case"tags":s.includes("+")?r.allTags=[...r.allTags??[],...s.split("+")]:r.tags=[...r.tags??[],s];break;case"path":r.path=s;break;case"external":r.isExternal=s.toLowerCase()==="true";break;case"importsfile":r.importsFile=s;break;case"importedby":r.importedBy=s;break;case"minimports":r.minImports=parseInt(s,10);break;case"maximports":r.maxImports=parseInt(s,10);break;case"minsize":r.minSize=parseInt(s,10);break;case"maxsize":r.maxSize=parseInt(s,10);break;case"sort":r.sort=s;break;case"sortdir":r.sortDir=s.toLowerCase()==="asc"?"asc":"desc";break;case"limit":r.limit=parseInt(s,10);break;case"hasdocstring":r.hasDocstring=s.toLowerCase()!=="false";break;case"mincoverage":r.minCoverage=parseInt(s,10);break;case"maxcoverage":r.maxCoverage=parseInt(s,10);break;case"minexportusage":r.minExportUsage=parseFloat(s);break;case"maxexportusage":r.maxExportUsage=parseFloat(s);break;case"mincomplexity":r.minComplexity=parseInt(s,10);break;case"maxcomplexity":r.maxComplexity=parseInt(s,10);break;case"mincognitivecomplexity":r.minCognitiveComplexity=parseInt(s,10);break;case"maxcognitivecomplexity":r.maxCognitiveComplexity=parseInt(s,10);break;case"mincommits":r.minCommits=parseInt(s,10);break;case"maxcommits":r.maxCommits=parseInt(s,10);break;case"isdocumented":r.isDocumented=s.toLowerCase()!=="false";break;case"isstale":r.isStale=s.toLowerCase()!=="false";break;case"lastauthor":r.lastAuthor=s;break}}function $i(r){let e=[];for(let t of r.split("|")){let n=t.trim();if(!n)continue;let s={};un(s,n),Object.keys(s).length>0&&e.push(s)}return e}function We(r){let e={},t=r.split(",");for(let n of t){let s=n.trim();if(s.toLowerCase().startsWith("any(")&&s.endsWith(")")){let o=s.slice(4,-1),i=$i(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}un(e,n)}return e}var sr=g(require("fs/promises")),Fn=g(require("path"));var Qe=g(require("path")),ye=g(require("typescript"));var dn=g(require("path"));var gn=g(require("path")),C=g(require("typescript")),mn=new Set(["describe","test","it"]);function $(r,e){let t=r[e];if(t===void 0)throw new Error(`Index ${e} out of bounds (length ${r.length})`);return t}function Ut(r){let e=[];for(let t of r.statements){if(!C.default.isExpressionStatement(t))continue;let n=t.expression;if(!C.default.isCallExpression(n))continue;let s=n.expression;C.default.isIdentifier(s)&&mn.has(s.text)&&e.push(n),C.default.isPropertyAccessExpression(s)&&C.default.isIdentifier(s.expression)&&mn.has(s.expression.text)&&e.push(n)}return e}function Kt(r,e,t){for(let n of r.arguments){if(!C.default.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>C.default.isPropertyAssignment(o)&&C.default.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!C.default.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(C.default.isStringLiteral).map(o=>o.text)}return null}function Jt(r,e,t,n){if(r.arguments.length===0)return null;for(let o=1;o<r.arguments.length;o++){let i=$(r.arguments,o);if(!C.default.isObjectLiteralExpression(i))continue;let a=i.properties.find(p=>C.default.isPropertyAssignment(p)&&C.default.isIdentifier(p.name)&&p.name.text===e);if(a)return{start:a.initializer.getStart(n),end:a.initializer.getEnd(),text:t};let c=i.getEnd()-1;return{start:c,end:c,text:`${i.properties.length>0?", ":""}${e}: ${t}`}}let s=$(r.arguments,r.arguments.length-1);return{start:s.getStart(n),end:s.getStart(n),text:`{ ${e}: ${t} }, `}}function Vt(r,e,t){let n=r.arguments;for(let s=1;s<n.length;s++){let o=$(n,s);if(!C.default.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>C.default.isPropertyAssignment(c)&&C.default.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:$(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=$(o.properties,i);return i===o.properties.length-1?{start:$(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(t),end:$(o.properties,i+1).getStart(t),text:""}}return null}function Ht(r,e){let t=[...e].sort((s,o)=>o.start-s.start),n=r;for(let s of t)n=n.slice(0,s.start)+s.text+n.slice(s.end);return n}function Qt(r){return`[${r.map(e=>JSON.stringify(e)).join(", ")}]`}var N=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function Bi(r){return r.map(e=>e.startsWith("@")?e.slice(1):e)}function ze(r,e,t,n){let s=C.default.createSourceFile(gn.default.basename(r),e,C.default.ScriptTarget.Latest,!0),o=Ut(s),[i]=o;if(!i)return e;let a=Kt(i,n,s),c=[...t].sort();if(a!==null&&JSON.stringify(Bi(a).sort())===JSON.stringify(c))return e;let p=Qt(c.map(f=>`@${f}`)),l=o.flatMap(f=>{let d=t.length===0?Vt(f,n,s):Jt(f,n,p,s);return d?[d]:[]});return l.length>0?Ht(e,l):e}var $e=class{name="cypress";canHandle(e){return N.has(dn.default.extname(e).toLowerCase())}apply(e,t,n){return ze(e,t,n,"tags")}};var hn=g(require("path")),qt=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Xt=/^@([a-zA-Z0-9_-]+)/gm;function Ui(r){return`${["# <mokosh-tags>",...r.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
8
+ `)}
5
9
 
6
- `}function ri(t){let e=new Set;Lt.lastIndex=0;let r=Lt.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=Lt.exec(t);return e}var _e=class{name="gherkin";canHandle(e){return Jr.default.extname(e).toLowerCase()===".feature"}apply(e,r,s){let n=r.replace(_t,""),o=ri(n),i=s.filter(p=>!o.has(p)),a=i.length>0?ti(i):"";return _t.test(r)?r.replace(_t,a):a?r.replace(/^(Feature:)/m,`${a}$1`):r}};function Hr(t,e){let r=t.replace(/\\/g,"/"),s=e.replace(/\\/g,"/"),n="";for(let o=0;o<r.length;o++){let i=r[o];i==="*"?r[o+1]==="*"?(n+=".*",o++):n+="[^/]*":i==="?"?n+="[^/]":i!==void 0&&(n+=i.replace(/[.+^${}()|[\]\\]/g,"\\$&"))}return new RegExp(`^${n}$`).test(s)}var Qr=f(require("path")),Ot=/^\/\/go:build mokosh_[^\n]+\n/m,si=/^package\s+\S+/m;function ni(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
7
- `}function oi(t){let e=Ot.exec(t);if(!e)return null;let r=e[0],s=/mokosh_([a-zA-Z0-9_-]+)/g,n=[],o=s.exec(r);for(;o!==null;)o[1]&&n.push(o[1]),o=s.exec(r);return n}var Le=class{name="go";canHandle(e){return Qr.default.basename(e).endsWith("_test.go")}apply(e,r,s){let n=oi(r),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return r;if(s.length===0)return r.replace(Ot,"");let i=ni(o);if(n!==null)return r.replace(Ot,i);let a=si.exec(r);if(!a)return r;let p=a.index;return r.slice(0,p)+i+`
8
- `+r.slice(p)}};var Vr=f(require("path"));var ii=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,jt=/^ \* @group (.+)$/gm;function ai(t){return["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
9
- `)+`
10
+ `}function Ki(r){let e=new Set;Xt.lastIndex=0;let t=Xt.exec(r);for(;t!==null;)t[1]&&e.add(t[1]),t=Xt.exec(r);return e}var Be=class{name="gherkin";canHandle(e){return hn.default.extname(e).toLowerCase()===".feature"}apply(e,t,n){let s=t.replace(qt,""),o=Ki(s),i=n.filter(c=>!o.has(c)),a=i.length>0?Ui(i):"";return qt.test(t)?t.replace(qt,a):a?t.replace(/^(Feature:)/m,`${a}$1`):t}};function yn(r,e){let t=r.replace(/\\/g,"/"),n=e.replace(/\\/g,"/"),s="";for(let o=0;o<t.length;o++){let i=t[o];i==="*"?t[o+1]==="*"?(s+=".*",o++):s+="[^/]*":i==="?"?s+="[^/]":i!==void 0&&(s+=i.replace(/[.+^${}()|[\]\\]/g,"\\$&"))}return new RegExp(`^${s}$`).test(n)}var xn=g(require("path")),Yt=/^\/\/go:build mokosh_[^\n]+\n/m,Ji=/^package\s+\S+/m;function Vi(r){return`//go:build ${r.map(t=>`mokosh_${t}`).join(" || ")}
11
+ `}function Hi(r){let e=Yt.exec(r);if(!e)return null;let t=e[0]??"",n=/mokosh_([a-zA-Z0-9_-]+)/g,s=[],o=n.exec(t);for(;o!==null;)o[1]&&s.push(o[1]),o=n.exec(t);return s}var Ue=class{name="go";canHandle(e){return xn.default.basename(e).endsWith("_test.go")}apply(e,t,n){let s=Hi(t),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return t;if(n.length===0)return t.replace(Yt,"");let i=Vi(o);if(s!==null)return t.replace(Yt,i);let a=Ji.exec(t);if(!a)return t;let c=a.index;return`${t.slice(0,c)+i}
12
+ ${t.slice(c)}`}};var Sn=g(require("path"));var Qi=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,Zt=/^ \* @group (.+)$/gm;function qi(r){return`${["/**",...r.map(e=>` * @group ${e}`)," */"].join(`
13
+ `)}
10
14
 
11
- `}function pi(t){let e=[];jt.lastIndex=0;let r=jt.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=jt.exec(t);return e}var Oe=class{name="jest";canHandle(e){return T.has(Vr.default.extname(e).toLowerCase())}apply(e,r,s){let n=ii.exec(r),o=n?pi(n[0]):null,i=[...s].sort();if(o!==null&&JSON.stringify([...o].sort())===JSON.stringify(i))return r;let a=n?r.slice(n[0].length):r;return s.length===0?a:ai(i)+a}};var Wt=f(require("path")),zt=f(require("typescript"));function ci(t){return q(t.map(e=>`@${e}`))}function li(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}var je=class{name="playwright";canHandle(e){return T.has(Wt.default.extname(e).toLowerCase())}apply(e,r,s){let n=zt.default.createSourceFile(Wt.default.basename(e),r,zt.default.ScriptTarget.Latest,!0),o=K(n);if(o.length===0)return r;let i=J(o[0],"tag",n),a=[...s].sort();if(i!==null&&JSON.stringify(li(i).sort())===JSON.stringify(a))return r;let p=o.flatMap(c=>{let m=s.length===0?Q(c,"tag",n):H(c,"tag",ci(a),n);return m?[m]:[]});return p.length>0?V(r,p):r}};var qr=f(require("path")),$t=/^pytestmark\s*=\s*.+$/m,ui=/^import pytest\s*$/m;function fi(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function mi(t){let e=$t.exec(t);if(!e)return null;let r=e[0],s=[],n=/pytest\.mark\.([a-zA-Z0-9_-]+)/g,o=n.exec(r);for(;o!==null;)o[1]&&s.push(o[1]),o=n.exec(r);return s}var We=class{name="pytest";canHandle(e){return qr.default.extname(e).toLowerCase()===".py"}apply(e,r,s){let n=mi(r),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return r;if(s.length===0)return r.replace($t,"").replace(/\n{3,}/g,`
15
+ `}function Xi(r){let e=[];Zt.lastIndex=0;let t=Zt.exec(r);for(;t!==null;)t[1]&&e.push(t[1]),t=Zt.exec(r);return e}var Ke=class{name="jest";canHandle(e){return N.has(Sn.default.extname(e).toLowerCase())}apply(e,t,n){let s=Qi.exec(t),o=s?Xi(s[0]):null,i=[...n].sort();if(o!==null&&JSON.stringify([...o].sort())===JSON.stringify(i))return t;let a=s?t.slice(s[0].length):t;return n.length===0?a:qi(i)+a}};var bn=g(require("path"));var Je=class{name="playwright";canHandle(e){return N.has(bn.default.extname(e).toLowerCase())}apply(e,t,n){return ze(e,t,n,"tag")}};var vn=g(require("path")),er=/^pytestmark\s*=\s*.+$/m,Yi=/^import pytest\s*$/m;function Zi(r){let e=r.map(t=>`pytest.mark.${t}`).join(", ");return r.length===1?`pytestmark = pytest.mark.${r[0]}`:`pytestmark = [${e}]`}function ea(r){let e=er.exec(r);if(!e)return null;let t=e[0],n=[],s=/pytest\.mark\.([a-zA-Z0-9_-]+)/g,o=s.exec(t);for(;o!==null;)o[1]&&n.push(o[1]),o=s.exec(t);return n}var Ve=class{name="pytest";canHandle(e){return vn.default.extname(e).toLowerCase()===".py"}apply(e,t,n){let s=ea(t),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return t;if(n.length===0)return t.replace(er,"").replace(/\n{3,}/g,`
12
16
 
13
- `);let i=fi(o);if(n!==null)return r.replace($t,i);let a=ui.test(r),p=gi(r),c=r.slice(0,p),m=r.slice(p),g=a?"":`import pytest
14
- `,d=c.endsWith(`
17
+ `);let i=Zi(o);if(s!==null)return t.replace(er,i);let a=Yi.test(t),c=ta(t),p=t.slice(0,c),l=t.slice(c),f=a?"":`import pytest
18
+ `,d=p.endsWith(`
15
19
 
16
20
  `)?"":`
17
- `;return c+d+g+i+`
18
- `+m}};function gi(t){let e=t.split(`
19
- `),r=-1;for(let n=0;n<e.length;n++){let o=e[n].trimStart();(o.startsWith("import ")||o.startsWith("from "))&&(r=n)}if(r<0)return 0;let s=0;for(let n=0;n<=r;n++)s+=e[n].length+1;return s}var Bt=f(require("path")),Ut=f(require("typescript"));var di=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,ze=class{name="vitest";canHandle(e){return T.has(Bt.default.extname(e).toLowerCase())}apply(e,r,s){let n=r.replace(di,""),o=Ut.default.createSourceFile(Bt.default.basename(e),n,Ut.default.ScriptTarget.Latest,!0),i=K(o);if(i.length===0)return n;let a=J(i[0],"tags",o),p=[...s].sort();if(a!==null&&JSON.stringify([...a].sort())===JSON.stringify(p))return n;let c=i.flatMap(m=>{let g=s.length===0?Q(m,"tags",o):H(m,"tags",q(p),o);return g?[g]:[]});return c.length>0?V(n,c):n}};var Xr={vitest:()=>new ze,playwright:()=>new je,cypress:()=>new De,jest:()=>new Oe},hi={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function yi(t){let e=ue.default.createSourceFile("detect.ts",t,ue.default.ScriptTarget.Latest,!0);for(let r of e.statements){if(!ue.default.isImportDeclaration(r)||!ue.default.isStringLiteral(r.moduleSpecifier))continue;let s=hi[r.moduleSpecifier.text];if(s)return s}return null}var Kt=class{constructor(e,r,s){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=s}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return T.has($e.default.extname(e).toLowerCase())}apply(e,r,s){let n=yi(r)??this.matchOverride(e)??this.defaultFramework;return(Xr[n]??Xr.vitest)().apply(e,r,s)}matchOverride(e){let r=$e.default.relative(this.rootDir,e).split($e.default.sep).join("/");for(let[s,n]of this.frameworkOverrides)if(Hr(s,r))return n;return null}};function Yr(t="vitest",e={},r=process.cwd()){return[new _e,new We,new Le,new Kt(r,t,Object.entries(e))]}function Zr(t,e){return e.find(r=>r.canHandle(t))??null}var xi=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Si=new Set(["import"]),bi=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function vi(t,e,r,s){let n;try{n=await Jt.default.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let o=Zr(t,s);if(!o)return{path:t,status:"unchanged"};let i=o.apply(t,n,e);return i===n?{path:t,status:"unchanged"}:(r||await Jt.default.writeFile(t,i,"utf8"),{path:t,status:"updated"})}async function Ht(t,e,r){let s=te(e),n=s.tagApplier?.framework??"vitest",o=s.tagApplier?.frameworkOverrides??{},i=Yr(n,o,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let p of t.nodes.values()){if(p.category!=="test")continue;let c=new Set,m=[];for(let S of p.tags)Si.has(S.kind)&&xi.test(S.name)&&(bi.has(S.name.toLowerCase())||c.has(S.name)||(c.add(S.name),m.push(S.name)));m.sort();let g=es.default.resolve(e,p.path),d=await vi(g,m,r.dryRun,i);d.path=p.path,a.files.push(d),d.status==="updated"?a.updated++:d.status==="unchanged"?a.unchanged++:a.errors++}return a}var Be=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};var Y=f(require("fs")),C=f(require("path")),tn=f(require("piscina"));var Ue=require("child_process"),Ke=class{getChangedFiles(){try{let r=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(s=>{try{return(0,Ue.execFileSync)("git",s,{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).split(`
20
- `).map(o=>o.trim()).filter(o=>o!=="")}catch{return[]}});return Array.from(new Set(r))}catch(e){return console.error("Error getting git diff:",e),[]}}},ts="%x00%H%x09%ae%x09%at",rs=256*1024*1024;function ss(t,e){let r="",s=0;for(let n of t.split(`
21
- `)){if(n.startsWith("\0")){let[,p,c]=n.slice(1).split(" ");r=p??"",s=c?Number(c)*1e3:0;continue}if(n==="")continue;let o=n.split(" "),i=o[0];if(!i)continue;let a=i.startsWith("R")||i.startsWith("C")?o[2]:o[1];a&&e(a,r,s)}}function ns(t){let e=new Map;try{let r=(0,Ue.execFileSync)("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${ts}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:rs});ss(r,(s,n,o)=>{let i=e.get(s);if(i){i.commitCount90d+=1;return}e.set(s,{commitCount90d:1,lastAuthor:n||void 0,lastCommitAt:o||void 0})})}catch{return e}try{let r=(0,Ue.execFileSync)("git",["-C",t,"log","--name-status","-M",`--format=${ts}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:rs});ss(r,(s,n,o)=>{e.has(s)||e.set(s,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}var fe=f(require("fs")),os=f(require("path")),Qt=require("js-yaml");function is(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function ki(t){return t.replace(/:$/,"").split(",").map(e=>{let r=e.trim();return r.startsWith('"')&&(r=r.slice(1)),r.endsWith('"')&&(r=r.slice(0,-1)),is(r)}).filter(Boolean)}function Ci(t,e){let r=t.startsWith("/")?t.slice(1):t,s=r.lastIndexOf("@");return s>0?{name:r.substring(0,s),version:e||r.substring(s+1)}:{name:r,version:e}}function wi(t){try{let e=(0,Qt.load)(t),r={dependencies:{}};for(let[s,n]of Object.entries(e))if(!(s==="__metadata"||!n?.version))for(let o of s.split(", ")){let i=is(o);i&&(r.dependencies[i]={version:n.version,...n.dependencies!==void 0&&{dependencies:n.dependencies}})}return r}catch{return null}}function Ei(t){let e={dependencies:{}};for(let r of t.split(/\n\n+/)){let s=r.split(`
22
- `).filter(p=>p.trim().length>0&&!p.trim().startsWith("#"));if(s.length<2)continue;let n=s[0];if(!n||n.startsWith(" "))continue;let o=ki(n);if(o.length===0)continue;let a=s.find(p=>p.trim().startsWith('version "'))?.match(/version "(.*?)"/)?.[1]??"";for(let p of o)e.dependencies[p]={version:a}}return e}function Fi(t){let e=fe.default.readFileSync(t,"utf-8"),r=JSON.parse(e),s={dependencies:{}};if(r.packages)for(let[n,o]of Object.entries(r.packages)){if(!n.startsWith("node_modules/"))continue;let i=n.replace("node_modules/","");i.includes("node_modules/")||(s.dependencies[i]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}else if(r.dependencies)for(let[n,o]of Object.entries(r.dependencies))s.dependencies[n]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}};return s}function Ti(t){let e=fe.default.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=wi(e);if(r!==null)return r}return Ei(e)}function Pi(t){let e=fe.default.readFileSync(t,"utf-8"),r={dependencies:{}};try{let s=(0,Qt.load)(e);if(s.packages)for(let[n,o]of Object.entries(s.packages)){let{name:i,version:a}=Ci(n,o.version);i&&(r.dependencies[i]={version:a,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}if(s.dependencies)for(let[n,o]of Object.entries(s.dependencies)){if(r.dependencies[n])continue;let i=typeof o=="string"?o:o.version;r.dependencies[n]={version:i||""}}}catch{}return r}function as(t){let e=[["package-lock.json",Fi],["yarn.lock",Ti],["pnpm-lock.yaml",Pi]];for(let[r,s]of e){let n=os.default.join(t,r);if(fe.default.existsSync(n))return s(n)}return null}var Vt=f(require("path"));function I(t){switch(Vt.default.extname(t).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function E(t){let e=Vt.default.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}var cs=f(require("coffeescript"));function N(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function ls(t){if(t){if(typeof t.originalValue=="string")return t.originalValue;if(typeof t.value=="string")return N(t.value)}}function L(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ai(t){let e=new Set,r=/@tag\s+([a-zA-Z0-9_-]+)/g,s=r.exec(t);for(;s!==null;)s[1]&&e.add(s[1]),s=r.exec(t);return e}function Mi(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function Ii(t,e){let r=ls(e.source);return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:E(r),type:"static"}:null}function Ni(t,e){let r=e.variable?.base?.value==="require",s=ls(e.args?.[0]?.base);return!r||!s?null:{fromPath:t,toPath:"",rawSpecifier:s,isStyle:E(s),type:"require"}}function ps(t,e){if(e)return[{name:e}];let r=t.value;if(r?.constructor?.name==="Class"){let n=L(r.variable);return n?[{name:n}]:[]}if(r?.base?.constructor?.name==="Obj"&&Array.isArray(r.base.properties))return r.base.properties.map(n=>L(n.variable)??L(n)).filter(n=>!!n).map(n=>({name:n}));let s=L(r);return s?[{name:s}]:[]}function Ri(t){if(Array.isArray(t.specifiers))return t.specifiers.map(r=>r.identifier??r.original?.value).filter(r=>!!r).map(r=>({name:r}));let e=L(t.variable)??L(t.variable?.base);return e?[{name:e}]:[]}function Gi(t,e,r,s){let n=e.constructor?.name;if(n==="ImportDeclaration"){let o=Ii(t,e);o&&r.push(o)}else if(n==="Call"){let o=Ni(t,e);o&&r.push(o)}else if(n==="Assign"){let o=L(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?s.push(...ps(e,void 0)):o==="exports"&&typeof i=="string"&&s.push(...ps(e,i))}else n==="ExportNamedDeclaration"&&e.clause?s.push(...Ri(e.clause)):n==="ExportDefaultDeclaration"&&s.push({name:"default"})}function qt(t,e,r,s){if(!(!e||typeof e!="object")){Gi(t,e,r,s);for(let n in e){if(n==="locationData")continue;let o=e[n];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)qt(t,i,r,s);else qt(t,o,r,s)}}}function us(t,e){let r=Ai(e),s=Mi(t,r),n=[],o=[];try{qt(t,cs.default.nodes(e),n,o)}catch{}let i=new Set,a=o.filter(p=>i.has(p.name)?!1:(i.add(p.name),!0));return{imports:n,exports:a,tags:Array.from(r).map(p=>({name:p,kind:"comment-marker"})),category:s}}var X=require("@cucumber/gherkin"),fs=require("@cucumber/messages");var Di=fs.IdGenerator.uuid();function Xt(t,e){let r=new Set;try{let s=new X.AstBuilder(Di),n=new X.GherkinClassicTokenMatcher,i=new X.Parser(s,n).parse(e);i.feature&&(i.feature.tags.forEach(a=>{r.add(a.name.startsWith("@")?a.name.slice(1):a.name)}),i.feature.children.forEach(a=>{a.scenario&&(a.scenario.tags.forEach(p=>{r.add(p.name.startsWith("@")?p.name.slice(1):p.name)}),a.scenario.examples.forEach(p=>{p.tags.forEach(c=>{r.add(c.name.startsWith("@")?c.name.slice(1):c.name)})})),a.rule&&a.rule.children.forEach(p=>{p.scenario&&p.scenario.tags.forEach(c=>{r.add(c.name.startsWith("@")?c.name.slice(1):c.name)})})}))}catch(s){console.warn(`[GherkinParser] Failed to parse ${t}:`,s)}return{imports:[],exports:[],tags:Array.from(r).map(s=>({name:s,kind:"comment-marker"})),category:"test"}}U("gherkin",Xt);var gs=f(require("path")),ds=require("@lezer/go"),_i=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Li=/^\/\/go:build\s+(.+)$/,Oi=/^\/\/\s*\+build\s+(.+)$/;function hs(t,e){let r=[],s=new Map,n=new Set,o=new Set,a=ds.parser.parse(e).cursor();do switch(a.name){case"LineComment":{let g=e.slice(a.from,a.to),d=g.match(_i);d?.[1]&&n.add(d[1]);let S=g.match(Li);S&&ms(S[1],o);let F=g.match(Oi);F&&ms(F[1],o);break}case"ImportSpec":{let g=a.node.getChild("String");if(g){let S=e.slice(g.from,g.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:S,isExternal:!0,isStyle:!1,type:"static"})}break}case"FunctionDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let g=a.node.getChild("DefName")??a.node.getChild("TypeSpec")?.getChild("DefName")??a.node.getChild("VarSpec")?.getChild("DefName")??a.node.getChild("ConstSpec")?.getChild("DefName");if(g){let d=e.slice(g.from,g.to);d!=="_"&&/^[A-Z]/.test(d)&&!s.has(d)&&s.set(d,{name:d})}break}}while(a.next());let p=r.some(g=>g.rawSpecifier==="testing"),c=gs.default.basename(t).endsWith("_test.go")||n.has("test")||p?"test":"logic",m=new Set([...n,...o]);return{imports:r,exports:Array.from(s.values()),tags:Array.from(m).map(g=>({name:g,kind:"comment-marker"})),category:c}}function ms(t,e){for(let r of t.split(/[\s,&|!()]+/)){let s=r.trim();s&&s!=="ignore"&&e.add(s)}}var ys=f(require("livescript"));function ji(t){let e=new Set,r=/@tag\s+([a-zA-Z0-9_-]+)/g,s=r.exec(t);for(;s!==null;)s[1]&&e.add(s[1]),s=r.exec(t);return e}function Wi(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}var zi=new Set(["first_line","first_column","last_line","last_column","line","column"]);function $i(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let s=t.right?.value;if(typeof s=="string"){let n=N(s);return{fromPath:e,toPath:"",rawSpecifier:n,isStyle:E(n),type:"static"}}}if(r==="Chain"&&t.head?.value==="require"){let s=t.tails?.[0];if(s?.constructor?.name==="Call"||s?.type==="Call"){let n=s.args?.[0]?.value;if(typeof n=="string"){let o=N(n);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:E(o),type:"require"}}}}return null}function Yt(t,e){if(!t||typeof t!="object")return[];let r=[],s=$i(t,e);s&&r.push(s);for(let n in t){if(zi.has(n))continue;let o=t[n];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)r.push(...Yt(i,e));else r.push(...Yt(o,e))}return r}function xs(t,e){let r=ji(e),s=Wi(t,r),n=[];try{n=Yt(ys.default.ast(e),t)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}var Ss=f(require("luaparse"));function Bi(t){let e=new Set,r=/@tag\s+([a-zA-Z0-9_-]+)/g,s=r.exec(t);for(;s!==null;)s[1]&&e.add(s[1]),s=r.exec(t);return e}function Ui(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function Ki(t,e){let r=[];function s(n){if(!(!n||typeof n!="object")){if((n.type==="CallExpression"||n.type==="StringCallExpression")&&n.base?.type==="Identifier"&&n.base?.name==="require"){let o;if(n.type==="CallExpression"){let i=n.arguments?.[0];i?.type==="StringLiteral"&&(o=N(i.raw))}else if(n.type==="StringCallExpression"){let i=n.argument;i?.type==="StringLiteral"&&(o=N(i.raw))}o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:E(o),type:"require"})}for(let o in n){if(o==="loc")continue;let i=n[o];if(i&&typeof i=="object")if(Array.isArray(i))for(let a of i)s(a);else s(i)}}}return s(t),r}function Ji(t){let e=new Set;for(let r of t)r.type==="LocalStatement"&&r.variables.forEach((s,n)=>{r.init[n]?.type==="TableConstructorExpression"&&e.add(s.name)});return e}function Hi(t){let e=t[t.length-1];if(e?.type!=="ReturnStatement")return[];let r=e.arguments[0];if(r?.type!=="TableConstructorExpression")return[];let s=[];for(let n of r.fields)n.type==="TableKeyString"&&s.push({name:n.key.name});return s}function Qi(t){let e=t.body,r=Ji(e),s=Hi(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&r.has(o.identifier.base.name)&&s.push({name:o.identifier.identifier.name}):o.identifier?.type==="Identifier"&&!o.isLocal&&s.push({name:o.identifier.name});else if(o.type==="AssignmentStatement")for(let i of o.variables)i.type==="MemberExpression"&&i.base.type==="Identifier"&&r.has(i.base.name)&&s.push({name:i.identifier.name});let n=new Set;return s.filter(o=>n.has(o.name)?!1:(n.add(o.name),!0))}function bs(t,e){let r=Bi(e),s=Ui(t,r),n=[],o=[];try{let i=Ss.default.parse(e);n=Ki(i,t),o=Qi(i)}catch{}return{imports:n,exports:o,tags:Array.from(r).map(i=>({name:i,kind:"comment-marker"})),category:s}}var Vi=["http://","https://","mailto:","//"],qi="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",Xi=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${qi})\\b`,"g"),vs;async function Yi(){return vs??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),vs}function Zi(t){let e=t.trim();return e.length===0||e.startsWith("#")||Vi.some(r=>e.startsWith(r))}function ea(t,e){let r=t.match(Xi);return r?r.map(s=>({fromPath:e,toPath:"",rawSpecifier:s,isStyle:!1,type:"static"})):[]}function ks(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!Zi(t.url)&&r.push({fromPath:e,toPath:"",rawSpecifier:t.url,isStyle:!1,type:"static"}),(t.type==="code"||t.type==="inlineCode")&&typeof t.value=="string"&&r.push(...ea(t.value,e)),Array.isArray(t.children))for(let s of t.children)ks(s,e,r)}async function Cs(t,e){let s=(await Yi()).parse(e),n=[];ks(s,t,n);let o=new Set;return{imports:n.filter(a=>o.has(a.rawSpecifier)?!1:(o.add(a.rawSpecifier),!0)),exports:[],tags:[],category:"other"}}var ws=f(require("path")),Es=require("@lezer/python"),ta=new Set(["pytest","unittest","nose","hypothesis"]);function Fs(t,e){let r=[],s=[],n=new Set,o=ws.default.basename(t).toLowerCase(),a=Es.parser.parse(e).cursor();do switch(a.name){case"Comment":{let c=e.slice(a.from,a.to).match(/#\s*@tag\s+([a-zA-Z0-9_-]+)/);c?.[1]&&n.add(c[1]);break}case"ImportStatement":{for(let c of ra(a.node,e,t))r.push(c);break}case"FunctionDefinition":case"ClassDefinition":{let c=a.node.parent;if(c?.name==="Script"||c?.name==="DecoratedStatement"&&c.parent?.name==="Script"){let g=a.node.getChild("VariableName");g&&s.push({name:e.slice(g.from,g.to)})}break}case"AssignStatement":{if(a.node.parent?.name==="Script"){let c=a.node.firstChild;c?.name==="VariableName"&&s.push({name:e.slice(c.from,c.to)})}break}}while(a.next());let p=ia(o,r,n);return p==="test"&&n.add("test"),{imports:r,exports:s,tags:Array.from(n).map(c=>({name:c,kind:"comment-marker"})),category:p}}function ra(t,e,r){let s=t.firstChild;return s?s.name==="from"?sa(t,e,r):na(t,e,r):[]}function sa(t,e,r){let s=t.firstChild;if(!s)return[];let n=s.nextSibling;for(;n&&n.name!=="import";)n=n.nextSibling;if(!n)return[];let o=e.slice(s.to,n.from).trim(),i=oa(n.nextSibling,e);if(!i.length)return[];let a=0;for(;a<o.length&&o[a]===".";)a++;let p=o.slice(a);if(a===0)return[me(r,o,i,!0)];let c=a===1?"./":"../".repeat(a-1);return p?[me(r,c+p.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[me(r,c.slice(0,-1),["*"],!1)]:i.map(m=>me(r,c+m,[m],!1))}function na(t,e,r){let s=[],n=t.firstChild?.nextSibling??null;for(;n;){if(n.name==="VariableName"){let o=e.slice(n.from,n.to);for(;n.nextSibling?.name==="."&&n.nextSibling.nextSibling?.name==="VariableName";)n=n.nextSibling.nextSibling,o+=`.${e.slice(n.from,n.to)}`;n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling),s.push(me(r,o,["*"],!0))}n=n.nextSibling}return s}function oa(t,e){let r=[],s=t;for(;s;)s.name==="*"?r.push("*"):s.name==="VariableName"&&(r.push(e.slice(s.from,s.to)),s.nextSibling?.name==="as"&&(s=s.nextSibling.nextSibling??s.nextSibling)),s=s.nextSibling;return r}function me(t,e,r,s){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:s,type:"static",symbols:r.length>0?r:void 0}}function ia(t,e,r){return t.startsWith("test_")||t.endsWith("_test.py")?"test":t==="conftest.py"||t==="setup.py"?"config":r.has("test")||e.some(s=>ta.has(s.rawSpecifier))?"test":"logic"}var tr=f(require("path")),l=f(require("typescript"));var h=f(require("typescript"));function aa(t){let e=1;function r(s){switch(s.kind){case h.default.SyntaxKind.IfStatement:case h.default.SyntaxKind.ConditionalExpression:case h.default.SyntaxKind.ForStatement:case h.default.SyntaxKind.ForInStatement:case h.default.SyntaxKind.ForOfStatement:case h.default.SyntaxKind.WhileStatement:case h.default.SyntaxKind.DoStatement:case h.default.SyntaxKind.CatchClause:case h.default.SyntaxKind.CaseClause:e++;break;case h.default.SyntaxKind.BinaryExpression:{let n=s.operatorToken.kind;(n===h.default.SyntaxKind.AmpersandAmpersandToken||n===h.default.SyntaxKind.BarBarToken||n===h.default.SyntaxKind.QuestionQuestionToken)&&e++;break}}h.default.forEachChild(s,r)}return r(t),e}function pa(t){let e=0;function r(s,n,o){if(h.default.isIfStatement(s)){e+=o?1:1+n;let a=o?n:n+1;r(s.expression,a,!1),r(s.thenStatement,a,!1),s.elseStatement&&(h.default.isIfStatement(s.elseStatement)?r(s.elseStatement,n,!0):(e+=1,r(s.elseStatement,n+1,!1)));return}if(h.default.isForStatement(s)||h.default.isForInStatement(s)||h.default.isForOfStatement(s)||h.default.isWhileStatement(s)||h.default.isDoStatement(s)||h.default.isSwitchStatement(s)){e+=1+n,h.default.forEachChild(s,a=>r(a,n+1,!1));return}if(h.default.isCatchClause(s)){e+=1+n,h.default.forEachChild(s,a=>r(a,n,!1));return}if(h.default.isConditionalExpression(s)&&(e+=1),h.default.isBinaryExpression(s)){let a=s.operatorToken.kind;(a===h.default.SyntaxKind.AmpersandAmpersandToken||a===h.default.SyntaxKind.BarBarToken||a===h.default.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(n>0&&(h.default.isFunctionDeclaration(s)||h.default.isFunctionExpression(s)||h.default.isArrowFunction(s))){e+=1+n,h.default.forEachChild(s,a=>r(a,n+1,!1));return}h.default.forEachChild(s,a=>r(a,n,!1))}return r(t,0,!1),e}function Zt(t){return{complexity:aa(t),cognitiveComplexity:pa(t)}}var b=f(require("typescript")),er=new Set(["test","describe","it"]);function Ts(t,e){ca(t,e),ua(t,e),fa(t,e),ma(t,e)}function ca(t,e){if((b.default.isFunctionDeclaration(t)||b.default.isVariableDeclaration(t))&&t.name&&b.default.isIdentifier(t.name)&&la(t)){let r;if(b.default.isFunctionDeclaration(t))r="function";else{let s=t.initializer;r=s&&(b.default.isArrowFunction(s)||b.default.isFunctionExpression(s))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function la(t){if(b.default.isFunctionDeclaration(t))return b.default.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&b.default.isSourceFile(e.parent)}function ua(t,e){if(!b.default.isStringLiteral(t))return;let r=t.text.match(/@[\w-]+/g);if(r)for(let s of r)e.tags.add({name:s.substring(1),kind:"comment-marker"})}function fa(t,e){if(!b.default.isSourceFile(t))return;let r=/@tag\s+([a-zA-Z0-9_-]+)/g,s=t.getFullText(),n=r.exec(s);for(;n!==null;)n[1]&&e.tags.add({name:n[1],kind:"comment-marker"}),n=r.exec(s)}function ma(t,e){if(b.default.isCallExpression(t)&&ga(t.expression))for(let r of t.arguments)b.default.isObjectLiteralExpression(r)&&da(r,e)}function ga(t){return b.default.isIdentifier(t)?er.has(t.text):!!(b.default.isPropertyAccessExpression(t)&&(er.has(t.name.text)||b.default.isIdentifier(t.expression)&&er.has(t.expression.text)))}function da(t,e){for(let r of t.properties){if(!b.default.isPropertyAssignment(r)||!b.default.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:s}=r,n=b.default.isArrayLiteralExpression(s)?s.elements.filter(b.default.isStringLiteral):r.name.text==="tag"&&b.default.isStringLiteral(s)?[s]:[];for(let o of n)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function rr(t,e,r){let s=[],n=new Map,o=new Set,i=l.default.createSourceFile(t,e,l.default.ScriptTarget.Latest,!0,r==="typescript"?l.default.ScriptKind.TSX:l.default.ScriptKind.JSX),a={filePath:t,imports:s,exports:n,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},p=R=>{Sa(R,a),l.default.forEachChild(R,p)};p(i);let c=Ma(t,a);(c==="test"||c==="barrel")&&o.add({name:c,kind:"comment-marker"}),c!=="test"&&Ia(a,i);let m=i.statements[0],g=m?As(m):void 0,{complexity:d,cognitiveComplexity:S}=Zt(i),F=ha(i);return{imports:s,exports:Array.from(n.values()),tags:Array.from(o),category:c,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:S,...F.length>0?{functions:F}:{},...g!==void 0?{description:g}:{}}}function ha(t){let e=[],r=(n,o)=>{let{complexity:i,cognitiveComplexity:a}=Zt(o),p=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:n,line:p,complexity:i,cognitiveComplexity:a})},s=(n,o)=>{if(l.default.isFunctionDeclaration(n)&&n.name&&n.body?r(n.name.text,n):l.default.isVariableDeclaration(n)&&l.default.isIdentifier(n.name)&&n.initializer&&(l.default.isArrowFunction(n.initializer)||l.default.isFunctionExpression(n.initializer))?r(n.name.text,n.initializer):o&&l.default.isMethodDeclaration(n)&&l.default.isIdentifier(n.name)&&n.body?r(`${o}.${n.name.text}`,n):o&&l.default.isConstructorDeclaration(n)&&n.body?r(`${o}.constructor`,n):o&&l.default.isGetAccessorDeclaration(n)&&l.default.isIdentifier(n.name)&&n.body?r(`${o}.get ${n.name.text}`,n):o&&l.default.isSetAccessorDeclaration(n)&&l.default.isIdentifier(n.name)&&n.body&&r(`${o}.set ${n.name.text}`,n),l.default.isClassDeclaration(n)&&n.name){let i=n.name.text;l.default.forEachChild(n,a=>s(a,i));return}l.default.forEachChild(n,i=>s(i,o))};return s(t,void 0),e}function Ps(t,e,r,s){let n={name:t},o=As(r);o!==void 0&&(n.doc=o);let i=ya(e);i!==void 0&&(n.flags=i);let a=xa(e,s);return a!==void 0&&(n.signature=a),n}function As(t){let e=l.default.getJSDocCommentsAndTags(t);for(let r of e)if(l.default.isJSDoc(r)&&r.comment)return l.default.getTextOfJSDocComment(r.comment)||void 0}function ya(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=l.default.getJSDocTags(t).map(s=>s.tagName.text).filter(s=>e.has(s));return r.length>0?r:void 0}function xa(t,e){let r=l.default.createPrinter({removeComments:!0}),s=n=>r.printNode(l.default.EmitHint.Unspecified,n,e);if(l.default.isFunctionDeclaration(t)||l.default.isMethodDeclaration(t)){let n=t.parameters.map(s).join(", "),o=t.type?s(t.type):"void";return`${t.typeParameters?`<${t.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${n}) => ${o}`}if(l.default.isVariableDeclaration(t)){if(t.type)return s(t.type);if(t.initializer&&(l.default.isArrowFunction(t.initializer)||l.default.isFunctionExpression(t.initializer))){let n=t.initializer,o=n.parameters.map(s).join(", "),i=n.type?s(n.type):"unknown";return`(${o}) => ${i}`}return}if(l.default.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(l.default.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(l.default.isTypeAliasDeclaration(t))return s(t.type);if(l.default.isEnumDeclaration(t))return`enum ${t.name.text}`}function Sa(t,e){ba(t,e),va(t,e),Ca(t,e),wa(t,e),Aa(t,e),Ts(t,e)}function ba(t,e){if(!l.default.isSourceFile(t))return;let r=t.statements.filter(s=>!l.default.isEmptyStatement(s));e.totalStatements=r.length,e.exportStatements=r.filter(s=>l.default.isExportDeclaration(s)||l.default.isExportAssignment(s)||sr(s)).length}function va(t,e){if(l.default.isJsxElement(t)||l.default.isJsxSelfClosingElement(t)||l.default.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(l.default.isFunctionDeclaration(t)||l.default.isMethodDeclaration(t)||l.default.isArrowFunction(t)||l.default.isClassDeclaration(t)||l.default.isVariableStatement(t)||l.default.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}l.default.isExportDeclaration(t)&&!ka(t)&&(e.hasTypesOnly=!1)}function ka(t){return t.isTypeOnly?!0:!t.exportClause||!l.default.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Ca(t,e){if(!l.default.isImportDeclaration(t)||!t.moduleSpecifier||!l.default.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(l.default.isNamedImports(t.importClause.namedBindings))for(let n of t.importClause.namedBindings.elements)r.push(n.name.text);else l.default.isNamespaceImport(t.importClause.namedBindings)&&r.push("*");let s=r.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.moduleSpecifier.text,isStyle:E(t.moduleSpecifier.text),type:s,symbols:r.length>0?r:void 0})}function wa(t,e){l.default.isExportDeclaration(t)?Ea(t,e):l.default.isExportAssignment(t)?e.exports.set("default",{name:"default"}):sr(t)&&Pa(t,e)}function Ea(t,e){if(t.moduleSpecifier&&l.default.isStringLiteral(t.moduleSpecifier))Fa(t,t.moduleSpecifier.text,e);else if(t.exportClause&&l.default.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let s=r.name.text;e.exports.set(s,{name:s})}}function Fa(t,e,r){let s=Ta(t),n={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:E(e),type:"re-export"};s.length>0&&(n.symbols=s),r.imports.push(n)}function Ta(t){return t.exportClause?l.default.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Pa(t,e){if((l.default.isFunctionDeclaration(t)||l.default.isClassDeclaration(t)||l.default.isInterfaceDeclaration(t)||l.default.isTypeAliasDeclaration(t)||l.default.isEnumDeclaration(t))&&t.name){let s=t.name.text;e.exports.set(s,Ps(s,t,t,e.sourceFile));return}if(l.default.isVariableStatement(t)){for(let s of t.declarationList.declarations)if(l.default.isIdentifier(s.name)){let n=s.name.text;e.exports.set(n,Ps(n,s,t,e.sourceFile))}}}function Aa(t,e){if(!l.default.isCallExpression(t))return;let r=t.arguments[0];!r||!l.default.isStringLiteral(r)||(t.expression.kind===l.default.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:E(r.text),type:"dynamic"}):l.default.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:E(r.text),type:"require"}))}function Ma(t,e){let r=tr.default.basename(t).toLowerCase(),s=tr.default.extname(t).toLowerCase();return ee().some(o=>r.includes(o))?"test":gr(r)?"config":e.imports.some(o=>tt().some(i=>o.rawSpecifier.includes(i)))?"test":s===".tsx"||s===".jsx"||e.hasUI?"ui":e.hasTypesOnly&&e.totalStatements>0?"type-only":e.totalStatements>0&&e.exportStatements/e.totalStatements>st()?"barrel":"logic"}function sr(t){return l.default.canHaveModifiers(t)&&l.default.getModifiers(t)?.some(e=>e.kind===l.default.SyntaxKind.ExportKeyword)===!0}function Ia(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let s=new Map;for(let n of e.statements){if(!l.default.isImportDeclaration(n)||!l.default.isStringLiteral(n.moduleSpecifier))continue;let o=n.moduleSpecifier.text,i=n.importClause;if(i&&(i.name&&s.set(i.name.text,o),i.namedBindings&&l.default.isNamedImports(i.namedBindings)))for(let a of i.namedBindings.elements)s.set(a.name.text,o)}if(s.size!==0)for(let n of e.statements){let o=Ra(n);if(o){let i=Ga(n);i&&Je(i,o,s,r);continue}l.default.isClassDeclaration(n)&&n.name&&Na(n,s,r)}}function Na(t,e,r){let s=t.name.text;for(let n of t.members)l.default.isMethodDeclaration(n)&&n.body&&l.default.isIdentifier(n.name)?Je(n.body,`${s}.${n.name.text}`,e,r):l.default.isConstructorDeclaration(n)&&n.body&&Je(n.body,`${s}.constructor`,e,r)}function Ra(t){if(sr(t)){if(l.default.isFunctionDeclaration(t)&&t.name)return t.name.text;if(l.default.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(l.default.isIdentifier(e.name)&&e.initializer&&(l.default.isArrowFunction(e.initializer)||l.default.isFunctionExpression(e.initializer)))return e.name.text}}}function Ga(t){if(l.default.isFunctionDeclaration(t))return t.body;if(l.default.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(l.default.isArrowFunction(e.initializer)||l.default.isFunctionExpression(e.initializer)))return e.initializer}}function Je(t,e,r,s){if(l.default.isCallExpression(t)&&l.default.isIdentifier(t.expression)){let n=t.expression.text,o=r.get(n);o&&!s.some(i=>i.from===e&&i.to===n&&i.toSpecifier===o)&&s.push({from:e,to:n,toSpecifier:o})}l.default.forEachChild(t,n=>Je(n,e,r,s))}function He(t,e){if(e.length===0)return"ui";let r=!1;return t.walk(s=>{if(s.type==="rule")return r=!0,!1}),r?"ui":"barrel"}var nr=f(require("postcss")),Da=f(require("postcss-less")),_a=Da,Is=new Set(["reference","inline"]);function Ms(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function La(t){let e=t.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function Oa(t,e){let r=t.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(r){let o=r[1]?.trim()??"",i=r[2]??"";if(!i)return null;let a=Is.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...Ms(i)?{isExternal:!0}:{}}}let s=t.match(/^url\(['"]?([^'")]+)['"]?\)/),n=s?s[1]?.trim()??"":t.match(/^['"]([^'"]+)['"]/)?.[1]??"";return n?{fromPath:e,toPath:"",rawSpecifier:n,isStyle:!0,type:"static",...Ms(n)?{isExternal:!0}:{}}:null}function ja(t,e){let r=[],s=/url\(['"]?([^'")]+)['"]?\)/g,n=s.exec(t);for(;n!==null;){let o=n[1]?.trim()??"";La(o)&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),n=s.exec(t)}return r}function Ns(t,e){let r=[];return t.walk(s=>{if(s.type==="atrule"&&s.name==="import"){let n=Oa(s.params,e);n&&r.push(n)}s.type==="decl"&&r.push(...ja(s.value,e))}),r}function Wa(t){return t.replace(/(?<!:)\/\/.*/g,"")}function za(t,e){let r=[],s=/@import\s+(?:\(([^)]+)\)\s+)?['"]([^'"]+)['"]/g,n=s.exec(t);for(;n!==null;){let o=n[1]?.trim()??"",i=n[2]??"";if(i){let a=Is.has(o)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}n=s.exec(t)}return r}function Rs(t,e){let r=nr.default.parse(Wa(t));return{imports:Ns(r,e),root:r}}function $a(t){let e=[],r=[];for(let s of t.nodes??[]){if(s.type!=="atrule")continue;let{value:n}=s;if(n===void 0)continue;let o=s.name;o&&(e.push({name:o}),r.push({name:o,kind:"variable"}))}return{exports:e,tags:r}}function Gs(t,e){try{let r=_a.parse(t),{exports:s,tags:n}=$a(r);return{imports:Ns(r,e),root:r,exports:s,tags:n}}catch{return{imports:za(t,e),root:nr.default.parse(""),exports:[],tags:[]}}}var _s=require("postcss-scss");function Ds(t){return t.startsWith("_")||t.startsWith("-")}function Ba(t){return!!(t.startsWith("sass:")||t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||!t.startsWith(".")&&!t.startsWith("/")&&!t.startsWith("_"))}function Ua(t){let e=t.match(/^['"]([^'"]+)['"]/);if(!e?.[1])return{specifier:""};let r=e[1],n=t.match(/\bas\s+(\S+)/)?.[1];return n!==void 0?{specifier:r,alias:n}:{specifier:r}}function Ka(t){let e=[],r=[];for(let s of t.nodes??[]){if(s.type==="decl"&&s.prop.startsWith("$")){let n=s.prop.slice(1);if(!n||Ds(n))continue;e.push({name:n}),r.push({name:n,kind:"variable"});continue}if(s.type==="atrule"&&(s.name==="mixin"||s.name==="function")){let o=s.params.match(/^([\w-]+)/)?.[1];if(!o||Ds(o))continue;let i=s.params.trim();e.push(i.includes("(")?{name:o,signature:i}:{name:o}),r.push({name:o,kind:"function"})}}return{exports:e,tags:r}}function Ls(t,e){let r=(0,_s.parse)(t),s=[];r.walk(i=>{if(i.type!=="atrule")return;let{name:a,params:p}=i;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:c,alias:m}=Ua(p);if(!c)return;let g={fromPath:e,toPath:"",rawSpecifier:c,isStyle:!0,type:a==="forward"?"re-export":"static",...Ba(c)?{isExternal:!0}:{}};m&&(g.symbols=[m]),s.push(g)});let{exports:n,tags:o}=Ka(r);return{imports:s,root:r,exports:n,tags:o}}function Os(t,e){let r=[],s=/@require\s+['"]([^'"]+)['"]/g,n=s.exec(t);for(;n!==null;){let i=n[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"require"}),n=s.exec(t)}let o=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(n=o.exec(t);n!==null;){let i=n[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),n=o.exec(t)}return r}function js(t,e){if(e.length===0)return"ui";try{let r=require("stylus");return new r.Parser(t).parse().nodes.some(o=>o.constructor.name!=="Import")?"ui":"barrel"}catch{return t.replace(/^\s*@?(?:require|import)\b.*/gm,"").trim().length>0?"ui":"barrel"}}function ge(t,e){let r=I(t);if(r==="stylus"){let o=Os(e,t);return{imports:o,exports:[],tags:[],category:js(e,o)}}if(r==="scss"){let{imports:o,root:i,exports:a,tags:p}=Ls(e,t);return{imports:o,exports:a,tags:p,category:He(i,o)}}if(r==="less"){let{imports:o,root:i,exports:a,tags:p}=Gs(e,t);return{imports:o,exports:a,tags:p,category:He(i,o)}}let{imports:s,root:n}=Rs(e,t);return{imports:s,exports:[],tags:[],category:He(n,s)}}for(let[t,e]of[["javascript",(r,s)=>rr(r,s,"javascript")],["typescript",(r,s)=>rr(r,s,"typescript")],["css",ge],["scss",ge],["less",ge],["stylus",ge],["coffeescript",us],["livescript",xs],["lua",bs],["python",Fs],["go",hs],["gherkin",Xt],["markdown",Cs]])U(t,e);async function Ws(t,e){let r=I(t),s=$r(r);return s?s(t,e):{imports:[],exports:[],tags:[],category:"other"}}var or=f(require("path"));function $s(t,e){for(let r of t.values()){let s=e.get(r.path);s!==void 0&&(r.coveragePct=s)}}function Bs(t,e){for(let r of t)if(r.isExternal){let s=r.rawSpecifier.startsWith("@")?r.rawSpecifier.split("/").slice(0,2).join("/"):r.rawSpecifier.split("/")[0];s&&!e.some(n=>n.name===s)&&e.push({name:s,kind:"library"})}}function Us(t){for(let e of t.values())if(e.category==="test")for(let r of e.imports){if(r.isExternal||!r.toPath)continue;let s=t.get(r.toPath);s&&(s.category!=="logic"&&s.category!=="barrel"||(s.testedBy??=[],s.testedBy.includes(e.path)||s.testedBy.push(e.path)))}}function Ks(t){for(let e of t.values())if(e.type==="markdown")for(let r of e.imports){if(r.isExternal||!r.toPath)continue;let s=t.get(r.toPath);!s||s===e||(s.documentedBy??=[],s.documentedBy.includes(e.path)||s.documentedBy.push(e.path),s.category==="logic"&&(s.lastCommitAt??0)>(e.lastCommitAt??0)&&(e.staleFor??=[],e.staleFor.includes(s.path)||e.staleFor.push(s.path)))}}function zs(t){return Math.round(t*1e4)/1e4}function Js(t){for(let e of t.values()){let r=[];for(let s of e.imports){if(s.isExternal||!s.toPath)continue;let n=t.get(s.toPath);if(!n||n.exports.length===0)continue;let o;if(s.symbols===void 0){if(s.type==="side-effect")continue;o=1}else s.symbols.includes("*")?o=1:o=s.symbols.length/n.exports.length;s.exportUsageRatio=zs(Math.min(1,o)),r.push(s.exportUsageRatio)}r.length>0&&(e.avgExportUsage=zs(r.reduce((s,n)=>s+n,0)/r.length),e.maxExportUsage=Math.max(...r))}}function ir(t,e,r){e&&(t.some(s=>s.name===e&&s.kind===r)||t.push({name:e,kind:r}))}function Ja(t,e){let r=e.toPath,s=or.default.basename(r,or.default.extname(r)).replace(/\.(test|spec)$/,"");ir(t.tags,s,"import")}function Ha(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)ir(t.tags,r,"import")}function Qa(t,e,r){let s=r.get(e.toPath);if(!(!s||s.category==="test"))for(let n of s.tags)n.kind==="comment-marker"&&ir(t.tags,n.name,"comment-marker")}function Hs(t){for(let e of t.values())if(e.category==="test")for(let r of e.imports)!r.toPath||r.isExternal||(Ja(e,r),Ha(e,r),Qa(e,r,t))}var be=f(require("fs")),A=f(require("path"));var ar=f(require("fs")),O=f(require("path")),de=class{extensions=[".go"];goModCache=new Map;resolve(e,r,s,n){let{mod:o,replaces:i}=this.readGoMod(s);if(!o)return null;let a=this.applyReplace(r,i,s);if(a!==void 0)return Vs(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let p=r.slice(o.length).replace(/^\//,"");return p?Vs(O.default.join(s,p)):null}readGoMod(e){let r=this.goModCache.get(e);if(r!==void 0)return r;let s={mod:null,replaces:new Map};try{let n=ar.default.readFileSync(O.default.join(e,"go.mod"),"utf-8"),o=Va(n,e);return this.goModCache.set(e,o),o}catch{return this.goModCache.set(e,s),s}}applyReplace(e,r,s){for(let[n,o]of r){if(e===n)return o;if(e.startsWith(`${n}/`)){let i=e.slice(n.length+1);return O.default.join(o,i)}}}};function Va(t,e){let r=t.split(`
23
- `),s=null,n=new Map,o=!1;for(let i of r){let a=i.trim();if(a.startsWith("module ")){s=a.slice(7).trim();continue}if(/^replace\s*\(/.test(a)){o=!0;continue}if(o&&a===")"){o=!1;continue}if(o&&a.includes("=>")){Qs(a,e,n);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&Qs(a.replace(/^replace\s+/,""),e,n)}return{mod:s,replaces:n}}function Qs(t,e,r){let[s,n]=t.split("=>").map(a=>a.trim());if(!s||!n)return;let o=s.split(/\s+/)[0];if(!n.startsWith(".")&&!n.startsWith("/"))return;let i=O.default.isAbsolute(n)?n:O.default.resolve(e,n);r.set(o,i)}function Vs(t){let e;try{e=ar.default.readdirSync(t,{withFileTypes:!0})}catch{return null}let r=e.filter(s=>s.isFile()&&s.name.endsWith(".go")&&!s.name.endsWith("_test.go")).map(s=>({path:O.default.join(t,s.name),isExternal:!1})).sort((s,n)=>s.path.localeCompare(n.path));return r.length>0?r:null}var qs=f(require("fs")),Qe=f(require("path")),he=class{extensions=[".lua"];resolve(e,r,s,n){let o=r.replace(/\./g,Qe.default.sep),i=[s,Qe.default.join(s,"lib")];for(let a of i){if(!qs.default.existsSync(a))continue;let p=n(Qe.default.join(a,"_dummy.lua"),o);if(p)return[p]}return null}};var Xs=f(require("path")),ye=class{extensions=[".md",".mdx"];resolve(e,r,s,n){let o=n(Xs.default.join(s,"_dummy"),`./${r}`);return o?[o]:null}};var Zs=f(require("fs")),Ve=f(require("path")),xe=class{extensions=[".py"];resolve(e,r,s,n){let o=r.replace(/\./g,Ve.default.sep),i=Ve.default.join(s,`${o}.py`);if(Ys(i))return[{path:i,isExternal:!1}];let a=Ve.default.join(s,o,"__init__.py");return Ys(a)?[{path:a,isExternal:!1}]:null}};function Ys(t){try{return Zs.default.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}var pr=f(require("path")),qa=["~","http://","https://","//","data:","sass:"],Se=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,s,n){if(qa.some(m=>r.startsWith(m)))return null;let o=n(e,r);if(o)return[o];let i=pr.default.dirname(r),a=pr.default.basename(r),p=i==="."?`_${a}`:`${i}/_${a}`,c=n(e,p);return c?[c]:null}};var j=class{constructor(e,r={}){this.rootDir=e;this.workspaceMap=r.workspaceMap??new Map,this.tsconfigSearchPaths=r.tsconfigSearchPaths??[e],this.pathAliases=r.pathAliases,this.langResolvers=r.langResolvers??[new xe,new he,new de,new Se,new ye]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;langResolvers;resolveAll(e,r){let s=this.resolvePathAlias(r);if(s)return[s];if(r.startsWith(".")||r.startsWith("/")){let i=this.resolveLocalPath(e,r);return i?[i]:[]}let n=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,r,this.rootDir,n);if(a)return a}let o=this.resolveWorkspaceImport(r);return o?[o]:[{path:r,isExternal:!0}]}resolve(e,r){let s=this.resolvePathAlias(r);if(s)return s;if(r.startsWith(".")||r.startsWith("/"))return this.resolveLocalPath(e,r);let n=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,r,this.rootDir,n);if(a)return a[0]??null}let o=this.resolveWorkspaceImport(r);return o||{path:r,isExternal:!0}}resolveLocalPath(e,r){let s=A.default.dirname(e),n=r.startsWith("/")?r:A.default.resolve(s,r),o=!n.startsWith(this.rootDir),i=["",".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".feature",".md",".mdx"],a=n.match(/\.(js|mjs|cjs)$/);if(a){let p=n.slice(0,-a[0].length);for(let c of[".ts",".tsx"]){let m=this.tryExtensions(p,c,o);if(m)return m}}for(let p of i){let c=this.tryExtensions(n,p,o);if(c)return c}return o?{path:n,isExternal:!0}:null}tryExtensions(e,r,s){let n=e+r;if(this.isFile(n))return{path:n,isExternal:s};let o=A.default.join(e,`index${r}`);if(this.isFile(o))return{path:o,isExternal:s};if(r===".py"){let i=A.default.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:s}}return null}isFile(e){try{return be.default.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let r in this.pathAliases){let s=this.matchAliasPattern(r,e),n=this.pathAliases[r];if(s&&n){let o=this.tryAliasSubstitutions(n,s[1]||"");if(o)return o}}for(let r of this.tsconfigSearchPaths){let s=A.default.join(r,"tsconfig.json");if(be.default.existsSync(s))try{let o=JSON.parse(be.default.readFileSync(s,"utf-8")).compilerOptions?.paths;if(!o)continue;for(let i in o){let a=this.matchAliasPattern(i,e);if(a){let p=this.tryAliasSubstitutions(o[i],a[1]||"",r);if(p)return p}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,r){let s=this.aliasRegexCache.get(e);if(!s){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace("\\*","(.*)");s=new RegExp(`^${n}$`),this.aliasRegexCache.set(e,s)}return r.match(s)}tryAliasSubstitutions(e,r,s=this.rootDir){let n=["",".ts",".tsx",".js",".jsx",".coffee",".ls",".lua",".feature"];for(let o of e){let i=o.replace("*",r),a=A.default.resolve(s,i);for(let p of n){let c=this.tryExtensions(a,p,!1);if(c)return c}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[r,s]of this.workspaceMap){if(e!==r&&!e.startsWith(`${r}/`))continue;let n=e.slice(r.length),o={path:"",isExternal:!1,isWorkspace:!0,workspacePackage:r};if(!n){for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"]){let p=A.default.join(s,a);try{if(be.default.statSync(p,{throwIfNoEntry:!1})?.isFile())return{...o,path:p}}catch{}}return{...o,path:s}}let i=this.resolveLocalPath(A.default.join(s,"_dummy"),n.slice(1));return i?{...o,path:i.path}:null}return null}};var Xa=["tests","test","__tests__","specs","spec"],en=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),Ya=20;function Za(t,e){if(t.length===0)return e;let r=t.map(i=>C.default.dirname(i).split(C.default.sep)),s=r[0];for(let i of r.slice(1)){let a=0;for(;a<s.length&&a<i.length&&s[a]===i[a];)a++;s=s.slice(0,a)}let n=s.join(C.default.sep)||C.default.sep,o=C.default.relative(e,n);return o.startsWith("..")||C.default.isAbsolute(o)?e:n}var ve=class{constructor(e,r=null,s,n,o=!1,i=new Map,a=!0){this.rootDir=e;this.enableGitStats=o;this.coverageMap=i;this.parallelParsing=a;this.previousGraph=r,this.resolver=s||new j(e),this.lockFile=as(e),n&&(this.progressCallback=n)}rootDir;enableGitStats;coverageMap;parallelParsing;graph={nodes:new Map};visited=new Set;queue=[];previousGraph=null;resolver;lockFile=null;progressCallback;pool=null;gitStatsMap=null;async build(e){let r=e.map(s=>C.default.isAbsolute(s)?s:C.default.resolve(this.rootDir,s));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=ns(this.rootDir));try{for(let s of r)this.enqueue(s);return await this.drain(),await this.processTestFiles(Za(r,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
21
+ `;return`${p+d+f+i}
22
+ ${l}`}};function ta(r){let e=r.split(`
23
+ `),t=-1;return e.forEach((s,o)=>{(s.trimStart().startsWith("import ")||s.trimStart().startsWith("from "))&&(t=o)}),t<0?0:e.slice(0,t+1).reduce((s,o)=>s+o.length+1,0)}var tr=g(require("path")),rr=g(require("typescript"));var ra=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,He=class{name="vitest";canHandle(e){return N.has(tr.default.extname(e).toLowerCase())}apply(e,t,n){let s=t.replace(ra,""),o=rr.default.createSourceFile(tr.default.basename(e),s,rr.default.ScriptTarget.Latest,!0),i=Ut(o),[a]=i;if(!a)return s;let c=Kt(a,"tags",o),p=[...n].sort();if(c!==null&&JSON.stringify([...c].sort())===JSON.stringify(p))return s;let l=i.flatMap(f=>{let d=n.length===0?Vt(f,"tags",o):Jt(f,"tags",Qt(p),o);return d?[d]:[]});return l.length>0?Ht(s,l):s}};var kn={vitest:()=>new He,playwright:()=>new Je,cypress:()=>new $e,jest:()=>new Ke},na={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function sa(r){let e=ye.default.createSourceFile("detect.ts",r,ye.default.ScriptTarget.Latest,!0);for(let t of e.statements){if(!ye.default.isImportDeclaration(t)||!ye.default.isStringLiteral(t.moduleSpecifier))continue;let n=na[t.moduleSpecifier.text];if(n)return n}return null}var nr=class{constructor(e,t,n){this.rootDir=e;this.defaultFramework=t;this.frameworkOverrides=n}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return N.has(Qe.default.extname(e).toLowerCase())}apply(e,t,n){let s=sa(t)??this.matchOverride(e)??this.defaultFramework;return(kn[s]??kn.vitest)().apply(e,t,n)}matchOverride(e){let t=Qe.default.relative(this.rootDir,e).split(Qe.default.sep).join("/");for(let[n,s]of this.frameworkOverrides)if(yn(n,t))return s;return null}};function wn(r="vitest",e={},t=process.cwd()){return[new Be,new Ve,new Ue,new nr(t,r,Object.entries(e))]}function Cn(r,e){return e.find(t=>t.canHandle(r))??null}var oa=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,ia=new Set(["import"]),aa=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function ca(r,e,t,n){let s;try{s=await sr.default.readFile(r,"utf8")}catch(a){return{path:r,status:"error",error:String(a)}}let o=Cn(r,n);if(!o)return{path:r,status:"unchanged"};let i=o.apply(r,s,e);return i===s?{path:r,status:"unchanged"}:(t||await sr.default.writeFile(r,i,"utf8"),{path:r,status:"updated"})}async function or(r,e,t){let n=ie(e),s=n.tagApplier?.framework??"vitest",o=n.tagApplier?.frameworkOverrides??{},i=wn(s,o,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let c of r.nodes.values()){if(c.category!=="test")continue;let p=new Set,l=[];for(let h of c.tags)ia.has(h.kind)&&oa.test(h.name)&&(aa.has(h.name.toLowerCase())||p.has(h.name)||(p.add(h.name),l.push(h.name)));l.sort();let f=Fn.default.resolve(e,c.path),d=await ca(f,l,t.dryRun,i);d.path=c.path,a.files.push(d),d.status==="updated"?a.updated++:d.status==="unchanged"?a.unchanged++:a.errors++}return a}var qe=class{isTestNode(e){return e.category==="test"||e.tags.some(t=>t.name==="test")}};var ne=g(require("fs")),E=g(require("path")),Fs=g(require("piscina"));var Xe=require("child_process"),Ye=class{getChangedFiles(){try{let t=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(n=>{try{return(0,Xe.execFileSync)("git",n,{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).split(`
24
+ `).map(o=>o.trim()).filter(o=>o!=="")}catch{return[]}});return Array.from(new Set(t))}catch(e){return console.error("Error getting git diff:",e),[]}}},En="%x00%H%x09%ae%x09%at",Tn=256*1024*1024;function Pn(r,e){let t="",n=0;for(let s of r.split(`
25
+ `)){if(s.startsWith("\0")){let[,c,p]=s.slice(1).split(" ");t=c??"",n=p?Number(p)*1e3:0;continue}if(s==="")continue;let o=s.split(" "),i=o[0];if(!i)continue;let a=i.startsWith("R")||i.startsWith("C")?o[2]:o[1];a&&e(a,t,n)}}function An(r){let e=new Map;try{let t=(0,Xe.execFileSync)("git",["-C",r,"log","--since=90 days ago","--name-status","-M",`--format=${En}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Tn});Pn(t,(n,s,o)=>{let i=e.get(n);if(i){i.commitCount90d+=1;return}e.set(n,{commitCount90d:1,lastAuthor:s||void 0,lastCommitAt:o||void 0})})}catch{return e}try{let t=(0,Xe.execFileSync)("git",["-C",r,"log","--name-status","-M",`--format=${En}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Tn});Pn(t,(n,s,o)=>{e.has(n)||e.set(n,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}var ir=g(require("path"));function L(r){switch(ir.default.extname(r).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function A(r){let e=ir.default.extname(r).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}var In=g(require("coffeescript"));function _(r){return r.startsWith("'")||r.startsWith('"')?r.slice(1,-1):r}function ee(r){let e=new Set,t=/@tag\s+([a-zA-Z0-9_-]+)/g,n=t.exec(r);for(;n!==null;)n[1]&&e.add(n[1]),n=t.exec(r);return e}function te(r,e){let t=r.toLowerCase();return t.includes(".test.")||t.includes(".spec.")||e.has("test")?"test":"logic"}function Mn(r){if(r){if(typeof r.originalValue=="string")return r.originalValue;if(typeof r.value=="string")return _(r.value)}}function B(r){if(r){if(typeof r.value=="string")return r.value;if(typeof r.base?.value=="string")return r.base.value}}function pa(r,e){let t=Mn(e.source);return t?{fromPath:r,toPath:"",rawSpecifier:t,isStyle:A(t),type:"static"}:null}function la(r,e){let t=e.variable?.base?.value==="require",n=Mn(e.args?.[0]?.base);return!t||!n?null:{fromPath:r,toPath:"",rawSpecifier:n,isStyle:A(n),type:"require"}}function Nn(r,e){if(e)return[{name:e}];let t=r.value;if(t?.constructor?.name==="Class"){let s=B(t.variable);return s?[{name:s}]:[]}if(t?.base?.constructor?.name==="Obj"&&Array.isArray(t.base.properties))return t.base.properties.map(s=>B(s.variable)??B(s)).filter(s=>!!s).map(s=>({name:s}));let n=B(t);return n?[{name:n}]:[]}function fa(r){if(Array.isArray(r.specifiers))return r.specifiers.map(t=>t.identifier??t.original?.value).filter(t=>!!t).map(t=>({name:t}));let e=B(r.variable)??B(r.variable?.base);return e?[{name:e}]:[]}function ua(r,e,t,n){let s=e.constructor?.name;if(s==="ImportDeclaration"){let o=pa(r,e);o&&t.push(o)}else if(s==="Call"){let o=la(r,e);o&&t.push(o)}else if(s==="Assign"){let o=B(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?n.push(...Nn(e,void 0)):o==="exports"&&typeof i=="string"&&n.push(...Nn(e,i))}else s==="ExportNamedDeclaration"&&e.clause?n.push(...fa(e.clause)):s==="ExportDefaultDeclaration"&&n.push({name:"default"})}function ar(r,e,t,n){if(!(!e||typeof e!="object")){ua(r,e,t,n);for(let s in e){if(s==="locationData")continue;let o=e[s];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)ar(r,i,t,n);else ar(r,o,t,n)}}}function Dn(r,e){let t=ee(e),n=te(r,t),s=[],o=[];try{ar(r,In.default.nodes(e),s,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(t).map(c=>({name:c,kind:"comment-marker"})),category:n}}var re=require("@cucumber/gherkin"),Rn=require("@cucumber/messages");var ma=Rn.IdGenerator.uuid();function cr(r,e){let t=new Set;try{let n=new re.AstBuilder(ma),s=new re.GherkinClassicTokenMatcher,i=new re.Parser(n,s).parse(e);i.feature&&(i.feature.tags.forEach(a=>{t.add(a.name.startsWith("@")?a.name.slice(1):a.name)}),i.feature.children.forEach(a=>{a.scenario&&(a.scenario.tags.forEach(c=>{t.add(c.name.startsWith("@")?c.name.slice(1):c.name)}),a.scenario.examples.forEach(c=>{c.tags.forEach(p=>{t.add(p.name.startsWith("@")?p.name.slice(1):p.name)})})),a.rule&&a.rule.children.forEach(c=>{c.scenario&&c.scenario.tags.forEach(p=>{t.add(p.name.startsWith("@")?p.name.slice(1):p.name)})})}))}catch(n){console.warn(`[GherkinParser] Failed to parse ${r}:`,n)}return{imports:[],exports:[],tags:Array.from(t).map(n=>({name:n,kind:"comment-marker"})),category:"test"}}Z("gherkin",cr);var _n=g(require("path")),On=require("@lezer/go");function U(r){let e=[],t=r.firstChild;for(;t;)e.push(t),t=t.nextSibling;return e}function xe(r,e){let t=1;for(let n=0;n<e&&n<r.length;n++)r[n]===`
26
+ `&&t++;return t}function ga(r,e){let t=1;function n(s){switch(s.type.name){case"IfStatement":case"ForStatement":t++;break;case"Case":{s.firstChild?.type.name==="case"&&t++;break}case"LogicOp":{let i=e.slice(s.from,s.to);(i==="&&"||i==="||")&&t++;break}}let o=s.firstChild;for(;o;)n(o),o=o.nextSibling}return n(r),t}function da(r,e){let t=0;function n(s,o,i){let a=s.type.name;if(a==="IfStatement"){t+=i?1:1+o;let l=U(s),f=i?o:o+1,d=l[1];d&&d.type.name!=="Block"&&n(d,f,!1);let h=l.find(x=>x.type.name==="Block");h&&n(h,f,!1);let v=l.findIndex(x=>x.type.name==="else");if(v>=0){let x=l[v+1];x?.type.name==="IfStatement"?n(x,o,!0):x&&(t+=1,n(x,o+1,!1))}return}if(a==="ForStatement"||a==="SwitchStatement"||a==="SelectStatement"){t+=1+o;let l=s.firstChild;for(;l;)n(l,o+1,!1),l=l.nextSibling;return}if(a==="LogicOp"){let l=e.slice(s.from,s.to);(l==="&&"||l==="||")&&(t+=1)}if(o>0&&a==="FunctionLiteral"){t+=1+o;let l=s.firstChild;for(;l;)n(l,o+1,!1),l=l.nextSibling;return}let p=s.firstChild;for(;p;)n(p,o,!1),p=p.nextSibling}return n(r,0,!1),t}function Ze(r,e){return{complexity:ga(r,e),cognitiveComplexity:da(r,e)}}function pr(r,e){let n=r.getChild("Parameters")?.getChild("Parameter"),s=n?.getChild("TypeName")??n?.getChild("PointerType")?.getChild("TypeName");return s?e.slice(s.from,s.to):void 0}function Gn(r,e){let t=[],n=r.cursor();do if(n.name==="FunctionDecl"){let s=n.node.getChild("DefName");if(s){let o=e.slice(s.from,s.to),{complexity:i,cognitiveComplexity:a}=Ze(n.node,e);t.push({name:o,line:xe(e,n.from),complexity:i,cognitiveComplexity:a})}}else if(n.name==="MethodDecl"){let s=n.node.getChild("FieldName");if(s){let o=e.slice(s.from,s.to),i=pr(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:p}=Ze(n.node,e);t.push({name:a,line:xe(e,n.from),complexity:c,cognitiveComplexity:p})}}while(n.next());return t}var ha=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,ya=/^\/\/go:build\s+(.+)$/,xa=/^\/\/\s*\+build\s+(.+)$/;function jn(r,e){let t=[],n=new Map,s=new Set,o=new Set,i=new Map,a=On.parser.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let k=e.slice(c.from,c.to),T=k.match(ha);T?.[1]&&s.add(T[1]);let I=k.match(ya);I&&Ln(I[1],o);let R=k.match(xa);R&&Ln(R[1],o);break}case"ImportSpec":{let k=c.node.getChild("String");if(k){let I=e.slice(k.from,k.to).slice(1,-1);t.push({fromPath:r,toPath:"",rawSpecifier:I,isExternal:!0,isStyle:!1,type:"static"});let R=c.node.getChild("DefName"),Q=R?e.slice(R.from,R.to):I.split("/").pop();Q&&Q!=="_"&&Q!=="."&&i.set(Q,I)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let k=c.node.getChild("DefName")??c.node.getChild("FieldName")??c.node.getChild("TypeSpec")?.getChild("DefName")??c.node.getChild("VarSpec")?.getChild("DefName")??c.node.getChild("ConstSpec")?.getChild("DefName");if(k){let T=e.slice(k.from,k.to);T!=="_"&&/^[A-Z]/.test(T)&&!n.has(T)&&n.set(T,{name:T})}break}}while(c.next());let p=t.some(k=>k.rawSpecifier==="testing"),l=_n.default.basename(r).endsWith("_test.go")||s.has("test")||p?"test":"logic",f=new Set([...s,...o]),{complexity:d,cognitiveComplexity:h}=Ze(a.topNode,e),v=Gn(a,e),x=l==="test"?[]:Sa(a,e,i);return{imports:t,exports:Array.from(n.values()),tags:Array.from(f).map(k=>({name:k,kind:"comment-marker"})),category:l,rawCallEdges:x,complexity:d,cognitiveComplexity:h,...v.length>0?{functions:v}:{}}}function Sa(r,e,t){let n=[];function s(i,a){if(i.type.name==="CallExpr"){let p=i.firstChild;if(p?.type.name==="SelectorExpr"){let l=p.firstChild,f=p.getChild("FieldName");if(l?.type.name==="VariableName"&&f){let d=e.slice(l.from,l.to),h=t.get(d);if(h){let v=e.slice(f.from,f.to);n.push({from:a,to:v,toSpecifier:h})}}}}let c=i.firstChild;for(;c;)s(c,a),c=c.nextSibling}let o=r.cursor();do if(o.name==="FunctionDecl"){let i=o.node.getChild("DefName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to);/^[A-Z]/.test(c)&&s(a,c)}}else if(o.name==="MethodDecl"){let i=o.node.getChild("FieldName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to),p=pr(o.node,e);s(a,p?`${p}.${c}`:c)}}while(o.next());return n}function Ln(r,e){for(let t of r.split(/[\s,&|!()]+/)){let n=t.trim();n&&n!=="ignore"&&e.add(n)}}var Wn=g(require("livescript"));function K(r){if(r){if(typeof r.value=="string")return r.value;if(typeof r.base?.value=="string")return r.base.value}}function ba(r){if(!r)return[];if(r.constructor?.name==="Class"){let t=K(r.title);return t?[{name:t}]:[]}if(r.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(t=>K(t.key)??K(t.val)).filter(t=>!!t).map(t=>({name:t}));let e=K(r);return e?[{name:e}]:[]}function va(r){let e=r.constructor?.name||r.type;if(e==="Assign"&&r.left?.constructor?.name==="Chain"){let t=r.left,n=K(t.head),o=t.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return ba(r.right);if(n==="exports"&&typeof o=="string")return[{name:o}];if(t.head?.verb==="out"&&typeof o=="string")return[{name:o}]}if(e==="Import"&&r.left?.verb==="out"){let t=r.right;if(t?.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(n=>K(n.val)??K(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var ka=new Set(["first_line","first_column","last_line","last_column","line","column"]);function wa(r,e){let t=r.constructor?.name||r.type;if(t==="Import"){let n=r.right?.value;if(typeof n=="string"){let s=_(n);return{fromPath:e,toPath:"",rawSpecifier:s,isStyle:A(s),type:"static"}}}if(t==="Chain"&&r.head?.value==="require"){let n=r.tails?.[0];if(n?.constructor?.name==="Call"||n?.type==="Call"){let s=n.args?.[0]?.value;if(typeof s=="string"){let o=_(s);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:A(o),type:"require"}}}}return null}function lr(r,e,t){if(!r||typeof r!="object")return[];let n=[],s=wa(r,e);s&&n.push(s),t.push(...va(r));for(let o in r){if(ka.has(o))continue;let i=r[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...lr(a,e,t));else n.push(...lr(i,e,t))}return n}function zn(r,e){let t=ee(e),n=te(r,t),s=[],o=[];try{s=lr(Wn.default.ast(e),r,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(t).map(c=>({name:c,kind:"comment-marker"})),category:n}}var $n=g(require("luaparse"));function Ca(r,e){let t=[];function n(s){if(!(!s||typeof s!="object")){if((s.type==="CallExpression"||s.type==="StringCallExpression")&&s.base?.type==="Identifier"&&s.base?.name==="require"){let o;if(s.type==="CallExpression"){let i=s.arguments?.[0];i?.type==="StringLiteral"&&(o=_(i.raw))}else if(s.type==="StringCallExpression"){let i=s.argument;i?.type==="StringLiteral"&&(o=_(i.raw))}o&&t.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:A(o),type:"require"})}for(let o in s){if(o==="loc")continue;let i=s[o];if(i&&typeof i=="object")if(Array.isArray(i))for(let a of i)n(a);else n(i)}}}return n(r),t}function Fa(r){let e=new Set;for(let t of r)t.type==="LocalStatement"&&t.variables.forEach((n,s)=>{t.init[s]?.type==="TableConstructorExpression"&&e.add(n.name)});return e}function Ea(r){let e=r[r.length-1];if(e?.type!=="ReturnStatement")return[];let t=e.arguments[0];if(t?.type!=="TableConstructorExpression")return[];let n=[];for(let s of t.fields)s.type==="TableKeyString"&&n.push({name:s.key.name});return n}function Ta(r){let e=r.body,t=Fa(e),n=Ea(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&t.has(o.identifier.base.name)&&n.push({name:o.identifier.identifier.name}):o.identifier?.type==="Identifier"&&!o.isLocal&&n.push({name:o.identifier.name});else if(o.type==="AssignmentStatement")for(let i of o.variables)i.type==="MemberExpression"&&i.base.type==="Identifier"&&t.has(i.base.name)&&n.push({name:i.identifier.name});let s=new Set;return n.filter(o=>s.has(o.name)?!1:(s.add(o.name),!0))}function Bn(r,e){let t=ee(e),n=te(r,t),s=[],o=[];try{let i=$n.default.parse(e);s=Ca(i,r),o=Ta(i)}catch{}return{imports:s,exports:o,tags:Array.from(t).map(i=>({name:i,kind:"comment-marker"})),category:n}}var Pa=["http://","https://","mailto:","//"],Aa="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",Na=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${Aa})\\b`,"g"),Un;async function Ia(){return Un??=(async()=>{let{unified:r}=await import("unified"),e=(await import("remark-parse")).default;return r().use(e)})(),Un}function Ma(r){let e=r.trim();return e.length===0||e.startsWith("#")||Pa.some(t=>e.startsWith(t))}function Da(r,e){let t=r.match(Na);return t?t.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function Kn(r,e,t){if(r.type==="link"&&typeof r.url=="string"&&!Ma(r.url)&&t.push({fromPath:e,toPath:"",rawSpecifier:r.url,isStyle:!1,type:"static"}),(r.type==="code"||r.type==="inlineCode")&&typeof r.value=="string"&&t.push(...Da(r.value,e)),Array.isArray(r.children))for(let n of r.children)Kn(n,e,t)}async function Jn(r,e){let n=(await Ia()).parse(e),s=[];Kn(n,r,s);let o=new Set;return{imports:s.filter(a=>o.has(a.rawSpecifier)?!1:(o.add(a.rawSpecifier),!0)),exports:[],tags:[],category:"other"}}var Hn=g(require("path")),Qn=require("@lezer/python");function Ra(r){let e=1;function t(n){switch(n.type.name){case"IfStatement":{e+=U(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=U(n).filter(o=>o.type.name==="except").length;break}case"ForStatement":case"WhileStatement":case"ConditionalExpression":e++;break;case"and":case"or":e++;break}let s=n.firstChild;for(;s;)t(s),s=s.nextSibling}return t(r),e}function Ga(r){let e=0;function t(n,s){let o=n.type.name;if(o==="IfStatement"){let c=U(n),p=0,l=0;for(;l<c.length;){let f=c[l];if(f?.type.name==="if"||f?.type.name==="elif"){let d=p>0;e+=d?1:1+s;let h=d?s:s+1,v=c[l+1],x=c[l+2];v&&t(v,h),x&&t(x,h),p++,l+=3}else if(f?.type.name==="else"){e+=1;let d=c[l+1];d&&t(d,s+1),l+=2}else l++}return}if(o==="TryStatement"){let c=U(n),p=0;for(;p<c.length;){let l=c[p];if(l?.type.name==="except"){for(e+=1+s,p++;p<c.length&&c[p]?.type.name!=="Body";)t(c[p],s),p++;p<c.length&&(t(c[p],s),p++)}else l?.type.name==="Body"&&t(l,s),p++}return}if(o==="ForStatement"||o==="WhileStatement"){e+=1+s;let c=n.firstChild;for(;c;)t(c,s+1),c=c.nextSibling;return}if((o==="ConditionalExpression"||o==="and"||o==="or")&&(e+=1),s>0&&(o==="FunctionDefinition"||o==="LambdaExpression")){e+=1+s;let c=n.firstChild;for(;c;)t(c,s+1),c=c.nextSibling;return}let a=n.firstChild;for(;a;)t(a,s),a=a.nextSibling}return t(r,0),e}function fr(r){return{complexity:Ra(r),cognitiveComplexity:Ga(r)}}function Vn(r,e){let t=[];function n(i,a){let{complexity:c,cognitiveComplexity:p}=fr(i);t.push({name:a,line:xe(e,i.from),complexity:c,cognitiveComplexity:p})}function s(i){let a=i.firstChild;for(;a;)o(a),a=a.nextSibling}function o(i){if(i.type.name==="ClassDefinition"){let a=i.getChild("VariableName"),c=a?e.slice(a.from,a.to):void 0,p=i.getChild("Body");if(p){let l=p.firstChild;for(;l;){if(l.type.name==="FunctionDefinition"){let f=l.getChild("VariableName"),d=f?e.slice(f.from,f.to):void 0;d&&n(l,c?`${c}.${d}`:d),s(l)}else o(l);l=l.nextSibling}}return}if(i.type.name==="FunctionDefinition"){let a=i.getChild("VariableName");a&&n(i,e.slice(a.from,a.to)),s(i);return}s(i)}return o(r.topNode),t}var La=new Set(["pytest","unittest","nose","hypothesis"]);function qn(r,e){let t=[],n=[],s=new Set,o=Hn.default.basename(r).toLowerCase(),i=Qn.parser.parse(e),a=i.cursor();do switch(a.name){case"Comment":{let h=e.slice(a.from,a.to).match(/#\s*@tag\s+([a-zA-Z0-9_-]+)/);h?.[1]&&s.add(h[1]);break}case"ImportStatement":{for(let h of _a(a.node,e,r))t.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let x=a.node.getChild("VariableName");x&&n.push({name:e.slice(x.from,x.to)})}break}case"AssignStatement":{if(a.node.parent?.name==="Script"){let h=a.node.firstChild;h?.name==="VariableName"&&n.push({name:e.slice(h.from,h.to)})}break}}while(a.next());let c=Ba(o,t,s);c==="test"&&s.add("test");let{complexity:p,cognitiveComplexity:l}=fr(i.topNode),f=Vn(i,e),d=c==="test"?[]:$a(i,e);return{imports:t,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:p,cognitiveComplexity:l,...f.length>0?{functions:f}:{}}}function _a(r,e,t){let n=r.firstChild;return n?n.name==="from"?Oa(r,e,t):ja(r,e,t):[]}function Oa(r,e,t){let n=r.firstChild;if(!n)return[];let s=n.nextSibling;for(;s&&s.name!=="import";)s=s.nextSibling;if(!s)return[];let o=e.slice(n.to,s.from).trim(),i=Wa(s.nextSibling,e);if(!i.length)return[];let a=0;for(;a<o.length&&o[a]===".";)a++;let c=o.slice(a);if(a===0)return[Se(t,o,i,!0)];let p=a===1?"./":"../".repeat(a-1);return c?[Se(t,p+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[Se(t,p.slice(0,-1),["*"],!1)]:i.map(l=>Se(t,p+l,[l],!1))}function ja(r,e,t){let n=[],s=r.firstChild?.nextSibling??null;for(;s;){if(s.name==="VariableName"){let o=e.slice(s.from,s.to);for(;s.nextSibling?.name==="."&&s.nextSibling.nextSibling?.name==="VariableName";)s=s.nextSibling.nextSibling,o+=`.${e.slice(s.from,s.to)}`;s.nextSibling?.name==="as"&&(s=s.nextSibling.nextSibling??s.nextSibling),n.push(Se(t,o,["*"],!0))}s=s.nextSibling}return n}function Wa(r,e){let t=[],n=r;for(;n;)n.name==="*"?t.push("*"):n.name==="VariableName"&&(t.push(e.slice(n.from,n.to)),n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling)),n=n.nextSibling;return t}function za(r,e){let t=new Map,n=r.cursor();do{if(n.name!=="ImportStatement")continue;let o=n.node.firstChild;if(o?.type.name!=="from")continue;let i=o.nextSibling;for(;i&&i.type.name!=="import";)i=i.nextSibling;if(!i)continue;let a=e.slice(o.to,i.from).trim(),c=0;for(;c<a.length&&a[c]===".";)c++;let p=a.slice(c),l=c<=1?"./":"../".repeat(c-1),f=i.nextSibling;for(;f;){if(f.type.name==="VariableName"){let d=e.slice(f.from,f.to),h=d;if(f.nextSibling?.type.name==="as"){let x=f.nextSibling.nextSibling;x?.type.name==="VariableName"&&(h=e.slice(x.from,x.to),f=x)}let v=c===0?a:p?l+p.replace(/\./g,"/"):l+d;t.set(h,v)}f=f.nextSibling}}while(n.next());return t}function $a(r,e){let t=za(r,e),n=[];function s(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let l=a.firstChild,f=e.slice(l.from,l.to),d=t.get(f);d&&n.push({from:c,to:f,toSpecifier:d})}let p=a.firstChild;for(;p;)s(p,c),p=p.nextSibling}function o(a){let c=a.firstChild;for(;c;)i(c),c=c.nextSibling}function i(a){if(a.type.name==="ClassDefinition"){let c=a.getChild("VariableName"),p=c?e.slice(c.from,c.to):void 0,l=a.getChild("Body");if(l){let f=l.firstChild;for(;f;){if(f.type.name==="FunctionDefinition"){let d=f.getChild("VariableName"),h=d?e.slice(d.from,d.to):void 0;h&&s(f,p?`${p}.${h}`:h)}else i(f);f=f.nextSibling}}return}if(a.type.name==="FunctionDefinition"){let c=a.getChild("VariableName");c&&s(a,e.slice(c.from,c.to));return}o(a)}return i(r.topNode),n}function Se(r,e,t,n){return{fromPath:r,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:t.length>0?t:void 0}}function Ba(r,e,t){return r.startsWith("test_")||r.endsWith("_test.py")?"test":r==="conftest.py"||r==="setup.py"?"config":t.has("test")||e.some(n=>La.has(n.rawSpecifier))?"test":"logic"}var gr=g(require("path")),m=g(require("typescript"));var y=g(require("typescript"));function Ua(r){let e=1;function t(n){switch(n.kind){case y.default.SyntaxKind.IfStatement:case y.default.SyntaxKind.ConditionalExpression:case y.default.SyntaxKind.ForStatement:case y.default.SyntaxKind.ForInStatement:case y.default.SyntaxKind.ForOfStatement:case y.default.SyntaxKind.WhileStatement:case y.default.SyntaxKind.DoStatement:case y.default.SyntaxKind.CatchClause:case y.default.SyntaxKind.CaseClause:e++;break;case y.default.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===y.default.SyntaxKind.AmpersandAmpersandToken||s===y.default.SyntaxKind.BarBarToken||s===y.default.SyntaxKind.QuestionQuestionToken)&&e++;break}}y.default.forEachChild(n,t)}return t(r),e}function Ka(r){let e=0;function t(n,s,o){if(y.default.isIfStatement(n)){e+=o?1:1+s;let a=o?s:s+1;t(n.expression,a,!1),t(n.thenStatement,a,!1),n.elseStatement&&(y.default.isIfStatement(n.elseStatement)?t(n.elseStatement,s,!0):(e+=1,t(n.elseStatement,s+1,!1)));return}if(y.default.isForStatement(n)||y.default.isForInStatement(n)||y.default.isForOfStatement(n)||y.default.isWhileStatement(n)||y.default.isDoStatement(n)||y.default.isSwitchStatement(n)){e+=1+s,y.default.forEachChild(n,a=>t(a,s+1,!1));return}if(y.default.isCatchClause(n)){e+=1+s,y.default.forEachChild(n,a=>t(a,s,!1));return}if(y.default.isConditionalExpression(n)&&(e+=1),y.default.isBinaryExpression(n)){let a=n.operatorToken.kind;(a===y.default.SyntaxKind.AmpersandAmpersandToken||a===y.default.SyntaxKind.BarBarToken||a===y.default.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(s>0&&(y.default.isFunctionDeclaration(n)||y.default.isFunctionExpression(n)||y.default.isArrowFunction(n))){e+=1+s,y.default.forEachChild(n,a=>t(a,s+1,!1));return}y.default.forEachChild(n,a=>t(a,s,!1))}return t(r,0,!1),e}function ur(r){return{complexity:Ua(r),cognitiveComplexity:Ka(r)}}var w=g(require("typescript")),mr=new Set(["test","describe","it"]);function Xn(r,e){Ja(r,e),Ha(r,e),Qa(r,e),qa(r,e)}function Ja(r,e){if((w.default.isFunctionDeclaration(r)||w.default.isVariableDeclaration(r))&&r.name&&w.default.isIdentifier(r.name)&&Va(r)){let t;if(w.default.isFunctionDeclaration(r))t="function";else{let n=r.initializer;t=n&&(w.default.isArrowFunction(n)||w.default.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:r.name.text,kind:t})}}function Va(r){if(w.default.isFunctionDeclaration(r))return w.default.isSourceFile(r.parent);let e=r.parent?.parent;return!!e&&w.default.isSourceFile(e.parent)}function Ha(r,e){if(!w.default.isStringLiteral(r))return;let t=r.text.match(/@[\w-]+/g);if(t)for(let n of t)e.tags.add({name:n.substring(1),kind:"comment-marker"})}function Qa(r,e){if(!w.default.isSourceFile(r))return;let t=/@tag\s+([a-zA-Z0-9_-]+)/g,n=r.getFullText(),s=t.exec(n);for(;s!==null;)s[1]&&e.tags.add({name:s[1],kind:"comment-marker"}),s=t.exec(n)}function qa(r,e){if(w.default.isCallExpression(r)&&Xa(r.expression))for(let t of r.arguments)w.default.isObjectLiteralExpression(t)&&Ya(t,e)}function Xa(r){return w.default.isIdentifier(r)?mr.has(r.text):!!(w.default.isPropertyAccessExpression(r)&&(mr.has(r.name.text)||w.default.isIdentifier(r.expression)&&mr.has(r.expression.text)))}function Ya(r,e){for(let t of r.properties){if(!w.default.isPropertyAssignment(t)||!w.default.isIdentifier(t.name)||t.name.text!=="tags"&&t.name.text!=="tag")continue;let{initializer:n}=t,s=w.default.isArrayLiteralExpression(n)?n.elements.filter(w.default.isStringLiteral):t.name.text==="tag"&&w.default.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function dr(r,e,t){let n=[],s=new Map,o=new Set,i=m.default.createSourceFile(r,e,m.default.ScriptTarget.Latest,!0,t==="typescript"?m.default.ScriptKind.TSX:m.default.ScriptKind.JSX),a={filePath:r,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=x=>{rc(x,a),m.default.forEachChild(x,c)};c(i);let p=mc(r,a);(p==="test"||p==="barrel")&&o.add({name:p,kind:"comment-marker"}),p!=="test"&&gc(a,i);let l=i.statements[0],f=l?Zn(l):void 0,{complexity:d,cognitiveComplexity:h}=ur(i),v=Za(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:p,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...v.length>0?{functions:v}:{},...f!==void 0?{description:f}:{}}}function Za(r){let e=[],t=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=ur(o),c=r.getLineAndCharacterOfPosition(o.getStart(r)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(m.default.isFunctionDeclaration(s)&&s.name&&s.body?t(s.name.text,s):m.default.isVariableDeclaration(s)&&m.default.isIdentifier(s.name)&&s.initializer&&(m.default.isArrowFunction(s.initializer)||m.default.isFunctionExpression(s.initializer))?t(s.name.text,s.initializer):o&&m.default.isMethodDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body?t(`${o}.${s.name.text}`,s):o&&m.default.isConstructorDeclaration(s)&&s.body?t(`${o}.constructor`,s):o&&m.default.isGetAccessorDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body?t(`${o}.get ${s.name.text}`,s):o&&m.default.isSetAccessorDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body&&t(`${o}.set ${s.name.text}`,s),m.default.isClassDeclaration(s)&&s.name){let i=s.name.text;m.default.forEachChild(s,a=>n(a,i));return}m.default.forEachChild(s,i=>n(i,o))};return n(r,void 0),e}function Yn(r,e,t,n){let s={name:r},o=Zn(t);o!==void 0&&(s.doc=o);let i=ec(e);i!==void 0&&(s.flags=i);let a=tc(e,n);return a!==void 0&&(s.signature=a),s}function Zn(r){let e=m.default.getJSDocCommentsAndTags(r);for(let t of e)if(m.default.isJSDoc(t)&&t.comment)return m.default.getTextOfJSDocComment(t.comment)||void 0}function ec(r){let e=new Set(["deprecated","internal","public","alpha","beta"]),t=m.default.getJSDocTags(r).map(n=>n.tagName.text).filter(n=>e.has(n));return t.length>0?t:void 0}function tc(r,e){let t=m.default.createPrinter({removeComments:!0}),n=s=>t.printNode(m.default.EmitHint.Unspecified,s,e);if(m.default.isFunctionDeclaration(r)||m.default.isMethodDeclaration(r)){let s=r.parameters.map(n).join(", "),o=r.type?n(r.type):"void";return`${r.typeParameters?`<${r.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${s}) => ${o}`}if(m.default.isVariableDeclaration(r)){if(r.type)return n(r.type);if(r.initializer&&(m.default.isArrowFunction(r.initializer)||m.default.isFunctionExpression(r.initializer))){let s=r.initializer,o=s.parameters.map(n).join(", "),i=s.type?n(s.type):"unknown";return`(${o}) => ${i}`}return}if(m.default.isClassDeclaration(r)&&r.name)return`class ${r.name.text}`;if(m.default.isInterfaceDeclaration(r))return`interface ${r.name.text}`;if(m.default.isTypeAliasDeclaration(r))return n(r.type);if(m.default.isEnumDeclaration(r))return`enum ${r.name.text}`}function rc(r,e){nc(r,e),sc(r,e),ic(r,e),ac(r,e),uc(r,e),Xn(r,e)}function nc(r,e){if(!m.default.isSourceFile(r))return;let t=r.statements.filter(n=>!m.default.isEmptyStatement(n));e.totalStatements=t.length,e.exportStatements=t.filter(n=>m.default.isExportDeclaration(n)||m.default.isExportAssignment(n)||hr(n)).length}function sc(r,e){if(m.default.isJsxElement(r)||m.default.isJsxSelfClosingElement(r)||m.default.isJsxFragment(r)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(m.default.isFunctionDeclaration(r)||m.default.isMethodDeclaration(r)||m.default.isArrowFunction(r)||m.default.isClassDeclaration(r)||m.default.isVariableStatement(r)||m.default.isEnumDeclaration(r)){e.hasTypesOnly=!1;return}m.default.isExportDeclaration(r)&&!oc(r)&&(e.hasTypesOnly=!1)}function oc(r){return r.isTypeOnly?!0:!r.exportClause||!m.default.isNamedExports(r.exportClause)?!1:r.exportClause.elements.every(e=>e.isTypeOnly)}function ic(r,e){if(!m.default.isImportDeclaration(r)||!r.moduleSpecifier||!m.default.isStringLiteral(r.moduleSpecifier))return;let t=[];if(r.importClause&&(r.importClause.name&&t.push("default"),r.importClause.namedBindings))if(m.default.isNamedImports(r.importClause.namedBindings))for(let s of r.importClause.namedBindings.elements)t.push(s.name.text);else m.default.isNamespaceImport(r.importClause.namedBindings)&&t.push("*");let n=t.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.moduleSpecifier.text,isStyle:A(r.moduleSpecifier.text),type:n,symbols:t.length>0?t:void 0})}function ac(r,e){m.default.isExportDeclaration(r)?cc(r,e):m.default.isExportAssignment(r)?e.exports.set("default",{name:"default"}):hr(r)&&fc(r,e)}function cc(r,e){if(r.moduleSpecifier&&m.default.isStringLiteral(r.moduleSpecifier))pc(r,r.moduleSpecifier.text,e);else if(r.exportClause&&m.default.isNamedExports(r.exportClause))for(let t of r.exportClause.elements){let n=t.name.text;e.exports.set(n,{name:n})}}function pc(r,e,t){let n=lc(r),s={fromPath:t.filePath,toPath:"",rawSpecifier:e,isStyle:A(e),type:"re-export"};n.length>0&&(s.symbols=n),t.imports.push(s)}function lc(r){return r.exportClause?m.default.isNamedExports(r.exportClause)?r.exportClause.elements.map(e=>e.name.text):[]:["*"]}function fc(r,e){if((m.default.isFunctionDeclaration(r)||m.default.isClassDeclaration(r)||m.default.isInterfaceDeclaration(r)||m.default.isTypeAliasDeclaration(r)||m.default.isEnumDeclaration(r))&&r.name){let n=r.name.text;e.exports.set(n,Yn(n,r,r,e.sourceFile));return}if(m.default.isVariableStatement(r)){for(let n of r.declarationList.declarations)if(m.default.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,Yn(s,n,r,e.sourceFile))}}}function uc(r,e){if(!m.default.isCallExpression(r))return;let t=r.arguments[0];!t||!m.default.isStringLiteral(t)||(r.expression.kind===m.default.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.text,isStyle:A(t.text),type:"dynamic"}):m.default.isIdentifier(r.expression)&&r.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.text,isStyle:A(t.text),type:"require"}))}function mc(r,e){let t=gr.default.basename(r).toLowerCase(),n=gr.default.extname(r).toLowerCase();return oe().some(o=>t.includes(o))?"test":Er(t)?"config":e.imports.some(o=>ct().some(i=>o.rawSpecifier.includes(i)))?"test":n===".tsx"||n===".jsx"||e.hasUI?"ui":e.hasTypesOnly&&e.totalStatements>0?"type-only":e.totalStatements>0&&e.exportStatements/e.totalStatements>lt()?"barrel":"logic"}function hr(r){return m.default.canHaveModifiers(r)&&m.default.getModifiers(r)?.some(e=>e.kind===m.default.SyntaxKind.ExportKeyword)===!0}function gc(r,e){let t=r.rawCallEdges??[];r.rawCallEdges=t;let n=new Map;for(let s of e.statements){if(!m.default.isImportDeclaration(s)||!m.default.isStringLiteral(s.moduleSpecifier))continue;let o=s.moduleSpecifier.text,i=s.importClause;if(i&&(i.name&&n.set(i.name.text,o),i.namedBindings&&m.default.isNamedImports(i.namedBindings)))for(let a of i.namedBindings.elements)n.set(a.name.text,o)}if(n.size!==0)for(let s of e.statements){let o=hc(s);if(o){let i=yc(s);i&&et(i,o,n,t);continue}m.default.isClassDeclaration(s)&&s.name&&dc(s,s.name.text,n,t)}}function dc(r,e,t,n){for(let s of r.members)m.default.isMethodDeclaration(s)&&s.body&&m.default.isIdentifier(s.name)?et(s.body,`${e}.${s.name.text}`,t,n):m.default.isConstructorDeclaration(s)&&s.body&&et(s.body,`${e}.constructor`,t,n)}function hc(r){if(hr(r)){if(m.default.isFunctionDeclaration(r)&&r.name)return r.name.text;if(m.default.isVariableStatement(r)){for(let e of r.declarationList.declarations)if(m.default.isIdentifier(e.name)&&e.initializer&&(m.default.isArrowFunction(e.initializer)||m.default.isFunctionExpression(e.initializer)))return e.name.text}}}function yc(r){if(m.default.isFunctionDeclaration(r))return r.body;if(m.default.isVariableStatement(r)){for(let e of r.declarationList.declarations)if(e.initializer&&(m.default.isArrowFunction(e.initializer)||m.default.isFunctionExpression(e.initializer)))return e.initializer}}function et(r,e,t,n){if(m.default.isCallExpression(r)&&m.default.isIdentifier(r.expression)){let s=r.expression.text,o=t.get(s);o&&!n.some(i=>i.from===e&&i.to===s&&i.toSpecifier===o)&&n.push({from:e,to:s,toSpecifier:o})}m.default.forEachChild(r,s=>et(s,e,t,n))}function tt(r,e){if(e.length===0)return"ui";let t=!1;return r.walk(n=>{if(n.type==="rule")return t=!0,!1}),t?"ui":"barrel"}var yr=g(require("postcss")),xc=g(require("postcss-less")),Sc=xc,ts=new Set(["reference","inline"]);function es(r){return r.startsWith("~")||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("//")||r.startsWith("data:")}function bc(r){let e=r.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function vc(r,e){let t=r.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(t){let o=t[1]?.trim()??"",i=t[2]??"";if(!i)return null;let a=ts.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...es(i)?{isExternal:!0}:{}}}let n=r.match(/^url\(['"]?([^'")]+)['"]?\)/),s=n?n[1]?.trim()??"":r.match(/^['"]([^'"]+)['"]/)?.[1]??"";return s?{fromPath:e,toPath:"",rawSpecifier:s,isStyle:!0,type:"static",...es(s)?{isExternal:!0}:{}}:null}function kc(r,e){let t=[],n=/url\(['"]?([^'")]+)['"]?\)/g,s=n.exec(r);for(;s!==null;){let o=s[1]?.trim()??"";bc(o)&&t.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),s=n.exec(r)}return t}function rs(r,e){let t=[];return r.walk(n=>{if(n.type==="atrule"&&n.name==="import"){let s=vc(n.params,e);s&&t.push(s)}n.type==="decl"&&t.push(...kc(n.value,e))}),t}function wc(r){return r.replace(/(?<!:)\/\/.*/g,"")}function Cc(r,e){let t=[],n=/@import\s+(?:\(([^)]+)\)\s+)?['"]([^'"]+)['"]/g,s=n.exec(r);for(;s!==null;){let o=s[1]?.trim()??"",i=s[2]??"";if(i){let a=ts.has(o)?"side-effect":"static";t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}s=n.exec(r)}return t}function ns(r,e){let t=yr.default.parse(wc(r));return{imports:rs(t,e),root:t}}function Fc(r){let e=[],t=[];for(let n of r.nodes??[]){if(n.type!=="atrule")continue;let{value:s}=n;if(s===void 0)continue;let o=n.name;o&&(e.push({name:o}),t.push({name:o,kind:"variable"}))}return{exports:e,tags:t}}function ss(r,e){try{let t=Sc.parse(r),{exports:n,tags:s}=Fc(t);return{imports:rs(t,e),root:t,exports:n,tags:s}}catch{return{imports:Cc(r,e),root:yr.default.parse(""),exports:[],tags:[]}}}var is=require("postcss-scss");function os(r){return r.startsWith("_")||r.startsWith("-")}function Ec(r){return!!(r.startsWith("sass:")||r.startsWith("~")||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("//")||!r.startsWith(".")&&!r.startsWith("/")&&!r.startsWith("_"))}function Tc(r){let e=r.match(/^['"]([^'"]+)['"]/);if(!e?.[1])return{specifier:""};let t=e[1],s=r.match(/\bas\s+(\S+)/)?.[1];return s!==void 0?{specifier:t,alias:s}:{specifier:t}}function Pc(r){let e=[],t=[];for(let n of r.nodes??[]){if(n.type==="decl"&&n.prop.startsWith("$")){let s=n.prop.slice(1);if(!s||os(s))continue;e.push({name:s}),t.push({name:s,kind:"variable"});continue}if(n.type==="atrule"&&(n.name==="mixin"||n.name==="function")){let o=n.params.match(/^([\w-]+)/)?.[1];if(!o||os(o))continue;let i=n.params.trim();e.push(i.includes("(")?{name:o,signature:i}:{name:o}),t.push({name:o,kind:"function"})}}return{exports:e,tags:t}}function as(r,e){let t=(0,is.parse)(r),n=[];t.walk(i=>{if(i.type!=="atrule")return;let{name:a,params:c}=i;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:p,alias:l}=Tc(c);if(!p)return;let f={fromPath:e,toPath:"",rawSpecifier:p,isStyle:!0,type:a==="forward"?"re-export":"static",...Ec(p)?{isExternal:!0}:{}};l&&(f.symbols=[l]),n.push(f)});let{exports:s,tags:o}=Pc(t);return{imports:n,root:t,exports:s,tags:o}}function cs(r,e){let t=[],n=/@require\s+['"]([^'"]+)['"]/g,s=n.exec(r);for(;s!==null;){let i=s[1];i&&t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"require"}),s=n.exec(r)}let o=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(s=o.exec(r);s!==null;){let i=s[1];i&&t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),s=o.exec(r)}return t}function ps(r,e){if(e.length===0)return"ui";try{let t=require("stylus");return new t.Parser(r).parse().nodes.some(o=>o.constructor.name!=="Import")?"ui":"barrel"}catch{return r.replace(/^\s*@?(?:require|import)\b.*/gm,"").trim().length>0?"ui":"barrel"}}function be(r,e){let t=L(r);if(t==="stylus"){let o=cs(e,r);return{imports:o,exports:[],tags:[],category:ps(e,o)}}if(t==="scss"){let{imports:o,root:i,exports:a,tags:c}=as(e,r);return{imports:o,exports:a,tags:c,category:tt(i,o)}}if(t==="less"){let{imports:o,root:i,exports:a,tags:c}=ss(e,r);return{imports:o,exports:a,tags:c,category:tt(i,o)}}let{imports:n,root:s}=ns(e,r);return{imports:n,exports:[],tags:[],category:tt(s,n)}}for(let[r,e]of[["javascript",(t,n)=>dr(t,n,"javascript")],["typescript",(t,n)=>dr(t,n,"typescript")],["css",be],["scss",be],["less",be],["stylus",be],["coffeescript",Dn],["livescript",zn],["lua",Bn],["python",qn],["go",jn],["gherkin",cr],["markdown",Jn]])Z(r,e);async function ls(r,e){let t=L(r),n=ln(t);return n?n(r,e):{imports:[],exports:[],tags:[],category:"other"}}var xr=g(require("path"));function us(r,e){for(let t of r.values()){let n=e.get(t.path);n!==void 0&&(t.coveragePct=n)}}function ms(r,e){for(let t of r)if(t.isExternal){let n=t.rawSpecifier.startsWith("@")?t.rawSpecifier.split("/").slice(0,2).join("/"):t.rawSpecifier.split("/")[0];n&&!e.some(s=>s.name===n)&&e.push({name:n,kind:"library"})}}function gs(r){for(let e of r.values())if(e.category==="test")for(let t of e.imports){if(t.isExternal||!t.toPath)continue;let n=r.get(t.toPath);n&&(n.category!=="logic"&&n.category!=="barrel"||(n.testedBy??=[],n.testedBy.includes(e.path)||n.testedBy.push(e.path)))}}function ds(r){for(let e of r.values())if(e.type==="markdown")for(let t of e.imports){if(t.isExternal||!t.toPath)continue;let n=r.get(t.toPath);!n||n===e||(n.documentedBy??=[],n.documentedBy.includes(e.path)||n.documentedBy.push(e.path),n.category==="logic"&&(n.lastCommitAt??0)>(e.lastCommitAt??0)&&(e.staleFor??=[],e.staleFor.includes(n.path)||e.staleFor.push(n.path)))}}function fs(r){return Math.round(r*1e4)/1e4}function hs(r){for(let e of r.values()){let t=[];for(let n of e.imports){if(n.isExternal||!n.toPath)continue;let s=r.get(n.toPath);if(!s||s.exports.length===0)continue;let o;if(n.symbols===void 0){if(n.type==="side-effect")continue;o=1}else n.symbols.includes("*")?o=1:o=n.symbols.length/s.exports.length;n.exportUsageRatio=fs(Math.min(1,o)),t.push(n.exportUsageRatio)}t.length>0&&(e.avgExportUsage=fs(t.reduce((n,s)=>n+s,0)/t.length),e.maxExportUsage=Math.max(...t))}}function Sr(r,e,t){e&&(r.some(n=>n.name===e&&n.kind===t)||r.push({name:e,kind:t}))}function Ac(r,e){let t=e.toPath,n=xr.default.basename(t,xr.default.extname(t)).replace(/\.(test|spec)$/,"");Sr(r.tags,n,"import")}function Nc(r,e){if(!(!e.symbols||e.symbols.includes("*")))for(let t of e.symbols)Sr(r.tags,t,"import")}function Ic(r,e,t){let n=t.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&Sr(r.tags,s.name,"comment-marker")}function ys(r){for(let e of r.values())if(e.category==="test")for(let t of e.imports)!t.toPath||t.isExternal||(Ac(e,t),Nc(e,t),Ic(e,t,r))}var Ee=g(require("fs")),D=g(require("path"));var br=g(require("fs")),J=g(require("path")),ve=class{extensions=[".go"];goModCache=new Map;resolve(e,t,n,s){let{mod:o,replaces:i}=this.readGoMod(n);if(!o)return null;let a=this.applyReplace(t,i,n);if(a!==void 0)return Ss(a);if(t!==o&&!t.startsWith(`${o}/`))return null;let c=t.slice(o.length).replace(/^\//,"");return c?Ss(J.default.join(n,c)):null}readGoMod(e){let t=this.goModCache.get(e);if(t!==void 0)return t;let n={mod:null,replaces:new Map};try{let s=br.default.readFileSync(J.default.join(e,"go.mod"),"utf-8"),o=Mc(s,e);return this.goModCache.set(e,o),o}catch{return this.goModCache.set(e,n),n}}applyReplace(e,t,n){for(let[s,o]of t){if(e===s)return o;if(e.startsWith(`${s}/`)){let i=e.slice(s.length+1);return J.default.join(o,i)}}}};function Mc(r,e){let t=r.split(`
27
+ `),n=null,s=new Map,o=!1;for(let i of t){let a=i.trim();if(a.startsWith("module ")){n=a.slice(7).trim();continue}if(/^replace\s*\(/.test(a)){o=!0;continue}if(o&&a===")"){o=!1;continue}if(o&&a.includes("=>")){xs(a,e,s);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&xs(a.replace(/^replace\s+/,""),e,s)}return{mod:n,replaces:s}}function xs(r,e,t){let[n,s]=r.split("=>").map(a=>a.trim());if(!n||!s)return;let o=n.split(/\s+/)[0];if(!s.startsWith(".")&&!s.startsWith("/"))return;let i=J.default.isAbsolute(s)?s:J.default.resolve(e,s);t.set(o,i)}function Ss(r){let e;try{e=br.default.readdirSync(r,{withFileTypes:!0})}catch{return null}let t=e.filter(n=>n.isFile()&&n.name.endsWith(".go")&&!n.name.endsWith("_test.go")).map(n=>({path:J.default.join(r,n.name),isExternal:!1})).sort((n,s)=>n.path.localeCompare(s.path));return t.length>0?t:null}var bs=g(require("fs")),rt=g(require("path")),ke=class{extensions=[".lua"];resolve(e,t,n,s){let o=t.replace(/\./g,rt.default.sep),i=[n,rt.default.join(n,"lib")];for(let a of i){if(!bs.default.existsSync(a))continue;let c=s(rt.default.join(a,"_dummy.lua"),o);if(c)return[c]}return null}};var vs=g(require("path")),we=class{extensions=[".md",".mdx"];resolve(e,t,n,s){let o=s(vs.default.join(n,"_dummy"),`./${t}`);return o?[o]:null}};var ws=g(require("fs")),nt=g(require("path")),Ce=class{extensions=[".py"];resolve(e,t,n,s){let o=t.replace(/\./g,nt.default.sep),i=nt.default.join(n,`${o}.py`);if(ks(i))return[{path:i,isExternal:!1}];let a=nt.default.join(n,o,"__init__.py");return ks(a)?[{path:a,isExternal:!1}]:null}};function ks(r){try{return ws.default.statSync(r,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}var vr=g(require("path")),Dc=["~","http://","https://","//","data:","sass:"],Fe=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,t,n,s){if(Dc.some(l=>t.startsWith(l)))return null;let o=s(e,t);if(o)return[o];let i=vr.default.dirname(t),a=vr.default.basename(t),c=i==="."?`_${a}`:`${i}/_${a}`,p=s(e,c);return p?[p]:null}};var V=class{constructor(e,t={}){this.rootDir=e;this.workspaceMap=t.workspaceMap??new Map,this.tsconfigSearchPaths=t.tsconfigSearchPaths??[e],this.pathAliases=t.pathAliases,this.langResolvers=t.langResolvers??[new Ce,new ke,new ve,new Fe,new we]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;langResolvers;resolveAll(e,t){let n=this.resolvePathAlias(t);if(n)return[n];if(t.startsWith(".")||t.startsWith("/")){let i=this.resolveLocalPath(e,t);return i?[i]:[]}let s=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,t,this.rootDir,s);if(a)return a}let o=this.resolveWorkspaceImport(t);return o?[o]:[{path:t,isExternal:!0}]}resolve(e,t){let n=this.resolvePathAlias(t);if(n)return n;if(t.startsWith(".")||t.startsWith("/"))return this.resolveLocalPath(e,t);let s=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,t,this.rootDir,s);if(a)return a[0]??null}let o=this.resolveWorkspaceImport(t);return o||{path:t,isExternal:!0}}resolveLocalPath(e,t){let n=D.default.dirname(e),s=t.startsWith("/")?t:D.default.resolve(n,t),o=!s.startsWith(this.rootDir),i=["",".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".feature",".md",".mdx"],a=s.match(/\.(js|mjs|cjs)$/);if(a){let c=s.slice(0,-a[0].length);for(let p of[".ts",".tsx"]){let l=this.tryExtensions(c,p,o);if(l)return l}}for(let c of i){let p=this.tryExtensions(s,c,o);if(p)return p}return o?{path:s,isExternal:!0}:null}tryExtensions(e,t,n){let s=e+t;if(this.isFile(s))return{path:s,isExternal:n};let o=D.default.join(e,`index${t}`);if(this.isFile(o))return{path:o,isExternal:n};if(t===".py"){let i=D.default.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:n}}return null}isFile(e){try{return Ee.default.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let t in this.pathAliases){let n=this.matchAliasPattern(t,e),s=this.pathAliases[t];if(n&&s){let o=this.tryAliasSubstitutions(s,n[1]||"");if(o)return o}}for(let t of this.tsconfigSearchPaths){let n=D.default.join(t,"tsconfig.json");if(Ee.default.existsSync(n))try{let o=JSON.parse(Ee.default.readFileSync(n,"utf-8")).compilerOptions?.paths;if(!o)continue;for(let i in o){let a=this.matchAliasPattern(i,e);if(a){let c=this.tryAliasSubstitutions(o[i],a[1]||"",t);if(c)return c}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,t){let n=this.aliasRegexCache.get(e);if(!n){let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace("\\*","(.*)");n=new RegExp(`^${s}$`),this.aliasRegexCache.set(e,n)}return t.match(n)}tryAliasSubstitutions(e,t,n=this.rootDir){let s=["",".ts",".tsx",".js",".jsx",".coffee",".ls",".lua",".feature"];for(let o of e){let i=o.replace("*",t),a=D.default.resolve(n,i);for(let c of s){let p=this.tryExtensions(a,c,!1);if(p)return p}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[t,n]of this.workspaceMap){if(e!==t&&!e.startsWith(`${t}/`))continue;let s=e.slice(t.length),o={path:"",isExternal:!1,isWorkspace:!0,workspacePackage:t};if(!s){for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"]){let c=D.default.join(n,a);try{if(Ee.default.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...o,path:c}}catch{}}return{...o,path:n}}let i=this.resolveLocalPath(D.default.join(n,"_dummy"),s.slice(1));return i?{...o,path:i.path}:null}return null}};var Rc=["tests","test","__tests__","specs","spec"],Cs=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),Gc=20;function Lc(r,e){if(r.length===0)return e;let t=r.map(i=>E.default.dirname(i).split(E.default.sep)),n=t[0]??[];for(let i of t.slice(1)){let a=0;for(;a<n.length&&a<i.length&&n[a]===i[a];)a++;n=n.slice(0,a)}let s=n.join(E.default.sep)||E.default.sep,o=E.default.relative(e,s);return o.startsWith("..")||E.default.isAbsolute(o)?e:s}var Te=class{constructor(e,t=null,n,s,o=!1,i=new Map,a=!0){this.rootDir=e;this.enableGitStats=o;this.coverageMap=i;this.parallelParsing=a;this.previousGraph=t,this.resolver=n||new V(e),this.lockFile=Or(e),s&&(this.progressCallback=s)}rootDir;enableGitStats;coverageMap;parallelParsing;graph={nodes:new Map};visited=new Set;queue=[];previousGraph=null;resolver;lockFile=null;progressCallback;pool=null;gitStatsMap=null;async build(e){let t=e.map(n=>E.default.isAbsolute(n)?n:E.default.resolve(this.rootDir,n));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=An(this.rootDir));try{for(let n of t)this.enqueue(n);return await this.drain(),await this.processTestFiles(Lc(t,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
24
28
  Done. Total processed: ${this.visited.size} nodes.
25
- `),Hs(this.graph.nodes),Us(this.graph.nodes),Js(this.graph.nodes),Ks(this.graph.nodes),this.coverageMap.size>0&&$s(this.graph.nodes,this.coverageMap),new P(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},r=e.minFiles??Ya;if(!(r>0&&!this.hasAtLeastFiles(this.rootDir,r)))try{let s=C.default.join(__dirname,"parse-worker.js");this.pool=new tn.default({filename:s,...e.maxThreads!==void 0?{maxThreads:e.maxThreads}:{}})}catch(s){process.stderr.write(`
26
- Warning: failed to start parse worker pool, falling back to synchronous parsing: ${s}
27
- `),this.pool=null}}hasAtLeastFiles(e,r){let s=0,n=[e];for(;n.length>0;){let o=n.pop(),i;try{i=Y.default.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())en.has(a.name)||n.push(C.default.join(o,a.name));else if(a.isFile()&&(s++,s>=r))return!0}return s>=r}async processTestFiles(e){let r=ee(),s=o=>r.some(i=>o.name.includes(i));this.walkProject(e,s);let n=e;for(;n!==this.rootDir;){let o=C.default.dirname(n);if(o===n)break;for(let i of Xa){let a=C.default.join(o,i);try{Y.default.statSync(a).isDirectory()&&this.walkProject(a,s)}catch{}}n=o}await this.drain()}async processDocFiles(){this.walkProject(this.rootDir,e=>e.name.endsWith(".md")||e.name.endsWith(".mdx")),await this.drain()}walkProject(e,r){let s;try{s=Y.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of s){let o=C.default.join(e,n.name);n.isDirectory()?en.has(n.name)||this.walkProject(o,r):n.isFile()&&r(n)&&this.enqueue(o)}}enqueue(e){this.visited.has(e)||(this.visited.add(e),this.showProgress(),this.queue.push(e))}async drain(){for(;this.queue.length>0;){let e=this.queue;this.queue=[],await Promise.all(e.map(r=>this.finishFile(r)))}}async finishFile(e){let r=Y.default.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let s=C.default.relative(this.rootDir,e),n=await this.getNode(e,s,r);n.imports=await this.resolveImports(e,n.imports),Bs(n.imports,n.tags),this.graph.nodes.set(n.path,n)}async getNode(e,r,s){let n=this.previousGraph?.nodes.get(r);if(n&&n.mtime===s.mtimeMs&&n.size===s.size)return{...n};let o=await this.tryParse(e,r);if(!o)return this.makeStubNode(e,r,s);let i=this.resolveCallEdges(e,o.rawCallEdges),a=this.buildNode(e,r,s,o,i);return this.attachGitStats(a,r),a}async tryParse(e,r){let s=Y.default.readFileSync(e,"utf-8");try{return await this.parseContent(e,s)}catch(n){return process.stderr.write(`
28
- Warning: failed to parse ${r}: ${n}
29
- `),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):Ws(e,r)}makeStubNode(e,r,s){return{path:r,type:I(e),category:"other",imports:[],exports:[],tags:[],mtime:s.mtimeMs,size:s.size}}resolveCallEdges(e,r){let s=[];for(let n of r??[])try{let o=this.resolver.resolve(e,n.toSpecifier);o&&!o.isExternal&&s.push({from:n.from,to:n.to,toFile:C.default.relative(this.rootDir,o.path)})}catch{}return s}buildNode(e,r,s,n,o){let{imports:i,exports:a,tags:p,category:c,description:m,complexity:g,cognitiveComplexity:d,functions:S}=n;return{path:r,type:I(e),category:c,imports:i,exports:a,tags:p,mtime:s.mtimeMs,size:s.size,...m!==void 0?{description:m}:{},...o.length>0?{callEdges:o}:{},...g!==void 0?{complexity:g}:{},...d!==void 0?{cognitiveComplexity:d}:{},...S!==void 0?{functions:S}:{}}}attachGitStats(e,r){let s=this.gitStatsMap?.get(r);s&&(e.commitCount90d=s.commitCount90d,s.lastAuthor!==void 0&&(e.lastAuthor=s.lastAuthor),s.lastCommitAt!==void 0&&(e.lastCommitAt=s.lastCommitAt))}async resolveImports(e,r){let s=[];for(let n of r){let o=this.resolver.resolveAll(e,n.rawSpecifier);if(o.length!==0)for(let i of o){let a={...n,toPath:i.isExternal?i.path:C.default.relative(this.rootDir,i.path),isExternal:i.isExternal};i.isWorkspace&&(a.isWorkspace=!0,a.workspacePackage=i.workspacePackage),i.isExternal?this.attachLockfileVersion(a):this.enqueue(i.path),s.push(a)}}return s}attachLockfileVersion(e){if(!this.lockFile)return;let r=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],s=r?this.lockFile.dependencies[r]:void 0;s&&(e.version=s.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function rn(t,e){return{identifier:e?.identifier??new Be,featureMap:e?.featureDetection===!1?new Map:G(t.nodes,e?.featureDetection??void 0)}}function sn(t,e,r,s,n){for(let o of e){let i=t.nodes.get(o);if(!i)continue;let a=new D(o,["*",...i.exports.map(p=>p.name)]);t.traverse(o,(p,c,m)=>{if(!m)return!0;if(!a.updateAffectedSymbols(p,m))return!1;if(c>0){let g=r.get(p.path);if(g)return s(g),!1}return n(p),!0},{direction:"incoming"})}}function cr(t,e,r){let{identifier:s,featureMap:n}=rn(t,r),o=new Set;for(let i of e){let a=n.get(i);a&&o.add(a.tag)}return sn(t,e,n,i=>o.add(i.tag),i=>{if(s.isTestNode(i))for(let a of i.tags)o.add(a.name)}),Array.from(o)}function lr(t,e,r){let{identifier:s,featureMap:n}=rn(t,r),o=new Set;return sn(t,e,n,()=>{},i=>{s.isTestNode(i)&&o.add(i.path)}),Array.from(o)}var nn=f(require("fs")),Z=f(require("path"));async function on(t,e,r=null,s={}){let n=s.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=Z.default.resolve(t);return await new ve(o,r,s.pathAliases?new j(o,{pathAliases:s.pathAliases}):void 0,n,s.gitStats??!1,s.coverageMap??new Map,s.parallelParsing??!0).build(e)}async function an(t,e={}){let r=Z.default.resolve(t),s=pe(r),n=e.packages?s.packages.filter(a=>e.packages?.includes(a.name)||e.packages?.includes(a.relativeRoot)):s.packages,o=new Map(s.packages.map(a=>[a.name,a.root])),i=new ce(r,s.type);for(let a of n){let p=e.silent?void 0:g=>{process.stderr.write(`[${a.name}] Processed ${g} files...\r`)},m=await new ve(r,null,new j(r,{workspaceMap:o,tsconfigSearchPaths:[a.root,r],pathAliases:e.pathAliases}),p,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,m)}return i}function pn(t,e={}){let r=[],s=new Set([...e.ignoreDirs??it,...e.additionalIgnoreDirs??[]]),n=new Set([...e.extensions??at,...e.additionalExtensions??[]]);function o(i){try{let a=nn.default.readdirSync(i,{withFileTypes:!0});for(let p of a){let c=Z.default.join(i,p.name);p.isDirectory()?s.has(p.name)||o(c):p.isFile()&&n.has(Z.default.extname(p.name).toLowerCase())&&r.push(Z.default.relative(t,c))}}catch{}}return o(t),r}var cn=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var qe=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,r){this.configs.set(e,r)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,r,s=new Map){let n=this.configs.get(e),o=await on(e,r,this.graphs.get(e)??null,{...z(n),coverageMap:s});return this.graphs.set(e,o),o}require(e){let r=this.graphs.get(e);if(!r)throw new Error('No graph cached for this root. Call "analyze" first.');return r}async getOrBuildWorkspace(e,r={}){let s=this.workspaceGraphs.get(e);if(s)return s;let n=await an(e,r);return this.workspaceGraphs.set(e,n),n}requireWorkspace(e){let r=this.workspaceGraphs.get(e);if(!r)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return r}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let r=this.changeImpactCaches.get(e);if(r)return r;let s=this.require(e),n=dt(s);return this.changeImpactCaches.set(e,n),n}storeLastAnalyze(e,r){this.lastAnalyze.set(e,r)}startWatching(e){if(!this.watchers.has(e))try{let r=ln.default.watch(e,{recursive:!0},(s,n)=>{!n||cn.test(n)||this.dirtyRoots.add(e)});r.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,r)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let r=this.lastAnalyze.get(e);return r?.kind==="single"?this.getOrBuild(e,r.entryPoints,r.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let r=this.configs.get(e);return this.getOrBuildWorkspace(e,z(r))}invalidate(e){let r=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),r}};var W=f(require("path"));var un=f(require("fs")),fn=f(require("os")),Xe=f(require("path"));function y(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function mn(t){if(!Xe.default.isAbsolute(t))throw new Error("root must be an absolute path");let e=Xe.default.resolve(t),r=fn.default.homedir();if(e!==r&&!e.startsWith(r+Xe.default.sep))throw new Error("root must be within the user home directory");let s;try{s=un.default.statSync(e)}catch{throw new Error("root does not exist")}if(!s.isDirectory())throw new Error("root is not a directory")}async function gn(t,e){let{root:r,entryPoints:s}=e;if(!t.isConfigured(r)){let d=te(r,{allowJs:!1});ot(d),t.storeConfig(r,d)}if(s.length===0){let d=pe(r);if(d.type!=="none"){let S=t.getConfig(r),F=await t.getOrBuildWorkspace(r,z(S));t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let R=Array.from(F.packages.values()).map(({graph:et,pkg:ur})=>({package:ur.name,relativeRoot:ur.relativeRoot,nodeCount:et.nodes.size}));return y({monorepoType:d.type,packageCount:F.packages.size,packages:R})}}let n=s.map(d=>W.default.resolve(r,d)),o=t.getConfig(r),i=o?.coverageReportPath?ct(r,o.coverageReportPath):new Map,a=await t.getOrBuild(r,n,i);t.storeLastAnalyze(r,{kind:"single",entryPoints:n,coverageMap:i}),t.startWatching(r);let p=a.serialize(),c=p.nodes.reduce((d,S)=>(d[S.category]=(d[S.category]??0)+1,d),{}),m=a.findCycles(),g=yt(a);return y({nodeCount:p.nodes.length,categories:c,cycles:m,languageCoverage:g})}async function dn(t,e){let{root:r,file:s,depth:n=1,withMeta:o=!1}=e,i=await t.ensureFresh(r),a=xt(i,s,n),p=o?a.map(c=>({...c,...oe(i,c.path)})):a;return y({file:s,dependencies:p})}async function hn(t,e){let{root:r,file:s,withMeta:n=!1}=e,o=await t.ensureFresh(r),i=ie(o,s),a=n?i.map(p=>({...p,...oe(o,p.path)})):i;return y({file:s,dependents:a})}async function yn(t,e){let{root:r,file:s,testsOnly:n=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,p=await t.ensureFresh(r),c=d=>a?d.map(S=>({path:S,...oe(p,S)})):d;if(o){let d=t.getOrBuildChangeImpact(r),S=ht(d,s),F=n?S.filter(et=>p.nodes.get(et)?.category==="test"):S,R=c(F);return y({file:s,affected:R,count:R.length})}let m=St(p,s,{testsOnly:n,changedSymbols:i}),g=c(m);return y({file:s,affected:g,count:g.length})}async function xn(t,e){let{root:r,file:s,depth:n=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=bt(i,s,{depth:n,withEdgeDetail:o});return y({file:s,callers:a,count:a.length})}async function Sn(t,e){let{root:r,entryPoints:s}=e,n=s.map(p=>W.default.resolve(r,p)),o=await t.getOrBuild(r,n),i=pn(r),a=o.findUnusedFiles(i);return y({unusedFiles:a,count:a.length})}async function bn(t,e){let{root:r,coverageThreshold:s}=e,n=await t.ensureFresh(r),o=t.getConfig(r),i=s??o?.coverageThreshold??80;if(!wt(n))return y({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let a=[...n.nodes.values()].filter(p=>p.category!=="test"&&p.category!=="config").filter(p=>p.coveragePct!==void 0&&p.coveragePct<i).map(p=>({file:p.path,coveragePct:p.coveragePct}));return y({threshold:i,uncovered:a,count:a.length})}async function vn(t,e){let{root:r}=e,n=[...(await t.ensureFresh(r)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return y({staleDocs:n,count:n.length})}async function kn(t,e){let{root:r,metric:s="cognitiveComplexity",threshold:n=10,limit:o=20}=e,i=await t.ensureFresh(r),a=vt(i,{metric:s,threshold:n,limit:o});return y({metric:s,threshold:n,functions:a,count:a.length})}async function Cn(t,e){let{root:r,changedFiles:s,featureThreshold:n,format:o="tags"}=e,i=await t.ensureFresh(r),a=s??new Ke().getChangedFiles().map(m=>W.default.relative(r,W.default.resolve(r,m))),p=n!==void 0?{featureDetection:{minOutDegree:n}}:void 0;if(o==="paths"){let m=lr(i,a,p);return y({changedFiles:a,affectedTests:m,count:m.length})}let c=cr(i,a,p);return y({changedFiles:a,proposedTags:c})}async function wn(t,e){let{root:r,entryPoints:s,featureThreshold:n}=e,o=s?await t.getOrBuild(r,s.map(p=>W.default.resolve(r,p))):await t.ensureFresh(r),i=G(o.nodes,n!==void 0?{minOutDegree:n}:void 0),a=Array.from(i.values()).sort((p,c)=>c.outDegree-p.outDegree);return y({features:a,count:a.length})}async function En(t,e){let{root:r,entryPoints:s,filter:n,mermaid:o=!1,slim:i=!0}=e,a=s?await t.getOrBuild(r,s.map(c=>W.default.resolve(r,c))):await t.ensureFresh(r),p=Re(a.serialize(),Ge(n));return o?y(Te.serialize(P.deserialize(p))):i?y(kt(p)):y(p)}async function Fn(t,e){let{root:r}=e,s=await t.ensureFreshWorkspace(r);return y(Ct(s))}async function Tn(t,e){let{root:r,file:s}=e,o=(await t.ensureFreshWorkspace(r)).getAffectedAcrossPackages(s);return y({file:s,affected:o,count:o.length})}function Pn(t,e){let{root:r}=e,s=t.invalidate(r);return y({root:r,cleared:s,message:s?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function An(t,e){let{root:r,type:s}=e,n=await t.ensureFresh(r),o=Tt(n);if(s)return y(Pt(o,s));let i=Array.from(o.types.values());return y({count:i.length,types:i})}async function Mn(t,e){let{root:r,paths:s,minOutDegree:n}=e,o=await t.ensureFresh(r),i=Et(o,n!==void 0?{minOutDegree:n}:void 0);if(s?.length){let p=s.map(c=>i.get(c)).filter(Boolean);return y({count:p.length,modules:p})}let a=Array.from(i.values());return y({count:a.length,modules:a})}async function In(t,e){let{root:r,minOutDegree:s}=e,n=await t.ensureFresh(r),o=se(n,s!==void 0?{minOutDegree:s}:void 0),i=Object.fromEntries(o.features);return y({features:i,unassigned:o.unassigned})}async function Nn(t,e){let{root:r,function:s}=e,n=await t.ensureFresh(r);return y(gt(n,s))}async function Rn(t,e){let{root:r,name:s}=e,n=await t.ensureFresh(r),o=Ft(n,s);return y({name:s,matches:o,count:o.length})}async function Gn(t,e){let{root:r,entryPoints:s}=e,n=await t.ensureFresh(r),o=s?.length?s:ft(n,r);if(o.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return y(mt(n,o))}async function Dn(t,e){let r=await t.ensureFresh(e.root),s=await Ht(r,e.root,{dryRun:e.dryRun??!1});return y(s)}var _n=[{name:"analyze",description:"Build the dependency graph for a project from entry points. Returns a summary of node count, categories, and cycles. Must be called before get_dependencies, get_dependents, get_affected, or propose_tags. Pass an empty entryPoints array to auto-detect a monorepo (pnpm/npm/yarn/Nx/Turborepo) and build per-package graphs \u2014 use get_workspace_packages and get_workspace_affected for monorepo queries.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root (or monorepo root)"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root (e.g. ['src/index.ts']). Pass [] to trigger monorepo auto-detection."}},required:["root","entryPoints"]}},{name:"get_dependencies",description:"Get files that a given file imports (outgoing traversal). depth=1 returns immediate imports; omit for the full transitive tree. Each result includes the specific symbols imported from that file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_dependents",description:"Get files that directly import a given file (one-hop incoming edges). Each result includes the specific symbols that dependent file imports from this file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_affected",description:"Get all files transitively affected if a given file changes \u2014 full incoming traversal upward. Use before a refactor to understand blast radius. Set testsOnly=true to get only test files. Set cached=true to use a pre-computed O(1) lookup cache instead of graph traversal \u2014 faster on repeated calls for the same root. Pass changedSymbols to restrict blast-radius to files that actually import those symbols \u2014 omit to treat the whole file as changed. Set withMeta=true to get { path, category, exports } objects instead of bare path strings.",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},testsOnly:{type:"boolean",description:"Return only test/spec files (default: false)"},cached:{type:"boolean",description:"Use a pre-computed impact cache for O(1) lookup instead of graph traversal. Cache is built lazily on first use and reused for the session (default: false)."},changedSymbols:{type:"array",items:{type:"string"},description:"Restrict blast-radius to files that import at least one of these symbols. Omit to treat the whole file as changed (conservative, same as before)."},withMeta:{type:"boolean",description:"Return each affected file as { path, category, exports } instead of a bare path string (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_callers",description:"Get files whose exported functions call into a given file (call-graph dependents). More precise than get_affected: only files with actual runtime call edges, not mere imports. Requires prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to project root"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withEdgeDetail:{type:"boolean",description:"Include from/to function names per edge (default: false)"}},required:["root","file"]}},{name:"find_unused",description:"Find files in the project that are not reachable from any entry point. Useful before cleanup passes.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"}}},required:["root","entryPoints"]}},{name:"find_uncovered",description:"Find non-test files whose line coverage is below the configured threshold. Requires a prior analyze() call and coverageReportPath set in mokosh.config. coverageThreshold overrides the config default (default: 80).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},coverageThreshold:{type:"number",description:"Line-coverage % below which a file is considered uncovered. Overrides config value."}},required:["root"]}},{name:"check_doc_drift",description:"Find markdown docs whose referenced files changed more recently than the doc itself \u2014 a commit-recency heuristic for stale documentation, not a content diff. Requires a prior analyze() call with gitStats: true in mokosh.config (otherwise no file has commit-timestamp data and nothing is flagged). See docs/adr-009-markdown-parsing.md for known limitations.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_complex_functions",description:"Find individual functions/methods above a cognitive (or cyclomatic) complexity threshold, sorted worst-first. Requires a prior analyze() call. TypeScript/JavaScript only.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which score to threshold/sort on (default: cognitiveComplexity)"},threshold:{type:"number",description:"Minimum score to include (default: 10)"},limit:{type:"number",description:"Max results to return, worst-first (default: 20)"}},required:["root"]}},{name:"propose_tags",description:"Propose what to run based on changed files. Pass changedFiles explicitly or omit to use git diff. format='tags' (default) returns test tags for CI tag-filtering; format='paths' returns test file paths ready to pipe directly to a test runner (e.g. vitest). Feature hubs act as traversal boundaries in both modes.",inputSchema:{type:"object",properties:{root:{type:"string"},changedFiles:{type:"array",items:{type:"string"},description:"Changed files relative to root. Omit to read from git diff."},featureThreshold:{type:"number",description:"Min importers for a file to be treated as a feature hub (default: 5). A hub short-circuits traversal and emits a feature:<name> tag instead of all downstream tags."},format:{type:"string",enum:["tags","paths"],description:"Output format: 'tags' returns test tag names for CI filtering (default); 'paths' returns test file paths to pipe to a test runner."}},required:["root"]}},{name:"detect_features",description:"Identify feature hub files \u2014 non-test files that import many other internal modules (orchestrators / aggregators like src/parser.ts or src/cli/runner.ts). Returns a list sorted by import count descending.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to use the cached graph."},featureThreshold:{type:"number",description:"Min internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"query",description:"Filter the graph by category, tag, or path. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry points to build the graph. Omit to reuse the cached graph from a prior 'analyze' call."},filter:{type:"string",description:"Query string e.g. 'category:logic' or 'category:logic,tag:auth'. Supports: category, type, tag, path, external, importsFile, importedBy, minImports, maxImports, minSize, maxSize, hasDocstring, minCoverage, maxCoverage, minExportUsage, maxExportUsage, minComplexity, maxComplexity, minCognitiveComplexity, maxCognitiveComplexity, minCommits, maxCommits, isDocumented, isStale, lastAuthor. OR logic: any(key:val|key:val) matches if any single-key clause holds, ANDed with the rest of the query. sort: size|imports|commitCount90d|exportUsage|complexity|cognitiveComplexity, with sortDir: asc|desc (default desc). limit: N."},mermaid:{type:"boolean",description:"Return a Mermaid diagram (default: false)"},slim:{type:"boolean",description:"Compact response mode (default: true). Returns export names, meaningful tags, and a flat importsFiles path list \u2014 no edge objects, no mtime/size. Pass false only when full edge metadata is needed."}},required:["root","filter"]}},{name:"get_workspace_packages",description:"List all workspace packages detected in a monorepo, with their node counts and inter-package dependencies. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"}},required:["root"]}},{name:"get_workspace_affected",description:"Cross-package blast-radius analysis. Returns every file that could be affected if a given file changes, annotated with the package it belongs to. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"},file:{type:"string",description:"Monorepo-root-relative path of the changed file (e.g. 'packages/shared/src/utils.ts')"}},required:["root","file"]}},{name:"get_type_graph",description:"Return type-level relationships for the project. Without a type name, returns an inventory of all interfaces, classes, enums, and type aliases with their file and kind. With a type name, returns which files import that type (usedByFiles) and which types the defining file imports (uses). Requires a prior analyze() call. Only covers TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},type:{type:"string",description:"Exact exported name of the type to look up (e.g. 'FileNode'). Omit to get the full type inventory."}},required:["root"]}},{name:"get_module_responsibility",description:"Return what each file is responsible for: its semantic role, JSDoc description (when present), exported symbol names, and which feature hub it belongs to. Pass specific paths to filter, or omit paths to get all files. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},paths:{type:"array",items:{type:"string"},description:"Project-relative file paths to include. Omit to return all files."},minOutDegree:{type:"number",description:"Min imports for a file to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_feature_graph",description:"Group files by domain: returns which files each feature hub (high-import orchestrator) transitively owns. Each file is assigned to the most specific hub that can reach it (lowest out-degree wins). Use this instead of a full query when answering 'what files are in the X feature/module?' \u2014 typically 85\u201395% fewer tokens than a full graph query.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minOutDegree:{type:"number",description:"Minimum internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_call_graph",description:"Look up callers and callees for a named function. Returns the file that defines the function, all files/functions that call it, and all files/functions it calls. Always requires a function name \u2014 never returns the full call graph unfiltered. Call edges are only populated for TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},function:{type:"string",description:"Exact name of the function to look up (e.g. 'parseFile')."}},required:["root","function"]}},{name:"find_symbol",description:"Find every file that exports a symbol by exact name, with the best available usage info per match. Precision varies by the defining file's language: TypeScript/JavaScript gets function-level callers (via call edges); Python gets named-import tracking (which files import this exact symbol); everything else (Go, CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) falls back to whole-file dependents, which is import-level only \u2014 a listed importer might not even use this specific export. Files whose parser never records exports (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) never appear as matches, so a name that only exists in one of those returns an empty result, same as a typo. Each match's `precision` field is 'call' | 'import-symbol' | 'file-level' \u2014 check it before trusting caller/importer results as symbol-exact.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},name:{type:"string",description:"Exact export name to look up (e.g. 'parseFile')."}},required:["root","name"]}},{name:"get_api_surface",description:"Build the API surface report for a project. Expands export* chains so every symbol accessible to consumers is listed (not just those directly declared in the entry file). Each export is resolved to its defining file and tagged with a kind (function/class/interface/type/enum/const). The graph is partitioned into: internalFiles (implementation reachable from entry points), unreachableFromEntry (non-test files not reachable from any entry point \u2014 may be separate consumers like CLI/MCP, config, or dead code), and testFiles (test suite). Supports multiple public entry points for libraries with sub-path exports. Requires a prior analyze() call. When entryPoints is omitted, auto-detects all entry points from package.json exports/main/module.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},entryPoints:{type:"array",items:{type:"string"},description:"Project-relative paths of public entry points (e.g. ['src/index.ts', 'src/utils.ts']). Omit to auto-detect from package.json exports / main / module fields."}},required:["root"]}},{name:"clear_cache",description:"Drop the cached dependency graph for a project root, forcing the next analyze() call to rebuild from disk. Call this after editing source files mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root to invalidate."}},required:["root"]}},{name:"apply_tags",description:"Write @tag annotations into test file source code based on the dependency graph. Tags of kind 'import' (filename-derived) and 'comment-marker' (domain semantic, propagated from source files) are written as an idempotent block. Re-running is safe: the existing block is replaced in place. Tags already present in the file are excluded from the block to avoid duplication. Supports TypeScript/JavaScript (// <mokosh-tags> block with // @tag lines) and Gherkin .feature files (# <mokosh-tags> block with @tagname lines). Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root."},dryRun:{type:"boolean",description:"When true, computes which files would change but does not write to disk (default: false)."}},required:["root"]}}];function Ze(){let t=new qe,e=new Ln.Server({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(Ye.ListToolsRequestSchema,async()=>({tools:_n})),e.setRequestHandler(Ye.CallToolRequestSchema,async r=>{let{name:s,arguments:n}=r.params,o=n,a={analyze:p=>gn(t,p),get_dependencies:p=>dn(t,p),get_dependents:p=>hn(t,p),get_affected:p=>yn(t,p),get_callers:p=>xn(t,p),find_symbol:p=>Rn(t,p),find_unused:p=>Sn(t,p),find_uncovered:p=>bn(t,p),check_doc_drift:p=>vn(t,p),find_complex_functions:p=>kn(t,p),propose_tags:p=>Cn(t,p),detect_features:p=>wn(t,p),get_type_graph:p=>An(t,p),get_module_responsibility:p=>Mn(t,p),get_feature_graph:p=>In(t,p),get_call_graph:p=>Nn(t,p),get_api_surface:p=>Gn(t,p),query:p=>En(t,p),get_workspace_packages:p=>Fn(t,p),get_workspace_affected:p=>Tn(t,p),clear_cache:p=>Pn(t,p),apply_tags:p=>Dn(t,p)}[s];if(!a)throw new Error(`Unknown tool: ${s}`);try{return mn(o.root),await a(o)}catch(p){return{content:[{type:"text",text:`Error: ${p instanceof Error?p.message:String(p)}`}],isError:!0}}}),e}async function ep(){let t=Ze(),e=new On.StdioServerTransport;await t.connect(e)}ep().catch(console.error);0&&(module.exports={createMcpServer});
29
+ `),ys(this.graph.nodes),gs(this.graph.nodes),hs(this.graph.nodes),ds(this.graph.nodes),this.coverageMap.size>0&&us(this.graph.nodes,this.coverageMap),new M(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},t=e.minFiles??Gc;if(!(t>0&&!this.hasAtLeastFiles(this.rootDir,t)))try{let n=E.default.join(__dirname,"parse-worker.js");this.pool=new Fs.default({filename:n,...e.maxThreads!==void 0?{maxThreads:e.maxThreads}:{}})}catch(n){process.stderr.write(`
30
+ Warning: failed to start parse worker pool, falling back to synchronous parsing: ${n}
31
+ `),this.pool=null}}hasAtLeastFiles(e,t){let n=0,s=[e];for(;s.length>0;){let o=s.pop();if(o===void 0)continue;let i;try{i=ne.default.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())Cs.has(a.name)||s.push(E.default.join(o,a.name));else if(a.isFile()&&(n++,n>=t))return!0}return n>=t}async processTestFiles(e){let t=oe(),n=o=>t.some(i=>o.name.includes(i));this.walkProject(e,n);let s=e;for(;s!==this.rootDir;){let o=E.default.dirname(s);if(o===s)break;for(let i of Rc){let a=E.default.join(o,i);try{ne.default.statSync(a).isDirectory()&&this.walkProject(a,n)}catch{}}s=o}await this.drain()}async processDocFiles(){this.walkProject(this.rootDir,e=>e.name.endsWith(".md")||e.name.endsWith(".mdx")),await this.drain()}walkProject(e,t){let n;try{n=ne.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let s of n){let o=E.default.join(e,s.name);s.isDirectory()?Cs.has(s.name)||this.walkProject(o,t):s.isFile()&&t(s)&&this.enqueue(o)}}enqueue(e){this.visited.has(e)||(this.visited.add(e),this.showProgress(),this.queue.push(e))}async drain(){for(;this.queue.length>0;){let e=this.queue;this.queue=[],await Promise.all(e.map(t=>this.finishFile(t)))}}async finishFile(e){let t=ne.default.statSync(e,{throwIfNoEntry:!1});if(!t?.isFile())return;let n=E.default.relative(this.rootDir,e),s=await this.getNode(e,n,t);s.imports=await this.resolveImports(e,s.imports),ms(s.imports,s.tags),this.graph.nodes.set(s.path,s)}async getNode(e,t,n){let s=this.previousGraph?.nodes.get(t);if(s&&s.mtime===n.mtimeMs&&s.size===n.size)return{...s};let o=await this.tryParse(e,t);if(!o)return this.makeStubNode(e,t,n);let i=this.resolveCallEdges(e,o.rawCallEdges),a=this.buildNode(e,t,n,o,i);return this.attachGitStats(a,t),a}async tryParse(e,t){let n=ne.default.readFileSync(e,"utf-8");try{return await this.parseContent(e,n)}catch(s){return process.stderr.write(`
32
+ Warning: failed to parse ${t}: ${s}
33
+ `),null}}parseContent(e,t){return this.pool?this.pool.run({filePath:e,content:t}):ls(e,t)}makeStubNode(e,t,n){return{path:t,type:L(e),category:"other",imports:[],exports:[],tags:[],mtime:n.mtimeMs,size:n.size}}resolveCallEdges(e,t){let n=[];for(let s of t??[])try{let o=this.resolver.resolve(e,s.toSpecifier);o&&!o.isExternal&&n.push({from:s.from,to:s.to,toFile:E.default.relative(this.rootDir,o.path)})}catch{}return n}buildNode(e,t,n,s,o){let{imports:i,exports:a,tags:c,category:p,description:l,complexity:f,cognitiveComplexity:d,functions:h}=s;return{path:t,type:L(e),category:p,imports:i,exports:a,tags:c,mtime:n.mtimeMs,size:n.size,...l!==void 0?{description:l}:{},...o.length>0?{callEdges:o}:{},...f!==void 0?{complexity:f}:{},...d!==void 0?{cognitiveComplexity:d}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,t){let n=this.gitStatsMap?.get(t);n&&(e.commitCount90d=n.commitCount90d,n.lastAuthor!==void 0&&(e.lastAuthor=n.lastAuthor),n.lastCommitAt!==void 0&&(e.lastCommitAt=n.lastCommitAt))}async resolveImports(e,t){let n=[];for(let s of t){let o=this.resolver.resolveAll(e,s.rawSpecifier);if(o.length!==0)for(let i of o){let a={...s,toPath:i.isExternal?i.path:E.default.relative(this.rootDir,i.path),isExternal:i.isExternal};i.isWorkspace&&(a.isWorkspace=!0,a.workspacePackage=i.workspacePackage),i.isExternal?this.attachLockfileVersion(a):this.enqueue(i.path),n.push(a)}}return n}attachLockfileVersion(e){if(!this.lockFile)return;let t=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],n=t?this.lockFile.dependencies[t]:void 0;n&&(e.version=n.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function Es(r,e){return{identifier:e?.identifier??new qe,featureMap:e?.featureDetection===!1?new Map:j(r.nodes,e?.featureDetection??void 0)}}function Ts(r,e,t,n,s){for(let o of e){let i=r.nodes.get(o);if(!i)continue;let a=new W(o,["*",...i.exports.map(c=>c.name)]);r.traverse(o,(c,p,l)=>{if(!l)return!0;if(!a.updateAffectedSymbols(c,l))return!1;if(p>0){let f=t.get(c.path);if(f)return n(f),!1}return s(c),!0},{direction:"incoming"})}}function kr(r,e,t){let{identifier:n,featureMap:s}=Es(r,t),o=new Set;for(let i of e){let a=s.get(i);a&&o.add(a.tag)}return Ts(r,e,s,i=>o.add(i.tag),i=>{if(n.isTestNode(i))for(let a of i.tags)o.add(a.name)}),Array.from(o)}function wr(r,e,t){let{identifier:n,featureMap:s}=Es(r,t),o=new Set;return Ts(r,e,s,()=>{},i=>{n.isTestNode(i)&&o.add(i.path)}),Array.from(o)}var Ps=g(require("fs")),se=g(require("path"));async function As(r,e,t=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=se.default.resolve(r);return await new Te(o,t,n.pathAliases?new V(o,{pathAliases:n.pathAliases}):void 0,s,n.gitStats??!1,n.coverageMap??new Map,n.parallelParsing??!0).build(e)}async function Ns(r,e={}){let t=se.default.resolve(r),n=ge(t),s=e.packages?n.packages.filter(a=>e.packages?.includes(a.name)||e.packages?.includes(a.relativeRoot)):n.packages,o=new Map(n.packages.map(a=>[a.name,a.root])),i=new de(t,n.type);for(let a of s){let c=e.silent?void 0:f=>{process.stderr.write(`[${a.name}] Processed ${f} files...\r`)},l=await new Te(t,null,new V(t,{workspaceMap:o,tsconfigSearchPaths:[a.root,t],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,l)}return i}function Is(r,e={}){let t=[],n=new Set([...e.ignoreDirs??O,...e.additionalIgnoreDirs??[]]),s=new Set([...e.extensions??mt,...e.additionalExtensions??[]]);function o(i){try{let a=Ps.default.readdirSync(i,{withFileTypes:!0});for(let c of a){let p=se.default.join(i,c.name);c.isDirectory()?n.has(c.name)||o(p):c.isFile()&&s.has(se.default.extname(c.name).toLowerCase())&&t.push(se.default.relative(r,p))}}catch{}}return o(r),t}var Ms=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var st=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,t){this.configs.set(e,t)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,t,n=new Map){let s=this.configs.get(e),o=await As(e,t,this.graphs.get(e)??null,{...q(s),coverageMap:n});return this.graphs.set(e,o),o}require(e){let t=this.graphs.get(e);if(!t)throw new Error('No graph cached for this root. Call "analyze" first.');return t}async getOrBuildWorkspace(e,t={}){let n=this.workspaceGraphs.get(e);if(n)return n;let s=await Ns(e,t);return this.workspaceGraphs.set(e,s),s}requireWorkspace(e){let t=this.workspaceGraphs.get(e);if(!t)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return t}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let t=this.changeImpactCaches.get(e);if(t)return t;let n=this.require(e),s=vt(n);return this.changeImpactCaches.set(e,s),s}storeLastAnalyze(e,t){this.lastAnalyze.set(e,t)}startWatching(e){if(!this.watchers.has(e))try{let t=Ds.default.watch(e,{recursive:!0},(n,s)=>{!s||Ms.test(s)||this.dirtyRoots.add(e)});t.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,t)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let t=this.lastAnalyze.get(e);return t?.kind==="single"?this.getOrBuild(e,t.entryPoints,t.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let t=this.configs.get(e);return this.getOrBuildWorkspace(e,q(t))}invalidate(e){let t=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),t}};var H=g(require("path"));var Rs=g(require("fs")),Gs=g(require("os")),ot=g(require("path"));function S(r){return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}function Ls(r){if(!ot.default.isAbsolute(r))throw new Error("root must be an absolute path");let e=ot.default.resolve(r),t=Gs.default.homedir();if(e!==t&&!e.startsWith(t+ot.default.sep))throw new Error("root must be within the user home directory");let n;try{n=Rs.default.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function _s(r,e){let{root:t,entryPoints:n}=e;if(!r.isConfigured(t)){let d=ie(t,{allowJs:!1});ut(d),r.storeConfig(t,d)}if(n.length===0){let d=ge(t);if(d.type!=="none"){let h=r.getConfig(t),v=await r.getOrBuildWorkspace(t,q(h));r.storeLastAnalyze(t,{kind:"workspace"}),r.startWatching(t);let x=Array.from(v.packages.values()).map(({graph:k,pkg:T})=>({package:T.name,relativeRoot:T.relativeRoot,nodeCount:k.nodes.size}));return S({monorepoType:d.type,packageCount:v.packages.size,packages:x})}}let s=n.map(d=>H.default.resolve(t,d)),o=r.getConfig(t),i=o?.coverageReportPath?dt(t,o.coverageReportPath):new Map,a=await r.getOrBuild(t,s,i);r.storeLastAnalyze(t,{kind:"single",entryPoints:s,coverageMap:i}),r.startWatching(t);let c=a.serialize(),p=c.nodes.reduce((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),l=a.findCycles(),f=Tt(a);return S({nodeCount:c.nodes.length,categories:p,cycles:l,languageCoverage:f})}async function Os(r,e){let{root:t,file:n,depth:s=1,withMeta:o=!1}=e,i=await r.ensureFresh(t),a=Pt(i,n,s),c=o?a.map(p=>({...p,...fe(i,p.path)})):a;return S({file:n,dependencies:c})}async function js(r,e){let{root:t,file:n,withMeta:s=!1}=e,o=await r.ensureFresh(t),i=ue(o,n),a=s?i.map(c=>({...c,...fe(o,c.path)})):i;return S({file:n,dependents:a})}async function Ws(r,e){let{root:t,file:n,testsOnly:s=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,c=await r.ensureFresh(t),p=d=>a?d.map(h=>({path:h,...fe(c,h)})):d;if(o){let d=r.getOrBuildChangeImpact(t),h=kt(d,n),v=s?h.filter(k=>c.nodes.get(k)?.category==="test"):h,x=p(v);return S({file:n,affected:x,count:x.length})}let l=At(c,n,{testsOnly:s,changedSymbols:i}),f=p(l);return S({file:n,affected:f,count:f.length})}async function zs(r,e){let{root:t,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await r.ensureFresh(t),a=Nt(i,n,{depth:s,withEdgeDetail:o});return S({file:n,callers:a,count:a.length})}async function $s(r,e){let{root:t,entryPoints:n}=e,s=n?await r.getOrBuild(t,n.map(a=>H.default.resolve(t,a))):await r.ensureFresh(t),o=Is(t),i=s.findUnusedFiles(o);return S({unusedFiles:i,count:i.length})}async function Bs(r,e){let{root:t}=e,n=await r.ensureFresh(t),s=new Map;for(let i of n.nodes.values())for(let a of i.tags)s.set(a.name,(s.get(a.name)??0)+1);let o=[...s.entries()].map(([i,a])=>({name:i,count:a})).sort((i,a)=>a.count-i.count);return S({tags:o,count:o.length})}async function Us(r,e){let{root:t,coverageThreshold:n}=e,s=await r.ensureFresh(t),o=r.getConfig(t),i=n??o?.coverageThreshold??80;if(!Rt(s))return S({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let a=[...s.nodes.values()].filter(c=>c.category!=="test"&&c.category!=="config").filter(c=>c.coveragePct!==void 0&&c.coveragePct<i).map(c=>({file:c.path,coveragePct:c.coveragePct}));return S({threshold:i,uncovered:a,count:a.length})}async function Ks(r,e){let{root:t}=e,s=[...(await r.ensureFresh(t)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return S({staleDocs:s,count:s.length})}async function Js(r,e){let{root:t,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await r.ensureFresh(t),a=It(i,{metric:n,threshold:s,limit:o});return S({metric:n,threshold:s,functions:a,count:a.length})}async function Vs(r,e){let{root:t,minLines:n=6,ignoreLiterals:s=!0,limit:o=50}=e,i=await r.ensureFresh(t),a=e.ignoreDirs??[...O,...r.getConfig(t)?.ignoreDirs??[]],c=await Et(i,t,{minLines:n,ignoreLiterals:s,limit:o,ignoreDirs:a});return S({minLines:n,groups:c,count:c.length})}async function Hs(r,e){let{root:t,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await r.ensureFresh(t),a=n??new Ye().getChangedFiles().map(l=>H.default.relative(t,H.default.resolve(t,l))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let l=wr(i,a,c);return S({changedFiles:a,affectedTests:l,count:l.length})}let p=kr(i,a,c);return S({changedFiles:a,proposedTags:p})}async function Qs(r,e){let{root:t,entryPoints:n,featureThreshold:s}=e,o=n?await r.getOrBuild(t,n.map(c=>H.default.resolve(t,c))):await r.ensureFresh(t),i=j(o.nodes,s!==void 0?{minOutDegree:s}:void 0),a=Array.from(i.values()).sort((c,p)=>p.outDegree-c.outDegree);return S({features:a,count:a.length})}async function qs(r,e){let{root:t,entryPoints:n,filter:s,mermaid:o=!1,slim:i=!0}=e,a=n?await r.getOrBuild(t,n.map(p=>H.default.resolve(t,p))):await r.ensureFresh(t),c=je(a.serialize(),We(s));return o?S(De.serialize(M.deserialize(c))):i?S(Mt(c)):S(c)}async function Xs(r,e){let{root:t}=e,n=await r.ensureFreshWorkspace(t);return S(Dt(n))}async function Ys(r,e){let{root:t,file:n}=e,o=(await r.ensureFreshWorkspace(t)).getAffectedAcrossPackages(n);return S({file:n,affected:o,count:o.length})}function Zs(r,e){let{root:t}=e,n=r.invalidate(t);return S({root:t,cleared:n,message:n?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function eo(r,e){let{root:t,type:n}=e,s=await r.ensureFresh(t),o=_t(s);if(n)return S(Ot(o,n));let i=Array.from(o.types.values());return S({count:i.length,types:i})}async function to(r,e){let{root:t,paths:n,minOutDegree:s}=e,o=await r.ensureFresh(t),i=Gt(o,s!==void 0?{minOutDegree:s}:void 0);if(n?.length){let c=n.map(p=>i.get(p)).filter(Boolean);return S({count:c.length,modules:c})}let a=Array.from(i.values());return S({count:a.length,modules:a})}async function ro(r,e){let{root:t,minOutDegree:n}=e,s=await r.ensureFresh(t),o=pe(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return S({features:i,unassigned:o.unassigned})}async function no(r,e){let{root:t,function:n}=e,s=await r.ensureFresh(t);return S(bt(s,n))}async function so(r,e){let{root:t,name:n}=e,s=await r.ensureFresh(t),o=Lt(s,n);return S({name:n,matches:o,count:o.length})}async function oo(r,e){let{root:t,entryPoints:n}=e,s=await r.ensureFresh(t),o=n?.length?n:xt(s,t);if(o.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return S(St(s,o))}async function io(r,e){let t=await r.ensureFresh(e.root),n=await or(t,e.root,{dryRun:e.dryRun??!1});return S(n)}var ao=[{name:"analyze",description:"Build the dependency graph for a project from entry points. Returns a summary of node count, categories, and cycles. Must be called before get_dependencies, get_dependents, get_affected, or propose_tags. Pass an empty entryPoints array to auto-detect a monorepo (pnpm/npm/yarn/Nx/Turborepo) and build per-package graphs \u2014 use get_workspace_packages and get_workspace_affected for monorepo queries.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root (or monorepo root)"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root (e.g. ['src/index.ts']). Pass [] to trigger monorepo auto-detection."}},required:["root","entryPoints"]}},{name:"get_dependencies",description:"Get files that a given file imports (outgoing traversal). depth=1 returns immediate imports; omit for the full transitive tree. Each result includes the specific symbols imported from that file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_dependents",description:"Get files that directly import a given file (one-hop incoming edges). Each result includes the specific symbols that dependent file imports from this file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_affected",description:"Get all files transitively affected if a given file changes \u2014 full incoming traversal upward. Use before a refactor to understand blast radius. Set testsOnly=true to get only test files. Set cached=true to use a pre-computed O(1) lookup cache instead of graph traversal \u2014 faster on repeated calls for the same root. Pass changedSymbols to restrict blast-radius to files that actually import those symbols \u2014 omit to treat the whole file as changed. Set withMeta=true to get { path, category, exports } objects instead of bare path strings.",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},testsOnly:{type:"boolean",description:"Return only test/spec files (default: false)"},cached:{type:"boolean",description:"Use a pre-computed impact cache for O(1) lookup instead of graph traversal. Cache is built lazily on first use and reused for the session (default: false)."},changedSymbols:{type:"array",items:{type:"string"},description:"Restrict blast-radius to files that import at least one of these symbols. Omit to treat the whole file as changed (conservative, same as before)."},withMeta:{type:"boolean",description:"Return each affected file as { path, category, exports } instead of a bare path string (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_callers",description:"Get files whose exported functions call into a given file (call-graph dependents). More precise than get_affected: only files with actual runtime call edges, not mere imports. Requires prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to project root"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withEdgeDetail:{type:"boolean",description:"Include from/to function names per edge (default: false)"}},required:["root","file"]}},{name:"find_unused",description:"Find files in the project that are not reachable from any entry point. Useful before cleanup passes. Omit entryPoints to reuse the cached graph from a prior analyze() call instead of rebuilding.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to reuse the cached graph from a prior analyze() call."}},required:["root"]}},{name:"list_tags",description:"List every distinct tag name present in the graph, with how many nodes carry each one. Call this before querying with tag:<name> to avoid a speculative filter silently returning zero results. Includes all tag kinds \u2014 a superset of what query's slim mode keeps (slim only retains comment-marker and import tags).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_uncovered",description:"Find non-test files whose line coverage is below the configured threshold. Requires a prior analyze() call and coverageReportPath set in mokosh.config. coverageThreshold overrides the config default (default: 80).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},coverageThreshold:{type:"number",description:"Line-coverage % below which a file is considered uncovered. Overrides config value."}},required:["root"]}},{name:"check_doc_drift",description:"Find markdown docs whose referenced files changed more recently than the doc itself \u2014 a commit-recency heuristic for stale documentation, not a content diff. Requires a prior analyze() call with gitStats: true in mokosh.config (otherwise no file has commit-timestamp data and nothing is flagged). See docs/adr-009-markdown-parsing.md for known limitations.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_complex_functions",description:"Find individual functions/methods above a cognitive (or cyclomatic) complexity threshold, sorted worst-first. Requires a prior analyze() call. Populated for TypeScript/JavaScript, Go, and Python.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which score to threshold/sort on (default: cognitiveComplexity)"},threshold:{type:"number",description:"Minimum score to include (default: 10)"},limit:{type:"number",description:"Max results to return, worst-first (default: 20)"}},required:["root"]}},{name:"find_duplicates",description:"Find duplicated code blocks across the project, largest-first. Token-based (not AST-based), so it works uniformly across every language mokosh parses (TypeScript/JavaScript, Python, Go, CoffeeScript, LiveScript, Lua, Gherkin, style files, Markdown). Identifiers \u2014 and by default literals \u2014 are normalized before matching, so renamed-variable copies are still caught. Lock files (package-lock.json, yarn.lock, pnpm-lock.yaml) and files under an ignored directory are always excluded, even if the graph itself contains them. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minLines:{type:"number",description:"Minimum duplicated block size in lines to report (default: 6)"},ignoreLiterals:{type:"boolean",description:"Normalize string/number literals too, not just identifiers, so only structural shape drives a match (default: true). Set false for stricter, exact-text-only matching."},ignoreDirs:{type:"array",items:{type:"string"},description:"Directory names to exclude, matched against any path segment (default: DEFAULT_IGNORE_DIRS merged with this root's configured ignoreDirs, if any). Pass [] to disable."},limit:{type:"number",description:"Max duplicate blocks to return, largest-first (default: 50)"}},required:["root"]}},{name:"propose_tags",description:"Propose what to run based on changed files. Pass changedFiles explicitly or omit to use git diff. format='tags' (default) returns test tags for CI tag-filtering; format='paths' returns test file paths ready to pipe directly to a test runner (e.g. vitest). Feature hubs act as traversal boundaries in both modes.",inputSchema:{type:"object",properties:{root:{type:"string"},changedFiles:{type:"array",items:{type:"string"},description:"Changed files relative to root. Omit to read from git diff."},featureThreshold:{type:"number",description:"Min importers for a file to be treated as a feature hub (default: 5). A hub short-circuits traversal and emits a feature:<name> tag instead of all downstream tags."},format:{type:"string",enum:["tags","paths"],description:"Output format: 'tags' returns test tag names for CI filtering (default); 'paths' returns test file paths to pipe to a test runner."}},required:["root"]}},{name:"detect_features",description:"Identify feature hub files \u2014 non-test files that import many other internal modules (orchestrators / aggregators like src/parser.ts or src/cli/runner.ts). Returns a list sorted by import count descending.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to use the cached graph."},featureThreshold:{type:"number",description:"Min internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"query",description:"Filter the graph by category, tag, or path. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry points to build the graph. Omit to reuse the cached graph from a prior 'analyze' call."},filter:{type:"string",description:"Query string e.g. 'category:logic' or 'category:logic,tag:auth'. Supports: category, type, tag, path, external, importsFile, importedBy, minImports, maxImports, minSize, maxSize, hasDocstring, minCoverage, maxCoverage, minExportUsage, maxExportUsage, minComplexity, maxComplexity, minCognitiveComplexity, maxCognitiveComplexity, minCommits, maxCommits, isDocumented, isStale, lastAuthor. OR logic: any(key:val|key:val) matches if any single-key clause holds, ANDed with the rest of the query. sort: size|imports|commitCount90d|exportUsage|complexity|cognitiveComplexity, with sortDir: asc|desc (default desc). limit: N."},mermaid:{type:"boolean",description:"Return a Mermaid diagram (default: false)"},slim:{type:"boolean",description:"Compact response mode (default: true). Returns export names, meaningful tags, and a flat importsFiles path list \u2014 no edge objects, no mtime/size. Tags are filtered to kinds comment-marker and import only; function/class/variable/type/library tags are dropped in slim output. Use list_tags to see the full tag inventory, or pass slim: false to get every tag kind on matching nodes."}},required:["root","filter"]}},{name:"get_workspace_packages",description:"List all workspace packages detected in a monorepo, with their node counts and inter-package dependencies. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"}},required:["root"]}},{name:"get_workspace_affected",description:"Cross-package blast-radius analysis. Returns every file that could be affected if a given file changes, annotated with the package it belongs to. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"},file:{type:"string",description:"Monorepo-root-relative path of the changed file (e.g. 'packages/shared/src/utils.ts')"}},required:["root","file"]}},{name:"get_type_graph",description:"Return type-level relationships for the project. Without a type name, returns an inventory of all interfaces, classes, enums, and type aliases with their file and kind. With a type name, returns which files import that type (usedByFiles) and which types the defining file imports (uses). Requires a prior analyze() call. Only covers TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},type:{type:"string",description:"Exact exported name of the type to look up (e.g. 'FileNode'). Omit to get the full type inventory."}},required:["root"]}},{name:"get_module_responsibility",description:"Return what each file is responsible for: its semantic role, JSDoc description (when present), exported symbol names, and which feature hub it belongs to. Pass specific paths to filter, or omit paths to get all files. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},paths:{type:"array",items:{type:"string"},description:"Project-relative file paths to include. Omit to return all files."},minOutDegree:{type:"number",description:"Min imports for a file to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_feature_graph",description:"Group files by domain: returns which files each feature hub (high-import orchestrator) transitively owns. Each file is assigned to the most specific hub that can reach it (lowest out-degree wins). Use this instead of a full query when answering 'what files are in the X feature/module?' \u2014 typically 85\u201395% fewer tokens than a full graph query.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minOutDegree:{type:"number",description:"Minimum internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_call_graph",description:"Look up callers and callees for a named function. Returns the file that defines the function, all files/functions that call it, and all files/functions it calls. Always requires a function name \u2014 never returns the full call graph unfiltered. Call edges are only populated for TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},function:{type:"string",description:"Exact name of the function to look up (e.g. 'parseFile')."}},required:["root","function"]}},{name:"find_symbol",description:"Find every file that exports a symbol by exact name, with the best available usage info per match. Precision varies by the defining file's language: TypeScript/JavaScript, Go, and Python get function-level callers (via call edges) \u2014 though coverage differs per language (Go only tracks package-qualified calls, Python only tracks bare calls to `from module import name` symbols); everything else (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) falls back to whole-file dependents, which is import-level only \u2014 a listed importer might not even use this specific export. Files whose parser never records exports (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) never appear as matches, so a name that only exists in one of those returns an empty result, same as a typo. Each match's `precision` field is 'call' | 'file-level' \u2014 check it before trusting caller/importer results as symbol-exact.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},name:{type:"string",description:"Exact export name to look up (e.g. 'parseFile')."}},required:["root","name"]}},{name:"get_api_surface",description:"Build the API surface report for a project. Expands export* chains so every symbol accessible to consumers is listed (not just those directly declared in the entry file). Each export is resolved to its defining file and tagged with a kind (function/class/interface/type/enum/const). The graph is partitioned into: internalFiles (implementation reachable from entry points), unreachableFromEntry (non-test files not reachable from any entry point \u2014 may be separate consumers like CLI/MCP, config, or dead code), and testFiles (test suite). Supports multiple public entry points for libraries with sub-path exports. Requires a prior analyze() call. When entryPoints is omitted, auto-detects all entry points from package.json exports/main/module.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},entryPoints:{type:"array",items:{type:"string"},description:"Project-relative paths of public entry points (e.g. ['src/index.ts', 'src/utils.ts']). Omit to auto-detect from package.json exports / main / module fields."}},required:["root"]}},{name:"clear_cache",description:"Drop the cached dependency graph for a project root, forcing the next analyze() call to rebuild from disk. Call this after editing source files mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root to invalidate."}},required:["root"]}},{name:"apply_tags",description:"Write @tag annotations into test file source code based on the dependency graph. Tags of kind 'import' (filename-derived) and 'comment-marker' (domain semantic, propagated from source files) are written as an idempotent block. Re-running is safe: the existing block is replaced in place. Tags already present in the file are excluded from the block to avoid duplication. Supports TypeScript/JavaScript (// <mokosh-tags> block with // @tag lines) and Gherkin .feature files (# <mokosh-tags> block with @tagname lines). Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root."},dryRun:{type:"boolean",description:"When true, computes which files would change but does not write to disk (default: false)."}},required:["root"]}}];function at(){let r=new st,e=new co.Server({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(it.ListToolsRequestSchema,async()=>({tools:ao})),e.setRequestHandler(it.CallToolRequestSchema,async t=>{let{name:n,arguments:s}=t.params,o=s,a={analyze:c=>_s(r,c),get_dependencies:c=>Os(r,c),get_dependents:c=>js(r,c),get_affected:c=>Ws(r,c),get_callers:c=>zs(r,c),find_symbol:c=>so(r,c),find_unused:c=>$s(r,c),find_uncovered:c=>Us(r,c),list_tags:c=>Bs(r,c),check_doc_drift:c=>Ks(r,c),find_complex_functions:c=>Js(r,c),find_duplicates:c=>Vs(r,c),propose_tags:c=>Hs(r,c),detect_features:c=>Qs(r,c),get_type_graph:c=>eo(r,c),get_module_responsibility:c=>to(r,c),get_feature_graph:c=>ro(r,c),get_call_graph:c=>no(r,c),get_api_surface:c=>oo(r,c),query:c=>qs(r,c),get_workspace_packages:c=>Xs(r,c),get_workspace_affected:c=>Ys(r,c),clear_cache:c=>Zs(r,c),apply_tags:c=>io(r,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return Ls(o.root),await a(o)}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),e}async function _c(){let r=at(),e=new po.StdioServerTransport;await r.connect(e)}_c().catch(console.error);0&&(module.exports={createMcpServer});
30
34
  //# sourceMappingURL=mcp.js.map