claude-local-docs 1.0.0 → 1.0.2
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/.mcp.json +3 -6
- package/README.md +26 -20
- package/commands/fetch-docs.md +69 -37
- package/dist/fetcher.d.ts +14 -0
- package/dist/fetcher.js +49 -0
- package/dist/fetcher.js.map +1 -0
- package/dist/index.js +103 -28
- package/dist/index.js.map +1 -1
- package/dist/indexer.js +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.js +8 -43
- package/dist/search.js.map +1 -1
- package/dist/store.d.ts +4 -0
- package/dist/store.js +30 -0
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/workspace.d.ts +42 -0
- package/dist/workspace.js +216 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +1 -2
package/.mcp.json
CHANGED
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ A local-first alternative to Context7 for Claude Code. Indexes your project's de
|
|
|
14
14
|
| **Doc sources** | Prefers llms.txt, falls back to official docs | Pre-indexed source repos |
|
|
15
15
|
| **Scope** | Your project's actual dependencies | Any library |
|
|
16
16
|
| **Setup** | `npm install` + `/fetch-docs` | Install plugin |
|
|
17
|
+
| **Monorepo** | Detects pnpm/npm/yarn workspaces, resolves catalogs | N/A |
|
|
17
18
|
|
|
18
19
|
## How it works
|
|
19
20
|
|
|
@@ -21,18 +22,18 @@ A local-first alternative to Context7 for Claude Code. Indexes your project's de
|
|
|
21
22
|
/fetch-docs search_docs("how to use useState")
|
|
22
23
|
│ │
|
|
23
24
|
▼ ▼
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
25
|
+
Detect monorepo ┌─── Vector search (LanceDB) ───┐
|
|
26
|
+
Scan all workspace pkgs │ nomic-embed-text-v1.5 │
|
|
27
|
+
Resolve catalog: versions │ │
|
|
28
|
+
│ │ ├─→ RRF Fusion
|
|
29
|
+
▼ │ │ (k=60)
|
|
30
|
+
For each runtime dep: ├── BM25 search (LanceDB FTS) ──┘
|
|
31
|
+
- Search for llms.txt │ keyword + stemming │
|
|
32
|
+
- Raw fetch (no truncation)│ ▼
|
|
33
|
+
- Chunk + embed + store │ Cross-encoder rerank
|
|
34
|
+
│ ms-marco-MiniLM-L-6-v2
|
|
35
|
+
│ │
|
|
36
|
+
└──────────────────────────────────┘
|
|
36
37
|
│
|
|
37
38
|
▼
|
|
38
39
|
Top-K results
|
|
@@ -60,7 +61,7 @@ Or install as a project-local plugin by cloning into your project and referencin
|
|
|
60
61
|
/fetch-docs
|
|
61
62
|
```
|
|
62
63
|
|
|
63
|
-
Claude
|
|
64
|
+
Claude analyzes your project (including monorepo workspaces), finds all runtime dependencies, searches the web for the best documentation for each one (preferring `llms-full.txt` > `llms.txt` > official docs), and indexes everything locally. Progress is reported one library at a time.
|
|
64
65
|
|
|
65
66
|
### 2. Search
|
|
66
67
|
|
|
@@ -76,7 +77,8 @@ Show me the API for zod's .refine()
|
|
|
76
77
|
|
|
77
78
|
- **`list_docs`** — See what's indexed, when it was fetched, chunk counts
|
|
78
79
|
- **`get_doc_section`** — Retrieve specific sections by heading or chunk ID
|
|
79
|
-
- **`analyze_dependencies`** — List all deps
|
|
80
|
+
- **`analyze_dependencies`** — List all deps (monorepo-aware, catalog-resolved, runtime/dev tagged)
|
|
81
|
+
- **`fetch_and_store_doc`** — Fetch a URL and index it directly (no AI truncation)
|
|
80
82
|
|
|
81
83
|
## Search pipeline
|
|
82
84
|
|
|
@@ -85,7 +87,7 @@ This plugin implements a 4-stage advanced RAG pipeline, the current production s
|
|
|
85
87
|
| Stage | Technology | Purpose |
|
|
86
88
|
|---|---|---|
|
|
87
89
|
| **Vector search** | LanceDB + nomic-embed-text-v1.5 | Semantic similarity (understands meaning) |
|
|
88
|
-
| **BM25 search** |
|
|
90
|
+
| **BM25 search** | LanceDB native FTS (BM25, stemming, stop words) | Keyword matching (exact terms like `useEffect`) |
|
|
89
91
|
| **RRF fusion** | Reciprocal Rank Fusion (k=60) | Merges both ranked lists, handles different score scales |
|
|
90
92
|
| **Cross-encoder rerank** | ms-marco-MiniLM-L-6-v2 | Rescores top 30 candidates with deep relevance model |
|
|
91
93
|
|
|
@@ -107,7 +109,7 @@ All models run locally via ONNX. Downloaded once on first use, then cached.
|
|
|
107
109
|
## Chunking strategy
|
|
108
110
|
|
|
109
111
|
- Split markdown by headings (`##`, `###`, `####`) preserving the heading path
|
|
110
|
-
- Target ~
|
|
112
|
+
- Target ~1500 characters per chunk
|
|
111
113
|
- 10% overlap between chunks to prevent losing context at boundaries
|
|
112
114
|
- Large sections split at paragraph boundaries
|
|
113
115
|
|
|
@@ -129,8 +131,9 @@ your-project/.claude/docs/
|
|
|
129
131
|
|
|
130
132
|
| Tool | Description |
|
|
131
133
|
|---|---|
|
|
132
|
-
| `analyze_dependencies` |
|
|
134
|
+
| `analyze_dependencies` | Monorepo-aware dep analysis: detects workspaces, resolves catalog versions, tags runtime/dev |
|
|
133
135
|
| `store_and_index_doc` | Receive markdown, chunk, embed, store in LanceDB |
|
|
136
|
+
| `fetch_and_store_doc` | Fetch URL directly (raw HTTP, no truncation), then chunk + embed + store |
|
|
134
137
|
| `search_docs` | Full RAG pipeline: vector + BM25 + RRF + rerank |
|
|
135
138
|
| `list_docs` | List indexed libraries with metadata |
|
|
136
139
|
| `get_doc_section` | Get specific chunks by library + heading or chunk ID |
|
|
@@ -141,12 +144,13 @@ All open source:
|
|
|
141
144
|
|
|
142
145
|
| Package | License | Purpose |
|
|
143
146
|
|---|---|---|
|
|
144
|
-
| `@lancedb/lancedb` | Apache 2.0 | Embedded vector database |
|
|
147
|
+
| `@lancedb/lancedb` | Apache 2.0 | Embedded vector database + native FTS |
|
|
145
148
|
| `@huggingface/transformers` | Apache 2.0 | Run ONNX models locally |
|
|
146
|
-
| `minisearch` | MIT | BM25+ full-text search |
|
|
147
149
|
| `@modelcontextprotocol/sdk` | MIT | MCP server framework |
|
|
148
150
|
| `zod` | MIT | Schema validation |
|
|
149
151
|
|
|
152
|
+
No additional dependencies were added for monorepo support or HTTP fetching — everything uses Node built-ins.
|
|
153
|
+
|
|
150
154
|
## Development
|
|
151
155
|
|
|
152
156
|
```bash
|
|
@@ -171,11 +175,13 @@ claude-local-docs/
|
|
|
171
175
|
├── commands/
|
|
172
176
|
│ └── fetch-docs.md # /fetch-docs command — Claude as research agent
|
|
173
177
|
├── src/
|
|
174
|
-
│ ├── index.ts # MCP server entry,
|
|
178
|
+
│ ├── index.ts # MCP server entry, 6 tool definitions
|
|
175
179
|
│ ├── indexer.ts # Chunking + nomic-embed-text-v1.5 embeddings
|
|
176
180
|
│ ├── search.ts # 4-stage pipeline: vector + BM25 + RRF + rerank
|
|
177
181
|
│ ├── reranker.ts # Cross-encoder (ms-marco-MiniLM-L-6-v2)
|
|
178
182
|
│ ├── store.ts # LanceDB storage + metadata persistence
|
|
183
|
+
│ ├── fetcher.ts # Raw HTTP fetch (no AI truncation)
|
|
184
|
+
│ ├── workspace.ts # Monorepo detection + pnpm catalog + dep collection
|
|
179
185
|
│ └── types.ts # Shared TypeScript interfaces
|
|
180
186
|
├── LICENSE
|
|
181
187
|
├── package.json
|
package/commands/fetch-docs.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Fetch and index documentation for all project dependencies"
|
|
3
|
-
allowed-tools: ["mcp__local-docs__analyze_dependencies", "mcp__local-docs__list_docs", "mcp__local-docs__store_and_index_doc", "WebFetch", "WebSearch"]
|
|
3
|
+
allowed-tools: ["mcp__local-docs__analyze_dependencies", "mcp__local-docs__list_docs", "mcp__local-docs__store_and_index_doc", "mcp__local-docs__fetch_and_store_doc", "WebFetch", "WebSearch"]
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Fetch Documentation for Project Dependencies
|
|
@@ -10,46 +10,78 @@ You are a documentation research agent. Your job is to find and fetch the best a
|
|
|
10
10
|
## Steps
|
|
11
11
|
|
|
12
12
|
### 1. Analyze Dependencies
|
|
13
|
-
Call the `analyze_dependencies` MCP tool to get the list of dependencies from package.json.
|
|
14
13
|
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
Call `analyze_dependencies` to get the full dependency list. This automatically:
|
|
15
|
+
- Detects monorepos (pnpm workspaces, npm/yarn workspaces)
|
|
16
|
+
- Resolves `catalog:` versions from pnpm-workspace.yaml
|
|
17
|
+
- Collects deps from ALL workspace packages
|
|
18
|
+
- Deduplicates and tags each dep as `runtime` or `dev`
|
|
17
19
|
|
|
18
|
-
###
|
|
20
|
+
### 2. Filter Dependencies
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
From the returned list, **skip** all of the following:
|
|
23
|
+
- All `dev` dependencies (eslint, prettier, typescript, vitest, jest, etc.)
|
|
24
|
+
- All `@types/*` packages (these are just TypeScript type definitions)
|
|
25
|
+
- Workspace-internal packages (listed in `workspacePackages`)
|
|
26
|
+
- Known tooling that doesn't need docs: `tslib`, `tsconfig-*`, `eslint-*`, `prettier-*`, `@eslint/*`
|
|
21
27
|
|
|
22
|
-
|
|
23
|
-
1. **Search the web** for `"{library name} llms.txt documentation"`
|
|
24
|
-
2. If you find a URL to `llms-full.txt` or `llms.txt`, **fetch it** using WebFetch
|
|
25
|
-
3. `llms-full.txt` is preferred over `llms.txt` (it has more detail)
|
|
28
|
+
This leaves only **runtime dependencies** that actually need documentation.
|
|
26
29
|
|
|
27
|
-
|
|
30
|
+
### 3. Check Existing Cache
|
|
31
|
+
|
|
32
|
+
Call `list_docs` to see which libraries are already indexed. **Skip** any library that was fetched within the last 7 days unless the user explicitly asks to refresh.
|
|
33
|
+
|
|
34
|
+
### 4. Fetch Documentation — One Library at a Time
|
|
35
|
+
|
|
36
|
+
Process each remaining library **one at a time** with clear progress reporting. For each library:
|
|
37
|
+
|
|
38
|
+
#### a. Search for llms-full.txt (best source)
|
|
39
|
+
1. **WebSearch** for `"{library name} llms-full.txt"`
|
|
40
|
+
2. If you find a direct URL to `llms-full.txt`:
|
|
41
|
+
- Call **`fetch_and_store_doc`** with the URL (this fetches raw content — no truncation)
|
|
42
|
+
- Report: `[1/N] library-name — chunks from llms-full.txt (size)`
|
|
43
|
+
|
|
44
|
+
#### b. Search for llms.txt (good source)
|
|
45
|
+
If no llms-full.txt found:
|
|
46
|
+
1. **WebSearch** for `"{library name} llms.txt"`
|
|
47
|
+
2. If you find a direct URL to `llms.txt`:
|
|
48
|
+
- Call **`fetch_and_store_doc`** with the URL
|
|
49
|
+
- Report: `[2/N] library-name — chunks from llms.txt (size)`
|
|
50
|
+
|
|
51
|
+
#### c. Fallback: Official docs via WebFetch
|
|
28
52
|
If no llms.txt exists:
|
|
29
|
-
1. **
|
|
30
|
-
2.
|
|
31
|
-
3.
|
|
32
|
-
4.
|
|
33
|
-
|
|
34
|
-
####
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
1. **WebSearch** for `"{library name} official documentation"`
|
|
54
|
+
2. **WebFetch** the main documentation page
|
|
55
|
+
3. Call **`store_and_index_doc`** with the fetched content
|
|
56
|
+
4. Report: `[3/N] library-name — chunks from official docs`
|
|
57
|
+
|
|
58
|
+
#### d. If all attempts fail
|
|
59
|
+
Report: `[4/N] library-name — SKIPPED (no docs found)` and move on.
|
|
60
|
+
|
|
61
|
+
### 5. Final Summary
|
|
62
|
+
|
|
63
|
+
After processing all libraries, report:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
Done! Indexed X/Y libraries.
|
|
67
|
+
|
|
68
|
+
react — 85 chunks (llms-full.txt, 340KB)
|
|
69
|
+
next — 120 chunks (llms-full.txt, 510KB)
|
|
70
|
+
zod — 45 chunks (llms.txt, 95KB)
|
|
71
|
+
express — 30 chunks (official docs)
|
|
72
|
+
lodash — SKIPPED (no docs found)
|
|
73
|
+
|
|
74
|
+
Total: 280 chunks across 4 libraries.
|
|
75
|
+
Use search_docs to query your documentation.
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Critical Rules
|
|
79
|
+
|
|
80
|
+
- **NEVER write files to the filesystem directly.** Do NOT use the Write tool, Bash tool, or any other method to save documentation content to disk. ALL storage goes through the MCP tools (`fetch_and_store_doc` and `store_and_index_doc`), which save everything inside `.claude/docs/`. No exceptions.
|
|
81
|
+
- **NEVER create markdown files, text files, or any other files** in the project directory. The MCP tools handle all file storage internally.
|
|
82
|
+
- **Use `fetch_and_store_doc` for all llms.txt URLs** — this fetches raw content without AI truncation, preserving full documentation
|
|
83
|
+
- **Use `store_and_index_doc` only for WebFetch fallback** — pass the WebFetch result content directly to the tool, do NOT save it to a file first
|
|
84
|
+
- **One library at a time** — clear progress, no batching
|
|
85
|
+
- **Skip dev deps by default** — runtime deps only
|
|
55
86
|
- For scoped packages like `@scope/package`, search for both the full name and just the package part
|
|
87
|
+
- Handle errors gracefully: if a library fails, log it and move to the next one
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw HTTP fetch for documentation content.
|
|
3
|
+
* No AI processing, no truncation — returns full text as-is.
|
|
4
|
+
*/
|
|
5
|
+
export type FetchResult = {
|
|
6
|
+
ok: true;
|
|
7
|
+
content: string;
|
|
8
|
+
byteLength: number;
|
|
9
|
+
contentType: string;
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
error: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function fetchDocContent(url: string): Promise<FetchResult>;
|
package/dist/fetcher.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw HTTP fetch for documentation content.
|
|
3
|
+
* No AI processing, no truncation — returns full text as-is.
|
|
4
|
+
*/
|
|
5
|
+
const TIMEOUT_MS = 30_000;
|
|
6
|
+
const MAX_SIZE = 5 * 1024 * 1024; // 5MB
|
|
7
|
+
export async function fetchDocContent(url) {
|
|
8
|
+
try {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
11
|
+
const res = await fetch(url, {
|
|
12
|
+
signal: controller.signal,
|
|
13
|
+
headers: {
|
|
14
|
+
"User-Agent": "claude-local-docs/1.0",
|
|
15
|
+
"Accept": "text/plain, text/markdown, text/html, */*",
|
|
16
|
+
},
|
|
17
|
+
redirect: "follow",
|
|
18
|
+
});
|
|
19
|
+
clearTimeout(timer);
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
return { ok: false, error: `HTTP ${res.status} ${res.statusText}` };
|
|
22
|
+
}
|
|
23
|
+
const contentType = res.headers.get("content-type") ?? "text/plain";
|
|
24
|
+
// Check content-length header if available
|
|
25
|
+
const contentLength = res.headers.get("content-length");
|
|
26
|
+
if (contentLength && parseInt(contentLength, 10) > MAX_SIZE) {
|
|
27
|
+
return { ok: false, error: `Content too large: ${contentLength} bytes (limit: ${MAX_SIZE})` };
|
|
28
|
+
}
|
|
29
|
+
// Read body with size guard
|
|
30
|
+
const buffer = await res.arrayBuffer();
|
|
31
|
+
if (buffer.byteLength > MAX_SIZE) {
|
|
32
|
+
return { ok: false, error: `Content too large: ${buffer.byteLength} bytes (limit: ${MAX_SIZE})` };
|
|
33
|
+
}
|
|
34
|
+
const content = new TextDecoder().decode(buffer);
|
|
35
|
+
return {
|
|
36
|
+
ok: true,
|
|
37
|
+
content,
|
|
38
|
+
byteLength: buffer.byteLength,
|
|
39
|
+
contentType,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err.name === "AbortError") {
|
|
44
|
+
return { ok: false, error: `Request timed out after ${TIMEOUT_MS / 1000}s` };
|
|
45
|
+
}
|
|
46
|
+
return { ok: false, error: err.message ?? String(err) };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetcher.js","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AAMxC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;QAE/D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE;gBACP,YAAY,EAAE,uBAAuB;gBACrC,QAAQ,EAAE,2CAA2C;aACtD;YACD,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QAEpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC;QAEpE,2CAA2C;QAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACxD,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC;YAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,aAAa,kBAAkB,QAAQ,GAAG,EAAE,CAAC;QAChG,CAAC;QAED,4BAA4B;QAC5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,UAAU,GAAG,QAAQ,EAAE,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,MAAM,CAAC,UAAU,kBAAkB,QAAQ,GAAG,EAAE,CAAC;QACpG,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEjD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO;YACP,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/E,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
-
import { readFile } from "node:fs/promises";
|
|
5
4
|
import { join } from "node:path";
|
|
6
5
|
import { z } from "zod";
|
|
7
6
|
import { DocStore, resolveProjectRoot } from "./store.js";
|
|
8
7
|
import { indexDocument } from "./indexer.js";
|
|
9
8
|
import { searchDocs } from "./search.js";
|
|
9
|
+
import { analyzeDependencies } from "./workspace.js";
|
|
10
|
+
import { fetchDocContent } from "./fetcher.js";
|
|
10
11
|
const projectRoot = resolveProjectRoot();
|
|
11
12
|
const store = new DocStore(projectRoot);
|
|
12
13
|
const server = new McpServer({
|
|
@@ -14,35 +15,44 @@ const server = new McpServer({
|
|
|
14
15
|
version: "1.0.0",
|
|
15
16
|
});
|
|
16
17
|
// --- Tool 1: analyze_dependencies ---
|
|
17
|
-
server.
|
|
18
|
+
server.registerTool("analyze_dependencies", {
|
|
19
|
+
description: "Analyze project dependencies. Detects monorepos (pnpm workspaces, npm/yarn workspaces), resolves catalog: versions, collects deps from all workspace packages, and deduplicates. Returns deps tagged as runtime/dev plus monorepo info.",
|
|
20
|
+
inputSchema: {
|
|
21
|
+
packageJsonPath: z
|
|
22
|
+
.string()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Path to package.json or project root. Defaults to the project root."),
|
|
25
|
+
},
|
|
26
|
+
}, async ({ packageJsonPath }) => {
|
|
18
27
|
try {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
for (const [name, version] of Object.entries(pkg.devDependencies ?? {})) {
|
|
27
|
-
deps.push({ name, version: version });
|
|
28
|
-
}
|
|
28
|
+
const root = packageJsonPath
|
|
29
|
+
? packageJsonPath.endsWith("package.json")
|
|
30
|
+
? join(packageJsonPath, "..")
|
|
31
|
+
: packageJsonPath
|
|
32
|
+
: projectRoot;
|
|
33
|
+
const result = await analyzeDependencies(root);
|
|
29
34
|
return {
|
|
30
|
-
content: [{ type: "text", text: JSON.stringify(
|
|
35
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
31
36
|
};
|
|
32
37
|
}
|
|
33
38
|
catch (err) {
|
|
34
39
|
return {
|
|
35
|
-
content: [
|
|
40
|
+
content: [
|
|
41
|
+
{ type: "text", text: `Error analyzing dependencies: ${err.message}` },
|
|
42
|
+
],
|
|
36
43
|
isError: true,
|
|
37
44
|
};
|
|
38
45
|
}
|
|
39
46
|
});
|
|
40
47
|
// --- Tool 2: store_and_index_doc ---
|
|
41
|
-
server.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
server.registerTool("store_and_index_doc", {
|
|
49
|
+
description: "Store and index documentation for a library. Chunks markdown, generates embeddings via nomic-embed-text-v1.5, and persists to LanceDB in .claude/docs/",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
library: z.string().describe("Library name (e.g. 'react', '@tanstack/query')"),
|
|
52
|
+
version: z.string().describe("Library version"),
|
|
53
|
+
content: z.string().describe("Raw markdown documentation content"),
|
|
54
|
+
sourceUrl: z.string().describe("URL where the docs were fetched from"),
|
|
55
|
+
},
|
|
46
56
|
}, async ({ library, version, content, sourceUrl }) => {
|
|
47
57
|
try {
|
|
48
58
|
// Save raw doc
|
|
@@ -74,10 +84,13 @@ server.tool("store_and_index_doc", "Store and index documentation for a library.
|
|
|
74
84
|
}
|
|
75
85
|
});
|
|
76
86
|
// --- Tool 3: search_docs ---
|
|
77
|
-
server.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
87
|
+
server.registerTool("search_docs", {
|
|
88
|
+
description: "Advanced RAG search: BM25 keyword search + vector similarity → RRF fusion → cross-encoder reranking. Uses nomic-embed-text-v1.5 for embeddings and ms-marco-MiniLM for reranking.",
|
|
89
|
+
inputSchema: {
|
|
90
|
+
query: z.string().describe("Search query"),
|
|
91
|
+
library: z.string().optional().describe("Filter results to a specific library"),
|
|
92
|
+
topK: z.number().optional().describe("Number of results to return (default: 10)"),
|
|
93
|
+
},
|
|
81
94
|
}, async ({ query, library, topK }) => {
|
|
82
95
|
try {
|
|
83
96
|
if (await store.isEmpty()) {
|
|
@@ -112,7 +125,9 @@ server.tool("search_docs", "Advanced RAG search: BM25 keyword search + vector si
|
|
|
112
125
|
}
|
|
113
126
|
});
|
|
114
127
|
// --- Tool 4: list_docs ---
|
|
115
|
-
server.
|
|
128
|
+
server.registerTool("list_docs", {
|
|
129
|
+
description: "List all indexed documentation libraries with metadata",
|
|
130
|
+
}, async () => {
|
|
116
131
|
try {
|
|
117
132
|
const metadata = await store.loadMetadata();
|
|
118
133
|
if (metadata.libraries.length === 0) {
|
|
@@ -139,10 +154,13 @@ server.tool("list_docs", "List all indexed documentation libraries with metadata
|
|
|
139
154
|
}
|
|
140
155
|
});
|
|
141
156
|
// --- Tool 5: get_doc_section ---
|
|
142
|
-
server.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
157
|
+
server.registerTool("get_doc_section", {
|
|
158
|
+
description: "Retrieve specific documentation chunks by library + heading or chunk ID",
|
|
159
|
+
inputSchema: {
|
|
160
|
+
library: z.string().describe("Library name"),
|
|
161
|
+
heading: z.string().optional().describe("Heading text to search for in the heading path"),
|
|
162
|
+
chunkId: z.number().optional().describe("Specific chunk ID to retrieve"),
|
|
163
|
+
},
|
|
146
164
|
}, async ({ library, heading, chunkId }) => {
|
|
147
165
|
try {
|
|
148
166
|
if (chunkId !== undefined) {
|
|
@@ -217,6 +235,63 @@ server.tool("get_doc_section", "Retrieve specific documentation chunks by librar
|
|
|
217
235
|
};
|
|
218
236
|
}
|
|
219
237
|
});
|
|
238
|
+
// --- Tool 6: fetch_and_store_doc ---
|
|
239
|
+
server.registerTool("fetch_and_store_doc", {
|
|
240
|
+
description: "Fetch documentation from a URL (raw HTTP, no AI processing or truncation) and index it. Use this for llms.txt and llms-full.txt URLs to preserve full content. Handles up to 5MB, 30s timeout.",
|
|
241
|
+
inputSchema: {
|
|
242
|
+
library: z.string().describe("Library name (e.g. 'react', '@tanstack/query')"),
|
|
243
|
+
version: z.string().describe("Library version"),
|
|
244
|
+
url: z.string().describe("URL to fetch documentation from (e.g. llms-full.txt URL)"),
|
|
245
|
+
},
|
|
246
|
+
}, async ({ library, version, url }) => {
|
|
247
|
+
try {
|
|
248
|
+
// Fetch raw content
|
|
249
|
+
const fetchResult = await fetchDocContent(url);
|
|
250
|
+
if (!fetchResult.ok) {
|
|
251
|
+
return {
|
|
252
|
+
content: [
|
|
253
|
+
{
|
|
254
|
+
type: "text",
|
|
255
|
+
text: JSON.stringify({ success: false, error: fetchResult.error }),
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
isError: true,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// Save raw doc
|
|
262
|
+
await store.saveRawDoc(library, fetchResult.content);
|
|
263
|
+
// Chunk and embed
|
|
264
|
+
const chunks = await indexDocument(fetchResult.content, library);
|
|
265
|
+
// Store in LanceDB
|
|
266
|
+
const result = await store.addLibrary(library, version, url, chunks);
|
|
267
|
+
return {
|
|
268
|
+
content: [
|
|
269
|
+
{
|
|
270
|
+
type: "text",
|
|
271
|
+
text: JSON.stringify({
|
|
272
|
+
success: true,
|
|
273
|
+
library,
|
|
274
|
+
chunkCount: result.chunkCount,
|
|
275
|
+
byteLength: fetchResult.byteLength,
|
|
276
|
+
totalIndexSize: result.indexSize,
|
|
277
|
+
storedAt: store.getDocsDir(),
|
|
278
|
+
}),
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
return {
|
|
285
|
+
content: [
|
|
286
|
+
{
|
|
287
|
+
type: "text",
|
|
288
|
+
text: JSON.stringify({ success: false, error: err.message }),
|
|
289
|
+
},
|
|
290
|
+
],
|
|
291
|
+
isError: true,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
});
|
|
220
295
|
// --- Start server ---
|
|
221
296
|
async function main() {
|
|
222
297
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/indexer.js
CHANGED
|
@@ -24,7 +24,7 @@ export function chunkMarkdown(markdown, library) {
|
|
|
24
24
|
const trimmed = currentText.trim();
|
|
25
25
|
if (trimmed.length > 0) {
|
|
26
26
|
const headingPath = headingStack.map((h) => h.text);
|
|
27
|
-
const subChunks = splitWithOverlap(trimmed,
|
|
27
|
+
const subChunks = splitWithOverlap(trimmed, 1500, 200);
|
|
28
28
|
for (const sub of subChunks) {
|
|
29
29
|
chunks.push({
|
|
30
30
|
library,
|
package/dist/search.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Advanced RAG search pipeline:
|
|
3
3
|
* 1. Vector search (LanceDB) — semantic similarity
|
|
4
|
-
* 2. BM25 search (
|
|
4
|
+
* 2. BM25 search (LanceDB native FTS) — keyword/exact match
|
|
5
5
|
* 3. Reciprocal Rank Fusion — merge both ranked lists
|
|
6
6
|
* 4. Cross-encoder rerank — rescore top candidates
|
|
7
7
|
*/
|
package/dist/search.js
CHANGED
|
@@ -1,42 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Advanced RAG search pipeline:
|
|
3
3
|
* 1. Vector search (LanceDB) — semantic similarity
|
|
4
|
-
* 2. BM25 search (
|
|
4
|
+
* 2. BM25 search (LanceDB native FTS) — keyword/exact match
|
|
5
5
|
* 3. Reciprocal Rank Fusion — merge both ranked lists
|
|
6
6
|
* 4. Cross-encoder rerank — rescore top candidates
|
|
7
7
|
*/
|
|
8
|
-
import MiniSearch from "minisearch";
|
|
9
8
|
import { embedTexts } from "./indexer.js";
|
|
10
9
|
import { rerank } from "./reranker.js";
|
|
11
|
-
// --- BM25 index (lazy-built, cached per session) ---
|
|
12
|
-
let bm25Index = null;
|
|
13
|
-
let bm25IndexedCount = 0;
|
|
14
|
-
async function getBM25Index(store) {
|
|
15
|
-
const allChunks = await store.getChunks();
|
|
16
|
-
// Rebuild if chunk count changed (new docs indexed)
|
|
17
|
-
if (bm25Index && bm25IndexedCount === allChunks.length) {
|
|
18
|
-
return bm25Index;
|
|
19
|
-
}
|
|
20
|
-
bm25Index = new MiniSearch({
|
|
21
|
-
fields: ["text"],
|
|
22
|
-
storeFields: ["id", "library", "headingPath", "text"],
|
|
23
|
-
searchOptions: {
|
|
24
|
-
boost: { text: 1 },
|
|
25
|
-
fuzzy: 0.2,
|
|
26
|
-
prefix: true,
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
// MiniSearch needs objects with a unique `id` field
|
|
30
|
-
const docs = allChunks.map((chunk) => ({
|
|
31
|
-
id: chunk.id,
|
|
32
|
-
library: chunk.library,
|
|
33
|
-
headingPath: chunk.headingPath,
|
|
34
|
-
text: chunk.text,
|
|
35
|
-
}));
|
|
36
|
-
bm25Index.addAll(docs);
|
|
37
|
-
bm25IndexedCount = allChunks.length;
|
|
38
|
-
return bm25Index;
|
|
39
|
-
}
|
|
40
10
|
/**
|
|
41
11
|
* RRF: score = sum( weight_r / (k + rank_r) ) for each ranker r.
|
|
42
12
|
* k=60 is the standard default (Azure, Weaviate, OpenSearch).
|
|
@@ -86,18 +56,13 @@ export async function searchDocs(query, store, options) {
|
|
|
86
56
|
library: row.library,
|
|
87
57
|
headingPath: row.headingPath,
|
|
88
58
|
}));
|
|
89
|
-
// Step 2: BM25 search via
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const bm25Ranked = bm25Hits.map((hit) => ({
|
|
97
|
-
id: hit.id,
|
|
98
|
-
text: hit.text,
|
|
99
|
-
library: hit.library,
|
|
100
|
-
headingPath: hit.headingPath,
|
|
59
|
+
// Step 2: BM25 search via LanceDB native FTS
|
|
60
|
+
const ftsHits = await store.ftsSearch(query, candidateCount, options?.library);
|
|
61
|
+
const bm25Ranked = ftsHits.map((row) => ({
|
|
62
|
+
id: row.id,
|
|
63
|
+
text: row.text,
|
|
64
|
+
library: row.library,
|
|
65
|
+
headingPath: row.headingPath,
|
|
101
66
|
}));
|
|
102
67
|
// Step 3: RRF fusion (k=60, BM25 weight=1.0, vector weight=0.7)
|
|
103
68
|
const fused = reciprocalRankFusion(vectorRanked, bm25Ranked, {
|
package/dist/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -24,6 +24,10 @@ export declare class DocStore {
|
|
|
24
24
|
getChunks(library?: string): Promise<DocRow[]>;
|
|
25
25
|
getChunkById(chunkId: number): Promise<DocRow | undefined>;
|
|
26
26
|
getChunksByHeading(library: string, heading: string): Promise<DocRow[]>;
|
|
27
|
+
/** Create BM25 full-text search index on the text column. Safe to call repeatedly (replace=true). */
|
|
28
|
+
createFtsIndex(): Promise<void>;
|
|
29
|
+
/** BM25 full-text search using LanceDB native FTS index. */
|
|
30
|
+
ftsSearch(query: string, limit: number, library?: string): Promise<DocRow[]>;
|
|
27
31
|
isEmpty(): Promise<boolean>;
|
|
28
32
|
getDocsDir(): string;
|
|
29
33
|
}
|
package/dist/store.js
CHANGED
|
@@ -105,6 +105,8 @@ export class DocStore {
|
|
|
105
105
|
metadata.libraries.push(libMeta);
|
|
106
106
|
}
|
|
107
107
|
await this.saveMetadata(metadata);
|
|
108
|
+
// Rebuild FTS index after adding new rows
|
|
109
|
+
await this.createFtsIndex();
|
|
108
110
|
// Count total rows
|
|
109
111
|
const totalRows = table
|
|
110
112
|
? (await table.countRows())
|
|
@@ -152,6 +154,34 @@ export class DocStore {
|
|
|
152
154
|
return path.some((h) => h.toLowerCase().includes(lowerHeading));
|
|
153
155
|
});
|
|
154
156
|
}
|
|
157
|
+
/** Create BM25 full-text search index on the text column. Safe to call repeatedly (replace=true). */
|
|
158
|
+
async createFtsIndex() {
|
|
159
|
+
const table = await this.getTable();
|
|
160
|
+
if (!table)
|
|
161
|
+
return;
|
|
162
|
+
const lancedb = await import("@lancedb/lancedb");
|
|
163
|
+
await table.createIndex("text", {
|
|
164
|
+
config: lancedb.Index.fts({ stem: true, lowercase: true, removeStopWords: true }),
|
|
165
|
+
replace: true,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
/** BM25 full-text search using LanceDB native FTS index. */
|
|
169
|
+
async ftsSearch(query, limit, library) {
|
|
170
|
+
const table = await this.getTable();
|
|
171
|
+
if (!table)
|
|
172
|
+
return [];
|
|
173
|
+
try {
|
|
174
|
+
let q = table.query().fullTextSearch(query, { columns: ["text"] }).limit(limit);
|
|
175
|
+
if (library) {
|
|
176
|
+
q = q.where(`library = '${library.replace(/'/g, "''")}'`);
|
|
177
|
+
}
|
|
178
|
+
return await q.toArray();
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// FTS index doesn't exist yet (first search before any docs indexed)
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
155
185
|
async isEmpty() {
|
|
156
186
|
const table = await this.getTable();
|
|
157
187
|
return !table;
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export interface Dependency {
|
|
2
2
|
name: string;
|
|
3
3
|
version: string;
|
|
4
|
+
kind: "runtime" | "dev";
|
|
5
|
+
}
|
|
6
|
+
export interface AnalyzeResult {
|
|
7
|
+
dependencies: Dependency[];
|
|
8
|
+
isMonorepo: boolean;
|
|
9
|
+
workspacePackages?: string[];
|
|
4
10
|
}
|
|
5
11
|
export interface LibraryMetadata {
|
|
6
12
|
library: string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo detection, pnpm workspace parsing, and dependency collection.
|
|
3
|
+
* No external YAML library — uses simple line-by-line parsing.
|
|
4
|
+
*/
|
|
5
|
+
import type { Dependency, AnalyzeResult } from "./types.js";
|
|
6
|
+
export interface MonorepoInfo {
|
|
7
|
+
isMonorepo: boolean;
|
|
8
|
+
type?: "pnpm" | "npm" | "yarn";
|
|
9
|
+
workspacePatterns: string[];
|
|
10
|
+
catalog: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Detect whether the project root is a monorepo.
|
|
14
|
+
* Checks for pnpm-workspace.yaml and package.json workspaces field.
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectMonorepo(root: string): Promise<MonorepoInfo>;
|
|
17
|
+
/**
|
|
18
|
+
* Parse pnpm-workspace.yaml without a YAML library.
|
|
19
|
+
* Extracts `packages:` glob patterns and `catalog:` version map.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parsePnpmWorkspace(content: string): {
|
|
22
|
+
packages: string[];
|
|
23
|
+
catalog: Record<string, string>;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Expand workspace glob patterns into actual package.json paths.
|
|
27
|
+
* Supports simple patterns like "apps/*", "packages/*", "libs/**".
|
|
28
|
+
* Uses readdir instead of glob for Node 20 compatibility.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveWorkspacePackageJsonPaths(root: string, patterns: string[]): Promise<string[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Collect all dependencies from multiple package.json files.
|
|
33
|
+
* Resolves `catalog:` versions, skips `workspace:*` internal deps, deduplicates.
|
|
34
|
+
*/
|
|
35
|
+
export declare function collectAllDependencies(packageJsonPaths: string[], catalog: Record<string, string>): Promise<{
|
|
36
|
+
deps: Dependency[];
|
|
37
|
+
internalPackages: string[];
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Full monorepo-aware dependency analysis.
|
|
41
|
+
*/
|
|
42
|
+
export declare function analyzeDependencies(root: string): Promise<AnalyzeResult>;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo detection, pnpm workspace parsing, and dependency collection.
|
|
3
|
+
* No external YAML library — uses simple line-by-line parsing.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
import { join, resolve } from "node:path";
|
|
8
|
+
/**
|
|
9
|
+
* Detect whether the project root is a monorepo.
|
|
10
|
+
* Checks for pnpm-workspace.yaml and package.json workspaces field.
|
|
11
|
+
*/
|
|
12
|
+
export async function detectMonorepo(root) {
|
|
13
|
+
// Check pnpm-workspace.yaml first
|
|
14
|
+
const pnpmWsPath = join(root, "pnpm-workspace.yaml");
|
|
15
|
+
if (existsSync(pnpmWsPath)) {
|
|
16
|
+
const content = await readFile(pnpmWsPath, "utf-8");
|
|
17
|
+
const parsed = parsePnpmWorkspace(content);
|
|
18
|
+
return {
|
|
19
|
+
isMonorepo: true,
|
|
20
|
+
type: "pnpm",
|
|
21
|
+
workspacePatterns: parsed.packages,
|
|
22
|
+
catalog: parsed.catalog,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Check package.json workspaces
|
|
26
|
+
const pkgPath = join(root, "package.json");
|
|
27
|
+
if (existsSync(pkgPath)) {
|
|
28
|
+
try {
|
|
29
|
+
const raw = await readFile(pkgPath, "utf-8");
|
|
30
|
+
const pkg = JSON.parse(raw);
|
|
31
|
+
if (pkg.workspaces) {
|
|
32
|
+
const patterns = Array.isArray(pkg.workspaces)
|
|
33
|
+
? pkg.workspaces
|
|
34
|
+
: pkg.workspaces.packages ?? [];
|
|
35
|
+
if (patterns.length > 0) {
|
|
36
|
+
return {
|
|
37
|
+
isMonorepo: true,
|
|
38
|
+
type: pkg.workspaces ? "npm" : "yarn",
|
|
39
|
+
workspacePatterns: patterns,
|
|
40
|
+
catalog: {},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Invalid package.json, treat as non-monorepo
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { isMonorepo: false, workspacePatterns: [], catalog: {} };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse pnpm-workspace.yaml without a YAML library.
|
|
53
|
+
* Extracts `packages:` glob patterns and `catalog:` version map.
|
|
54
|
+
*/
|
|
55
|
+
export function parsePnpmWorkspace(content) {
|
|
56
|
+
const packages = [];
|
|
57
|
+
const catalog = {};
|
|
58
|
+
const lines = content.split("\n");
|
|
59
|
+
let section = "none";
|
|
60
|
+
let catalogKey = ""; // for nested catalog like "catalog:" at top level
|
|
61
|
+
for (const rawLine of lines) {
|
|
62
|
+
const line = rawLine.trimEnd();
|
|
63
|
+
// Detect top-level sections
|
|
64
|
+
if (/^packages\s*:/.test(line)) {
|
|
65
|
+
section = "packages";
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (/^catalog\s*:/.test(line)) {
|
|
69
|
+
section = "catalog";
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
// Any other top-level key ends the current section
|
|
73
|
+
if (/^\S/.test(line) && line.trim().length > 0) {
|
|
74
|
+
section = "none";
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (section === "packages") {
|
|
78
|
+
// Lines like: - "apps/*" or - 'packages/*' or - packages/*
|
|
79
|
+
const match = line.match(/^\s+-\s+['"]?([^'"]+)['"]?\s*$/);
|
|
80
|
+
if (match) {
|
|
81
|
+
packages.push(match[1].trim());
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (section === "catalog") {
|
|
85
|
+
// Lines like: react: "^18.0.0" or react: ^18.0.0
|
|
86
|
+
const match = line.match(/^\s+(['"]?)([@\w\/-]+)\1\s*:\s*['"]?([^'"#]+)['"]?\s*$/);
|
|
87
|
+
if (match) {
|
|
88
|
+
catalog[match[2].trim()] = match[3].trim();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return { packages, catalog };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Expand workspace glob patterns into actual package.json paths.
|
|
96
|
+
* Supports simple patterns like "apps/*", "packages/*", "libs/**".
|
|
97
|
+
* Uses readdir instead of glob for Node 20 compatibility.
|
|
98
|
+
*/
|
|
99
|
+
export async function resolveWorkspacePackageJsonPaths(root, patterns) {
|
|
100
|
+
const paths = [];
|
|
101
|
+
for (const rawPattern of patterns) {
|
|
102
|
+
// Normalize: strip trailing /*, /**, or /
|
|
103
|
+
const pattern = rawPattern.replace(/\/?\*{1,2}$/, "").replace(/\/$/, "");
|
|
104
|
+
const parentDir = resolve(root, pattern);
|
|
105
|
+
if (!existsSync(parentDir))
|
|
106
|
+
continue;
|
|
107
|
+
try {
|
|
108
|
+
const entries = await readdir(parentDir, { withFileTypes: true });
|
|
109
|
+
for (const entry of entries) {
|
|
110
|
+
if (!entry.isDirectory())
|
|
111
|
+
continue;
|
|
112
|
+
const pkgPath = join(parentDir, entry.name, "package.json");
|
|
113
|
+
if (existsSync(pkgPath)) {
|
|
114
|
+
paths.push(pkgPath);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Directory not readable, skip
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Always include root package.json
|
|
123
|
+
const rootPkg = join(root, "package.json");
|
|
124
|
+
if (existsSync(rootPkg) && !paths.includes(rootPkg)) {
|
|
125
|
+
paths.unshift(rootPkg);
|
|
126
|
+
}
|
|
127
|
+
return paths;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Collect all dependencies from multiple package.json files.
|
|
131
|
+
* Resolves `catalog:` versions, skips `workspace:*` internal deps, deduplicates.
|
|
132
|
+
*/
|
|
133
|
+
export async function collectAllDependencies(packageJsonPaths, catalog) {
|
|
134
|
+
const seen = new Map();
|
|
135
|
+
const internalPackages = [];
|
|
136
|
+
// First pass: collect internal package names
|
|
137
|
+
for (const pkgPath of packageJsonPaths) {
|
|
138
|
+
try {
|
|
139
|
+
const raw = await readFile(pkgPath, "utf-8");
|
|
140
|
+
const pkg = JSON.parse(raw);
|
|
141
|
+
if (pkg.name) {
|
|
142
|
+
internalPackages.push(pkg.name);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Skip unreadable files
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const internalSet = new Set(internalPackages);
|
|
150
|
+
// Second pass: collect dependencies
|
|
151
|
+
for (const pkgPath of packageJsonPaths) {
|
|
152
|
+
try {
|
|
153
|
+
const raw = await readFile(pkgPath, "utf-8");
|
|
154
|
+
const pkg = JSON.parse(raw);
|
|
155
|
+
const addDeps = (deps, kind) => {
|
|
156
|
+
for (const [name, rawVersion] of Object.entries(deps)) {
|
|
157
|
+
// Skip workspace-internal deps
|
|
158
|
+
if (internalSet.has(name))
|
|
159
|
+
continue;
|
|
160
|
+
if (typeof rawVersion !== "string")
|
|
161
|
+
continue;
|
|
162
|
+
let version = rawVersion;
|
|
163
|
+
// Resolve catalog: references
|
|
164
|
+
if (version === "catalog:" || version === "catalog:default") {
|
|
165
|
+
version = catalog[name] ?? version;
|
|
166
|
+
}
|
|
167
|
+
else if (version.startsWith("catalog:")) {
|
|
168
|
+
// Named catalog like "catalog:react18"
|
|
169
|
+
const catalogName = version.slice("catalog:".length);
|
|
170
|
+
version = catalog[catalogName] ?? catalog[name] ?? version;
|
|
171
|
+
}
|
|
172
|
+
// Skip workspace protocol
|
|
173
|
+
if (version.startsWith("workspace:"))
|
|
174
|
+
continue;
|
|
175
|
+
// Deduplicate: runtime wins over dev
|
|
176
|
+
const existing = seen.get(name);
|
|
177
|
+
if (!existing || (existing.kind === "dev" && kind === "runtime")) {
|
|
178
|
+
seen.set(name, { name, version, kind });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
addDeps(pkg.dependencies ?? {}, "runtime");
|
|
183
|
+
addDeps(pkg.devDependencies ?? {}, "dev");
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// Skip unreadable files
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
deps: Array.from(seen.values()),
|
|
191
|
+
internalPackages,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Full monorepo-aware dependency analysis.
|
|
196
|
+
*/
|
|
197
|
+
export async function analyzeDependencies(root) {
|
|
198
|
+
const mono = await detectMonorepo(root);
|
|
199
|
+
if (mono.isMonorepo) {
|
|
200
|
+
const pkgPaths = await resolveWorkspacePackageJsonPaths(root, mono.workspacePatterns);
|
|
201
|
+
const { deps, internalPackages } = await collectAllDependencies(pkgPaths, mono.catalog);
|
|
202
|
+
return {
|
|
203
|
+
dependencies: deps,
|
|
204
|
+
isMonorepo: true,
|
|
205
|
+
workspacePackages: internalPackages,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// Single package.json
|
|
209
|
+
const pkgPath = join(root, "package.json");
|
|
210
|
+
const { deps } = await collectAllDependencies([pkgPath], {});
|
|
211
|
+
return {
|
|
212
|
+
dependencies: deps,
|
|
213
|
+
isMonorepo: false,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-local-docs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Local-first Context7 alternative — indexes JS/TS dependency docs with a 4-stage RAG pipeline. All models run locally via ONNX.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -42,7 +42,6 @@
|
|
|
42
42
|
"@huggingface/transformers": "^3.4.1",
|
|
43
43
|
"@lancedb/lancedb": "^0.17.0",
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
45
|
-
"minisearch": "^7.1.0",
|
|
46
45
|
"zod": "^3.24.0"
|
|
47
46
|
},
|
|
48
47
|
"devDependencies": {
|