@omfalos/mokosh 0.4.3 → 0.4.4

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,41 +1,41 @@
1
1
  #!/usr/bin/env node
2
- var ct=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import Ys from"path";import{fileURLToPath as Xs}from"url";var Zs=()=>Xs(import.meta.url),eo=()=>Ys.dirname(Zs()),u=eo();import{StdioServerTransport as El}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as wl}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as Fl,ListToolsRequestSchema as Tl}from"@modelcontextprotocol/sdk/types.js";import yr from"fs";import xr from"path";import ft from"fs";import Ar from"path";var to=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],vr=[];function Pe(t){vr.push(t)}function wr(t){return[...to,...vr].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var ro=[".test.",".spec.","-test.","-spec."],Fr=[];function Ne(t){Fr.push(t)}function oe(){return[...ro,...Fr]}var no=["jest","vitest","playwright","cypress","@testing-library/"],Tr=[];function Ie(t){Tr.push(t)}function lt(){return[...no,...Tr]}var Er=.8;function pt(t){Er=t}function ut(){return Er}var so=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function ie(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let n=Ar.resolve(t);return ft.existsSync(n)?n.endsWith(".json")?Pr(n):e?Nr(n):{}:{}}for(let n of so){let s=Ar.resolve(t,n);if(ft.existsSync(s)){if(n.endsWith(".json"))return Pr(s);if(e)return Nr(s)}}return{}}function Pr(t){return JSON.parse(ft.readFileSync(t,"utf-8"))}function Nr(t){let e=ct(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function mt(t){for(let e of t.configMatchers??[])Pe(e);for(let e of t.testPatterns??[])Ne(e);for(let e of t.testLibraries??[])Ie(e);t.barrelThreshold!==void 0&&pt(t.barrelThreshold)}function q(t){return{gitStats:t?.gitStats??!1,parallelParsing:t?.parallelParsing,pathAliases:t?.pathAliases}}var Me="mokosh-cache",gt="duplication-tokens.json",dt="graph.json",z=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],ht=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];import oo from"fs";import Ir from"path";function yt(t,e){let r=Ir.resolve(t,e);try{let n=oo.readFileSync(r,"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 l=Ir.relative(t,i);o.set(l,c)}return o}catch{return new Map}}var De={serialize(t){let e=["graph TD"],r=new Set;for(let n of t.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(!r.has(a)){let c=o.isStyle?"-- styles -->":"-->";e.push(` ${s} ${c} ${i}`),r.add(a)}}}return e.join(`
3
- `)}};import Mr from"fs";import ao from"path";function xt(t,e){let r=t.replace(/^\.\//,"");if(e.nodes.has(r))return r;let n=r.replace(/^dist\//,"src/").replace(/\.(js|mjs|cjs)$/,".ts");return e.nodes.has(n)?n:null}function Dr(t,e){if(typeof t=="string")return xt(t,e);if(t&&typeof t=="object"){let r=t;for(let n of["import","require","default"]){let s=Dr(r[n],e);if(s)return s}}return null}function co(t){if(!t)return"unknown";let e=t.trimStart();return e.startsWith("interface ")?"interface":e.startsWith("class ")?"class":e.startsWith("enum ")?"enum":e.startsWith("type ")?"type":e.startsWith("namespace ")?"namespace":e.startsWith("const ")||e.startsWith("let ")||e.startsWith("var ")||e.startsWith("readonly ")?"const":e.startsWith("(")||e.startsWith("async ")||e.startsWith("function ")||e.includes("=>")?"function":"unknown"}function lo(t,e){let r=new Set,n=new Set,s=[...e];for(;s.length;){let o=s.shift();if(n.has(o))continue;n.add(o);let i=t.nodes.get(o);if(i){for(let a of i.exports)r.add(a.name);for(let a of i.imports){if(a.type!=="re-export"||a.isExternal||!a.toPath)continue;if(!a.symbols?.length||a.symbols.includes("*")){let l=t.nodes.get(a.toPath);if(l)for(let p of l.exports)r.add(p.name);s.push(a.toPath)}else for(let l of a.symbols)r.add(l)}}}return r}function bt(t,e){let r=[],n=ao.join(e,"package.json");if(Mr.existsSync(n))try{let s=JSON.parse(Mr.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,t);i&&!r.includes(i)&&r.push(i)}else if(typeof s.exports=="string"){let o=xt(s.exports,t);o&&r.push(o)}if(r.length===0)for(let o of[s.main,s.module].filter(Boolean)){let i=xt(o,t);i&&!r.includes(i)&&r.push(i)}}catch{}if(r.length===0){for(let s of["src/index.ts","src/index.js","index.ts","index.js"])if(t.nodes.has(s)){r.push(s);break}}return r}function po(t,e){let r=new Set(e);for(let n of e)t.traverse(n,s=>(r.add(s.path),!0),{direction:"outgoing"});return r}function uo(t,e,r){let n=new Map;for(let s of e){if(r.includes(s))continue;let o=t.nodes.get(s);if(!o)continue;let i=o.category==="barrel";for(let a of o.exports){let c=n.get(a.name),l=!!(a.signature||a.doc);(!c||l&&!i)&&n.set(a.name,{file:s,symbol:a})}}return n}function fo(t,e,r,n){let s=[];for(let o of t){let i=e.get(o),a=n.flatMap(m=>r.nodes.get(m)?.exports??[]).find(m=>m.name===o),c=i?.symbol??a,l=i?.file??n.find(m=>r.nodes.get(m)?.exports.some(d=>d.name===o))??n[0],p={name:o,definedIn:l,kind:co(c?.signature)};c?.doc&&(p.doc=c.doc),c?.signature&&(p.signature=c.signature),s.push(p)}return s.sort((o,i)=>o.name.localeCompare(i.name)),s}function mo(t,e,r){let n=c=>t.nodes.get(c)?.category==="test",s=[...e].filter(c=>!r.includes(c)&&!n(c)),o=[...t.nodes.keys()].filter(c=>!e.has(c)),i=o.filter(c=>!n(c)),a=o.filter(c=>n(c));return{internalFiles:s,unreachableFromEntry:i,testFiles:a}}function St(t,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let l of e)if(!t.nodes.has(l))throw new Error(`Entry point not found in graph: ${l}`);let r=po(t,e),n=uo(t,r,e),s=lo(t,e),o=fo(s,n,t,e),{internalFiles:i,unreachableFromEntry:a,testFiles:c}=mo(t,r,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:c}}function kt(t,e){let r=null,n=[];for(let o of t.nodes.values()){o.exports.some(i=>i.name===e)&&(r=o.path);for(let i of o.callEdges??[])i.to===e&&n.push({file:o.path,callerFunction:i.from})}let s=[];if(r){let o=t.nodes.get(r);for(let i of o?.callEdges??[])i.from===e&&s.push({file:i.toFile,calleeFunction:i.to})}return{functionName:e,definedIn:r,callers:n,callees:s}}import op from"fs";import ap from"path";function Rr(t){let e=[...t.nodes.entries()].sort(([n],[s])=>n.localeCompare(s)).map(([n,s])=>`${n}:${s.mtime}:${s.size}`).join("|"),r=2166136261;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r.toString(16).padStart(8,"0")}function Ct(t){let e=new Map;for(let r of t.nodes.keys()){let n=[];t.traverse(r,s=>(s.path!==r&&n.push(s.path),!0),{direction:"incoming"}),e.set(r,n)}return{impact:e,graphHash:Rr(t)}}function vt(t,e){return t.impact.get(e)??[]}import{readFile as Zr}from"fs/promises";import ce from"path";import Yo from"piscina";import Re from"fs";import go from"path";import{load as Lr}from"js-yaml";var wt=["package-lock.json","yarn.lock","pnpm-lock.yaml"];function Gr(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function ho(t){return t.replace(/:$/,"").split(",").map(e=>{let r=e.trim();return r.startsWith('"')&&(r=r.slice(1)),r.endsWith('"')&&(r=r.slice(0,-1)),Gr(r)}).filter(Boolean)}function yo(t,e){let r=t.startsWith("/")?t.slice(1):t,n=r.lastIndexOf("@");return n>0?{name:r.substring(0,n),version:e||r.substring(n+1)}:{name:r,version:e}}function xo(t){try{let e=Lr(t),r={dependencies:{}};for(let[n,s]of Object.entries(e))if(!(n==="__metadata"||!s?.version))for(let o of n.split(", ")){let i=Gr(o);i&&(r.dependencies[i]={version:s.version,...s.dependencies!==void 0&&{dependencies:s.dependencies}})}return r}catch{return null}}function bo(t){let e={dependencies:{}};for(let r of t.split(/\n\n+/)){let n=r.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=ho(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 So(t){let e=Re.readFileSync(t,"utf-8"),r=JSON.parse(e),n={dependencies:{}};if(r.packages)for(let[s,o]of Object.entries(r.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(r.dependencies)for(let[s,o]of Object.entries(r.dependencies))n.dependencies[s]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}};return n}function ko(t){let e=Re.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=xo(e);if(r!==null)return r}return bo(e)}function Co(t){let e=Re.readFileSync(t,"utf-8"),r={dependencies:{}};try{let n=Lr(e);if(n.packages)for(let[s,o]of Object.entries(n.packages)){let{name:i,version:a}=yo(s,o.version);i&&(r.dependencies[i]={version:a,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}if(n.dependencies)for(let[s,o]of Object.entries(n.dependencies)){if(r.dependencies[s])continue;let i=typeof o=="string"?o:o.version;r.dependencies[s]={version:i||""}}}catch{}return r}function _r(t){let e={"package-lock.json":So,"yarn.lock":ko,"pnpm-lock.yaml":Co},r=wt.map(n=>[n,e[n]]);for(let[n,s]of r){let o=go.join(t,n);if(Re.existsSync(o))return s(o)}return null}var vo=new Set(["css","scss","less","stylus"]);function Or(t){return vo.has(t)?"style":"code"}import zr from"postcss";import*as wo from"postcss-less";var Fo=wo,Wr=new Set(["reference","inline"]);function jr(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function To(t){let e=t.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function Eo(t,e){let r=t.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(r){let o=r[1]?.trim()??"",i=r[2]??"";if(!i)return null;let a=Wr.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...jr(i)?{isExternal:!0}:{}}}let n=t.match(/^url\(['"]?([^'")]+)['"]?\)/),s=n?n[1]?.trim()??"":t.match(/^['"]([^'"]+)['"]/)?.[1]??"";return s?{fromPath:e,toPath:"",rawSpecifier:s,isStyle:!0,type:"static",...jr(s)?{isExternal:!0}:{}}:null}function Ao(t,e){let r=[],n=/url\(['"]?([^'")]+)['"]?\)/g,s=n.exec(t);for(;s!==null;){let o=s[1]?.trim()??"";To(o)&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),s=n.exec(t)}return r}function Br(t,e){let r=[];return t.walk(n=>{if(n.type==="atrule"&&n.name==="import"){let s=Eo(n.params,e);s&&r.push(s)}n.type==="decl"&&r.push(...Ao(n.value,e))}),r}function Po(t){return t.replace(/(?<!:)\/\/.*/g,"")}function No(t,e){let r=[],n=/@import\s+(?:\(([^)]+)\)\s+)?['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let o=s[1]?.trim()??"",i=s[2]??"";if(i){let a=Wr.has(o)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}s=n.exec(t)}return r}function Le(t,e){let r=zr.parse(Po(t));return{imports:Br(r,e),root:r}}function Io(t){let e=[],r=[];for(let n of t.nodes??[]){if(n.type!=="atrule")continue;let{value:s}=n;if(s===void 0)continue;let o=n.name;o&&(e.push({name:o}),r.push({name:o,kind:"variable"}))}return{exports:e,tags:r}}function Ge(t,e){try{let r=Fo.parse(t),{exports:n,tags:s}=Io(r);return{imports:Br(r,e),root:r,exports:n,tags:s}}catch{return{imports:No(t,e),root:zr.parse(""),exports:[],tags:[]}}}import{parse as Mo}from"postcss-scss";function $r(t){return t.startsWith("_")||t.startsWith("-")}function Do(t){return!!(t.startsWith("sass:")||t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||!t.startsWith(".")&&!t.startsWith("/")&&!t.startsWith("_"))}function Ro(t){let e=t.match(/^['"]([^'"]+)['"]/);if(!e?.[1])return{specifier:""};let r=e[1],s=t.match(/\bas\s+(\S+)/)?.[1];return s!==void 0?{specifier:r,alias:s}:{specifier:r}}function Lo(t){let e=[],r=[];for(let n of t.nodes??[]){if(n.type==="decl"&&n.prop.startsWith("$")){let s=n.prop.slice(1);if(!s||$r(s))continue;e.push({name:s}),r.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||$r(o))continue;let i=n.params.trim();e.push(i.includes("(")?{name:o,signature:i}:{name:o}),r.push({name:o,kind:"function"})}}return{exports:e,tags:r}}function _e(t,e){let r=Mo(t),n=[];r.walk(i=>{if(i.type!=="atrule")return;let{name:a,params:c}=i;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:l,alias:p}=Ro(c);if(!l)return;let m={fromPath:e,toPath:"",rawSpecifier:l,isStyle:!0,type:a==="forward"?"re-export":"static",...Do(l)?{isExternal:!0}:{}};p&&(m.symbols=[p]),n.push(m)});let{exports:s,tags:o}=Lo(r);return{imports:n,root:r,exports:s,tags:o}}function Go(t){return t.trim().replace(/\s+/g," ")}function _o(t){try{return t.fileType==="scss"?_e(t.source,t.file).root:t.fileType==="less"?Ge(t.source,t.file).root:t.fileType==="css"?Le(t.source,t.file).root:void 0}catch{return}}function Oo(t){let e=_o(t);if(!e)return[];let r=[];return e.walkRules(n=>{let s=n.nodes?.filter(p=>p.type==="decl")??[];if(s.length===0)return;let o=s[0],i=s[s.length-1],a=n.source?.start?.line??o?.source?.start?.line,c=i?.source?.end?.line??i?.source?.start?.line??a;if(a===void 0||c===void 0)return;let l=s.map(p=>`${p.prop.trim().toLowerCase()}:${Go(p.value)}`).join(";");r.push({file:t.file,startLine:a,endLine:c,lines:c-a+1,signature:l,declCount:s.length})}),r}function Ur(t,e,r=2){let n=new Map;for(let o of t)for(let i of Oo(o)){if(i.declCount<r||i.lines<e)continue;let a=n.get(i.signature);a?a.push(i):n.set(i.signature,[i])}let s=[];for(let o of n.values())for(let i=0;i<o.length;i++)for(let a=i+1;a<o.length;a++){let c=o[i],l=o[a];if(c.file===l.file&&c.startLine===l.startLine&&c.endLine===l.endLine)continue;let p={file:c.file,startLine:c.startLine,endLine:c.endLine},m={file:l.file,startLine:l.startLine,endLine:l.endLine};s.push({occurrences:[p,m],lines:Math.min(c.lines,l.lines),tokens:c.declCount,family:"style"})}return s.sort((o,i)=>i.lines-o.lines)}function Hr(t){let e=t.length,r=[],n=[{lcpLength:0,low:0}];for(let s=1;s<e;s++){let o=s-1;for(;t[s]<n[n.length-1].lcpLength;){let i=n.pop();r.push({lcpLength:i.lcpLength,low:i.low,high:s-1}),o=i.low}t[s]>n[n.length-1].lcpLength&&n.push({lcpLength:t[s],low:o})}for(;n.length>1;){let s=n.pop();r.push({lcpLength:s.lcpLength,low:s.low,high:e-1})}return r}var jo=new Set(["{","}",":",",","[","]"]);function Kr(t,e,r){let n=0;for(let s=e;s<e+r;s++)jo.has(t[s].text)&&n++;return n/r}function Jr(t){let e=t.length;if(e===0)return[];let r=Array.from({length:e},(o,i)=>i),n=new Array(e);{let o=[...new Set(t)].sort(),i=new Map(o.map((a,c)=>[a,c]));for(let a=0;a<e;a++)n[a]=i.get(t[a])}let s=new Array(e).fill(0);for(let o=1;o<e;o*=2){let i=a=>a+o<e?n[a+o]:-1;r.sort((a,c)=>{let l=n[a]-n[c];return l!==0?l:i(a)-i(c)}),s[r[0]]=0;for(let a=1;a<e;a++){let c=r[a-1],l=r[a],p=n[c]===n[l],m=i(c)===i(l);s[l]=s[c]+(p&&m?0:1)}if([n,s]=[s,n],n[r[e-1]]===e-1)break}return r}function Vr(t,e){let r=t.length,n=new Array(r).fill(0);if(r===0)return n;let s=new Array(r);for(let i=0;i<r;i++)s[e[i]]=i;let o=0;for(let i=0;i<r;i++){let a=s[i];if(a>0){let c=e[a-1];for(;i+o<r&&c+o<r&&t[i+o]===t[c+o];)o++;n[a]=o,o>0&&o--}else o=0}return n}function Qr(t,e,r,n=.5){let s=[],o=[],i=new Map;for(let{file:m,tokens:d}of t)if(d.length!==0){i.set(m,d);for(let h=0;h<d.length;h++)s.push(d[h].text),o.push({file:m,localIndex:h});s.push(` ${m}`),o.push({file:m,localIndex:-1})}if(s.length===0)return[];let a=Jr(s),c=Vr(s,a),l=Hr(c),p=[];for(let m of l){let d=zo(m,a,o,i,e,r,n);d&&p.push(d)}return p.sort((m,d)=>d.lines-m.lines)}function zo(t,e,r,n,s,o,i){if(t.lcpLength<s)return;let a=[];for(let h=t.low;h<=t.high;h++){let C=r[e[h]];C.localIndex!==-1&&a.push(C)}if(a.length<2||!Wo(a,n))return;let c=Bo(a,t.lcpLength);if(c.length<2)return;let l=c[0],p=n.get(l.file);if(Kr(p,l.localIndex,t.lcpLength)>i)return;let m=c.map(({file:h,localIndex:C})=>{let v=n.get(h);return{file:h,startLine:v[C].line,endLine:v[C+t.lcpLength-1].line}}),d=Math.min(...m.map(h=>h.endLine-h.startLine+1));if(!(d<o))return{occurrences:m,lines:d,tokens:t.lcpLength}}function Wo(t,e){let r=null;for(let{file:n,localIndex:s}of t){if(s===0)return!0;let i=e.get(n)[s-1].text;if(r===null)r=i;else if(r!==i)return!0}return!1}function Bo(t,e){let r=new Map;for(let{file:s,localIndex:o}of t){let i=r.get(s);i?i.push(o):r.set(s,[o])}let n=[];for(let[s,o]of r){o.sort((a,c)=>a-c);let i=Number.NEGATIVE_INFINITY;for(let a of o)a>=i&&(n.push({file:s,localIndex:a}),i=a+e)}return n}var $o={typescript:{line:["//"],block:[["/*","*/"]]},javascript:{line:["//"],block:[["/*","*/"]]},go:{line:["//"],block:[["/*","*/"]]},css:{block:[["/*","*/"]]},scss:{line:["//"],block:[["/*","*/"]]},less:{line:["//"],block:[["/*","*/"]]},stylus:{line:["//"],block:[["/*","*/"]]},python:{line:["#"]},gherkin:{line:["#"]},coffeescript:{line:["#"],block:[["###","###"]]},livescript:{line:["#"],block:[["###","###"]]},lua:{line:["--"],block:[["--[[","]]"]]},markdown:{block:[["<!--","-->"]]}};function qr(t,e,r){let n=t.slice(e,r).replace(/[^\n]/g," ");return t.slice(0,e)+n+t.slice(r)}function Uo(t,e){if(!e)return t;let r=t;for(let[n,s]of e.block??[]){let o=0;for(;;){let i=r.indexOf(n,o);if(i===-1)break;let a=r.indexOf(s,i+n.length),c=a===-1?r.length:a+s.length;r=qr(r,i,c),o=c}}for(let n of e.line??[]){let s=0;for(;;){let o=r.indexOf(n,s);if(o===-1)break;let i=r.indexOf(`
5
- `,o),a=i===-1?r.length:i;r=qr(r,o,a),s=a}}return r}var Ho=["===","!==","...","=>","==","!=","<=",">=","&&","||","::","->","..","+=","-=","*=","/="],Ft=new RegExp(`${Ho.map(t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")}|[A-Za-z_$][A-Za-z0-9_$]*|\\d+(?:\\.\\d+)?|"(?:\\\\.|[^"\\\\])*"|'(?:\\\\.|[^'\\\\])*'|\`(?:\\\\.|[^\`\\\\])*\`|\\S`,"g"),Ko=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Yr=/^\d+(?:\.\d+)?$/,Jo=/^(".*"|'.*'|`.*`)$/s,Vo=new Set(["if","else","elif","for","while","do","switch","case","default","break","continue","return","function","def","class","struct","interface","const","let","var","local","import","export","from","package","try","catch","except","finally","throw","raise","new","this","self","end","then","yield","async","await","nil","null","None","true","false","True","False","and","or","not","in","of","is"]);function Xr(t,e,r=!0){let n=Uo(t,$o[e]),s=[],o=1,i=0;Ft.lastIndex=0;let a=Ft.exec(n);for(;a!==null;){for(let p=i;p<a.index;p++)n[p]===`
6
- `&&o++;i=a.index;let c=a[0],l=c;Ko.test(c)&&!Vo.has(c)?l="ID":r&&(Yr.test(c)||Jo.test(c))&&(l=Yr.test(c)?"NUM":"STR"),s.push({text:l,line:o});for(let p=i;p<a.index+c.length;p++)n[p]===`
7
- `&&o++;i=a.index+c.length,a=Ft.exec(n)}return s}import ae from"fs";import Qo from"path";function qo(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.mtime=="number"&&typeof e.size=="number"&&typeof e.ignoreLiterals=="boolean"&&Array.isArray(e.tokens)}function Oe(t){try{if(!ae.existsSync(t))return new Map;let e=ae.readFileSync(t,"utf-8"),r=JSON.parse(e);if(!Array.isArray(r))return new Map;let n=r.filter(s=>Array.isArray(s)&&s.length===2&&typeof s[0]=="string"&&qo(s[1]));return new Map(n)}catch{return new Map}}function je(t,e){let r=Qo.dirname(e);ae.existsSync(r)||ae.mkdirSync(r,{recursive:!0}),ae.writeFileSync(e,JSON.stringify([...t.entries()]))}var Xo=20,Zo=new Set(["css","scss","less"]);function ei(t){return wt.includes(ce.basename(t))}function ti(t,e){if(e.length===0)return!1;let r=new Set(e);return t.split(ce.sep).some(n=>r.has(n))}async function Tt(t,e,r={}){let{minLines:n=6,windowSize:s=15,ignoreLiterals:o=!0,maxPunctuationRatio:i=.5,limit:a=50,ignoreDirs:c=z,parallelTokenizing:l=!0,tokenCache:p}=r,m=[...t.nodes.values()].filter(h=>!ei(h.path)&&!ti(h.path,c)),d=ri(l,m.length);try{let h=[],C=new Map;if(await Promise.all(m.map(async y=>{if(Zo.has(y.type)){let Q;try{Q=await Zr(ce.join(e,y.path),"utf8")}catch{return}h.push({file:y.path,source:Q,fileType:y.type});return}let k=p?.get(y.path),M=k&&k.mtime===y.mtime&&k.size===y.size&&k.ignoreLiterals===o,N;if(M)N=k.tokens;else{let Q;try{Q=await Zr(ce.join(e,y.path),"utf8")}catch{return}N=d?await d.run({source:Q,fileType:y.type,ignoreLiterals:o}):Xr(Q,y.type,o),p?.set(y.path,{mtime:y.mtime,size:y.size,ignoreLiterals:o,tokens:N})}let j=Or(y.type),kr={file:y.path,tokens:N},Cr=C.get(j);Cr?Cr.push(kr):C.set(j,[kr])})),p){let y=new Set(m.map(k=>k.path));for(let k of p.keys())y.has(k)||p.delete(k)}let v=Ur(h,n);for(let[y,k]of C)for(let M of Qr(k,s,n,i))v.push({...M,family:y});return{groups:v.sort((y,k)=>k.lines-y.lines).slice(0,a)}}finally{d&&await d.destroy()}}function ri(t,e){if(t===!1)return null;let r=typeof t=="object"?t:{},n=r.minFiles??Xo;if(e<n)return null;r.maxThreads!==void 0&&r.maxThreads<1&&process.stderr.write(`
2
+ var lt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import Zs from"path";import{fileURLToPath as ei}from"url";var ti=()=>ei(import.meta.url),ri=()=>Zs.dirname(ti()),f=ri();import{StdioServerTransport as Pl}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as Tl}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as El,ListToolsRequestSchema as Al}from"@modelcontextprotocol/sdk/types.js";import Cr from"fs";import vr from"path";import yt from"fs";import Nr from"path";var ni=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],pt=[];function Pe(t){pt.push(t)}function Ar(t){return[...ni,...pt].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var si=[".test.",".spec.","-test.","-spec."],ut=[];function Ne(t){ut.push(t)}function ie(){return[...si,...ut]}var ii=["jest","vitest","playwright","cypress","@testing-library/"],ft=[];function Ie(t){ft.push(t)}function mt(){return[...ii,...ft]}var Pr=.8,gt=Pr;function dt(t){gt=t}function ht(){return gt}function De(){pt.length=0,ut.length=0,ft.length=0,gt=Pr}var oi=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function oe(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let n=Nr.resolve(t);return yt.existsSync(n)?n.endsWith(".json")?Ir(n):e?Dr(n):{}:{}}for(let n of oi){let s=Nr.resolve(t,n);if(yt.existsSync(s)){if(n.endsWith(".json"))return Ir(s);if(e)return Dr(s)}}return{}}function Ir(t){return JSON.parse(yt.readFileSync(t,"utf-8"))}function Dr(t){let e=lt(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function xt(t){De();for(let e of t.configMatchers??[])Pe(e);for(let e of t.testPatterns??[])Ne(e);for(let e of t.testLibraries??[])Ie(e);t.barrelThreshold!==void 0&&dt(t.barrelThreshold)}function q(t){return{gitStats:t?.gitStats??!1,parallelParsing:t?.parallelParsing,pathAliases:t?.pathAliases}}var Me="mokosh-cache",bt="duplication-tokens.json",St="graph.json",z=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],kt=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];import ai from"fs";import Mr from"path";function Ct(t,e){let r=Mr.resolve(t,e);try{let n=ai.readFileSync(r,"utf-8"),s=JSON.parse(n),i=new Map;for(let[o,a]of Object.entries(s)){if(o==="total")continue;let c=a?.lines?.pct;if(typeof c!="number")continue;let l=Mr.relative(t,o);i.set(l,c)}return i}catch{return new Map}}var Re={serialize(t){let e=["graph TD"],r=new Set;for(let n of t.nodes.values()){let s=`"${n.path}"`;for(let i of n.imports){if(!i.toPath)continue;let o=`"${i.toPath}"`,a=`${n.path} -> ${i.toPath}`;if(!r.has(a)){let c=i.isStyle?"-- styles -->":"-->";e.push(` ${s} ${c} ${o}`),r.add(a)}}}return e.join(`
3
+ `)}};import Rr from"fs";import li from"path";function vt(t,e){let r=t.replace(/^\.\//,"");if(e.nodes.has(r))return r;let n=r.replace(/^dist\//,"src/").replace(/\.(js|mjs|cjs)$/,".ts");return e.nodes.has(n)?n:null}function Lr(t,e){if(typeof t=="string")return vt(t,e);if(t&&typeof t=="object"){let r=t;for(let n of["import","require","default"]){let s=Lr(r[n],e);if(s)return s}}return null}function pi(t){if(!t)return"unknown";let e=t.trimStart();return e.startsWith("interface ")?"interface":e.startsWith("class ")?"class":e.startsWith("enum ")?"enum":e.startsWith("type ")?"type":e.startsWith("namespace ")?"namespace":e.startsWith("const ")||e.startsWith("let ")||e.startsWith("var ")||e.startsWith("readonly ")?"const":e.startsWith("(")||e.startsWith("async ")||e.startsWith("function ")||e.includes("=>")?"function":"unknown"}function ui(t,e){let r=new Set,n=new Set,s=[...e];for(;s.length;){let i=s.shift();if(n.has(i))continue;n.add(i);let o=t.nodes.get(i);if(o){for(let a of o.exports)r.add(a.name);for(let a of o.imports){if(a.type!=="re-export"||a.isExternal||!a.toPath)continue;if(!a.symbols?.length||a.symbols.includes("*")){let l=t.nodes.get(a.toPath);if(l)for(let p of l.exports)r.add(p.name);s.push(a.toPath)}else for(let l of a.symbols)r.add(l)}}}return r}function wt(t,e){let r=[],n=li.join(e,"package.json");if(Rr.existsSync(n))try{let s=JSON.parse(Rr.readFileSync(n,"utf8"));if(s.exports&&typeof s.exports=="object"&&!Array.isArray(s.exports))for(let i of Object.values(s.exports)){let o=Lr(i,t);o&&!r.includes(o)&&r.push(o)}else if(typeof s.exports=="string"){let i=vt(s.exports,t);i&&r.push(i)}if(r.length===0)for(let i of[s.main,s.module].filter(Boolean)){let o=vt(i,t);o&&!r.includes(o)&&r.push(o)}}catch{}if(r.length===0){for(let s of["src/index.ts","src/index.js","index.ts","index.js"])if(t.nodes.has(s)){r.push(s);break}}return r}function fi(t,e){let r=new Set(e);for(let n of e)t.traverse(n,s=>(r.add(s.path),!0),{direction:"outgoing"});return r}function mi(t,e,r){let n=new Map;for(let s of e){if(r.includes(s))continue;let i=t.nodes.get(s);if(!i)continue;let o=i.category==="barrel";for(let a of i.exports){let c=n.get(a.name),l=!!(a.signature||a.doc);(!c||l&&!o)&&n.set(a.name,{file:s,symbol:a})}}return n}function gi(t,e,r,n){let s=[];for(let i of t){let o=e.get(i),a=n.flatMap(u=>r.nodes.get(u)?.exports??[]).find(u=>u.name===i),c=o?.symbol??a,l=o?.file??n.find(u=>r.nodes.get(u)?.exports.some(d=>d.name===i))??n[0],p={name:i,definedIn:l,kind:pi(c?.signature)};c?.doc&&(p.doc=c.doc),c?.signature&&(p.signature=c.signature),s.push(p)}return s.sort((i,o)=>i.name.localeCompare(o.name)),s}function di(t,e,r){let n=c=>t.nodes.get(c)?.category==="test",s=[...e].filter(c=>!r.includes(c)&&!n(c)),i=[...t.nodes.keys()].filter(c=>!e.has(c)),o=i.filter(c=>!n(c)),a=i.filter(c=>n(c));return{internalFiles:s,unreachableFromEntry:o,testFiles:a}}function Ft(t,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let l of e)if(!t.nodes.has(l))throw new Error(`Entry point not found in graph: ${l}`);let r=fi(t,e),n=mi(t,r,e),s=ui(t,e),i=gi(s,n,t,e),{internalFiles:o,unreachableFromEntry:a,testFiles:c}=di(t,r,e);return{entryPoints:e,publicExports:i,internalFiles:o,unreachableFromEntry:a,testFiles:c}}function Tt(t,e){let r=null,n=[];for(let i of t.nodes.values()){i.exports.some(o=>o.name===e)&&(r=i.path);for(let o of i.callEdges??[])o.to===e&&n.push({file:i.path,callerFunction:o.from})}let s=[];if(r){let i=t.nodes.get(r);for(let o of i?.callEdges??[])o.from===e&&s.push({file:o.toFile,calleeFunction:o.to})}return{functionName:e,definedIn:r,callers:n,callees:s}}import ap from"fs";import lp from"path";function Gr(t){let e=[...t.nodes.entries()].sort(([n],[s])=>n.localeCompare(s)).map(([n,s])=>`${n}:${s.mtime}:${s.size}`).join("|"),r=2166136261;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r.toString(16).padStart(8,"0")}function Et(t){let e=new Map;for(let r of t.nodes.keys()){let n=[];t.traverse(r,s=>(s.path!==r&&n.push(s.path),!0),{direction:"incoming"}),e.set(r,n)}return{impact:e,graphHash:Gr(t)}}function At(t,e){return t.impact.get(e)??[]}import{readFile as tn}from"fs/promises";import ce from"path";import Xi from"piscina";import Le from"fs";import hi from"path";import{load as _r}from"js-yaml";var Pt=["package-lock.json","yarn.lock","pnpm-lock.yaml"];function Or(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function yi(t){return t.replace(/:$/,"").split(",").map(e=>{let r=e.trim();return r.startsWith('"')&&(r=r.slice(1)),r.endsWith('"')&&(r=r.slice(0,-1)),Or(r)}).filter(Boolean)}function xi(t,e){let r=t.startsWith("/")?t.slice(1):t,n=r.lastIndexOf("@");return n>0?{name:r.substring(0,n),version:e||r.substring(n+1)}:{name:r,version:e}}function bi(t){try{let e=_r(t),r={dependencies:{}};for(let[n,s]of Object.entries(e))if(!(n==="__metadata"||!s?.version))for(let i of n.split(", ")){let o=Or(i);o&&(r.dependencies[o]={version:s.version,...s.dependencies!==void 0&&{dependencies:s.dependencies}})}return r}catch{return null}}function Si(t){let e={dependencies:{}};for(let r of t.split(/\n\n+/)){let n=r.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 i=yi(s);if(i.length===0)continue;let a=n.find(c=>c.trim().startsWith('version "'))?.match(/version "(.*?)"/)?.[1]??"";for(let c of i)e.dependencies[c]={version:a}}return e}function ki(t){let e=Le.readFileSync(t,"utf-8"),r=JSON.parse(e),n={dependencies:{}};if(r.packages)for(let[s,i]of Object.entries(r.packages)){if(!s.startsWith("node_modules/"))continue;let o=s.replace("node_modules/","");o.includes("node_modules/")||(n.dependencies[o]={version:i.version,...i.dependencies!==void 0&&{dependencies:i.dependencies}})}else if(r.dependencies)for(let[s,i]of Object.entries(r.dependencies))n.dependencies[s]={version:i.version,...i.dependencies!==void 0&&{dependencies:i.dependencies}};return n}function Ci(t){let e=Le.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=bi(e);if(r!==null)return r}return Si(e)}function vi(t){let e=Le.readFileSync(t,"utf-8"),r={dependencies:{}};try{let n=_r(e);if(n.packages)for(let[s,i]of Object.entries(n.packages)){let{name:o,version:a}=xi(s,i.version);o&&(r.dependencies[o]={version:a,...i.dependencies!==void 0&&{dependencies:i.dependencies}})}if(n.dependencies)for(let[s,i]of Object.entries(n.dependencies)){if(r.dependencies[s])continue;let o=typeof i=="string"?i:i.version;r.dependencies[s]={version:o||""}}}catch{}return r}function jr(t){let e={"package-lock.json":ki,"yarn.lock":Ci,"pnpm-lock.yaml":vi},r=Pt.map(n=>[n,e[n]]);for(let[n,s]of r){let i=hi.join(t,n);if(Le.existsSync(i))return s(i)}return null}var wi=new Set(["css","scss","less","stylus"]);function zr(t){return wi.has(t)?"style":"code"}import Br from"postcss";import*as Fi from"postcss-less";var Ti=Fi,$r=new Set(["reference","inline"]);function Wr(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function Ei(t){let e=t.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function Ai(t,e){let r=t.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(r){let i=r[1]?.trim()??"",o=r[2]??"";if(!o)return null;let a=$r.has(i)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:a,...Wr(o)?{isExternal:!0}:{}}}let n=t.match(/^url\(['"]?([^'")]+)['"]?\)/),s=n?n[1]?.trim()??"":t.match(/^['"]([^'"]+)['"]/)?.[1]??"";return s?{fromPath:e,toPath:"",rawSpecifier:s,isStyle:!0,type:"static",...Wr(s)?{isExternal:!0}:{}}:null}function Pi(t,e){let r=[],n=/url\(['"]?([^'")]+)['"]?\)/g,s=n.exec(t);for(;s!==null;){let i=s[1]?.trim()??"";Ei(i)&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),s=n.exec(t)}return r}function Ur(t,e){let r=[];return t.walk(n=>{if(n.type==="atrule"&&n.name==="import"){let s=Ai(n.params,e);s&&r.push(s)}n.type==="decl"&&r.push(...Pi(n.value,e))}),r}function Ni(t){return t.replace(/(?<!:)\/\/.*/g,"")}function Ii(t,e){let r=[],n=/@import\s+(?:\(([^)]+)\)\s+)?['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let i=s[1]?.trim()??"",o=s[2]??"";if(o){let a=$r.has(i)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:a})}s=n.exec(t)}return r}function Ge(t,e){let r=Br.parse(Ni(t));return{imports:Ur(r,e),root:r}}function Di(t){let e=[],r=[];for(let n of t.nodes??[]){if(n.type!=="atrule")continue;let{value:s}=n;if(s===void 0)continue;let i=n.name;i&&(e.push({name:i}),r.push({name:i,kind:"variable"}))}return{exports:e,tags:r}}function _e(t,e){try{let r=Ti.parse(t),{exports:n,tags:s}=Di(r);return{imports:Ur(r,e),root:r,exports:n,tags:s}}catch{return{imports:Ii(t,e),root:Br.parse(""),exports:[],tags:[]}}}import{parse as Mi}from"postcss-scss";function Hr(t){return t.startsWith("_")||t.startsWith("-")}function Ri(t){return!!(t.startsWith("sass:")||t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||!t.startsWith(".")&&!t.startsWith("/")&&!t.startsWith("_"))}function Li(t){let e=t.match(/^['"]([^'"]+)['"]/);if(!e?.[1])return{specifier:""};let r=e[1],s=t.match(/\bas\s+(\S+)/)?.[1];return s!==void 0?{specifier:r,alias:s}:{specifier:r}}function Gi(t){let e=[],r=[];for(let n of t.nodes??[]){if(n.type==="decl"&&n.prop.startsWith("$")){let s=n.prop.slice(1);if(!s||Hr(s))continue;e.push({name:s}),r.push({name:s,kind:"variable"});continue}if(n.type==="atrule"&&(n.name==="mixin"||n.name==="function")){let i=n.params.match(/^([\w-]+)/)?.[1];if(!i||Hr(i))continue;let o=n.params.trim();e.push(o.includes("(")?{name:i,signature:o}:{name:i}),r.push({name:i,kind:"function"})}}return{exports:e,tags:r}}function Oe(t,e){let r=Mi(t),n=[];r.walk(o=>{if(o.type!=="atrule")return;let{name:a,params:c}=o;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:l,alias:p}=Li(c);if(!l)return;let u={fromPath:e,toPath:"",rawSpecifier:l,isStyle:!0,type:a==="forward"?"re-export":"static",...Ri(l)?{isExternal:!0}:{}};p&&(u.symbols=[p]),n.push(u)});let{exports:s,tags:i}=Gi(r);return{imports:n,root:r,exports:s,tags:i}}function _i(t){return t.trim().replace(/\s+/g," ")}function Oi(t){try{return t.fileType==="scss"?Oe(t.source,t.file).root:t.fileType==="less"?_e(t.source,t.file).root:t.fileType==="css"?Ge(t.source,t.file).root:void 0}catch{return}}function ji(t){let e=Oi(t);if(!e)return[];let r=[];return e.walkRules(n=>{let s=n.nodes?.filter(p=>p.type==="decl")??[];if(s.length===0)return;let i=s[0],o=s[s.length-1],a=n.source?.start?.line??i?.source?.start?.line,c=o?.source?.end?.line??o?.source?.start?.line??a;if(a===void 0||c===void 0)return;let l=s.map(p=>`${p.prop.trim().toLowerCase()}:${_i(p.value)}`).join(";");r.push({file:t.file,startLine:a,endLine:c,lines:c-a+1,signature:l,declCount:s.length})}),r}function Kr(t,e,r=2){let n=new Map;for(let i of t)for(let o of ji(i)){if(o.declCount<r||o.lines<e)continue;let a=n.get(o.signature);a?a.push(o):n.set(o.signature,[o])}let s=[];for(let i of n.values())for(let o=0;o<i.length;o++)for(let a=o+1;a<i.length;a++){let c=i[o],l=i[a];if(c.file===l.file&&c.startLine===l.startLine&&c.endLine===l.endLine)continue;let p={file:c.file,startLine:c.startLine,endLine:c.endLine},u={file:l.file,startLine:l.startLine,endLine:l.endLine};s.push({occurrences:[p,u],lines:Math.min(c.lines,l.lines),tokens:c.declCount,family:"style"})}return s.sort((i,o)=>o.lines-i.lines)}function Jr(t){let e=t.length,r=[],n=[{lcpLength:0,low:0}];for(let s=1;s<e;s++){let i=s-1;for(;t[s]<n[n.length-1].lcpLength;){let o=n.pop();r.push({lcpLength:o.lcpLength,low:o.low,high:s-1}),i=o.low}t[s]>n[n.length-1].lcpLength&&n.push({lcpLength:t[s],low:i})}for(;n.length>1;){let s=n.pop();r.push({lcpLength:s.lcpLength,low:s.low,high:e-1})}return r}var zi=new Set(["{","}",":",",","[","]"]);function Vr(t,e,r){let n=0;for(let s=e;s<e+r;s++)zi.has(t[s].text)&&n++;return n/r}function Qr(t){let e=t.length;if(e===0)return[];let r=Array.from({length:e},(i,o)=>o),n=new Array(e);{let i=[...new Set(t)].sort(),o=new Map(i.map((a,c)=>[a,c]));for(let a=0;a<e;a++)n[a]=o.get(t[a])}let s=new Array(e).fill(0);for(let i=1;i<e;i*=2){let o=a=>a+i<e?n[a+i]:-1;r.sort((a,c)=>{let l=n[a]-n[c];return l!==0?l:o(a)-o(c)}),s[r[0]]=0;for(let a=1;a<e;a++){let c=r[a-1],l=r[a],p=n[c]===n[l],u=o(c)===o(l);s[l]=s[c]+(p&&u?0:1)}if([n,s]=[s,n],n[r[e-1]]===e-1)break}return r}function qr(t,e){let r=t.length,n=new Array(r).fill(0);if(r===0)return n;let s=new Array(r);for(let o=0;o<r;o++)s[e[o]]=o;let i=0;for(let o=0;o<r;o++){let a=s[o];if(a>0){let c=e[a-1];for(;o+i<r&&c+i<r&&t[o+i]===t[c+i];)i++;n[a]=i,i>0&&i--}else i=0}return n}function Yr(t,e,r,n=.5){let s=[],i=[],o=new Map;for(let{file:u,tokens:d}of t)if(d.length!==0){o.set(u,d);for(let h=0;h<d.length;h++)s.push(d[h].text),i.push({file:u,localIndex:h});s.push(` ${u}`),i.push({file:u,localIndex:-1})}if(s.length===0)return[];let a=Qr(s),c=qr(s,a),l=Jr(c),p=[];for(let u of l){let d=Wi(u,a,i,o,e,r,n);d&&p.push(d)}return p.sort((u,d)=>d.lines-u.lines)}function Wi(t,e,r,n,s,i,o){if(t.lcpLength<s)return;let a=[];for(let h=t.low;h<=t.high;h++){let C=r[e[h]];C.localIndex!==-1&&a.push(C)}if(a.length<2||!Bi(a,n))return;let c=$i(a,t.lcpLength);if(c.length<2)return;let l=c[0],p=n.get(l.file);if(Vr(p,l.localIndex,t.lcpLength)>o)return;let u=c.map(({file:h,localIndex:C})=>{let v=n.get(h);return{file:h,startLine:v[C].line,endLine:v[C+t.lcpLength-1].line}}),d=Math.min(...u.map(h=>h.endLine-h.startLine+1));if(!(d<i))return{occurrences:u,lines:d,tokens:t.lcpLength}}function Bi(t,e){let r=null;for(let{file:n,localIndex:s}of t){if(s===0)return!0;let o=e.get(n)[s-1].text;if(r===null)r=o;else if(r!==o)return!0}return!1}function $i(t,e){let r=new Map;for(let{file:s,localIndex:i}of t){let o=r.get(s);o?o.push(i):r.set(s,[i])}let n=[];for(let[s,i]of r){i.sort((a,c)=>a-c);let o=Number.NEGATIVE_INFINITY;for(let a of i)a>=o&&(n.push({file:s,localIndex:a}),o=a+e)}return n}var Ui={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 Xr(t,e,r){let n=t.slice(e,r).replace(/[^\n]/g," ");return t.slice(0,e)+n+t.slice(r)}function Hi(t,e){if(!e)return t;let r=t;for(let[n,s]of e.block??[]){let i=0;for(;;){let o=r.indexOf(n,i);if(o===-1)break;let a=r.indexOf(s,o+n.length),c=a===-1?r.length:a+s.length;r=Xr(r,o,c),i=c}}for(let n of e.line??[]){let s=0;for(;;){let i=r.indexOf(n,s);if(i===-1)break;let o=r.indexOf(`
5
+ `,i),a=o===-1?r.length:o;r=Xr(r,i,a),s=a}}return r}var Ki=["===","!==","...","=>","==","!=","<=",">=","&&","||","::","->","..","+=","-=","*=","/="],Nt=new RegExp(`${Ki.map(t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")}|[A-Za-z_$][A-Za-z0-9_$]*|\\d+(?:\\.\\d+)?|"(?:\\\\.|[^"\\\\])*"|'(?:\\\\.|[^'\\\\])*'|\`(?:\\\\.|[^\`\\\\])*\`|\\S`,"g"),Ji=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Zr=/^\d+(?:\.\d+)?$/,Vi=/^(".*"|'.*'|`.*`)$/s,Qi=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 en(t,e,r=!0){let n=Hi(t,Ui[e]),s=[],i=1,o=0;Nt.lastIndex=0;let a=Nt.exec(n);for(;a!==null;){for(let p=o;p<a.index;p++)n[p]===`
6
+ `&&i++;o=a.index;let c=a[0],l=c;Ji.test(c)&&!Qi.has(c)?l="ID":r&&(Zr.test(c)||Vi.test(c))&&(l=Zr.test(c)?"NUM":"STR"),s.push({text:l,line:i});for(let p=o;p<a.index+c.length;p++)n[p]===`
7
+ `&&i++;o=a.index+c.length,a=Nt.exec(n)}return s}import ae from"fs";import qi from"path";function Yi(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.mtime=="number"&&typeof e.size=="number"&&typeof e.ignoreLiterals=="boolean"&&Array.isArray(e.tokens)}function je(t){try{if(!ae.existsSync(t))return new Map;let e=ae.readFileSync(t,"utf-8"),r=JSON.parse(e);if(!Array.isArray(r))return new Map;let n=r.filter(s=>Array.isArray(s)&&s.length===2&&typeof s[0]=="string"&&Yi(s[1]));return new Map(n)}catch{return new Map}}function ze(t,e){let r=qi.dirname(e);ae.existsSync(r)||ae.mkdirSync(r,{recursive:!0}),ae.writeFileSync(e,JSON.stringify([...t.entries()]))}var Zi=20,eo=new Set(["css","scss","less"]);function to(t){return Pt.includes(ce.basename(t))}function ro(t,e){if(e.length===0)return!1;let r=new Set(e);return t.split(ce.sep).some(n=>r.has(n))}async function It(t,e,r={}){let{minLines:n=6,windowSize:s=15,ignoreLiterals:i=!0,maxPunctuationRatio:o=.5,limit:a=50,ignoreDirs:c=z,parallelTokenizing:l=!0,tokenCache:p}=r,u=[...t.nodes.values()].filter(h=>!to(h.path)&&!ro(h.path,c)),d=no(l,u.length);try{let h=[],C=new Map;if(await Promise.all(u.map(async y=>{if(eo.has(y.type)){let Q;try{Q=await tn(ce.join(e,y.path),"utf8")}catch{return}h.push({file:y.path,source:Q,fileType:y.type});return}let k=p?.get(y.path),D=k&&k.mtime===y.mtime&&k.size===y.size&&k.ignoreLiterals===i,N;if(D)N=k.tokens;else{let Q;try{Q=await tn(ce.join(e,y.path),"utf8")}catch{return}N=d?await d.run({source:Q,fileType:y.type,ignoreLiterals:i}):en(Q,y.type,i),p?.set(y.path,{mtime:y.mtime,size:y.size,ignoreLiterals:i,tokens:N})}let j=zr(y.type),Tr={file:y.path,tokens:N},Er=C.get(j);Er?Er.push(Tr):C.set(j,[Tr])})),p){let y=new Set(u.map(k=>k.path));for(let k of p.keys())y.has(k)||p.delete(k)}let v=Kr(h,n);for(let[y,k]of C)for(let D of Yr(k,s,n,o))v.push({...D,family:y});return{groups:v.sort((y,k)=>k.lines-y.lines).slice(0,a)}}finally{d&&await d.destroy()}}function no(t,e){if(t===!1)return null;let r=typeof t=="object"?t:{},n=r.minFiles??Zi;if(e<n)return null;r.maxThreads!==void 0&&r.maxThreads<1&&process.stderr.write(`
8
8
  Warning: parallelTokenizing.maxThreads (${r.maxThreads}) must be at least 1; using 1.
9
- `);try{return new Yo({filename:ce.join(u,"duplication-worker.js"),...r.maxThreads!==void 0?{maxThreads:Math.max(1,r.maxThreads)}:{}})}catch(s){return process.stderr.write(`
9
+ `);try{return new Xi({filename:ce.join(f,"duplication-worker.js"),...r.maxThreads!==void 0?{maxThreads:Math.max(1,r.maxThreads)}:{}})}catch(s){return process.stderr.write(`
10
10
  Warning: failed to start duplicate-detection worker pool, falling back to synchronous tokenizing: ${s}
11
- `),null}}import ze from"path";function ni(t){let e=new Map;for(let[r,n]of t){let s=n.imports.filter(o=>o.toPath&&!o.isExternal).length;s>0&&e.set(r,s)}return e}function si(t,e,r){let n=new Map;for(let[s,o]of e){if(o<r)continue;let i=t.get(s);if(!i||i.category==="test"||i.category==="barrel")continue;let a=ze.extname(s),c=ze.basename(s,a),l=c==="index"?ze.basename(ze.dirname(s)):c;n.set(s,{path:s,outDegree:o,tag:`feature:${l}`})}return n}function W(t,e){let r=e?.minOutDegree??5;return si(t,ni(t),r)}var oi=(t,e)=>t.outDegree-e.outDegree;function ii(t,e){let r=new Map;for(let n of e.values()){let s=new Set;t.traverse(n.path,o=>(o.path!==n.path&&s.add(o.path),!0),{direction:"outgoing"}),r.set(n.path,s)}return r}function ai(t,e,r,n){let s=new Map;for(let[o]of t){if(e.has(o))continue;let i=null;for(let a of e.values())r.get(a.path)?.has(o)&&(!i||n(a,i)<0)&&(i=a);i&&s.set(o,i.path)}return s}function ci(t,e){let r=new Map;for(let n of t.values()){let s=n.tag.replace("feature:",""),o=[];for(let[i,a]of e)a===n.path&&o.push(i);r.set(s,{hub:n.path,outDegree:n.outDegree,files:o})}return r}function li(t,e,r){let n=[];for(let s of t.keys())!e.has(s)&&!r.has(s)&&n.push(s);return n}function le(t,e){let r=e?.detectFn??W,n=e?.hubComparator??oi,s=r(t.nodes,e),o=ii(t,s),i=ai(t.nodes,s,o,n);return{features:ci(s,i),unassigned:li(t.nodes,s,i)}}var en=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),tn=new Set(["typescript","javascript","python"]),We=new Set(["typescript","javascript","go","python"]);function Et(t){let e=new Map;for(let r of t.nodes.values())e.set(r.type,(e.get(r.type)??0)+1);return[...e.entries()].map(([r,n])=>({type:r,fileCount:n,exportsTracked:en.has(r),importSymbolsTracked:tn.has(r),callEdgesTracked:We.has(r)})).sort((r,n)=>n.fileCount-r.fileCount)}var pe=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let r=new Set(this.nodes.keys());return e.filter(n=>!r.has(n))}findHighExportUsage(e){let r=[];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);r.push({path:n.path,maxExportUsage:n.maxExportUsage,tightestDep:s?.toPath??""})}return r.sort((n,s)=>s.maxExportUsage-n.maxExportUsage)}findCycles(){let e=[],r=new Set,n=new Set,s=[],o=i=>{r.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 l=s.indexOf(c.toPath);e.push([...s.slice(l),c.toPath])}else r.has(c.toPath)||o(c.toPath)}n.delete(i),s.pop()};for(let i of this.nodes.keys())r.has(i)||o(i);return e}};var I=class t{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let r=new Map;for(let n of e.nodes)r.set(n.path,n);return new t(r)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.imports)if(n.toPath){let s=e.get(n.toPath)||[];s.push(r.path),e.set(n.toPath,s)}return this._incomingEdgesCache=e,e}dfs(e,r,n,s){let o=new Set,i=n.maxDepth??1/0,a=(c,l,p)=>{if(l>i||o.has(c))return;let m=this.nodes.get(c);if(m&&(o.add(c),r(m,l,p)!==!1))for(let d of s(c))a(d,l+1,c)};a(e,0,null)}traverse(e,r,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,r,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 r of this.nodes.values())for(let n of r.callEdges??[]){let s=e.get(n.toFile)??[];s.push(r.path),e.set(n.toFile,s)}return this._callIncomingCache=e,e}traverseCalls(e,r,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getCallIncomingCache():null;this.dfs(e,r,n,i=>s==="outgoing"?this.nodes.get(i)?.callEdges?.map(a=>a.toFile)??[]:o?.get(i)??[])}getCallers(e){let r=[];return this.traverseCalls(e,n=>(n.path!==e&&r.push(n.path),!0),{direction:"incoming",maxDepth:1}),r}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let r=this.nodes.get(e);return r?r.imports.map(n=>this.nodes.get(n.toPath)).filter(n=>n!==void 0):[]}findUnusedFiles(e){return new pe(this.nodes).findUnusedFiles(e)}findCycles(){return new pe(this.nodes).findCycles()}};var B=class{affectedSymbols=new Map;constructor(e,r){this.affectedSymbols.set(e,new Set(["default",...r]))}updateAffectedSymbols(e,r){let n=this.affectedSymbols.get(r)||new Set,s=e.imports.find(c=>c.toPath===r);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 ue(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(n=>n.name)}}function At(t,e,r=1){let n=[];return t.traverse(e,(s,o,i)=>{if(s.path===e)return!0;let a=i?t.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:r}),n}function fe(t,e){let r=[];return t.traverse(e,n=>{if(n.path===e)return!0;let s=n.imports.find(o=>o.toPath===e);return r.push({path:n.path,...s?.symbols?{symbols:s.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),r}function Pt(t,e,r={}){let{testsOnly:n=!1,changedSymbols:s}=r,o=s?new B(e,s):null,i=[];return t.traverse(e,(a,c,l)=>{if(a.path===e)return!0;if(o&&l&&!o.updateAffectedSymbols(a,l))return!1;let p=a.category==="test"||a.tags.some(m=>m.name==="test");return(!n||p)&&i.push(a.path),!0},{direction:"incoming"}),i}function Nt(t,e,r={}){let{depth:n=1,withEdgeDetail:s=!1}=r,o=[];return t.traverseCalls(e,i=>{if(i.path===e)return!0;let a={file:i.path};return s&&(a.edges=(i.callEdges??[]).filter(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),o.push(a),!0},{direction:"incoming",maxDepth:n}),o}function It(t,e={}){let{metric:r="cognitiveComplexity",threshold:n=10,limit:s=20}=e;return[...t.nodes.values()].flatMap(o=>(o.functions??[]).filter(i=>i[r]>=n).map(i=>({file:o.path,name:i.name,line:i.line,complexity:i.complexity,cognitiveComplexity:i.cognitiveComplexity}))).sort((o,i)=>i[r]-o[r]).slice(0,s)}function Mt(t){return{nodes:t.nodes.map(r=>({path:r.path,type:r.type,category:r.category,exports:r.exports.map(n=>n.name),tags:r.tags.filter(n=>n.kind==="comment-marker"||n.kind==="import").map(n=>n.name),importsFiles:r.imports.filter(n=>!n.isExternal&&n.toPath).map(n=>n.toPath),...r.description!==void 0&&{description:r.description},...r.testedBy!==void 0&&{testedBy:r.testedBy},...r.coveragePct!==void 0&&{coveragePct:r.coveragePct},...r.avgExportUsage!==void 0&&{avgExportUsage:r.avgExportUsage},...r.maxExportUsage!==void 0&&{maxExportUsage:r.maxExportUsage}})),cycles:t.cycles}}function Dt(t){let e=t.getPackageDependencies(),r=Array.from(t.packages.values()).map(({graph:n,pkg:s})=>({name:s.name,relativeRoot:s.relativeRoot,nodeCount:n.nodes.size,dependsOn:e.get(s.name)??[]}));return{monorepoType:t.type,packageCount:r.length,packages:r}}function Be(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function rn(t){return[...t.nodes.values()].some(e=>e.commitCount90d!==void 0)}function Rt(t,e={}){let{metric:r="cognitiveComplexity",minComplexity:n=10,maxCoveragePct:s=50,minChurn:o=0,limit:i=20}=e,a=rn(t),c=[...t.nodes.values()].filter(l=>l.coveragePct!==void 0&&l.coveragePct<=s&&(!a||(l.commitCount90d??0)>=o)).flatMap(l=>(l.functions??[]).filter(p=>p[r]>=n).map(p=>({file:l.path,name:p.name,line:p.line,complexity:p.complexity,cognitiveComplexity:p.cognitiveComplexity,coveragePct:l.coveragePct,...l.commitCount90d!==void 0&&{commitCount90d:l.commitCount90d}}))).sort((l,p)=>p[r]-l[r]).slice(0,i);return{hotspots:c,count:c.length,churnDataAvailable:a}}function nn(t){if(t.category==="test")return"test";if(t.category==="config")return"config";if(t.category==="type-only")return"types";let e=t.path;return S(e,"component")||S(e,"components")?"component":S(e,"controller")||S(e,"controllers")?"controller":S(e,"middleware")?"middleware":S(e,"router")||S(e,"routes")||S(e,"route")?"router":S(e,"store")||S(e,"stores")?"store":S(e,"service")||S(e,"services")?"service":S(e,"handler")||S(e,"handlers")?"handler":S(e,"adapter")||S(e,"adapters")?"adapter":S(e,"plugin")||S(e,"plugins")?"plugin":S(e,"api")?"api":S(e,"cli")||S(e,"commands")||me(e)==="cli"?"cli":S(e,"util")||S(e,"utils")||S(e,"helper")||S(e,"helpers")?"util":S(e,"model")||S(e,"models")||me(e)==="model"?"model":S(e,"parser")||S(e,"parsers")||me(e)==="parser"?"parser":me(e)==="builder"?"builder":me(e)==="resolver"?"resolver":"other"}function S(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function me(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function Lt(t,e){let r=le(t,e),n=new Map;for(let[o,i]of r.features){for(let a of i.files)n.set(a,o);n.set(i.hub,o)}let s=new Map;for(let o of t.nodes.values()){let i=n.get(o.path);s.set(o.path,{path:o.path,role:nn(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function Gt(t,e){let r=[];for(let n of t.nodes.values())if(n.exports.some(s=>s.name===e))if(We.has(n.type)){let s=[];for(let o of t.nodes.values())for(let i of o.callEdges??[])i.to===e&&s.push({file:o.path,callerFunction:i.from});r.push({path:n.path,category:n.category,precision:"call",callers:s})}else{let s=fe(t,n.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));r.push({path:n.path,category:n.category,precision:"file-level",importers:s})}return r}function pi(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function ui(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function _t(t){let e=new Map;for(let n of t.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript"))for(let s of n.exports){if(!ui(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:pi(s.signature),...s.doc?{doc:s.doc}:{}})}let r=[];for(let n of t.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}`)&&r.push({fromFile:n.path,toType:o,toFile:s.toPath})}return{types:e,edges:r}}function Ot(t,e){let r=null;for(let o of t.types.values())if(o.name===e){r=o;break}if(!r)return{type:null,usedByFiles:[],uses:[]};let n=new Set,s=new Map;for(let o of t.edges)if(o.toType===e&&o.toFile===r.file&&n.add(o.fromFile),o.fromFile===r.file){let i=t.types.get(`${o.toFile}::${o.toType}`);i&&s.set(`${i.file}::${i.name}`,i)}return{type:r,usedByFiles:Array.from(n),uses:Array.from(s.values())}}import vi from"path";import zt from"fs";import cn from"path";import ge from"fs";import A from"path";import sn from"fs";import Ru from"path";function on(t){try{return sn.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function $e(t){try{return sn.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function jt(t,e){let r=A.join(e,"package.json");if(!ge.existsSync(r))return null;let n={};try{n=JSON.parse(ge.readFileSync(r,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:A.relative(t,e),entryPoints:fi(e,n)}:null}function fi(t,e){let r=[];if(e.exports){let s=e.exports;if(typeof s=="string")r.push(A.join(t,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")r.push(A.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(A.join(t,i))}}}e.main&&r.push(A.join(t,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(A.join(t,s));let n=r.filter($e);return n.length>0?n.slice(0,1):r.slice(0,1)}function Y(t,e){let r=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");mi(t,o,n,r)}return r}function mi(t,e,r,n){if(!e.includes("*")){gi(t,e,r,n);return}let s=e.split("/");s.includes("**")?di(t,s,r,n):hi(t,s,r,n)}function gi(t,e,r,n){let s=A.join(t,e);if(r.has(s)||!on(s))return;r.add(s);let o=jt(t,s);o&&n.push(o)}function di(t,e,r,n){let s=A.join(t,e[0]==="**"?"":e[0]??"");an(t,s,r,n)}function hi(t,e,r,n){let s=e.findIndex(a=>a.includes("*")),o=A.join(t,...e.slice(0,s)),i;try{i=ge.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=A.join(o,a.name);if(r.has(c))continue;r.add(c);let l=jt(t,c);l&&n.push(l)}}function an(t,e,r,n){let s;try{s=ge.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=A.join(e,o.name);if(ge.existsSync(A.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=jt(t,i);a&&n.push(a)}else an(t,i,r,n)}}var ln={type:"npm",detect(t){let e=cn.join(t,"package.json");if(!zt.existsSync(e))return null;let r;try{r=JSON.parse(zt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||zt.existsSync(cn.join(t,"yarn.lock")))return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:Y(t,n)}};import X from"fs";import T from"path";var pn={type:"nx",detect(t){return X.existsSync(T.join(t,"nx.json"))?un(t,t,new Set,0).map(r=>yi(t,r,T.join(r,"project.json"))).filter(r=>r!==null):null}};function un(t,e,r,n){if(n>4)return[];let s;try{s=X.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=T.join(e,a);X.existsSync(T.join(c,"project.json"))&&!r.has(c)?(r.add(c),o.push(c)):o.push(...un(t,c,r,n+1))}return o}function yi(t,e,r){let n={};try{n=JSON.parse(X.readFileSync(r,"utf-8"))}catch{return null}let s=n.name,o,i,a=T.join(e,"package.json");if(X.existsSync(a))try{let c=JSON.parse(X.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:T.relative(t,e),entryPoints:xi(e,n,o,i)}:null}function xi(t,e,r,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=T.resolve(t,"../..");s.push(T.resolve(a,o)),s.push(T.resolve(t,o))}if(n){let a=n;if(typeof a=="string")s.push(T.join(t,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(T.join(t,c))}}if(r&&s.push(T.join(t,r)),e.sourceRoot){let a=T.resolve(t,"../.."),c=T.resolve(a,e.sourceRoot);s.push(T.join(c,"index.ts"),T.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(T.join(t,a));let i=s.filter($e);return i.length>0?i.slice(0,1):s.slice(0,1)}import fn from"fs";import bi from"path";import{load as Si}from"js-yaml";var mn={type:"pnpm",detect(t){let e=bi.join(t,"pnpm-workspace.yaml");if(!fn.existsSync(e))return null;let r=[];try{r=Si(fn.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return Y(t,r)}};import ki from"fs";import Ci from"path";var gn={type:"turborepo",detect(t){return ki.existsSync(Ci.join(t,"turbo.json"))?[]:null}};import Wt from"fs";import dn from"path";var hn={type:"yarn",detect(t){if(!Wt.existsSync(dn.join(t,"yarn.lock")))return null;let e=dn.join(t,"package.json");if(!Wt.existsSync(e))return null;let r;try{r=JSON.parse(Wt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r)return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:Y(t,n)}};var yn=[];function G(t){yn.push(t)}function xn(){return yn}G(gn);G(pn);G(mn);G(hn);G(ln);function de(t,e=xn()){let r=vi.resolve(t),n=new Map,s=[];for(let i of e){let a=i.detect(r);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:r,type:"none",types:[],packages:[],packageMap:new Map};let o=Array.from(n.values());return{root:r,type:s[0],types:s,packages:o,packageMap:new Map(o.map(i=>[i.name,i]))}}var he=class t{constructor(e,r){this.monorepoRoot=e;this.type=r}monorepoRoot;type;packages=new Map;addPackage(e,r){this.packages.set(e.name,{graph:r,pkg:e})}getPackageForFile(e){for(let{pkg:r}of this.packages.values())if(e===r.relativeRoot||e.startsWith(`${r.relativeRoot}/`))return r}getPackageDependencies(){let e=new Map;for(let{graph:r,pkg:n}of this.packages.values()){let s=new Set;for(let o of r.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 r=this.getPackageForFile(e);if(!r)return[];let n=this.packages.get(r.name);if(!n)return[];let s=[];n.graph.traverse(e,o=>(o.path!==e&&s.push({file:o.path,package:r.name}),!0),{direction:"incoming"});for(let{graph:o,pkg:i}of this.packages.values())if(i.name!==r.name)for(let a of o.nodes.values())a.imports.some(l=>l.isWorkspace&&l.workspacePackage===r.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:r})=>({pkg:{name:r.name,relativeRoot:r.relativeRoot,entryPoints:r.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let r=new t(e.monorepoRoot,e.type);for(let{pkg:n,nodes:s}of e.packages){let o=new Map(s.map(a=>[a.path,a])),i=new I(o);r.packages.set(n.name,{graph:i,pkg:{...n,root:""}})}return r}};var bn=new Map;function Z(t,e){bn.set(t,e)}function Sn(t){return bn.get(t)}function kn(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function wi(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var Fi=(t,e)=>!e.category||kn(t.category,e.category),Ti=(t,e)=>!e.type||kn(t.type,e.type),Ei=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,Ai=(t,e)=>!e.path||wi(t.path,e.path),Pi=(t,e)=>e.isExternal===void 0?!0:t.imports.some(n=>n.isExternal)===e.isExternal,Ni=(t,e)=>{if(!e.tags||e.tags.length===0)return!0;let r=e.tags.filter(s=>!s.startsWith("!")),n=e.tags.filter(s=>s.startsWith("!")).map(s=>s.slice(1));return!(r.length>0&&!r.some(s=>t.tags.some(o=>o.name===s))||n.some(s=>t.tags.some(o=>o.name===s)))},Ii=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(n=>n.name===r)),Mi=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),Di=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(s=>s.includes(e.importedBy)),Ri=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,Li=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,Gi=(t,e)=>e.minSize===void 0||t.size>=e.minSize,_i=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,Oi=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,ji=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,zi=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,Wi=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,Bi=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,$i=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,Ui=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,Hi=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Ki=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Ji=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,Vi=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Qi=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,qi=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,Yi=(t,e,r)=>!e.any?.length||e.any.some(n=>ye(t,n,r)),Xi=[Fi,Ti,Ei,Ai,Pi,Ni,Ii,Mi,Di,Ri,Li,Gi,_i,Oi,ji,zi,Wi,Bi,$i,Ui,Hi,Ki,Ji,Vi,Qi,qi,Yi];function ye(t,e,r){return Xi.every(n=>n(t,e,r))}function Ue(t,e){let r=new Map;if(e.importedBy!==void 0){for(let i of t.nodes)for(let a of i.imports)if(a.toPath){let c=r.get(a.toPath)??[];c.push(i.path),r.set(a.toPath,c)}}let n=t.nodes.filter(i=>ye(i,e,r)),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 l=0;return e.sort==="size"?l=c.size-a.size:e.sort==="imports"?l=c.imports.length-a.imports.length:e.sort==="commitCount90d"?l=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?l=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?l=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(l=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),l*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:t.cycles?.filter(i=>i.every(a=>s.has(a)))??void 0}}function Cn(t,e){let r=e.indexOf(":");if(r===-1)return;let n=e.slice(0,r).trim().toLowerCase(),s=e.slice(r+1).trim();if(!(!n||!s))switch(n){case"category":t.category=s;break;case"type":t.type=s;break;case"tag":case"tags":s.includes("+")?t.allTags=[...t.allTags??[],...s.split("+")]:t.tags=[...t.tags??[],s];break;case"path":t.path=s;break;case"external":t.isExternal=s.toLowerCase()==="true";break;case"importsfile":t.importsFile=s;break;case"importedby":t.importedBy=s;break;case"minimports":t.minImports=parseInt(s,10);break;case"maximports":t.maxImports=parseInt(s,10);break;case"minsize":t.minSize=parseInt(s,10);break;case"maxsize":t.maxSize=parseInt(s,10);break;case"sort":t.sort=s;break;case"sortdir":t.sortDir=s.toLowerCase()==="asc"?"asc":"desc";break;case"limit":t.limit=parseInt(s,10);break;case"hasdocstring":t.hasDocstring=s.toLowerCase()!=="false";break;case"mincoverage":t.minCoverage=parseInt(s,10);break;case"maxcoverage":t.maxCoverage=parseInt(s,10);break;case"minexportusage":t.minExportUsage=parseFloat(s);break;case"maxexportusage":t.maxExportUsage=parseFloat(s);break;case"mincomplexity":t.minComplexity=parseInt(s,10);break;case"maxcomplexity":t.maxComplexity=parseInt(s,10);break;case"mincognitivecomplexity":t.minCognitiveComplexity=parseInt(s,10);break;case"maxcognitivecomplexity":t.maxCognitiveComplexity=parseInt(s,10);break;case"mincommits":t.minCommits=parseInt(s,10);break;case"maxcommits":t.maxCommits=parseInt(s,10);break;case"isdocumented":t.isDocumented=s.toLowerCase()!=="false";break;case"isstale":t.isStale=s.toLowerCase()!=="false";break;case"lastauthor":t.lastAuthor=s;break}}function Zi(t){let e=[];for(let r of t.split("|")){let n=r.trim();if(!n)continue;let s={};Cn(s,n),Object.keys(s).length>0&&e.push(s)}return e}function He(t){let e={},r=t.split(",");for(let n of r){let s=n.trim();if(s.toLowerCase().startsWith("any(")&&s.endsWith(")")){let o=s.slice(4,-1),i=Zi(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}Cn(e,n)}return e}import Nn from"fs/promises";import va from"path";import Zt from"path";import et from"typescript";import ra from"path";import ea from"path";import F from"typescript";var vn=new Set(["describe","test","it"]);function $(t,e){let r=t[e];if(r===void 0)throw new Error(`Index ${e} out of bounds (length ${t.length})`);return r}function Bt(t){let e=[];for(let r of t.statements){if(!F.isExpressionStatement(r))continue;let n=r.expression;if(!F.isCallExpression(n))continue;let s=n.expression;F.isIdentifier(s)&&vn.has(s.text)&&e.push(n),F.isPropertyAccessExpression(s)&&F.isIdentifier(s.expression)&&vn.has(s.expression.text)&&e.push(n)}return e}function $t(t,e,r){for(let n of t.arguments){if(!F.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>F.isPropertyAssignment(o)&&F.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!F.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(F.isStringLiteral).map(o=>o.text)}return null}function Ut(t,e,r,n){if(t.arguments.length===0)return null;for(let o=1;o<t.arguments.length;o++){let i=$(t.arguments,o);if(!F.isObjectLiteralExpression(i))continue;let a=i.properties.find(l=>F.isPropertyAssignment(l)&&F.isIdentifier(l.name)&&l.name.text===e);if(a)return{start:a.initializer.getStart(n),end:a.initializer.getEnd(),text:r};let c=i.getEnd()-1;return{start:c,end:c,text:`${i.properties.length>0?", ":""}${e}: ${r}`}}let s=$(t.arguments,t.arguments.length-1);return{start:s.getStart(n),end:s.getStart(n),text:`{ ${e}: ${r} }, `}}function Ht(t,e,r){let n=t.arguments;for(let s=1;s<n.length;s++){let o=$(n,s);if(!F.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>F.isPropertyAssignment(c)&&F.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:$(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=$(o.properties,i);return i===o.properties.length-1?{start:$(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:$(o.properties,i+1).getStart(r),text:""}}return null}function Kt(t,e){let r=[...e].sort((s,o)=>o.start-s.start),n=t;for(let s of r)n=n.slice(0,s.start)+s.text+n.slice(s.end);return n}function Jt(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var D=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function ta(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}function Ke(t,e,r,n){let s=F.createSourceFile(ea.basename(t),e,F.ScriptTarget.Latest,!0),o=Bt(s),[i]=o;if(!i)return e;let a=$t(i,n,s),c=[...r].sort();if(a!==null&&JSON.stringify(ta(a).sort())===JSON.stringify(c))return e;let l=Jt(c.map(m=>`@${m}`)),p=o.flatMap(m=>{let d=r.length===0?Ht(m,n,s):Ut(m,n,l,s);return d?[d]:[]});return p.length>0?Kt(e,p):e}var Je=class{name="cypress";canHandle(e){return D.has(ra.extname(e).toLowerCase())}apply(e,r,n){return Ke(e,r,n,"tags")}};import na from"path";var Vt=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Qt=/^@([a-zA-Z0-9_-]+)/gm;function sa(t){return`${["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
11
+ `),null}}import We from"path";function so(t){let e=new Map;for(let[r,n]of t){let s=n.imports.filter(i=>i.toPath&&!i.isExternal).length;s>0&&e.set(r,s)}return e}function io(t,e,r){let n=new Map;for(let[s,i]of e){if(i<r)continue;let o=t.get(s);if(!o||o.category==="test"||o.category==="barrel")continue;let a=We.extname(s),c=We.basename(s,a),l=c==="index"?We.basename(We.dirname(s)):c;n.set(s,{path:s,outDegree:i,tag:`feature:${l}`})}return n}function W(t,e){let r=e?.minOutDegree??5;return io(t,so(t),r)}var oo=(t,e)=>t.outDegree-e.outDegree;function ao(t,e){let r=new Map;for(let n of e.values()){let s=new Set;t.traverse(n.path,i=>(i.path!==n.path&&s.add(i.path),!0),{direction:"outgoing"}),r.set(n.path,s)}return r}function co(t,e,r,n){let s=new Map;for(let[i]of t){if(e.has(i))continue;let o=null;for(let a of e.values())r.get(a.path)?.has(i)&&(!o||n(a,o)<0)&&(o=a);o&&s.set(i,o.path)}return s}function lo(t,e){let r=new Map;for(let n of t.values()){let s=n.tag.replace("feature:",""),i=[];for(let[o,a]of e)a===n.path&&i.push(o);r.set(s,{hub:n.path,outDegree:n.outDegree,files:i})}return r}function po(t,e,r){let n=[];for(let s of t.keys())!e.has(s)&&!r.has(s)&&n.push(s);return n}function le(t,e){let r=e?.detectFn??W,n=e?.hubComparator??oo,s=r(t.nodes,e),i=ao(t,s),o=co(t.nodes,s,i,n);return{features:lo(s,o),unassigned:po(t.nodes,s,o)}}var rn=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),nn=new Set(["typescript","javascript","python"]),Be=new Set(["typescript","javascript","go","python"]);function Dt(t){let e=new Map;for(let r of t.nodes.values())e.set(r.type,(e.get(r.type)??0)+1);return[...e.entries()].map(([r,n])=>({type:r,fileCount:n,exportsTracked:rn.has(r),importSymbolsTracked:nn.has(r),callEdgesTracked:Be.has(r)})).sort((r,n)=>n.fileCount-r.fileCount)}var pe=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let r=new Set(this.nodes.keys());return e.filter(n=>!r.has(n))}findHighExportUsage(e){let r=[];for(let n of this.nodes.values()){if(n.maxExportUsage===void 0||n.maxExportUsage<e)continue;let s=n.imports.reduce((i,o)=>(o.exportUsageRatio??0)>(i?.exportUsageRatio??0)?o:i,null);r.push({path:n.path,maxExportUsage:n.maxExportUsage,tightestDep:s?.toPath??""})}return r.sort((n,s)=>s.maxExportUsage-n.maxExportUsage)}findCycles(){let e=[],r=new Set,n=new Set,s=[],i=o=>{r.add(o),n.add(o),s.push(o);let a=this.nodes.get(o);if(a){for(let c of a.imports)if(!(!c.toPath||c.isExternal))if(n.has(c.toPath)){let l=s.indexOf(c.toPath);e.push([...s.slice(l),c.toPath])}else r.has(c.toPath)||i(c.toPath)}n.delete(o),s.pop()};for(let o of this.nodes.keys())r.has(o)||i(o);return e}};var I=class t{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let r=new Map;for(let n of e.nodes)r.set(n.path,n);return new t(r)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.imports)if(n.toPath){let s=e.get(n.toPath)||[];s.push(r.path),e.set(n.toPath,s)}return this._incomingEdgesCache=e,e}dfs(e,r,n,s){let i=new Set,o=n.maxDepth??1/0,a=(c,l,p)=>{if(l>o||i.has(c))return;let u=this.nodes.get(c);if(u&&(i.add(c),r(u,l,p)!==!1))for(let d of s(c))a(d,l+1,c)};a(e,0,null)}traverse(e,r,n={}){let s=n.direction??"outgoing",i=s==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,r,n,o=>s==="outgoing"?this.nodes.get(o)?.imports.map(a=>a.toPath).filter(Boolean)??[]:i?.get(o)??[])}getCallIncomingCache(){if(this._callIncomingCache)return this._callIncomingCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.callEdges??[]){let s=e.get(n.toFile)??[];s.push(r.path),e.set(n.toFile,s)}return this._callIncomingCache=e,e}traverseCalls(e,r,n={}){let s=n.direction??"outgoing",i=s==="incoming"?this.getCallIncomingCache():null;this.dfs(e,r,n,o=>s==="outgoing"?this.nodes.get(o)?.callEdges?.map(a=>a.toFile)??[]:i?.get(o)??[])}getCallers(e){let r=[];return this.traverseCalls(e,n=>(n.path!==e&&r.push(n.path),!0),{direction:"incoming",maxDepth:1}),r}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let r=this.nodes.get(e);return r?r.imports.map(n=>this.nodes.get(n.toPath)).filter(n=>n!==void 0):[]}findUnusedFiles(e){return new pe(this.nodes).findUnusedFiles(e)}findCycles(){return new pe(this.nodes).findCycles()}};var B=class{affectedSymbols=new Map;constructor(e,r){this.affectedSymbols.set(e,new Set(["default",...r]))}updateAffectedSymbols(e,r){let n=this.affectedSymbols.get(r)||new Set,s=e.imports.find(c=>c.toPath===r);if(!s)return!1;let i=s.symbols||["*"],o=new Set;for(let c of i)(c==="*"||n.has("*")||n.has(c))&&o.add("*");if(o.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let c of o)a.add(c);return this.affectedSymbols.set(e.path,a),!0}};function ue(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(n=>n.name)}}function Mt(t,e,r=1){let n=[];return t.traverse(e,(s,i,o)=>{if(s.path===e)return!0;let a=o?t.nodes.get(o)?.imports.find(c=>c.toPath===s.path):void 0;return n.push({path:s.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:r}),n}function fe(t,e){let r=[];return t.traverse(e,n=>{if(n.path===e)return!0;let s=n.imports.find(i=>i.toPath===e);return r.push({path:n.path,...s?.symbols?{symbols:s.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),r}function Rt(t,e,r={}){let{testsOnly:n=!1,changedSymbols:s}=r,i=s?new B(e,s):null,o=[];return t.traverse(e,(a,c,l)=>{if(a.path===e)return!0;if(i&&l&&!i.updateAffectedSymbols(a,l))return!1;let p=a.category==="test"||a.tags.some(u=>u.name==="test");return(!n||p)&&o.push(a.path),!0},{direction:"incoming"}),o}function Lt(t,e,r={}){let{depth:n=1,withEdgeDetail:s=!1}=r,i=[];return t.traverseCalls(e,o=>{if(o.path===e)return!0;let a={file:o.path};return s&&(a.edges=(o.callEdges??[]).filter(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),i.push(a),!0},{direction:"incoming",maxDepth:n}),i}function Gt(t,e={}){let{metric:r="cognitiveComplexity",threshold:n=10,limit:s=20}=e;return[...t.nodes.values()].flatMap(i=>(i.functions??[]).filter(o=>o[r]>=n).map(o=>({file:i.path,name:o.name,line:o.line,complexity:o.complexity,cognitiveComplexity:o.cognitiveComplexity}))).sort((i,o)=>o[r]-i[r]).slice(0,s)}function _t(t){return{nodes:t.nodes.map(r=>({path:r.path,type:r.type,category:r.category,exports:r.exports.map(n=>n.name),tags:r.tags.filter(n=>n.kind==="comment-marker"||n.kind==="import").map(n=>n.name),importsFiles:r.imports.filter(n=>!n.isExternal&&n.toPath).map(n=>n.toPath),...r.description!==void 0&&{description:r.description},...r.testedBy!==void 0&&{testedBy:r.testedBy},...r.coveragePct!==void 0&&{coveragePct:r.coveragePct},...r.avgExportUsage!==void 0&&{avgExportUsage:r.avgExportUsage},...r.maxExportUsage!==void 0&&{maxExportUsage:r.maxExportUsage}})),cycles:t.cycles}}function Ot(t){let e=t.getPackageDependencies(),r=Array.from(t.packages.values()).map(({graph:n,pkg:s})=>({name:s.name,relativeRoot:s.relativeRoot,nodeCount:n.nodes.size,dependsOn:e.get(s.name)??[]}));return{monorepoType:t.type,packageCount:r.length,packages:r}}function $e(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function sn(t){return[...t.nodes.values()].some(e=>e.commitCount90d!==void 0)}function jt(t,e={}){let{metric:r="cognitiveComplexity",minComplexity:n=10,maxCoveragePct:s=50,minChurn:i=0,limit:o=20}=e,a=sn(t),c=[...t.nodes.values()].filter(l=>l.coveragePct!==void 0&&l.coveragePct<=s&&(!a||(l.commitCount90d??0)>=i)).flatMap(l=>(l.functions??[]).filter(p=>p[r]>=n).map(p=>({file:l.path,name:p.name,line:p.line,complexity:p.complexity,cognitiveComplexity:p.cognitiveComplexity,coveragePct:l.coveragePct,...l.commitCount90d!==void 0&&{commitCount90d:l.commitCount90d}}))).sort((l,p)=>p[r]-l[r]).slice(0,o);return{hotspots:c,count:c.length,churnDataAvailable:a}}function on(t){if(t.category==="test")return"test";if(t.category==="config")return"config";if(t.category==="type-only")return"types";let e=t.path;return S(e,"component")||S(e,"components")?"component":S(e,"controller")||S(e,"controllers")?"controller":S(e,"middleware")?"middleware":S(e,"router")||S(e,"routes")||S(e,"route")?"router":S(e,"store")||S(e,"stores")?"store":S(e,"service")||S(e,"services")?"service":S(e,"handler")||S(e,"handlers")?"handler":S(e,"adapter")||S(e,"adapters")?"adapter":S(e,"plugin")||S(e,"plugins")?"plugin":S(e,"api")?"api":S(e,"cli")||S(e,"commands")||me(e)==="cli"?"cli":S(e,"util")||S(e,"utils")||S(e,"helper")||S(e,"helpers")?"util":S(e,"model")||S(e,"models")||me(e)==="model"?"model":S(e,"parser")||S(e,"parsers")||me(e)==="parser"?"parser":me(e)==="builder"?"builder":me(e)==="resolver"?"resolver":"other"}function S(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function me(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function zt(t,e){let r=le(t,e),n=new Map;for(let[i,o]of r.features){for(let a of o.files)n.set(a,i);n.set(o.hub,i)}let s=new Map;for(let i of t.nodes.values()){let o=n.get(i.path);s.set(i.path,{path:i.path,role:on(i),...i.description?{description:i.description}:{},exports:i.exports.map(a=>a.name),...o?{featureHub:o}:{}})}return s}function Wt(t,e){let r=[];for(let n of t.nodes.values())if(n.exports.some(s=>s.name===e))if(Be.has(n.type)){let s=[];for(let i of t.nodes.values())for(let o of i.callEdges??[])o.to===e&&s.push({file:i.path,callerFunction:o.from});r.push({path:n.path,category:n.category,precision:"call",callers:s})}else{let s=fe(t,n.path).map(i=>({file:i.path,...i.symbols?{symbols:i.symbols}:{}}));r.push({path:n.path,category:n.category,precision:"file-level",importers:s})}return r}function uo(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function fo(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function Bt(t){let e=new Map;for(let n of t.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript"))for(let s of n.exports){if(!fo(s,n.category))continue;let i=`${n.path}::${s.name}`;e.set(i,{name:s.name,file:n.path,kind:uo(s.signature),...s.doc?{doc:s.doc}:{}})}let r=[];for(let n of t.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 i of s.symbols)e.has(`${s.toPath}::${i}`)&&r.push({fromFile:n.path,toType:i,toFile:s.toPath})}return{types:e,edges:r}}function $t(t,e){let r=null;for(let i of t.types.values())if(i.name===e){r=i;break}if(!r)return{type:null,usedByFiles:[],uses:[]};let n=new Set,s=new Map;for(let i of t.edges)if(i.toType===e&&i.toFile===r.file&&n.add(i.fromFile),i.fromFile===r.file){let o=t.types.get(`${i.toFile}::${i.toType}`);o&&s.set(`${o.file}::${o.name}`,o)}return{type:r,usedByFiles:Array.from(n),uses:Array.from(s.values())}}import Fo from"path";import Ht from"fs";import pn from"path";import ge from"fs";import A from"path";import an from"fs";import Gu from"path";function cn(t){try{return an.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Ue(t){try{return an.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Ut(t,e){let r=A.join(e,"package.json");if(!ge.existsSync(r))return null;let n={};try{n=JSON.parse(ge.readFileSync(r,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:A.relative(t,e),entryPoints:mo(e,n)}:null}function mo(t,e){let r=[];if(e.exports){let s=e.exports;if(typeof s=="string")r.push(A.join(t,s));else if(typeof s=="object"&&s!==null){let i=s["."];if(typeof i=="string")r.push(A.join(t,i));else if(typeof i=="object"&&i!==null){let o=i.import??i.require??i.default;typeof o=="string"&&r.push(A.join(t,o))}}}e.main&&r.push(A.join(t,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(A.join(t,s));let n=r.filter(Ue);return n.length>0?n.slice(0,1):r.slice(0,1)}function Y(t,e){let r=[],n=new Set;for(let s of e){let i=s.replace(/\/$/,"").replace(/^\.\//,"");go(t,i,n,r)}return r}function go(t,e,r,n){if(!e.includes("*")){ho(t,e,r,n);return}let s=e.split("/");s.includes("**")?yo(t,s,r,n):xo(t,s,r,n)}function ho(t,e,r,n){let s=A.join(t,e);if(r.has(s)||!cn(s))return;r.add(s);let i=Ut(t,s);i&&n.push(i)}function yo(t,e,r,n){let s=A.join(t,e[0]==="**"?"":e[0]??"");ln(t,s,r,n)}function xo(t,e,r,n){let s=e.findIndex(a=>a.includes("*")),i=A.join(t,...e.slice(0,s)),o;try{o=ge.readdirSync(i,{withFileTypes:!0})}catch{return}for(let a of o){if(!a.isDirectory())continue;let c=A.join(i,a.name);if(r.has(c))continue;r.add(c);let l=Ut(t,c);l&&n.push(l)}}function ln(t,e,r,n){let s;try{s=ge.readdirSync(e,{withFileTypes:!0})}catch{return}for(let i of s){if(!i.isDirectory()||i.name==="node_modules"||i.name.startsWith("."))continue;let o=A.join(e,i.name);if(ge.existsSync(A.join(o,"package.json"))&&!r.has(o)){r.add(o);let a=Ut(t,o);a&&n.push(a)}else ln(t,o,r,n)}}var un={type:"npm",detect(t){let e=pn.join(t,"package.json");if(!Ht.existsSync(e))return null;let r;try{r=JSON.parse(Ht.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||Ht.existsSync(pn.join(t,"yarn.lock")))return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:Y(t,n)}};import X from"fs";import T from"path";var fn={type:"nx",detect(t){return X.existsSync(T.join(t,"nx.json"))?mn(t,t,new Set,0).map(r=>bo(t,r,T.join(r,"project.json"))).filter(r=>r!==null):null}};function mn(t,e,r,n){if(n>4)return[];let s;try{s=X.readdirSync(e,{withFileTypes:!0})}catch{return[]}let i=[];for(let o of s){if(!o.isDirectory())continue;let a=o.name;if(a.startsWith(".")||a==="node_modules"||a==="dist"||a===".nx")continue;let c=T.join(e,a);X.existsSync(T.join(c,"project.json"))&&!r.has(c)?(r.add(c),i.push(c)):i.push(...mn(t,c,r,n+1))}return i}function bo(t,e,r){let n={};try{n=JSON.parse(X.readFileSync(r,"utf-8"))}catch{return null}let s=n.name,i,o,a=T.join(e,"package.json");if(X.existsSync(a))try{let c=JSON.parse(X.readFileSync(a,"utf-8"));s=c.name??s,i=c.main,o=c.exports}catch{}return s?{name:s,root:e,relativeRoot:T.relative(t,e),entryPoints:So(e,n,i,o)}:null}function So(t,e,r,n){let s=[],i=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(i){let a=T.resolve(t,"../..");s.push(T.resolve(a,i)),s.push(T.resolve(t,i))}if(n){let a=n;if(typeof a=="string")s.push(T.join(t,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(T.join(t,c))}}if(r&&s.push(T.join(t,r)),e.sourceRoot){let a=T.resolve(t,"../.."),c=T.resolve(a,e.sourceRoot);s.push(T.join(c,"index.ts"),T.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(T.join(t,a));let o=s.filter(Ue);return o.length>0?o.slice(0,1):s.slice(0,1)}import gn from"fs";import ko from"path";import{load as Co}from"js-yaml";var dn={type:"pnpm",detect(t){let e=ko.join(t,"pnpm-workspace.yaml");if(!gn.existsSync(e))return null;let r=[];try{r=Co(gn.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return Y(t,r)}};import vo from"fs";import wo from"path";var hn={type:"turborepo",detect(t){return vo.existsSync(wo.join(t,"turbo.json"))?[]:null}};import Kt from"fs";import yn from"path";var xn={type:"yarn",detect(t){if(!Kt.existsSync(yn.join(t,"yarn.lock")))return null;let e=yn.join(t,"package.json");if(!Kt.existsSync(e))return null;let r;try{r=JSON.parse(Kt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r)return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:Y(t,n)}};var bn=[];function G(t){bn.push(t)}function Sn(){return bn}G(hn);G(fn);G(dn);G(xn);G(un);function de(t,e=Sn()){let r=Fo.resolve(t),n=new Map,s=[];for(let o of e){let a=o.detect(r);if(a!==null){s.push(o.type);for(let c of a)n.has(c.name)||n.set(c.name,c)}}if(s.length===0)return{root:r,type:"none",types:[],packages:[],packageMap:new Map};let i=Array.from(n.values());return{root:r,type:s[0],types:s,packages:i,packageMap:new Map(i.map(o=>[o.name,o]))}}var he=class t{constructor(e,r){this.monorepoRoot=e;this.type=r}monorepoRoot;type;packages=new Map;addPackage(e,r){this.packages.set(e.name,{graph:r,pkg:e})}getPackageForFile(e){for(let{pkg:r}of this.packages.values())if(e===r.relativeRoot||e.startsWith(`${r.relativeRoot}/`))return r}getPackageDependencies(){let e=new Map;for(let{graph:r,pkg:n}of this.packages.values()){let s=new Set;for(let i of r.nodes.values())for(let o of i.imports)o.isWorkspace&&o.workspacePackage&&s.add(o.workspacePackage);e.set(n.name,[...s])}return e}getAffectedAcrossPackages(e){let r=this.getPackageForFile(e);if(!r)return[];let n=this.packages.get(r.name);if(!n)return[];let s=[];n.graph.traverse(e,i=>(i.path!==e&&s.push({file:i.path,package:r.name}),!0),{direction:"incoming"});for(let{graph:i,pkg:o}of this.packages.values())if(o.name!==r.name)for(let a of i.nodes.values())a.imports.some(l=>l.isWorkspace&&l.workspacePackage===r.name)&&s.push({file:a.path,package:o.name});return s}serialize(){return{monorepoRoot:this.monorepoRoot,type:this.type,packages:Array.from(this.packages.values()).map(({graph:e,pkg:r})=>({pkg:{name:r.name,relativeRoot:r.relativeRoot,entryPoints:r.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let r=new t(e.monorepoRoot,e.type);for(let{pkg:n,nodes:s}of e.packages){let i=new Map(s.map(a=>[a.path,a])),o=new I(i);r.packages.set(n.name,{graph:o,pkg:{...n,root:""}})}return r}};var kn=new Map;function Z(t,e){kn.set(t,e)}function Cn(t){return kn.get(t)}function vn(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function To(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var Eo=(t,e)=>!e.category||vn(t.category,e.category),Ao=(t,e)=>!e.type||vn(t.type,e.type),Po=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,No=(t,e)=>!e.path||To(t.path,e.path),Io=(t,e)=>e.isExternal===void 0?!0:t.imports.some(n=>n.isExternal)===e.isExternal,Do=(t,e)=>{if(!e.tags||e.tags.length===0)return!0;let r=e.tags.filter(s=>!s.startsWith("!")),n=e.tags.filter(s=>s.startsWith("!")).map(s=>s.slice(1));return!(r.length>0&&!r.some(s=>t.tags.some(i=>i.name===s))||n.some(s=>t.tags.some(i=>i.name===s)))},Mo=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(n=>n.name===r)),Ro=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),Lo=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(s=>s.includes(e.importedBy)),Go=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,_o=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,Oo=(t,e)=>e.minSize===void 0||t.size>=e.minSize,jo=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,zo=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,Wo=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,Bo=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,$o=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,Uo=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,Ho=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,Ko=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,Jo=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Vo=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Qo=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,qo=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Yo=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,Xo=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,Zo=(t,e,r)=>!e.any?.length||e.any.some(n=>ye(t,n,r)),ea=[Eo,Ao,Po,No,Io,Do,Mo,Ro,Lo,Go,_o,Oo,jo,zo,Wo,Bo,$o,Uo,Ho,Ko,Jo,Vo,Qo,qo,Yo,Xo,Zo];function ye(t,e,r){return ea.every(n=>n(t,e,r))}function He(t,e){let r=new Map;if(e.importedBy!==void 0){for(let o of t.nodes)for(let a of o.imports)if(a.toPath){let c=r.get(a.toPath)??[];c.push(o.path),r.set(a.toPath,c)}}let n=t.nodes.filter(o=>ye(o,e,r)),s=new Set(n.map(o=>o.path)),i=n.map(o=>({...o,imports:o.imports.filter(a=>!a.toPath||s.has(a.toPath))}));if(e.sort){let o=e.sortDir==="asc"?-1:1;i.sort((a,c)=>{let l=0;return e.sort==="size"?l=c.size-a.size:e.sort==="imports"?l=c.imports.length-a.imports.length:e.sort==="commitCount90d"?l=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?l=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?l=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(l=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),l*o})}return e.limit!==void 0&&i.splice(e.limit),{nodes:i,cycles:t.cycles?.filter(o=>o.every(a=>s.has(a)))??void 0}}function wn(t,e){let r=e.indexOf(":");if(r===-1)return;let n=e.slice(0,r).trim().toLowerCase(),s=e.slice(r+1).trim();if(!(!n||!s))switch(n){case"category":t.category=s;break;case"type":t.type=s;break;case"tag":case"tags":s.includes("+")?t.allTags=[...t.allTags??[],...s.split("+")]:t.tags=[...t.tags??[],s];break;case"path":t.path=s;break;case"external":t.isExternal=s.toLowerCase()==="true";break;case"importsfile":t.importsFile=s;break;case"importedby":t.importedBy=s;break;case"minimports":t.minImports=parseInt(s,10);break;case"maximports":t.maxImports=parseInt(s,10);break;case"minsize":t.minSize=parseInt(s,10);break;case"maxsize":t.maxSize=parseInt(s,10);break;case"sort":t.sort=s;break;case"sortdir":t.sortDir=s.toLowerCase()==="asc"?"asc":"desc";break;case"limit":t.limit=parseInt(s,10);break;case"hasdocstring":t.hasDocstring=s.toLowerCase()!=="false";break;case"mincoverage":t.minCoverage=parseInt(s,10);break;case"maxcoverage":t.maxCoverage=parseInt(s,10);break;case"minexportusage":t.minExportUsage=parseFloat(s);break;case"maxexportusage":t.maxExportUsage=parseFloat(s);break;case"mincomplexity":t.minComplexity=parseInt(s,10);break;case"maxcomplexity":t.maxComplexity=parseInt(s,10);break;case"mincognitivecomplexity":t.minCognitiveComplexity=parseInt(s,10);break;case"maxcognitivecomplexity":t.maxCognitiveComplexity=parseInt(s,10);break;case"mincommits":t.minCommits=parseInt(s,10);break;case"maxcommits":t.maxCommits=parseInt(s,10);break;case"isdocumented":t.isDocumented=s.toLowerCase()!=="false";break;case"isstale":t.isStale=s.toLowerCase()!=="false";break;case"lastauthor":t.lastAuthor=s;break}}function ta(t){let e=[];for(let r of t.split("|")){let n=r.trim();if(!n)continue;let s={};wn(s,n),Object.keys(s).length>0&&e.push(s)}return e}function Ke(t){let e={},r=t.split(",");for(let n of r){let s=n.trim();if(s.toLowerCase().startsWith("any(")&&s.endsWith(")")){let i=s.slice(4,-1),o=ta(i);o.length>0&&(e.any=[...e.any??[],...o]);continue}wn(e,n)}return e}import Dn from"fs/promises";import Fa from"path";import sr from"path";import tt from"typescript";import sa from"path";import ra from"path";import F from"typescript";var Fn=new Set(["describe","test","it"]);function $(t,e){let r=t[e];if(r===void 0)throw new Error(`Index ${e} out of bounds (length ${t.length})`);return r}function Jt(t){let e=[];for(let r of t.statements){if(!F.isExpressionStatement(r))continue;let n=r.expression;if(!F.isCallExpression(n))continue;let s=n.expression;F.isIdentifier(s)&&Fn.has(s.text)&&e.push(n),F.isPropertyAccessExpression(s)&&F.isIdentifier(s.expression)&&Fn.has(s.expression.text)&&e.push(n)}return e}function Vt(t,e,r){for(let n of t.arguments){if(!F.isObjectLiteralExpression(n))continue;let s=n.properties.find(i=>F.isPropertyAssignment(i)&&F.isIdentifier(i.name)&&i.name.text===e);if(!(!s||!F.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(F.isStringLiteral).map(i=>i.text)}return null}function Qt(t,e,r,n){if(t.arguments.length===0)return null;for(let i=1;i<t.arguments.length;i++){let o=$(t.arguments,i);if(!F.isObjectLiteralExpression(o))continue;let a=o.properties.find(l=>F.isPropertyAssignment(l)&&F.isIdentifier(l.name)&&l.name.text===e);if(a)return{start:a.initializer.getStart(n),end:a.initializer.getEnd(),text:r};let c=o.getEnd()-1;return{start:c,end:c,text:`${o.properties.length>0?", ":""}${e}: ${r}`}}let s=$(t.arguments,t.arguments.length-1);return{start:s.getStart(n),end:s.getStart(n),text:`{ ${e}: ${r} }, `}}function qt(t,e,r){let n=t.arguments;for(let s=1;s<n.length;s++){let i=$(n,s);if(!F.isObjectLiteralExpression(i))continue;let o=i.properties.findIndex(c=>F.isPropertyAssignment(c)&&F.isIdentifier(c.name)&&c.name.text===e);if(o<0)continue;if(i.properties.length===1)return{start:$(n,s-1).getEnd(),end:i.getEnd(),text:""};let a=$(i.properties,o);return o===i.properties.length-1?{start:$(i.properties,o-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:$(i.properties,o+1).getStart(r),text:""}}return null}function Yt(t,e){let r=[...e].sort((s,i)=>i.start-s.start),n=t;for(let s of r)n=n.slice(0,s.start)+s.text+n.slice(s.end);return n}function Xt(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var M=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function na(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}function Je(t,e,r,n){let s=F.createSourceFile(ra.basename(t),e,F.ScriptTarget.Latest,!0),i=Jt(s),[o]=i;if(!o)return e;let a=Vt(o,n,s),c=[...r].sort();if(a!==null&&JSON.stringify(na(a).sort())===JSON.stringify(c))return e;let l=Xt(c.map(u=>`@${u}`)),p=i.flatMap(u=>{let d=r.length===0?qt(u,n,s):Qt(u,n,l,s);return d?[d]:[]});return p.length>0?Yt(e,p):e}var Ve=class{name="cypress";canHandle(e){return M.has(sa.extname(e).toLowerCase())}apply(e,r,n){return Je(e,r,n,"tags")}};import ia from"path";var Zt=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,er=/^@([a-zA-Z0-9_-]+)/gm;function oa(t){return`${["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
12
12
  `)}
13
13
 
14
- `}function oa(t){let e=new Set;Qt.lastIndex=0;let r=Qt.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=Qt.exec(t);return e}var Ve=class{name="gherkin";canHandle(e){return na.extname(e).toLowerCase()===".feature"}apply(e,r,n){let s=r.replace(Vt,""),o=oa(s),i=n.filter(c=>!o.has(c)),a=i.length>0?sa(i):"";return Vt.test(r)?r.replace(Vt,a):a?r.replace(/^(Feature:)/m,`${a}$1`):r}};function wn(t,e){let r=t.replace(/\\/g,"/"),n=e.replace(/\\/g,"/"),s="";for(let o=0;o<r.length;o++){let i=r[o];i==="*"?r[o+1]==="*"?(s+=".*",o++):s+="[^/]*":i==="?"?s+="[^/]":i!==void 0&&(s+=i.replace(/[.+^${}()|[\]\\]/g,"\\$&"))}return new RegExp(`^${s}$`).test(n)}import ia from"path";var qt=/^\/\/go:build mokosh_[^\n]+\n/m,aa=/^package\s+\S+/m;function ca(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
15
- `}function la(t){let e=qt.exec(t);if(!e)return null;let r=e[0]??"",n=/mokosh_([a-zA-Z0-9_-]+)/g,s=[],o=n.exec(r);for(;o!==null;)o[1]&&s.push(o[1]),o=n.exec(r);return s}var Qe=class{name="go";canHandle(e){return ia.basename(e).endsWith("_test.go")}apply(e,r,n){let s=la(r),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return r;if(n.length===0)return r.replace(qt,"");let i=ca(o);if(s!==null)return r.replace(qt,i);let a=aa.exec(r);if(!a)return r;let c=a.index;return`${r.slice(0,c)+i}
16
- ${r.slice(c)}`}};import pa from"path";var ua=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,Yt=/^ \* @group (.+)$/gm;function fa(t){return`${["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
14
+ `}function aa(t){let e=new Set;er.lastIndex=0;let r=er.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=er.exec(t);return e}var Qe=class{name="gherkin";canHandle(e){return ia.extname(e).toLowerCase()===".feature"}apply(e,r,n){let s=r.replace(Zt,""),i=aa(s),o=n.filter(c=>!i.has(c)),a=o.length>0?oa(o):"";return Zt.test(r)?r.replace(Zt,a):a?r.replace(/^(Feature:)/m,`${a}$1`):r}};function Tn(t,e){let r=t.replace(/\\/g,"/"),n=e.replace(/\\/g,"/"),s="";for(let i=0;i<r.length;i++){let o=r[i];o==="*"?r[i+1]==="*"?(s+=".*",i++):s+="[^/]*":o==="?"?s+="[^/]":o!==void 0&&(s+=o.replace(/[.+^${}()|[\]\\]/g,"\\$&"))}return new RegExp(`^${s}$`).test(n)}import ca from"path";var tr=/^\/\/go:build mokosh_[^\n]+\n/m,la=/^package\s+\S+/m;function pa(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
15
+ `}function ua(t){let e=tr.exec(t);if(!e)return null;let r=e[0]??"",n=/mokosh_([a-zA-Z0-9_-]+)/g,s=[],i=n.exec(r);for(;i!==null;)i[1]&&s.push(i[1]),i=n.exec(r);return s}var qe=class{name="go";canHandle(e){return ca.basename(e).endsWith("_test.go")}apply(e,r,n){let s=ua(r),i=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(i))return r;if(n.length===0)return r.replace(tr,"");let o=pa(i);if(s!==null)return r.replace(tr,o);let a=la.exec(r);if(!a)return r;let c=a.index;return`${r.slice(0,c)+o}
16
+ ${r.slice(c)}`}};import fa from"path";var ma=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,rr=/^ \* @group (.+)$/gm;function ga(t){return`${["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
17
17
  `)}
18
18
 
19
- `}function ma(t){let e=[];Yt.lastIndex=0;let r=Yt.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=Yt.exec(t);return e}var qe=class{name="jest";canHandle(e){return D.has(pa.extname(e).toLowerCase())}apply(e,r,n){let s=ua.exec(r),o=s?ma(s[0]):null,i=[...n].sort();if(o!==null&&JSON.stringify([...o].sort())===JSON.stringify(i))return r;let a=s?r.slice(s[0].length):r;return n.length===0?a:fa(i)+a}};import ga from"path";var Ye=class{name="playwright";canHandle(e){return D.has(ga.extname(e).toLowerCase())}apply(e,r,n){return Ke(e,r,n,"tag")}};import da from"path";var Xt=/^pytestmark\s*=\s*.+$/m,ha=/^import pytest\s*$/m;function ya(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function xa(t){let e=Xt.exec(t);if(!e)return null;let r=e[0],n=[],s=/pytest\.mark\.([a-zA-Z0-9_-]+)/g,o=s.exec(r);for(;o!==null;)o[1]&&n.push(o[1]),o=s.exec(r);return n}var Xe=class{name="pytest";canHandle(e){return da.extname(e).toLowerCase()===".py"}apply(e,r,n){let s=xa(r),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return r;if(n.length===0)return r.replace(Xt,"").replace(/\n{3,}/g,`
19
+ `}function da(t){let e=[];rr.lastIndex=0;let r=rr.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=rr.exec(t);return e}var Ye=class{name="jest";canHandle(e){return M.has(fa.extname(e).toLowerCase())}apply(e,r,n){let s=ma.exec(r),i=s?da(s[0]):null,o=[...n].sort();if(i!==null&&JSON.stringify([...i].sort())===JSON.stringify(o))return r;let a=s?r.slice(s[0].length):r;return n.length===0?a:ga(o)+a}};import ha from"path";var Xe=class{name="playwright";canHandle(e){return M.has(ha.extname(e).toLowerCase())}apply(e,r,n){return Je(e,r,n,"tag")}};import ya from"path";var nr=/^pytestmark\s*=\s*.+$/m,xa=/^import pytest\s*$/m;function ba(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function Sa(t){let e=nr.exec(t);if(!e)return null;let r=e[0],n=[],s=/pytest\.mark\.([a-zA-Z0-9_-]+)/g,i=s.exec(r);for(;i!==null;)i[1]&&n.push(i[1]),i=s.exec(r);return n}var Ze=class{name="pytest";canHandle(e){return ya.extname(e).toLowerCase()===".py"}apply(e,r,n){let s=Sa(r),i=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(i))return r;if(n.length===0)return r.replace(nr,"").replace(/\n{3,}/g,`
20
20
 
21
- `);let i=ya(o);if(s!==null)return r.replace(Xt,i);let a=ha.test(r),c=ba(r),l=r.slice(0,c),p=r.slice(c),m=a?"":`import pytest
21
+ `);let o=ba(i);if(s!==null)return r.replace(nr,o);let a=xa.test(r),c=ka(r),l=r.slice(0,c),p=r.slice(c),u=a?"":`import pytest
22
22
  `,d=l.endsWith(`
23
23
 
24
24
  `)?"":`
25
- `;return`${l+d+m+i}
26
- ${p}`}};function ba(t){let e=t.split(`
27
- `),r=-1;return e.forEach((s,o)=>{(s.trimStart().startsWith("import ")||s.trimStart().startsWith("from "))&&(r=o)}),r<0?0:e.slice(0,r+1).reduce((s,o)=>s+o.length+1,0)}import Fn from"path";import Tn from"typescript";var Sa=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,Ze=class{name="vitest";canHandle(e){return D.has(Fn.extname(e).toLowerCase())}apply(e,r,n){let s=r.replace(Sa,""),o=Tn.createSourceFile(Fn.basename(e),s,Tn.ScriptTarget.Latest,!0),i=Bt(o),[a]=i;if(!a)return s;let c=$t(a,"tags",o),l=[...n].sort();if(c!==null&&JSON.stringify([...c].sort())===JSON.stringify(l))return s;let p=i.flatMap(m=>{let d=n.length===0?Ht(m,"tags",o):Ut(m,"tags",Jt(l),o);return d?[d]:[]});return p.length>0?Kt(s,p):s}};var En={vitest:()=>new Ze,playwright:()=>new Ye,cypress:()=>new Je,jest:()=>new qe},ka={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function Ca(t){let e=et.createSourceFile("detect.ts",t,et.ScriptTarget.Latest,!0);for(let r of e.statements){if(!et.isImportDeclaration(r)||!et.isStringLiteral(r.moduleSpecifier))continue;let n=ka[r.moduleSpecifier.text];if(n)return n}return null}var er=class{constructor(e,r,n){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=n}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return D.has(Zt.extname(e).toLowerCase())}apply(e,r,n){let s=Ca(r)??this.matchOverride(e)??this.defaultFramework;return(En[s]??En.vitest)().apply(e,r,n)}matchOverride(e){let r=Zt.relative(this.rootDir,e).split(Zt.sep).join("/");for(let[n,s]of this.frameworkOverrides)if(wn(n,r))return s;return null}};function An(t="vitest",e={},r=process.cwd()){return[new Ve,new Xe,new Qe,new er(r,t,Object.entries(e))]}function Pn(t,e){return e.find(r=>r.canHandle(t))??null}var wa=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Fa=new Set(["import"]),Ta=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function Ea(t,e,r,n){let s;try{s=await Nn.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let o=Pn(t,n);if(!o)return{path:t,status:"unchanged"};let i=o.apply(t,s,e);return i===s?{path:t,status:"unchanged"}:(r||await Nn.writeFile(t,i,"utf8"),{path:t,status:"updated"})}async function tr(t,e,r){let n=ie(e),s=n.tagApplier?.framework??"vitest",o=n.tagApplier?.frameworkOverrides??{},i=An(s,o,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let c of t.nodes.values()){if(c.category!=="test")continue;let l=new Set,p=[];for(let h of c.tags)Fa.has(h.kind)&&wa.test(h.name)&&(Ta.has(h.name.toLowerCase())||l.has(h.name)||(l.add(h.name),p.push(h.name)));p.sort();let m=va.resolve(e,c.path),d=await Ea(m,p,r.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 tt=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};import Te from"fs";import E from"path";import dl from"piscina";import{execFileSync as rr}from"child_process";var rt=class{getChangedFiles(){try{let r=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(n=>{try{return rr("git",n,{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).split(`
28
- `).map(o=>o.trim()).filter(o=>o!=="")}catch{return[]}});return Array.from(new Set(r))}catch(e){return console.error("Error getting git diff:",e),[]}}},In="%x00%H%x09%ae%x09%at",Mn=256*1024*1024;function Dn(t,e){let r="",n=0;for(let s of t.split(`
29
- `)){if(s.startsWith("\0")){let[,c,l]=s.slice(1).split(" ");r=c??"",n=l?Number(l)*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,r,n)}}function Rn(t){let e=new Map;try{let r=rr("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${In}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Mn});Dn(r,(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 r=rr("git",["-C",t,"log","--name-status","-M",`--format=${In}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Mn});Dn(r,(n,s,o)=>{e.has(n)||e.set(n,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}import Ln from"path";function _(t){switch(Ln.extname(t).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function P(t){let e=Ln.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import Aa from"coffeescript";function O(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function ee(t){let e=new Set,r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=r.exec(t);for(;n!==null;)n[1]&&e.add(n[1]),n=r.exec(t);return e}function te(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function _n(t){if(t){if(typeof t.originalValue=="string")return t.originalValue;if(typeof t.value=="string")return O(t.value)}}function U(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Pa(t,e){let r=_n(e.source);return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:P(r),type:"static"}:null}function Na(t,e){let r=e.variable?.base?.value==="require",n=_n(e.args?.[0]?.base);return!r||!n?null:{fromPath:t,toPath:"",rawSpecifier:n,isStyle:P(n),type:"require"}}function Gn(t,e){if(e)return[{name:e}];let r=t.value;if(r?.constructor?.name==="Class"){let s=U(r.variable);return s?[{name:s}]:[]}if(r?.base?.constructor?.name==="Obj"&&Array.isArray(r.base.properties))return r.base.properties.map(s=>U(s.variable)??U(s)).filter(s=>!!s).map(s=>({name:s}));let n=U(r);return n?[{name:n}]:[]}function Ia(t){if(Array.isArray(t.specifiers))return t.specifiers.map(r=>r.identifier??r.original?.value).filter(r=>!!r).map(r=>({name:r}));let e=U(t.variable)??U(t.variable?.base);return e?[{name:e}]:[]}function Ma(t,e,r,n){let s=e.constructor?.name;if(s==="ImportDeclaration"){let o=Pa(t,e);o&&r.push(o)}else if(s==="Call"){let o=Na(t,e);o&&r.push(o)}else if(s==="Assign"){let o=U(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?n.push(...Gn(e,void 0)):o==="exports"&&typeof i=="string"&&n.push(...Gn(e,i))}else s==="ExportNamedDeclaration"&&e.clause?n.push(...Ia(e.clause)):s==="ExportDefaultDeclaration"&&n.push({name:"default"})}function nr(t,e,r,n){if(!(!e||typeof e!="object")){Ma(t,e,r,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)nr(t,i,r,n);else nr(t,o,r,n)}}}function On(t,e){let r=ee(e),n=te(t,r),s=[],o=[];try{nr(t,Aa.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(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}import{AstBuilder as Da,GherkinClassicTokenMatcher as Ra,Parser as La}from"@cucumber/gherkin";import{IdGenerator as Ga}from"@cucumber/messages";var _a=Ga.uuid();function sr(t,e){let r=new Set;try{let n=new Da(_a),s=new Ra,i=new La(n,s).parse(e);i.feature&&(i.feature.tags.forEach(a=>{r.add(a.name.startsWith("@")?a.name.slice(1):a.name)}),i.feature.children.forEach(a=>{a.scenario&&(a.scenario.tags.forEach(c=>{r.add(c.name.startsWith("@")?c.name.slice(1):c.name)}),a.scenario.examples.forEach(c=>{c.tags.forEach(l=>{r.add(l.name.startsWith("@")?l.name.slice(1):l.name)})})),a.rule&&a.rule.children.forEach(c=>{c.scenario&&c.scenario.tags.forEach(l=>{r.add(l.name.startsWith("@")?l.name.slice(1):l.name)})})}))}catch(n){console.warn(`[GherkinParser] Failed to parse ${t}:`,n)}return{imports:[],exports:[],tags:Array.from(r).map(n=>({name:n,kind:"comment-marker"})),category:"test"}}Z("gherkin",sr);import Ba from"path";import{parser as $a}from"@lezer/go";function H(t){let e=[],r=t.firstChild;for(;r;)e.push(r),r=r.nextSibling;return e}function xe(t,e){let r=1;for(let n=0;n<e&&n<t.length;n++)t[n]===`
30
- `&&r++;return r}function Oa(t,e){let r=1;function n(s){switch(s.type.name){case"IfStatement":case"ForStatement":r++;break;case"Case":{s.firstChild?.type.name==="case"&&r++;break}case"LogicOp":{let i=e.slice(s.from,s.to);(i==="&&"||i==="||")&&r++;break}}let o=s.firstChild;for(;o;)n(o),o=o.nextSibling}return n(t),r}function zn(t,e,r,n){let s=r?1:1+e,o=H(t),i=r?e:e+1,a=o[1];a&&a.type.name!=="Block"&&(s+=re(a,i,!1,n));let c=o.find(p=>p.type.name==="Block");c&&(s+=re(c,i,!1,n));let l=o.findIndex(p=>p.type.name==="else");if(l>=0){let p=o[l+1];p?.type.name==="IfStatement"?s+=zn(p,e,!0,n):p&&(s+=1+re(p,e+1,!1,n))}return s}function jn(t,e,r){let n=1+e,s=t.firstChild;for(;s;)n+=re(s,e+1,!1,r),s=s.nextSibling;return n}function ja(t,e,r){let n=0,s=t.firstChild;for(;s;)n+=re(s,e,!1,r),s=s.nextSibling;return n}function za(t,e){let r=e.slice(t.from,t.to);return r==="&&"||r==="||"}function re(t,e,r,n){let s=t.type.name;if(s==="IfStatement")return zn(t,e,r,n);if(s==="ForStatement"||s==="SwitchStatement"||s==="SelectStatement")return jn(t,e,n);let o=s==="LogicOp"&&za(t,n)?1:0;return e>0&&s==="FunctionLiteral"?o+jn(t,e,n):o+ja(t,e,n)}function Wa(t,e){return re(t,0,!1,e)}function nt(t,e){return{complexity:Oa(t,e),cognitiveComplexity:Wa(t,e)}}function or(t,e){let n=t.getChild("Parameters")?.getChild("Parameter"),s=n?.getChild("TypeName")??n?.getChild("PointerType")?.getChild("TypeName");return s?e.slice(s.from,s.to):void 0}function Wn(t,e){let r=[],n=t.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}=nt(n.node,e);r.push({name:o,line:xe(e,n.from),complexity:i,cognitiveComplexity:a})}}else if(n.name==="MethodDecl"){let s=n.node.getChild("FieldName");if(s){let o=e.slice(s.from,s.to),i=or(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:l}=nt(n.node,e);r.push({name:a,line:xe(e,n.from),complexity:c,cognitiveComplexity:l})}}while(n.next());return r}var Ua=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Ha=/^\/\/go:build\s+(.+)$/,Ka=/^\/\/\s*\+build\s+(.+)$/;function $n(t,e){let r=[],n=new Map,s=new Set,o=new Set,i=new Map,a=$a.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let y=e.slice(c.from,c.to),k=y.match(Ua);k?.[1]&&s.add(k[1]);let M=y.match(Ha);M&&Bn(M[1],o);let N=y.match(Ka);N&&Bn(N[1],o);break}case"ImportSpec":{let y=c.node.getChild("String");if(y){let M=e.slice(y.from,y.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:M,isExternal:!0,isStyle:!1,type:"static"});let N=c.node.getChild("DefName"),j=N?e.slice(N.from,N.to):M.split("/").pop();j&&j!=="_"&&j!=="."&&i.set(j,M)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let y=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(y){let k=e.slice(y.from,y.to);k!=="_"&&/^[A-Z]/.test(k)&&!n.has(k)&&n.set(k,{name:k})}break}}while(c.next());let l=r.some(y=>y.rawSpecifier==="testing"),p=Ba.basename(t).endsWith("_test.go")||s.has("test")||l?"test":"logic",m=new Set([...s,...o]),{complexity:d,cognitiveComplexity:h}=nt(a.topNode,e),C=Wn(a,e),v=p==="test"?[]:Ja(a,e,i);return{imports:r,exports:Array.from(n.values()),tags:Array.from(m).map(y=>({name:y,kind:"comment-marker"})),category:p,rawCallEdges:v,complexity:d,cognitiveComplexity:h,...C.length>0?{functions:C}:{}}}function Ja(t,e,r){let n=[];function s(i,a){if(i.type.name==="CallExpr"){let l=i.firstChild;if(l?.type.name==="SelectorExpr"){let p=l.firstChild,m=l.getChild("FieldName");if(p?.type.name==="VariableName"&&m){let d=e.slice(p.from,p.to),h=r.get(d);if(h){let C=e.slice(m.from,m.to);n.push({from:a,to:C,toSpecifier:h})}}}}let c=i.firstChild;for(;c;)s(c,a),c=c.nextSibling}let o=t.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),l=or(o.node,e);s(a,l?`${l}.${c}`:c)}}while(o.next());return n}function Bn(t,e){for(let r of t.split(/[\s,&|!()]+/)){let n=r.trim();n&&n!=="ignore"&&e.add(n)}}import Va from"livescript";function K(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Qa(t){if(!t)return[];if(t.constructor?.name==="Class"){let r=K(t.title);return r?[{name:r}]:[]}if(t.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(r=>K(r.key)??K(r.val)).filter(r=>!!r).map(r=>({name:r}));let e=K(t);return e?[{name:e}]:[]}function qa(t){let e=t.constructor?.name||t.type;if(e==="Assign"&&t.left?.constructor?.name==="Chain"){let r=t.left,n=K(r.head),o=r.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return Qa(t.right);if(n==="exports"&&typeof o=="string")return[{name:o}];if(r.head?.verb==="out"&&typeof o=="string")return[{name:o}]}if(e==="Import"&&t.left?.verb==="out"){let r=t.right;if(r?.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(n=>K(n.val)??K(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var Ya=new Set(["first_line","first_column","last_line","last_column","line","column"]);function Xa(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let n=t.right?.value;if(typeof n=="string"){let s=O(n);return{fromPath:e,toPath:"",rawSpecifier:s,isStyle:P(s),type:"static"}}}if(r==="Chain"&&t.head?.value==="require"){let n=t.tails?.[0];if(n?.constructor?.name==="Call"||n?.type==="Call"){let s=n.args?.[0]?.value;if(typeof s=="string"){let o=O(s);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:P(o),type:"require"}}}}return null}function ir(t,e,r){if(!t||typeof t!="object")return[];let n=[],s=Xa(t,e);s&&n.push(s),r.push(...qa(t));for(let o in t){if(Ya.has(o))continue;let i=t[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...ir(a,e,r));else n.push(...ir(i,e,r))}return n}function Un(t,e){let r=ee(e),n=te(t,r),s=[],o=[];try{s=ir(Va.ast(e),t,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(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}import Za from"luaparse";function ec(t,e){let r=[];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=O(i.raw))}else if(s.type==="StringCallExpression"){let i=s.argument;i?.type==="StringLiteral"&&(o=O(i.raw))}o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:P(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(t),r}function tc(t){let e=new Set;for(let r of t)r.type==="LocalStatement"&&r.variables.forEach((n,s)=>{r.init[s]?.type==="TableConstructorExpression"&&e.add(n.name)});return e}function rc(t){let e=t[t.length-1];if(e?.type!=="ReturnStatement")return[];let r=e.arguments[0];if(r?.type!=="TableConstructorExpression")return[];let n=[];for(let s of r.fields)s.type==="TableKeyString"&&n.push({name:s.key.name});return n}function nc(t){let e=t.body,r=tc(e),n=rc(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&r.has(o.identifier.base.name)&&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"&&r.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 Hn(t,e){let r=ee(e),n=te(t,r),s=[],o=[];try{let i=Za.parse(e);s=ec(i,t),o=nc(i)}catch{}return{imports:s,exports:o,tags:Array.from(r).map(i=>({name:i,kind:"comment-marker"})),category:n}}var sc=["http://","https://","mailto:","//"],oc="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",ic=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${oc})\\b`,"g"),Kn;async function ac(){return Kn??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),Kn}function cc(t){let e=t.trim();return e.length===0||e.startsWith("#")||sc.some(r=>e.startsWith(r))}function lc(t,e){let r=t.match(ic);return r?r.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function Jn(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!cc(t.url)&&r.push({fromPath:e,toPath:"",rawSpecifier:t.url,isStyle:!1,type:"static"}),(t.type==="code"||t.type==="inlineCode")&&typeof t.value=="string"&&r.push(...lc(t.value,e)),Array.isArray(t.children))for(let n of t.children)Jn(n,e,r)}async function Vn(t,e){let n=(await ac()).parse(e),s=[];Jn(n,t,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 dc from"path";import{parser as hc}from"@lezer/python";function pc(t){let e=1;function r(n){switch(n.type.name){case"IfStatement":{e+=H(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=H(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;)r(s),s=s.nextSibling}return r(t),e}function uc(t,e){let r=0,n=H(t),s=0,o=0;for(;o<n.length;){let i=n[o];if(i?.type.name==="if"||i?.type.name==="elif"){let a=s>0;r+=a?1:1+e;let c=a?e:e+1,l=n[o+1],p=n[o+2];l&&(r+=R(l,c)),p&&(r+=R(p,c)),s++,o+=3}else if(i?.type.name==="else"){r+=1;let a=n[o+1];a&&(r+=R(a,e+1)),o+=2}else o++}return r}function fc(t,e){let r=0,n=H(t),s=0;for(;s<n.length;){let o=n[s];if(o?.type.name==="except"){for(r+=1+e,s++;s<n.length&&n[s]?.type.name!=="Body";)r+=R(n[s],e),s++;s<n.length&&(r+=R(n[s],e),s++)}else o?.type.name==="Body"&&(r+=R(o,e)),s++}return r}function Qn(t,e){let r=1+e,n=t.firstChild;for(;n;)r+=R(n,e+1),n=n.nextSibling;return r}function mc(t,e){let r=0,n=t.firstChild;for(;n;)r+=R(n,e),n=n.nextSibling;return r}function R(t,e){let r=t.type.name;if(r==="IfStatement")return uc(t,e);if(r==="TryStatement")return fc(t,e);if(r==="ForStatement"||r==="WhileStatement")return Qn(t,e);let n=r==="ConditionalExpression"||r==="and"||r==="or"?1:0;return e>0&&(r==="FunctionDefinition"||r==="LambdaExpression")?n+Qn(t,e):n+mc(t,e)}function gc(t){return R(t,0)}function ar(t){return{complexity:pc(t),cognitiveComplexity:gc(t)}}function qn(t,e){let r=[];function n(i,a){let{complexity:c,cognitiveComplexity:l}=ar(i);r.push({name:a,line:xe(e,i.from),complexity:c,cognitiveComplexity:l})}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,l=i.getChild("Body");if(l){let p=l.firstChild;for(;p;){if(p.type.name==="FunctionDefinition"){let m=p.getChild("VariableName"),d=m?e.slice(m.from,m.to):void 0;d&&n(p,c?`${c}.${d}`:d),s(p)}else o(p);p=p.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(t.topNode),r}var yc=new Set(["pytest","unittest","nose","hypothesis"]);function Yn(t,e){let r=[],n=[],s=new Set,o=dc.basename(t).toLowerCase(),i=hc.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 xc(a.node,e,t))r.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let v=a.node.getChild("VariableName");v&&n.push({name:e.slice(v.from,v.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=wc(o,r,s);c==="test"&&s.add("test");let{complexity:l,cognitiveComplexity:p}=ar(i.topNode),m=qn(i,e),d=c==="test"?[]:vc(i,e);return{imports:r,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:l,cognitiveComplexity:p,...m.length>0?{functions:m}:{}}}function xc(t,e,r){let n=t.firstChild;return n?n.name==="from"?bc(t,e,r):Sc(t,e,r):[]}function bc(t,e,r){let n=t.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=kc(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[be(r,o,i,!0)];let l=a===1?"./":"../".repeat(a-1);return c?[be(r,l+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[be(r,l.slice(0,-1),["*"],!1)]:i.map(p=>be(r,l+p,[p],!1))}function Sc(t,e,r){let n=[],s=t.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(be(r,o,["*"],!0))}s=s.nextSibling}return n}function kc(t,e){let r=[],n=t;for(;n;)n.name==="*"?r.push("*"):n.name==="VariableName"&&(r.push(e.slice(n.from,n.to)),n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling)),n=n.nextSibling;return r}function Cc(t,e){let r=new Map,n=t.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 l=a.slice(c),p=c<=1?"./":"../".repeat(c-1),m=i.nextSibling;for(;m;){if(m.type.name==="VariableName"){let d=e.slice(m.from,m.to),h=d;if(m.nextSibling?.type.name==="as"){let v=m.nextSibling.nextSibling;v?.type.name==="VariableName"&&(h=e.slice(v.from,v.to),m=v)}let C=c===0?a:l?p+l.replace(/\./g,"/"):p+d;r.set(h,C)}m=m.nextSibling}}while(n.next());return r}function vc(t,e){let r=Cc(t,e),n=[];function s(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let p=a.firstChild,m=e.slice(p.from,p.to),d=r.get(m);d&&n.push({from:c,to:m,toSpecifier:d})}let l=a.firstChild;for(;l;)s(l,c),l=l.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"),l=c?e.slice(c.from,c.to):void 0,p=a.getChild("Body");if(p){let m=p.firstChild;for(;m;){if(m.type.name==="FunctionDefinition"){let d=m.getChild("VariableName"),h=d?e.slice(d.from,d.to):void 0;h&&s(m,l?`${l}.${h}`:h)}else i(m);m=m.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(t.topNode),n}function be(t,e,r,n){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:r.length>0?r:void 0}}function wc(t,e,r){return t.startsWith("test_")||t.endsWith("_test.py")?"test":t==="conftest.py"||t==="setup.py"?"config":r.has("test")||e.some(n=>yc.has(n.rawSpecifier))?"test":"logic"}import ts from"path";import g from"typescript";import b from"typescript";function Fc(t){let e=1;function r(n){switch(n.kind){case b.SyntaxKind.IfStatement:case b.SyntaxKind.ConditionalExpression:case b.SyntaxKind.ForStatement:case b.SyntaxKind.ForInStatement:case b.SyntaxKind.ForOfStatement:case b.SyntaxKind.WhileStatement:case b.SyntaxKind.DoStatement:case b.SyntaxKind.CatchClause:case b.SyntaxKind.CaseClause:e++;break;case b.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===b.SyntaxKind.AmpersandAmpersandToken||s===b.SyntaxKind.BarBarToken||s===b.SyntaxKind.QuestionQuestionToken)&&e++;break}}b.forEachChild(n,r)}return r(t),e}function Zn(t,e,r){let n=r?1:1+e,s=r?e:e+1;return n+=J(t.expression,s,!1),n+=J(t.thenStatement,s,!1),t.elseStatement&&(b.isIfStatement(t.elseStatement)?n+=Zn(t.elseStatement,e,!0):n+=1+J(t.elseStatement,e+1,!1)),n}function Xn(t,e){let r=1+e;return b.forEachChild(t,n=>{r+=J(n,e+1,!1)}),r}function Tc(t,e){let r=1+e;return b.forEachChild(t,n=>{r+=J(n,e,!1)}),r}function Ec(t,e){let r=0;return b.forEachChild(t,n=>{r+=J(n,e,!1)}),r}function Ac(t){let e=t.operatorToken.kind;return e===b.SyntaxKind.AmpersandAmpersandToken||e===b.SyntaxKind.BarBarToken||e===b.SyntaxKind.QuestionQuestionToken}function J(t,e,r){if(b.isIfStatement(t))return Zn(t,e,r);if(b.isForStatement(t)||b.isForInStatement(t)||b.isForOfStatement(t)||b.isWhileStatement(t)||b.isDoStatement(t)||b.isSwitchStatement(t))return Xn(t,e);if(b.isCatchClause(t))return Tc(t,e);let n=0;return b.isConditionalExpression(t)&&(n+=1),b.isBinaryExpression(t)&&Ac(t)&&(n+=1),e>0&&(b.isFunctionDeclaration(t)||b.isFunctionExpression(t)||b.isArrowFunction(t))?n+Xn(t,e):n+Ec(t,e)}function Pc(t){return J(t,0,!1)}function cr(t){return{complexity:Fc(t),cognitiveComplexity:Pc(t)}}import w from"typescript";var lr=new Set(["test","describe","it"]);function es(t,e){Nc(t,e),Mc(t,e),Dc(t,e),Rc(t,e)}function Nc(t,e){if((w.isFunctionDeclaration(t)||w.isVariableDeclaration(t))&&t.name&&w.isIdentifier(t.name)&&Ic(t)){let r;if(w.isFunctionDeclaration(t))r="function";else{let n=t.initializer;r=n&&(w.isArrowFunction(n)||w.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function Ic(t){if(w.isFunctionDeclaration(t))return w.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&w.isSourceFile(e.parent)}function Mc(t,e){if(!w.isStringLiteral(t))return;let r=t.text.match(/@[\w-]+/g);if(r)for(let n of r)e.tags.add({name:n.substring(1),kind:"comment-marker"})}function Dc(t,e){if(!w.isSourceFile(t))return;let r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=t.getFullText(),s=r.exec(n);for(;s!==null;)s[1]&&e.tags.add({name:s[1],kind:"comment-marker"}),s=r.exec(n)}function Rc(t,e){if(w.isCallExpression(t)&&Lc(t.expression))for(let r of t.arguments)w.isObjectLiteralExpression(r)&&Gc(r,e)}function Lc(t){return w.isIdentifier(t)?lr.has(t.text):!!(w.isPropertyAccessExpression(t)&&(lr.has(t.name.text)||w.isIdentifier(t.expression)&&lr.has(t.expression.text)))}function Gc(t,e){for(let r of t.properties){if(!w.isPropertyAssignment(r)||!w.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:n}=r,s=w.isArrayLiteralExpression(n)?n.elements.filter(w.isStringLiteral):r.name.text==="tag"&&w.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function pr(t,e,r){let n=[],s=new Map,o=new Set,i=g.createSourceFile(t,e,g.ScriptTarget.Latest,!0,r==="typescript"?g.ScriptKind.TSX:g.ScriptKind.JSX),a={filePath:t,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=v=>{zc(v,a),g.forEachChild(v,c)};c(i);let l=Yc(t,a);(l==="test"||l==="barrel")&&o.add({name:l,kind:"comment-marker"}),l!=="test"&&Xc(a,i);let p=i.statements[0],m=p?ns(p):void 0,{complexity:d,cognitiveComplexity:h}=cr(i),C=_c(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:l,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...C.length>0?{functions:C}:{},...m!==void 0?{description:m}:{}}}function _c(t){let e=[],r=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=cr(o),c=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(g.isFunctionDeclaration(s)&&s.name&&s.body?r(s.name.text,s):g.isVariableDeclaration(s)&&g.isIdentifier(s.name)&&s.initializer&&(g.isArrowFunction(s.initializer)||g.isFunctionExpression(s.initializer))?r(s.name.text,s.initializer):o&&g.isMethodDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${o}.${s.name.text}`,s):o&&g.isConstructorDeclaration(s)&&s.body?r(`${o}.constructor`,s):o&&g.isGetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${o}.get ${s.name.text}`,s):o&&g.isSetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body&&r(`${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(t,void 0),e}function rs(t,e,r,n){let s={name:t},o=ns(r);o!==void 0&&(s.doc=o);let i=Oc(e);i!==void 0&&(s.flags=i);let a=jc(e,n);return a!==void 0&&(s.signature=a),s}function ns(t){let e=g.getJSDocCommentsAndTags(t);for(let r of e)if(g.isJSDoc(r)&&r.comment)return g.getTextOfJSDocComment(r.comment)||void 0}function Oc(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=g.getJSDocTags(t).map(n=>n.tagName.text).filter(n=>e.has(n));return r.length>0?r:void 0}function jc(t,e){let r=g.createPrinter({removeComments:!0}),n=s=>r.printNode(g.EmitHint.Unspecified,s,e);if(g.isFunctionDeclaration(t)||g.isMethodDeclaration(t)){let s=t.parameters.map(n).join(", "),o=t.type?n(t.type):"void";return`${t.typeParameters?`<${t.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${s}) => ${o}`}if(g.isVariableDeclaration(t)){if(t.type)return n(t.type);if(t.initializer&&(g.isArrowFunction(t.initializer)||g.isFunctionExpression(t.initializer))){let s=t.initializer,o=s.parameters.map(n).join(", "),i=s.type?n(s.type):"unknown";return`(${o}) => ${i}`}return}if(g.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(g.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(g.isTypeAliasDeclaration(t))return n(t.type);if(g.isEnumDeclaration(t))return`enum ${t.name.text}`}function zc(t,e){Wc(t,e),Bc(t,e),Uc(t,e),Hc(t,e),qc(t,e),es(t,e)}function Wc(t,e){if(!g.isSourceFile(t))return;let r=t.statements.filter(n=>!g.isEmptyStatement(n));e.totalStatements=r.length,e.exportStatements=r.filter(n=>g.isExportDeclaration(n)||g.isExportAssignment(n)||ur(n)).length}function Bc(t,e){if(g.isJsxElement(t)||g.isJsxSelfClosingElement(t)||g.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(g.isFunctionDeclaration(t)||g.isMethodDeclaration(t)||g.isArrowFunction(t)||g.isClassDeclaration(t)||g.isVariableStatement(t)||g.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}g.isExportDeclaration(t)&&!$c(t)&&(e.hasTypesOnly=!1)}function $c(t){return t.isTypeOnly?!0:!t.exportClause||!g.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Uc(t,e){if(!g.isImportDeclaration(t)||!t.moduleSpecifier||!g.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(g.isNamedImports(t.importClause.namedBindings))for(let s of t.importClause.namedBindings.elements)r.push(s.name.text);else g.isNamespaceImport(t.importClause.namedBindings)&&r.push("*");let n=r.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.moduleSpecifier.text,isStyle:P(t.moduleSpecifier.text),type:n,symbols:r.length>0?r:void 0})}function Hc(t,e){g.isExportDeclaration(t)?Kc(t,e):g.isExportAssignment(t)?e.exports.set("default",{name:"default"}):ur(t)&&Qc(t,e)}function Kc(t,e){if(t.moduleSpecifier&&g.isStringLiteral(t.moduleSpecifier))Jc(t,t.moduleSpecifier.text,e);else if(t.exportClause&&g.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let n=r.name.text;e.exports.set(n,{name:n})}}function Jc(t,e,r){let n=Vc(t),s={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:P(e),type:"re-export"};n.length>0&&(s.symbols=n),r.imports.push(s)}function Vc(t){return t.exportClause?g.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Qc(t,e){if((g.isFunctionDeclaration(t)||g.isClassDeclaration(t)||g.isInterfaceDeclaration(t)||g.isTypeAliasDeclaration(t)||g.isEnumDeclaration(t))&&t.name){let n=t.name.text;e.exports.set(n,rs(n,t,t,e.sourceFile));return}if(g.isVariableStatement(t)){for(let n of t.declarationList.declarations)if(g.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,rs(s,n,t,e.sourceFile))}}}function qc(t,e){if(!g.isCallExpression(t))return;let r=t.arguments[0];!r||!g.isStringLiteral(r)||(t.expression.kind===g.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"dynamic"}):g.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"require"}))}function Yc(t,e){let r=ts.basename(t).toLowerCase(),n=ts.extname(t).toLowerCase();return oe().some(o=>r.includes(o))?"test":wr(r)?"config":e.imports.some(o=>lt().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>ut()?"barrel":"logic"}function ur(t){return g.canHaveModifiers(t)&&g.getModifiers(t)?.some(e=>e.kind===g.SyntaxKind.ExportKeyword)===!0}function Xc(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;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=el(s);if(o){let i=tl(s);i&&st(i,o,n,r);continue}g.isClassDeclaration(s)&&s.name&&Zc(s,s.name.text,n,r)}}function Zc(t,e,r,n){for(let s of t.members)g.isMethodDeclaration(s)&&s.body&&g.isIdentifier(s.name)?st(s.body,`${e}.${s.name.text}`,r,n):g.isConstructorDeclaration(s)&&s.body&&st(s.body,`${e}.constructor`,r,n)}function el(t){if(ur(t)){if(g.isFunctionDeclaration(t)&&t.name)return t.name.text;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(g.isIdentifier(e.name)&&e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.name.text}}}function tl(t){if(g.isFunctionDeclaration(t))return t.body;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.initializer}}function st(t,e,r,n){if(g.isCallExpression(t)&&g.isIdentifier(t.expression)){let s=t.expression.text,o=r.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(t,s=>st(s,e,r,n))}function ot(t,e){if(e.length===0)return"ui";let r=!1;return t.walk(n=>{if(n.type==="rule")return r=!0,!1}),r?"ui":"barrel"}function ss(t,e){let r=[],n=/@require\s+['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let i=s[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"require"}),s=n.exec(t)}let o=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(s=o.exec(t);s!==null;){let i=s[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),s=o.exec(t)}return r}function os(t,e){if(e.length===0)return"ui";try{let r=ct("stylus");return new r.Parser(t).parse().nodes.some(o=>o.constructor.name!=="Import")?"ui":"barrel"}catch{return t.replace(/^\s*@?(?:require|import)\b.*/gm,"").trim().length>0?"ui":"barrel"}}function Se(t,e){let r=_(t);if(r==="stylus"){let o=ss(e,t);return{imports:o,exports:[],tags:[],category:os(e,o)}}if(r==="scss"){let{imports:o,root:i,exports:a,tags:c}=_e(e,t);return{imports:o,exports:a,tags:c,category:ot(i,o)}}if(r==="less"){let{imports:o,root:i,exports:a,tags:c}=Ge(e,t);return{imports:o,exports:a,tags:c,category:ot(i,o)}}let{imports:n,root:s}=Le(e,t);return{imports:n,exports:[],tags:[],category:ot(s,n)}}for(let[t,e]of[["javascript",(r,n)=>pr(r,n,"javascript")],["typescript",(r,n)=>pr(r,n,"typescript")],["css",Se],["scss",Se],["less",Se],["stylus",Se],["coffeescript",On],["livescript",Un],["lua",Hn],["python",Yn],["go",$n],["gherkin",sr],["markdown",Vn]])Z(t,e);async function is(t,e){let r=_(t),n=Sn(r);return n?n(t,e):{imports:[],exports:[],tags:[],category:"other"}}import as from"path";function rl(t,e){let r=e.get(t.path);r!==void 0&&(t.coveragePct=r)}function ls(t,e){for(let r of t)if(r.isExternal){let n=r.rawSpecifier.startsWith("@")?r.rawSpecifier.split("/").slice(0,2).join("/"):r.rawSpecifier.split("/")[0];n&&!e.some(s=>s.name===n)&&e.push({name:n,kind:"library"})}}function nl(t,e,r){if(e.isExternal||!e.toPath)return;let n=r.get(e.toPath);n&&(n.category!=="logic"&&n.category!=="barrel"||(n.testedBy??=[],n.testedBy.includes(t.path)||n.testedBy.push(t.path)))}function sl(t,e){if(t.type==="markdown")for(let r of t.imports){if(r.isExternal||!r.toPath)continue;let n=e.get(r.toPath);!n||n===t||(n.documentedBy??=[],n.documentedBy.includes(t.path)||n.documentedBy.push(t.path),n.category==="logic"&&(n.lastCommitAt??0)>(t.lastCommitAt??0)&&(t.staleFor??=[],t.staleFor.includes(n.path)||t.staleFor.push(n.path)))}}function cs(t){return Math.round(t*1e4)/1e4}function ol(t,e){let r=[];for(let n of t.imports){if(n.isExternal||!n.toPath)continue;let s=e.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=cs(Math.min(1,o)),r.push(n.exportUsageRatio)}r.length>0&&(t.avgExportUsage=cs(r.reduce((n,s)=>n+s,0)/r.length),t.maxExportUsage=Math.max(...r))}function fr(t,e,r){e&&(t.some(n=>n.name===e&&n.kind===r)||t.push({name:e,kind:r}))}function il(t,e){let r=e.toPath,n=as.basename(r,as.extname(r)).replace(/\.(test|spec)$/,"");fr(t.tags,n,"import")}function al(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)fr(t.tags,r,"import")}function cl(t,e,r){let n=r.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&fr(t.tags,s.name,"comment-marker")}function ll(t,e,r){!e.toPath||e.isExternal||(il(t,e),al(t,e),cl(t,e,r))}function ps(t,e){for(let r of t.values())delete r.testedBy,delete r.documentedBy,delete r.staleFor,r.category==="test"&&(r.tags=r.tags.filter(n=>n.kind!=="import"));for(let r of t.values()){if(ol(r,t),e.size>0&&rl(r,e),r.category==="test")for(let n of r.imports)nl(r,n,t),ll(r,n,t);sl(r,t)}}import it from"fs";import L from"path";import ms from"fs";import ne from"path";var ke=class{extensions=[".go"];goModCache=new Map;resolve(e,r,n,s){let{mod:o,replaces:i}=this.readGoMod(n);if(!o)return null;let a=this.applyReplace(r,i,n);if(a!==void 0)return fs(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let c=r.slice(o.length).replace(/^\//,"");return c?fs(ne.join(n,c)):null}readGoMod(e){let r=this.goModCache.get(e);if(r!==void 0)return r;let n={mod:null,replaces:new Map};try{let s=ms.readFileSync(ne.join(e,"go.mod"),"utf-8"),o=pl(s,e);return this.goModCache.set(e,o),o}catch{return this.goModCache.set(e,n),n}}applyReplace(e,r,n){for(let[s,o]of r){if(e===s)return o;if(e.startsWith(`${s}/`)){let i=e.slice(s.length+1);return ne.join(o,i)}}}};function pl(t,e){let r=t.split(`
31
- `),n=null,s=new Map,o=!1;for(let i of r){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("=>")){us(a,e,s);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&us(a.replace(/^replace\s+/,""),e,s)}return{mod:n,replaces:s}}function us(t,e,r){let[n,s]=t.split("=>").map(a=>a.trim());if(!n||!s)return;let o=n.split(/\s+/)[0];if(!s.startsWith(".")&&!s.startsWith("/"))return;let i=ne.isAbsolute(s)?s:ne.resolve(e,s);r.set(o,i)}function fs(t){let e;try{e=ms.readdirSync(t,{withFileTypes:!0})}catch{return null}let r=e.filter(n=>n.isFile()&&n.name.endsWith(".go")&&!n.name.endsWith("_test.go")).map(n=>({path:ne.join(t,n.name),isExternal:!1})).sort((n,s)=>n.path.localeCompare(s.path));return r.length>0?r:null}import ul from"fs";import mr from"path";var Ce=class{extensions=[".lua"];resolve(e,r,n,s){let o=r.replace(/\./g,mr.sep),i=[n,mr.join(n,"lib")];for(let a of i){if(!ul.existsSync(a))continue;let c=s(mr.join(a,"_dummy.lua"),o);if(c)return[c]}return null}};import fl from"path";var ve=class{extensions=[".md",".mdx"];resolve(e,r,n,s){let o=s(fl.join(n,"_dummy"),`./${r}`);return o?[o]:null}};import ml from"fs";import gr from"path";var we=class{extensions=[".py"];resolve(e,r,n,s){let o=r.replace(/\./g,gr.sep),i=gr.join(n,`${o}.py`);if(gs(i))return[{path:i,isExternal:!1}];let a=gr.join(n,o,"__init__.py");return gs(a)?[{path:a,isExternal:!1}]:null}};function gs(t){try{return ml.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import ds from"path";var gl=["~","http://","https://","//","data:","sass:"],Fe=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,n,s){if(gl.some(p=>r.startsWith(p)))return null;let o=s(e,r);if(o)return[o];let i=ds.dirname(r),a=ds.basename(r),c=i==="."?`_${a}`:`${i}/_${a}`,l=s(e,c);return l?[l]:null}};var V=class{constructor(e,r={}){this.rootDir=e;this.workspaceMap=r.workspaceMap??new Map,this.tsconfigSearchPaths=r.tsconfigSearchPaths??[e],this.pathAliases=r.pathAliases,this.langResolvers=r.langResolvers??[new we,new Ce,new ke,new Fe,new ve]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;langResolvers;resolutionCache=new Map;langBucketFor(e){for(let r=0;r<this.langResolvers.length;r++)if(this.langResolvers[r]?.extensions.some(n=>e.endsWith(n)))return String(r);return"none"}cacheKey(e,r){return`${L.dirname(e)}\0${this.langBucketFor(e)}\0${r}`}resolveAll(e,r){let n=this.cacheKey(e,r),s=this.resolutionCache.get(n);if(s!==void 0)return s??[];let o=this.resolveAllUncached(e,r);return this.resolutionCache.set(n,o.length>0?o:null),o}resolveAllUncached(e,r){let n=this.resolvePathAlias(r);if(n)return[n];if(r.startsWith(".")||r.startsWith("/")){let i=this.resolveLocalPath(e,r);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,r,this.rootDir,s);if(a)return a}let o=this.resolveWorkspaceImport(r);return o?[o]:[{path:r,isExternal:!0}]}resolve(e,r){return this.resolveAll(e,r)[0]??null}resolveLocalPath(e,r){let n=L.dirname(e),s=r.startsWith("/")?r:L.resolve(n,r),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 l of[".ts",".tsx"]){let p=this.tryExtensions(c,l,o);if(p)return p}}for(let c of i){let l=this.tryExtensions(s,c,o);if(l)return l}return o?{path:s,isExternal:!0}:null}tryExtensions(e,r,n){let s=e+r;if(this.isFile(s))return{path:s,isExternal:n};let o=L.join(e,`index${r}`);if(this.isFile(o))return{path:o,isExternal:n};if(r===".py"){let i=L.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:n}}return null}isFile(e){try{return it.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let r in this.pathAliases){let n=this.matchAliasPattern(r,e),s=this.pathAliases[r];if(n&&s){let o=this.tryAliasSubstitutions(s,n[1]||"");if(o)return o}}for(let r of this.tsconfigSearchPaths){let n=L.join(r,"tsconfig.json");if(it.existsSync(n))try{let o=JSON.parse(it.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]||"",r);if(c)return c}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,r){let n=this.aliasRegexCache.get(e);if(!n){let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace("\\*","(.*)");n=new RegExp(`^${s}$`),this.aliasRegexCache.set(e,n)}return r.match(n)}tryAliasSubstitutions(e,r,n=this.rootDir){let s=["",".ts",".tsx",".js",".jsx",".coffee",".ls",".lua",".feature"];for(let o of e){let i=o.replace("*",r),a=L.resolve(n,i);for(let c of s){let l=this.tryExtensions(a,c,!1);if(l)return l}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[r,n]of this.workspaceMap){if(e!==r&&!e.startsWith(`${r}/`))continue;let s=e.slice(r.length),o={path:"",isExternal:!1,isWorkspace:!0,workspacePackage:r};if(!s){for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"]){let c=L.join(n,a);try{if(it.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...o,path:c}}catch{}}return{...o,path:n}}let i=this.resolveLocalPath(L.join(n,"_dummy"),s.slice(1));return i?{...o,path:i.path}:null}return null}};var hl=["tests","test","__tests__","specs","spec"],hs=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),yl=600;function xl(t,e){if(t.length===0)return e;let r=t.map(i=>E.dirname(i).split(E.sep)),n=r[0]??[];for(let i of r.slice(1)){let a=0;for(;a<n.length&&a<i.length&&n[a]===i[a];)a++;n=n.slice(0,a)}let s=n.join(E.sep)||E.sep,o=E.relative(e,s);return o.startsWith("..")||E.isAbsolute(o)?e:s}var Ee=class{constructor(e,r=null,n,s,o=!1,i=new Map,a=!0){this.rootDir=e;this.enableGitStats=o;this.coverageMap=i;this.parallelParsing=a;this.previousGraph=r,this.resolver=n||new V(e),this.lockFile=_r(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 r=e.map(n=>E.isAbsolute(n)?n:E.resolve(this.rootDir,n));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=Rn(this.rootDir));try{for(let n of r)this.enqueue(n);return await this.drain(),await this.processTestFiles(xl(r,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
25
+ `;return`${l+d+u+o}
26
+ ${p}`}};function ka(t){let e=t.split(`
27
+ `),r=-1;return e.forEach((s,i)=>{(s.trimStart().startsWith("import ")||s.trimStart().startsWith("from "))&&(r=i)}),r<0?0:e.slice(0,r+1).reduce((s,i)=>s+i.length+1,0)}import En from"path";import An from"typescript";var Ca=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,et=class{name="vitest";canHandle(e){return M.has(En.extname(e).toLowerCase())}apply(e,r,n){let s=r.replace(Ca,""),i=An.createSourceFile(En.basename(e),s,An.ScriptTarget.Latest,!0),o=Jt(i),[a]=o;if(!a)return s;let c=Vt(a,"tags",i),l=[...n].sort();if(c!==null&&JSON.stringify([...c].sort())===JSON.stringify(l))return s;let p=o.flatMap(u=>{let d=n.length===0?qt(u,"tags",i):Qt(u,"tags",Xt(l),i);return d?[d]:[]});return p.length>0?Yt(s,p):s}};var Pn={vitest:()=>new et,playwright:()=>new Xe,cypress:()=>new Ve,jest:()=>new Ye},va={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function wa(t){let e=tt.createSourceFile("detect.ts",t,tt.ScriptTarget.Latest,!0);for(let r of e.statements){if(!tt.isImportDeclaration(r)||!tt.isStringLiteral(r.moduleSpecifier))continue;let n=va[r.moduleSpecifier.text];if(n)return n}return null}var ir=class{constructor(e,r,n){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=n}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return M.has(sr.extname(e).toLowerCase())}apply(e,r,n){let s=wa(r)??this.matchOverride(e)??this.defaultFramework;return(Pn[s]??Pn.vitest)().apply(e,r,n)}matchOverride(e){let r=sr.relative(this.rootDir,e).split(sr.sep).join("/");for(let[n,s]of this.frameworkOverrides)if(Tn(n,r))return s;return null}};function Nn(t="vitest",e={},r=process.cwd()){return[new Qe,new Ze,new qe,new ir(r,t,Object.entries(e))]}function In(t,e){return e.find(r=>r.canHandle(t))??null}var Ta=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Ea=new Set(["import"]),Aa=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function Pa(t,e,r,n){let s;try{s=await Dn.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let i=In(t,n);if(!i)return{path:t,status:"unchanged"};let o=i.apply(t,s,e);return o===s?{path:t,status:"unchanged"}:(r||await Dn.writeFile(t,o,"utf8"),{path:t,status:"updated"})}async function or(t,e,r){let n=oe(e),s=n.tagApplier?.framework??"vitest",i=n.tagApplier?.frameworkOverrides??{},o=Nn(s,i,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let c of t.nodes.values()){if(c.category!=="test")continue;let l=new Set,p=[];for(let h of c.tags)Ea.has(h.kind)&&Ta.test(h.name)&&(Aa.has(h.name.toLowerCase())||l.has(h.name)||(l.add(h.name),p.push(h.name)));p.sort();let u=Fa.resolve(e,c.path),d=await Pa(u,p,r.dryRun,o);d.path=c.path,a.files.push(d),d.status==="updated"?a.updated++:d.status==="unchanged"?a.unchanged++:a.errors++}return a}var rt=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};import Te from"fs";import E from"path";import yl from"piscina";import{execFileSync as ar}from"child_process";var nt=class{getChangedFiles(e,r){try{let s=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"],...r?[["diff","--name-only","--end-of-options",`${r}...HEAD`]]:[]].flatMap(i=>{try{return ar("git",i,{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).split(`
28
+ `).map(a=>a.trim()).filter(a=>a!=="")}catch{return[]}});return Array.from(new Set(s))}catch(n){return console.error("Error getting git diff:",n),[]}}},Mn="%x00%H%x09%ae%x09%at",Rn=256*1024*1024;function Ln(t,e){let r="",n=0;for(let s of t.split(`
29
+ `)){if(s.startsWith("\0")){let[,c,l]=s.slice(1).split(" ");r=c??"",n=l?Number(l)*1e3:0;continue}if(s==="")continue;let i=s.split(" "),o=i[0];if(!o)continue;let a=o.startsWith("R")||o.startsWith("C")?i[2]:i[1];a&&e(a,r,n)}}function Gn(t){let e=new Map;try{let r=ar("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${Mn}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Rn});Ln(r,(n,s,i)=>{let o=e.get(n);if(o){o.commitCount90d+=1;return}e.set(n,{commitCount90d:1,lastAuthor:s||void 0,lastCommitAt:i||void 0})})}catch{return e}try{let r=ar("git",["-C",t,"log","--name-status","-M",`--format=${Mn}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:Rn});Ln(r,(n,s,i)=>{e.has(n)||e.set(n,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:i||void 0})})}catch{}return e}import _n from"path";function _(t){switch(_n.extname(t).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function P(t){let e=_n.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import Na from"coffeescript";function O(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function ee(t){let e=new Set,r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=r.exec(t);for(;n!==null;)n[1]&&e.add(n[1]),n=r.exec(t);return e}function te(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function jn(t){if(t){if(typeof t.originalValue=="string")return t.originalValue;if(typeof t.value=="string")return O(t.value)}}function U(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ia(t,e){let r=jn(e.source);return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:P(r),type:"static"}:null}function Da(t,e){let r=e.variable?.base?.value==="require",n=jn(e.args?.[0]?.base);return!r||!n?null:{fromPath:t,toPath:"",rawSpecifier:n,isStyle:P(n),type:"require"}}function On(t,e){if(e)return[{name:e}];let r=t.value;if(r?.constructor?.name==="Class"){let s=U(r.variable);return s?[{name:s}]:[]}if(r?.base?.constructor?.name==="Obj"&&Array.isArray(r.base.properties))return r.base.properties.map(s=>U(s.variable)??U(s)).filter(s=>!!s).map(s=>({name:s}));let n=U(r);return n?[{name:n}]:[]}function Ma(t){if(Array.isArray(t.specifiers))return t.specifiers.map(r=>r.identifier??r.original?.value).filter(r=>!!r).map(r=>({name:r}));let e=U(t.variable)??U(t.variable?.base);return e?[{name:e}]:[]}function Ra(t,e,r,n){let s=e.constructor?.name;if(s==="ImportDeclaration"){let i=Ia(t,e);i&&r.push(i)}else if(s==="Call"){let i=Da(t,e);i&&r.push(i)}else if(s==="Assign"){let i=U(e.variable?.base),o=e.variable?.properties?.[0]?.name?.value;i==="module"&&o==="exports"?n.push(...On(e,void 0)):i==="exports"&&typeof o=="string"&&n.push(...On(e,o))}else s==="ExportNamedDeclaration"&&e.clause?n.push(...Ma(e.clause)):s==="ExportDefaultDeclaration"&&n.push({name:"default"})}function cr(t,e,r,n){if(!(!e||typeof e!="object")){Ra(t,e,r,n);for(let s in e){if(s==="locationData")continue;let i=e[s];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let o of i)cr(t,o,r,n);else cr(t,i,r,n)}}}function zn(t,e){let r=ee(e),n=te(t,r),s=[],i=[];try{cr(t,Na.nodes(e),s,i)}catch{}let o=new Set,a=i.filter(c=>o.has(c.name)?!1:(o.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}import{AstBuilder as La,GherkinClassicTokenMatcher as Ga,Parser as _a}from"@cucumber/gherkin";import{IdGenerator as Oa}from"@cucumber/messages";var ja=Oa.uuid();function lr(t,e){let r=new Set;try{let n=new La(ja),s=new Ga,o=new _a(n,s).parse(e);o.feature&&(o.feature.tags.forEach(a=>{r.add(a.name.startsWith("@")?a.name.slice(1):a.name)}),o.feature.children.forEach(a=>{a.scenario&&(a.scenario.tags.forEach(c=>{r.add(c.name.startsWith("@")?c.name.slice(1):c.name)}),a.scenario.examples.forEach(c=>{c.tags.forEach(l=>{r.add(l.name.startsWith("@")?l.name.slice(1):l.name)})})),a.rule&&a.rule.children.forEach(c=>{c.scenario&&c.scenario.tags.forEach(l=>{r.add(l.name.startsWith("@")?l.name.slice(1):l.name)})})}))}catch(n){console.warn(`[GherkinParser] Failed to parse ${t}:`,n)}return{imports:[],exports:[],tags:Array.from(r).map(n=>({name:n,kind:"comment-marker"})),category:"test"}}Z("gherkin",lr);import Ua from"path";import{parser as Ha}from"@lezer/go";function H(t){let e=[],r=t.firstChild;for(;r;)e.push(r),r=r.nextSibling;return e}function xe(t,e){let r=1;for(let n=0;n<e&&n<t.length;n++)t[n]===`
30
+ `&&r++;return r}function za(t,e){let r=1;function n(s){switch(s.type.name){case"IfStatement":case"ForStatement":r++;break;case"Case":{s.firstChild?.type.name==="case"&&r++;break}case"LogicOp":{let o=e.slice(s.from,s.to);(o==="&&"||o==="||")&&r++;break}}let i=s.firstChild;for(;i;)n(i),i=i.nextSibling}return n(t),r}function Bn(t,e,r,n){let s=r?1:1+e,i=H(t),o=r?e:e+1,a=i[1];a&&a.type.name!=="Block"&&(s+=re(a,o,!1,n));let c=i.find(p=>p.type.name==="Block");c&&(s+=re(c,o,!1,n));let l=i.findIndex(p=>p.type.name==="else");if(l>=0){let p=i[l+1];p?.type.name==="IfStatement"?s+=Bn(p,e,!0,n):p&&(s+=1+re(p,e+1,!1,n))}return s}function Wn(t,e,r){let n=1+e,s=t.firstChild;for(;s;)n+=re(s,e+1,!1,r),s=s.nextSibling;return n}function Wa(t,e,r){let n=0,s=t.firstChild;for(;s;)n+=re(s,e,!1,r),s=s.nextSibling;return n}function Ba(t,e){let r=e.slice(t.from,t.to);return r==="&&"||r==="||"}function re(t,e,r,n){let s=t.type.name;if(s==="IfStatement")return Bn(t,e,r,n);if(s==="ForStatement"||s==="SwitchStatement"||s==="SelectStatement")return Wn(t,e,n);let i=s==="LogicOp"&&Ba(t,n)?1:0;return e>0&&s==="FunctionLiteral"?i+Wn(t,e,n):i+Wa(t,e,n)}function $a(t,e){return re(t,0,!1,e)}function st(t,e){return{complexity:za(t,e),cognitiveComplexity:$a(t,e)}}function pr(t,e){let n=t.getChild("Parameters")?.getChild("Parameter"),s=n?.getChild("TypeName")??n?.getChild("PointerType")?.getChild("TypeName");return s?e.slice(s.from,s.to):void 0}function $n(t,e){let r=[],n=t.cursor();do if(n.name==="FunctionDecl"){let s=n.node.getChild("DefName");if(s){let i=e.slice(s.from,s.to),{complexity:o,cognitiveComplexity:a}=st(n.node,e);r.push({name:i,line:xe(e,n.from),complexity:o,cognitiveComplexity:a})}}else if(n.name==="MethodDecl"){let s=n.node.getChild("FieldName");if(s){let i=e.slice(s.from,s.to),o=pr(n.node,e),a=o?`${o}.${i}`:i,{complexity:c,cognitiveComplexity:l}=st(n.node,e);r.push({name:a,line:xe(e,n.from),complexity:c,cognitiveComplexity:l})}}while(n.next());return r}var Ka=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Ja=/^\/\/go:build\s+(.+)$/,Va=/^\/\/\s*\+build\s+(.+)$/;function Hn(t,e){let r=[],n=new Map,s=new Set,i=new Set,o=new Map,a=Ha.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let y=e.slice(c.from,c.to),k=y.match(Ka);k?.[1]&&s.add(k[1]);let D=y.match(Ja);D&&Un(D[1],i);let N=y.match(Va);N&&Un(N[1],i);break}case"ImportSpec":{let y=c.node.getChild("String");if(y){let D=e.slice(y.from,y.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:D,isExternal:!0,isStyle:!1,type:"static"});let N=c.node.getChild("DefName"),j=N?e.slice(N.from,N.to):D.split("/").pop();j&&j!=="_"&&j!=="."&&o.set(j,D)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let y=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(y){let k=e.slice(y.from,y.to);k!=="_"&&/^[A-Z]/.test(k)&&!n.has(k)&&n.set(k,{name:k})}break}}while(c.next());let l=r.some(y=>y.rawSpecifier==="testing"),p=Ua.basename(t).endsWith("_test.go")||s.has("test")||l?"test":"logic",u=new Set([...s,...i]),{complexity:d,cognitiveComplexity:h}=st(a.topNode,e),C=$n(a,e),v=p==="test"?[]:Qa(a,e,o);return{imports:r,exports:Array.from(n.values()),tags:Array.from(u).map(y=>({name:y,kind:"comment-marker"})),category:p,rawCallEdges:v,complexity:d,cognitiveComplexity:h,...C.length>0?{functions:C}:{}}}function Qa(t,e,r){let n=[];function s(o,a){if(o.type.name==="CallExpr"){let l=o.firstChild;if(l?.type.name==="SelectorExpr"){let p=l.firstChild,u=l.getChild("FieldName");if(p?.type.name==="VariableName"&&u){let d=e.slice(p.from,p.to),h=r.get(d);if(h){let C=e.slice(u.from,u.to);n.push({from:a,to:C,toSpecifier:h})}}}}let c=o.firstChild;for(;c;)s(c,a),c=c.nextSibling}let i=t.cursor();do if(i.name==="FunctionDecl"){let o=i.node.getChild("DefName"),a=i.node.getChild("Block");if(o&&a){let c=e.slice(o.from,o.to);/^[A-Z]/.test(c)&&s(a,c)}}else if(i.name==="MethodDecl"){let o=i.node.getChild("FieldName"),a=i.node.getChild("Block");if(o&&a){let c=e.slice(o.from,o.to),l=pr(i.node,e);s(a,l?`${l}.${c}`:c)}}while(i.next());return n}function Un(t,e){for(let r of t.split(/[\s,&|!()]+/)){let n=r.trim();n&&n!=="ignore"&&e.add(n)}}import qa from"livescript";function K(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ya(t){if(!t)return[];if(t.constructor?.name==="Class"){let r=K(t.title);return r?[{name:r}]:[]}if(t.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(r=>K(r.key)??K(r.val)).filter(r=>!!r).map(r=>({name:r}));let e=K(t);return e?[{name:e}]:[]}function Xa(t){let e=t.constructor?.name||t.type;if(e==="Assign"&&t.left?.constructor?.name==="Chain"){let r=t.left,n=K(r.head),i=r.tails?.[0]?.key?.name;if(n==="module"&&i==="exports")return Ya(t.right);if(n==="exports"&&typeof i=="string")return[{name:i}];if(r.head?.verb==="out"&&typeof i=="string")return[{name:i}]}if(e==="Import"&&t.left?.verb==="out"){let r=t.right;if(r?.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(n=>K(n.val)??K(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var Za=new Set(["first_line","first_column","last_line","last_column","line","column"]);function ec(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let n=t.right?.value;if(typeof n=="string"){let s=O(n);return{fromPath:e,toPath:"",rawSpecifier:s,isStyle:P(s),type:"static"}}}if(r==="Chain"&&t.head?.value==="require"){let n=t.tails?.[0];if(n?.constructor?.name==="Call"||n?.type==="Call"){let s=n.args?.[0]?.value;if(typeof s=="string"){let i=O(s);return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:P(i),type:"require"}}}}return null}function ur(t,e,r){if(!t||typeof t!="object")return[];let n=[],s=ec(t,e);s&&n.push(s),r.push(...Xa(t));for(let i in t){if(Za.has(i))continue;let o=t[i];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let a of o)n.push(...ur(a,e,r));else n.push(...ur(o,e,r))}return n}function Kn(t,e){let r=ee(e),n=te(t,r),s=[],i=[];try{s=ur(qa.ast(e),t,i)}catch{}let o=new Set,a=i.filter(c=>o.has(c.name)?!1:(o.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}import tc from"luaparse";function rc(t,e){let r=[];function n(s){if(!(!s||typeof s!="object")){if((s.type==="CallExpression"||s.type==="StringCallExpression")&&s.base?.type==="Identifier"&&s.base?.name==="require"){let i;if(s.type==="CallExpression"){let o=s.arguments?.[0];o?.type==="StringLiteral"&&(i=O(o.raw))}else if(s.type==="StringCallExpression"){let o=s.argument;o?.type==="StringLiteral"&&(i=O(o.raw))}i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:P(i),type:"require"})}for(let i in s){if(i==="loc")continue;let o=s[i];if(o&&typeof o=="object")if(Array.isArray(o))for(let a of o)n(a);else n(o)}}}return n(t),r}function nc(t){let e=new Set;for(let r of t)r.type==="LocalStatement"&&r.variables.forEach((n,s)=>{r.init[s]?.type==="TableConstructorExpression"&&e.add(n.name)});return e}function sc(t){let e=t[t.length-1];if(e?.type!=="ReturnStatement")return[];let r=e.arguments[0];if(r?.type!=="TableConstructorExpression")return[];let n=[];for(let s of r.fields)s.type==="TableKeyString"&&n.push({name:s.key.name});return n}function ic(t){let e=t.body,r=nc(e),n=sc(e);for(let i of e)if(i.type==="FunctionDeclaration")i.identifier?.type==="MemberExpression"?i.identifier.base.type==="Identifier"&&r.has(i.identifier.base.name)&&n.push({name:i.identifier.identifier.name}):i.identifier?.type==="Identifier"&&!i.isLocal&&n.push({name:i.identifier.name});else if(i.type==="AssignmentStatement")for(let o of i.variables)o.type==="MemberExpression"&&o.base.type==="Identifier"&&r.has(o.base.name)&&n.push({name:o.identifier.name});let s=new Set;return n.filter(i=>s.has(i.name)?!1:(s.add(i.name),!0))}function Jn(t,e){let r=ee(e),n=te(t,r),s=[],i=[];try{let o=tc.parse(e);s=rc(o,t),i=ic(o)}catch{}return{imports:s,exports:i,tags:Array.from(r).map(o=>({name:o,kind:"comment-marker"})),category:n}}var oc=["http://","https://","mailto:","//"],ac="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",cc=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${ac})\\b`,"g"),Vn;async function lc(){return Vn??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),Vn}function pc(t){let e=t.trim();return e.length===0||e.startsWith("#")||oc.some(r=>e.startsWith(r))}function uc(t,e){let r=t.match(cc);return r?r.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function Qn(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!pc(t.url)&&r.push({fromPath:e,toPath:"",rawSpecifier:t.url,isStyle:!1,type:"static"}),(t.type==="code"||t.type==="inlineCode")&&typeof t.value=="string"&&r.push(...uc(t.value,e)),Array.isArray(t.children))for(let n of t.children)Qn(n,e,r)}async function qn(t,e){let n=(await lc()).parse(e),s=[];Qn(n,t,s);let i=new Set;return{imports:s.filter(a=>i.has(a.rawSpecifier)?!1:(i.add(a.rawSpecifier),!0)),exports:[],tags:[],category:"other"}}import yc from"path";import{parser as xc}from"@lezer/python";function fc(t){let e=1;function r(n){switch(n.type.name){case"IfStatement":{e+=H(n).filter(i=>i.type.name==="if"||i.type.name==="elif").length;break}case"TryStatement":{e+=H(n).filter(i=>i.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;)r(s),s=s.nextSibling}return r(t),e}function mc(t,e){let r=0,n=H(t),s=0,i=0;for(;i<n.length;){let o=n[i];if(o?.type.name==="if"||o?.type.name==="elif"){let a=s>0;r+=a?1:1+e;let c=a?e:e+1,l=n[i+1],p=n[i+2];l&&(r+=R(l,c)),p&&(r+=R(p,c)),s++,i+=3}else if(o?.type.name==="else"){r+=1;let a=n[i+1];a&&(r+=R(a,e+1)),i+=2}else i++}return r}function gc(t,e){let r=0,n=H(t),s=0;for(;s<n.length;){let i=n[s];if(i?.type.name==="except"){for(r+=1+e,s++;s<n.length&&n[s]?.type.name!=="Body";)r+=R(n[s],e),s++;s<n.length&&(r+=R(n[s],e),s++)}else i?.type.name==="Body"&&(r+=R(i,e)),s++}return r}function Yn(t,e){let r=1+e,n=t.firstChild;for(;n;)r+=R(n,e+1),n=n.nextSibling;return r}function dc(t,e){let r=0,n=t.firstChild;for(;n;)r+=R(n,e),n=n.nextSibling;return r}function R(t,e){let r=t.type.name;if(r==="IfStatement")return mc(t,e);if(r==="TryStatement")return gc(t,e);if(r==="ForStatement"||r==="WhileStatement")return Yn(t,e);let n=r==="ConditionalExpression"||r==="and"||r==="or"?1:0;return e>0&&(r==="FunctionDefinition"||r==="LambdaExpression")?n+Yn(t,e):n+dc(t,e)}function hc(t){return R(t,0)}function fr(t){return{complexity:fc(t),cognitiveComplexity:hc(t)}}function Xn(t,e){let r=[];function n(o,a){let{complexity:c,cognitiveComplexity:l}=fr(o);r.push({name:a,line:xe(e,o.from),complexity:c,cognitiveComplexity:l})}function s(o){let a=o.firstChild;for(;a;)i(a),a=a.nextSibling}function i(o){if(o.type.name==="ClassDefinition"){let a=o.getChild("VariableName"),c=a?e.slice(a.from,a.to):void 0,l=o.getChild("Body");if(l){let p=l.firstChild;for(;p;){if(p.type.name==="FunctionDefinition"){let u=p.getChild("VariableName"),d=u?e.slice(u.from,u.to):void 0;d&&n(p,c?`${c}.${d}`:d),s(p)}else i(p);p=p.nextSibling}}return}if(o.type.name==="FunctionDefinition"){let a=o.getChild("VariableName");a&&n(o,e.slice(a.from,a.to)),s(o);return}s(o)}return i(t.topNode),r}var bc=new Set(["pytest","unittest","nose","hypothesis"]);function Zn(t,e){let r=[],n=[],s=new Set,i=yc.basename(t).toLowerCase(),o=xc.parse(e),a=o.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 Sc(a.node,e,t))r.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let v=a.node.getChild("VariableName");v&&n.push({name:e.slice(v.from,v.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=Tc(i,r,s);c==="test"&&s.add("test");let{complexity:l,cognitiveComplexity:p}=fr(o.topNode),u=Xn(o,e),d=c==="test"?[]:Fc(o,e);return{imports:r,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:l,cognitiveComplexity:p,...u.length>0?{functions:u}:{}}}function Sc(t,e,r){let n=t.firstChild;return n?n.name==="from"?kc(t,e,r):Cc(t,e,r):[]}function kc(t,e,r){let n=t.firstChild;if(!n)return[];let s=n.nextSibling;for(;s&&s.name!=="import";)s=s.nextSibling;if(!s)return[];let i=e.slice(n.to,s.from).trim(),o=vc(s.nextSibling,e);if(!o.length)return[];let a=0;for(;a<i.length&&i[a]===".";)a++;let c=i.slice(a);if(a===0)return[be(r,i,o,!0)];let l=a===1?"./":"../".repeat(a-1);return c?[be(r,l+c.replace(/\./g,"/"),o,!1)]:o[0]==="*"?[be(r,l.slice(0,-1),["*"],!1)]:o.map(p=>be(r,l+p,[p],!1))}function Cc(t,e,r){let n=[],s=t.firstChild?.nextSibling??null;for(;s;){if(s.name==="VariableName"){let i=e.slice(s.from,s.to);for(;s.nextSibling?.name==="."&&s.nextSibling.nextSibling?.name==="VariableName";)s=s.nextSibling.nextSibling,i+=`.${e.slice(s.from,s.to)}`;s.nextSibling?.name==="as"&&(s=s.nextSibling.nextSibling??s.nextSibling),n.push(be(r,i,["*"],!0))}s=s.nextSibling}return n}function vc(t,e){let r=[],n=t;for(;n;)n.name==="*"?r.push("*"):n.name==="VariableName"&&(r.push(e.slice(n.from,n.to)),n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling)),n=n.nextSibling;return r}function wc(t,e){let r=new Map,n=t.cursor();do{if(n.name!=="ImportStatement")continue;let i=n.node.firstChild;if(i?.type.name!=="from")continue;let o=i.nextSibling;for(;o&&o.type.name!=="import";)o=o.nextSibling;if(!o)continue;let a=e.slice(i.to,o.from).trim(),c=0;for(;c<a.length&&a[c]===".";)c++;let l=a.slice(c),p=c<=1?"./":"../".repeat(c-1),u=o.nextSibling;for(;u;){if(u.type.name==="VariableName"){let d=e.slice(u.from,u.to),h=d;if(u.nextSibling?.type.name==="as"){let v=u.nextSibling.nextSibling;v?.type.name==="VariableName"&&(h=e.slice(v.from,v.to),u=v)}let C=c===0?a:l?p+l.replace(/\./g,"/"):p+d;r.set(h,C)}u=u.nextSibling}}while(n.next());return r}function Fc(t,e){let r=wc(t,e),n=[];function s(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let p=a.firstChild,u=e.slice(p.from,p.to),d=r.get(u);d&&n.push({from:c,to:u,toSpecifier:d})}let l=a.firstChild;for(;l;)s(l,c),l=l.nextSibling}function i(a){let c=a.firstChild;for(;c;)o(c),c=c.nextSibling}function o(a){if(a.type.name==="ClassDefinition"){let c=a.getChild("VariableName"),l=c?e.slice(c.from,c.to):void 0,p=a.getChild("Body");if(p){let u=p.firstChild;for(;u;){if(u.type.name==="FunctionDefinition"){let d=u.getChild("VariableName"),h=d?e.slice(d.from,d.to):void 0;h&&s(u,l?`${l}.${h}`:h)}else o(u);u=u.nextSibling}}return}if(a.type.name==="FunctionDefinition"){let c=a.getChild("VariableName");c&&s(a,e.slice(c.from,c.to));return}i(a)}return o(t.topNode),n}function be(t,e,r,n){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:r.length>0?r:void 0}}function Tc(t,e,r){return t.startsWith("test_")||t.endsWith("_test.py")?"test":t==="conftest.py"||t==="setup.py"?"config":r.has("test")||e.some(n=>bc.has(n.rawSpecifier))?"test":"logic"}import ns from"path";import g from"typescript";import b from"typescript";function Ec(t){let e=1;function r(n){switch(n.kind){case b.SyntaxKind.IfStatement:case b.SyntaxKind.ConditionalExpression:case b.SyntaxKind.ForStatement:case b.SyntaxKind.ForInStatement:case b.SyntaxKind.ForOfStatement:case b.SyntaxKind.WhileStatement:case b.SyntaxKind.DoStatement:case b.SyntaxKind.CatchClause:case b.SyntaxKind.CaseClause:e++;break;case b.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===b.SyntaxKind.AmpersandAmpersandToken||s===b.SyntaxKind.BarBarToken||s===b.SyntaxKind.QuestionQuestionToken)&&e++;break}}b.forEachChild(n,r)}return r(t),e}function ts(t,e,r){let n=r?1:1+e,s=r?e:e+1;return n+=J(t.expression,s,!1),n+=J(t.thenStatement,s,!1),t.elseStatement&&(b.isIfStatement(t.elseStatement)?n+=ts(t.elseStatement,e,!0):n+=1+J(t.elseStatement,e+1,!1)),n}function es(t,e){let r=1+e;return b.forEachChild(t,n=>{r+=J(n,e+1,!1)}),r}function Ac(t,e){let r=1+e;return b.forEachChild(t,n=>{r+=J(n,e,!1)}),r}function Pc(t,e){let r=0;return b.forEachChild(t,n=>{r+=J(n,e,!1)}),r}function Nc(t){let e=t.operatorToken.kind;return e===b.SyntaxKind.AmpersandAmpersandToken||e===b.SyntaxKind.BarBarToken||e===b.SyntaxKind.QuestionQuestionToken}function J(t,e,r){if(b.isIfStatement(t))return ts(t,e,r);if(b.isForStatement(t)||b.isForInStatement(t)||b.isForOfStatement(t)||b.isWhileStatement(t)||b.isDoStatement(t)||b.isSwitchStatement(t))return es(t,e);if(b.isCatchClause(t))return Ac(t,e);let n=0;return b.isConditionalExpression(t)&&(n+=1),b.isBinaryExpression(t)&&Nc(t)&&(n+=1),e>0&&(b.isFunctionDeclaration(t)||b.isFunctionExpression(t)||b.isArrowFunction(t))?n+es(t,e):n+Pc(t,e)}function Ic(t){return J(t,0,!1)}function mr(t){return{complexity:Ec(t),cognitiveComplexity:Ic(t)}}import w from"typescript";var gr=new Set(["test","describe","it"]);function rs(t,e){Dc(t,e),Rc(t,e),Lc(t,e),Gc(t,e)}function Dc(t,e){if((w.isFunctionDeclaration(t)||w.isVariableDeclaration(t))&&t.name&&w.isIdentifier(t.name)&&Mc(t)){let r;if(w.isFunctionDeclaration(t))r="function";else{let n=t.initializer;r=n&&(w.isArrowFunction(n)||w.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function Mc(t){if(w.isFunctionDeclaration(t))return w.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&w.isSourceFile(e.parent)}function Rc(t,e){if(!w.isStringLiteral(t))return;let r=t.text.match(/@[\w-]+/g);if(r)for(let n of r)e.tags.add({name:n.substring(1),kind:"comment-marker"})}function Lc(t,e){if(!w.isSourceFile(t))return;let r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=t.getFullText(),s=r.exec(n);for(;s!==null;)s[1]&&e.tags.add({name:s[1],kind:"comment-marker"}),s=r.exec(n)}function Gc(t,e){if(w.isCallExpression(t)&&_c(t.expression))for(let r of t.arguments)w.isObjectLiteralExpression(r)&&Oc(r,e)}function _c(t){return w.isIdentifier(t)?gr.has(t.text):!!(w.isPropertyAccessExpression(t)&&(gr.has(t.name.text)||w.isIdentifier(t.expression)&&gr.has(t.expression.text)))}function Oc(t,e){for(let r of t.properties){if(!w.isPropertyAssignment(r)||!w.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:n}=r,s=w.isArrayLiteralExpression(n)?n.elements.filter(w.isStringLiteral):r.name.text==="tag"&&w.isStringLiteral(n)?[n]:[];for(let i of s)e.tags.add({name:i.text.replace(/^@/,""),kind:"comment-marker"})}}function dr(t,e,r){let n=[],s=new Map,i=new Set,o=g.createSourceFile(t,e,g.ScriptTarget.Latest,!0,r==="typescript"?g.ScriptKind.TSX:g.ScriptKind.JSX),a={filePath:t,imports:n,exports:s,tags:i,rawCallEdges:[],sourceFile:o,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=v=>{Bc(v,a),g.forEachChild(v,c)};c(o);let l=Zc(t,a);(l==="test"||l==="barrel")&&i.add({name:l,kind:"comment-marker"}),l!=="test"&&el(a,o);let p=o.statements[0],u=p?is(p):void 0,{complexity:d,cognitiveComplexity:h}=mr(o),C=jc(o);return{imports:n,exports:Array.from(s.values()),tags:Array.from(i),category:l,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...C.length>0?{functions:C}:{},...u!==void 0?{description:u}:{}}}function jc(t){let e=[],r=(s,i)=>{let{complexity:o,cognitiveComplexity:a}=mr(i),c=t.getLineAndCharacterOfPosition(i.getStart(t)).line+1;e.push({name:s,line:c,complexity:o,cognitiveComplexity:a})},n=(s,i)=>{if(g.isFunctionDeclaration(s)&&s.name&&s.body?r(s.name.text,s):g.isVariableDeclaration(s)&&g.isIdentifier(s.name)&&s.initializer&&(g.isArrowFunction(s.initializer)||g.isFunctionExpression(s.initializer))?r(s.name.text,s.initializer):i&&g.isMethodDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${i}.${s.name.text}`,s):i&&g.isConstructorDeclaration(s)&&s.body?r(`${i}.constructor`,s):i&&g.isGetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${i}.get ${s.name.text}`,s):i&&g.isSetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body&&r(`${i}.set ${s.name.text}`,s),g.isClassDeclaration(s)&&s.name){let o=s.name.text;g.forEachChild(s,a=>n(a,o));return}g.forEachChild(s,o=>n(o,i))};return n(t,void 0),e}function ss(t,e,r,n){let s={name:t},i=is(r);i!==void 0&&(s.doc=i);let o=zc(e);o!==void 0&&(s.flags=o);let a=Wc(e,n);return a!==void 0&&(s.signature=a),s}function is(t){let e=g.getJSDocCommentsAndTags(t);for(let r of e)if(g.isJSDoc(r)&&r.comment)return g.getTextOfJSDocComment(r.comment)||void 0}function zc(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=g.getJSDocTags(t).map(n=>n.tagName.text).filter(n=>e.has(n));return r.length>0?r:void 0}function Wc(t,e){let r=g.createPrinter({removeComments:!0}),n=s=>r.printNode(g.EmitHint.Unspecified,s,e);if(g.isFunctionDeclaration(t)||g.isMethodDeclaration(t)){let s=t.parameters.map(n).join(", "),i=t.type?n(t.type):"void";return`${t.typeParameters?`<${t.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${s}) => ${i}`}if(g.isVariableDeclaration(t)){if(t.type)return n(t.type);if(t.initializer&&(g.isArrowFunction(t.initializer)||g.isFunctionExpression(t.initializer))){let s=t.initializer,i=s.parameters.map(n).join(", "),o=s.type?n(s.type):"unknown";return`(${i}) => ${o}`}return}if(g.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(g.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(g.isTypeAliasDeclaration(t))return n(t.type);if(g.isEnumDeclaration(t))return`enum ${t.name.text}`}function Bc(t,e){$c(t,e),Uc(t,e),Kc(t,e),Jc(t,e),Xc(t,e),rs(t,e)}function $c(t,e){if(!g.isSourceFile(t))return;let r=t.statements.filter(n=>!g.isEmptyStatement(n));e.totalStatements=r.length,e.exportStatements=r.filter(n=>g.isExportDeclaration(n)||g.isExportAssignment(n)||hr(n)).length}function Uc(t,e){if(g.isJsxElement(t)||g.isJsxSelfClosingElement(t)||g.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(g.isFunctionDeclaration(t)||g.isMethodDeclaration(t)||g.isArrowFunction(t)||g.isClassDeclaration(t)||g.isVariableStatement(t)||g.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}g.isExportDeclaration(t)&&!Hc(t)&&(e.hasTypesOnly=!1)}function Hc(t){return t.isTypeOnly?!0:!t.exportClause||!g.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Kc(t,e){if(!g.isImportDeclaration(t)||!t.moduleSpecifier||!g.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(g.isNamedImports(t.importClause.namedBindings))for(let s of t.importClause.namedBindings.elements)r.push(s.name.text);else g.isNamespaceImport(t.importClause.namedBindings)&&r.push("*");let n=r.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.moduleSpecifier.text,isStyle:P(t.moduleSpecifier.text),type:n,symbols:r.length>0?r:void 0})}function Jc(t,e){g.isExportDeclaration(t)?Vc(t,e):g.isExportAssignment(t)?e.exports.set("default",{name:"default"}):hr(t)&&Yc(t,e)}function Vc(t,e){if(t.moduleSpecifier&&g.isStringLiteral(t.moduleSpecifier))Qc(t,t.moduleSpecifier.text,e);else if(t.exportClause&&g.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let n=r.name.text;e.exports.set(n,{name:n})}}function Qc(t,e,r){let n=qc(t),s={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:P(e),type:"re-export"};n.length>0&&(s.symbols=n),r.imports.push(s)}function qc(t){return t.exportClause?g.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Yc(t,e){if((g.isFunctionDeclaration(t)||g.isClassDeclaration(t)||g.isInterfaceDeclaration(t)||g.isTypeAliasDeclaration(t)||g.isEnumDeclaration(t))&&t.name){let n=t.name.text;e.exports.set(n,ss(n,t,t,e.sourceFile));return}if(g.isVariableStatement(t)){for(let n of t.declarationList.declarations)if(g.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,ss(s,n,t,e.sourceFile))}}}function Xc(t,e){if(!g.isCallExpression(t))return;let r=t.arguments[0];!r||!g.isStringLiteral(r)||(t.expression.kind===g.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"dynamic"}):g.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"require"}))}function Zc(t,e){let r=ns.basename(t).toLowerCase(),n=ns.extname(t).toLowerCase();return ie().some(i=>r.includes(i))?"test":Ar(r)?"config":e.imports.some(i=>mt().some(o=>i.rawSpecifier.includes(o)))?"test":n===".tsx"||n===".jsx"||e.hasUI?"ui":e.hasTypesOnly&&e.totalStatements>0?"type-only":e.totalStatements>0&&e.exportStatements/e.totalStatements>ht()?"barrel":"logic"}function hr(t){return g.canHaveModifiers(t)&&g.getModifiers(t)?.some(e=>e.kind===g.SyntaxKind.ExportKeyword)===!0}function el(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let n=new Map;for(let s of e.statements){if(!g.isImportDeclaration(s)||!g.isStringLiteral(s.moduleSpecifier))continue;let i=s.moduleSpecifier.text,o=s.importClause;if(o&&(o.name&&n.set(o.name.text,i),o.namedBindings&&g.isNamedImports(o.namedBindings)))for(let a of o.namedBindings.elements)n.set(a.name.text,i)}if(n.size!==0)for(let s of e.statements){let i=rl(s);if(i){let o=nl(s);o&&it(o,i,n,r);continue}g.isClassDeclaration(s)&&s.name&&tl(s,s.name.text,n,r)}}function tl(t,e,r,n){for(let s of t.members)g.isMethodDeclaration(s)&&s.body&&g.isIdentifier(s.name)?it(s.body,`${e}.${s.name.text}`,r,n):g.isConstructorDeclaration(s)&&s.body&&it(s.body,`${e}.constructor`,r,n)}function rl(t){if(hr(t)){if(g.isFunctionDeclaration(t)&&t.name)return t.name.text;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(g.isIdentifier(e.name)&&e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.name.text}}}function nl(t){if(g.isFunctionDeclaration(t))return t.body;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.initializer}}function it(t,e,r,n){if(g.isCallExpression(t)&&g.isIdentifier(t.expression)){let s=t.expression.text,i=r.get(s);i&&!n.some(o=>o.from===e&&o.to===s&&o.toSpecifier===i)&&n.push({from:e,to:s,toSpecifier:i})}g.forEachChild(t,s=>it(s,e,r,n))}function ot(t,e){if(e.length===0)return"ui";let r=!1;return t.walk(n=>{if(n.type==="rule")return r=!0,!1}),r?"ui":"barrel"}function os(t,e){let r=[],n=/@require\s+['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let o=s[1];o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"require"}),s=n.exec(t)}let i=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(s=i.exec(t);s!==null;){let o=s[1];o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),s=i.exec(t)}return r}function as(t,e){if(e.length===0)return"ui";try{let r=lt("stylus");return new r.Parser(t).parse().nodes.some(i=>i.constructor.name!=="Import")?"ui":"barrel"}catch{return t.replace(/^\s*@?(?:require|import)\b.*/gm,"").trim().length>0?"ui":"barrel"}}function Se(t,e){let r=_(t);if(r==="stylus"){let i=os(e,t);return{imports:i,exports:[],tags:[],category:as(e,i)}}if(r==="scss"){let{imports:i,root:o,exports:a,tags:c}=Oe(e,t);return{imports:i,exports:a,tags:c,category:ot(o,i)}}if(r==="less"){let{imports:i,root:o,exports:a,tags:c}=_e(e,t);return{imports:i,exports:a,tags:c,category:ot(o,i)}}let{imports:n,root:s}=Ge(e,t);return{imports:n,exports:[],tags:[],category:ot(s,n)}}for(let[t,e]of[["javascript",(r,n)=>dr(r,n,"javascript")],["typescript",(r,n)=>dr(r,n,"typescript")],["css",Se],["scss",Se],["less",Se],["stylus",Se],["coffeescript",zn],["livescript",Kn],["lua",Jn],["python",Zn],["go",Hn],["gherkin",lr],["markdown",qn]])Z(t,e);async function cs(t,e){let r=_(t),n=Cn(r);return n?n(t,e):{imports:[],exports:[],tags:[],category:"other"}}import ls from"path";function sl(t,e){let r=e.get(t.path);r!==void 0&&(t.coveragePct=r)}function us(t,e){for(let r of t)if(r.isExternal){let n=r.rawSpecifier.startsWith("@")?r.rawSpecifier.split("/").slice(0,2).join("/"):r.rawSpecifier.split("/")[0];n&&!e.some(s=>s.name===n)&&e.push({name:n,kind:"library"})}}function il(t,e,r){if(e.isExternal||!e.toPath)return;let n=r.get(e.toPath);n&&(n.category!=="logic"&&n.category!=="barrel"||(n.testedBy??=[],n.testedBy.includes(t.path)||n.testedBy.push(t.path)))}function ol(t,e){if(t.type==="markdown")for(let r of t.imports){if(r.isExternal||!r.toPath)continue;let n=e.get(r.toPath);!n||n===t||(n.documentedBy??=[],n.documentedBy.includes(t.path)||n.documentedBy.push(t.path),n.category==="logic"&&(n.lastCommitAt??0)>(t.lastCommitAt??0)&&(t.staleFor??=[],t.staleFor.includes(n.path)||t.staleFor.push(n.path)))}}function ps(t){return Math.round(t*1e4)/1e4}function al(t,e){let r=[];for(let n of t.imports){if(n.isExternal||!n.toPath)continue;let s=e.get(n.toPath);if(!s||s.exports.length===0)continue;let i;if(n.symbols===void 0){if(n.type==="side-effect")continue;i=1}else n.symbols.includes("*")?i=1:i=n.symbols.length/s.exports.length;n.exportUsageRatio=ps(Math.min(1,i)),r.push(n.exportUsageRatio)}r.length>0&&(t.avgExportUsage=ps(r.reduce((n,s)=>n+s,0)/r.length),t.maxExportUsage=Math.max(...r))}function yr(t,e,r){e&&(t.some(n=>n.name===e&&n.kind===r)||t.push({name:e,kind:r}))}function cl(t,e){let r=e.toPath,n=ls.basename(r,ls.extname(r)).replace(/\.(test|spec)$/,"");yr(t.tags,n,"import")}function ll(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)yr(t.tags,r,"import")}function pl(t,e,r){let n=r.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&yr(t.tags,s.name,"comment-marker")}function ul(t,e,r){!e.toPath||e.isExternal||(cl(t,e),ll(t,e),pl(t,e,r))}function fs(t,e){for(let r of t.values())delete r.testedBy,delete r.documentedBy,delete r.staleFor,r.category==="test"&&(r.tags=r.tags.filter(n=>n.kind!=="import"));for(let r of t.values()){if(al(r,t),e.size>0&&sl(r,e),r.category==="test")for(let n of r.imports)il(r,n,t),ul(r,n,t);ol(r,t)}}import at from"fs";import L from"path";import ds from"fs";import ne from"path";var ke=class{extensions=[".go"];goModCache=new Map;resolve(e,r,n,s){let{mod:i,replaces:o}=this.readGoMod(n);if(!i)return null;let a=this.applyReplace(r,o,n);if(a!==void 0)return gs(a);if(r!==i&&!r.startsWith(`${i}/`))return null;let c=r.slice(i.length).replace(/^\//,"");return c?gs(ne.join(n,c)):null}readGoMod(e){let r=this.goModCache.get(e);if(r!==void 0)return r;let n={mod:null,replaces:new Map};try{let s=ds.readFileSync(ne.join(e,"go.mod"),"utf-8"),i=fl(s,e);return this.goModCache.set(e,i),i}catch{return this.goModCache.set(e,n),n}}applyReplace(e,r,n){for(let[s,i]of r){if(e===s)return i;if(e.startsWith(`${s}/`)){let o=e.slice(s.length+1);return ne.join(i,o)}}}};function fl(t,e){let r=t.split(`
31
+ `),n=null,s=new Map,i=!1;for(let o of r){let a=o.trim();if(a.startsWith("module ")){n=a.slice(7).trim();continue}if(/^replace\s*\(/.test(a)){i=!0;continue}if(i&&a===")"){i=!1;continue}if(i&&a.includes("=>")){ms(a,e,s);continue}!i&&/^replace\s+/.test(a)&&a.includes("=>")&&ms(a.replace(/^replace\s+/,""),e,s)}return{mod:n,replaces:s}}function ms(t,e,r){let[n,s]=t.split("=>").map(a=>a.trim());if(!n||!s)return;let i=n.split(/\s+/)[0];if(!s.startsWith(".")&&!s.startsWith("/"))return;let o=ne.isAbsolute(s)?s:ne.resolve(e,s);r.set(i,o)}function gs(t){let e;try{e=ds.readdirSync(t,{withFileTypes:!0})}catch{return null}let r=e.filter(n=>n.isFile()&&n.name.endsWith(".go")&&!n.name.endsWith("_test.go")).map(n=>({path:ne.join(t,n.name),isExternal:!1})).sort((n,s)=>n.path.localeCompare(s.path));return r.length>0?r:null}import ml from"fs";import xr from"path";var Ce=class{extensions=[".lua"];resolve(e,r,n,s){let i=r.replace(/\./g,xr.sep),o=[n,xr.join(n,"lib")];for(let a of o){if(!ml.existsSync(a))continue;let c=s(xr.join(a,"_dummy.lua"),i);if(c)return[c]}return null}};import gl from"path";var ve=class{extensions=[".md",".mdx"];resolve(e,r,n,s){let i=s(gl.join(n,"_dummy"),`./${r}`);return i?[i]:null}};import dl from"fs";import br from"path";var we=class{extensions=[".py"];resolve(e,r,n,s){let i=r.replace(/\./g,br.sep),o=br.join(n,`${i}.py`);if(hs(o))return[{path:o,isExternal:!1}];let a=br.join(n,i,"__init__.py");return hs(a)?[{path:a,isExternal:!1}]:null}};function hs(t){try{return dl.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import ys from"path";var hl=["~","http://","https://","//","data:","sass:"],Fe=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,n,s){if(hl.some(p=>r.startsWith(p)))return null;let i=s(e,r);if(i)return[i];let o=ys.dirname(r),a=ys.basename(r),c=o==="."?`_${a}`:`${o}/_${a}`,l=s(e,c);return l?[l]:null}};var V=class{constructor(e,r={}){this.rootDir=e;this.workspaceMap=r.workspaceMap??new Map,this.tsconfigSearchPaths=r.tsconfigSearchPaths??[e],this.pathAliases=r.pathAliases,this.langResolvers=r.langResolvers??[new we,new Ce,new ke,new Fe,new ve]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;langResolvers;resolutionCache=new Map;langBucketFor(e){for(let r=0;r<this.langResolvers.length;r++)if(this.langResolvers[r]?.extensions.some(n=>e.endsWith(n)))return String(r);return"none"}cacheKey(e,r){return`${L.dirname(e)}\0${this.langBucketFor(e)}\0${r}`}resolveAll(e,r){let n=this.cacheKey(e,r),s=this.resolutionCache.get(n);if(s!==void 0)return s??[];let i=this.resolveAllUncached(e,r);return this.resolutionCache.set(n,i.length>0?i:null),i}resolveAllUncached(e,r){let n=this.resolvePathAlias(r);if(n)return[n];if(r.startsWith(".")||r.startsWith("/")){let o=this.resolveLocalPath(e,r);return o?[o]:[]}let s=(o,a)=>this.resolveLocalPath(o,a);for(let o of this.langResolvers)if(o.extensions.some(a=>e.endsWith(a))){let a=o.resolve(e,r,this.rootDir,s);if(a)return a}let i=this.resolveWorkspaceImport(r);return i?[i]:[{path:r,isExternal:!0}]}resolve(e,r){return this.resolveAll(e,r)[0]??null}resolveLocalPath(e,r){let n=L.dirname(e),s=r.startsWith("/")?r:L.resolve(n,r),i=!s.startsWith(this.rootDir),o=["",".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 l of[".ts",".tsx"]){let p=this.tryExtensions(c,l,i);if(p)return p}}for(let c of o){let l=this.tryExtensions(s,c,i);if(l)return l}return i?{path:s,isExternal:!0}:null}tryExtensions(e,r,n){let s=e+r;if(this.isFile(s))return{path:s,isExternal:n};let i=L.join(e,`index${r}`);if(this.isFile(i))return{path:i,isExternal:n};if(r===".py"){let o=L.join(e,"__init__.py");if(this.isFile(o))return{path:o,isExternal:n}}return null}isFile(e){try{return at.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let r in this.pathAliases){let n=this.matchAliasPattern(r,e),s=this.pathAliases[r];if(n&&s){let i=this.tryAliasSubstitutions(s,n[1]||"");if(i)return i}}for(let r of this.tsconfigSearchPaths){let n=L.join(r,"tsconfig.json");if(at.existsSync(n))try{let i=JSON.parse(at.readFileSync(n,"utf-8")).compilerOptions?.paths;if(!i)continue;for(let o in i){let a=this.matchAliasPattern(o,e);if(a){let c=this.tryAliasSubstitutions(i[o],a[1]||"",r);if(c)return c}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,r){let n=this.aliasRegexCache.get(e);if(!n){let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace("\\*","(.*)");n=new RegExp(`^${s}$`),this.aliasRegexCache.set(e,n)}return r.match(n)}tryAliasSubstitutions(e,r,n=this.rootDir){let s=["",".ts",".tsx",".js",".jsx",".coffee",".ls",".lua",".feature"];for(let i of e){let o=i.replace("*",r),a=L.resolve(n,o);for(let c of s){let l=this.tryExtensions(a,c,!1);if(l)return l}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[r,n]of this.workspaceMap){if(e!==r&&!e.startsWith(`${r}/`))continue;let s=e.slice(r.length),i={path:"",isExternal:!1,isWorkspace:!0,workspacePackage:r};if(!s){for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"]){let c=L.join(n,a);try{if(at.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...i,path:c}}catch{}}return{...i,path:n}}let o=this.resolveLocalPath(L.join(n,"_dummy"),s.slice(1));return o?{...i,path:o.path}:null}return null}};var xl=["tests","test","__tests__","specs","spec"],xs=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),bl=600;function Sl(t,e){if(t.length===0)return e;let r=t.map(o=>E.dirname(o).split(E.sep)),n=r[0]??[];for(let o of r.slice(1)){let a=0;for(;a<n.length&&a<o.length&&n[a]===o[a];)a++;n=n.slice(0,a)}let s=n.join(E.sep)||E.sep,i=E.relative(e,s);return i.startsWith("..")||E.isAbsolute(i)?e:s}var Ee=class{constructor(e,r=null,n,s,i=!1,o=new Map,a=!0){this.rootDir=e;this.enableGitStats=i;this.coverageMap=o;this.parallelParsing=a;this.previousGraph=r,this.resolver=n||new V(e),this.lockFile=jr(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 r=e.map(n=>E.isAbsolute(n)?n:E.resolve(this.rootDir,n));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=Gn(this.rootDir));try{for(let n of r)this.enqueue(n);return await this.drain(),await this.processTestFiles(Sl(r,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
32
32
  Done. Total processed: ${this.visited.size} nodes.
33
- `),ps(this.graph.nodes,this.coverageMap),new I(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},r=e.minFiles??yl;if(!(r>0&&!this.hasAtLeastFiles(this.rootDir,r))){e.maxThreads!==void 0&&e.maxThreads<1&&process.stderr.write(`
33
+ `),fs(this.graph.nodes,this.coverageMap),new I(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},r=e.minFiles??bl;if(!(r>0&&!this.hasAtLeastFiles(this.rootDir,r))){e.maxThreads!==void 0&&e.maxThreads<1&&process.stderr.write(`
34
34
  Warning: parallelParsing.maxThreads (${e.maxThreads}) must be at least 1; using 1.
35
- `);try{let n=E.join(u,"parse-worker.js");this.pool=new dl({filename:n,...e.maxThreads!==void 0?{maxThreads:Math.max(1,e.maxThreads)}:{}})}catch(n){process.stderr.write(`
35
+ `);try{let n=E.join(f,"parse-worker.js");this.pool=new yl({filename:n,...e.maxThreads!==void 0?{maxThreads:Math.max(1,e.maxThreads)}:{}})}catch(n){process.stderr.write(`
36
36
  Warning: failed to start parse worker pool, falling back to synchronous parsing: ${n}
37
- `),this.pool=null}}}hasAtLeastFiles(e,r){let n=0,s=[e];for(;s.length>0;){let o=s.pop();if(o===void 0)continue;let i;try{i=Te.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())hs.has(a.name)||s.push(E.join(o,a.name));else if(a.isFile()&&(n++,n>=r))return!0}return n>=r}async processTestFiles(e){let r=oe(),n=o=>r.some(i=>o.name.includes(i));this.walkProject(e,n);let s=e;for(;s!==this.rootDir;){let o=E.dirname(s);if(o===s)break;for(let i of hl){let a=E.join(o,i);try{Te.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,r){let n;try{n=Te.readdirSync(e,{withFileTypes:!0})}catch{return}for(let s of n){let o=E.join(e,s.name);s.isDirectory()?hs.has(s.name)||this.walkProject(o,r):s.isFile()&&r(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(r=>this.finishFile(r)))}}async finishFile(e){let r=Te.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let n=E.relative(this.rootDir,e),s=await this.getNode(e,n,r);s.imports=await this.resolveImports(e,s.imports),ls(s.imports,s.tags),this.graph.nodes.set(s.path,s)}async getNode(e,r,n){let s=this.previousGraph?.nodes.get(r);if(s&&s.mtime===n.mtimeMs&&s.size===n.size)return{...s};let o=await this.tryParse(e,r);if(!o)return this.makeStubNode(e,r,n);let i=this.resolveCallEdges(e,o.rawCallEdges),a=this.buildNode(e,r,n,o,i);return this.attachGitStats(a,r),a}async tryParse(e,r){let n=Te.readFileSync(e,"utf-8");try{return await this.parseContent(e,n)}catch(s){return process.stderr.write(`
37
+ `),this.pool=null}}}hasAtLeastFiles(e,r){let n=0,s=[e];for(;s.length>0;){let i=s.pop();if(i===void 0)continue;let o;try{o=Te.readdirSync(i,{withFileTypes:!0})}catch{continue}for(let a of o)if(a.isDirectory())xs.has(a.name)||s.push(E.join(i,a.name));else if(a.isFile()&&(n++,n>=r))return!0}return n>=r}async processTestFiles(e){let r=ie(),n=i=>r.some(o=>i.name.includes(o));this.walkProject(e,n);let s=e;for(;s!==this.rootDir;){let i=E.dirname(s);if(i===s)break;for(let o of xl){let a=E.join(i,o);try{Te.statSync(a).isDirectory()&&this.walkProject(a,n)}catch{}}s=i}await this.drain()}async processDocFiles(){this.walkProject(this.rootDir,e=>e.name.endsWith(".md")||e.name.endsWith(".mdx")),await this.drain()}walkProject(e,r){let n;try{n=Te.readdirSync(e,{withFileTypes:!0})}catch{return}for(let s of n){let i=E.join(e,s.name);s.isDirectory()?xs.has(s.name)||this.walkProject(i,r):s.isFile()&&r(s)&&this.enqueue(i)}}enqueue(e){this.visited.has(e)||(this.visited.add(e),this.showProgress(),this.queue.push(e))}async drain(){for(;this.queue.length>0;){let e=this.queue;this.queue=[],await Promise.all(e.map(r=>this.finishFile(r)))}}async finishFile(e){let r=Te.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let n=E.relative(this.rootDir,e),s=await this.getNode(e,n,r);s.imports=await this.resolveImports(e,s.imports),us(s.imports,s.tags),this.graph.nodes.set(s.path,s)}async getNode(e,r,n){let s=this.previousGraph?.nodes.get(r);if(s&&s.mtime===n.mtimeMs&&s.size===n.size)return{...s};let i=await this.tryParse(e,r);if(!i)return this.makeStubNode(e,r,n);let o=this.resolveCallEdges(e,i.rawCallEdges),a=this.buildNode(e,r,n,i,o);return this.attachGitStats(a,r),a}async tryParse(e,r){let n=Te.readFileSync(e,"utf-8");try{return await this.parseContent(e,n)}catch(s){return process.stderr.write(`
38
38
  Warning: failed to parse ${r}: ${s}
39
- `),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):is(e,r)}makeStubNode(e,r,n){return{path:r,type:_(e),category:"other",imports:[],exports:[],tags:[],mtime:n.mtimeMs,size:n.size}}resolveCallEdges(e,r){let n=[];for(let s of r??[])try{let o=this.resolver.resolve(e,s.toSpecifier);o&&!o.isExternal&&n.push({from:s.from,to:s.to,toFile:E.relative(this.rootDir,o.path)})}catch{}return n}buildNode(e,r,n,s,o){let{imports:i,exports:a,tags:c,category:l,description:p,complexity:m,cognitiveComplexity:d,functions:h}=s;return{path:r,type:_(e),category:l,imports:i,exports:a,tags:c,mtime:n.mtimeMs,size:n.size,...p!==void 0?{description:p}:{},...o.length>0?{callEdges:o}:{},...m!==void 0?{complexity:m}:{},...d!==void 0?{cognitiveComplexity:d}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,r){let n=this.gitStatsMap?.get(r);n&&(e.commitCount90d=n.commitCount90d,n.lastAuthor!==void 0&&(e.lastAuthor=n.lastAuthor),n.lastCommitAt!==void 0&&(e.lastCommitAt=n.lastCommitAt))}async resolveImports(e,r){let n=[];for(let s of r){let o=this.resolver.resolveAll(e,s.rawSpecifier);if(o.length!==0)for(let i of o){let a={...s,toPath:i.isExternal?i.path:E.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 r=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],n=r?this.lockFile.dependencies[r]:void 0;n&&(e.version=n.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function ys(t,e){return{identifier:e?.identifier??new tt,featureMap:e?.featureDetection===!1?new Map:W(t.nodes,e?.featureDetection??void 0)}}function xs(t,e,r,n,s){for(let o of e){let i=t.nodes.get(o);if(!i)continue;let a=new B(o,["*",...i.exports.map(c=>c.name)]);t.traverse(o,(c,l,p)=>{if(!p)return!0;if(!a.updateAffectedSymbols(c,p))return!1;if(l>0){let m=r.get(c.path);if(m)return n(m),!1}return s(c),!0},{direction:"incoming"})}}function dr(t,e,r){let{identifier:n,featureMap:s}=ys(t,r),o=new Set;for(let i of e){let a=s.get(i);a&&o.add(a.tag)}return xs(t,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 hr(t,e,r){let{identifier:n,featureMap:s}=ys(t,r),o=new Set;return xs(t,e,s,()=>{},i=>{n.isTestNode(i)&&o.add(i.path)}),Array.from(o)}import bl from"fs";import Ae from"path";async function bs(t,e,r=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=Ae.resolve(t);return await new Ee(o,r,n.pathAliases?new V(o,{pathAliases:n.pathAliases}):void 0,s,n.gitStats??!1,n.coverageMap??new Map,n.parallelParsing??!0).build(e)}async function Ss(t,e={}){let r=Ae.resolve(t),n=de(r),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 he(r,n.type);for(let a of s){let c=e.silent?void 0:m=>{process.stderr.write(`[${a.name}] Processed ${m} files...\r`)},p=await new Ee(r,null,new V(r,{workspaceMap:o,tsconfigSearchPaths:[a.root,r],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,p)}return i}function ks(t,e={}){let r=[],n=new Set([...e.ignoreDirs??z,...e.additionalIgnoreDirs??[]]),s=new Set([...e.extensions??ht,...e.additionalExtensions??[]]);function o(i){try{let a=bl.readdirSync(i,{withFileTypes:!0});for(let c of a){let l=Ae.join(i,c.name);c.isDirectory()?n.has(c.name)||o(l):c.isFile()&&s.has(Ae.extname(c.name).toLowerCase())&&r.push(Ae.relative(t,l))}}catch{}}return o(t),r}var Cs=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;function vs(t){return xr.join(t,Me,gt)}function Sl(t,e){return e?.cachePath?xr.resolve(t,e.cachePath):xr.join(t,Me,dt)}function kl(t){try{if(!yr.existsSync(t))return null;let e=yr.readFileSync(t,"utf-8");return I.deserialize(JSON.parse(e))}catch{return null}}var at=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;duplicationTokenCaches=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,r){this.configs.set(e,r)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,r,n=new Map){let s=this.configs.get(e),o=this.graphs.get(e)??kl(Sl(e,s)),i=await bs(e,r,o,{...q(s),coverageMap:n});return this.graphs.set(e,i),i}require(e){let r=this.graphs.get(e);if(!r)throw new Error('No graph cached for this root. Call "analyze" first.');return r}async getOrBuildWorkspace(e,r={}){let n=this.workspaceGraphs.get(e);if(n)return n;let s=await Ss(e,r);return this.workspaceGraphs.set(e,s),s}requireWorkspace(e){let r=this.workspaceGraphs.get(e);if(!r)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return r}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let r=this.changeImpactCaches.get(e);if(r)return r;let n=this.require(e),s=Ct(n);return this.changeImpactCaches.set(e,s),s}storeLastAnalyze(e,r){this.lastAnalyze.set(e,r)}startWatching(e){if(!this.watchers.has(e))try{let r=yr.watch(e,{recursive:!0},(n,s)=>{!s||Cs.test(s)||this.dirtyRoots.add(e)});r.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,r)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let r=this.lastAnalyze.get(e);return r?.kind==="single"?this.getOrBuild(e,r.entryPoints,r.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let r=this.configs.get(e);return this.getOrBuildWorkspace(e,q(r))}async getDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);return r||(r=Oe(vs(e)),this.duplicationTokenCaches.set(e,r)),r}flushDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);if(r)try{je(r,vs(e))}catch(n){process.stderr.write(`Warning: failed to persist duplication token cache: ${n}
40
- `)}}invalidate(e){let r=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),this.duplicationTokenCaches.delete(e),r}};import se from"path";import Cl from"fs";import vl from"os";import br from"path";function x(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}function ws(t){if(!br.isAbsolute(t))throw new Error("root must be an absolute path");let e=br.resolve(t),r=vl.homedir();if(e!==r&&!e.startsWith(r+br.sep))throw new Error("root must be within the user home directory");let n;try{n=Cl.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function Fs(t,e){let{root:r,entryPoints:n}=e;if(!t.isConfigured(r)){let d=ie(r,{allowJs:!1});mt(d),t.storeConfig(r,d)}if(n.length===0){let d=de(r);if(d.type!=="none"){let h=t.getConfig(r),C=await t.getOrBuildWorkspace(r,q(h));t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let v=Array.from(C.packages.values()).map(({graph:y,pkg:k})=>({package:k.name,relativeRoot:k.relativeRoot,nodeCount:y.nodes.size}));return x({monorepoType:d.type,packageCount:C.packages.size,packages:v})}}let s=n.map(d=>se.resolve(r,d)),o=t.getConfig(r),i=o?.coverageReportPath?yt(r,o.coverageReportPath):new Map,a=await t.getOrBuild(r,s,i);t.storeLastAnalyze(r,{kind:"single",entryPoints:s,coverageMap:i}),t.startWatching(r);let c=a.serialize(),l=c.nodes.reduce((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),p=a.findCycles(),m=Et(a);return x({nodeCount:c.nodes.length,categories:l,cycles:p,languageCoverage:m})}async function Ts(t,e){let{root:r,file:n,depth:s=1,withMeta:o=!1}=e,i=await t.ensureFresh(r),a=At(i,n,s),c=o?a.map(l=>({...l,...ue(i,l.path)})):a;return x({file:n,dependencies:c})}async function Es(t,e){let{root:r,file:n,withMeta:s=!1}=e,o=await t.ensureFresh(r),i=fe(o,n),a=s?i.map(c=>({...c,...ue(o,c.path)})):i;return x({file:n,dependents:a})}async function As(t,e){let{root:r,file:n,testsOnly:s=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,c=await t.ensureFresh(r),l=d=>a?d.map(h=>({path:h,...ue(c,h)})):d;if(o){let d=t.getOrBuildChangeImpact(r),h=vt(d,n),C=s?h.filter(y=>c.nodes.get(y)?.category==="test"):h,v=l(C);return x({file:n,affected:v,count:v.length})}let p=Pt(c,n,{testsOnly:s,changedSymbols:i}),m=l(p);return x({file:n,affected:m,count:m.length})}async function Ps(t,e){let{root:r,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=Nt(i,n,{depth:s,withEdgeDetail:o});return x({file:n,callers:a,count:a.length})}async function Ns(t,e){let{root:r,entryPoints:n}=e,s=n?await t.getOrBuild(r,n.map(a=>se.resolve(r,a))):await t.ensureFresh(r),o=ks(r),i=s.findUnusedFiles(o);return x({unusedFiles:i,count:i.length})}async function Is(t,e){let{root:r}=e,n=await t.ensureFresh(r),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 x({tags:o,count:o.length})}async function Ms(t,e){let{root:r,coverageThreshold:n}=e,s=await t.ensureFresh(r),o=t.getConfig(r),i=n??o?.coverageThreshold??80;if(!Be(s))return x({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 x({threshold:i,uncovered:a,count:a.length})}async function Ds(t,e){let{root:r}=e,s=[...(await t.ensureFresh(r)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return x({staleDocs:s,count:s.length})}async function Rs(t,e){let{root:r,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await t.ensureFresh(r),a=It(i,{metric:n,threshold:s,limit:o});return x({metric:n,threshold:s,functions:a,count:a.length})}async function Ls(t,e){let{root:r,metric:n="cognitiveComplexity",minComplexity:s=10,maxCoveragePct:o=50,minChurn:i=0,limit:a=20}=e,c=await t.ensureFresh(r);if(!Be(c))return x({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let{hotspots:l,count:p,churnDataAvailable:m}=Rt(c,{metric:n,minComplexity:s,maxCoveragePct:o,minChurn:i,limit:a});return x({metric:n,minComplexity:s,maxCoveragePct:o,minChurn:i,churnDataAvailable:m,hotspots:l,count:p})}async function Gs(t,e){let{root:r,minLines:n=6,ignoreLiterals:s=!0,maxPunctuationRatio:o=.5,limit:i=50}=e,a=await t.ensureFresh(r),c=e.ignoreDirs??[...z,...t.getConfig(r)?.ignoreDirs??[]],{groups:l}=await Tt(a,r,{minLines:n,ignoreLiterals:s,maxPunctuationRatio:o,limit:i,ignoreDirs:c,tokenCache:await t.getDuplicationTokenCache(r)});return t.flushDuplicationTokenCache(r),x({minLines:n,groups:l,count:l.length})}async function _s(t,e){let{root:r,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await t.ensureFresh(r),a=n??new rt().getChangedFiles().map(p=>se.relative(r,se.resolve(r,p))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let p=hr(i,a,c);return x({changedFiles:a,affectedTests:p,count:p.length})}let l=dr(i,a,c);return x({changedFiles:a,proposedTags:l})}async function Os(t,e){let{root:r,entryPoints:n,featureThreshold:s}=e,o=n?await t.getOrBuild(r,n.map(c=>se.resolve(r,c))):await t.ensureFresh(r),i=W(o.nodes,s!==void 0?{minOutDegree:s}:void 0),a=Array.from(i.values()).sort((c,l)=>l.outDegree-c.outDegree);return x({features:a,count:a.length})}async function js(t,e){let{root:r,entryPoints:n,filter:s,mermaid:o=!1,slim:i=!0}=e,a=n?await t.getOrBuild(r,n.map(l=>se.resolve(r,l))):await t.ensureFresh(r),c=Ue(a.serialize(),He(s));return o?x(De.serialize(I.deserialize(c))):i?x(Mt(c)):x(c)}async function zs(t,e){let{root:r}=e,n=await t.ensureFreshWorkspace(r);return x(Dt(n))}async function Ws(t,e){let{root:r,file:n}=e,o=(await t.ensureFreshWorkspace(r)).getAffectedAcrossPackages(n);return x({file:n,affected:o,count:o.length})}function Bs(t,e){let{root:r}=e,n=t.invalidate(r);return x({root:r,cleared:n,message:n?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function $s(t,e){let{root:r,type:n}=e,s=await t.ensureFresh(r),o=_t(s);if(n)return x(Ot(o,n));let i=Array.from(o.types.values());return x({count:i.length,types:i})}async function Us(t,e){let{root:r,paths:n,minOutDegree:s}=e,o=await t.ensureFresh(r),i=Lt(o,s!==void 0?{minOutDegree:s}:void 0);if(n?.length){let c=n.map(l=>i.get(l)).filter(Boolean);return x({count:c.length,modules:c})}let a=Array.from(i.values());return x({count:a.length,modules:a})}async function Hs(t,e){let{root:r,minOutDegree:n}=e,s=await t.ensureFresh(r),o=le(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return x({features:i,unassigned:o.unassigned})}async function Ks(t,e){let{root:r,function:n}=e,s=await t.ensureFresh(r);return x(kt(s,n))}async function Js(t,e){let{root:r,name:n}=e,s=await t.ensureFresh(r),o=Gt(s,n);return x({name:n,matches:o,count:o.length})}async function Vs(t,e){let{root:r,entryPoints:n}=e,s=await t.ensureFresh(r),o=n?.length?n:bt(s,r);if(o.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return x(St(s,o))}async function Qs(t,e){let r=await t.ensureFresh(e.root),n=await tr(r,e.root,{dryRun:e.dryRun??!1});return x(n)}var qs=[{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. See docs/mcp.md for details on the testsOnly, cached, changedSymbols, and withMeta options.",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_risk_hotspots",description:"Find functions that are complex, in a poorly-covered file, and \u2014 when gitStats is enabled in mokosh.config \u2014 in a frequently-changed file. Requires a prior analyze() call and coverageReportPath set in mokosh.config; errors if no coverage data was loaded. Churn filtering is skipped (churnDataAvailable: false) when gitStats wasn't enabled, since complexity + low coverage alone is still a meaningful signal.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which per-function score to filter/sort on (default: cognitiveComplexity)"},minComplexity:{type:"number",description:"Minimum per-function complexity score to include (default: 10)"},maxCoveragePct:{type:"number",description:"Maximum containing-file coverage % to include (default: 50)"},minChurn:{type:"number",description:"Minimum containing-file 90-day commit count to include (default: 0). Ignored when gitStats wasn't enabled at analyze time."},limit:{type:"number",description:"Max results to return, worst-first by metric (default: 20)"}},required:["root"]}},{name:"find_duplicates",description:"Find duplicated code blocks across the project, largest-first. CSS/SCSS/Less are matched structurally by rule body; every other parsed language is tokenized and matched via suffix array. Lock files and ignored directories are always excluded. Requires a prior analyze() call. See docs/mcp.md for matching-strategy, normalization, and caching details.",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."},maxPunctuationRatio:{type:"number",description:"Maximum fraction of a token-shingled block's window that may be object/array-literal structural punctuation ({ } : , [ ]) (default: 0.5). Filters out blocks that are mostly schema/object-literal shape instead of substantive shared logic. Does not apply to the CSS/Less/SCSS structural comparator. Set 1 to disable."},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, path, or other node metadata. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used. See docs/mcp.md for the full query DSL reference.",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 it returns only paths grouped by hub, so it's substantially smaller than a full graph query for the same question; compare output sizes yourself if you need an exact figure for your repo.",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 \u2014 check each match's `precision` field ('call' | 'file-level') before trusting caller/importer results as symbol-exact. See docs/mcp.md for per-language coverage details.",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: every exported symbol resolved to its defining file and kind, partitioned into internalFiles, unreachableFromEntry, and testFiles. Requires a prior analyze() call. When entryPoints is omitted, auto-detects from package.json exports/main/module. See docs/mcp.md for the export* expansion and partition semantics.",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, as an idempotent block \u2014 re-running is safe, the existing block is replaced in place. Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call. See docs/mcp.md for tag-kind and per-language block syntax details.",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 t=new at,e=new wl({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(Tl,async()=>({tools:qs})),e.setRequestHandler(Fl,async r=>{let{name:n,arguments:s}=r.params,o=s,a={analyze:c=>Fs(t,c),get_dependencies:c=>Ts(t,c),get_dependents:c=>Es(t,c),get_affected:c=>As(t,c),get_callers:c=>Ps(t,c),find_symbol:c=>Js(t,c),find_unused:c=>Ns(t,c),find_uncovered:c=>Ms(t,c),list_tags:c=>Is(t,c),check_doc_drift:c=>Ds(t,c),find_complex_functions:c=>Rs(t,c),find_risk_hotspots:c=>Ls(t,c),find_duplicates:c=>Gs(t,c),propose_tags:c=>_s(t,c),detect_features:c=>Os(t,c),get_type_graph:c=>$s(t,c),get_module_responsibility:c=>Us(t,c),get_feature_graph:c=>Hs(t,c),get_call_graph:c=>Ks(t,c),get_api_surface:c=>Vs(t,c),query:c=>js(t,c),get_workspace_packages:c=>zs(t,c),get_workspace_affected:c=>Ws(t,c),clear_cache:c=>Bs(t,c),apply_tags:c=>Qs(t,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return ws(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 Al(){let t=Sr(),e=new El;await t.connect(e)}Al().catch(console.error);export{Sr as createMcpServer};
39
+ `),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):cs(e,r)}makeStubNode(e,r,n){return{path:r,type:_(e),category:"other",imports:[],exports:[],tags:[],mtime:n.mtimeMs,size:n.size}}resolveCallEdges(e,r){let n=[];for(let s of r??[])try{let i=this.resolver.resolve(e,s.toSpecifier);i&&!i.isExternal&&n.push({from:s.from,to:s.to,toFile:E.relative(this.rootDir,i.path)})}catch{}return n}buildNode(e,r,n,s,i){let{imports:o,exports:a,tags:c,category:l,description:p,complexity:u,cognitiveComplexity:d,functions:h}=s;return{path:r,type:_(e),category:l,imports:o,exports:a,tags:c,mtime:n.mtimeMs,size:n.size,...p!==void 0?{description:p}:{},...i.length>0?{callEdges:i}:{},...u!==void 0?{complexity:u}:{},...d!==void 0?{cognitiveComplexity:d}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,r){let n=this.gitStatsMap?.get(r);n&&(e.commitCount90d=n.commitCount90d,n.lastAuthor!==void 0&&(e.lastAuthor=n.lastAuthor),n.lastCommitAt!==void 0&&(e.lastCommitAt=n.lastCommitAt))}async resolveImports(e,r){let n=[];for(let s of r){let i=this.resolver.resolveAll(e,s.rawSpecifier);if(i.length!==0)for(let o of i){let a={...s,toPath:o.isExternal?o.path:E.relative(this.rootDir,o.path),isExternal:o.isExternal};o.isWorkspace&&(a.isWorkspace=!0,a.workspacePackage=o.workspacePackage),o.isExternal?this.attachLockfileVersion(a):this.enqueue(o.path),n.push(a)}}return n}attachLockfileVersion(e){if(!this.lockFile)return;let r=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],n=r?this.lockFile.dependencies[r]:void 0;n&&(e.version=n.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function bs(t,e){return{identifier:e?.identifier??new rt,featureMap:e?.featureDetection===!1?new Map:W(t.nodes,e?.featureDetection??void 0)}}function Ss(t,e,r,n,s){for(let i of e){let o=t.nodes.get(i);if(!o)continue;let a=new B(i,["*",...o.exports.map(c=>c.name)]);t.traverse(i,(c,l,p)=>{if(!p)return!0;if(!a.updateAffectedSymbols(c,p))return!1;if(l>0){let u=r.get(c.path);if(u)return n(u),!1}return s(c),!0},{direction:"incoming"})}}function Sr(t,e,r){let{identifier:n,featureMap:s}=bs(t,r),i=new Set;for(let o of e){let a=s.get(o);a&&i.add(a.tag)}return Ss(t,e,s,o=>i.add(o.tag),o=>{if(n.isTestNode(o))for(let a of o.tags)i.add(a.name)}),Array.from(i)}function kr(t,e,r){let{identifier:n,featureMap:s}=bs(t,r),i=new Set;return Ss(t,e,s,()=>{},o=>{n.isTestNode(o)&&i.add(o.path)}),Array.from(i)}import kl from"fs";import Ae from"path";async function ks(t,e,r=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},i=Ae.resolve(t);return await new Ee(i,r,n.pathAliases?new V(i,{pathAliases:n.pathAliases}):void 0,s,n.gitStats??!1,n.coverageMap??new Map,n.parallelParsing??!0).build(e)}async function Cs(t,e={}){let r=Ae.resolve(t),n=de(r),s=e.packages?n.packages.filter(a=>e.packages?.includes(a.name)||e.packages?.includes(a.relativeRoot)):n.packages,i=new Map(n.packages.map(a=>[a.name,a.root])),o=new he(r,n.type);for(let a of s){let c=e.silent?void 0:u=>{process.stderr.write(`[${a.name}] Processed ${u} files...\r`)},p=await new Ee(r,null,new V(r,{workspaceMap:i,tsconfigSearchPaths:[a.root,r],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);o.addPackage(a,p)}return o}function vs(t,e={}){let r=[],n=new Set([...e.ignoreDirs??z,...e.additionalIgnoreDirs??[]]),s=new Set([...e.extensions??kt,...e.additionalExtensions??[]]);function i(o){try{let a=kl.readdirSync(o,{withFileTypes:!0});for(let c of a){let l=Ae.join(o,c.name);c.isDirectory()?n.has(c.name)||i(l):c.isFile()&&s.has(Ae.extname(c.name).toLowerCase())&&r.push(Ae.relative(t,l))}}catch{}}return i(t),r}var ws=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;function Fs(t){return vr.join(t,Me,bt)}function Cl(t,e){return e?.cachePath?vr.resolve(t,e.cachePath):vr.join(t,Me,St)}function vl(t){try{if(!Cr.existsSync(t))return null;let e=Cr.readFileSync(t,"utf-8");return I.deserialize(JSON.parse(e))}catch{return null}}var ct=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;duplicationTokenCaches=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,r){this.configs.set(e,r)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,r,n=new Map){let s=this.configs.get(e),i=this.graphs.get(e)??vl(Cl(e,s)),o=await ks(e,r,i,{...q(s),coverageMap:n});return this.graphs.set(e,o),o}require(e){let r=this.graphs.get(e);if(!r)throw new Error('No graph cached for this root. Call "analyze" first.');return r}async getOrBuildWorkspace(e,r={}){let n=this.workspaceGraphs.get(e);if(n)return n;let s=await Cs(e,r);return this.workspaceGraphs.set(e,s),s}requireWorkspace(e){let r=this.workspaceGraphs.get(e);if(!r)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return r}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let r=this.changeImpactCaches.get(e);if(r)return r;let n=this.require(e),s=Et(n);return this.changeImpactCaches.set(e,s),s}storeLastAnalyze(e,r){this.lastAnalyze.set(e,r)}startWatching(e){if(!this.watchers.has(e))try{let r=Cr.watch(e,{recursive:!0},(n,s)=>{!s||ws.test(s)||this.dirtyRoots.add(e)});r.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,r)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let r=this.lastAnalyze.get(e);return r?.kind==="single"?this.getOrBuild(e,r.entryPoints,r.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let r=this.configs.get(e);return this.getOrBuildWorkspace(e,q(r))}async getDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);return r||(r=je(Fs(e)),this.duplicationTokenCaches.set(e,r)),r}flushDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);if(r)try{ze(r,Fs(e))}catch(n){process.stderr.write(`Warning: failed to persist duplication token cache: ${n}
40
+ `)}}invalidate(e){let r=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),this.duplicationTokenCaches.delete(e),this.configs.delete(e),r}};import se from"path";import wl from"fs";import Fl from"os";import wr from"path";function x(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}function Ts(t){if(!wr.isAbsolute(t))throw new Error("root must be an absolute path");let e=wr.resolve(t),r=Fl.homedir();if(e!==r&&!e.startsWith(r+wr.sep))throw new Error("root must be within the user home directory");let n;try{n=wl.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function Es(t,e){let{root:r,entryPoints:n}=e;if(!t.isConfigured(r)){let d=oe(r,{allowJs:!1});xt(d),t.storeConfig(r,d)}if(n.length===0){let d=de(r);if(d.type!=="none"){let h=t.getConfig(r),C=await t.getOrBuildWorkspace(r,q(h));t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let v=Array.from(C.packages.values()).map(({graph:y,pkg:k})=>({package:k.name,relativeRoot:k.relativeRoot,nodeCount:y.nodes.size}));return x({monorepoType:d.type,packageCount:C.packages.size,packages:v})}}let s=n.map(d=>se.resolve(r,d)),i=t.getConfig(r),o=i?.coverageReportPath?Ct(r,i.coverageReportPath):new Map,a=await t.getOrBuild(r,s,o);t.storeLastAnalyze(r,{kind:"single",entryPoints:s,coverageMap:o}),t.startWatching(r);let c=a.serialize(),l=c.nodes.reduce((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),p=a.findCycles(),u=Dt(a);return x({nodeCount:c.nodes.length,categories:l,cycles:p,languageCoverage:u})}async function As(t,e){let{root:r,file:n,depth:s=1,withMeta:i=!1}=e,o=await t.ensureFresh(r),a=Mt(o,n,s),c=i?a.map(l=>({...l,...ue(o,l.path)})):a;return x({file:n,dependencies:c})}async function Ps(t,e){let{root:r,file:n,withMeta:s=!1}=e,i=await t.ensureFresh(r),o=fe(i,n),a=s?o.map(c=>({...c,...ue(i,c.path)})):o;return x({file:n,dependents:a})}async function Ns(t,e){let{root:r,file:n,testsOnly:s=!1,cached:i=!1,changedSymbols:o,withMeta:a=!1}=e,c=await t.ensureFresh(r),l=d=>a?d.map(h=>({path:h,...ue(c,h)})):d;if(i){let d=t.getOrBuildChangeImpact(r),h=At(d,n),C=s?h.filter(y=>c.nodes.get(y)?.category==="test"):h,v=l(C);return x({file:n,affected:v,count:v.length})}let p=Rt(c,n,{testsOnly:s,changedSymbols:o}),u=l(p);return x({file:n,affected:u,count:u.length})}async function Is(t,e){let{root:r,file:n,depth:s=1,withEdgeDetail:i=!1}=e,o=await t.ensureFresh(r),a=Lt(o,n,{depth:s,withEdgeDetail:i});return x({file:n,callers:a,count:a.length})}async function Ds(t,e){let{root:r,entryPoints:n}=e,s=n?await t.getOrBuild(r,n.map(c=>se.resolve(r,c))):await t.ensureFresh(r),i=t.getConfig(r),o=vs(r,{additionalIgnoreDirs:i?.ignoreDirs??[],additionalExtensions:i?.extensions??[]}),a=s.findUnusedFiles(o);return x({unusedFiles:a,count:a.length})}async function Ms(t,e){let{root:r}=e,n=await t.ensureFresh(r),s=new Map;for(let o of n.nodes.values())for(let a of o.tags)s.set(a.name,(s.get(a.name)??0)+1);let i=[...s.entries()].map(([o,a])=>({name:o,count:a})).sort((o,a)=>a.count-o.count);return x({tags:i,count:i.length})}async function Rs(t,e){let{root:r,coverageThreshold:n}=e,s=await t.ensureFresh(r),i=t.getConfig(r),o=n??i?.coverageThreshold??80;if(!$e(s))return x({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<o).map(c=>({file:c.path,coveragePct:c.coveragePct}));return x({threshold:o,uncovered:a,count:a.length})}async function Ls(t,e){let{root:r}=e,s=[...(await t.ensureFresh(r)).nodes.values()].filter(i=>i.type==="markdown"&&i.staleFor&&i.staleFor.length>0).map(i=>({doc:i.path,staleFor:i.staleFor}));return x({staleDocs:s,count:s.length})}async function Gs(t,e){let{root:r,metric:n="cognitiveComplexity",threshold:s=10,limit:i=20}=e,o=await t.ensureFresh(r),a=Gt(o,{metric:n,threshold:s,limit:i});return x({metric:n,threshold:s,functions:a,count:a.length})}async function _s(t,e){let{root:r,metric:n="cognitiveComplexity",minComplexity:s=10,maxCoveragePct:i=50,minChurn:o=0,limit:a=20}=e,c=await t.ensureFresh(r);if(!$e(c))return x({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let{hotspots:l,count:p,churnDataAvailable:u}=jt(c,{metric:n,minComplexity:s,maxCoveragePct:i,minChurn:o,limit:a});return x({metric:n,minComplexity:s,maxCoveragePct:i,minChurn:o,churnDataAvailable:u,hotspots:l,count:p})}async function Os(t,e){let{root:r,minLines:n=6,ignoreLiterals:s=!0,maxPunctuationRatio:i=.5,limit:o=50}=e,a=await t.ensureFresh(r),c=e.ignoreDirs??[...z,...t.getConfig(r)?.ignoreDirs??[]],{groups:l}=await It(a,r,{minLines:n,ignoreLiterals:s,maxPunctuationRatio:i,limit:o,ignoreDirs:c,tokenCache:await t.getDuplicationTokenCache(r)});return t.flushDuplicationTokenCache(r),x({minLines:n,groups:l,count:l.length})}async function js(t,e){let{root:r,changedFiles:n,base:s,featureThreshold:i,format:o="tags"}=e,a=await t.ensureFresh(r),c=n??new nt().getChangedFiles(r,s).map(u=>se.relative(r,se.resolve(r,u))),l=i!==void 0?{featureDetection:{minOutDegree:i}}:void 0;if(o==="paths"){let u=kr(a,c,l);return x({changedFiles:c,affectedTests:u,count:u.length})}let p=Sr(a,c,l);return x({changedFiles:c,proposedTags:p})}async function zs(t,e){let{root:r,entryPoints:n,featureThreshold:s}=e,i=n?await t.getOrBuild(r,n.map(c=>se.resolve(r,c))):await t.ensureFresh(r),o=W(i.nodes,s!==void 0?{minOutDegree:s}:void 0),a=Array.from(o.values()).sort((c,l)=>l.outDegree-c.outDegree);return x({features:a,count:a.length})}async function Ws(t,e){let{root:r,entryPoints:n,filter:s,mermaid:i=!1,slim:o=!0}=e,a=n?await t.getOrBuild(r,n.map(l=>se.resolve(r,l))):await t.ensureFresh(r),c=He(a.serialize(),Ke(s));return i?x(Re.serialize(I.deserialize(c))):o?x(_t(c)):x(c)}async function Bs(t,e){let{root:r}=e,n=await t.ensureFreshWorkspace(r);return x(Ot(n))}async function $s(t,e){let{root:r,file:n}=e,i=(await t.ensureFreshWorkspace(r)).getAffectedAcrossPackages(n);return x({file:n,affected:i,count:i.length})}function Us(t,e){let{root:r}=e,n=t.invalidate(r);return x({root:r,cleared:n,message:n?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function Hs(t,e){let{root:r,type:n}=e,s=await t.ensureFresh(r),i=Bt(s);if(n)return x($t(i,n));let o=Array.from(i.types.values());return x({count:o.length,types:o})}async function Ks(t,e){let{root:r,paths:n,minOutDegree:s}=e,i=await t.ensureFresh(r),o=zt(i,s!==void 0?{minOutDegree:s}:void 0);if(n?.length){let c=n.map(l=>o.get(l)).filter(Boolean);return x({count:c.length,modules:c})}let a=Array.from(o.values());return x({count:a.length,modules:a})}async function Js(t,e){let{root:r,minOutDegree:n}=e,s=await t.ensureFresh(r),i=le(s,n!==void 0?{minOutDegree:n}:void 0),o=Object.fromEntries(i.features);return x({features:o,unassigned:i.unassigned})}async function Vs(t,e){let{root:r,function:n}=e,s=await t.ensureFresh(r);return x(Tt(s,n))}async function Qs(t,e){let{root:r,name:n}=e,s=await t.ensureFresh(r),i=Wt(s,n);return x({name:n,matches:i,count:i.length})}async function qs(t,e){let{root:r,entryPoints:n}=e,s=await t.ensureFresh(r),i=n?.length?n:wt(s,r);if(i.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return x(Ft(s,i))}async function Ys(t,e){let r=await t.ensureFresh(e.root),n=await or(r,e.root,{dryRun:e.dryRun??!1});return x(n)}var Xs=[{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. See docs/mcp.md for details on the testsOnly, cached, changedSymbols, and withMeta options.",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_risk_hotspots",description:"Find functions that are complex, in a poorly-covered file, and \u2014 when gitStats is enabled in mokosh.config \u2014 in a frequently-changed file. Requires a prior analyze() call and coverageReportPath set in mokosh.config; errors if no coverage data was loaded. Churn filtering is skipped (churnDataAvailable: false) when gitStats wasn't enabled, since complexity + low coverage alone is still a meaningful signal.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which per-function score to filter/sort on (default: cognitiveComplexity)"},minComplexity:{type:"number",description:"Minimum per-function complexity score to include (default: 10)"},maxCoveragePct:{type:"number",description:"Maximum containing-file coverage % to include (default: 50)"},minChurn:{type:"number",description:"Minimum containing-file 90-day commit count to include (default: 0). Ignored when gitStats wasn't enabled at analyze time."},limit:{type:"number",description:"Max results to return, worst-first by metric (default: 20)"}},required:["root"]}},{name:"find_duplicates",description:"Find duplicated code blocks across the project, largest-first. CSS/SCSS/Less are matched structurally by rule body; every other parsed language is tokenized and matched via suffix array. Lock files and ignored directories are always excluded. Requires a prior analyze() call. See docs/mcp.md for matching-strategy, normalization, and caching details.",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."},maxPunctuationRatio:{type:"number",description:"Maximum fraction of a token-shingled block's window that may be object/array-literal structural punctuation ({ } : , [ ]) (default: 0.5). Filters out blocks that are mostly schema/object-literal shape instead of substantive shared logic. Does not apply to the CSS/Less/SCSS structural comparator. Set 1 to disable."},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."},base:{type:"string",description:"Diff against this ref (e.g. 'origin/main') instead of only local working-tree/staged/untracked changes. Ignored when changedFiles is given. Needed in CI, where the checkout is already clean."},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, path, or other node metadata. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used. See docs/mcp.md for the full query DSL reference.",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 it returns only paths grouped by hub, so it's substantially smaller than a full graph query for the same question; compare output sizes yourself if you need an exact figure for your repo.",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 \u2014 check each match's `precision` field ('call' | 'file-level') before trusting caller/importer results as symbol-exact. See docs/mcp.md for per-language coverage details.",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: every exported symbol resolved to its defining file and kind, partitioned into internalFiles, unreachableFromEntry, and testFiles. Requires a prior analyze() call. When entryPoints is omitted, auto-detects from package.json exports/main/module. See docs/mcp.md for the export* expansion and partition semantics.",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 and loaded mokosh.config.json for a project root, forcing the next analyze() call to rebuild from disk and re-read config. Call this after editing source files OR mokosh.config.json mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data (or a stale config).",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, as an idempotent block \u2014 re-running is safe, the existing block is replaced in place. Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call. See docs/mcp.md for tag-kind and per-language block syntax details.",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 Fr(){let t=new ct,e=new Tl({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(Al,async()=>({tools:Xs})),e.setRequestHandler(El,async r=>{let{name:n,arguments:s}=r.params,i=s,a={analyze:c=>Es(t,c),get_dependencies:c=>As(t,c),get_dependents:c=>Ps(t,c),get_affected:c=>Ns(t,c),get_callers:c=>Is(t,c),find_symbol:c=>Qs(t,c),find_unused:c=>Ds(t,c),find_uncovered:c=>Rs(t,c),list_tags:c=>Ms(t,c),check_doc_drift:c=>Ls(t,c),find_complex_functions:c=>Gs(t,c),find_risk_hotspots:c=>_s(t,c),find_duplicates:c=>Os(t,c),propose_tags:c=>js(t,c),detect_features:c=>zs(t,c),get_type_graph:c=>Hs(t,c),get_module_responsibility:c=>Ks(t,c),get_feature_graph:c=>Js(t,c),get_call_graph:c=>Vs(t,c),get_api_surface:c=>qs(t,c),query:c=>Ws(t,c),get_workspace_packages:c=>Bs(t,c),get_workspace_affected:c=>$s(t,c),clear_cache:c=>Us(t,c),apply_tags:c=>Ys(t,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return Ts(i.root),await a(i)}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),e}async function Nl(){let t=Fr(),e=new Pl;await t.connect(e)}Nl().catch(console.error);export{Fr as createMcpServer};
41
41
  //# sourceMappingURL=mcp.mjs.map