lance-context 0.1.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.
Files changed (237) hide show
  1. package/README.md +232 -23
  2. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  4. package/dist/__tests__/ast-chunker.test.js +307 -0
  5. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +242 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  12. package/dist/__tests__/dashboard/beads.test.js +151 -0
  13. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  14. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/dashboard/index.test.js +116 -0
  17. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  18. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  20. package/dist/__tests__/dashboard/routes.test.js +125 -0
  21. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  22. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  24. package/dist/__tests__/dashboard/server.test.js +75 -0
  25. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  26. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  28. package/dist/__tests__/dashboard/state.test.js +124 -0
  29. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  30. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  31. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  32. package/dist/__tests__/embeddings/factory.test.js +100 -0
  33. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  34. package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
  35. package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
  36. package/dist/__tests__/embeddings/jina.test.js +156 -0
  37. package/dist/__tests__/embeddings/jina.test.js.map +1 -0
  38. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  39. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  40. package/dist/__tests__/embeddings/ollama.test.js +172 -0
  41. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  42. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  43. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  44. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  45. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  46. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  47. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  48. package/dist/__tests__/embeddings/retry.test.js +260 -0
  49. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  50. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  51. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  52. package/dist/__tests__/embeddings/types.test.js +31 -0
  53. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  54. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  55. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  56. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  57. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  58. package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
  59. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  60. package/dist/__tests__/mocks/fetch.mock.js +74 -0
  61. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  62. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  63. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  64. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  65. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  66. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  67. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  68. package/dist/__tests__/search/clustering.test.js +230 -0
  69. package/dist/__tests__/search/clustering.test.js.map +1 -0
  70. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  71. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  72. package/dist/__tests__/search/hybrid-search.test.js +186 -0
  73. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  74. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  75. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  76. package/dist/__tests__/search/indexer.test.js +878 -0
  77. package/dist/__tests__/search/indexer.test.js.map +1 -0
  78. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  79. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  80. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  81. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  82. package/dist/__tests__/setup.d.ts +2 -0
  83. package/dist/__tests__/setup.d.ts.map +1 -0
  84. package/dist/__tests__/setup.js +11 -0
  85. package/dist/__tests__/setup.js.map +1 -0
  86. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  87. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  88. package/dist/__tests__/utils/concurrency.test.js +83 -0
  89. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  90. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  91. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/errors.test.js +136 -0
  93. package/dist/__tests__/utils/errors.test.js.map +1 -0
  94. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  95. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  96. package/dist/__tests__/utils/type-guards.test.js +80 -0
  97. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  98. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  99. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  100. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  101. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  102. package/dist/config.d.ts +122 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +508 -0
  105. package/dist/config.js.map +1 -0
  106. package/dist/dashboard/beads.d.ts +35 -0
  107. package/dist/dashboard/beads.d.ts.map +1 -0
  108. package/dist/dashboard/beads.js +102 -0
  109. package/dist/dashboard/beads.js.map +1 -0
  110. package/dist/dashboard/events.d.ts +46 -0
  111. package/dist/dashboard/events.d.ts.map +1 -0
  112. package/dist/dashboard/events.js +141 -0
  113. package/dist/dashboard/events.js.map +1 -0
  114. package/dist/dashboard/index.d.ts +69 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +93 -0
  117. package/dist/dashboard/index.js.map +1 -0
  118. package/dist/dashboard/routes.d.ts +6 -0
  119. package/dist/dashboard/routes.d.ts.map +1 -0
  120. package/dist/dashboard/routes.js +245 -0
  121. package/dist/dashboard/routes.js.map +1 -0
  122. package/dist/dashboard/server.d.ts +27 -0
  123. package/dist/dashboard/server.d.ts.map +1 -0
  124. package/dist/dashboard/server.js +72 -0
  125. package/dist/dashboard/server.js.map +1 -0
  126. package/dist/dashboard/state.d.ts +125 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +264 -0
  129. package/dist/dashboard/state.js.map +1 -0
  130. package/dist/dashboard/ui.d.ts +6 -0
  131. package/dist/dashboard/ui.d.ts.map +1 -0
  132. package/dist/dashboard/ui.js +1421 -0
  133. package/dist/dashboard/ui.js.map +1 -0
  134. package/dist/embeddings/index.d.ts +20 -2
  135. package/dist/embeddings/index.d.ts.map +1 -1
  136. package/dist/embeddings/index.js +49 -6
  137. package/dist/embeddings/index.js.map +1 -1
  138. package/dist/embeddings/jina.d.ts +9 -0
  139. package/dist/embeddings/jina.d.ts.map +1 -1
  140. package/dist/embeddings/jina.js +42 -2
  141. package/dist/embeddings/jina.js.map +1 -1
  142. package/dist/embeddings/ollama.d.ts +2 -0
  143. package/dist/embeddings/ollama.d.ts.map +1 -1
  144. package/dist/embeddings/ollama.js +21 -5
  145. package/dist/embeddings/ollama.js.map +1 -1
  146. package/dist/embeddings/rate-limiter.d.ts +75 -0
  147. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  148. package/dist/embeddings/rate-limiter.js +145 -0
  149. package/dist/embeddings/rate-limiter.js.map +1 -0
  150. package/dist/embeddings/retry.d.ts +14 -0
  151. package/dist/embeddings/retry.d.ts.map +1 -0
  152. package/dist/embeddings/retry.js +89 -0
  153. package/dist/embeddings/retry.js.map +1 -0
  154. package/dist/embeddings/types.d.ts +56 -2
  155. package/dist/embeddings/types.d.ts.map +1 -1
  156. package/dist/embeddings/types.js +16 -0
  157. package/dist/embeddings/types.js.map +1 -1
  158. package/dist/index.js +1871 -44
  159. package/dist/index.js.map +1 -1
  160. package/dist/memory/index.d.ts +63 -0
  161. package/dist/memory/index.d.ts.map +1 -0
  162. package/dist/memory/index.js +168 -0
  163. package/dist/memory/index.js.map +1 -0
  164. package/dist/search/ast-chunker.d.ts +34 -0
  165. package/dist/search/ast-chunker.d.ts.map +1 -0
  166. package/dist/search/ast-chunker.js +261 -0
  167. package/dist/search/ast-chunker.js.map +1 -0
  168. package/dist/search/clustering.d.ts +77 -0
  169. package/dist/search/clustering.d.ts.map +1 -0
  170. package/dist/search/clustering.js +455 -0
  171. package/dist/search/clustering.js.map +1 -0
  172. package/dist/search/indexer.d.ts +239 -3
  173. package/dist/search/indexer.d.ts.map +1 -1
  174. package/dist/search/indexer.js +941 -45
  175. package/dist/search/indexer.js.map +1 -1
  176. package/dist/search/tree-sitter-chunker.d.ts +69 -0
  177. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  178. package/dist/search/tree-sitter-chunker.js +436 -0
  179. package/dist/search/tree-sitter-chunker.js.map +1 -0
  180. package/dist/symbols/index.d.ts +14 -0
  181. package/dist/symbols/index.d.ts.map +1 -0
  182. package/dist/symbols/index.js +19 -0
  183. package/dist/symbols/index.js.map +1 -0
  184. package/dist/symbols/name-path.d.ts +113 -0
  185. package/dist/symbols/name-path.d.ts.map +1 -0
  186. package/dist/symbols/name-path.js +194 -0
  187. package/dist/symbols/name-path.js.map +1 -0
  188. package/dist/symbols/pattern-search.d.ts +14 -0
  189. package/dist/symbols/pattern-search.d.ts.map +1 -0
  190. package/dist/symbols/pattern-search.js +224 -0
  191. package/dist/symbols/pattern-search.js.map +1 -0
  192. package/dist/symbols/reference-finder.d.ts +38 -0
  193. package/dist/symbols/reference-finder.d.ts.map +1 -0
  194. package/dist/symbols/reference-finder.js +376 -0
  195. package/dist/symbols/reference-finder.js.map +1 -0
  196. package/dist/symbols/symbol-editor.d.ts +81 -0
  197. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  198. package/dist/symbols/symbol-editor.js +257 -0
  199. package/dist/symbols/symbol-editor.js.map +1 -0
  200. package/dist/symbols/symbol-extractor.d.ts +49 -0
  201. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  202. package/dist/symbols/symbol-extractor.js +593 -0
  203. package/dist/symbols/symbol-extractor.js.map +1 -0
  204. package/dist/symbols/symbol-renamer.d.ts +81 -0
  205. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  206. package/dist/symbols/symbol-renamer.js +204 -0
  207. package/dist/symbols/symbol-renamer.js.map +1 -0
  208. package/dist/symbols/types.d.ts +234 -0
  209. package/dist/symbols/types.d.ts.map +1 -0
  210. package/dist/symbols/types.js +106 -0
  211. package/dist/symbols/types.js.map +1 -0
  212. package/dist/utils/concurrency.d.ts +32 -0
  213. package/dist/utils/concurrency.d.ts.map +1 -0
  214. package/dist/utils/concurrency.js +57 -0
  215. package/dist/utils/concurrency.js.map +1 -0
  216. package/dist/utils/errors.d.ts +36 -0
  217. package/dist/utils/errors.d.ts.map +1 -0
  218. package/dist/utils/errors.js +91 -0
  219. package/dist/utils/errors.js.map +1 -0
  220. package/dist/utils/type-guards.d.ts +17 -0
  221. package/dist/utils/type-guards.d.ts.map +1 -0
  222. package/dist/utils/type-guards.js +25 -0
  223. package/dist/utils/type-guards.js.map +1 -0
  224. package/dist/worktree/index.d.ts +6 -0
  225. package/dist/worktree/index.d.ts.map +1 -0
  226. package/dist/worktree/index.js +6 -0
  227. package/dist/worktree/index.js.map +1 -0
  228. package/dist/worktree/types.d.ts +101 -0
  229. package/dist/worktree/types.d.ts.map +1 -0
  230. package/dist/worktree/types.js +6 -0
  231. package/dist/worktree/types.js.map +1 -0
  232. package/dist/worktree/worktree-manager.d.ts +80 -0
  233. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  234. package/dist/worktree/worktree-manager.js +407 -0
  235. package/dist/worktree/worktree-manager.js.map +1 -0
  236. package/package.json +39 -5
  237. package/scripts/postinstall.js +48 -0
package/README.md CHANGED
@@ -1,3 +1,14 @@
1
+ <p align="center">
2
+ <img src="logo.svg" alt="lance-context logo" width="150" height="150">
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/nicholaspsmith/lance-context/actions/workflows/ci.yml"><img src="https://github.com/nicholaspsmith/lance-context/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
7
+ <a href="https://www.npmjs.com/package/lance-context"><img src="https://img.shields.io/npm/v/lance-context.svg" alt="npm version"></a>
8
+ <a href="https://github.com/nicholaspsmith/lance-context/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-GPL--3.0-blue.svg" alt="License: GPL-3.0"></a>
9
+ <img src="https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen.svg" alt="Node.js version">
10
+ </p>
11
+
1
12
  # lance-context
2
13
 
3
14
  An MCP plugin that adds semantic code search to Claude Code and other AI coding agents, giving them deep context from your entire codebase.
@@ -5,47 +16,177 @@ An MCP plugin that adds semantic code search to Claude Code and other AI coding
5
16
  ## Features
6
17
 
7
18
  - **Semantic Code Search**: Natural language queries locate relevant code across your entire codebase
8
- - **Multiple Embedding Backends**: Jina v3 API, local sentence-transformers, or Ollama
19
+ - **Multiple Embedding Backends**: Jina v3 API or Ollama (local)
9
20
  - **LanceDB Vector Storage**: Fast, efficient vector search with hybrid BM25 + dense matching
10
21
  - **MCP Compatible**: Works with Claude Code, Cursor, and other MCP-compatible tools
22
+ - **Web Dashboard**: Real-time monitoring of index status, configuration, and usage statistics
23
+ - **Beads Integration**: Shows issue tracker data if your project uses [beads](https://github.com/steveyegge/beads)
11
24
 
12
25
  ## Installation
13
26
 
14
- ### For Claude Code
27
+ ### Quick Install (Recommended)
15
28
 
16
29
  ```bash
17
- claude mcp add lance-context -- npx lance-context
30
+ npm install -g lance-context
18
31
  ```
19
32
 
20
- Or with a specific project path:
33
+ This automatically registers lance-context with Claude Code. Restart Claude Code to start using semantic search.
34
+
35
+ ### Manual Registration
36
+
37
+ If automatic registration didn't work, manually add to Claude Code:
21
38
 
22
39
  ```bash
23
- claude mcp add lance-context -- npx lance-context --project /path/to/your/project
40
+ claude mcp add --scope user --transport stdio lance-context -- npx -y lance-context
24
41
  ```
25
42
 
26
- ### Manual Installation
43
+ ### Verify Installation
27
44
 
28
- ```bash
29
- npm install -g lance-context
45
+ In Claude Code, run `/mcp` to see lance-context in the list of MCP servers.
46
+
47
+ ### Project-Level Installation
48
+
49
+ For project-specific MCP configuration, add a `.mcp.json` to your project root:
50
+
51
+ ```json
52
+ {
53
+ "mcpServers": {
54
+ "lance-context": {
55
+ "command": "npx",
56
+ "args": ["-y", "lance-context"]
57
+ }
58
+ }
59
+ }
30
60
  ```
31
61
 
32
- ## Configuration
62
+ ### Project Configuration
63
+
64
+ Create a `.lance-context.json` file in your project root to customize indexing behavior. All options are optional - lance-context works out of the box with sensible defaults.
65
+
66
+ #### Minimal Configuration
33
67
 
34
- ### Embedding Backends
68
+ For most projects, you only need to specify what to include:
69
+
70
+ ```json
71
+ {
72
+ "patterns": ["**/*.ts", "**/*.js"],
73
+ "instructions": "This is a TypeScript monorepo. Use semantic search to find relevant utilities."
74
+ }
75
+ ```
35
76
 
36
- lance-context automatically selects the best available backend:
77
+ #### Full Configuration Example
37
78
 
38
- 1. **Jina v3** (highest quality, free tier available)
79
+ ```json
80
+ {
81
+ "patterns": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
82
+ "excludePatterns": ["**/node_modules/**", "**/dist/**", "**/*.test.ts"],
83
+ "embedding": {
84
+ "backend": "jina"
85
+ },
86
+ "chunking": {
87
+ "maxLines": 100,
88
+ "overlap": 20
89
+ },
90
+ "search": {
91
+ "semanticWeight": 0.7,
92
+ "keywordWeight": 0.3
93
+ },
94
+ "dashboard": {
95
+ "enabled": true,
96
+ "port": 24300,
97
+ "openBrowser": true
98
+ },
99
+ "instructions": "Project-specific instructions for AI agents working with this codebase."
100
+ }
101
+ ```
102
+
103
+ #### Configuration Options Reference
104
+
105
+ | Option | Description | Default |
106
+ |--------|-------------|---------|
107
+ | `patterns` | Glob patterns for files to index | `["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "**/*.py", "**/*.go", "**/*.rs", "**/*.java", "**/*.rb", "**/*.php", "**/*.c", "**/*.cpp", "**/*.h", "**/*.hpp", "**/*.cs", "**/*.swift", "**/*.kt"]` |
108
+ | `excludePatterns` | Glob patterns for files to exclude | `["**/node_modules/**", "**/dist/**", "**/.git/**", "**/build/**", "**/target/**", "**/__pycache__/**", "**/venv/**", "**/.venv/**", "**/vendor/**", "**/*.min.js", "**/*.min.css"]` |
109
+ | `embedding.backend` | Embedding provider: `"jina"` or `"ollama"` | Auto-detect based on available API keys |
110
+ | `embedding.model` | Override the default embedding model | Backend default |
111
+ | `chunking.maxLines` | Maximum lines per chunk | `100` |
112
+ | `chunking.overlap` | Overlapping lines between chunks for context continuity | `20` |
113
+ | `search.semanticWeight` | Weight for semantic (vector) similarity (0-1) | `0.7` |
114
+ | `search.keywordWeight` | Weight for BM25 keyword matching (0-1) | `0.3` |
115
+ | `dashboard.enabled` | Enable the web dashboard | `true` |
116
+ | `dashboard.port` | Port for the dashboard server | `24300` |
117
+ | `dashboard.openBrowser` | Auto-open browser when dashboard starts | `true` |
118
+ | `instructions` | Project-specific instructions returned by `get_project_instructions` | None |
119
+
120
+ #### Default Behavior
121
+
122
+ Without a `.lance-context.json` file, lance-context will:
123
+
124
+ - Index common source code files (TypeScript, JavaScript, Python, Go, Rust, Java, Ruby, PHP, C/C++, C#, Swift, Kotlin)
125
+ - Exclude build artifacts, dependencies, and generated files
126
+ - Use Jina embeddings if `JINA_API_KEY` is set, otherwise fall back to local Ollama
127
+ - Split code into 100-line chunks with 20-line overlap
128
+ - Use hybrid search with 70% semantic / 30% keyword weighting
129
+ - Start the dashboard on port 24300
130
+
131
+ #### Environment Variables
132
+
133
+ Set these environment variables to configure embedding backends:
134
+
135
+ | Variable | Description | Default |
136
+ |----------|-------------|---------|
137
+ | `JINA_API_KEY` | Jina AI API key for cloud embeddings ([free tier available](https://jina.ai/)) | None |
138
+ | `OLLAMA_URL` | Custom Ollama server URL for local embeddings | `http://localhost:11434` |
139
+ | `LANCE_CONTEXT_PROJECT` | Override the project path to index | Current working directory |
140
+
141
+ **Backend Selection Priority:**
142
+
143
+ 1. If `embedding.backend` is set in config, use that backend
144
+ 2. If `JINA_API_KEY` is set, use Jina
145
+ 3. Fall back to Ollama (must be running locally)
146
+
147
+ ## Architecture
148
+
149
+ ```
150
+ ┌─────────────────────────────────────────────────────────────┐
151
+ │ MCP Server (index.ts) │
152
+ │ Exposes tools: index_codebase, search_code │
153
+ └─────────────────┬───────────────────────────────────────────┘
154
+
155
+ ┌─────────────────▼───────────────────────────────────────────┐
156
+ │ CodeIndexer (indexer.ts) │
157
+ │ - AST-aware chunking for supported languages │
158
+ │ - Incremental indexing (only re-index changed files) │
159
+ │ - Hybrid search (semantic + keyword scoring) │
160
+ └─────────────────┬───────────────────────────────────────────┘
161
+
162
+ ┌─────────────────▼───────────────────────────────────────────┐
163
+ │ Embedding Backends (embeddings/) │
164
+ │ Jina v3 │ Ollama (local) │
165
+ └─────────────────┬───────────────────────────────────────────┘
166
+
167
+ ┌─────────────────▼───────────────────────────────────────────┐
168
+ │ LanceDB Vector Store │
169
+ │ Stored in .lance-context/ directory │
170
+ └─────────────────────────────────────────────────────────────┘
171
+ ```
172
+
173
+ ## Embedding Backend Setup
174
+
175
+ lance-context automatically selects the best available backend (in priority order):
176
+
177
+ 1. **Jina v3** (if `JINA_API_KEY` is set, free tier available)
39
178
  ```bash
40
- export JINA_API_KEY=your-api-key
179
+ export JINA_API_KEY=jina_...
41
180
  ```
42
181
 
43
- 2. **Ollama** (local, privacy-preserving)
182
+ 2. **Ollama** (local fallback, privacy-preserving)
44
183
  ```bash
45
184
  # Make sure Ollama is running with nomic-embed-text
46
185
  ollama pull nomic-embed-text
47
186
  ```
48
187
 
188
+ See [Project Configuration](#project-configuration) for all configuration options including how to specify a backend.
189
+
49
190
  ## Usage
50
191
 
51
192
  Once installed, you'll have access to these tools:
@@ -99,6 +240,42 @@ Clear the index:
99
240
  Index cleared.
100
241
  ```
101
242
 
243
+ ### `get_project_instructions`
244
+
245
+ Get project-specific instructions from the config:
246
+
247
+ ```
248
+ > get_project_instructions
249
+ Use semantic search for exploring this codebase. Always run tests before committing.
250
+ ```
251
+
252
+ ## Dashboard
253
+
254
+ lance-context includes a web dashboard for monitoring index status and usage.
255
+
256
+ ### Accessing the Dashboard
257
+
258
+ The dashboard starts automatically when the MCP server runs and is available at:
259
+
260
+ ```
261
+ http://127.0.0.1:24300
262
+ ```
263
+
264
+ The browser opens automatically on startup (configurable).
265
+
266
+ ### Dashboard Features
267
+
268
+ - **Index Status**: Files indexed, chunks created, last updated time
269
+ - **Embedding Backend**: Current backend and index path
270
+ - **Configuration**: Project path, chunk settings, search weights
271
+ - **File Patterns**: Include/exclude patterns being used
272
+ - **Command Usage**: Real-time chart of MCP tool usage (using [charts.css](https://chartscss.org/))
273
+ - **Beads Integration**: Issue tracker status and ready tasks (if beads is configured)
274
+
275
+ ### Dashboard Configuration
276
+
277
+ Configure the dashboard via the `dashboard` options in `.lance-context.json`. See [Configuration Options Reference](#configuration-options-reference) for details.
278
+
102
279
  ## How It Works
103
280
 
104
281
  1. **Indexing**: Code files are chunked into ~100-line segments with overlap
@@ -106,25 +283,57 @@ Index cleared.
106
283
  3. **Storage**: Vectors are stored in LanceDB (`.lance-context/` directory)
107
284
  4. **Search**: Natural language queries are embedded and matched against stored vectors
108
285
 
109
- ## Environment Variables
110
-
111
- | Variable | Description | Default |
112
- |----------|-------------|---------|
113
- | `JINA_API_KEY` | Jina AI API key for embeddings | - |
114
- | `OLLAMA_URL` | Ollama server URL | `http://localhost:11434` |
115
- | `LANCE_CONTEXT_PROJECT` | Project path to index | Current directory |
116
-
117
286
  ## Supported Languages
118
287
 
119
288
  TypeScript, JavaScript, Python, Go, Rust, Java, Ruby, PHP, C/C++, C#, Swift, Kotlin, and more.
120
289
 
290
+ ## Troubleshooting
291
+
292
+ ### "No embedding backend available"
293
+
294
+ This error means no API keys are set and Ollama is not running/accessible.
295
+
296
+ **Solutions:**
297
+ 1. Set an API key: `export JINA_API_KEY=jina_...`
298
+ 2. Or start Ollama: `ollama serve` and ensure `nomic-embed-text` model is pulled
299
+
300
+ ### "Embedding dimension mismatch"
301
+
302
+ This occurs when switching between embedding backends (e.g., from Jina to OpenAI). Each backend produces different vector dimensions.
303
+
304
+ **Solution:** Force a full reindex:
305
+ ```
306
+ > index_codebase(forceReindex: true)
307
+ ```
308
+
309
+ ### Slow Indexing
310
+
311
+ Large codebases may take time to index initially.
312
+
313
+ **Tips:**
314
+ 1. Use `excludePatterns` to skip unnecessary directories (tests, generated code)
315
+ 2. Ollama is faster for local use but requires more resources
316
+ 3. Subsequent runs use incremental indexing (only changed files)
317
+
318
+ ### Index Corruption
319
+
320
+ If you encounter strange search results or errors:
321
+
322
+ **Solution:** Clear and rebuild the index:
323
+ ```
324
+ > clear_index
325
+ > index_codebase
326
+ ```
327
+
328
+ Or manually delete the `.lance-context/` directory and re-index.
329
+
121
330
  ## License
122
331
 
123
332
  GPL-3.0 - See [LICENSE](LICENSE) for details.
124
333
 
125
334
  ## Contributing
126
335
 
127
- Contributions welcome! Please read our contributing guidelines before submitting PRs.
336
+ Contributions welcome! Please read our [Contributing Guide](CONTRIBUTING.md) before submitting PRs.
128
337
 
129
338
  ## Related Projects
130
339
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ast-chunker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-chunker.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ast-chunker.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,307 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { ASTChunker } from '../search/ast-chunker.js';
3
+ // Mock fs/promises
4
+ vi.mock('fs/promises', () => ({
5
+ readFile: vi.fn(),
6
+ }));
7
+ describe('ASTChunker', () => {
8
+ describe('canParse', () => {
9
+ it('should return true for TypeScript files', () => {
10
+ expect(ASTChunker.canParse('file.ts')).toBe(true);
11
+ expect(ASTChunker.canParse('file.tsx')).toBe(true);
12
+ expect(ASTChunker.canParse('file.mts')).toBe(true);
13
+ });
14
+ it('should return true for JavaScript files', () => {
15
+ expect(ASTChunker.canParse('file.js')).toBe(true);
16
+ expect(ASTChunker.canParse('file.jsx')).toBe(true);
17
+ expect(ASTChunker.canParse('file.mjs')).toBe(true);
18
+ expect(ASTChunker.canParse('file.cjs')).toBe(true);
19
+ });
20
+ it('should return false for non-JS/TS files', () => {
21
+ expect(ASTChunker.canParse('file.py')).toBe(false);
22
+ expect(ASTChunker.canParse('file.go')).toBe(false);
23
+ expect(ASTChunker.canParse('file.rs')).toBe(false);
24
+ expect(ASTChunker.canParse('file.md')).toBe(false);
25
+ });
26
+ it('should be case insensitive', () => {
27
+ expect(ASTChunker.canParse('file.TS')).toBe(true);
28
+ expect(ASTChunker.canParse('file.JS')).toBe(true);
29
+ });
30
+ it('should handle .cts extension', () => {
31
+ expect(ASTChunker.canParse('file.cts')).toBe(true);
32
+ });
33
+ });
34
+ describe('chunkFile', () => {
35
+ let fsPromises;
36
+ beforeEach(async () => {
37
+ fsPromises = await import('fs/promises');
38
+ });
39
+ afterEach(() => {
40
+ vi.resetAllMocks();
41
+ });
42
+ describe('function declarations', () => {
43
+ it('should create chunk for function declaration', async () => {
44
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
45
+ function greet(name: string): string {
46
+ return \`Hello, \${name}!\`;
47
+ }
48
+ `);
49
+ const chunker = new ASTChunker();
50
+ const chunks = await chunker.chunkFile('test.ts');
51
+ const funcChunk = chunks.find((c) => c.type === 'function');
52
+ expect(funcChunk).toBeDefined();
53
+ expect(funcChunk?.name).toBe('greet');
54
+ expect(funcChunk?.content).toContain('function greet');
55
+ });
56
+ it('should include async functions', async () => {
57
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
58
+ async function fetchData(): Promise<void> {
59
+ await fetch('/api');
60
+ }
61
+ `);
62
+ const chunker = new ASTChunker();
63
+ const chunks = await chunker.chunkFile('test.ts');
64
+ const funcChunk = chunks.find((c) => c.type === 'function');
65
+ expect(funcChunk?.name).toBe('fetchData');
66
+ });
67
+ });
68
+ describe('class declarations', () => {
69
+ it('should create chunk for small class', async () => {
70
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
71
+ class User {
72
+ name: string;
73
+ constructor(name: string) {
74
+ this.name = name;
75
+ }
76
+ }
77
+ `);
78
+ const chunker = new ASTChunker();
79
+ const chunks = await chunker.chunkFile('test.ts');
80
+ const classChunk = chunks.find((c) => c.type === 'class');
81
+ expect(classChunk).toBeDefined();
82
+ expect(classChunk?.name).toBe('User');
83
+ });
84
+ it('should split large classes into methods', async () => {
85
+ // Create a class with many lines
86
+ const lines = ['class BigClass {'];
87
+ for (let i = 0; i < 200; i++) {
88
+ lines.push(` method${i}() { return ${i}; }`);
89
+ }
90
+ lines.push('}');
91
+ vi.mocked(fsPromises.readFile).mockResolvedValue(lines.join('\n'));
92
+ const chunker = new ASTChunker();
93
+ const chunks = await chunker.chunkFile('test.ts');
94
+ // Should have multiple chunks from the class
95
+ const methodChunks = chunks.filter((c) => c.type === 'method');
96
+ expect(methodChunks.length).toBeGreaterThan(1);
97
+ });
98
+ it('should name method chunks with class prefix', async () => {
99
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
100
+ class MyService {
101
+ getData() {
102
+ return [];
103
+ }
104
+ }
105
+ `);
106
+ const chunker = new ASTChunker();
107
+ const chunks = await chunker.chunkFile('test.ts');
108
+ // Find either a small class chunk or method chunks
109
+ const hasMethodWithClassName = chunks.some((c) => c.name?.includes('MyService') && (c.type === 'method' || c.type === 'class'));
110
+ expect(hasMethodWithClassName).toBe(true);
111
+ });
112
+ });
113
+ describe('interface declarations', () => {
114
+ it('should create chunk for interface', async () => {
115
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
116
+ interface Config {
117
+ apiKey: string;
118
+ baseUrl: string;
119
+ }
120
+ `);
121
+ const chunker = new ASTChunker();
122
+ const chunks = await chunker.chunkFile('test.ts');
123
+ const interfaceChunk = chunks.find((c) => c.type === 'interface');
124
+ expect(interfaceChunk).toBeDefined();
125
+ expect(interfaceChunk?.name).toBe('Config');
126
+ });
127
+ });
128
+ describe('type declarations', () => {
129
+ it('should create chunk for type alias', async () => {
130
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
131
+ type Status = 'pending' | 'active' | 'completed';
132
+ `);
133
+ const chunker = new ASTChunker();
134
+ const chunks = await chunker.chunkFile('test.ts');
135
+ const typeChunk = chunks.find((c) => c.type === 'type');
136
+ expect(typeChunk).toBeDefined();
137
+ expect(typeChunk?.name).toBe('Status');
138
+ });
139
+ });
140
+ describe('import grouping', () => {
141
+ it('should group imports into single chunk', async () => {
142
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
143
+ import { foo } from 'foo';
144
+ import { bar } from 'bar';
145
+ import * as baz from 'baz';
146
+
147
+ function main() {}
148
+ `);
149
+ const chunker = new ASTChunker();
150
+ const chunks = await chunker.chunkFile('test.ts');
151
+ const importChunk = chunks.find((c) => c.type === 'import');
152
+ expect(importChunk).toBeDefined();
153
+ expect(importChunk?.name).toBe('imports');
154
+ expect(importChunk?.content).toContain('foo');
155
+ expect(importChunk?.content).toContain('bar');
156
+ expect(importChunk?.content).toContain('baz');
157
+ });
158
+ it('should place imports first in chunk order', async () => {
159
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
160
+ import { x } from 'x';
161
+
162
+ function first() {}
163
+ `);
164
+ const chunker = new ASTChunker();
165
+ const chunks = await chunker.chunkFile('test.ts');
166
+ expect(chunks[0].type).toBe('import');
167
+ });
168
+ });
169
+ describe('variable statements', () => {
170
+ it('should create chunk for exported const', async () => {
171
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
172
+ export const CONFIG = {
173
+ port: 3000,
174
+ };
175
+ `);
176
+ const chunker = new ASTChunker();
177
+ const chunks = await chunker.chunkFile('test.ts');
178
+ const varChunk = chunks.find((c) => c.type === 'variable');
179
+ expect(varChunk).toBeDefined();
180
+ expect(varChunk?.name).toContain('CONFIG');
181
+ });
182
+ it('should handle multiple declarations', async () => {
183
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
184
+ const a = 1, b = 2, c = 3;
185
+ `);
186
+ const chunker = new ASTChunker();
187
+ const chunks = await chunker.chunkFile('test.ts');
188
+ const varChunk = chunks.find((c) => c.type === 'variable');
189
+ expect(varChunk).toBeDefined();
190
+ expect(varChunk?.name).toContain('a');
191
+ expect(varChunk?.name).toContain('b');
192
+ expect(varChunk?.name).toContain('c');
193
+ });
194
+ });
195
+ describe('large chunk splitting', () => {
196
+ it('should split chunks over MAX_CHUNK_LINES', async () => {
197
+ // Create a very large function (over 150 lines)
198
+ const lines = ['function bigFunction() {'];
199
+ for (let i = 0; i < 200; i++) {
200
+ lines.push(` const x${i} = ${i};`);
201
+ }
202
+ lines.push(' return x0;');
203
+ lines.push('}');
204
+ vi.mocked(fsPromises.readFile).mockResolvedValue(lines.join('\n'));
205
+ const chunker = new ASTChunker();
206
+ const chunks = await chunker.chunkFile('test.ts');
207
+ // Should have been split into multiple parts
208
+ const funcChunks = chunks.filter((c) => c.name?.includes('bigFunction'));
209
+ expect(funcChunks.length).toBeGreaterThan(1);
210
+ });
211
+ it('should label split chunks with part numbers', async () => {
212
+ const lines = ['function huge() {'];
213
+ for (let i = 0; i < 200; i++) {
214
+ lines.push(` console.log(${i});`);
215
+ }
216
+ lines.push('}');
217
+ vi.mocked(fsPromises.readFile).mockResolvedValue(lines.join('\n'));
218
+ const chunker = new ASTChunker();
219
+ const chunks = await chunker.chunkFile('test.ts');
220
+ const partChunks = chunks.filter((c) => c.name?.includes('part'));
221
+ expect(partChunks.length).toBeGreaterThan(0);
222
+ });
223
+ });
224
+ describe('line number tracking', () => {
225
+ it('should track correct start and end lines', async () => {
226
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
227
+ function first() {}
228
+
229
+ function second() {
230
+ return 2;
231
+ }
232
+ `);
233
+ const chunker = new ASTChunker();
234
+ const chunks = await chunker.chunkFile('test.ts');
235
+ const firstFunc = chunks.find((c) => c.name === 'first');
236
+ const secondFunc = chunks.find((c) => c.name === 'second');
237
+ expect(firstFunc?.startLine).toBeLessThan(secondFunc?.startLine ?? 0);
238
+ // First function ends at or before second starts
239
+ expect(firstFunc?.endLine).toBeLessThanOrEqual(secondFunc?.startLine ?? 0);
240
+ });
241
+ });
242
+ describe('JSX support', () => {
243
+ it('should parse .tsx files with JSX', async () => {
244
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
245
+ function Component() {
246
+ return <div>Hello</div>;
247
+ }
248
+ `);
249
+ const chunker = new ASTChunker();
250
+ // Should not throw
251
+ const chunks = await chunker.chunkFile('test.tsx');
252
+ expect(chunks.length).toBeGreaterThan(0);
253
+ });
254
+ it('should parse .jsx files', async () => {
255
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
256
+ function Component() {
257
+ return <span>World</span>;
258
+ }
259
+ `);
260
+ const chunker = new ASTChunker();
261
+ const chunks = await chunker.chunkFile('test.jsx');
262
+ expect(chunks.length).toBeGreaterThan(0);
263
+ });
264
+ });
265
+ describe('edge cases', () => {
266
+ it('should handle empty file', async () => {
267
+ vi.mocked(fsPromises.readFile).mockResolvedValue('');
268
+ const chunker = new ASTChunker();
269
+ const chunks = await chunker.chunkFile('test.ts');
270
+ expect(chunks).toEqual([]);
271
+ });
272
+ it('should handle file with only imports', async () => {
273
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
274
+ import { a } from 'a';
275
+ import { b } from 'b';
276
+ `);
277
+ const chunker = new ASTChunker();
278
+ const chunks = await chunker.chunkFile('test.ts');
279
+ expect(chunks.length).toBe(1);
280
+ expect(chunks[0].type).toBe('import');
281
+ });
282
+ it('should handle file with only comments', async () => {
283
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
284
+ // This is a comment
285
+ /* Block comment */
286
+ `);
287
+ const chunker = new ASTChunker();
288
+ const chunks = await chunker.chunkFile('test.ts');
289
+ expect(chunks).toEqual([]);
290
+ });
291
+ it('should handle enum declarations', async () => {
292
+ vi.mocked(fsPromises.readFile).mockResolvedValue(`
293
+ enum Color {
294
+ Red,
295
+ Green,
296
+ Blue,
297
+ }
298
+ `);
299
+ const chunker = new ASTChunker();
300
+ const chunks = await chunker.chunkFile('test.ts');
301
+ const enumChunk = chunks.find((c) => c.name === 'Color');
302
+ expect(enumChunk).toBeDefined();
303
+ });
304
+ });
305
+ });
306
+ });
307
+ //# sourceMappingURL=ast-chunker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast-chunker.test.js","sourceRoot":"","sources":["../../src/__tests__/ast-chunker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}