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.
- package/CHANGELOG.md +92 -260
- package/README.md +304 -298
- package/dist/src/core/engine.d.ts +21 -0
- package/dist/src/core/engine.js +68 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/validator.d.ts +15 -0
- package/dist/src/core/validator.js +44 -0
- package/dist/src/core/validator.js.map +1 -0
- package/dist/src/index.d.ts +7 -11
- package/dist/src/index.js +182 -397
- package/dist/src/index.js.map +1 -1
- package/dist/src/operations/write.d.ts +51 -0
- package/dist/src/operations/write.js +169 -0
- package/dist/src/operations/write.js.map +1 -0
- package/dist/src/parsers/base.d.ts +28 -0
- package/dist/src/parsers/base.js +27 -0
- package/dist/src/parsers/base.js.map +1 -0
- package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
- package/dist/src/parsers/dartTreeSitter.js +91 -0
- package/dist/src/parsers/dartTreeSitter.js.map +1 -0
- package/dist/src/parsers/php.d.ts +12 -0
- package/dist/src/parsers/php.js +86 -0
- package/dist/src/parsers/php.js.map +1 -0
- package/dist/src/parsers/python.d.ts +12 -0
- package/dist/src/parsers/python.js +86 -0
- package/dist/src/parsers/python.js.map +1 -0
- package/dist/src/parsers/registry.d.ts +15 -0
- package/dist/src/parsers/registry.js +70 -0
- package/dist/src/parsers/registry.js.map +1 -0
- package/dist/src/parsers/typescript.d.ts +13 -0
- package/dist/src/parsers/typescript.js +98 -0
- package/dist/src/parsers/typescript.js.map +1 -0
- package/llms.txt +246 -236
- package/mcp-code-context-3.0.2.tgz +0 -0
- package/package.json +59 -57
- package/tsconfig.tests.json +27 -0
- package/.io/RULES.md +0 -12
- package/CONTRIBUTING.md +0 -243
- package/TROUBLESHOOTING.md +0 -38
- package/dist/src/ast/dartCompressor.d.ts +0 -27
- package/dist/src/ast/dartCompressor.js +0 -859
- package/dist/src/ast/dartCompressor.js.map +0 -1
- package/dist/src/ast/phpCompressor.d.ts +0 -24
- package/dist/src/ast/phpCompressor.js +0 -634
- package/dist/src/ast/phpCompressor.js.map +0 -1
- package/dist/src/ast/semanticCompressor.d.ts +0 -22
- package/dist/src/ast/semanticCompressor.js +0 -677
- package/dist/src/ast/semanticCompressor.js.map +0 -1
- package/dist/src/ast/writers/dartWriter.d.ts +0 -37
- package/dist/src/ast/writers/dartWriter.js +0 -544
- package/dist/src/ast/writers/dartWriter.js.map +0 -1
- package/dist/src/ast/writers/phpWriter.d.ts +0 -37
- package/dist/src/ast/writers/phpWriter.js +0 -411
- package/dist/src/ast/writers/phpWriter.js.map +0 -1
- package/dist/src/ast/writers/pyWriter.d.ts +0 -37
- package/dist/src/ast/writers/pyWriter.js +0 -355
- package/dist/src/ast/writers/pyWriter.js.map +0 -1
- package/dist/src/ast/writers/safeRename.d.ts +0 -14
- package/dist/src/ast/writers/safeRename.js +0 -258
- package/dist/src/ast/writers/safeRename.js.map +0 -1
- package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
- package/dist/src/ast/writers/symbolWriter.js +0 -174
- package/dist/src/ast/writers/symbolWriter.js.map +0 -1
- package/dist/src/ast/writers/tsWriter.d.ts +0 -38
- package/dist/src/ast/writers/tsWriter.js +0 -344
- package/dist/src/ast/writers/tsWriter.js.map +0 -1
- package/dist/src/cache/astCache.d.ts +0 -39
- package/dist/src/cache/astCache.js +0 -169
- package/dist/src/cache/astCache.js.map +0 -1
- package/dist/src/handlers/readHandlers.d.ts +0 -70
- package/dist/src/handlers/readHandlers.js +0 -455
- package/dist/src/handlers/readHandlers.js.map +0 -1
- package/dist/src/handlers/utilHandlers.d.ts +0 -31
- package/dist/src/handlers/utilHandlers.js +0 -69
- package/dist/src/handlers/utilHandlers.js.map +0 -1
- package/dist/src/handlers/writeHandlers.d.ts +0 -57
- package/dist/src/handlers/writeHandlers.js +0 -499
- package/dist/src/handlers/writeHandlers.js.map +0 -1
- package/dist/src/tools/readFileLines.d.ts +0 -26
- package/dist/src/tools/readFileLines.js +0 -77
- package/dist/src/tools/readFileLines.js.map +0 -1
- package/dist/src/tools/searchCodePattern.d.ts +0 -37
- package/dist/src/tools/searchCodePattern.js +0 -144
- package/dist/src/tools/searchCodePattern.js.map +0 -1
- package/dist/src/utils/arrayUtils.d.ts +0 -12
- package/dist/src/utils/arrayUtils.js +0 -27
- package/dist/src/utils/arrayUtils.js.map +0 -1
- package/dist/src/utils/backupManager.d.ts +0 -31
- package/dist/src/utils/backupManager.js +0 -124
- package/dist/src/utils/backupManager.js.map +0 -1
- package/dist/src/utils/confirmationCache.d.ts +0 -16
- package/dist/src/utils/confirmationCache.js +0 -40
- package/dist/src/utils/confirmationCache.js.map +0 -1
- package/dist/src/utils/constants.d.ts +0 -46
- package/dist/src/utils/constants.js +0 -112
- package/dist/src/utils/constants.js.map +0 -1
- package/dist/src/utils/dependencyChecker.d.ts +0 -1
- package/dist/src/utils/dependencyChecker.js +0 -55
- package/dist/src/utils/dependencyChecker.js.map +0 -1
- package/dist/src/utils/diffEngine.d.ts +0 -21
- package/dist/src/utils/diffEngine.js +0 -163
- package/dist/src/utils/diffEngine.js.map +0 -1
- package/dist/src/utils/fuzzyMatch.d.ts +0 -8
- package/dist/src/utils/fuzzyMatch.js +0 -70
- package/dist/src/utils/fuzzyMatch.js.map +0 -1
- package/dist/src/utils/ignoreManager.d.ts +0 -29
- package/dist/src/utils/ignoreManager.js +0 -144
- package/dist/src/utils/ignoreManager.js.map +0 -1
- package/dist/src/utils/normalization.d.ts +0 -49
- package/dist/src/utils/normalization.js +0 -173
- package/dist/src/utils/normalization.js.map +0 -1
- package/dist/src/utils/projectRoot.d.ts +0 -17
- package/dist/src/utils/projectRoot.js +0 -42
- package/dist/src/utils/projectRoot.js.map +0 -1
- package/dist/src/utils/secureValidation.d.ts +0 -15
- package/dist/src/utils/secureValidation.js +0 -41
- package/dist/src/utils/secureValidation.js.map +0 -1
- package/dist/src/utils/syntaxValidator.d.ts +0 -15
- package/dist/src/utils/syntaxValidator.js +0 -218
- package/dist/src/utils/syntaxValidator.js.map +0 -1
- package/dist/src/utils/transactionManager.d.ts +0 -46
- package/dist/src/utils/transactionManager.js +0 -123
- package/dist/src/utils/transactionManager.js.map +0 -1
- package/dist/src/utils/validation.d.ts +0 -87
- package/dist/src/utils/validation.js +0 -231
- package/dist/src/utils/validation.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -300
- 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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"}
|