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
|
@@ -1,346 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* test-write-smoke.ts — Smoke Tests for Surgical Writing Tools
|
|
3
|
-
*
|
|
4
|
-
* Tests all 4 write operations (replace, insert, rename, remove)
|
|
5
|
-
* across all 4 supported languages (TypeScript, PHP, Dart, Python).
|
|
6
|
-
*
|
|
7
|
-
* Run: npm run build && node dist/tests/writers/test-write-smoke.js
|
|
8
|
-
*/
|
|
9
|
-
import { replaceSymbol, insertCode, renameInFile, removeSymbolFromFile, } from "../../src/ast/writers/symbolWriter.js";
|
|
10
|
-
import { generateDiff } from "../../src/utils/diffEngine.js";
|
|
11
|
-
// ─── Test Harness ───────────────────────────────────────────────────
|
|
12
|
-
let passed = 0;
|
|
13
|
-
let failed = 0;
|
|
14
|
-
function assert(condition, label, detail) {
|
|
15
|
-
if (condition) {
|
|
16
|
-
passed++;
|
|
17
|
-
console.log(` ✅ ${label}`);
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
failed++;
|
|
21
|
-
console.error(` ❌ ${label}`);
|
|
22
|
-
if (detail)
|
|
23
|
-
console.error(` ${detail}`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function section(title) {
|
|
27
|
-
console.log(`\n━━━ ${title} ━━━`);
|
|
28
|
-
}
|
|
29
|
-
// ─── Test Fixtures ──────────────────────────────────────────────────
|
|
30
|
-
const TS_FIXTURE = `
|
|
31
|
-
import { Something } from "./something.js";
|
|
32
|
-
|
|
33
|
-
const API_URL = "https://example.com";
|
|
34
|
-
|
|
35
|
-
export interface UserConfig {
|
|
36
|
-
name: string;
|
|
37
|
-
email: string;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export class UserService {
|
|
41
|
-
private users: Map<string, UserConfig> = new Map();
|
|
42
|
-
|
|
43
|
-
getUser(id: string): UserConfig | undefined {
|
|
44
|
-
return this.users.get(id);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
addUser(id: string, config: UserConfig): void {
|
|
48
|
-
this.users.set(id, config);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
deleteUser(id: string): boolean {
|
|
52
|
-
return this.users.delete(id);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function formatUser(user: UserConfig): string {
|
|
57
|
-
return \`\${user.name} <\${user.email}>\`;
|
|
58
|
-
}
|
|
59
|
-
`.trim();
|
|
60
|
-
const PHP_FIXTURE = `<?php
|
|
61
|
-
|
|
62
|
-
namespace App\\Services;
|
|
63
|
-
|
|
64
|
-
use App\\Models\\User;
|
|
65
|
-
use App\\Contracts\\UserRepositoryInterface;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Manages user operations.
|
|
69
|
-
*/
|
|
70
|
-
class UserService
|
|
71
|
-
{
|
|
72
|
-
private UserRepositoryInterface $repository;
|
|
73
|
-
|
|
74
|
-
public function __construct(UserRepositoryInterface $repository)
|
|
75
|
-
{
|
|
76
|
-
$this->repository = $repository;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Find a user by ID.
|
|
81
|
-
*/
|
|
82
|
-
public function findUser(int $id): ?User
|
|
83
|
-
{
|
|
84
|
-
return $this->repository->find($id);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Create a new user.
|
|
89
|
-
*/
|
|
90
|
-
public function createUser(array $data): User
|
|
91
|
-
{
|
|
92
|
-
return $this->repository->create($data);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public function deleteUser(int $id): bool
|
|
96
|
-
{
|
|
97
|
-
return $this->repository->delete($id);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function helperFunction(): string
|
|
102
|
-
{
|
|
103
|
-
return 'hello';
|
|
104
|
-
}
|
|
105
|
-
`;
|
|
106
|
-
const DART_FIXTURE = `
|
|
107
|
-
import 'package:flutter/material.dart';
|
|
108
|
-
|
|
109
|
-
/// A service for managing user data.
|
|
110
|
-
class UserService {
|
|
111
|
-
final Map<String, dynamic> _cache = {};
|
|
112
|
-
|
|
113
|
-
/// Gets a user by ID.
|
|
114
|
-
Future<Map<String, dynamic>?> getUser(String id) async {
|
|
115
|
-
if (_cache.containsKey(id)) {
|
|
116
|
-
return _cache[id];
|
|
117
|
-
}
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/// Adds a user to the cache.
|
|
122
|
-
void addUser(String id, Map<String, dynamic> data) {
|
|
123
|
-
_cache[id] = data;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/// Removes a user from the cache.
|
|
127
|
-
bool removeUser(String id) {
|
|
128
|
-
return _cache.remove(id) != null;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/// Formats a user name for display.
|
|
133
|
-
String formatUserName(String first, String last) {
|
|
134
|
-
return '\$first \$last';
|
|
135
|
-
}
|
|
136
|
-
`.trim();
|
|
137
|
-
const PY_FIXTURE = `
|
|
138
|
-
from typing import Optional, Dict
|
|
139
|
-
|
|
140
|
-
class UserService:
|
|
141
|
-
"""Manages user operations."""
|
|
142
|
-
|
|
143
|
-
def __init__(self):
|
|
144
|
-
self._users: Dict[str, dict] = {}
|
|
145
|
-
|
|
146
|
-
def get_user(self, user_id: str) -> Optional[dict]:
|
|
147
|
-
"""Get a user by ID."""
|
|
148
|
-
return self._users.get(user_id)
|
|
149
|
-
|
|
150
|
-
def add_user(self, user_id: str, data: dict) -> None:
|
|
151
|
-
"""Add a user."""
|
|
152
|
-
self._users[user_id] = data
|
|
153
|
-
|
|
154
|
-
def delete_user(self, user_id: str) -> bool:
|
|
155
|
-
"""Delete a user."""
|
|
156
|
-
if user_id in self._users:
|
|
157
|
-
del self._users[user_id]
|
|
158
|
-
return True
|
|
159
|
-
return False
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
def format_user(user: dict) -> str:
|
|
163
|
-
"""Format a user for display."""
|
|
164
|
-
return f"{user['name']} <{user['email']}>"
|
|
165
|
-
`.trim();
|
|
166
|
-
// ─── TypeScript Tests ───────────────────────────────────────────────
|
|
167
|
-
function testTypeScript() {
|
|
168
|
-
section("TypeScript / JavaScript");
|
|
169
|
-
// Replace
|
|
170
|
-
const replaceResult = replaceSymbol("test.ts", TS_FIXTURE, "formatUser", `export function formatUser(user: UserConfig): string {\n return \`User: \${user.name} (\${user.email})\`;\n}`);
|
|
171
|
-
assert(replaceResult.success, "Replace: formatUser");
|
|
172
|
-
assert(replaceResult.newContent.includes("User: ${user.name}"), "Replace: new content is present");
|
|
173
|
-
assert(replaceResult.newContent.includes("class UserService"), "Replace: other symbols preserved");
|
|
174
|
-
// Insert
|
|
175
|
-
const insertResult = insertCode("test.ts", TS_FIXTURE, `export function greetUser(user: UserConfig): string {\n return \`Hello, \${user.name}!\`;\n}`, "formatUser", "after");
|
|
176
|
-
assert(insertResult.success, "Insert: after formatUser");
|
|
177
|
-
assert(insertResult.newContent.includes("greetUser"), "Insert: new function is present");
|
|
178
|
-
// Insert inside class
|
|
179
|
-
const insertClassResult = insertCode("test.ts", TS_FIXTURE, `getUserCount(): number {\n return this.users.size;\n}`, "UserService", "inside_end");
|
|
180
|
-
assert(insertClassResult.success, "Insert: inside_end of UserService");
|
|
181
|
-
assert(insertClassResult.newContent.includes("getUserCount"), "Insert: method added to class");
|
|
182
|
-
// Rename
|
|
183
|
-
const renameResult = renameInFile("test.ts", TS_FIXTURE, "UserService", "AccountService");
|
|
184
|
-
assert(renameResult.success, "Rename: UserService → AccountService");
|
|
185
|
-
assert(renameResult.newContent.includes("class AccountService"), "Rename: class declaration updated");
|
|
186
|
-
assert(!renameResult.newContent.includes("class UserService"), "Rename: old name removed");
|
|
187
|
-
// Remove
|
|
188
|
-
const removeResult = removeSymbolFromFile("test.ts", TS_FIXTURE, "formatUser");
|
|
189
|
-
assert(removeResult.success, "Remove: formatUser");
|
|
190
|
-
assert(!removeResult.newContent.includes("function formatUser"), "Remove: function is gone");
|
|
191
|
-
assert(removeResult.newContent.includes("class UserService"), "Remove: other symbols still exist");
|
|
192
|
-
// Remove interface
|
|
193
|
-
const removeIfaceResult = removeSymbolFromFile("test.ts", TS_FIXTURE, "UserConfig");
|
|
194
|
-
assert(removeIfaceResult.success, "Remove: UserConfig interface");
|
|
195
|
-
assert(!removeIfaceResult.newContent.includes("interface UserConfig"), "Remove: interface is gone");
|
|
196
|
-
}
|
|
197
|
-
// ─── PHP Tests ──────────────────────────────────────────────────────
|
|
198
|
-
function testPHP() {
|
|
199
|
-
section("PHP");
|
|
200
|
-
// Replace
|
|
201
|
-
const replaceResult = replaceSymbol("test.php", PHP_FIXTURE, "findUser", ` public function findUser(int $id): ?User\n {\n $cached = $this->cache->get($id);\n return $cached ?? $this->repository->find($id);\n }`);
|
|
202
|
-
assert(replaceResult.success, "Replace: findUser method");
|
|
203
|
-
assert(replaceResult.newContent.includes("$cached"), "Replace: new content present");
|
|
204
|
-
// Insert
|
|
205
|
-
const insertResult = insertCode("test.php", PHP_FIXTURE, ` public function updateUser(int $id, array $data): User\n {\n return $this->repository->update($id, $data);\n }`, "createUser", "after");
|
|
206
|
-
assert(insertResult.success, "Insert: after createUser");
|
|
207
|
-
assert(insertResult.newContent.includes("updateUser"), "Insert: method present");
|
|
208
|
-
// Rename
|
|
209
|
-
const renameResult = renameInFile("test.php", PHP_FIXTURE, "UserService", "AccountService");
|
|
210
|
-
assert(renameResult.success, "Rename: UserService → AccountService");
|
|
211
|
-
assert(renameResult.newContent.includes("class AccountService"), "Rename: class updated");
|
|
212
|
-
// Remove
|
|
213
|
-
const removeResult = removeSymbolFromFile("test.php", PHP_FIXTURE, "helperFunction");
|
|
214
|
-
assert(removeResult.success, "Remove: helperFunction");
|
|
215
|
-
assert(!removeResult.newContent.includes("function helperFunction"), "Remove: function gone");
|
|
216
|
-
assert(removeResult.newContent.includes("class UserService"), "Remove: class preserved");
|
|
217
|
-
}
|
|
218
|
-
// ─── Dart Tests ─────────────────────────────────────────────────────
|
|
219
|
-
function testDart() {
|
|
220
|
-
section("Dart");
|
|
221
|
-
// Replace
|
|
222
|
-
const replaceResult = replaceSymbol("test.dart", DART_FIXTURE, "formatUserName", `String formatUserName(String first, String last) {\n return '\${last.toUpperCase()}, \$first';\n}`);
|
|
223
|
-
assert(replaceResult.success, "Replace: formatUserName");
|
|
224
|
-
assert(replaceResult.newContent.includes("toUpperCase"), "Replace: new content present");
|
|
225
|
-
// Insert
|
|
226
|
-
const insertResult = insertCode("test.dart", DART_FIXTURE, `/// Checks if a user exists.\nbool userExists(String id) {\n return false;\n}`, "formatUserName", "after");
|
|
227
|
-
assert(insertResult.success, "Insert: after formatUserName");
|
|
228
|
-
assert(insertResult.newContent.includes("userExists"), "Insert: function present");
|
|
229
|
-
// Insert inside class
|
|
230
|
-
const insertClassResult = insertCode("test.dart", DART_FIXTURE, ` /// Clears the entire cache.\n void clearCache() {\n _cache.clear();\n }`, "UserService", "inside_end");
|
|
231
|
-
assert(insertClassResult.success, "Insert: inside_end of UserService");
|
|
232
|
-
assert(insertClassResult.newContent.includes("clearCache"), "Insert: method in class");
|
|
233
|
-
// Rename
|
|
234
|
-
const renameResult = renameInFile("test.dart", DART_FIXTURE, "UserService", "ProfileService");
|
|
235
|
-
assert(renameResult.success, "Rename: UserService → ProfileService");
|
|
236
|
-
assert(renameResult.newContent.includes("class ProfileService"), "Rename: class updated");
|
|
237
|
-
// Remove
|
|
238
|
-
const removeResult = removeSymbolFromFile("test.dart", DART_FIXTURE, "formatUserName");
|
|
239
|
-
assert(removeResult.success, "Remove: formatUserName");
|
|
240
|
-
assert(!removeResult.newContent.includes("formatUserName"), "Remove: function gone");
|
|
241
|
-
assert(removeResult.newContent.includes("class UserService"), "Remove: class preserved");
|
|
242
|
-
}
|
|
243
|
-
// ─── Python Tests ───────────────────────────────────────────────────
|
|
244
|
-
function testPython() {
|
|
245
|
-
section("Python");
|
|
246
|
-
// Replace
|
|
247
|
-
const replaceResult = replaceSymbol("test.py", PY_FIXTURE, "format_user", `def format_user(user: dict) -> str:\n """Format a user for display with title."""\n name = user['name'].title()\n return f"{name} <{user['email']}>"`);
|
|
248
|
-
assert(replaceResult.success, "Replace: format_user");
|
|
249
|
-
assert(replaceResult.newContent.includes(".title()"), "Replace: new content present");
|
|
250
|
-
// Insert
|
|
251
|
-
const insertResult = insertCode("test.py", PY_FIXTURE, `def validate_email(email: str) -> bool:\n """Check if email is valid."""\n return "@" in email and "." in email`, "format_user", "after");
|
|
252
|
-
assert(insertResult.success, "Insert: after format_user");
|
|
253
|
-
assert(insertResult.newContent.includes("validate_email"), "Insert: function present");
|
|
254
|
-
// Rename
|
|
255
|
-
const renameResult = renameInFile("test.py", PY_FIXTURE, "UserService", "AccountService");
|
|
256
|
-
assert(renameResult.success, "Rename: UserService → AccountService");
|
|
257
|
-
assert(renameResult.newContent.includes("class AccountService"), "Rename: class updated");
|
|
258
|
-
// Remove
|
|
259
|
-
const removeResult = removeSymbolFromFile("test.py", PY_FIXTURE, "format_user");
|
|
260
|
-
assert(removeResult.success, "Remove: format_user");
|
|
261
|
-
assert(!removeResult.newContent.includes("def format_user"), "Remove: function gone");
|
|
262
|
-
assert(removeResult.newContent.includes("class UserService"), "Remove: class preserved");
|
|
263
|
-
}
|
|
264
|
-
// ─── Class Name Filtering Tests ───────────────────────────────────────
|
|
265
|
-
function testClassName() {
|
|
266
|
-
section("ClassName Disambiguation");
|
|
267
|
-
const DART_MULTI_CLASS = `
|
|
268
|
-
class ClassA {
|
|
269
|
-
void build() {
|
|
270
|
-
print('A');
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
class ClassB {
|
|
275
|
-
void build() {
|
|
276
|
-
print('B');
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
`;
|
|
280
|
-
// Try to remove "build" from ClassB
|
|
281
|
-
const removeResult = removeSymbolFromFile("test_multi.dart", DART_MULTI_CLASS, "build", "ClassB");
|
|
282
|
-
assert(removeResult.success, "ClassName Remove: build from ClassB");
|
|
283
|
-
assert(removeResult.newContent.includes("print('A');"), "ClassName Remove: ClassA build preserved");
|
|
284
|
-
assert(!removeResult.newContent.includes("print('B');"), "ClassName Remove: ClassB build removed");
|
|
285
|
-
const PY_MULTI_CLASS = `
|
|
286
|
-
class ClassA:
|
|
287
|
-
def execute(self):
|
|
288
|
-
return 'A'
|
|
289
|
-
|
|
290
|
-
class ClassB:
|
|
291
|
-
def execute(self):
|
|
292
|
-
return 'B'
|
|
293
|
-
`;
|
|
294
|
-
const replaceResult = replaceSymbol("test_multi.py", PY_MULTI_CLASS, "execute", " def execute(self):\n return 'C'", "ClassB");
|
|
295
|
-
assert(replaceResult.success, "ClassName Replace: execute in ClassB");
|
|
296
|
-
assert(replaceResult.newContent.includes("return 'A'"), "ClassName Replace: ClassA execute preserved");
|
|
297
|
-
assert(replaceResult.newContent.includes("return 'C'"), "ClassName Replace: ClassB execute updated");
|
|
298
|
-
assert(!replaceResult.newContent.includes("return 'B'"), "ClassName Replace: ClassB execute old content removed");
|
|
299
|
-
}
|
|
300
|
-
// ─── Diff Engine Tests ──────────────────────────────────────────────
|
|
301
|
-
function testDiffEngine() {
|
|
302
|
-
section("Diff Engine");
|
|
303
|
-
const oldContent = "line1\nline2\nline3\nline4\nline5";
|
|
304
|
-
const newContent = "line1\nline2_modified\nline3\nline4\nline5\nline6_added";
|
|
305
|
-
const diff = generateDiff(oldContent, newContent, "test.txt");
|
|
306
|
-
assert(diff.includes("---"), "Diff: has header");
|
|
307
|
-
assert(diff.includes("+++"), "Diff: has header (new)");
|
|
308
|
-
assert(diff.includes("-line2"), "Diff: shows removal");
|
|
309
|
-
assert(diff.includes("+line2_modified"), "Diff: shows addition");
|
|
310
|
-
assert(diff.includes("+line6_added"), "Diff: shows appended line");
|
|
311
|
-
// No-change diff
|
|
312
|
-
const noDiff = generateDiff("same", "same", "noop.txt");
|
|
313
|
-
assert(noDiff.includes("no changes"), "Diff: no-change case handled");
|
|
314
|
-
}
|
|
315
|
-
// ─── Unsupported Language Tests ─────────────────────────────────────
|
|
316
|
-
function testUnsupported() {
|
|
317
|
-
section("Unsupported Languages (Graceful Failures)");
|
|
318
|
-
const result = replaceSymbol("test.rs", "fn main() {}", "main", "fn main() { println!(\"hi\"); }");
|
|
319
|
-
assert(!result.success, "Unsupported: Rust returns failure");
|
|
320
|
-
assert(result.error?.includes("Unsupported") ?? false, "Unsupported: error message is descriptive");
|
|
321
|
-
}
|
|
322
|
-
// ─── Run All ────────────────────────────────────────────────────────
|
|
323
|
-
async function main() {
|
|
324
|
-
console.log("🔬 Surgical Writing Tools — Smoke Tests\n");
|
|
325
|
-
testTypeScript();
|
|
326
|
-
testPHP();
|
|
327
|
-
testDart();
|
|
328
|
-
testPython();
|
|
329
|
-
testClassName();
|
|
330
|
-
testDiffEngine();
|
|
331
|
-
testUnsupported();
|
|
332
|
-
console.log(`\n${"═".repeat(50)}`);
|
|
333
|
-
console.log(`📊 Results: ${passed} passed, ${failed} failed (${passed + failed} total)`);
|
|
334
|
-
if (failed > 0) {
|
|
335
|
-
console.error(`\n❌ ${failed} test(s) FAILED`);
|
|
336
|
-
process.exit(1);
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
console.log(`\n✅ All tests passed!`);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
main().catch((err) => {
|
|
343
|
-
console.error("Fatal error:", err);
|
|
344
|
-
process.exit(1);
|
|
345
|
-
});
|
|
346
|
-
//# sourceMappingURL=test-write-smoke.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-write-smoke.js","sourceRoot":"","sources":["../../../tests/writers/test-write-smoke.ts"],"names":[],"mappings":"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"}
|