mcp-code-context 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_INSTRUCTIONS.md +135 -0
- package/CHANGELOG.md +84 -0
- package/DEPLOYMENT_INSTRUCTIONS.md +110 -0
- package/LICENSE +21 -0
- package/README.md +247 -0
- package/RELEASE_NOTES_v2.1.3.md +78 -0
- package/TROUBLESHOOTING.md +38 -0
- package/dist/src/ast/dartCompressor.d.ts +27 -0
- package/dist/src/ast/dartCompressor.js +859 -0
- package/dist/src/ast/dartCompressor.js.map +1 -0
- package/dist/src/ast/phpCompressor.d.ts +24 -0
- package/dist/src/ast/phpCompressor.js +634 -0
- package/dist/src/ast/phpCompressor.js.map +1 -0
- package/dist/src/ast/semanticCompressor.d.ts +22 -0
- package/dist/src/ast/semanticCompressor.js +677 -0
- package/dist/src/ast/semanticCompressor.js.map +1 -0
- package/dist/src/ast/writers/dartWriter.d.ts +37 -0
- package/dist/src/ast/writers/dartWriter.js +544 -0
- package/dist/src/ast/writers/dartWriter.js.map +1 -0
- package/dist/src/ast/writers/phpWriter.d.ts +37 -0
- package/dist/src/ast/writers/phpWriter.js +411 -0
- package/dist/src/ast/writers/phpWriter.js.map +1 -0
- package/dist/src/ast/writers/pyWriter.d.ts +37 -0
- package/dist/src/ast/writers/pyWriter.js +355 -0
- package/dist/src/ast/writers/pyWriter.js.map +1 -0
- package/dist/src/ast/writers/symbolWriter.d.ts +62 -0
- package/dist/src/ast/writers/symbolWriter.js +179 -0
- package/dist/src/ast/writers/symbolWriter.js.map +1 -0
- package/dist/src/ast/writers/tsWriter.d.ts +38 -0
- package/dist/src/ast/writers/tsWriter.js +344 -0
- package/dist/src/ast/writers/tsWriter.js.map +1 -0
- package/dist/src/index.d.ts +117 -0
- package/dist/src/index.js +1289 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/tests/test-confirmation-flow.d.ts +1 -0
- package/dist/src/tests/test-confirmation-flow.js +43 -0
- package/dist/src/tests/test-confirmation-flow.js.map +1 -0
- package/dist/src/utils/backupManager.d.ts +24 -0
- package/dist/src/utils/backupManager.js +59 -0
- package/dist/src/utils/backupManager.js.map +1 -0
- package/dist/src/utils/confirmationCache.d.ts +16 -0
- package/dist/src/utils/confirmationCache.js +40 -0
- package/dist/src/utils/confirmationCache.js.map +1 -0
- package/dist/src/utils/diffEngine.d.ts +21 -0
- package/dist/src/utils/diffEngine.js +163 -0
- package/dist/src/utils/diffEngine.js.map +1 -0
- package/dist/src/utils/fuzzyMatch.d.ts +8 -0
- package/dist/src/utils/fuzzyMatch.js +69 -0
- package/dist/src/utils/fuzzyMatch.js.map +1 -0
- package/dist/src/utils/ignoreManager.d.ts +22 -0
- package/dist/src/utils/ignoreManager.js +135 -0
- package/dist/src/utils/ignoreManager.js.map +1 -0
- package/dist/tests/debug-replace.d.ts +1 -0
- package/dist/tests/debug-replace.js +17 -0
- package/dist/tests/debug-replace.js.map +1 -0
- package/dist/tests/test-confirmation-flow.d.ts +1 -0
- package/dist/tests/test-confirmation-flow.js +43 -0
- package/dist/tests/test-confirmation-flow.js.map +1 -0
- package/dist/tests/test-dart.d.ts +1 -0
- package/dist/tests/test-dart.js +242 -0
- package/dist/tests/test-dart.js.map +1 -0
- package/dist/tests/test-php-ast.d.ts +1 -0
- package/dist/tests/test-php-ast.js +152 -0
- package/dist/tests/test-php-ast.js.map +1 -0
- package/dist/tests/test-php.d.ts +1 -0
- package/dist/tests/test-php.js +234 -0
- package/dist/tests/test-php.js.map +1 -0
- package/dist/tests/test-smoke.d.ts +5 -0
- package/dist/tests/test-smoke.js +83 -0
- package/dist/tests/test-smoke.js.map +1 -0
- package/dist/tests/writers/test-crlf-handling.d.ts +4 -0
- package/dist/tests/writers/test-crlf-handling.js +73 -0
- package/dist/tests/writers/test-crlf-handling.js.map +1 -0
- package/dist/tests/writers/test-write-smoke.d.ts +9 -0
- package/dist/tests/writers/test-write-smoke.js +346 -0
- package/dist/tests/writers/test-write-smoke.js.map +1 -0
- package/llms.txt +164 -0
- package/package.json +57 -0
- package/src/ast/dartCompressor.ts +1013 -0
- package/src/ast/phpCompressor.ts +814 -0
- package/src/ast/semanticCompressor.ts +808 -0
- package/src/ast/writers/dartWriter.ts +648 -0
- package/src/ast/writers/phpWriter.ts +508 -0
- package/src/ast/writers/pyWriter.ts +446 -0
- package/src/ast/writers/symbolWriter.ts +277 -0
- package/src/ast/writers/tsWriter.ts +418 -0
- package/src/index.ts +1553 -0
- package/src/utils/backupManager.ts +66 -0
- package/src/utils/confirmationCache.ts +61 -0
- package/src/utils/diffEngine.ts +223 -0
- package/src/utils/fuzzyMatch.ts +86 -0
- package/src/utils/ignoreManager.ts +144 -0
- package/tests/test-confirmation-flow.ts +49 -0
- package/tests/test-dart.d.ts +1 -0
- package/tests/test-dart.js +209 -0
- package/tests/test-dart.js.map +1 -0
- package/tests/test-dart.ts +265 -0
- package/tests/test-php-ast.d.ts +1 -0
- package/tests/test-php-ast.js +152 -0
- package/tests/test-php-ast.js.map +1 -0
- package/tests/test-php-ast.ts +155 -0
- package/tests/test-php.d.ts +1 -0
- package/tests/test-php.js +234 -0
- package/tests/test-php.js.map +1 -0
- package/tests/test-php.ts +261 -0
- package/tests/test-smoke.d.ts +5 -0
- package/tests/test-smoke.js +83 -0
- package/tests/test-smoke.js.map +1 -0
- package/tests/test-smoke.ts +93 -0
- package/tests/writers/test-crlf-handling.ts +100 -0
- package/tests/writers/test-write-smoke.ts +568 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smoke test for PHP AST compression — tests against real DT24 PHP files.
|
|
3
|
+
*/
|
|
4
|
+
import { compressPHP, extractPHPSymbol } from "../src/ast/phpCompressor.js";
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
function log(label, value) {
|
|
7
|
+
console.log(`\n${"─".repeat(60)}`);
|
|
8
|
+
console.log(`✅ ${label}`);
|
|
9
|
+
console.log(`${"─".repeat(60)}`);
|
|
10
|
+
console.log(typeof value === "number" ? String(value) : value);
|
|
11
|
+
}
|
|
12
|
+
function fail(label, reason) {
|
|
13
|
+
console.log(`\n${"─".repeat(60)}`);
|
|
14
|
+
console.log(`❌ FAIL: ${label}`);
|
|
15
|
+
console.log(`${"─".repeat(60)}`);
|
|
16
|
+
console.log(reason);
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
}
|
|
19
|
+
async function main() {
|
|
20
|
+
let passed = 0;
|
|
21
|
+
let failed = 0;
|
|
22
|
+
// ─── Test 1: Compress a class with namespace ───────────────────
|
|
23
|
+
console.log("\n\n🧪 TEST 1: Compress Dt24Config.php (namespace + static class)");
|
|
24
|
+
const configPath = "c:/code/dt24-core-plugin/includes/Dt24Config.php";
|
|
25
|
+
if (fs.existsSync(configPath)) {
|
|
26
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
27
|
+
const compressed = compressPHP(content);
|
|
28
|
+
const originalLines = content.split("\n").length;
|
|
29
|
+
const compressedLines = compressed.split("\n").length;
|
|
30
|
+
const ratio = ((1 - compressedLines / originalLines) * 100).toFixed(1);
|
|
31
|
+
log(`Dt24Config.php: ${originalLines} → ${compressedLines} lines (${ratio}% reduction)`, compressed);
|
|
32
|
+
// Verify key structures are present
|
|
33
|
+
const checks = [
|
|
34
|
+
["namespace", /namespace\s+Dt24ApiAuth/],
|
|
35
|
+
["class declaration", /class\s+Dt24Config/],
|
|
36
|
+
["static property", /\$cache/],
|
|
37
|
+
["env() method signature", /public\s+static\s+function\s+env\(/],
|
|
38
|
+
["set_config() method", /public\s+static\s+function\s+set_config\(/],
|
|
39
|
+
["body stripped", /\/\* \.\.\. \*\//],
|
|
40
|
+
];
|
|
41
|
+
for (const [name, pattern] of checks) {
|
|
42
|
+
if (pattern.test(compressed)) {
|
|
43
|
+
console.log(` ✓ Found: ${name}`);
|
|
44
|
+
passed++;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
fail(`Missing: ${name}`, `Pattern ${pattern} not found in compressed output`);
|
|
48
|
+
failed++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(" ⚠️ Skipped (file not found)");
|
|
54
|
+
}
|
|
55
|
+
// ─── Test 2: Compress a large class with docblocks ─────────────
|
|
56
|
+
console.log("\n\n🧪 TEST 2: Compress Dt24_Api_Auth_Admin.php (class + constants + docblocks)");
|
|
57
|
+
const adminPath = "c:/code/dt24-core-plugin/admin/class-dt24-api-auth-admin.php";
|
|
58
|
+
if (fs.existsSync(adminPath)) {
|
|
59
|
+
const content = fs.readFileSync(adminPath, "utf-8");
|
|
60
|
+
const compressed = compressPHP(content);
|
|
61
|
+
const originalLines = content.split("\n").length;
|
|
62
|
+
const compressedLines = compressed.split("\n").length;
|
|
63
|
+
const ratio = ((1 - compressedLines / originalLines) * 100).toFixed(1);
|
|
64
|
+
log(`Admin: ${originalLines} → ${compressedLines} lines (${ratio}% reduction)`, compressed);
|
|
65
|
+
const checks = [
|
|
66
|
+
["class declaration", /class\s+Dt24_Api_Auth_Admin/],
|
|
67
|
+
["private property", /private\s+(.*\$plugin_name|\$plugin_name)/],
|
|
68
|
+
["const", /const\s+DT24_SECONDS_IN_MINUTES/],
|
|
69
|
+
["constructor", /function\s+__construct/],
|
|
70
|
+
["docblock", /\*\s+@param/],
|
|
71
|
+
["method signature", /function\s+check_the_elapsed_time\(/],
|
|
72
|
+
["body stripped", /\/\*\s*\.\.\.\s*\*\//],
|
|
73
|
+
["private method", /private\s+function\s+get_custom_statuses/],
|
|
74
|
+
];
|
|
75
|
+
for (const [name, pattern] of checks) {
|
|
76
|
+
if (pattern.test(compressed)) {
|
|
77
|
+
console.log(` ✓ Found: ${name}`);
|
|
78
|
+
passed++;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
82
|
+
failed++;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.log(" ⚠️ Skipped (file not found)");
|
|
88
|
+
}
|
|
89
|
+
// ─── Test 3: Extract specific symbol ──────────────────────────
|
|
90
|
+
console.log("\n\n🧪 TEST 3: Extract symbol 'env' from Dt24Config.php");
|
|
91
|
+
if (fs.existsSync(configPath)) {
|
|
92
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
93
|
+
const symbol = extractPHPSymbol(content, "env");
|
|
94
|
+
if (symbol) {
|
|
95
|
+
log("Extracted 'env' method:", symbol);
|
|
96
|
+
if (symbol.includes("function env(") && symbol.includes("$cache")) {
|
|
97
|
+
console.log(" ✓ Symbol extraction contains both signature and body");
|
|
98
|
+
passed++;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
fail("Symbol content", "Missing expected content");
|
|
102
|
+
failed++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
fail("Symbol 'env'", "extractPHPSymbol returned null");
|
|
107
|
+
failed++;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ─── Test 4: Extract class symbol ─────────────────────────────
|
|
111
|
+
console.log("\n\n🧪 TEST 4: Extract symbol 'Dt24Config' from Dt24Config.php");
|
|
112
|
+
if (fs.existsSync(configPath)) {
|
|
113
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
114
|
+
const symbol = extractPHPSymbol(content, "Dt24Config");
|
|
115
|
+
if (symbol) {
|
|
116
|
+
log("Extracted 'Dt24Config' class:", symbol.substring(0, 200) + "...");
|
|
117
|
+
if (symbol.includes("class Dt24Config") && symbol.includes("function env")) {
|
|
118
|
+
console.log(" ✓ Class extraction includes full body");
|
|
119
|
+
passed++;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
fail("Class content", "Missing expected content");
|
|
123
|
+
failed++;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
fail("Symbol 'Dt24Config'", "extractPHPSymbol returned null");
|
|
128
|
+
failed++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ─── Test 5: Synthetic PHP with all features ──────────────────
|
|
132
|
+
console.log("\n\n🧪 TEST 5: Synthetic PHP (namespace, interface, trait, enum, abstract class)");
|
|
133
|
+
const syntheticPHP = `<?php
|
|
134
|
+
namespace App\\Services;
|
|
135
|
+
|
|
136
|
+
use App\\Models\\User;
|
|
137
|
+
use App\\Contracts\\Cacheable;
|
|
138
|
+
|
|
139
|
+
interface Loggable {
|
|
140
|
+
public function getLogName(): string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
trait HasTimestamps {
|
|
144
|
+
/** Get current timestamp */
|
|
145
|
+
private function now(): int {
|
|
146
|
+
return time();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
abstract class BaseService {
|
|
151
|
+
abstract public function execute(): void;
|
|
152
|
+
|
|
153
|
+
protected function log(string $msg): void {
|
|
154
|
+
echo $msg;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
class UserService extends BaseService implements Loggable, Cacheable {
|
|
159
|
+
use HasTimestamps;
|
|
160
|
+
|
|
161
|
+
private string $name;
|
|
162
|
+
public const VERSION = '1.0';
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Create a new UserService instance.
|
|
166
|
+
* @param string $name The user name
|
|
167
|
+
*/
|
|
168
|
+
public function __construct(string $name) {
|
|
169
|
+
$this->name = $name;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
public function execute(): void {
|
|
173
|
+
$this->log($this->name);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public function getLogName(): string {
|
|
177
|
+
return $this->name;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public static function create(string $n): self {
|
|
181
|
+
return new self($n);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function helper(int $x, string $y = 'default'): bool {
|
|
186
|
+
return $x > 0;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
enum Color: string {
|
|
190
|
+
case Red = 'red';
|
|
191
|
+
case Blue = 'blue';
|
|
192
|
+
}
|
|
193
|
+
`;
|
|
194
|
+
const compressed = compressPHP(syntheticPHP);
|
|
195
|
+
const originalLines = syntheticPHP.split("\n").length;
|
|
196
|
+
const compressedLines = compressed.split("\n").length;
|
|
197
|
+
const ratio = ((1 - compressedLines / originalLines) * 100).toFixed(1);
|
|
198
|
+
log(`Synthetic: ${originalLines} → ${compressedLines} lines (${ratio}% reduction)`, compressed);
|
|
199
|
+
const syntheticChecks = [
|
|
200
|
+
["namespace", /namespace App\\Services/],
|
|
201
|
+
["use statement", /use App\\Models\\User/],
|
|
202
|
+
["interface", /interface Loggable/],
|
|
203
|
+
["trait", /trait HasTimestamps/],
|
|
204
|
+
["abstract class", /abstract class BaseService/],
|
|
205
|
+
["abstract method", /abstract public function execute/],
|
|
206
|
+
["class extends+implements", /class UserService extends BaseService implements Loggable, Cacheable/],
|
|
207
|
+
["trait use", /use HasTimestamps/],
|
|
208
|
+
["const", /public const VERSION/],
|
|
209
|
+
["docblock", /@param string \$name/],
|
|
210
|
+
["static method", /public static function create/],
|
|
211
|
+
["return type self", /: self/],
|
|
212
|
+
["top-level function", /function helper\(/],
|
|
213
|
+
["default param", /\$y = 'default'/],
|
|
214
|
+
["enum", /enum Color: string/],
|
|
215
|
+
["enum case", /case Red = 'red'/],
|
|
216
|
+
["body stripped", /\/\* \.\.\. \*\//],
|
|
217
|
+
];
|
|
218
|
+
for (const [name, pattern] of syntheticChecks) {
|
|
219
|
+
if (pattern.test(compressed)) {
|
|
220
|
+
console.log(` ✓ Found: ${name}`);
|
|
221
|
+
passed++;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
225
|
+
failed++;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// ─── Summary ─────────────────────────────────────────────────
|
|
229
|
+
console.log(`\n\n${"═".repeat(60)}`);
|
|
230
|
+
console.log(`📊 RESULTS: ${passed} passed, ${failed} failed`);
|
|
231
|
+
console.log(`${"═".repeat(60)}\n`);
|
|
232
|
+
}
|
|
233
|
+
main().catch(console.error);
|
|
234
|
+
//# sourceMappingURL=test-php.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-php.js","sourceRoot":"","sources":["../../tests/test-php.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smoke test — validates all 3 tools work against this project's own source.
|
|
3
|
+
* Run with: node dist/test-smoke.js
|
|
4
|
+
*/
|
|
5
|
+
import { IgnoreManager } from "../src/utils/ignoreManager.js";
|
|
6
|
+
import { compressFile, extractSymbol } from "../src/ast/semanticCompressor.js";
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = path.dirname(__filename);
|
|
12
|
+
const PROJECT_ROOT = path.resolve(__dirname, "..");
|
|
13
|
+
function log(label, value) {
|
|
14
|
+
console.log(` ✓ ${label}: ${value}`);
|
|
15
|
+
}
|
|
16
|
+
async function main() {
|
|
17
|
+
console.log("\n🧪 Smoke Test: mcp-code-context\n");
|
|
18
|
+
// --- Test 1: IgnoreManager ---
|
|
19
|
+
console.log("─── Test 1: IgnoreManager ───");
|
|
20
|
+
const ig = new IgnoreManager(PROJECT_ROOT);
|
|
21
|
+
const files = ig.walkDirectory();
|
|
22
|
+
log("Files discovered", files.length);
|
|
23
|
+
log("node_modules excluded", files.every(f => !f.includes("node_modules")) ? "YES" : "FAIL");
|
|
24
|
+
log("dist excluded", files.every(f => !f.includes(path.sep + "dist" + path.sep)) ? "YES" : "FAIL");
|
|
25
|
+
// --- Test 2: Semantic Compression ---
|
|
26
|
+
console.log("\n─── Test 2: Semantic Compression (TypeScript) ───");
|
|
27
|
+
const indexPath = path.join(PROJECT_ROOT, "src", "index.ts");
|
|
28
|
+
const indexContent = fs.readFileSync(indexPath, "utf-8");
|
|
29
|
+
const compressed = compressFile(indexPath, indexContent);
|
|
30
|
+
log("Original lines", indexContent.split("\n").length);
|
|
31
|
+
log("Compressed lines", compressed.split("\n").length);
|
|
32
|
+
log("Contains function signatures", compressed.includes("function") ? "YES" : "FAIL");
|
|
33
|
+
log("Bodies stripped (/* ... */)", compressed.includes("/* ... */") ? "YES" : "FAIL");
|
|
34
|
+
// --- Test 3: Symbol Extraction ---
|
|
35
|
+
console.log("\n─── Test 3: Symbol Extraction ───");
|
|
36
|
+
const compressorPath = path.join(PROJECT_ROOT, "src", "ast", "semanticCompressor.ts");
|
|
37
|
+
const compressorContent = fs.readFileSync(compressorPath, "utf-8");
|
|
38
|
+
const symbol = extractSymbol(compressorContent, "compressFile", compressorPath);
|
|
39
|
+
log("Symbol 'compressFile' found", symbol ? "YES" : "FAIL");
|
|
40
|
+
log("Symbol length", symbol ? symbol.split("\n").length + " lines" : "0");
|
|
41
|
+
const missing = extractSymbol(compressorContent, "nonExistentFunction", compressorPath);
|
|
42
|
+
log("Missing symbol returns null", missing === null ? "YES" : "FAIL");
|
|
43
|
+
// --- Test 4: Python Compression ---
|
|
44
|
+
console.log("\n─── Test 4: Python Compression (synthetic) ───");
|
|
45
|
+
const pythonSample = `
|
|
46
|
+
import os
|
|
47
|
+
from pathlib import Path
|
|
48
|
+
|
|
49
|
+
class FileProcessor:
|
|
50
|
+
"""Processes files in a directory."""
|
|
51
|
+
|
|
52
|
+
def __init__(self, root: str):
|
|
53
|
+
"""Initialize with root directory."""
|
|
54
|
+
self.root = root
|
|
55
|
+
self.files: list[str] = []
|
|
56
|
+
|
|
57
|
+
def scan(self, pattern: str = "*") -> list[str]:
|
|
58
|
+
"""Scan for files matching pattern."""
|
|
59
|
+
for f in Path(self.root).glob(pattern):
|
|
60
|
+
self.files.append(str(f))
|
|
61
|
+
return self.files
|
|
62
|
+
|
|
63
|
+
def process_all(directory: str) -> int:
|
|
64
|
+
"""Process all files in directory."""
|
|
65
|
+
processor = FileProcessor(directory)
|
|
66
|
+
files = processor.scan()
|
|
67
|
+
for f in files:
|
|
68
|
+
print(f"Processing {f}")
|
|
69
|
+
return len(files)
|
|
70
|
+
`;
|
|
71
|
+
const pyCompressed = compressFile("test.py", pythonSample);
|
|
72
|
+
log("Python compressed lines", pyCompressed.split("\n").length);
|
|
73
|
+
log("Contains class signature", pyCompressed.includes("class FileProcessor") ? "YES" : "FAIL");
|
|
74
|
+
log("Contains method signature", pyCompressed.includes("def scan") ? "YES" : "FAIL");
|
|
75
|
+
log("Contains docstring", pyCompressed.includes("Processes files") ? "YES" : "FAIL");
|
|
76
|
+
log("Body replaced with ...", pyCompressed.includes("...") ? "YES" : "FAIL");
|
|
77
|
+
console.log("\n✅ All smoke tests passed!\n");
|
|
78
|
+
}
|
|
79
|
+
main().catch((err) => {
|
|
80
|
+
console.error("\n❌ Smoke test failed:", err);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=test-smoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-smoke.js","sourceRoot":"","sources":["../../tests/test-smoke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test CRLF handling in Dart writer
|
|
3
|
+
*/
|
|
4
|
+
import { replaceDartSymbol, insertDartCode, renameDartSymbol, removeDartSymbol } from "../../src/ast/writers/dartWriter.js";
|
|
5
|
+
function assert(condition, label, detail) {
|
|
6
|
+
if (!condition) {
|
|
7
|
+
console.error(`❌ FAIL: ${label}`);
|
|
8
|
+
if (detail)
|
|
9
|
+
console.error(` ${detail}`);
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
console.log(`✅ PASS: ${label}`);
|
|
13
|
+
}
|
|
14
|
+
function section(title) {
|
|
15
|
+
console.log(`\n${"=".repeat(60)}`);
|
|
16
|
+
console.log(title);
|
|
17
|
+
console.log("=".repeat(60));
|
|
18
|
+
}
|
|
19
|
+
function testCRLFReplace() {
|
|
20
|
+
section("CRLF: Replace Symbol");
|
|
21
|
+
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";
|
|
22
|
+
const newMethod = " static void update({int? cart}) {\r\n if (cart != null) {\r\n print('Updated: $cart');\r\n }\r\n }";
|
|
23
|
+
const result = replaceDartSymbol(dartCRLF, "update", newMethod);
|
|
24
|
+
assert(result.success, "CRLF Replace: Should succeed", result.error);
|
|
25
|
+
assert(result.newContent.includes("Updated"), "CRLF Replace: Should contain new content");
|
|
26
|
+
assert(!result.error, "CRLF Replace: Should not have error", result.error);
|
|
27
|
+
}
|
|
28
|
+
function testCRLFInsert() {
|
|
29
|
+
section("CRLF: Insert Symbol");
|
|
30
|
+
const dartCRLF = "class Test {\r\n void method1() {\r\n print('1');\r\n }\r\n}\r\n";
|
|
31
|
+
const newMethod = "void method2() {\r\n print('2');\r\n}";
|
|
32
|
+
const result = insertDartCode(dartCRLF, newMethod, "method1", "after");
|
|
33
|
+
assert(result.success, "CRLF Insert: Should succeed", result.error);
|
|
34
|
+
assert(result.newContent.includes("method2"), "CRLF Insert: Should contain new method");
|
|
35
|
+
}
|
|
36
|
+
function testCRLFRename() {
|
|
37
|
+
section("CRLF: Rename Symbol");
|
|
38
|
+
const dartCRLF = "class Test {\r\n void oldName() {\r\n print('test');\r\n }\r\n}\r\n";
|
|
39
|
+
const result = renameDartSymbol(dartCRLF, "oldName", "newName");
|
|
40
|
+
assert(result.success, "CRLF Rename: Should succeed");
|
|
41
|
+
assert(result.newContent.includes("newName"), "CRLF Rename: Should contain new name");
|
|
42
|
+
assert(!result.newContent.includes("oldName"), "CRLF Rename: Should not contain old name");
|
|
43
|
+
}
|
|
44
|
+
function testCRLFRemove() {
|
|
45
|
+
section("CRLF: Remove Symbol");
|
|
46
|
+
const dartCRLF = "class Test {\r\n void method1() {\r\n print('1');\r\n }\r\n void method2() {\r\n print('2');\r\n }\r\n}\r\n";
|
|
47
|
+
const result = removeDartSymbol(dartCRLF, "method1");
|
|
48
|
+
assert(result.success, "CRLF Remove: Should succeed");
|
|
49
|
+
assert(!result.newContent.includes("method1"), "CRLF Remove: Should not contain removed method");
|
|
50
|
+
assert(result.newContent.includes("method2"), "CRLF Remove: Should preserve other methods");
|
|
51
|
+
}
|
|
52
|
+
function testMixedLineEndings() {
|
|
53
|
+
section("Mixed Line Endings");
|
|
54
|
+
// Mixed CRLF and LF
|
|
55
|
+
const mixed = "class Test {\r\n void method1() {\n print('1');\r\n }\n}\r\n";
|
|
56
|
+
const result = replaceDartSymbol(mixed, "method1", " void method1() {\n print('updated');\n }");
|
|
57
|
+
assert(result.success, "Mixed: Should handle mixed line endings");
|
|
58
|
+
assert(result.newContent.includes("updated"), "Mixed: Should contain new content");
|
|
59
|
+
}
|
|
60
|
+
async function main() {
|
|
61
|
+
console.log("\n🧪 Testing CRLF Handling in Dart Writer\n");
|
|
62
|
+
testCRLFReplace();
|
|
63
|
+
testCRLFInsert();
|
|
64
|
+
testCRLFRename();
|
|
65
|
+
testCRLFRemove();
|
|
66
|
+
testMixedLineEndings();
|
|
67
|
+
console.log("\n✅ All CRLF tests passed!\n");
|
|
68
|
+
}
|
|
69
|
+
main().catch((err) => {
|
|
70
|
+
console.error("Test suite failed:", err);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=test-crlf-handling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-crlf-handling.js","sourceRoot":"","sources":["../../../tests/writers/test-crlf-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
export {};
|