mcp-code-context 2.4.0 → 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.
@@ -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: Write all files
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":"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"}
1
+ {"version":3,"file":"transactionManager.js","sourceRoot":"","sources":["../../../src/utils/transactionManager.ts"],"names":[],"mappings":"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"}
package/llms.txt CHANGED
@@ -1,7 +1,13 @@
1
- # mcp-code-context v2.4.0
1
+ # mcp-code-context v2.5.0
2
2
 
3
3
  > A Model Context Protocol (MCP) server that compresses any code repository into LLM-ready semantic context and provides surgical code editing tools.
4
4
 
5
+ ## What's New in v2.4.1
6
+
7
+ 🐛 **Bug Fix**: analyze_impact now works correctly
8
+ - ✅ Fixed TypeScript ESM import resolution
9
+ - ✅ Correctly detects dependencies in TypeScript projects
10
+
5
11
  ## What's New in v2.4.0
6
12
 
7
13
  🚀 **Performance Revolution**: Fully async I/O architecture
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-code-context",
3
- "version": "2.4.0",
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",