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