@omfalos/mokosh 0.1.5 → 0.1.7

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