mcp-code-context 3.6.3 → 3.7.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.
Files changed (181) hide show
  1. package/CHANGELOG.md +140 -278
  2. package/INSTRUCTIONS.md +23 -9
  3. package/README.md +217 -97
  4. package/SECURITY.md +55 -21
  5. package/dist/src/core/cacheManager.d.ts +4 -5
  6. package/dist/src/core/cacheManager.js +49 -33
  7. package/dist/src/core/cacheManager.js.map +1 -1
  8. package/dist/src/core/engine.d.ts +1 -1
  9. package/dist/src/core/engine.js +3 -3
  10. package/dist/src/core/engine.js.map +1 -1
  11. package/dist/src/core/indexManager.d.ts +58 -0
  12. package/dist/src/core/indexManager.js +252 -0
  13. package/dist/src/core/indexManager.js.map +1 -0
  14. package/dist/src/core/indexManagerQueries.d.ts +14 -0
  15. package/dist/src/core/indexManagerQueries.js +95 -0
  16. package/dist/src/core/indexManagerQueries.js.map +1 -0
  17. package/dist/src/core/sessionManager.d.ts +117 -0
  18. package/dist/src/core/sessionManager.js +231 -0
  19. package/dist/src/core/sessionManager.js.map +1 -0
  20. package/dist/src/core/validator.d.ts +1 -1
  21. package/dist/src/core/validator.js +18 -10
  22. package/dist/src/core/validator.js.map +1 -1
  23. package/dist/src/index.d.ts +1 -13
  24. package/dist/src/index.js +25 -999
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/operations/astTransform.d.ts +38 -0
  27. package/dist/src/operations/astTransform.js +239 -0
  28. package/dist/src/operations/astTransform.js.map +1 -0
  29. package/dist/src/operations/compress.d.ts +5 -3
  30. package/dist/src/operations/compress.js +73 -7
  31. package/dist/src/operations/compress.js.map +1 -1
  32. package/dist/src/operations/confirmationStore.d.ts +35 -8
  33. package/dist/src/operations/confirmationStore.js +112 -14
  34. package/dist/src/operations/confirmationStore.js.map +1 -1
  35. package/dist/src/operations/impactAnalysis.d.ts +9 -0
  36. package/dist/src/operations/impactAnalysis.js +61 -0
  37. package/dist/src/operations/impactAnalysis.js.map +1 -0
  38. package/dist/src/operations/pendingStore.d.ts +51 -0
  39. package/dist/src/operations/pendingStore.js +201 -0
  40. package/dist/src/operations/pendingStore.js.map +1 -0
  41. package/dist/src/operations/pendingStoreInit.d.ts +6 -0
  42. package/dist/src/operations/pendingStoreInit.js +42 -0
  43. package/dist/src/operations/pendingStoreInit.js.map +1 -0
  44. package/dist/src/operations/read.d.ts +6 -92
  45. package/dist/src/operations/read.js +4 -449
  46. package/dist/src/operations/read.js.map +1 -1
  47. package/dist/src/operations/readCore.d.ts +33 -0
  48. package/dist/src/operations/readCore.js +142 -0
  49. package/dist/src/operations/readCore.js.map +1 -0
  50. package/dist/src/operations/rename.d.ts +13 -0
  51. package/dist/src/operations/rename.js +130 -0
  52. package/dist/src/operations/rename.js.map +1 -0
  53. package/dist/src/operations/searchOperation.d.ts +16 -0
  54. package/dist/src/operations/searchOperation.js +113 -0
  55. package/dist/src/operations/searchOperation.js.map +1 -0
  56. package/dist/src/operations/symbolQuery.d.ts +38 -0
  57. package/dist/src/operations/symbolQuery.js +194 -0
  58. package/dist/src/operations/symbolQuery.js.map +1 -0
  59. package/dist/src/operations/write.d.ts +11 -14
  60. package/dist/src/operations/write.js +6 -125
  61. package/dist/src/operations/write.js.map +1 -1
  62. package/dist/src/parsers/base.d.ts +1 -1
  63. package/dist/src/parsers/base.js +1 -1
  64. package/dist/src/parsers/csharp.d.ts +12 -0
  65. package/dist/src/parsers/csharp.js +67 -0
  66. package/dist/src/parsers/csharp.js.map +1 -0
  67. package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
  68. package/dist/src/parsers/dartTreeSitter.js +1 -1
  69. package/dist/src/parsers/go.d.ts +11 -0
  70. package/dist/src/parsers/go.js +74 -0
  71. package/dist/src/parsers/go.js.map +1 -0
  72. package/dist/src/parsers/java.d.ts +12 -0
  73. package/dist/src/parsers/java.js +62 -0
  74. package/dist/src/parsers/java.js.map +1 -0
  75. package/dist/src/parsers/kotlin.d.ts +12 -0
  76. package/dist/src/parsers/kotlin.js +75 -0
  77. package/dist/src/parsers/kotlin.js.map +1 -0
  78. package/dist/src/parsers/php.d.ts +1 -1
  79. package/dist/src/parsers/php.js +1 -1
  80. package/dist/src/parsers/python.d.ts +1 -1
  81. package/dist/src/parsers/python.js +1 -1
  82. package/dist/src/parsers/registry.d.ts +1 -1
  83. package/dist/src/parsers/registry.js +63 -2
  84. package/dist/src/parsers/registry.js.map +1 -1
  85. package/dist/src/parsers/ruby.d.ts +12 -0
  86. package/dist/src/parsers/ruby.js +73 -0
  87. package/dist/src/parsers/ruby.js.map +1 -0
  88. package/dist/src/parsers/rust.d.ts +12 -0
  89. package/dist/src/parsers/rust.js +66 -0
  90. package/dist/src/parsers/rust.js.map +1 -0
  91. package/dist/src/parsers/typescript.d.ts +1 -1
  92. package/dist/src/parsers/typescript.js +28 -38
  93. package/dist/src/parsers/typescript.js.map +1 -1
  94. package/dist/src/tools/adminHandlers.d.ts +67 -0
  95. package/dist/src/tools/adminHandlers.js +129 -0
  96. package/dist/src/tools/adminHandlers.js.map +1 -0
  97. package/dist/src/tools/context.d.ts +9 -0
  98. package/dist/src/tools/context.js +21 -0
  99. package/dist/src/tools/context.js.map +1 -0
  100. package/dist/src/tools/handlers.d.ts +4 -0
  101. package/dist/src/tools/handlers.js +5 -0
  102. package/dist/src/tools/handlers.js.map +1 -0
  103. package/dist/src/tools/pipeline.d.ts +6 -0
  104. package/dist/src/tools/pipeline.js +100 -0
  105. package/dist/src/tools/pipeline.js.map +1 -0
  106. package/dist/src/tools/readHandlers.d.ts +55 -0
  107. package/dist/src/tools/readHandlers.js +220 -0
  108. package/dist/src/tools/readHandlers.js.map +1 -0
  109. package/dist/src/tools/toolDefinitions.d.ts +1037 -0
  110. package/dist/src/tools/toolDefinitions.js +13 -0
  111. package/dist/src/tools/toolDefinitions.js.map +1 -0
  112. package/dist/src/tools/toolDefinitionsAdmin.d.ts +89 -0
  113. package/dist/src/tools/toolDefinitionsAdmin.js +99 -0
  114. package/dist/src/tools/toolDefinitionsAdmin.js.map +1 -0
  115. package/dist/src/tools/toolDefinitionsCore.d.ts +949 -0
  116. package/dist/src/tools/toolDefinitionsCore.js +267 -0
  117. package/dist/src/tools/toolDefinitionsCore.js.map +1 -0
  118. package/dist/src/tools/writeHandlers.d.ts +37 -0
  119. package/dist/src/tools/writeHandlers.js +199 -0
  120. package/dist/src/tools/writeHandlers.js.map +1 -0
  121. package/dist/src/utils/appDir.d.ts +19 -0
  122. package/dist/src/utils/appDir.js +50 -0
  123. package/dist/src/utils/appDir.js.map +1 -0
  124. package/dist/src/utils/auditLogWriter.d.ts +9 -0
  125. package/dist/src/utils/auditLogWriter.js +49 -0
  126. package/dist/src/utils/auditLogWriter.js.map +1 -0
  127. package/dist/src/utils/auditLogger.d.ts +1 -10
  128. package/dist/src/utils/auditLogger.js +14 -109
  129. package/dist/src/utils/auditLogger.js.map +1 -1
  130. package/dist/src/utils/auditQuery.d.ts +23 -0
  131. package/dist/src/utils/auditQuery.js +67 -0
  132. package/dist/src/utils/auditQuery.js.map +1 -0
  133. package/dist/src/utils/backupManager.d.ts +2 -2
  134. package/dist/src/utils/backupManager.js +29 -12
  135. package/dist/src/utils/backupManager.js.map +1 -1
  136. package/dist/src/utils/constants.d.ts +1 -1
  137. package/dist/src/utils/constants.js +8 -1
  138. package/dist/src/utils/constants.js.map +1 -1
  139. package/dist/src/utils/diff.d.ts +12 -1
  140. package/dist/src/utils/diff.js +41 -1
  141. package/dist/src/utils/diff.js.map +1 -1
  142. package/dist/src/utils/fileLock.d.ts +7 -2
  143. package/dist/src/utils/fileLock.js +14 -11
  144. package/dist/src/utils/fileLock.js.map +1 -1
  145. package/dist/src/utils/fileWalker.d.ts +1 -1
  146. package/dist/src/utils/fileWalker.js +1 -1
  147. package/dist/src/utils/fileWatcher.d.ts +1 -1
  148. package/dist/src/utils/fileWatcher.js +1 -1
  149. package/dist/src/utils/fuzzySearch.d.ts +1 -1
  150. package/dist/src/utils/fuzzySearch.js +1 -1
  151. package/dist/src/utils/logger.d.ts +1 -1
  152. package/dist/src/utils/logger.js +2 -2
  153. package/dist/src/utils/logger.js.map +1 -1
  154. package/dist/src/utils/rateLimiter.d.ts +9 -1
  155. package/dist/src/utils/rateLimiter.js +12 -1
  156. package/dist/src/utils/rateLimiter.js.map +1 -1
  157. package/dist/src/utils/regexValidator.d.ts +12 -0
  158. package/dist/src/utils/regexValidator.js +48 -0
  159. package/dist/src/utils/regexValidator.js.map +1 -0
  160. package/dist/src/utils/safeRegex.d.ts +2 -92
  161. package/dist/src/utils/safeRegex.js +41 -222
  162. package/dist/src/utils/safeRegex.js.map +1 -1
  163. package/dist/src/utils/safeRegexApi.d.ts +56 -0
  164. package/dist/src/utils/safeRegexApi.js +99 -0
  165. package/dist/src/utils/safeRegexApi.js.map +1 -0
  166. package/dist/src/utils/safeRegexPool.d.ts +7 -0
  167. package/dist/src/utils/safeRegexPool.js +102 -0
  168. package/dist/src/utils/safeRegexPool.js.map +1 -0
  169. package/dist/src/utils/searchTools.js +6 -6
  170. package/dist/src/utils/searchTools.js.map +1 -1
  171. package/dist/src/utils/streaming.d.ts +4 -3
  172. package/dist/src/utils/streaming.js +1 -1
  173. package/dist/src/utils/streaming.js.map +1 -1
  174. package/dist/src/utils/telemetry.d.ts +1 -1
  175. package/dist/src/utils/telemetry.js +1 -1
  176. package/dist/src/utils/toctou.d.ts +7 -0
  177. package/dist/src/utils/toctou.js +24 -0
  178. package/dist/src/utils/toctou.js.map +1 -0
  179. package/llms.txt +173 -21
  180. package/package.json +2 -2
  181. package/scripts/replace-version.js +0 -59
@@ -0,0 +1,267 @@
1
+ /** Core MCP tool schemas (read + write) */
2
+ export const CORE_TOOLS = [
3
+ {
4
+ name: "get_semantic_repo_map",
5
+ description: "Generate a compressed architectural overview of an entire repository",
6
+ inputSchema: {
7
+ type: "object",
8
+ properties: {
9
+ directoryPath: { type: "string", description: "Absolute path to repository root" },
10
+ projectRoot: { type: "string", description: "Project root for security boundary" },
11
+ format: { type: "string", enum: ["xml", "markdown"], description: "Output format (default: xml)" },
12
+ },
13
+ required: ["directoryPath", "projectRoot"],
14
+ },
15
+ },
16
+ {
17
+ name: "read_file_surgical",
18
+ description: "Read a file or extract a specific named symbol",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ filePath: { type: "string", description: "Absolute path to file" },
23
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
24
+ symbolName: { type: "string", description: "Symbol name to extract (optional)" },
25
+ className: { type: "string", description: "Class name for scoping (optional)" },
26
+ },
27
+ required: ["filePath", "projectRoot"],
28
+ },
29
+ },
30
+ {
31
+ name: "analyze_impact",
32
+ description: "Find all files that depend on a given file",
33
+ inputSchema: {
34
+ type: "object",
35
+ properties: {
36
+ filePath: { type: "string", description: "Absolute path to file" },
37
+ projectRoot: { type: "string", description: "Project root for security boundary" },
38
+ rootDir: { type: "string", description: "Repository root (optional, defaults to projectRoot)" },
39
+ },
40
+ required: ["filePath", "projectRoot"],
41
+ },
42
+ },
43
+ {
44
+ name: "read_file_lines",
45
+ description: "Read specific line ranges from a file",
46
+ inputSchema: {
47
+ type: "object",
48
+ properties: {
49
+ filePath: { type: "string", description: "Absolute path to file" },
50
+ projectRoot: { type: "string", description: "Project root for security boundary" },
51
+ startLine: { type: "number", description: "Starting line number (1-indexed)" },
52
+ endLine: { type: "number", description: "Ending line number (1-indexed)" },
53
+ aroundPattern: { type: "string", description: "Search pattern to find and return surrounding lines" },
54
+ contextLines: { type: "number", description: "Number of lines before/after pattern (default: 5)" },
55
+ },
56
+ required: ["filePath", "projectRoot"],
57
+ },
58
+ },
59
+ {
60
+ name: "search_code_pattern",
61
+ description: "Search for code patterns across multiple files",
62
+ inputSchema: {
63
+ type: "object",
64
+ properties: {
65
+ rootDir: { type: "string", description: "Repository root directory" },
66
+ projectRoot: { type: "string", description: "Project root for security boundary" },
67
+ pattern: { type: "string", description: "Regular expression pattern to search" },
68
+ fileExtensions: { type: "array", items: { type: "string" }, description: "Extensions to search" },
69
+ excludeDirs: { type: "array", items: { type: "string" }, description: "Directories to exclude" },
70
+ maxResults: { type: "number", description: "Maximum matches to return (default: 10)" },
71
+ startIndex: { type: "number", description: "Start index for pagination (default: 0)" },
72
+ fuzzyMatch: { type: "boolean", description: "Enable fuzzy matching (default: false)" },
73
+ fuzzyThreshold: { type: "number", description: "Fuzzy match threshold 0-1 (default: 0.4)" },
74
+ },
75
+ required: ["rootDir", "projectRoot", "pattern"],
76
+ },
77
+ },
78
+ {
79
+ name: "parse_file",
80
+ description: "Parse a file using Tree-sitter and extract symbols",
81
+ inputSchema: {
82
+ type: "object",
83
+ properties: {
84
+ filePath: { type: "string", description: "Absolute path to file" },
85
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
86
+ },
87
+ required: ["filePath", "projectRoot"],
88
+ },
89
+ },
90
+ {
91
+ name: "write_file_surgical",
92
+ description: "Replace a symbol with new code. Phase 1 (dry-run): returns diff + token. Phase 2: confirm with token to apply.",
93
+ inputSchema: {
94
+ type: "object",
95
+ properties: {
96
+ filePath: { type: "string", description: "Absolute path to file" },
97
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
98
+ symbolName: { type: "string", description: "Symbol to replace" },
99
+ newContent: { type: "string", description: "New code (Phase 1 only ΓÇö omit in Phase 2, server uses stored content)" },
100
+ className: { type: "string", description: "Class name (optional, for scoping)" },
101
+ confirm: { type: "boolean", description: "Set true to apply a pending operation (Phase 2)" },
102
+ confirmationToken: { type: "string", description: "Token from Phase 1 dry-run (Phase 2 only)" },
103
+ diffFormat: { type: "string", enum: ["unified", "compact", "summary", "none"], description: "Diff verbosity in Phase 1 output (default: unified). Use none to skip diff and save tokens." },
104
+ },
105
+ required: ["filePath", "projectRoot", "symbolName"],
106
+ },
107
+ },
108
+ {
109
+ name: "insert_symbol",
110
+ description: "Insert code at a specific location. Phase 1: returns diff + token. Phase 2: confirm with token to apply.",
111
+ inputSchema: {
112
+ type: "object",
113
+ properties: {
114
+ filePath: { type: "string", description: "Absolute path to file" },
115
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
116
+ code: { type: "string", description: "Code to insert (Phase 1 only ΓÇö omit in Phase 2, server uses stored content)" },
117
+ anchorSymbol: { type: "string", description: "Symbol to position relative to" },
118
+ position: { type: "string", enum: ["before", "after", "inside_start", "inside_end"], description: "Where to insert" },
119
+ className: { type: "string", description: "Class name (optional)" },
120
+ confirm: { type: "boolean", description: "Set true to apply a pending operation (Phase 2)" },
121
+ confirmationToken: { type: "string", description: "Token from Phase 1 dry-run (Phase 2 only)" },
122
+ diffFormat: { type: "string", enum: ["unified", "compact", "summary", "none"], description: "Diff verbosity in Phase 1 output (default: unified). Use none to skip diff and save tokens." },
123
+ },
124
+ required: ["filePath", "projectRoot"],
125
+ },
126
+ },
127
+ {
128
+ name: "remove_symbol",
129
+ description: "Remove a symbol from file. Phase 1: returns diff + token. Phase 2: confirm with token to apply.",
130
+ inputSchema: {
131
+ type: "object",
132
+ properties: {
133
+ filePath: { type: "string", description: "Absolute path to file" },
134
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
135
+ symbolName: { type: "string", description: "Symbol to remove" },
136
+ className: { type: "string", description: "Class name (optional)" },
137
+ force: { type: "boolean", description: "Skip dependency check" },
138
+ confirm: { type: "boolean", description: "Set true to apply a pending operation" },
139
+ confirmationToken: { type: "string", description: "Token from Phase 1 dry-run" },
140
+ },
141
+ required: ["filePath", "projectRoot", "symbolName"],
142
+ },
143
+ },
144
+ {
145
+ name: "rename_symbol",
146
+ description: "Rename a symbol across the entire repository. Phase 1: returns diff + token. Phase 2: confirm with token to apply.",
147
+ inputSchema: {
148
+ type: "object",
149
+ properties: {
150
+ filePath: { type: "string", description: "File where symbol is defined" },
151
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
152
+ oldName: { type: "string", description: "Current name" },
153
+ newName: { type: "string", description: "New name" },
154
+ rootDir: { type: "string", description: "Repository root (optional)" },
155
+ confirm: { type: "boolean", description: "Set true to apply a pending operation" },
156
+ confirmationToken: { type: "string", description: "Token from Phase 1 dry-run" },
157
+ },
158
+ required: ["filePath", "projectRoot", "oldName", "newName"],
159
+ },
160
+ },
161
+ // ── AST Transform (v3.7.0) ──────────────────────────────────────────────
162
+ {
163
+ name: "ast_transform",
164
+ description: "Apply a declarative AST transformation to a symbol. Supports: add_parameter, wrap_with_try_catch, add_decorator, change_return_type, extract_variable. Uses two-phase write (Phase 1: preview diff, Phase 2: confirm with token).",
165
+ inputSchema: {
166
+ type: "object",
167
+ properties: {
168
+ filePath: { type: "string", description: "Absolute path to file" },
169
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
170
+ symbolName: { type: "string", description: "Target symbol to transform" },
171
+ className: { type: "string", description: "Class name (optional, for scoping)" },
172
+ transform: {
173
+ type: "object",
174
+ description: "Transform specification",
175
+ properties: {
176
+ kind: {
177
+ type: "string",
178
+ enum: ["add_parameter", "wrap_with_try_catch", "add_decorator", "change_return_type", "extract_variable"],
179
+ description: "Type of transformation",
180
+ },
181
+ parameter: { type: "string", description: "For add_parameter: parameter text (e.g. 'timeout: number = 5000')" },
182
+ parameterIndex: { type: "number", description: "For add_parameter: insertion index (0-based, default: append)" },
183
+ catchBody: { type: "string", description: "For wrap_with_try_catch: catch block body (default: 'throw error;')" },
184
+ decorator: { type: "string", description: "For add_decorator: decorator text (e.g. '@deprecated')" },
185
+ returnType: { type: "string", description: "For change_return_type: new return type" },
186
+ expression: { type: "string", description: "For extract_variable: expression to extract" },
187
+ variableName: { type: "string", description: "For extract_variable: name for extracted const" },
188
+ },
189
+ required: ["kind"],
190
+ },
191
+ confirm: { type: "boolean", description: "Set true to apply a pending operation (Phase 2)" },
192
+ confirmationToken: { type: "string", description: "Token from Phase 1 dry-run (Phase 2 only)" },
193
+ diffFormat: { type: "string", enum: ["unified", "compact", "summary", "none"], description: "Diff verbosity (default: unified)" },
194
+ },
195
+ required: ["filePath", "projectRoot", "symbolName", "transform"],
196
+ },
197
+ },
198
+ // ── NEW TOOLS v3.7.0 ──────────────────────────────────────────────────────ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ
199
+ {
200
+ name: "search_symbols",
201
+ description: "Search symbols by name across the repo using AST (not text search). Finds classes, functions, methods by approximate name.",
202
+ inputSchema: {
203
+ type: "object",
204
+ properties: {
205
+ rootDir: { type: "string", description: "Directory to search in" },
206
+ projectRoot: { type: "string", description: "Project root for security boundary" },
207
+ query: { type: "string", description: "Symbol name or partial name to search" },
208
+ fuzzy: { type: "boolean", description: "Enable fuzzy name matching (default: false)" },
209
+ types: { type: "array", items: { type: "string" }, description: "Filter by symbol types: class_declaration, function_declaration, method_definition, etc." },
210
+ fileExtensions: { type: "array", items: { type: "string" }, description: "Extensions to search (default: all supported)" },
211
+ excludeDirs: { type: "array", items: { type: "string" }, description: "Directories to exclude" },
212
+ maxResults: { type: "number", description: "Maximum results (default: 20)" },
213
+ },
214
+ required: ["rootDir", "projectRoot", "query"],
215
+ },
216
+ },
217
+ {
218
+ name: "explain_symbol",
219
+ description: "Get signature, location, and callers of a symbol in one call. More efficient than read_file_surgical + analyze_impact separately.",
220
+ inputSchema: {
221
+ type: "object",
222
+ properties: {
223
+ filePath: { type: "string", description: "Absolute path to file" },
224
+ projectRoot: { type: "string", description: "Project root (REQUIRED)" },
225
+ symbolName: { type: "string", description: "Symbol to explain" },
226
+ className: { type: "string", description: "Class name (optional, for scoping)" },
227
+ rootDir: { type: "string", description: "Root dir for caller search (optional, defaults to projectRoot)" },
228
+ },
229
+ required: ["filePath", "projectRoot", "symbolName"],
230
+ },
231
+ },
232
+ {
233
+ name: "batch_read",
234
+ description: "Read multiple symbols from multiple files in one call. Reduces N round-trips to 1.",
235
+ inputSchema: {
236
+ type: "object",
237
+ properties: {
238
+ reads: {
239
+ type: "array",
240
+ description: "List of symbols to read",
241
+ items: {
242
+ type: "object",
243
+ properties: {
244
+ filePath: { type: "string", description: "Absolute path to file" },
245
+ symbolName: { type: "string", description: "Symbol name to extract" },
246
+ className: { type: "string", description: "Class name (optional)" },
247
+ },
248
+ required: ["filePath", "symbolName"],
249
+ },
250
+ },
251
+ projectRoot: { type: "string", description: "Project root for security boundary" },
252
+ },
253
+ required: ["reads", "projectRoot"],
254
+ },
255
+ },
256
+ {
257
+ name: "get_rate_limit_status",
258
+ description: "Get current rate limiter token balance and operation costs. Use before expensive operations to check available budget.",
259
+ inputSchema: {
260
+ type: "object",
261
+ properties: {},
262
+ required: [],
263
+ },
264
+ },
265
+ // ΓöÇΓöÇ END NEW TOOLS ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ
266
+ ];
267
+ //# sourceMappingURL=toolDefinitionsCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolDefinitionsCore.js","sourceRoot":"","sources":["../../../src/tools/toolDefinitionsCore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /** Tool handlers */
2
+ export declare function handleTwoPhaseWrite(args: Record<string, unknown>, operationName: string, executeWrite: () => Promise<any>): Promise<{
3
+ content: {
4
+ type: string;
5
+ text: string;
6
+ }[];
7
+ }>;
8
+ export declare function handleWriteFileSurgical(args: Record<string, unknown>): Promise<{
9
+ content: {
10
+ type: string;
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ export declare function handleInsertSymbol(args: Record<string, unknown>): Promise<{
15
+ content: {
16
+ type: string;
17
+ text: string;
18
+ }[];
19
+ }>;
20
+ export declare function handleRemoveSymbol(args: Record<string, unknown>): Promise<{
21
+ content: {
22
+ type: string;
23
+ text: string;
24
+ }[];
25
+ }>;
26
+ export declare function handleRenameSymbol(args: Record<string, unknown>): Promise<{
27
+ content: {
28
+ type: string;
29
+ text: string;
30
+ }[];
31
+ }>;
32
+ export declare function handleAstTransform(args: Record<string, unknown>): Promise<{
33
+ content: {
34
+ type: string;
35
+ text: string;
36
+ }[];
37
+ }>;
@@ -0,0 +1,199 @@
1
+ /** Tool handlers */
2
+ import * as path from "node:path";
3
+ import { SecurityValidator } from "../core/validator.js";
4
+ import { replaceSymbol, insertCode, removeSymbol, writeFile, renameSymbol } from "../operations/write.js";
5
+ import { astTransform } from "../operations/astTransform.js";
6
+ import { BackupManager } from "../utils/backupManager.js";
7
+ import { verifyFileUnchanged } from "../utils/toctou.js";
8
+ import { getSession, getRegistry, SESSION_ID } from "./context.js";
9
+ export async function handleTwoPhaseWrite(args, operationName, executeWrite) {
10
+ const confirm = Boolean(args.confirm);
11
+ const token = args.confirmationToken ? String(args.confirmationToken) : undefined;
12
+ const session = getSession();
13
+ const projectRoot = args.projectRoot ? String(args.projectRoot) : undefined;
14
+ // Proactively activate SQLite persistence if projectRoot is provided
15
+ if (projectRoot && !session.confirmationStore.hasPersistentStore()) {
16
+ session.confirmationStore.activatePersistence(SESSION_ID, projectRoot);
17
+ }
18
+ if (confirm) {
19
+ if (!token)
20
+ throw new Error("confirmationToken is required when confirm=true");
21
+ const pendingOp = await session.confirmationStore.consumePending(token);
22
+ if (!pendingOp)
23
+ throw new Error(`Invalid or expired confirmation token: ${token}`);
24
+ const projectRoot = String(args.projectRoot);
25
+ const validator = new SecurityValidator(projectRoot);
26
+ const lockReleases = [];
27
+ try {
28
+ if (pendingOp.pendingWrites && pendingOp.pendingWrites.length > 0) {
29
+ const sortedWrites = [...pendingOp.pendingWrites].sort((a, b) => a.filePath.localeCompare(b.filePath));
30
+ // TOCTOU fix: Lock-Before-Verify — acquire locks first to prevent race conditions
31
+ for (const pw of sortedWrites) {
32
+ const validation = await validator.validateFilePath(pw.filePath);
33
+ if (!validation.valid)
34
+ throw new Error(validation.error);
35
+ if (!await session.lockManager.isLocked(validation.resolvedPath)) {
36
+ lockReleases.push(await session.lockManager.acquireLock(validation.resolvedPath));
37
+ }
38
+ }
39
+ // Now verify hashes with locks held — no race window
40
+ const resolvedWrites = [];
41
+ for (const pw of sortedWrites) {
42
+ const resolvedPath = await verifyFileUnchanged(validator, pw.filePath, pw.originalHash);
43
+ resolvedWrites.push({ resolvedPath, newContent: pw.newContent });
44
+ }
45
+ for (const { resolvedPath, newContent } of resolvedWrites) {
46
+ await BackupManager.createBackup(resolvedPath, projectRoot);
47
+ await writeFile(resolvedPath, newContent);
48
+ }
49
+ }
50
+ else {
51
+ // TOCTOU fix: Lock-Before-Verify for single file path
52
+ const validation = await validator.validateFilePath(pendingOp.filePath);
53
+ if (!validation.valid)
54
+ throw new Error(validation.error);
55
+ if (!await session.lockManager.isLocked(validation.resolvedPath)) {
56
+ lockReleases.push(await session.lockManager.acquireLock(validation.resolvedPath));
57
+ }
58
+ const resolvedPath = await verifyFileUnchanged(validator, pendingOp.filePath, pendingOp.originalHash);
59
+ await BackupManager.createBackup(resolvedPath, projectRoot);
60
+ await writeFile(resolvedPath, pendingOp.newContent);
61
+ }
62
+ }
63
+ finally {
64
+ for (const release of lockReleases) {
65
+ await release();
66
+ }
67
+ }
68
+ const fileCount = pendingOp.pendingWrites?.length || 1;
69
+ return {
70
+ content: [{ type: "text", text: `✅ Success. Changes applied to ${fileCount} file(s).` }],
71
+ };
72
+ }
73
+ // Phase 1: Dry-run
74
+ const result = await executeWrite();
75
+ if (!result.success)
76
+ throw new Error(result.error);
77
+ const hadConflict = session.confirmationStore.hasConflictingPending(String(args.filePath));
78
+ const newToken = session.confirmationStore.storePending({
79
+ filePath: String(args.filePath),
80
+ operation: operationName,
81
+ symbolName: args.symbolName ? String(args.symbolName) : undefined,
82
+ newContent: result.newContent,
83
+ diff: result.diff,
84
+ originalHash: result.originalHash,
85
+ pendingWrites: result.pendingWrites,
86
+ });
87
+ const conflictWarning = hadConflict
88
+ ? `\n⚠️ A previous pending token for this file was invalidated. Only this new token is valid.`
89
+ : "";
90
+ // ERG-01 + NEW-04: decode diff and apply diffFormat
91
+ const rawDiff = decodeURIComponent(result.diff);
92
+ const fmt = args.diffFormat ? String(args.diffFormat) : "unified";
93
+ let displayDiff;
94
+ if (fmt === "none") {
95
+ displayDiff = `(diff omitted — use diffFormat="unified" to see changes)`;
96
+ }
97
+ else if (fmt === "summary") {
98
+ const added = (rawDiff.match(/^\+[^+]/gm) || []).length;
99
+ const removed = (rawDiff.match(/^-[^-]/gm) || []).length;
100
+ displayDiff = `+${added} lines, -${removed} lines`;
101
+ }
102
+ else if (fmt === "compact") {
103
+ displayDiff = rawDiff.split("\n").filter(l => l.startsWith("+") || l.startsWith("-")).join("\n");
104
+ }
105
+ else {
106
+ displayDiff = rawDiff;
107
+ }
108
+ return {
109
+ content: [{
110
+ type: "text",
111
+ text: `DRY RUN SUCCESSFUL.${conflictWarning}\nTo apply these changes, call this tool again with confirm=true and confirmationToken="${newToken}"\n\nDiff:\n${displayDiff}`
112
+ }],
113
+ };
114
+ }
115
+ export async function handleWriteFileSurgical(args) {
116
+ return handleTwoPhaseWrite(args, "write_file_surgical", async () => {
117
+ const ext = path.extname(String(args.filePath));
118
+ const parser = getRegistry().getParser(ext);
119
+ if (!parser)
120
+ throw new Error(`No parser available for ${ext} files`);
121
+ return await replaceSymbol({
122
+ filePath: String(args.filePath),
123
+ projectRoot: String(args.projectRoot),
124
+ symbolName: String(args.symbolName),
125
+ newContent: String(args.newContent),
126
+ className: args.className ? String(args.className) : undefined,
127
+ parser,
128
+ });
129
+ });
130
+ }
131
+ export async function handleInsertSymbol(args) {
132
+ return handleTwoPhaseWrite(args, "insert_symbol", async () => {
133
+ const ext = path.extname(String(args.filePath));
134
+ const parser = getRegistry().getParser(ext);
135
+ if (!parser)
136
+ throw new Error(`No parser available for ${ext} files`);
137
+ return await insertCode({
138
+ filePath: String(args.filePath),
139
+ projectRoot: String(args.projectRoot),
140
+ code: String(args.code),
141
+ anchorSymbol: args.anchorSymbol ? String(args.anchorSymbol) : undefined,
142
+ position: args.position !== undefined ? String(args.position) : undefined,
143
+ className: args.className ? String(args.className) : undefined,
144
+ parser,
145
+ });
146
+ });
147
+ }
148
+ export async function handleRemoveSymbol(args) {
149
+ return handleTwoPhaseWrite(args, "remove_symbol", async () => {
150
+ const ext = path.extname(String(args.filePath));
151
+ const parser = getRegistry().getParser(ext);
152
+ if (!parser)
153
+ throw new Error(`No parser available for ${ext} files`);
154
+ return await removeSymbol({
155
+ filePath: String(args.filePath),
156
+ projectRoot: String(args.projectRoot),
157
+ symbolName: String(args.symbolName),
158
+ className: args.className ? String(args.className) : undefined,
159
+ parser,
160
+ });
161
+ });
162
+ }
163
+ export async function handleRenameSymbol(args) {
164
+ return handleTwoPhaseWrite(args, "rename_symbol", async () => {
165
+ const ext = path.extname(String(args.filePath));
166
+ const parser = getRegistry().getParser(ext);
167
+ if (!parser)
168
+ throw new Error(`No parser available for ${ext} files`);
169
+ return await renameSymbol({
170
+ filePath: String(args.filePath),
171
+ projectRoot: String(args.projectRoot),
172
+ oldName: String(args.oldName),
173
+ newName: String(args.newName),
174
+ rootDir: args.rootDir ? String(args.rootDir) : String(args.projectRoot),
175
+ parser,
176
+ });
177
+ });
178
+ }
179
+ export async function handleAstTransform(args) {
180
+ return handleTwoPhaseWrite(args, "ast_transform", async () => {
181
+ const ext = path.extname(String(args.filePath));
182
+ const parser = getRegistry().getParser(ext);
183
+ if (!parser)
184
+ throw new Error(`No parser available for ${ext} files`);
185
+ const transform = args.transform;
186
+ if (!transform || !transform.kind) {
187
+ throw new Error('"transform" object with "kind" is required');
188
+ }
189
+ return await astTransform({
190
+ filePath: String(args.filePath),
191
+ projectRoot: String(args.projectRoot),
192
+ symbolName: String(args.symbolName),
193
+ className: args.className ? String(args.className) : undefined,
194
+ transform,
195
+ parser,
196
+ });
197
+ });
198
+ }
199
+ //# sourceMappingURL=writeHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeHandlers.js","sourceRoot":"","sources":["../../../src/tools/writeHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * App Directory - v3.7.0
3
+ * Centralizes ~/.mcp-code-context/ path resolution across all OS.
4
+ * Fallback to os.tmpdir() in environments without HOME (CI, Docker).
5
+ */
6
+ /**
7
+ * Returns an absolute path under ~/.mcp-code-context/{subdir}
8
+ * and ensures the directory exists.
9
+ *
10
+ * @example
11
+ * getAppDir("cache/abc123") // ~/.mcp-code-context/cache/abc123/
12
+ * getAppDir("backups/abc123") // ~/.mcp-code-context/backups/abc123/
13
+ * getAppDir("index/abc123") // ~/.mcp-code-context/index/abc123/
14
+ */
15
+ export declare function getAppDir(subdir: string): string;
16
+ /**
17
+ * Returns the base ~/.mcp-code-context/ directory (no subdir).
18
+ */
19
+ export declare function getBaseAppDir(): string;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * App Directory - v3.7.0
3
+ * Centralizes ~/.mcp-code-context/ path resolution across all OS.
4
+ * Fallback to os.tmpdir() in environments without HOME (CI, Docker).
5
+ */
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ import { mkdirSync, existsSync } from "node:fs";
9
+ const APP_DIR_NAME = ".mcp-code-context";
10
+ /**
11
+ * Resolves the base ~/.mcp-code-context/ directory.
12
+ * Windows : %USERPROFILE%\.mcp-code-context\
13
+ * Mac/Linux: ~/.mcp-code-context/
14
+ * Fallback : os.tmpdir()/.mcp-code-context/ (CI/Docker without HOME)
15
+ */
16
+ function resolveBaseDir() {
17
+ const home = os.homedir();
18
+ if (home && home !== os.tmpdir()) {
19
+ return path.join(home, APP_DIR_NAME);
20
+ }
21
+ // Fallback for environments without a real home directory
22
+ return path.join(os.tmpdir(), APP_DIR_NAME);
23
+ }
24
+ const BASE_DIR = resolveBaseDir();
25
+ /**
26
+ * Returns an absolute path under ~/.mcp-code-context/{subdir}
27
+ * and ensures the directory exists.
28
+ *
29
+ * @example
30
+ * getAppDir("cache/abc123") // ~/.mcp-code-context/cache/abc123/
31
+ * getAppDir("backups/abc123") // ~/.mcp-code-context/backups/abc123/
32
+ * getAppDir("index/abc123") // ~/.mcp-code-context/index/abc123/
33
+ */
34
+ export function getAppDir(subdir) {
35
+ const fullPath = path.join(BASE_DIR, subdir);
36
+ if (!existsSync(fullPath)) {
37
+ mkdirSync(fullPath, { recursive: true });
38
+ }
39
+ return fullPath;
40
+ }
41
+ /**
42
+ * Returns the base ~/.mcp-code-context/ directory (no subdir).
43
+ */
44
+ export function getBaseAppDir() {
45
+ if (!existsSync(BASE_DIR)) {
46
+ mkdirSync(BASE_DIR, { recursive: true });
47
+ }
48
+ return BASE_DIR;
49
+ }
50
+ //# sourceMappingURL=appDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appDir.js","sourceRoot":"","sources":["../../../src/utils/appDir.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC;;;;;GAKG;AACH,SAAS,cAAc;IACrB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1B,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC;IACD,0DAA0D;IAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAElC;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Audit log file I/O helpers
3
+ */
4
+ export declare function initLogDir(logDir: string): Promise<void>;
5
+ export declare function ensureLogFile(logDir: string, currentLogFile: string | null): Promise<{
6
+ file: string;
7
+ }>;
8
+ export declare function rotateLog(logDir: string, maxFiles: number): Promise<void>;
9
+ export declare function getLogFiles(logDir: string): Promise<string[]>;