@omfalos/mokosh 0.1.8 → 0.1.9

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.mjs CHANGED
@@ -1,30 +1,30 @@
1
1
  #!/usr/bin/env node
2
- var _e=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import Us from"path";import{fileURLToPath as Ks}from"url";var Js=()=>Ks(import.meta.url),Hs=()=>Us.dirname(Js()),u=Hs();import{StdioServerTransport as Ma}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as Pa}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as Ta,ListToolsRequestSchema as Aa}from"@modelcontextprotocol/sdk/types.js";import wa from"fs";import We from"fs";import Wt from"path";var Qs=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],Gt=[];function ge(t){Gt.push(t)}function _t(t){return[...Qs,...Gt].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var Vs=[".test.",".spec.","-test.","-spec."],jt=[];function me(t){jt.push(t)}function H(){return[...Vs,...jt]}var qs=["jest","vitest","playwright","cypress","@testing-library/"],Ot=[];function de(t){Ot.push(t)}function je(){return[...qs,...Ot]}var Lt=.8;function Oe(t){Lt=t}function Le(){return Lt}var Xs=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function Q(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let s=Wt.resolve(t);return We.existsSync(s)?s.endsWith(".json")?zt(s):e?$t(s):{}:{}}for(let s of Xs){let n=Wt.resolve(t,s);if(We.existsSync(n)){if(s.endsWith(".json"))return zt(n);if(e)return $t(n)}}return{}}function zt(t){return JSON.parse(We.readFileSync(t,"utf-8"))}function $t(t){let e=_e(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function ze(t){for(let e of t.configMatchers??[])ge(e);for(let e of t.testPatterns??[])me(e);for(let e of t.testLibraries??[])de(e);t.barrelThreshold!==void 0&&Oe(t.barrelThreshold)}var $e=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],Be=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];import Ys from"fs";import Bt from"path";function Ue(t,e){let r=Bt.resolve(t,e);try{let s=Ys.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=Bt.relative(t,i);o.set(c,p)}return o}catch{return new Map}}var he={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
- `)}};import Ut from"fs";import en from"path";function Ke(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 Kt(t,e){if(typeof t=="string")return Ke(t,e);if(t&&typeof t=="object"){let r=t;for(let s of["import","require","default"]){let n=Kt(r[s],e);if(n)return n}}return null}function tn(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 rn(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 Je(t,e){let r=[],s=en.join(e,"package.json");if(Ut.existsSync(s))try{let n=JSON.parse(Ut.readFileSync(s,"utf8"));if(n.exports&&typeof n.exports=="object"&&!Array.isArray(n.exports))for(let o of Object.values(n.exports)){let i=Kt(o,t);i&&!r.includes(i)&&r.push(i)}else if(typeof n.exports=="string"){let o=Ke(n.exports,t);o&&r.push(o)}if(r.length===0)for(let o of[n.main,n.module].filter(Boolean)){let i=Ke(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 sn(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 nn(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 on(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(h=>h.name===o))??s[0],m={name:o,definedIn:c,kind:tn(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 an(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 He(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=sn(t,e),s=nn(t,r,e),n=rn(t,e),o=on(n,s,t,e),{internalFiles:i,unreachableFromEntry:a,testFiles:p}=an(t,r,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:p}}function Qe(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}}import pp from"fs";import lp from"path";function Jt(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 Ve(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:Jt(t)}}function qe(t,e){return t.impact.get(e)??[]}import ye from"path";function pn(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 cn(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=ye.extname(n),p=ye.basename(n,a),c=p==="index"?ye.basename(ye.dirname(n)):p;s.set(n,{path:n,outDegree:o,tag:`feature:${c}`})}return s}function R(t,e){let r=e?.minOutDegree??5;return cn(t,pn(t),r)}var ln=(t,e)=>t.outDegree-e.outDegree;function un(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 fn(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 gn(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 mn(t,e,r){let s=[];for(let n of t.keys())!e.has(n)&&!r.has(n)&&s.push(n);return s}function V(t,e){let r=e?.detectFn??R,s=e?.hubComparator??ln,n=r(t.nodes,e),o=un(t,n),i=fn(t.nodes,n,o,s);return{features:gn(n,i),unassigned:mn(t.nodes,n,i)}}var q=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 h of n(p))a(h,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 q(this.nodes).findUnusedFiles(e)}findCycles(){return new q(this.nodes).findCycles()}};var N=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 Xe(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 Ye(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 Ze(t,e,r={}){let{testsOnly:s=!1,changedSymbols:n}=r,o=n?new N(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 et(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 tt(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 rt(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 st(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 nt(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function Ht(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")||X(e)==="cli"?"cli":x(e,"util")||x(e,"utils")||x(e,"helper")||x(e,"helpers")?"util":x(e,"model")||x(e,"models")||X(e)==="model"?"model":x(e,"parser")||x(e,"parsers")||X(e)==="parser"?"parser":X(e)==="builder"?"builder":X(e)==="resolver"?"resolver":"other"}function x(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function X(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function ot(t,e){let r=V(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:Ht(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return n}function dn(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function hn(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function it(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(!hn(n,s.category))continue;let o=`${s.path}::${n.name}`;e.set(o,{name:n.name,file:s.path,kind:dn(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 at(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())}}import Tn from"path";import ct from"fs";import Xt from"path";import Y from"fs";import w from"path";import Qt from"fs";import Lp from"path";function Vt(t){try{return Qt.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function xe(t){try{return Qt.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function pt(t,e){let r=w.join(e,"package.json");if(!Y.existsSync(r))return null;let s={};try{s=JSON.parse(Y.readFileSync(r,"utf-8"))}catch{return null}let n=s.name;return n?{name:n,root:e,relativeRoot:w.relative(t,e),entryPoints:yn(e,s)}:null}function yn(t,e){let r=[];if(e.exports){let n=e.exports;if(typeof n=="string")r.push(w.join(t,n));else if(typeof n=="object"&&n!==null){let o=n["."];if(typeof o=="string")r.push(w.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(w.join(t,i))}}}e.main&&r.push(w.join(t,e.main));for(let n of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(w.join(t,n));let s=r.filter(xe);return s.length>0?s.slice(0,1):r.slice(0,1)}function D(t,e){let r=[],s=new Set;for(let n of e){let o=n.replace(/\/$/,"").replace(/^\.\//,"");xn(t,o,s,r)}return r}function xn(t,e,r,s){if(!e.includes("*")){Sn(t,e,r,s);return}let n=e.split("/");n.includes("**")?bn(t,n,r,s):vn(t,n,r,s)}function Sn(t,e,r,s){let n=w.join(t,e);if(r.has(n)||!Vt(n))return;r.add(n);let o=pt(t,n);o&&s.push(o)}function bn(t,e,r,s){let n=w.join(t,e[0]==="**"?"":e[0]??"");qt(t,n,r,s)}function vn(t,e,r,s){let n=e.findIndex(a=>a.includes("*")),o=w.join(t,...e.slice(0,n)),i;try{i=Y.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let p=w.join(o,a.name);if(r.has(p))continue;r.add(p);let c=pt(t,p);c&&s.push(c)}}function qt(t,e,r,s){let n;try{n=Y.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.join(e,o.name);if(Y.existsSync(w.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=pt(t,i);a&&s.push(a)}else qt(t,i,r,s)}}var Yt={type:"npm",detect(t){let e=Xt.join(t,"package.json");if(!ct.existsSync(e))return null;let r;try{r=JSON.parse(ct.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||ct.existsSync(Xt.join(t,"yarn.lock")))return null;let s=Array.isArray(r)?r:r.packages??[];return s.length===0?null:D(t,s)}};import G from"fs";import v from"path";var Zt={type:"nx",detect(t){return G.existsSync(v.join(t,"nx.json"))?er(t,t,new Set,0).map(r=>kn(t,r,v.join(r,"project.json"))).filter(r=>r!==null):null}};function er(t,e,r,s){if(s>4)return[];let n;try{n=G.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.join(e,a);G.existsSync(v.join(p,"project.json"))&&!r.has(p)?(r.add(p),o.push(p)):o.push(...er(t,p,r,s+1))}return o}function kn(t,e,r){let s={};try{s=JSON.parse(G.readFileSync(r,"utf-8"))}catch{return null}let n=s.name,o,i,a=v.join(e,"package.json");if(G.existsSync(a))try{let p=JSON.parse(G.readFileSync(a,"utf-8"));n=p.name??n,o=p.main,i=p.exports}catch{}return n?{name:n,root:e,relativeRoot:v.relative(t,e),entryPoints:Cn(e,s,o,i)}:null}function Cn(t,e,r,s){let n=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=v.resolve(t,"../..");n.push(v.resolve(a,o)),n.push(v.resolve(t,o))}if(s){let a=s;if(typeof a=="string")n.push(v.join(t,a));else if(typeof a=="object"&&a!==null){let p=a["."];typeof p=="string"&&n.push(v.join(t,p))}}if(r&&n.push(v.join(t,r)),e.sourceRoot){let a=v.resolve(t,"../.."),p=v.resolve(a,e.sourceRoot);n.push(v.join(p,"index.ts"),v.join(p,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])n.push(v.join(t,a));let i=n.filter(xe);return i.length>0?i.slice(0,1):n.slice(0,1)}import tr from"fs";import wn from"path";import{load as Fn}from"js-yaml";var rr={type:"pnpm",detect(t){let e=wn.join(t,"pnpm-workspace.yaml");if(!tr.existsSync(e))return null;let r=[];try{r=Fn(tr.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return D(t,r)}};import En from"fs";import Pn from"path";var sr={type:"turborepo",detect(t){return En.existsSync(Pn.join(t,"turbo.json"))?[]:null}};import lt from"fs";import nr from"path";var or={type:"yarn",detect(t){if(!lt.existsSync(nr.join(t,"yarn.lock")))return null;let e=nr.join(t,"package.json");if(!lt.existsSync(e))return null;let r;try{r=JSON.parse(lt.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:D(t,s)}};var ir=[];function T(t){ir.push(t)}function ar(){return ir}T(sr);T(Zt);T(rr);T(or);T(Yt);function Z(t,e=ar()){let r=Tn.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 ee=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 pr=new Map;function _(t,e){pr.set(t,e)}function cr(t){return pr.get(t)}function lr(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function An(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var Mn=(t,e)=>!e.category||lr(t.category,e.category),In=(t,e)=>!e.type||lr(t.type,e.type),Rn=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,Nn=(t,e)=>!e.path||An(t.path,e.path),Dn=(t,e)=>e.isExternal===void 0?!0:t.imports.some(s=>s.isExternal)===e.isExternal,Gn=(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)))},_n=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(s=>s.name===r)),jn=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),On=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(n=>n.includes(e.importedBy)),Ln=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,Wn=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,zn=(t,e)=>e.minSize===void 0||t.size>=e.minSize,$n=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,Bn=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,Un=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,Kn=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,Jn=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,Hn=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,Qn=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,Vn=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,qn=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Xn=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Yn=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,Zn=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,eo=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,to=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,ro=(t,e,r)=>!e.any?.length||e.any.some(s=>te(t,s,r)),so=[Mn,In,Rn,Nn,Dn,Gn,_n,jn,On,Ln,Wn,zn,$n,Bn,Un,Kn,Jn,Hn,Qn,Vn,qn,Xn,Yn,Zn,eo,to,ro];function te(t,e,r){return so.every(s=>s(t,e,r))}function Se(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=>te(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 no(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 be(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=no(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}ur(e,s)}return e}import Cr from"fs/promises";import Ao from"path";import ht from"path";import Te from"typescript";import gr from"path";import mr from"typescript";import k from"typescript";var fr=new Set(["describe","test","it"]);function j(t){let e=[];for(let r of t.statements){if(!k.isExpressionStatement(r))continue;let s=r.expression;if(!k.isCallExpression(s))continue;let n=s.expression;k.isIdentifier(n)&&fr.has(n.text)&&e.push(s),k.isPropertyAccessExpression(n)&&k.isIdentifier(n.expression)&&fr.has(n.expression.text)&&e.push(s)}return e}function O(t,e,r){for(let s of t.arguments){if(!k.isObjectLiteralExpression(s))continue;let n=s.properties.find(o=>k.isPropertyAssignment(o)&&k.isIdentifier(o.name)&&o.name.text===e);if(!(!n||!k.isArrayLiteralExpression(n.initializer)))return n.initializer.elements.filter(k.isStringLiteral).map(o=>o.text)}return null}function L(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.isObjectLiteralExpression(i))continue;let a=i.properties.find(c=>k.isPropertyAssignment(c)&&k.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 W(t,e,r){let s=t.arguments;for(let n=1;n<s.length;n++){let o=s[n];if(!k.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(p=>k.isPropertyAssignment(p)&&k.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 z(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 $(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var E=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function oo(t){return $(t.map(e=>`@${e}`))}function io(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}var ve=class{name="cypress";canHandle(e){return E.has(gr.extname(e).toLowerCase())}apply(e,r,s){let n=mr.createSourceFile(gr.basename(e),r,mr.ScriptTarget.Latest,!0),o=j(n);if(o.length===0)return r;let i=O(o[0],"tags",n),a=[...s].sort();if(i!==null&&JSON.stringify(io(i).sort())===JSON.stringify(a))return r;let p=o.flatMap(c=>{let m=s.length===0?W(c,"tags",n):L(c,"tags",oo(a),n);return m?[m]:[]});return p.length>0?z(r,p):r}};import ao from"path";var ut=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,ft=/^@([a-zA-Z0-9_-]+)/gm;function po(t){return["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
2
+ var Oe=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import Ks from"path";import{fileURLToPath as Js}from"url";var Hs=()=>Js(import.meta.url),Qs=()=>Ks.dirname(Hs()),u=Qs();import{StdioServerTransport as Ia}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as Aa}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as Ta,ListToolsRequestSchema as Ma}from"@modelcontextprotocol/sdk/types.js";import Fa from"fs";import ze from"fs";import zt from"path";var Vs=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],_t=[];function me(t){_t.push(t)}function Ot(t){return[...Vs,..._t].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var qs=[".test.",".spec.","-test.","-spec."],jt=[];function de(t){jt.push(t)}function Q(){return[...qs,...jt]}var Xs=["jest","vitest","playwright","cypress","@testing-library/"],Lt=[];function he(t){Lt.push(t)}function je(){return[...Xs,...Lt]}var Wt=.8;function Le(t){Wt=t}function We(){return Wt}var Ys=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function V(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let s=zt.resolve(t);return ze.existsSync(s)?s.endsWith(".json")?$t(s):e?Bt(s):{}:{}}for(let s of Ys){let n=zt.resolve(t,s);if(ze.existsSync(n)){if(s.endsWith(".json"))return $t(n);if(e)return Bt(n)}}return{}}function $t(t){return JSON.parse(ze.readFileSync(t,"utf-8"))}function Bt(t){let e=Oe(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function $e(t){for(let e of t.configMatchers??[])me(e);for(let e of t.testPatterns??[])de(e);for(let e of t.testLibraries??[])he(e);t.barrelThreshold!==void 0&&Le(t.barrelThreshold)}function G(t){return{gitStats:t?.gitStats??!1,parallelParsing:t?.parallelParsing,pathAliases:t?.pathAliases}}var Be=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],Ue=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];import Zs from"fs";import Ut from"path";function Ke(t,e){let r=Ut.resolve(t,e);try{let s=Zs.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=Ut.relative(t,i);o.set(c,p)}return o}catch{return new Map}}var ye={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
+ `)}};import Kt from"fs";import tn from"path";function Je(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 Jt(t,e){if(typeof t=="string")return Je(t,e);if(t&&typeof t=="object"){let r=t;for(let s of["import","require","default"]){let n=Jt(r[s],e);if(n)return n}}return null}function rn(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 sn(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 He(t,e){let r=[],s=tn.join(e,"package.json");if(Kt.existsSync(s))try{let n=JSON.parse(Kt.readFileSync(s,"utf8"));if(n.exports&&typeof n.exports=="object"&&!Array.isArray(n.exports))for(let o of Object.values(n.exports)){let i=Jt(o,t);i&&!r.includes(i)&&r.push(i)}else if(typeof n.exports=="string"){let o=Je(n.exports,t);o&&r.push(o)}if(r.length===0)for(let o of[n.main,n.module].filter(Boolean)){let i=Je(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 nn(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 on(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 an(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(h=>h.name===o))??s[0],m={name:o,definedIn:c,kind:rn(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 pn(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 Qe(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=nn(t,e),s=on(t,r,e),n=sn(t,e),o=an(n,s,t,e),{internalFiles:i,unreachableFromEntry:a,testFiles:p}=pn(t,r,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:p}}function Ve(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}}import cp from"fs";import up from"path";function Ht(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 qe(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:Ht(t)}}function Xe(t,e){return t.impact.get(e)??[]}import xe from"path";function cn(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 ln(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=xe.extname(n),p=xe.basename(n,a),c=p==="index"?xe.basename(xe.dirname(n)):p;s.set(n,{path:n,outDegree:o,tag:`feature:${c}`})}return s}function R(t,e){let r=e?.minOutDegree??5;return ln(t,cn(t),r)}var un=(t,e)=>t.outDegree-e.outDegree;function fn(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 gn(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 mn(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 dn(t,e,r){let s=[];for(let n of t.keys())!e.has(n)&&!r.has(n)&&s.push(n);return s}function q(t,e){let r=e?.detectFn??R,s=e?.hubComparator??un,n=r(t.nodes,e),o=fn(t,n),i=gn(t.nodes,n,o,s);return{features:mn(n,i),unassigned:dn(t.nodes,n,i)}}var X=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 h of n(p))a(h,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 X(this.nodes).findUnusedFiles(e)}findCycles(){return new X(this.nodes).findCycles()}};var N=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 Ye(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 Ze(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 et(t,e,r={}){let{testsOnly:s=!1,changedSymbols:n}=r,o=n?new N(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 tt(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 rt(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 st(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 nt(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 ot(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function Qt(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")||Y(e)==="cli"?"cli":x(e,"util")||x(e,"utils")||x(e,"helper")||x(e,"helpers")?"util":x(e,"model")||x(e,"models")||Y(e)==="model"?"model":x(e,"parser")||x(e,"parsers")||Y(e)==="parser"?"parser":Y(e)==="builder"?"builder":Y(e)==="resolver"?"resolver":"other"}function x(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function Y(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function it(t,e){let r=q(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:Qt(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return n}function hn(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function yn(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function at(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(!yn(n,s.category))continue;let o=`${s.path}::${n.name}`;e.set(o,{name:n.name,file:s.path,kind:hn(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())}}import Tn from"path";import lt from"fs";import Yt from"path";import Z from"fs";import w from"path";import Vt from"fs";import Wp from"path";function qt(t){try{return Vt.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Se(t){try{return Vt.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function ct(t,e){let r=w.join(e,"package.json");if(!Z.existsSync(r))return null;let s={};try{s=JSON.parse(Z.readFileSync(r,"utf-8"))}catch{return null}let n=s.name;return n?{name:n,root:e,relativeRoot:w.relative(t,e),entryPoints:xn(e,s)}:null}function xn(t,e){let r=[];if(e.exports){let n=e.exports;if(typeof n=="string")r.push(w.join(t,n));else if(typeof n=="object"&&n!==null){let o=n["."];if(typeof o=="string")r.push(w.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(w.join(t,i))}}}e.main&&r.push(w.join(t,e.main));for(let n of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(w.join(t,n));let s=r.filter(Se);return s.length>0?s.slice(0,1):r.slice(0,1)}function _(t,e){let r=[],s=new Set;for(let n of e){let o=n.replace(/\/$/,"").replace(/^\.\//,"");Sn(t,o,s,r)}return r}function Sn(t,e,r,s){if(!e.includes("*")){bn(t,e,r,s);return}let n=e.split("/");n.includes("**")?vn(t,n,r,s):kn(t,n,r,s)}function bn(t,e,r,s){let n=w.join(t,e);if(r.has(n)||!qt(n))return;r.add(n);let o=ct(t,n);o&&s.push(o)}function vn(t,e,r,s){let n=w.join(t,e[0]==="**"?"":e[0]??"");Xt(t,n,r,s)}function kn(t,e,r,s){let n=e.findIndex(a=>a.includes("*")),o=w.join(t,...e.slice(0,n)),i;try{i=Z.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let p=w.join(o,a.name);if(r.has(p))continue;r.add(p);let c=ct(t,p);c&&s.push(c)}}function Xt(t,e,r,s){let n;try{n=Z.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.join(e,o.name);if(Z.existsSync(w.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=ct(t,i);a&&s.push(a)}else Xt(t,i,r,s)}}var Zt={type:"npm",detect(t){let e=Yt.join(t,"package.json");if(!lt.existsSync(e))return null;let r;try{r=JSON.parse(lt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||lt.existsSync(Yt.join(t,"yarn.lock")))return null;let s=Array.isArray(r)?r:r.packages??[];return s.length===0?null:_(t,s)}};import O from"fs";import v from"path";var er={type:"nx",detect(t){return O.existsSync(v.join(t,"nx.json"))?tr(t,t,new Set,0).map(r=>Cn(t,r,v.join(r,"project.json"))).filter(r=>r!==null):null}};function tr(t,e,r,s){if(s>4)return[];let n;try{n=O.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.join(e,a);O.existsSync(v.join(p,"project.json"))&&!r.has(p)?(r.add(p),o.push(p)):o.push(...tr(t,p,r,s+1))}return o}function Cn(t,e,r){let s={};try{s=JSON.parse(O.readFileSync(r,"utf-8"))}catch{return null}let n=s.name,o,i,a=v.join(e,"package.json");if(O.existsSync(a))try{let p=JSON.parse(O.readFileSync(a,"utf-8"));n=p.name??n,o=p.main,i=p.exports}catch{}return n?{name:n,root:e,relativeRoot:v.relative(t,e),entryPoints:wn(e,s,o,i)}:null}function wn(t,e,r,s){let n=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=v.resolve(t,"../..");n.push(v.resolve(a,o)),n.push(v.resolve(t,o))}if(s){let a=s;if(typeof a=="string")n.push(v.join(t,a));else if(typeof a=="object"&&a!==null){let p=a["."];typeof p=="string"&&n.push(v.join(t,p))}}if(r&&n.push(v.join(t,r)),e.sourceRoot){let a=v.resolve(t,"../.."),p=v.resolve(a,e.sourceRoot);n.push(v.join(p,"index.ts"),v.join(p,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])n.push(v.join(t,a));let i=n.filter(Se);return i.length>0?i.slice(0,1):n.slice(0,1)}import rr from"fs";import Fn from"path";import{load as En}from"js-yaml";var sr={type:"pnpm",detect(t){let e=Fn.join(t,"pnpm-workspace.yaml");if(!rr.existsSync(e))return null;let r=[];try{r=En(rr.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return _(t,r)}};import Pn from"fs";import An from"path";var nr={type:"turborepo",detect(t){return Pn.existsSync(An.join(t,"turbo.json"))?[]:null}};import ut from"fs";import or from"path";var ir={type:"yarn",detect(t){if(!ut.existsSync(or.join(t,"yarn.lock")))return null;let e=or.join(t,"package.json");if(!ut.existsSync(e))return null;let r;try{r=JSON.parse(ut.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:_(t,s)}};var ar=[];function A(t){ar.push(t)}function pr(){return ar}A(nr);A(er);A(sr);A(ir);A(Zt);function ee(t,e=pr()){let r=Tn.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 te=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 cr=new Map;function j(t,e){cr.set(t,e)}function lr(t){return cr.get(t)}function ur(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function Mn(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var In=(t,e)=>!e.category||ur(t.category,e.category),Rn=(t,e)=>!e.type||ur(t.type,e.type),Nn=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,Dn=(t,e)=>!e.path||Mn(t.path,e.path),Gn=(t,e)=>e.isExternal===void 0?!0:t.imports.some(s=>s.isExternal)===e.isExternal,_n=(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)))},On=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(s=>s.name===r)),jn=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),Ln=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(n=>n.includes(e.importedBy)),Wn=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,zn=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,$n=(t,e)=>e.minSize===void 0||t.size>=e.minSize,Bn=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,Un=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,Kn=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,Jn=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,Hn=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,Qn=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,Vn=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,qn=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,Xn=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Yn=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Zn=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,eo=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,to=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,ro=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,so=(t,e,r)=>!e.any?.length||e.any.some(s=>re(t,s,r)),no=[In,Rn,Nn,Dn,Gn,_n,On,jn,Ln,Wn,zn,$n,Bn,Un,Kn,Jn,Hn,Qn,Vn,qn,Xn,Yn,Zn,eo,to,ro,so];function re(t,e,r){return no.every(s=>s(t,e,r))}function be(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=>re(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 fr(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 oo(t){let e=[];for(let r of t.split("|")){let s=r.trim();if(!s)continue;let n={};fr(n,s),Object.keys(n).length>0&&e.push(n)}return e}function ve(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=oo(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}fr(e,s)}return e}import wr from"fs/promises";import Mo from"path";import yt from"path";import Te from"typescript";import mr from"path";import dr from"typescript";import k from"typescript";var gr=new Set(["describe","test","it"]);function L(t){let e=[];for(let r of t.statements){if(!k.isExpressionStatement(r))continue;let s=r.expression;if(!k.isCallExpression(s))continue;let n=s.expression;k.isIdentifier(n)&&gr.has(n.text)&&e.push(s),k.isPropertyAccessExpression(n)&&k.isIdentifier(n.expression)&&gr.has(n.expression.text)&&e.push(s)}return e}function W(t,e,r){for(let s of t.arguments){if(!k.isObjectLiteralExpression(s))continue;let n=s.properties.find(o=>k.isPropertyAssignment(o)&&k.isIdentifier(o.name)&&o.name.text===e);if(!(!n||!k.isArrayLiteralExpression(n.initializer)))return n.initializer.elements.filter(k.isStringLiteral).map(o=>o.text)}return null}function z(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.isObjectLiteralExpression(i))continue;let a=i.properties.find(c=>k.isPropertyAssignment(c)&&k.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 $(t,e,r){let s=t.arguments;for(let n=1;n<s.length;n++){let o=s[n];if(!k.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(p=>k.isPropertyAssignment(p)&&k.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 B(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 U(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var E=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function io(t){return U(t.map(e=>`@${e}`))}function ao(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}var ke=class{name="cypress";canHandle(e){return E.has(mr.extname(e).toLowerCase())}apply(e,r,s){let n=dr.createSourceFile(mr.basename(e),r,dr.ScriptTarget.Latest,!0),o=L(n);if(o.length===0)return r;let i=W(o[0],"tags",n),a=[...s].sort();if(i!==null&&JSON.stringify(ao(i).sort())===JSON.stringify(a))return r;let p=o.flatMap(c=>{let m=s.length===0?$(c,"tags",n):z(c,"tags",io(a),n);return m?[m]:[]});return p.length>0?B(r,p):r}};import po from"path";var ft=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,gt=/^@([a-zA-Z0-9_-]+)/gm;function co(t){return["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
4
4
  `)+`
5
5
 
6
- `}function co(t){let e=new Set;ft.lastIndex=0;let r=ft.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=ft.exec(t);return e}var ke=class{name="gherkin";canHandle(e){return ao.extname(e).toLowerCase()===".feature"}apply(e,r,s){let n=r.replace(ut,""),o=co(n),i=s.filter(p=>!o.has(p)),a=i.length>0?po(i):"";return ut.test(r)?r.replace(ut,a):a?r.replace(/^(Feature:)/m,`${a}$1`):r}};function dr(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)}import lo from"path";var gt=/^\/\/go:build mokosh_[^\n]+\n/m,uo=/^package\s+\S+/m;function fo(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
7
- `}function go(t){let e=gt.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 Ce=class{name="go";canHandle(e){return lo.basename(e).endsWith("_test.go")}apply(e,r,s){let n=go(r),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return r;if(s.length===0)return r.replace(gt,"");let i=fo(o);if(n!==null)return r.replace(gt,i);let a=uo.exec(r);if(!a)return r;let p=a.index;return r.slice(0,p)+i+`
8
- `+r.slice(p)}};import mo from"path";var ho=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,mt=/^ \* @group (.+)$/gm;function yo(t){return["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
6
+ `}function lo(t){let e=new Set;gt.lastIndex=0;let r=gt.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=gt.exec(t);return e}var Ce=class{name="gherkin";canHandle(e){return po.extname(e).toLowerCase()===".feature"}apply(e,r,s){let n=r.replace(ft,""),o=lo(n),i=s.filter(p=>!o.has(p)),a=i.length>0?co(i):"";return ft.test(r)?r.replace(ft,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)}import uo from"path";var mt=/^\/\/go:build mokosh_[^\n]+\n/m,fo=/^package\s+\S+/m;function go(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
7
+ `}function mo(t){let e=mt.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 we=class{name="go";canHandle(e){return uo.basename(e).endsWith("_test.go")}apply(e,r,s){let n=mo(r),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return r;if(s.length===0)return r.replace(mt,"");let i=go(o);if(n!==null)return r.replace(mt,i);let a=fo.exec(r);if(!a)return r;let p=a.index;return r.slice(0,p)+i+`
8
+ `+r.slice(p)}};import ho from"path";var yo=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,dt=/^ \* @group (.+)$/gm;function xo(t){return["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
9
9
  `)+`
10
10
 
11
- `}function xo(t){let e=[];mt.lastIndex=0;let r=mt.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=mt.exec(t);return e}var we=class{name="jest";canHandle(e){return E.has(mo.extname(e).toLowerCase())}apply(e,r,s){let n=ho.exec(r),o=n?xo(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:yo(i)+a}};import hr from"path";import yr from"typescript";function So(t){return $(t.map(e=>`@${e}`))}function bo(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}var Fe=class{name="playwright";canHandle(e){return E.has(hr.extname(e).toLowerCase())}apply(e,r,s){let n=yr.createSourceFile(hr.basename(e),r,yr.ScriptTarget.Latest,!0),o=j(n);if(o.length===0)return r;let i=O(o[0],"tag",n),a=[...s].sort();if(i!==null&&JSON.stringify(bo(i).sort())===JSON.stringify(a))return r;let p=o.flatMap(c=>{let m=s.length===0?W(c,"tag",n):L(c,"tag",So(a),n);return m?[m]:[]});return p.length>0?z(r,p):r}};import vo from"path";var dt=/^pytestmark\s*=\s*.+$/m,ko=/^import pytest\s*$/m;function Co(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function wo(t){let e=dt.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 Ee=class{name="pytest";canHandle(e){return vo.extname(e).toLowerCase()===".py"}apply(e,r,s){let n=wo(r),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return r;if(s.length===0)return r.replace(dt,"").replace(/\n{3,}/g,`
11
+ `}function So(t){let e=[];dt.lastIndex=0;let r=dt.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=dt.exec(t);return e}var Fe=class{name="jest";canHandle(e){return E.has(ho.extname(e).toLowerCase())}apply(e,r,s){let n=yo.exec(r),o=n?So(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:xo(i)+a}};import yr from"path";import xr from"typescript";function bo(t){return U(t.map(e=>`@${e}`))}function vo(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}var Ee=class{name="playwright";canHandle(e){return E.has(yr.extname(e).toLowerCase())}apply(e,r,s){let n=xr.createSourceFile(yr.basename(e),r,xr.ScriptTarget.Latest,!0),o=L(n);if(o.length===0)return r;let i=W(o[0],"tag",n),a=[...s].sort();if(i!==null&&JSON.stringify(vo(i).sort())===JSON.stringify(a))return r;let p=o.flatMap(c=>{let m=s.length===0?$(c,"tag",n):z(c,"tag",bo(a),n);return m?[m]:[]});return p.length>0?B(r,p):r}};import ko from"path";var ht=/^pytestmark\s*=\s*.+$/m,Co=/^import pytest\s*$/m;function wo(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function Fo(t){let e=ht.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 Pe=class{name="pytest";canHandle(e){return ko.extname(e).toLowerCase()===".py"}apply(e,r,s){let n=Fo(r),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return r;if(s.length===0)return r.replace(ht,"").replace(/\n{3,}/g,`
12
12
 
13
- `);let i=Co(o);if(n!==null)return r.replace(dt,i);let a=ko.test(r),p=Fo(r),c=r.slice(0,p),m=r.slice(p),g=a?"":`import pytest
13
+ `);let i=wo(o);if(n!==null)return r.replace(ht,i);let a=Co.test(r),p=Eo(r),c=r.slice(0,p),m=r.slice(p),g=a?"":`import pytest
14
14
  `,h=c.endsWith(`
15
15
 
16
16
  `)?"":`
17
17
  `;return c+h+g+i+`
18
- `+m}};function Fo(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}import xr from"path";import Sr from"typescript";var Eo=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,Pe=class{name="vitest";canHandle(e){return E.has(xr.extname(e).toLowerCase())}apply(e,r,s){let n=r.replace(Eo,""),o=Sr.createSourceFile(xr.basename(e),n,Sr.ScriptTarget.Latest,!0),i=j(o);if(i.length===0)return n;let a=O(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?W(m,"tags",o):L(m,"tags",$(p),o);return g?[g]:[]});return c.length>0?z(n,c):n}};var br={vitest:()=>new Pe,playwright:()=>new Fe,cypress:()=>new ve,jest:()=>new we},Po={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function To(t){let e=Te.createSourceFile("detect.ts",t,Te.ScriptTarget.Latest,!0);for(let r of e.statements){if(!Te.isImportDeclaration(r)||!Te.isStringLiteral(r.moduleSpecifier))continue;let s=Po[r.moduleSpecifier.text];if(s)return s}return null}var yt=class{constructor(e,r,s){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=s}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return E.has(ht.extname(e).toLowerCase())}apply(e,r,s){let n=To(r)??this.matchOverride(e)??this.defaultFramework;return(br[n]??br.vitest)().apply(e,r,s)}matchOverride(e){let r=ht.relative(this.rootDir,e).split(ht.sep).join("/");for(let[s,n]of this.frameworkOverrides)if(dr(s,r))return n;return null}};function vr(t="vitest",e={},r=process.cwd()){return[new ke,new Ee,new Ce,new yt(r,t,Object.entries(e))]}function kr(t,e){return e.find(r=>r.canHandle(t))??null}var Mo=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Io=new Set(["import"]),Ro=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function No(t,e,r,s){let n;try{n=await Cr.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let o=kr(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 Cr.writeFile(t,i,"utf8"),{path:t,status:"updated"})}async function xt(t,e,r){let s=Q(e),n=s.tagApplier?.framework??"vitest",o=s.tagApplier?.frameworkOverrides??{},i=vr(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 b of p.tags)Io.has(b.kind)&&Mo.test(b.name)&&(Ro.has(b.name.toLowerCase())||c.has(b.name)||(c.add(b.name),m.push(b.name)));m.sort();let g=Ao.resolve(e,p.path),h=await No(g,m,r.dryRun,i);h.path=p.path,a.files.push(h),h.status==="updated"?a.updated++:h.status==="unchanged"?a.unchanged++:a.errors++}return a}var Ae=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};import ce from"fs";import C from"path";import Sa from"piscina";import{execFileSync as St}from"child_process";var Me=class{getChangedFiles(){try{let r=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(s=>{try{return St("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),[]}}},wr="%x00%H%x09%ae%x09%at",Fr=256*1024*1024;function Er(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 Pr(t){let e=new Map;try{let r=St("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${wr}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Fr});Er(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=St("git",["-C",t,"log","--name-status","-M",`--format=${wr}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Fr});Er(r,(s,n,o)=>{e.has(s)||e.set(s,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}import Ie from"fs";import Do from"path";import{load as Tr}from"js-yaml";function Ar(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function Go(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)),Ar(r)}).filter(Boolean)}function _o(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 jo(t){try{let e=Tr(t),r={dependencies:{}};for(let[s,n]of Object.entries(e))if(!(s==="__metadata"||!n?.version))for(let o of s.split(", ")){let i=Ar(o);i&&(r.dependencies[i]={version:n.version,...n.dependencies!==void 0&&{dependencies:n.dependencies}})}return r}catch{return null}}function Oo(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=Go(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 Lo(t){let e=Ie.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 Wo(t){let e=Ie.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=jo(e);if(r!==null)return r}return Oo(e)}function zo(t){let e=Ie.readFileSync(t,"utf-8"),r={dependencies:{}};try{let s=Tr(e);if(s.packages)for(let[n,o]of Object.entries(s.packages)){let{name:i,version:a}=_o(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 Mr(t){let e=[["package-lock.json",Lo],["yarn.lock",Wo],["pnpm-lock.yaml",zo]];for(let[r,s]of e){let n=Do.join(t,r);if(Ie.existsSync(n))return s(n)}return null}import Ir from"path";function A(t){switch(Ir.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 F(t){let e=Ir.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import $o from"coffeescript";function Bo(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 Uo(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function Ko(t,e){let r=e.source?.value;return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:F(r),type:"static"}:null}function Jo(t,e){let r=e.variable?.base?.value==="require",s=e.args?.[0]?.base?.value;return!r||!s?null:{fromPath:t,toPath:"",rawSpecifier:s,isStyle:F(s),type:"require"}}function Ho(t,e,r){let s=e.constructor?.name;if(s==="ImportDeclaration"){let n=Ko(t,e);n&&r.push(n)}else if(s==="Call"){let n=Jo(t,e);n&&r.push(n)}}function bt(t,e,r){if(!(!e||typeof e!="object")){Ho(t,e,r);for(let s in e){if(s==="locationData")continue;let n=e[s];if(!(!n||typeof n!="object"))if(Array.isArray(n))for(let o of n)bt(t,o,r);else bt(t,n,r)}}}function Rr(t,e){let r=Bo(e),s=Uo(t,r),n=[];try{bt(t,$o.nodes(e),n)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}import{AstBuilder as Qo,GherkinClassicTokenMatcher as Vo,Parser as qo}from"@cucumber/gherkin";import{IdGenerator as Xo}from"@cucumber/messages";var Yo=Xo.uuid();function vt(t,e){let r=new Set;try{let s=new Qo(Yo),n=new Vo,i=new qo(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"}}_("gherkin",vt);import Zo from"path";import{parser as ei}from"@lezer/go";var ti=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,ri=/^\/\/go:build\s+(.+)$/,si=/^\/\/\s*\+build\s+(.+)$/;function Dr(t,e){let r=[],s=new Map,n=new Set,o=new Set,a=ei.parse(e).cursor();do switch(a.name){case"LineComment":{let g=e.slice(a.from,a.to),h=g.match(ti);h?.[1]&&n.add(h[1]);let b=g.match(ri);b&&Nr(b[1],o);let I=g.match(si);I&&Nr(I[1],o);break}case"ImportSpec":{let g=a.node.getChild("String");if(g){let b=e.slice(g.from,g.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:b,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 h=e.slice(g.from,g.to);h!=="_"&&/^[A-Z]/.test(h)&&!s.has(h)&&s.set(h,{name:h})}break}}while(a.next());let p=r.some(g=>g.rawSpecifier==="testing"),c=Zo.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 Nr(t,e){for(let r of t.split(/[\s,&|!()]+/)){let s=r.trim();s&&s!=="ignore"&&e.add(s)}}import ni from"livescript";function B(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function oi(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 ii(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}var ai=new Set(["first_line","first_column","last_line","last_column","line","column"]);function pi(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let s=t.right?.value;if(typeof s=="string"){let n=B(s);return{fromPath:e,toPath:"",rawSpecifier:n,isStyle:F(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=B(n);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:F(o),type:"require"}}}}return null}function kt(t,e){if(!t||typeof t!="object")return[];let r=[],s=pi(t,e);s&&r.push(s);for(let n in t){if(ai.has(n))continue;let o=t[n];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)r.push(...kt(i,e));else r.push(...kt(o,e))}return r}function Gr(t,e){let r=oi(e),s=ii(t,r),n=[];try{n=kt(ni.ast(e),t)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}import ci from"luaparse";function li(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 fi(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=B(i.raw))}else if(n.type==="StringCallExpression"){let i=n.argument;i?.type==="StringLiteral"&&(o=B(i.raw))}o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:F(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 _r(t,e){let r=li(e),s=ui(t,r),n=[];try{let o=ci.parse(e);n=fi(o,t)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}var gi=["http://","https://","mailto:","//"],mi="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",di=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${mi})\\b`,"g"),jr;async function hi(){return jr??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),jr}function yi(t){let e=t.trim();return e.length===0||e.startsWith("#")||gi.some(r=>e.startsWith(r))}function xi(t,e){let r=t.match(di);return r?r.map(s=>({fromPath:e,toPath:"",rawSpecifier:s,isStyle:!1,type:"static"})):[]}function Or(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!yi(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(...xi(t.value,e)),Array.isArray(t.children))for(let s of t.children)Or(s,e,r)}async function Lr(t,e){let s=(await hi()).parse(e),n=[];Or(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"}}import Si from"path";import{parser as bi}from"@lezer/python";var vi=new Set(["pytest","unittest","nose","hypothesis"]);function Wr(t,e){let r=[],s=[],n=new Set,o=Si.basename(t).toLowerCase(),a=bi.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 ki(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=Ei(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 ki(t,e,r){let s=t.firstChild;return s?s.name==="from"?Ci(t,e,r):wi(t,e,r):[]}function Ci(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=Fi(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[re(r,o,i,!0)];let c=a===1?"./":"../".repeat(a-1);return p?[re(r,c+p.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[re(r,c.slice(0,-1),["*"],!1)]:i.map(m=>re(r,c+m,[m],!1))}function wi(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(re(r,o,["*"],!0))}n=n.nextSibling}return s}function Fi(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 re(t,e,r,s){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:s,type:"static",symbols:r.length>0?r:void 0}}function Ei(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=>vi.has(s.rawSpecifier))?"test":"logic"}import $r from"path";import l from"typescript";import d from"typescript";function Pi(t){let e=1;function r(s){switch(s.kind){case d.SyntaxKind.IfStatement:case d.SyntaxKind.ConditionalExpression:case d.SyntaxKind.ForStatement:case d.SyntaxKind.ForInStatement:case d.SyntaxKind.ForOfStatement:case d.SyntaxKind.WhileStatement:case d.SyntaxKind.DoStatement:case d.SyntaxKind.CatchClause:case d.SyntaxKind.CaseClause:e++;break;case d.SyntaxKind.BinaryExpression:{let n=s.operatorToken.kind;(n===d.SyntaxKind.AmpersandAmpersandToken||n===d.SyntaxKind.BarBarToken||n===d.SyntaxKind.QuestionQuestionToken)&&e++;break}}d.forEachChild(s,r)}return r(t),e}function Ti(t){let e=0;function r(s,n,o){if(d.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&&(d.isIfStatement(s.elseStatement)?r(s.elseStatement,n,!0):(e+=1,r(s.elseStatement,n+1,!1)));return}if(d.isForStatement(s)||d.isForInStatement(s)||d.isForOfStatement(s)||d.isWhileStatement(s)||d.isDoStatement(s)||d.isSwitchStatement(s)){e+=1+n,d.forEachChild(s,a=>r(a,n+1,!1));return}if(d.isCatchClause(s)){e+=1+n,d.forEachChild(s,a=>r(a,n,!1));return}if(d.isConditionalExpression(s)&&(e+=1),d.isBinaryExpression(s)){let a=s.operatorToken.kind;(a===d.SyntaxKind.AmpersandAmpersandToken||a===d.SyntaxKind.BarBarToken||a===d.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(n>0&&(d.isFunctionDeclaration(s)||d.isFunctionExpression(s)||d.isArrowFunction(s))){e+=1+n,d.forEachChild(s,a=>r(a,n+1,!1));return}d.forEachChild(s,a=>r(a,n,!1))}return r(t,0,!1),e}function Ct(t){return{complexity:Pi(t),cognitiveComplexity:Ti(t)}}import S from"typescript";var wt=new Set(["test","describe","it"]);function zr(t,e){Ai(t,e),Ii(t,e),Ri(t,e),Ni(t,e)}function Ai(t,e){if((S.isFunctionDeclaration(t)||S.isVariableDeclaration(t))&&t.name&&S.isIdentifier(t.name)&&Mi(t)){let r;if(S.isFunctionDeclaration(t))r="function";else{let s=t.initializer;r=s&&(S.isArrowFunction(s)||S.isFunctionExpression(s))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function Mi(t){if(S.isFunctionDeclaration(t))return S.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&S.isSourceFile(e.parent)}function Ii(t,e){if(!S.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 Ri(t,e){if(!S.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 Ni(t,e){if(S.isCallExpression(t)&&Di(t.expression))for(let r of t.arguments)S.isObjectLiteralExpression(r)&&Gi(r,e)}function Di(t){return S.isIdentifier(t)?wt.has(t.text):!!(S.isPropertyAccessExpression(t)&&(wt.has(t.name.text)||S.isIdentifier(t.expression)&&wt.has(t.expression.text)))}function Gi(t,e){for(let r of t.properties){if(!S.isPropertyAssignment(r)||!S.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:s}=r,n=S.isArrayLiteralExpression(s)?s.elements.filter(S.isStringLiteral):r.name.text==="tag"&&S.isStringLiteral(s)?[s]:[];for(let o of n)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function Ft(t,e,r){let s=[],n=new Map,o=new Set,i=l.createSourceFile(t,e,l.ScriptTarget.Latest,!0,r==="typescript"?l.ScriptKind.TSX:l.ScriptKind.JSX),a={filePath:t,imports:s,exports:n,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},p=fe=>{Li(fe,a),l.forEachChild(fe,p)};p(i);let c=qi(t,a);(c==="test"||c==="barrel")&&o.add({name:c,kind:"comment-marker"}),c!=="test"&&Xi(a,i);let m=i.statements[0],g=m?Ur(m):void 0,{complexity:h,cognitiveComplexity:b}=Ct(i),I=_i(i);return{imports:s,exports:Array.from(n.values()),tags:Array.from(o),category:c,rawCallEdges:a.rawCallEdges??[],complexity:h,cognitiveComplexity:b,...I.length>0?{functions:I}:{},...g!==void 0?{description:g}:{}}}function _i(t){let e=[],r=(n,o)=>{let{complexity:i,cognitiveComplexity:a}=Ct(o),p=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:n,line:p,complexity:i,cognitiveComplexity:a})},s=(n,o)=>{if(l.isFunctionDeclaration(n)&&n.name&&n.body?r(n.name.text,n):l.isVariableDeclaration(n)&&l.isIdentifier(n.name)&&n.initializer&&(l.isArrowFunction(n.initializer)||l.isFunctionExpression(n.initializer))?r(n.name.text,n.initializer):o&&l.isMethodDeclaration(n)&&l.isIdentifier(n.name)&&n.body?r(`${o}.${n.name.text}`,n):o&&l.isConstructorDeclaration(n)&&n.body?r(`${o}.constructor`,n):o&&l.isGetAccessorDeclaration(n)&&l.isIdentifier(n.name)&&n.body?r(`${o}.get ${n.name.text}`,n):o&&l.isSetAccessorDeclaration(n)&&l.isIdentifier(n.name)&&n.body&&r(`${o}.set ${n.name.text}`,n),l.isClassDeclaration(n)&&n.name){let i=n.name.text;l.forEachChild(n,a=>s(a,i));return}l.forEachChild(n,i=>s(i,o))};return s(t,void 0),e}function Br(t,e,r,s){let n={name:t},o=Ur(r);o!==void 0&&(n.doc=o);let i=ji(e);i!==void 0&&(n.flags=i);let a=Oi(e,s);return a!==void 0&&(n.signature=a),n}function Ur(t){let e=l.getJSDocCommentsAndTags(t);for(let r of e)if(l.isJSDoc(r)&&r.comment)return l.getTextOfJSDocComment(r.comment)||void 0}function ji(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=l.getJSDocTags(t).map(s=>s.tagName.text).filter(s=>e.has(s));return r.length>0?r:void 0}function Oi(t,e){let r=l.createPrinter({removeComments:!0}),s=n=>r.printNode(l.EmitHint.Unspecified,n,e);if(l.isFunctionDeclaration(t)||l.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.isVariableDeclaration(t)){if(t.type)return s(t.type);if(t.initializer&&(l.isArrowFunction(t.initializer)||l.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.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(l.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(l.isTypeAliasDeclaration(t))return s(t.type);if(l.isEnumDeclaration(t))return`enum ${t.name.text}`}function Li(t,e){Wi(t,e),zi(t,e),Bi(t,e),Ui(t,e),Vi(t,e),zr(t,e)}function Wi(t,e){if(!l.isSourceFile(t))return;let r=t.statements.filter(s=>!l.isEmptyStatement(s));e.totalStatements=r.length,e.exportStatements=r.filter(s=>l.isExportDeclaration(s)||l.isExportAssignment(s)||Et(s)).length}function zi(t,e){if(l.isJsxElement(t)||l.isJsxSelfClosingElement(t)||l.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(l.isFunctionDeclaration(t)||l.isMethodDeclaration(t)||l.isArrowFunction(t)||l.isClassDeclaration(t)||l.isVariableStatement(t)||l.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}l.isExportDeclaration(t)&&!$i(t)&&(e.hasTypesOnly=!1)}function $i(t){return t.isTypeOnly?!0:!t.exportClause||!l.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Bi(t,e){if(!l.isImportDeclaration(t)||!t.moduleSpecifier||!l.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(l.isNamedImports(t.importClause.namedBindings))for(let n of t.importClause.namedBindings.elements)r.push(n.name.text);else l.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:F(t.moduleSpecifier.text),type:s,symbols:r.length>0?r:void 0})}function Ui(t,e){l.isExportDeclaration(t)?Ki(t,e):l.isExportAssignment(t)?e.exports.set("default",{name:"default"}):Et(t)&&Qi(t,e)}function Ki(t,e){if(t.moduleSpecifier&&l.isStringLiteral(t.moduleSpecifier))Ji(t,t.moduleSpecifier.text,e);else if(t.exportClause&&l.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let s=r.name.text;e.exports.set(s,{name:s})}}function Ji(t,e,r){let s=Hi(t),n={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:F(e),type:"re-export"};s.length>0&&(n.symbols=s),r.imports.push(n)}function Hi(t){return t.exportClause?l.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Qi(t,e){if((l.isFunctionDeclaration(t)||l.isClassDeclaration(t)||l.isInterfaceDeclaration(t)||l.isTypeAliasDeclaration(t)||l.isEnumDeclaration(t))&&t.name){let s=t.name.text;e.exports.set(s,Br(s,t,t,e.sourceFile));return}if(l.isVariableStatement(t)){for(let s of t.declarationList.declarations)if(l.isIdentifier(s.name)){let n=s.name.text;e.exports.set(n,Br(n,s,t,e.sourceFile))}}}function Vi(t,e){if(!l.isCallExpression(t))return;let r=t.arguments[0];!r||!l.isStringLiteral(r)||(t.expression.kind===l.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:F(r.text),type:"dynamic"}):l.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:F(r.text),type:"require"}))}function qi(t,e){let r=$r.basename(t).toLowerCase(),s=$r.extname(t).toLowerCase();return H().some(o=>r.includes(o))?"test":_t(r)?"config":e.imports.some(o=>je().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>Le()?"barrel":"logic"}function Et(t){return l.canHaveModifiers(t)&&l.getModifiers(t)?.some(e=>e.kind===l.SyntaxKind.ExportKeyword)===!0}function Xi(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let s=new Map;for(let n of e.statements){if(!l.isImportDeclaration(n)||!l.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.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=Zi(n);if(o){let i=ea(n);i&&Re(i,o,s,r);continue}l.isClassDeclaration(n)&&n.name&&Yi(n,s,r)}}function Yi(t,e,r){let s=t.name.text;for(let n of t.members)l.isMethodDeclaration(n)&&n.body&&l.isIdentifier(n.name)?Re(n.body,`${s}.${n.name.text}`,e,r):l.isConstructorDeclaration(n)&&n.body&&Re(n.body,`${s}.constructor`,e,r)}function Zi(t){if(Et(t)){if(l.isFunctionDeclaration(t)&&t.name)return t.name.text;if(l.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(l.isIdentifier(e.name)&&e.initializer&&(l.isArrowFunction(e.initializer)||l.isFunctionExpression(e.initializer)))return e.name.text}}}function ea(t){if(l.isFunctionDeclaration(t))return t.body;if(l.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(l.isArrowFunction(e.initializer)||l.isFunctionExpression(e.initializer)))return e.initializer}}function Re(t,e,r,s){if(l.isCallExpression(t)&&l.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.forEachChild(t,n=>Re(n,e,r,s))}function Ne(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"}import Jr from"postcss";import*as ta from"postcss-less";var ra=ta,Hr=new Set(["reference","inline"]);function Kr(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function sa(t){let e=t.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function na(t,e){let r=t.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(r){let o=r[1]?.trim()??"",i=r[2]??"";if(!i)return null;let a=Hr.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...Kr(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",...Kr(n)?{isExternal:!0}:{}}:null}function oa(t,e){let r=[],s=/url\(['"]?([^'")]+)['"]?\)/g,n=s.exec(t);for(;n!==null;){let o=n[1]?.trim()??"";sa(o)&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),n=s.exec(t)}return r}function Qr(t,e){let r=[];return t.walk(s=>{if(s.type==="atrule"&&s.name==="import"){let n=na(s.params,e);n&&r.push(n)}s.type==="decl"&&r.push(...oa(s.value,e))}),r}function ia(t){return t.replace(/(?<!:)\/\/.*/g,"")}function aa(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=Hr.has(o)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}n=s.exec(t)}return r}function Vr(t,e){let r=Jr.parse(ia(t));return{imports:Qr(r,e),root:r}}function qr(t,e){try{let r=ra.parse(t);return{imports:Qr(r,e),root:r}}catch{return{imports:aa(t,e),root:Jr.parse("")}}}import{parse as pa}from"postcss-scss";function ca(t){return!!(t.startsWith("sass:")||t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||!t.startsWith(".")&&!t.startsWith("/")&&!t.startsWith("_"))}function la(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 Xr(t,e){let r=pa(t),s=[];return r.walk(n=>{if(n.type!=="atrule")return;let{name:o,params:i}=n;if(o!=="import"&&o!=="use"&&o!=="forward")return;let{specifier:a,alias:p}=la(i);if(!a)return;let c={fromPath:e,toPath:"",rawSpecifier:a,isStyle:!0,type:o==="forward"?"re-export":"static",...ca(a)?{isExternal:!0}:{}};p&&(c.symbols=[p]),s.push(c)}),{imports:s,root:r}}function Yr(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 Zr(t,e){if(e.length===0)return"ui";try{let r=_e("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 se(t,e){let r=A(t);if(r==="stylus"){let o=Yr(e,t);return{imports:o,exports:[],tags:[],category:Zr(e,o)}}if(r==="scss"){let{imports:o,root:i}=Xr(e,t);return{imports:o,exports:[],tags:[],category:Ne(i,o)}}if(r==="less"){let{imports:o,root:i}=qr(e,t);return{imports:o,exports:[],tags:[],category:Ne(i,o)}}let{imports:s,root:n}=Vr(e,t);return{imports:s,exports:[],tags:[],category:Ne(n,s)}}for(let[t,e]of[["javascript",(r,s)=>Ft(r,s,"javascript")],["typescript",(r,s)=>Ft(r,s,"typescript")],["css",se],["scss",se],["less",se],["stylus",se],["coffeescript",Rr],["livescript",Gr],["lua",_r],["python",Wr],["go",Dr],["gherkin",vt],["markdown",Lr]])_(t,e);async function es(t,e){let r=A(t),s=cr(r);return s?s(t,e):{imports:[],exports:[],tags:[],category:"other"}}import ts from"path";function ss(t,e){for(let r of t.values()){let s=e.get(r.path);s!==void 0&&(r.coveragePct=s)}}function ns(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 os(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 is(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 rs(t){return Math.round(t*1e4)/1e4}function as(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=rs(Math.min(1,o)),r.push(s.exportUsageRatio)}r.length>0&&(e.avgExportUsage=rs(r.reduce((s,n)=>s+n,0)/r.length),e.maxExportUsage=Math.max(...r))}}function Pt(t,e,r){e&&(t.some(s=>s.name===e&&s.kind===r)||t.push({name:e,kind:r}))}function ua(t,e){let r=e.toPath,s=ts.basename(r,ts.extname(r)).replace(/\.(test|spec)$/,"");Pt(t.tags,s,"import")}function fa(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)Pt(t.tags,r,"import")}function ga(t,e,r){let s=r.get(e.toPath);if(!(!s||s.category==="test"))for(let n of s.tags)n.kind==="comment-marker"&&Pt(t.tags,n.name,"comment-marker")}function ps(t){for(let e of t.values())if(e.category==="test")for(let r of e.imports)!r.toPath||r.isExternal||(ua(e,r),fa(e,r),ga(e,r,t))}import De from"fs";import M from"path";import us from"fs";import U from"path";var ne=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 ls(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let p=r.slice(o.length).replace(/^\//,"");return p?ls(U.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=us.readFileSync(U.join(e,"go.mod"),"utf-8"),o=ma(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 U.join(o,i)}}}};function ma(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("=>")){cs(a,e,n);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&cs(a.replace(/^replace\s+/,""),e,n)}return{mod:s,replaces:n}}function cs(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=U.isAbsolute(n)?n:U.resolve(e,n);r.set(o,i)}function ls(t){let e;try{e=us.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:U.join(t,s.name),isExternal:!1})).sort((s,n)=>s.path.localeCompare(n.path));return r.length>0?r:null}import da from"fs";import Tt from"path";var oe=class{extensions=[".lua"];resolve(e,r,s,n){let o=r.replace(/\./g,Tt.sep),i=[s,Tt.join(s,"lib")];for(let a of i){if(!da.existsSync(a))continue;let p=n(Tt.join(a,"_dummy.lua"),o);if(p)return[p]}return null}};import ha from"path";var ie=class{extensions=[".md",".mdx"];resolve(e,r,s,n){let o=n(ha.join(s,"_dummy"),`./${r}`);return o?[o]:null}};import ya from"fs";import At from"path";var ae=class{extensions=[".py"];resolve(e,r,s,n){let o=r.replace(/\./g,At.sep),i=At.join(s,`${o}.py`);if(fs(i))return[{path:i,isExternal:!1}];let a=At.join(s,o,"__init__.py");return fs(a)?[{path:a,isExternal:!1}]:null}};function fs(t){try{return ya.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import gs from"path";var xa=["~","http://","https://","//","data:","sass:"],pe=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,s,n){if(xa.some(m=>r.startsWith(m)))return null;let o=n(e,r);if(o)return[o];let i=gs.dirname(r),a=gs.basename(r),p=i==="."?`_${a}`:`${i}/_${a}`,c=n(e,p);return c?[c]:null}};var K=class{constructor(e,r={}){this.rootDir=e;this.workspaceMap=r.workspaceMap??new Map,this.tsconfigSearchPaths=r.tsconfigSearchPaths??[e],this.langResolvers=r.langResolvers??[new ae,new oe,new ne,new pe,new ie]}rootDir;workspaceMap;tsconfigSearchPaths;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=M.dirname(e),n=r.startsWith("/")?r:M.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=M.join(e,`index${r}`);if(this.isFile(o))return{path:o,isExternal:s};if(r===".py"){let i=M.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:s}}return null}isFile(e){try{return De.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){for(let r of this.tsconfigSearchPaths){let s=M.join(r,"tsconfig.json");if(De.existsSync(s))try{let o=JSON.parse(De.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=M.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=M.join(s,a);try{if(De.statSync(p,{throwIfNoEntry:!1})?.isFile())return{...o,path:p}}catch{}}return{...o,path:s}}let i=this.resolveLocalPath(M.join(s,"_dummy"),n.slice(1));return i?{...o,path:i.path}:null}return null}};var ba=["tests","test","__tests__","specs","spec"],ms=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),va=20;function ka(t,e){if(t.length===0)return e;let r=t.map(i=>C.dirname(i).split(C.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.sep)||C.sep,o=C.relative(e,n);return o.startsWith("..")||C.isAbsolute(o)?e:n}var le=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 K(e),this.lockFile=Mr(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.isAbsolute(s)?s:C.resolve(this.rootDir,s));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=Pr(this.rootDir));try{for(let s of r)this.enqueue(s);return await this.drain(),await this.processTestFiles(ka(r,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
18
+ `+m}};function Eo(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}import Sr from"path";import br from"typescript";var Po=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,Ae=class{name="vitest";canHandle(e){return E.has(Sr.extname(e).toLowerCase())}apply(e,r,s){let n=r.replace(Po,""),o=br.createSourceFile(Sr.basename(e),n,br.ScriptTarget.Latest,!0),i=L(o);if(i.length===0)return n;let a=W(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?$(m,"tags",o):z(m,"tags",U(p),o);return g?[g]:[]});return c.length>0?B(n,c):n}};var vr={vitest:()=>new Ae,playwright:()=>new Ee,cypress:()=>new ke,jest:()=>new Fe},Ao={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function To(t){let e=Te.createSourceFile("detect.ts",t,Te.ScriptTarget.Latest,!0);for(let r of e.statements){if(!Te.isImportDeclaration(r)||!Te.isStringLiteral(r.moduleSpecifier))continue;let s=Ao[r.moduleSpecifier.text];if(s)return s}return null}var xt=class{constructor(e,r,s){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=s}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return E.has(yt.extname(e).toLowerCase())}apply(e,r,s){let n=To(r)??this.matchOverride(e)??this.defaultFramework;return(vr[n]??vr.vitest)().apply(e,r,s)}matchOverride(e){let r=yt.relative(this.rootDir,e).split(yt.sep).join("/");for(let[s,n]of this.frameworkOverrides)if(hr(s,r))return n;return null}};function kr(t="vitest",e={},r=process.cwd()){return[new Ce,new Pe,new we,new xt(r,t,Object.entries(e))]}function Cr(t,e){return e.find(r=>r.canHandle(t))??null}var Io=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Ro=new Set(["import"]),No=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function Do(t,e,r,s){let n;try{n=await wr.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let o=Cr(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 wr.writeFile(t,i,"utf8"),{path:t,status:"updated"})}async function St(t,e,r){let s=V(e),n=s.tagApplier?.framework??"vitest",o=s.tagApplier?.frameworkOverrides??{},i=kr(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 b of p.tags)Ro.has(b.kind)&&Io.test(b.name)&&(No.has(b.name.toLowerCase())||c.has(b.name)||(c.add(b.name),m.push(b.name)));m.sort();let g=Mo.resolve(e,p.path),h=await Do(g,m,r.dryRun,i);h.path=p.path,a.files.push(h),h.status==="updated"?a.updated++:h.status==="unchanged"?a.unchanged++:a.errors++}return a}var Me=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};import le from"fs";import C from"path";import ba from"piscina";import{execFileSync as bt}from"child_process";var Ie=class{getChangedFiles(){try{let r=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(s=>{try{return bt("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),[]}}},Fr="%x00%H%x09%ae%x09%at",Er=256*1024*1024;function Pr(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 Ar(t){let e=new Map;try{let r=bt("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${Fr}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Er});Pr(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=bt("git",["-C",t,"log","--name-status","-M",`--format=${Fr}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Er});Pr(r,(s,n,o)=>{e.has(s)||e.set(s,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}import Re from"fs";import Go from"path";import{load as Tr}from"js-yaml";function Mr(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function _o(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)),Mr(r)}).filter(Boolean)}function Oo(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 jo(t){try{let e=Tr(t),r={dependencies:{}};for(let[s,n]of Object.entries(e))if(!(s==="__metadata"||!n?.version))for(let o of s.split(", ")){let i=Mr(o);i&&(r.dependencies[i]={version:n.version,...n.dependencies!==void 0&&{dependencies:n.dependencies}})}return r}catch{return null}}function Lo(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=_o(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 Wo(t){let e=Re.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 zo(t){let e=Re.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=jo(e);if(r!==null)return r}return Lo(e)}function $o(t){let e=Re.readFileSync(t,"utf-8"),r={dependencies:{}};try{let s=Tr(e);if(s.packages)for(let[n,o]of Object.entries(s.packages)){let{name:i,version:a}=Oo(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 Ir(t){let e=[["package-lock.json",Wo],["yarn.lock",zo],["pnpm-lock.yaml",$o]];for(let[r,s]of e){let n=Go.join(t,r);if(Re.existsSync(n))return s(n)}return null}import Rr from"path";function T(t){switch(Rr.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 F(t){let e=Rr.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import Bo from"coffeescript";function Uo(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 Ko(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function Jo(t,e){let r=e.source?.value;return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:F(r),type:"static"}:null}function Ho(t,e){let r=e.variable?.base?.value==="require",s=e.args?.[0]?.base?.value;return!r||!s?null:{fromPath:t,toPath:"",rawSpecifier:s,isStyle:F(s),type:"require"}}function Qo(t,e,r){let s=e.constructor?.name;if(s==="ImportDeclaration"){let n=Jo(t,e);n&&r.push(n)}else if(s==="Call"){let n=Ho(t,e);n&&r.push(n)}}function vt(t,e,r){if(!(!e||typeof e!="object")){Qo(t,e,r);for(let s in e){if(s==="locationData")continue;let n=e[s];if(!(!n||typeof n!="object"))if(Array.isArray(n))for(let o of n)vt(t,o,r);else vt(t,n,r)}}}function Nr(t,e){let r=Uo(e),s=Ko(t,r),n=[];try{vt(t,Bo.nodes(e),n)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}import{AstBuilder as Vo,GherkinClassicTokenMatcher as qo,Parser as Xo}from"@cucumber/gherkin";import{IdGenerator as Yo}from"@cucumber/messages";var Zo=Yo.uuid();function kt(t,e){let r=new Set;try{let s=new Vo(Zo),n=new qo,i=new Xo(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"}}j("gherkin",kt);import ei from"path";import{parser as ti}from"@lezer/go";var ri=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,si=/^\/\/go:build\s+(.+)$/,ni=/^\/\/\s*\+build\s+(.+)$/;function Gr(t,e){let r=[],s=new Map,n=new Set,o=new Set,a=ti.parse(e).cursor();do switch(a.name){case"LineComment":{let g=e.slice(a.from,a.to),h=g.match(ri);h?.[1]&&n.add(h[1]);let b=g.match(si);b&&Dr(b[1],o);let I=g.match(ni);I&&Dr(I[1],o);break}case"ImportSpec":{let g=a.node.getChild("String");if(g){let b=e.slice(g.from,g.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:b,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 h=e.slice(g.from,g.to);h!=="_"&&/^[A-Z]/.test(h)&&!s.has(h)&&s.set(h,{name:h})}break}}while(a.next());let p=r.some(g=>g.rawSpecifier==="testing"),c=ei.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 Dr(t,e){for(let r of t.split(/[\s,&|!()]+/)){let s=r.trim();s&&s!=="ignore"&&e.add(s)}}import oi from"livescript";function K(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function ii(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 ai(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}var pi=new Set(["first_line","first_column","last_line","last_column","line","column"]);function ci(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let s=t.right?.value;if(typeof s=="string"){let n=K(s);return{fromPath:e,toPath:"",rawSpecifier:n,isStyle:F(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=K(n);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:F(o),type:"require"}}}}return null}function Ct(t,e){if(!t||typeof t!="object")return[];let r=[],s=ci(t,e);s&&r.push(s);for(let n in t){if(pi.has(n))continue;let o=t[n];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)r.push(...Ct(i,e));else r.push(...Ct(o,e))}return r}function _r(t,e){let r=ii(e),s=ai(t,r),n=[];try{n=Ct(oi.ast(e),t)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}import li from"luaparse";function ui(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 fi(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function gi(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=K(i.raw))}else if(n.type==="StringCallExpression"){let i=n.argument;i?.type==="StringLiteral"&&(o=K(i.raw))}o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:F(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 Or(t,e){let r=ui(e),s=fi(t,r),n=[];try{let o=li.parse(e);n=gi(o,t)}catch{}return{imports:n,exports:[],tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:s}}var mi=["http://","https://","mailto:","//"],di="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",hi=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${di})\\b`,"g"),jr;async function yi(){return jr??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),jr}function xi(t){let e=t.trim();return e.length===0||e.startsWith("#")||mi.some(r=>e.startsWith(r))}function Si(t,e){let r=t.match(hi);return r?r.map(s=>({fromPath:e,toPath:"",rawSpecifier:s,isStyle:!1,type:"static"})):[]}function Lr(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!xi(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(...Si(t.value,e)),Array.isArray(t.children))for(let s of t.children)Lr(s,e,r)}async function Wr(t,e){let s=(await yi()).parse(e),n=[];Lr(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"}}import bi from"path";import{parser as vi}from"@lezer/python";var ki=new Set(["pytest","unittest","nose","hypothesis"]);function zr(t,e){let r=[],s=[],n=new Set,o=bi.basename(t).toLowerCase(),a=vi.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 Ci(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=Pi(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 Ci(t,e,r){let s=t.firstChild;return s?s.name==="from"?wi(t,e,r):Fi(t,e,r):[]}function wi(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=Ei(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[se(r,o,i,!0)];let c=a===1?"./":"../".repeat(a-1);return p?[se(r,c+p.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[se(r,c.slice(0,-1),["*"],!1)]:i.map(m=>se(r,c+m,[m],!1))}function Fi(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(se(r,o,["*"],!0))}n=n.nextSibling}return s}function Ei(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 se(t,e,r,s){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:s,type:"static",symbols:r.length>0?r:void 0}}function Pi(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=>ki.has(s.rawSpecifier))?"test":"logic"}import Br from"path";import l from"typescript";import d from"typescript";function Ai(t){let e=1;function r(s){switch(s.kind){case d.SyntaxKind.IfStatement:case d.SyntaxKind.ConditionalExpression:case d.SyntaxKind.ForStatement:case d.SyntaxKind.ForInStatement:case d.SyntaxKind.ForOfStatement:case d.SyntaxKind.WhileStatement:case d.SyntaxKind.DoStatement:case d.SyntaxKind.CatchClause:case d.SyntaxKind.CaseClause:e++;break;case d.SyntaxKind.BinaryExpression:{let n=s.operatorToken.kind;(n===d.SyntaxKind.AmpersandAmpersandToken||n===d.SyntaxKind.BarBarToken||n===d.SyntaxKind.QuestionQuestionToken)&&e++;break}}d.forEachChild(s,r)}return r(t),e}function Ti(t){let e=0;function r(s,n,o){if(d.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&&(d.isIfStatement(s.elseStatement)?r(s.elseStatement,n,!0):(e+=1,r(s.elseStatement,n+1,!1)));return}if(d.isForStatement(s)||d.isForInStatement(s)||d.isForOfStatement(s)||d.isWhileStatement(s)||d.isDoStatement(s)||d.isSwitchStatement(s)){e+=1+n,d.forEachChild(s,a=>r(a,n+1,!1));return}if(d.isCatchClause(s)){e+=1+n,d.forEachChild(s,a=>r(a,n,!1));return}if(d.isConditionalExpression(s)&&(e+=1),d.isBinaryExpression(s)){let a=s.operatorToken.kind;(a===d.SyntaxKind.AmpersandAmpersandToken||a===d.SyntaxKind.BarBarToken||a===d.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(n>0&&(d.isFunctionDeclaration(s)||d.isFunctionExpression(s)||d.isArrowFunction(s))){e+=1+n,d.forEachChild(s,a=>r(a,n+1,!1));return}d.forEachChild(s,a=>r(a,n,!1))}return r(t,0,!1),e}function wt(t){return{complexity:Ai(t),cognitiveComplexity:Ti(t)}}import S from"typescript";var Ft=new Set(["test","describe","it"]);function $r(t,e){Mi(t,e),Ri(t,e),Ni(t,e),Di(t,e)}function Mi(t,e){if((S.isFunctionDeclaration(t)||S.isVariableDeclaration(t))&&t.name&&S.isIdentifier(t.name)&&Ii(t)){let r;if(S.isFunctionDeclaration(t))r="function";else{let s=t.initializer;r=s&&(S.isArrowFunction(s)||S.isFunctionExpression(s))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function Ii(t){if(S.isFunctionDeclaration(t))return S.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&S.isSourceFile(e.parent)}function Ri(t,e){if(!S.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 Ni(t,e){if(!S.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 Di(t,e){if(S.isCallExpression(t)&&Gi(t.expression))for(let r of t.arguments)S.isObjectLiteralExpression(r)&&_i(r,e)}function Gi(t){return S.isIdentifier(t)?Ft.has(t.text):!!(S.isPropertyAccessExpression(t)&&(Ft.has(t.name.text)||S.isIdentifier(t.expression)&&Ft.has(t.expression.text)))}function _i(t,e){for(let r of t.properties){if(!S.isPropertyAssignment(r)||!S.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:s}=r,n=S.isArrayLiteralExpression(s)?s.elements.filter(S.isStringLiteral):r.name.text==="tag"&&S.isStringLiteral(s)?[s]:[];for(let o of n)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function Et(t,e,r){let s=[],n=new Map,o=new Set,i=l.createSourceFile(t,e,l.ScriptTarget.Latest,!0,r==="typescript"?l.ScriptKind.TSX:l.ScriptKind.JSX),a={filePath:t,imports:s,exports:n,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},p=ge=>{Wi(ge,a),l.forEachChild(ge,p)};p(i);let c=Xi(t,a);(c==="test"||c==="barrel")&&o.add({name:c,kind:"comment-marker"}),c!=="test"&&Yi(a,i);let m=i.statements[0],g=m?Kr(m):void 0,{complexity:h,cognitiveComplexity:b}=wt(i),I=Oi(i);return{imports:s,exports:Array.from(n.values()),tags:Array.from(o),category:c,rawCallEdges:a.rawCallEdges??[],complexity:h,cognitiveComplexity:b,...I.length>0?{functions:I}:{},...g!==void 0?{description:g}:{}}}function Oi(t){let e=[],r=(n,o)=>{let{complexity:i,cognitiveComplexity:a}=wt(o),p=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:n,line:p,complexity:i,cognitiveComplexity:a})},s=(n,o)=>{if(l.isFunctionDeclaration(n)&&n.name&&n.body?r(n.name.text,n):l.isVariableDeclaration(n)&&l.isIdentifier(n.name)&&n.initializer&&(l.isArrowFunction(n.initializer)||l.isFunctionExpression(n.initializer))?r(n.name.text,n.initializer):o&&l.isMethodDeclaration(n)&&l.isIdentifier(n.name)&&n.body?r(`${o}.${n.name.text}`,n):o&&l.isConstructorDeclaration(n)&&n.body?r(`${o}.constructor`,n):o&&l.isGetAccessorDeclaration(n)&&l.isIdentifier(n.name)&&n.body?r(`${o}.get ${n.name.text}`,n):o&&l.isSetAccessorDeclaration(n)&&l.isIdentifier(n.name)&&n.body&&r(`${o}.set ${n.name.text}`,n),l.isClassDeclaration(n)&&n.name){let i=n.name.text;l.forEachChild(n,a=>s(a,i));return}l.forEachChild(n,i=>s(i,o))};return s(t,void 0),e}function Ur(t,e,r,s){let n={name:t},o=Kr(r);o!==void 0&&(n.doc=o);let i=ji(e);i!==void 0&&(n.flags=i);let a=Li(e,s);return a!==void 0&&(n.signature=a),n}function Kr(t){let e=l.getJSDocCommentsAndTags(t);for(let r of e)if(l.isJSDoc(r)&&r.comment)return l.getTextOfJSDocComment(r.comment)||void 0}function ji(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=l.getJSDocTags(t).map(s=>s.tagName.text).filter(s=>e.has(s));return r.length>0?r:void 0}function Li(t,e){let r=l.createPrinter({removeComments:!0}),s=n=>r.printNode(l.EmitHint.Unspecified,n,e);if(l.isFunctionDeclaration(t)||l.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.isVariableDeclaration(t)){if(t.type)return s(t.type);if(t.initializer&&(l.isArrowFunction(t.initializer)||l.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.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(l.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(l.isTypeAliasDeclaration(t))return s(t.type);if(l.isEnumDeclaration(t))return`enum ${t.name.text}`}function Wi(t,e){zi(t,e),$i(t,e),Ui(t,e),Ki(t,e),qi(t,e),$r(t,e)}function zi(t,e){if(!l.isSourceFile(t))return;let r=t.statements.filter(s=>!l.isEmptyStatement(s));e.totalStatements=r.length,e.exportStatements=r.filter(s=>l.isExportDeclaration(s)||l.isExportAssignment(s)||Pt(s)).length}function $i(t,e){if(l.isJsxElement(t)||l.isJsxSelfClosingElement(t)||l.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(l.isFunctionDeclaration(t)||l.isMethodDeclaration(t)||l.isArrowFunction(t)||l.isClassDeclaration(t)||l.isVariableStatement(t)||l.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}l.isExportDeclaration(t)&&!Bi(t)&&(e.hasTypesOnly=!1)}function Bi(t){return t.isTypeOnly?!0:!t.exportClause||!l.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Ui(t,e){if(!l.isImportDeclaration(t)||!t.moduleSpecifier||!l.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(l.isNamedImports(t.importClause.namedBindings))for(let n of t.importClause.namedBindings.elements)r.push(n.name.text);else l.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:F(t.moduleSpecifier.text),type:s,symbols:r.length>0?r:void 0})}function Ki(t,e){l.isExportDeclaration(t)?Ji(t,e):l.isExportAssignment(t)?e.exports.set("default",{name:"default"}):Pt(t)&&Vi(t,e)}function Ji(t,e){if(t.moduleSpecifier&&l.isStringLiteral(t.moduleSpecifier))Hi(t,t.moduleSpecifier.text,e);else if(t.exportClause&&l.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let s=r.name.text;e.exports.set(s,{name:s})}}function Hi(t,e,r){let s=Qi(t),n={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:F(e),type:"re-export"};s.length>0&&(n.symbols=s),r.imports.push(n)}function Qi(t){return t.exportClause?l.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Vi(t,e){if((l.isFunctionDeclaration(t)||l.isClassDeclaration(t)||l.isInterfaceDeclaration(t)||l.isTypeAliasDeclaration(t)||l.isEnumDeclaration(t))&&t.name){let s=t.name.text;e.exports.set(s,Ur(s,t,t,e.sourceFile));return}if(l.isVariableStatement(t)){for(let s of t.declarationList.declarations)if(l.isIdentifier(s.name)){let n=s.name.text;e.exports.set(n,Ur(n,s,t,e.sourceFile))}}}function qi(t,e){if(!l.isCallExpression(t))return;let r=t.arguments[0];!r||!l.isStringLiteral(r)||(t.expression.kind===l.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:F(r.text),type:"dynamic"}):l.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:F(r.text),type:"require"}))}function Xi(t,e){let r=Br.basename(t).toLowerCase(),s=Br.extname(t).toLowerCase();return Q().some(o=>r.includes(o))?"test":Ot(r)?"config":e.imports.some(o=>je().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>We()?"barrel":"logic"}function Pt(t){return l.canHaveModifiers(t)&&l.getModifiers(t)?.some(e=>e.kind===l.SyntaxKind.ExportKeyword)===!0}function Yi(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let s=new Map;for(let n of e.statements){if(!l.isImportDeclaration(n)||!l.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.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=ea(n);if(o){let i=ta(n);i&&Ne(i,o,s,r);continue}l.isClassDeclaration(n)&&n.name&&Zi(n,s,r)}}function Zi(t,e,r){let s=t.name.text;for(let n of t.members)l.isMethodDeclaration(n)&&n.body&&l.isIdentifier(n.name)?Ne(n.body,`${s}.${n.name.text}`,e,r):l.isConstructorDeclaration(n)&&n.body&&Ne(n.body,`${s}.constructor`,e,r)}function ea(t){if(Pt(t)){if(l.isFunctionDeclaration(t)&&t.name)return t.name.text;if(l.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(l.isIdentifier(e.name)&&e.initializer&&(l.isArrowFunction(e.initializer)||l.isFunctionExpression(e.initializer)))return e.name.text}}}function ta(t){if(l.isFunctionDeclaration(t))return t.body;if(l.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(l.isArrowFunction(e.initializer)||l.isFunctionExpression(e.initializer)))return e.initializer}}function Ne(t,e,r,s){if(l.isCallExpression(t)&&l.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.forEachChild(t,n=>Ne(n,e,r,s))}function De(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"}import Hr from"postcss";import*as ra from"postcss-less";var sa=ra,Qr=new Set(["reference","inline"]);function Jr(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function na(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=Qr.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...Jr(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",...Jr(n)?{isExternal:!0}:{}}:null}function ia(t,e){let r=[],s=/url\(['"]?([^'")]+)['"]?\)/g,n=s.exec(t);for(;n!==null;){let o=n[1]?.trim()??"";na(o)&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),n=s.exec(t)}return r}function Vr(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(...ia(s.value,e))}),r}function aa(t){return t.replace(/(?<!:)\/\/.*/g,"")}function pa(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=Qr.has(o)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}n=s.exec(t)}return r}function qr(t,e){let r=Hr.parse(aa(t));return{imports:Vr(r,e),root:r}}function Xr(t,e){try{let r=sa.parse(t);return{imports:Vr(r,e),root:r}}catch{return{imports:pa(t,e),root:Hr.parse("")}}}import{parse as ca}from"postcss-scss";function la(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 Yr(t,e){let r=ca(t),s=[];return r.walk(n=>{if(n.type!=="atrule")return;let{name:o,params:i}=n;if(o!=="import"&&o!=="use"&&o!=="forward")return;let{specifier:a,alias:p}=ua(i);if(!a)return;let c={fromPath:e,toPath:"",rawSpecifier:a,isStyle:!0,type:o==="forward"?"re-export":"static",...la(a)?{isExternal:!0}:{}};p&&(c.symbols=[p]),s.push(c)}),{imports:s,root:r}}function Zr(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 es(t,e){if(e.length===0)return"ui";try{let r=Oe("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 ne(t,e){let r=T(t);if(r==="stylus"){let o=Zr(e,t);return{imports:o,exports:[],tags:[],category:es(e,o)}}if(r==="scss"){let{imports:o,root:i}=Yr(e,t);return{imports:o,exports:[],tags:[],category:De(i,o)}}if(r==="less"){let{imports:o,root:i}=Xr(e,t);return{imports:o,exports:[],tags:[],category:De(i,o)}}let{imports:s,root:n}=qr(e,t);return{imports:s,exports:[],tags:[],category:De(n,s)}}for(let[t,e]of[["javascript",(r,s)=>Et(r,s,"javascript")],["typescript",(r,s)=>Et(r,s,"typescript")],["css",ne],["scss",ne],["less",ne],["stylus",ne],["coffeescript",Nr],["livescript",_r],["lua",Or],["python",zr],["go",Gr],["gherkin",kt],["markdown",Wr]])j(t,e);async function ts(t,e){let r=T(t),s=lr(r);return s?s(t,e):{imports:[],exports:[],tags:[],category:"other"}}import rs from"path";function ns(t,e){for(let r of t.values()){let s=e.get(r.path);s!==void 0&&(r.coveragePct=s)}}function os(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 is(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 as(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 ss(t){return Math.round(t*1e4)/1e4}function ps(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=ss(Math.min(1,o)),r.push(s.exportUsageRatio)}r.length>0&&(e.avgExportUsage=ss(r.reduce((s,n)=>s+n,0)/r.length),e.maxExportUsage=Math.max(...r))}}function At(t,e,r){e&&(t.some(s=>s.name===e&&s.kind===r)||t.push({name:e,kind:r}))}function fa(t,e){let r=e.toPath,s=rs.basename(r,rs.extname(r)).replace(/\.(test|spec)$/,"");At(t.tags,s,"import")}function ga(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)At(t.tags,r,"import")}function ma(t,e,r){let s=r.get(e.toPath);if(!(!s||s.category==="test"))for(let n of s.tags)n.kind==="comment-marker"&&At(t.tags,n.name,"comment-marker")}function cs(t){for(let e of t.values())if(e.category==="test")for(let r of e.imports)!r.toPath||r.isExternal||(fa(e,r),ga(e,r),ma(e,r,t))}import Ge from"fs";import M from"path";import fs from"fs";import J from"path";var oe=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 us(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let p=r.slice(o.length).replace(/^\//,"");return p?us(J.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=fs.readFileSync(J.join(e,"go.mod"),"utf-8"),o=da(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 J.join(o,i)}}}};function da(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("=>")){ls(a,e,n);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&ls(a.replace(/^replace\s+/,""),e,n)}return{mod:s,replaces:n}}function ls(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=J.isAbsolute(n)?n:J.resolve(e,n);r.set(o,i)}function us(t){let e;try{e=fs.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:J.join(t,s.name),isExternal:!1})).sort((s,n)=>s.path.localeCompare(n.path));return r.length>0?r:null}import ha from"fs";import Tt from"path";var ie=class{extensions=[".lua"];resolve(e,r,s,n){let o=r.replace(/\./g,Tt.sep),i=[s,Tt.join(s,"lib")];for(let a of i){if(!ha.existsSync(a))continue;let p=n(Tt.join(a,"_dummy.lua"),o);if(p)return[p]}return null}};import ya from"path";var ae=class{extensions=[".md",".mdx"];resolve(e,r,s,n){let o=n(ya.join(s,"_dummy"),`./${r}`);return o?[o]:null}};import xa from"fs";import Mt from"path";var pe=class{extensions=[".py"];resolve(e,r,s,n){let o=r.replace(/\./g,Mt.sep),i=Mt.join(s,`${o}.py`);if(gs(i))return[{path:i,isExternal:!1}];let a=Mt.join(s,o,"__init__.py");return gs(a)?[{path:a,isExternal:!1}]:null}};function gs(t){try{return xa.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import ms from"path";var Sa=["~","http://","https://","//","data:","sass:"],ce=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,s,n){if(Sa.some(m=>r.startsWith(m)))return null;let o=n(e,r);if(o)return[o];let i=ms.dirname(r),a=ms.basename(r),p=i==="."?`_${a}`:`${i}/_${a}`,c=n(e,p);return c?[c]:null}};var D=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 pe,new ie,new oe,new ce,new ae]}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=M.dirname(e),n=r.startsWith("/")?r:M.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=M.join(e,`index${r}`);if(this.isFile(o))return{path:o,isExternal:s};if(r===".py"){let i=M.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:s}}return null}isFile(e){try{return Ge.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=M.join(r,"tsconfig.json");if(Ge.existsSync(s))try{let o=JSON.parse(Ge.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=M.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=M.join(s,a);try{if(Ge.statSync(p,{throwIfNoEntry:!1})?.isFile())return{...o,path:p}}catch{}}return{...o,path:s}}let i=this.resolveLocalPath(M.join(s,"_dummy"),n.slice(1));return i?{...o,path:i.path}:null}return null}};var va=["tests","test","__tests__","specs","spec"],ds=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),ka=20;function Ca(t,e){if(t.length===0)return e;let r=t.map(i=>C.dirname(i).split(C.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.sep)||C.sep,o=C.relative(e,n);return o.startsWith("..")||C.isAbsolute(o)?e:n}var ue=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 D(e),this.lockFile=Ir(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.isAbsolute(s)?s:C.resolve(this.rootDir,s));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=Ar(this.rootDir));try{for(let s of r)this.enqueue(s);return await this.drain(),await this.processTestFiles(Ca(r,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
24
24
  Done. Total processed: ${this.visited.size} nodes.
25
- `),ps(this.graph.nodes),os(this.graph.nodes),as(this.graph.nodes),is(this.graph.nodes),this.coverageMap.size>0&&ss(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??va;if(!(r>0&&!this.hasAtLeastFiles(this.rootDir,r)))try{let s=C.join(u,"parse-worker.js");this.pool=new Sa({filename:s,...e.maxThreads!==void 0?{maxThreads:e.maxThreads}:{}})}catch(s){process.stderr.write(`
25
+ `),cs(this.graph.nodes),is(this.graph.nodes),ps(this.graph.nodes),as(this.graph.nodes),this.coverageMap.size>0&&ns(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??ka;if(!(r>0&&!this.hasAtLeastFiles(this.rootDir,r)))try{let s=C.join(u,"parse-worker.js");this.pool=new ba({filename:s,...e.maxThreads!==void 0?{maxThreads:e.maxThreads}:{}})}catch(s){process.stderr.write(`
26
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=ce.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())ms.has(a.name)||n.push(C.join(o,a.name));else if(a.isFile()&&(s++,s>=r))return!0}return s>=r}async processTestFiles(e){let r=H(),s=o=>r.some(i=>o.name.includes(i));this.walkProject(e,s);let n=e;for(;n!==this.rootDir;){let o=C.dirname(n);if(o===n)break;for(let i of ba){let a=C.join(o,i);try{ce.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=ce.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of s){let o=C.join(e,n.name);n.isDirectory()?ms.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=ce.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let s=C.relative(this.rootDir,e),n=await this.getNode(e,s,r);n.imports=await this.resolveImports(e,n.imports),ns(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=ce.readFileSync(e,"utf-8");try{return await this.parseContent(e,s)}catch(n){return process.stderr.write(`
27
+ `),this.pool=null}}hasAtLeastFiles(e,r){let s=0,n=[e];for(;n.length>0;){let o=n.pop(),i;try{i=le.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())ds.has(a.name)||n.push(C.join(o,a.name));else if(a.isFile()&&(s++,s>=r))return!0}return s>=r}async processTestFiles(e){let r=Q(),s=o=>r.some(i=>o.name.includes(i));this.walkProject(e,s);let n=e;for(;n!==this.rootDir;){let o=C.dirname(n);if(o===n)break;for(let i of va){let a=C.join(o,i);try{le.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=le.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of s){let o=C.join(e,n.name);n.isDirectory()?ds.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=le.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let s=C.relative(this.rootDir,e),n=await this.getNode(e,s,r);n.imports=await this.resolveImports(e,n.imports),os(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=le.readFileSync(e,"utf-8");try{return await this.parseContent(e,s)}catch(n){return process.stderr.write(`
28
28
  Warning: failed to parse ${r}: ${n}
29
- `),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):es(e,r)}makeStubNode(e,r,s){return{path:r,type:A(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.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:h,functions:b}=n;return{path:r,type:A(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}:{},...h!==void 0?{cognitiveComplexity:h}:{},...b!==void 0?{functions:b}:{}}}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.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 ds(t,e){return{identifier:e?.identifier??new Ae,featureMap:e?.featureDetection===!1?new Map:R(t.nodes,e?.featureDetection??void 0)}}function hs(t,e,r,s,n){for(let o of e){let i=t.nodes.get(o);if(!i)continue;let a=new N(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 Mt(t,e,r){let{identifier:s,featureMap:n}=ds(t,r),o=new Set;for(let i of e){let a=n.get(i);a&&o.add(a.tag)}return hs(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 It(t,e,r){let{identifier:s,featureMap:n}=ds(t,r),o=new Set;return hs(t,e,n,()=>{},i=>{s.isTestNode(i)&&o.add(i.path)}),Array.from(o)}import Ca from"fs";import ue from"path";async function ys(t,e,r=null,s={}){let n=s.silent?void 0:i=>{process.stderr.write(`Processed ${i} files...\r`)};return await new le(ue.resolve(t),r,void 0,n,s.gitStats??!1,s.coverageMap??new Map,s.parallelParsing??!0).build(e)}async function xs(t,e={}){let r=ue.resolve(t),s=Z(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 ee(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 le(r,null,new K(r,{workspaceMap:o,tsconfigSearchPaths:[a.root,r]}),p,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,m)}return i}function Ss(t,e={}){let r=[],s=new Set([...e.ignoreDirs??$e,...e.additionalIgnoreDirs??[]]),n=new Set([...e.extensions??Be,...e.additionalExtensions??[]]);function o(i){try{let a=Ca.readdirSync(i,{withFileTypes:!0});for(let p of a){let c=ue.join(i,p.name);p.isDirectory()?s.has(p.name)||o(c):p.isFile()&&n.has(ue.extname(p.name).toLowerCase())&&r.push(ue.relative(t,c))}}catch{}}return o(t),r}var bs=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var Ge=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 ys(e,r,this.graphs.get(e)??null,{gitStats:n?.gitStats??!1,coverageMap:s,parallelParsing:n?.parallelParsing});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 xs(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=Ve(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=wa.watch(e,{recursive:!0},(s,n)=>{!n||bs.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,{gitStats:r?.gitStats??!1,parallelParsing:r?.parallelParsing})}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}};import J from"path";import Fa from"fs";import Ea from"os";import Rt from"path";function y(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function vs(t){if(!Rt.isAbsolute(t))throw new Error("root must be an absolute path");let e=Rt.resolve(t),r=Ea.homedir();if(e!==r&&!e.startsWith(r+Rt.sep))throw new Error("root must be within the user home directory");let s;try{s=Fa.statSync(e)}catch{throw new Error("root does not exist")}if(!s.isDirectory())throw new Error("root is not a directory")}async function ks(t,e){let{root:r,entryPoints:s}=e;if(!t.isConfigured(r)){let g=Q(r,{allowJs:!1});ze(g),t.storeConfig(r,g)}if(s.length===0){let g=Z(r);if(g.type!=="none"){let h=t.getConfig(r),b=await t.getOrBuildWorkspace(r,{gitStats:h?.gitStats??!1,parallelParsing:h?.parallelParsing});t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let I=Array.from(b.packages.values()).map(({graph:fe,pkg:Dt})=>({package:Dt.name,relativeRoot:Dt.relativeRoot,nodeCount:fe.nodes.size}));return y({monorepoType:g.type,packageCount:b.packages.size,packages:I})}}let n=s.map(g=>J.resolve(r,g)),o=t.getConfig(r),i=o?.coverageReportPath?Ue(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((g,h)=>(g[h.category]=(g[h.category]??0)+1,g),{}),m=a.findCycles();return y({nodeCount:p.nodes.length,categories:c,cycles:m})}async function Cs(t,e){let{root:r,file:s,depth:n=1}=e,o=await t.ensureFresh(r),i=Xe(o,s,n);return y({file:s,dependencies:i})}async function ws(t,e){let{root:r,file:s}=e,n=await t.ensureFresh(r),o=Ye(n,s);return y({file:s,dependents:o})}async function Fs(t,e){let{root:r,file:s,testsOnly:n=!1,cached:o=!1,changedSymbols:i}=e,a=await t.ensureFresh(r);if(o){let c=t.getOrBuildChangeImpact(r),m=qe(c,s),g=n?m.filter(h=>a.nodes.get(h)?.category==="test"):m;return y({file:s,affected:g,count:g.length})}let p=Ze(a,s,{testsOnly:n,changedSymbols:i});return y({file:s,affected:p,count:p.length})}async function Es(t,e){let{root:r,file:s,depth:n=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=et(i,s,{depth:n,withEdgeDetail:o});return y({file:s,callers:a,count:a.length})}async function Ps(t,e){let{root:r,entryPoints:s}=e,n=s.map(p=>J.resolve(r,p)),o=await t.getOrBuild(r,n),i=Ss(r),a=o.findUnusedFiles(i);return y({unusedFiles:a,count:a.length})}async function Ts(t,e){let{root:r,coverageThreshold:s}=e,n=await t.ensureFresh(r),o=t.getConfig(r),i=s??o?.coverageThreshold??80;if(!nt(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 As(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 Ms(t,e){let{root:r,metric:s="cognitiveComplexity",threshold:n=10,limit:o=20}=e,i=await t.ensureFresh(r),a=tt(i,{metric:s,threshold:n,limit:o});return y({metric:s,threshold:n,functions:a,count:a.length})}async function Is(t,e){let{root:r,changedFiles:s,featureThreshold:n,format:o="tags"}=e,i=await t.ensureFresh(r),a=s??new Me().getChangedFiles().map(m=>J.relative(r,J.resolve(r,m))),p=n!==void 0?{featureDetection:{minOutDegree:n}}:void 0;if(o==="paths"){let m=It(i,a,p);return y({changedFiles:a,affectedTests:m,count:m.length})}let c=Mt(i,a,p);return y({changedFiles:a,proposedTags:c})}async function Rs(t,e){let{root:r,entryPoints:s,featureThreshold:n}=e,o=s?await t.getOrBuild(r,s.map(p=>J.resolve(r,p))):await t.ensureFresh(r),i=R(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 Ns(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=>J.resolve(r,c))):await t.ensureFresh(r),p=Se(a.serialize(),be(n));return o?y(he.serialize(P.deserialize(p))):i?y(rt(p)):y(p)}async function Ds(t,e){let{root:r}=e,s=await t.ensureFreshWorkspace(r);return y(st(s))}async function Gs(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 _s(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 js(t,e){let{root:r,type:s}=e,n=await t.ensureFresh(r),o=it(n);if(s)return y(at(o,s));let i=Array.from(o.types.values());return y({count:i.length,types:i})}async function Os(t,e){let{root:r,paths:s,minOutDegree:n}=e,o=await t.ensureFresh(r),i=ot(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 Ls(t,e){let{root:r,minOutDegree:s}=e,n=await t.ensureFresh(r),o=V(n,s!==void 0?{minOutDegree:s}:void 0),i=Object.fromEntries(o.features);return y({features:i,unassigned:o.unassigned})}async function Ws(t,e){let{root:r,function:s}=e,n=await t.ensureFresh(r);return y(Qe(n,s))}async function zs(t,e){let{root:r,entryPoints:s}=e,n=await t.ensureFresh(r),o=s?.length?s:Je(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(He(n,o))}async function $s(t,e){let r=await t.ensureFresh(e.root),s=await xt(r,e.root,{dryRun:e.dryRun??!1});return y(s)}var Bs=[{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)"}},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"}},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.",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)."}},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:"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 Nt(){let t=new Ge,e=new Pa({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(Aa,async()=>({tools:Bs})),e.setRequestHandler(Ta,async r=>{let{name:s,arguments:n}=r.params,o=n,a={analyze:p=>ks(t,p),get_dependencies:p=>Cs(t,p),get_dependents:p=>ws(t,p),get_affected:p=>Fs(t,p),get_callers:p=>Es(t,p),find_unused:p=>Ps(t,p),find_uncovered:p=>Ts(t,p),check_doc_drift:p=>As(t,p),find_complex_functions:p=>Ms(t,p),propose_tags:p=>Is(t,p),detect_features:p=>Rs(t,p),get_type_graph:p=>js(t,p),get_module_responsibility:p=>Os(t,p),get_feature_graph:p=>Ls(t,p),get_call_graph:p=>Ws(t,p),get_api_surface:p=>zs(t,p),query:p=>Ns(t,p),get_workspace_packages:p=>Ds(t,p),get_workspace_affected:p=>Gs(t,p),clear_cache:p=>_s(t,p),apply_tags:p=>$s(t,p)}[s];if(!a)throw new Error(`Unknown tool: ${s}`);try{return vs(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 Ia(){let t=Nt(),e=new Ma;await t.connect(e)}Ia().catch(console.error);export{Nt as createMcpServer};
29
+ `),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):ts(e,r)}makeStubNode(e,r,s){return{path:r,type:T(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.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:h,functions:b}=n;return{path:r,type:T(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}:{},...h!==void 0?{cognitiveComplexity:h}:{},...b!==void 0?{functions:b}:{}}}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.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 hs(t,e){return{identifier:e?.identifier??new Me,featureMap:e?.featureDetection===!1?new Map:R(t.nodes,e?.featureDetection??void 0)}}function ys(t,e,r,s,n){for(let o of e){let i=t.nodes.get(o);if(!i)continue;let a=new N(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 It(t,e,r){let{identifier:s,featureMap:n}=hs(t,r),o=new Set;for(let i of e){let a=n.get(i);a&&o.add(a.tag)}return ys(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 Rt(t,e,r){let{identifier:s,featureMap:n}=hs(t,r),o=new Set;return ys(t,e,n,()=>{},i=>{s.isTestNode(i)&&o.add(i.path)}),Array.from(o)}import wa from"fs";import fe from"path";async function xs(t,e,r=null,s={}){let n=s.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=fe.resolve(t);return await new ue(o,r,s.pathAliases?new D(o,{pathAliases:s.pathAliases}):void 0,n,s.gitStats??!1,s.coverageMap??new Map,s.parallelParsing??!0).build(e)}async function Ss(t,e={}){let r=fe.resolve(t),s=ee(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 te(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 ue(r,null,new D(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 bs(t,e={}){let r=[],s=new Set([...e.ignoreDirs??Be,...e.additionalIgnoreDirs??[]]),n=new Set([...e.extensions??Ue,...e.additionalExtensions??[]]);function o(i){try{let a=wa.readdirSync(i,{withFileTypes:!0});for(let p of a){let c=fe.join(i,p.name);p.isDirectory()?s.has(p.name)||o(c):p.isFile()&&n.has(fe.extname(p.name).toLowerCase())&&r.push(fe.relative(t,c))}}catch{}}return o(t),r}var vs=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var _e=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 xs(e,r,this.graphs.get(e)??null,{...G(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 Ss(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=qe(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=Fa.watch(e,{recursive:!0},(s,n)=>{!n||vs.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,G(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}};import H from"path";import Ea from"fs";import Pa from"os";import Nt from"path";function y(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function ks(t){if(!Nt.isAbsolute(t))throw new Error("root must be an absolute path");let e=Nt.resolve(t),r=Pa.homedir();if(e!==r&&!e.startsWith(r+Nt.sep))throw new Error("root must be within the user home directory");let s;try{s=Ea.statSync(e)}catch{throw new Error("root does not exist")}if(!s.isDirectory())throw new Error("root is not a directory")}async function Cs(t,e){let{root:r,entryPoints:s}=e;if(!t.isConfigured(r)){let g=V(r,{allowJs:!1});$e(g),t.storeConfig(r,g)}if(s.length===0){let g=ee(r);if(g.type!=="none"){let h=t.getConfig(r),b=await t.getOrBuildWorkspace(r,G(h));t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let I=Array.from(b.packages.values()).map(({graph:ge,pkg:Gt})=>({package:Gt.name,relativeRoot:Gt.relativeRoot,nodeCount:ge.nodes.size}));return y({monorepoType:g.type,packageCount:b.packages.size,packages:I})}}let n=s.map(g=>H.resolve(r,g)),o=t.getConfig(r),i=o?.coverageReportPath?Ke(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((g,h)=>(g[h.category]=(g[h.category]??0)+1,g),{}),m=a.findCycles();return y({nodeCount:p.nodes.length,categories:c,cycles:m})}async function ws(t,e){let{root:r,file:s,depth:n=1}=e,o=await t.ensureFresh(r),i=Ye(o,s,n);return y({file:s,dependencies:i})}async function Fs(t,e){let{root:r,file:s}=e,n=await t.ensureFresh(r),o=Ze(n,s);return y({file:s,dependents:o})}async function Es(t,e){let{root:r,file:s,testsOnly:n=!1,cached:o=!1,changedSymbols:i}=e,a=await t.ensureFresh(r);if(o){let c=t.getOrBuildChangeImpact(r),m=Xe(c,s),g=n?m.filter(h=>a.nodes.get(h)?.category==="test"):m;return y({file:s,affected:g,count:g.length})}let p=et(a,s,{testsOnly:n,changedSymbols:i});return y({file:s,affected:p,count:p.length})}async function Ps(t,e){let{root:r,file:s,depth:n=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=tt(i,s,{depth:n,withEdgeDetail:o});return y({file:s,callers:a,count:a.length})}async function As(t,e){let{root:r,entryPoints:s}=e,n=s.map(p=>H.resolve(r,p)),o=await t.getOrBuild(r,n),i=bs(r),a=o.findUnusedFiles(i);return y({unusedFiles:a,count:a.length})}async function Ts(t,e){let{root:r,coverageThreshold:s}=e,n=await t.ensureFresh(r),o=t.getConfig(r),i=s??o?.coverageThreshold??80;if(!ot(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 Ms(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 Is(t,e){let{root:r,metric:s="cognitiveComplexity",threshold:n=10,limit:o=20}=e,i=await t.ensureFresh(r),a=rt(i,{metric:s,threshold:n,limit:o});return y({metric:s,threshold:n,functions:a,count:a.length})}async function Rs(t,e){let{root:r,changedFiles:s,featureThreshold:n,format:o="tags"}=e,i=await t.ensureFresh(r),a=s??new Ie().getChangedFiles().map(m=>H.relative(r,H.resolve(r,m))),p=n!==void 0?{featureDetection:{minOutDegree:n}}:void 0;if(o==="paths"){let m=Rt(i,a,p);return y({changedFiles:a,affectedTests:m,count:m.length})}let c=It(i,a,p);return y({changedFiles:a,proposedTags:c})}async function Ns(t,e){let{root:r,entryPoints:s,featureThreshold:n}=e,o=s?await t.getOrBuild(r,s.map(p=>H.resolve(r,p))):await t.ensureFresh(r),i=R(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 Ds(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=>H.resolve(r,c))):await t.ensureFresh(r),p=be(a.serialize(),ve(n));return o?y(ye.serialize(P.deserialize(p))):i?y(st(p)):y(p)}async function Gs(t,e){let{root:r}=e,s=await t.ensureFreshWorkspace(r);return y(nt(s))}async function _s(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 Os(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 js(t,e){let{root:r,type:s}=e,n=await t.ensureFresh(r),o=at(n);if(s)return y(pt(o,s));let i=Array.from(o.types.values());return y({count:i.length,types:i})}async function Ls(t,e){let{root:r,paths:s,minOutDegree:n}=e,o=await t.ensureFresh(r),i=it(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 Ws(t,e){let{root:r,minOutDegree:s}=e,n=await t.ensureFresh(r),o=q(n,s!==void 0?{minOutDegree:s}:void 0),i=Object.fromEntries(o.features);return y({features:i,unassigned:o.unassigned})}async function zs(t,e){let{root:r,function:s}=e,n=await t.ensureFresh(r);return y(Ve(n,s))}async function $s(t,e){let{root:r,entryPoints:s}=e,n=await t.ensureFresh(r),o=s?.length?s:He(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(Qe(n,o))}async function Bs(t,e){let r=await t.ensureFresh(e.root),s=await St(r,e.root,{dryRun:e.dryRun??!1});return y(s)}var Us=[{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)"}},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"}},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.",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)."}},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:"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 Dt(){let t=new _e,e=new Aa({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(Ma,async()=>({tools:Us})),e.setRequestHandler(Ta,async r=>{let{name:s,arguments:n}=r.params,o=n,a={analyze:p=>Cs(t,p),get_dependencies:p=>ws(t,p),get_dependents:p=>Fs(t,p),get_affected:p=>Es(t,p),get_callers:p=>Ps(t,p),find_unused:p=>As(t,p),find_uncovered:p=>Ts(t,p),check_doc_drift:p=>Ms(t,p),find_complex_functions:p=>Is(t,p),propose_tags:p=>Rs(t,p),detect_features:p=>Ns(t,p),get_type_graph:p=>js(t,p),get_module_responsibility:p=>Ls(t,p),get_feature_graph:p=>Ws(t,p),get_call_graph:p=>zs(t,p),get_api_surface:p=>$s(t,p),query:p=>Ds(t,p),get_workspace_packages:p=>Gs(t,p),get_workspace_affected:p=>_s(t,p),clear_cache:p=>Os(t,p),apply_tags:p=>Bs(t,p)}[s];if(!a)throw new Error(`Unknown tool: ${s}`);try{return ks(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 Ra(){let t=Dt(),e=new Ia;await t.connect(e)}Ra().catch(console.error);export{Dt as createMcpServer};
30
30
  //# sourceMappingURL=mcp.mjs.map