mcp-code-context 2.6.0 → 3.0.4

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/CHANGELOG.md +92 -260
  2. package/README.md +304 -298
  3. package/dist/src/core/engine.d.ts +21 -0
  4. package/dist/src/core/engine.js +68 -0
  5. package/dist/src/core/engine.js.map +1 -0
  6. package/dist/src/core/validator.d.ts +15 -0
  7. package/dist/src/core/validator.js +44 -0
  8. package/dist/src/core/validator.js.map +1 -0
  9. package/dist/src/index.d.ts +7 -11
  10. package/dist/src/index.js +182 -397
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/operations/write.d.ts +51 -0
  13. package/dist/src/operations/write.js +169 -0
  14. package/dist/src/operations/write.js.map +1 -0
  15. package/dist/src/parsers/base.d.ts +28 -0
  16. package/dist/src/parsers/base.js +27 -0
  17. package/dist/src/parsers/base.js.map +1 -0
  18. package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
  19. package/dist/src/parsers/dartTreeSitter.js +91 -0
  20. package/dist/src/parsers/dartTreeSitter.js.map +1 -0
  21. package/dist/src/parsers/php.d.ts +12 -0
  22. package/dist/src/parsers/php.js +86 -0
  23. package/dist/src/parsers/php.js.map +1 -0
  24. package/dist/src/parsers/python.d.ts +12 -0
  25. package/dist/src/parsers/python.js +86 -0
  26. package/dist/src/parsers/python.js.map +1 -0
  27. package/dist/src/parsers/registry.d.ts +15 -0
  28. package/dist/src/parsers/registry.js +70 -0
  29. package/dist/src/parsers/registry.js.map +1 -0
  30. package/dist/src/parsers/typescript.d.ts +13 -0
  31. package/dist/src/parsers/typescript.js +98 -0
  32. package/dist/src/parsers/typescript.js.map +1 -0
  33. package/llms.txt +246 -236
  34. package/mcp-code-context-3.0.2.tgz +0 -0
  35. package/package.json +59 -57
  36. package/tsconfig.tests.json +27 -0
  37. package/.io/RULES.md +0 -12
  38. package/CONTRIBUTING.md +0 -243
  39. package/TROUBLESHOOTING.md +0 -38
  40. package/dist/src/ast/dartCompressor.d.ts +0 -27
  41. package/dist/src/ast/dartCompressor.js +0 -859
  42. package/dist/src/ast/dartCompressor.js.map +0 -1
  43. package/dist/src/ast/phpCompressor.d.ts +0 -24
  44. package/dist/src/ast/phpCompressor.js +0 -634
  45. package/dist/src/ast/phpCompressor.js.map +0 -1
  46. package/dist/src/ast/semanticCompressor.d.ts +0 -22
  47. package/dist/src/ast/semanticCompressor.js +0 -677
  48. package/dist/src/ast/semanticCompressor.js.map +0 -1
  49. package/dist/src/ast/writers/dartWriter.d.ts +0 -37
  50. package/dist/src/ast/writers/dartWriter.js +0 -544
  51. package/dist/src/ast/writers/dartWriter.js.map +0 -1
  52. package/dist/src/ast/writers/phpWriter.d.ts +0 -37
  53. package/dist/src/ast/writers/phpWriter.js +0 -411
  54. package/dist/src/ast/writers/phpWriter.js.map +0 -1
  55. package/dist/src/ast/writers/pyWriter.d.ts +0 -37
  56. package/dist/src/ast/writers/pyWriter.js +0 -355
  57. package/dist/src/ast/writers/pyWriter.js.map +0 -1
  58. package/dist/src/ast/writers/safeRename.d.ts +0 -14
  59. package/dist/src/ast/writers/safeRename.js +0 -258
  60. package/dist/src/ast/writers/safeRename.js.map +0 -1
  61. package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
  62. package/dist/src/ast/writers/symbolWriter.js +0 -174
  63. package/dist/src/ast/writers/symbolWriter.js.map +0 -1
  64. package/dist/src/ast/writers/tsWriter.d.ts +0 -38
  65. package/dist/src/ast/writers/tsWriter.js +0 -344
  66. package/dist/src/ast/writers/tsWriter.js.map +0 -1
  67. package/dist/src/cache/astCache.d.ts +0 -39
  68. package/dist/src/cache/astCache.js +0 -169
  69. package/dist/src/cache/astCache.js.map +0 -1
  70. package/dist/src/handlers/readHandlers.d.ts +0 -70
  71. package/dist/src/handlers/readHandlers.js +0 -455
  72. package/dist/src/handlers/readHandlers.js.map +0 -1
  73. package/dist/src/handlers/utilHandlers.d.ts +0 -31
  74. package/dist/src/handlers/utilHandlers.js +0 -69
  75. package/dist/src/handlers/utilHandlers.js.map +0 -1
  76. package/dist/src/handlers/writeHandlers.d.ts +0 -57
  77. package/dist/src/handlers/writeHandlers.js +0 -499
  78. package/dist/src/handlers/writeHandlers.js.map +0 -1
  79. package/dist/src/tools/readFileLines.d.ts +0 -26
  80. package/dist/src/tools/readFileLines.js +0 -77
  81. package/dist/src/tools/readFileLines.js.map +0 -1
  82. package/dist/src/tools/searchCodePattern.d.ts +0 -37
  83. package/dist/src/tools/searchCodePattern.js +0 -144
  84. package/dist/src/tools/searchCodePattern.js.map +0 -1
  85. package/dist/src/utils/arrayUtils.d.ts +0 -12
  86. package/dist/src/utils/arrayUtils.js +0 -27
  87. package/dist/src/utils/arrayUtils.js.map +0 -1
  88. package/dist/src/utils/backupManager.d.ts +0 -31
  89. package/dist/src/utils/backupManager.js +0 -124
  90. package/dist/src/utils/backupManager.js.map +0 -1
  91. package/dist/src/utils/confirmationCache.d.ts +0 -16
  92. package/dist/src/utils/confirmationCache.js +0 -40
  93. package/dist/src/utils/confirmationCache.js.map +0 -1
  94. package/dist/src/utils/constants.d.ts +0 -46
  95. package/dist/src/utils/constants.js +0 -112
  96. package/dist/src/utils/constants.js.map +0 -1
  97. package/dist/src/utils/dependencyChecker.d.ts +0 -1
  98. package/dist/src/utils/dependencyChecker.js +0 -55
  99. package/dist/src/utils/dependencyChecker.js.map +0 -1
  100. package/dist/src/utils/diffEngine.d.ts +0 -21
  101. package/dist/src/utils/diffEngine.js +0 -163
  102. package/dist/src/utils/diffEngine.js.map +0 -1
  103. package/dist/src/utils/fuzzyMatch.d.ts +0 -8
  104. package/dist/src/utils/fuzzyMatch.js +0 -70
  105. package/dist/src/utils/fuzzyMatch.js.map +0 -1
  106. package/dist/src/utils/ignoreManager.d.ts +0 -29
  107. package/dist/src/utils/ignoreManager.js +0 -144
  108. package/dist/src/utils/ignoreManager.js.map +0 -1
  109. package/dist/src/utils/normalization.d.ts +0 -49
  110. package/dist/src/utils/normalization.js +0 -173
  111. package/dist/src/utils/normalization.js.map +0 -1
  112. package/dist/src/utils/projectRoot.d.ts +0 -17
  113. package/dist/src/utils/projectRoot.js +0 -42
  114. package/dist/src/utils/projectRoot.js.map +0 -1
  115. package/dist/src/utils/secureValidation.d.ts +0 -15
  116. package/dist/src/utils/secureValidation.js +0 -41
  117. package/dist/src/utils/secureValidation.js.map +0 -1
  118. package/dist/src/utils/syntaxValidator.d.ts +0 -15
  119. package/dist/src/utils/syntaxValidator.js +0 -218
  120. package/dist/src/utils/syntaxValidator.js.map +0 -1
  121. package/dist/src/utils/transactionManager.d.ts +0 -46
  122. package/dist/src/utils/transactionManager.js +0 -123
  123. package/dist/src/utils/transactionManager.js.map +0 -1
  124. package/dist/src/utils/validation.d.ts +0 -87
  125. package/dist/src/utils/validation.js +0 -231
  126. package/dist/src/utils/validation.js.map +0 -1
  127. package/docs/ARCHITECTURE.md +0 -300
  128. package/docs/architecture/ADR-001-modular-handlers.md +0 -119
@@ -1,499 +0,0 @@
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
- import * as fs from "node:fs";
11
- import * as path from "node:path";
12
- import { IgnoreManager } from "../utils/ignoreManager.js";
13
- import { replaceSymbol, insertCode, renameInFile, renameReferencesInFile, removeSymbolFromFile, WRITABLE_EXTENSIONS, } from "../ast/writers/symbolWriter.js";
14
- import { generateDiff, generateMultiFileDiff } from "../utils/diffEngine.js";
15
- import { createBackup, restoreBackup } from "../utils/backupManager.js";
16
- import { extractFallbackSymbols, findClosestSymbols } from "../utils/fuzzyMatch.js";
17
- import { confirmationCache } from "../utils/confirmationCache.js";
18
- import { invalidateFileCache } from "../cache/astCache.js";
19
- import { TransactionManager } from "../utils/transactionManager.js";
20
- import { validateSymbolName, } from "../utils/validation.js";
21
- import { IMPORTABLE_EXTENSIONS } from "../utils/constants.js";
22
- import { checkSymbolUsage } from "../utils/dependencyChecker.js";
23
- // ─── Handler: write_file_surgical ───────────────────────────────────
24
- export async function handleWriteFileSurgical(args) {
25
- const filePath = args.filePath;
26
- const symbolName = args.symbolName;
27
- const newContent = args.newContent;
28
- const className = args.className;
29
- const confirmationToken = args.confirmationToken;
30
- const confirm = args.confirm;
31
- if (!filePath)
32
- return errorResponse("Missing required parameter: filePath");
33
- // PHASE 2: Apply
34
- if (confirmationToken && confirm) {
35
- const pending = confirmationCache.consume(confirmationToken);
36
- if (!pending || pending.operation !== "write_file_surgical") {
37
- return errorResponse("Invalid or expired confirmation token");
38
- }
39
- const resolvedPath = pending.filePath;
40
- try {
41
- createBackup(resolvedPath);
42
- }
43
- catch (error) {
44
- return errorResponse(`Backup failed: ${error instanceof Error ? error.message : String(error)}`);
45
- }
46
- try {
47
- fs.writeFileSync(resolvedPath, pending.payload.newContentFull, "utf-8");
48
- // Post-write validation
49
- const { validateSyntax } = await import("../utils/syntaxValidator.js");
50
- const validation = await validateSyntax(resolvedPath, pending.payload.newContentFull);
51
- if (!validation.valid) {
52
- restoreBackup(resolvedPath);
53
- const diagnostics = validation.diagnostics?.join("\n") || "";
54
- return errorResponse(`Syntax error after write:\n${validation.error}${diagnostics ? "\n" + diagnostics : ""}`);
55
- }
56
- invalidateFileCache(resolvedPath);
57
- }
58
- catch (error) {
59
- restoreBackup(resolvedPath);
60
- return errorResponse(`Write failed: ${error instanceof Error ? error.message : String(error)}`);
61
- }
62
- return {
63
- content: [
64
- {
65
- type: "text",
66
- text: `// ✅ Symbol "${pending.payload.symbolName}" replaced\n// File: ${resolvedPath}\n\n${pending.payload.diff}`,
67
- },
68
- ],
69
- };
70
- }
71
- // PHASE 1: Dry-Run
72
- if (!symbolName)
73
- return errorResponse("Missing required parameter: symbolName");
74
- if (!newContent)
75
- return errorResponse("Missing required parameter: newContent");
76
- // Validate symbol name
77
- const symbolValidation = validateSymbolName(symbolName);
78
- if (!symbolValidation.valid) {
79
- return errorResponse(symbolValidation.error);
80
- }
81
- // SECURITY: Use secure validation with project boundary enforcement
82
- const { validateFilePathSecure } = await import("../utils/secureValidation.js");
83
- const validation = validateFilePathSecure(filePath);
84
- if (!validation.valid) {
85
- return errorResponse(validation.error);
86
- }
87
- const resolvedPath = validation.resolvedPath;
88
- const ext = path.extname(resolvedPath).toLowerCase();
89
- if (!WRITABLE_EXTENSIONS.has(ext)) {
90
- return errorResponse(`Unsupported file type: ${ext}`);
91
- }
92
- let content;
93
- try {
94
- content = await fs.promises.readFile(resolvedPath, "utf-8");
95
- }
96
- catch (error) {
97
- return errorResponse(`Read failed: ${error instanceof Error ? error.message : String(error)}`);
98
- }
99
- const result = replaceSymbol(resolvedPath, content, symbolName, newContent, className);
100
- if (!result.success) {
101
- const isNotFoundError = result.error && result.error.includes("not found");
102
- if (isNotFoundError) {
103
- const available = extractFallbackSymbols(content);
104
- const closest = findClosestSymbols(symbolName, available, 5);
105
- const availableFormatted = available.slice(0, 15).map(s => `${s.name} (${s.type}${s.className ? ` in ${s.className}` : ''})`);
106
- if (available.length > 15)
107
- availableFormatted.push(`...and ${available.length - 15} more`);
108
- const suggestions = [];
109
- if (className) {
110
- const inOtherClass = available.find(s => s.name === symbolName && s.className !== className);
111
- if (inOtherClass)
112
- suggestions.push(`Try className: '${inOtherClass.className}'`);
113
- }
114
- else {
115
- const needsScope = available.filter(s => s.name === symbolName && s.className);
116
- if (needsScope.length > 0)
117
- suggestions.push(`Use className: '${needsScope[0].className}'`);
118
- }
119
- if (closest.length > 0) {
120
- suggestions.push(`Similar: ${closest.map(s => s.name).join(', ')}`);
121
- }
122
- return {
123
- isError: true,
124
- content: [
125
- {
126
- type: "text",
127
- text: JSON.stringify({
128
- error: result.error,
129
- available_symbols: availableFormatted,
130
- suggestions
131
- }, null, 2),
132
- },
133
- ],
134
- };
135
- }
136
- return errorResponse(result.error || "Unknown error");
137
- }
138
- const diff = generateDiff(content, result.newContent, resolvedPath);
139
- const token = confirmationCache.add("write_file_surgical", resolvedPath, {
140
- symbolName,
141
- newContentFull: result.newContent,
142
- diff,
143
- });
144
- return {
145
- content: [
146
- {
147
- type: "text",
148
- text: `// 🔍 DRY-RUN: Review changes below\n// To apply: confirmationToken: "${token}", confirm: true\n\n${diff}`,
149
- },
150
- ],
151
- };
152
- }
153
- // ─── Handler: insert_symbol ─────────────────────────────────────────
154
- export async function handleInsertSymbol(args) {
155
- const filePath = args.filePath;
156
- const code = args.code;
157
- const anchorSymbol = args.anchorSymbol || null;
158
- const position = args.position || "after";
159
- const className = args.className;
160
- const confirmationToken = args.confirmationToken;
161
- const confirm = args.confirm;
162
- if (!filePath)
163
- return errorResponse("Missing required parameter: filePath");
164
- // PHASE 2
165
- if (confirmationToken && confirm) {
166
- const pending = confirmationCache.consume(confirmationToken);
167
- if (!pending || pending.operation !== "insert_symbol") {
168
- return errorResponse("Invalid or expired confirmation token");
169
- }
170
- const resolvedPath = pending.filePath;
171
- try {
172
- createBackup(resolvedPath);
173
- }
174
- catch (error) {
175
- return errorResponse(`Backup failed: ${error instanceof Error ? error.message : String(error)}`);
176
- }
177
- try {
178
- fs.writeFileSync(resolvedPath, pending.payload.newContentFull, "utf-8");
179
- // Post-write validation
180
- const { validateSyntax } = await import("../utils/syntaxValidator.js");
181
- const validation = await validateSyntax(resolvedPath, pending.payload.newContentFull);
182
- if (!validation.valid) {
183
- restoreBackup(resolvedPath);
184
- const diagnostics = validation.diagnostics?.join("\n") || "";
185
- return errorResponse(`Syntax error after write:\n${validation.error}${diagnostics ? "\n" + diagnostics : ""}`);
186
- }
187
- invalidateFileCache(resolvedPath);
188
- }
189
- catch (error) {
190
- restoreBackup(resolvedPath);
191
- return errorResponse(`Write failed: ${error instanceof Error ? error.message : String(error)}`);
192
- }
193
- return {
194
- content: [
195
- {
196
- type: "text",
197
- text: `// ✅ Code inserted\n// File: ${resolvedPath}\n\n${pending.payload.diff}`,
198
- },
199
- ],
200
- };
201
- }
202
- // PHASE 1
203
- if (!code)
204
- return errorResponse("Missing required parameter: code");
205
- // SECURITY: Use secure validation with project boundary enforcement
206
- const { validateFilePathSecure } = await import("../utils/secureValidation.js");
207
- const validation = validateFilePathSecure(filePath);
208
- if (!validation.valid) {
209
- return errorResponse(validation.error);
210
- }
211
- const resolvedPath = validation.resolvedPath;
212
- const ext = path.extname(resolvedPath).toLowerCase();
213
- if (!WRITABLE_EXTENSIONS.has(ext)) {
214
- return errorResponse(`Unsupported file type: ${ext}`);
215
- }
216
- let fileContent;
217
- try {
218
- fileContent = await fs.promises.readFile(resolvedPath, "utf-8");
219
- }
220
- catch (error) {
221
- return errorResponse(`Read failed: ${error instanceof Error ? error.message : String(error)}`);
222
- }
223
- const result = insertCode(resolvedPath, fileContent, code, anchorSymbol, position, className);
224
- if (!result.success) {
225
- return errorResponse(result.error || "Unknown error");
226
- }
227
- const diff = generateDiff(fileContent, result.newContent, resolvedPath);
228
- const token = confirmationCache.add("insert_symbol", resolvedPath, {
229
- newContentFull: result.newContent,
230
- diff,
231
- anchorSymbol,
232
- position
233
- });
234
- return {
235
- content: [
236
- {
237
- type: "text",
238
- text: `// 🔍 DRY-RUN: Review changes below\n// To apply: confirmationToken: "${token}", confirm: true\n\n${diff}`,
239
- },
240
- ],
241
- };
242
- }
243
- // ─── Handler: rename_symbol ─────────────────────────────────────────
244
- export async function handleRenameSymbol(args) {
245
- const filePath = args.filePath;
246
- const oldName = args.oldName;
247
- const newName = args.newName;
248
- const rootDir = args.rootDir;
249
- const confirmationToken = args.confirmationToken;
250
- const confirm = args.confirm;
251
- if (!filePath)
252
- return errorResponse("Missing required parameter: filePath");
253
- // PHASE 2
254
- if (confirmationToken && confirm) {
255
- const pending = confirmationCache.consume(confirmationToken);
256
- if (!pending || pending.operation !== "rename_symbol") {
257
- return errorResponse("Invalid or expired confirmation token");
258
- }
259
- const results = pending.payload.results;
260
- const transaction = new TransactionManager();
261
- transaction.stageMultiple(results.map((r) => ({
262
- filePath: r.filePath,
263
- newContent: r.newContent
264
- })));
265
- const commitResult = await transaction.commit();
266
- if (!commitResult.success) {
267
- return errorResponse(commitResult.error);
268
- }
269
- for (const res of results) {
270
- invalidateFileCache(res.filePath);
271
- }
272
- return {
273
- content: [{
274
- type: "text",
275
- text: `// ✅ Rename applied\n\n${pending.payload.diff}`,
276
- }],
277
- };
278
- }
279
- // PHASE 1
280
- if (!oldName)
281
- return errorResponse("Missing required parameter: oldName");
282
- if (!newName)
283
- return errorResponse("Missing required parameter: newName");
284
- // Validate symbol names
285
- const oldValidation = validateSymbolName(oldName);
286
- if (!oldValidation.valid) {
287
- return errorResponse(`Invalid oldName: ${oldValidation.error}`);
288
- }
289
- const newValidation = validateSymbolName(newName);
290
- if (!newValidation.valid) {
291
- return errorResponse(`Invalid newName: ${newValidation.error}`);
292
- }
293
- // SECURITY: Use secure validation with project boundary enforcement
294
- const { validateFilePathSecure } = await import("../utils/secureValidation.js");
295
- const validation = validateFilePathSecure(filePath);
296
- if (!validation.valid) {
297
- return errorResponse(validation.error);
298
- }
299
- const resolvedPath = validation.resolvedPath;
300
- // SECURITY: Block cross-file rename for languages without AST support
301
- const ext = path.extname(resolvedPath).toLowerCase();
302
- if (['.dart', '.py', '.pyi'].includes(ext)) {
303
- return errorResponse(`⚠️ Cross-file rename not supported for ${ext} files.\n\n` +
304
- `Reason: No AST parser available for safe refactoring across multiple files.\n` +
305
- `Risk: Regex-based rename may corrupt strings, comments, or unrelated code.\n\n` +
306
- `Recommendation: Use IDE refactoring tools:\n` +
307
- ` • Dart: VS Code with Dart extension (F2 key)\n` +
308
- ` • Python: PyCharm, VS Code with Pylance (F2 key)\n\n` +
309
- `Alternative: Use write_file_surgical to rename within a single file.`);
310
- }
311
- let sourceContent;
312
- try {
313
- sourceContent = await fs.promises.readFile(resolvedPath, "utf-8");
314
- }
315
- catch (error) {
316
- return errorResponse(`Read failed: ${error instanceof Error ? error.message : String(error)}`);
317
- }
318
- const sourceResult = renameInFile(resolvedPath, sourceContent, oldName, newName);
319
- if (!sourceResult.success) {
320
- return errorResponse(sourceResult.error || `Symbol "${oldName}" not found`);
321
- }
322
- const results = [
323
- {
324
- filePath: resolvedPath,
325
- oldContent: sourceContent,
326
- newContent: sourceResult.newContent,
327
- },
328
- ];
329
- const projectRoot = rootDir ? path.resolve(rootDir) : findProjectRoot(resolvedPath);
330
- if (projectRoot) {
331
- const ignoreManager = new IgnoreManager(projectRoot);
332
- const allFiles = await ignoreManager.walkDirectoryAsync();
333
- const { processBatched } = await import("../utils/arrayUtils.js");
334
- const dependentResults = await processBatched(allFiles.filter(f => path.resolve(f) !== resolvedPath), async (dependentFile) => {
335
- const ext = path.extname(dependentFile).toLowerCase();
336
- if (!IMPORTABLE_EXTENSIONS.has(ext))
337
- return null;
338
- let depContent;
339
- try {
340
- depContent = await fs.promises.readFile(dependentFile, "utf-8");
341
- }
342
- catch {
343
- return null;
344
- }
345
- const escaped = oldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
346
- const regex = new RegExp(`(?<=^|[^a-zA-Z0-9_$])(${escaped})(?=[^a-zA-Z0-9_$]|$)`);
347
- if (!regex.test(depContent))
348
- return null;
349
- const depResult = renameReferencesInFile(dependentFile, depContent, oldName, newName);
350
- if (depResult.success && depResult.newContent !== depContent) {
351
- return {
352
- filePath: path.resolve(dependentFile),
353
- oldContent: depContent,
354
- newContent: depResult.newContent,
355
- };
356
- }
357
- return null;
358
- }, 50);
359
- results.push(...dependentResults.filter(r => r !== null));
360
- }
361
- const multiDiff = generateMultiFileDiff(results);
362
- const token = confirmationCache.add("rename_symbol", resolvedPath, {
363
- results,
364
- diff: multiDiff
365
- });
366
- return {
367
- content: [{
368
- type: "text",
369
- text: `// 🔍 DRY-RUN: Review changes below\n// To apply: confirmationToken: "${token}", confirm: true\n\n${multiDiff}`,
370
- }],
371
- };
372
- }
373
- // ─── Handler: remove_symbol ─────────────────────────────────────────
374
- export async function handleRemoveSymbol(args) {
375
- const filePath = args.filePath;
376
- const symbolName = args.symbolName;
377
- const className = args.className;
378
- const force = args.force || false;
379
- const confirmationToken = args.confirmationToken;
380
- const confirm = args.confirm;
381
- if (!filePath)
382
- return errorResponse("Missing required parameter: filePath");
383
- // PHASE 2
384
- if (confirmationToken && confirm) {
385
- const pending = confirmationCache.consume(confirmationToken);
386
- if (!pending || pending.operation !== "remove_symbol") {
387
- return errorResponse("Invalid or expired confirmation token");
388
- }
389
- const resolvedPath = pending.filePath;
390
- try {
391
- createBackup(resolvedPath);
392
- }
393
- catch (e) { }
394
- try {
395
- fs.writeFileSync(resolvedPath, pending.payload.newContentFull, "utf-8");
396
- // Post-write validation
397
- const { validateSyntax } = await import("../utils/syntaxValidator.js");
398
- const validation = await validateSyntax(resolvedPath, pending.payload.newContentFull);
399
- if (!validation.valid) {
400
- restoreBackup(resolvedPath);
401
- const diagnostics = validation.diagnostics?.join("\n") || "";
402
- return errorResponse(`Syntax error after write:\n${validation.error}${diagnostics ? "\n" + diagnostics : ""}`);
403
- }
404
- invalidateFileCache(resolvedPath);
405
- }
406
- catch (error) {
407
- restoreBackup(resolvedPath);
408
- return errorResponse(`Write failed: ${error instanceof Error ? error.message : String(error)}`);
409
- }
410
- return {
411
- content: [{
412
- type: "text",
413
- text: `// ✅ Symbol "${pending.payload.symbolName}" removed\n\n${pending.payload.diff}`,
414
- }],
415
- };
416
- }
417
- if (!symbolName)
418
- return errorResponse("Missing required parameter: symbolName");
419
- // Validate symbol name
420
- const symbolValidation = validateSymbolName(symbolName);
421
- if (!symbolValidation.valid) {
422
- return errorResponse(symbolValidation.error);
423
- }
424
- // SECURITY: Use secure validation with project boundary enforcement
425
- const { validateFilePathSecure } = await import("../utils/secureValidation.js");
426
- const validation = validateFilePathSecure(filePath);
427
- if (!validation.valid) {
428
- return errorResponse(validation.error);
429
- }
430
- const resolvedPath = validation.resolvedPath;
431
- let fileContent;
432
- try {
433
- fileContent = await fs.promises.readFile(resolvedPath, "utf-8");
434
- }
435
- catch (error) {
436
- return errorResponse(`Read failed: ${error instanceof Error ? error.message : String(error)}`);
437
- }
438
- // Safety check
439
- if (!force) {
440
- const projectRoot = findProjectRoot(resolvedPath);
441
- if (projectRoot) {
442
- const ignoreManager = new IgnoreManager(projectRoot);
443
- const allFiles = await ignoreManager.walkDirectoryAsync();
444
- for (const f of allFiles) {
445
- if (path.resolve(f) === resolvedPath)
446
- continue;
447
- const fExt = path.extname(f).toLowerCase();
448
- if (!IMPORTABLE_EXTENSIONS.has(fExt))
449
- continue;
450
- try {
451
- const fContent = await fs.promises.readFile(f, "utf-8");
452
- const isUsed = await checkSymbolUsage(f, fContent, symbolName);
453
- if (isUsed) {
454
- return errorResponse(`Symbol "${symbolName}" used in ${path.relative(projectRoot, f)}. Use force: true to delete.`);
455
- }
456
- }
457
- catch { }
458
- }
459
- }
460
- }
461
- const result = removeSymbolFromFile(resolvedPath, fileContent, symbolName, className);
462
- if (!result.success) {
463
- return errorResponse(result.error || "Unknown error");
464
- }
465
- const diff = generateDiff(fileContent, result.newContent, resolvedPath);
466
- const token = confirmationCache.add("remove_symbol", resolvedPath, {
467
- symbolName,
468
- newContentFull: result.newContent,
469
- diff
470
- });
471
- return {
472
- content: [{
473
- type: "text",
474
- text: `// 🔍 DRY-RUN: Review changes below\n// To apply: confirmationToken: "${token}", confirm: true\n\n${diff}`,
475
- }],
476
- };
477
- }
478
- // ─── Utility Functions ──────────────────────────────────────────────
479
- function errorResponse(message) {
480
- return {
481
- content: [{ type: "text", text: `❌ ${message}` }],
482
- isError: true,
483
- };
484
- }
485
- function findProjectRoot(filePath) {
486
- const ROOT_MARKERS = ["package.json", ".git", "pubspec.yaml"];
487
- let current = path.dirname(path.resolve(filePath));
488
- const root = path.parse(current).root;
489
- while (current !== root) {
490
- for (const marker of ROOT_MARKERS) {
491
- if (fs.existsSync(path.join(current, marker))) {
492
- return current;
493
- }
494
- }
495
- current = path.dirname(current);
496
- }
497
- return undefined;
498
- }
499
- //# sourceMappingURL=writeHandlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"writeHandlers.js","sourceRoot":"","sources":["../../../src/handlers/writeHandlers.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- /**
2
- * read_file_lines — Read specific line ranges from a file
3
- *
4
- * Efficiently reads only the requested lines without loading the entire file into memory.
5
- * Supports reading by exact line range or around a pattern match.
6
- */
7
- export interface ReadFileLinesArgs {
8
- filePath: string;
9
- startLine?: number;
10
- endLine?: number;
11
- aroundPattern?: string;
12
- contextLines?: number;
13
- }
14
- export interface ReadFileLinesResult {
15
- success: boolean;
16
- content?: string;
17
- error?: string;
18
- lineRange?: {
19
- start: number;
20
- end: number;
21
- };
22
- }
23
- /**
24
- * Read specific lines from a file
25
- */
26
- export declare function readFileLines(args: ReadFileLinesArgs): ReadFileLinesResult;
@@ -1,77 +0,0 @@
1
- /**
2
- * read_file_lines — Read specific line ranges from a file
3
- *
4
- * Efficiently reads only the requested lines without loading the entire file into memory.
5
- * Supports reading by exact line range or around a pattern match.
6
- */
7
- import * as fs from "node:fs";
8
- import * as path from "node:path";
9
- /**
10
- * Read specific lines from a file
11
- */
12
- export function readFileLines(args) {
13
- const { filePath, startLine, endLine, aroundPattern, contextLines = 5 } = args;
14
- const resolvedPath = path.resolve(filePath);
15
- if (!fs.existsSync(resolvedPath)) {
16
- return {
17
- success: false,
18
- error: `File not found: ${resolvedPath}`,
19
- };
20
- }
21
- let content;
22
- try {
23
- content = fs.readFileSync(resolvedPath, "utf-8");
24
- }
25
- catch (error) {
26
- return {
27
- success: false,
28
- error: `Failed to read file: ${error instanceof Error ? error.message : String(error)}`,
29
- };
30
- }
31
- const lines = content.split("\n");
32
- const totalLines = lines.length;
33
- // Mode 1: Exact line range
34
- if (startLine !== undefined && endLine !== undefined) {
35
- if (startLine < 1 || endLine < 1 || startLine > totalLines || endLine > totalLines) {
36
- return {
37
- success: false,
38
- error: `Invalid line range: ${startLine}-${endLine}. File has ${totalLines} lines.`,
39
- };
40
- }
41
- if (startLine > endLine) {
42
- return {
43
- success: false,
44
- error: `startLine (${startLine}) must be <= endLine (${endLine})`,
45
- };
46
- }
47
- const selectedLines = lines.slice(startLine - 1, endLine);
48
- return {
49
- success: true,
50
- content: selectedLines.join("\n"),
51
- lineRange: { start: startLine, end: endLine },
52
- };
53
- }
54
- // Mode 2: Around pattern
55
- if (aroundPattern) {
56
- const matchIndex = lines.findIndex((line) => line.includes(aroundPattern));
57
- if (matchIndex === -1) {
58
- return {
59
- success: false,
60
- error: `Pattern "${aroundPattern}" not found in file`,
61
- };
62
- }
63
- const start = Math.max(0, matchIndex - contextLines);
64
- const end = Math.min(totalLines - 1, matchIndex + contextLines);
65
- const selectedLines = lines.slice(start, end + 1);
66
- return {
67
- success: true,
68
- content: selectedLines.join("\n"),
69
- lineRange: { start: start + 1, end: end + 1 },
70
- };
71
- }
72
- return {
73
- success: false,
74
- error: "Must provide either (startLine + endLine) or aroundPattern",
75
- };
76
- }
77
- //# sourceMappingURL=readFileLines.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"readFileLines.js","sourceRoot":"","sources":["../../../src/tools/readFileLines.ts"],"names":[],"mappings":"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"}