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 +60 -1
- package/dist/ai/cache.d.ts +3 -0
- package/dist/ai/cache.d.ts.map +1 -0
- package/dist/ai/cache.js +27 -0
- package/dist/ai/cache.js.map +1 -0
- package/dist/ai/config.d.ts +6 -0
- package/dist/ai/config.d.ts.map +1 -1
- package/dist/ai/config.js +16 -3
- package/dist/ai/config.js.map +1 -1
- package/dist/ai/embeddings.d.ts +9 -2
- package/dist/ai/embeddings.d.ts.map +1 -1
- package/dist/ai/embeddings.js +48 -10
- package/dist/ai/embeddings.js.map +1 -1
- package/dist/ai/gateway.d.ts +3 -0
- package/dist/ai/gateway.d.ts.map +1 -1
- package/dist/ai/gateway.js +17 -8
- package/dist/ai/gateway.js.map +1 -1
- package/dist/cli.js +333 -3
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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 @@
|
|
|
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"}
|
package/dist/ai/cache.js
ADDED
|
@@ -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"}
|
package/dist/ai/config.d.ts
CHANGED
|
@@ -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
|
package/dist/ai/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"
|
|
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 ??
|
|
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)
|
|
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
|
package/dist/ai/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/ai/config.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/ai/embeddings.d.ts
CHANGED
|
@@ -2,6 +2,13 @@ export interface EmbeddingResult {
|
|
|
2
2
|
vectors: number[][];
|
|
3
3
|
tokensUsed: number;
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
|
|
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":"
|
|
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"}
|
package/dist/ai/embeddings.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
12
|
-
const
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/ai/embeddings.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/gateway.d.ts
CHANGED
|
@@ -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
|
package/dist/ai/gateway.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/ai/gateway.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,
|
|
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"}
|
package/dist/ai/gateway.js
CHANGED
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
import { createOpenAI } from "@ai-sdk/openai";
|
|
2
|
-
export const
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
package/dist/ai/gateway.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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
|
|
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
|
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED