mcp-code-context 2.1.3 → 2.3.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 (128) hide show
  1. package/.io/RULES.md +12 -0
  2. package/CHANGELOG.md +118 -58
  3. package/CONTRIBUTING.md +243 -0
  4. package/README.md +58 -7
  5. package/RELEASE_NOTES_v2.2.0.md +286 -0
  6. package/RELEASE_NOTES_v2.3.0.md +228 -0
  7. package/RELEASE_NOTES_v2.3.1.md +110 -0
  8. package/dist/src/ast/writers/safeRename.d.ts +14 -0
  9. package/dist/src/ast/writers/safeRename.js +258 -0
  10. package/dist/src/ast/writers/safeRename.js.map +1 -0
  11. package/dist/src/ast/writers/symbolWriter.d.ts +2 -0
  12. package/dist/src/ast/writers/symbolWriter.js +9 -14
  13. package/dist/src/ast/writers/symbolWriter.js.map +1 -1
  14. package/dist/src/cache/astCache.d.ts +33 -0
  15. package/dist/src/cache/astCache.js +113 -0
  16. package/dist/src/cache/astCache.js.map +1 -0
  17. package/dist/src/handlers/readHandlers.d.ts +70 -0
  18. package/dist/src/handlers/readHandlers.js +431 -0
  19. package/dist/src/handlers/readHandlers.js.map +1 -0
  20. package/dist/src/handlers/utilHandlers.d.ts +31 -0
  21. package/dist/src/handlers/utilHandlers.js +69 -0
  22. package/dist/src/handlers/utilHandlers.js.map +1 -0
  23. package/dist/src/handlers/writeHandlers.d.ts +57 -0
  24. package/dist/src/handlers/writeHandlers.js +475 -0
  25. package/dist/src/handlers/writeHandlers.js.map +1 -0
  26. package/dist/src/index.d.ts +6 -107
  27. package/dist/src/index.js +147 -965
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/tools/readFileLines.d.ts +26 -0
  30. package/dist/src/tools/readFileLines.js +77 -0
  31. package/dist/src/tools/readFileLines.js.map +1 -0
  32. package/dist/src/tools/searchCodePattern.d.ts +32 -0
  33. package/dist/src/tools/searchCodePattern.js +80 -0
  34. package/dist/src/tools/searchCodePattern.js.map +1 -0
  35. package/dist/src/utils/arrayUtils.d.ts +12 -0
  36. package/dist/src/utils/arrayUtils.js +27 -0
  37. package/dist/src/utils/arrayUtils.js.map +1 -0
  38. package/dist/src/utils/backupManager.d.ts +13 -6
  39. package/dist/src/utils/backupManager.js +73 -8
  40. package/dist/src/utils/backupManager.js.map +1 -1
  41. package/dist/src/utils/constants.d.ts +46 -0
  42. package/dist/src/utils/constants.js +112 -0
  43. package/dist/src/utils/constants.js.map +1 -0
  44. package/dist/src/utils/ignoreManager.d.ts +8 -0
  45. package/dist/src/utils/ignoreManager.js +49 -0
  46. package/dist/src/utils/ignoreManager.js.map +1 -1
  47. package/dist/src/utils/normalization.d.ts +49 -0
  48. package/dist/src/utils/normalization.js +173 -0
  49. package/dist/src/utils/normalization.js.map +1 -0
  50. package/dist/src/utils/projectRoot.d.ts +17 -0
  51. package/dist/src/utils/projectRoot.js +42 -0
  52. package/dist/src/utils/projectRoot.js.map +1 -0
  53. package/dist/src/utils/secureValidation.d.ts +15 -0
  54. package/dist/src/utils/secureValidation.js +41 -0
  55. package/dist/src/utils/secureValidation.js.map +1 -0
  56. package/dist/src/utils/transactionManager.d.ts +45 -0
  57. package/dist/src/utils/transactionManager.js +102 -0
  58. package/dist/src/utils/transactionManager.js.map +1 -0
  59. package/dist/src/utils/validation.d.ts +87 -0
  60. package/dist/src/utils/validation.js +231 -0
  61. package/dist/src/utils/validation.js.map +1 -0
  62. package/docs/ARCHITECTURE.md +300 -0
  63. package/docs/architecture/ADR-001-modular-handlers.md +119 -0
  64. package/llms.txt +62 -7
  65. package/package.json +5 -5
  66. package/AGENT_INSTRUCTIONS.md +0 -135
  67. package/DEPLOYMENT_INSTRUCTIONS.md +0 -110
  68. package/dist/src/tests/test-confirmation-flow.d.ts +0 -1
  69. package/dist/src/tests/test-confirmation-flow.js +0 -43
  70. package/dist/src/tests/test-confirmation-flow.js.map +0 -1
  71. package/dist/tests/debug-replace.d.ts +0 -1
  72. package/dist/tests/debug-replace.js +0 -17
  73. package/dist/tests/debug-replace.js.map +0 -1
  74. package/dist/tests/test-confirmation-flow.d.ts +0 -1
  75. package/dist/tests/test-confirmation-flow.js +0 -43
  76. package/dist/tests/test-confirmation-flow.js.map +0 -1
  77. package/dist/tests/test-dart.d.ts +0 -1
  78. package/dist/tests/test-dart.js +0 -242
  79. package/dist/tests/test-dart.js.map +0 -1
  80. package/dist/tests/test-php-ast.d.ts +0 -1
  81. package/dist/tests/test-php-ast.js +0 -152
  82. package/dist/tests/test-php-ast.js.map +0 -1
  83. package/dist/tests/test-php.d.ts +0 -1
  84. package/dist/tests/test-php.js +0 -234
  85. package/dist/tests/test-php.js.map +0 -1
  86. package/dist/tests/test-smoke.d.ts +0 -5
  87. package/dist/tests/test-smoke.js +0 -83
  88. package/dist/tests/test-smoke.js.map +0 -1
  89. package/dist/tests/writers/test-crlf-handling.d.ts +0 -4
  90. package/dist/tests/writers/test-crlf-handling.js +0 -73
  91. package/dist/tests/writers/test-crlf-handling.js.map +0 -1
  92. package/dist/tests/writers/test-write-smoke.d.ts +0 -9
  93. package/dist/tests/writers/test-write-smoke.js +0 -346
  94. package/dist/tests/writers/test-write-smoke.js.map +0 -1
  95. package/src/ast/dartCompressor.ts +0 -1013
  96. package/src/ast/phpCompressor.ts +0 -814
  97. package/src/ast/semanticCompressor.ts +0 -808
  98. package/src/ast/writers/dartWriter.ts +0 -648
  99. package/src/ast/writers/phpWriter.ts +0 -508
  100. package/src/ast/writers/pyWriter.ts +0 -446
  101. package/src/ast/writers/symbolWriter.ts +0 -277
  102. package/src/ast/writers/tsWriter.ts +0 -418
  103. package/src/index.ts +0 -1553
  104. package/src/utils/backupManager.ts +0 -66
  105. package/src/utils/confirmationCache.ts +0 -61
  106. package/src/utils/diffEngine.ts +0 -223
  107. package/src/utils/fuzzyMatch.ts +0 -86
  108. package/src/utils/ignoreManager.ts +0 -144
  109. package/tests/test-confirmation-flow.ts +0 -49
  110. package/tests/test-dart.d.ts +0 -1
  111. package/tests/test-dart.js +0 -209
  112. package/tests/test-dart.js.map +0 -1
  113. package/tests/test-dart.ts +0 -265
  114. package/tests/test-php-ast.d.ts +0 -1
  115. package/tests/test-php-ast.js +0 -152
  116. package/tests/test-php-ast.js.map +0 -1
  117. package/tests/test-php-ast.ts +0 -155
  118. package/tests/test-php.d.ts +0 -1
  119. package/tests/test-php.js +0 -234
  120. package/tests/test-php.js.map +0 -1
  121. package/tests/test-php.ts +0 -261
  122. package/tests/test-smoke.d.ts +0 -5
  123. package/tests/test-smoke.js +0 -83
  124. package/tests/test-smoke.js.map +0 -1
  125. package/tests/test-smoke.ts +0 -93
  126. package/tests/writers/test-crlf-handling.ts +0 -100
  127. package/tests/writers/test-write-smoke.ts +0 -568
  128. package/tsconfig.json +0 -19
@@ -0,0 +1,431 @@
1
+ /**
2
+ * readHandlers.ts — Read Tool Handlers
3
+ *
4
+ * Handles all read-only operations:
5
+ * - get_semantic_repo_map
6
+ * - read_file_surgical
7
+ * - analyze_impact
8
+ * - read_file_lines
9
+ * - search_code_pattern
10
+ */
11
+ import * as fs from "node:fs";
12
+ import * as path from "node:path";
13
+ import { IgnoreManager } from "../utils/ignoreManager.js";
14
+ import { compressFile, extractSymbol } from "../ast/semanticCompressor.js";
15
+ import { extractFallbackSymbols, findClosestSymbols } from "../utils/fuzzyMatch.js";
16
+ import { readFileLines } from "../tools/readFileLines.js";
17
+ import { searchCodePattern } from "../tools/searchCodePattern.js";
18
+ import { compressionCache, symbolCache, getSymbolCacheKey } from "../cache/astCache.js";
19
+ import { validateFilePath, validateDirectoryPath, validateFileSize, validateFileContent, } from "../utils/validation.js";
20
+ import { SOURCE_EXTENSIONS, IMPORTABLE_EXTENSIONS, MAX_FILES_FOR_REPO_MAP, } from "../utils/constants.js";
21
+ // ─── Handler: get_semantic_repo_map ─────────────────────────────────
22
+ export async function handleGetSemanticRepoMap(args) {
23
+ const directoryPath = args.directoryPath;
24
+ const format = args.format || "xml";
25
+ if (!directoryPath) {
26
+ return errorResponse("Missing required parameter: directoryPath");
27
+ }
28
+ const validation = validateDirectoryPath(directoryPath);
29
+ if (!validation.valid) {
30
+ return errorResponse(validation.error);
31
+ }
32
+ const resolvedPath = validation.normalizedPath;
33
+ const ignoreManager = new IgnoreManager(resolvedPath);
34
+ const files = await ignoreManager.walkDirectoryAsync();
35
+ // CRITICAL: Limit files to prevent timeout
36
+ if (files.length > MAX_FILES_FOR_REPO_MAP) {
37
+ return errorResponse(`Repository too large (${files.length} files). ` +
38
+ `get_semantic_repo_map supports up to ${MAX_FILES_FOR_REPO_MAP} files. ` +
39
+ `Use a more specific directory path or increase MAX_FILES_FOR_REPO_MAP.`);
40
+ }
41
+ const projectName = path.basename(resolvedPath);
42
+ const entries = [];
43
+ let skippedCount = 0;
44
+ // Process files in batches to avoid blocking
45
+ const { processBatched } = await import("../utils/arrayUtils.js");
46
+ const results = await processBatched(files, async (file) => {
47
+ const ext = path.extname(file).toLowerCase();
48
+ if (!SOURCE_EXTENSIONS.has(ext)) {
49
+ return { skipped: true };
50
+ }
51
+ // Validate file size
52
+ const sizeValidation = validateFileSize(file);
53
+ if (!sizeValidation.valid) {
54
+ return { skipped: true };
55
+ }
56
+ let content;
57
+ try {
58
+ content = await fs.promises.readFile(file, "utf-8");
59
+ }
60
+ catch {
61
+ return { skipped: true };
62
+ }
63
+ // Validate content
64
+ const contentValidation = validateFileContent(content);
65
+ if (!contentValidation.valid) {
66
+ return { skipped: true };
67
+ }
68
+ const relativePath = path.relative(resolvedPath, file).replace(/\\/g, "/");
69
+ const language = getLanguageName(ext);
70
+ // Check cache first
71
+ const cacheKey = file;
72
+ let compressed = compressionCache.get(cacheKey, file);
73
+ if (!compressed) {
74
+ compressed = compressFile(file, content);
75
+ compressionCache.set(cacheKey, compressed, file);
76
+ }
77
+ return { entry: { relativePath, language, compressed } };
78
+ }, 50);
79
+ for (const result of results) {
80
+ if ('skipped' in result) {
81
+ skippedCount++;
82
+ }
83
+ else if ('entry' in result) {
84
+ entries.push(result.entry);
85
+ }
86
+ }
87
+ const output = format === "markdown"
88
+ ? formatAsMarkdown(projectName, resolvedPath, entries, skippedCount)
89
+ : formatAsXml(projectName, resolvedPath, entries, skippedCount);
90
+ return {
91
+ content: [{ type: "text", text: output }],
92
+ };
93
+ }
94
+ // ─── Handler: read_file_surgical ────────────────────────────────────
95
+ export async function handleReadFileSurgical(args) {
96
+ const filePath = args.filePath;
97
+ const symbolName = args.symbolName;
98
+ const className = args.className;
99
+ if (!filePath) {
100
+ return errorResponse("Missing required parameter: filePath");
101
+ }
102
+ const validation = validateFilePath(filePath);
103
+ if (!validation.valid) {
104
+ return errorResponse(validation.error);
105
+ }
106
+ const resolvedPath = validation.normalizedPath;
107
+ // Validate file size
108
+ const sizeValidation = validateFileSize(resolvedPath);
109
+ if (!sizeValidation.valid) {
110
+ return errorResponse(sizeValidation.error);
111
+ }
112
+ let content;
113
+ try {
114
+ content = fs.readFileSync(resolvedPath, "utf-8");
115
+ }
116
+ catch (error) {
117
+ const msg = error instanceof Error ? error.message : String(error);
118
+ return errorResponse(`Failed to read file: ${msg}`);
119
+ }
120
+ // Validate content
121
+ const contentValidation = validateFileContent(content);
122
+ if (!contentValidation.valid) {
123
+ return errorResponse(contentValidation.error);
124
+ }
125
+ if (!symbolName) {
126
+ return {
127
+ content: [
128
+ {
129
+ type: "text",
130
+ text: `// File: ${resolvedPath}\n// Lines: ${content.split("\n").length}\n\n${content}`,
131
+ },
132
+ ],
133
+ };
134
+ }
135
+ // Check cache
136
+ const cacheKey = getSymbolCacheKey(resolvedPath, symbolName, className);
137
+ let extracted = symbolCache.get(cacheKey, resolvedPath);
138
+ if (extracted === undefined) {
139
+ extracted = extractSymbol(content, symbolName, resolvedPath, className);
140
+ symbolCache.set(cacheKey, extracted, resolvedPath);
141
+ }
142
+ if (extracted === null) {
143
+ const available = extractFallbackSymbols(content);
144
+ const closest = findClosestSymbols(symbolName, available, 5);
145
+ const availableFormatted = available.slice(0, 15).map(s => `${s.name} (${s.type}${s.className ? ` in ${s.className}` : ''})`);
146
+ if (available.length > 15)
147
+ availableFormatted.push(`...and ${available.length - 15} more`);
148
+ const suggestions = [];
149
+ if (className) {
150
+ const inOtherClass = available.find(s => s.name === symbolName && s.className !== className);
151
+ if (inOtherClass)
152
+ suggestions.push(`Did you mean '${symbolName}' in class '${inOtherClass.className}'?`);
153
+ }
154
+ else {
155
+ const needsScope = available.filter(s => s.name === symbolName && s.className);
156
+ if (needsScope.length > 0)
157
+ suggestions.push(`Symbol '${symbolName}' exists in class '${needsScope[0].className}'. Use className parameter.`);
158
+ }
159
+ if (closest.length > 0) {
160
+ suggestions.push(`Similar: ${closest.map(s => s.name).join(', ')}`);
161
+ }
162
+ return {
163
+ isError: true,
164
+ content: [
165
+ {
166
+ type: "text",
167
+ text: JSON.stringify({
168
+ error: `Symbol '${symbolName}' not found`,
169
+ available_symbols: availableFormatted,
170
+ suggestions
171
+ }, null, 2),
172
+ },
173
+ ],
174
+ };
175
+ }
176
+ return {
177
+ content: [
178
+ {
179
+ type: "text",
180
+ text: `// Symbol: ${symbolName}\n// File: ${resolvedPath}\n\n${extracted}`,
181
+ },
182
+ ],
183
+ };
184
+ }
185
+ // ─── Handler: analyze_impact ────────────────────────────────────────
186
+ export async function handleAnalyzeImpact(args) {
187
+ const filePath = args.filePath;
188
+ let rootDir = args.rootDir;
189
+ if (!filePath) {
190
+ return errorResponse("Missing required parameter: filePath");
191
+ }
192
+ const validation = validateFilePath(filePath);
193
+ if (!validation.valid) {
194
+ return errorResponse(validation.error);
195
+ }
196
+ const resolvedPath = validation.normalizedPath;
197
+ if (!rootDir) {
198
+ rootDir = findProjectRoot(resolvedPath);
199
+ }
200
+ if (!rootDir || !fs.existsSync(rootDir)) {
201
+ return errorResponse(`Could not determine project root for ${resolvedPath}`);
202
+ }
203
+ rootDir = path.resolve(rootDir);
204
+ const ignoreManager = new IgnoreManager(rootDir);
205
+ const allFiles = await ignoreManager.walkDirectoryAsync();
206
+ const targetRelative = path.relative(rootDir, resolvedPath).replace(/\\/g, "/");
207
+ const importPatterns = [
208
+ /import\s+(?:[\s\S]*?)\s+from\s+['"]([^'"]+)['"]/gm,
209
+ /import\s*\(\s*['"]([^'"]+)['"]\s*\)/gm,
210
+ /require\s*\(\s*['"]([^'"]+)['"]\s*\)/gm,
211
+ /from\s+(\S+)\s+import/gm,
212
+ /^import\s+(\S+)/gm,
213
+ /^\s*use\s+([\w\\]+)/gm,
214
+ /(?:require_once|require|include_once|include)\s*\(?\s*['"]([^'"]+)['"]\s*\)?/gm,
215
+ /^\s*import\s+['"]([^'"]+)['"]\s*;/gm,
216
+ ];
217
+ const dependents = [];
218
+ // Process files in batches
219
+ const { processBatched } = await import("../utils/arrayUtils.js");
220
+ const results = await processBatched(allFiles.filter(f => path.resolve(f) !== resolvedPath), async (file) => {
221
+ const ext = path.extname(file).toLowerCase();
222
+ if (!IMPORTABLE_EXTENSIONS.has(ext))
223
+ return null;
224
+ let content;
225
+ try {
226
+ content = await fs.promises.readFile(file, "utf-8");
227
+ }
228
+ catch {
229
+ return null;
230
+ }
231
+ let isDependent = false;
232
+ const matchedImports = [];
233
+ for (const pattern of importPatterns) {
234
+ const regex = new RegExp(pattern.source, pattern.flags);
235
+ let match;
236
+ while ((match = regex.exec(content)) !== null) {
237
+ const importPath = match[1];
238
+ if (resolveImportMatch(importPath, resolvedPath, file, rootDir)) {
239
+ matchedImports.push(match[0].trim());
240
+ isDependent = true;
241
+ }
242
+ }
243
+ }
244
+ if (isDependent) {
245
+ return {
246
+ file: path.relative(rootDir, file).replace(/\\/g, "/"),
247
+ imports: [...new Set(matchedImports)],
248
+ };
249
+ }
250
+ return null;
251
+ }, 50);
252
+ dependents.push(...results.filter(r => r !== null));
253
+ const report = buildImpactReport(targetRelative, rootDir, dependents);
254
+ return {
255
+ content: [{ type: "text", text: report }],
256
+ };
257
+ }
258
+ // ─── Handler: read_file_lines ───────────────────────────────────────
259
+ export async function handleReadFileLines(args) {
260
+ const result = readFileLines(args);
261
+ if (!result.success) {
262
+ return errorResponse(result.error || "Unknown error reading file lines");
263
+ }
264
+ const { content, lineRange } = result;
265
+ const header = lineRange
266
+ ? `// Lines ${lineRange.start}-${lineRange.end}\n// File: ${args.filePath}\n\n`
267
+ : `// File: ${args.filePath}\n\n`;
268
+ return {
269
+ content: [
270
+ {
271
+ type: "text",
272
+ text: header + content,
273
+ },
274
+ ],
275
+ };
276
+ }
277
+ // ─── Handler: search_code_pattern ───────────────────────────────────
278
+ export async function handleSearchCodePattern(args) {
279
+ const result = searchCodePattern(args);
280
+ if (!result.success) {
281
+ return errorResponse(result.error || "Unknown error searching code");
282
+ }
283
+ const { matches, totalMatches } = result;
284
+ if (!matches || matches.length === 0) {
285
+ return {
286
+ content: [
287
+ {
288
+ type: "text",
289
+ text: `# Search Results\n\nNo matches found for pattern: "${args.pattern}"`,
290
+ },
291
+ ],
292
+ };
293
+ }
294
+ const lines = [
295
+ `# Search Results`,
296
+ ``,
297
+ `**Pattern:** \`${args.pattern}\``,
298
+ `**Root:** \`${args.rootDir}\``,
299
+ `**Matches:** ${totalMatches} (showing ${matches.length})`,
300
+ ``,
301
+ ];
302
+ for (const match of matches) {
303
+ lines.push(`## \`${match.file}\` (line ${match.lineNumber})`);
304
+ lines.push(``);
305
+ if (match.context) {
306
+ lines.push("```");
307
+ lines.push(...match.context);
308
+ lines.push("```");
309
+ }
310
+ else {
311
+ lines.push(`\`\`\`\n${match.line}\n\`\`\``);
312
+ }
313
+ lines.push(``);
314
+ }
315
+ return {
316
+ content: [
317
+ {
318
+ type: "text",
319
+ text: lines.join("\n"),
320
+ },
321
+ ],
322
+ };
323
+ }
324
+ // ─── Utility Functions ──────────────────────────────────────────────
325
+ function errorResponse(message) {
326
+ return {
327
+ content: [{ type: "text", text: `❌ ${message}` }],
328
+ isError: true,
329
+ };
330
+ }
331
+ function getLanguageName(ext) {
332
+ const map = {
333
+ ".ts": "TypeScript", ".tsx": "TypeScript JSX", ".js": "JavaScript",
334
+ ".jsx": "JavaScript JSX", ".py": "Python", ".php": "PHP", ".dart": "Dart",
335
+ };
336
+ return map[ext] || ext.substring(1).toUpperCase();
337
+ }
338
+ function formatAsXml(projectName, projectPath, entries, skippedCount) {
339
+ const lines = [
340
+ `<?xml version="1.0" encoding="UTF-8"?>`,
341
+ `<repository name="${esc(projectName)}" path="${esc(projectPath)}" files="${entries.length}" skipped="${skippedCount}">`,
342
+ ` <file_tree>`,
343
+ ];
344
+ for (const entry of entries) {
345
+ lines.push(` <file path="${esc(entry.relativePath)}" language="${esc(entry.language)}" />`);
346
+ }
347
+ lines.push(` </file_tree>`);
348
+ for (const entry of entries) {
349
+ lines.push(` <file path="${esc(entry.relativePath)}" language="${esc(entry.language)}">`);
350
+ lines.push(`<compressed>${entry.compressed}</compressed>`);
351
+ lines.push(` </file>`);
352
+ }
353
+ lines.push(`</repository>`);
354
+ return lines.join("\n");
355
+ }
356
+ function formatAsMarkdown(projectName, projectPath, entries, skippedCount) {
357
+ const lines = [
358
+ `# Repository Map: ${projectName}`,
359
+ ``,
360
+ `> **Path:** \`${projectPath}\``,
361
+ `> **Files:** ${entries.length} | **Skipped:** ${skippedCount}`,
362
+ ``,
363
+ ];
364
+ for (const entry of entries) {
365
+ lines.push(`- \`${entry.relativePath}\` *(${entry.language})*`);
366
+ }
367
+ return lines.join("\n");
368
+ }
369
+ function buildImpactReport(targetRelative, rootDir, dependents) {
370
+ const lines = [
371
+ `# Impact Analysis`,
372
+ ``,
373
+ `**Target:** \`${targetRelative}\``,
374
+ `**Dependents:** ${dependents.length}`,
375
+ ``,
376
+ ];
377
+ if (dependents.length === 0) {
378
+ lines.push(`No dependencies found.`);
379
+ }
380
+ else {
381
+ for (const dep of dependents) {
382
+ lines.push(`### \`${dep.file}\``);
383
+ for (const imp of dep.imports) {
384
+ lines.push(`- \`${imp}\``);
385
+ }
386
+ lines.push(``);
387
+ }
388
+ }
389
+ return lines.join("\n");
390
+ }
391
+ function esc(str) {
392
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
393
+ }
394
+ function resolveImportMatch(importPath, targetFile, sourceFile, rootDir) {
395
+ const normalized = importPath.replace(/\\/g, "/");
396
+ const targetResolved = path.resolve(targetFile);
397
+ const targetBaseName = path.basename(targetFile, path.extname(targetFile));
398
+ if (normalized.startsWith(".")) {
399
+ const sourceDir = path.dirname(sourceFile);
400
+ const resolved = path.resolve(sourceDir, normalized);
401
+ const candidates = [
402
+ resolved,
403
+ resolved + ".ts",
404
+ resolved + ".js",
405
+ resolved + ".dart",
406
+ path.join(resolved, "index.ts"),
407
+ path.join(resolved, "index.js"),
408
+ ];
409
+ for (const candidate of candidates) {
410
+ if (path.resolve(candidate) === targetResolved) {
411
+ return true;
412
+ }
413
+ }
414
+ }
415
+ return normalized.endsWith(targetBaseName);
416
+ }
417
+ function findProjectRoot(filePath) {
418
+ const ROOT_MARKERS = ["package.json", ".git", "pubspec.yaml"];
419
+ let current = path.dirname(path.resolve(filePath));
420
+ const root = path.parse(current).root;
421
+ while (current !== root) {
422
+ for (const marker of ROOT_MARKERS) {
423
+ if (fs.existsSync(path.join(current, marker))) {
424
+ return current;
425
+ }
426
+ }
427
+ current = path.dirname(current);
428
+ }
429
+ return undefined;
430
+ }
431
+ //# sourceMappingURL=readHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readHandlers.js","sourceRoot":"","sources":["../../../src/handlers/readHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * utilHandlers.ts — Utility Tool Handlers
3
+ *
4
+ * Handles utility operations:
5
+ * - rollback_file
6
+ * - clean_backups
7
+ */
8
+ export declare function handleRollbackFile(args: Record<string, unknown>): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ isError: boolean;
14
+ } | {
15
+ content: {
16
+ type: "text";
17
+ text: string;
18
+ }[];
19
+ }>;
20
+ export declare function handleCleanBackups(args: Record<string, unknown>): Promise<{
21
+ content: {
22
+ type: "text";
23
+ text: string;
24
+ }[];
25
+ isError: boolean;
26
+ } | {
27
+ content: {
28
+ type: "text";
29
+ text: string;
30
+ }[];
31
+ }>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * utilHandlers.ts — Utility Tool Handlers
3
+ *
4
+ * Handles utility operations:
5
+ * - rollback_file
6
+ * - clean_backups
7
+ */
8
+ import * as path from "node:path";
9
+ import { restoreBackup, cleanAllBackups } from "../utils/backupManager.js";
10
+ import { validateFilePath, validateDirectoryPath } from "../utils/validation.js";
11
+ // ─── Handler: rollback_file ─────────────────────────────────────────
12
+ export async function handleRollbackFile(args) {
13
+ const filePath = args.filePath;
14
+ const steps = args.steps || 1;
15
+ if (!filePath)
16
+ return errorResponse("Missing required parameter: filePath");
17
+ const validation = validateFilePath(filePath);
18
+ if (!validation.valid) {
19
+ return errorResponse(validation.error);
20
+ }
21
+ const resolvedPath = validation.normalizedPath;
22
+ if (steps < 1 || steps > 5) {
23
+ return errorResponse("Steps must be between 1 and 5");
24
+ }
25
+ const success = restoreBackup(resolvedPath, steps);
26
+ if (!success) {
27
+ return errorResponse(`No backup found for step ${steps}`);
28
+ }
29
+ return {
30
+ content: [{
31
+ type: "text",
32
+ text: `// ⏪ Rollback successful\n// Reverted ${path.basename(resolvedPath)} to ${steps} step(s) ago\n// File: ${resolvedPath}`,
33
+ }],
34
+ };
35
+ }
36
+ // ─── Handler: clean_backups ─────────────────────────────────────────
37
+ export async function handleCleanBackups(args) {
38
+ const projectRoot = args.projectRoot;
39
+ if (!projectRoot)
40
+ return errorResponse("Missing required parameter: projectRoot");
41
+ const validation = validateDirectoryPath(projectRoot);
42
+ if (!validation.valid) {
43
+ return errorResponse(validation.error);
44
+ }
45
+ const resolvedPath = validation.normalizedPath;
46
+ const success = cleanAllBackups(resolvedPath);
47
+ if (!success) {
48
+ return {
49
+ content: [{
50
+ type: "text",
51
+ text: `// ℹ️ No backups found\n// No .mcp-backups directory at: ${resolvedPath}`,
52
+ }],
53
+ };
54
+ }
55
+ return {
56
+ content: [{
57
+ type: "text",
58
+ text: `// 🧹 Cleanup successful\n// Removed all backups from: ${resolvedPath}/.mcp-backups`,
59
+ }],
60
+ };
61
+ }
62
+ // ─── Utility Functions ──────────────────────────────────────────────
63
+ function errorResponse(message) {
64
+ return {
65
+ content: [{ type: "text", text: `❌ ${message}` }],
66
+ isError: true,
67
+ };
68
+ }
69
+ //# sourceMappingURL=utilHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilHandlers.js","sourceRoot":"","sources":["../../../src/handlers/utilHandlers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEjF,uEAAuE;AAEvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA6B;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAkB,CAAC;IACzC,MAAM,KAAK,GAAI,IAAI,CAAC,KAAgB,IAAI,CAAC,CAAC;IAE1C,IAAI,CAAC,QAAQ;QAAE,OAAO,aAAa,CAAC,sCAAsC,CAAC,CAAC;IAE5E,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,cAAe,CAAC;IAEhD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,aAAa,CAAC,+BAA+B,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAEnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,aAAa,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,yCAAyC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,KAAK,0BAA0B,YAAY,EAAE;aAC/H,CAAC;KACH,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAA6B;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAqB,CAAC;IAE/C,IAAI,CAAC,WAAW;QAAE,OAAO,aAAa,CAAC,yCAAyC,CAAC,CAAC;IAElF,MAAM,UAAU,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,UAAU,CAAC,KAAM,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,cAAe,CAAC;IAEhD,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,4DAA4D,YAAY,EAAE;iBACjF,CAAC;SACH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,0DAA0D,YAAY,eAAe;aAC5F,CAAC;KACH,CAAC;AACJ,CAAC;AAED,uEAAuE;AAEvE,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,EAAE,CAAC;QAC1D,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * writeHandlers.ts — Write Tool Handlers
3
+ *
4
+ * Handles all write operations with two-phase confirmation:
5
+ * - write_file_surgical
6
+ * - insert_symbol
7
+ * - rename_symbol
8
+ * - remove_symbol
9
+ */
10
+ export declare function handleWriteFileSurgical(args: Record<string, unknown>): Promise<{
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ isError: boolean;
16
+ } | {
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ }>;
22
+ export declare function handleInsertSymbol(args: Record<string, unknown>): Promise<{
23
+ content: {
24
+ type: "text";
25
+ text: string;
26
+ }[];
27
+ isError: boolean;
28
+ } | {
29
+ content: {
30
+ type: "text";
31
+ text: string;
32
+ }[];
33
+ }>;
34
+ export declare function handleRenameSymbol(args: Record<string, unknown>): Promise<{
35
+ content: {
36
+ type: "text";
37
+ text: string;
38
+ }[];
39
+ isError: boolean;
40
+ } | {
41
+ content: {
42
+ type: "text";
43
+ text: string;
44
+ }[];
45
+ }>;
46
+ export declare function handleRemoveSymbol(args: Record<string, unknown>): Promise<{
47
+ content: {
48
+ type: "text";
49
+ text: string;
50
+ }[];
51
+ isError: boolean;
52
+ } | {
53
+ content: {
54
+ type: "text";
55
+ text: string;
56
+ }[];
57
+ }>;