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.
- package/README.md +232 -23
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +100 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
- package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/jina.test.js +156 -0
- package/dist/__tests__/embeddings/jina.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +172 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +260 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +74 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +186 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +878 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +122 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +508 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +46 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +141 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +245 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +125 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +264 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +1421 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/index.d.ts +20 -2
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +49 -6
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/jina.d.ts +9 -0
- package/dist/embeddings/jina.d.ts.map +1 -1
- package/dist/embeddings/jina.js +42 -2
- package/dist/embeddings/jina.js.map +1 -1
- package/dist/embeddings/ollama.d.ts +2 -0
- package/dist/embeddings/ollama.d.ts.map +1 -1
- package/dist/embeddings/ollama.js +21 -5
- package/dist/embeddings/ollama.js.map +1 -1
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +14 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +89 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +56 -2
- package/dist/embeddings/types.d.ts.map +1 -1
- package/dist/embeddings/types.js +16 -0
- package/dist/embeddings/types.js.map +1 -1
- package/dist/index.js +1871 -44
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +34 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +261 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +239 -3
- package/dist/search/indexer.d.ts.map +1 -1
- package/dist/search/indexer.js +941 -45
- package/dist/search/indexer.js.map +1 -1
- package/dist/search/tree-sitter-chunker.d.ts +69 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +436 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +39 -5
- 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": "
|
|
3
|
+
"version": "1.1.0",
|
|
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": "
|
|
15
|
-
"
|
|
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
|
-
"
|
|
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();
|