UNPKG

pi-lens

Version:

Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo

152 lines (150 loc) • 5.94 kB
#!/usr/bin/env node import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url); import { buildOrUpdateGraph, flushReviewGraphPersist, getGraphBuildInfoForGraph, getLastGraphBuildInfo, getLastReviewGraphBuildAttempt, graphWasmTrapDetail, reviewGraphCachePath } from "../chunk-LSMJ6KBE.js"; import "../chunk-3MED75HT.js"; import "../chunk-3I5QFT3N.js"; import "../chunk-TVN5N6GY.js"; import "../chunk-ARFCXG7S.js"; import "../chunk-OAXNDZJ7.js"; import "../chunk-XIMYZ3JA.js"; import "../chunk-B3I2UUT4.js"; import "../chunk-DIULIWKU.js"; import "../chunk-VDBPVIKD.js"; import "../chunk-5W3R6LFT.js"; import { isTreeSitterWasmAborted } from "../chunk-LW6XKDZQ.js"; import "../chunk-Z54ZSOBZ.js"; import "../chunk-TGPXLY2J.js"; import "../chunk-QOZXJ4NA.js"; import "../chunk-V7R425XG.js"; import "../chunk-PAK6IDME.js"; import "../chunk-GUOGVTCQ.js"; import "../chunk-AJVLWNFN.js"; import "../chunk-YGVYKNSN.js"; import "../chunk-LNAKEO63.js"; import "../chunk-Z3CCVDUB.js"; import "../chunk-PWFHBTSF.js"; import "../chunk-2BEMIWEW.js"; import "../chunk-OQGFCZJ4.js"; import "../chunk-RUOG5D2C.js"; import "../chunk-U3VGR4VU.js"; import "../chunk-NTUJEGDZ.js"; import "../chunk-EOKRQ3SA.js"; import "../chunk-WONERJTP.js"; import "../chunk-22AVIGXS.js"; import "../chunk-GVXA6CCE.js"; import "../chunk-6QIUX4EP.js"; import "../chunk-VHQLPIRJ.js"; import "../chunk-VN2AXLEX.js"; import "../chunk-BW5KFIQC.js"; import "../chunk-QYF5S6P6.js"; import "../chunk-5ZEJHV35.js"; import "../chunk-DQ2NZ7C4.js"; import "../chunk-VNMT7C64.js"; import "../chunk-2EECBNC5.js"; import "../chunk-N3YQJI6O.js"; import "../chunk-O6TQT6RI.js"; import "../chunk-5THXD6X5.js"; import "../chunk-UK3CMEAL.js"; import "../chunk-LJDODBBZ.js"; import { FactStore } from "../chunk-NMABWBZN.js"; import "../chunk-ABBOA7UD.js"; import "../chunk-Q5U6FMDI.js"; import "../chunk-NXL4FFQQ.js"; // dist/mcp/cli.js import * as fs from "node:fs"; import * as path from "node:path"; process.env.PI_LENS_GRAPH_PERSIST_DEBOUNCE_MS = "3600000"; function cwdArg() { const equals = process.argv.find((arg) => arg.startsWith("--cwd=")); if (equals) return equals.slice("--cwd=".length); const index = process.argv.indexOf("--cwd"); if (index >= 0) { const value = process.argv[index + 1]; if (!value || value.startsWith("-")) throw new Error("--cwd requires a directory"); return value; } return process.cwd(); } var FAILED = /* @__PURE__ */ Symbol("build-graph-failed"); function fail(reason) { process.stderr.write(`pi-lens build-graph failed: ${reason} `); process.exitCode = 1; throw FAILED; } async function buildGraph() { const cwd = path.resolve(cwdArg()); let stat; try { stat = fs.statSync(cwd); } catch (err) { fail(`cannot access cwd ${cwd}: ${err.message}`); } if (!stat.isDirectory()) fail(`cwd is not a directory: ${cwd}`); const startedAt = Date.now(); const graph = await buildOrUpdateGraph(cwd, [], new FactStore("mcp-cli")); const attempt = getLastReviewGraphBuildAttempt(cwd); if (!attempt || attempt.outcome !== "succeeded") { fail(attempt?.reason ?? attempt?.outcome ?? "build produced no result"); } const persisted = flushReviewGraphPersist(cwd); if (!persisted.ok) { const buildInfo = getLastGraphBuildInfo(); const snapshotPath = reviewGraphCachePath(cwd); if (!buildInfo.graphChanged && fs.existsSync(snapshotPath)) { const bytes = fs.statSync(snapshotPath).size; const durationMs2 = Date.now() - startedAt; process.stdout.write(`pi-lens build-graph: snapshot already current (mode=${buildInfo.mode}) files=${graph.fileNodes.size} nodes=${graph.nodes.size} edges=${graph.edges.length} jsonBytes=${bytes} durationMs=${durationMs2} `); return; } fail(persisted.reason ?? "graph snapshot was not persisted"); } const durationMs = Date.now() - startedAt; const coverage = persisted.coverage; const wasmTrappedFiles = getGraphBuildInfoForGraph(graph).wasmTrappedFiles ?? 0; const wasmAborted = isTreeSitterWasmAborted(); if (wasmAborted || wasmTrappedFiles > 0) { const degraded = wasmAborted ? "review graph degraded \u2014 tree-sitter disabled for this process until restart" : graphWasmTrapDetail(wasmTrappedFiles); const recovery = wasmAborted ? "" : "those files were skipped and are re-extracted on the next build; "; process.stdout.write(`pi-lens build-graph: ${degraded}; ${recovery}` + (coverage?.partial ? `PARTIAL persist (cap=${coverage.cap} exceeded) persistedNodes=${coverage.persistedNodes}/${coverage.totalNodes} persistedEdges=${coverage.persistedEdges}/${coverage.totalEdges} ` : "") + `files=${graph.fileNodes.size} nodes=${graph.nodes.size} edges=${graph.edges.length} elements=${persisted.elements} jsonBytes=${persisted.bytes} durationMs=${durationMs} `); return; } if (coverage?.partial) { process.stdout.write(`pi-lens build-graph: PARTIAL persist (cap=${coverage.cap} exceeded) files=${graph.fileNodes.size} nodes=${graph.nodes.size} edges=${graph.edges.length} persistedNodes=${coverage.persistedNodes}/${coverage.totalNodes} persistedEdges=${coverage.persistedEdges}/${coverage.totalEdges} elements=${persisted.elements} jsonBytes=${persisted.bytes} durationMs=${durationMs} `); return; } process.stdout.write(`pi-lens build-graph: files=${graph.fileNodes.size} nodes=${graph.nodes.size} edges=${graph.edges.length} elements=${persisted.elements} jsonBytes=${persisted.bytes} durationMs=${durationMs} `); } async function main() { const command = process.argv[2]; if (command !== "build-graph") { fail("usage: pi-lens build-graph [--cwd <dir>]"); } await buildGraph(); } main().catch((err) => { if (err === FAILED) return; process.stderr.write(`pi-lens build-graph failed: ${err instanceof Error ? err.message : String(err)} `); process.exitCode = 1; });