@crownpeak/dqm-react-component-dev-mcp 1.2.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 (444) hide show
  1. package/README.md +138 -0
  2. package/data/.env.example +22 -0
  3. package/data/.gitattributes +47 -0
  4. package/data/.glfrc.json +7 -0
  5. package/data/.husky/pre-commit +5 -0
  6. package/data/.nvmrc +1 -0
  7. package/data/CHANGELOG.md +75 -0
  8. package/data/CODE_OF_CONDUCT.md +129 -0
  9. package/data/CONTRIBUTING.md +203 -0
  10. package/data/DOCS-STRUCTURE.md +307 -0
  11. package/data/I18N.md +292 -0
  12. package/data/LICENSE +22 -0
  13. package/data/README.md +315 -0
  14. package/data/SECURITY.md +125 -0
  15. package/data/WIKI-DEPLOYMENT.md +348 -0
  16. package/data/docs/AI-FEATURES.md +610 -0
  17. package/data/docs/API-REFERENCE.md +1022 -0
  18. package/data/docs/AUTHENTICATION.md +301 -0
  19. package/data/docs/BACKEND-API.md +468 -0
  20. package/data/docs/DEVELOPMENT.md +375 -0
  21. package/data/docs/EXAMPLES.md +622 -0
  22. package/data/docs/MCP-SERVER.md +307 -0
  23. package/data/docs/MIGRATION-GUIDE.md +367 -0
  24. package/data/docs/NPM-PUBLISH.md +193 -0
  25. package/data/docs/QUICKSTART.md +206 -0
  26. package/data/docs/REDIS-SETUP.md +162 -0
  27. package/data/docs/SERVER.md +228 -0
  28. package/data/docs/TROUBLESHOOTING.md +657 -0
  29. package/data/docs/WIDGET-GUIDE.md +638 -0
  30. package/data/docs/WIKI-HOME.md +58 -0
  31. package/data/docs/WIKI-SIDEBAR.md +39 -0
  32. package/data/package.json +171 -0
  33. package/data/playwright.config.ts +64 -0
  34. package/data/probe/.cargo/config.toml +10 -0
  35. package/data/probe/.claude/commands/performance-review.md +15 -0
  36. package/data/probe/.clinerules +288 -0
  37. package/data/probe/.dockerignore +57 -0
  38. package/data/probe/.githooks/post-commit +11 -0
  39. package/data/probe/.githooks/pre-commit +99 -0
  40. package/data/probe/.githooks/pre-commit-vow +9 -0
  41. package/data/probe/.prompts/engineer.md +41 -0
  42. package/data/probe/.roomodes +28 -0
  43. package/data/probe/.windsurfrules +0 -0
  44. package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
  45. package/data/probe/BENCHMARKING.md +256 -0
  46. package/data/probe/CLAUDE.md +226 -0
  47. package/data/probe/CODE_OF_CONDUCT.md +128 -0
  48. package/data/probe/CONTRIBUTING.md +193 -0
  49. package/data/probe/Cargo.toml +120 -0
  50. package/data/probe/Cross.toml +10 -0
  51. package/data/probe/DOCKER-README.md +224 -0
  52. package/data/probe/Dockerfile +32 -0
  53. package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
  54. package/data/probe/LICENSE +201 -0
  55. package/data/probe/Makefile +210 -0
  56. package/data/probe/README.md +824 -0
  57. package/data/probe/SECURITY.md +67 -0
  58. package/data/probe/WINDOWS-GUIDE.md +294 -0
  59. package/data/probe/benches/parsing_benchmarks.rs +370 -0
  60. package/data/probe/benches/search_benchmarks.rs +599 -0
  61. package/data/probe/benches/simd_benchmarks.rs +372 -0
  62. package/data/probe/benches/timing_benchmarks.rs +287 -0
  63. package/data/probe/build-windows.bat +229 -0
  64. package/data/probe/codex-config/config.toml +6 -0
  65. package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
  66. package/data/probe/examples/cache_demo.rs +46 -0
  67. package/data/probe/examples/chat/.dockerignore +37 -0
  68. package/data/probe/examples/chat/ChatSessionManager.js +295 -0
  69. package/data/probe/examples/chat/Dockerfile +98 -0
  70. package/data/probe/examples/chat/LICENSE +201 -0
  71. package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
  72. package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
  73. package/data/probe/examples/chat/README.md +338 -0
  74. package/data/probe/examples/chat/TRACING.md +226 -0
  75. package/data/probe/examples/chat/appTracer.js +968 -0
  76. package/data/probe/examples/chat/auth.js +76 -0
  77. package/data/probe/examples/chat/bin/probe-chat.js +13 -0
  78. package/data/probe/examples/chat/build.js +104 -0
  79. package/data/probe/examples/chat/cancelRequest.js +84 -0
  80. package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
  81. package/data/probe/examples/chat/demo-local-images.js +128 -0
  82. package/data/probe/examples/chat/fileSpanExporter.js +181 -0
  83. package/data/probe/examples/chat/implement/README.md +228 -0
  84. package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
  85. package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
  86. package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
  87. package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
  88. package/data/probe/examples/chat/implement/backends/registry.js +85 -0
  89. package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
  90. package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
  91. package/data/probe/examples/chat/implement/core/config.js +428 -0
  92. package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
  93. package/data/probe/examples/chat/implement/core/utils.js +496 -0
  94. package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
  95. package/data/probe/examples/chat/index.js +669 -0
  96. package/data/probe/examples/chat/mcpServer.js +341 -0
  97. package/data/probe/examples/chat/npm/LICENSE +15 -0
  98. package/data/probe/examples/chat/npm/README.md +168 -0
  99. package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
  100. package/data/probe/examples/chat/npm/index.js +259 -0
  101. package/data/probe/examples/chat/npm/package.json +54 -0
  102. package/data/probe/examples/chat/package.json +102 -0
  103. package/data/probe/examples/chat/probeChat.js +456 -0
  104. package/data/probe/examples/chat/probeTool.js +491 -0
  105. package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
  106. package/data/probe/examples/chat/telemetry.js +281 -0
  107. package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
  108. package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
  109. package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
  110. package/data/probe/examples/chat/test/test-backends.js +90 -0
  111. package/data/probe/examples/chat/test/testUtils.js +530 -0
  112. package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
  113. package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
  114. package/data/probe/examples/chat/test/verify-tests.js +118 -0
  115. package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
  116. package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
  117. package/data/probe/examples/chat/test-chat-tracing.js +38 -0
  118. package/data/probe/examples/chat/test-direct-function.js +49 -0
  119. package/data/probe/examples/chat/test-file-size-validation.js +103 -0
  120. package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
  121. package/data/probe/examples/chat/test-github-context.txt +12 -0
  122. package/data/probe/examples/chat/test-hierarchy.js +203 -0
  123. package/data/probe/examples/chat/test-image-spans.js +37 -0
  124. package/data/probe/examples/chat/test-local-image-reading.js +176 -0
  125. package/data/probe/examples/chat/test-mcp-integration.js +136 -0
  126. package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
  127. package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
  128. package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
  129. package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
  130. package/data/probe/examples/chat/test-security-validation.js +145 -0
  131. package/data/probe/examples/chat/test-simple-tracing.js +32 -0
  132. package/data/probe/examples/chat/test-trace-verification.js +235 -0
  133. package/data/probe/examples/chat/test-tracing.js +114 -0
  134. package/data/probe/examples/chat/tokenCounter.js +419 -0
  135. package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
  136. package/data/probe/examples/chat/webServer.js +1103 -0
  137. package/data/probe/examples/reranker/Cargo.toml +33 -0
  138. package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
  139. package/data/probe/examples/reranker/MODELS.md +66 -0
  140. package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
  141. package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
  142. package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
  143. package/data/probe/examples/reranker/README.md +347 -0
  144. package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
  145. package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
  146. package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
  147. package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
  148. package/data/probe/examples/reranker/debug_scoring.py +189 -0
  149. package/data/probe/examples/reranker/debug_tokenization.py +154 -0
  150. package/data/probe/examples/reranker/download_models.sh +73 -0
  151. package/data/probe/examples/reranker/requirements.txt +13 -0
  152. package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
  153. package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
  154. package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
  155. package/data/probe/examples/reranker/simple_test.py +50 -0
  156. package/data/probe/examples/reranker/test_all_models.sh +63 -0
  157. package/data/probe/examples/reranker/test_bert_results.sh +44 -0
  158. package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
  159. package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
  160. package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
  161. package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
  162. package/data/probe/examples/reranker/test_scores.py +132 -0
  163. package/data/probe/install.ps1 +508 -0
  164. package/data/probe/install.sh +460 -0
  165. package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
  166. package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
  167. package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
  168. package/data/probe/npm/MAID_INTEGRATION.md +313 -0
  169. package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
  170. package/data/probe/npm/README.md +824 -0
  171. package/data/probe/npm/bin/.gitignore +7 -0
  172. package/data/probe/npm/bin/.gitkeep +0 -0
  173. package/data/probe/npm/bin/README.md +12 -0
  174. package/data/probe/npm/bin/probe +167 -0
  175. package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
  176. package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
  177. package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
  178. package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
  179. package/data/probe/npm/example-usage.js +335 -0
  180. package/data/probe/npm/examples/multi-engine-demo.js +117 -0
  181. package/data/probe/npm/examples/probe-agent-cli.js +113 -0
  182. package/data/probe/npm/examples/test-agent-edit.js +114 -0
  183. package/data/probe/npm/examples/test-edit-create.js +120 -0
  184. package/data/probe/npm/examples/test-edit-direct.js +114 -0
  185. package/data/probe/npm/index.d.ts +744 -0
  186. package/data/probe/npm/jest.config.js +52 -0
  187. package/data/probe/npm/package.json +117 -0
  188. package/data/probe/npm/scripts/build-agent.cjs +75 -0
  189. package/data/probe/npm/scripts/build-cjs.js +124 -0
  190. package/data/probe/npm/scripts/build-mcp.cjs +36 -0
  191. package/data/probe/npm/scripts/postinstall.js +216 -0
  192. package/data/probe/npm/test-codex-e2e.js +78 -0
  193. package/data/probe/npm/test-download-lock.js +109 -0
  194. package/data/probe/npm/test-grep-security.js +94 -0
  195. package/data/probe/npm/test-grep-simplified.js +63 -0
  196. package/data/probe/npm/test-grep.js +51 -0
  197. package/data/probe/npm/tests/README.md +96 -0
  198. package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
  199. package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
  200. package/data/probe/npm/tests/contextCompactor.test.js +498 -0
  201. package/data/probe/npm/tests/delegate-config.test.js +353 -0
  202. package/data/probe/npm/tests/delegate-integration.test.js +348 -0
  203. package/data/probe/npm/tests/extractor-integration.test.js +162 -0
  204. package/data/probe/npm/tests/extractor.test.js +317 -0
  205. package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
  206. package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
  207. package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
  208. package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
  209. package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
  210. package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
  211. package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
  212. package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
  213. package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
  214. package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
  215. package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
  216. package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
  217. package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
  218. package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
  219. package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
  220. package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
  221. package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
  222. package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
  223. package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
  224. package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
  225. package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
  226. package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
  227. package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
  228. package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
  229. package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
  230. package/data/probe/npm/tests/setup.js +46 -0
  231. package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
  232. package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
  233. package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
  234. package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
  235. package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
  236. package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
  237. package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
  238. package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
  239. package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
  240. package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
  241. package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
  242. package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
  243. package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
  244. package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
  245. package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
  246. package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
  247. package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
  248. package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
  249. package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
  250. package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
  251. package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
  252. package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
  253. package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
  254. package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
  255. package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
  256. package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
  257. package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
  258. package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
  259. package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
  260. package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
  261. package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
  262. package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
  263. package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
  264. package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
  265. package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
  266. package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
  267. package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
  268. package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
  269. package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
  270. package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
  271. package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
  272. package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
  273. package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
  274. package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
  275. package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
  276. package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
  277. package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
  278. package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
  279. package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
  280. package/data/probe/npm/tsconfig.json +21 -0
  281. package/data/probe/result1.txt +19 -0
  282. package/data/probe/result2.txt +26 -0
  283. package/data/probe/scripts/benchmark.sh +270 -0
  284. package/data/probe/scripts/cache_memory_analysis.rs +844 -0
  285. package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
  286. package/data/probe/site/.env.example +10 -0
  287. package/data/probe/site/DEPLOYMENT.md +86 -0
  288. package/data/probe/site/README.md +183 -0
  289. package/data/probe/site/adding-languages.md +135 -0
  290. package/data/probe/site/ai-chat.md +427 -0
  291. package/data/probe/site/ai-integration.md +1488 -0
  292. package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
  293. package/data/probe/site/blog/index.md +118 -0
  294. package/data/probe/site/blog/v0.6.0-release.md +426 -0
  295. package/data/probe/site/blog.md +8 -0
  296. package/data/probe/site/changelog.md +200 -0
  297. package/data/probe/site/cli-mode.md +437 -0
  298. package/data/probe/site/code-extraction.md +436 -0
  299. package/data/probe/site/contributing/README.md +9 -0
  300. package/data/probe/site/contributing/documentation-cross-references.md +215 -0
  301. package/data/probe/site/contributing/documentation-maintenance.md +275 -0
  302. package/data/probe/site/contributing/documentation-structure.md +75 -0
  303. package/data/probe/site/documentation-cross-references.md +215 -0
  304. package/data/probe/site/documentation-guide.md +132 -0
  305. package/data/probe/site/documentation-maintenance.md +275 -0
  306. package/data/probe/site/features.md +147 -0
  307. package/data/probe/site/how-it-works.md +118 -0
  308. package/data/probe/site/index.md +175 -0
  309. package/data/probe/site/index.md.bak +133 -0
  310. package/data/probe/site/installation.md +235 -0
  311. package/data/probe/site/integrations/docker.md +248 -0
  312. package/data/probe/site/integrations/github-actions.md +413 -0
  313. package/data/probe/site/language-support-overview.md +168 -0
  314. package/data/probe/site/mcp-integration.md +587 -0
  315. package/data/probe/site/mcp-server.md +304 -0
  316. package/data/probe/site/navigation-structure.md +76 -0
  317. package/data/probe/site/nodejs-sdk.md +798 -0
  318. package/data/probe/site/output-formats.md +625 -0
  319. package/data/probe/site/package.json +21 -0
  320. package/data/probe/site/public/_headers +28 -0
  321. package/data/probe/site/public/_redirects +11 -0
  322. package/data/probe/site/quick-start.md +289 -0
  323. package/data/probe/site/search-functionality.md +291 -0
  324. package/data/probe/site/search-reference.md +291 -0
  325. package/data/probe/site/supported-languages.md +215 -0
  326. package/data/probe/site/use-cases/README.md +8 -0
  327. package/data/probe/site/use-cases/advanced-cli.md +253 -0
  328. package/data/probe/site/use-cases/ai-code-editors.md +239 -0
  329. package/data/probe/site/use-cases/building-ai-tools.md +529 -0
  330. package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
  331. package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
  332. package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
  333. package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
  334. package/data/probe/site/use-cases/team-chat.md +350 -0
  335. package/data/probe/site/web-interface.md +434 -0
  336. package/data/probe/site/wrangler.toml +9 -0
  337. package/data/probe/test-api-key.sh +1 -0
  338. package/data/probe/test-probe-implementation/hello.js +7 -0
  339. package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
  340. package/data/probe/test_cases/early_termination_issues.rs +533 -0
  341. package/data/probe/test_data/test_nested_struct.go +26 -0
  342. package/data/probe/tests/README.md +286 -0
  343. package/data/probe/tests/README_search_determinism_tests.md +116 -0
  344. package/data/probe/tests/adjacent_comment_test.rs +152 -0
  345. package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
  346. package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
  347. package/data/probe/tests/block_merging_tests.rs +396 -0
  348. package/data/probe/tests/c_outline_format_tests.rs +2179 -0
  349. package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
  350. package/data/probe/tests/cache_order_tests.rs +147 -0
  351. package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
  352. package/data/probe/tests/cli_tests.rs +680 -0
  353. package/data/probe/tests/comment_context_integration_test.rs +240 -0
  354. package/data/probe/tests/common.rs +33 -0
  355. package/data/probe/tests/complex_block_merging_tests.rs +599 -0
  356. package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
  357. package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
  358. package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
  359. package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
  360. package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
  361. package/data/probe/tests/extract_command_tests.rs +1848 -0
  362. package/data/probe/tests/extract_deduplication_tests.rs +146 -0
  363. package/data/probe/tests/extract_input_file_tests.rs +84 -0
  364. package/data/probe/tests/extract_prompt_tests.rs +102 -0
  365. package/data/probe/tests/filename_search_tests.rs +96 -0
  366. package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
  367. package/data/probe/tests/github_extract_tests.rs +234 -0
  368. package/data/probe/tests/go_comment_test.rs +253 -0
  369. package/data/probe/tests/go_outline_format_tests.rs +2587 -0
  370. package/data/probe/tests/go_path_resolver_tests.rs +96 -0
  371. package/data/probe/tests/html_outline_format_tests.rs +637 -0
  372. package/data/probe/tests/integration_tests.rs +837 -0
  373. package/data/probe/tests/ip_whitelist_test.rs +148 -0
  374. package/data/probe/tests/java_outline_format_tests.rs +1611 -0
  375. package/data/probe/tests/javascript_extract_tests.rs +315 -0
  376. package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
  377. package/data/probe/tests/json_format_tests.rs +436 -0
  378. package/data/probe/tests/json_schema_validation_tests.rs +450 -0
  379. package/data/probe/tests/lib_usage.rs +60 -0
  380. package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
  381. package/data/probe/tests/line_map_cache_tests.rs +114 -0
  382. package/data/probe/tests/markdown_integration_tests.rs +190 -0
  383. package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
  384. package/data/probe/tests/mocks/test_object.js +27 -0
  385. package/data/probe/tests/mocks/test_struct.go +50 -0
  386. package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
  387. package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
  388. package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
  389. package/data/probe/tests/negative_compound_word_tests.rs +246 -0
  390. package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
  391. package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
  392. package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
  393. package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
  394. package/data/probe/tests/parallel_extraction_tests.rs +178 -0
  395. package/data/probe/tests/parallel_search_tests.rs +355 -0
  396. package/data/probe/tests/path_resolver_tests.rs +698 -0
  397. package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
  398. package/data/probe/tests/php_outline_format_tests.rs +768 -0
  399. package/data/probe/tests/property_tests.proptest-regressions +9 -0
  400. package/data/probe/tests/property_tests.rs +118 -0
  401. package/data/probe/tests/python_outline_format_tests.rs +1538 -0
  402. package/data/probe/tests/query_command_json_tests.rs +438 -0
  403. package/data/probe/tests/query_command_tests.rs +232 -0
  404. package/data/probe/tests/query_command_xml_tests.rs +569 -0
  405. package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
  406. package/data/probe/tests/required_terms_filename_tests.rs +116 -0
  407. package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
  408. package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
  409. package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
  410. package/data/probe/tests/rust_outline_format_tests.rs +843 -0
  411. package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
  412. package/data/probe/tests/search_determinism_tests.rs +451 -0
  413. package/data/probe/tests/search_hints_tests.rs +253 -0
  414. package/data/probe/tests/special_character_escaping_tests.rs +417 -0
  415. package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
  416. package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
  417. package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
  418. package/data/probe/tests/symbols_tests.rs +166 -0
  419. package/data/probe/tests/test_file.rs +45 -0
  420. package/data/probe/tests/test_tokenize.rs +28 -0
  421. package/data/probe/tests/timeout_tests.rs +82 -0
  422. package/data/probe/tests/tokenization_tests.rs +195 -0
  423. package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
  424. package/data/probe/tests/typescript_extract_tests.rs +214 -0
  425. package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
  426. package/data/probe/tests/xml_format_tests.rs +568 -0
  427. package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
  428. package/data/scripts/postinstall.mjs +9 -0
  429. package/data/scripts/set-version.js +0 -0
  430. package/data/scripts/wiki-build.sh +111 -0
  431. package/data/scripts/wiki-deploy.sh +73 -0
  432. package/data/serve.json +12 -0
  433. package/data/test/demo-dynamic.html +134 -0
  434. package/data/test/demo-esm.html +105 -0
  435. package/data/test/demo-iife.html +78 -0
  436. package/data/tsconfig.json +7 -0
  437. package/data/vite.server.ts +483 -0
  438. package/data/vitest.config.ts +40 -0
  439. package/data/wiki/Home.md +58 -0
  440. package/data/wiki/_Sidebar.md +39 -0
  441. package/docs-mcp.config.json +20 -0
  442. package/package.json +56 -0
  443. package/src/config.js +111 -0
  444. package/src/index.js +395 -0
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Tests for Edit and Create tools
3
+ */
4
+
5
+ import { describe, test, expect, beforeEach, afterEach } from '@jest/globals';
6
+ import { editTool, createTool } from '../../src/tools/edit.js';
7
+ import { promises as fs } from 'fs';
8
+ import { resolve, join } from 'path';
9
+ import { existsSync } from 'fs';
10
+ import { tmpdir } from 'os';
11
+ import { randomUUID } from 'crypto';
12
+
13
+ describe('Edit and Create Tools', () => {
14
+ let testDir;
15
+ let testFile;
16
+
17
+ beforeEach(async () => {
18
+ // Create a temporary directory for testing
19
+ testDir = join(tmpdir(), `probe-test-${randomUUID()}`);
20
+ await fs.mkdir(testDir, { recursive: true });
21
+ testFile = join(testDir, 'test.txt');
22
+ });
23
+
24
+ afterEach(async () => {
25
+ // Clean up test directory
26
+ if (existsSync(testDir)) {
27
+ await fs.rm(testDir, { recursive: true, force: true });
28
+ }
29
+ });
30
+
31
+ describe('editTool', () => {
32
+ test('should edit a file with exact string replacement', async () => {
33
+ // Create a test file
34
+ const originalContent = 'Hello, world!\nThis is a test file.\nGoodbye!';
35
+ await fs.writeFile(testFile, originalContent);
36
+
37
+ // Create the edit tool
38
+ const edit = editTool({
39
+ debug: false,
40
+ allowedFolders: [testDir]
41
+ });
42
+
43
+ // Edit the file
44
+ const result = await edit.execute({
45
+ file_path: testFile,
46
+ old_string: 'This is a test file.',
47
+ new_string: 'This is an edited file.'
48
+ });
49
+
50
+ expect(result).toBe('Successfully edited ' + testFile + ' (1 replacement)');
51
+
52
+ // Verify the file was edited
53
+ const newContent = await fs.readFile(testFile, 'utf-8');
54
+ expect(newContent).toBe('Hello, world!\nThis is an edited file.\nGoodbye!');
55
+ });
56
+
57
+ test('should handle replace_all option', async () => {
58
+ // Create a test file with repeated content
59
+ const originalContent = 'foo bar foo baz foo';
60
+ await fs.writeFile(testFile, originalContent);
61
+
62
+ // Create the edit tool
63
+ const edit = editTool({
64
+ allowedFolders: [testDir]
65
+ });
66
+
67
+ // Edit with replace_all
68
+ const result = await edit.execute({
69
+ file_path: testFile,
70
+ old_string: 'foo',
71
+ new_string: 'FOO',
72
+ replace_all: true
73
+ });
74
+
75
+ expect(result).toBe('Successfully edited ' + testFile + ' (3 replacements)');
76
+
77
+ // Verify all occurrences were replaced
78
+ const newContent = await fs.readFile(testFile, 'utf-8');
79
+ expect(newContent).toBe('FOO bar FOO baz FOO');
80
+ });
81
+
82
+ test('should fail when old_string is not unique without replace_all', async () => {
83
+ // Create a test file with repeated content
84
+ const originalContent = 'foo bar foo baz';
85
+ await fs.writeFile(testFile, originalContent);
86
+
87
+ // Create the edit tool
88
+ const edit = editTool({
89
+ allowedFolders: [testDir]
90
+ });
91
+
92
+ // Try to edit without replace_all
93
+ const result = await edit.execute({
94
+ file_path: testFile,
95
+ old_string: 'foo',
96
+ new_string: 'FOO',
97
+ replace_all: false
98
+ });
99
+
100
+ expect(result).toContain('Error editing file: Multiple occurrences found');
101
+ expect(result).toContain('2 times');
102
+ });
103
+
104
+ test('should fail when old_string is not found', async () => {
105
+ // Create a test file
106
+ const originalContent = 'Hello, world!';
107
+ await fs.writeFile(testFile, originalContent);
108
+
109
+ // Create the edit tool
110
+ const edit = editTool({
111
+ allowedFolders: [testDir]
112
+ });
113
+
114
+ // Try to edit with non-existent string
115
+ const result = await edit.execute({
116
+ file_path: testFile,
117
+ old_string: 'does not exist',
118
+ new_string: 'replacement'
119
+ });
120
+
121
+ expect(result).toContain('Error editing file: String not found');
122
+ });
123
+
124
+ test('should fail when file does not exist', async () => {
125
+ // Create the edit tool
126
+ const edit = editTool({
127
+ allowedFolders: [testDir]
128
+ });
129
+
130
+ // Try to edit non-existent file
131
+ const result = await edit.execute({
132
+ file_path: join(testDir, 'nonexistent.txt'),
133
+ old_string: 'foo',
134
+ new_string: 'bar'
135
+ });
136
+
137
+ expect(result).toContain('Error editing file: File not found');
138
+ });
139
+
140
+ test('should respect allowed folders restriction', async () => {
141
+ // Create a test file
142
+ await fs.writeFile(testFile, 'content');
143
+
144
+ // Create the edit tool with different allowed folder
145
+ const edit = editTool({
146
+ allowedFolders: ['/some/other/path']
147
+ });
148
+
149
+ // Try to edit file outside allowed folders
150
+ const result = await edit.execute({
151
+ file_path: testFile,
152
+ old_string: 'content',
153
+ new_string: 'new content'
154
+ });
155
+
156
+ expect(result).toContain('Error editing file: Permission denied');
157
+ });
158
+
159
+ test('should handle whitespace in strings correctly', async () => {
160
+ // Create a test file with indented code
161
+ const originalContent = `function test() {
162
+ const message = "Hello";
163
+ console.log(message);
164
+ }`;
165
+ await fs.writeFile(testFile, originalContent);
166
+
167
+ // Create the edit tool
168
+ const edit = editTool({
169
+ allowedFolders: [testDir]
170
+ });
171
+
172
+ // Edit with exact whitespace matching
173
+ const result = await edit.execute({
174
+ file_path: testFile,
175
+ old_string: ' const message = "Hello";',
176
+ new_string: ' const message = "Goodbye";'
177
+ });
178
+
179
+ expect(result).toBe('Successfully edited ' + testFile + ' (1 replacement)');
180
+
181
+ // Verify the edit
182
+ const newContent = await fs.readFile(testFile, 'utf-8');
183
+ expect(newContent).toContain('const message = "Goodbye"');
184
+ expect(newContent).not.toContain('const message = "Hello"');
185
+ });
186
+ });
187
+
188
+ describe('createTool', () => {
189
+ test('should create a new file', async () => {
190
+ const newFile = join(testDir, 'new.txt');
191
+ const content = 'This is new file content';
192
+
193
+ // Create the create tool
194
+ const create = createTool({
195
+ allowedFolders: [testDir]
196
+ });
197
+
198
+ // Create the file
199
+ const result = await create.execute({
200
+ file_path: newFile,
201
+ content: content
202
+ });
203
+
204
+ expect(result).toContain('Successfully created');
205
+ expect(result).toContain(`(${Buffer.byteLength(content)} bytes)`);
206
+
207
+ // Verify the file was created
208
+ expect(existsSync(newFile)).toBe(true);
209
+ const fileContent = await fs.readFile(newFile, 'utf-8');
210
+ expect(fileContent).toBe(content);
211
+ });
212
+
213
+ test('should create parent directories if they do not exist', async () => {
214
+ const newFile = join(testDir, 'nested', 'deep', 'file.txt');
215
+ const content = 'Nested file content';
216
+
217
+ // Create the create tool
218
+ const create = createTool({
219
+ allowedFolders: [testDir]
220
+ });
221
+
222
+ // Create the file
223
+ const result = await create.execute({
224
+ file_path: newFile,
225
+ content: content
226
+ });
227
+
228
+ expect(result).toContain('Successfully created');
229
+
230
+ // Verify the file and directories were created
231
+ expect(existsSync(newFile)).toBe(true);
232
+ const fileContent = await fs.readFile(newFile, 'utf-8');
233
+ expect(fileContent).toBe(content);
234
+ });
235
+
236
+ test('should fail when file exists without overwrite', async () => {
237
+ // Create an existing file
238
+ await fs.writeFile(testFile, 'existing content');
239
+
240
+ // Create the create tool
241
+ const create = createTool({
242
+ allowedFolders: [testDir]
243
+ });
244
+
245
+ // Try to create over existing file
246
+ const result = await create.execute({
247
+ file_path: testFile,
248
+ content: 'new content',
249
+ overwrite: false
250
+ });
251
+
252
+ expect(result).toContain('Error creating file: File already exists');
253
+
254
+ // Verify original content is preserved
255
+ const content = await fs.readFile(testFile, 'utf-8');
256
+ expect(content).toBe('existing content');
257
+ });
258
+
259
+ test('should overwrite existing file when overwrite is true', async () => {
260
+ // Create an existing file
261
+ await fs.writeFile(testFile, 'existing content');
262
+
263
+ // Create the create tool
264
+ const create = createTool({
265
+ allowedFolders: [testDir]
266
+ });
267
+
268
+ // Create with overwrite
269
+ const result = await create.execute({
270
+ file_path: testFile,
271
+ content: 'overwritten content',
272
+ overwrite: true
273
+ });
274
+
275
+ expect(result).toContain('Successfully overwrote');
276
+
277
+ // Verify file was overwritten
278
+ const content = await fs.readFile(testFile, 'utf-8');
279
+ expect(content).toBe('overwritten content');
280
+ });
281
+
282
+ test('should respect allowed folders restriction', async () => {
283
+ // Create the create tool with different allowed folder
284
+ const create = createTool({
285
+ allowedFolders: ['/some/other/path']
286
+ });
287
+
288
+ // Try to create file outside allowed folders
289
+ const result = await create.execute({
290
+ file_path: join(testDir, 'restricted.txt'),
291
+ content: 'content'
292
+ });
293
+
294
+ expect(result).toContain('Error creating file: Permission denied');
295
+ });
296
+
297
+ test('should handle multi-line content correctly', async () => {
298
+ const newFile = join(testDir, 'multiline.js');
299
+ const content = `// JavaScript file
300
+ export function hello(name) {
301
+ console.log(\`Hello, \${name}!\`);
302
+ return name;
303
+ }
304
+
305
+ export default hello;`;
306
+
307
+ // Create the create tool
308
+ const create = createTool({
309
+ allowedFolders: [testDir]
310
+ });
311
+
312
+ // Create the file
313
+ const result = await create.execute({
314
+ file_path: newFile,
315
+ content: content
316
+ });
317
+
318
+ expect(result).toContain('Successfully created');
319
+
320
+ // Verify the content
321
+ const fileContent = await fs.readFile(newFile, 'utf-8');
322
+ expect(fileContent).toBe(content);
323
+ expect(fileContent.split('\n').length).toBe(7); // 7 lines
324
+ });
325
+ });
326
+
327
+ describe('Integration with relative paths', () => {
328
+ test('should handle relative paths with cwd', async () => {
329
+ // Create the edit tool with a working directory
330
+ const edit = editTool({
331
+ cwd: testDir,
332
+ allowedFolders: [testDir]
333
+ });
334
+
335
+ // Create a file
336
+ await fs.writeFile(testFile, 'original');
337
+
338
+ // Edit using relative path
339
+ const result = await edit.execute({
340
+ file_path: 'test.txt', // relative path
341
+ old_string: 'original',
342
+ new_string: 'modified'
343
+ });
344
+
345
+ expect(result).toBe('Successfully edited test.txt (1 replacement)');
346
+
347
+ // Verify the edit
348
+ const content = await fs.readFile(testFile, 'utf-8');
349
+ expect(content).toBe('modified');
350
+ });
351
+
352
+ test('should handle absolute paths regardless of cwd', async () => {
353
+ // Create the create tool with a working directory
354
+ const create = createTool({
355
+ cwd: '/some/other/path',
356
+ allowedFolders: [testDir]
357
+ });
358
+
359
+ const absolutePath = join(testDir, 'absolute.txt');
360
+
361
+ // Create using absolute path
362
+ const result = await create.execute({
363
+ file_path: absolutePath,
364
+ content: 'absolute path content'
365
+ });
366
+
367
+ expect(result).toContain('Successfully created');
368
+ expect(result).toContain('bytes)');
369
+ expect(existsSync(absolutePath)).toBe(true);
370
+ });
371
+ });
372
+
373
+ describe('Input Validation', () => {
374
+ describe('editTool validation', () => {
375
+ test('should handle invalid file_path', async () => {
376
+ const edit = editTool({ allowedFolders: [testDir] });
377
+
378
+ // Empty string
379
+ let result = await edit.execute({
380
+ file_path: '',
381
+ old_string: 'foo',
382
+ new_string: 'bar'
383
+ });
384
+ expect(result).toContain('Error editing file: Invalid file_path');
385
+
386
+ // Null
387
+ result = await edit.execute({
388
+ file_path: null,
389
+ old_string: 'foo',
390
+ new_string: 'bar'
391
+ });
392
+ expect(result).toContain('Error editing file: Invalid file_path');
393
+
394
+ // Whitespace only
395
+ result = await edit.execute({
396
+ file_path: ' ',
397
+ old_string: 'foo',
398
+ new_string: 'bar'
399
+ });
400
+ expect(result).toContain('Error editing file: Invalid file_path');
401
+ });
402
+
403
+ test('should handle invalid old_string', async () => {
404
+ const edit = editTool({ allowedFolders: [testDir] });
405
+ await fs.writeFile(testFile, 'test content');
406
+
407
+ // Undefined
408
+ let result = await edit.execute({
409
+ file_path: testFile,
410
+ old_string: undefined,
411
+ new_string: 'bar'
412
+ });
413
+ expect(result).toContain('Error editing file: Invalid old_string');
414
+
415
+ // Null
416
+ result = await edit.execute({
417
+ file_path: testFile,
418
+ old_string: null,
419
+ new_string: 'bar'
420
+ });
421
+ expect(result).toContain('Error editing file: Invalid old_string');
422
+ });
423
+
424
+ test('should handle invalid new_string', async () => {
425
+ const edit = editTool({ allowedFolders: [testDir] });
426
+ await fs.writeFile(testFile, 'test content');
427
+
428
+ // Undefined
429
+ let result = await edit.execute({
430
+ file_path: testFile,
431
+ old_string: 'test',
432
+ new_string: undefined
433
+ });
434
+ expect(result).toContain('Error editing file: Invalid new_string');
435
+
436
+ // Null
437
+ result = await edit.execute({
438
+ file_path: testFile,
439
+ old_string: 'test',
440
+ new_string: null
441
+ });
442
+ expect(result).toContain('Error editing file: Invalid new_string');
443
+ });
444
+
445
+ test('should handle empty strings in old_string and new_string', async () => {
446
+ const edit = editTool({ allowedFolders: [testDir] });
447
+ await fs.writeFile(testFile, 'test content'); // Double space
448
+
449
+ // Empty old_string matches everywhere, so it will find multiple occurrences
450
+ let result = await edit.execute({
451
+ file_path: testFile,
452
+ old_string: '',
453
+ new_string: 'inserted'
454
+ });
455
+ // Empty string will match at every position, causing multiple occurrences error
456
+ expect(result).toContain('Error editing file: Multiple occurrences found');
457
+
458
+ // Empty new_string (valid - can replace with empty)
459
+ await fs.writeFile(testFile, 'test content');
460
+ result = await edit.execute({
461
+ file_path: testFile,
462
+ old_string: ' ',
463
+ new_string: ''
464
+ });
465
+ expect(result).toContain('Successfully edited');
466
+ });
467
+ });
468
+
469
+ describe('createTool validation', () => {
470
+ test('should handle invalid file_path', async () => {
471
+ const create = createTool({ allowedFolders: [testDir] });
472
+
473
+ // Empty string
474
+ let result = await create.execute({
475
+ file_path: '',
476
+ content: 'test'
477
+ });
478
+ expect(result).toContain('Error creating file: Invalid file_path');
479
+
480
+ // Null
481
+ result = await create.execute({
482
+ file_path: null,
483
+ content: 'test'
484
+ });
485
+ expect(result).toContain('Error creating file: Invalid file_path');
486
+ });
487
+
488
+ test('should handle invalid content', async () => {
489
+ const create = createTool({ allowedFolders: [testDir] });
490
+
491
+ // Undefined
492
+ let result = await create.execute({
493
+ file_path: join(testDir, 'test.txt'),
494
+ content: undefined
495
+ });
496
+ expect(result).toContain('Error creating file: Invalid content');
497
+
498
+ // Null
499
+ result = await create.execute({
500
+ file_path: join(testDir, 'test.txt'),
501
+ content: null
502
+ });
503
+ expect(result).toContain('Error creating file: Invalid content');
504
+ });
505
+
506
+ test('should handle empty content', async () => {
507
+ const create = createTool({ allowedFolders: [testDir] });
508
+
509
+ // Empty string content is valid (creates empty file)
510
+ const result = await create.execute({
511
+ file_path: join(testDir, 'empty.txt'),
512
+ content: ''
513
+ });
514
+ expect(result).toContain('Successfully created');
515
+ expect(result).toContain('(0 bytes)');
516
+
517
+ const content = await fs.readFile(join(testDir, 'empty.txt'), 'utf-8');
518
+ expect(content).toBe('');
519
+ });
520
+ });
521
+ });
522
+
523
+ describe('Edge Cases', () => {
524
+ test('should handle very large files', async () => {
525
+ // Create a large file (1MB)
526
+ const largeContent = 'x'.repeat(1024 * 1024);
527
+ const largeFile = join(testDir, 'large.txt');
528
+ await fs.writeFile(largeFile, largeContent);
529
+
530
+ const edit = editTool({ allowedFolders: [testDir] });
531
+ const result = await edit.execute({
532
+ file_path: largeFile,
533
+ old_string: 'x'.repeat(100),
534
+ new_string: 'y'.repeat(100),
535
+ replace_all: true // Need replace_all since pattern repeats many times
536
+ });
537
+
538
+ expect(result).toContain('Successfully edited');
539
+ });
540
+
541
+ test('should handle files with special characters in path', async () => {
542
+ const specialFile = join(testDir, 'file with spaces & special.txt');
543
+
544
+ const create = createTool({ allowedFolders: [testDir] });
545
+ let result = await create.execute({
546
+ file_path: specialFile,
547
+ content: 'content'
548
+ });
549
+ expect(result).toContain('Successfully created');
550
+
551
+ const edit = editTool({ allowedFolders: [testDir] });
552
+ result = await edit.execute({
553
+ file_path: specialFile,
554
+ old_string: 'content',
555
+ new_string: 'new content'
556
+ });
557
+ expect(result).toContain('Successfully edited');
558
+ });
559
+
560
+ test('should handle Unicode content correctly', async () => {
561
+ const unicodeFile = join(testDir, 'unicode.txt');
562
+ const unicodeContent = '你好世界 🌍 émojis ñ';
563
+
564
+ const create = createTool({ allowedFolders: [testDir] });
565
+ const createResult = await create.execute({
566
+ file_path: unicodeFile,
567
+ content: unicodeContent
568
+ });
569
+ expect(createResult).toContain('Successfully created');
570
+
571
+ const edit = editTool({ allowedFolders: [testDir] });
572
+ const editResult = await edit.execute({
573
+ file_path: unicodeFile,
574
+ old_string: '你好世界',
575
+ new_string: '再见世界'
576
+ });
577
+ expect(editResult).toContain('Successfully edited');
578
+
579
+ const content = await fs.readFile(unicodeFile, 'utf-8');
580
+ expect(content).toContain('再见世界');
581
+ expect(content).toContain('🌍');
582
+ });
583
+
584
+ test('should handle line endings correctly', async () => {
585
+ const lineEndingFile = join(testDir, 'lineending.txt');
586
+
587
+ // Test with different line endings
588
+ const windowsContent = 'line1\r\nline2\r\nline3';
589
+ const unixContent = 'line1\nline2\nline3';
590
+
591
+ const create = createTool({ allowedFolders: [testDir] });
592
+ await create.execute({
593
+ file_path: lineEndingFile,
594
+ content: windowsContent
595
+ });
596
+
597
+ const edit = editTool({ allowedFolders: [testDir] });
598
+ const result = await edit.execute({
599
+ file_path: lineEndingFile,
600
+ old_string: 'line2',
601
+ new_string: 'modified'
602
+ });
603
+ expect(result).toContain('Successfully edited');
604
+
605
+ const content = await fs.readFile(lineEndingFile, 'utf-8');
606
+ expect(content).toContain('modified');
607
+ });
608
+ });
609
+ });