markdown-lsp 0.2.2 → 1.1.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/README.md +206 -51
- package/bin/markdown-lsp +1 -1
- package/dist/ai/cache.d.ts +3 -0
- package/dist/ai/cache.d.ts.map +1 -0
- package/dist/ai/cache.js +27 -0
- package/dist/ai/cache.js.map +1 -0
- package/dist/ai/config.d.ts +6 -0
- package/dist/ai/config.d.ts.map +1 -1
- package/dist/ai/config.js +16 -3
- package/dist/ai/config.js.map +1 -1
- package/dist/ai/embeddings.d.ts +9 -2
- package/dist/ai/embeddings.d.ts.map +1 -1
- package/dist/ai/embeddings.js +48 -10
- package/dist/ai/embeddings.js.map +1 -1
- package/dist/ai/gateway.d.ts +3 -0
- package/dist/ai/gateway.d.ts.map +1 -1
- package/dist/ai/gateway.js +17 -8
- package/dist/ai/gateway.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +595 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/findReferences.d.ts +1 -1
- package/dist/db/schema.d.ts +1 -1
- package/dist/graph.d.ts +4 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +70 -0
- package/dist/graph.js.map +1 -0
- package/dist/lsp.d.ts +2 -0
- package/dist/lsp.d.ts.map +1 -0
- package/dist/lsp.js +343 -0
- package/dist/lsp.js.map +1 -0
- package/package.json +6 -5
package/dist/cli.js
ADDED
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { buildGraph } from "./graph.js";
|
|
4
|
+
import { listPages, searchText, searchTextRanked, searchSymbols, searchPaths, } from "./bridge/index.js";
|
|
5
|
+
const USAGE = `
|
|
6
|
+
markdown-lsp v1.1.0 — CLI for querying Markdown documentation graphs
|
|
7
|
+
|
|
8
|
+
USAGE
|
|
9
|
+
markdown-lsp <subcommand> [options]
|
|
10
|
+
|
|
11
|
+
SUBCOMMANDS
|
|
12
|
+
workspace-outline <docs-dir> [--prefix <p>] [--limit <n>]
|
|
13
|
+
List all pages in the workspace with metadata.
|
|
14
|
+
|
|
15
|
+
outline <docs-dir> <page>
|
|
16
|
+
Show the heading outline of a single page.
|
|
17
|
+
|
|
18
|
+
search-text <docs-dir> <query> [--mode ranked|verbatim] [--regex]
|
|
19
|
+
[--case-sensitive] [--prefix <p>] [--limit <n>] [--context <n>]
|
|
20
|
+
Full-text search. Default mode: ranked (natural-language). Use
|
|
21
|
+
--mode verbatim (or --regex) for exact/regex matching.
|
|
22
|
+
|
|
23
|
+
search-symbols <docs-dir> <query> [--limit <n>]
|
|
24
|
+
Fuzzy subsequence search across all headings.
|
|
25
|
+
|
|
26
|
+
search-paths <docs-dir> <glob>
|
|
27
|
+
List pages whose paths match a glob pattern (*, **, ?).
|
|
28
|
+
|
|
29
|
+
links-to <docs-dir> <page>
|
|
30
|
+
Show all pages that link to <page>.
|
|
31
|
+
|
|
32
|
+
links-from <docs-dir> <page>
|
|
33
|
+
Show all links that originate from <page>.
|
|
34
|
+
|
|
35
|
+
resolve-link <docs-dir> <from-page> <link-text>
|
|
36
|
+
Resolve a specific link text from a given page.
|
|
37
|
+
|
|
38
|
+
get-section <docs-dir> <page> <anchor>
|
|
39
|
+
Retrieve a section by its anchor slug.
|
|
40
|
+
|
|
41
|
+
graph <docs-dir> [--format json|dot|mermaid|html] [--out <file>]
|
|
42
|
+
Export the doc link graph. Default format: json (nodes/edges).
|
|
43
|
+
Use --format html for a self-contained interactive D3 visualisation.
|
|
44
|
+
Use --out <file> to write to disk instead of stdout.
|
|
45
|
+
|
|
46
|
+
semantic-search <docs-dir> <query> [--limit <n>] [--model <embedding-model>]
|
|
47
|
+
AI-powered semantic search using embeddings. Requires OPENROUTER_API_KEY
|
|
48
|
+
(or AI_GATEWAY_API_KEY). Results are cached in .markdown-lsp-cache/.
|
|
49
|
+
Default embedding model: openai/text-embedding-3-small
|
|
50
|
+
|
|
51
|
+
lsp [--stdio]
|
|
52
|
+
serve [--stdio]
|
|
53
|
+
Start the LSP stdio server (for editor integration).
|
|
54
|
+
Back-compat: --stdio | --node-ipc | --socket=<n> as first arg also
|
|
55
|
+
starts the LSP server.
|
|
56
|
+
|
|
57
|
+
GLOBAL FLAGS
|
|
58
|
+
--pretty Pretty-print JSON output (default: compact)
|
|
59
|
+
--text Human-readable output (where implemented)
|
|
60
|
+
-h, --help Print this help
|
|
61
|
+
|
|
62
|
+
OUTPUT
|
|
63
|
+
All subcommands print JSON to stdout (compact by default, use --pretty
|
|
64
|
+
for indented output). The LSP subcommand speaks the Language Server Protocol
|
|
65
|
+
over stdio — it does NOT print JSON.
|
|
66
|
+
|
|
67
|
+
EXAMPLES
|
|
68
|
+
markdown-lsp workspace-outline ./docs
|
|
69
|
+
markdown-lsp search-text ./docs "getting started" --pretty
|
|
70
|
+
markdown-lsp outline ./docs introduction.md
|
|
71
|
+
markdown-lsp graph ./docs --format json --pretty
|
|
72
|
+
markdown-lsp graph ./docs --format html --out graph.html
|
|
73
|
+
markdown-lsp semantic-search ./docs "how to set up webhooks" --limit 5
|
|
74
|
+
markdown-lsp lsp --stdio
|
|
75
|
+
`.trim();
|
|
76
|
+
function die(msg) {
|
|
77
|
+
process.stderr.write(msg + "\n");
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
function out(value, pretty) {
|
|
81
|
+
process.stdout.write((pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value)) + "\n");
|
|
82
|
+
}
|
|
83
|
+
async function startLsp() {
|
|
84
|
+
await import("./lsp.js");
|
|
85
|
+
}
|
|
86
|
+
function buildGraphExport(raw) {
|
|
87
|
+
const nodes = raw.pages.map((p) => ({
|
|
88
|
+
id: p.path,
|
|
89
|
+
title: p.title ?? p.path,
|
|
90
|
+
charCount: p.content.length,
|
|
91
|
+
sectionsCount: p.sections.length,
|
|
92
|
+
}));
|
|
93
|
+
const edges = raw.links
|
|
94
|
+
.filter((l) => l.toResolvedPath !== null)
|
|
95
|
+
.map((l) => ({
|
|
96
|
+
source: l.fromPath,
|
|
97
|
+
target: l.toResolvedPath,
|
|
98
|
+
kind: l.kind,
|
|
99
|
+
...(l.textAtLink ? { label: l.textAtLink } : {}),
|
|
100
|
+
}));
|
|
101
|
+
return { nodes, edges, unresolvedCount: raw.unresolved.length };
|
|
102
|
+
}
|
|
103
|
+
function renderGraphJson(data, pretty) {
|
|
104
|
+
return pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
105
|
+
}
|
|
106
|
+
function renderGraphDot(data) {
|
|
107
|
+
const lines = ['digraph G {', ' rankdir=LR;'];
|
|
108
|
+
// Declare nodes with labels
|
|
109
|
+
for (const n of data.nodes) {
|
|
110
|
+
const label = n.title.replace(/"/g, '\\"');
|
|
111
|
+
const id = n.id.replace(/"/g, '\\"');
|
|
112
|
+
lines.push(` "${id}" [label="${label}"];`);
|
|
113
|
+
}
|
|
114
|
+
// Edges
|
|
115
|
+
for (const e of data.edges) {
|
|
116
|
+
const src = e.source.replace(/"/g, '\\"');
|
|
117
|
+
const tgt = e.target.replace(/"/g, '\\"');
|
|
118
|
+
lines.push(` "${src}" -> "${tgt}";`);
|
|
119
|
+
}
|
|
120
|
+
lines.push('}');
|
|
121
|
+
return lines.join('\n');
|
|
122
|
+
}
|
|
123
|
+
function renderGraphMermaid(data) {
|
|
124
|
+
const lines = ['graph TD'];
|
|
125
|
+
for (const e of data.edges) {
|
|
126
|
+
const src = e.source.replace(/"/g, '\\"');
|
|
127
|
+
const tgt = e.target.replace(/"/g, '\\"');
|
|
128
|
+
lines.push(` "${src}" --> "${tgt}"`);
|
|
129
|
+
}
|
|
130
|
+
return lines.join('\n');
|
|
131
|
+
}
|
|
132
|
+
function renderGraphHtml(data, docsDir) {
|
|
133
|
+
const title = docsDir.split('/').filter(Boolean).pop() ?? docsDir;
|
|
134
|
+
const jsonData = JSON.stringify(data);
|
|
135
|
+
return `<!DOCTYPE html>
|
|
136
|
+
<html lang="en">
|
|
137
|
+
<head>
|
|
138
|
+
<meta charset="utf-8">
|
|
139
|
+
<title>Doc Graph — ${title}</title>
|
|
140
|
+
<script src="https://cdn.jsdelivr.net/npm/d3@7/dist/d3.min.js"></script>
|
|
141
|
+
<style>
|
|
142
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
143
|
+
body { font-family: system-ui, sans-serif; background: #0f1117; color: #e2e8f0; overflow: hidden; }
|
|
144
|
+
#toolbar { position: fixed; top: 0; left: 0; right: 0; height: 44px; background: #1a1d27;
|
|
145
|
+
border-bottom: 1px solid #2d3148; display: flex; align-items: center; padding: 0 16px;
|
|
146
|
+
z-index: 10; gap: 12px; font-size: 13px; }
|
|
147
|
+
#toolbar h1 { font-size: 14px; font-weight: 600; color: #a5b4fc; }
|
|
148
|
+
#toolbar span { color: #64748b; }
|
|
149
|
+
#graph { position: fixed; top: 44px; left: 0; right: 0; bottom: 0; }
|
|
150
|
+
#tooltip { position: fixed; pointer-events: none; background: #1e2130; border: 1px solid #3b4168;
|
|
151
|
+
border-radius: 6px; padding: 8px 12px; font-size: 12px; line-height: 1.5;
|
|
152
|
+
max-width: 280px; z-index: 20; display: none; }
|
|
153
|
+
#tooltip .title { font-weight: 600; color: #c7d2fe; margin-bottom: 2px; }
|
|
154
|
+
#tooltip .path { color: #64748b; font-size: 11px; }
|
|
155
|
+
#tooltip .stats { color: #94a3b8; font-size: 11px; margin-top: 4px; }
|
|
156
|
+
.node circle { cursor: pointer; transition: r 0.15s; }
|
|
157
|
+
.node text { pointer-events: none; font-size: 10px; fill: #cbd5e1; }
|
|
158
|
+
.link { stroke: #3b4168; stroke-opacity: 0.6; fill: none; }
|
|
159
|
+
.link.highlighted { stroke: #a5b4fc; stroke-opacity: 1; }
|
|
160
|
+
.node.dimmed circle { opacity: 0.25; }
|
|
161
|
+
.node.dimmed text { opacity: 0.15; }
|
|
162
|
+
.node.highlighted circle { stroke: #a5b4fc !important; stroke-width: 2px !important; }
|
|
163
|
+
</style>
|
|
164
|
+
</head>
|
|
165
|
+
<body>
|
|
166
|
+
<div id="toolbar">
|
|
167
|
+
<h1>Doc Graph — ${title}</h1>
|
|
168
|
+
<span id="stats"></span>
|
|
169
|
+
</div>
|
|
170
|
+
<div id="tooltip"></div>
|
|
171
|
+
<svg id="graph"></svg>
|
|
172
|
+
<script>
|
|
173
|
+
const DATA = ${jsonData};
|
|
174
|
+
|
|
175
|
+
const width = window.innerWidth;
|
|
176
|
+
const height = window.innerHeight - 44;
|
|
177
|
+
const svg = d3.select('#graph')
|
|
178
|
+
.attr('width', width)
|
|
179
|
+
.attr('height', height);
|
|
180
|
+
|
|
181
|
+
// Build adjacency for highlight
|
|
182
|
+
const adjacency = new Map();
|
|
183
|
+
for (const n of DATA.nodes) adjacency.set(n.id, new Set());
|
|
184
|
+
for (const e of DATA.edges) {
|
|
185
|
+
if (adjacency.has(e.source)) adjacency.get(e.source).add(e.target);
|
|
186
|
+
if (adjacency.has(e.target)) adjacency.get(e.target).add(e.source);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
document.getElementById('stats').textContent =
|
|
190
|
+
DATA.nodes.length + ' pages · ' + DATA.edges.length + ' links · ' +
|
|
191
|
+
DATA.unresolvedCount + ' unresolved';
|
|
192
|
+
|
|
193
|
+
const g = svg.append('g');
|
|
194
|
+
|
|
195
|
+
// Zoom
|
|
196
|
+
svg.call(d3.zoom()
|
|
197
|
+
.scaleExtent([0.05, 4])
|
|
198
|
+
.on('zoom', (event) => g.attr('transform', event.transform)));
|
|
199
|
+
|
|
200
|
+
// Links
|
|
201
|
+
const linkSel = g.append('g').selectAll('line')
|
|
202
|
+
.data(DATA.edges)
|
|
203
|
+
.join('line')
|
|
204
|
+
.attr('class', 'link')
|
|
205
|
+
.attr('marker-end', 'url(#arrow)');
|
|
206
|
+
|
|
207
|
+
// Arrow marker
|
|
208
|
+
svg.append('defs').append('marker')
|
|
209
|
+
.attr('id', 'arrow')
|
|
210
|
+
.attr('viewBox', '0 -4 8 8')
|
|
211
|
+
.attr('refX', 14)
|
|
212
|
+
.attr('refY', 0)
|
|
213
|
+
.attr('markerWidth', 6)
|
|
214
|
+
.attr('markerHeight', 6)
|
|
215
|
+
.attr('orient', 'auto')
|
|
216
|
+
.append('path')
|
|
217
|
+
.attr('d', 'M0,-4L8,0L0,4')
|
|
218
|
+
.attr('fill', '#3b4168');
|
|
219
|
+
|
|
220
|
+
// Color scale by first path segment
|
|
221
|
+
const color = d3.scaleOrdinal(d3.schemeTableau10);
|
|
222
|
+
const segColor = (id) => color(id.split('/')[0] ?? '');
|
|
223
|
+
|
|
224
|
+
// Nodes
|
|
225
|
+
const nodeSel = g.append('g').selectAll('g')
|
|
226
|
+
.data(DATA.nodes)
|
|
227
|
+
.join('g')
|
|
228
|
+
.attr('class', 'node')
|
|
229
|
+
.call(d3.drag()
|
|
230
|
+
.on('start', (event, d) => { if (!event.active) sim.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; })
|
|
231
|
+
.on('drag', (event, d) => { d.fx = event.x; d.fy = event.y; })
|
|
232
|
+
.on('end', (event, d) => { if (!event.active) sim.alphaTarget(0); d.fx = null; d.fy = null; }));
|
|
233
|
+
|
|
234
|
+
nodeSel.append('circle')
|
|
235
|
+
.attr('r', d => Math.max(5, Math.min(14, Math.sqrt(d.charCount / 120))))
|
|
236
|
+
.attr('fill', d => segColor(d.id))
|
|
237
|
+
.attr('fill-opacity', 0.85)
|
|
238
|
+
.attr('stroke', d => segColor(d.id))
|
|
239
|
+
.attr('stroke-width', 1);
|
|
240
|
+
|
|
241
|
+
nodeSel.append('text')
|
|
242
|
+
.attr('dx', d => Math.max(5, Math.min(14, Math.sqrt(d.charCount / 120))) + 3)
|
|
243
|
+
.attr('dy', '0.35em')
|
|
244
|
+
.text(d => d.title.length > 24 ? d.title.slice(0, 22) + '…' : d.title);
|
|
245
|
+
|
|
246
|
+
// Tooltip
|
|
247
|
+
const tooltip = document.getElementById('tooltip');
|
|
248
|
+
nodeSel
|
|
249
|
+
.on('mouseover', (event, d) => {
|
|
250
|
+
tooltip.style.display = 'block';
|
|
251
|
+
tooltip.innerHTML = '<div class="title">' + d.title + '</div>' +
|
|
252
|
+
'<div class="path">' + d.id + '</div>' +
|
|
253
|
+
'<div class="stats">' + d.charCount.toLocaleString() + ' chars · ' + d.sectionsCount + ' sections</div>';
|
|
254
|
+
highlightNode(d);
|
|
255
|
+
})
|
|
256
|
+
.on('mousemove', (event) => {
|
|
257
|
+
tooltip.style.left = (event.clientX + 14) + 'px';
|
|
258
|
+
tooltip.style.top = (event.clientY + 14) + 'px';
|
|
259
|
+
})
|
|
260
|
+
.on('mouseout', () => {
|
|
261
|
+
tooltip.style.display = 'none';
|
|
262
|
+
clearHighlight();
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
function highlightNode(d) {
|
|
266
|
+
const neighbors = adjacency.get(d.id) ?? new Set();
|
|
267
|
+
nodeSel.classed('dimmed', n => n.id !== d.id && !neighbors.has(n.id));
|
|
268
|
+
nodeSel.classed('highlighted', n => n.id === d.id);
|
|
269
|
+
linkSel.classed('highlighted', e => e.source.id === d.id || e.target.id === d.id);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function clearHighlight() {
|
|
273
|
+
nodeSel.classed('dimmed', false).classed('highlighted', false);
|
|
274
|
+
linkSel.classed('highlighted', false);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Force simulation
|
|
278
|
+
const sim = d3.forceSimulation(DATA.nodes)
|
|
279
|
+
.force('link', d3.forceLink(DATA.edges).id(d => d.id).distance(80).strength(0.5))
|
|
280
|
+
.force('charge', d3.forceManyBody().strength(-180))
|
|
281
|
+
.force('center', d3.forceCenter(width / 2, height / 2))
|
|
282
|
+
.force('collide', d3.forceCollide(18))
|
|
283
|
+
.on('tick', () => {
|
|
284
|
+
linkSel
|
|
285
|
+
.attr('x1', d => d.source.x)
|
|
286
|
+
.attr('y1', d => d.source.y)
|
|
287
|
+
.attr('x2', d => d.target.x)
|
|
288
|
+
.attr('y2', d => d.target.y);
|
|
289
|
+
nodeSel.attr('transform', d => 'translate(' + d.x + ',' + d.y + ')');
|
|
290
|
+
});
|
|
291
|
+
</script>
|
|
292
|
+
</body>
|
|
293
|
+
</html>`;
|
|
294
|
+
}
|
|
295
|
+
// ── Cosine similarity (no deps) ───────────────────────────────────────────────
|
|
296
|
+
function cosineSim(a, b) {
|
|
297
|
+
let dot = 0, na = 0, nb = 0;
|
|
298
|
+
for (let i = 0; i < a.length; i++) {
|
|
299
|
+
dot += a[i] * b[i];
|
|
300
|
+
na += a[i] * a[i];
|
|
301
|
+
nb += b[i] * b[i];
|
|
302
|
+
}
|
|
303
|
+
if (na === 0 || nb === 0)
|
|
304
|
+
return 0;
|
|
305
|
+
return dot / (Math.sqrt(na) * Math.sqrt(nb));
|
|
306
|
+
}
|
|
307
|
+
// ── Main ──────────────────────────────────────────────────────────────────────
|
|
308
|
+
async function startLspServer() {
|
|
309
|
+
await import("./lsp.js");
|
|
310
|
+
}
|
|
311
|
+
async function main() {
|
|
312
|
+
const argv = process.argv.slice(2);
|
|
313
|
+
// Back-compat: if the first argument looks like an old LSP flag, start LSP.
|
|
314
|
+
if (argv.length === 0 ||
|
|
315
|
+
argv[0] === "--stdio" ||
|
|
316
|
+
argv[0] === "--node-ipc" ||
|
|
317
|
+
(argv[0] !== undefined && argv[0].startsWith("--socket"))) {
|
|
318
|
+
if (argv.length === 0) {
|
|
319
|
+
// No args: print usage and exit cleanly (not the old LSP crash).
|
|
320
|
+
process.stdout.write(USAGE + "\n");
|
|
321
|
+
process.exit(0);
|
|
322
|
+
}
|
|
323
|
+
// Old LSP invocation style — keep working so editor configs don't break.
|
|
324
|
+
await startLspServer();
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const subcommand = argv[0];
|
|
328
|
+
const rest = argv.slice(1);
|
|
329
|
+
// Help shortcuts
|
|
330
|
+
if (subcommand === "--help" || subcommand === "-h") {
|
|
331
|
+
process.stdout.write(USAGE + "\n");
|
|
332
|
+
process.exit(0);
|
|
333
|
+
}
|
|
334
|
+
// LSP subcommand
|
|
335
|
+
if (subcommand === "lsp" || subcommand === "serve") {
|
|
336
|
+
await startLspServer();
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
// Parse global flags from the remaining args
|
|
340
|
+
let pretty = false;
|
|
341
|
+
const filteredRest = [];
|
|
342
|
+
for (const arg of rest) {
|
|
343
|
+
if (arg === "--pretty")
|
|
344
|
+
pretty = true;
|
|
345
|
+
else
|
|
346
|
+
filteredRest.push(arg);
|
|
347
|
+
}
|
|
348
|
+
switch (subcommand) {
|
|
349
|
+
case "workspace-outline": {
|
|
350
|
+
const { values, positionals } = parseArgs({
|
|
351
|
+
args: filteredRest,
|
|
352
|
+
options: {
|
|
353
|
+
prefix: { type: "string" },
|
|
354
|
+
limit: { type: "string" },
|
|
355
|
+
},
|
|
356
|
+
allowPositionals: true,
|
|
357
|
+
});
|
|
358
|
+
const docsDir = positionals[0] ?? die("workspace-outline requires <docs-dir>");
|
|
359
|
+
const graph = buildGraph(docsDir);
|
|
360
|
+
const result = listPages(graph, {
|
|
361
|
+
prefix: values.prefix,
|
|
362
|
+
limit: values.limit !== undefined ? parseInt(values.limit, 10) : undefined,
|
|
363
|
+
});
|
|
364
|
+
out(result, pretty);
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
case "outline": {
|
|
368
|
+
const { positionals } = parseArgs({
|
|
369
|
+
args: filteredRest,
|
|
370
|
+
options: {},
|
|
371
|
+
allowPositionals: true,
|
|
372
|
+
});
|
|
373
|
+
const docsDir = positionals[0] ?? die("outline requires <docs-dir>");
|
|
374
|
+
const page = positionals[1] ?? die("outline requires <page>");
|
|
375
|
+
const graph = buildGraph(docsDir);
|
|
376
|
+
const result = graph.outlineOf(page);
|
|
377
|
+
out(result, pretty);
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
case "search-text": {
|
|
381
|
+
const { values, positionals } = parseArgs({
|
|
382
|
+
args: filteredRest,
|
|
383
|
+
options: {
|
|
384
|
+
mode: { type: "string" },
|
|
385
|
+
regex: { type: "boolean" },
|
|
386
|
+
"case-sensitive": { type: "boolean" },
|
|
387
|
+
prefix: { type: "string" },
|
|
388
|
+
limit: { type: "string" },
|
|
389
|
+
context: { type: "string" },
|
|
390
|
+
},
|
|
391
|
+
allowPositionals: true,
|
|
392
|
+
});
|
|
393
|
+
const docsDir = positionals[0] ?? die("search-text requires <docs-dir>");
|
|
394
|
+
const query = positionals[1] ?? die("search-text requires <query>");
|
|
395
|
+
const graph = buildGraph(docsDir);
|
|
396
|
+
const opts = {
|
|
397
|
+
regex: values.regex,
|
|
398
|
+
caseSensitive: values["case-sensitive"],
|
|
399
|
+
pathPrefix: values.prefix,
|
|
400
|
+
limit: values.limit !== undefined ? parseInt(values.limit, 10) : undefined,
|
|
401
|
+
contextChars: values.context !== undefined ? parseInt(values.context, 10) : undefined,
|
|
402
|
+
};
|
|
403
|
+
const mode = values.mode ?? "ranked";
|
|
404
|
+
const result = mode === "verbatim" || values.regex
|
|
405
|
+
? searchText(graph, query, opts)
|
|
406
|
+
: searchTextRanked(graph, query, opts);
|
|
407
|
+
out(result, pretty);
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
case "search-symbols": {
|
|
411
|
+
const { values, positionals } = parseArgs({
|
|
412
|
+
args: filteredRest,
|
|
413
|
+
options: {
|
|
414
|
+
limit: { type: "string" },
|
|
415
|
+
},
|
|
416
|
+
allowPositionals: true,
|
|
417
|
+
});
|
|
418
|
+
const docsDir = positionals[0] ?? die("search-symbols requires <docs-dir>");
|
|
419
|
+
const query = positionals[1] ?? die("search-symbols requires <query>");
|
|
420
|
+
const graph = buildGraph(docsDir);
|
|
421
|
+
const limit = values.limit !== undefined ? parseInt(values.limit, 10) : undefined;
|
|
422
|
+
const result = searchSymbols(graph, query, limit);
|
|
423
|
+
out(result, pretty);
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case "search-paths": {
|
|
427
|
+
const { positionals } = parseArgs({
|
|
428
|
+
args: filteredRest,
|
|
429
|
+
options: {},
|
|
430
|
+
allowPositionals: true,
|
|
431
|
+
});
|
|
432
|
+
const docsDir = positionals[0] ?? die("search-paths requires <docs-dir>");
|
|
433
|
+
const glob = positionals[1] ?? die("search-paths requires <glob>");
|
|
434
|
+
const graph = buildGraph(docsDir);
|
|
435
|
+
const result = searchPaths(graph, glob);
|
|
436
|
+
out(result, pretty);
|
|
437
|
+
break;
|
|
438
|
+
}
|
|
439
|
+
case "links-to": {
|
|
440
|
+
const { positionals } = parseArgs({
|
|
441
|
+
args: filteredRest,
|
|
442
|
+
options: {},
|
|
443
|
+
allowPositionals: true,
|
|
444
|
+
});
|
|
445
|
+
const docsDir = positionals[0] ?? die("links-to requires <docs-dir>");
|
|
446
|
+
const page = positionals[1] ?? die("links-to requires <page>");
|
|
447
|
+
const graph = buildGraph(docsDir);
|
|
448
|
+
const result = graph.incomingLinks(page);
|
|
449
|
+
out(result, pretty);
|
|
450
|
+
break;
|
|
451
|
+
}
|
|
452
|
+
case "links-from": {
|
|
453
|
+
const { positionals } = parseArgs({
|
|
454
|
+
args: filteredRest,
|
|
455
|
+
options: {},
|
|
456
|
+
allowPositionals: true,
|
|
457
|
+
});
|
|
458
|
+
const docsDir = positionals[0] ?? die("links-from requires <docs-dir>");
|
|
459
|
+
const page = positionals[1] ?? die("links-from requires <page>");
|
|
460
|
+
const graph = buildGraph(docsDir);
|
|
461
|
+
const result = graph.outgoingLinks(page);
|
|
462
|
+
out(result, pretty);
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
case "resolve-link": {
|
|
466
|
+
const { positionals } = parseArgs({
|
|
467
|
+
args: filteredRest,
|
|
468
|
+
options: {},
|
|
469
|
+
allowPositionals: true,
|
|
470
|
+
});
|
|
471
|
+
const docsDir = positionals[0] ?? die("resolve-link requires <docs-dir>");
|
|
472
|
+
const fromPage = positionals[1] ?? die("resolve-link requires <from-page>");
|
|
473
|
+
const linkText = positionals[2] ?? die("resolve-link requires <link-text>");
|
|
474
|
+
const graph = buildGraph(docsDir);
|
|
475
|
+
const links = graph.outgoingLinks(fromPage);
|
|
476
|
+
const match = links.find((l) => l.textAtLink === linkText) ?? null;
|
|
477
|
+
out(match, pretty);
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
case "get-section": {
|
|
481
|
+
const { positionals } = parseArgs({
|
|
482
|
+
args: filteredRest,
|
|
483
|
+
options: {},
|
|
484
|
+
allowPositionals: true,
|
|
485
|
+
});
|
|
486
|
+
const docsDir = positionals[0] ?? die("get-section requires <docs-dir>");
|
|
487
|
+
const page = positionals[1] ?? die("get-section requires <page>");
|
|
488
|
+
const anchor = positionals[2] ?? die("get-section requires <anchor>");
|
|
489
|
+
const graph = buildGraph(docsDir);
|
|
490
|
+
const pageObj = graph.pageByPath(page);
|
|
491
|
+
const section = pageObj?.sections.find((s) => s.anchor === anchor) ?? null;
|
|
492
|
+
out(section, pretty);
|
|
493
|
+
break;
|
|
494
|
+
}
|
|
495
|
+
case "graph": {
|
|
496
|
+
const { values, positionals } = parseArgs({
|
|
497
|
+
args: filteredRest,
|
|
498
|
+
options: {
|
|
499
|
+
format: { type: "string" },
|
|
500
|
+
out: { type: "string" },
|
|
501
|
+
},
|
|
502
|
+
allowPositionals: true,
|
|
503
|
+
});
|
|
504
|
+
const docsDir = positionals[0] ?? die("graph requires <docs-dir>");
|
|
505
|
+
const format = (values.format ?? "json");
|
|
506
|
+
const graph = buildGraph(docsDir);
|
|
507
|
+
const raw = graph.toJSON();
|
|
508
|
+
const data = buildGraphExport(raw);
|
|
509
|
+
let result;
|
|
510
|
+
switch (format) {
|
|
511
|
+
case "json":
|
|
512
|
+
result = renderGraphJson(data, pretty);
|
|
513
|
+
break;
|
|
514
|
+
case "dot":
|
|
515
|
+
result = renderGraphDot(data);
|
|
516
|
+
break;
|
|
517
|
+
case "mermaid":
|
|
518
|
+
result = renderGraphMermaid(data);
|
|
519
|
+
break;
|
|
520
|
+
case "html":
|
|
521
|
+
result = renderGraphHtml(data, docsDir);
|
|
522
|
+
break;
|
|
523
|
+
default:
|
|
524
|
+
die(`Unknown format: ${format}. Use json, dot, mermaid, or html.`);
|
|
525
|
+
}
|
|
526
|
+
if (values.out) {
|
|
527
|
+
fs.writeFileSync(values.out, result, "utf8");
|
|
528
|
+
process.stderr.write(`Graph written to ${values.out}\n`);
|
|
529
|
+
}
|
|
530
|
+
else {
|
|
531
|
+
process.stdout.write(result + "\n");
|
|
532
|
+
}
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
case "semantic-search": {
|
|
536
|
+
const { values, positionals } = parseArgs({
|
|
537
|
+
args: filteredRest,
|
|
538
|
+
options: {
|
|
539
|
+
limit: { type: "string" },
|
|
540
|
+
model: { type: "string" },
|
|
541
|
+
},
|
|
542
|
+
allowPositionals: true,
|
|
543
|
+
});
|
|
544
|
+
const docsDir = positionals[0] ?? die("semantic-search requires <docs-dir>");
|
|
545
|
+
const query = positionals[1] ?? die("semantic-search requires <query>");
|
|
546
|
+
const limit = values.limit !== undefined ? parseInt(values.limit, 10) : 10;
|
|
547
|
+
const modelOverride = values.model;
|
|
548
|
+
// Check API key before doing any work
|
|
549
|
+
const { assertApiKey } = await import("./ai/config.js");
|
|
550
|
+
assertApiKey();
|
|
551
|
+
const { embedTexts, embedOne } = await import("./ai/embeddings.js");
|
|
552
|
+
const graph = buildGraph(docsDir);
|
|
553
|
+
const pages = graph.pages;
|
|
554
|
+
// Build embedding texts (title + first 2000 chars of content per page)
|
|
555
|
+
const pageTexts = pages.map((p) => {
|
|
556
|
+
const titlePart = p.title ? p.title + "\n\n" : "";
|
|
557
|
+
return titlePart + p.content.slice(0, 2000);
|
|
558
|
+
});
|
|
559
|
+
// Embed all pages (cached) and the query
|
|
560
|
+
const [pageEmbeddings, queryVec] = await Promise.all([
|
|
561
|
+
embedTexts(pageTexts, modelOverride, true),
|
|
562
|
+
embedOne(query, modelOverride),
|
|
563
|
+
]);
|
|
564
|
+
// Score each page
|
|
565
|
+
const scored = pages.map((p, i) => {
|
|
566
|
+
const vec = pageEmbeddings.vectors[i];
|
|
567
|
+
if (!vec)
|
|
568
|
+
return { page: p, score: 0 };
|
|
569
|
+
return { page: p, score: cosineSim(queryVec, vec) };
|
|
570
|
+
});
|
|
571
|
+
scored.sort((a, b) => b.score - a.score);
|
|
572
|
+
const topN = scored.slice(0, limit);
|
|
573
|
+
const results = topN.map(({ page, score }) => {
|
|
574
|
+
// Extract a short snippet (first 200 chars of content)
|
|
575
|
+
const snippet = page.content.slice(0, 200).replace(/\s+/g, " ").trim();
|
|
576
|
+
return {
|
|
577
|
+
pagePath: page.path,
|
|
578
|
+
pageTitle: page.title ?? page.path,
|
|
579
|
+
score: Math.round(score * 10000) / 10000,
|
|
580
|
+
snippet: snippet.length < page.content.length ? snippet + "…" : snippet,
|
|
581
|
+
};
|
|
582
|
+
});
|
|
583
|
+
out(results, pretty);
|
|
584
|
+
break;
|
|
585
|
+
}
|
|
586
|
+
default:
|
|
587
|
+
process.stderr.write(`Unknown subcommand: ${subcommand}\n\n${USAGE}\n`);
|
|
588
|
+
process.exit(1);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
main().catch((err) => {
|
|
592
|
+
process.stderr.write("[markdown-lsp] Fatal error: " + (err instanceof Error ? err.stack ?? err.message : String(err)) + "\n");
|
|
593
|
+
process.exit(1);
|
|
594
|
+
});
|
|
595
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,9 +28,9 @@ export interface UnresolvedLink {
|
|
|
28
28
|
}
|
|
29
29
|
export declare function findUnresolvedLinks(workspace: WorkspaceRef, forDocPath?: string): Promise<UnresolvedLink[]>;
|
|
30
30
|
export declare function getDocumentByPath(workspace: WorkspaceRef, relPath: string): Promise<{
|
|
31
|
+
path: string;
|
|
31
32
|
id: string;
|
|
32
33
|
workspaceId: string;
|
|
33
|
-
path: string;
|
|
34
34
|
contentHash: string;
|
|
35
35
|
title: string | null;
|
|
36
36
|
lastIndexedAt: Date;
|
package/dist/db/schema.d.ts
CHANGED
|
@@ -695,7 +695,7 @@ export declare const reindexJobs: import("drizzle-orm/pg-core").PgTableWithColum
|
|
|
695
695
|
tableName: "mdlsp_reindex_jobs";
|
|
696
696
|
dataType: "string";
|
|
697
697
|
columnType: "PgText";
|
|
698
|
-
data: "
|
|
698
|
+
data: "done" | "pending" | "running" | "failed";
|
|
699
699
|
driverParam: string;
|
|
700
700
|
notNull: true;
|
|
701
701
|
hasDefault: false;
|
package/dist/graph.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EAEZ,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAA;AAc1B,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAKhE;AA4CD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAIzD"}
|