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/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
@@ -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;
@@ -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: "pending" | "running" | "done" | "failed";
698
+ data: "done" | "pending" | "running" | "failed";
699
699
  driverParam: string;
700
700
  notNull: true;
701
701
  hasDefault: false;
@@ -0,0 +1,4 @@
1
+ import { RichDocGraph, type InMemoryFile } from "./bridge/index.js";
2
+ export declare function loadDocsAsFiles(docsRoot: string): InMemoryFile[];
3
+ export declare function buildGraph(docsRoot: string): RichDocGraph;
4
+ //# sourceMappingURL=graph.d.ts.map
@@ -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"}