markdown-lsp 0.2.1 → 1.0.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,265 @@
1
+ import { parseArgs } from "node:util";
2
+ import { buildGraph } from "./graph.js";
3
+ import { listPages, searchText, searchTextRanked, searchSymbols, searchPaths, } from "./bridge/index.js";
4
+ const USAGE = `
5
+ markdown-lsp v1.0.0 — CLI for querying Markdown documentation graphs
6
+
7
+ USAGE
8
+ markdown-lsp <subcommand> [options]
9
+
10
+ SUBCOMMANDS
11
+ workspace-outline <docs-dir> [--prefix <p>] [--limit <n>]
12
+ List all pages in the workspace with metadata.
13
+
14
+ outline <docs-dir> <page>
15
+ Show the heading outline of a single page.
16
+
17
+ search-text <docs-dir> <query> [--mode ranked|verbatim] [--regex]
18
+ [--case-sensitive] [--prefix <p>] [--limit <n>] [--context <n>]
19
+ Full-text search. Default mode: ranked (natural-language). Use
20
+ --mode verbatim (or --regex) for exact/regex matching.
21
+
22
+ search-symbols <docs-dir> <query> [--limit <n>]
23
+ Fuzzy subsequence search across all headings.
24
+
25
+ search-paths <docs-dir> <glob>
26
+ List pages whose paths match a glob pattern (*, **, ?).
27
+
28
+ links-to <docs-dir> <page>
29
+ Show all pages that link to <page>.
30
+
31
+ links-from <docs-dir> <page>
32
+ Show all links that originate from <page>.
33
+
34
+ resolve-link <docs-dir> <from-page> <link-text>
35
+ Resolve a specific link text from a given page.
36
+
37
+ get-section <docs-dir> <page> <anchor>
38
+ Retrieve a section by its anchor slug.
39
+
40
+ lsp [--stdio]
41
+ serve [--stdio]
42
+ Start the LSP stdio server (for editor integration).
43
+ Back-compat: --stdio | --node-ipc | --socket=<n> as first arg also
44
+ starts the LSP server.
45
+
46
+ GLOBAL FLAGS
47
+ --pretty Pretty-print JSON output (default: compact)
48
+ --text Human-readable output (where implemented)
49
+ -h, --help Print this help
50
+
51
+ OUTPUT
52
+ All subcommands print JSON to stdout (compact by default, use --pretty
53
+ for indented output). The LSP subcommand speaks the Language Server Protocol
54
+ over stdio — it does NOT print JSON.
55
+
56
+ EXAMPLES
57
+ markdown-lsp workspace-outline ./docs
58
+ markdown-lsp search-text ./docs "getting started" --pretty
59
+ markdown-lsp outline ./docs introduction.md
60
+ markdown-lsp lsp --stdio
61
+ `.trim();
62
+ function die(msg) {
63
+ process.stderr.write(msg + "\n");
64
+ process.exit(1);
65
+ }
66
+ function out(value, pretty) {
67
+ process.stdout.write((pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value)) + "\n");
68
+ }
69
+ async function startLsp() {
70
+ await import("./lsp.js");
71
+ }
72
+ async function main() {
73
+ const argv = process.argv.slice(2);
74
+ // Back-compat: if the first argument looks like an old LSP flag, start LSP.
75
+ if (argv.length === 0 ||
76
+ argv[0] === "--stdio" ||
77
+ argv[0] === "--node-ipc" ||
78
+ (argv[0] !== undefined && argv[0].startsWith("--socket"))) {
79
+ if (argv.length === 0) {
80
+ // No args: print usage and exit cleanly (not the old LSP crash).
81
+ process.stdout.write(USAGE + "\n");
82
+ process.exit(0);
83
+ }
84
+ // Old LSP invocation style — keep working so editor configs don't break.
85
+ await startLsp();
86
+ return;
87
+ }
88
+ const subcommand = argv[0];
89
+ const rest = argv.slice(1);
90
+ // Help shortcuts
91
+ if (subcommand === "--help" || subcommand === "-h") {
92
+ process.stdout.write(USAGE + "\n");
93
+ process.exit(0);
94
+ }
95
+ // LSP subcommand
96
+ if (subcommand === "lsp" || subcommand === "serve") {
97
+ await startLsp();
98
+ return;
99
+ }
100
+ // Parse global flags from the remaining args
101
+ let pretty = false;
102
+ const filteredRest = [];
103
+ for (const arg of rest) {
104
+ if (arg === "--pretty")
105
+ pretty = true;
106
+ else
107
+ filteredRest.push(arg);
108
+ }
109
+ switch (subcommand) {
110
+ case "workspace-outline": {
111
+ const { values, positionals } = parseArgs({
112
+ args: filteredRest,
113
+ options: {
114
+ prefix: { type: "string" },
115
+ limit: { type: "string" },
116
+ },
117
+ allowPositionals: true,
118
+ });
119
+ const docsDir = positionals[0] ?? die("workspace-outline requires <docs-dir>");
120
+ const graph = buildGraph(docsDir);
121
+ const result = listPages(graph, {
122
+ prefix: values.prefix,
123
+ limit: values.limit !== undefined ? parseInt(values.limit, 10) : undefined,
124
+ });
125
+ out(result, pretty);
126
+ break;
127
+ }
128
+ case "outline": {
129
+ const { positionals } = parseArgs({
130
+ args: filteredRest,
131
+ options: {},
132
+ allowPositionals: true,
133
+ });
134
+ const docsDir = positionals[0] ?? die("outline requires <docs-dir>");
135
+ const page = positionals[1] ?? die("outline requires <page>");
136
+ const graph = buildGraph(docsDir);
137
+ const result = graph.outlineOf(page);
138
+ out(result, pretty);
139
+ break;
140
+ }
141
+ case "search-text": {
142
+ const { values, positionals } = parseArgs({
143
+ args: filteredRest,
144
+ options: {
145
+ mode: { type: "string" },
146
+ regex: { type: "boolean" },
147
+ "case-sensitive": { type: "boolean" },
148
+ prefix: { type: "string" },
149
+ limit: { type: "string" },
150
+ context: { type: "string" },
151
+ },
152
+ allowPositionals: true,
153
+ });
154
+ const docsDir = positionals[0] ?? die("search-text requires <docs-dir>");
155
+ const query = positionals[1] ?? die("search-text requires <query>");
156
+ const graph = buildGraph(docsDir);
157
+ const opts = {
158
+ regex: values.regex,
159
+ caseSensitive: values["case-sensitive"],
160
+ pathPrefix: values.prefix,
161
+ limit: values.limit !== undefined ? parseInt(values.limit, 10) : undefined,
162
+ contextChars: values.context !== undefined ? parseInt(values.context, 10) : undefined,
163
+ };
164
+ const mode = values.mode ?? "ranked";
165
+ const result = mode === "verbatim" || values.regex
166
+ ? searchText(graph, query, opts)
167
+ : searchTextRanked(graph, query, opts);
168
+ out(result, pretty);
169
+ break;
170
+ }
171
+ case "search-symbols": {
172
+ const { values, positionals } = parseArgs({
173
+ args: filteredRest,
174
+ options: {
175
+ limit: { type: "string" },
176
+ },
177
+ allowPositionals: true,
178
+ });
179
+ const docsDir = positionals[0] ?? die("search-symbols requires <docs-dir>");
180
+ const query = positionals[1] ?? die("search-symbols requires <query>");
181
+ const graph = buildGraph(docsDir);
182
+ const limit = values.limit !== undefined ? parseInt(values.limit, 10) : undefined;
183
+ const result = searchSymbols(graph, query, limit);
184
+ out(result, pretty);
185
+ break;
186
+ }
187
+ case "search-paths": {
188
+ const { positionals } = parseArgs({
189
+ args: filteredRest,
190
+ options: {},
191
+ allowPositionals: true,
192
+ });
193
+ const docsDir = positionals[0] ?? die("search-paths requires <docs-dir>");
194
+ const glob = positionals[1] ?? die("search-paths requires <glob>");
195
+ const graph = buildGraph(docsDir);
196
+ const result = searchPaths(graph, glob);
197
+ out(result, pretty);
198
+ break;
199
+ }
200
+ case "links-to": {
201
+ const { positionals } = parseArgs({
202
+ args: filteredRest,
203
+ options: {},
204
+ allowPositionals: true,
205
+ });
206
+ const docsDir = positionals[0] ?? die("links-to requires <docs-dir>");
207
+ const page = positionals[1] ?? die("links-to requires <page>");
208
+ const graph = buildGraph(docsDir);
209
+ const result = graph.incomingLinks(page);
210
+ out(result, pretty);
211
+ break;
212
+ }
213
+ case "links-from": {
214
+ const { positionals } = parseArgs({
215
+ args: filteredRest,
216
+ options: {},
217
+ allowPositionals: true,
218
+ });
219
+ const docsDir = positionals[0] ?? die("links-from requires <docs-dir>");
220
+ const page = positionals[1] ?? die("links-from requires <page>");
221
+ const graph = buildGraph(docsDir);
222
+ const result = graph.outgoingLinks(page);
223
+ out(result, pretty);
224
+ break;
225
+ }
226
+ case "resolve-link": {
227
+ const { positionals } = parseArgs({
228
+ args: filteredRest,
229
+ options: {},
230
+ allowPositionals: true,
231
+ });
232
+ const docsDir = positionals[0] ?? die("resolve-link requires <docs-dir>");
233
+ const fromPage = positionals[1] ?? die("resolve-link requires <from-page>");
234
+ const linkText = positionals[2] ?? die("resolve-link requires <link-text>");
235
+ const graph = buildGraph(docsDir);
236
+ const links = graph.outgoingLinks(fromPage);
237
+ const match = links.find((l) => l.textAtLink === linkText) ?? null;
238
+ out(match, pretty);
239
+ break;
240
+ }
241
+ case "get-section": {
242
+ const { positionals } = parseArgs({
243
+ args: filteredRest,
244
+ options: {},
245
+ allowPositionals: true,
246
+ });
247
+ const docsDir = positionals[0] ?? die("get-section requires <docs-dir>");
248
+ const page = positionals[1] ?? die("get-section requires <page>");
249
+ const anchor = positionals[2] ?? die("get-section requires <anchor>");
250
+ const graph = buildGraph(docsDir);
251
+ const pageObj = graph.pageByPath(page);
252
+ const section = pageObj?.sections.find((s) => s.anchor === anchor) ?? null;
253
+ out(section, pretty);
254
+ break;
255
+ }
256
+ default:
257
+ process.stderr.write(`Unknown subcommand: ${subcommand}\n\n${USAGE}\n`);
258
+ process.exit(1);
259
+ }
260
+ }
261
+ main().catch((err) => {
262
+ process.stderr.write("[markdown-lsp] Fatal error: " + (err instanceof Error ? err.stack ?? err.message : String(err)) + "\n");
263
+ process.exit(1);
264
+ });
265
+ //# 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"}
package/dist/graph.js ADDED
@@ -0,0 +1,70 @@
1
+ import { readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { RichDocGraph, buildInMemoryGraph, } from "./bridge/index.js";
4
+ const MD_EXTENSIONS = new Set([".md", ".mdx", ".markdown"]);
5
+ const IGNORED_DIRS = new Set([
6
+ "node_modules",
7
+ ".git",
8
+ ".next",
9
+ ".vercel",
10
+ "dist",
11
+ "build",
12
+ ".cache",
13
+ ".turbo",
14
+ ]);
15
+ export function loadDocsAsFiles(docsRoot) {
16
+ const absRoot = resolve(docsRoot);
17
+ const files = [];
18
+ walk(absRoot, absRoot, files);
19
+ return files;
20
+ }
21
+ function walk(absRoot, dir, out) {
22
+ let entries;
23
+ try {
24
+ entries = readdirSync(dir);
25
+ }
26
+ catch {
27
+ return;
28
+ }
29
+ for (const name of entries) {
30
+ if (name.startsWith(".") && name !== ".")
31
+ continue;
32
+ if (IGNORED_DIRS.has(name))
33
+ continue;
34
+ const full = join(dir, name);
35
+ let st;
36
+ try {
37
+ st = statSync(full);
38
+ }
39
+ catch {
40
+ continue;
41
+ }
42
+ if (st.isDirectory()) {
43
+ walk(absRoot, full, out);
44
+ continue;
45
+ }
46
+ if (!st.isFile())
47
+ continue;
48
+ const dotIdx = name.lastIndexOf(".");
49
+ if (dotIdx < 0)
50
+ continue;
51
+ const ext = name.slice(dotIdx).toLowerCase();
52
+ if (!MD_EXTENSIONS.has(ext))
53
+ continue;
54
+ const rel = relative(absRoot, full).split("\\").join("/");
55
+ let content;
56
+ try {
57
+ content = readFileSync(full, "utf8");
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ out.push({ path: rel, content });
63
+ }
64
+ }
65
+ export function buildGraph(docsRoot) {
66
+ const files = loadDocsAsFiles(docsRoot);
67
+ const raw = buildInMemoryGraph(files);
68
+ return new RichDocGraph(raw);
69
+ }
70
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnD,OAAO,EACL,YAAY,EACZ,kBAAkB,GAEnB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AAC3D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,cAAc;IACd,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;CACT,CAAC,CAAA;AAEF,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjC,MAAM,KAAK,GAAmB,EAAE,CAAA;IAChC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7B,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,IAAI,CAAC,OAAe,EAAE,GAAW,EAAE,GAAmB;IAC7D,IAAI,OAAiB,CAAA;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAM;IACR,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,GAAG;YAAE,SAAQ;QAClD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAQ;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAC5B,IAAI,EAAE,CAAA;QACN,IAAI,CAAC;YACH,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QAED,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;YACxB,SAAQ;QACV,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;YAAE,SAAQ;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,MAAM,GAAG,CAAC;YAAE,SAAQ;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QAErC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACzD,IAAI,OAAe,CAAA;QACnB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,SAAQ;QACV,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IACrC,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC"}
package/dist/lsp.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lsp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.d.ts","sourceRoot":"","sources":["../src/lsp.ts"],"names":[],"mappings":""}