lance-context 0.1.0 → 1.0.1

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 +67 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +90 -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 +244 -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 +116 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +251 -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 +1407 -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 +1870 -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
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Git worktree management for parallel agent isolation.
3
+ *
4
+ * Creates isolated workspaces in .git/agent-worktrees/ to allow multiple
5
+ * agents to work simultaneously without file conflicts.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { exec } from 'child_process';
10
+ import { promisify } from 'util';
11
+ const execAsync = promisify(exec);
12
+ /**
13
+ * Manages git worktrees for parallel agent isolation.
14
+ */
15
+ export class WorktreeManager {
16
+ projectPath;
17
+ worktreesDir;
18
+ constructor(projectPath) {
19
+ this.projectPath = projectPath;
20
+ this.worktreesDir = path.join(projectPath, '.git', 'agent-worktrees');
21
+ }
22
+ /**
23
+ * Ensure the worktrees directory exists.
24
+ */
25
+ async ensureWorktreesDir() {
26
+ if (!fs.existsSync(this.worktreesDir)) {
27
+ fs.mkdirSync(this.worktreesDir, { recursive: true });
28
+ }
29
+ }
30
+ /**
31
+ * Generate a worktree name from options.
32
+ */
33
+ generateName(options) {
34
+ if (options.issueId) {
35
+ return `${options.issueId}-${options.shortName}`;
36
+ }
37
+ return options.shortName;
38
+ }
39
+ /**
40
+ * Generate a branch name from options.
41
+ */
42
+ generateBranchName(options) {
43
+ const prefix = options.prefix || 'feature';
44
+ const name = this.generateName(options);
45
+ return `${prefix}/${name}`;
46
+ }
47
+ /**
48
+ * Detect the package manager used in a directory.
49
+ */
50
+ async detectPackageManager(dir) {
51
+ // Check for lock files in order of preference
52
+ const lockFiles = [
53
+ { file: 'bun.lockb', manager: 'bun' },
54
+ { file: 'pnpm-lock.yaml', manager: 'pnpm' },
55
+ { file: 'yarn.lock', manager: 'yarn' },
56
+ { file: 'package-lock.json', manager: 'npm' },
57
+ ];
58
+ for (const { file, manager } of lockFiles) {
59
+ if (fs.existsSync(path.join(dir, file))) {
60
+ return manager;
61
+ }
62
+ }
63
+ // Check if package.json exists at all
64
+ if (fs.existsSync(path.join(dir, 'package.json'))) {
65
+ return 'npm'; // Default to npm if package.json exists but no lock file
66
+ }
67
+ return null;
68
+ }
69
+ /**
70
+ * Install dependencies in a directory.
71
+ */
72
+ async installDependencies(dir, packageManager) {
73
+ const startTime = Date.now();
74
+ const manager = packageManager || (await this.detectPackageManager(dir));
75
+ if (!manager) {
76
+ return { success: true, time: 0 }; // No package.json, nothing to install
77
+ }
78
+ const commands = {
79
+ npm: 'npm install',
80
+ yarn: 'yarn install',
81
+ pnpm: 'pnpm install',
82
+ bun: 'bun install',
83
+ };
84
+ try {
85
+ await execAsync(commands[manager], {
86
+ cwd: dir,
87
+ env: { ...process.env, CI: 'true' }, // Suppress interactive prompts
88
+ });
89
+ return { success: true, time: Date.now() - startTime };
90
+ }
91
+ catch (error) {
92
+ const message = error instanceof Error ? error.message : String(error);
93
+ return { success: false, time: Date.now() - startTime, error: message };
94
+ }
95
+ }
96
+ /**
97
+ * Get the current branch name.
98
+ */
99
+ async getCurrentBranch() {
100
+ try {
101
+ const { stdout } = await execAsync('git branch --show-current', { cwd: this.projectPath });
102
+ return stdout.trim() || 'main';
103
+ }
104
+ catch {
105
+ return 'main';
106
+ }
107
+ }
108
+ /**
109
+ * Get the default base branch (main or master).
110
+ */
111
+ async getDefaultBaseBranch() {
112
+ try {
113
+ // Check if main exists
114
+ await execAsync('git rev-parse --verify main', { cwd: this.projectPath });
115
+ return 'main';
116
+ }
117
+ catch {
118
+ try {
119
+ // Check if master exists
120
+ await execAsync('git rev-parse --verify master', { cwd: this.projectPath });
121
+ return 'master';
122
+ }
123
+ catch {
124
+ // Default to whatever the current branch is
125
+ return this.getCurrentBranch();
126
+ }
127
+ }
128
+ }
129
+ /**
130
+ * Check if a branch exists.
131
+ */
132
+ async branchExists(branchName) {
133
+ try {
134
+ await execAsync(`git rev-parse --verify ${branchName}`, { cwd: this.projectPath });
135
+ return true;
136
+ }
137
+ catch {
138
+ return false;
139
+ }
140
+ }
141
+ /**
142
+ * Create a new worktree for isolated agent work.
143
+ */
144
+ async createWorktree(options) {
145
+ await this.ensureWorktreesDir();
146
+ const name = this.generateName(options);
147
+ const worktreePath = path.join(this.worktreesDir, name);
148
+ const branchName = this.generateBranchName(options);
149
+ // Check if worktree already exists
150
+ if (fs.existsSync(worktreePath)) {
151
+ return {
152
+ success: false,
153
+ error: `Worktree "${name}" already exists at ${worktreePath}`,
154
+ };
155
+ }
156
+ // Check if branch already exists
157
+ if (await this.branchExists(branchName)) {
158
+ return {
159
+ success: false,
160
+ error: `Branch "${branchName}" already exists. Use a different short_name or issue_id.`,
161
+ };
162
+ }
163
+ // Determine base branch
164
+ const baseBranch = options.baseBranch || (await this.getDefaultBaseBranch());
165
+ try {
166
+ // Create worktree with a new branch
167
+ await execAsync(`git worktree add -b ${branchName} "${worktreePath}" ${baseBranch}`, {
168
+ cwd: this.projectPath,
169
+ });
170
+ // Get worktree info
171
+ const info = await this.getWorktreeInfo(name);
172
+ if (!info) {
173
+ return {
174
+ success: false,
175
+ error: 'Worktree created but failed to get info',
176
+ };
177
+ }
178
+ // Install dependencies if requested (default: true)
179
+ let depsInstalled = false;
180
+ let depsInstallTime;
181
+ if (options.installDeps !== false) {
182
+ const installResult = await this.installDependencies(worktreePath, options.packageManager);
183
+ depsInstalled = installResult.success;
184
+ depsInstallTime = installResult.time;
185
+ if (!installResult.success) {
186
+ // Don't fail the worktree creation, just note the issue
187
+ console.error(`[worktree] Dependency installation failed: ${installResult.error}`);
188
+ }
189
+ }
190
+ return {
191
+ success: true,
192
+ worktree: info,
193
+ depsInstalled,
194
+ depsInstallTime,
195
+ };
196
+ }
197
+ catch (error) {
198
+ const message = error instanceof Error ? error.message : String(error);
199
+ return {
200
+ success: false,
201
+ error: `Failed to create worktree: ${message}`,
202
+ };
203
+ }
204
+ }
205
+ /**
206
+ * Get information about a specific worktree.
207
+ */
208
+ async getWorktreeInfo(name) {
209
+ const worktreePath = path.join(this.worktreesDir, name);
210
+ if (!fs.existsSync(worktreePath)) {
211
+ return null;
212
+ }
213
+ try {
214
+ // Get branch name
215
+ const { stdout: branchOutput } = await execAsync('git branch --show-current', {
216
+ cwd: worktreePath,
217
+ });
218
+ const branch = branchOutput.trim();
219
+ // Get current commit (short hash)
220
+ const { stdout: commitOutput } = await execAsync('git rev-parse --short HEAD', {
221
+ cwd: worktreePath,
222
+ });
223
+ const commit = commitOutput.trim();
224
+ // Check if dirty (uncommitted changes)
225
+ let dirty = false;
226
+ try {
227
+ const { stdout: statusOutput } = await execAsync('git status --porcelain', {
228
+ cwd: worktreePath,
229
+ });
230
+ dirty = statusOutput.trim().length > 0;
231
+ }
232
+ catch {
233
+ dirty = false;
234
+ }
235
+ // Get ahead/behind count relative to origin
236
+ let ahead = 0;
237
+ let behind = 0;
238
+ try {
239
+ // Get the default base branch for comparison
240
+ const baseBranch = await this.getDefaultBaseBranch();
241
+ const { stdout: aheadBehindOutput } = await execAsync(`git rev-list --left-right --count ${baseBranch}...HEAD`, { cwd: worktreePath });
242
+ const [behindStr, aheadStr] = aheadBehindOutput.trim().split('\t');
243
+ behind = parseInt(behindStr, 10) || 0;
244
+ ahead = parseInt(aheadStr, 10) || 0;
245
+ }
246
+ catch {
247
+ // Ignore errors - ahead/behind may not be available
248
+ }
249
+ // Get creation time from directory stat
250
+ let createdAt;
251
+ try {
252
+ const stats = fs.statSync(worktreePath);
253
+ createdAt = stats.birthtime;
254
+ }
255
+ catch {
256
+ // Ignore
257
+ }
258
+ return {
259
+ name,
260
+ path: worktreePath,
261
+ branch,
262
+ commit,
263
+ valid: true,
264
+ dirty,
265
+ ahead,
266
+ behind,
267
+ createdAt,
268
+ };
269
+ }
270
+ catch {
271
+ // Worktree exists but git commands failed - may be in invalid state
272
+ return {
273
+ name,
274
+ path: worktreePath,
275
+ branch: '',
276
+ commit: '',
277
+ valid: false,
278
+ dirty: false,
279
+ ahead: 0,
280
+ behind: 0,
281
+ };
282
+ }
283
+ }
284
+ /**
285
+ * List all agent worktrees.
286
+ */
287
+ async listWorktrees() {
288
+ if (!fs.existsSync(this.worktreesDir)) {
289
+ return { worktrees: [], count: 0 };
290
+ }
291
+ const entries = fs.readdirSync(this.worktreesDir, { withFileTypes: true });
292
+ const worktrees = [];
293
+ for (const entry of entries) {
294
+ if (entry.isDirectory()) {
295
+ const info = await this.getWorktreeInfo(entry.name);
296
+ if (info) {
297
+ worktrees.push(info);
298
+ }
299
+ }
300
+ }
301
+ // Sort by creation time (newest first)
302
+ worktrees.sort((a, b) => {
303
+ if (a.createdAt && b.createdAt) {
304
+ return b.createdAt.getTime() - a.createdAt.getTime();
305
+ }
306
+ return a.name.localeCompare(b.name);
307
+ });
308
+ return { worktrees, count: worktrees.length };
309
+ }
310
+ /**
311
+ * Remove a worktree.
312
+ */
313
+ async removeWorktree(options) {
314
+ const worktreePath = path.join(this.worktreesDir, options.name);
315
+ if (!fs.existsSync(worktreePath)) {
316
+ return {
317
+ success: false,
318
+ error: `Worktree "${options.name}" does not exist`,
319
+ };
320
+ }
321
+ // Get info before removal to know the branch name
322
+ const info = await this.getWorktreeInfo(options.name);
323
+ const branchName = info?.branch;
324
+ // Check if dirty and force not specified
325
+ if (info?.dirty && !options.force) {
326
+ return {
327
+ success: false,
328
+ branch: branchName,
329
+ error: `Worktree "${options.name}" has uncommitted changes. Use force=true to remove anyway.`,
330
+ };
331
+ }
332
+ try {
333
+ // Remove the worktree
334
+ const forceFlag = options.force ? '--force' : '';
335
+ await execAsync(`git worktree remove ${forceFlag} "${worktreePath}"`, {
336
+ cwd: this.projectPath,
337
+ });
338
+ // Optionally delete the branch
339
+ let branchDeleted = false;
340
+ if (options.deleteBranch && branchName) {
341
+ try {
342
+ await execAsync(`git branch -D ${branchName}`, { cwd: this.projectPath });
343
+ branchDeleted = true;
344
+ }
345
+ catch (error) {
346
+ // Branch deletion failed - not critical
347
+ console.error(`[worktree] Failed to delete branch ${branchName}:`, error);
348
+ }
349
+ }
350
+ return {
351
+ success: true,
352
+ branch: branchName,
353
+ branchDeleted,
354
+ };
355
+ }
356
+ catch (error) {
357
+ const message = error instanceof Error ? error.message : String(error);
358
+ return {
359
+ success: false,
360
+ branch: branchName,
361
+ error: `Failed to remove worktree: ${message}`,
362
+ };
363
+ }
364
+ }
365
+ /**
366
+ * Prune stale worktree entries from git.
367
+ */
368
+ async pruneWorktrees() {
369
+ await execAsync('git worktree prune', { cwd: this.projectPath });
370
+ }
371
+ }
372
+ /**
373
+ * Format worktree info for display.
374
+ */
375
+ export function formatWorktreeInfo(info) {
376
+ const parts = [];
377
+ parts.push(`## Worktree: ${info.name}`);
378
+ parts.push(`**Path:** ${info.path}`);
379
+ parts.push(`**Branch:** ${info.branch}`);
380
+ parts.push(`**Commit:** ${info.commit}`);
381
+ parts.push(`**Status:** ${info.valid ? (info.dirty ? 'dirty' : 'clean') : 'invalid'}`);
382
+ if (info.ahead > 0 || info.behind > 0) {
383
+ parts.push(`**Ahead/Behind:** +${info.ahead}/-${info.behind}`);
384
+ }
385
+ if (info.createdAt) {
386
+ parts.push(`**Created:** ${info.createdAt.toISOString()}`);
387
+ }
388
+ return parts.join('\n');
389
+ }
390
+ /**
391
+ * Format list of worktrees for display.
392
+ */
393
+ export function formatWorktreeList(result) {
394
+ if (result.count === 0) {
395
+ return 'No agent worktrees found.';
396
+ }
397
+ const parts = [];
398
+ parts.push(`Found ${result.count} worktree(s):\n`);
399
+ for (const wt of result.worktrees) {
400
+ const status = wt.valid ? (wt.dirty ? '(dirty)' : '(clean)') : '(invalid)';
401
+ const aheadBehind = wt.ahead > 0 || wt.behind > 0 ? ` [+${wt.ahead}/-${wt.behind}]` : '';
402
+ parts.push(`- **${wt.name}** on \`${wt.branch}\` ${status}${aheadBehind}`);
403
+ parts.push(` Path: ${wt.path}`);
404
+ }
405
+ return parts.join('\n');
406
+ }
407
+ //# sourceMappingURL=worktree-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree-manager.js","sourceRoot":"","sources":["../../src/worktree/worktree-manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lance-context",
3
- "version": "0.1.0",
3
+ "version": "1.0.1",
4
4
  "description": "MCP plugin for semantic code search using LanceDB - gives AI coding agents deep context from your entire codebase",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -11,11 +11,22 @@
11
11
  "build": "tsc",
12
12
  "start": "node dist/index.js",
13
13
  "dev": "tsx src/index.ts",
14
- "test": "echo \"Error: no test specified\" && exit 1",
15
- "prepublishOnly": "npm run build"
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "test:coverage": "vitest run --coverage",
17
+ "lint": "eslint src",
18
+ "lint:fix": "eslint src --fix",
19
+ "format": "prettier --write \"src/**/*.ts\"",
20
+ "format:check": "prettier --check \"src/**/*.ts\"",
21
+ "type-check": "tsc --noEmit",
22
+ "clean": "rm -rf dist coverage .lance-context",
23
+ "prepublishOnly": "npm run build",
24
+ "prepare": "husky",
25
+ "postinstall": "node scripts/postinstall.js || true"
16
26
  },
17
27
  "files": [
18
28
  "dist",
29
+ "scripts",
19
30
  "README.md"
20
31
  ],
21
32
  "repository": {
@@ -40,14 +51,37 @@
40
51
  "dependencies": {
41
52
  "@lancedb/lancedb": "^0.22.3",
42
53
  "@modelcontextprotocol/sdk": "^1.0.0",
43
- "glob": "^13.0.0"
54
+ "@vscode/tree-sitter-wasm": "^0.3.0",
55
+ "glob": "^13.0.0",
56
+ "minimatch": "^10.1.1",
57
+ "web-tree-sitter": "^0.26.3",
58
+ "zod": "^4.3.6"
44
59
  },
45
60
  "devDependencies": {
61
+ "@commitlint/cli": "^20.3.1",
62
+ "@commitlint/config-conventional": "^20.3.1",
63
+ "@eslint/js": "^9.39.2",
64
+ "@semantic-release/changelog": "^6.0.3",
65
+ "@semantic-release/git": "^10.0.1",
46
66
  "@types/node": "^22.0.0",
67
+ "@vitest/coverage-v8": "^4.0.16",
68
+ "eslint": "^9.39.2",
69
+ "husky": "^9.1.7",
70
+ "lint-staged": "^16.2.7",
71
+ "prettier": "^3.8.1",
72
+ "semantic-release": "^25.0.2",
47
73
  "tsx": "^4.0.0",
48
- "typescript": "^5.7.0"
74
+ "typescript": "^5.7.0",
75
+ "typescript-eslint": "^8.53.1",
76
+ "vitest": "^4.0.16"
49
77
  },
50
78
  "engines": {
51
79
  "node": ">=20.0.0"
80
+ },
81
+ "lint-staged": {
82
+ "src/**/*.ts": [
83
+ "eslint --fix",
84
+ "prettier --write"
85
+ ]
52
86
  }
53
87
  }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Postinstall script to register lance-context with Claude Code MCP configuration.
5
+ * This runs after npm install and adds lance-context as a global MCP server.
6
+ */
7
+
8
+ import { execSync } from 'child_process';
9
+
10
+ function main() {
11
+ // Check if claude CLI is available
12
+ try {
13
+ execSync('claude --version', { stdio: 'ignore' });
14
+ } catch {
15
+ console.log('[lance-context] Claude Code CLI not found, skipping MCP registration.');
16
+ console.log('[lance-context] To manually register, run:');
17
+ console.log(' claude mcp add --scope user --transport stdio lance-context -- npx -y lance-context');
18
+ return;
19
+ }
20
+
21
+ // Check if lance-context is already registered
22
+ try {
23
+ const result = execSync('claude mcp get lance-context 2>/dev/null', { encoding: 'utf-8' });
24
+ if (result.includes('lance-context')) {
25
+ console.log('[lance-context] Already registered with Claude Code.');
26
+ return;
27
+ }
28
+ } catch {
29
+ // Not registered, continue with registration
30
+ }
31
+
32
+ // Register lance-context with Claude Code
33
+ try {
34
+ console.log('[lance-context] Registering with Claude Code...');
35
+ execSync(
36
+ 'claude mcp add --scope user --transport stdio lance-context -- npx -y lance-context',
37
+ { stdio: 'inherit' }
38
+ );
39
+ console.log('[lance-context] Successfully registered with Claude Code!');
40
+ console.log('[lance-context] Restart Claude Code to use semantic code search.');
41
+ } catch (error) {
42
+ console.log('[lance-context] Failed to register with Claude Code:', error.message);
43
+ console.log('[lance-context] To manually register, run:');
44
+ console.log(' claude mcp add --scope user --transport stdio lance-context -- npx -y lance-context');
45
+ }
46
+ }
47
+
48
+ main();