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
package/MEJORAS_PROPUESTAS.md
DELETED
|
@@ -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,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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;AACtF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAEzE,SAAS,gBAAgB;IACvB,gCAAgC;IAChC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,qDAAqD,CAAC,CAAC;IAEnF,8CAA8C;IAC9C,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EACnC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAChD,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAE3D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,QAAQ;IACR,gBAAgB,EAAE,CAAC;IAEnB,IAAI,CAAC;QACH,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,SAAS,WAAW,EAAE,CAAC,CAAC;YAChE,MAAM,EAAE,CAAC;QACX,CAAC;QAED,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEnE,IAAI,YAAY,IAAI,iBAAiB,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,oBAAoB,iBAAiB,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;YAC7C,MAAM,EAAE,CAAC;QACX,CAAC;QAED,4CAA4C;QAC5C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;QAE1F,IAAI,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,iBAAiB,iBAAiB,EAAE,CAAC,CAAC;YAClD,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,iBAAiB,EAAE,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,cAAc,eAAe,EAAE,CAAC,CAAC;YAC7C,MAAM,EAAE,CAAC;QACX,CAAC;QAED,4CAA4C;QAC5C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC;aACjD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAErE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,MAAM,EAAE,CAAC;QACX,CAAC;QAED,4CAA4C;QAC5C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;QAE3E,IAAI,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,iBAAiB,eAAe,EAAE,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC;QACX,CAAC;QAED,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC;QACX,CAAC;QAED,6CAA6C;QAC7C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;QAC/F,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,0CAA0C,CAAC,CAAC;QAEvE,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAErG,IAAI,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,MAAM,EAAE,CAAC;QACX,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC;IACX,CAAC;YAAS,CAAC;QACT,UAAU;QACV,kBAAkB,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,YAAY,MAAM,YAAY,MAAM,GAAG,MAAM,SAAS,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAEpE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,QAAQ,EAAE,CAAC"}
|
|
@@ -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 {};
|