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,344 @@
1
+ /**
2
+ * tsWriter.ts — TypeScript / JavaScript Surgical Writer
3
+ *
4
+ * Uses ts-morph to perform AST-aware code modifications on TypeScript
5
+ * and JavaScript files. This is the most robust writer because ts-morph
6
+ * provides a full read-write AST with source manipulation capabilities.
7
+ *
8
+ * Supports: .ts, .tsx, .js, .jsx, .mts, .mjs, .cts, .cjs
9
+ */
10
+ import { Project, } from "ts-morph";
11
+ import * as path from "node:path";
12
+ // ─── Singleton Project ──────────────────────────────────────────────
13
+ let _project = null;
14
+ function getProject() {
15
+ if (!_project) {
16
+ _project = new Project({
17
+ compilerOptions: {
18
+ allowJs: true,
19
+ jsx: 2, // React
20
+ },
21
+ useInMemoryFileSystem: true,
22
+ });
23
+ }
24
+ return _project;
25
+ }
26
+ function createSourceFile(content, filePath) {
27
+ const project = getProject();
28
+ const ext = path.extname(filePath);
29
+ const tempName = `write_${Date.now()}_${Math.random().toString(36).slice(2)}${ext}`;
30
+ return project.createSourceFile(tempName, content, { overwrite: true });
31
+ }
32
+ function cleanupSourceFile(sf) {
33
+ try {
34
+ sf.getProject().removeSourceFile(sf);
35
+ }
36
+ catch {
37
+ // Ignore cleanup errors
38
+ }
39
+ }
40
+ // ─── Replace Symbol ─────────────────────────────────────────────────
41
+ /**
42
+ * Replace the full text of a named symbol in a TypeScript/JavaScript file.
43
+ * The newContent should be the complete replacement (signature + body).
44
+ * When className is provided, scopes the search to within that class only.
45
+ */
46
+ export function replaceTSSymbol(content, symbolName, newContent, filePath, className) {
47
+ const sf = createSourceFile(content, filePath);
48
+ try {
49
+ const node = findNode(sf, symbolName, className);
50
+ if (!node) {
51
+ return {
52
+ success: false,
53
+ newContent: content,
54
+ symbolsAffected: [],
55
+ error: className
56
+ ? `Symbol "${symbolName}" not found in class "${className}"`
57
+ : `Symbol "${symbolName}" not found in file`,
58
+ };
59
+ }
60
+ // Replace the node's full text with the new content
61
+ node.replaceWithText(newContent.trim());
62
+ const result = sf.getFullText();
63
+ // Validate that the result is parseable
64
+ const validationSf = createSourceFile(result, filePath);
65
+ const diagnostics = validationSf.getPreEmitDiagnostics();
66
+ const hasSyntaxErrors = diagnostics.some((d) => d.getCategory() === 1);
67
+ cleanupSourceFile(validationSf);
68
+ if (hasSyntaxErrors) {
69
+ // Still return the result but mark potential syntax issues
70
+ // We don't reject because some "errors" are just type errors, not syntax
71
+ }
72
+ return {
73
+ success: true,
74
+ newContent: result,
75
+ symbolsAffected: [symbolName],
76
+ };
77
+ }
78
+ catch (error) {
79
+ const msg = error instanceof Error ? error.message : String(error);
80
+ return {
81
+ success: false,
82
+ newContent: content,
83
+ symbolsAffected: [],
84
+ error: `Failed to replace symbol "${symbolName}": ${msg}`,
85
+ };
86
+ }
87
+ finally {
88
+ cleanupSourceFile(sf);
89
+ }
90
+ }
91
+ /**
92
+ * Insert new code at a precise location relative to an anchor symbol.
93
+ * When className is provided, scopes the anchor search to within that class only.
94
+ */
95
+ export function insertTSCode(content, code, anchorSymbol, position, filePath, className) {
96
+ const sf = createSourceFile(content, filePath);
97
+ try {
98
+ if (!anchorSymbol) {
99
+ // No anchor — append at end of file
100
+ sf.addStatements(code.trim());
101
+ return {
102
+ success: true,
103
+ newContent: sf.getFullText(),
104
+ symbolsAffected: [],
105
+ };
106
+ }
107
+ const node = findNode(sf, anchorSymbol, className);
108
+ if (!node) {
109
+ return {
110
+ success: false,
111
+ newContent: content,
112
+ symbolsAffected: [],
113
+ error: className
114
+ ? `Anchor symbol "${anchorSymbol}" not found in class "${className}"`
115
+ : `Anchor symbol "${anchorSymbol}" not found`,
116
+ };
117
+ }
118
+ const trimmedCode = code.trim();
119
+ switch (position) {
120
+ case "before": {
121
+ const startPos = node.getStart();
122
+ sf.insertText(startPos, trimmedCode + "\n\n");
123
+ break;
124
+ }
125
+ case "after": {
126
+ const endPos = node.getEnd();
127
+ sf.insertText(endPos, "\n\n" + trimmedCode);
128
+ break;
129
+ }
130
+ case "inside_start": {
131
+ // Only valid for classes/interfaces
132
+ const cls = sf.getClass(anchorSymbol) || sf.getInterface(anchorSymbol);
133
+ if (!cls) {
134
+ return {
135
+ success: false,
136
+ newContent: content,
137
+ symbolsAffected: [],
138
+ error: `"inside_start" requires a class or interface. "${anchorSymbol}" is not one.`,
139
+ };
140
+ }
141
+ if ("insertMember" in cls) {
142
+ cls.insertMember(0, trimmedCode);
143
+ }
144
+ break;
145
+ }
146
+ case "inside_end": {
147
+ const cls2 = sf.getClass(anchorSymbol) || sf.getInterface(anchorSymbol);
148
+ if (!cls2) {
149
+ return {
150
+ success: false,
151
+ newContent: content,
152
+ symbolsAffected: [],
153
+ error: `"inside_end" requires a class or interface. "${anchorSymbol}" is not one.`,
154
+ };
155
+ }
156
+ if ("addMember" in cls2) {
157
+ cls2.addMember(trimmedCode);
158
+ }
159
+ break;
160
+ }
161
+ }
162
+ return {
163
+ success: true,
164
+ newContent: sf.getFullText(),
165
+ symbolsAffected: [anchorSymbol],
166
+ };
167
+ }
168
+ catch (error) {
169
+ const msg = error instanceof Error ? error.message : String(error);
170
+ return {
171
+ success: false,
172
+ newContent: content,
173
+ symbolsAffected: [],
174
+ error: `Failed to insert code: ${msg}`,
175
+ };
176
+ }
177
+ finally {
178
+ cleanupSourceFile(sf);
179
+ }
180
+ }
181
+ // ─── Rename Symbol ──────────────────────────────────────────────────
182
+ /**
183
+ * Rename all occurrences of a symbol within a single TypeScript/JavaScript file.
184
+ * This performs a smart rename that understands scoping.
185
+ */
186
+ export function renameTSSymbol(content, oldName, newName, filePath) {
187
+ const sf = createSourceFile(content, filePath);
188
+ try {
189
+ const node = findNode(sf, oldName);
190
+ if (!node) {
191
+ return {
192
+ success: false,
193
+ newContent: content,
194
+ symbolsAffected: [],
195
+ error: `Symbol "${oldName}" not found for renaming`,
196
+ };
197
+ }
198
+ // Use regex-based replacement scoped to identifiers
199
+ // ts-morph rename in single-file mode: find all references within the file
200
+ const fullText = sf.getFullText();
201
+ // Smart rename: replace whole-word occurrences of oldName with newName
202
+ // This is not a naive replace — it respects word boundaries
203
+ const escaped = oldName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
204
+ const regex = new RegExp(`\\b${escaped}\\b`, "g");
205
+ const newText = fullText.replace(regex, newName);
206
+ // Validate result is parseable
207
+ const validationSf = createSourceFile(newText, filePath);
208
+ cleanupSourceFile(validationSf);
209
+ return {
210
+ success: true,
211
+ newContent: newText,
212
+ symbolsAffected: [oldName],
213
+ };
214
+ }
215
+ catch (error) {
216
+ const msg = error instanceof Error ? error.message : String(error);
217
+ return {
218
+ success: false,
219
+ newContent: content,
220
+ symbolsAffected: [],
221
+ error: `Failed to rename "${oldName}" to "${newName}": ${msg}`,
222
+ };
223
+ }
224
+ finally {
225
+ cleanupSourceFile(sf);
226
+ }
227
+ }
228
+ // ─── Remove Symbol ──────────────────────────────────────────────────
229
+ /**
230
+ * Remove a named symbol from a TypeScript/JavaScript file.
231
+ * Returns the file content without the symbol.
232
+ * When className is provided, scopes the search to within that class only.
233
+ */
234
+ export function removeTSSymbol(content, symbolName, filePath, className) {
235
+ const sf = createSourceFile(content, filePath);
236
+ try {
237
+ const node = findNode(sf, symbolName, className);
238
+ if (!node) {
239
+ return {
240
+ success: false,
241
+ newContent: content,
242
+ symbolsAffected: [],
243
+ error: className
244
+ ? `Symbol "${symbolName}" not found in class "${className}" for removal`
245
+ : `Symbol "${symbolName}" not found for removal`,
246
+ };
247
+ }
248
+ node.remove();
249
+ // Clean up double blank lines left behind
250
+ let result = sf.getFullText();
251
+ result = result.replace(/\n{3,}/g, "\n\n");
252
+ return {
253
+ success: true,
254
+ newContent: result,
255
+ symbolsAffected: [symbolName],
256
+ };
257
+ }
258
+ catch (error) {
259
+ const msg = error instanceof Error ? error.message : String(error);
260
+ return {
261
+ success: false,
262
+ newContent: content,
263
+ symbolsAffected: [],
264
+ error: `Failed to remove symbol "${symbolName}": ${msg}`,
265
+ };
266
+ }
267
+ finally {
268
+ cleanupSourceFile(sf);
269
+ }
270
+ }
271
+ // ─── Node Finder ────────────────────────────────────────────────────
272
+ /**
273
+ * Find a named declaration node in a source file.
274
+ * Searches: functions, classes, interfaces, type aliases, enums,
275
+ * class methods, getters, setters, and variable declarations.
276
+ * When className is provided, scopes method/property search to within that class only.
277
+ */
278
+ function findNode(sf, symbolName, className) {
279
+ // If className is provided, scope search to within that class
280
+ if (className) {
281
+ const cls = sf.getClass(className);
282
+ if (!cls)
283
+ return null;
284
+ const method = cls.getMethod(symbolName);
285
+ if (method)
286
+ return method;
287
+ const getter = cls.getGetAccessor(symbolName);
288
+ if (getter)
289
+ return getter;
290
+ const setter = cls.getSetAccessor(symbolName);
291
+ if (setter)
292
+ return setter;
293
+ const prop = cls.getProperty(symbolName);
294
+ if (prop)
295
+ return prop;
296
+ return null;
297
+ }
298
+ // Top-level function
299
+ const func = sf.getFunction(symbolName);
300
+ if (func)
301
+ return func;
302
+ // Class
303
+ const cls = sf.getClass(symbolName);
304
+ if (cls)
305
+ return cls;
306
+ // Interface
307
+ const iface = sf.getInterface(symbolName);
308
+ if (iface)
309
+ return iface;
310
+ // Type alias
311
+ const typeAlias = sf.getTypeAlias(symbolName);
312
+ if (typeAlias)
313
+ return typeAlias;
314
+ // Enum
315
+ const enumDecl = sf.getEnum(symbolName);
316
+ if (enumDecl)
317
+ return enumDecl;
318
+ // Methods inside classes
319
+ for (const c of sf.getClasses()) {
320
+ const method = c.getMethod(symbolName);
321
+ if (method)
322
+ return method;
323
+ const getter = c.getGetAccessor(symbolName);
324
+ if (getter)
325
+ return getter;
326
+ const setter = c.getSetAccessor(symbolName);
327
+ if (setter)
328
+ return setter;
329
+ // Properties
330
+ const prop = c.getProperty(symbolName);
331
+ if (prop)
332
+ return prop;
333
+ }
334
+ // Variable declarations (const, let, var — including arrow functions)
335
+ for (const varStmt of sf.getVariableStatements()) {
336
+ for (const decl of varStmt.getDeclarations()) {
337
+ if (decl.getName() === symbolName) {
338
+ return varStmt;
339
+ }
340
+ }
341
+ }
342
+ return null;
343
+ }
344
+ //# sourceMappingURL=tsWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsWriter.js","sourceRoot":"","sources":["../../../../src/ast/writers/tsWriter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mcp-code-context — Semantic Code Context Server
4
+ *
5
+ * A Model Context Protocol (MCP) server that compresses any code repository
6
+ * into LLM-ready semantic context and provides surgical code editing.
7
+ *
8
+ * Read Tools:
9
+ * 1. get_semantic_repo_map — Compressed structural map of a repo
10
+ * 2. read_file_surgical — Full file or specific symbol extraction
11
+ * 3. analyze_impact — Find all dependents of a modified file
12
+ *
13
+ * Write Tools:
14
+ * 4. write_file_surgical — Replace a symbol's code in-place
15
+ * 5. insert_symbol — Insert code at precise AST positions
16
+ * 6. rename_symbol — Rename across entire repository
17
+ * 7. remove_symbol — Safely delete symbols with dep checking
18
+ *
19
+ * Transport: stdio (JSON-RPC over stdin/stdout)
20
+ * Compatible with: Claude Desktop, Cursor, Windsurf, Copilot, Amazon Q, and any MCP client.
21
+ */
22
+ export declare function handleGetSemanticRepoMap(args: Record<string, unknown>): Promise<{
23
+ content: {
24
+ type: "text";
25
+ text: string;
26
+ }[];
27
+ isError: boolean;
28
+ } | {
29
+ content: {
30
+ type: "text";
31
+ text: string;
32
+ }[];
33
+ }>;
34
+ export declare function handleReadFileSurgical(args: Record<string, unknown>): Promise<{
35
+ content: {
36
+ type: "text";
37
+ text: string;
38
+ }[];
39
+ isError: boolean;
40
+ } | {
41
+ content: {
42
+ type: "text";
43
+ text: string;
44
+ }[];
45
+ }>;
46
+ export declare function handleAnalyzeImpact(args: Record<string, unknown>): Promise<{
47
+ content: {
48
+ type: "text";
49
+ text: string;
50
+ }[];
51
+ isError: boolean;
52
+ } | {
53
+ content: {
54
+ type: "text";
55
+ text: string;
56
+ }[];
57
+ }>;
58
+ export declare function handleWriteFileSurgical(args: Record<string, unknown>): Promise<{
59
+ content: {
60
+ type: "text";
61
+ text: string;
62
+ }[];
63
+ isError: boolean;
64
+ } | {
65
+ content: {
66
+ type: "text";
67
+ text: string;
68
+ }[];
69
+ }>;
70
+ export declare function handleInsertSymbol(args: Record<string, unknown>): Promise<{
71
+ content: {
72
+ type: "text";
73
+ text: string;
74
+ }[];
75
+ isError: boolean;
76
+ } | {
77
+ content: {
78
+ type: "text";
79
+ text: string;
80
+ }[];
81
+ }>;
82
+ export declare function handleRenameSymbol(args: Record<string, unknown>): Promise<{
83
+ content: {
84
+ type: "text";
85
+ text: string;
86
+ }[];
87
+ isError: boolean;
88
+ } | {
89
+ content: {
90
+ type: "text";
91
+ text: string;
92
+ }[];
93
+ }>;
94
+ export declare function handleRemoveSymbol(args: Record<string, unknown>): Promise<{
95
+ content: {
96
+ type: "text";
97
+ text: string;
98
+ }[];
99
+ isError: boolean;
100
+ } | {
101
+ content: {
102
+ type: "text";
103
+ text: string;
104
+ }[];
105
+ }>;
106
+ export declare function handleRollbackFile(args: Record<string, unknown>): Promise<{
107
+ content: {
108
+ type: "text";
109
+ text: string;
110
+ }[];
111
+ isError: boolean;
112
+ } | {
113
+ content: {
114
+ type: "text";
115
+ text: string;
116
+ }[];
117
+ }>;