mcp-code-context 2.5.1 → 3.0.4

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.
Files changed (129) hide show
  1. package/CHANGELOG.md +92 -236
  2. package/README.md +304 -298
  3. package/dist/src/core/engine.d.ts +21 -0
  4. package/dist/src/core/engine.js +68 -0
  5. package/dist/src/core/engine.js.map +1 -0
  6. package/dist/src/core/validator.d.ts +15 -0
  7. package/dist/src/core/validator.js +44 -0
  8. package/dist/src/core/validator.js.map +1 -0
  9. package/dist/src/index.d.ts +7 -11
  10. package/dist/src/index.js +182 -397
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/operations/write.d.ts +51 -0
  13. package/dist/src/operations/write.js +169 -0
  14. package/dist/src/operations/write.js.map +1 -0
  15. package/dist/src/parsers/base.d.ts +28 -0
  16. package/dist/src/parsers/base.js +27 -0
  17. package/dist/src/parsers/base.js.map +1 -0
  18. package/dist/src/parsers/dartTreeSitter.d.ts +13 -0
  19. package/dist/src/parsers/dartTreeSitter.js +91 -0
  20. package/dist/src/parsers/dartTreeSitter.js.map +1 -0
  21. package/dist/src/parsers/php.d.ts +12 -0
  22. package/dist/src/parsers/php.js +86 -0
  23. package/dist/src/parsers/php.js.map +1 -0
  24. package/dist/src/parsers/python.d.ts +12 -0
  25. package/dist/src/parsers/python.js +86 -0
  26. package/dist/src/parsers/python.js.map +1 -0
  27. package/dist/src/parsers/registry.d.ts +15 -0
  28. package/dist/src/parsers/registry.js +70 -0
  29. package/dist/src/parsers/registry.js.map +1 -0
  30. package/dist/src/parsers/typescript.d.ts +13 -0
  31. package/dist/src/parsers/typescript.js +98 -0
  32. package/dist/src/parsers/typescript.js.map +1 -0
  33. package/llms.txt +246 -234
  34. package/mcp-code-context-3.0.2.tgz +0 -0
  35. package/package.json +59 -57
  36. package/tsconfig.tests.json +27 -0
  37. package/.io/RULES.md +0 -12
  38. package/CONTRIBUTING.md +0 -243
  39. package/PLAN_v2.5.0.md +0 -407
  40. package/TROUBLESHOOTING.md +0 -38
  41. package/dist/src/ast/dartCompressor.d.ts +0 -27
  42. package/dist/src/ast/dartCompressor.js +0 -859
  43. package/dist/src/ast/dartCompressor.js.map +0 -1
  44. package/dist/src/ast/phpCompressor.d.ts +0 -24
  45. package/dist/src/ast/phpCompressor.js +0 -634
  46. package/dist/src/ast/phpCompressor.js.map +0 -1
  47. package/dist/src/ast/semanticCompressor.d.ts +0 -22
  48. package/dist/src/ast/semanticCompressor.js +0 -677
  49. package/dist/src/ast/semanticCompressor.js.map +0 -1
  50. package/dist/src/ast/writers/dartWriter.d.ts +0 -37
  51. package/dist/src/ast/writers/dartWriter.js +0 -544
  52. package/dist/src/ast/writers/dartWriter.js.map +0 -1
  53. package/dist/src/ast/writers/phpWriter.d.ts +0 -37
  54. package/dist/src/ast/writers/phpWriter.js +0 -411
  55. package/dist/src/ast/writers/phpWriter.js.map +0 -1
  56. package/dist/src/ast/writers/pyWriter.d.ts +0 -37
  57. package/dist/src/ast/writers/pyWriter.js +0 -355
  58. package/dist/src/ast/writers/pyWriter.js.map +0 -1
  59. package/dist/src/ast/writers/safeRename.d.ts +0 -14
  60. package/dist/src/ast/writers/safeRename.js +0 -258
  61. package/dist/src/ast/writers/safeRename.js.map +0 -1
  62. package/dist/src/ast/writers/symbolWriter.d.ts +0 -64
  63. package/dist/src/ast/writers/symbolWriter.js +0 -174
  64. package/dist/src/ast/writers/symbolWriter.js.map +0 -1
  65. package/dist/src/ast/writers/tsWriter.d.ts +0 -38
  66. package/dist/src/ast/writers/tsWriter.js +0 -344
  67. package/dist/src/ast/writers/tsWriter.js.map +0 -1
  68. package/dist/src/cache/astCache.d.ts +0 -39
  69. package/dist/src/cache/astCache.js +0 -169
  70. package/dist/src/cache/astCache.js.map +0 -1
  71. package/dist/src/handlers/readHandlers.d.ts +0 -70
  72. package/dist/src/handlers/readHandlers.js +0 -455
  73. package/dist/src/handlers/readHandlers.js.map +0 -1
  74. package/dist/src/handlers/utilHandlers.d.ts +0 -31
  75. package/dist/src/handlers/utilHandlers.js +0 -69
  76. package/dist/src/handlers/utilHandlers.js.map +0 -1
  77. package/dist/src/handlers/writeHandlers.d.ts +0 -57
  78. package/dist/src/handlers/writeHandlers.js +0 -499
  79. package/dist/src/handlers/writeHandlers.js.map +0 -1
  80. package/dist/src/tools/readFileLines.d.ts +0 -26
  81. package/dist/src/tools/readFileLines.js +0 -77
  82. package/dist/src/tools/readFileLines.js.map +0 -1
  83. package/dist/src/tools/searchCodePattern.d.ts +0 -37
  84. package/dist/src/tools/searchCodePattern.js +0 -144
  85. package/dist/src/tools/searchCodePattern.js.map +0 -1
  86. package/dist/src/utils/arrayUtils.d.ts +0 -12
  87. package/dist/src/utils/arrayUtils.js +0 -27
  88. package/dist/src/utils/arrayUtils.js.map +0 -1
  89. package/dist/src/utils/backupManager.d.ts +0 -31
  90. package/dist/src/utils/backupManager.js +0 -124
  91. package/dist/src/utils/backupManager.js.map +0 -1
  92. package/dist/src/utils/confirmationCache.d.ts +0 -16
  93. package/dist/src/utils/confirmationCache.js +0 -40
  94. package/dist/src/utils/confirmationCache.js.map +0 -1
  95. package/dist/src/utils/constants.d.ts +0 -46
  96. package/dist/src/utils/constants.js +0 -112
  97. package/dist/src/utils/constants.js.map +0 -1
  98. package/dist/src/utils/dependencyChecker.d.ts +0 -1
  99. package/dist/src/utils/dependencyChecker.js +0 -55
  100. package/dist/src/utils/dependencyChecker.js.map +0 -1
  101. package/dist/src/utils/diffEngine.d.ts +0 -21
  102. package/dist/src/utils/diffEngine.js +0 -163
  103. package/dist/src/utils/diffEngine.js.map +0 -1
  104. package/dist/src/utils/fuzzyMatch.d.ts +0 -8
  105. package/dist/src/utils/fuzzyMatch.js +0 -69
  106. package/dist/src/utils/fuzzyMatch.js.map +0 -1
  107. package/dist/src/utils/ignoreManager.d.ts +0 -30
  108. package/dist/src/utils/ignoreManager.js +0 -186
  109. package/dist/src/utils/ignoreManager.js.map +0 -1
  110. package/dist/src/utils/normalization.d.ts +0 -49
  111. package/dist/src/utils/normalization.js +0 -173
  112. package/dist/src/utils/normalization.js.map +0 -1
  113. package/dist/src/utils/projectRoot.d.ts +0 -17
  114. package/dist/src/utils/projectRoot.js +0 -42
  115. package/dist/src/utils/projectRoot.js.map +0 -1
  116. package/dist/src/utils/secureValidation.d.ts +0 -15
  117. package/dist/src/utils/secureValidation.js +0 -41
  118. package/dist/src/utils/secureValidation.js.map +0 -1
  119. package/dist/src/utils/syntaxValidator.d.ts +0 -15
  120. package/dist/src/utils/syntaxValidator.js +0 -218
  121. package/dist/src/utils/syntaxValidator.js.map +0 -1
  122. package/dist/src/utils/transactionManager.d.ts +0 -46
  123. package/dist/src/utils/transactionManager.js +0 -123
  124. package/dist/src/utils/transactionManager.js.map +0 -1
  125. package/dist/src/utils/validation.d.ts +0 -87
  126. package/dist/src/utils/validation.js +0 -231
  127. package/dist/src/utils/validation.js.map +0 -1
  128. package/docs/ARCHITECTURE.md +0 -300
  129. package/docs/architecture/ADR-001-modular-handlers.md +0 -119
@@ -1,173 +0,0 @@
1
- /**
2
- * normalization.ts — Code Normalization Utilities
3
- *
4
- * Centralizes line ending normalization and indentation logic
5
- * to eliminate duplication across writer modules.
6
- */
7
- import { TS_INDENT, PHP_INDENT, PYTHON_INDENT } from "./constants.js";
8
- // ─── Line Ending Normalization ──────────────────────────────────────
9
- /**
10
- * Normalize line endings to LF (\n) for consistent processing.
11
- * Handles CRLF (\r\n), CR (\r), and mixed line endings.
12
- *
13
- * Why: Windows files use CRLF, which breaks brace-counting and line-based
14
- * operations. Normalizing to LF ensures consistent behavior across platforms.
15
- */
16
- export function normalizeLineEndings(content) {
17
- return content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
18
- }
19
- // ─── Indentation Detection ──────────────────────────────────────────
20
- /**
21
- * Extract the leading whitespace from a line.
22
- */
23
- export function getIndent(line) {
24
- const match = line.match(/^(\s*)/);
25
- return match ? match[1] : "";
26
- }
27
- /**
28
- * Measure the indentation level of a line (number of spaces/tabs).
29
- */
30
- export function measureIndent(line) {
31
- const indent = getIndent(line);
32
- // Convert tabs to 4 spaces for measurement
33
- return indent.replace(/\t/g, " ").length;
34
- }
35
- /**
36
- * Detect the predominant indentation style in a file.
37
- * Returns the most common indentation string (e.g., " ", " ", "\t").
38
- */
39
- export function detectIndentStyle(content) {
40
- const lines = content.split("\n");
41
- const indents = new Map();
42
- for (const line of lines) {
43
- if (line.trim() === "")
44
- continue;
45
- const indent = getIndent(line);
46
- if (indent.length === 0)
47
- continue;
48
- // Extract the base indent unit (first level of indentation)
49
- const match = indent.match(/^(\s+)/);
50
- if (match) {
51
- const unit = match[1];
52
- indents.set(unit, (indents.get(unit) || 0) + 1);
53
- }
54
- }
55
- if (indents.size === 0)
56
- return " "; // Default to 2 spaces
57
- // Return the most common indent
58
- let maxCount = 0;
59
- let commonIndent = " ";
60
- for (const [indent, count] of indents.entries()) {
61
- if (count > maxCount) {
62
- maxCount = count;
63
- commonIndent = indent;
64
- }
65
- }
66
- return commonIndent;
67
- }
68
- // ─── Code Reindentation ─────────────────────────────────────────────
69
- /**
70
- * Reindent code to match a target indentation level.
71
- * Preserves relative indentation between lines.
72
- *
73
- * @param code - The code to reindent
74
- * @param targetIndent - The base indentation to apply
75
- * @param language - Optional language hint for default indent style
76
- */
77
- export function reindentCode(code, targetIndent, language) {
78
- // Normalize line endings first
79
- code = normalizeLineEndings(code);
80
- const lines = code.split("\n");
81
- if (lines.length === 0)
82
- return code;
83
- // Find minimum indentation (excluding empty lines)
84
- let minIndent = Infinity;
85
- for (const line of lines) {
86
- if (line.trim() === "")
87
- continue;
88
- const indent = measureIndent(line);
89
- if (indent < minIndent)
90
- minIndent = indent;
91
- }
92
- if (minIndent === Infinity)
93
- minIndent = 0;
94
- // Apply target indentation while preserving relative indentation
95
- return lines
96
- .map((line) => {
97
- if (line.trim() === "")
98
- return "";
99
- const currentIndent = measureIndent(line);
100
- const relativeIndent = currentIndent - minIndent;
101
- // Calculate how many indent units are needed
102
- const indentUnit = getIndentUnit(language);
103
- const indentUnitSize = indentUnit.length;
104
- const numUnits = Math.floor(relativeIndent / indentUnitSize);
105
- return targetIndent + indentUnit.repeat(numUnits) + line.trimStart();
106
- })
107
- .join("\n");
108
- }
109
- /**
110
- * Get the standard indentation unit for a language.
111
- */
112
- function getIndentUnit(language) {
113
- switch (language) {
114
- case "dart":
115
- case "typescript":
116
- return TS_INDENT;
117
- case "php":
118
- return PHP_INDENT;
119
- case "python":
120
- return PYTHON_INDENT;
121
- default:
122
- return " "; // Default to 2 spaces
123
- }
124
- }
125
- /**
126
- * Reindent code for Python (indentation-aware language).
127
- * Handles Python's strict indentation requirements.
128
- */
129
- export function reindentPython(code, targetIndent) {
130
- code = normalizeLineEndings(code);
131
- const lines = code.split("\n");
132
- if (lines.length === 0)
133
- return code;
134
- let minIndent = Infinity;
135
- for (const line of lines) {
136
- if (line.trim() === "")
137
- continue;
138
- const indent = measureIndent(line);
139
- if (indent < minIndent)
140
- minIndent = indent;
141
- }
142
- if (minIndent === Infinity)
143
- minIndent = 0;
144
- return lines
145
- .map((line) => {
146
- if (line.trim() === "")
147
- return "";
148
- const currentIndent = measureIndent(line);
149
- const relativeIndent = currentIndent - minIndent;
150
- // Python uses 4-space indentation by convention
151
- const numLevels = Math.floor(relativeIndent / 4);
152
- return targetIndent + PYTHON_INDENT.repeat(numLevels) + line.trimStart();
153
- })
154
- .join("\n");
155
- }
156
- // ─── Whitespace Cleanup ─────────────────────────────────────────────
157
- /**
158
- * Remove excessive blank lines (more than 2 consecutive).
159
- */
160
- export function normalizeBlankLines(content) {
161
- return content.replace(/\n{3,}/g, "\n\n");
162
- }
163
- /**
164
- * Ensure file ends with a single newline (POSIX standard).
165
- */
166
- export function ensureTrailingNewline(content) {
167
- if (!content.endsWith("\n")) {
168
- return content + "\n";
169
- }
170
- // Remove multiple trailing newlines
171
- return content.replace(/\n+$/, "\n");
172
- }
173
- //# sourceMappingURL=normalization.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalization.js","sourceRoot":"","sources":["../../../src/utils/normalization.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Secure Project Root Detection
3
- * Ensures all file operations are contained within project boundaries
4
- */
5
- /**
6
- * Find project root by walking up from a file path
7
- * Returns undefined if no root marker found
8
- */
9
- export declare function findProjectRoot(filePath: string): string | undefined;
10
- /**
11
- * Validate that a file path is within project boundaries
12
- * MANDATORY for all write operations
13
- */
14
- export declare function enforceProjectBoundary(filePath: string, projectRoot: string): {
15
- valid: boolean;
16
- error?: string;
17
- };
@@ -1,42 +0,0 @@
1
- /**
2
- * Secure Project Root Detection
3
- * Ensures all file operations are contained within project boundaries
4
- */
5
- import * as fs from "node:fs";
6
- import * as path from "node:path";
7
- const ROOT_MARKERS = ["package.json", ".git", "pubspec.yaml", "pyproject.toml", "Cargo.toml"];
8
- /**
9
- * Find project root by walking up from a file path
10
- * Returns undefined if no root marker found
11
- */
12
- export function findProjectRoot(filePath) {
13
- let current = path.dirname(path.resolve(filePath));
14
- const root = path.parse(current).root;
15
- while (current !== root) {
16
- for (const marker of ROOT_MARKERS) {
17
- if (fs.existsSync(path.join(current, marker))) {
18
- return current;
19
- }
20
- }
21
- current = path.dirname(current);
22
- }
23
- return undefined;
24
- }
25
- /**
26
- * Validate that a file path is within project boundaries
27
- * MANDATORY for all write operations
28
- */
29
- export function enforceProjectBoundary(filePath, projectRoot) {
30
- const normalized = path.resolve(filePath);
31
- const normalizedRoot = path.resolve(projectRoot);
32
- const relative = path.relative(normalizedRoot, normalized);
33
- // If relative path starts with .., it's outside the project root
34
- if (relative.startsWith("..") || path.isAbsolute(relative)) {
35
- return {
36
- valid: false,
37
- error: `Security: Path outside project root. File: ${normalized}, Root: ${normalizedRoot}`
38
- };
39
- }
40
- return { valid: true };
41
- }
42
- //# sourceMappingURL=projectRoot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projectRoot.js","sourceRoot":"","sources":["../../../src/utils/projectRoot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;AAE9F;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAEtC,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAgB,EAChB,WAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAE3D,iEAAiE;IACjE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,8CAA8C,UAAU,WAAW,cAAc,EAAE;SAC3F,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Secure validation helper for write operations
3
- * Enforces project boundary checks
4
- */
5
- export interface SecureValidationResult {
6
- valid: boolean;
7
- resolvedPath?: string;
8
- projectRoot?: string;
9
- error?: string;
10
- }
11
- /**
12
- * Validate file path with mandatory project boundary enforcement
13
- * Use this for ALL write operations
14
- */
15
- export declare function validateFilePathSecure(filePath: string): SecureValidationResult;
@@ -1,41 +0,0 @@
1
- /**
2
- * Secure validation helper for write operations
3
- * Enforces project boundary checks
4
- */
5
- import { validateFilePath } from "./validation.js";
6
- import { findProjectRoot, enforceProjectBoundary } from "./projectRoot.js";
7
- /**
8
- * Validate file path with mandatory project boundary enforcement
9
- * Use this for ALL write operations
10
- */
11
- export function validateFilePathSecure(filePath) {
12
- const validation = validateFilePath(filePath);
13
- if (!validation.valid) {
14
- return {
15
- valid: false,
16
- error: validation.error
17
- };
18
- }
19
- const resolvedPath = validation.normalizedPath;
20
- // SECURITY: Enforce project boundary for write operations
21
- const projectRoot = findProjectRoot(resolvedPath);
22
- if (!projectRoot) {
23
- return {
24
- valid: false,
25
- error: "Cannot determine project root. Ensure file is within a valid project."
26
- };
27
- }
28
- const boundaryCheck = enforceProjectBoundary(resolvedPath, projectRoot);
29
- if (!boundaryCheck.valid) {
30
- return {
31
- valid: false,
32
- error: boundaryCheck.error
33
- };
34
- }
35
- return {
36
- valid: true,
37
- resolvedPath,
38
- projectRoot
39
- };
40
- }
41
- //# sourceMappingURL=secureValidation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"secureValidation.js","sourceRoot":"","sources":["../../../src/utils/secureValidation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAS3E;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,cAAe,CAAC;IAEhD,0DAA0D;IAC1D,MAAM,WAAW,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,uEAAuE;SAC/E,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACxE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,aAAa,CAAC,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,YAAY;QACZ,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
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
- export interface SyntaxValidationResult {
8
- valid: boolean;
9
- error?: string;
10
- diagnostics?: string[];
11
- }
12
- /**
13
- * Validate syntax of modified content before writing to disk
14
- */
15
- export declare function validateSyntax(filePath: string, content: string): Promise<SyntaxValidationResult>;
@@ -1,218 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"syntaxValidator.js","sourceRoot":"","sources":["../../../src/utils/syntaxValidator.ts"],"names":[],"mappings":"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"}
@@ -1,46 +0,0 @@
1
- /**
2
- * Transaction Manager - Atomic Multi-File Operations
3
- * Ensures all-or-nothing writes with automatic rollback on failure
4
- * Now includes syntax validation before commit
5
- */
6
- export interface FileChange {
7
- filePath: string;
8
- newContent: string;
9
- }
10
- export declare class TransactionManager {
11
- private staging;
12
- private backedUpFiles;
13
- /**
14
- * Stage a file change for commit
15
- */
16
- stage(filePath: string, newContent: string): void;
17
- /**
18
- * Stage multiple file changes
19
- */
20
- stageMultiple(changes: FileChange[]): void;
21
- /**
22
- * Commit all staged changes atomically
23
- * Creates backups first, validates syntax, then writes all files
24
- * Rolls back automatically on any failure
25
- */
26
- commit(): Promise<{
27
- success: boolean;
28
- error?: string;
29
- }>;
30
- /**
31
- * Rollback all changes by restoring from backups
32
- */
33
- rollback(): Promise<void>;
34
- /**
35
- * Clear staging area and backup tracking
36
- */
37
- clear(): void;
38
- /**
39
- * Get number of staged changes
40
- */
41
- get stagedCount(): number;
42
- /**
43
- * Get list of staged file paths
44
- */
45
- getStagedFiles(): string[];
46
- }