mcp-code-context 2.1.3

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 (112) hide show
  1. package/AGENT_INSTRUCTIONS.md +135 -0
  2. package/CHANGELOG.md +84 -0
  3. package/DEPLOYMENT_INSTRUCTIONS.md +110 -0
  4. package/LICENSE +21 -0
  5. package/README.md +247 -0
  6. package/RELEASE_NOTES_v2.1.3.md +78 -0
  7. package/TROUBLESHOOTING.md +38 -0
  8. package/dist/src/ast/dartCompressor.d.ts +27 -0
  9. package/dist/src/ast/dartCompressor.js +859 -0
  10. package/dist/src/ast/dartCompressor.js.map +1 -0
  11. package/dist/src/ast/phpCompressor.d.ts +24 -0
  12. package/dist/src/ast/phpCompressor.js +634 -0
  13. package/dist/src/ast/phpCompressor.js.map +1 -0
  14. package/dist/src/ast/semanticCompressor.d.ts +22 -0
  15. package/dist/src/ast/semanticCompressor.js +677 -0
  16. package/dist/src/ast/semanticCompressor.js.map +1 -0
  17. package/dist/src/ast/writers/dartWriter.d.ts +37 -0
  18. package/dist/src/ast/writers/dartWriter.js +544 -0
  19. package/dist/src/ast/writers/dartWriter.js.map +1 -0
  20. package/dist/src/ast/writers/phpWriter.d.ts +37 -0
  21. package/dist/src/ast/writers/phpWriter.js +411 -0
  22. package/dist/src/ast/writers/phpWriter.js.map +1 -0
  23. package/dist/src/ast/writers/pyWriter.d.ts +37 -0
  24. package/dist/src/ast/writers/pyWriter.js +355 -0
  25. package/dist/src/ast/writers/pyWriter.js.map +1 -0
  26. package/dist/src/ast/writers/symbolWriter.d.ts +62 -0
  27. package/dist/src/ast/writers/symbolWriter.js +179 -0
  28. package/dist/src/ast/writers/symbolWriter.js.map +1 -0
  29. package/dist/src/ast/writers/tsWriter.d.ts +38 -0
  30. package/dist/src/ast/writers/tsWriter.js +344 -0
  31. package/dist/src/ast/writers/tsWriter.js.map +1 -0
  32. package/dist/src/index.d.ts +117 -0
  33. package/dist/src/index.js +1289 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/tests/test-confirmation-flow.d.ts +1 -0
  36. package/dist/src/tests/test-confirmation-flow.js +43 -0
  37. package/dist/src/tests/test-confirmation-flow.js.map +1 -0
  38. package/dist/src/utils/backupManager.d.ts +24 -0
  39. package/dist/src/utils/backupManager.js +59 -0
  40. package/dist/src/utils/backupManager.js.map +1 -0
  41. package/dist/src/utils/confirmationCache.d.ts +16 -0
  42. package/dist/src/utils/confirmationCache.js +40 -0
  43. package/dist/src/utils/confirmationCache.js.map +1 -0
  44. package/dist/src/utils/diffEngine.d.ts +21 -0
  45. package/dist/src/utils/diffEngine.js +163 -0
  46. package/dist/src/utils/diffEngine.js.map +1 -0
  47. package/dist/src/utils/fuzzyMatch.d.ts +8 -0
  48. package/dist/src/utils/fuzzyMatch.js +69 -0
  49. package/dist/src/utils/fuzzyMatch.js.map +1 -0
  50. package/dist/src/utils/ignoreManager.d.ts +22 -0
  51. package/dist/src/utils/ignoreManager.js +135 -0
  52. package/dist/src/utils/ignoreManager.js.map +1 -0
  53. package/dist/tests/debug-replace.d.ts +1 -0
  54. package/dist/tests/debug-replace.js +17 -0
  55. package/dist/tests/debug-replace.js.map +1 -0
  56. package/dist/tests/test-confirmation-flow.d.ts +1 -0
  57. package/dist/tests/test-confirmation-flow.js +43 -0
  58. package/dist/tests/test-confirmation-flow.js.map +1 -0
  59. package/dist/tests/test-dart.d.ts +1 -0
  60. package/dist/tests/test-dart.js +242 -0
  61. package/dist/tests/test-dart.js.map +1 -0
  62. package/dist/tests/test-php-ast.d.ts +1 -0
  63. package/dist/tests/test-php-ast.js +152 -0
  64. package/dist/tests/test-php-ast.js.map +1 -0
  65. package/dist/tests/test-php.d.ts +1 -0
  66. package/dist/tests/test-php.js +234 -0
  67. package/dist/tests/test-php.js.map +1 -0
  68. package/dist/tests/test-smoke.d.ts +5 -0
  69. package/dist/tests/test-smoke.js +83 -0
  70. package/dist/tests/test-smoke.js.map +1 -0
  71. package/dist/tests/writers/test-crlf-handling.d.ts +4 -0
  72. package/dist/tests/writers/test-crlf-handling.js +73 -0
  73. package/dist/tests/writers/test-crlf-handling.js.map +1 -0
  74. package/dist/tests/writers/test-write-smoke.d.ts +9 -0
  75. package/dist/tests/writers/test-write-smoke.js +346 -0
  76. package/dist/tests/writers/test-write-smoke.js.map +1 -0
  77. package/llms.txt +164 -0
  78. package/package.json +57 -0
  79. package/src/ast/dartCompressor.ts +1013 -0
  80. package/src/ast/phpCompressor.ts +814 -0
  81. package/src/ast/semanticCompressor.ts +808 -0
  82. package/src/ast/writers/dartWriter.ts +648 -0
  83. package/src/ast/writers/phpWriter.ts +508 -0
  84. package/src/ast/writers/pyWriter.ts +446 -0
  85. package/src/ast/writers/symbolWriter.ts +277 -0
  86. package/src/ast/writers/tsWriter.ts +418 -0
  87. package/src/index.ts +1553 -0
  88. package/src/utils/backupManager.ts +66 -0
  89. package/src/utils/confirmationCache.ts +61 -0
  90. package/src/utils/diffEngine.ts +223 -0
  91. package/src/utils/fuzzyMatch.ts +86 -0
  92. package/src/utils/ignoreManager.ts +144 -0
  93. package/tests/test-confirmation-flow.ts +49 -0
  94. package/tests/test-dart.d.ts +1 -0
  95. package/tests/test-dart.js +209 -0
  96. package/tests/test-dart.js.map +1 -0
  97. package/tests/test-dart.ts +265 -0
  98. package/tests/test-php-ast.d.ts +1 -0
  99. package/tests/test-php-ast.js +152 -0
  100. package/tests/test-php-ast.js.map +1 -0
  101. package/tests/test-php-ast.ts +155 -0
  102. package/tests/test-php.d.ts +1 -0
  103. package/tests/test-php.js +234 -0
  104. package/tests/test-php.js.map +1 -0
  105. package/tests/test-php.ts +261 -0
  106. package/tests/test-smoke.d.ts +5 -0
  107. package/tests/test-smoke.js +83 -0
  108. package/tests/test-smoke.js.map +1 -0
  109. package/tests/test-smoke.ts +93 -0
  110. package/tests/writers/test-crlf-handling.ts +100 -0
  111. package/tests/writers/test-write-smoke.ts +568 -0
  112. package/tsconfig.json +19 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * phpWriter.ts — PHP Surgical Writer
3
+ *
4
+ * Uses php-parser to parse the AST for symbol location data,
5
+ * then performs line-splice operations on the raw source text.
6
+ * php-parser doesn't have a write API like ts-morph, so we locate
7
+ * symbols via AST → get line numbers → splice in the replacement.
8
+ *
9
+ * Supports: .php, .phtml
10
+ */
11
+ export interface WriteResult {
12
+ success: boolean;
13
+ newContent: string;
14
+ symbolsAffected: string[];
15
+ error?: string;
16
+ }
17
+ export type InsertPosition = "before" | "after" | "inside_start" | "inside_end";
18
+ /**
19
+ * Replace the full text of a named symbol in a PHP file.
20
+ * When className is provided, scopes the search to within that class only.
21
+ */
22
+ export declare function replacePHPSymbol(content: string, symbolName: string, newContent: string, className?: string): WriteResult;
23
+ /**
24
+ * Insert new code at a precise location relative to an anchor symbol.
25
+ * When className is provided, scopes the anchor search to within that class only.
26
+ */
27
+ export declare function insertPHPCode(content: string, code: string, anchorSymbol: string | null, position: InsertPosition, className?: string): WriteResult;
28
+ /**
29
+ * Rename all occurrences of a symbol within a PHP file.
30
+ * Performs whole-word replacement respecting PHP identifier boundaries.
31
+ */
32
+ export declare function renamePHPSymbol(content: string, oldName: string, newName: string): WriteResult;
33
+ /**
34
+ * Remove a named symbol from a PHP file.
35
+ * When className is provided, scopes the search to within that class only.
36
+ */
37
+ export declare function removePHPSymbol(content: string, symbolName: string, className?: string): WriteResult;
@@ -0,0 +1,411 @@
1
+ /**
2
+ * phpWriter.ts — PHP Surgical Writer
3
+ *
4
+ * Uses php-parser to parse the AST for symbol location data,
5
+ * then performs line-splice operations on the raw source text.
6
+ * php-parser doesn't have a write API like ts-morph, so we locate
7
+ * symbols via AST → get line numbers → splice in the replacement.
8
+ *
9
+ * Supports: .php, .phtml
10
+ */
11
+ import { createRequire } from "node:module";
12
+ // ─── Parser ─────────────────────────────────────────────────────────
13
+ let _parser = null;
14
+ function getParser() {
15
+ if (!_parser) {
16
+ const require = createRequire(import.meta.url);
17
+ const phpParser = require("php-parser");
18
+ _parser = new phpParser.Engine({
19
+ parser: {
20
+ extractDoc: true,
21
+ php7: true,
22
+ locations: true,
23
+ suppressErrors: true,
24
+ },
25
+ ast: { withPositions: true },
26
+ });
27
+ }
28
+ return _parser;
29
+ }
30
+ function parsePhp(content) {
31
+ try {
32
+ return getParser().parseCode(content, "file.php");
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ // ─── Replace Symbol ─────────────────────────────────────────────────
39
+ /**
40
+ * Replace the full text of a named symbol in a PHP file.
41
+ * When className is provided, scopes the search to within that class only.
42
+ */
43
+ export function replacePHPSymbol(content, symbolName, newContent, className) {
44
+ const ast = parsePhp(content);
45
+ if (!ast) {
46
+ return {
47
+ success: false,
48
+ newContent: content,
49
+ symbolsAffected: [],
50
+ error: "Failed to parse PHP file",
51
+ };
52
+ }
53
+ const node = findSymbolNode(ast, symbolName, className);
54
+ if (!node || !node.loc) {
55
+ return {
56
+ success: false,
57
+ newContent: content,
58
+ symbolsAffected: [],
59
+ error: className
60
+ ? `Symbol "${symbolName}" not found in class "${className}" in PHP file`
61
+ : `Symbol "${symbolName}" not found in PHP file`,
62
+ };
63
+ }
64
+ const lines = content.split("\n");
65
+ // Find the actual start including doc comments
66
+ const startLine = findActualStart(lines, node);
67
+ const endLine = node.loc.end.line; // 1-indexed, inclusive
68
+ // Detect the indentation of the original symbol
69
+ const originalIndent = getIndent(lines[startLine - 1] || "");
70
+ // Re-indent the new content to match
71
+ const reindented = reindentCode(newContent.trim(), originalIndent);
72
+ // Splice in the replacement
73
+ const before = lines.slice(0, startLine - 1);
74
+ const after = lines.slice(endLine);
75
+ const result = [...before, reindented, ...after].join("\n");
76
+ // Validate: try to parse the result
77
+ const validationAst = parsePhp(result);
78
+ if (!validationAst) {
79
+ return {
80
+ success: false,
81
+ newContent: content,
82
+ symbolsAffected: [],
83
+ error: `Replacement produced invalid PHP syntax. Aborting.`,
84
+ };
85
+ }
86
+ return {
87
+ success: true,
88
+ newContent: result,
89
+ symbolsAffected: [symbolName],
90
+ };
91
+ }
92
+ // ─── Insert Code ────────────────────────────────────────────────────
93
+ /**
94
+ * Insert new code at a precise location relative to an anchor symbol.
95
+ * When className is provided, scopes the anchor search to within that class only.
96
+ */
97
+ export function insertPHPCode(content, code, anchorSymbol, position, className) {
98
+ const lines = content.split("\n");
99
+ if (!anchorSymbol) {
100
+ // No anchor — insert before the final closing tag or at end
101
+ const lastClosingBrace = findLastClosingBrace(lines);
102
+ if (lastClosingBrace !== -1) {
103
+ // Insert before the last } (likely end of namespace or class)
104
+ lines.splice(lastClosingBrace, 0, "", code.trim(), "");
105
+ }
106
+ else {
107
+ lines.push("", code.trim());
108
+ }
109
+ return {
110
+ success: true,
111
+ newContent: lines.join("\n"),
112
+ symbolsAffected: [],
113
+ };
114
+ }
115
+ const ast = parsePhp(content);
116
+ if (!ast) {
117
+ return {
118
+ success: false,
119
+ newContent: content,
120
+ symbolsAffected: [],
121
+ error: "Failed to parse PHP file",
122
+ };
123
+ }
124
+ const node = findSymbolNode(ast, anchorSymbol, className);
125
+ if (!node || !node.loc) {
126
+ return {
127
+ success: false,
128
+ newContent: content,
129
+ symbolsAffected: [],
130
+ error: className
131
+ ? `Anchor symbol "${anchorSymbol}" not found in class "${className}"`
132
+ : `Anchor symbol "${anchorSymbol}" not found`,
133
+ };
134
+ }
135
+ const startLine = findActualStart(lines, node);
136
+ const endLine = node.loc.end.line;
137
+ const indent = getIndent(lines[startLine - 1] || "");
138
+ const reindented = reindentCode(code.trim(), indent);
139
+ switch (position) {
140
+ case "before":
141
+ lines.splice(startLine - 1, 0, reindented, "");
142
+ break;
143
+ case "after":
144
+ lines.splice(endLine, 0, "", reindented);
145
+ break;
146
+ case "inside_start": {
147
+ // Find the opening brace of the class/interface
148
+ const braceIdx = findOpeningBrace(lines, startLine - 1);
149
+ if (braceIdx === -1) {
150
+ return {
151
+ success: false,
152
+ newContent: content,
153
+ symbolsAffected: [],
154
+ error: `Cannot find opening brace for "${anchorSymbol}"`,
155
+ };
156
+ }
157
+ const innerIndent = indent + " ";
158
+ const innerCode = reindentCode(code.trim(), innerIndent);
159
+ lines.splice(braceIdx + 1, 0, innerCode, "");
160
+ break;
161
+ }
162
+ case "inside_end": {
163
+ // Insert before the closing brace
164
+ const innerIndent = indent + " ";
165
+ const innerCode = reindentCode(code.trim(), innerIndent);
166
+ lines.splice(endLine - 1, 0, "", innerCode);
167
+ break;
168
+ }
169
+ }
170
+ return {
171
+ success: true,
172
+ newContent: lines.join("\n"),
173
+ symbolsAffected: [anchorSymbol],
174
+ };
175
+ }
176
+ // ─── Rename Symbol ──────────────────────────────────────────────────
177
+ /**
178
+ * Rename all occurrences of a symbol within a PHP file.
179
+ * Performs whole-word replacement respecting PHP identifier boundaries.
180
+ */
181
+ export function renamePHPSymbol(content, oldName, newName) {
182
+ const ast = parsePhp(content);
183
+ if (!ast) {
184
+ return {
185
+ success: false,
186
+ newContent: content,
187
+ symbolsAffected: [],
188
+ error: "Failed to parse PHP file",
189
+ };
190
+ }
191
+ // Verify the symbol exists
192
+ const node = findSymbolNode(ast, oldName);
193
+ if (!node) {
194
+ return {
195
+ success: false,
196
+ newContent: content,
197
+ symbolsAffected: [],
198
+ error: `Symbol "${oldName}" not found for renaming`,
199
+ };
200
+ }
201
+ // Perform whole-word replacement
202
+ const escaped = oldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
203
+ const regex = new RegExp(`\\b${escaped}\\b`, "g");
204
+ const result = content.replace(regex, newName);
205
+ // Validate
206
+ const validationAst = parsePhp(result);
207
+ if (!validationAst) {
208
+ return {
209
+ success: false,
210
+ newContent: content,
211
+ symbolsAffected: [],
212
+ error: `Rename produced invalid PHP syntax`,
213
+ };
214
+ }
215
+ return {
216
+ success: true,
217
+ newContent: result,
218
+ symbolsAffected: [oldName],
219
+ };
220
+ }
221
+ // ─── Remove Symbol ──────────────────────────────────────────────────
222
+ /**
223
+ * Remove a named symbol from a PHP file.
224
+ * When className is provided, scopes the search to within that class only.
225
+ */
226
+ export function removePHPSymbol(content, symbolName, className) {
227
+ const ast = parsePhp(content);
228
+ if (!ast) {
229
+ return {
230
+ success: false,
231
+ newContent: content,
232
+ symbolsAffected: [],
233
+ error: "Failed to parse PHP file",
234
+ };
235
+ }
236
+ const node = findSymbolNode(ast, symbolName, className);
237
+ if (!node || !node.loc) {
238
+ return {
239
+ success: false,
240
+ newContent: content,
241
+ symbolsAffected: [],
242
+ error: className
243
+ ? `Symbol "${symbolName}" not found in class "${className}" for removal`
244
+ : `Symbol "${symbolName}" not found for removal`,
245
+ };
246
+ }
247
+ const lines = content.split("\n");
248
+ const startLine = findActualStart(lines, node);
249
+ const endLine = node.loc.end.line;
250
+ // Remove the lines
251
+ lines.splice(startLine - 1, endLine - startLine + 1);
252
+ // Clean up consecutive blank lines
253
+ let result = lines.join("\n");
254
+ result = result.replace(/\n{3,}/g, "\n\n");
255
+ return {
256
+ success: true,
257
+ newContent: result,
258
+ symbolsAffected: [symbolName],
259
+ };
260
+ }
261
+ // ─── Internal Helpers ───────────────────────────────────────────────
262
+ function getNodeName(node) {
263
+ if (!node || !node.name)
264
+ return "";
265
+ if (typeof node.name === "string")
266
+ return node.name;
267
+ if (typeof node.name === "object" && "name" in node.name)
268
+ return node.name.name;
269
+ return "";
270
+ }
271
+ /**
272
+ * Find a class/interface/trait/enum node by name in the AST tree.
273
+ * Used to scope symbol searches to a specific container.
274
+ */
275
+ function findClassNodePhp(node, className) {
276
+ if (!node)
277
+ return null;
278
+ if (["class", "interface", "trait", "enum"].includes(node.kind) &&
279
+ getNodeName(node) === className) {
280
+ return node;
281
+ }
282
+ const allChildren = [
283
+ ...(node.children || []),
284
+ ...(Array.isArray(node.body) ? node.body : []),
285
+ ];
286
+ for (const child of allChildren) {
287
+ const found = findClassNodePhp(child, className);
288
+ if (found)
289
+ return found;
290
+ }
291
+ return null;
292
+ }
293
+ function findSymbolNode(node, symbolName, className) {
294
+ if (!node)
295
+ return null;
296
+ // If className is provided, first find the class, then search within it
297
+ if (className) {
298
+ const classNode = findClassNodePhp(node, className);
299
+ if (!classNode)
300
+ return null;
301
+ // Search only within this class's body
302
+ const body = Array.isArray(classNode.body) ? classNode.body : [];
303
+ for (const member of body) {
304
+ if (member.kind === "method" && getNodeName(member) === symbolName) {
305
+ return member;
306
+ }
307
+ }
308
+ return null;
309
+ }
310
+ const nodeName = getNodeName(node);
311
+ // Direct match on class, interface, trait, enum, function
312
+ if (["class", "interface", "trait", "enum", "function"].includes(node.kind) &&
313
+ nodeName === symbolName) {
314
+ return node;
315
+ }
316
+ // Search methods inside classes/interfaces/traits/enums
317
+ if (["class", "interface", "trait", "enum"].includes(node.kind)) {
318
+ const body = Array.isArray(node.body) ? node.body : [];
319
+ for (const member of body) {
320
+ if (member.kind === "method" && getNodeName(member) === symbolName) {
321
+ return member;
322
+ }
323
+ }
324
+ }
325
+ // Recursive search through children
326
+ const allChildren = [
327
+ ...(node.children || []),
328
+ ...(Array.isArray(node.body) ? node.body : []),
329
+ ];
330
+ for (const child of allChildren) {
331
+ const found = findSymbolNode(child, symbolName);
332
+ if (found)
333
+ return found;
334
+ }
335
+ return null;
336
+ }
337
+ /**
338
+ * Walk backward from a symbol's start to capture leading doc comments.
339
+ * Returns the 1-indexed line number of the actual start.
340
+ */
341
+ function findActualStart(lines, node) {
342
+ if (!node.loc)
343
+ return 1;
344
+ let startLine = node.loc.start.line; // 1-indexed
345
+ if (node.leadingComments && node.leadingComments.length > 0) {
346
+ for (let i = startLine - 2; i >= 0; i--) {
347
+ const trimmed = lines[i].trim();
348
+ if (trimmed.startsWith("/**") ||
349
+ trimmed.startsWith("*") ||
350
+ trimmed.startsWith("*/") ||
351
+ trimmed.startsWith("//") ||
352
+ trimmed.startsWith("#[")) {
353
+ startLine = i + 1; // Convert back to 1-indexed
354
+ }
355
+ else if (trimmed === "") {
356
+ continue;
357
+ }
358
+ else {
359
+ break;
360
+ }
361
+ }
362
+ }
363
+ return startLine;
364
+ }
365
+ function getIndent(line) {
366
+ const match = line.match(/^(\s*)/);
367
+ return match ? match[1] : "";
368
+ }
369
+ /**
370
+ * Re-indent a block of code to match a target indentation level.
371
+ * Detects the minimum indentation of the input and replaces it with target.
372
+ */
373
+ function reindentCode(code, targetIndent) {
374
+ const lines = code.split("\n");
375
+ if (lines.length === 0)
376
+ return code;
377
+ // Find minimum non-empty indentation
378
+ let minIndent = Infinity;
379
+ for (const line of lines) {
380
+ if (line.trim() === "")
381
+ continue;
382
+ const indent = line.match(/^(\s*)/)?.[1]?.length ?? 0;
383
+ if (indent < minIndent)
384
+ minIndent = indent;
385
+ }
386
+ if (minIndent === Infinity)
387
+ minIndent = 0;
388
+ // Re-indent each line
389
+ return lines
390
+ .map((line) => {
391
+ if (line.trim() === "")
392
+ return "";
393
+ return targetIndent + line.slice(minIndent);
394
+ })
395
+ .join("\n");
396
+ }
397
+ function findOpeningBrace(lines, startIdx) {
398
+ for (let i = startIdx; i < lines.length; i++) {
399
+ if (lines[i].includes("{"))
400
+ return i;
401
+ }
402
+ return -1;
403
+ }
404
+ function findLastClosingBrace(lines) {
405
+ for (let i = lines.length - 1; i >= 0; i--) {
406
+ if (lines[i].trim() === "}")
407
+ return i;
408
+ }
409
+ return -1;
410
+ }
411
+ //# sourceMappingURL=phpWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phpWriter.js","sourceRoot":"","sources":["../../../../src/ast/writers/phpWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * pyWriter.ts — Python Surgical Writer
3
+ *
4
+ * Uses indentation-based block detection to locate symbol boundaries
5
+ * in Python files. Python's significant whitespace makes this different
6
+ * from brace-delimited languages — we detect block ends by watching
7
+ * for dedentation back to the original level.
8
+ *
9
+ * Supports: .py, .pyi
10
+ */
11
+ export interface WriteResult {
12
+ success: boolean;
13
+ newContent: string;
14
+ symbolsAffected: string[];
15
+ error?: string;
16
+ }
17
+ export type InsertPosition = "before" | "after" | "inside_start" | "inside_end";
18
+ /**
19
+ * Replace the full text of a named symbol in a Python file.
20
+ * The newContent should include the def/class signature and body.
21
+ * When className is provided, scopes the search to within that class only.
22
+ */
23
+ export declare function replacePySymbol(content: string, symbolName: string, newContent: string, className?: string): WriteResult;
24
+ /**
25
+ * Insert new code at a precise location relative to an anchor symbol.
26
+ * When className is provided, scopes the anchor search to within that class only.
27
+ */
28
+ export declare function insertPyCode(content: string, code: string, anchorSymbol: string | null, position: InsertPosition, className?: string): WriteResult;
29
+ /**
30
+ * Rename all occurrences of a symbol within a Python file.
31
+ */
32
+ export declare function renamePySymbol(content: string, oldName: string, newName: string): WriteResult;
33
+ /**
34
+ * Remove a named symbol from a Python file.
35
+ * When className is provided, scopes the search to within that class only.
36
+ */
37
+ export declare function removePySymbol(content: string, symbolName: string, className?: string): WriteResult;