mcp-code-context 2.4.1 → 2.5.0
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/CHANGELOG.md +26 -0
- package/PLAN_v2.5.0.md +407 -0
- package/README.md +1 -1
- package/dist/src/cache/astCache.d.ts +9 -5
- package/dist/src/cache/astCache.js +45 -17
- package/dist/src/cache/astCache.js.map +1 -1
- package/dist/src/handlers/readHandlers.d.ts +1 -1
- package/dist/src/handlers/readHandlers.js +66 -57
- package/dist/src/handlers/readHandlers.js.map +1 -1
- package/dist/src/handlers/writeHandlers.js +3 -3
- package/dist/src/handlers/writeHandlers.js.map +1 -1
- package/dist/src/utils/constants.d.ts +1 -1
- package/dist/src/utils/constants.js +1 -1
- package/dist/src/utils/dependencyChecker.d.ts +1 -0
- package/dist/src/utils/dependencyChecker.js +55 -0
- package/dist/src/utils/dependencyChecker.js.map +1 -0
- package/dist/src/utils/ignoreManager.d.ts +1 -1
- package/dist/src/utils/ignoreManager.js +6 -4
- package/dist/src/utils/ignoreManager.js.map +1 -1
- package/dist/src/utils/syntaxValidator.d.ts +15 -0
- package/dist/src/utils/syntaxValidator.js +218 -0
- package/dist/src/utils/syntaxValidator.js.map +1 -0
- package/dist/src/utils/transactionManager.d.ts +2 -1
- package/dist/src/utils/transactionManager.js +25 -4
- package/dist/src/utils/transactionManager.js.map +1 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* syntaxValidator.ts — Syntax Validation for Write Operations
|
|
3
|
+
*
|
|
4
|
+
* Validates syntax after surgical edits to prevent committing broken code.
|
|
5
|
+
* Supports TypeScript, JavaScript, PHP, Dart (basic), Python (basic).
|
|
6
|
+
*/
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import * as ts from "typescript";
|
|
9
|
+
/**
|
|
10
|
+
* Validate syntax of modified content before writing to disk
|
|
11
|
+
*/
|
|
12
|
+
export async function validateSyntax(filePath, content) {
|
|
13
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
14
|
+
switch (ext) {
|
|
15
|
+
case ".ts":
|
|
16
|
+
case ".tsx":
|
|
17
|
+
case ".mts":
|
|
18
|
+
return validateTypeScript(content, filePath);
|
|
19
|
+
case ".js":
|
|
20
|
+
case ".jsx":
|
|
21
|
+
case ".mjs":
|
|
22
|
+
case ".cjs":
|
|
23
|
+
return validateJavaScript(content, filePath);
|
|
24
|
+
case ".php":
|
|
25
|
+
case ".phtml":
|
|
26
|
+
return await validatePHP(content);
|
|
27
|
+
case ".dart":
|
|
28
|
+
return await validateDart(content);
|
|
29
|
+
case ".py":
|
|
30
|
+
case ".pyi":
|
|
31
|
+
return await validatePython(content);
|
|
32
|
+
default:
|
|
33
|
+
// Unknown extension, skip validation
|
|
34
|
+
return { valid: true };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate TypeScript syntax using ts compiler API
|
|
39
|
+
*/
|
|
40
|
+
function validateTypeScript(content, filePath) {
|
|
41
|
+
try {
|
|
42
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
43
|
+
// Check for parse errors
|
|
44
|
+
const diagnostics = sourceFile.parseDiagnostics || [];
|
|
45
|
+
if (diagnostics.length > 0) {
|
|
46
|
+
const errors = diagnostics.map((d) => {
|
|
47
|
+
const message = ts.flattenDiagnosticMessageText(d.messageText, "\n");
|
|
48
|
+
const line = sourceFile.getLineAndCharacterOfPosition(d.start || 0).line + 1;
|
|
49
|
+
return `Line ${line}: ${message}`;
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
valid: false,
|
|
53
|
+
error: `TypeScript syntax errors found`,
|
|
54
|
+
diagnostics: errors,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return { valid: true };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
valid: false,
|
|
62
|
+
error: `TypeScript parsing failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validate JavaScript syntax using ts compiler API (JS mode)
|
|
68
|
+
*/
|
|
69
|
+
function validateJavaScript(content, filePath) {
|
|
70
|
+
try {
|
|
71
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
|
|
72
|
+
const diagnostics = sourceFile.parseDiagnostics || [];
|
|
73
|
+
if (diagnostics.length > 0) {
|
|
74
|
+
const errors = diagnostics.map((d) => {
|
|
75
|
+
const message = ts.flattenDiagnosticMessageText(d.messageText, "\n");
|
|
76
|
+
const line = sourceFile.getLineAndCharacterOfPosition(d.start || 0).line + 1;
|
|
77
|
+
return `Line ${line}: ${message}`;
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
valid: false,
|
|
81
|
+
error: `JavaScript syntax errors found`,
|
|
82
|
+
diagnostics: errors,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return { valid: true };
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
valid: false,
|
|
90
|
+
error: `JavaScript parsing failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Validate PHP syntax using php-parser
|
|
96
|
+
*/
|
|
97
|
+
async function validatePHP(content) {
|
|
98
|
+
try {
|
|
99
|
+
// Dynamic import for ESM compatibility
|
|
100
|
+
const phpParserModule = await import("php-parser");
|
|
101
|
+
const phpParser = phpParserModule.default || phpParserModule;
|
|
102
|
+
const parser = new phpParser.Engine({
|
|
103
|
+
parser: {
|
|
104
|
+
extractDoc: false,
|
|
105
|
+
suppressErrors: false,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
const ast = parser.parseCode(content, "test.php");
|
|
109
|
+
if (!ast || ast.errors?.length > 0) {
|
|
110
|
+
const errors = ast.errors?.map((e) => `Line ${e.line}: ${e.message}`) || ["Unknown PHP syntax error"];
|
|
111
|
+
return {
|
|
112
|
+
valid: false,
|
|
113
|
+
error: "PHP syntax errors found",
|
|
114
|
+
diagnostics: errors,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return { valid: true };
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return {
|
|
121
|
+
valid: false,
|
|
122
|
+
error: `PHP parsing failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validate Dart syntax (basic check for balanced braces)
|
|
128
|
+
*/
|
|
129
|
+
async function validateDart(content) {
|
|
130
|
+
// Basic validation: check for balanced braces
|
|
131
|
+
let braceCount = 0;
|
|
132
|
+
let parenCount = 0;
|
|
133
|
+
let bracketCount = 0;
|
|
134
|
+
for (const char of content) {
|
|
135
|
+
if (char === "{")
|
|
136
|
+
braceCount++;
|
|
137
|
+
if (char === "}")
|
|
138
|
+
braceCount--;
|
|
139
|
+
if (char === "(")
|
|
140
|
+
parenCount++;
|
|
141
|
+
if (char === ")")
|
|
142
|
+
parenCount--;
|
|
143
|
+
if (char === "[")
|
|
144
|
+
bracketCount++;
|
|
145
|
+
if (char === "]")
|
|
146
|
+
bracketCount--;
|
|
147
|
+
if (braceCount < 0 || parenCount < 0 || bracketCount < 0) {
|
|
148
|
+
return {
|
|
149
|
+
valid: false,
|
|
150
|
+
error: "Dart syntax error: Unbalanced brackets",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (braceCount !== 0) {
|
|
155
|
+
return {
|
|
156
|
+
valid: false,
|
|
157
|
+
error: `Dart syntax error: Unbalanced braces (${braceCount > 0 ? "missing" : "extra"} closing brace)`,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (parenCount !== 0) {
|
|
161
|
+
return {
|
|
162
|
+
valid: false,
|
|
163
|
+
error: `Dart syntax error: Unbalanced parentheses`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (bracketCount !== 0) {
|
|
167
|
+
return {
|
|
168
|
+
valid: false,
|
|
169
|
+
error: `Dart syntax error: Unbalanced brackets`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return { valid: true };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Validate Python syntax (basic indentation check)
|
|
176
|
+
*/
|
|
177
|
+
async function validatePython(content) {
|
|
178
|
+
const lines = content.split("\n");
|
|
179
|
+
let indentStack = [0];
|
|
180
|
+
for (let i = 0; i < lines.length; i++) {
|
|
181
|
+
const line = lines[i];
|
|
182
|
+
// Skip empty lines and comments
|
|
183
|
+
if (line.trim() === "" || line.trim().startsWith("#")) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Calculate indentation
|
|
187
|
+
const indent = line.length - line.trimStart().length;
|
|
188
|
+
// Check for mixed tabs/spaces (basic check)
|
|
189
|
+
const hasTab = line.startsWith("\t");
|
|
190
|
+
const hasSpace = line.startsWith(" ");
|
|
191
|
+
if (hasTab && hasSpace) {
|
|
192
|
+
return {
|
|
193
|
+
valid: false,
|
|
194
|
+
error: `Python syntax error: Mixed tabs and spaces on line ${i + 1}`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Check indentation consistency
|
|
198
|
+
const currentIndent = indentStack[indentStack.length - 1];
|
|
199
|
+
if (indent > currentIndent) {
|
|
200
|
+
// Indent increased
|
|
201
|
+
indentStack.push(indent);
|
|
202
|
+
}
|
|
203
|
+
else if (indent < currentIndent) {
|
|
204
|
+
// Indent decreased
|
|
205
|
+
while (indentStack.length > 0 && indentStack[indentStack.length - 1] > indent) {
|
|
206
|
+
indentStack.pop();
|
|
207
|
+
}
|
|
208
|
+
if (indentStack.length === 0 || indentStack[indentStack.length - 1] !== indent) {
|
|
209
|
+
return {
|
|
210
|
+
valid: false,
|
|
211
|
+
error: `Python syntax error: Invalid indentation on line ${i + 1}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return { valid: true };
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=syntaxValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntaxValidator.js","sourceRoot":"","sources":["../../../src/utils/syntaxValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Transaction Manager - Atomic Multi-File Operations
|
|
3
3
|
* Ensures all-or-nothing writes with automatic rollback on failure
|
|
4
|
+
* Now includes syntax validation before commit
|
|
4
5
|
*/
|
|
5
6
|
export interface FileChange {
|
|
6
7
|
filePath: string;
|
|
@@ -19,7 +20,7 @@ export declare class TransactionManager {
|
|
|
19
20
|
stageMultiple(changes: FileChange[]): void;
|
|
20
21
|
/**
|
|
21
22
|
* Commit all staged changes atomically
|
|
22
|
-
* Creates backups first, then writes all files
|
|
23
|
+
* Creates backups first, validates syntax, then writes all files
|
|
23
24
|
* Rolls back automatically on any failure
|
|
24
25
|
*/
|
|
25
26
|
commit(): Promise<{
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Transaction Manager - Atomic Multi-File Operations
|
|
3
3
|
* Ensures all-or-nothing writes with automatic rollback on failure
|
|
4
|
+
* Now includes syntax validation before commit
|
|
4
5
|
*/
|
|
5
6
|
import * as fs from "node:fs";
|
|
6
7
|
import * as path from "node:path";
|
|
7
8
|
import { createBackup, restoreBackup } from "./backupManager.js";
|
|
9
|
+
import { validateSyntax } from "./syntaxValidator.js";
|
|
8
10
|
export class TransactionManager {
|
|
9
11
|
staging = new Map();
|
|
10
12
|
backedUpFiles = new Set();
|
|
@@ -25,7 +27,7 @@ export class TransactionManager {
|
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Commit all staged changes atomically
|
|
28
|
-
* Creates backups first, then writes all files
|
|
30
|
+
* Creates backups first, validates syntax, then writes all files
|
|
29
31
|
* Rolls back automatically on any failure
|
|
30
32
|
*/
|
|
31
33
|
async commit() {
|
|
@@ -46,7 +48,28 @@ export class TransactionManager {
|
|
|
46
48
|
error: `Backup failed: ${error instanceof Error ? error.message : String(error)}`
|
|
47
49
|
};
|
|
48
50
|
}
|
|
49
|
-
// Phase 2:
|
|
51
|
+
// Phase 2: Validate syntax for all files
|
|
52
|
+
try {
|
|
53
|
+
for (const [filePath, content] of this.staging) {
|
|
54
|
+
const validation = await validateSyntax(filePath, content);
|
|
55
|
+
if (!validation.valid) {
|
|
56
|
+
await this.rollback();
|
|
57
|
+
const diagnostics = validation.diagnostics?.join("\n") || "";
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
error: `Syntax validation failed for ${path.basename(filePath)}:\n${validation.error}${diagnostics ? "\n" + diagnostics : ""}`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
await this.rollback();
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
error: `Syntax validation error: ${error instanceof Error ? error.message : String(error)}`
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Phase 3: Write all files
|
|
50
73
|
try {
|
|
51
74
|
for (const [filePath, content] of this.staging) {
|
|
52
75
|
await fs.promises.writeFile(filePath, content, "utf-8");
|
|
@@ -59,8 +82,6 @@ export class TransactionManager {
|
|
|
59
82
|
error: `Write failed: ${error instanceof Error ? error.message : String(error)}`
|
|
60
83
|
};
|
|
61
84
|
}
|
|
62
|
-
// Phase 3: Validate (optional syntax check could go here)
|
|
63
|
-
// For now, we trust the write succeeded
|
|
64
85
|
this.clear();
|
|
65
86
|
return { success: true };
|
|
66
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transactionManager.js","sourceRoot":"","sources":["../../../src/utils/transactionManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"transactionManager.js","sourceRoot":"","sources":["../../../src/utils/transactionManager.ts"],"names":[],"mappings":"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"}
|
package/llms.txt
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-code-context",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"description": "Powerful MCP server for LLM-ready semantic code context and surgical AST-aware editing. Supports TypeScript, JavaScript, PHP, Dart, and Python.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|