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.
Files changed (128) hide show
  1. package/.io/RULES.md +12 -0
  2. package/CHANGELOG.md +88 -1
  3. package/README.md +27 -0
  4. package/RELEASE_NOTES_v2.3.0.md +228 -0
  5. package/RELEASE_NOTES_v2.3.1.md +110 -0
  6. package/dist/src/ast/writers/safeRename.d.ts +14 -0
  7. package/dist/src/ast/writers/safeRename.js +258 -0
  8. package/dist/src/ast/writers/safeRename.js.map +1 -0
  9. package/dist/src/ast/writers/symbolWriter.d.ts +2 -0
  10. package/dist/src/ast/writers/symbolWriter.js +9 -14
  11. package/dist/src/ast/writers/symbolWriter.js.map +1 -1
  12. package/dist/src/cache/astCache.d.ts +33 -0
  13. package/dist/src/cache/astCache.js +113 -0
  14. package/dist/src/cache/astCache.js.map +1 -0
  15. package/dist/src/handlers/readHandlers.d.ts +70 -0
  16. package/dist/src/handlers/readHandlers.js +431 -0
  17. package/dist/src/handlers/readHandlers.js.map +1 -0
  18. package/dist/src/handlers/utilHandlers.d.ts +31 -0
  19. package/dist/src/handlers/utilHandlers.js +69 -0
  20. package/dist/src/handlers/utilHandlers.js.map +1 -0
  21. package/dist/src/handlers/writeHandlers.d.ts +57 -0
  22. package/dist/src/handlers/writeHandlers.js +475 -0
  23. package/dist/src/handlers/writeHandlers.js.map +1 -0
  24. package/dist/src/index.d.ts +6 -143
  25. package/dist/src/index.js +77 -1091
  26. package/dist/src/index.js.map +1 -1
  27. package/dist/src/utils/arrayUtils.d.ts +12 -0
  28. package/dist/src/utils/arrayUtils.js +27 -0
  29. package/dist/src/utils/arrayUtils.js.map +1 -0
  30. package/dist/src/utils/constants.d.ts +46 -0
  31. package/dist/src/utils/constants.js +112 -0
  32. package/dist/src/utils/constants.js.map +1 -0
  33. package/dist/src/utils/ignoreManager.d.ts +8 -0
  34. package/dist/src/utils/ignoreManager.js +49 -0
  35. package/dist/src/utils/ignoreManager.js.map +1 -1
  36. package/dist/src/utils/normalization.d.ts +49 -0
  37. package/dist/src/utils/normalization.js +173 -0
  38. package/dist/src/utils/normalization.js.map +1 -0
  39. package/dist/src/utils/projectRoot.d.ts +12 -5
  40. package/dist/src/utils/projectRoot.js +22 -20
  41. package/dist/src/utils/projectRoot.js.map +1 -1
  42. package/dist/src/utils/secureValidation.d.ts +15 -0
  43. package/dist/src/utils/secureValidation.js +41 -0
  44. package/dist/src/utils/secureValidation.js.map +1 -0
  45. package/dist/src/utils/transactionManager.d.ts +45 -0
  46. package/dist/src/utils/transactionManager.js +102 -0
  47. package/dist/src/utils/transactionManager.js.map +1 -0
  48. package/dist/src/utils/validation.d.ts +87 -0
  49. package/dist/src/utils/validation.js +231 -0
  50. package/dist/src/utils/validation.js.map +1 -0
  51. package/docs/ARCHITECTURE.md +300 -0
  52. package/docs/architecture/ADR-001-modular-handlers.md +119 -0
  53. package/package.json +5 -5
  54. package/AGENT_INSTRUCTIONS.md +0 -135
  55. package/DEPLOYMENT_INSTRUCTIONS.md +0 -110
  56. package/MEJORAS_PROPUESTAS.md +0 -324
  57. package/dist/src/tests/test-confirmation-flow.d.ts +0 -1
  58. package/dist/src/tests/test-confirmation-flow.js +0 -43
  59. package/dist/src/tests/test-confirmation-flow.js.map +0 -1
  60. package/dist/tests/debug-replace.d.ts +0 -1
  61. package/dist/tests/debug-replace.js +0 -17
  62. package/dist/tests/debug-replace.js.map +0 -1
  63. package/dist/tests/test-backup-system.d.ts +0 -7
  64. package/dist/tests/test-backup-system.js +0 -152
  65. package/dist/tests/test-backup-system.js.map +0 -1
  66. package/dist/tests/test-confirmation-flow.d.ts +0 -1
  67. package/dist/tests/test-confirmation-flow.js +0 -43
  68. package/dist/tests/test-confirmation-flow.js.map +0 -1
  69. package/dist/tests/test-dart.d.ts +0 -1
  70. package/dist/tests/test-dart.js +0 -242
  71. package/dist/tests/test-dart.js.map +0 -1
  72. package/dist/tests/test-new-tools.d.ts +0 -4
  73. package/dist/tests/test-new-tools.js +0 -147
  74. package/dist/tests/test-new-tools.js.map +0 -1
  75. package/dist/tests/test-php-ast.d.ts +0 -1
  76. package/dist/tests/test-php-ast.js +0 -152
  77. package/dist/tests/test-php-ast.js.map +0 -1
  78. package/dist/tests/test-php.d.ts +0 -1
  79. package/dist/tests/test-php.js +0 -234
  80. package/dist/tests/test-php.js.map +0 -1
  81. package/dist/tests/test-smoke.d.ts +0 -5
  82. package/dist/tests/test-smoke.js +0 -83
  83. package/dist/tests/test-smoke.js.map +0 -1
  84. package/dist/tests/writers/test-crlf-handling.d.ts +0 -4
  85. package/dist/tests/writers/test-crlf-handling.js +0 -73
  86. package/dist/tests/writers/test-crlf-handling.js.map +0 -1
  87. package/dist/tests/writers/test-write-smoke.d.ts +0 -9
  88. package/dist/tests/writers/test-write-smoke.js +0 -346
  89. package/dist/tests/writers/test-write-smoke.js.map +0 -1
  90. package/src/ast/dartCompressor.ts +0 -1013
  91. package/src/ast/phpCompressor.ts +0 -814
  92. package/src/ast/semanticCompressor.ts +0 -808
  93. package/src/ast/writers/dartWriter.ts +0 -648
  94. package/src/ast/writers/phpWriter.ts +0 -508
  95. package/src/ast/writers/pyWriter.ts +0 -446
  96. package/src/ast/writers/symbolWriter.ts +0 -277
  97. package/src/ast/writers/tsWriter.ts +0 -418
  98. package/src/index.ts +0 -1784
  99. package/src/tools/readFileLines.ts +0 -104
  100. package/src/tools/searchCodePattern.ts +0 -129
  101. package/src/utils/backupManager.ts +0 -141
  102. package/src/utils/confirmationCache.ts +0 -61
  103. package/src/utils/diffEngine.ts +0 -223
  104. package/src/utils/fuzzyMatch.ts +0 -86
  105. package/src/utils/ignoreManager.ts +0 -144
  106. package/src/utils/projectRoot.ts +0 -44
  107. package/tests/test-backup-system.ts +0 -174
  108. package/tests/test-confirmation-flow.ts +0 -49
  109. package/tests/test-dart.d.ts +0 -1
  110. package/tests/test-dart.js +0 -209
  111. package/tests/test-dart.js.map +0 -1
  112. package/tests/test-dart.ts +0 -265
  113. package/tests/test-new-tools.ts +0 -165
  114. package/tests/test-php-ast.d.ts +0 -1
  115. package/tests/test-php-ast.js +0 -152
  116. package/tests/test-php-ast.js.map +0 -1
  117. package/tests/test-php-ast.ts +0 -155
  118. package/tests/test-php.d.ts +0 -1
  119. package/tests/test-php.js +0 -234
  120. package/tests/test-php.js.map +0 -1
  121. package/tests/test-php.ts +0 -261
  122. package/tests/test-smoke.d.ts +0 -5
  123. package/tests/test-smoke.js +0 -83
  124. package/tests/test-smoke.js.map +0 -1
  125. package/tests/test-smoke.ts +0 -93
  126. package/tests/writers/test-crlf-handling.ts +0 -100
  127. package/tests/writers/test-write-smoke.ts +0 -568
  128. package/tsconfig.json +0 -19
@@ -1,324 +0,0 @@
1
- # 🚀 Antigravity MCP - Mejoras Propuestas
2
-
3
- ## 📋 Resumen
4
-
5
- Basado en la experiencia real de debugging en DeTodo24, se identificaron limitaciones en las herramientas AST actuales y se proponen 2 nuevas herramientas para mejorar la eficiencia.
6
-
7
- ---
8
-
9
- ## ✅ Nuevas Herramientas Implementadas
10
-
11
- ### 1. `read_file_lines` ⭐ **ALTA PRIORIDAD**
12
-
13
- **Ubicación:** `src/tools/readFileLines.ts`
14
-
15
- **Propósito:** Leer rangos específicos de líneas sin cargar el archivo completo.
16
-
17
- **Casos de uso:**
18
- - Ver líneas 120-135 de un archivo
19
- - Ver ±5 líneas alrededor de un patrón (ej: "HeroBannerWidget")
20
- - Debugging rápido sin consumir tokens del archivo completo
21
-
22
- **Ahorro estimado:** 90% vs `read_file_surgical` para fragmentos pequeños
23
-
24
- **Ejemplo de uso:**
25
- ```typescript
26
- // Modo 1: Rango exacto
27
- read_file_lines({
28
- filePath: "/path/to/file.dart",
29
- startLine: 120,
30
- endLine: 135
31
- })
32
-
33
- // Modo 2: Alrededor de patrón
34
- read_file_lines({
35
- filePath: "/path/to/file.dart",
36
- aroundPattern: "HeroBannerWidget",
37
- contextLines: 5
38
- })
39
- ```
40
-
41
- ---
42
-
43
- ### 2. `search_code_pattern` ⭐ **ALTA PRIORIDAD**
44
-
45
- **Ubicación:** `src/tools/searchCodePattern.ts`
46
-
47
- **Propósito:** Buscar patrones de código en múltiples archivos con contexto.
48
-
49
- **Casos de uso:**
50
- - Buscar todas las ocurrencias de "widget.height"
51
- - Encontrar logs específicos (ej: "🎯 [BUILDER]")
52
- - Buscar imports o referencias a símbolos
53
-
54
- **Ahorro estimado:** 85% vs grep manual + análisis
55
-
56
- **Ejemplo de uso:**
57
- ```typescript
58
- search_code_pattern({
59
- rootDir: "/project",
60
- pattern: "widget\\.height",
61
- fileExtensions: [".dart", ".ts"],
62
- showContext: true,
63
- contextLines: 3,
64
- maxResults: 20
65
- })
66
- ```
67
-
68
- ---
69
-
70
- ## 🔧 Pasos para Integración
71
-
72
- ### 1. Agregar definiciones de herramientas en `src/index.ts`
73
-
74
- Insertar en el array `TOOLS` (después de `rollback_file`):
75
-
76
- ```typescript
77
- {
78
- name: "read_file_lines",
79
- description:
80
- "Reads specific line ranges from a file without loading the entire content. " +
81
- "Supports reading by exact line range (startLine/endLine) or around a pattern match. " +
82
- "More efficient than read_file_surgical when you only need a small fragment of code. " +
83
- "Perfect for debugging, viewing specific code blocks, or extracting context around errors.",
84
- inputSchema: {
85
- type: "object" as const,
86
- properties: {
87
- filePath: {
88
- type: "string",
89
- description: "Absolute path to the source file to read.",
90
- },
91
- startLine: {
92
- type: "number",
93
- description: "Starting line number (1-indexed). Required if using exact range mode.",
94
- },
95
- endLine: {
96
- type: "number",
97
- description: "Ending line number (1-indexed). Required if using exact range mode.",
98
- },
99
- aroundPattern: {
100
- type: "string",
101
- description:
102
- "Search pattern to find in the file. Returns lines around the first match. " +
103
- "Use this mode when you don't know the exact line numbers.",
104
- },
105
- contextLines: {
106
- type: "number",
107
- description:
108
- "Number of lines to include before and after the pattern match. " +
109
- "Defaults to 5. Only used with aroundPattern mode.",
110
- },
111
- },
112
- required: ["filePath"],
113
- },
114
- },
115
- {
116
- name: "search_code_pattern",
117
- description:
118
- "Searches for code patterns across multiple files in a repository. " +
119
- "Returns matches with file paths, line numbers, and optional context lines. " +
120
- "Respects .gitignore rules and allows filtering by file extensions. " +
121
- "More efficient than manual grep when you need structured results with context.",
122
- inputSchema: {
123
- type: "object" as const,
124
- properties: {
125
- rootDir: {
126
- type: "string",
127
- description: "Absolute path to the repository root directory to search.",
128
- },
129
- pattern: {
130
- type: "string",
131
- description:
132
- "Regular expression pattern to search for. Use proper regex escaping " +
133
- "(e.g., 'widget\\\\.height' to match 'widget.height').",
134
- },
135
- fileExtensions: {
136
- type: "array",
137
- items: { type: "string" },
138
- description:
139
- "Array of file extensions to search (e.g., ['.ts', '.dart', '.py']). " +
140
- "Defaults to common code extensions if omitted.",
141
- },
142
- excludeDirs: {
143
- type: "array",
144
- items: { type: "string" },
145
- description:
146
- "Array of directory names to exclude (e.g., ['node_modules', 'dist']). " +
147
- "Defaults to common build/dependency directories.",
148
- },
149
- showContext: {
150
- type: "boolean",
151
- description: "If true, includes surrounding lines for each match. Defaults to true.",
152
- },
153
- contextLines: {
154
- type: "number",
155
- description: "Number of context lines before/after each match. Defaults to 3.",
156
- },
157
- maxResults: {
158
- type: "number",
159
- description: "Maximum number of matches to return. Defaults to 50.",
160
- },
161
- },
162
- required: ["rootDir", "pattern"],
163
- },
164
- },
165
- ```
166
-
167
- ### 2. Agregar imports en `src/index.ts`
168
-
169
- Después de los imports existentes:
170
-
171
- ```typescript
172
- import { readFileLines } from "./tools/readFileLines.js";
173
- import { searchCodePattern } from "./tools/searchCodePattern.js";
174
- ```
175
-
176
- ### 3. Agregar handlers en el switch del dispatcher
177
-
178
- En la función `server.setRequestHandler(CallToolRequestSchema, ...)`, agregar:
179
-
180
- ```typescript
181
- case "read_file_lines":
182
- return await handleReadFileLines(args as Record<string, unknown>);
183
- case "search_code_pattern":
184
- return await handleSearchCodePattern(args as Record<string, unknown>);
185
- ```
186
-
187
- ### 4. Implementar los handlers
188
-
189
- Agregar al final del archivo (antes de `// ─── Bootstrap`):
190
-
191
- ```typescript
192
- // ─── Tool: read_file_lines ──────────────────────────────────────────
193
-
194
- export async function handleReadFileLines(args: Record<string, unknown>) {
195
- const result = readFileLines(args as any);
196
-
197
- if (!result.success) {
198
- return errorResponse(result.error || "Unknown error reading file lines");
199
- }
200
-
201
- const { content, lineRange } = result;
202
- const header = lineRange
203
- ? `// Lines ${lineRange.start}-${lineRange.end}\n// File: ${args.filePath}\n\n`
204
- : `// File: ${args.filePath}\n\n`;
205
-
206
- return {
207
- content: [
208
- {
209
- type: "text" as const,
210
- text: header + content,
211
- },
212
- ],
213
- };
214
- }
215
-
216
- // ─── Tool: search_code_pattern ──────────────────────────────────────
217
-
218
- export async function handleSearchCodePattern(args: Record<string, unknown>) {
219
- const result = searchCodePattern(args as any);
220
-
221
- if (!result.success) {
222
- return errorResponse(result.error || "Unknown error searching code");
223
- }
224
-
225
- const { matches, totalMatches } = result;
226
-
227
- if (!matches || matches.length === 0) {
228
- return {
229
- content: [
230
- {
231
- type: "text" as const,
232
- text: `# Search Results\n\nNo matches found for pattern: "${args.pattern}"`,
233
- },
234
- ],
235
- };
236
- }
237
-
238
- const lines: string[] = [
239
- `# Search Results`,
240
- ``,
241
- `**Pattern:** \`${args.pattern}\``,
242
- `**Root:** \`${args.rootDir}\``,
243
- `**Matches:** ${totalMatches} (showing ${matches.length})`,
244
- ``,
245
- ];
246
-
247
- for (const match of matches) {
248
- lines.push(`## \`${match.file}\` (line ${match.lineNumber})`);
249
- lines.push(``);
250
-
251
- if (match.context) {
252
- lines.push("```");
253
- lines.push(...match.context);
254
- lines.push("```");
255
- } else {
256
- lines.push(`\`\`\`\n${match.line}\n\`\`\``);
257
- }
258
-
259
- lines.push(``);
260
- }
261
-
262
- return {
263
- content: [
264
- {
265
- type: "text" as const,
266
- text: lines.join("\n"),
267
- },
268
- ],
269
- };
270
- }
271
- ```
272
-
273
- ### 5. Compilar y probar
274
-
275
- ```bash
276
- cd C:\code\antigravity-mcp-context
277
- npm run build
278
- ```
279
-
280
- ### 6. Actualizar versión
281
-
282
- En `src/index.ts`, cambiar:
283
- ```typescript
284
- const SERVER_VERSION = "2.2.0"; // Era "2.0.0"
285
- ```
286
-
287
- ---
288
-
289
- ## 📊 Comparación de Eficiencia
290
-
291
- | Tarea | Herramienta Actual | Nueva Herramienta | Ahorro |
292
- |-------|-------------------|-------------------|--------|
293
- | Ver líneas 120-135 | `read_file_surgical` (2500 tokens) | `read_file_lines` (200 tokens) | 92% |
294
- | Buscar patrón en 50 archivos | `grep` manual + análisis | `search_code_pattern` | 85% |
295
- | Ver contexto de error | Leer archivo completo | `read_file_lines` con `aroundPattern` | 90% |
296
-
297
- ---
298
-
299
- ## 🎯 Beneficios Clave
300
-
301
- 1. **Menor consumo de tokens:** 60-90% de ahorro en operaciones de lectura
302
- 2. **Debugging más rápido:** Acceso directo a fragmentos específicos
303
- 3. **Búsqueda estructurada:** Resultados con contexto automático
304
- 4. **Compatibilidad total:** Se integra con herramientas AST existentes
305
-
306
- ---
307
-
308
- ## 📝 Notas de Implementación
309
-
310
- - ✅ `.mcp-backups/` ya está en `.gitignore` (línea 31)
311
- - ✅ Ambas herramientas respetan `.gitignore` usando `IgnoreManager`
312
- - ✅ Manejo de errores consistente con herramientas existentes
313
- - ✅ TypeScript types completos
314
-
315
- ---
316
-
317
- ## 🚀 Próximos Pasos
318
-
319
- 1. Integrar las herramientas siguiendo los pasos anteriores
320
- 2. Compilar y probar con `npm run build`
321
- 3. Recargar Amazon Q para detectar las nuevas herramientas
322
- 4. Documentar en CHANGELOG.md
323
-
324
- **Tiempo estimado de integración:** 15-20 minutos
@@ -1 +0,0 @@
1
- export {};
@@ -1,43 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { handleWriteFileSurgical, handleRollbackFile } from '../dist/index.js';
4
- async function testWorkflow() {
5
- const testFile = path.resolve('test-artifact.ts');
6
- const initialContent = 'export class Old { build() { return 1; } }';
7
- fs.writeFileSync(testFile, initialContent, 'utf-8');
8
- console.log('--- Step 1: Preview (Dry-Run) ---');
9
- const previewArgs = {
10
- filePath: testFile,
11
- symbolName: 'build',
12
- newContent: ' build() { return "new value"; }',
13
- className: 'Old'
14
- };
15
- const p1 = await handleWriteFileSurgical(previewArgs);
16
- const p1Text = p1.content[0].text;
17
- console.log('Preview Result:', p1Text.split('\n')[0]);
18
- const tokenMatch = p1Text.match(/confirmationToken: "([^"]+)"/);
19
- if (!tokenMatch)
20
- throw new Error('No token found');
21
- const token = tokenMatch[1];
22
- console.log('Token found:', token);
23
- console.log('\n--- Step 2: Confirm ---');
24
- const confirmArgs = {
25
- ...previewArgs,
26
- confirmationToken: token,
27
- confirm: true
28
- };
29
- const p2 = await handleWriteFileSurgical(confirmArgs);
30
- console.log('Confirm Result:', p2.content[0].text.split('\n')[0]);
31
- console.log('File Content:', fs.readFileSync(testFile, 'utf-8'));
32
- console.log('\n--- Step 3: Rollback ---');
33
- await handleRollbackFile({ filePath: testFile, steps: 1 });
34
- console.log('After Rollback:', fs.readFileSync(testFile, 'utf-8'));
35
- // Clean up
36
- fs.unlinkSync(testFile);
37
- const backupDir = path.join(path.dirname(testFile), '.mcp-backups');
38
- if (fs.existsSync(backupDir)) {
39
- fs.rmSync(backupDir, { recursive: true, force: true });
40
- }
41
- }
42
- testWorkflow().catch(console.error);
43
- //# sourceMappingURL=test-confirmation-flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-confirmation-flow.js","sourceRoot":"","sources":["../../../src/tests/test-confirmation-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,4CAA4C,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,mCAAmC;QAC/C,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG;QAClB,GAAG,WAAW;QACd,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;IACX,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,17 +0,0 @@
1
- import { replaceDartSymbol } from "../src/ast/writers/dartWriter.js";
2
- const dartCRLF = "class BadgeService {\r\n static void update({int? cart}) {\r\n if (cart != null) {\r\n print(cart);\r\n }\r\n }\r\n}\r\n";
3
- const newMethod = " static void update({int? cart}) {\r\n if (cart != null) {\r\n print('Updated: $cart');\r\n }\r\n }";
4
- console.log("=== ORIGINAL ===");
5
- console.log(dartCRLF);
6
- console.log("\n=== NEW CONTENT ===");
7
- console.log(newMethod);
8
- const result = replaceDartSymbol(dartCRLF, "update", newMethod);
9
- console.log("\n=== RESULT ===");
10
- console.log(JSON.stringify(result, null, 2));
11
- console.log("\n=== NEW FILE CONTENT ===");
12
- console.log(result.newContent);
13
- console.log("\n=== BRACE COUNT ===");
14
- const openBraces = (result.newContent.match(/{/g) || []).length;
15
- const closeBraces = (result.newContent.match(/}/g) || []).length;
16
- console.log(`Open: ${openBraces}, Close: ${closeBraces}`);
17
- //# sourceMappingURL=debug-replace.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug-replace.js","sourceRoot":"","sources":["../../tests/debug-replace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,QAAQ,GAAG,uIAAuI,CAAC;AAEzJ,MAAM,SAAS,GAAG,kHAAkH,CAAC;AAErI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEhE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAChE,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AACjE,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,YAAY,WAAW,EAAE,CAAC,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Tests for Centralized Backup System
3
- * - Backup creation in project root
4
- * - Folder structure preservation
5
- * - clean_backups functionality
6
- */
7
- export {};
@@ -1,152 +0,0 @@
1
- /**
2
- * Tests for Centralized Backup System
3
- * - Backup creation in project root
4
- * - Folder structure preservation
5
- * - clean_backups functionality
6
- */
7
- import * as fs from 'fs';
8
- import * as path from 'path';
9
- import { createBackup, cleanAllBackups } from '../src/utils/backupManager.js';
10
- import { findProjectRoot } from '../src/utils/projectRoot.js';
11
- const TEST_DIR = path.join(process.cwd(), 'tests', 'fixtures', 'backup-test-project');
12
- const TEST_FILE = path.join(TEST_DIR, 'src', 'components', 'Button.tsx');
13
- function setupTestProject() {
14
- // Create test project structure
15
- if (fs.existsSync(TEST_DIR)) {
16
- fs.rmSync(TEST_DIR, { recursive: true, force: true });
17
- }
18
- fs.mkdirSync(path.join(TEST_DIR, 'src', 'components'), { recursive: true });
19
- fs.writeFileSync(TEST_FILE, 'export const Button = () => <button>Click</button>;');
20
- // Create package.json to mark as project root
21
- fs.writeFileSync(path.join(TEST_DIR, 'package.json'), JSON.stringify({ name: 'backup-test-project' }));
22
- }
23
- function cleanupTestProject() {
24
- if (fs.existsSync(TEST_DIR)) {
25
- fs.rmSync(TEST_DIR, { recursive: true, force: true });
26
- }
27
- }
28
- function runTests() {
29
- console.log('\n🧪 Testing Centralized Backup System...\n');
30
- let passed = 0;
31
- let failed = 0;
32
- // Setup
33
- setupTestProject();
34
- try {
35
- // Test 1: Find project root
36
- console.log('Test 1: Find project root');
37
- const projectRoot = findProjectRoot(TEST_FILE);
38
- if (projectRoot === TEST_DIR) {
39
- console.log('✅ PASS: Project root found correctly');
40
- passed++;
41
- }
42
- else {
43
- console.log(`❌ FAIL: Expected ${TEST_DIR}, got ${projectRoot}`);
44
- failed++;
45
- }
46
- // Test 2: Create backup in centralized location
47
- console.log('\nTest 2: Create backup in centralized location');
48
- const backupPath = createBackup(TEST_FILE);
49
- const expectedBackupDir = path.join(TEST_DIR, '.mcp-backups', 'src', 'components');
50
- const backupExists = fs.existsSync(backupPath);
51
- const inCorrectLocation = backupPath.startsWith(expectedBackupDir);
52
- if (backupExists && inCorrectLocation) {
53
- console.log('✅ PASS: Backup created in centralized location');
54
- console.log(` Location: ${backupPath}`);
55
- passed++;
56
- }
57
- else {
58
- console.log('❌ FAIL: Backup not in correct location');
59
- console.log(` Expected dir: ${expectedBackupDir}`);
60
- console.log(` Actual path: ${backupPath}`);
61
- failed++;
62
- }
63
- // Test 3: Backup preserves folder structure
64
- console.log('\nTest 3: Backup preserves folder structure');
65
- const relativePath = path.relative(TEST_DIR, TEST_FILE);
66
- const expectedStructure = path.join('.mcp-backups', relativePath);
67
- const actualStructure = path.relative(TEST_DIR, backupPath.replace(/\.\d+\.backup$/, ''));
68
- if (actualStructure.startsWith(expectedStructure)) {
69
- console.log('✅ PASS: Folder structure preserved');
70
- console.log(` Structure: ${expectedStructure}`);
71
- passed++;
72
- }
73
- else {
74
- console.log('❌ FAIL: Folder structure not preserved');
75
- console.log(` Expected: ${expectedStructure}`);
76
- console.log(` Actual: ${actualStructure}`);
77
- failed++;
78
- }
79
- // Test 4: Multiple backups in same location
80
- console.log('\nTest 4: Multiple backups (rolling system)');
81
- const backup2 = createBackup(TEST_FILE);
82
- const backup3 = createBackup(TEST_FILE);
83
- const allBackups = fs.readdirSync(expectedBackupDir)
84
- .filter(f => f.startsWith('Button.tsx.') && f.endsWith('.backup'));
85
- if (allBackups.length === 3) {
86
- console.log('✅ PASS: Multiple backups created');
87
- console.log(` Backups: ${allBackups.join(', ')}`);
88
- passed++;
89
- }
90
- else {
91
- console.log(`❌ FAIL: Expected 3 backups, found ${allBackups.length}`);
92
- failed++;
93
- }
94
- // Test 5: clean_backups removes all backups
95
- console.log('\nTest 5: clean_backups removes all backups');
96
- const result = cleanAllBackups(TEST_DIR);
97
- const backupDirExists = fs.existsSync(path.join(TEST_DIR, '.mcp-backups'));
98
- if (result && !backupDirExists) {
99
- console.log('✅ PASS: All backups cleaned');
100
- console.log(` Backup directory removed successfully`);
101
- passed++;
102
- }
103
- else {
104
- console.log('❌ FAIL: Backups not cleaned properly');
105
- console.log(` Result: ${result}, Dir exists: ${backupDirExists}`);
106
- failed++;
107
- }
108
- // Test 6: clean_backups on non-existent directory
109
- console.log('\nTest 6: clean_backups on non-existent directory');
110
- const result2 = cleanAllBackups(TEST_DIR);
111
- if (!result2) {
112
- console.log('✅ PASS: Returns false when backup directory not found');
113
- passed++;
114
- }
115
- else {
116
- console.log('❌ FAIL: Should return false when directory not found');
117
- failed++;
118
- }
119
- // Test 7: Backup in nested project structure
120
- console.log('\nTest 7: Backup in deeply nested file');
121
- const deepFile = path.join(TEST_DIR, 'src', 'features', 'auth', 'components', 'LoginForm.tsx');
122
- fs.mkdirSync(path.dirname(deepFile), { recursive: true });
123
- fs.writeFileSync(deepFile, 'export const LoginForm = () => <form />;');
124
- const deepBackup = createBackup(deepFile);
125
- const expectedDeepDir = path.join(TEST_DIR, '.mcp-backups', 'src', 'features', 'auth', 'components');
126
- if (deepBackup.startsWith(expectedDeepDir)) {
127
- console.log('✅ PASS: Deep nesting preserved');
128
- console.log(` Path: ${path.relative(TEST_DIR, deepBackup)}`);
129
- passed++;
130
- }
131
- else {
132
- console.log('❌ FAIL: Deep nesting not preserved');
133
- failed++;
134
- }
135
- }
136
- catch (error) {
137
- console.log(`❌ FAIL: Unexpected error: ${error}`);
138
- failed++;
139
- }
140
- finally {
141
- // Cleanup
142
- cleanupTestProject();
143
- }
144
- console.log('\n══════════════════════════════════════════════════');
145
- console.log(`📊 Results: ${passed} passed, ${failed} failed (${passed + failed} total)`);
146
- console.log('══════════════════════════════════════════════════\n');
147
- if (failed > 0) {
148
- process.exit(1);
149
- }
150
- }
151
- runTests();
152
- //# sourceMappingURL=test-backup-system.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-backup-system.js","sourceRoot":"","sources":["../../tests/test-backup-system.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,43 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { handleWriteFileSurgical, handleRollbackFile } from '../src/index.js';
4
- async function testWorkflow() {
5
- const testFile = path.resolve('test-artifact.ts');
6
- const initialContent = 'export class Old { build() { return 1; } }';
7
- fs.writeFileSync(testFile, initialContent, 'utf-8');
8
- console.log('--- Step 1: Preview (Dry-Run) ---');
9
- const previewArgs = {
10
- filePath: testFile,
11
- symbolName: 'build',
12
- newContent: ' build() { return "new value"; }',
13
- className: 'Old'
14
- };
15
- const p1 = await handleWriteFileSurgical(previewArgs);
16
- const p1Text = p1.content[0].text;
17
- console.log('Preview Result:', p1Text.split('\n')[0]);
18
- const tokenMatch = p1Text.match(/confirmationToken: "([^"]+)"/);
19
- if (!tokenMatch)
20
- throw new Error('No token found');
21
- const token = tokenMatch[1];
22
- console.log('Token found:', token);
23
- console.log('\n--- Step 2: Confirm ---');
24
- const confirmArgs = {
25
- ...previewArgs,
26
- confirmationToken: token,
27
- confirm: true
28
- };
29
- const p2 = await handleWriteFileSurgical(confirmArgs);
30
- console.log('Confirm Result:', p2.content[0].text.split('\n')[0]);
31
- console.log('File Content:', fs.readFileSync(testFile, 'utf-8'));
32
- console.log('\n--- Step 3: Rollback ---');
33
- await handleRollbackFile({ filePath: testFile, steps: 1 });
34
- console.log('After Rollback:', fs.readFileSync(testFile, 'utf-8'));
35
- // Clean up
36
- fs.unlinkSync(testFile);
37
- const backupDir = path.join(path.dirname(testFile), '.mcp-backups');
38
- if (fs.existsSync(backupDir)) {
39
- fs.rmSync(backupDir, { recursive: true, force: true });
40
- }
41
- }
42
- testWorkflow().catch(console.error);
43
- //# sourceMappingURL=test-confirmation-flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-confirmation-flow.js","sourceRoot":"","sources":["../../tests/test-confirmation-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,4CAA4C,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,mCAAmC;QAC/C,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG;QAClB,GAAG,WAAW;QACd,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;IACX,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};