markdown-lsp 1.0.0 → 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 CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  CLI and library for querying Markdown documentation graphs. Point it at a folder of `.md` files and get instant full-text search, outline, link analysis, and symbol lookup — all as JSON.
10
10
 
11
- **Status: v1.0.0. CLI is the default interface. LSP stdio mode available as a subcommand.**
11
+ **Status: v1.1.0. CLI is the default interface. LSP stdio mode available as a subcommand.**
12
12
 
13
13
  ---
14
14
 
@@ -55,6 +55,8 @@ All subcommands accept a **`--pretty`** flag for indented JSON output (compact b
55
55
  | `resolve-link` | `<docs-dir> <from-page> <link-text>` | Resolve a specific link text from a page |
56
56
  | `get-section` | `<docs-dir> <page> <anchor>` | Get a section by anchor slug |
57
57
  | `lsp` / `serve` | `[--stdio]` | Start the LSP stdio server |
58
+ | `graph` | `<docs-dir> [--format json\|dot\|mermaid\|html] [--out file]` | Export the doc link graph |
59
+ | `semantic-search` | `<docs-dir> <query> [--limit n] [--model model]` | AI semantic search via embeddings |
58
60
 
59
61
  ### search-text modes
60
62
 
@@ -101,6 +103,63 @@ markdown-lsp get-section ./docs overview.md quick-links --pretty
101
103
 
102
104
  ---
103
105
 
106
+ ## Graph export
107
+
108
+ Export the full page link graph — nodes are pages, edges are markdown links.
109
+
110
+ ```bash
111
+ # JSON (nodes + edges — machine-readable)
112
+ markdown-lsp graph ./docs --format json --pretty
113
+
114
+ # Graphviz DOT
115
+ markdown-lsp graph ./docs --format dot > graph.dot
116
+
117
+ # Mermaid flowchart (embed in markdown)
118
+ markdown-lsp graph ./docs --format mermaid
119
+
120
+ # Self-contained interactive HTML with D3 force-directed graph
121
+ # (drag, zoom, hover highlights neighbours, click to inspect)
122
+ markdown-lsp graph ./docs --format html --out graph.html
123
+ ```
124
+
125
+ JSON output shape:
126
+ ```json
127
+ {
128
+ "nodes": [{"id": "README.md", "title": "Docsbook", "charCount": 2634, "sectionsCount": 10}],
129
+ "edges": [{"source": "README.md", "target": "quick-start.md", "kind": "inline", "label": "Get started"}],
130
+ "unresolvedCount": 3
131
+ }
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Semantic search
137
+
138
+ AI-powered semantic search using text embeddings — finds conceptually related pages even if they
139
+ don't contain the exact query words.
140
+
141
+ ```bash
142
+ # Requires OPENROUTER_API_KEY (OpenRouter) or AI_GATEWAY_API_KEY (Vercel AI Gateway)
143
+ OPENROUTER_API_KEY=sk-or-... markdown-lsp semantic-search ./docs "how to configure webhooks" --limit 5
144
+
145
+ # Override embedding model
146
+ markdown-lsp semantic-search ./docs "authentication" --model openai/text-embedding-3-small --limit 3
147
+ ```
148
+
149
+ - Default embedding model: `openai/text-embedding-3-small` (via OpenRouter — model prefix required)
150
+ - Results cached in `.markdown-lsp-cache/embeddings/` — second run is instant, no API call
151
+ - Returns `[{ pagePath, pageTitle, score, snippet }]` sorted by cosine similarity
152
+
153
+ **Environment variables:**
154
+
155
+ | Variable | Purpose |
156
+ |---|---|
157
+ | `OPENROUTER_API_KEY` | OpenRouter API key (takes priority if set) |
158
+ | `AI_GATEWAY_API_KEY` | Vercel AI Gateway key (fallback) |
159
+ | `EMBEDDING_MODEL` | Override default embedding model |
160
+
161
+ ---
162
+
104
163
  ## LSP mode (editor integration)
105
164
 
106
165
  `markdown-lsp` also works as a Language Server Protocol server for editors (VS Code, Zed, Neovim, etc.).
@@ -0,0 +1,3 @@
1
+ export declare function cachedEmbedding(text: string, model: string): number[] | null;
2
+ export declare function saveEmbedding(text: string, model: string, vec: number[]): void;
3
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/ai/cache.ts"],"names":[],"mappings":"AAUA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAW5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAK9E"}
@@ -0,0 +1,27 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ const CACHE_DIR = ".markdown-lsp-cache/embeddings";
5
+ function cacheKey(text, model) {
6
+ return createHash("sha256").update(model + "\x00" + text).digest("hex");
7
+ }
8
+ export function cachedEmbedding(text, model) {
9
+ const key = cacheKey(text, model);
10
+ const filePath = join(CACHE_DIR, `${key}.json`);
11
+ if (existsSync(filePath)) {
12
+ try {
13
+ return JSON.parse(readFileSync(filePath, "utf8"));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+ export function saveEmbedding(text, model, vec) {
22
+ mkdirSync(CACHE_DIR, { recursive: true });
23
+ const key = cacheKey(text, model);
24
+ const filePath = join(CACHE_DIR, `${key}.json`);
25
+ writeFileSync(filePath, JSON.stringify(vec), "utf8");
26
+ }
27
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/ai/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,SAAS,GAAG,gCAAgC,CAAA;AAElD,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;IAC/C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAa,CAAA;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAa,EAAE,GAAa;IACtE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;IAC/C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;AACtD,CAAC"}
@@ -3,7 +3,13 @@ export interface AiConfig {
3
3
  embeddingModel: string;
4
4
  extractModel: string;
5
5
  hasGatewayKey: boolean;
6
+ hasOpenRouterKey: boolean;
6
7
  }
7
8
  export declare function getAiConfig(): AiConfig;
8
9
  export declare function assertAiEnabled(): void;
10
+ /**
11
+ * Lighter check for CLI commands (semantic-search) that don't need MARKDOWN_LSP_AI_ENABLED.
12
+ * Only checks that at least one API key is present. Exits with a clear message on failure.
13
+ */
14
+ export declare function assertApiKey(): void;
9
15
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAQtC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAYtC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAStC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAYtC;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAQnC"}
package/dist/ai/config.js CHANGED
@@ -1,10 +1,12 @@
1
+ import { DEFAULT_EMBEDDING_MODEL } from "./gateway.js";
1
2
  export function getAiConfig() {
2
3
  const enabled = process.env.MARKDOWN_LSP_AI_ENABLED === "1" || process.env.MARKDOWN_LSP_AI_ENABLED === "true";
3
4
  return {
4
5
  enabled,
5
- embeddingModel: process.env.EMBEDDING_MODEL ?? "text-embedding-3-small",
6
+ embeddingModel: process.env.EMBEDDING_MODEL ?? DEFAULT_EMBEDDING_MODEL,
6
7
  extractModel: process.env.EXTRACT_MODEL ?? "gpt-4o-mini",
7
8
  hasGatewayKey: Boolean(process.env.AI_GATEWAY_API_KEY),
9
+ hasOpenRouterKey: Boolean(process.env.OPENROUTER_API_KEY),
8
10
  };
9
11
  }
10
12
  export function assertAiEnabled() {
@@ -12,8 +14,19 @@ export function assertAiEnabled() {
12
14
  if (!cfg.enabled) {
13
15
  throw new Error("AI features are disabled. Set MARKDOWN_LSP_AI_ENABLED=1 to enable embeddings + semantic extraction.");
14
16
  }
15
- if (!cfg.hasGatewayKey) {
16
- throw new Error("AI features require AI_GATEWAY_API_KEY (Vercel AI Gateway) — or fork the gateway module to use a different provider.");
17
+ if (!cfg.hasGatewayKey && !cfg.hasOpenRouterKey) {
18
+ throw new Error("AI features require OPENROUTER_API_KEY (OpenRouter) or AI_GATEWAY_API_KEY (Vercel AI Gateway).");
19
+ }
20
+ }
21
+ /**
22
+ * Lighter check for CLI commands (semantic-search) that don't need MARKDOWN_LSP_AI_ENABLED.
23
+ * Only checks that at least one API key is present. Exits with a clear message on failure.
24
+ */
25
+ export function assertApiKey() {
26
+ const cfg = getAiConfig();
27
+ if (!cfg.hasGatewayKey && !cfg.hasOpenRouterKey) {
28
+ process.stderr.write("Error: set OPENROUTER_API_KEY (OpenRouter) or AI_GATEWAY_API_KEY (Vercel AI Gateway) to use semantic-search.\n");
29
+ process.exit(1);
17
30
  }
18
31
  }
19
32
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM,CAAA;IAC7G,OAAO;QACL,OAAO;QACP,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB;QACvE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa;QACxD,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;KACvD,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;IACzB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAA;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,sHAAsH,CACvH,CAAA;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAUtD,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM,CAAA;IAC7G,OAAO;QACL,OAAO;QACP,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB;QACtE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa;QACxD,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtD,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;KAC1D,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;IACzB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAA;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAA;IACzB,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,gHAAgH,CACjH,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -2,6 +2,13 @@ export interface EmbeddingResult {
2
2
  vectors: number[][];
3
3
  tokensUsed: number;
4
4
  }
5
- export declare function embedTexts(texts: string[]): Promise<EmbeddingResult>;
6
- export declare function embedOne(text: string): Promise<number[]>;
5
+ /**
6
+ * Embed multiple texts with disk-cache support.
7
+ * Checks cache per-text before hitting the API; saves results after.
8
+ * @param texts - texts to embed
9
+ * @param modelOverride - override the embedding model (default: EMBEDDING_MODEL env or openai/text-embedding-3-small)
10
+ * @param useCache - whether to use disk cache (default: true)
11
+ */
12
+ export declare function embedTexts(texts: string[], modelOverride?: string, useCache?: boolean): Promise<EmbeddingResult>;
13
+ export declare function embedOne(text: string, modelOverride?: string): Promise<number[]>;
7
14
  //# sourceMappingURL=embeddings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/ai/embeddings.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,EAAE,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAiB1E;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG9D"}
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/ai/embeddings.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,EAAE,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,UAAO,GACd,OAAO,CAAC,eAAe,CAAC,CAgD1B;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGtF"}
@@ -1,27 +1,65 @@
1
1
  import { embedMany } from "ai";
2
2
  import { getGateway, EMBEDDING_MODEL } from "./gateway.js";
3
3
  import { assertAiEnabled } from "./config.js";
4
+ import { cachedEmbedding, saveEmbedding } from "./cache.js";
4
5
  const BATCH_SIZE = 96;
5
6
  const MAX_INPUT_CHARS = 6000;
6
- export async function embedTexts(texts) {
7
+ /**
8
+ * Embed multiple texts with disk-cache support.
9
+ * Checks cache per-text before hitting the API; saves results after.
10
+ * @param texts - texts to embed
11
+ * @param modelOverride - override the embedding model (default: EMBEDDING_MODEL env or openai/text-embedding-3-small)
12
+ * @param useCache - whether to use disk cache (default: true)
13
+ */
14
+ export async function embedTexts(texts, modelOverride, useCache = true) {
7
15
  if (texts.length === 0)
8
16
  return { vectors: [], tokensUsed: 0 };
9
17
  assertAiEnabled();
10
18
  const gw = getGateway();
11
- const model = gw.embedding(EMBEDDING_MODEL);
12
- const out = [];
19
+ const modelName = modelOverride ?? EMBEDDING_MODEL;
20
+ const model = gw.embedding(modelName);
21
+ const out = new Array(texts.length).fill(null);
13
22
  let tokensUsed = 0;
14
- for (let i = 0; i < texts.length; i += BATCH_SIZE) {
15
- const batch = texts.slice(i, i + BATCH_SIZE).map((t) => t.slice(0, MAX_INPUT_CHARS));
16
- const res = await embedMany({ model, values: batch });
17
- for (const v of res.embeddings)
18
- out.push(v);
23
+ // Check cache first
24
+ const uncachedIndices = [];
25
+ const uncachedTexts = [];
26
+ if (useCache) {
27
+ for (let i = 0; i < texts.length; i++) {
28
+ const cached = cachedEmbedding(texts[i], modelName);
29
+ if (cached !== null) {
30
+ out[i] = cached;
31
+ }
32
+ else {
33
+ uncachedIndices.push(i);
34
+ uncachedTexts.push(texts[i]);
35
+ }
36
+ }
37
+ }
38
+ else {
39
+ for (let i = 0; i < texts.length; i++) {
40
+ uncachedIndices.push(i);
41
+ uncachedTexts.push(texts[i]);
42
+ }
43
+ }
44
+ // Embed uncached texts in batches
45
+ for (let b = 0; b < uncachedTexts.length; b += BATCH_SIZE) {
46
+ const batchTexts = uncachedTexts.slice(b, b + BATCH_SIZE).map((t) => t.slice(0, MAX_INPUT_CHARS));
47
+ const batchIndices = uncachedIndices.slice(b, b + BATCH_SIZE);
48
+ const res = await embedMany({ model, values: batchTexts });
49
+ for (let j = 0; j < res.embeddings.length; j++) {
50
+ const vec = res.embeddings[j];
51
+ const originalIndex = batchIndices[j];
52
+ out[originalIndex] = vec;
53
+ if (useCache) {
54
+ saveEmbedding(uncachedTexts[b + j], modelName, vec);
55
+ }
56
+ }
19
57
  tokensUsed += res.usage?.tokens ?? 0;
20
58
  }
21
59
  return { vectors: out, tokensUsed };
22
60
  }
23
- export async function embedOne(text) {
24
- const { vectors } = await embedTexts([text]);
61
+ export async function embedOne(text, modelOverride) {
62
+ const { vectors } = await embedTexts([text], modelOverride);
25
63
  return vectors[0];
26
64
  }
27
65
  //# sourceMappingURL=embeddings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/ai/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,UAAU,GAAG,EAAE,CAAA;AACrB,MAAM,eAAe,GAAG,IAAI,CAAA;AAO5B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAe;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;IAC7D,eAAe,EAAE,CAAA;IACjB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;IACvB,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IAE3C,MAAM,GAAG,GAAe,EAAE,CAAA;IAC1B,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAA;QACpF,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QACrD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,CAAa,CAAC,CAAA;QACvD,UAAU,IAAI,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5C,OAAO,OAAO,CAAC,CAAC,CAAE,CAAA;AACpB,CAAC"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/ai/embeddings.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
+ export declare const DEFAULT_EMBEDDING_MODEL = "openai/text-embedding-3-small";
1
2
  export declare const EMBEDDING_MODEL: string;
2
3
  export declare const EMBEDDING_DIM = 1536;
3
4
  export declare const EXTRACT_MODEL: string;
4
5
  export declare function getGateway(): import("@ai-sdk/openai").OpenAIProvider;
6
+ /** Reset the cached gateway (useful for tests or when env changes mid-process) */
7
+ export declare function resetGateway(): void;
5
8
  //# sourceMappingURL=gateway.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/ai/gateway.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,QAA0D,CAAA;AACtF,eAAO,MAAM,aAAa,OAAO,CAAA;AACjC,eAAO,MAAM,aAAa,QAA6C,CAAA;AAIvE,wBAAgB,UAAU,4CASzB"}
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/ai/gateway.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,kCAAkC,CAAA;AACtE,eAAO,MAAM,eAAe,QAAyD,CAAA;AACrF,eAAO,MAAM,aAAa,OAAO,CAAA;AACjC,eAAO,MAAM,aAAa,QAA6C,CAAA;AAIvE,wBAAgB,UAAU,4CAoBzB;AAED,kFAAkF;AAClF,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
@@ -1,18 +1,27 @@
1
1
  import { createOpenAI } from "@ai-sdk/openai";
2
- export const EMBEDDING_MODEL = process.env.EMBEDDING_MODEL ?? "text-embedding-3-small";
2
+ export const DEFAULT_EMBEDDING_MODEL = "openai/text-embedding-3-small";
3
+ export const EMBEDDING_MODEL = process.env.EMBEDDING_MODEL ?? DEFAULT_EMBEDDING_MODEL;
3
4
  export const EMBEDDING_DIM = 1536;
4
5
  export const EXTRACT_MODEL = process.env.EXTRACT_MODEL ?? "gpt-4o-mini";
5
6
  let _gw = null;
6
7
  export function getGateway() {
7
8
  if (_gw)
8
9
  return _gw;
9
- const apiKey = process.env.AI_GATEWAY_API_KEY;
10
- if (!apiKey)
11
- throw new Error("AI_GATEWAY_API_KEY is not set");
12
- _gw = createOpenAI({
13
- apiKey,
14
- baseURL: process.env.AI_GATEWAY_BASE_URL ?? "https://ai-gateway.vercel.sh/v1",
15
- });
10
+ // OpenRouter takes priority if OPENROUTER_API_KEY is set
11
+ const openrouterKey = process.env.OPENROUTER_API_KEY;
12
+ const gatewayKey = process.env.AI_GATEWAY_API_KEY;
13
+ const apiKey = openrouterKey ?? gatewayKey;
14
+ if (!apiKey) {
15
+ throw new Error("Set OPENROUTER_API_KEY (OpenRouter) or AI_GATEWAY_API_KEY (Vercel AI Gateway) to use AI features.");
16
+ }
17
+ const baseURL = openrouterKey
18
+ ? (process.env.AI_GATEWAY_BASE_URL ?? "https://openrouter.ai/api/v1")
19
+ : (process.env.AI_GATEWAY_BASE_URL ?? "https://ai-gateway.vercel.sh/v1");
20
+ _gw = createOpenAI({ apiKey, baseURL });
16
21
  return _gw;
17
22
  }
23
+ /** Reset the cached gateway (useful for tests or when env changes mid-process) */
24
+ export function resetGateway() {
25
+ _gw = null;
26
+ }
18
27
  //# sourceMappingURL=gateway.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/ai/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,wBAAwB,CAAA;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa,CAAA;AAEvE,IAAI,GAAG,GAA2C,IAAI,CAAA;AAEtD,MAAM,UAAU,UAAU;IACxB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IACnB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IAC7C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAC7D,GAAG,GAAG,YAAY,CAAC;QACjB,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,iCAAiC;KAC9E,CAAC,CAAA;IACF,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/ai/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,+BAA+B,CAAA;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB,CAAA;AACrF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,aAAa,CAAA;AAEvE,IAAI,GAAG,GAA2C,IAAI,CAAA;AAEtD,MAAM,UAAU,UAAU;IACxB,IAAI,GAAG;QAAE,OAAO,GAAG,CAAA;IAEnB,yDAAyD;IACzD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IACpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAA;IACjD,MAAM,MAAM,GAAG,aAAa,IAAI,UAAU,CAAA;IAE1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,mGAAmG,CACpG,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,aAAa;QAC3B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,8BAA8B,CAAC;QACrE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,iCAAiC,CAAC,CAAA;IAE1E,GAAG,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IACvC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,YAAY;IAC1B,GAAG,GAAG,IAAI,CAAA;AACZ,CAAC"}
package/dist/cli.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import { parseArgs } from "node:util";
2
+ import * as fs from "node:fs";
2
3
  import { buildGraph } from "./graph.js";
3
4
  import { listPages, searchText, searchTextRanked, searchSymbols, searchPaths, } from "./bridge/index.js";
4
5
  const USAGE = `
5
- markdown-lsp v1.0.0 — CLI for querying Markdown documentation graphs
6
+ markdown-lsp v1.1.0 — CLI for querying Markdown documentation graphs
6
7
 
7
8
  USAGE
8
9
  markdown-lsp <subcommand> [options]
@@ -37,6 +38,16 @@ SUBCOMMANDS
37
38
  get-section <docs-dir> <page> <anchor>
38
39
  Retrieve a section by its anchor slug.
39
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
+
40
51
  lsp [--stdio]
41
52
  serve [--stdio]
42
53
  Start the LSP stdio server (for editor integration).
@@ -57,6 +68,9 @@ EXAMPLES
57
68
  markdown-lsp workspace-outline ./docs
58
69
  markdown-lsp search-text ./docs "getting started" --pretty
59
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
60
74
  markdown-lsp lsp --stdio
61
75
  `.trim();
62
76
  function die(msg) {
@@ -69,6 +83,231 @@ function out(value, pretty) {
69
83
  async function startLsp() {
70
84
  await import("./lsp.js");
71
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
+ }
72
311
  async function main() {
73
312
  const argv = process.argv.slice(2);
74
313
  // Back-compat: if the first argument looks like an old LSP flag, start LSP.
@@ -82,7 +321,7 @@ async function main() {
82
321
  process.exit(0);
83
322
  }
84
323
  // Old LSP invocation style — keep working so editor configs don't break.
85
- await startLsp();
324
+ await startLspServer();
86
325
  return;
87
326
  }
88
327
  const subcommand = argv[0];
@@ -94,7 +333,7 @@ async function main() {
94
333
  }
95
334
  // LSP subcommand
96
335
  if (subcommand === "lsp" || subcommand === "serve") {
97
- await startLsp();
336
+ await startLspServer();
98
337
  return;
99
338
  }
100
339
  // Parse global flags from the remaining args
@@ -253,6 +492,97 @@ async function main() {
253
492
  out(section, pretty);
254
493
  break;
255
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
+ }
256
586
  default:
257
587
  process.stderr.write(`Unknown subcommand: ${subcommand}\n\n${USAGE}\n`);
258
588
  process.exit(1);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EACL,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDb,CAAC,IAAI,EAAE,CAAA;AAER,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,GAAG,CAAC,KAAc,EAAE,MAAe;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;AAChG,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;AAC1B,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAElC,4EAA4E;IAC5E,IACE,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;QACrB,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY;QACxB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EACzD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,iEAAiE;YACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,yEAAyE;QACzE,MAAM,QAAQ,EAAE,CAAA;QAChB,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,iBAAiB;IACjB,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,iBAAiB;IACjB,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACnD,MAAM,QAAQ,EAAE,CAAA;QAChB,OAAM;IACR,CAAC;IAED,6CAA6C;IAC7C,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,YAAY,GAAa,EAAE,CAAA;IACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,UAAU;YAAE,MAAM,GAAG,IAAI,CAAA;;YAChC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,uCAAuC,CAAC,CAAA;YAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE;gBAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aAC3E,CAAC,CAAA;YACF,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAA;YACpE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,yBAAyB,CAAC,CAAA;YAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACpC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC1B,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBACrC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAA;YACxE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAA;YACnE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBACvC,UAAU,EAAE,MAAM,CAAC,MAAM;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC1E,YAAY,EAAE,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aACtF,CAAA;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAA;YACpC,MAAM,MAAM,GAAG,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK;gBAChD,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;gBAChC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;YACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACxC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;oBACP,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,oCAAoC,CAAC,CAAA;YAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAA;YACtE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YACjF,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;YACjD,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,kCAAkC,CAAC,CAAA;YACzE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAA;YAClE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YACvC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAA;YACrE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,0BAA0B,CAAC,CAAA;YAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,gCAAgC,CAAC,CAAA;YACvE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,4BAA4B,CAAC,CAAA;YAChE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACxC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YACnB,MAAK;QACP,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,kCAAkC,CAAC,CAAA;YACzE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAC3E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,mCAAmC,CAAC,CAAA;YAC3E,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAA;YAClE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAClB,MAAK;QACP,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBAChC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,IAAI;aACvB,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,iCAAiC,CAAC,CAAA;YACxE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAA;YACjE,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,+BAA+B,CAAC,CAAA;YACrE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;YACtC,MAAM,OAAO,GAAG,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,CAAA;YAC1E,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACpB,MAAK;QACP,CAAC;QAED;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,OAAO,KAAK,IAAI,CAAC,CAAA;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC7H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markdown-lsp",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Language Server Protocol implementation for Markdown with optional AI-canonicalized glossary that resolves synonyms across docs",
5
5
  "type": "module",
6
6
  "bin": {