@omfalos/mokosh 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mcp.mjs CHANGED
@@ -1,31 +1,34 @@
1
1
  #!/usr/bin/env node
2
- var qe=(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 dn from"path";import{fileURLToPath as hn}from"url";var yn=()=>hn(import.meta.url),xn=()=>dn.dirname(yn()),f=xn();import{StdioServerTransport as dc}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as uc}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as mc,ListToolsRequestSchema as gc}from"@modelcontextprotocol/sdk/types.js";import pc from"fs";import et from"fs";import rr from"path";var Sn=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],Xt=[];function Ee(r){Xt.push(r)}function Yt(r){return[...Sn,...Xt].some(e=>typeof e=="string"?r.includes(e):e instanceof RegExp?e.test(r):e(r))}var bn=[".test.",".spec.","-test.","-spec."],Zt=[];function Fe(r){Zt.push(r)}function re(){return[...bn,...Zt]}var vn=["jest","vitest","playwright","cypress","@testing-library/"],er=[];function Te(r){er.push(r)}function Xe(){return[...vn,...er]}var tr=.8;function Ye(r){tr=r}function Ze(){return tr}var Cn=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function se(r,{allowJs:e=!0,isExplicitPath:t=!1}={}){if(t){let s=rr.resolve(r);return et.existsSync(s)?s.endsWith(".json")?sr(s):e?nr(s):{}:{}}for(let s of Cn){let n=rr.resolve(r,s);if(et.existsSync(n)){if(s.endsWith(".json"))return sr(n);if(e)return nr(n)}}return{}}function sr(r){return JSON.parse(et.readFileSync(r,"utf-8"))}function nr(r){let e=qe(r);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function tt(r){for(let e of r.configMatchers??[])Ee(e);for(let e of r.testPatterns??[])Fe(e);for(let e of r.testLibraries??[])Te(e);r.barrelThreshold!==void 0&&Ye(r.barrelThreshold)}function U(r){return{gitStats:r?.gitStats??!1,parallelParsing:r?.parallelParsing,pathAliases:r?.pathAliases}}var rt=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],st=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];import kn from"fs";import or from"path";function nt(r,e){let t=or.resolve(r,e);try{let s=kn.readFileSync(t,"utf-8"),n=JSON.parse(s),o=new Map;for(let[i,a]of Object.entries(n)){if(i==="total")continue;let c=a?.lines?.pct;if(typeof c!="number")continue;let p=or.relative(r,i);o.set(p,c)}return o}catch{return new Map}}var Pe={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 c=o.isStyle?"-- styles -->":"-->";e.push(` ${n} ${c} ${i}`),t.add(a)}}}return e.join(`
3
- `)}};import ir from"fs";import En from"path";function ot(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 ar(r,e){if(typeof r=="string")return ot(r,e);if(r&&typeof r=="object"){let t=r;for(let s of["import","require","default"]){let n=ar(t[s],e);if(n)return n}}return null}function Fn(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 Tn(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 p=r.nodes.get(a.toPath);if(p)for(let l of p.exports)t.add(l.name);n.push(a.toPath)}else for(let p of a.symbols)t.add(p)}}}return t}function it(r,e){let t=[],s=En.join(e,"package.json");if(ir.existsSync(s))try{let n=JSON.parse(ir.readFileSync(s,"utf8"));if(n.exports&&typeof n.exports=="object"&&!Array.isArray(n.exports))for(let o of Object.values(n.exports)){let i=ar(o,r);i&&!t.includes(i)&&t.push(i)}else if(typeof n.exports=="string"){let o=ot(n.exports,r);o&&t.push(o)}if(t.length===0)for(let o of[n.main,n.module].filter(Boolean)){let i=ot(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 Pn(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 An(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 c=s.get(a.name),p=!!(a.signature||a.doc);(!c||p&&!i)&&s.set(a.name,{file:n,symbol:a})}}return s}function Nn(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),c=i?.symbol??a,p=i?.file??s.find(g=>t.nodes.get(g)?.exports.some(d=>d.name===o))??s[0],l={name:o,definedIn:p,kind:Fn(c?.signature)};c?.doc&&(l.doc=c.doc),c?.signature&&(l.signature=c.signature),n.push(l)}return n.sort((o,i)=>o.name.localeCompare(i.name)),n}function Mn(r,e,t){let s=c=>r.nodes.get(c)?.category==="test",n=[...e].filter(c=>!t.includes(c)&&!s(c)),o=[...r.nodes.keys()].filter(c=>!e.has(c)),i=o.filter(c=>!s(c)),a=o.filter(c=>s(c));return{internalFiles:n,unreachableFromEntry:i,testFiles:a}}function at(r,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let p of e)if(!r.nodes.has(p))throw new Error(`Entry point not found in graph: ${p}`);let t=Pn(r,e),s=An(r,t,e),n=Tn(r,e),o=Nn(n,s,r,e),{internalFiles:i,unreachableFromEntry:a,testFiles:c}=Mn(r,t,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:c}}function ct(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 Vc from"fs";import Qc from"path";function cr(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 pt(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:cr(r)}}function lt(r,e){return r.impact.get(e)??[]}import Ae from"path";function In(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 Rn(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=Ae.extname(n),c=Ae.basename(n,a),p=c==="index"?Ae.basename(Ae.dirname(n)):c;s.set(n,{path:n,outDegree:o,tag:`feature:${p}`})}return s}function L(r,e){let t=e?.minOutDegree??5;return Rn(r,In(r),t)}var Dn=(r,e)=>r.outDegree-e.outDegree;function Gn(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 Ln(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 _n(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 On(r,e,t){let s=[];for(let n of r.keys())!e.has(n)&&!t.has(n)&&s.push(n);return s}function ne(r,e){let t=e?.detectFn??L,s=e?.hubComparator??Dn,n=t(r.nodes,e),o=Gn(r,n),i=Ln(r.nodes,n,o,s);return{features:_n(n,i),unassigned:On(r.nodes,n,i)}}var pr=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),lr=new Set(["typescript","javascript","python"]),Ne=new Set(["typescript","javascript","go","python"]);function ft(r){let e=new Map;for(let t of r.nodes.values())e.set(t.type,(e.get(t.type)??0)+1);return[...e.entries()].map(([t,s])=>({type:t,fileCount:s,exportsTracked:pr.has(t),importSymbolsTracked:lr.has(t),callEdgesTracked:Ne.has(t)})).sort((t,s)=>s.fileCount-t.fileCount)}var oe=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 c of a.imports)if(!(!c.toPath||c.isExternal))if(s.has(c.toPath)){let p=n.indexOf(c.toPath);e.push([...n.slice(p),c.toPath])}else t.has(c.toPath)||o(c.toPath)}s.delete(i),n.pop()};for(let i of this.nodes.keys())t.has(i)||o(i);return e}};var M=class r{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let t=new Map;for(let 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=(c,p,l)=>{if(p>i||o.has(c))return;let g=this.nodes.get(c);if(g&&(o.add(c),t(g,p,l)!==!1))for(let d of n(c))a(d,p+1,c)};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 oe(this.nodes).findUnusedFiles(e)}findCycles(){return new oe(this.nodes).findCycles()}};var _=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(c=>c.toPath===t);if(!n)return!1;let o=n.symbols||["*"],i=new Set;for(let c of o)(c==="*"||s.has("*")||s.has(c))&&i.add("*");if(i.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let c of i)a.add(c);return this.affectedSymbols.set(e.path,a),!0}};function ie(r,e){let t=r.nodes.get(e);if(t)return{category:t.category,exports:t.exports.map(s=>s.name)}}function ut(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(c=>c.toPath===n.path):void 0;return s.push({path:n.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:t}),s}function ae(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 mt(r,e,t={}){let{testsOnly:s=!1,changedSymbols:n}=t,o=n?new _(e,n):null,i=[];return r.traverse(e,(a,c,p)=>{if(a.path===e)return!0;if(o&&p&&!o.updateAffectedSymbols(a,p))return!1;let l=a.category==="test"||a.tags.some(g=>g.name==="test");return(!s||l)&&i.push(a.path),!0},{direction:"incoming"}),i}function gt(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(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),o.push(a),!0},{direction:"incoming",maxDepth:s}),o}function dt(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 ht(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 yt(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 xt(r){return[...r.nodes.values()].some(e=>e.coveragePct!==void 0)}function fr(r){if(r.category==="test")return"test";if(r.category==="config")return"config";if(r.category==="type-only")return"types";let e=r.path;return b(e,"component")||b(e,"components")?"component":b(e,"controller")||b(e,"controllers")?"controller":b(e,"middleware")?"middleware":b(e,"router")||b(e,"routes")||b(e,"route")?"router":b(e,"store")||b(e,"stores")?"store":b(e,"service")||b(e,"services")?"service":b(e,"handler")||b(e,"handlers")?"handler":b(e,"adapter")||b(e,"adapters")?"adapter":b(e,"plugin")||b(e,"plugins")?"plugin":b(e,"api")?"api":b(e,"cli")||b(e,"commands")||ce(e)==="cli"?"cli":b(e,"util")||b(e,"utils")||b(e,"helper")||b(e,"helpers")?"util":b(e,"model")||b(e,"models")||ce(e)==="model"?"model":b(e,"parser")||b(e,"parsers")||ce(e)==="parser"?"parser":ce(e)==="builder"?"builder":ce(e)==="resolver"?"resolver":"other"}function b(r,e){return r.includes(`/${e}/`)||r.includes(`/${e}.`)}function ce(r){let e=r.slice(r.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function St(r,e){let t=ne(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:fr(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return n}function bt(r,e){let t=[];for(let s of r.nodes.values())if(s.exports.some(n=>n.name===e))if(Ne.has(s.type)){let n=[];for(let o of r.nodes.values())for(let i of o.callEdges??[])i.to===e&&n.push({file:o.path,callerFunction:i.from});t.push({path:s.path,category:s.category,precision:"call",callers:n})}else{let n=ae(r,s.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));t.push({path:s.path,category:s.category,precision:"file-level",importers:n})}return t}function jn(r){return r?r.startsWith("interface ")?"interface":r.startsWith("class ")?"class":r.startsWith("enum ")?"enum":"type":"type"}function Wn(r,e){if(e==="type-only")return!0;let t=r.signature??"";return t.startsWith("interface ")||t.startsWith("class ")||t.startsWith("enum ")}function vt(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(!Wn(n,s.category))continue;let o=`${s.path}::${n.name}`;e.set(o,{name:n.name,file:s.path,kind:jn(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 Ct(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 Yn from"path";import wt from"fs";import dr from"path";import pe from"fs";import T from"path";import ur from"fs";import Np from"path";function mr(r){try{return ur.statSync(r,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Me(r){try{return ur.statSync(r,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function kt(r,e){let t=T.join(e,"package.json");if(!pe.existsSync(t))return null;let s={};try{s=JSON.parse(pe.readFileSync(t,"utf-8"))}catch{return null}let n=s.name;return n?{name:n,root:e,relativeRoot:T.relative(r,e),entryPoints:zn(e,s)}:null}function zn(r,e){let t=[];if(e.exports){let n=e.exports;if(typeof n=="string")t.push(T.join(r,n));else if(typeof n=="object"&&n!==null){let o=n["."];if(typeof o=="string")t.push(T.join(r,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&t.push(T.join(r,i))}}}e.main&&t.push(T.join(r,e.main));for(let n of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])t.push(T.join(r,n));let s=t.filter(Me);return s.length>0?s.slice(0,1):t.slice(0,1)}function K(r,e){let t=[],s=new Set;for(let n of e){let o=n.replace(/\/$/,"").replace(/^\.\//,"");$n(r,o,s,t)}return t}function $n(r,e,t,s){if(!e.includes("*")){Bn(r,e,t,s);return}let n=e.split("/");n.includes("**")?Un(r,n,t,s):Kn(r,n,t,s)}function Bn(r,e,t,s){let n=T.join(r,e);if(t.has(n)||!mr(n))return;t.add(n);let o=kt(r,n);o&&s.push(o)}function Un(r,e,t,s){let n=T.join(r,e[0]==="**"?"":e[0]??"");gr(r,n,t,s)}function Kn(r,e,t,s){let n=e.findIndex(a=>a.includes("*")),o=T.join(r,...e.slice(0,n)),i;try{i=pe.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=T.join(o,a.name);if(t.has(c))continue;t.add(c);let p=kt(r,c);p&&s.push(p)}}function gr(r,e,t,s){let n;try{n=pe.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of n){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=T.join(e,o.name);if(pe.existsSync(T.join(i,"package.json"))&&!t.has(i)){t.add(i);let a=kt(r,i);a&&s.push(a)}else gr(r,i,t,s)}}var hr={type:"npm",detect(r){let e=dr.join(r,"package.json");if(!wt.existsSync(e))return null;let t;try{t=JSON.parse(wt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!t||wt.existsSync(dr.join(r,"yarn.lock")))return null;let s=Array.isArray(t)?t:t.packages??[];return s.length===0?null:K(r,s)}};import J from"fs";import w from"path";var yr={type:"nx",detect(r){return J.existsSync(w.join(r,"nx.json"))?xr(r,r,new Set,0).map(t=>Jn(r,t,w.join(t,"project.json"))).filter(t=>t!==null):null}};function xr(r,e,t,s){if(s>4)return[];let n;try{n=J.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 c=w.join(e,a);J.existsSync(w.join(c,"project.json"))&&!t.has(c)?(t.add(c),o.push(c)):o.push(...xr(r,c,t,s+1))}return o}function Jn(r,e,t){let s={};try{s=JSON.parse(J.readFileSync(t,"utf-8"))}catch{return null}let n=s.name,o,i,a=w.join(e,"package.json");if(J.existsSync(a))try{let c=JSON.parse(J.readFileSync(a,"utf-8"));n=c.name??n,o=c.main,i=c.exports}catch{}return n?{name:n,root:e,relativeRoot:w.relative(r,e),entryPoints:Vn(e,s,o,i)}:null}function Vn(r,e,t,s){let n=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=w.resolve(r,"../..");n.push(w.resolve(a,o)),n.push(w.resolve(r,o))}if(s){let a=s;if(typeof a=="string")n.push(w.join(r,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&n.push(w.join(r,c))}}if(t&&n.push(w.join(r,t)),e.sourceRoot){let a=w.resolve(r,"../.."),c=w.resolve(a,e.sourceRoot);n.push(w.join(c,"index.ts"),w.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])n.push(w.join(r,a));let i=n.filter(Me);return i.length>0?i.slice(0,1):n.slice(0,1)}import Sr from"fs";import Hn from"path";import{load as Qn}from"js-yaml";var br={type:"pnpm",detect(r){let e=Hn.join(r,"pnpm-workspace.yaml");if(!Sr.existsSync(e))return null;let t=[];try{t=Qn(Sr.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return K(r,t)}};import qn from"fs";import Xn from"path";var vr={type:"turborepo",detect(r){return qn.existsSync(Xn.join(r,"turbo.json"))?[]:null}};import Et from"fs";import Cr from"path";var kr={type:"yarn",detect(r){if(!Et.existsSync(Cr.join(r,"yarn.lock")))return null;let e=Cr.join(r,"package.json");if(!Et.existsSync(e))return null;let t;try{t=JSON.parse(Et.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:K(r,s)}};var wr=[];function I(r){wr.push(r)}function Er(){return wr}I(vr);I(yr);I(br);I(kr);I(hr);function le(r,e=Er()){let t=Yn.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 c of a)s.has(c.name)||s.set(c.name,c)}}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 fe=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(p=>p.isWorkspace&&p.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 M(o);t.packages.set(s.name,{graph:i,pkg:{...s,root:""}})}return t}};var Fr=new Map;function V(r,e){Fr.set(r,e)}function Tr(r){return Fr.get(r)}function Pr(r,e){return e.startsWith("!")?r!==e.slice(1):r===e}function Zn(r,e){return e.startsWith("!")?!r.includes(e.slice(1)):r.includes(e)}var eo=(r,e)=>!e.category||Pr(r.category,e.category),to=(r,e)=>!e.type||Pr(r.type,e.type),ro=(r,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?r.lastAuthor!==e.lastAuthor.slice(1):r.lastAuthor!==void 0&&r.lastAuthor===e.lastAuthor:!0,so=(r,e)=>!e.path||Zn(r.path,e.path),no=(r,e)=>e.isExternal===void 0?!0:r.imports.some(s=>s.isExternal)===e.isExternal,oo=(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)))},io=(r,e)=>!e.allTags?.length||e.allTags.every(t=>r.tags.some(s=>s.name===t)),ao=(r,e)=>!e.importsFile||r.imports.some(t=>t.toPath?.includes(e.importsFile)),co=(r,e,t)=>e.importedBy===void 0?!0:(t?.get(r.path)??[]).some(n=>n.includes(e.importedBy)),po=(r,e)=>e.minImports===void 0||r.imports.length>=e.minImports,lo=(r,e)=>e.maxImports===void 0||r.imports.length<=e.maxImports,fo=(r,e)=>e.minSize===void 0||r.size>=e.minSize,uo=(r,e)=>e.maxSize===void 0||r.size<=e.maxSize,mo=(r,e)=>e.hasDocstring===void 0||!!r.description===e.hasDocstring,go=(r,e)=>e.isDocumented===void 0||!!r.documentedBy?.length===e.isDocumented,ho=(r,e)=>e.isStale===void 0||!!r.staleFor?.length===e.isStale,yo=(r,e)=>e.minCoverage===void 0||(r.coveragePct??101)>=e.minCoverage,xo=(r,e)=>e.maxCoverage===void 0||(r.coveragePct??0)<=e.maxCoverage,So=(r,e)=>e.minExportUsage===void 0||(r.avgExportUsage??-1)>=e.minExportUsage,bo=(r,e)=>e.maxExportUsage===void 0||(r.avgExportUsage??0)<=e.maxExportUsage,vo=(r,e)=>e.minComplexity===void 0||(r.complexity??-1/0)>=e.minComplexity,Co=(r,e)=>e.maxComplexity===void 0||(r.complexity??0)<=e.maxComplexity,ko=(r,e)=>e.minCognitiveComplexity===void 0||(r.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,wo=(r,e)=>e.maxCognitiveComplexity===void 0||(r.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Eo=(r,e)=>e.minCommits===void 0||(r.commitCount90d??-1/0)>=e.minCommits,Fo=(r,e)=>e.maxCommits===void 0||(r.commitCount90d??0)<=e.maxCommits,To=(r,e,t)=>!e.any?.length||e.any.some(s=>ue(r,s,t)),Po=[eo,to,ro,so,no,oo,io,ao,co,po,lo,fo,uo,mo,go,ho,yo,xo,So,bo,vo,Co,ko,wo,Eo,Fo,To];function ue(r,e,t){return Po.every(s=>s(r,e,t))}function Ie(r,e){let t=new Map;if(e.importedBy!==void 0){for(let i of r.nodes)for(let a of i.imports)if(a.toPath){let c=t.get(a.toPath)??[];c.push(i.path),t.set(a.toPath,c)}}let s=r.nodes.filter(i=>ue(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))}));if(e.sort){let i=e.sortDir==="asc"?-1:1;o.sort((a,c)=>{let p=0;return e.sort==="size"?p=c.size-a.size:e.sort==="imports"?p=c.imports.length-a.imports.length:e.sort==="commitCount90d"?p=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?p=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?p=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(p=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),p*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:r.cycles?.filter(i=>i.every(a=>n.has(a)))??void 0}}function Ar(r,e){let t=e.indexOf(":");if(t===-1)return;let s=e.slice(0,t).trim().toLowerCase(),n=e.slice(t+1).trim();if(!(!s||!n))switch(s){case"category":r.category=n;break;case"type":r.type=n;break;case"tag":case"tags":n.includes("+")?r.allTags=[...r.allTags??[],...n.split("+")]:r.tags=[...r.tags??[],n];break;case"path":r.path=n;break;case"external":r.isExternal=n.toLowerCase()==="true";break;case"importsfile":r.importsFile=n;break;case"importedby":r.importedBy=n;break;case"minimports":r.minImports=parseInt(n,10);break;case"maximports":r.maxImports=parseInt(n,10);break;case"minsize":r.minSize=parseInt(n,10);break;case"maxsize":r.maxSize=parseInt(n,10);break;case"sort":r.sort=n;break;case"sortdir":r.sortDir=n.toLowerCase()==="asc"?"asc":"desc";break;case"limit":r.limit=parseInt(n,10);break;case"hasdocstring":r.hasDocstring=n.toLowerCase()!=="false";break;case"mincoverage":r.minCoverage=parseInt(n,10);break;case"maxcoverage":r.maxCoverage=parseInt(n,10);break;case"minexportusage":r.minExportUsage=parseFloat(n);break;case"maxexportusage":r.maxExportUsage=parseFloat(n);break;case"mincomplexity":r.minComplexity=parseInt(n,10);break;case"maxcomplexity":r.maxComplexity=parseInt(n,10);break;case"mincognitivecomplexity":r.minCognitiveComplexity=parseInt(n,10);break;case"maxcognitivecomplexity":r.maxCognitiveComplexity=parseInt(n,10);break;case"mincommits":r.minCommits=parseInt(n,10);break;case"maxcommits":r.maxCommits=parseInt(n,10);break;case"isdocumented":r.isDocumented=n.toLowerCase()!=="false";break;case"isstale":r.isStale=n.toLowerCase()!=="false";break;case"lastauthor":r.lastAuthor=n;break}}function Ao(r){let e=[];for(let t of r.split("|")){let s=t.trim();if(!s)continue;let n={};Ar(n,s),Object.keys(n).length>0&&e.push(n)}return e}function Re(r){let e={},t=r.split(",");for(let s of t){let n=s.trim();if(n.toLowerCase().startsWith("any(")&&n.endsWith(")")){let o=n.slice(4,-1),i=Ao(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}Ar(e,s)}return e}import zr from"fs/promises";import Zo from"path";import Mt from"path";import ze from"typescript";import Mr from"path";import Ir from"typescript";import E from"typescript";var Nr=new Set(["describe","test","it"]);function H(r){let e=[];for(let t of r.statements){if(!E.isExpressionStatement(t))continue;let s=t.expression;if(!E.isCallExpression(s))continue;let n=s.expression;E.isIdentifier(n)&&Nr.has(n.text)&&e.push(s),E.isPropertyAccessExpression(n)&&E.isIdentifier(n.expression)&&Nr.has(n.expression.text)&&e.push(s)}return e}function Q(r,e,t){for(let s of r.arguments){if(!E.isObjectLiteralExpression(s))continue;let n=s.properties.find(o=>E.isPropertyAssignment(o)&&E.isIdentifier(o.name)&&o.name.text===e);if(!(!n||!E.isArrayLiteralExpression(n.initializer)))return n.initializer.elements.filter(E.isStringLiteral).map(o=>o.text)}return null}function q(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(!E.isObjectLiteralExpression(i))continue;let a=i.properties.find(p=>E.isPropertyAssignment(p)&&E.isIdentifier(p.name)&&p.name.text===e);if(a)return{start:a.initializer.getStart(s),end:a.initializer.getEnd(),text:t};let c=i.getEnd()-1;return{start:c,end:c,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 X(r,e,t){let s=r.arguments;for(let n=1;n<s.length;n++){let o=s[n];if(!E.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>E.isPropertyAssignment(c)&&E.isIdentifier(c.name)&&c.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 Y(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 Z(r){return`[${r.map(e=>JSON.stringify(e)).join(", ")}]`}var N=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function No(r){return Z(r.map(e=>`@${e}`))}function Mo(r){return r.map(e=>e.startsWith("@")?e.slice(1):e)}var De=class{name="cypress";canHandle(e){return N.has(Mr.extname(e).toLowerCase())}apply(e,t,s){let n=Ir.createSourceFile(Mr.basename(e),t,Ir.ScriptTarget.Latest,!0),o=H(n);if(o.length===0)return t;let i=Q(o[0],"tags",n),a=[...s].sort();if(i!==null&&JSON.stringify(Mo(i).sort())===JSON.stringify(a))return t;let c=o.flatMap(p=>{let l=s.length===0?X(p,"tags",n):q(p,"tags",No(a),n);return l?[l]:[]});return c.length>0?Y(t,c):t}};import Io from"path";var Ft=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Tt=/^@([a-zA-Z0-9_-]+)/gm;function Ro(r){return["# <mokosh-tags>",...r.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
4
- `)+`
2
+ var Qe=(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 Fs from"path";import{fileURLToPath as Es}from"url";var Ts=()=>Es(import.meta.url),Ps=()=>Fs.dirname(Ts()),u=Ps();import{StdioServerTransport as Mc}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as Ac}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as Nc,ListToolsRequestSchema as Ic}from"@modelcontextprotocol/sdk/types.js";import Ec from"fs";import Ze from"fs";import lr from"path";var As=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],or=[];function we(r){or.push(r)}function ir(r){return[...As,...or].some(e=>typeof e=="string"?r.includes(e):e instanceof RegExp?e.test(r):e(r))}var Ns=[".test.",".spec.","-test.","-spec."],ar=[];function Ce(r){ar.push(r)}function te(){return[...Ns,...ar]}var Is=["jest","vitest","playwright","cypress","@testing-library/"],cr=[];function Fe(r){cr.push(r)}function qe(){return[...Is,...cr]}var pr=.8;function Xe(r){pr=r}function Ye(){return pr}var Ms=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function re(r,{allowJs:e=!0,isExplicitPath:t=!1}={}){if(t){let n=lr.resolve(r);return Ze.existsSync(n)?n.endsWith(".json")?fr(n):e?ur(n):{}:{}}for(let n of Ms){let s=lr.resolve(r,n);if(Ze.existsSync(s)){if(n.endsWith(".json"))return fr(s);if(e)return ur(s)}}return{}}function fr(r){return JSON.parse(Ze.readFileSync(r,"utf-8"))}function ur(r){let e=Qe(r);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function et(r){for(let e of r.configMatchers??[])we(e);for(let e of r.testPatterns??[])Ce(e);for(let e of r.testLibraries??[])Fe(e);r.barrelThreshold!==void 0&&Xe(r.barrelThreshold)}function V(r){return{gitStats:r?.gitStats??!1,parallelParsing:r?.parallelParsing,pathAliases:r?.pathAliases}}var O=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],tt=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];import Ds from"fs";import mr from"path";function rt(r,e){let t=mr.resolve(r,e);try{let n=Ds.readFileSync(t,"utf-8"),s=JSON.parse(n),o=new Map;for(let[i,a]of Object.entries(s)){if(i==="total")continue;let c=a?.lines?.pct;if(typeof c!="number")continue;let p=mr.relative(r,i);o.set(p,c)}return o}catch{return new Map}}var Ee={serialize(r){let e=["graph TD"],t=new Set;for(let n of r.nodes.values()){let s=`"${n.path}"`;for(let o of n.imports){if(!o.toPath)continue;let i=`"${o.toPath}"`,a=`${n.path} -> ${o.toPath}`;if(!t.has(a)){let c=o.isStyle?"-- styles -->":"-->";e.push(` ${s} ${c} ${i}`),t.add(a)}}}return e.join(`
3
+ `)}};import gr from"fs";import Gs from"path";function nt(r,e){let t=r.replace(/^\.\//,"");if(e.nodes.has(t))return t;let n=t.replace(/^dist\//,"src/").replace(/\.(js|mjs|cjs)$/,".ts");return e.nodes.has(n)?n:null}function dr(r,e){if(typeof r=="string")return nt(r,e);if(r&&typeof r=="object"){let t=r;for(let n of["import","require","default"]){let s=dr(t[n],e);if(s)return s}}return null}function Ls(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,n=new Set,s=[...e];for(;s.length;){let o=s.shift();if(n.has(o))continue;n.add(o);let i=r.nodes.get(o);if(i){for(let a of i.exports)t.add(a.name);for(let a of i.imports){if(a.type!=="re-export"||a.isExternal||!a.toPath)continue;if(!a.symbols?.length||a.symbols.includes("*")){let p=r.nodes.get(a.toPath);if(p)for(let l of p.exports)t.add(l.name);s.push(a.toPath)}else for(let p of a.symbols)t.add(p)}}}return t}function st(r,e){let t=[],n=Gs.join(e,"package.json");if(gr.existsSync(n))try{let s=JSON.parse(gr.readFileSync(n,"utf8"));if(s.exports&&typeof s.exports=="object"&&!Array.isArray(s.exports))for(let o of Object.values(s.exports)){let i=dr(o,r);i&&!t.includes(i)&&t.push(i)}else if(typeof s.exports=="string"){let o=nt(s.exports,r);o&&t.push(o)}if(t.length===0)for(let o of[s.main,s.module].filter(Boolean)){let i=nt(o,r);i&&!t.includes(i)&&t.push(i)}}catch{}if(t.length===0){for(let s of["src/index.ts","src/index.js","index.ts","index.js"])if(r.nodes.has(s)){t.push(s);break}}return t}function Os(r,e){let t=new Set(e);for(let n of e)r.traverse(n,s=>(t.add(s.path),!0),{direction:"outgoing"});return t}function js(r,e,t){let n=new Map;for(let s of e){if(t.includes(s))continue;let o=r.nodes.get(s);if(!o)continue;let i=o.category==="barrel";for(let a of o.exports){let c=n.get(a.name),p=!!(a.signature||a.doc);(!c||p&&!i)&&n.set(a.name,{file:s,symbol:a})}}return n}function Ws(r,e,t,n){let s=[];for(let o of r){let i=e.get(o),a=n.flatMap(f=>t.nodes.get(f)?.exports??[]).find(f=>f.name===o),c=i?.symbol??a,p=i?.file??n.find(f=>t.nodes.get(f)?.exports.some(d=>d.name===o))??n[0],l={name:o,definedIn:p,kind:Ls(c?.signature)};c?.doc&&(l.doc=c.doc),c?.signature&&(l.signature=c.signature),s.push(l)}return s.sort((o,i)=>o.name.localeCompare(i.name)),s}function zs(r,e,t){let n=c=>r.nodes.get(c)?.category==="test",s=[...e].filter(c=>!t.includes(c)&&!n(c)),o=[...r.nodes.keys()].filter(c=>!e.has(c)),i=o.filter(c=>!n(c)),a=o.filter(c=>n(c));return{internalFiles:s,unreachableFromEntry:i,testFiles:a}}function ot(r,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let p of e)if(!r.nodes.has(p))throw new Error(`Entry point not found in graph: ${p}`);let t=Os(r,e),n=js(r,t,e),s=_s(r,e),o=Ws(s,n,r,e),{internalFiles:i,unreachableFromEntry:a,testFiles:c}=zs(r,t,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:c}}function it(r,e){let t=null,n=[];for(let o of r.nodes.values()){o.exports.some(i=>i.name===e)&&(t=o.path);for(let i of o.callEdges??[])i.to===e&&n.push({file:o.path,callerFunction:i.from})}let s=[];if(t){let o=r.nodes.get(t);for(let i of o?.callEdges??[])i.from===e&&s.push({file:i.toFile,calleeFunction:i.to})}return{functionName:e,definedIn:t,callers:n,callees:s}}import lp from"fs";import up from"path";function hr(r){let e=[...r.nodes.entries()].sort(([n],[s])=>n.localeCompare(s)).map(([n,s])=>`${n}:${s.mtime}:${s.size}`).join("|"),t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,"0")}function at(r){let e=new Map;for(let t of r.nodes.keys()){let n=[];r.traverse(t,s=>(s.path!==t&&n.push(s.path),!0),{direction:"incoming"}),e.set(t,n)}return{impact:e,graphHash:hr(r)}}function ct(r,e){return r.impact.get(e)??[]}import{readFile as io}from"fs/promises";import ft from"path";import Te from"fs";import $s from"path";import{load as yr}from"js-yaml";var pt=["package-lock.json","yarn.lock","pnpm-lock.yaml"];function xr(r){let e=r.lastIndexOf("@");return e>0?r.substring(0,e):r}function Bs(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)),xr(t)}).filter(Boolean)}function Us(r,e){let t=r.startsWith("/")?r.slice(1):r,n=t.lastIndexOf("@");return n>0?{name:t.substring(0,n),version:e||t.substring(n+1)}:{name:t,version:e}}function Ks(r){try{let e=yr(r),t={dependencies:{}};for(let[n,s]of Object.entries(e))if(!(n==="__metadata"||!s?.version))for(let o of n.split(", ")){let i=xr(o);i&&(t.dependencies[i]={version:s.version,...s.dependencies!==void 0&&{dependencies:s.dependencies}})}return t}catch{return null}}function Js(r){let e={dependencies:{}};for(let t of r.split(/\n\n+/)){let n=t.split(`
4
+ `).filter(c=>c.trim().length>0&&!c.trim().startsWith("#"));if(n.length<2)continue;let s=n[0];if(!s||s.startsWith(" "))continue;let o=Bs(s);if(o.length===0)continue;let a=n.find(c=>c.trim().startsWith('version "'))?.match(/version "(.*?)"/)?.[1]??"";for(let c of o)e.dependencies[c]={version:a}}return e}function Vs(r){let e=Te.readFileSync(r,"utf-8"),t=JSON.parse(e),n={dependencies:{}};if(t.packages)for(let[s,o]of Object.entries(t.packages)){if(!s.startsWith("node_modules/"))continue;let i=s.replace("node_modules/","");i.includes("node_modules/")||(n.dependencies[i]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}else if(t.dependencies)for(let[s,o]of Object.entries(t.dependencies))n.dependencies[s]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}};return n}function Hs(r){let e=Te.readFileSync(r,"utf-8");if(e.includes("__metadata:")){let t=Ks(e);if(t!==null)return t}return Js(e)}function Qs(r){let e=Te.readFileSync(r,"utf-8"),t={dependencies:{}};try{let n=yr(e);if(n.packages)for(let[s,o]of Object.entries(n.packages)){let{name:i,version:a}=Us(s,o.version);i&&(t.dependencies[i]={version:a,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}if(n.dependencies)for(let[s,o]of Object.entries(n.dependencies)){if(t.dependencies[s])continue;let i=typeof o=="string"?o:o.version;t.dependencies[s]={version:i||""}}}catch{}return t}function Sr(r){let e={"package-lock.json":Vs,"yarn.lock":Hs,"pnpm-lock.yaml":Qs},t=pt.map(n=>[n,e[n]]);for(let[n,s]of t){let o=$s.join(r,n);if(Te.existsSync(o))return s(o)}return null}function qs(r){let e=5381;for(let t=0;t<r.length;t++)e=e*33+r.charCodeAt(t)>>>0;return e.toString(36)}function Xs(r,e){let t=[];for(let n=0;n<=r.length-e;n++)t.push(qs(r.slice(n,n+e).map(s=>s.text).join(" ")));return t}function Ys(r,e,t){let n=r.get(e.file),s=r.get(t.file);if(!n||!s)return 0;let o=0;for(;e.windowIndex+o+1<n.length&&t.windowIndex+o+1<s.length&&n[e.windowIndex+o+1]===s[t.windowIndex+o+1];)o++;return o}function Zs(r,e,t){if(e.windowIndex===0||t.windowIndex===0)return!0;let n=r.get(e.file),s=r.get(t.file);return!n||!s?!0:n[e.windowIndex-1]!==s[t.windowIndex-1]}function br(r,e,t){let n=new Map,s=new Map,o=new Map;for(let{file:a,tokens:c}of r){if(c.length<e)continue;s.set(a,c);let p=Xs(c,e);n.set(a,p);for(let l=0;l<p.length;l++){let f={file:a,windowIndex:l},d=o.get(p[l]);d?d.push(f):o.set(p[l],[f])}}let i=[];for(let a of o.values())if(!(a.length<2))for(let c=0;c<a.length;c++)for(let p=c+1;p<a.length;p++){let l=a[c],f=a[p];if(l.file===f.file&&l.windowIndex===f.windowIndex||!Zs(n,l,f))continue;let d=Ys(n,l,f),h=e+d;if(l.file===f.file){let[D,J]=l.windowIndex<f.windowIndex?[l,f]:[f,l];if(D.windowIndex+h>J.windowIndex)continue}let v=s.get(l.file),x=s.get(f.file),k={file:l.file,startLine:v[l.windowIndex].line,endLine:v[l.windowIndex+h-1].line},E={file:f.file,startLine:x[f.windowIndex].line,endLine:x[f.windowIndex+h-1].line},I=Math.min(k.endLine-k.startLine+1,E.endLine-E.startLine+1);I<t||i.push({occurrences:[k,E],lines:I,tokens:h})}return i.sort((a,c)=>c.lines-a.lines)}var eo={typescript:{line:["//"],block:[["/*","*/"]]},javascript:{line:["//"],block:[["/*","*/"]]},go:{line:["//"],block:[["/*","*/"]]},css:{block:[["/*","*/"]]},scss:{line:["//"],block:[["/*","*/"]]},less:{line:["//"],block:[["/*","*/"]]},stylus:{line:["//"],block:[["/*","*/"]]},python:{line:["#"]},gherkin:{line:["#"]},coffeescript:{line:["#"],block:[["###","###"]]},livescript:{line:["#"],block:[["###","###"]]},lua:{line:["--"],block:[["--[[","]]"]]},markdown:{block:[["<!--","-->"]]}};function vr(r,e,t){let n=r.slice(e,t).replace(/[^\n]/g," ");return r.slice(0,e)+n+r.slice(t)}function to(r,e){if(!e)return r;let t=r;for(let[n,s]of e.block??[]){let o=0;for(;;){let i=t.indexOf(n,o);if(i===-1)break;let a=t.indexOf(s,i+n.length),c=a===-1?t.length:a+s.length;t=vr(t,i,c),o=c}}for(let n of e.line??[]){let s=0;for(;;){let o=t.indexOf(n,s);if(o===-1)break;let i=t.indexOf(`
5
+ `,o),a=i===-1?t.length:i;t=vr(t,o,a),s=a}}return t}var ro=["===","!==","...","=>","==","!=","<=",">=","&&","||","::","->","..","+=","-=","*=","/="],lt=new RegExp(`${ro.map(r=>r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")}|[A-Za-z_$][A-Za-z0-9_$]*|\\d+(?:\\.\\d+)?|"(?:\\\\.|[^"\\\\])*"|'(?:\\\\.|[^'\\\\])*'|\`(?:\\\\.|[^\`\\\\])*\`|\\S`,"g"),no=/^[A-Za-z_$][A-Za-z0-9_$]*$/,kr=/^\d+(?:\.\d+)?$/,so=/^(".*"|'.*'|`.*`)$/s,oo=new Set(["if","else","elif","for","while","do","switch","case","default","break","continue","return","function","def","class","struct","interface","const","let","var","local","import","export","from","package","try","catch","except","finally","throw","raise","new","this","self","end","then","yield","async","await","nil","null","None","true","false","True","False","and","or","not","in","of","is"]);function wr(r,e,t=!0){let n=to(r,eo[e]),s=[],o=1,i=0;lt.lastIndex=0;let a=lt.exec(n);for(;a!==null;){for(let l=i;l<a.index;l++)n[l]===`
6
+ `&&o++;i=a.index;let c=a[0],p=c;no.test(c)&&!oo.has(c)?p="ID":t&&(kr.test(c)||so.test(c))&&(p=kr.test(c)?"NUM":"STR"),s.push({text:p,line:o});for(let l=i;l<a.index+c.length;l++)n[l]===`
7
+ `&&o++;i=a.index+c.length,a=lt.exec(n)}return s}function ao(r){return pt.includes(ft.basename(r))}function co(r,e){if(e.length===0)return!1;let t=new Set(e);return r.split(ft.sep).some(n=>t.has(n))}async function ut(r,e,t={}){let{minLines:n=6,windowSize:s=15,ignoreLiterals:o=!0,limit:i=50,ignoreDirs:a=O}=t,c=[...r.nodes.values()].filter(l=>!ao(l.path)&&!co(l.path,a)),p=(await Promise.all(c.map(async l=>{try{let f=await io(ft.join(e,l.path),"utf8");return{file:l.path,tokens:wr(f,l.type,o)}}catch{return}}))).filter(l=>l!==void 0);return br(p,s,n).slice(0,i)}import Pe from"path";function po(r){let e=new Map;for(let[t,n]of r){let s=n.imports.filter(o=>o.toPath&&!o.isExternal).length;s>0&&e.set(t,s)}return e}function lo(r,e,t){let n=new Map;for(let[s,o]of e){if(o<t)continue;let i=r.get(s);if(!i||i.category==="test"||i.category==="barrel")continue;let a=Pe.extname(s),c=Pe.basename(s,a),p=c==="index"?Pe.basename(Pe.dirname(s)):c;n.set(s,{path:s,outDegree:o,tag:`feature:${p}`})}return n}function j(r,e){let t=e?.minOutDegree??5;return lo(r,po(r),t)}var fo=(r,e)=>r.outDegree-e.outDegree;function uo(r,e){let t=new Map;for(let n of e.values()){let s=new Set;r.traverse(n.path,o=>(o.path!==n.path&&s.add(o.path),!0),{direction:"outgoing"}),t.set(n.path,s)}return t}function mo(r,e,t,n){let s=new Map;for(let[o]of r){if(e.has(o))continue;let i=null;for(let a of e.values())t.get(a.path)?.has(o)&&(!i||n(a,i)<0)&&(i=a);i&&s.set(o,i.path)}return s}function go(r,e){let t=new Map;for(let n of r.values()){let s=n.tag.replace("feature:",""),o=[];for(let[i,a]of e)a===n.path&&o.push(i);t.set(s,{hub:n.path,outDegree:n.outDegree,files:o})}return t}function ho(r,e,t){let n=[];for(let s of r.keys())!e.has(s)&&!t.has(s)&&n.push(s);return n}function ne(r,e){let t=e?.detectFn??j,n=e?.hubComparator??fo,s=t(r.nodes,e),o=uo(r,s),i=mo(r.nodes,s,o,n);return{features:go(s,i),unassigned:ho(r.nodes,s,i)}}var Cr=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),Fr=new Set(["typescript","javascript","python"]),Ae=new Set(["typescript","javascript","go","python"]);function mt(r){let e=new Map;for(let t of r.nodes.values())e.set(t.type,(e.get(t.type)??0)+1);return[...e.entries()].map(([t,n])=>({type:t,fileCount:n,exportsTracked:Cr.has(t),importSymbolsTracked:Fr.has(t),callEdgesTracked:Ae.has(t)})).sort((t,n)=>n.fileCount-t.fileCount)}var se=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let t=new Set(this.nodes.keys());return e.filter(n=>!t.has(n))}findHighExportUsage(e){let t=[];for(let n of this.nodes.values()){if(n.maxExportUsage===void 0||n.maxExportUsage<e)continue;let s=n.imports.reduce((o,i)=>(i.exportUsageRatio??0)>(o?.exportUsageRatio??0)?i:o,null);t.push({path:n.path,maxExportUsage:n.maxExportUsage,tightestDep:s?.toPath??""})}return t.sort((n,s)=>s.maxExportUsage-n.maxExportUsage)}findCycles(){let e=[],t=new Set,n=new Set,s=[],o=i=>{t.add(i),n.add(i),s.push(i);let a=this.nodes.get(i);if(a){for(let c of a.imports)if(!(!c.toPath||c.isExternal))if(n.has(c.toPath)){let p=s.indexOf(c.toPath);e.push([...s.slice(p),c.toPath])}else t.has(c.toPath)||o(c.toPath)}n.delete(i),s.pop()};for(let i of this.nodes.keys())t.has(i)||o(i);return e}};var M=class r{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let t=new Map;for(let n of e.nodes)t.set(n.path,n);return new r(t)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let t of this.nodes.values())for(let n of t.imports)if(n.toPath){let s=e.get(n.toPath)||[];s.push(t.path),e.set(n.toPath,s)}return this._incomingEdgesCache=e,e}dfs(e,t,n,s){let o=new Set,i=n.maxDepth??1/0,a=(c,p,l)=>{if(p>i||o.has(c))return;let f=this.nodes.get(c);if(f&&(o.add(c),t(f,p,l)!==!1))for(let d of s(c))a(d,p+1,c)};a(e,0,null)}traverse(e,t,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,t,n,i=>s==="outgoing"?this.nodes.get(i)?.imports.map(a=>a.toPath).filter(Boolean)??[]:o?.get(i)??[])}getCallIncomingCache(){if(this._callIncomingCache)return this._callIncomingCache;let e=new Map;for(let t of this.nodes.values())for(let n of t.callEdges??[]){let s=e.get(n.toFile)??[];s.push(t.path),e.set(n.toFile,s)}return this._callIncomingCache=e,e}traverseCalls(e,t,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getCallIncomingCache():null;this.dfs(e,t,n,i=>s==="outgoing"?this.nodes.get(i)?.callEdges?.map(a=>a.toFile)??[]:o?.get(i)??[])}getCallers(e){let t=[];return this.traverseCalls(e,n=>(n.path!==e&&t.push(n.path),!0),{direction:"incoming",maxDepth:1}),t}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let t=this.nodes.get(e);return t?t.imports.map(n=>this.nodes.get(n.toPath)).filter(n=>n!==void 0):[]}findUnusedFiles(e){return new se(this.nodes).findUnusedFiles(e)}findCycles(){return new se(this.nodes).findCycles()}};var W=class{affectedSymbols=new Map;constructor(e,t){this.affectedSymbols.set(e,new Set(["default",...t]))}updateAffectedSymbols(e,t){let n=this.affectedSymbols.get(t)||new Set,s=e.imports.find(c=>c.toPath===t);if(!s)return!1;let o=s.symbols||["*"],i=new Set;for(let c of o)(c==="*"||n.has("*")||n.has(c))&&i.add("*");if(i.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let c of i)a.add(c);return this.affectedSymbols.set(e.path,a),!0}};function oe(r,e){let t=r.nodes.get(e);if(t)return{category:t.category,exports:t.exports.map(n=>n.name)}}function gt(r,e,t=1){let n=[];return r.traverse(e,(s,o,i)=>{if(s.path===e)return!0;let a=i?r.nodes.get(i)?.imports.find(c=>c.toPath===s.path):void 0;return n.push({path:s.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:t}),n}function ie(r,e){let t=[];return r.traverse(e,n=>{if(n.path===e)return!0;let s=n.imports.find(o=>o.toPath===e);return t.push({path:n.path,...s?.symbols?{symbols:s.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),t}function dt(r,e,t={}){let{testsOnly:n=!1,changedSymbols:s}=t,o=s?new W(e,s):null,i=[];return r.traverse(e,(a,c,p)=>{if(a.path===e)return!0;if(o&&p&&!o.updateAffectedSymbols(a,p))return!1;let l=a.category==="test"||a.tags.some(f=>f.name==="test");return(!n||l)&&i.push(a.path),!0},{direction:"incoming"}),i}function ht(r,e,t={}){let{depth:n=1,withEdgeDetail:s=!1}=t,o=[];return r.traverseCalls(e,i=>{if(i.path===e)return!0;let a={file:i.path};return s&&(a.edges=(i.callEdges??[]).filter(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),o.push(a),!0},{direction:"incoming",maxDepth:n}),o}function yt(r,e={}){let{metric:t="cognitiveComplexity",threshold:n=10,limit:s=20}=e;return[...r.nodes.values()].flatMap(o=>(o.functions??[]).filter(i=>i[t]>=n).map(i=>({file:o.path,name:i.name,line:i.line,complexity:i.complexity,cognitiveComplexity:i.cognitiveComplexity}))).sort((o,i)=>i[t]-o[t]).slice(0,s)}function xt(r){return{nodes:r.nodes.map(t=>({path:t.path,type:t.type,category:t.category,exports:t.exports.map(n=>n.name),tags:t.tags.filter(n=>n.kind==="comment-marker"||n.kind==="import").map(n=>n.name),importsFiles:t.imports.filter(n=>!n.isExternal&&n.toPath).map(n=>n.toPath),...t.description!==void 0&&{description:t.description},...t.testedBy!==void 0&&{testedBy:t.testedBy},...t.coveragePct!==void 0&&{coveragePct:t.coveragePct},...t.avgExportUsage!==void 0&&{avgExportUsage:t.avgExportUsage},...t.maxExportUsage!==void 0&&{maxExportUsage:t.maxExportUsage}})),cycles:r.cycles}}function St(r){let e=r.getPackageDependencies(),t=Array.from(r.packages.values()).map(({graph:n,pkg:s})=>({name:s.name,relativeRoot:s.relativeRoot,nodeCount:n.nodes.size,dependsOn:e.get(s.name)??[]}));return{monorepoType:r.type,packageCount:t.length,packages:t}}function bt(r){return[...r.nodes.values()].some(e=>e.coveragePct!==void 0)}function Er(r){if(r.category==="test")return"test";if(r.category==="config")return"config";if(r.category==="type-only")return"types";let e=r.path;return b(e,"component")||b(e,"components")?"component":b(e,"controller")||b(e,"controllers")?"controller":b(e,"middleware")?"middleware":b(e,"router")||b(e,"routes")||b(e,"route")?"router":b(e,"store")||b(e,"stores")?"store":b(e,"service")||b(e,"services")?"service":b(e,"handler")||b(e,"handlers")?"handler":b(e,"adapter")||b(e,"adapters")?"adapter":b(e,"plugin")||b(e,"plugins")?"plugin":b(e,"api")?"api":b(e,"cli")||b(e,"commands")||ae(e)==="cli"?"cli":b(e,"util")||b(e,"utils")||b(e,"helper")||b(e,"helpers")?"util":b(e,"model")||b(e,"models")||ae(e)==="model"?"model":b(e,"parser")||b(e,"parsers")||ae(e)==="parser"?"parser":ae(e)==="builder"?"builder":ae(e)==="resolver"?"resolver":"other"}function b(r,e){return r.includes(`/${e}/`)||r.includes(`/${e}.`)}function ae(r){let e=r.slice(r.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function vt(r,e){let t=ne(r,e),n=new Map;for(let[o,i]of t.features){for(let a of i.files)n.set(a,o);n.set(i.hub,o)}let s=new Map;for(let o of r.nodes.values()){let i=n.get(o.path);s.set(o.path,{path:o.path,role:Er(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function kt(r,e){let t=[];for(let n of r.nodes.values())if(n.exports.some(s=>s.name===e))if(Ae.has(n.type)){let s=[];for(let o of r.nodes.values())for(let i of o.callEdges??[])i.to===e&&s.push({file:o.path,callerFunction:i.from});t.push({path:n.path,category:n.category,precision:"call",callers:s})}else{let s=ie(r,n.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));t.push({path:n.path,category:n.category,precision:"file-level",importers:s})}return t}function yo(r){return r?r.startsWith("interface ")?"interface":r.startsWith("class ")?"class":r.startsWith("enum ")?"enum":"type":"type"}function xo(r,e){if(e==="type-only")return!0;let t=r.signature??"";return t.startsWith("interface ")||t.startsWith("class ")||t.startsWith("enum ")}function wt(r){let e=new Map;for(let n of r.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript"))for(let s of n.exports){if(!xo(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:yo(s.signature),...s.doc?{doc:s.doc}:{}})}let t=[];for(let n of r.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript")){for(let s of n.imports)if(!(!s.toPath||s.isExternal||!s.symbols?.length))for(let o of s.symbols)e.has(`${s.toPath}::${o}`)&&t.push({fromFile:n.path,toType:o,toFile:s.toPath})}return{types:e,edges:t}}function Ct(r,e){let t=null;for(let o of r.types.values())if(o.name===e){t=o;break}if(!t)return{type:null,usedByFiles:[],uses:[]};let n=new Set,s=new Map;for(let o of r.edges)if(o.toType===e&&o.toFile===t.file&&n.add(o.fromFile),o.fromFile===t.file){let i=r.types.get(`${o.toFile}::${o.toType}`);i&&s.set(`${i.file}::${i.name}`,i)}return{type:t,usedByFiles:Array.from(n),uses:Array.from(s.values())}}import No from"path";import Et from"fs";import Nr from"path";import ce from"fs";import P from"path";import Tr from"fs";import ll from"path";function Pr(r){try{return Tr.statSync(r,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Ne(r){try{return Tr.statSync(r,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Ft(r,e){let t=P.join(e,"package.json");if(!ce.existsSync(t))return null;let n={};try{n=JSON.parse(ce.readFileSync(t,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:P.relative(r,e),entryPoints:So(e,n)}:null}function So(r,e){let t=[];if(e.exports){let s=e.exports;if(typeof s=="string")t.push(P.join(r,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")t.push(P.join(r,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&t.push(P.join(r,i))}}}e.main&&t.push(P.join(r,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])t.push(P.join(r,s));let n=t.filter(Ne);return n.length>0?n.slice(0,1):t.slice(0,1)}function H(r,e){let t=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");bo(r,o,n,t)}return t}function bo(r,e,t,n){if(!e.includes("*")){vo(r,e,t,n);return}let s=e.split("/");s.includes("**")?ko(r,s,t,n):wo(r,s,t,n)}function vo(r,e,t,n){let s=P.join(r,e);if(t.has(s)||!Pr(s))return;t.add(s);let o=Ft(r,s);o&&n.push(o)}function ko(r,e,t,n){let s=P.join(r,e[0]==="**"?"":e[0]??"");Ar(r,s,t,n)}function wo(r,e,t,n){let s=e.findIndex(a=>a.includes("*")),o=P.join(r,...e.slice(0,s)),i;try{i=ce.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=P.join(o,a.name);if(t.has(c))continue;t.add(c);let p=Ft(r,c);p&&n.push(p)}}function Ar(r,e,t,n){let s;try{s=ce.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=P.join(e,o.name);if(ce.existsSync(P.join(i,"package.json"))&&!t.has(i)){t.add(i);let a=Ft(r,i);a&&n.push(a)}else Ar(r,i,t,n)}}var Ir={type:"npm",detect(r){let e=Nr.join(r,"package.json");if(!Et.existsSync(e))return null;let t;try{t=JSON.parse(Et.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!t||Et.existsSync(Nr.join(r,"yarn.lock")))return null;let n=Array.isArray(t)?t:t.packages??[];return n.length===0?null:H(r,n)}};import Q from"fs";import F from"path";var Mr={type:"nx",detect(r){return Q.existsSync(F.join(r,"nx.json"))?Dr(r,r,new Set,0).map(t=>Co(r,t,F.join(t,"project.json"))).filter(t=>t!==null):null}};function Dr(r,e,t,n){if(n>4)return[];let s;try{s=Q.readdirSync(e,{withFileTypes:!0})}catch{return[]}let o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name;if(a.startsWith(".")||a==="node_modules"||a==="dist"||a===".nx")continue;let c=F.join(e,a);Q.existsSync(F.join(c,"project.json"))&&!t.has(c)?(t.add(c),o.push(c)):o.push(...Dr(r,c,t,n+1))}return o}function Co(r,e,t){let n={};try{n=JSON.parse(Q.readFileSync(t,"utf-8"))}catch{return null}let s=n.name,o,i,a=F.join(e,"package.json");if(Q.existsSync(a))try{let c=JSON.parse(Q.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:F.relative(r,e),entryPoints:Fo(e,n,o,i)}:null}function Fo(r,e,t,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=F.resolve(r,"../..");s.push(F.resolve(a,o)),s.push(F.resolve(r,o))}if(n){let a=n;if(typeof a=="string")s.push(F.join(r,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(F.join(r,c))}}if(t&&s.push(F.join(r,t)),e.sourceRoot){let a=F.resolve(r,"../.."),c=F.resolve(a,e.sourceRoot);s.push(F.join(c,"index.ts"),F.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(F.join(r,a));let i=s.filter(Ne);return i.length>0?i.slice(0,1):s.slice(0,1)}import Rr from"fs";import Eo from"path";import{load as To}from"js-yaml";var Gr={type:"pnpm",detect(r){let e=Eo.join(r,"pnpm-workspace.yaml");if(!Rr.existsSync(e))return null;let t=[];try{t=To(Rr.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return H(r,t)}};import Po from"fs";import Ao from"path";var Lr={type:"turborepo",detect(r){return Po.existsSync(Ao.join(r,"turbo.json"))?[]:null}};import Tt from"fs";import _r from"path";var Or={type:"yarn",detect(r){if(!Tt.existsSync(_r.join(r,"yarn.lock")))return null;let e=_r.join(r,"package.json");if(!Tt.existsSync(e))return null;let t;try{t=JSON.parse(Tt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!t)return null;let n=Array.isArray(t)?t:t.packages??[];return n.length===0?null:H(r,n)}};var jr=[];function R(r){jr.push(r)}function Wr(){return jr}R(Lr);R(Mr);R(Gr);R(Or);R(Ir);function pe(r,e=Wr()){let t=No.resolve(r),n=new Map,s=[];for(let i of e){let a=i.detect(t);if(a!==null){s.push(i.type);for(let c of a)n.has(c.name)||n.set(c.name,c)}}if(s.length===0)return{root:t,type:"none",types:[],packages:[],packageMap:new Map};let o=Array.from(n.values());return{root:t,type:s[0],types:s,packages:o,packageMap:new Map(o.map(i=>[i.name,i]))}}var le=class r{constructor(e,t){this.monorepoRoot=e;this.type=t}monorepoRoot;type;packages=new Map;addPackage(e,t){this.packages.set(e.name,{graph:t,pkg:e})}getPackageForFile(e){for(let{pkg:t}of this.packages.values())if(e===t.relativeRoot||e.startsWith(`${t.relativeRoot}/`))return t}getPackageDependencies(){let e=new Map;for(let{graph:t,pkg:n}of this.packages.values()){let s=new Set;for(let o of t.nodes.values())for(let i of o.imports)i.isWorkspace&&i.workspacePackage&&s.add(i.workspacePackage);e.set(n.name,[...s])}return e}getAffectedAcrossPackages(e){let t=this.getPackageForFile(e);if(!t)return[];let n=this.packages.get(t.name);if(!n)return[];let s=[];n.graph.traverse(e,o=>(o.path!==e&&s.push({file:o.path,package:t.name}),!0),{direction:"incoming"});for(let{graph:o,pkg:i}of this.packages.values())if(i.name!==t.name)for(let a of o.nodes.values())a.imports.some(p=>p.isWorkspace&&p.workspacePackage===t.name)&&s.push({file:a.path,package:i.name});return s}serialize(){return{monorepoRoot:this.monorepoRoot,type:this.type,packages:Array.from(this.packages.values()).map(({graph:e,pkg:t})=>({pkg:{name:t.name,relativeRoot:t.relativeRoot,entryPoints:t.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let t=new r(e.monorepoRoot,e.type);for(let{pkg:n,nodes:s}of e.packages){let o=new Map(s.map(a=>[a.path,a])),i=new M(o);t.packages.set(n.name,{graph:i,pkg:{...n,root:""}})}return t}};var zr=new Map;function q(r,e){zr.set(r,e)}function $r(r){return zr.get(r)}function Br(r,e){return e.startsWith("!")?r!==e.slice(1):r===e}function Io(r,e){return e.startsWith("!")?!r.includes(e.slice(1)):r.includes(e)}var Mo=(r,e)=>!e.category||Br(r.category,e.category),Do=(r,e)=>!e.type||Br(r.type,e.type),Ro=(r,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?r.lastAuthor!==e.lastAuthor.slice(1):r.lastAuthor!==void 0&&r.lastAuthor===e.lastAuthor:!0,Go=(r,e)=>!e.path||Io(r.path,e.path),Lo=(r,e)=>e.isExternal===void 0?!0:r.imports.some(n=>n.isExternal)===e.isExternal,_o=(r,e)=>{if(!e.tags||e.tags.length===0)return!0;let t=e.tags.filter(s=>!s.startsWith("!")),n=e.tags.filter(s=>s.startsWith("!")).map(s=>s.slice(1));return!(t.length>0&&!t.some(s=>r.tags.some(o=>o.name===s))||n.some(s=>r.tags.some(o=>o.name===s)))},Oo=(r,e)=>!e.allTags?.length||e.allTags.every(t=>r.tags.some(n=>n.name===t)),jo=(r,e)=>!e.importsFile||r.imports.some(t=>t.toPath?.includes(e.importsFile)),Wo=(r,e,t)=>e.importedBy===void 0?!0:(t?.get(r.path)??[]).some(s=>s.includes(e.importedBy)),zo=(r,e)=>e.minImports===void 0||r.imports.length>=e.minImports,$o=(r,e)=>e.maxImports===void 0||r.imports.length<=e.maxImports,Bo=(r,e)=>e.minSize===void 0||r.size>=e.minSize,Uo=(r,e)=>e.maxSize===void 0||r.size<=e.maxSize,Ko=(r,e)=>e.hasDocstring===void 0||!!r.description===e.hasDocstring,Jo=(r,e)=>e.isDocumented===void 0||!!r.documentedBy?.length===e.isDocumented,Vo=(r,e)=>e.isStale===void 0||!!r.staleFor?.length===e.isStale,Ho=(r,e)=>e.minCoverage===void 0||(r.coveragePct??101)>=e.minCoverage,Qo=(r,e)=>e.maxCoverage===void 0||(r.coveragePct??0)<=e.maxCoverage,qo=(r,e)=>e.minExportUsage===void 0||(r.avgExportUsage??-1)>=e.minExportUsage,Xo=(r,e)=>e.maxExportUsage===void 0||(r.avgExportUsage??0)<=e.maxExportUsage,Yo=(r,e)=>e.minComplexity===void 0||(r.complexity??-1/0)>=e.minComplexity,Zo=(r,e)=>e.maxComplexity===void 0||(r.complexity??0)<=e.maxComplexity,ei=(r,e)=>e.minCognitiveComplexity===void 0||(r.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,ti=(r,e)=>e.maxCognitiveComplexity===void 0||(r.cognitiveComplexity??0)<=e.maxCognitiveComplexity,ri=(r,e)=>e.minCommits===void 0||(r.commitCount90d??-1/0)>=e.minCommits,ni=(r,e)=>e.maxCommits===void 0||(r.commitCount90d??0)<=e.maxCommits,si=(r,e,t)=>!e.any?.length||e.any.some(n=>fe(r,n,t)),oi=[Mo,Do,Ro,Go,Lo,_o,Oo,jo,Wo,zo,$o,Bo,Uo,Ko,Jo,Vo,Ho,Qo,qo,Xo,Yo,Zo,ei,ti,ri,ni,si];function fe(r,e,t){return oi.every(n=>n(r,e,t))}function Ie(r,e){let t=new Map;if(e.importedBy!==void 0){for(let i of r.nodes)for(let a of i.imports)if(a.toPath){let c=t.get(a.toPath)??[];c.push(i.path),t.set(a.toPath,c)}}let n=r.nodes.filter(i=>fe(i,e,t)),s=new Set(n.map(i=>i.path)),o=n.map(i=>({...i,imports:i.imports.filter(a=>!a.toPath||s.has(a.toPath))}));if(e.sort){let i=e.sortDir==="asc"?-1:1;o.sort((a,c)=>{let p=0;return e.sort==="size"?p=c.size-a.size:e.sort==="imports"?p=c.imports.length-a.imports.length:e.sort==="commitCount90d"?p=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?p=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?p=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(p=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),p*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:r.cycles?.filter(i=>i.every(a=>s.has(a)))??void 0}}function Ur(r,e){let t=e.indexOf(":");if(t===-1)return;let n=e.slice(0,t).trim().toLowerCase(),s=e.slice(t+1).trim();if(!(!n||!s))switch(n){case"category":r.category=s;break;case"type":r.type=s;break;case"tag":case"tags":s.includes("+")?r.allTags=[...r.allTags??[],...s.split("+")]:r.tags=[...r.tags??[],s];break;case"path":r.path=s;break;case"external":r.isExternal=s.toLowerCase()==="true";break;case"importsfile":r.importsFile=s;break;case"importedby":r.importedBy=s;break;case"minimports":r.minImports=parseInt(s,10);break;case"maximports":r.maxImports=parseInt(s,10);break;case"minsize":r.minSize=parseInt(s,10);break;case"maxsize":r.maxSize=parseInt(s,10);break;case"sort":r.sort=s;break;case"sortdir":r.sortDir=s.toLowerCase()==="asc"?"asc":"desc";break;case"limit":r.limit=parseInt(s,10);break;case"hasdocstring":r.hasDocstring=s.toLowerCase()!=="false";break;case"mincoverage":r.minCoverage=parseInt(s,10);break;case"maxcoverage":r.maxCoverage=parseInt(s,10);break;case"minexportusage":r.minExportUsage=parseFloat(s);break;case"maxexportusage":r.maxExportUsage=parseFloat(s);break;case"mincomplexity":r.minComplexity=parseInt(s,10);break;case"maxcomplexity":r.maxComplexity=parseInt(s,10);break;case"mincognitivecomplexity":r.minCognitiveComplexity=parseInt(s,10);break;case"maxcognitivecomplexity":r.maxCognitiveComplexity=parseInt(s,10);break;case"mincommits":r.minCommits=parseInt(s,10);break;case"maxcommits":r.maxCommits=parseInt(s,10);break;case"isdocumented":r.isDocumented=s.toLowerCase()!=="false";break;case"isstale":r.isStale=s.toLowerCase()!=="false";break;case"lastauthor":r.lastAuthor=s;break}}function ii(r){let e=[];for(let t of r.split("|")){let n=t.trim();if(!n)continue;let s={};Ur(s,n),Object.keys(s).length>0&&e.push(s)}return e}function Me(r){let e={},t=r.split(",");for(let n of t){let s=n.trim();if(s.toLowerCase().startsWith("any(")&&s.endsWith(")")){let o=s.slice(4,-1),i=ii(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}Ur(e,n)}return e}import Yr from"fs/promises";import Ni from"path";import jt from"path";import ze from"typescript";import pi from"path";import ai from"path";import C from"typescript";var Kr=new Set(["describe","test","it"]);function z(r,e){let t=r[e];if(t===void 0)throw new Error(`Index ${e} out of bounds (length ${r.length})`);return t}function Pt(r){let e=[];for(let t of r.statements){if(!C.isExpressionStatement(t))continue;let n=t.expression;if(!C.isCallExpression(n))continue;let s=n.expression;C.isIdentifier(s)&&Kr.has(s.text)&&e.push(n),C.isPropertyAccessExpression(s)&&C.isIdentifier(s.expression)&&Kr.has(s.expression.text)&&e.push(n)}return e}function At(r,e,t){for(let n of r.arguments){if(!C.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>C.isPropertyAssignment(o)&&C.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!C.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(C.isStringLiteral).map(o=>o.text)}return null}function Nt(r,e,t,n){if(r.arguments.length===0)return null;for(let o=1;o<r.arguments.length;o++){let i=z(r.arguments,o);if(!C.isObjectLiteralExpression(i))continue;let a=i.properties.find(p=>C.isPropertyAssignment(p)&&C.isIdentifier(p.name)&&p.name.text===e);if(a)return{start:a.initializer.getStart(n),end:a.initializer.getEnd(),text:t};let c=i.getEnd()-1;return{start:c,end:c,text:`${i.properties.length>0?", ":""}${e}: ${t}`}}let s=z(r.arguments,r.arguments.length-1);return{start:s.getStart(n),end:s.getStart(n),text:`{ ${e}: ${t} }, `}}function It(r,e,t){let n=r.arguments;for(let s=1;s<n.length;s++){let o=z(n,s);if(!C.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>C.isPropertyAssignment(c)&&C.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:z(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=z(o.properties,i);return i===o.properties.length-1?{start:z(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(t),end:z(o.properties,i+1).getStart(t),text:""}}return null}function Mt(r,e){let t=[...e].sort((s,o)=>o.start-s.start),n=r;for(let s of t)n=n.slice(0,s.start)+s.text+n.slice(s.end);return n}function Dt(r){return`[${r.map(e=>JSON.stringify(e)).join(", ")}]`}var N=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function ci(r){return r.map(e=>e.startsWith("@")?e.slice(1):e)}function De(r,e,t,n){let s=C.createSourceFile(ai.basename(r),e,C.ScriptTarget.Latest,!0),o=Pt(s),[i]=o;if(!i)return e;let a=At(i,n,s),c=[...t].sort();if(a!==null&&JSON.stringify(ci(a).sort())===JSON.stringify(c))return e;let p=Dt(c.map(f=>`@${f}`)),l=o.flatMap(f=>{let d=t.length===0?It(f,n,s):Nt(f,n,p,s);return d?[d]:[]});return l.length>0?Mt(e,l):e}var Re=class{name="cypress";canHandle(e){return N.has(pi.extname(e).toLowerCase())}apply(e,t,n){return De(e,t,n,"tags")}};import li from"path";var Rt=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Gt=/^@([a-zA-Z0-9_-]+)/gm;function fi(r){return`${["# <mokosh-tags>",...r.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
8
+ `)}
5
9
 
6
- `}function Do(r){let e=new Set;Tt.lastIndex=0;let t=Tt.exec(r);for(;t!==null;)t[1]&&e.add(t[1]),t=Tt.exec(r);return e}var Ge=class{name="gherkin";canHandle(e){return Io.extname(e).toLowerCase()===".feature"}apply(e,t,s){let n=t.replace(Ft,""),o=Do(n),i=s.filter(c=>!o.has(c)),a=i.length>0?Ro(i):"";return Ft.test(t)?t.replace(Ft,a):a?t.replace(/^(Feature:)/m,`${a}$1`):t}};function Rr(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 Go from"path";var Pt=/^\/\/go:build mokosh_[^\n]+\n/m,Lo=/^package\s+\S+/m;function _o(r){return`//go:build ${r.map(t=>`mokosh_${t}`).join(" || ")}
7
- `}function Oo(r){let e=Pt.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 Le=class{name="go";canHandle(e){return Go.basename(e).endsWith("_test.go")}apply(e,t,s){let n=Oo(t),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return t;if(s.length===0)return t.replace(Pt,"");let i=_o(o);if(n!==null)return t.replace(Pt,i);let a=Lo.exec(t);if(!a)return t;let c=a.index;return t.slice(0,c)+i+`
8
- `+t.slice(c)}};import jo from"path";var Wo=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,At=/^ \* @group (.+)$/gm;function zo(r){return["/**",...r.map(e=>` * @group ${e}`)," */"].join(`
9
- `)+`
10
+ `}function ui(r){let e=new Set;Gt.lastIndex=0;let t=Gt.exec(r);for(;t!==null;)t[1]&&e.add(t[1]),t=Gt.exec(r);return e}var Ge=class{name="gherkin";canHandle(e){return li.extname(e).toLowerCase()===".feature"}apply(e,t,n){let s=t.replace(Rt,""),o=ui(s),i=n.filter(c=>!o.has(c)),a=i.length>0?fi(i):"";return Rt.test(t)?t.replace(Rt,a):a?t.replace(/^(Feature:)/m,`${a}$1`):t}};function Jr(r,e){let t=r.replace(/\\/g,"/"),n=e.replace(/\\/g,"/"),s="";for(let o=0;o<t.length;o++){let i=t[o];i==="*"?t[o+1]==="*"?(s+=".*",o++):s+="[^/]*":i==="?"?s+="[^/]":i!==void 0&&(s+=i.replace(/[.+^${}()|[\]\\]/g,"\\$&"))}return new RegExp(`^${s}$`).test(n)}import mi from"path";var Lt=/^\/\/go:build mokosh_[^\n]+\n/m,gi=/^package\s+\S+/m;function di(r){return`//go:build ${r.map(t=>`mokosh_${t}`).join(" || ")}
11
+ `}function hi(r){let e=Lt.exec(r);if(!e)return null;let t=e[0]??"",n=/mokosh_([a-zA-Z0-9_-]+)/g,s=[],o=n.exec(t);for(;o!==null;)o[1]&&s.push(o[1]),o=n.exec(t);return s}var Le=class{name="go";canHandle(e){return mi.basename(e).endsWith("_test.go")}apply(e,t,n){let s=hi(t),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return t;if(n.length===0)return t.replace(Lt,"");let i=di(o);if(s!==null)return t.replace(Lt,i);let a=gi.exec(t);if(!a)return t;let c=a.index;return`${t.slice(0,c)+i}
12
+ ${t.slice(c)}`}};import yi from"path";var xi=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,_t=/^ \* @group (.+)$/gm;function Si(r){return`${["/**",...r.map(e=>` * @group ${e}`)," */"].join(`
13
+ `)}
10
14
 
11
- `}function $o(r){let e=[];At.lastIndex=0;let t=At.exec(r);for(;t!==null;)t[1]&&e.push(t[1]),t=At.exec(r);return e}var _e=class{name="jest";canHandle(e){return N.has(jo.extname(e).toLowerCase())}apply(e,t,s){let n=Wo.exec(t),o=n?$o(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:zo(i)+a}};import Dr from"path";import Gr from"typescript";function Bo(r){return Z(r.map(e=>`@${e}`))}function Uo(r){return r.map(e=>e.startsWith("@")?e.slice(1):e)}var Oe=class{name="playwright";canHandle(e){return N.has(Dr.extname(e).toLowerCase())}apply(e,t,s){let n=Gr.createSourceFile(Dr.basename(e),t,Gr.ScriptTarget.Latest,!0),o=H(n);if(o.length===0)return t;let i=Q(o[0],"tag",n),a=[...s].sort();if(i!==null&&JSON.stringify(Uo(i).sort())===JSON.stringify(a))return t;let c=o.flatMap(p=>{let l=s.length===0?X(p,"tag",n):q(p,"tag",Bo(a),n);return l?[l]:[]});return c.length>0?Y(t,c):t}};import Ko from"path";var Nt=/^pytestmark\s*=\s*.+$/m,Jo=/^import pytest\s*$/m;function Vo(r){let e=r.map(t=>`pytest.mark.${t}`).join(", ");return r.length===1?`pytestmark = pytest.mark.${r[0]}`:`pytestmark = [${e}]`}function Ho(r){let e=Nt.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 je=class{name="pytest";canHandle(e){return Ko.extname(e).toLowerCase()===".py"}apply(e,t,s){let n=Ho(t),o=[...s].sort();if(n!==null&&JSON.stringify([...n].sort())===JSON.stringify(o))return t;if(s.length===0)return t.replace(Nt,"").replace(/\n{3,}/g,`
15
+ `}function bi(r){let e=[];_t.lastIndex=0;let t=_t.exec(r);for(;t!==null;)t[1]&&e.push(t[1]),t=_t.exec(r);return e}var _e=class{name="jest";canHandle(e){return N.has(yi.extname(e).toLowerCase())}apply(e,t,n){let s=xi.exec(t),o=s?bi(s[0]):null,i=[...n].sort();if(o!==null&&JSON.stringify([...o].sort())===JSON.stringify(i))return t;let a=s?t.slice(s[0].length):t;return n.length===0?a:Si(i)+a}};import vi from"path";var Oe=class{name="playwright";canHandle(e){return N.has(vi.extname(e).toLowerCase())}apply(e,t,n){return De(e,t,n,"tag")}};import ki from"path";var Ot=/^pytestmark\s*=\s*.+$/m,wi=/^import pytest\s*$/m;function Ci(r){let e=r.map(t=>`pytest.mark.${t}`).join(", ");return r.length===1?`pytestmark = pytest.mark.${r[0]}`:`pytestmark = [${e}]`}function Fi(r){let e=Ot.exec(r);if(!e)return null;let t=e[0],n=[],s=/pytest\.mark\.([a-zA-Z0-9_-]+)/g,o=s.exec(t);for(;o!==null;)o[1]&&n.push(o[1]),o=s.exec(t);return n}var je=class{name="pytest";canHandle(e){return ki.extname(e).toLowerCase()===".py"}apply(e,t,n){let s=Fi(t),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return t;if(n.length===0)return t.replace(Ot,"").replace(/\n{3,}/g,`
12
16
 
13
- `);let i=Vo(o);if(n!==null)return t.replace(Nt,i);let a=Jo.test(t),c=Qo(t),p=t.slice(0,c),l=t.slice(c),g=a?"":`import pytest
17
+ `);let i=Ci(o);if(s!==null)return t.replace(Ot,i);let a=wi.test(t),c=Ei(t),p=t.slice(0,c),l=t.slice(c),f=a?"":`import pytest
14
18
  `,d=p.endsWith(`
15
19
 
16
20
  `)?"":`
17
- `;return p+d+g+i+`
18
- `+l}};function Qo(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 Lr from"path";import _r from"typescript";var qo=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,We=class{name="vitest";canHandle(e){return N.has(Lr.extname(e).toLowerCase())}apply(e,t,s){let n=t.replace(qo,""),o=_r.createSourceFile(Lr.basename(e),n,_r.ScriptTarget.Latest,!0),i=H(o);if(i.length===0)return n;let a=Q(i[0],"tags",o),c=[...s].sort();if(a!==null&&JSON.stringify([...a].sort())===JSON.stringify(c))return n;let p=i.flatMap(l=>{let g=s.length===0?X(l,"tags",o):q(l,"tags",Z(c),o);return g?[g]:[]});return p.length>0?Y(n,p):n}};var Or={vitest:()=>new We,playwright:()=>new Oe,cypress:()=>new De,jest:()=>new _e},Xo={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function Yo(r){let e=ze.createSourceFile("detect.ts",r,ze.ScriptTarget.Latest,!0);for(let t of e.statements){if(!ze.isImportDeclaration(t)||!ze.isStringLiteral(t.moduleSpecifier))continue;let s=Xo[t.moduleSpecifier.text];if(s)return s}return null}var It=class{constructor(e,t,s){this.rootDir=e;this.defaultFramework=t;this.frameworkOverrides=s}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return N.has(Mt.extname(e).toLowerCase())}apply(e,t,s){let n=Yo(t)??this.matchOverride(e)??this.defaultFramework;return(Or[n]??Or.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(Rr(s,t))return n;return null}};function jr(r="vitest",e={},t=process.cwd()){return[new Ge,new je,new Le,new It(t,r,Object.entries(e))]}function Wr(r,e){return e.find(t=>t.canHandle(r))??null}var ei=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,ti=new Set(["import"]),ri=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function si(r,e,t,s){let n;try{n=await zr.readFile(r,"utf8")}catch(a){return{path:r,status:"error",error:String(a)}}let o=Wr(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 zr.writeFile(r,i,"utf8"),{path:r,status:"updated"})}async function Rt(r,e,t){let s=se(e),n=s.tagApplier?.framework??"vitest",o=s.tagApplier?.frameworkOverrides??{},i=jr(n,o,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let c of r.nodes.values()){if(c.category!=="test")continue;let p=new Set,l=[];for(let h of c.tags)ti.has(h.kind)&&ei.test(h.name)&&(ri.has(h.name.toLowerCase())||p.has(h.name)||(p.add(h.name),l.push(h.name)));l.sort();let g=Zo.resolve(e,c.path),d=await si(g,l,t.dryRun,i);d.path=c.path,a.files.push(d),d.status==="updated"?a.updated++:d.status==="unchanged"?a.unchanged++:a.errors++}return a}var $e=class{isTestNode(e){return e.category==="test"||e.tags.some(t=>t.name==="test")}};import ve from"fs";import F from"path";import nc from"piscina";import{execFileSync as Dt}from"child_process";var Be=class{getChangedFiles(){try{let t=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(s=>{try{return Dt("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(t))}catch(e){return console.error("Error getting git diff:",e),[]}}},$r="%x00%H%x09%ae%x09%at",Br=256*1024*1024;function Ur(r,e){let t="",s=0;for(let n of r.split(`
21
- `)){if(n.startsWith("\0")){let[,c,p]=n.slice(1).split(" ");t=c??"",s=p?Number(p)*1e3:0;continue}if(n==="")continue;let o=n.split(" "),i=o[0];if(!i)continue;let a=i.startsWith("R")||i.startsWith("C")?o[2]:o[1];a&&e(a,t,s)}}function Kr(r){let e=new Map;try{let t=Dt("git",["-C",r,"log","--since=90 days ago","--name-status","-M",`--format=${$r}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Br});Ur(t,(s,n,o)=>{let i=e.get(s);if(i){i.commitCount90d+=1;return}e.set(s,{commitCount90d:1,lastAuthor:n||void 0,lastCommitAt:o||void 0})})}catch{return e}try{let t=Dt("git",["-C",r,"log","--name-status","-M",`--format=${$r}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Br});Ur(t,(s,n,o)=>{e.has(s)||e.set(s,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}import Ue from"fs";import ni from"path";import{load as Jr}from"js-yaml";function Vr(r){let e=r.lastIndexOf("@");return e>0?r.substring(0,e):r}function oi(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)),Vr(t)}).filter(Boolean)}function ii(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 ai(r){try{let e=Jr(r),t={dependencies:{}};for(let[s,n]of Object.entries(e))if(!(s==="__metadata"||!n?.version))for(let o of s.split(", ")){let i=Vr(o);i&&(t.dependencies[i]={version:n.version,...n.dependencies!==void 0&&{dependencies:n.dependencies}})}return t}catch{return null}}function ci(r){let e={dependencies:{}};for(let t of r.split(/\n\n+/)){let s=t.split(`
22
- `).filter(c=>c.trim().length>0&&!c.trim().startsWith("#"));if(s.length<2)continue;let n=s[0];if(!n||n.startsWith(" "))continue;let o=oi(n);if(o.length===0)continue;let a=s.find(c=>c.trim().startsWith('version "'))?.match(/version "(.*?)"/)?.[1]??"";for(let c of o)e.dependencies[c]={version:a}}return e}function pi(r){let e=Ue.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 li(r){let e=Ue.readFileSync(r,"utf-8");if(e.includes("__metadata:")){let t=ai(e);if(t!==null)return t}return ci(e)}function fi(r){let e=Ue.readFileSync(r,"utf-8"),t={dependencies:{}};try{let s=Jr(e);if(s.packages)for(let[n,o]of Object.entries(s.packages)){let{name:i,version:a}=ii(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 Hr(r){let e=[["package-lock.json",pi],["yarn.lock",li],["pnpm-lock.yaml",fi]];for(let[t,s]of e){let n=ni.join(r,t);if(Ue.existsSync(n))return s(n)}return null}import Qr from"path";function R(r){switch(Qr.extname(r).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function P(r){let e=Qr.extname(r).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import ui from"coffeescript";function D(r){return r.startsWith("'")||r.startsWith('"')?r.slice(1,-1):r}function Xr(r){if(r){if(typeof r.originalValue=="string")return r.originalValue;if(typeof r.value=="string")return D(r.value)}}function O(r){if(r){if(typeof r.value=="string")return r.value;if(typeof r.base?.value=="string")return r.base.value}}function mi(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 gi(r,e){let t=r.toLowerCase();return t.includes(".test.")||t.includes(".spec.")||e.has("test")?"test":"logic"}function di(r,e){let t=Xr(e.source);return t?{fromPath:r,toPath:"",rawSpecifier:t,isStyle:P(t),type:"static"}:null}function hi(r,e){let t=e.variable?.base?.value==="require",s=Xr(e.args?.[0]?.base);return!t||!s?null:{fromPath:r,toPath:"",rawSpecifier:s,isStyle:P(s),type:"require"}}function qr(r,e){if(e)return[{name:e}];let t=r.value;if(t?.constructor?.name==="Class"){let n=O(t.variable);return n?[{name:n}]:[]}if(t?.base?.constructor?.name==="Obj"&&Array.isArray(t.base.properties))return t.base.properties.map(n=>O(n.variable)??O(n)).filter(n=>!!n).map(n=>({name:n}));let s=O(t);return s?[{name:s}]:[]}function yi(r){if(Array.isArray(r.specifiers))return r.specifiers.map(t=>t.identifier??t.original?.value).filter(t=>!!t).map(t=>({name:t}));let e=O(r.variable)??O(r.variable?.base);return e?[{name:e}]:[]}function xi(r,e,t,s){let n=e.constructor?.name;if(n==="ImportDeclaration"){let o=di(r,e);o&&t.push(o)}else if(n==="Call"){let o=hi(r,e);o&&t.push(o)}else if(n==="Assign"){let o=O(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?s.push(...qr(e,void 0)):o==="exports"&&typeof i=="string"&&s.push(...qr(e,i))}else n==="ExportNamedDeclaration"&&e.clause?s.push(...yi(e.clause)):n==="ExportDefaultDeclaration"&&s.push({name:"default"})}function Gt(r,e,t,s){if(!(!e||typeof e!="object")){xi(r,e,t,s);for(let n in e){if(n==="locationData")continue;let o=e[n];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)Gt(r,i,t,s);else Gt(r,o,t,s)}}}function Yr(r,e){let t=mi(e),s=gi(r,t),n=[],o=[];try{Gt(r,ui.nodes(e),n,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:n,exports:a,tags:Array.from(t).map(c=>({name:c,kind:"comment-marker"})),category:s}}import{AstBuilder as Si,GherkinClassicTokenMatcher as bi,Parser as vi}from"@cucumber/gherkin";import{IdGenerator as Ci}from"@cucumber/messages";var ki=Ci.uuid();function Lt(r,e){let t=new Set;try{let s=new Si(ki),n=new bi,i=new vi(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(c=>{t.add(c.name.startsWith("@")?c.name.slice(1):c.name)}),a.scenario.examples.forEach(c=>{c.tags.forEach(p=>{t.add(p.name.startsWith("@")?p.name.slice(1):p.name)})})),a.rule&&a.rule.children.forEach(c=>{c.scenario&&c.scenario.tags.forEach(p=>{t.add(p.name.startsWith("@")?p.name.slice(1):p.name)})})}))}catch(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"}}V("gherkin",Lt);import Fi from"path";import{parser as Ti}from"@lezer/go";function j(r){let e=[],t=r.firstChild;for(;t;)e.push(t),t=t.nextSibling;return e}function me(r,e){let t=1;for(let s=0;s<e&&s<r.length;s++)r[s]===`
23
- `&&t++;return t}function wi(r,e){let t=1;function s(n){switch(n.type.name){case"IfStatement":case"ForStatement":t++;break;case"Case":{n.firstChild?.type.name==="case"&&t++;break}case"LogicOp":{let i=e.slice(n.from,n.to);(i==="&&"||i==="||")&&t++;break}}let o=n.firstChild;for(;o;)s(o),o=o.nextSibling}return s(r),t}function Ei(r,e){let t=0;function s(n,o,i){let a=n.type.name;if(a==="IfStatement"){t+=i?1:1+o;let l=j(n),g=i?o:o+1,d=l[1];d&&d.type.name!=="Block"&&s(d,g,!1);let h=l.find(S=>S.type.name==="Block");h&&s(h,g,!1);let v=l.findIndex(S=>S.type.name==="else");if(v>=0){let S=l[v+1];S?.type.name==="IfStatement"?s(S,o,!0):S&&(t+=1,s(S,o+1,!1))}return}if(a==="ForStatement"||a==="SwitchStatement"||a==="SelectStatement"){t+=1+o;let l=n.firstChild;for(;l;)s(l,o+1,!1),l=l.nextSibling;return}if(a==="LogicOp"){let l=e.slice(n.from,n.to);(l==="&&"||l==="||")&&(t+=1)}if(o>0&&a==="FunctionLiteral"){t+=1+o;let l=n.firstChild;for(;l;)s(l,o+1,!1),l=l.nextSibling;return}let p=n.firstChild;for(;p;)s(p,o,!1),p=p.nextSibling}return s(r,0,!1),t}function Ke(r,e){return{complexity:wi(r,e),cognitiveComplexity:Ei(r,e)}}function _t(r,e){let s=r.getChild("Parameters")?.getChild("Parameter"),n=s?.getChild("TypeName")??s?.getChild("PointerType")?.getChild("TypeName");return n?e.slice(n.from,n.to):void 0}function Zr(r,e){let t=[],s=r.cursor();do if(s.name==="FunctionDecl"){let n=s.node.getChild("DefName");if(n){let o=e.slice(n.from,n.to),{complexity:i,cognitiveComplexity:a}=Ke(s.node,e);t.push({name:o,line:me(e,s.from),complexity:i,cognitiveComplexity:a})}}else if(s.name==="MethodDecl"){let n=s.node.getChild("FieldName");if(n){let o=e.slice(n.from,n.to),i=_t(s.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:p}=Ke(s.node,e);t.push({name:a,line:me(e,s.from),complexity:c,cognitiveComplexity:p})}}while(s.next());return t}var Pi=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Ai=/^\/\/go:build\s+(.+)$/,Ni=/^\/\/\s*\+build\s+(.+)$/;function ts(r,e){let t=[],s=new Map,n=new Set,o=new Set,i=new Map,a=Ti.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let k=e.slice(c.from,c.to),A=k.match(Pi);A?.[1]&&n.add(A[1]);let $=k.match(Ai);$&&es($[1],o);let B=k.match(Ni);B&&es(B[1],o);break}case"ImportSpec":{let k=c.node.getChild("String");if(k){let $=e.slice(k.from,k.to).slice(1,-1);t.push({fromPath:r,toPath:"",rawSpecifier:$,isExternal:!0,isStyle:!1,type:"static"});let B=c.node.getChild("DefName"),we=B?e.slice(B.from,B.to):$.split("/").pop();we&&we!=="_"&&we!=="."&&i.set(we,$)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let k=c.node.getChild("DefName")??c.node.getChild("FieldName")??c.node.getChild("TypeSpec")?.getChild("DefName")??c.node.getChild("VarSpec")?.getChild("DefName")??c.node.getChild("ConstSpec")?.getChild("DefName");if(k){let A=e.slice(k.from,k.to);A!=="_"&&/^[A-Z]/.test(A)&&!s.has(A)&&s.set(A,{name:A})}break}}while(c.next());let p=t.some(k=>k.rawSpecifier==="testing"),l=Fi.basename(r).endsWith("_test.go")||n.has("test")||p?"test":"logic",g=new Set([...n,...o]),{complexity:d,cognitiveComplexity:h}=Ke(a.topNode,e),v=Zr(a,e),S=l==="test"?[]:Mi(a,e,i);return{imports:t,exports:Array.from(s.values()),tags:Array.from(g).map(k=>({name:k,kind:"comment-marker"})),category:l,rawCallEdges:S,complexity:d,cognitiveComplexity:h,...v.length>0?{functions:v}:{}}}function Mi(r,e,t){let s=[];function n(i,a){if(i.type.name==="CallExpr"){let p=i.firstChild;if(p?.type.name==="SelectorExpr"){let l=p.firstChild,g=p.getChild("FieldName");if(l?.type.name==="VariableName"&&g){let d=e.slice(l.from,l.to),h=t.get(d);if(h){let v=e.slice(g.from,g.to);s.push({from:a,to:v,toSpecifier:h})}}}}let c=i.firstChild;for(;c;)n(c,a),c=c.nextSibling}let o=r.cursor();do if(o.name==="FunctionDecl"){let i=o.node.getChild("DefName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to);/^[A-Z]/.test(c)&&n(a,c)}}else if(o.name==="MethodDecl"){let i=o.node.getChild("FieldName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to),p=_t(o.node,e);n(a,p?`${p}.${c}`:c)}}while(o.next());return s}function es(r,e){for(let t of r.split(/[\s,&|!()]+/)){let s=t.trim();s&&s!=="ignore"&&e.add(s)}}import Ii from"livescript";function Ri(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 Di(r,e){let t=r.toLowerCase();return t.includes(".test.")||t.includes(".spec.")||e.has("test")?"test":"logic"}function W(r){if(r){if(typeof r.value=="string")return r.value;if(typeof r.base?.value=="string")return r.base.value}}function Gi(r){if(!r)return[];if(r.constructor?.name==="Class"){let t=W(r.title);return t?[{name:t}]:[]}if(r.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(t=>W(t.key)??W(t.val)).filter(t=>!!t).map(t=>({name:t}));let e=W(r);return e?[{name:e}]:[]}function Li(r){let e=r.constructor?.name||r.type;if(e==="Assign"&&r.left?.constructor?.name==="Chain"){let t=r.left,s=W(t.head),o=t.tails?.[0]?.key?.name;if(s==="module"&&o==="exports")return Gi(r.right);if(s==="exports"&&typeof o=="string")return[{name:o}];if(t.head?.verb==="out"&&typeof o=="string")return[{name:o}]}if(e==="Import"&&r.left?.verb==="out"){let t=r.right;if(t?.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(s=>W(s.val)??W(s.key)).filter(s=>!!s).map(s=>({name:s}))}return[]}var _i=new Set(["first_line","first_column","last_line","last_column","line","column"]);function Oi(r,e){let t=r.constructor?.name||r.type;if(t==="Import"){let s=r.right?.value;if(typeof s=="string"){let n=D(s);return{fromPath:e,toPath:"",rawSpecifier:n,isStyle:P(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=D(n);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:P(o),type:"require"}}}}return null}function Ot(r,e,t){if(!r||typeof r!="object")return[];let s=[],n=Oi(r,e);n&&s.push(n),t.push(...Li(r));for(let o in r){if(_i.has(o))continue;let i=r[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)s.push(...Ot(a,e,t));else s.push(...Ot(i,e,t))}return s}function rs(r,e){let t=Ri(e),s=Di(r,t),n=[],o=[];try{n=Ot(Ii.ast(e),r,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:n,exports:a,tags:Array.from(t).map(c=>({name:c,kind:"comment-marker"})),category:s}}import ji from"luaparse";function Wi(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 zi(r,e){let t=r.toLowerCase();return t.includes(".test.")||t.includes(".spec.")||e.has("test")?"test":"logic"}function $i(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=D(i.raw))}else if(n.type==="StringCallExpression"){let i=n.argument;i?.type==="StringLiteral"&&(o=D(i.raw))}o&&t.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:P(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 Bi(r){let e=new Set;for(let t of r)t.type==="LocalStatement"&&t.variables.forEach((s,n)=>{t.init[n]?.type==="TableConstructorExpression"&&e.add(s.name)});return e}function Ui(r){let e=r[r.length-1];if(e?.type!=="ReturnStatement")return[];let t=e.arguments[0];if(t?.type!=="TableConstructorExpression")return[];let s=[];for(let n of t.fields)n.type==="TableKeyString"&&s.push({name:n.key.name});return s}function Ki(r){let e=r.body,t=Bi(e),s=Ui(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&t.has(o.identifier.base.name)&&s.push({name:o.identifier.identifier.name}):o.identifier?.type==="Identifier"&&!o.isLocal&&s.push({name:o.identifier.name});else if(o.type==="AssignmentStatement")for(let i of o.variables)i.type==="MemberExpression"&&i.base.type==="Identifier"&&t.has(i.base.name)&&s.push({name:i.identifier.name});let n=new Set;return s.filter(o=>n.has(o.name)?!1:(n.add(o.name),!0))}function ss(r,e){let t=Wi(e),s=zi(r,t),n=[],o=[];try{let i=ji.parse(e);n=$i(i,r),o=Ki(i)}catch{}return{imports:n,exports:o,tags:Array.from(t).map(i=>({name:i,kind:"comment-marker"})),category:s}}var Ji=["http://","https://","mailto:","//"],Vi="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",Hi=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${Vi})\\b`,"g"),ns;async function Qi(){return ns??=(async()=>{let{unified:r}=await import("unified"),e=(await import("remark-parse")).default;return r().use(e)})(),ns}function qi(r){let e=r.trim();return e.length===0||e.startsWith("#")||Ji.some(t=>e.startsWith(t))}function Xi(r,e){let t=r.match(Hi);return t?t.map(s=>({fromPath:e,toPath:"",rawSpecifier:s,isStyle:!1,type:"static"})):[]}function os(r,e,t){if(r.type==="link"&&typeof r.url=="string"&&!qi(r.url)&&t.push({fromPath:e,toPath:"",rawSpecifier:r.url,isStyle:!1,type:"static"}),(r.type==="code"||r.type==="inlineCode")&&typeof r.value=="string"&&t.push(...Xi(r.value,e)),Array.isArray(r.children))for(let s of r.children)os(s,e,t)}async function is(r,e){let s=(await Qi()).parse(e),n=[];os(s,r,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 ea from"path";import{parser as ta}from"@lezer/python";function Yi(r){let e=1;function t(s){switch(s.type.name){case"IfStatement":{e+=j(s).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=j(s).filter(o=>o.type.name==="except").length;break}case"ForStatement":case"WhileStatement":case"ConditionalExpression":e++;break;case"and":case"or":e++;break}let n=s.firstChild;for(;n;)t(n),n=n.nextSibling}return t(r),e}function Zi(r){let e=0;function t(s,n){let o=s.type.name;if(o==="IfStatement"){let c=j(s),p=0,l=0;for(;l<c.length;){let g=c[l];if(g?.type.name==="if"||g?.type.name==="elif"){let d=p>0;e+=d?1:1+n;let h=d?n:n+1,v=c[l+1],S=c[l+2];v&&t(v,h),S&&t(S,h),p++,l+=3}else if(g?.type.name==="else"){e+=1;let d=c[l+1];d&&t(d,n+1),l+=2}else l++}return}if(o==="TryStatement"){let c=j(s),p=0;for(;p<c.length;){let l=c[p];if(l?.type.name==="except"){for(e+=1+n,p++;p<c.length&&c[p]?.type.name!=="Body";)t(c[p],n),p++;p<c.length&&(t(c[p],n),p++)}else l?.type.name==="Body"&&t(l,n),p++}return}if(o==="ForStatement"||o==="WhileStatement"){e+=1+n;let c=s.firstChild;for(;c;)t(c,n+1),c=c.nextSibling;return}if((o==="ConditionalExpression"||o==="and"||o==="or")&&(e+=1),n>0&&(o==="FunctionDefinition"||o==="LambdaExpression")){e+=1+n;let c=s.firstChild;for(;c;)t(c,n+1),c=c.nextSibling;return}let a=s.firstChild;for(;a;)t(a,n),a=a.nextSibling}return t(r,0),e}function jt(r){return{complexity:Yi(r),cognitiveComplexity:Zi(r)}}function as(r,e){let t=[];function s(i,a){let{complexity:c,cognitiveComplexity:p}=jt(i);t.push({name:a,line:me(e,i.from),complexity:c,cognitiveComplexity:p})}function n(i){let a=i.firstChild;for(;a;)o(a),a=a.nextSibling}function o(i){if(i.type.name==="ClassDefinition"){let a=i.getChild("VariableName"),c=a?e.slice(a.from,a.to):void 0,p=i.getChild("Body");if(p){let l=p.firstChild;for(;l;){if(l.type.name==="FunctionDefinition"){let g=l.getChild("VariableName"),d=g?e.slice(g.from,g.to):void 0;d&&s(l,c?`${c}.${d}`:d),n(l)}else o(l);l=l.nextSibling}}return}if(i.type.name==="FunctionDefinition"){let a=i.getChild("VariableName");a&&s(i,e.slice(a.from,a.to)),n(i);return}n(i)}return o(r.topNode),t}var ra=new Set(["pytest","unittest","nose","hypothesis"]);function cs(r,e){let t=[],s=[],n=new Set,o=ea.basename(r).toLowerCase(),i=ta.parse(e),a=i.cursor();do switch(a.name){case"Comment":{let h=e.slice(a.from,a.to).match(/#\s*@tag\s+([a-zA-Z0-9_-]+)/);h?.[1]&&n.add(h[1]);break}case"ImportStatement":{for(let h of sa(a.node,e,r))t.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let S=a.node.getChild("VariableName");S&&s.push({name:e.slice(S.from,S.to)})}break}case"AssignStatement":{if(a.node.parent?.name==="Script"){let h=a.node.firstChild;h?.name==="VariableName"&&s.push({name:e.slice(h.from,h.to)})}break}}while(a.next());let c=pa(o,t,n);c==="test"&&n.add("test");let{complexity:p,cognitiveComplexity:l}=jt(i.topNode),g=as(i,e),d=c==="test"?[]:ca(i,e);return{imports:t,exports:s,tags:Array.from(n).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:p,cognitiveComplexity:l,...g.length>0?{functions:g}:{}}}function sa(r,e,t){let s=r.firstChild;return s?s.name==="from"?na(r,e,t):oa(r,e,t):[]}function na(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=ia(n.nextSibling,e);if(!i.length)return[];let a=0;for(;a<o.length&&o[a]===".";)a++;let c=o.slice(a);if(a===0)return[ge(t,o,i,!0)];let p=a===1?"./":"../".repeat(a-1);return c?[ge(t,p+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[ge(t,p.slice(0,-1),["*"],!1)]:i.map(l=>ge(t,p+l,[l],!1))}function oa(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(ge(t,o,["*"],!0))}n=n.nextSibling}return s}function ia(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 aa(r,e){let t=new Map,s=r.cursor();do{if(s.name!=="ImportStatement")continue;let o=s.node.firstChild;if(o?.type.name!=="from")continue;let i=o.nextSibling;for(;i&&i.type.name!=="import";)i=i.nextSibling;if(!i)continue;let a=e.slice(o.to,i.from).trim(),c=0;for(;c<a.length&&a[c]===".";)c++;let p=a.slice(c),l=c<=1?"./":"../".repeat(c-1),g=i.nextSibling;for(;g;){if(g.type.name==="VariableName"){let d=e.slice(g.from,g.to),h=d;if(g.nextSibling?.type.name==="as"){let S=g.nextSibling.nextSibling;S?.type.name==="VariableName"&&(h=e.slice(S.from,S.to),g=S)}let v=c===0?a:p?l+p.replace(/\./g,"/"):l+d;t.set(h,v)}g=g.nextSibling}}while(s.next());return t}function ca(r,e){let t=aa(r,e),s=[];function n(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let l=a.firstChild,g=e.slice(l.from,l.to),d=t.get(g);d&&s.push({from:c,to:g,toSpecifier:d})}let p=a.firstChild;for(;p;)n(p,c),p=p.nextSibling}function o(a){let c=a.firstChild;for(;c;)i(c),c=c.nextSibling}function i(a){if(a.type.name==="ClassDefinition"){let c=a.getChild("VariableName"),p=c?e.slice(c.from,c.to):void 0,l=a.getChild("Body");if(l){let g=l.firstChild;for(;g;){if(g.type.name==="FunctionDefinition"){let d=g.getChild("VariableName"),h=d?e.slice(d.from,d.to):void 0;h&&n(g,p?`${p}.${h}`:h)}else i(g);g=g.nextSibling}}return}if(a.type.name==="FunctionDefinition"){let c=a.getChild("VariableName");c&&n(a,e.slice(c.from,c.to));return}o(a)}return i(r.topNode),s}function ge(r,e,t,s){return{fromPath:r,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:s,type:"static",symbols:t.length>0?t:void 0}}function pa(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=>ra.has(s.rawSpecifier))?"test":"logic"}import ls from"path";import u from"typescript";import y from"typescript";function la(r){let e=1;function t(s){switch(s.kind){case y.SyntaxKind.IfStatement:case y.SyntaxKind.ConditionalExpression:case y.SyntaxKind.ForStatement:case y.SyntaxKind.ForInStatement:case y.SyntaxKind.ForOfStatement:case y.SyntaxKind.WhileStatement:case y.SyntaxKind.DoStatement:case y.SyntaxKind.CatchClause:case y.SyntaxKind.CaseClause:e++;break;case y.SyntaxKind.BinaryExpression:{let n=s.operatorToken.kind;(n===y.SyntaxKind.AmpersandAmpersandToken||n===y.SyntaxKind.BarBarToken||n===y.SyntaxKind.QuestionQuestionToken)&&e++;break}}y.forEachChild(s,t)}return t(r),e}function fa(r){let e=0;function t(s,n,o){if(y.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&&(y.isIfStatement(s.elseStatement)?t(s.elseStatement,n,!0):(e+=1,t(s.elseStatement,n+1,!1)));return}if(y.isForStatement(s)||y.isForInStatement(s)||y.isForOfStatement(s)||y.isWhileStatement(s)||y.isDoStatement(s)||y.isSwitchStatement(s)){e+=1+n,y.forEachChild(s,a=>t(a,n+1,!1));return}if(y.isCatchClause(s)){e+=1+n,y.forEachChild(s,a=>t(a,n,!1));return}if(y.isConditionalExpression(s)&&(e+=1),y.isBinaryExpression(s)){let a=s.operatorToken.kind;(a===y.SyntaxKind.AmpersandAmpersandToken||a===y.SyntaxKind.BarBarToken||a===y.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(n>0&&(y.isFunctionDeclaration(s)||y.isFunctionExpression(s)||y.isArrowFunction(s))){e+=1+n,y.forEachChild(s,a=>t(a,n+1,!1));return}y.forEachChild(s,a=>t(a,n,!1))}return t(r,0,!1),e}function Wt(r){return{complexity:la(r),cognitiveComplexity:fa(r)}}import C from"typescript";var zt=new Set(["test","describe","it"]);function ps(r,e){ua(r,e),ga(r,e),da(r,e),ha(r,e)}function ua(r,e){if((C.isFunctionDeclaration(r)||C.isVariableDeclaration(r))&&r.name&&C.isIdentifier(r.name)&&ma(r)){let t;if(C.isFunctionDeclaration(r))t="function";else{let s=r.initializer;t=s&&(C.isArrowFunction(s)||C.isFunctionExpression(s))?"function":"variable"}e.tags.add({name:r.name.text,kind:t})}}function ma(r){if(C.isFunctionDeclaration(r))return C.isSourceFile(r.parent);let e=r.parent?.parent;return!!e&&C.isSourceFile(e.parent)}function ga(r,e){if(!C.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 da(r,e){if(!C.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 ha(r,e){if(C.isCallExpression(r)&&ya(r.expression))for(let t of r.arguments)C.isObjectLiteralExpression(t)&&xa(t,e)}function ya(r){return C.isIdentifier(r)?zt.has(r.text):!!(C.isPropertyAccessExpression(r)&&(zt.has(r.name.text)||C.isIdentifier(r.expression)&&zt.has(r.expression.text)))}function xa(r,e){for(let t of r.properties){if(!C.isPropertyAssignment(t)||!C.isIdentifier(t.name)||t.name.text!=="tags"&&t.name.text!=="tag")continue;let{initializer:s}=t,n=C.isArrayLiteralExpression(s)?s.elements.filter(C.isStringLiteral):t.name.text==="tag"&&C.isStringLiteral(s)?[s]:[];for(let o of n)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function $t(r,e,t){let s=[],n=new Map,o=new Set,i=u.createSourceFile(r,e,u.ScriptTarget.Latest,!0,t==="typescript"?u.ScriptKind.TSX:u.ScriptKind.JSX),a={filePath:r,imports:s,exports:n,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=S=>{Ca(S,a),u.forEachChild(S,c)};c(i);let p=Ra(r,a);(p==="test"||p==="barrel")&&o.add({name:p,kind:"comment-marker"}),p!=="test"&&Da(a,i);let l=i.statements[0],g=l?us(l):void 0,{complexity:d,cognitiveComplexity:h}=Wt(i),v=Sa(i);return{imports:s,exports:Array.from(n.values()),tags:Array.from(o),category:p,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...v.length>0?{functions:v}:{},...g!==void 0?{description:g}:{}}}function Sa(r){let e=[],t=(n,o)=>{let{complexity:i,cognitiveComplexity:a}=Wt(o),c=r.getLineAndCharacterOfPosition(o.getStart(r)).line+1;e.push({name:n,line:c,complexity:i,cognitiveComplexity:a})},s=(n,o)=>{if(u.isFunctionDeclaration(n)&&n.name&&n.body?t(n.name.text,n):u.isVariableDeclaration(n)&&u.isIdentifier(n.name)&&n.initializer&&(u.isArrowFunction(n.initializer)||u.isFunctionExpression(n.initializer))?t(n.name.text,n.initializer):o&&u.isMethodDeclaration(n)&&u.isIdentifier(n.name)&&n.body?t(`${o}.${n.name.text}`,n):o&&u.isConstructorDeclaration(n)&&n.body?t(`${o}.constructor`,n):o&&u.isGetAccessorDeclaration(n)&&u.isIdentifier(n.name)&&n.body?t(`${o}.get ${n.name.text}`,n):o&&u.isSetAccessorDeclaration(n)&&u.isIdentifier(n.name)&&n.body&&t(`${o}.set ${n.name.text}`,n),u.isClassDeclaration(n)&&n.name){let i=n.name.text;u.forEachChild(n,a=>s(a,i));return}u.forEachChild(n,i=>s(i,o))};return s(r,void 0),e}function fs(r,e,t,s){let n={name:r},o=us(t);o!==void 0&&(n.doc=o);let i=ba(e);i!==void 0&&(n.flags=i);let a=va(e,s);return a!==void 0&&(n.signature=a),n}function us(r){let e=u.getJSDocCommentsAndTags(r);for(let t of e)if(u.isJSDoc(t)&&t.comment)return u.getTextOfJSDocComment(t.comment)||void 0}function ba(r){let e=new Set(["deprecated","internal","public","alpha","beta"]),t=u.getJSDocTags(r).map(s=>s.tagName.text).filter(s=>e.has(s));return t.length>0?t:void 0}function va(r,e){let t=u.createPrinter({removeComments:!0}),s=n=>t.printNode(u.EmitHint.Unspecified,n,e);if(u.isFunctionDeclaration(r)||u.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(u.isVariableDeclaration(r)){if(r.type)return s(r.type);if(r.initializer&&(u.isArrowFunction(r.initializer)||u.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(u.isClassDeclaration(r)&&r.name)return`class ${r.name.text}`;if(u.isInterfaceDeclaration(r))return`interface ${r.name.text}`;if(u.isTypeAliasDeclaration(r))return s(r.type);if(u.isEnumDeclaration(r))return`enum ${r.name.text}`}function Ca(r,e){ka(r,e),wa(r,e),Fa(r,e),Ta(r,e),Ia(r,e),ps(r,e)}function ka(r,e){if(!u.isSourceFile(r))return;let t=r.statements.filter(s=>!u.isEmptyStatement(s));e.totalStatements=t.length,e.exportStatements=t.filter(s=>u.isExportDeclaration(s)||u.isExportAssignment(s)||Bt(s)).length}function wa(r,e){if(u.isJsxElement(r)||u.isJsxSelfClosingElement(r)||u.isJsxFragment(r)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(u.isFunctionDeclaration(r)||u.isMethodDeclaration(r)||u.isArrowFunction(r)||u.isClassDeclaration(r)||u.isVariableStatement(r)||u.isEnumDeclaration(r)){e.hasTypesOnly=!1;return}u.isExportDeclaration(r)&&!Ea(r)&&(e.hasTypesOnly=!1)}function Ea(r){return r.isTypeOnly?!0:!r.exportClause||!u.isNamedExports(r.exportClause)?!1:r.exportClause.elements.every(e=>e.isTypeOnly)}function Fa(r,e){if(!u.isImportDeclaration(r)||!r.moduleSpecifier||!u.isStringLiteral(r.moduleSpecifier))return;let t=[];if(r.importClause&&(r.importClause.name&&t.push("default"),r.importClause.namedBindings))if(u.isNamedImports(r.importClause.namedBindings))for(let n of r.importClause.namedBindings.elements)t.push(n.name.text);else u.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:P(r.moduleSpecifier.text),type:s,symbols:t.length>0?t:void 0})}function Ta(r,e){u.isExportDeclaration(r)?Pa(r,e):u.isExportAssignment(r)?e.exports.set("default",{name:"default"}):Bt(r)&&Ma(r,e)}function Pa(r,e){if(r.moduleSpecifier&&u.isStringLiteral(r.moduleSpecifier))Aa(r,r.moduleSpecifier.text,e);else if(r.exportClause&&u.isNamedExports(r.exportClause))for(let t of r.exportClause.elements){let s=t.name.text;e.exports.set(s,{name:s})}}function Aa(r,e,t){let s=Na(r),n={fromPath:t.filePath,toPath:"",rawSpecifier:e,isStyle:P(e),type:"re-export"};s.length>0&&(n.symbols=s),t.imports.push(n)}function Na(r){return r.exportClause?u.isNamedExports(r.exportClause)?r.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Ma(r,e){if((u.isFunctionDeclaration(r)||u.isClassDeclaration(r)||u.isInterfaceDeclaration(r)||u.isTypeAliasDeclaration(r)||u.isEnumDeclaration(r))&&r.name){let s=r.name.text;e.exports.set(s,fs(s,r,r,e.sourceFile));return}if(u.isVariableStatement(r)){for(let s of r.declarationList.declarations)if(u.isIdentifier(s.name)){let n=s.name.text;e.exports.set(n,fs(n,s,r,e.sourceFile))}}}function Ia(r,e){if(!u.isCallExpression(r))return;let t=r.arguments[0];!t||!u.isStringLiteral(t)||(r.expression.kind===u.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.text,isStyle:P(t.text),type:"dynamic"}):u.isIdentifier(r.expression)&&r.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.text,isStyle:P(t.text),type:"require"}))}function Ra(r,e){let t=ls.basename(r).toLowerCase(),s=ls.extname(r).toLowerCase();return re().some(o=>t.includes(o))?"test":Yt(t)?"config":e.imports.some(o=>Xe().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>Ze()?"barrel":"logic"}function Bt(r){return u.canHaveModifiers(r)&&u.getModifiers(r)?.some(e=>e.kind===u.SyntaxKind.ExportKeyword)===!0}function Da(r,e){let t=r.rawCallEdges??[];r.rawCallEdges=t;let s=new Map;for(let n of e.statements){if(!u.isImportDeclaration(n)||!u.isStringLiteral(n.moduleSpecifier))continue;let o=n.moduleSpecifier.text,i=n.importClause;if(i&&(i.name&&s.set(i.name.text,o),i.namedBindings&&u.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=La(n);if(o){let i=_a(n);i&&Je(i,o,s,t);continue}u.isClassDeclaration(n)&&n.name&&Ga(n,s,t)}}function Ga(r,e,t){let s=r.name.text;for(let n of r.members)u.isMethodDeclaration(n)&&n.body&&u.isIdentifier(n.name)?Je(n.body,`${s}.${n.name.text}`,e,t):u.isConstructorDeclaration(n)&&n.body&&Je(n.body,`${s}.constructor`,e,t)}function La(r){if(Bt(r)){if(u.isFunctionDeclaration(r)&&r.name)return r.name.text;if(u.isVariableStatement(r)){for(let e of r.declarationList.declarations)if(u.isIdentifier(e.name)&&e.initializer&&(u.isArrowFunction(e.initializer)||u.isFunctionExpression(e.initializer)))return e.name.text}}}function _a(r){if(u.isFunctionDeclaration(r))return r.body;if(u.isVariableStatement(r)){for(let e of r.declarationList.declarations)if(e.initializer&&(u.isArrowFunction(e.initializer)||u.isFunctionExpression(e.initializer)))return e.initializer}}function Je(r,e,t,s){if(u.isCallExpression(r)&&u.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})}u.forEachChild(r,n=>Je(n,e,t,s))}function Ve(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 gs from"postcss";import*as Oa from"postcss-less";var ja=Oa,ds=new Set(["reference","inline"]);function ms(r){return r.startsWith("~")||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("//")||r.startsWith("data:")}function Wa(r){let e=r.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function za(r,e){let t=r.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(t){let o=t[1]?.trim()??"",i=t[2]??"";if(!i)return null;let a=ds.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...ms(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",...ms(n)?{isExternal:!0}:{}}:null}function $a(r,e){let t=[],s=/url\(['"]?([^'")]+)['"]?\)/g,n=s.exec(r);for(;n!==null;){let o=n[1]?.trim()??"";Wa(o)&&t.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),n=s.exec(r)}return t}function hs(r,e){let t=[];return r.walk(s=>{if(s.type==="atrule"&&s.name==="import"){let n=za(s.params,e);n&&t.push(n)}s.type==="decl"&&t.push(...$a(s.value,e))}),t}function Ba(r){return r.replace(/(?<!:)\/\/.*/g,"")}function Ua(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=ds.has(o)?"side-effect":"static";t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}n=s.exec(r)}return t}function ys(r,e){let t=gs.parse(Ba(r));return{imports:hs(t,e),root:t}}function Ka(r){let e=[],t=[];for(let s of r.nodes??[]){if(s.type!=="atrule")continue;let{value:n}=s;if(n===void 0)continue;let o=s.name;o&&(e.push({name:o}),t.push({name:o,kind:"variable"}))}return{exports:e,tags:t}}function xs(r,e){try{let t=ja.parse(r),{exports:s,tags:n}=Ka(t);return{imports:hs(t,e),root:t,exports:s,tags:n}}catch{return{imports:Ua(r,e),root:gs.parse(""),exports:[],tags:[]}}}import{parse as Ja}from"postcss-scss";function Ss(r){return r.startsWith("_")||r.startsWith("-")}function Va(r){return!!(r.startsWith("sass:")||r.startsWith("~")||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("//")||!r.startsWith(".")&&!r.startsWith("/")&&!r.startsWith("_"))}function Ha(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 Qa(r){let e=[],t=[];for(let s of r.nodes??[]){if(s.type==="decl"&&s.prop.startsWith("$")){let n=s.prop.slice(1);if(!n||Ss(n))continue;e.push({name:n}),t.push({name:n,kind:"variable"});continue}if(s.type==="atrule"&&(s.name==="mixin"||s.name==="function")){let o=s.params.match(/^([\w-]+)/)?.[1];if(!o||Ss(o))continue;let i=s.params.trim();e.push(i.includes("(")?{name:o,signature:i}:{name:o}),t.push({name:o,kind:"function"})}}return{exports:e,tags:t}}function bs(r,e){let t=Ja(r),s=[];t.walk(i=>{if(i.type!=="atrule")return;let{name:a,params:c}=i;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:p,alias:l}=Ha(c);if(!p)return;let g={fromPath:e,toPath:"",rawSpecifier:p,isStyle:!0,type:a==="forward"?"re-export":"static",...Va(p)?{isExternal:!0}:{}};l&&(g.symbols=[l]),s.push(g)});let{exports:n,tags:o}=Qa(t);return{imports:s,root:t,exports:n,tags:o}}function vs(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 Cs(r,e){if(e.length===0)return"ui";try{let t=qe("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 de(r,e){let t=R(r);if(t==="stylus"){let o=vs(e,r);return{imports:o,exports:[],tags:[],category:Cs(e,o)}}if(t==="scss"){let{imports:o,root:i,exports:a,tags:c}=bs(e,r);return{imports:o,exports:a,tags:c,category:Ve(i,o)}}if(t==="less"){let{imports:o,root:i,exports:a,tags:c}=xs(e,r);return{imports:o,exports:a,tags:c,category:Ve(i,o)}}let{imports:s,root:n}=ys(e,r);return{imports:s,exports:[],tags:[],category:Ve(n,s)}}for(let[r,e]of[["javascript",(t,s)=>$t(t,s,"javascript")],["typescript",(t,s)=>$t(t,s,"typescript")],["css",de],["scss",de],["less",de],["stylus",de],["coffeescript",Yr],["livescript",rs],["lua",ss],["python",cs],["go",ts],["gherkin",Lt],["markdown",is]])V(r,e);async function ks(r,e){let t=R(r),s=Tr(t);return s?s(r,e):{imports:[],exports:[],tags:[],category:"other"}}import ws from"path";function Fs(r,e){for(let t of r.values()){let s=e.get(t.path);s!==void 0&&(t.coveragePct=s)}}function Ts(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 Ps(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 As(r){for(let e of r.values())if(e.type==="markdown")for(let t of e.imports){if(t.isExternal||!t.toPath)continue;let s=r.get(t.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 Es(r){return Math.round(r*1e4)/1e4}function Ns(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=Es(Math.min(1,o)),t.push(s.exportUsageRatio)}t.length>0&&(e.avgExportUsage=Es(t.reduce((s,n)=>s+n,0)/t.length),e.maxExportUsage=Math.max(...t))}}function Ut(r,e,t){e&&(r.some(s=>s.name===e&&s.kind===t)||r.push({name:e,kind:t}))}function qa(r,e){let t=e.toPath,s=ws.basename(t,ws.extname(t)).replace(/\.(test|spec)$/,"");Ut(r.tags,s,"import")}function Xa(r,e){if(!(!e.symbols||e.symbols.includes("*")))for(let t of e.symbols)Ut(r.tags,t,"import")}function Ya(r,e,t){let s=t.get(e.toPath);if(!(!s||s.category==="test"))for(let n of s.tags)n.kind==="comment-marker"&&Ut(r.tags,n.name,"comment-marker")}function Ms(r){for(let e of r.values())if(e.category==="test")for(let t of e.imports)!t.toPath||t.isExternal||(qa(e,t),Xa(e,t),Ya(e,t,r))}import He from"fs";import G from"path";import Ds from"fs";import ee from"path";var he=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 c=t.slice(o.length).replace(/^\//,"");return c?Rs(ee.join(s,c)):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=Ds.readFileSync(ee.join(e,"go.mod"),"utf-8"),o=Za(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 ee.join(o,i)}}}};function Za(r,e){let t=r.split(`
24
- `),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("=>")){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(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=ee.isAbsolute(n)?n:ee.resolve(e,n);t.set(o,i)}function Rs(r){let e;try{e=Ds.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:ee.join(r,s.name),isExternal:!1})).sort((s,n)=>s.path.localeCompare(n.path));return t.length>0?t:null}import ec from"fs";import Kt from"path";var ye=class{extensions=[".lua"];resolve(e,t,s,n){let o=t.replace(/\./g,Kt.sep),i=[s,Kt.join(s,"lib")];for(let a of i){if(!ec.existsSync(a))continue;let c=n(Kt.join(a,"_dummy.lua"),o);if(c)return[c]}return null}};import tc from"path";var xe=class{extensions=[".md",".mdx"];resolve(e,t,s,n){let o=n(tc.join(s,"_dummy"),`./${t}`);return o?[o]:null}};import rc from"fs";import Jt from"path";var Se=class{extensions=[".py"];resolve(e,t,s,n){let o=t.replace(/\./g,Jt.sep),i=Jt.join(s,`${o}.py`);if(Gs(i))return[{path:i,isExternal:!1}];let a=Jt.join(s,o,"__init__.py");return Gs(a)?[{path:a,isExternal:!1}]:null}};function Gs(r){try{return rc.statSync(r,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import Ls from"path";var sc=["~","http://","https://","//","data:","sass:"],be=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,t,s,n){if(sc.some(l=>t.startsWith(l)))return null;let o=n(e,t);if(o)return[o];let i=Ls.dirname(t),a=Ls.basename(t),c=i==="."?`_${a}`:`${i}/_${a}`,p=n(e,c);return p?[p]:null}};var z=class{constructor(e,t={}){this.rootDir=e;this.workspaceMap=t.workspaceMap??new Map,this.tsconfigSearchPaths=t.tsconfigSearchPaths??[e],this.pathAliases=t.pathAliases,this.langResolvers=t.langResolvers??[new Se,new ye,new he,new be,new xe]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;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=G.dirname(e),n=t.startsWith("/")?t:G.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",".md",".mdx"],a=n.match(/\.(js|mjs|cjs)$/);if(a){let c=n.slice(0,-a[0].length);for(let p of[".ts",".tsx"]){let l=this.tryExtensions(c,p,o);if(l)return l}}for(let c of i){let p=this.tryExtensions(n,c,o);if(p)return p}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=G.join(e,`index${t}`);if(this.isFile(o))return{path:o,isExternal:s};if(t===".py"){let i=G.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:s}}return null}isFile(e){try{return He.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let t in this.pathAliases){let s=this.matchAliasPattern(t,e),n=this.pathAliases[t];if(s&&n){let o=this.tryAliasSubstitutions(n,s[1]||"");if(o)return o}}for(let t of this.tsconfigSearchPaths){let s=G.join(t,"tsconfig.json");if(He.existsSync(s))try{let o=JSON.parse(He.readFileSync(s,"utf-8")).compilerOptions?.paths;if(!o)continue;for(let i in o){let a=this.matchAliasPattern(i,e);if(a){let c=this.tryAliasSubstitutions(o[i],a[1]||"",t);if(c)return c}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,t){let 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=G.resolve(s,i);for(let c of n){let p=this.tryExtensions(a,c,!1);if(p)return p}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[t,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 c=G.join(s,a);try{if(He.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...o,path:c}}catch{}}return{...o,path:s}}let i=this.resolveLocalPath(G.join(s,"_dummy"),n.slice(1));return i?{...o,path:i.path}:null}return null}};var oc=["tests","test","__tests__","specs","spec"],_s=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),ic=20;function ac(r,e){if(r.length===0)return e;let t=r.map(i=>F.dirname(i).split(F.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(F.sep)||F.sep,o=F.relative(e,n);return o.startsWith("..")||F.isAbsolute(o)?e:n}var Ce=class{constructor(e,t=null,s,n,o=!1,i=new Map,a=!0){this.rootDir=e;this.enableGitStats=o;this.coverageMap=i;this.parallelParsing=a;this.previousGraph=t,this.resolver=s||new z(e),this.lockFile=Hr(e),n&&(this.progressCallback=n)}rootDir;enableGitStats;coverageMap;parallelParsing;graph={nodes:new Map};visited=new Set;queue=[];previousGraph=null;resolver;lockFile=null;progressCallback;pool=null;gitStatsMap=null;async build(e){let t=e.map(s=>F.isAbsolute(s)?s:F.resolve(this.rootDir,s));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=Kr(this.rootDir));try{for(let s of t)this.enqueue(s);return await this.drain(),await this.processTestFiles(ac(t,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
21
+ `;return`${p+d+f+i}
22
+ ${l}`}};function Ei(r){let e=r.split(`
23
+ `),t=-1;return e.forEach((s,o)=>{(s.trimStart().startsWith("import ")||s.trimStart().startsWith("from "))&&(t=o)}),t<0?0:e.slice(0,t+1).reduce((s,o)=>s+o.length+1,0)}import Vr from"path";import Hr from"typescript";var Ti=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,We=class{name="vitest";canHandle(e){return N.has(Vr.extname(e).toLowerCase())}apply(e,t,n){let s=t.replace(Ti,""),o=Hr.createSourceFile(Vr.basename(e),s,Hr.ScriptTarget.Latest,!0),i=Pt(o),[a]=i;if(!a)return s;let c=At(a,"tags",o),p=[...n].sort();if(c!==null&&JSON.stringify([...c].sort())===JSON.stringify(p))return s;let l=i.flatMap(f=>{let d=n.length===0?It(f,"tags",o):Nt(f,"tags",Dt(p),o);return d?[d]:[]});return l.length>0?Mt(s,l):s}};var Qr={vitest:()=>new We,playwright:()=>new Oe,cypress:()=>new Re,jest:()=>new _e},Pi={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function Ai(r){let e=ze.createSourceFile("detect.ts",r,ze.ScriptTarget.Latest,!0);for(let t of e.statements){if(!ze.isImportDeclaration(t)||!ze.isStringLiteral(t.moduleSpecifier))continue;let n=Pi[t.moduleSpecifier.text];if(n)return n}return null}var Wt=class{constructor(e,t,n){this.rootDir=e;this.defaultFramework=t;this.frameworkOverrides=n}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return N.has(jt.extname(e).toLowerCase())}apply(e,t,n){let s=Ai(t)??this.matchOverride(e)??this.defaultFramework;return(Qr[s]??Qr.vitest)().apply(e,t,n)}matchOverride(e){let t=jt.relative(this.rootDir,e).split(jt.sep).join("/");for(let[n,s]of this.frameworkOverrides)if(Jr(n,t))return s;return null}};function qr(r="vitest",e={},t=process.cwd()){return[new Ge,new je,new Le,new Wt(t,r,Object.entries(e))]}function Xr(r,e){return e.find(t=>t.canHandle(r))??null}var Ii=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Mi=new Set(["import"]),Di=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function Ri(r,e,t,n){let s;try{s=await Yr.readFile(r,"utf8")}catch(a){return{path:r,status:"error",error:String(a)}}let o=Xr(r,n);if(!o)return{path:r,status:"unchanged"};let i=o.apply(r,s,e);return i===s?{path:r,status:"unchanged"}:(t||await Yr.writeFile(r,i,"utf8"),{path:r,status:"updated"})}async function zt(r,e,t){let n=re(e),s=n.tagApplier?.framework??"vitest",o=n.tagApplier?.frameworkOverrides??{},i=qr(s,o,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let c of r.nodes.values()){if(c.category!=="test")continue;let p=new Set,l=[];for(let h of c.tags)Mi.has(h.kind)&&Ii.test(h.name)&&(Di.has(h.name.toLowerCase())||p.has(h.name)||(p.add(h.name),l.push(h.name)));l.sort();let f=Ni.resolve(e,c.path),d=await Ri(f,l,t.dryRun,i);d.path=c.path,a.files.push(d),d.status==="updated"?a.updated++:d.status==="unchanged"?a.unchanged++:a.errors++}return a}var $e=class{isTestNode(e){return e.category==="test"||e.tags.some(t=>t.name==="test")}};import be from"fs";import T from"path";import vc from"piscina";import{execFileSync as $t}from"child_process";var Be=class{getChangedFiles(){try{let t=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(n=>{try{return $t("git",n,{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).split(`
24
+ `).map(o=>o.trim()).filter(o=>o!=="")}catch{return[]}});return Array.from(new Set(t))}catch(e){return console.error("Error getting git diff:",e),[]}}},Zr="%x00%H%x09%ae%x09%at",en=256*1024*1024;function tn(r,e){let t="",n=0;for(let s of r.split(`
25
+ `)){if(s.startsWith("\0")){let[,c,p]=s.slice(1).split(" ");t=c??"",n=p?Number(p)*1e3:0;continue}if(s==="")continue;let o=s.split(" "),i=o[0];if(!i)continue;let a=i.startsWith("R")||i.startsWith("C")?o[2]:o[1];a&&e(a,t,n)}}function rn(r){let e=new Map;try{let t=$t("git",["-C",r,"log","--since=90 days ago","--name-status","-M",`--format=${Zr}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:en});tn(t,(n,s,o)=>{let i=e.get(n);if(i){i.commitCount90d+=1;return}e.set(n,{commitCount90d:1,lastAuthor:s||void 0,lastCommitAt:o||void 0})})}catch{return e}try{let t=$t("git",["-C",r,"log","--name-status","-M",`--format=${Zr}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:en});tn(t,(n,s,o)=>{e.has(n)||e.set(n,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}import nn from"path";function G(r){switch(nn.extname(r).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function A(r){let e=nn.extname(r).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import Gi from"coffeescript";function L(r){return r.startsWith("'")||r.startsWith('"')?r.slice(1,-1):r}function X(r){let e=new Set,t=/@tag\s+([a-zA-Z0-9_-]+)/g,n=t.exec(r);for(;n!==null;)n[1]&&e.add(n[1]),n=t.exec(r);return e}function Y(r,e){let t=r.toLowerCase();return t.includes(".test.")||t.includes(".spec.")||e.has("test")?"test":"logic"}function on(r){if(r){if(typeof r.originalValue=="string")return r.originalValue;if(typeof r.value=="string")return L(r.value)}}function $(r){if(r){if(typeof r.value=="string")return r.value;if(typeof r.base?.value=="string")return r.base.value}}function Li(r,e){let t=on(e.source);return t?{fromPath:r,toPath:"",rawSpecifier:t,isStyle:A(t),type:"static"}:null}function _i(r,e){let t=e.variable?.base?.value==="require",n=on(e.args?.[0]?.base);return!t||!n?null:{fromPath:r,toPath:"",rawSpecifier:n,isStyle:A(n),type:"require"}}function sn(r,e){if(e)return[{name:e}];let t=r.value;if(t?.constructor?.name==="Class"){let s=$(t.variable);return s?[{name:s}]:[]}if(t?.base?.constructor?.name==="Obj"&&Array.isArray(t.base.properties))return t.base.properties.map(s=>$(s.variable)??$(s)).filter(s=>!!s).map(s=>({name:s}));let n=$(t);return n?[{name:n}]:[]}function Oi(r){if(Array.isArray(r.specifiers))return r.specifiers.map(t=>t.identifier??t.original?.value).filter(t=>!!t).map(t=>({name:t}));let e=$(r.variable)??$(r.variable?.base);return e?[{name:e}]:[]}function ji(r,e,t,n){let s=e.constructor?.name;if(s==="ImportDeclaration"){let o=Li(r,e);o&&t.push(o)}else if(s==="Call"){let o=_i(r,e);o&&t.push(o)}else if(s==="Assign"){let o=$(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?n.push(...sn(e,void 0)):o==="exports"&&typeof i=="string"&&n.push(...sn(e,i))}else s==="ExportNamedDeclaration"&&e.clause?n.push(...Oi(e.clause)):s==="ExportDefaultDeclaration"&&n.push({name:"default"})}function Bt(r,e,t,n){if(!(!e||typeof e!="object")){ji(r,e,t,n);for(let s in e){if(s==="locationData")continue;let o=e[s];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)Bt(r,i,t,n);else Bt(r,o,t,n)}}}function an(r,e){let t=X(e),n=Y(r,t),s=[],o=[];try{Bt(r,Gi.nodes(e),s,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(t).map(c=>({name:c,kind:"comment-marker"})),category:n}}import{AstBuilder as Wi,GherkinClassicTokenMatcher as zi,Parser as $i}from"@cucumber/gherkin";import{IdGenerator as Bi}from"@cucumber/messages";var Ui=Bi.uuid();function Ut(r,e){let t=new Set;try{let n=new Wi(Ui),s=new zi,i=new $i(n,s).parse(e);i.feature&&(i.feature.tags.forEach(a=>{t.add(a.name.startsWith("@")?a.name.slice(1):a.name)}),i.feature.children.forEach(a=>{a.scenario&&(a.scenario.tags.forEach(c=>{t.add(c.name.startsWith("@")?c.name.slice(1):c.name)}),a.scenario.examples.forEach(c=>{c.tags.forEach(p=>{t.add(p.name.startsWith("@")?p.name.slice(1):p.name)})})),a.rule&&a.rule.children.forEach(c=>{c.scenario&&c.scenario.tags.forEach(p=>{t.add(p.name.startsWith("@")?p.name.slice(1):p.name)})})}))}catch(n){console.warn(`[GherkinParser] Failed to parse ${r}:`,n)}return{imports:[],exports:[],tags:Array.from(t).map(n=>({name:n,kind:"comment-marker"})),category:"test"}}q("gherkin",Ut);import Vi from"path";import{parser as Hi}from"@lezer/go";function B(r){let e=[],t=r.firstChild;for(;t;)e.push(t),t=t.nextSibling;return e}function ue(r,e){let t=1;for(let n=0;n<e&&n<r.length;n++)r[n]===`
26
+ `&&t++;return t}function Ki(r,e){let t=1;function n(s){switch(s.type.name){case"IfStatement":case"ForStatement":t++;break;case"Case":{s.firstChild?.type.name==="case"&&t++;break}case"LogicOp":{let i=e.slice(s.from,s.to);(i==="&&"||i==="||")&&t++;break}}let o=s.firstChild;for(;o;)n(o),o=o.nextSibling}return n(r),t}function Ji(r,e){let t=0;function n(s,o,i){let a=s.type.name;if(a==="IfStatement"){t+=i?1:1+o;let l=B(s),f=i?o:o+1,d=l[1];d&&d.type.name!=="Block"&&n(d,f,!1);let h=l.find(x=>x.type.name==="Block");h&&n(h,f,!1);let v=l.findIndex(x=>x.type.name==="else");if(v>=0){let x=l[v+1];x?.type.name==="IfStatement"?n(x,o,!0):x&&(t+=1,n(x,o+1,!1))}return}if(a==="ForStatement"||a==="SwitchStatement"||a==="SelectStatement"){t+=1+o;let l=s.firstChild;for(;l;)n(l,o+1,!1),l=l.nextSibling;return}if(a==="LogicOp"){let l=e.slice(s.from,s.to);(l==="&&"||l==="||")&&(t+=1)}if(o>0&&a==="FunctionLiteral"){t+=1+o;let l=s.firstChild;for(;l;)n(l,o+1,!1),l=l.nextSibling;return}let p=s.firstChild;for(;p;)n(p,o,!1),p=p.nextSibling}return n(r,0,!1),t}function Ue(r,e){return{complexity:Ki(r,e),cognitiveComplexity:Ji(r,e)}}function Kt(r,e){let n=r.getChild("Parameters")?.getChild("Parameter"),s=n?.getChild("TypeName")??n?.getChild("PointerType")?.getChild("TypeName");return s?e.slice(s.from,s.to):void 0}function cn(r,e){let t=[],n=r.cursor();do if(n.name==="FunctionDecl"){let s=n.node.getChild("DefName");if(s){let o=e.slice(s.from,s.to),{complexity:i,cognitiveComplexity:a}=Ue(n.node,e);t.push({name:o,line:ue(e,n.from),complexity:i,cognitiveComplexity:a})}}else if(n.name==="MethodDecl"){let s=n.node.getChild("FieldName");if(s){let o=e.slice(s.from,s.to),i=Kt(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:p}=Ue(n.node,e);t.push({name:a,line:ue(e,n.from),complexity:c,cognitiveComplexity:p})}}while(n.next());return t}var Qi=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,qi=/^\/\/go:build\s+(.+)$/,Xi=/^\/\/\s*\+build\s+(.+)$/;function ln(r,e){let t=[],n=new Map,s=new Set,o=new Set,i=new Map,a=Hi.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let k=e.slice(c.from,c.to),E=k.match(Qi);E?.[1]&&s.add(E[1]);let I=k.match(qi);I&&pn(I[1],o);let D=k.match(Xi);D&&pn(D[1],o);break}case"ImportSpec":{let k=c.node.getChild("String");if(k){let I=e.slice(k.from,k.to).slice(1,-1);t.push({fromPath:r,toPath:"",rawSpecifier:I,isExternal:!0,isStyle:!1,type:"static"});let D=c.node.getChild("DefName"),J=D?e.slice(D.from,D.to):I.split("/").pop();J&&J!=="_"&&J!=="."&&i.set(J,I)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let k=c.node.getChild("DefName")??c.node.getChild("FieldName")??c.node.getChild("TypeSpec")?.getChild("DefName")??c.node.getChild("VarSpec")?.getChild("DefName")??c.node.getChild("ConstSpec")?.getChild("DefName");if(k){let E=e.slice(k.from,k.to);E!=="_"&&/^[A-Z]/.test(E)&&!n.has(E)&&n.set(E,{name:E})}break}}while(c.next());let p=t.some(k=>k.rawSpecifier==="testing"),l=Vi.basename(r).endsWith("_test.go")||s.has("test")||p?"test":"logic",f=new Set([...s,...o]),{complexity:d,cognitiveComplexity:h}=Ue(a.topNode,e),v=cn(a,e),x=l==="test"?[]:Yi(a,e,i);return{imports:t,exports:Array.from(n.values()),tags:Array.from(f).map(k=>({name:k,kind:"comment-marker"})),category:l,rawCallEdges:x,complexity:d,cognitiveComplexity:h,...v.length>0?{functions:v}:{}}}function Yi(r,e,t){let n=[];function s(i,a){if(i.type.name==="CallExpr"){let p=i.firstChild;if(p?.type.name==="SelectorExpr"){let l=p.firstChild,f=p.getChild("FieldName");if(l?.type.name==="VariableName"&&f){let d=e.slice(l.from,l.to),h=t.get(d);if(h){let v=e.slice(f.from,f.to);n.push({from:a,to:v,toSpecifier:h})}}}}let c=i.firstChild;for(;c;)s(c,a),c=c.nextSibling}let o=r.cursor();do if(o.name==="FunctionDecl"){let i=o.node.getChild("DefName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to);/^[A-Z]/.test(c)&&s(a,c)}}else if(o.name==="MethodDecl"){let i=o.node.getChild("FieldName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to),p=Kt(o.node,e);s(a,p?`${p}.${c}`:c)}}while(o.next());return n}function pn(r,e){for(let t of r.split(/[\s,&|!()]+/)){let n=t.trim();n&&n!=="ignore"&&e.add(n)}}import Zi from"livescript";function U(r){if(r){if(typeof r.value=="string")return r.value;if(typeof r.base?.value=="string")return r.base.value}}function ea(r){if(!r)return[];if(r.constructor?.name==="Class"){let t=U(r.title);return t?[{name:t}]:[]}if(r.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(t=>U(t.key)??U(t.val)).filter(t=>!!t).map(t=>({name:t}));let e=U(r);return e?[{name:e}]:[]}function ta(r){let e=r.constructor?.name||r.type;if(e==="Assign"&&r.left?.constructor?.name==="Chain"){let t=r.left,n=U(t.head),o=t.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return ea(r.right);if(n==="exports"&&typeof o=="string")return[{name:o}];if(t.head?.verb==="out"&&typeof o=="string")return[{name:o}]}if(e==="Import"&&r.left?.verb==="out"){let t=r.right;if(t?.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(n=>U(n.val)??U(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var ra=new Set(["first_line","first_column","last_line","last_column","line","column"]);function na(r,e){let t=r.constructor?.name||r.type;if(t==="Import"){let n=r.right?.value;if(typeof n=="string"){let s=L(n);return{fromPath:e,toPath:"",rawSpecifier:s,isStyle:A(s),type:"static"}}}if(t==="Chain"&&r.head?.value==="require"){let n=r.tails?.[0];if(n?.constructor?.name==="Call"||n?.type==="Call"){let s=n.args?.[0]?.value;if(typeof s=="string"){let o=L(s);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:A(o),type:"require"}}}}return null}function Jt(r,e,t){if(!r||typeof r!="object")return[];let n=[],s=na(r,e);s&&n.push(s),t.push(...ta(r));for(let o in r){if(ra.has(o))continue;let i=r[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...Jt(a,e,t));else n.push(...Jt(i,e,t))}return n}function fn(r,e){let t=X(e),n=Y(r,t),s=[],o=[];try{s=Jt(Zi.ast(e),r,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(t).map(c=>({name:c,kind:"comment-marker"})),category:n}}import sa from"luaparse";function oa(r,e){let t=[];function n(s){if(!(!s||typeof s!="object")){if((s.type==="CallExpression"||s.type==="StringCallExpression")&&s.base?.type==="Identifier"&&s.base?.name==="require"){let o;if(s.type==="CallExpression"){let i=s.arguments?.[0];i?.type==="StringLiteral"&&(o=L(i.raw))}else if(s.type==="StringCallExpression"){let i=s.argument;i?.type==="StringLiteral"&&(o=L(i.raw))}o&&t.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:A(o),type:"require"})}for(let o in s){if(o==="loc")continue;let i=s[o];if(i&&typeof i=="object")if(Array.isArray(i))for(let a of i)n(a);else n(i)}}}return n(r),t}function ia(r){let e=new Set;for(let t of r)t.type==="LocalStatement"&&t.variables.forEach((n,s)=>{t.init[s]?.type==="TableConstructorExpression"&&e.add(n.name)});return e}function aa(r){let e=r[r.length-1];if(e?.type!=="ReturnStatement")return[];let t=e.arguments[0];if(t?.type!=="TableConstructorExpression")return[];let n=[];for(let s of t.fields)s.type==="TableKeyString"&&n.push({name:s.key.name});return n}function ca(r){let e=r.body,t=ia(e),n=aa(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&t.has(o.identifier.base.name)&&n.push({name:o.identifier.identifier.name}):o.identifier?.type==="Identifier"&&!o.isLocal&&n.push({name:o.identifier.name});else if(o.type==="AssignmentStatement")for(let i of o.variables)i.type==="MemberExpression"&&i.base.type==="Identifier"&&t.has(i.base.name)&&n.push({name:i.identifier.name});let s=new Set;return n.filter(o=>s.has(o.name)?!1:(s.add(o.name),!0))}function un(r,e){let t=X(e),n=Y(r,t),s=[],o=[];try{let i=sa.parse(e);s=oa(i,r),o=ca(i)}catch{}return{imports:s,exports:o,tags:Array.from(t).map(i=>({name:i,kind:"comment-marker"})),category:n}}var pa=["http://","https://","mailto:","//"],la="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",fa=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${la})\\b`,"g"),mn;async function ua(){return mn??=(async()=>{let{unified:r}=await import("unified"),e=(await import("remark-parse")).default;return r().use(e)})(),mn}function ma(r){let e=r.trim();return e.length===0||e.startsWith("#")||pa.some(t=>e.startsWith(t))}function ga(r,e){let t=r.match(fa);return t?t.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function gn(r,e,t){if(r.type==="link"&&typeof r.url=="string"&&!ma(r.url)&&t.push({fromPath:e,toPath:"",rawSpecifier:r.url,isStyle:!1,type:"static"}),(r.type==="code"||r.type==="inlineCode")&&typeof r.value=="string"&&t.push(...ga(r.value,e)),Array.isArray(r.children))for(let n of r.children)gn(n,e,t)}async function dn(r,e){let n=(await ua()).parse(e),s=[];gn(n,r,s);let o=new Set;return{imports:s.filter(a=>o.has(a.rawSpecifier)?!1:(o.add(a.rawSpecifier),!0)),exports:[],tags:[],category:"other"}}import ya from"path";import{parser as xa}from"@lezer/python";function da(r){let e=1;function t(n){switch(n.type.name){case"IfStatement":{e+=B(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=B(n).filter(o=>o.type.name==="except").length;break}case"ForStatement":case"WhileStatement":case"ConditionalExpression":e++;break;case"and":case"or":e++;break}let s=n.firstChild;for(;s;)t(s),s=s.nextSibling}return t(r),e}function ha(r){let e=0;function t(n,s){let o=n.type.name;if(o==="IfStatement"){let c=B(n),p=0,l=0;for(;l<c.length;){let f=c[l];if(f?.type.name==="if"||f?.type.name==="elif"){let d=p>0;e+=d?1:1+s;let h=d?s:s+1,v=c[l+1],x=c[l+2];v&&t(v,h),x&&t(x,h),p++,l+=3}else if(f?.type.name==="else"){e+=1;let d=c[l+1];d&&t(d,s+1),l+=2}else l++}return}if(o==="TryStatement"){let c=B(n),p=0;for(;p<c.length;){let l=c[p];if(l?.type.name==="except"){for(e+=1+s,p++;p<c.length&&c[p]?.type.name!=="Body";)t(c[p],s),p++;p<c.length&&(t(c[p],s),p++)}else l?.type.name==="Body"&&t(l,s),p++}return}if(o==="ForStatement"||o==="WhileStatement"){e+=1+s;let c=n.firstChild;for(;c;)t(c,s+1),c=c.nextSibling;return}if((o==="ConditionalExpression"||o==="and"||o==="or")&&(e+=1),s>0&&(o==="FunctionDefinition"||o==="LambdaExpression")){e+=1+s;let c=n.firstChild;for(;c;)t(c,s+1),c=c.nextSibling;return}let a=n.firstChild;for(;a;)t(a,s),a=a.nextSibling}return t(r,0),e}function Vt(r){return{complexity:da(r),cognitiveComplexity:ha(r)}}function hn(r,e){let t=[];function n(i,a){let{complexity:c,cognitiveComplexity:p}=Vt(i);t.push({name:a,line:ue(e,i.from),complexity:c,cognitiveComplexity:p})}function s(i){let a=i.firstChild;for(;a;)o(a),a=a.nextSibling}function o(i){if(i.type.name==="ClassDefinition"){let a=i.getChild("VariableName"),c=a?e.slice(a.from,a.to):void 0,p=i.getChild("Body");if(p){let l=p.firstChild;for(;l;){if(l.type.name==="FunctionDefinition"){let f=l.getChild("VariableName"),d=f?e.slice(f.from,f.to):void 0;d&&n(l,c?`${c}.${d}`:d),s(l)}else o(l);l=l.nextSibling}}return}if(i.type.name==="FunctionDefinition"){let a=i.getChild("VariableName");a&&n(i,e.slice(a.from,a.to)),s(i);return}s(i)}return o(r.topNode),t}var Sa=new Set(["pytest","unittest","nose","hypothesis"]);function yn(r,e){let t=[],n=[],s=new Set,o=ya.basename(r).toLowerCase(),i=xa.parse(e),a=i.cursor();do switch(a.name){case"Comment":{let h=e.slice(a.from,a.to).match(/#\s*@tag\s+([a-zA-Z0-9_-]+)/);h?.[1]&&s.add(h[1]);break}case"ImportStatement":{for(let h of ba(a.node,e,r))t.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let x=a.node.getChild("VariableName");x&&n.push({name:e.slice(x.from,x.to)})}break}case"AssignStatement":{if(a.node.parent?.name==="Script"){let h=a.node.firstChild;h?.name==="VariableName"&&n.push({name:e.slice(h.from,h.to)})}break}}while(a.next());let c=Ea(o,t,s);c==="test"&&s.add("test");let{complexity:p,cognitiveComplexity:l}=Vt(i.topNode),f=hn(i,e),d=c==="test"?[]:Fa(i,e);return{imports:t,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:p,cognitiveComplexity:l,...f.length>0?{functions:f}:{}}}function ba(r,e,t){let n=r.firstChild;return n?n.name==="from"?va(r,e,t):ka(r,e,t):[]}function va(r,e,t){let n=r.firstChild;if(!n)return[];let s=n.nextSibling;for(;s&&s.name!=="import";)s=s.nextSibling;if(!s)return[];let o=e.slice(n.to,s.from).trim(),i=wa(s.nextSibling,e);if(!i.length)return[];let a=0;for(;a<o.length&&o[a]===".";)a++;let c=o.slice(a);if(a===0)return[me(t,o,i,!0)];let p=a===1?"./":"../".repeat(a-1);return c?[me(t,p+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[me(t,p.slice(0,-1),["*"],!1)]:i.map(l=>me(t,p+l,[l],!1))}function ka(r,e,t){let n=[],s=r.firstChild?.nextSibling??null;for(;s;){if(s.name==="VariableName"){let o=e.slice(s.from,s.to);for(;s.nextSibling?.name==="."&&s.nextSibling.nextSibling?.name==="VariableName";)s=s.nextSibling.nextSibling,o+=`.${e.slice(s.from,s.to)}`;s.nextSibling?.name==="as"&&(s=s.nextSibling.nextSibling??s.nextSibling),n.push(me(t,o,["*"],!0))}s=s.nextSibling}return n}function wa(r,e){let t=[],n=r;for(;n;)n.name==="*"?t.push("*"):n.name==="VariableName"&&(t.push(e.slice(n.from,n.to)),n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling)),n=n.nextSibling;return t}function Ca(r,e){let t=new Map,n=r.cursor();do{if(n.name!=="ImportStatement")continue;let o=n.node.firstChild;if(o?.type.name!=="from")continue;let i=o.nextSibling;for(;i&&i.type.name!=="import";)i=i.nextSibling;if(!i)continue;let a=e.slice(o.to,i.from).trim(),c=0;for(;c<a.length&&a[c]===".";)c++;let p=a.slice(c),l=c<=1?"./":"../".repeat(c-1),f=i.nextSibling;for(;f;){if(f.type.name==="VariableName"){let d=e.slice(f.from,f.to),h=d;if(f.nextSibling?.type.name==="as"){let x=f.nextSibling.nextSibling;x?.type.name==="VariableName"&&(h=e.slice(x.from,x.to),f=x)}let v=c===0?a:p?l+p.replace(/\./g,"/"):l+d;t.set(h,v)}f=f.nextSibling}}while(n.next());return t}function Fa(r,e){let t=Ca(r,e),n=[];function s(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let l=a.firstChild,f=e.slice(l.from,l.to),d=t.get(f);d&&n.push({from:c,to:f,toSpecifier:d})}let p=a.firstChild;for(;p;)s(p,c),p=p.nextSibling}function o(a){let c=a.firstChild;for(;c;)i(c),c=c.nextSibling}function i(a){if(a.type.name==="ClassDefinition"){let c=a.getChild("VariableName"),p=c?e.slice(c.from,c.to):void 0,l=a.getChild("Body");if(l){let f=l.firstChild;for(;f;){if(f.type.name==="FunctionDefinition"){let d=f.getChild("VariableName"),h=d?e.slice(d.from,d.to):void 0;h&&s(f,p?`${p}.${h}`:h)}else i(f);f=f.nextSibling}}return}if(a.type.name==="FunctionDefinition"){let c=a.getChild("VariableName");c&&s(a,e.slice(c.from,c.to));return}o(a)}return i(r.topNode),n}function me(r,e,t,n){return{fromPath:r,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:t.length>0?t:void 0}}function Ea(r,e,t){return r.startsWith("test_")||r.endsWith("_test.py")?"test":r==="conftest.py"||r==="setup.py"?"config":t.has("test")||e.some(n=>Sa.has(n.rawSpecifier))?"test":"logic"}import Sn from"path";import g from"typescript";import y from"typescript";function Ta(r){let e=1;function t(n){switch(n.kind){case y.SyntaxKind.IfStatement:case y.SyntaxKind.ConditionalExpression:case y.SyntaxKind.ForStatement:case y.SyntaxKind.ForInStatement:case y.SyntaxKind.ForOfStatement:case y.SyntaxKind.WhileStatement:case y.SyntaxKind.DoStatement:case y.SyntaxKind.CatchClause:case y.SyntaxKind.CaseClause:e++;break;case y.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===y.SyntaxKind.AmpersandAmpersandToken||s===y.SyntaxKind.BarBarToken||s===y.SyntaxKind.QuestionQuestionToken)&&e++;break}}y.forEachChild(n,t)}return t(r),e}function Pa(r){let e=0;function t(n,s,o){if(y.isIfStatement(n)){e+=o?1:1+s;let a=o?s:s+1;t(n.expression,a,!1),t(n.thenStatement,a,!1),n.elseStatement&&(y.isIfStatement(n.elseStatement)?t(n.elseStatement,s,!0):(e+=1,t(n.elseStatement,s+1,!1)));return}if(y.isForStatement(n)||y.isForInStatement(n)||y.isForOfStatement(n)||y.isWhileStatement(n)||y.isDoStatement(n)||y.isSwitchStatement(n)){e+=1+s,y.forEachChild(n,a=>t(a,s+1,!1));return}if(y.isCatchClause(n)){e+=1+s,y.forEachChild(n,a=>t(a,s,!1));return}if(y.isConditionalExpression(n)&&(e+=1),y.isBinaryExpression(n)){let a=n.operatorToken.kind;(a===y.SyntaxKind.AmpersandAmpersandToken||a===y.SyntaxKind.BarBarToken||a===y.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(s>0&&(y.isFunctionDeclaration(n)||y.isFunctionExpression(n)||y.isArrowFunction(n))){e+=1+s,y.forEachChild(n,a=>t(a,s+1,!1));return}y.forEachChild(n,a=>t(a,s,!1))}return t(r,0,!1),e}function Ht(r){return{complexity:Ta(r),cognitiveComplexity:Pa(r)}}import w from"typescript";var Qt=new Set(["test","describe","it"]);function xn(r,e){Aa(r,e),Ia(r,e),Ma(r,e),Da(r,e)}function Aa(r,e){if((w.isFunctionDeclaration(r)||w.isVariableDeclaration(r))&&r.name&&w.isIdentifier(r.name)&&Na(r)){let t;if(w.isFunctionDeclaration(r))t="function";else{let n=r.initializer;t=n&&(w.isArrowFunction(n)||w.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:r.name.text,kind:t})}}function Na(r){if(w.isFunctionDeclaration(r))return w.isSourceFile(r.parent);let e=r.parent?.parent;return!!e&&w.isSourceFile(e.parent)}function Ia(r,e){if(!w.isStringLiteral(r))return;let t=r.text.match(/@[\w-]+/g);if(t)for(let n of t)e.tags.add({name:n.substring(1),kind:"comment-marker"})}function Ma(r,e){if(!w.isSourceFile(r))return;let t=/@tag\s+([a-zA-Z0-9_-]+)/g,n=r.getFullText(),s=t.exec(n);for(;s!==null;)s[1]&&e.tags.add({name:s[1],kind:"comment-marker"}),s=t.exec(n)}function Da(r,e){if(w.isCallExpression(r)&&Ra(r.expression))for(let t of r.arguments)w.isObjectLiteralExpression(t)&&Ga(t,e)}function Ra(r){return w.isIdentifier(r)?Qt.has(r.text):!!(w.isPropertyAccessExpression(r)&&(Qt.has(r.name.text)||w.isIdentifier(r.expression)&&Qt.has(r.expression.text)))}function Ga(r,e){for(let t of r.properties){if(!w.isPropertyAssignment(t)||!w.isIdentifier(t.name)||t.name.text!=="tags"&&t.name.text!=="tag")continue;let{initializer:n}=t,s=w.isArrayLiteralExpression(n)?n.elements.filter(w.isStringLiteral):t.name.text==="tag"&&w.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function qt(r,e,t){let n=[],s=new Map,o=new Set,i=g.createSourceFile(r,e,g.ScriptTarget.Latest,!0,t==="typescript"?g.ScriptKind.TSX:g.ScriptKind.JSX),a={filePath:r,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=x=>{ja(x,a),g.forEachChild(x,c)};c(i);let p=qa(r,a);(p==="test"||p==="barrel")&&o.add({name:p,kind:"comment-marker"}),p!=="test"&&Xa(a,i);let l=i.statements[0],f=l?vn(l):void 0,{complexity:d,cognitiveComplexity:h}=Ht(i),v=La(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:p,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...v.length>0?{functions:v}:{},...f!==void 0?{description:f}:{}}}function La(r){let e=[],t=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=Ht(o),c=r.getLineAndCharacterOfPosition(o.getStart(r)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(g.isFunctionDeclaration(s)&&s.name&&s.body?t(s.name.text,s):g.isVariableDeclaration(s)&&g.isIdentifier(s.name)&&s.initializer&&(g.isArrowFunction(s.initializer)||g.isFunctionExpression(s.initializer))?t(s.name.text,s.initializer):o&&g.isMethodDeclaration(s)&&g.isIdentifier(s.name)&&s.body?t(`${o}.${s.name.text}`,s):o&&g.isConstructorDeclaration(s)&&s.body?t(`${o}.constructor`,s):o&&g.isGetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body?t(`${o}.get ${s.name.text}`,s):o&&g.isSetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body&&t(`${o}.set ${s.name.text}`,s),g.isClassDeclaration(s)&&s.name){let i=s.name.text;g.forEachChild(s,a=>n(a,i));return}g.forEachChild(s,i=>n(i,o))};return n(r,void 0),e}function bn(r,e,t,n){let s={name:r},o=vn(t);o!==void 0&&(s.doc=o);let i=_a(e);i!==void 0&&(s.flags=i);let a=Oa(e,n);return a!==void 0&&(s.signature=a),s}function vn(r){let e=g.getJSDocCommentsAndTags(r);for(let t of e)if(g.isJSDoc(t)&&t.comment)return g.getTextOfJSDocComment(t.comment)||void 0}function _a(r){let e=new Set(["deprecated","internal","public","alpha","beta"]),t=g.getJSDocTags(r).map(n=>n.tagName.text).filter(n=>e.has(n));return t.length>0?t:void 0}function Oa(r,e){let t=g.createPrinter({removeComments:!0}),n=s=>t.printNode(g.EmitHint.Unspecified,s,e);if(g.isFunctionDeclaration(r)||g.isMethodDeclaration(r)){let s=r.parameters.map(n).join(", "),o=r.type?n(r.type):"void";return`${r.typeParameters?`<${r.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${s}) => ${o}`}if(g.isVariableDeclaration(r)){if(r.type)return n(r.type);if(r.initializer&&(g.isArrowFunction(r.initializer)||g.isFunctionExpression(r.initializer))){let s=r.initializer,o=s.parameters.map(n).join(", "),i=s.type?n(s.type):"unknown";return`(${o}) => ${i}`}return}if(g.isClassDeclaration(r)&&r.name)return`class ${r.name.text}`;if(g.isInterfaceDeclaration(r))return`interface ${r.name.text}`;if(g.isTypeAliasDeclaration(r))return n(r.type);if(g.isEnumDeclaration(r))return`enum ${r.name.text}`}function ja(r,e){Wa(r,e),za(r,e),Ba(r,e),Ua(r,e),Qa(r,e),xn(r,e)}function Wa(r,e){if(!g.isSourceFile(r))return;let t=r.statements.filter(n=>!g.isEmptyStatement(n));e.totalStatements=t.length,e.exportStatements=t.filter(n=>g.isExportDeclaration(n)||g.isExportAssignment(n)||Xt(n)).length}function za(r,e){if(g.isJsxElement(r)||g.isJsxSelfClosingElement(r)||g.isJsxFragment(r)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(g.isFunctionDeclaration(r)||g.isMethodDeclaration(r)||g.isArrowFunction(r)||g.isClassDeclaration(r)||g.isVariableStatement(r)||g.isEnumDeclaration(r)){e.hasTypesOnly=!1;return}g.isExportDeclaration(r)&&!$a(r)&&(e.hasTypesOnly=!1)}function $a(r){return r.isTypeOnly?!0:!r.exportClause||!g.isNamedExports(r.exportClause)?!1:r.exportClause.elements.every(e=>e.isTypeOnly)}function Ba(r,e){if(!g.isImportDeclaration(r)||!r.moduleSpecifier||!g.isStringLiteral(r.moduleSpecifier))return;let t=[];if(r.importClause&&(r.importClause.name&&t.push("default"),r.importClause.namedBindings))if(g.isNamedImports(r.importClause.namedBindings))for(let s of r.importClause.namedBindings.elements)t.push(s.name.text);else g.isNamespaceImport(r.importClause.namedBindings)&&t.push("*");let n=t.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.moduleSpecifier.text,isStyle:A(r.moduleSpecifier.text),type:n,symbols:t.length>0?t:void 0})}function Ua(r,e){g.isExportDeclaration(r)?Ka(r,e):g.isExportAssignment(r)?e.exports.set("default",{name:"default"}):Xt(r)&&Ha(r,e)}function Ka(r,e){if(r.moduleSpecifier&&g.isStringLiteral(r.moduleSpecifier))Ja(r,r.moduleSpecifier.text,e);else if(r.exportClause&&g.isNamedExports(r.exportClause))for(let t of r.exportClause.elements){let n=t.name.text;e.exports.set(n,{name:n})}}function Ja(r,e,t){let n=Va(r),s={fromPath:t.filePath,toPath:"",rawSpecifier:e,isStyle:A(e),type:"re-export"};n.length>0&&(s.symbols=n),t.imports.push(s)}function Va(r){return r.exportClause?g.isNamedExports(r.exportClause)?r.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Ha(r,e){if((g.isFunctionDeclaration(r)||g.isClassDeclaration(r)||g.isInterfaceDeclaration(r)||g.isTypeAliasDeclaration(r)||g.isEnumDeclaration(r))&&r.name){let n=r.name.text;e.exports.set(n,bn(n,r,r,e.sourceFile));return}if(g.isVariableStatement(r)){for(let n of r.declarationList.declarations)if(g.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,bn(s,n,r,e.sourceFile))}}}function Qa(r,e){if(!g.isCallExpression(r))return;let t=r.arguments[0];!t||!g.isStringLiteral(t)||(r.expression.kind===g.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.text,isStyle:A(t.text),type:"dynamic"}):g.isIdentifier(r.expression)&&r.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.text,isStyle:A(t.text),type:"require"}))}function qa(r,e){let t=Sn.basename(r).toLowerCase(),n=Sn.extname(r).toLowerCase();return te().some(o=>t.includes(o))?"test":ir(t)?"config":e.imports.some(o=>qe().some(i=>o.rawSpecifier.includes(i)))?"test":n===".tsx"||n===".jsx"||e.hasUI?"ui":e.hasTypesOnly&&e.totalStatements>0?"type-only":e.totalStatements>0&&e.exportStatements/e.totalStatements>Ye()?"barrel":"logic"}function Xt(r){return g.canHaveModifiers(r)&&g.getModifiers(r)?.some(e=>e.kind===g.SyntaxKind.ExportKeyword)===!0}function Xa(r,e){let t=r.rawCallEdges??[];r.rawCallEdges=t;let n=new Map;for(let s of e.statements){if(!g.isImportDeclaration(s)||!g.isStringLiteral(s.moduleSpecifier))continue;let o=s.moduleSpecifier.text,i=s.importClause;if(i&&(i.name&&n.set(i.name.text,o),i.namedBindings&&g.isNamedImports(i.namedBindings)))for(let a of i.namedBindings.elements)n.set(a.name.text,o)}if(n.size!==0)for(let s of e.statements){let o=Za(s);if(o){let i=ec(s);i&&Ke(i,o,n,t);continue}g.isClassDeclaration(s)&&s.name&&Ya(s,s.name.text,n,t)}}function Ya(r,e,t,n){for(let s of r.members)g.isMethodDeclaration(s)&&s.body&&g.isIdentifier(s.name)?Ke(s.body,`${e}.${s.name.text}`,t,n):g.isConstructorDeclaration(s)&&s.body&&Ke(s.body,`${e}.constructor`,t,n)}function Za(r){if(Xt(r)){if(g.isFunctionDeclaration(r)&&r.name)return r.name.text;if(g.isVariableStatement(r)){for(let e of r.declarationList.declarations)if(g.isIdentifier(e.name)&&e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.name.text}}}function ec(r){if(g.isFunctionDeclaration(r))return r.body;if(g.isVariableStatement(r)){for(let e of r.declarationList.declarations)if(e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.initializer}}function Ke(r,e,t,n){if(g.isCallExpression(r)&&g.isIdentifier(r.expression)){let s=r.expression.text,o=t.get(s);o&&!n.some(i=>i.from===e&&i.to===s&&i.toSpecifier===o)&&n.push({from:e,to:s,toSpecifier:o})}g.forEachChild(r,s=>Ke(s,e,t,n))}function Je(r,e){if(e.length===0)return"ui";let t=!1;return r.walk(n=>{if(n.type==="rule")return t=!0,!1}),t?"ui":"barrel"}import wn from"postcss";import*as tc from"postcss-less";var rc=tc,Cn=new Set(["reference","inline"]);function kn(r){return r.startsWith("~")||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("//")||r.startsWith("data:")}function nc(r){let e=r.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function sc(r,e){let t=r.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(t){let o=t[1]?.trim()??"",i=t[2]??"";if(!i)return null;let a=Cn.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...kn(i)?{isExternal:!0}:{}}}let n=r.match(/^url\(['"]?([^'")]+)['"]?\)/),s=n?n[1]?.trim()??"":r.match(/^['"]([^'"]+)['"]/)?.[1]??"";return s?{fromPath:e,toPath:"",rawSpecifier:s,isStyle:!0,type:"static",...kn(s)?{isExternal:!0}:{}}:null}function oc(r,e){let t=[],n=/url\(['"]?([^'")]+)['"]?\)/g,s=n.exec(r);for(;s!==null;){let o=s[1]?.trim()??"";nc(o)&&t.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),s=n.exec(r)}return t}function Fn(r,e){let t=[];return r.walk(n=>{if(n.type==="atrule"&&n.name==="import"){let s=sc(n.params,e);s&&t.push(s)}n.type==="decl"&&t.push(...oc(n.value,e))}),t}function ic(r){return r.replace(/(?<!:)\/\/.*/g,"")}function ac(r,e){let t=[],n=/@import\s+(?:\(([^)]+)\)\s+)?['"]([^'"]+)['"]/g,s=n.exec(r);for(;s!==null;){let o=s[1]?.trim()??"",i=s[2]??"";if(i){let a=Cn.has(o)?"side-effect":"static";t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}s=n.exec(r)}return t}function En(r,e){let t=wn.parse(ic(r));return{imports:Fn(t,e),root:t}}function cc(r){let e=[],t=[];for(let n of r.nodes??[]){if(n.type!=="atrule")continue;let{value:s}=n;if(s===void 0)continue;let o=n.name;o&&(e.push({name:o}),t.push({name:o,kind:"variable"}))}return{exports:e,tags:t}}function Tn(r,e){try{let t=rc.parse(r),{exports:n,tags:s}=cc(t);return{imports:Fn(t,e),root:t,exports:n,tags:s}}catch{return{imports:ac(r,e),root:wn.parse(""),exports:[],tags:[]}}}import{parse as pc}from"postcss-scss";function Pn(r){return r.startsWith("_")||r.startsWith("-")}function lc(r){return!!(r.startsWith("sass:")||r.startsWith("~")||r.startsWith("http://")||r.startsWith("https://")||r.startsWith("//")||!r.startsWith(".")&&!r.startsWith("/")&&!r.startsWith("_"))}function fc(r){let e=r.match(/^['"]([^'"]+)['"]/);if(!e?.[1])return{specifier:""};let t=e[1],s=r.match(/\bas\s+(\S+)/)?.[1];return s!==void 0?{specifier:t,alias:s}:{specifier:t}}function uc(r){let e=[],t=[];for(let n of r.nodes??[]){if(n.type==="decl"&&n.prop.startsWith("$")){let s=n.prop.slice(1);if(!s||Pn(s))continue;e.push({name:s}),t.push({name:s,kind:"variable"});continue}if(n.type==="atrule"&&(n.name==="mixin"||n.name==="function")){let o=n.params.match(/^([\w-]+)/)?.[1];if(!o||Pn(o))continue;let i=n.params.trim();e.push(i.includes("(")?{name:o,signature:i}:{name:o}),t.push({name:o,kind:"function"})}}return{exports:e,tags:t}}function An(r,e){let t=pc(r),n=[];t.walk(i=>{if(i.type!=="atrule")return;let{name:a,params:c}=i;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:p,alias:l}=fc(c);if(!p)return;let f={fromPath:e,toPath:"",rawSpecifier:p,isStyle:!0,type:a==="forward"?"re-export":"static",...lc(p)?{isExternal:!0}:{}};l&&(f.symbols=[l]),n.push(f)});let{exports:s,tags:o}=uc(t);return{imports:n,root:t,exports:s,tags:o}}function Nn(r,e){let t=[],n=/@require\s+['"]([^'"]+)['"]/g,s=n.exec(r);for(;s!==null;){let i=s[1];i&&t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"require"}),s=n.exec(r)}let o=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(s=o.exec(r);s!==null;){let i=s[1];i&&t.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),s=o.exec(r)}return t}function In(r,e){if(e.length===0)return"ui";try{let t=Qe("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 ge(r,e){let t=G(r);if(t==="stylus"){let o=Nn(e,r);return{imports:o,exports:[],tags:[],category:In(e,o)}}if(t==="scss"){let{imports:o,root:i,exports:a,tags:c}=An(e,r);return{imports:o,exports:a,tags:c,category:Je(i,o)}}if(t==="less"){let{imports:o,root:i,exports:a,tags:c}=Tn(e,r);return{imports:o,exports:a,tags:c,category:Je(i,o)}}let{imports:n,root:s}=En(e,r);return{imports:n,exports:[],tags:[],category:Je(s,n)}}for(let[r,e]of[["javascript",(t,n)=>qt(t,n,"javascript")],["typescript",(t,n)=>qt(t,n,"typescript")],["css",ge],["scss",ge],["less",ge],["stylus",ge],["coffeescript",an],["livescript",fn],["lua",un],["python",yn],["go",ln],["gherkin",Ut],["markdown",dn]])q(r,e);async function Mn(r,e){let t=G(r),n=$r(t);return n?n(r,e):{imports:[],exports:[],tags:[],category:"other"}}import Dn from"path";function Gn(r,e){for(let t of r.values()){let n=e.get(t.path);n!==void 0&&(t.coveragePct=n)}}function Ln(r,e){for(let t of r)if(t.isExternal){let n=t.rawSpecifier.startsWith("@")?t.rawSpecifier.split("/").slice(0,2).join("/"):t.rawSpecifier.split("/")[0];n&&!e.some(s=>s.name===n)&&e.push({name:n,kind:"library"})}}function _n(r){for(let e of r.values())if(e.category==="test")for(let t of e.imports){if(t.isExternal||!t.toPath)continue;let n=r.get(t.toPath);n&&(n.category!=="logic"&&n.category!=="barrel"||(n.testedBy??=[],n.testedBy.includes(e.path)||n.testedBy.push(e.path)))}}function On(r){for(let e of r.values())if(e.type==="markdown")for(let t of e.imports){if(t.isExternal||!t.toPath)continue;let n=r.get(t.toPath);!n||n===e||(n.documentedBy??=[],n.documentedBy.includes(e.path)||n.documentedBy.push(e.path),n.category==="logic"&&(n.lastCommitAt??0)>(e.lastCommitAt??0)&&(e.staleFor??=[],e.staleFor.includes(n.path)||e.staleFor.push(n.path)))}}function Rn(r){return Math.round(r*1e4)/1e4}function jn(r){for(let e of r.values()){let t=[];for(let n of e.imports){if(n.isExternal||!n.toPath)continue;let s=r.get(n.toPath);if(!s||s.exports.length===0)continue;let o;if(n.symbols===void 0){if(n.type==="side-effect")continue;o=1}else n.symbols.includes("*")?o=1:o=n.symbols.length/s.exports.length;n.exportUsageRatio=Rn(Math.min(1,o)),t.push(n.exportUsageRatio)}t.length>0&&(e.avgExportUsage=Rn(t.reduce((n,s)=>n+s,0)/t.length),e.maxExportUsage=Math.max(...t))}}function Yt(r,e,t){e&&(r.some(n=>n.name===e&&n.kind===t)||r.push({name:e,kind:t}))}function mc(r,e){let t=e.toPath,n=Dn.basename(t,Dn.extname(t)).replace(/\.(test|spec)$/,"");Yt(r.tags,n,"import")}function gc(r,e){if(!(!e.symbols||e.symbols.includes("*")))for(let t of e.symbols)Yt(r.tags,t,"import")}function dc(r,e,t){let n=t.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&Yt(r.tags,s.name,"comment-marker")}function Wn(r){for(let e of r.values())if(e.category==="test")for(let t of e.imports)!t.toPath||t.isExternal||(mc(e,t),gc(e,t),dc(e,t,r))}import Ve from"fs";import _ from"path";import Bn from"fs";import Z from"path";var de=class{extensions=[".go"];goModCache=new Map;resolve(e,t,n,s){let{mod:o,replaces:i}=this.readGoMod(n);if(!o)return null;let a=this.applyReplace(t,i,n);if(a!==void 0)return $n(a);if(t!==o&&!t.startsWith(`${o}/`))return null;let c=t.slice(o.length).replace(/^\//,"");return c?$n(Z.join(n,c)):null}readGoMod(e){let t=this.goModCache.get(e);if(t!==void 0)return t;let n={mod:null,replaces:new Map};try{let s=Bn.readFileSync(Z.join(e,"go.mod"),"utf-8"),o=hc(s,e);return this.goModCache.set(e,o),o}catch{return this.goModCache.set(e,n),n}}applyReplace(e,t,n){for(let[s,o]of t){if(e===s)return o;if(e.startsWith(`${s}/`)){let i=e.slice(s.length+1);return Z.join(o,i)}}}};function hc(r,e){let t=r.split(`
27
+ `),n=null,s=new Map,o=!1;for(let i of t){let a=i.trim();if(a.startsWith("module ")){n=a.slice(7).trim();continue}if(/^replace\s*\(/.test(a)){o=!0;continue}if(o&&a===")"){o=!1;continue}if(o&&a.includes("=>")){zn(a,e,s);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&zn(a.replace(/^replace\s+/,""),e,s)}return{mod:n,replaces:s}}function zn(r,e,t){let[n,s]=r.split("=>").map(a=>a.trim());if(!n||!s)return;let o=n.split(/\s+/)[0];if(!s.startsWith(".")&&!s.startsWith("/"))return;let i=Z.isAbsolute(s)?s:Z.resolve(e,s);t.set(o,i)}function $n(r){let e;try{e=Bn.readdirSync(r,{withFileTypes:!0})}catch{return null}let t=e.filter(n=>n.isFile()&&n.name.endsWith(".go")&&!n.name.endsWith("_test.go")).map(n=>({path:Z.join(r,n.name),isExternal:!1})).sort((n,s)=>n.path.localeCompare(s.path));return t.length>0?t:null}import yc from"fs";import Zt from"path";var he=class{extensions=[".lua"];resolve(e,t,n,s){let o=t.replace(/\./g,Zt.sep),i=[n,Zt.join(n,"lib")];for(let a of i){if(!yc.existsSync(a))continue;let c=s(Zt.join(a,"_dummy.lua"),o);if(c)return[c]}return null}};import xc from"path";var ye=class{extensions=[".md",".mdx"];resolve(e,t,n,s){let o=s(xc.join(n,"_dummy"),`./${t}`);return o?[o]:null}};import Sc from"fs";import er from"path";var xe=class{extensions=[".py"];resolve(e,t,n,s){let o=t.replace(/\./g,er.sep),i=er.join(n,`${o}.py`);if(Un(i))return[{path:i,isExternal:!1}];let a=er.join(n,o,"__init__.py");return Un(a)?[{path:a,isExternal:!1}]:null}};function Un(r){try{return Sc.statSync(r,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import Kn from"path";var bc=["~","http://","https://","//","data:","sass:"],Se=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,t,n,s){if(bc.some(l=>t.startsWith(l)))return null;let o=s(e,t);if(o)return[o];let i=Kn.dirname(t),a=Kn.basename(t),c=i==="."?`_${a}`:`${i}/_${a}`,p=s(e,c);return p?[p]:null}};var K=class{constructor(e,t={}){this.rootDir=e;this.workspaceMap=t.workspaceMap??new Map,this.tsconfigSearchPaths=t.tsconfigSearchPaths??[e],this.pathAliases=t.pathAliases,this.langResolvers=t.langResolvers??[new xe,new he,new de,new Se,new ye]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;langResolvers;resolveAll(e,t){let n=this.resolvePathAlias(t);if(n)return[n];if(t.startsWith(".")||t.startsWith("/")){let i=this.resolveLocalPath(e,t);return i?[i]:[]}let s=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,t,this.rootDir,s);if(a)return a}let o=this.resolveWorkspaceImport(t);return o?[o]:[{path:t,isExternal:!0}]}resolve(e,t){let n=this.resolvePathAlias(t);if(n)return n;if(t.startsWith(".")||t.startsWith("/"))return this.resolveLocalPath(e,t);let s=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,t,this.rootDir,s);if(a)return a[0]??null}let o=this.resolveWorkspaceImport(t);return o||{path:t,isExternal:!0}}resolveLocalPath(e,t){let n=_.dirname(e),s=t.startsWith("/")?t:_.resolve(n,t),o=!s.startsWith(this.rootDir),i=["",".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".feature",".md",".mdx"],a=s.match(/\.(js|mjs|cjs)$/);if(a){let c=s.slice(0,-a[0].length);for(let p of[".ts",".tsx"]){let l=this.tryExtensions(c,p,o);if(l)return l}}for(let c of i){let p=this.tryExtensions(s,c,o);if(p)return p}return o?{path:s,isExternal:!0}:null}tryExtensions(e,t,n){let s=e+t;if(this.isFile(s))return{path:s,isExternal:n};let o=_.join(e,`index${t}`);if(this.isFile(o))return{path:o,isExternal:n};if(t===".py"){let i=_.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:n}}return null}isFile(e){try{return Ve.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let t in this.pathAliases){let n=this.matchAliasPattern(t,e),s=this.pathAliases[t];if(n&&s){let o=this.tryAliasSubstitutions(s,n[1]||"");if(o)return o}}for(let t of this.tsconfigSearchPaths){let n=_.join(t,"tsconfig.json");if(Ve.existsSync(n))try{let o=JSON.parse(Ve.readFileSync(n,"utf-8")).compilerOptions?.paths;if(!o)continue;for(let i in o){let a=this.matchAliasPattern(i,e);if(a){let c=this.tryAliasSubstitutions(o[i],a[1]||"",t);if(c)return c}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,t){let n=this.aliasRegexCache.get(e);if(!n){let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace("\\*","(.*)");n=new RegExp(`^${s}$`),this.aliasRegexCache.set(e,n)}return t.match(n)}tryAliasSubstitutions(e,t,n=this.rootDir){let s=["",".ts",".tsx",".js",".jsx",".coffee",".ls",".lua",".feature"];for(let o of e){let i=o.replace("*",t),a=_.resolve(n,i);for(let c of s){let p=this.tryExtensions(a,c,!1);if(p)return p}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[t,n]of this.workspaceMap){if(e!==t&&!e.startsWith(`${t}/`))continue;let s=e.slice(t.length),o={path:"",isExternal:!1,isWorkspace:!0,workspacePackage:t};if(!s){for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"]){let c=_.join(n,a);try{if(Ve.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...o,path:c}}catch{}}return{...o,path:n}}let i=this.resolveLocalPath(_.join(n,"_dummy"),s.slice(1));return i?{...o,path:i.path}:null}return null}};var kc=["tests","test","__tests__","specs","spec"],Jn=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),wc=20;function Cc(r,e){if(r.length===0)return e;let t=r.map(i=>T.dirname(i).split(T.sep)),n=t[0]??[];for(let i of t.slice(1)){let a=0;for(;a<n.length&&a<i.length&&n[a]===i[a];)a++;n=n.slice(0,a)}let s=n.join(T.sep)||T.sep,o=T.relative(e,s);return o.startsWith("..")||T.isAbsolute(o)?e:s}var ve=class{constructor(e,t=null,n,s,o=!1,i=new Map,a=!0){this.rootDir=e;this.enableGitStats=o;this.coverageMap=i;this.parallelParsing=a;this.previousGraph=t,this.resolver=n||new K(e),this.lockFile=Sr(e),s&&(this.progressCallback=s)}rootDir;enableGitStats;coverageMap;parallelParsing;graph={nodes:new Map};visited=new Set;queue=[];previousGraph=null;resolver;lockFile=null;progressCallback;pool=null;gitStatsMap=null;async build(e){let t=e.map(n=>T.isAbsolute(n)?n:T.resolve(this.rootDir,n));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=rn(this.rootDir));try{for(let n of t)this.enqueue(n);return await this.drain(),await this.processTestFiles(Cc(t,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
25
28
  Done. Total processed: ${this.visited.size} nodes.
26
- `),Ms(this.graph.nodes),Ps(this.graph.nodes),Ns(this.graph.nodes),As(this.graph.nodes),this.coverageMap.size>0&&Fs(this.graph.nodes,this.coverageMap),new M(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},t=e.minFiles??ic;if(!(t>0&&!this.hasAtLeastFiles(this.rootDir,t)))try{let s=F.join(f,"parse-worker.js");this.pool=new nc({filename:s,...e.maxThreads!==void 0?{maxThreads:e.maxThreads}:{}})}catch(s){process.stderr.write(`
27
- Warning: failed to start parse worker pool, falling back to synchronous parsing: ${s}
28
- `),this.pool=null}}hasAtLeastFiles(e,t){let s=0,n=[e];for(;n.length>0;){let o=n.pop(),i;try{i=ve.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())_s.has(a.name)||n.push(F.join(o,a.name));else if(a.isFile()&&(s++,s>=t))return!0}return s>=t}async processTestFiles(e){let t=re(),s=o=>t.some(i=>o.name.includes(i));this.walkProject(e,s);let n=e;for(;n!==this.rootDir;){let o=F.dirname(n);if(o===n)break;for(let i of oc){let a=F.join(o,i);try{ve.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,t){let s;try{s=ve.readdirSync(e,{withFileTypes:!0})}catch{return}for(let n of s){let o=F.join(e,n.name);n.isDirectory()?_s.has(n.name)||this.walkProject(o,t):n.isFile()&&t(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(t=>this.finishFile(t)))}}async finishFile(e){let t=ve.statSync(e,{throwIfNoEntry:!1});if(!t?.isFile())return;let s=F.relative(this.rootDir,e),n=await this.getNode(e,s,t);n.imports=await this.resolveImports(e,n.imports),Ts(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=ve.readFileSync(e,"utf-8");try{return await this.parseContent(e,s)}catch(n){return process.stderr.write(`
29
- Warning: failed to parse ${t}: ${n}
30
- `),null}}parseContent(e,t){return this.pool?this.pool.run({filePath:e,content:t}):ks(e,t)}makeStubNode(e,t,s){return{path:t,type:R(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:F.relative(this.rootDir,o.path)})}catch{}return s}buildNode(e,t,s,n,o){let{imports:i,exports:a,tags:c,category:p,description:l,complexity:g,cognitiveComplexity:d,functions:h}=n;return{path:t,type:R(e),category:p,imports:i,exports:a,tags:c,mtime:s.mtimeMs,size:s.size,...l!==void 0?{description:l}:{},...o.length>0?{callEdges:o}:{},...g!==void 0?{complexity:g}:{},...d!==void 0?{cognitiveComplexity:d}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,t){let s=this.gitStatsMap?.get(t);s&&(e.commitCount90d=s.commitCount90d,s.lastAuthor!==void 0&&(e.lastAuthor=s.lastAuthor),s.lastCommitAt!==void 0&&(e.lastCommitAt=s.lastCommitAt))}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:F.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 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 Os(r,e){return{identifier:e?.identifier??new $e,featureMap:e?.featureDetection===!1?new Map:L(r.nodes,e?.featureDetection??void 0)}}function js(r,e,t,s,n){for(let o of e){let i=r.nodes.get(o);if(!i)continue;let a=new _(o,["*",...i.exports.map(c=>c.name)]);r.traverse(o,(c,p,l)=>{if(!l)return!0;if(!a.updateAffectedSymbols(c,l))return!1;if(p>0){let g=t.get(c.path);if(g)return s(g),!1}return n(c),!0},{direction:"incoming"})}}function Vt(r,e,t){let{identifier:s,featureMap:n}=Os(r,t),o=new Set;for(let i of e){let a=n.get(i);a&&o.add(a.tag)}return js(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 Ht(r,e,t){let{identifier:s,featureMap:n}=Os(r,t),o=new Set;return js(r,e,n,()=>{},i=>{s.isTestNode(i)&&o.add(i.path)}),Array.from(o)}import cc from"fs";import ke from"path";async function Ws(r,e,t=null,s={}){let n=s.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=ke.resolve(r);return await new Ce(o,t,s.pathAliases?new z(o,{pathAliases:s.pathAliases}):void 0,n,s.gitStats??!1,s.coverageMap??new Map,s.parallelParsing??!0).build(e)}async function zs(r,e={}){let t=ke.resolve(r),s=le(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 fe(t,s.type);for(let a of n){let c=e.silent?void 0:g=>{process.stderr.write(`[${a.name}] Processed ${g} files...\r`)},l=await new Ce(t,null,new z(t,{workspaceMap:o,tsconfigSearchPaths:[a.root,t],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,l)}return i}function $s(r,e={}){let t=[],s=new Set([...e.ignoreDirs??rt,...e.additionalIgnoreDirs??[]]),n=new Set([...e.extensions??st,...e.additionalExtensions??[]]);function o(i){try{let a=cc.readdirSync(i,{withFileTypes:!0});for(let c of a){let p=ke.join(i,c.name);c.isDirectory()?s.has(c.name)||o(p):c.isFile()&&n.has(ke.extname(c.name).toLowerCase())&&t.push(ke.relative(r,p))}}catch{}}return o(r),t}var Bs=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var Qe=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,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 Ws(e,t,this.graphs.get(e)??null,{...U(n),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 zs(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=pt(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=pc.watch(e,{recursive:!0},(s,n)=>{!n||Bs.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,U(t))}invalidate(e){let t=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),t}};import te from"path";import lc from"fs";import fc from"os";import Qt from"path";function x(r){return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}function Us(r){if(!Qt.isAbsolute(r))throw new Error("root must be an absolute path");let e=Qt.resolve(r),t=fc.homedir();if(e!==t&&!e.startsWith(t+Qt.sep))throw new Error("root must be within the user home directory");let s;try{s=lc.statSync(e)}catch{throw new Error("root does not exist")}if(!s.isDirectory())throw new Error("root is not a directory")}async function Ks(r,e){let{root:t,entryPoints:s}=e;if(!r.isConfigured(t)){let d=se(t,{allowJs:!1});tt(d),r.storeConfig(t,d)}if(s.length===0){let d=le(t);if(d.type!=="none"){let h=r.getConfig(t),v=await r.getOrBuildWorkspace(t,U(h));r.storeLastAnalyze(t,{kind:"workspace"}),r.startWatching(t);let S=Array.from(v.packages.values()).map(({graph:k,pkg:A})=>({package:A.name,relativeRoot:A.relativeRoot,nodeCount:k.nodes.size}));return x({monorepoType:d.type,packageCount:v.packages.size,packages:S})}}let n=s.map(d=>te.resolve(t,d)),o=r.getConfig(t),i=o?.coverageReportPath?nt(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 c=a.serialize(),p=c.nodes.reduce((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),l=a.findCycles(),g=ft(a);return x({nodeCount:c.nodes.length,categories:p,cycles:l,languageCoverage:g})}async function Js(r,e){let{root:t,file:s,depth:n=1,withMeta:o=!1}=e,i=await r.ensureFresh(t),a=ut(i,s,n),c=o?a.map(p=>({...p,...ie(i,p.path)})):a;return x({file:s,dependencies:c})}async function Vs(r,e){let{root:t,file:s,withMeta:n=!1}=e,o=await r.ensureFresh(t),i=ae(o,s),a=n?i.map(c=>({...c,...ie(o,c.path)})):i;return x({file:s,dependents:a})}async function Hs(r,e){let{root:t,file:s,testsOnly:n=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,c=await r.ensureFresh(t),p=d=>a?d.map(h=>({path:h,...ie(c,h)})):d;if(o){let d=r.getOrBuildChangeImpact(t),h=lt(d,s),v=n?h.filter(k=>c.nodes.get(k)?.category==="test"):h,S=p(v);return x({file:s,affected:S,count:S.length})}let l=mt(c,s,{testsOnly:n,changedSymbols:i}),g=p(l);return x({file:s,affected:g,count:g.length})}async function Qs(r,e){let{root:t,file:s,depth:n=1,withEdgeDetail:o=!1}=e,i=await r.ensureFresh(t),a=gt(i,s,{depth:n,withEdgeDetail:o});return x({file:s,callers:a,count:a.length})}async function qs(r,e){let{root:t,entryPoints:s}=e,n=s.map(c=>te.resolve(t,c)),o=await r.getOrBuild(t,n),i=$s(t),a=o.findUnusedFiles(i);return x({unusedFiles:a,count:a.length})}async function Xs(r,e){let{root:t,coverageThreshold:s}=e,n=await r.ensureFresh(t),o=r.getConfig(t),i=s??o?.coverageThreshold??80;if(!xt(n))return x({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let a=[...n.nodes.values()].filter(c=>c.category!=="test"&&c.category!=="config").filter(c=>c.coveragePct!==void 0&&c.coveragePct<i).map(c=>({file:c.path,coveragePct:c.coveragePct}));return x({threshold:i,uncovered:a,count:a.length})}async function Ys(r,e){let{root:t}=e,n=[...(await r.ensureFresh(t)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return x({staleDocs:n,count:n.length})}async function Zs(r,e){let{root:t,metric:s="cognitiveComplexity",threshold:n=10,limit:o=20}=e,i=await r.ensureFresh(t),a=dt(i,{metric:s,threshold:n,limit:o});return x({metric:s,threshold:n,functions:a,count:a.length})}async function en(r,e){let{root:t,changedFiles:s,featureThreshold:n,format:o="tags"}=e,i=await r.ensureFresh(t),a=s??new Be().getChangedFiles().map(l=>te.relative(t,te.resolve(t,l))),c=n!==void 0?{featureDetection:{minOutDegree:n}}:void 0;if(o==="paths"){let l=Ht(i,a,c);return x({changedFiles:a,affectedTests:l,count:l.length})}let p=Vt(i,a,c);return x({changedFiles:a,proposedTags:p})}async function tn(r,e){let{root:t,entryPoints:s,featureThreshold:n}=e,o=s?await r.getOrBuild(t,s.map(c=>te.resolve(t,c))):await r.ensureFresh(t),i=L(o.nodes,n!==void 0?{minOutDegree:n}:void 0),a=Array.from(i.values()).sort((c,p)=>p.outDegree-c.outDegree);return x({features:a,count:a.length})}async function rn(r,e){let{root:t,entryPoints:s,filter:n,mermaid:o=!1,slim:i=!0}=e,a=s?await r.getOrBuild(t,s.map(p=>te.resolve(t,p))):await r.ensureFresh(t),c=Ie(a.serialize(),Re(n));return o?x(Pe.serialize(M.deserialize(c))):i?x(ht(c)):x(c)}async function sn(r,e){let{root:t}=e,s=await r.ensureFreshWorkspace(t);return x(yt(s))}async function nn(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 on(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 an(r,e){let{root:t,type:s}=e,n=await r.ensureFresh(t),o=vt(n);if(s)return x(Ct(o,s));let i=Array.from(o.types.values());return x({count:i.length,types:i})}async function cn(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 c=s.map(p=>i.get(p)).filter(Boolean);return x({count:c.length,modules:c})}let a=Array.from(i.values());return x({count:a.length,modules:a})}async function pn(r,e){let{root:t,minOutDegree:s}=e,n=await r.ensureFresh(t),o=ne(n,s!==void 0?{minOutDegree:s}:void 0),i=Object.fromEntries(o.features);return x({features:i,unassigned:o.unassigned})}async function ln(r,e){let{root:t,function:s}=e,n=await r.ensureFresh(t);return x(ct(n,s))}async function fn(r,e){let{root:t,name:s}=e,n=await r.ensureFresh(t),o=bt(n,s);return x({name:s,matches:o,count:o.length})}async function un(r,e){let{root:t,entryPoints:s}=e,n=await r.ensureFresh(t),o=s?.length?s:it(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(at(n,o))}async function mn(r,e){let t=await r.ensureFresh(e.root),s=await Rt(t,e.root,{dryRun:e.dryRun??!1});return x(s)}var gn=[{name:"analyze",description:"Build the dependency graph for a project from entry points. Returns a summary of node count, categories, and cycles. Must be called before get_dependencies, get_dependents, get_affected, or propose_tags. Pass an empty entryPoints array to auto-detect a monorepo (pnpm/npm/yarn/Nx/Turborepo) and build per-package graphs \u2014 use get_workspace_packages and get_workspace_affected for monorepo queries.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root (or monorepo root)"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root (e.g. ['src/index.ts']). Pass [] to trigger monorepo auto-detection."}},required:["root","entryPoints"]}},{name:"get_dependencies",description:"Get files that a given file imports (outgoing traversal). depth=1 returns immediate imports; omit for the full transitive tree. Each result includes the specific symbols imported from that file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_dependents",description:"Get files that directly import a given file (one-hop incoming edges). Each result includes the specific symbols that dependent file imports from this file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_affected",description:"Get all files transitively affected if a given file changes \u2014 full incoming traversal upward. Use before a refactor to understand blast radius. Set testsOnly=true to get only test files. Set cached=true to use a pre-computed O(1) lookup cache instead of graph traversal \u2014 faster on repeated calls for the same root. Pass changedSymbols to restrict blast-radius to files that actually import those symbols \u2014 omit to treat the whole file as changed. Set withMeta=true to get { path, category, exports } objects instead of bare path strings.",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},testsOnly:{type:"boolean",description:"Return only test/spec files (default: false)"},cached:{type:"boolean",description:"Use a pre-computed impact cache for O(1) lookup instead of graph traversal. Cache is built lazily on first use and reused for the session (default: false)."},changedSymbols:{type:"array",items:{type:"string"},description:"Restrict blast-radius to files that import at least one of these symbols. Omit to treat the whole file as changed (conservative, same as before)."},withMeta:{type:"boolean",description:"Return each affected file as { path, category, exports } instead of a bare path string (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_callers",description:"Get files whose exported functions call into a given file (call-graph dependents). More precise than get_affected: only files with actual runtime call edges, not mere imports. Requires prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to project root"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withEdgeDetail:{type:"boolean",description:"Include from/to function names per edge (default: false)"}},required:["root","file"]}},{name:"find_unused",description:"Find files in the project that are not reachable from any entry point. Useful before cleanup passes.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"}}},required:["root","entryPoints"]}},{name:"find_uncovered",description:"Find non-test files whose line coverage is below the configured threshold. Requires a prior analyze() call and coverageReportPath set in mokosh.config. coverageThreshold overrides the config default (default: 80).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},coverageThreshold:{type:"number",description:"Line-coverage % below which a file is considered uncovered. Overrides config value."}},required:["root"]}},{name:"check_doc_drift",description:"Find markdown docs whose referenced files changed more recently than the doc itself \u2014 a commit-recency heuristic for stale documentation, not a content diff. Requires a prior analyze() call with gitStats: true in mokosh.config (otherwise no file has commit-timestamp data and nothing is flagged). See docs/adr-009-markdown-parsing.md for known limitations.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_complex_functions",description:"Find individual functions/methods above a cognitive (or cyclomatic) complexity threshold, sorted worst-first. Requires a prior analyze() call. Populated for TypeScript/JavaScript, Go, and Python.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which score to threshold/sort on (default: cognitiveComplexity)"},threshold:{type:"number",description:"Minimum score to include (default: 10)"},limit:{type:"number",description:"Max results to return, worst-first (default: 20)"}},required:["root"]}},{name:"propose_tags",description:"Propose what to run based on changed files. Pass changedFiles explicitly or omit to use git diff. format='tags' (default) returns test tags for CI tag-filtering; format='paths' returns test file paths ready to pipe directly to a test runner (e.g. vitest). Feature hubs act as traversal boundaries in both modes.",inputSchema:{type:"object",properties:{root:{type:"string"},changedFiles:{type:"array",items:{type:"string"},description:"Changed files relative to root. Omit to read from git diff."},featureThreshold:{type:"number",description:"Min importers for a file to be treated as a feature hub (default: 5). A hub short-circuits traversal and emits a feature:<name> tag instead of all downstream tags."},format:{type:"string",enum:["tags","paths"],description:"Output format: 'tags' returns test tag names for CI filtering (default); 'paths' returns test file paths to pipe to a test runner."}},required:["root"]}},{name:"detect_features",description:"Identify feature hub files \u2014 non-test files that import many other internal modules (orchestrators / aggregators like src/parser.ts or src/cli/runner.ts). Returns a list sorted by import count descending.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to use the cached graph."},featureThreshold:{type:"number",description:"Min internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"query",description:"Filter the graph by category, tag, or path. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry points to build the graph. Omit to reuse the cached graph from a prior 'analyze' call."},filter:{type:"string",description:"Query string e.g. 'category:logic' or 'category:logic,tag:auth'. Supports: category, type, tag, path, external, importsFile, importedBy, minImports, maxImports, minSize, maxSize, hasDocstring, minCoverage, maxCoverage, minExportUsage, maxExportUsage, minComplexity, maxComplexity, minCognitiveComplexity, maxCognitiveComplexity, minCommits, maxCommits, isDocumented, isStale, lastAuthor. OR logic: any(key:val|key:val) matches if any single-key clause holds, ANDed with the rest of the query. sort: size|imports|commitCount90d|exportUsage|complexity|cognitiveComplexity, with sortDir: asc|desc (default desc). limit: N."},mermaid:{type:"boolean",description:"Return a Mermaid diagram (default: false)"},slim:{type:"boolean",description:"Compact response mode (default: true). Returns export names, meaningful tags, and a flat importsFiles path list \u2014 no edge objects, no mtime/size. Pass false only when full edge metadata is needed."}},required:["root","filter"]}},{name:"get_workspace_packages",description:"List all workspace packages detected in a monorepo, with their node counts and inter-package dependencies. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"}},required:["root"]}},{name:"get_workspace_affected",description:"Cross-package blast-radius analysis. Returns every file that could be affected if a given file changes, annotated with the package it belongs to. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"},file:{type:"string",description:"Monorepo-root-relative path of the changed file (e.g. 'packages/shared/src/utils.ts')"}},required:["root","file"]}},{name:"get_type_graph",description:"Return type-level relationships for the project. Without a type name, returns an inventory of all interfaces, classes, enums, and type aliases with their file and kind. With a type name, returns which files import that type (usedByFiles) and which types the defining file imports (uses). Requires a prior analyze() call. Only covers TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},type:{type:"string",description:"Exact exported name of the type to look up (e.g. 'FileNode'). Omit to get the full type inventory."}},required:["root"]}},{name:"get_module_responsibility",description:"Return what each file is responsible for: its semantic role, JSDoc description (when present), exported symbol names, and which feature hub it belongs to. Pass specific paths to filter, or omit paths to get all files. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},paths:{type:"array",items:{type:"string"},description:"Project-relative file paths to include. Omit to return all files."},minOutDegree:{type:"number",description:"Min imports for a file to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_feature_graph",description:"Group files by domain: returns which files each feature hub (high-import orchestrator) transitively owns. Each file is assigned to the most specific hub that can reach it (lowest out-degree wins). Use this instead of a full query when answering 'what files are in the X feature/module?' \u2014 typically 85\u201395% fewer tokens than a full graph query.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minOutDegree:{type:"number",description:"Minimum internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_call_graph",description:"Look up callers and callees for a named function. Returns the file that defines the function, all files/functions that call it, and all files/functions it calls. Always requires a function name \u2014 never returns the full call graph unfiltered. Call edges are only populated for TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},function:{type:"string",description:"Exact name of the function to look up (e.g. 'parseFile')."}},required:["root","function"]}},{name:"find_symbol",description:"Find every file that exports a symbol by exact name, with the best available usage info per match. Precision varies by the defining file's language: TypeScript/JavaScript, Go, and Python get function-level callers (via call edges) \u2014 though coverage differs per language (Go only tracks package-qualified calls, Python only tracks bare calls to `from module import name` symbols); everything else (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) falls back to whole-file dependents, which is import-level only \u2014 a listed importer might not even use this specific export. Files whose parser never records exports (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) never appear as matches, so a name that only exists in one of those returns an empty result, same as a typo. Each match's `precision` field is 'call' | 'file-level' \u2014 check it before trusting caller/importer results as symbol-exact.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},name:{type:"string",description:"Exact export name to look up (e.g. 'parseFile')."}},required:["root","name"]}},{name:"get_api_surface",description:"Build the API surface report for a project. Expands export* chains so every symbol accessible to consumers is listed (not just those directly declared in the entry file). Each export is resolved to its defining file and tagged with a kind (function/class/interface/type/enum/const). The graph is partitioned into: internalFiles (implementation reachable from entry points), unreachableFromEntry (non-test files not reachable from any entry point \u2014 may be separate consumers like CLI/MCP, config, or dead code), and testFiles (test suite). Supports multiple public entry points for libraries with sub-path exports. Requires a prior analyze() call. When entryPoints is omitted, auto-detects all entry points from package.json exports/main/module.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},entryPoints:{type:"array",items:{type:"string"},description:"Project-relative paths of public entry points (e.g. ['src/index.ts', 'src/utils.ts']). Omit to auto-detect from package.json exports / main / module fields."}},required:["root"]}},{name:"clear_cache",description:"Drop the cached dependency graph for a project root, forcing the next analyze() call to rebuild from disk. Call this after editing source files mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root to invalidate."}},required:["root"]}},{name:"apply_tags",description:"Write @tag annotations into test file source code based on the dependency graph. Tags of kind 'import' (filename-derived) and 'comment-marker' (domain semantic, propagated from source files) are written as an idempotent block. Re-running is safe: the existing block is replaced in place. Tags already present in the file are excluded from the block to avoid duplication. Supports TypeScript/JavaScript (// <mokosh-tags> block with // @tag lines) and Gherkin .feature files (# <mokosh-tags> block with @tagname lines). Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root."},dryRun:{type:"boolean",description:"When true, computes which files would change but does not write to disk (default: false)."}},required:["root"]}}];function qt(){let r=new Qe,e=new uc({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(gc,async()=>({tools:gn})),e.setRequestHandler(mc,async t=>{let{name:s,arguments:n}=t.params,o=n,a={analyze:c=>Ks(r,c),get_dependencies:c=>Js(r,c),get_dependents:c=>Vs(r,c),get_affected:c=>Hs(r,c),get_callers:c=>Qs(r,c),find_symbol:c=>fn(r,c),find_unused:c=>qs(r,c),find_uncovered:c=>Xs(r,c),check_doc_drift:c=>Ys(r,c),find_complex_functions:c=>Zs(r,c),propose_tags:c=>en(r,c),detect_features:c=>tn(r,c),get_type_graph:c=>an(r,c),get_module_responsibility:c=>cn(r,c),get_feature_graph:c=>pn(r,c),get_call_graph:c=>ln(r,c),get_api_surface:c=>un(r,c),query:c=>rn(r,c),get_workspace_packages:c=>sn(r,c),get_workspace_affected:c=>nn(r,c),clear_cache:c=>on(r,c),apply_tags:c=>mn(r,c)}[s];if(!a)throw new Error(`Unknown tool: ${s}`);try{return Us(o.root),await a(o)}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),e}async function hc(){let r=qt(),e=new dc;await r.connect(e)}hc().catch(console.error);export{qt as createMcpServer};
29
+ `),Wn(this.graph.nodes),_n(this.graph.nodes),jn(this.graph.nodes),On(this.graph.nodes),this.coverageMap.size>0&&Gn(this.graph.nodes,this.coverageMap),new M(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},t=e.minFiles??wc;if(!(t>0&&!this.hasAtLeastFiles(this.rootDir,t)))try{let n=T.join(u,"parse-worker.js");this.pool=new vc({filename:n,...e.maxThreads!==void 0?{maxThreads:e.maxThreads}:{}})}catch(n){process.stderr.write(`
30
+ Warning: failed to start parse worker pool, falling back to synchronous parsing: ${n}
31
+ `),this.pool=null}}hasAtLeastFiles(e,t){let n=0,s=[e];for(;s.length>0;){let o=s.pop();if(o===void 0)continue;let i;try{i=be.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())Jn.has(a.name)||s.push(T.join(o,a.name));else if(a.isFile()&&(n++,n>=t))return!0}return n>=t}async processTestFiles(e){let t=te(),n=o=>t.some(i=>o.name.includes(i));this.walkProject(e,n);let s=e;for(;s!==this.rootDir;){let o=T.dirname(s);if(o===s)break;for(let i of kc){let a=T.join(o,i);try{be.statSync(a).isDirectory()&&this.walkProject(a,n)}catch{}}s=o}await this.drain()}async processDocFiles(){this.walkProject(this.rootDir,e=>e.name.endsWith(".md")||e.name.endsWith(".mdx")),await this.drain()}walkProject(e,t){let n;try{n=be.readdirSync(e,{withFileTypes:!0})}catch{return}for(let s of n){let o=T.join(e,s.name);s.isDirectory()?Jn.has(s.name)||this.walkProject(o,t):s.isFile()&&t(s)&&this.enqueue(o)}}enqueue(e){this.visited.has(e)||(this.visited.add(e),this.showProgress(),this.queue.push(e))}async drain(){for(;this.queue.length>0;){let e=this.queue;this.queue=[],await Promise.all(e.map(t=>this.finishFile(t)))}}async finishFile(e){let t=be.statSync(e,{throwIfNoEntry:!1});if(!t?.isFile())return;let n=T.relative(this.rootDir,e),s=await this.getNode(e,n,t);s.imports=await this.resolveImports(e,s.imports),Ln(s.imports,s.tags),this.graph.nodes.set(s.path,s)}async getNode(e,t,n){let s=this.previousGraph?.nodes.get(t);if(s&&s.mtime===n.mtimeMs&&s.size===n.size)return{...s};let o=await this.tryParse(e,t);if(!o)return this.makeStubNode(e,t,n);let i=this.resolveCallEdges(e,o.rawCallEdges),a=this.buildNode(e,t,n,o,i);return this.attachGitStats(a,t),a}async tryParse(e,t){let n=be.readFileSync(e,"utf-8");try{return await this.parseContent(e,n)}catch(s){return process.stderr.write(`
32
+ Warning: failed to parse ${t}: ${s}
33
+ `),null}}parseContent(e,t){return this.pool?this.pool.run({filePath:e,content:t}):Mn(e,t)}makeStubNode(e,t,n){return{path:t,type:G(e),category:"other",imports:[],exports:[],tags:[],mtime:n.mtimeMs,size:n.size}}resolveCallEdges(e,t){let n=[];for(let s of t??[])try{let o=this.resolver.resolve(e,s.toSpecifier);o&&!o.isExternal&&n.push({from:s.from,to:s.to,toFile:T.relative(this.rootDir,o.path)})}catch{}return n}buildNode(e,t,n,s,o){let{imports:i,exports:a,tags:c,category:p,description:l,complexity:f,cognitiveComplexity:d,functions:h}=s;return{path:t,type:G(e),category:p,imports:i,exports:a,tags:c,mtime:n.mtimeMs,size:n.size,...l!==void 0?{description:l}:{},...o.length>0?{callEdges:o}:{},...f!==void 0?{complexity:f}:{},...d!==void 0?{cognitiveComplexity:d}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,t){let n=this.gitStatsMap?.get(t);n&&(e.commitCount90d=n.commitCount90d,n.lastAuthor!==void 0&&(e.lastAuthor=n.lastAuthor),n.lastCommitAt!==void 0&&(e.lastCommitAt=n.lastCommitAt))}async resolveImports(e,t){let n=[];for(let s of t){let o=this.resolver.resolveAll(e,s.rawSpecifier);if(o.length!==0)for(let i of o){let a={...s,toPath:i.isExternal?i.path:T.relative(this.rootDir,i.path),isExternal:i.isExternal};i.isWorkspace&&(a.isWorkspace=!0,a.workspacePackage=i.workspacePackage),i.isExternal?this.attachLockfileVersion(a):this.enqueue(i.path),n.push(a)}}return n}attachLockfileVersion(e){if(!this.lockFile)return;let t=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],n=t?this.lockFile.dependencies[t]:void 0;n&&(e.version=n.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function Vn(r,e){return{identifier:e?.identifier??new $e,featureMap:e?.featureDetection===!1?new Map:j(r.nodes,e?.featureDetection??void 0)}}function Hn(r,e,t,n,s){for(let o of e){let i=r.nodes.get(o);if(!i)continue;let a=new W(o,["*",...i.exports.map(c=>c.name)]);r.traverse(o,(c,p,l)=>{if(!l)return!0;if(!a.updateAffectedSymbols(c,l))return!1;if(p>0){let f=t.get(c.path);if(f)return n(f),!1}return s(c),!0},{direction:"incoming"})}}function tr(r,e,t){let{identifier:n,featureMap:s}=Vn(r,t),o=new Set;for(let i of e){let a=s.get(i);a&&o.add(a.tag)}return Hn(r,e,s,i=>o.add(i.tag),i=>{if(n.isTestNode(i))for(let a of i.tags)o.add(a.name)}),Array.from(o)}function rr(r,e,t){let{identifier:n,featureMap:s}=Vn(r,t),o=new Set;return Hn(r,e,s,()=>{},i=>{n.isTestNode(i)&&o.add(i.path)}),Array.from(o)}import Fc from"fs";import ke from"path";async function Qn(r,e,t=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=ke.resolve(r);return await new ve(o,t,n.pathAliases?new K(o,{pathAliases:n.pathAliases}):void 0,s,n.gitStats??!1,n.coverageMap??new Map,n.parallelParsing??!0).build(e)}async function qn(r,e={}){let t=ke.resolve(r),n=pe(t),s=e.packages?n.packages.filter(a=>e.packages?.includes(a.name)||e.packages?.includes(a.relativeRoot)):n.packages,o=new Map(n.packages.map(a=>[a.name,a.root])),i=new le(t,n.type);for(let a of s){let c=e.silent?void 0:f=>{process.stderr.write(`[${a.name}] Processed ${f} files...\r`)},l=await new ve(t,null,new K(t,{workspaceMap:o,tsconfigSearchPaths:[a.root,t],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,l)}return i}function Xn(r,e={}){let t=[],n=new Set([...e.ignoreDirs??O,...e.additionalIgnoreDirs??[]]),s=new Set([...e.extensions??tt,...e.additionalExtensions??[]]);function o(i){try{let a=Fc.readdirSync(i,{withFileTypes:!0});for(let c of a){let p=ke.join(i,c.name);c.isDirectory()?n.has(c.name)||o(p):c.isFile()&&s.has(ke.extname(c.name).toLowerCase())&&t.push(ke.relative(r,p))}}catch{}}return o(r),t}var Yn=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var He=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,t){this.configs.set(e,t)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,t,n=new Map){let s=this.configs.get(e),o=await Qn(e,t,this.graphs.get(e)??null,{...V(s),coverageMap:n});return this.graphs.set(e,o),o}require(e){let t=this.graphs.get(e);if(!t)throw new Error('No graph cached for this root. Call "analyze" first.');return t}async getOrBuildWorkspace(e,t={}){let n=this.workspaceGraphs.get(e);if(n)return n;let s=await qn(e,t);return this.workspaceGraphs.set(e,s),s}requireWorkspace(e){let t=this.workspaceGraphs.get(e);if(!t)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return t}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let t=this.changeImpactCaches.get(e);if(t)return t;let n=this.require(e),s=at(n);return this.changeImpactCaches.set(e,s),s}storeLastAnalyze(e,t){this.lastAnalyze.set(e,t)}startWatching(e){if(!this.watchers.has(e))try{let t=Ec.watch(e,{recursive:!0},(n,s)=>{!s||Yn.test(s)||this.dirtyRoots.add(e)});t.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,t)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let t=this.lastAnalyze.get(e);return t?.kind==="single"?this.getOrBuild(e,t.entryPoints,t.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let t=this.configs.get(e);return this.getOrBuildWorkspace(e,V(t))}invalidate(e){let t=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),t}};import ee from"path";import Tc from"fs";import Pc from"os";import nr from"path";function S(r){return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}function Zn(r){if(!nr.isAbsolute(r))throw new Error("root must be an absolute path");let e=nr.resolve(r),t=Pc.homedir();if(e!==t&&!e.startsWith(t+nr.sep))throw new Error("root must be within the user home directory");let n;try{n=Tc.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function es(r,e){let{root:t,entryPoints:n}=e;if(!r.isConfigured(t)){let d=re(t,{allowJs:!1});et(d),r.storeConfig(t,d)}if(n.length===0){let d=pe(t);if(d.type!=="none"){let h=r.getConfig(t),v=await r.getOrBuildWorkspace(t,V(h));r.storeLastAnalyze(t,{kind:"workspace"}),r.startWatching(t);let x=Array.from(v.packages.values()).map(({graph:k,pkg:E})=>({package:E.name,relativeRoot:E.relativeRoot,nodeCount:k.nodes.size}));return S({monorepoType:d.type,packageCount:v.packages.size,packages:x})}}let s=n.map(d=>ee.resolve(t,d)),o=r.getConfig(t),i=o?.coverageReportPath?rt(t,o.coverageReportPath):new Map,a=await r.getOrBuild(t,s,i);r.storeLastAnalyze(t,{kind:"single",entryPoints:s,coverageMap:i}),r.startWatching(t);let c=a.serialize(),p=c.nodes.reduce((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),l=a.findCycles(),f=mt(a);return S({nodeCount:c.nodes.length,categories:p,cycles:l,languageCoverage:f})}async function ts(r,e){let{root:t,file:n,depth:s=1,withMeta:o=!1}=e,i=await r.ensureFresh(t),a=gt(i,n,s),c=o?a.map(p=>({...p,...oe(i,p.path)})):a;return S({file:n,dependencies:c})}async function rs(r,e){let{root:t,file:n,withMeta:s=!1}=e,o=await r.ensureFresh(t),i=ie(o,n),a=s?i.map(c=>({...c,...oe(o,c.path)})):i;return S({file:n,dependents:a})}async function ns(r,e){let{root:t,file:n,testsOnly:s=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,c=await r.ensureFresh(t),p=d=>a?d.map(h=>({path:h,...oe(c,h)})):d;if(o){let d=r.getOrBuildChangeImpact(t),h=ct(d,n),v=s?h.filter(k=>c.nodes.get(k)?.category==="test"):h,x=p(v);return S({file:n,affected:x,count:x.length})}let l=dt(c,n,{testsOnly:s,changedSymbols:i}),f=p(l);return S({file:n,affected:f,count:f.length})}async function ss(r,e){let{root:t,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await r.ensureFresh(t),a=ht(i,n,{depth:s,withEdgeDetail:o});return S({file:n,callers:a,count:a.length})}async function os(r,e){let{root:t,entryPoints:n}=e,s=n?await r.getOrBuild(t,n.map(a=>ee.resolve(t,a))):await r.ensureFresh(t),o=Xn(t),i=s.findUnusedFiles(o);return S({unusedFiles:i,count:i.length})}async function is(r,e){let{root:t}=e,n=await r.ensureFresh(t),s=new Map;for(let i of n.nodes.values())for(let a of i.tags)s.set(a.name,(s.get(a.name)??0)+1);let o=[...s.entries()].map(([i,a])=>({name:i,count:a})).sort((i,a)=>a.count-i.count);return S({tags:o,count:o.length})}async function as(r,e){let{root:t,coverageThreshold:n}=e,s=await r.ensureFresh(t),o=r.getConfig(t),i=n??o?.coverageThreshold??80;if(!bt(s))return S({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let a=[...s.nodes.values()].filter(c=>c.category!=="test"&&c.category!=="config").filter(c=>c.coveragePct!==void 0&&c.coveragePct<i).map(c=>({file:c.path,coveragePct:c.coveragePct}));return S({threshold:i,uncovered:a,count:a.length})}async function cs(r,e){let{root:t}=e,s=[...(await r.ensureFresh(t)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return S({staleDocs:s,count:s.length})}async function ps(r,e){let{root:t,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await r.ensureFresh(t),a=yt(i,{metric:n,threshold:s,limit:o});return S({metric:n,threshold:s,functions:a,count:a.length})}async function ls(r,e){let{root:t,minLines:n=6,ignoreLiterals:s=!0,limit:o=50}=e,i=await r.ensureFresh(t),a=e.ignoreDirs??[...O,...r.getConfig(t)?.ignoreDirs??[]],c=await ut(i,t,{minLines:n,ignoreLiterals:s,limit:o,ignoreDirs:a});return S({minLines:n,groups:c,count:c.length})}async function fs(r,e){let{root:t,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await r.ensureFresh(t),a=n??new Be().getChangedFiles().map(l=>ee.relative(t,ee.resolve(t,l))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let l=rr(i,a,c);return S({changedFiles:a,affectedTests:l,count:l.length})}let p=tr(i,a,c);return S({changedFiles:a,proposedTags:p})}async function us(r,e){let{root:t,entryPoints:n,featureThreshold:s}=e,o=n?await r.getOrBuild(t,n.map(c=>ee.resolve(t,c))):await r.ensureFresh(t),i=j(o.nodes,s!==void 0?{minOutDegree:s}:void 0),a=Array.from(i.values()).sort((c,p)=>p.outDegree-c.outDegree);return S({features:a,count:a.length})}async function ms(r,e){let{root:t,entryPoints:n,filter:s,mermaid:o=!1,slim:i=!0}=e,a=n?await r.getOrBuild(t,n.map(p=>ee.resolve(t,p))):await r.ensureFresh(t),c=Ie(a.serialize(),Me(s));return o?S(Ee.serialize(M.deserialize(c))):i?S(xt(c)):S(c)}async function gs(r,e){let{root:t}=e,n=await r.ensureFreshWorkspace(t);return S(St(n))}async function ds(r,e){let{root:t,file:n}=e,o=(await r.ensureFreshWorkspace(t)).getAffectedAcrossPackages(n);return S({file:n,affected:o,count:o.length})}function hs(r,e){let{root:t}=e,n=r.invalidate(t);return S({root:t,cleared:n,message:n?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function ys(r,e){let{root:t,type:n}=e,s=await r.ensureFresh(t),o=wt(s);if(n)return S(Ct(o,n));let i=Array.from(o.types.values());return S({count:i.length,types:i})}async function xs(r,e){let{root:t,paths:n,minOutDegree:s}=e,o=await r.ensureFresh(t),i=vt(o,s!==void 0?{minOutDegree:s}:void 0);if(n?.length){let c=n.map(p=>i.get(p)).filter(Boolean);return S({count:c.length,modules:c})}let a=Array.from(i.values());return S({count:a.length,modules:a})}async function Ss(r,e){let{root:t,minOutDegree:n}=e,s=await r.ensureFresh(t),o=ne(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return S({features:i,unassigned:o.unassigned})}async function bs(r,e){let{root:t,function:n}=e,s=await r.ensureFresh(t);return S(it(s,n))}async function vs(r,e){let{root:t,name:n}=e,s=await r.ensureFresh(t),o=kt(s,n);return S({name:n,matches:o,count:o.length})}async function ks(r,e){let{root:t,entryPoints:n}=e,s=await r.ensureFresh(t),o=n?.length?n:st(s,t);if(o.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return S(ot(s,o))}async function ws(r,e){let t=await r.ensureFresh(e.root),n=await zt(t,e.root,{dryRun:e.dryRun??!1});return S(n)}var Cs=[{name:"analyze",description:"Build the dependency graph for a project from entry points. Returns a summary of node count, categories, and cycles. Must be called before get_dependencies, get_dependents, get_affected, or propose_tags. Pass an empty entryPoints array to auto-detect a monorepo (pnpm/npm/yarn/Nx/Turborepo) and build per-package graphs \u2014 use get_workspace_packages and get_workspace_affected for monorepo queries.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root (or monorepo root)"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root (e.g. ['src/index.ts']). Pass [] to trigger monorepo auto-detection."}},required:["root","entryPoints"]}},{name:"get_dependencies",description:"Get files that a given file imports (outgoing traversal). depth=1 returns immediate imports; omit for the full transitive tree. Each result includes the specific symbols imported from that file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_dependents",description:"Get files that directly import a given file (one-hop incoming edges). Each result includes the specific symbols that dependent file imports from this file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_affected",description:"Get all files transitively affected if a given file changes \u2014 full incoming traversal upward. Use before a refactor to understand blast radius. Set testsOnly=true to get only test files. Set cached=true to use a pre-computed O(1) lookup cache instead of graph traversal \u2014 faster on repeated calls for the same root. Pass changedSymbols to restrict blast-radius to files that actually import those symbols \u2014 omit to treat the whole file as changed. Set withMeta=true to get { path, category, exports } objects instead of bare path strings.",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},testsOnly:{type:"boolean",description:"Return only test/spec files (default: false)"},cached:{type:"boolean",description:"Use a pre-computed impact cache for O(1) lookup instead of graph traversal. Cache is built lazily on first use and reused for the session (default: false)."},changedSymbols:{type:"array",items:{type:"string"},description:"Restrict blast-radius to files that import at least one of these symbols. Omit to treat the whole file as changed (conservative, same as before)."},withMeta:{type:"boolean",description:"Return each affected file as { path, category, exports } instead of a bare path string (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_callers",description:"Get files whose exported functions call into a given file (call-graph dependents). More precise than get_affected: only files with actual runtime call edges, not mere imports. Requires prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to project root"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withEdgeDetail:{type:"boolean",description:"Include from/to function names per edge (default: false)"}},required:["root","file"]}},{name:"find_unused",description:"Find files in the project that are not reachable from any entry point. Useful before cleanup passes. Omit entryPoints to reuse the cached graph from a prior analyze() call instead of rebuilding.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to reuse the cached graph from a prior analyze() call."}},required:["root"]}},{name:"list_tags",description:"List every distinct tag name present in the graph, with how many nodes carry each one. Call this before querying with tag:<name> to avoid a speculative filter silently returning zero results. Includes all tag kinds \u2014 a superset of what query's slim mode keeps (slim only retains comment-marker and import tags).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_uncovered",description:"Find non-test files whose line coverage is below the configured threshold. Requires a prior analyze() call and coverageReportPath set in mokosh.config. coverageThreshold overrides the config default (default: 80).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},coverageThreshold:{type:"number",description:"Line-coverage % below which a file is considered uncovered. Overrides config value."}},required:["root"]}},{name:"check_doc_drift",description:"Find markdown docs whose referenced files changed more recently than the doc itself \u2014 a commit-recency heuristic for stale documentation, not a content diff. Requires a prior analyze() call with gitStats: true in mokosh.config (otherwise no file has commit-timestamp data and nothing is flagged). See docs/adr-009-markdown-parsing.md for known limitations.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_complex_functions",description:"Find individual functions/methods above a cognitive (or cyclomatic) complexity threshold, sorted worst-first. Requires a prior analyze() call. Populated for TypeScript/JavaScript, Go, and Python.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which score to threshold/sort on (default: cognitiveComplexity)"},threshold:{type:"number",description:"Minimum score to include (default: 10)"},limit:{type:"number",description:"Max results to return, worst-first (default: 20)"}},required:["root"]}},{name:"find_duplicates",description:"Find duplicated code blocks across the project, largest-first. Token-based (not AST-based), so it works uniformly across every language mokosh parses (TypeScript/JavaScript, Python, Go, CoffeeScript, LiveScript, Lua, Gherkin, style files, Markdown). Identifiers \u2014 and by default literals \u2014 are normalized before matching, so renamed-variable copies are still caught. Lock files (package-lock.json, yarn.lock, pnpm-lock.yaml) and files under an ignored directory are always excluded, even if the graph itself contains them. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minLines:{type:"number",description:"Minimum duplicated block size in lines to report (default: 6)"},ignoreLiterals:{type:"boolean",description:"Normalize string/number literals too, not just identifiers, so only structural shape drives a match (default: true). Set false for stricter, exact-text-only matching."},ignoreDirs:{type:"array",items:{type:"string"},description:"Directory names to exclude, matched against any path segment (default: DEFAULT_IGNORE_DIRS merged with this root's configured ignoreDirs, if any). Pass [] to disable."},limit:{type:"number",description:"Max duplicate blocks to return, largest-first (default: 50)"}},required:["root"]}},{name:"propose_tags",description:"Propose what to run based on changed files. Pass changedFiles explicitly or omit to use git diff. format='tags' (default) returns test tags for CI tag-filtering; format='paths' returns test file paths ready to pipe directly to a test runner (e.g. vitest). Feature hubs act as traversal boundaries in both modes.",inputSchema:{type:"object",properties:{root:{type:"string"},changedFiles:{type:"array",items:{type:"string"},description:"Changed files relative to root. Omit to read from git diff."},featureThreshold:{type:"number",description:"Min importers for a file to be treated as a feature hub (default: 5). A hub short-circuits traversal and emits a feature:<name> tag instead of all downstream tags."},format:{type:"string",enum:["tags","paths"],description:"Output format: 'tags' returns test tag names for CI filtering (default); 'paths' returns test file paths to pipe to a test runner."}},required:["root"]}},{name:"detect_features",description:"Identify feature hub files \u2014 non-test files that import many other internal modules (orchestrators / aggregators like src/parser.ts or src/cli/runner.ts). Returns a list sorted by import count descending.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to use the cached graph."},featureThreshold:{type:"number",description:"Min internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"query",description:"Filter the graph by category, tag, or path. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry points to build the graph. Omit to reuse the cached graph from a prior 'analyze' call."},filter:{type:"string",description:"Query string e.g. 'category:logic' or 'category:logic,tag:auth'. Supports: category, type, tag, path, external, importsFile, importedBy, minImports, maxImports, minSize, maxSize, hasDocstring, minCoverage, maxCoverage, minExportUsage, maxExportUsage, minComplexity, maxComplexity, minCognitiveComplexity, maxCognitiveComplexity, minCommits, maxCommits, isDocumented, isStale, lastAuthor. OR logic: any(key:val|key:val) matches if any single-key clause holds, ANDed with the rest of the query. sort: size|imports|commitCount90d|exportUsage|complexity|cognitiveComplexity, with sortDir: asc|desc (default desc). limit: N."},mermaid:{type:"boolean",description:"Return a Mermaid diagram (default: false)"},slim:{type:"boolean",description:"Compact response mode (default: true). Returns export names, meaningful tags, and a flat importsFiles path list \u2014 no edge objects, no mtime/size. Tags are filtered to kinds comment-marker and import only; function/class/variable/type/library tags are dropped in slim output. Use list_tags to see the full tag inventory, or pass slim: false to get every tag kind on matching nodes."}},required:["root","filter"]}},{name:"get_workspace_packages",description:"List all workspace packages detected in a monorepo, with their node counts and inter-package dependencies. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"}},required:["root"]}},{name:"get_workspace_affected",description:"Cross-package blast-radius analysis. Returns every file that could be affected if a given file changes, annotated with the package it belongs to. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"},file:{type:"string",description:"Monorepo-root-relative path of the changed file (e.g. 'packages/shared/src/utils.ts')"}},required:["root","file"]}},{name:"get_type_graph",description:"Return type-level relationships for the project. Without a type name, returns an inventory of all interfaces, classes, enums, and type aliases with their file and kind. With a type name, returns which files import that type (usedByFiles) and which types the defining file imports (uses). Requires a prior analyze() call. Only covers TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},type:{type:"string",description:"Exact exported name of the type to look up (e.g. 'FileNode'). Omit to get the full type inventory."}},required:["root"]}},{name:"get_module_responsibility",description:"Return what each file is responsible for: its semantic role, JSDoc description (when present), exported symbol names, and which feature hub it belongs to. Pass specific paths to filter, or omit paths to get all files. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},paths:{type:"array",items:{type:"string"},description:"Project-relative file paths to include. Omit to return all files."},minOutDegree:{type:"number",description:"Min imports for a file to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_feature_graph",description:"Group files by domain: returns which files each feature hub (high-import orchestrator) transitively owns. Each file is assigned to the most specific hub that can reach it (lowest out-degree wins). Use this instead of a full query when answering 'what files are in the X feature/module?' \u2014 typically 85\u201395% fewer tokens than a full graph query.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minOutDegree:{type:"number",description:"Minimum internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_call_graph",description:"Look up callers and callees for a named function. Returns the file that defines the function, all files/functions that call it, and all files/functions it calls. Always requires a function name \u2014 never returns the full call graph unfiltered. Call edges are only populated for TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},function:{type:"string",description:"Exact name of the function to look up (e.g. 'parseFile')."}},required:["root","function"]}},{name:"find_symbol",description:"Find every file that exports a symbol by exact name, with the best available usage info per match. Precision varies by the defining file's language: TypeScript/JavaScript, Go, and Python get function-level callers (via call edges) \u2014 though coverage differs per language (Go only tracks package-qualified calls, Python only tracks bare calls to `from module import name` symbols); everything else (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) falls back to whole-file dependents, which is import-level only \u2014 a listed importer might not even use this specific export. Files whose parser never records exports (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) never appear as matches, so a name that only exists in one of those returns an empty result, same as a typo. Each match's `precision` field is 'call' | 'file-level' \u2014 check it before trusting caller/importer results as symbol-exact.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},name:{type:"string",description:"Exact export name to look up (e.g. 'parseFile')."}},required:["root","name"]}},{name:"get_api_surface",description:"Build the API surface report for a project. Expands export* chains so every symbol accessible to consumers is listed (not just those directly declared in the entry file). Each export is resolved to its defining file and tagged with a kind (function/class/interface/type/enum/const). The graph is partitioned into: internalFiles (implementation reachable from entry points), unreachableFromEntry (non-test files not reachable from any entry point \u2014 may be separate consumers like CLI/MCP, config, or dead code), and testFiles (test suite). Supports multiple public entry points for libraries with sub-path exports. Requires a prior analyze() call. When entryPoints is omitted, auto-detects all entry points from package.json exports/main/module.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},entryPoints:{type:"array",items:{type:"string"},description:"Project-relative paths of public entry points (e.g. ['src/index.ts', 'src/utils.ts']). Omit to auto-detect from package.json exports / main / module fields."}},required:["root"]}},{name:"clear_cache",description:"Drop the cached dependency graph for a project root, forcing the next analyze() call to rebuild from disk. Call this after editing source files mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root to invalidate."}},required:["root"]}},{name:"apply_tags",description:"Write @tag annotations into test file source code based on the dependency graph. Tags of kind 'import' (filename-derived) and 'comment-marker' (domain semantic, propagated from source files) are written as an idempotent block. Re-running is safe: the existing block is replaced in place. Tags already present in the file are excluded from the block to avoid duplication. Supports TypeScript/JavaScript (// <mokosh-tags> block with // @tag lines) and Gherkin .feature files (# <mokosh-tags> block with @tagname lines). Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root."},dryRun:{type:"boolean",description:"When true, computes which files would change but does not write to disk (default: false)."}},required:["root"]}}];function sr(){let r=new He,e=new Ac({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(Ic,async()=>({tools:Cs})),e.setRequestHandler(Nc,async t=>{let{name:n,arguments:s}=t.params,o=s,a={analyze:c=>es(r,c),get_dependencies:c=>ts(r,c),get_dependents:c=>rs(r,c),get_affected:c=>ns(r,c),get_callers:c=>ss(r,c),find_symbol:c=>vs(r,c),find_unused:c=>os(r,c),find_uncovered:c=>as(r,c),list_tags:c=>is(r,c),check_doc_drift:c=>cs(r,c),find_complex_functions:c=>ps(r,c),find_duplicates:c=>ls(r,c),propose_tags:c=>fs(r,c),detect_features:c=>us(r,c),get_type_graph:c=>ys(r,c),get_module_responsibility:c=>xs(r,c),get_feature_graph:c=>Ss(r,c),get_call_graph:c=>bs(r,c),get_api_surface:c=>ks(r,c),query:c=>ms(r,c),get_workspace_packages:c=>gs(r,c),get_workspace_affected:c=>ds(r,c),clear_cache:c=>hs(r,c),apply_tags:c=>ws(r,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return Zn(o.root),await a(o)}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),e}async function Dc(){let r=sr(),e=new Mc;await r.connect(e)}Dc().catch(console.error);export{sr as createMcpServer};
31
34
  //# sourceMappingURL=mcp.mjs.map