@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.
- package/README.md +138 -0
- package/data/.env.example +22 -0
- package/data/.gitattributes +47 -0
- package/data/.glfrc.json +7 -0
- package/data/.husky/pre-commit +5 -0
- package/data/.nvmrc +1 -0
- package/data/CHANGELOG.md +75 -0
- package/data/CODE_OF_CONDUCT.md +129 -0
- package/data/CONTRIBUTING.md +203 -0
- package/data/DOCS-STRUCTURE.md +307 -0
- package/data/I18N.md +292 -0
- package/data/LICENSE +22 -0
- package/data/README.md +315 -0
- package/data/SECURITY.md +125 -0
- package/data/WIKI-DEPLOYMENT.md +348 -0
- package/data/docs/AI-FEATURES.md +610 -0
- package/data/docs/API-REFERENCE.md +1022 -0
- package/data/docs/AUTHENTICATION.md +301 -0
- package/data/docs/BACKEND-API.md +468 -0
- package/data/docs/DEVELOPMENT.md +375 -0
- package/data/docs/EXAMPLES.md +622 -0
- package/data/docs/MCP-SERVER.md +307 -0
- package/data/docs/MIGRATION-GUIDE.md +367 -0
- package/data/docs/NPM-PUBLISH.md +193 -0
- package/data/docs/QUICKSTART.md +206 -0
- package/data/docs/REDIS-SETUP.md +162 -0
- package/data/docs/SERVER.md +228 -0
- package/data/docs/TROUBLESHOOTING.md +657 -0
- package/data/docs/WIDGET-GUIDE.md +638 -0
- package/data/docs/WIKI-HOME.md +58 -0
- package/data/docs/WIKI-SIDEBAR.md +39 -0
- package/data/package.json +171 -0
- package/data/playwright.config.ts +64 -0
- package/data/probe/.cargo/config.toml +10 -0
- package/data/probe/.claude/commands/performance-review.md +15 -0
- package/data/probe/.clinerules +288 -0
- package/data/probe/.dockerignore +57 -0
- package/data/probe/.githooks/post-commit +11 -0
- package/data/probe/.githooks/pre-commit +99 -0
- package/data/probe/.githooks/pre-commit-vow +9 -0
- package/data/probe/.prompts/engineer.md +41 -0
- package/data/probe/.roomodes +28 -0
- package/data/probe/.windsurfrules +0 -0
- package/data/probe/BASH_TOOL_SUMMARY.md +148 -0
- package/data/probe/BENCHMARKING.md +256 -0
- package/data/probe/CLAUDE.md +226 -0
- package/data/probe/CODE_OF_CONDUCT.md +128 -0
- package/data/probe/CONTRIBUTING.md +193 -0
- package/data/probe/Cargo.toml +120 -0
- package/data/probe/Cross.toml +10 -0
- package/data/probe/DOCKER-README.md +224 -0
- package/data/probe/Dockerfile +32 -0
- package/data/probe/ENHANCED_DEBUG_TELEMETRY.md +188 -0
- package/data/probe/LICENSE +201 -0
- package/data/probe/Makefile +210 -0
- package/data/probe/README.md +824 -0
- package/data/probe/SECURITY.md +67 -0
- package/data/probe/WINDOWS-GUIDE.md +294 -0
- package/data/probe/benches/parsing_benchmarks.rs +370 -0
- package/data/probe/benches/search_benchmarks.rs +599 -0
- package/data/probe/benches/simd_benchmarks.rs +372 -0
- package/data/probe/benches/timing_benchmarks.rs +287 -0
- package/data/probe/build-windows.bat +229 -0
- package/data/probe/codex-config/config.toml +6 -0
- package/data/probe/docs/PERFORMANCE_OPTIMIZATION.md +161 -0
- package/data/probe/examples/cache_demo.rs +46 -0
- package/data/probe/examples/chat/.dockerignore +37 -0
- package/data/probe/examples/chat/ChatSessionManager.js +295 -0
- package/data/probe/examples/chat/Dockerfile +98 -0
- package/data/probe/examples/chat/LICENSE +201 -0
- package/data/probe/examples/chat/LOCAL_IMAGE_SUPPORT.md +195 -0
- package/data/probe/examples/chat/MCP_INTEGRATION.md +400 -0
- package/data/probe/examples/chat/README.md +338 -0
- package/data/probe/examples/chat/TRACING.md +226 -0
- package/data/probe/examples/chat/appTracer.js +968 -0
- package/data/probe/examples/chat/auth.js +76 -0
- package/data/probe/examples/chat/bin/probe-chat.js +13 -0
- package/data/probe/examples/chat/build.js +104 -0
- package/data/probe/examples/chat/cancelRequest.js +84 -0
- package/data/probe/examples/chat/demo-agentic-image-flow.js +88 -0
- package/data/probe/examples/chat/demo-local-images.js +128 -0
- package/data/probe/examples/chat/fileSpanExporter.js +181 -0
- package/data/probe/examples/chat/implement/README.md +228 -0
- package/data/probe/examples/chat/implement/backends/AiderBackend.js +750 -0
- package/data/probe/examples/chat/implement/backends/BaseBackend.js +276 -0
- package/data/probe/examples/chat/implement/backends/ClaudeCodeBackend.js +767 -0
- package/data/probe/examples/chat/implement/backends/MockBackend.js +237 -0
- package/data/probe/examples/chat/implement/backends/registry.js +85 -0
- package/data/probe/examples/chat/implement/core/BackendManager.js +567 -0
- package/data/probe/examples/chat/implement/core/ImplementTool.js +354 -0
- package/data/probe/examples/chat/implement/core/config.js +428 -0
- package/data/probe/examples/chat/implement/core/timeouts.js +58 -0
- package/data/probe/examples/chat/implement/core/utils.js +496 -0
- package/data/probe/examples/chat/implement/types/BackendTypes.js +126 -0
- package/data/probe/examples/chat/index.js +669 -0
- package/data/probe/examples/chat/mcpServer.js +341 -0
- package/data/probe/examples/chat/npm/LICENSE +15 -0
- package/data/probe/examples/chat/npm/README.md +168 -0
- package/data/probe/examples/chat/npm/bin/probe-chat.js +156 -0
- package/data/probe/examples/chat/npm/index.js +259 -0
- package/data/probe/examples/chat/npm/package.json +54 -0
- package/data/probe/examples/chat/package.json +102 -0
- package/data/probe/examples/chat/probeChat.js +456 -0
- package/data/probe/examples/chat/probeTool.js +491 -0
- package/data/probe/examples/chat/storage/JsonChatStorage.js +476 -0
- package/data/probe/examples/chat/telemetry.js +281 -0
- package/data/probe/examples/chat/test/integration/chatFlows.test.js +320 -0
- package/data/probe/examples/chat/test/integration/toolCalling.test.js +471 -0
- package/data/probe/examples/chat/test/mocks/mockLLMProvider.js +269 -0
- package/data/probe/examples/chat/test/test-backends.js +90 -0
- package/data/probe/examples/chat/test/testUtils.js +530 -0
- package/data/probe/examples/chat/test/unit/backendTimeout.test.js +161 -0
- package/data/probe/examples/chat/test/unit/packageFiles.test.js +120 -0
- package/data/probe/examples/chat/test/verify-tests.js +118 -0
- package/data/probe/examples/chat/test-agentic-image-loading.js +294 -0
- package/data/probe/examples/chat/test-ai-sdk-telemetry.js +204 -0
- package/data/probe/examples/chat/test-chat-tracing.js +38 -0
- package/data/probe/examples/chat/test-direct-function.js +49 -0
- package/data/probe/examples/chat/test-file-size-validation.js +103 -0
- package/data/probe/examples/chat/test-full-mcp-integration.js +258 -0
- package/data/probe/examples/chat/test-github-context.txt +12 -0
- package/data/probe/examples/chat/test-hierarchy.js +203 -0
- package/data/probe/examples/chat/test-image-spans.js +37 -0
- package/data/probe/examples/chat/test-local-image-reading.js +176 -0
- package/data/probe/examples/chat/test-mcp-integration.js +136 -0
- package/data/probe/examples/chat/test-mcp-probe-server.js +161 -0
- package/data/probe/examples/chat/test-mcp-with-ai.js +279 -0
- package/data/probe/examples/chat/test-multiple-allowed-dirs.js +111 -0
- package/data/probe/examples/chat/test-probe-mcp-server.js +110 -0
- package/data/probe/examples/chat/test-security-validation.js +145 -0
- package/data/probe/examples/chat/test-simple-tracing.js +32 -0
- package/data/probe/examples/chat/test-trace-verification.js +235 -0
- package/data/probe/examples/chat/test-tracing.js +114 -0
- package/data/probe/examples/chat/tokenCounter.js +419 -0
- package/data/probe/examples/chat/tokenUsageDisplay.js +134 -0
- package/data/probe/examples/chat/webServer.js +1103 -0
- package/data/probe/examples/reranker/Cargo.toml +33 -0
- package/data/probe/examples/reranker/DEBUG_OUTPUT_ANALYSIS.md +71 -0
- package/data/probe/examples/reranker/MODELS.md +66 -0
- package/data/probe/examples/reranker/MODEL_COMPARISON.md +60 -0
- package/data/probe/examples/reranker/MULTI_MODEL_ANALYSIS.md +176 -0
- package/data/probe/examples/reranker/PERFORMANCE_SUMMARY.md +156 -0
- package/data/probe/examples/reranker/README.md +347 -0
- package/data/probe/examples/reranker/RUST_BERT_COMPARISON.md +82 -0
- package/data/probe/examples/reranker/TOKENIZATION_GUIDE.md +120 -0
- package/data/probe/examples/reranker/check_rust_tokenizer.py +108 -0
- package/data/probe/examples/reranker/convert_to_torchscript.py +109 -0
- package/data/probe/examples/reranker/debug_scoring.py +189 -0
- package/data/probe/examples/reranker/debug_tokenization.py +154 -0
- package/data/probe/examples/reranker/download_models.sh +73 -0
- package/data/probe/examples/reranker/requirements.txt +13 -0
- package/data/probe/examples/reranker/run_comprehensive_benchmark.sh +83 -0
- package/data/probe/examples/reranker/rust_bert_test/Cargo.toml +12 -0
- package/data/probe/examples/reranker/rust_bert_test/README.md +54 -0
- package/data/probe/examples/reranker/simple_test.py +50 -0
- package/data/probe/examples/reranker/test_all_models.sh +63 -0
- package/data/probe/examples/reranker/test_bert_results.sh +44 -0
- package/data/probe/examples/reranker/test_cross_encoder.py +334 -0
- package/data/probe/examples/reranker/test_cross_encoder.sh +80 -0
- package/data/probe/examples/reranker/test_exact_comparison.py +151 -0
- package/data/probe/examples/reranker/test_parallel_performance.sh +56 -0
- package/data/probe/examples/reranker/test_scores.py +132 -0
- package/data/probe/install.ps1 +508 -0
- package/data/probe/install.sh +460 -0
- package/data/probe/npm/CLONE_METHOD_EXAMPLES.md +596 -0
- package/data/probe/npm/CONTEXT_COMPACTION.md +303 -0
- package/data/probe/npm/DELEGATE_TOOL_README.md +166 -0
- package/data/probe/npm/MAID_INTEGRATION.md +313 -0
- package/data/probe/npm/MCP_INTEGRATION_SUMMARY.md +241 -0
- package/data/probe/npm/README.md +824 -0
- package/data/probe/npm/bin/.gitignore +7 -0
- package/data/probe/npm/bin/.gitkeep +0 -0
- package/data/probe/npm/bin/README.md +12 -0
- package/data/probe/npm/bin/probe +167 -0
- package/data/probe/npm/docs/CLAUDE_CODE_INTEGRATION.md +414 -0
- package/data/probe/npm/docs/CODEX_INTEGRATION.md +502 -0
- package/data/probe/npm/docs/EDIT_CREATE_TOOLS.md +233 -0
- package/data/probe/npm/docs/RETRY_AND_FALLBACK.md +674 -0
- package/data/probe/npm/example-usage.js +335 -0
- package/data/probe/npm/examples/multi-engine-demo.js +117 -0
- package/data/probe/npm/examples/probe-agent-cli.js +113 -0
- package/data/probe/npm/examples/test-agent-edit.js +114 -0
- package/data/probe/npm/examples/test-edit-create.js +120 -0
- package/data/probe/npm/examples/test-edit-direct.js +114 -0
- package/data/probe/npm/index.d.ts +744 -0
- package/data/probe/npm/jest.config.js +52 -0
- package/data/probe/npm/package.json +117 -0
- package/data/probe/npm/scripts/build-agent.cjs +75 -0
- package/data/probe/npm/scripts/build-cjs.js +124 -0
- package/data/probe/npm/scripts/build-mcp.cjs +36 -0
- package/data/probe/npm/scripts/postinstall.js +216 -0
- package/data/probe/npm/test-codex-e2e.js +78 -0
- package/data/probe/npm/test-download-lock.js +109 -0
- package/data/probe/npm/test-grep-security.js +94 -0
- package/data/probe/npm/test-grep-simplified.js +63 -0
- package/data/probe/npm/test-grep.js +51 -0
- package/data/probe/npm/tests/README.md +96 -0
- package/data/probe/npm/tests/agent-compact-history.test.js +174 -0
- package/data/probe/npm/tests/allow-tests-default.test.js +151 -0
- package/data/probe/npm/tests/contextCompactor.test.js +498 -0
- package/data/probe/npm/tests/delegate-config.test.js +353 -0
- package/data/probe/npm/tests/delegate-integration.test.js +348 -0
- package/data/probe/npm/tests/extractor-integration.test.js +162 -0
- package/data/probe/npm/tests/extractor.test.js +317 -0
- package/data/probe/npm/tests/fixtures/sampleDiagrams.js +267 -0
- package/data/probe/npm/tests/integration/claude-code-auto-fallback.spec.js +148 -0
- package/data/probe/npm/tests/integration/claude-code-multi-step.spec.js +127 -0
- package/data/probe/npm/tests/integration/claude-code-tool-events.spec.js +163 -0
- package/data/probe/npm/tests/integration/codex-auto-fallback.spec.js +191 -0
- package/data/probe/npm/tests/integration/codex-tool-events.spec.js +147 -0
- package/data/probe/npm/tests/integration/examplesChatMcp.test.js +402 -0
- package/data/probe/npm/tests/integration/mcpDotenvSupport.test.js +174 -0
- package/data/probe/npm/tests/integration/mcpErrorHandling.test.js +566 -0
- package/data/probe/npm/tests/integration/mcpRobustness.test.js +564 -0
- package/data/probe/npm/tests/integration/mcpStdoutPurity.test.js +355 -0
- package/data/probe/npm/tests/integration/probeAgentMcp.test.js +398 -0
- package/data/probe/npm/tests/integration/retryFallback.test.js +368 -0
- package/data/probe/npm/tests/integration/schema-in-initial-message.test.js +318 -0
- package/data/probe/npm/tests/integration/schema-validation-loop-prevention.test.js +244 -0
- package/data/probe/npm/tests/integration/schemaRetryLogic.test.js +94 -0
- package/data/probe/npm/tests/integration/validationFlow.test.js +329 -0
- package/data/probe/npm/tests/manual/test-codex-basic.js +110 -0
- package/data/probe/npm/tests/mcp/mcpClientManager.test.js +614 -0
- package/data/probe/npm/tests/mcp/mcpConfig.test.js +359 -0
- package/data/probe/npm/tests/mcp/mcpXmlBridge.test.js +436 -0
- package/data/probe/npm/tests/mcp/mockMcpServer.js +510 -0
- package/data/probe/npm/tests/mcp-strict-syntax.test.js +319 -0
- package/data/probe/npm/tests/mermaidQuoteEscaping.test.js +214 -0
- package/data/probe/npm/tests/nestedQuoteFix.test.js +40 -0
- package/data/probe/npm/tests/setup.js +46 -0
- package/data/probe/npm/tests/unit/allowed-tools.test.js +513 -0
- package/data/probe/npm/tests/unit/attempt-completion-closing-tag-in-content.test.js +188 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonFix.test.js +238 -0
- package/data/probe/npm/tests/unit/attemptCompletionJsonIssue.test.js +128 -0
- package/data/probe/npm/tests/unit/backtickAutoFix.test.js +35 -0
- package/data/probe/npm/tests/unit/bash-probe-agent-integration.test.js +389 -0
- package/data/probe/npm/tests/unit/bash-simple-commands.test.js +324 -0
- package/data/probe/npm/tests/unit/bash-tool-comprehensive.test.js +371 -0
- package/data/probe/npm/tests/unit/bash-tool-integration.test.js +310 -0
- package/data/probe/npm/tests/unit/bash-tool.test.js +341 -0
- package/data/probe/npm/tests/unit/completion-prompt.test.js +379 -0
- package/data/probe/npm/tests/unit/cwd-path-options.test.js +287 -0
- package/data/probe/npm/tests/unit/delegate-limits.test.js +422 -0
- package/data/probe/npm/tests/unit/direct-content-attempt-completion.test.js +235 -0
- package/data/probe/npm/tests/unit/edit-create-tools.test.js +609 -0
- package/data/probe/npm/tests/unit/enhancedMermaidValidation.test.js +577 -0
- package/data/probe/npm/tests/unit/extract-content.test.js +83 -0
- package/data/probe/npm/tests/unit/extract-multiple-targets.test.js +89 -0
- package/data/probe/npm/tests/unit/fallbackManager.test.js +442 -0
- package/data/probe/npm/tests/unit/githubCompatibilityValidation.test.js +258 -0
- package/data/probe/npm/tests/unit/imageConfig.test.js +149 -0
- package/data/probe/npm/tests/unit/imagePathResolution.test.js +345 -0
- package/data/probe/npm/tests/unit/json-fixing-agent.test.js +238 -0
- package/data/probe/npm/tests/unit/json-validation-enhanced-errors.test.js +199 -0
- package/data/probe/npm/tests/unit/jsonValidationInfiniteLoopFix.test.js +228 -0
- package/data/probe/npm/tests/unit/maidIntegration.test.js +139 -0
- package/data/probe/npm/tests/unit/maxIterationsWarning.test.js +195 -0
- package/data/probe/npm/tests/unit/mermaidEdgeLabelFix.test.js +161 -0
- package/data/probe/npm/tests/unit/mermaidHtmlEntities.test.js +76 -0
- package/data/probe/npm/tests/unit/mermaidInfiniteLoopFix.test.js +64 -0
- package/data/probe/npm/tests/unit/mermaidValidation.test.js +723 -0
- package/data/probe/npm/tests/unit/mermaidValidationVisorExample.test.js +309 -0
- package/data/probe/npm/tests/unit/probe-agent-clone-realistic.test.js +643 -0
- package/data/probe/npm/tests/unit/probe-agent-clone.test.js +476 -0
- package/data/probe/npm/tests/unit/probe-agent-delegate.test.js +400 -0
- package/data/probe/npm/tests/unit/probe-agent-model-option.test.js +118 -0
- package/data/probe/npm/tests/unit/probeTool-security.test.js +283 -0
- package/data/probe/npm/tests/unit/readImageTool.test.js +418 -0
- package/data/probe/npm/tests/unit/retryManager.test.js +317 -0
- package/data/probe/npm/tests/unit/schema-aware-reminders.test.js +288 -0
- package/data/probe/npm/tests/unit/schemaDefinitionDetection.test.js +115 -0
- package/data/probe/npm/tests/unit/schemaUtils.test.js +1268 -0
- package/data/probe/npm/tests/unit/simpleTelemetry.test.js +282 -0
- package/data/probe/npm/tests/unit/simplified-attempt-completion.test.js +274 -0
- package/data/probe/npm/tests/unit/single-quote-json-bug.test.js +231 -0
- package/data/probe/npm/tests/unit/subgraphAutoFix.test.js +110 -0
- package/data/probe/npm/tests/unit/system-prompt.test.js +32 -0
- package/data/probe/npm/tests/unit/types-probe-agent-options.test.js +42 -0
- package/data/probe/npm/tests/unit/xmlParsing.test.js +720 -0
- package/data/probe/npm/tsconfig.json +21 -0
- package/data/probe/result1.txt +19 -0
- package/data/probe/result2.txt +26 -0
- package/data/probe/scripts/benchmark.sh +270 -0
- package/data/probe/scripts/cache_memory_analysis.rs +844 -0
- package/data/probe/scripts/claude-hook-wrapper.sh +56 -0
- package/data/probe/site/.env.example +10 -0
- package/data/probe/site/DEPLOYMENT.md +86 -0
- package/data/probe/site/README.md +183 -0
- package/data/probe/site/adding-languages.md +135 -0
- package/data/probe/site/ai-chat.md +427 -0
- package/data/probe/site/ai-integration.md +1488 -0
- package/data/probe/site/blog/agentic-flow-custom-xml-protocol.md +407 -0
- package/data/probe/site/blog/index.md +118 -0
- package/data/probe/site/blog/v0.6.0-release.md +426 -0
- package/data/probe/site/blog.md +8 -0
- package/data/probe/site/changelog.md +200 -0
- package/data/probe/site/cli-mode.md +437 -0
- package/data/probe/site/code-extraction.md +436 -0
- package/data/probe/site/contributing/README.md +9 -0
- package/data/probe/site/contributing/documentation-cross-references.md +215 -0
- package/data/probe/site/contributing/documentation-maintenance.md +275 -0
- package/data/probe/site/contributing/documentation-structure.md +75 -0
- package/data/probe/site/documentation-cross-references.md +215 -0
- package/data/probe/site/documentation-guide.md +132 -0
- package/data/probe/site/documentation-maintenance.md +275 -0
- package/data/probe/site/features.md +147 -0
- package/data/probe/site/how-it-works.md +118 -0
- package/data/probe/site/index.md +175 -0
- package/data/probe/site/index.md.bak +133 -0
- package/data/probe/site/installation.md +235 -0
- package/data/probe/site/integrations/docker.md +248 -0
- package/data/probe/site/integrations/github-actions.md +413 -0
- package/data/probe/site/language-support-overview.md +168 -0
- package/data/probe/site/mcp-integration.md +587 -0
- package/data/probe/site/mcp-server.md +304 -0
- package/data/probe/site/navigation-structure.md +76 -0
- package/data/probe/site/nodejs-sdk.md +798 -0
- package/data/probe/site/output-formats.md +625 -0
- package/data/probe/site/package.json +21 -0
- package/data/probe/site/public/_headers +28 -0
- package/data/probe/site/public/_redirects +11 -0
- package/data/probe/site/quick-start.md +289 -0
- package/data/probe/site/search-functionality.md +291 -0
- package/data/probe/site/search-reference.md +291 -0
- package/data/probe/site/supported-languages.md +215 -0
- package/data/probe/site/use-cases/README.md +8 -0
- package/data/probe/site/use-cases/advanced-cli.md +253 -0
- package/data/probe/site/use-cases/ai-code-editors.md +239 -0
- package/data/probe/site/use-cases/building-ai-tools.md +529 -0
- package/data/probe/site/use-cases/cli-ai-workflows.md +285 -0
- package/data/probe/site/use-cases/deploying-probe-web-interface.md +255 -0
- package/data/probe/site/use-cases/integrating-probe-into-ai-code-editors.md +161 -0
- package/data/probe/site/use-cases/nodejs-sdk.md +596 -0
- package/data/probe/site/use-cases/team-chat.md +350 -0
- package/data/probe/site/web-interface.md +434 -0
- package/data/probe/site/wrangler.toml +9 -0
- package/data/probe/test-api-key.sh +1 -0
- package/data/probe/test-probe-implementation/hello.js +7 -0
- package/data/probe/test_cases/demonstrate_early_termination_issues.sh +176 -0
- package/data/probe/test_cases/early_termination_issues.rs +533 -0
- package/data/probe/test_data/test_nested_struct.go +26 -0
- package/data/probe/tests/README.md +286 -0
- package/data/probe/tests/README_search_determinism_tests.md +116 -0
- package/data/probe/tests/adjacent_comment_test.rs +152 -0
- package/data/probe/tests/apostrophe_handling_tests.rs +132 -0
- package/data/probe/tests/block_filtering_with_ast_tests.rs +669 -0
- package/data/probe/tests/block_merging_tests.rs +396 -0
- package/data/probe/tests/c_outline_format_tests.rs +2179 -0
- package/data/probe/tests/cache_invalidation_issues.rs.disabled +682 -0
- package/data/probe/tests/cache_order_tests.rs +147 -0
- package/data/probe/tests/cache_query_scoping_tests.rs +221 -0
- package/data/probe/tests/cli_tests.rs +680 -0
- package/data/probe/tests/comment_context_integration_test.rs +240 -0
- package/data/probe/tests/common.rs +33 -0
- package/data/probe/tests/complex_block_merging_tests.rs +599 -0
- package/data/probe/tests/complex_query_block_filtering_tests.rs +422 -0
- package/data/probe/tests/control_flow_closing_braces_test.rs +91 -0
- package/data/probe/tests/cpp_outline_format_tests.rs +1507 -0
- package/data/probe/tests/csharp_outline_format_tests.rs +941 -0
- package/data/probe/tests/elastic_query_integration_tests.rs +922 -0
- package/data/probe/tests/extract_command_tests.rs +1848 -0
- package/data/probe/tests/extract_deduplication_tests.rs +146 -0
- package/data/probe/tests/extract_input_file_tests.rs +84 -0
- package/data/probe/tests/extract_prompt_tests.rs +102 -0
- package/data/probe/tests/filename_search_tests.rs +96 -0
- package/data/probe/tests/fixtures/user/AssemblyInfo.cs +3 -0
- package/data/probe/tests/github_extract_tests.rs +234 -0
- package/data/probe/tests/go_comment_test.rs +253 -0
- package/data/probe/tests/go_outline_format_tests.rs +2587 -0
- package/data/probe/tests/go_path_resolver_tests.rs +96 -0
- package/data/probe/tests/html_outline_format_tests.rs +637 -0
- package/data/probe/tests/integration_tests.rs +837 -0
- package/data/probe/tests/ip_whitelist_test.rs +148 -0
- package/data/probe/tests/java_outline_format_tests.rs +1611 -0
- package/data/probe/tests/javascript_extract_tests.rs +315 -0
- package/data/probe/tests/javascript_outline_format_tests.rs +1464 -0
- package/data/probe/tests/json_format_tests.rs +436 -0
- package/data/probe/tests/json_schema_validation_tests.rs +450 -0
- package/data/probe/tests/lib_usage.rs +60 -0
- package/data/probe/tests/line_comment_context_extension_test.rs +459 -0
- package/data/probe/tests/line_map_cache_tests.rs +114 -0
- package/data/probe/tests/markdown_integration_tests.rs +190 -0
- package/data/probe/tests/mocks/test_ip_whitelist.go +11 -0
- package/data/probe/tests/mocks/test_object.js +27 -0
- package/data/probe/tests/mocks/test_struct.go +50 -0
- package/data/probe/tests/multi_keyword_pattern_tests.rs +464 -0
- package/data/probe/tests/multi_language_syntax_integration_tests.rs +218 -0
- package/data/probe/tests/multiple_capture_groups_tests.rs +169 -0
- package/data/probe/tests/negative_compound_word_tests.rs +246 -0
- package/data/probe/tests/nested_symbol_extraction_tests.rs +99 -0
- package/data/probe/tests/outline_cross_file_interference_test.rs +335 -0
- package/data/probe/tests/outline_keyword_preservation_test.rs +67 -0
- package/data/probe/tests/output_format_edge_cases_tests.rs +693 -0
- package/data/probe/tests/parallel_extraction_tests.rs +178 -0
- package/data/probe/tests/parallel_search_tests.rs +355 -0
- package/data/probe/tests/path_resolver_tests.rs +698 -0
- package/data/probe/tests/php_outline_format_extended_tests.rs +928 -0
- package/data/probe/tests/php_outline_format_tests.rs +768 -0
- package/data/probe/tests/property_tests.proptest-regressions +9 -0
- package/data/probe/tests/property_tests.rs +118 -0
- package/data/probe/tests/python_outline_format_tests.rs +1538 -0
- package/data/probe/tests/query_command_json_tests.rs +438 -0
- package/data/probe/tests/query_command_tests.rs +232 -0
- package/data/probe/tests/query_command_xml_tests.rs +569 -0
- package/data/probe/tests/quoted_term_with_negative_keyword_tests.rs +216 -0
- package/data/probe/tests/required_terms_filename_tests.rs +116 -0
- package/data/probe/tests/ruby_outline_format_tests.rs +1011 -0
- package/data/probe/tests/rust_line_comment_context_test.rs +151 -0
- package/data/probe/tests/rust_outline_format_enhanced_tests.rs +725 -0
- package/data/probe/tests/rust_outline_format_tests.rs +843 -0
- package/data/probe/tests/schemas/xml_output_schema.xsd +38 -0
- package/data/probe/tests/search_determinism_tests.rs +451 -0
- package/data/probe/tests/search_hints_tests.rs +253 -0
- package/data/probe/tests/special_character_escaping_tests.rs +417 -0
- package/data/probe/tests/stemming_compound_word_filtering_tests.rs +535 -0
- package/data/probe/tests/strict_elastic_syntax_tests.rs +404 -0
- package/data/probe/tests/swift_outline_format_tests.rs +3319 -0
- package/data/probe/tests/symbols_tests.rs +166 -0
- package/data/probe/tests/test_file.rs +45 -0
- package/data/probe/tests/test_tokenize.rs +28 -0
- package/data/probe/tests/timeout_tests.rs +82 -0
- package/data/probe/tests/tokenization_tests.rs +195 -0
- package/data/probe/tests/tokenized_block_filtering_tests.rs +174 -0
- package/data/probe/tests/typescript_extract_tests.rs +214 -0
- package/data/probe/tests/typescript_outline_format_tests.rs +2188 -0
- package/data/probe/tests/xml_format_tests.rs +568 -0
- package/data/probe/tests/xml_schema_validation_tests.rs +497 -0
- package/data/scripts/postinstall.mjs +9 -0
- package/data/scripts/set-version.js +0 -0
- package/data/scripts/wiki-build.sh +111 -0
- package/data/scripts/wiki-deploy.sh +73 -0
- package/data/serve.json +12 -0
- package/data/test/demo-dynamic.html +134 -0
- package/data/test/demo-esm.html +105 -0
- package/data/test/demo-iife.html +78 -0
- package/data/tsconfig.json +7 -0
- package/data/vite.server.ts +483 -0
- package/data/vitest.config.ts +40 -0
- package/data/wiki/Home.md +58 -0
- package/data/wiki/_Sidebar.md +39 -0
- package/docs-mcp.config.json +20 -0
- package/package.json +56 -0
- package/src/config.js +111 -0
- 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
|
+
});
|