markdown-lsp 0.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/LICENSE +21 -0
- package/README.md +104 -0
- package/bin/markdown-lsp +2 -0
- package/dist/ai/config.d.ts +9 -0
- package/dist/ai/config.d.ts.map +1 -0
- package/dist/ai/config.js +19 -0
- package/dist/ai/config.js.map +1 -0
- package/dist/ai/embeddings.d.ts +7 -0
- package/dist/ai/embeddings.d.ts.map +1 -0
- package/dist/ai/embeddings.js +27 -0
- package/dist/ai/embeddings.js.map +1 -0
- package/dist/ai/extract.d.ts +58 -0
- package/dist/ai/extract.d.ts.map +1 -0
- package/dist/ai/extract.js +58 -0
- package/dist/ai/extract.js.map +1 -0
- package/dist/ai/gateway.d.ts +5 -0
- package/dist/ai/gateway.d.ts.map +1 -0
- package/dist/ai/gateway.js +18 -0
- package/dist/ai/gateway.js.map +1 -0
- package/dist/bridge/inMemoryGraph.d.ts +32 -0
- package/dist/bridge/inMemoryGraph.d.ts.map +1 -0
- package/dist/bridge/inMemoryGraph.js +94 -0
- package/dist/bridge/inMemoryGraph.js.map +1 -0
- package/dist/core/documentSymbols.d.ts +33 -0
- package/dist/core/documentSymbols.d.ts.map +1 -0
- package/dist/core/documentSymbols.js +113 -0
- package/dist/core/documentSymbols.js.map +1 -0
- package/dist/core/findReferences.d.ts +38 -0
- package/dist/core/findReferences.d.ts.map +1 -0
- package/dist/core/findReferences.js +59 -0
- package/dist/core/findReferences.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/db/client.d.ts +6 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +22 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.d.ts +812 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +118 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/indexer/indexer.d.ts +24 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +248 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/parseMarkdown.d.ts +30 -0
- package/dist/indexer/parseMarkdown.d.ts.map +1 -0
- package/dist/indexer/parseMarkdown.js +191 -0
- package/dist/indexer/parseMarkdown.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +343 -0
- package/dist/server.js.map +1 -0
- package/package.json +82 -0
- package/src/db/migrations/0000_init.sql +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseMarkdown.js","sourceRoot":"","sources":["../../src/indexer/parseMarkdown.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { config as loadEnv } from "dotenv";
|
|
2
|
+
import { resolve as pathResolve } from "node:path";
|
|
3
|
+
import { fileURLToPath as fileToPath } from "node:url";
|
|
4
|
+
const __filename = fileToPath(import.meta.url);
|
|
5
|
+
const __dirname = pathResolve(__filename, "..");
|
|
6
|
+
loadEnv({ path: pathResolve(__dirname, "..", ".env.local") });
|
|
7
|
+
loadEnv({ path: pathResolve(__dirname, "..", ".env") });
|
|
8
|
+
loadEnv();
|
|
9
|
+
process.on("uncaughtException", (e) => {
|
|
10
|
+
console.error("[markdown-lsp] uncaughtException:", e instanceof Error ? e.stack || e.message : e);
|
|
11
|
+
});
|
|
12
|
+
process.on("unhandledRejection", (e) => {
|
|
13
|
+
console.error("[markdown-lsp] unhandledRejection:", e instanceof Error ? e.stack || e.message : e);
|
|
14
|
+
});
|
|
15
|
+
import { createConnection, ProposedFeatures, TextDocuments, TextDocumentSyncKind, SymbolKind, Location, Range, Position, DiagnosticSeverity, CompletionItemKind, TextEdit, } from "vscode-languageserver/node.js";
|
|
16
|
+
import { TextDocument } from "vscode-languageserver-textdocument";
|
|
17
|
+
import { URI } from "vscode-uri";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
import { relative, resolve, dirname, join } from "node:path";
|
|
20
|
+
import { readdir } from "node:fs/promises";
|
|
21
|
+
import { ensureWorkspace, indexFile, indexWorkspace, removeFile, resolveLinkTargets, } from "./indexer/indexer.js";
|
|
22
|
+
import { parseMarkdown } from "./indexer/parseMarkdown.js";
|
|
23
|
+
import { getDocumentSymbols, getWorkspaceSymbols } from "./core/documentSymbols.js";
|
|
24
|
+
import { findReferencesToDocument, findUnresolvedLinks, getDocumentByPath, resolveLinkByTarget } from "./core/findReferences.js";
|
|
25
|
+
import { db } from "./db/client.js";
|
|
26
|
+
import { documents } from "./db/schema.js";
|
|
27
|
+
import { eq } from "drizzle-orm";
|
|
28
|
+
const connection = createConnection(ProposedFeatures.all);
|
|
29
|
+
const docs = new TextDocuments(TextDocument);
|
|
30
|
+
let workspace = null;
|
|
31
|
+
function uriToPath(uri) {
|
|
32
|
+
return fileURLToPath(uri);
|
|
33
|
+
}
|
|
34
|
+
function pathToUri(p) {
|
|
35
|
+
return URI.file(p).toString();
|
|
36
|
+
}
|
|
37
|
+
function relPath(absolute) {
|
|
38
|
+
if (!workspace)
|
|
39
|
+
return absolute;
|
|
40
|
+
return relative(workspace.rootPath, absolute);
|
|
41
|
+
}
|
|
42
|
+
function rangeToLsp(r) {
|
|
43
|
+
return Range.create(Position.create(r.startLine, r.startCol), Position.create(r.endLine, r.endCol));
|
|
44
|
+
}
|
|
45
|
+
function symbolKindForLevel(level) {
|
|
46
|
+
if (level <= 1)
|
|
47
|
+
return SymbolKind.File;
|
|
48
|
+
if (level === 2)
|
|
49
|
+
return SymbolKind.Namespace;
|
|
50
|
+
if (level === 3)
|
|
51
|
+
return SymbolKind.Class;
|
|
52
|
+
return SymbolKind.Field;
|
|
53
|
+
}
|
|
54
|
+
connection.onInitialize(async (params) => {
|
|
55
|
+
const folders = params.workspaceFolders ?? [];
|
|
56
|
+
if (folders.length === 0 && params.rootUri) {
|
|
57
|
+
folders.push({ uri: params.rootUri, name: "root" });
|
|
58
|
+
}
|
|
59
|
+
if (folders.length > 0) {
|
|
60
|
+
const root = uriToPath(folders[0].uri);
|
|
61
|
+
try {
|
|
62
|
+
workspace = await ensureWorkspace(root, folders[0].name);
|
|
63
|
+
connection.console.info(`Workspace initialized: ${workspace.rootPath} (id=${workspace.id})`);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
67
|
+
connection.console.error(`Failed to initialize workspace: ${msg}`);
|
|
68
|
+
connection.window.showErrorMessage(`Markdown LSP: ${msg}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
connection.console.warn("No workspace folder provided");
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
capabilities: {
|
|
76
|
+
textDocumentSync: TextDocumentSyncKind.Incremental,
|
|
77
|
+
documentSymbolProvider: true,
|
|
78
|
+
workspaceSymbolProvider: true,
|
|
79
|
+
definitionProvider: true,
|
|
80
|
+
referencesProvider: true,
|
|
81
|
+
hoverProvider: false,
|
|
82
|
+
completionProvider: { triggerCharacters: ["[", "(", "#"] },
|
|
83
|
+
renameProvider: false,
|
|
84
|
+
executeCommandProvider: { commands: ["markdownLsp/reindex"] },
|
|
85
|
+
},
|
|
86
|
+
serverInfo: { name: "markdown-lsp", version: "0.0.1" },
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
connection.onInitialized(async () => {
|
|
90
|
+
if (!workspace)
|
|
91
|
+
return;
|
|
92
|
+
connection.console.info("Starting initial workspace index…");
|
|
93
|
+
try {
|
|
94
|
+
const result = await indexWorkspace(workspace);
|
|
95
|
+
connection.console.info(`Index complete: ${result.filesIndexed} indexed, ${result.filesUnchanged} unchanged, ${result.filesRemoved} removed`);
|
|
96
|
+
await publishWorkspaceDiagnostics();
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
connection.console.error(`Index failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
async function publishWorkspaceDiagnostics() {
|
|
103
|
+
if (!workspace)
|
|
104
|
+
return;
|
|
105
|
+
const unresolved = await findUnresolvedLinks(workspace);
|
|
106
|
+
const byDoc = new Map();
|
|
107
|
+
for (const u of unresolved) {
|
|
108
|
+
const arr = byDoc.get(u.fromDocumentPath) ?? [];
|
|
109
|
+
arr.push(u);
|
|
110
|
+
byDoc.set(u.fromDocumentPath, arr);
|
|
111
|
+
}
|
|
112
|
+
for (const [docPath, list] of byDoc) {
|
|
113
|
+
const absolute = workspace ? resolve(workspace.rootPath, docPath) : docPath;
|
|
114
|
+
const diagnostics = list.map((u) => ({
|
|
115
|
+
severity: DiagnosticSeverity.Warning,
|
|
116
|
+
range: Range.create(0, 0, 0, 1),
|
|
117
|
+
message: `Unresolved link target: ${u.toPath}`,
|
|
118
|
+
source: "markdown-lsp",
|
|
119
|
+
code: "unresolved-link",
|
|
120
|
+
}));
|
|
121
|
+
connection.sendDiagnostics({ uri: pathToUri(absolute), diagnostics });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
docs.onDidChangeContent(async (event) => {
|
|
125
|
+
if (!workspace)
|
|
126
|
+
return;
|
|
127
|
+
const absolute = uriToPath(event.document.uri);
|
|
128
|
+
if (!absolute.startsWith(workspace.rootPath))
|
|
129
|
+
return;
|
|
130
|
+
try {
|
|
131
|
+
await indexFile(workspace, absolute, event.document.getText());
|
|
132
|
+
await resolveLinkTargets(workspace);
|
|
133
|
+
await publishDocumentDiagnostics(absolute);
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
connection.console.error(`indexFile failed for ${absolute}: ${e instanceof Error ? e.message : e}`);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
docs.onDidClose((event) => {
|
|
140
|
+
connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] });
|
|
141
|
+
});
|
|
142
|
+
async function publishDocumentDiagnostics(absolute) {
|
|
143
|
+
if (!workspace)
|
|
144
|
+
return;
|
|
145
|
+
const rel = relPath(absolute);
|
|
146
|
+
const unresolved = await findUnresolvedLinks(workspace, rel);
|
|
147
|
+
const diagnostics = unresolved.map((u) => ({
|
|
148
|
+
severity: DiagnosticSeverity.Warning,
|
|
149
|
+
range: Range.create(0, 0, 0, 1),
|
|
150
|
+
message: `Unresolved link target: ${u.toPath}`,
|
|
151
|
+
source: "markdown-lsp",
|
|
152
|
+
code: "unresolved-link",
|
|
153
|
+
}));
|
|
154
|
+
connection.sendDiagnostics({ uri: pathToUri(absolute), diagnostics });
|
|
155
|
+
}
|
|
156
|
+
connection.onDocumentSymbol(async (params) => {
|
|
157
|
+
if (!workspace)
|
|
158
|
+
return [];
|
|
159
|
+
const absolute = uriToPath(params.textDocument.uri);
|
|
160
|
+
const nodes = await getDocumentSymbols(workspace, relPath(absolute));
|
|
161
|
+
const toLsp = (n) => ({
|
|
162
|
+
name: n.name,
|
|
163
|
+
kind: symbolKindForLevel(n.level),
|
|
164
|
+
range: rangeToLsp(n.range),
|
|
165
|
+
selectionRange: rangeToLsp(n.selectionRange),
|
|
166
|
+
children: n.children.map(toLsp),
|
|
167
|
+
});
|
|
168
|
+
return nodes.map(toLsp);
|
|
169
|
+
});
|
|
170
|
+
connection.onWorkspaceSymbol(async (params) => {
|
|
171
|
+
if (!workspace)
|
|
172
|
+
return [];
|
|
173
|
+
const hits = await getWorkspaceSymbols(workspace, params.query ?? "", 100);
|
|
174
|
+
return hits.map((h) => ({
|
|
175
|
+
name: h.name,
|
|
176
|
+
kind: SymbolKind.String,
|
|
177
|
+
location: Location.create(pathToUri(resolve(workspace.rootPath, h.documentPath)), rangeToLsp(h.range)),
|
|
178
|
+
containerName: h.containerName ?? undefined,
|
|
179
|
+
}));
|
|
180
|
+
});
|
|
181
|
+
connection.onDefinition(async (params) => {
|
|
182
|
+
if (!workspace)
|
|
183
|
+
return null;
|
|
184
|
+
const absolute = uriToPath(params.textDocument.uri);
|
|
185
|
+
const doc = docs.get(params.textDocument.uri);
|
|
186
|
+
if (!doc)
|
|
187
|
+
return null;
|
|
188
|
+
const parsed = parseMarkdown(doc.getText());
|
|
189
|
+
const line = params.position.line;
|
|
190
|
+
const col = params.position.character;
|
|
191
|
+
const hit = parsed.links.find((l) => l.positionStartLine <= line &&
|
|
192
|
+
l.positionEndLine >= line &&
|
|
193
|
+
(l.positionStartLine !== line || l.positionStartCol <= col) &&
|
|
194
|
+
(l.positionEndLine !== line || l.positionEndCol >= col));
|
|
195
|
+
if (!hit)
|
|
196
|
+
return null;
|
|
197
|
+
if (hit.kind === "wiki") {
|
|
198
|
+
const resolved = await resolveLinkByTarget(workspace, hit.toPath);
|
|
199
|
+
if (!resolved)
|
|
200
|
+
return null;
|
|
201
|
+
const targetAbs = resolve(workspace.rootPath, resolved.documentPath);
|
|
202
|
+
return Location.create(pathToUri(targetAbs), Range.create(0, 0, 0, 0));
|
|
203
|
+
}
|
|
204
|
+
const fromDir = dirname(relPath(absolute));
|
|
205
|
+
const candidates = [
|
|
206
|
+
hit.toPath,
|
|
207
|
+
hit.toPath.replace(/^\.\//, ""),
|
|
208
|
+
join(fromDir, hit.toPath),
|
|
209
|
+
join(fromDir, hit.toPath.replace(/^\.\//, "")),
|
|
210
|
+
];
|
|
211
|
+
for (const c of candidates) {
|
|
212
|
+
const normalized = c.replace(/\.(md|mdx|markdown)$/i, "");
|
|
213
|
+
const doc = await db
|
|
214
|
+
.select()
|
|
215
|
+
.from(documents)
|
|
216
|
+
.where(eq(documents.workspaceId, workspace.id));
|
|
217
|
+
const match = doc.find((d) => d.path === c || d.path.replace(/\.(md|mdx|markdown)$/i, "") === normalized);
|
|
218
|
+
if (match) {
|
|
219
|
+
const targetAbs = resolve(workspace.rootPath, match.path);
|
|
220
|
+
return Location.create(pathToUri(targetAbs), Range.create(0, 0, 0, 0));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
});
|
|
225
|
+
connection.onReferences(async (params) => {
|
|
226
|
+
if (!workspace)
|
|
227
|
+
return [];
|
|
228
|
+
const absolute = uriToPath(params.textDocument.uri);
|
|
229
|
+
let targetDocId = null;
|
|
230
|
+
const liveDoc = docs.get(params.textDocument.uri);
|
|
231
|
+
if (liveDoc) {
|
|
232
|
+
const parsed = parseMarkdown(liveDoc.getText());
|
|
233
|
+
const line = params.position.line;
|
|
234
|
+
const col = params.position.character;
|
|
235
|
+
const hit = parsed.links.find((l) => l.positionStartLine <= line &&
|
|
236
|
+
l.positionEndLine >= line &&
|
|
237
|
+
(l.positionStartLine !== line || l.positionStartCol <= col) &&
|
|
238
|
+
(l.positionEndLine !== line || l.positionEndCol >= col));
|
|
239
|
+
if (hit) {
|
|
240
|
+
if (hit.kind === "wiki") {
|
|
241
|
+
const resolved = await resolveLinkByTarget(workspace, hit.toPath);
|
|
242
|
+
if (resolved) {
|
|
243
|
+
const target = await getDocumentByPath(workspace, resolved.documentPath);
|
|
244
|
+
if (target)
|
|
245
|
+
targetDocId = target.id;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
const fromDir = dirname(relPath(absolute));
|
|
250
|
+
const candidates = [
|
|
251
|
+
hit.toPath,
|
|
252
|
+
hit.toPath.replace(/^\.\//, ""),
|
|
253
|
+
join(fromDir, hit.toPath),
|
|
254
|
+
join(fromDir, hit.toPath.replace(/^\.\//, "")),
|
|
255
|
+
];
|
|
256
|
+
const allDocs = await db.select().from(documents).where(eq(documents.workspaceId, workspace.id));
|
|
257
|
+
for (const c of candidates) {
|
|
258
|
+
const normalized = c.replace(/\.(md|mdx|markdown)$/i, "");
|
|
259
|
+
const match = allDocs.find((d) => d.path === c || d.path.replace(/\.(md|mdx|markdown)$/i, "") === normalized);
|
|
260
|
+
if (match) {
|
|
261
|
+
targetDocId = match.id;
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!targetDocId) {
|
|
269
|
+
const doc = await getDocumentByPath(workspace, relPath(absolute));
|
|
270
|
+
if (!doc)
|
|
271
|
+
return [];
|
|
272
|
+
targetDocId = doc.id;
|
|
273
|
+
}
|
|
274
|
+
const hits = await findReferencesToDocument(workspace, targetDocId);
|
|
275
|
+
return hits.map((h) => Location.create(pathToUri(resolve(workspace.rootPath, h.documentPath)), rangeToLsp(h.range)));
|
|
276
|
+
});
|
|
277
|
+
connection.onCompletion(async (params) => {
|
|
278
|
+
if (!workspace)
|
|
279
|
+
return [];
|
|
280
|
+
const doc = docs.get(params.textDocument.uri);
|
|
281
|
+
if (!doc)
|
|
282
|
+
return [];
|
|
283
|
+
const line = doc.getText({
|
|
284
|
+
start: Position.create(params.position.line, 0),
|
|
285
|
+
end: params.position,
|
|
286
|
+
});
|
|
287
|
+
const wikiMatch = line.match(/\[\[([^\]]*)$/);
|
|
288
|
+
if (!wikiMatch)
|
|
289
|
+
return [];
|
|
290
|
+
const prefix = wikiMatch[1].toLowerCase();
|
|
291
|
+
const allDocs = await db.select().from(documents).where(eq(documents.workspaceId, workspace.id));
|
|
292
|
+
return allDocs
|
|
293
|
+
.filter((d) => {
|
|
294
|
+
const base = (d.path.split("/").pop() ?? "").replace(/\.(md|mdx|markdown)$/i, "").toLowerCase();
|
|
295
|
+
return base.startsWith(prefix) || (d.title?.toLowerCase().startsWith(prefix) ?? false);
|
|
296
|
+
})
|
|
297
|
+
.slice(0, 50)
|
|
298
|
+
.map((d) => {
|
|
299
|
+
const base = (d.path.split("/").pop() ?? "").replace(/\.(md|mdx|markdown)$/i, "");
|
|
300
|
+
return {
|
|
301
|
+
label: base,
|
|
302
|
+
kind: CompletionItemKind.File,
|
|
303
|
+
detail: d.path,
|
|
304
|
+
insertText: base,
|
|
305
|
+
};
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
connection.onExecuteCommand(async (params) => {
|
|
309
|
+
if (params.command === "markdownLsp/reindex" && workspace) {
|
|
310
|
+
connection.console.info("Manual reindex requested");
|
|
311
|
+
const result = await indexWorkspace(workspace);
|
|
312
|
+
await publishWorkspaceDiagnostics();
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
return null;
|
|
316
|
+
});
|
|
317
|
+
connection.onDidChangeWatchedFiles(async (params) => {
|
|
318
|
+
if (!workspace)
|
|
319
|
+
return;
|
|
320
|
+
for (const change of params.changes) {
|
|
321
|
+
const absolute = uriToPath(change.uri);
|
|
322
|
+
if (!absolute.startsWith(workspace.rootPath))
|
|
323
|
+
continue;
|
|
324
|
+
if (change.type === 3) {
|
|
325
|
+
await removeFile(workspace, absolute);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
try {
|
|
329
|
+
await indexFile(workspace, absolute);
|
|
330
|
+
}
|
|
331
|
+
catch (e) {
|
|
332
|
+
connection.console.error(`watched file index error ${absolute}: ${e instanceof Error ? e.message : e}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
await resolveLinkTargets(workspace);
|
|
337
|
+
await publishWorkspaceDiagnostics();
|
|
338
|
+
});
|
|
339
|
+
void readdir;
|
|
340
|
+
void TextEdit;
|
|
341
|
+
docs.listen(connection);
|
|
342
|
+
connection.listen();
|
|
343
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "markdown-lsp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Language Server Protocol implementation for Markdown with optional AI-canonicalized glossary that resolves synonyms across docs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"markdown-lsp": "./bin/markdown-lsp"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/server.js",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/server.js",
|
|
12
|
+
"./bridge": "./dist/bridge/inMemoryGraph.js",
|
|
13
|
+
"./indexer": "./dist/indexer/indexer.js",
|
|
14
|
+
"./core": "./dist/core/index.js",
|
|
15
|
+
"./parser": "./dist/indexer/parseMarkdown.js"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"dev": "tsx src/server.ts --stdio",
|
|
20
|
+
"migrate": "tsx scripts/apply-migration.ts",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"prepublishOnly": "pnpm build && pnpm test"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@ai-sdk/openai": "^3.0.65",
|
|
27
|
+
"ai": "^6.0.191",
|
|
28
|
+
"dotenv": "^17.4.2",
|
|
29
|
+
"drizzle-orm": "^0.31.2",
|
|
30
|
+
"mdast-util-to-string": "^4.0.0",
|
|
31
|
+
"postgres": "^3.4.4",
|
|
32
|
+
"remark-gfm": "^4.0.0",
|
|
33
|
+
"remark-parse": "^11.0.0",
|
|
34
|
+
"unified": "^11.0.0",
|
|
35
|
+
"vscode-languageserver": "^9.0.1",
|
|
36
|
+
"vscode-languageserver-textdocument": "^1.0.11",
|
|
37
|
+
"vscode-uri": "^3.1.0",
|
|
38
|
+
"zod": "^3.23.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
42
|
+
"@types/mdast": "^4.0.4",
|
|
43
|
+
"@types/node": "^22.0.0",
|
|
44
|
+
"drizzle-kit": "^0.22.7",
|
|
45
|
+
"tsx": "^4.19.0",
|
|
46
|
+
"typescript": "^5.5.0",
|
|
47
|
+
"vitest": "^2.0.0"
|
|
48
|
+
},
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=20"
|
|
51
|
+
},
|
|
52
|
+
"files": [
|
|
53
|
+
"dist/",
|
|
54
|
+
"bin/",
|
|
55
|
+
"src/db/migrations/",
|
|
56
|
+
"README.md",
|
|
57
|
+
"LICENSE"
|
|
58
|
+
],
|
|
59
|
+
"keywords": [
|
|
60
|
+
"lsp",
|
|
61
|
+
"language-server",
|
|
62
|
+
"markdown",
|
|
63
|
+
"marksman",
|
|
64
|
+
"documentation",
|
|
65
|
+
"docs",
|
|
66
|
+
"wiki-links",
|
|
67
|
+
"pgvector",
|
|
68
|
+
"embeddings",
|
|
69
|
+
"mcp",
|
|
70
|
+
"ai"
|
|
71
|
+
],
|
|
72
|
+
"author": "Dan Bondarev",
|
|
73
|
+
"license": "MIT",
|
|
74
|
+
"repository": {
|
|
75
|
+
"type": "git",
|
|
76
|
+
"url": "git+https://github.com/Docsbook-io/markdown-lsp.git"
|
|
77
|
+
},
|
|
78
|
+
"homepage": "https://github.com/Docsbook-io/markdown-lsp#readme",
|
|
79
|
+
"bugs": {
|
|
80
|
+
"url": "https://github.com/Docsbook-io/markdown-lsp/issues"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
-- Markdown LSP: initial schema
|
|
2
|
+
-- All tables prefixed with mdlsp_ to coexist with Docsbook tables in the same Neon database.
|
|
3
|
+
|
|
4
|
+
CREATE EXTENSION IF NOT EXISTS vector;
|
|
5
|
+
|
|
6
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_workspaces" (
|
|
7
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
8
|
+
"name" text NOT NULL,
|
|
9
|
+
"root_path" text NOT NULL,
|
|
10
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
11
|
+
"updated_at" timestamp DEFAULT now() NOT NULL
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_documents" (
|
|
15
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
16
|
+
"workspace_id" uuid NOT NULL REFERENCES "mdlsp_workspaces"("id") ON DELETE CASCADE,
|
|
17
|
+
"path" text NOT NULL,
|
|
18
|
+
"content_hash" text NOT NULL,
|
|
19
|
+
"title" text,
|
|
20
|
+
"last_indexed_at" timestamp DEFAULT now() NOT NULL
|
|
21
|
+
);
|
|
22
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "mdlsp_documents_workspace_path_idx" ON "mdlsp_documents" ("workspace_id", "path");
|
|
23
|
+
|
|
24
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_sections" (
|
|
25
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
26
|
+
"document_id" uuid NOT NULL REFERENCES "mdlsp_documents"("id") ON DELETE CASCADE,
|
|
27
|
+
"workspace_id" uuid NOT NULL REFERENCES "mdlsp_workspaces"("id") ON DELETE CASCADE,
|
|
28
|
+
"heading_path" text[] NOT NULL,
|
|
29
|
+
"anchor" text,
|
|
30
|
+
"level" integer NOT NULL,
|
|
31
|
+
"content" text NOT NULL,
|
|
32
|
+
"char_count" integer NOT NULL,
|
|
33
|
+
"position_start_line" integer NOT NULL,
|
|
34
|
+
"position_start_col" integer NOT NULL,
|
|
35
|
+
"position_end_line" integer NOT NULL,
|
|
36
|
+
"position_end_col" integer NOT NULL
|
|
37
|
+
);
|
|
38
|
+
CREATE INDEX IF NOT EXISTS "mdlsp_sections_workspace_doc_idx" ON "mdlsp_sections" ("workspace_id", "document_id");
|
|
39
|
+
|
|
40
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_links" (
|
|
41
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
42
|
+
"workspace_id" uuid NOT NULL REFERENCES "mdlsp_workspaces"("id") ON DELETE CASCADE,
|
|
43
|
+
"from_document_id" uuid NOT NULL REFERENCES "mdlsp_documents"("id") ON DELETE CASCADE,
|
|
44
|
+
"from_section_id" uuid REFERENCES "mdlsp_sections"("id") ON DELETE CASCADE,
|
|
45
|
+
"to_path" text NOT NULL,
|
|
46
|
+
"to_document_id" uuid REFERENCES "mdlsp_documents"("id") ON DELETE SET NULL,
|
|
47
|
+
"to_anchor" text,
|
|
48
|
+
"kind" text NOT NULL CHECK ("kind" IN ('inline', 'reference', 'wiki', 'autolink')),
|
|
49
|
+
"text_at_link" text
|
|
50
|
+
);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS "mdlsp_links_workspace_to_doc_idx" ON "mdlsp_links" ("workspace_id", "to_document_id");
|
|
52
|
+
CREATE INDEX IF NOT EXISTS "mdlsp_links_workspace_to_path_idx" ON "mdlsp_links" ("workspace_id", "to_path");
|
|
53
|
+
|
|
54
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_terms" (
|
|
55
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
56
|
+
"workspace_id" uuid NOT NULL REFERENCES "mdlsp_workspaces"("id") ON DELETE CASCADE,
|
|
57
|
+
"canonical_id" text NOT NULL,
|
|
58
|
+
"surface_forms" text[] NOT NULL,
|
|
59
|
+
"description" text,
|
|
60
|
+
"embedding" vector(1536),
|
|
61
|
+
"user_overridden" boolean DEFAULT false NOT NULL,
|
|
62
|
+
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
63
|
+
"updated_at" timestamp DEFAULT now() NOT NULL
|
|
64
|
+
);
|
|
65
|
+
CREATE UNIQUE INDEX IF NOT EXISTS "mdlsp_terms_workspace_canon_idx" ON "mdlsp_terms" ("workspace_id", "canonical_id");
|
|
66
|
+
CREATE INDEX IF NOT EXISTS "mdlsp_terms_embedding_idx" ON "mdlsp_terms" USING hnsw ("embedding" vector_cosine_ops);
|
|
67
|
+
|
|
68
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_term_occurrences" (
|
|
69
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
70
|
+
"workspace_id" uuid NOT NULL REFERENCES "mdlsp_workspaces"("id") ON DELETE CASCADE,
|
|
71
|
+
"term_id" uuid NOT NULL REFERENCES "mdlsp_terms"("id") ON DELETE CASCADE,
|
|
72
|
+
"section_id" uuid NOT NULL REFERENCES "mdlsp_sections"("id") ON DELETE CASCADE,
|
|
73
|
+
"document_id" uuid NOT NULL REFERENCES "mdlsp_documents"("id") ON DELETE CASCADE,
|
|
74
|
+
"kind" text NOT NULL CHECK ("kind" IN ('definition', 'mention', 'example')),
|
|
75
|
+
"confidence" real DEFAULT 1.0 NOT NULL,
|
|
76
|
+
"surface_form" text NOT NULL
|
|
77
|
+
);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS "mdlsp_occ_workspace_term_kind_idx" ON "mdlsp_term_occurrences" ("workspace_id", "term_id", "kind");
|
|
79
|
+
CREATE INDEX IF NOT EXISTS "mdlsp_occ_workspace_section_idx" ON "mdlsp_term_occurrences" ("workspace_id", "section_id");
|
|
80
|
+
|
|
81
|
+
CREATE TABLE IF NOT EXISTS "mdlsp_reindex_jobs" (
|
|
82
|
+
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
|
|
83
|
+
"workspace_id" uuid NOT NULL REFERENCES "mdlsp_workspaces"("id") ON DELETE CASCADE,
|
|
84
|
+
"kind" text NOT NULL CHECK ("kind" IN ('full', 'incremental', 'glossary_only')),
|
|
85
|
+
"status" text NOT NULL CHECK ("status" IN ('pending', 'running', 'done', 'failed')),
|
|
86
|
+
"sections_processed" integer DEFAULT 0 NOT NULL,
|
|
87
|
+
"llm_tokens_in" integer DEFAULT 0 NOT NULL,
|
|
88
|
+
"llm_tokens_out" integer DEFAULT 0 NOT NULL,
|
|
89
|
+
"embedding_tokens" integer DEFAULT 0 NOT NULL,
|
|
90
|
+
"cost_estimate_usd" real DEFAULT 0 NOT NULL,
|
|
91
|
+
"error" text,
|
|
92
|
+
"started_at" timestamp DEFAULT now() NOT NULL,
|
|
93
|
+
"finished_at" timestamp
|
|
94
|
+
);
|