pi-lens
Version:
Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo
152 lines (150 loc) • 5.94 kB
JavaScript
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;
});