refactory_depmap
Map dependencies of a file: discover its consumers, dependencies, and circular dependencies to understand code structure.
Instructions
Map dependencies for a file — who requires it (consumers), what it requires (dependencies), detect circular deps.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | Path to the file to map | |
| projectDir | No | Project root directory |
Implementation Reference
- src/tools/depmap.js:52-81 (handler)Core handler: mapDependencies() — given {file, projectDir}, scans all project files to find consumers (files that import the target), dependencies (what the target imports), dynamic require risks, and the full dependency graph.
function mapDependencies({ file, projectDir }) { const projDir = path.resolve(projectDir || path.dirname(file)); const absFile = path.resolve(file); const allFiles = collectFiles(projDir); const graph = {}, consumers = [], dependencies = [], dynamicRisks = []; const rel = (p) => path.relative(projDir, p); for (const f of allFiles) { const reqs = readReqs(f); const resolved = reqs.static .map((r) => resolveLocal(r, f, projDir)) .filter(Boolean); graph[f] = resolved; if (f !== absFile && resolved.includes(absFile)) consumers.push(f); if (f === absFile) { dependencies.push(...resolved); reqs.dynamic.forEach((d) => dynamicRisks.push(`${rel(f)}: require(${d})`)); } } // Flag dynamic requires in consumers of target for (const c of consumers) { const reqs = readReqs(c); reqs.dynamic.forEach((d) => dynamicRisks.push(`${rel(c)}: require(${d})`)); } const relGraph = {}; for (const [k, v] of Object.entries(graph)) relGraph[rel(k)] = v.map(rel); return { consumers: consumers.map(rel), dependencies: dependencies.map(rel), dynamicRisks, graph: relGraph }; } - src/tools/depmap.js:10-22 (helper)Helper: extractRequires() — parses source code for require(), import from, and side-effect import statements using regex.
function extractRequires(source) { const statics = new Set(), dynamics = new Set(); let m; const re1 = new RegExp(RE_REQUIRE.source, "g"); while ((m = re1.exec(source))) statics.add(m[2]); const re2 = new RegExp(RE_DYNAMIC.source, "g"); while ((m = re2.exec(source))) dynamics.add(m[1].trim()); const re3 = new RegExp(RE_IMPORT_FROM.source, "g"); while ((m = re3.exec(source))) statics.add(m[2]); const re4 = new RegExp(RE_IMPORT_SIDE.source, "g"); while ((m = re4.exec(source))) statics.add(m[2]); return { static: [...statics], dynamic: [...dynamics] }; } - src/tools/depmap.js:24-32 (helper)Helper: resolveLocal() — resolves a local require path (relative/absolute) to an actual file on disk, trying common extensions.
function resolveLocal(reqPath, fromFile, projectDir) { if (!reqPath.startsWith(".") && !reqPath.startsWith("/")) return null; const base = path.dirname(fromFile); for (const suffix of ["", ".js", ".ts", ".mjs", ".cjs", "/index.js", "/index.ts"]) { const abs = path.resolve(base, reqPath + suffix); if (abs.startsWith(projectDir) && fs.existsSync(abs) && fs.statSync(abs).isFile()) return abs; } return null; } - src/tools/depmap.js:34-46 (helper)Helper: collectFiles() — recursively collects all JS/TS files in a directory, skipping node_modules and .git.
function collectFiles(dir, exts = [".js", ".ts", ".mjs", ".cjs"]) { const results = []; if (!fs.existsSync(dir)) return results; for (const ent of fs.readdirSync(dir, { withFileTypes: true })) { const full = path.join(dir, ent.name); if (ent.isDirectory()) { if (ent.name !== "node_modules" && ent.name !== ".git") results.push(...collectFiles(full, exts)); } else if (exts.some((e) => ent.name.endsWith(e))) { results.push(full); } } return results; } - src/server.js:117-128 (schema)Schema and registration: defines the 'refactory_depmap' tool with name, description, and inputSchema (file, projectDir).
{ name: "refactory_depmap", description: "Map dependencies for a file — who requires it (consumers), what it requires (dependencies), detect circular deps.", inputSchema: { type: "object", properties: { file: { type: "string", description: "Path to the file to map" }, projectDir: { type: "string", description: "Project root directory" }, }, required: ["file"], }, },