@execufunction/mcp-server 0.2.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.
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ /**
3
+ * Incremental Indexer
4
+ *
5
+ * Git-aware indexing that only uploads changed files.
6
+ * Falls back to full index for non-git directories or first-time index.
7
+ *
8
+ * Reference: docs/design/semantic-git-system-plan.md § Phase 1
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.indexIncrementally = indexIncrementally;
45
+ exports.formatIncrementalResult = formatIncrementalResult;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const gitService_js_1 = require("./gitService.js");
49
+ const localIndexer_js_1 = require("./localIndexer.js");
50
+ /**
51
+ * Read file content safely
52
+ */
53
+ function readFileContent(rootPath, relativePath) {
54
+ try {
55
+ const fullPath = path.join(rootPath, relativePath);
56
+ const content = fs.readFileSync(fullPath, 'utf-8');
57
+ // Basic binary detection via null bytes
58
+ if (content.includes('\0')) {
59
+ return null;
60
+ }
61
+ return content;
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * Check if a file path matches any of the given glob patterns
69
+ * Simple glob matching: supports * and ** wildcards
70
+ */
71
+ function matchesPattern(filePath, patterns) {
72
+ if (patterns.length === 0)
73
+ return true; // No patterns = match all
74
+ for (const pattern of patterns) {
75
+ // Convert glob to regex
76
+ const regexPattern = pattern
77
+ .replace(/\*\*/g, '<<<GLOBSTAR>>>')
78
+ .replace(/\*/g, '[^/]*')
79
+ .replace(/<<<GLOBSTAR>>>/g, '.*')
80
+ .replace(/\?/g, '.')
81
+ .replace(/\./g, '\\.');
82
+ const regex = new RegExp(`^${regexPattern}$`);
83
+ if (regex.test(filePath)) {
84
+ return true;
85
+ }
86
+ }
87
+ return false;
88
+ }
89
+ /**
90
+ * Check if a file should be included based on include/exclude patterns
91
+ */
92
+ function shouldIncludeFile(filePath, includePatterns, excludePatterns) {
93
+ // If exclude patterns match, reject
94
+ if (excludePatterns.length > 0 && matchesPattern(filePath, excludePatterns)) {
95
+ return false;
96
+ }
97
+ // If include patterns specified, file must match at least one
98
+ if (includePatterns.length > 0) {
99
+ return matchesPattern(filePath, includePatterns);
100
+ }
101
+ return true; // No include patterns = include all (that aren't excluded)
102
+ }
103
+ function resolvePatterns(requested, repositoryDefaults) {
104
+ if (requested && requested.length > 0) {
105
+ return requested;
106
+ }
107
+ if (repositoryDefaults && repositoryDefaults.length > 0) {
108
+ return repositoryDefaults;
109
+ }
110
+ return [];
111
+ }
112
+ function prepareUploadBatch(rootPath, changes, includePatterns, excludePatterns) {
113
+ const filesToUpload = [];
114
+ const deletedPaths = [];
115
+ const renamedFiles = [];
116
+ for (const change of changes) {
117
+ if (!shouldIncludeFile(change.path, includePatterns, excludePatterns)) {
118
+ continue;
119
+ }
120
+ if (change.changeType === 'D') {
121
+ deletedPaths.push(change.path);
122
+ continue;
123
+ }
124
+ if (change.changeType === 'R' && change.oldPath) {
125
+ renamedFiles.push({ oldPath: change.oldPath, newPath: change.path });
126
+ }
127
+ const content = readFileContent(rootPath, change.path);
128
+ if (!content) {
129
+ continue;
130
+ }
131
+ filesToUpload.push({
132
+ path: change.path,
133
+ content,
134
+ changeType: change.changeType,
135
+ oldPath: change.oldPath,
136
+ });
137
+ }
138
+ return { filesToUpload, deletedPaths, renamedFiles };
139
+ }
140
+ /**
141
+ * Incrementally index a codebase using git diff.
142
+ *
143
+ * Flow:
144
+ * 1. Check if git repository
145
+ * 2. Get last indexed commit from backend
146
+ * 3. If no last commit → full index
147
+ * 4. If same commit → no changes
148
+ * 5. Otherwise → get changed files via git diff, upload only those
149
+ */
150
+ async function indexIncrementally(client, repositoryId, rootPath, options = {}) {
151
+ const progress = {
152
+ phase: 'scanning',
153
+ filesFound: 0,
154
+ filesUploaded: 0,
155
+ chunksCreated: 0,
156
+ isIncremental: false,
157
+ };
158
+ const reportProgress = options.onProgress || (() => { });
159
+ reportProgress(progress);
160
+ const includeWorkingTree = options.includeWorkingTree !== false;
161
+ const gitService = new gitService_js_1.GitService(rootPath);
162
+ // Check if this is a git repository
163
+ const isGitRepo = await gitService.isGitRepository();
164
+ if (!isGitRepo) {
165
+ // Fall back to full index for non-git directories
166
+ console.log('Not a git repository, falling back to full index');
167
+ const fullResult = await (0, localIndexer_js_1.indexLocalCodebase)(client, repositoryId, rootPath, {
168
+ includePatterns: options.includePatterns,
169
+ excludePatterns: options.excludePatterns,
170
+ onProgress: options.onProgress,
171
+ });
172
+ return { ...fullResult, isIncremental: false };
173
+ }
174
+ try {
175
+ // Get repository info from backend
176
+ const repoResult = await client.getCodeRepository(repositoryId);
177
+ if (repoResult.error || !repoResult.data?.repository) {
178
+ throw new Error(repoResult.error || 'Repository not found');
179
+ }
180
+ const repo = repoResult.data.repository;
181
+ const includePatterns = resolvePatterns(options.includePatterns, repo.includePatterns);
182
+ const excludePatterns = resolvePatterns(options.excludePatterns, repo.excludePatterns);
183
+ progress.usedRepositoryPatterns =
184
+ ((!options.includePatterns || options.includePatterns.length === 0) && includePatterns.length > 0)
185
+ || ((!options.excludePatterns || options.excludePatterns.length === 0) && excludePatterns.length > 0);
186
+ const localIndexOptions = {
187
+ includePatterns,
188
+ excludePatterns,
189
+ onProgress: options.onProgress,
190
+ };
191
+ const lastIndexedCommit = repo.gitCommitSha;
192
+ const currentCommit = await gitService.getCurrentCommit();
193
+ const currentBranch = await gitService.getCurrentBranch();
194
+ progress.toCommit = currentCommit;
195
+ const runFullFallback = async (reason) => {
196
+ await client.updateRepositoryCommit(repositoryId, {
197
+ sha: currentCommit,
198
+ branch: currentBranch,
199
+ indexFallbackReason: reason,
200
+ });
201
+ const fullResult = await (0, localIndexer_js_1.indexLocalCodebase)(client, repositoryId, rootPath, localIndexOptions);
202
+ return {
203
+ ...fullResult,
204
+ isIncremental: false,
205
+ fromCommit: lastIndexedCommit,
206
+ toCommit: currentCommit,
207
+ fallbackReason: reason,
208
+ };
209
+ };
210
+ // First-time index
211
+ if (!lastIndexedCommit) {
212
+ console.log('First-time index, performing full scan');
213
+ await client.updateRepositoryCommit(repositoryId, {
214
+ sha: currentCommit,
215
+ branch: currentBranch,
216
+ });
217
+ const fullResult = await (0, localIndexer_js_1.indexLocalCodebase)(client, repositoryId, rootPath, localIndexOptions);
218
+ return {
219
+ ...fullResult,
220
+ isIncremental: false,
221
+ toCommit: currentCommit,
222
+ };
223
+ }
224
+ progress.fromCommit = lastIndexedCommit;
225
+ progress.isIncremental = true;
226
+ const headMoved = lastIndexedCommit !== currentCommit;
227
+ let committedChanges = [];
228
+ if (headMoved) {
229
+ const baseIsReachable = await gitService.isCommitAncestor(lastIndexedCommit, currentCommit);
230
+ if (!baseIsReachable) {
231
+ console.warn(`Last indexed commit ${lastIndexedCommit.slice(0, 12)} is not reachable from HEAD, falling back to full reindex`);
232
+ return runFullFallback('base_commit_not_reachable');
233
+ }
234
+ try {
235
+ committedChanges = await gitService.getChangedFilesSinceCommit(lastIndexedCommit);
236
+ }
237
+ catch (err) {
238
+ console.warn(`Failed to diff ${lastIndexedCommit.slice(0, 12)}..HEAD, falling back to full reindex`, err);
239
+ return runFullFallback('diff_failed_reindexed_full');
240
+ }
241
+ }
242
+ let workingTreeChanges = [];
243
+ if (includeWorkingTree) {
244
+ try {
245
+ workingTreeChanges = await gitService.getWorkingTreeChanges();
246
+ }
247
+ catch (err) {
248
+ console.warn('Failed to read working tree changes, continuing without local overlay', err);
249
+ }
250
+ }
251
+ progress.workingTreeChanges = workingTreeChanges.length;
252
+ const committedUpload = prepareUploadBatch(rootPath, committedChanges, includePatterns, excludePatterns);
253
+ const workingUpload = prepareUploadBatch(rootPath, workingTreeChanges, includePatterns, excludePatterns);
254
+ const hasCommittedUpload = committedUpload.filesToUpload.length > 0 || committedUpload.deletedPaths.length > 0;
255
+ const hasWorkingUpload = workingUpload.filesToUpload.length > 0 || workingUpload.deletedPaths.length > 0;
256
+ const hasAnyUpload = hasCommittedUpload || hasWorkingUpload;
257
+ progress.changesDetected = committedChanges.length + workingTreeChanges.length;
258
+ progress.filesFound =
259
+ committedUpload.filesToUpload.length
260
+ + committedUpload.deletedPaths.length
261
+ + committedUpload.renamedFiles.length
262
+ + workingUpload.filesToUpload.length
263
+ + workingUpload.deletedPaths.length
264
+ + workingUpload.renamedFiles.length;
265
+ if (!headMoved && !hasAnyUpload) {
266
+ progress.phase = 'complete';
267
+ reportProgress(progress);
268
+ return progress;
269
+ }
270
+ if (!hasAnyUpload && headMoved) {
271
+ // Metadata-only commit range (no code/file deltas after filtering).
272
+ await client.updateRepositoryCommit(repositoryId, {
273
+ sha: currentCommit,
274
+ branch: currentBranch,
275
+ });
276
+ await client.finalizeCodeIndexing(repositoryId, {
277
+ mode: 'incremental_committed',
278
+ });
279
+ progress.phase = 'complete';
280
+ reportProgress(progress);
281
+ return progress;
282
+ }
283
+ progress.phase = 'uploading';
284
+ reportProgress(progress);
285
+ // Trigger indexing mode
286
+ await client.triggerCodeIndexing(repositoryId);
287
+ const applyRenames = async (renamedFiles) => {
288
+ for (const rename of renamedFiles) {
289
+ try {
290
+ await client.renameFile(repositoryId, rename.oldPath, rename.newPath);
291
+ }
292
+ catch (err) {
293
+ console.warn(`Failed to rename ${rename.oldPath} → ${rename.newPath}:`, err);
294
+ }
295
+ }
296
+ };
297
+ let totalChunksReused = 0;
298
+ // Committed deltas: upload with commit context for linking.
299
+ if (hasCommittedUpload) {
300
+ await applyRenames(committedUpload.renamedFiles);
301
+ const commitInfo = await gitService.getHeadCommitInfo();
302
+ const uploadResult = await client.uploadFilesWithCommit(repositoryId, {
303
+ files: committedUpload.filesToUpload,
304
+ commit: {
305
+ sha: commitInfo.sha,
306
+ parentShas: commitInfo.parentShas,
307
+ authorName: commitInfo.authorName,
308
+ authorEmail: commitInfo.authorEmail,
309
+ authorDate: commitInfo.authorDate.toISOString(),
310
+ message: commitInfo.message,
311
+ },
312
+ deletedPaths: committedUpload.deletedPaths,
313
+ });
314
+ if (uploadResult.data) {
315
+ progress.filesUploaded += uploadResult.data.successful || 0;
316
+ progress.chunksCreated += uploadResult.data.totalChunks || 0;
317
+ totalChunksReused += uploadResult.data.chunksReused || 0;
318
+ }
319
+ }
320
+ // Working tree overlay: upload without commit metadata.
321
+ if (hasWorkingUpload) {
322
+ await applyRenames(workingUpload.renamedFiles);
323
+ const uploadResult = await client.uploadFilesWithCommit(repositoryId, {
324
+ files: workingUpload.filesToUpload,
325
+ deletedPaths: workingUpload.deletedPaths,
326
+ });
327
+ if (uploadResult.data) {
328
+ progress.filesUploaded += uploadResult.data.successful || 0;
329
+ progress.chunksCreated += uploadResult.data.totalChunks || 0;
330
+ totalChunksReused += uploadResult.data.chunksReused || 0;
331
+ }
332
+ }
333
+ if (totalChunksReused > 0) {
334
+ progress.chunksReused = totalChunksReused;
335
+ }
336
+ // Phase 3 Hardening: Record ALL commits between lastIndexedCommit and HEAD
337
+ // This ensures complete commit history, not just HEAD
338
+ progress.phase = 'finalizing';
339
+ reportProgress(progress);
340
+ if (headMoved) {
341
+ const commitShas = await gitService.getCommitRange(lastIndexedCommit, currentCommit);
342
+ let commitsRecorded = 0;
343
+ for (const sha of commitShas) {
344
+ try {
345
+ const commitInfo = await gitService.getCommitInfo(sha);
346
+ const commitChanges = await gitService.getCommitChangesWithStats(sha);
347
+ // Filter changes by include/exclude patterns
348
+ const filteredChanges = commitChanges.filter(c => shouldIncludeFile(c.path, includePatterns, excludePatterns));
349
+ if (filteredChanges.length > 0) {
350
+ await client.recordCommit(repositoryId, {
351
+ sha: commitInfo.sha,
352
+ parentShas: commitInfo.parentShas,
353
+ authorName: commitInfo.authorName,
354
+ authorEmail: commitInfo.authorEmail,
355
+ authorDate: commitInfo.authorDate.toISOString(),
356
+ committerName: commitInfo.committerName,
357
+ committerEmail: commitInfo.committerEmail,
358
+ committerDate: commitInfo.committerDate.toISOString(),
359
+ message: commitInfo.message,
360
+ fileChanges: filteredChanges.map(fc => ({
361
+ path: fc.path,
362
+ changeType: fc.changeType,
363
+ oldPath: fc.oldPath,
364
+ linesAdded: fc.linesAdded,
365
+ linesDeleted: fc.linesDeleted,
366
+ })),
367
+ });
368
+ commitsRecorded++;
369
+ }
370
+ }
371
+ catch (err) {
372
+ console.warn(`Failed to record commit ${sha}:`, err);
373
+ }
374
+ }
375
+ if (commitsRecorded > 0) {
376
+ console.log(`Recorded ${commitsRecorded} commits with line stats`);
377
+ }
378
+ }
379
+ await client.updateRepositoryCommit(repositoryId, {
380
+ sha: currentCommit,
381
+ branch: currentBranch,
382
+ });
383
+ await client.finalizeCodeIndexing(repositoryId, {
384
+ mode: includeWorkingTree && hasWorkingUpload
385
+ ? 'incremental_overlay'
386
+ : 'incremental_committed',
387
+ });
388
+ progress.phase = 'complete';
389
+ reportProgress(progress);
390
+ return progress;
391
+ }
392
+ catch (err) {
393
+ progress.phase = 'error';
394
+ progress.error = err instanceof Error ? err.message : String(err);
395
+ reportProgress(progress);
396
+ return progress;
397
+ }
398
+ }
399
+ /**
400
+ * Format incremental index result for display
401
+ */
402
+ function formatIncrementalResult(result) {
403
+ if (result.phase === 'error') {
404
+ return `❌ Indexing failed: ${result.error}`;
405
+ }
406
+ if (!result.isIncremental) {
407
+ const lines = [
408
+ `✅ Full index complete!`,
409
+ `Files scanned: ${result.filesFound}`,
410
+ `Files uploaded: ${result.filesUploaded}`,
411
+ `Chunks created: ${result.chunksCreated}`,
412
+ ];
413
+ if (result.fallbackReason) {
414
+ lines.push(`Mode: full reindex (${result.fallbackReason})`);
415
+ }
416
+ return lines.join('\n');
417
+ }
418
+ if (result.changesDetected === 0) {
419
+ const shortCommit = result.toCommit?.slice(0, 7) || 'unknown';
420
+ const workingTreeNote = result.workingTreeChanges && result.workingTreeChanges > 0
421
+ ? `, working tree: ${result.workingTreeChanges}`
422
+ : '';
423
+ return `✅ No changes detected since last index (commit: ${shortCommit}${workingTreeNote})`;
424
+ }
425
+ const lines = [
426
+ `✅ Incremental index complete!`,
427
+ `Changes detected: ${result.changesDetected}`,
428
+ `Files uploaded: ${result.filesUploaded}`,
429
+ `Chunks created: ${result.chunksCreated}`,
430
+ ];
431
+ if (result.workingTreeChanges && result.workingTreeChanges > 0) {
432
+ lines.push(`Working tree changes indexed: ${result.workingTreeChanges}`);
433
+ }
434
+ if (result.chunksReused && result.chunksReused > 0) {
435
+ lines.push(`♻️ Chunks reused: ${result.chunksReused} (content-addressed)`);
436
+ }
437
+ if (result.fromCommit && result.toCommit) {
438
+ lines.push(`Commits: ${result.fromCommit.slice(0, 7)} → ${result.toCommit.slice(0, 7)}`);
439
+ }
440
+ if (result.usedRepositoryPatterns) {
441
+ lines.push('Filters: using repository include/exclude patterns');
442
+ }
443
+ return lines.join('\n');
444
+ }
445
+ //# sourceMappingURL=incrementalIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incrementalIndexer.js","sourceRoot":"","sources":["../src/incrementalIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ExecuFunction MCP Server
4
+ *
5
+ * A Model Context Protocol server that exposes ExecuFunction tools to IDE clients
6
+ * like Cursor, Claude Desktop, and VS Code.
7
+ *
8
+ * Configuration via environment variables:
9
+ * - EXF_API_URL: ExecuFunction API URL (e.g., https://execufunction.com)
10
+ * - EXF_PAT: Personal Access Token for authentication
11
+ *
12
+ * Usage:
13
+ * 1. Create a PAT in ExecuFunction Settings > Developer > Access Tokens
14
+ * 2. Configure your MCP client (e.g., claude_desktop_config.json):
15
+ * {
16
+ * "mcpServers": {
17
+ * "execufunction": {
18
+ * "command": "npx",
19
+ * "args": ["@execufunction/mcp-server"],
20
+ * "env": {
21
+ * "EXF_API_URL": "https://execufunction.com",
22
+ * "EXF_PAT": "exf_pat_..."
23
+ * }
24
+ * }
25
+ * }
26
+ * }
27
+ */
28
+ export {};
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}