mcp-code-context 2.2.0 → 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.
- package/.io/RULES.md +12 -0
- package/CHANGELOG.md +88 -1
- package/README.md +27 -0
- package/RELEASE_NOTES_v2.3.0.md +228 -0
- package/RELEASE_NOTES_v2.3.1.md +110 -0
- package/dist/src/ast/writers/safeRename.d.ts +14 -0
- package/dist/src/ast/writers/safeRename.js +258 -0
- package/dist/src/ast/writers/safeRename.js.map +1 -0
- package/dist/src/ast/writers/symbolWriter.d.ts +2 -0
- package/dist/src/ast/writers/symbolWriter.js +9 -14
- package/dist/src/ast/writers/symbolWriter.js.map +1 -1
- package/dist/src/cache/astCache.d.ts +33 -0
- package/dist/src/cache/astCache.js +113 -0
- package/dist/src/cache/astCache.js.map +1 -0
- package/dist/src/handlers/readHandlers.d.ts +70 -0
- package/dist/src/handlers/readHandlers.js +431 -0
- package/dist/src/handlers/readHandlers.js.map +1 -0
- package/dist/src/handlers/utilHandlers.d.ts +31 -0
- package/dist/src/handlers/utilHandlers.js +69 -0
- package/dist/src/handlers/utilHandlers.js.map +1 -0
- package/dist/src/handlers/writeHandlers.d.ts +57 -0
- package/dist/src/handlers/writeHandlers.js +475 -0
- package/dist/src/handlers/writeHandlers.js.map +1 -0
- package/dist/src/index.d.ts +6 -143
- package/dist/src/index.js +77 -1091
- package/dist/src/index.js.map +1 -1
- package/dist/src/utils/arrayUtils.d.ts +12 -0
- package/dist/src/utils/arrayUtils.js +27 -0
- package/dist/src/utils/arrayUtils.js.map +1 -0
- package/dist/src/utils/constants.d.ts +46 -0
- package/dist/src/utils/constants.js +112 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/ignoreManager.d.ts +8 -0
- package/dist/src/utils/ignoreManager.js +49 -0
- package/dist/src/utils/ignoreManager.js.map +1 -1
- package/dist/src/utils/normalization.d.ts +49 -0
- package/dist/src/utils/normalization.js +173 -0
- package/dist/src/utils/normalization.js.map +1 -0
- package/dist/src/utils/projectRoot.d.ts +12 -5
- package/dist/src/utils/projectRoot.js +22 -20
- package/dist/src/utils/projectRoot.js.map +1 -1
- package/dist/src/utils/secureValidation.d.ts +15 -0
- package/dist/src/utils/secureValidation.js +41 -0
- package/dist/src/utils/secureValidation.js.map +1 -0
- package/dist/src/utils/transactionManager.d.ts +45 -0
- package/dist/src/utils/transactionManager.js +102 -0
- package/dist/src/utils/transactionManager.js.map +1 -0
- package/dist/src/utils/validation.d.ts +87 -0
- package/dist/src/utils/validation.js +231 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/docs/ARCHITECTURE.md +300 -0
- package/docs/architecture/ADR-001-modular-handlers.md +119 -0
- package/package.json +5 -5
- package/AGENT_INSTRUCTIONS.md +0 -135
- package/DEPLOYMENT_INSTRUCTIONS.md +0 -110
- package/MEJORAS_PROPUESTAS.md +0 -324
- package/dist/src/tests/test-confirmation-flow.d.ts +0 -1
- package/dist/src/tests/test-confirmation-flow.js +0 -43
- package/dist/src/tests/test-confirmation-flow.js.map +0 -1
- package/dist/tests/debug-replace.d.ts +0 -1
- package/dist/tests/debug-replace.js +0 -17
- package/dist/tests/debug-replace.js.map +0 -1
- package/dist/tests/test-backup-system.d.ts +0 -7
- package/dist/tests/test-backup-system.js +0 -152
- package/dist/tests/test-backup-system.js.map +0 -1
- package/dist/tests/test-confirmation-flow.d.ts +0 -1
- package/dist/tests/test-confirmation-flow.js +0 -43
- package/dist/tests/test-confirmation-flow.js.map +0 -1
- package/dist/tests/test-dart.d.ts +0 -1
- package/dist/tests/test-dart.js +0 -242
- package/dist/tests/test-dart.js.map +0 -1
- package/dist/tests/test-new-tools.d.ts +0 -4
- package/dist/tests/test-new-tools.js +0 -147
- package/dist/tests/test-new-tools.js.map +0 -1
- package/dist/tests/test-php-ast.d.ts +0 -1
- package/dist/tests/test-php-ast.js +0 -152
- package/dist/tests/test-php-ast.js.map +0 -1
- package/dist/tests/test-php.d.ts +0 -1
- package/dist/tests/test-php.js +0 -234
- package/dist/tests/test-php.js.map +0 -1
- package/dist/tests/test-smoke.d.ts +0 -5
- package/dist/tests/test-smoke.js +0 -83
- package/dist/tests/test-smoke.js.map +0 -1
- package/dist/tests/writers/test-crlf-handling.d.ts +0 -4
- package/dist/tests/writers/test-crlf-handling.js +0 -73
- package/dist/tests/writers/test-crlf-handling.js.map +0 -1
- package/dist/tests/writers/test-write-smoke.d.ts +0 -9
- package/dist/tests/writers/test-write-smoke.js +0 -346
- package/dist/tests/writers/test-write-smoke.js.map +0 -1
- package/src/ast/dartCompressor.ts +0 -1013
- package/src/ast/phpCompressor.ts +0 -814
- package/src/ast/semanticCompressor.ts +0 -808
- package/src/ast/writers/dartWriter.ts +0 -648
- package/src/ast/writers/phpWriter.ts +0 -508
- package/src/ast/writers/pyWriter.ts +0 -446
- package/src/ast/writers/symbolWriter.ts +0 -277
- package/src/ast/writers/tsWriter.ts +0 -418
- package/src/index.ts +0 -1784
- package/src/tools/readFileLines.ts +0 -104
- package/src/tools/searchCodePattern.ts +0 -129
- package/src/utils/backupManager.ts +0 -141
- package/src/utils/confirmationCache.ts +0 -61
- package/src/utils/diffEngine.ts +0 -223
- package/src/utils/fuzzyMatch.ts +0 -86
- package/src/utils/ignoreManager.ts +0 -144
- package/src/utils/projectRoot.ts +0 -44
- package/tests/test-backup-system.ts +0 -174
- package/tests/test-confirmation-flow.ts +0 -49
- package/tests/test-dart.d.ts +0 -1
- package/tests/test-dart.js +0 -209
- package/tests/test-dart.js.map +0 -1
- package/tests/test-dart.ts +0 -265
- package/tests/test-new-tools.ts +0 -165
- package/tests/test-php-ast.d.ts +0 -1
- package/tests/test-php-ast.js +0 -152
- package/tests/test-php-ast.js.map +0 -1
- package/tests/test-php-ast.ts +0 -155
- package/tests/test-php.d.ts +0 -1
- package/tests/test-php.js +0 -234
- package/tests/test-php.js.map +0 -1
- package/tests/test-php.ts +0 -261
- package/tests/test-smoke.d.ts +0 -5
- package/tests/test-smoke.js +0 -83
- package/tests/test-smoke.js.map +0 -1
- package/tests/test-smoke.ts +0 -93
- package/tests/writers/test-crlf-handling.ts +0 -100
- package/tests/writers/test-write-smoke.ts +0 -568
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST-Aware Safe Rename Module
|
|
3
|
+
* Replaces dangerous regex-based renaming with language-specific AST/tokenizer approaches
|
|
4
|
+
*/
|
|
5
|
+
import * as ts from "typescript";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import { createRequire } from "module";
|
|
8
|
+
/**
|
|
9
|
+
* Main entry point for safe renaming across all supported languages
|
|
10
|
+
*/
|
|
11
|
+
export function safeRenameReferences(filePath, content, oldName, newName) {
|
|
12
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
13
|
+
try {
|
|
14
|
+
switch (ext) {
|
|
15
|
+
case ".ts":
|
|
16
|
+
case ".tsx":
|
|
17
|
+
case ".js":
|
|
18
|
+
case ".jsx":
|
|
19
|
+
case ".mjs":
|
|
20
|
+
case ".cjs":
|
|
21
|
+
return renameTypeScript(content, oldName, newName);
|
|
22
|
+
case ".php":
|
|
23
|
+
return renamePHP(content, oldName, newName);
|
|
24
|
+
case ".dart":
|
|
25
|
+
return renameDart(content, oldName, newName);
|
|
26
|
+
case ".py":
|
|
27
|
+
return renamePython(content, oldName, newName);
|
|
28
|
+
default:
|
|
29
|
+
// Fallback to conservative token-based approach
|
|
30
|
+
return renameGeneric(content, oldName, newName);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
newContent: content,
|
|
37
|
+
symbolsAffected: [],
|
|
38
|
+
error: error instanceof Error ? error.message : String(error)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* TypeScript/JavaScript: Use TypeScript compiler API
|
|
44
|
+
*/
|
|
45
|
+
function renameTypeScript(content, oldName, newName) {
|
|
46
|
+
const sourceFile = ts.createSourceFile("temp.ts", content, ts.ScriptTarget.Latest, true);
|
|
47
|
+
const replacements = [];
|
|
48
|
+
function visit(node) {
|
|
49
|
+
// Only rename identifiers that are actual references (not in strings/comments)
|
|
50
|
+
if (ts.isIdentifier(node) && node.text === oldName) {
|
|
51
|
+
// Verify it's not part of a string literal or comment
|
|
52
|
+
const parent = node.parent;
|
|
53
|
+
if (!ts.isStringLiteral(parent) &&
|
|
54
|
+
!ts.isNoSubstitutionTemplateLiteral(parent) &&
|
|
55
|
+
!ts.isTemplateHead(parent) &&
|
|
56
|
+
!ts.isTemplateMiddle(parent) &&
|
|
57
|
+
!ts.isTemplateTail(parent)) {
|
|
58
|
+
replacements.push({ start: node.getStart(), end: node.getEnd() });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
ts.forEachChild(node, visit);
|
|
62
|
+
}
|
|
63
|
+
visit(sourceFile);
|
|
64
|
+
if (replacements.length === 0) {
|
|
65
|
+
return { success: true, newContent: content, symbolsAffected: [] };
|
|
66
|
+
}
|
|
67
|
+
// Apply replacements in reverse order to maintain positions
|
|
68
|
+
let result = content;
|
|
69
|
+
for (let i = replacements.length - 1; i >= 0; i--) {
|
|
70
|
+
const { start, end } = replacements[i];
|
|
71
|
+
result = result.slice(0, start) + newName + result.slice(end);
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
success: true,
|
|
75
|
+
newContent: result,
|
|
76
|
+
symbolsAffected: [oldName]
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* PHP: Use php-parser AST
|
|
81
|
+
*/
|
|
82
|
+
function renamePHP(content, oldName, newName) {
|
|
83
|
+
try {
|
|
84
|
+
const require = createRequire(import.meta.url);
|
|
85
|
+
const phpParser = require("php-parser");
|
|
86
|
+
const parser = new phpParser.Engine({
|
|
87
|
+
parser: { extractDoc: true, php7: true, locations: true },
|
|
88
|
+
ast: { withPositions: true }
|
|
89
|
+
});
|
|
90
|
+
const ast = parser.parseCode(content);
|
|
91
|
+
const replacements = [];
|
|
92
|
+
function traverse(node) {
|
|
93
|
+
if (!node || typeof node !== "object")
|
|
94
|
+
return;
|
|
95
|
+
// Rename identifiers (variables, functions, classes)
|
|
96
|
+
if (node.kind === "identifier" && node.name === oldName) {
|
|
97
|
+
if (node.loc) {
|
|
98
|
+
replacements.push({
|
|
99
|
+
start: node.loc.start.offset,
|
|
100
|
+
end: node.loc.end.offset
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Traverse children
|
|
105
|
+
for (const key in node) {
|
|
106
|
+
if (key === "loc" || key === "kind")
|
|
107
|
+
continue;
|
|
108
|
+
const child = node[key];
|
|
109
|
+
if (Array.isArray(child)) {
|
|
110
|
+
child.forEach(traverse);
|
|
111
|
+
}
|
|
112
|
+
else if (typeof child === "object") {
|
|
113
|
+
traverse(child);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
traverse(ast);
|
|
118
|
+
if (replacements.length === 0) {
|
|
119
|
+
return { success: true, newContent: content, symbolsAffected: [] };
|
|
120
|
+
}
|
|
121
|
+
// Apply replacements in reverse
|
|
122
|
+
let result = content;
|
|
123
|
+
for (let i = replacements.length - 1; i >= 0; i--) {
|
|
124
|
+
const { start, end } = replacements[i];
|
|
125
|
+
result = result.slice(0, start) + newName + result.slice(end);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
success: true,
|
|
129
|
+
newContent: result,
|
|
130
|
+
symbolsAffected: [oldName]
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
// Fallback to generic if PHP parsing fails
|
|
135
|
+
return renameGeneric(content, oldName, newName);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Dart: Token-based approach (no full AST parser available)
|
|
140
|
+
* Skips strings and comments
|
|
141
|
+
*
|
|
142
|
+
* LIMITATION: This is a best-effort approach. For production use,
|
|
143
|
+
* consider using dart_style or analyzer package via subprocess.
|
|
144
|
+
*/
|
|
145
|
+
function renameDart(content, oldName, newName) {
|
|
146
|
+
// FALLBACK: Return unchanged to avoid corruption
|
|
147
|
+
// Real implementation requires dart analyzer
|
|
148
|
+
return {
|
|
149
|
+
success: false,
|
|
150
|
+
newContent: content,
|
|
151
|
+
symbolsAffected: [],
|
|
152
|
+
error: "Dart rename requires manual review. Use IDE refactoring tools."
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Python: Token-based approach
|
|
157
|
+
* Skips strings, comments, and respects indentation
|
|
158
|
+
*
|
|
159
|
+
* LIMITATION: This is a best-effort approach. For production use,
|
|
160
|
+
* consider using libcst or rope library via subprocess.
|
|
161
|
+
*/
|
|
162
|
+
function renamePython(content, oldName, newName) {
|
|
163
|
+
// FALLBACK: Return unchanged to avoid corruption
|
|
164
|
+
// Real implementation requires libcst or rope
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
newContent: content,
|
|
168
|
+
symbolsAffected: [],
|
|
169
|
+
error: "Python rename requires manual review. Use IDE refactoring tools."
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Generic fallback: Conservative token-based renaming
|
|
174
|
+
*/
|
|
175
|
+
function renameGeneric(content, oldName, newName) {
|
|
176
|
+
return renameTokenBased(content, oldName, newName, {
|
|
177
|
+
singleLineComment: "//",
|
|
178
|
+
multiLineCommentStart: "/*",
|
|
179
|
+
multiLineCommentEnd: "*/",
|
|
180
|
+
stringDelimiters: ['"', "'", "`"],
|
|
181
|
+
identifierPattern: /[a-zA-Z_$][a-zA-Z0-9_$]*/g
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function renameTokenBased(content, oldName, newName, config) {
|
|
185
|
+
const lines = content.split("\n");
|
|
186
|
+
const result = [];
|
|
187
|
+
let inMultiLineComment = false;
|
|
188
|
+
let changed = false;
|
|
189
|
+
for (let line of lines) {
|
|
190
|
+
let processedLine = "";
|
|
191
|
+
let i = 0;
|
|
192
|
+
while (i < line.length) {
|
|
193
|
+
// Check for multi-line comment start
|
|
194
|
+
if (!inMultiLineComment && line.slice(i).startsWith(config.multiLineCommentStart)) {
|
|
195
|
+
inMultiLineComment = true;
|
|
196
|
+
processedLine += config.multiLineCommentStart;
|
|
197
|
+
i += config.multiLineCommentStart.length;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// Check for multi-line comment end
|
|
201
|
+
if (inMultiLineComment && line.slice(i).startsWith(config.multiLineCommentEnd)) {
|
|
202
|
+
inMultiLineComment = false;
|
|
203
|
+
processedLine += config.multiLineCommentEnd;
|
|
204
|
+
i += config.multiLineCommentEnd.length;
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
// Skip if inside multi-line comment
|
|
208
|
+
if (inMultiLineComment) {
|
|
209
|
+
processedLine += line[i];
|
|
210
|
+
i++;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
// Check for single-line comment
|
|
214
|
+
if (line.slice(i).startsWith(config.singleLineComment)) {
|
|
215
|
+
processedLine += line.slice(i);
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
// Check for string literals
|
|
219
|
+
let inString = false;
|
|
220
|
+
for (const delim of config.stringDelimiters) {
|
|
221
|
+
if (line.slice(i).startsWith(delim)) {
|
|
222
|
+
const endIndex = line.indexOf(delim, i + delim.length);
|
|
223
|
+
if (endIndex !== -1) {
|
|
224
|
+
processedLine += line.slice(i, endIndex + delim.length);
|
|
225
|
+
i = endIndex + delim.length;
|
|
226
|
+
inString = true;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (inString)
|
|
232
|
+
continue;
|
|
233
|
+
// Check for identifier match
|
|
234
|
+
const remaining = line.slice(i);
|
|
235
|
+
const match = remaining.match(config.identifierPattern);
|
|
236
|
+
if (match && match.index === 0 && match[0] === oldName) {
|
|
237
|
+
// Verify word boundaries
|
|
238
|
+
const before = i > 0 ? line[i - 1] : " ";
|
|
239
|
+
const after = i + oldName.length < line.length ? line[i + oldName.length] : " ";
|
|
240
|
+
if (!/[a-zA-Z0-9_$]/.test(before) && !/[a-zA-Z0-9_$]/.test(after)) {
|
|
241
|
+
processedLine += newName;
|
|
242
|
+
i += oldName.length;
|
|
243
|
+
changed = true;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
processedLine += line[i];
|
|
248
|
+
i++;
|
|
249
|
+
}
|
|
250
|
+
result.push(processedLine);
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
success: true,
|
|
254
|
+
newContent: result.join("\n"),
|
|
255
|
+
symbolsAffected: changed ? [oldName] : []
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=safeRename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeRename.js","sourceRoot":"","sources":["../../../../src/ast/writers/safeRename.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,8 @@ export declare function renameInFile(filePath: string, content: string, oldName:
|
|
|
49
49
|
* Renames all whole-word occurrences of a symbol in a file.
|
|
50
50
|
* UNLIKE renameInFile, this does NOT check for the symbol definition.
|
|
51
51
|
* Used for updating references in dependent files.
|
|
52
|
+
*
|
|
53
|
+
* NOW USES AST-AWARE SAFE RENAMING (v2.3.0+)
|
|
52
54
|
*/
|
|
53
55
|
export declare function renameReferencesInFile(filePath: string, content: string, oldName: string, newName: string): WriteResult;
|
|
54
56
|
/**
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* - Python (.py, .pyi)
|
|
12
12
|
*/
|
|
13
13
|
import * as path from "node:path";
|
|
14
|
+
import { safeRenameReferences } from "./safeRename.js";
|
|
14
15
|
import { replaceTSSymbol, insertTSCode, renameTSSymbol, removeTSSymbol, } from "./tsWriter.js";
|
|
15
16
|
import { replacePHPSymbol, insertPHPCode, renamePHPSymbol, removePHPSymbol, } from "./phpWriter.js";
|
|
16
17
|
import { replaceDartSymbol, insertDartCode, renameDartSymbol, removeDartSymbol, } from "./dartWriter.js";
|
|
@@ -127,23 +128,17 @@ export function renameInFile(filePath, content, oldName, newName) {
|
|
|
127
128
|
* Renames all whole-word occurrences of a symbol in a file.
|
|
128
129
|
* UNLIKE renameInFile, this does NOT check for the symbol definition.
|
|
129
130
|
* Used for updating references in dependent files.
|
|
131
|
+
*
|
|
132
|
+
* NOW USES AST-AWARE SAFE RENAMING (v2.3.0+)
|
|
130
133
|
*/
|
|
131
134
|
export function renameReferencesInFile(filePath, content, oldName, newName) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// where we ALREADY know via import analysis that the file depends on this symbol.
|
|
135
|
-
// Scape regex special chars
|
|
136
|
-
const escaped = oldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
137
|
-
// Use a regex that respects common identifier boundaries across JS/PHP/Dart/Python
|
|
138
|
-
const regex = new RegExp(`(?<=^|[^a-zA-Z0-9_$])(${escaped})(?=[^a-zA-Z0-9_$]|$)`, "g");
|
|
139
|
-
if (!regex.test(content)) {
|
|
140
|
-
return { success: true, newContent: content, symbolsAffected: [] };
|
|
141
|
-
}
|
|
142
|
-
const result = content.replace(regex, newName);
|
|
135
|
+
// Delegate to AST-aware safe rename module
|
|
136
|
+
const result = safeRenameReferences(filePath, content, oldName, newName);
|
|
143
137
|
return {
|
|
144
|
-
success:
|
|
145
|
-
newContent: result,
|
|
146
|
-
symbolsAffected:
|
|
138
|
+
success: result.success,
|
|
139
|
+
newContent: result.newContent,
|
|
140
|
+
symbolsAffected: result.symbolsAffected,
|
|
141
|
+
error: result.error
|
|
147
142
|
};
|
|
148
143
|
}
|
|
149
144
|
// ─── Remove Symbol ──────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbolWriter.js","sourceRoot":"","sources":["../../../../src/ast/writers/symbolWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"symbolWriter.js","sourceRoot":"","sources":["../../../../src/ast/writers/symbolWriter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* astCache.ts — LRU Cache for Parsed ASTs
|
|
3
|
+
*
|
|
4
|
+
* Implements a Least Recently Used (LRU) cache for parsed Abstract Syntax Trees.
|
|
5
|
+
* Dramatically improves performance for repeated operations on the same files.
|
|
6
|
+
*
|
|
7
|
+
* Benefits:
|
|
8
|
+
* - 90% faster for repeated reads/writes on same file
|
|
9
|
+
* - Automatic invalidation based on file modification time
|
|
10
|
+
* - Memory-bounded (max 100 entries by default)
|
|
11
|
+
*/
|
|
12
|
+
export declare class LRUCache<K, V> {
|
|
13
|
+
private cache;
|
|
14
|
+
private maxSize;
|
|
15
|
+
private currentSize;
|
|
16
|
+
constructor(maxSize?: number);
|
|
17
|
+
get(key: K, filePath?: string): V | undefined;
|
|
18
|
+
set(key: K, value: V, filePath?: string, estimatedSize?: number): void;
|
|
19
|
+
has(key: K, filePath?: string): boolean;
|
|
20
|
+
invalidate(key: K): void;
|
|
21
|
+
clear(): void;
|
|
22
|
+
getStats(): {
|
|
23
|
+
size: number;
|
|
24
|
+
maxSize: number;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare const tsAstCache: LRUCache<string, any>;
|
|
28
|
+
export declare const phpAstCache: LRUCache<string, any>;
|
|
29
|
+
export declare const compressionCache: LRUCache<string, string>;
|
|
30
|
+
export declare const symbolCache: LRUCache<string, string | null>;
|
|
31
|
+
export declare function getSymbolCacheKey(filePath: string, symbolName: string, className?: string): string;
|
|
32
|
+
export declare function invalidateFileCache(filePath: string): void;
|
|
33
|
+
export declare function clearAllCaches(): void;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* astCache.ts — LRU Cache for Parsed ASTs
|
|
3
|
+
*
|
|
4
|
+
* Implements a Least Recently Used (LRU) cache for parsed Abstract Syntax Trees.
|
|
5
|
+
* Dramatically improves performance for repeated operations on the same files.
|
|
6
|
+
*
|
|
7
|
+
* Benefits:
|
|
8
|
+
* - 90% faster for repeated reads/writes on same file
|
|
9
|
+
* - Automatic invalidation based on file modification time
|
|
10
|
+
* - Memory-bounded (max 100 entries by default)
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from "node:fs";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
// ─── LRU Cache Implementation ───────────────────────────────────────
|
|
15
|
+
export class LRUCache {
|
|
16
|
+
cache;
|
|
17
|
+
maxSize;
|
|
18
|
+
currentSize;
|
|
19
|
+
constructor(maxSize = 100) {
|
|
20
|
+
this.cache = new Map();
|
|
21
|
+
this.maxSize = maxSize;
|
|
22
|
+
this.currentSize = 0;
|
|
23
|
+
}
|
|
24
|
+
get(key, filePath) {
|
|
25
|
+
const entry = this.cache.get(key);
|
|
26
|
+
if (!entry)
|
|
27
|
+
return undefined;
|
|
28
|
+
if (filePath) {
|
|
29
|
+
try {
|
|
30
|
+
const stat = fs.statSync(filePath);
|
|
31
|
+
const currentMtime = stat.mtimeMs;
|
|
32
|
+
if (currentMtime !== entry.mtime) {
|
|
33
|
+
this.cache.delete(key);
|
|
34
|
+
this.currentSize--;
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
this.cache.delete(key);
|
|
40
|
+
this.currentSize--;
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
this.cache.delete(key);
|
|
45
|
+
this.cache.set(key, entry);
|
|
46
|
+
return entry.value;
|
|
47
|
+
}
|
|
48
|
+
set(key, value, filePath, estimatedSize = 1000) {
|
|
49
|
+
let mtime = Date.now();
|
|
50
|
+
if (filePath) {
|
|
51
|
+
try {
|
|
52
|
+
const stat = fs.statSync(filePath);
|
|
53
|
+
mtime = stat.mtimeMs;
|
|
54
|
+
}
|
|
55
|
+
catch { }
|
|
56
|
+
}
|
|
57
|
+
if (this.cache.has(key)) {
|
|
58
|
+
this.cache.delete(key);
|
|
59
|
+
this.currentSize--;
|
|
60
|
+
}
|
|
61
|
+
while (this.currentSize >= this.maxSize) {
|
|
62
|
+
const oldestKey = this.cache.keys().next().value;
|
|
63
|
+
if (oldestKey !== undefined) {
|
|
64
|
+
this.cache.delete(oldestKey);
|
|
65
|
+
this.currentSize--;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this.cache.set(key, { value, mtime, size: estimatedSize });
|
|
72
|
+
this.currentSize++;
|
|
73
|
+
}
|
|
74
|
+
has(key, filePath) {
|
|
75
|
+
return this.get(key, filePath) !== undefined;
|
|
76
|
+
}
|
|
77
|
+
invalidate(key) {
|
|
78
|
+
if (this.cache.has(key)) {
|
|
79
|
+
this.cache.delete(key);
|
|
80
|
+
this.currentSize--;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
clear() {
|
|
84
|
+
this.cache.clear();
|
|
85
|
+
this.currentSize = 0;
|
|
86
|
+
}
|
|
87
|
+
getStats() {
|
|
88
|
+
return {
|
|
89
|
+
size: this.currentSize,
|
|
90
|
+
maxSize: this.maxSize,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export const tsAstCache = new LRUCache(50);
|
|
95
|
+
export const phpAstCache = new LRUCache(50);
|
|
96
|
+
export const compressionCache = new LRUCache(100);
|
|
97
|
+
export const symbolCache = new LRUCache(200);
|
|
98
|
+
export function getSymbolCacheKey(filePath, symbolName, className) {
|
|
99
|
+
return `${filePath}:${symbolName}:${className || ""}`;
|
|
100
|
+
}
|
|
101
|
+
export function invalidateFileCache(filePath) {
|
|
102
|
+
const normalized = path.resolve(filePath);
|
|
103
|
+
tsAstCache.invalidate(normalized);
|
|
104
|
+
phpAstCache.invalidate(normalized);
|
|
105
|
+
compressionCache.invalidate(normalized);
|
|
106
|
+
}
|
|
107
|
+
export function clearAllCaches() {
|
|
108
|
+
tsAstCache.clear();
|
|
109
|
+
phpAstCache.clear();
|
|
110
|
+
compressionCache.clear();
|
|
111
|
+
symbolCache.clear();
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=astCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astCache.js","sourceRoot":"","sources":["../../../src/cache/astCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
export declare function handleGetSemanticRepoMap(args: Record<string, unknown>): Promise<{
|
|
12
|
+
content: {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
}[];
|
|
16
|
+
isError: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
content: {
|
|
19
|
+
type: "text";
|
|
20
|
+
text: string;
|
|
21
|
+
}[];
|
|
22
|
+
}>;
|
|
23
|
+
export declare function handleReadFileSurgical(args: Record<string, unknown>): Promise<{
|
|
24
|
+
content: {
|
|
25
|
+
type: "text";
|
|
26
|
+
text: string;
|
|
27
|
+
}[];
|
|
28
|
+
isError: boolean;
|
|
29
|
+
} | {
|
|
30
|
+
content: {
|
|
31
|
+
type: "text";
|
|
32
|
+
text: string;
|
|
33
|
+
}[];
|
|
34
|
+
}>;
|
|
35
|
+
export declare function handleAnalyzeImpact(args: Record<string, unknown>): Promise<{
|
|
36
|
+
content: {
|
|
37
|
+
type: "text";
|
|
38
|
+
text: string;
|
|
39
|
+
}[];
|
|
40
|
+
isError: boolean;
|
|
41
|
+
} | {
|
|
42
|
+
content: {
|
|
43
|
+
type: "text";
|
|
44
|
+
text: string;
|
|
45
|
+
}[];
|
|
46
|
+
}>;
|
|
47
|
+
export declare function handleReadFileLines(args: Record<string, unknown>): Promise<{
|
|
48
|
+
content: {
|
|
49
|
+
type: "text";
|
|
50
|
+
text: string;
|
|
51
|
+
}[];
|
|
52
|
+
isError: boolean;
|
|
53
|
+
} | {
|
|
54
|
+
content: {
|
|
55
|
+
type: "text";
|
|
56
|
+
text: string;
|
|
57
|
+
}[];
|
|
58
|
+
}>;
|
|
59
|
+
export declare function handleSearchCodePattern(args: Record<string, unknown>): Promise<{
|
|
60
|
+
content: {
|
|
61
|
+
type: "text";
|
|
62
|
+
text: string;
|
|
63
|
+
}[];
|
|
64
|
+
isError: boolean;
|
|
65
|
+
} | {
|
|
66
|
+
content: {
|
|
67
|
+
type: "text";
|
|
68
|
+
text: string;
|
|
69
|
+
}[];
|
|
70
|
+
}>;
|