@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,389 @@
1
+ /**
2
+ * Tests for bash tool integration with ProbeAgent
3
+ * @module tests/unit/bash-probe-agent-integration
4
+ */
5
+
6
+ import { jest, describe, test, expect, beforeEach } from '@jest/globals';
7
+
8
+ // Mock all the heavy dependencies that ProbeAgent uses
9
+ jest.mock('@ai-sdk/anthropic', () => ({}));
10
+ jest.mock('@ai-sdk/openai', () => ({}));
11
+ jest.mock('@ai-sdk/google', () => ({}));
12
+ jest.mock('ai', () => ({
13
+ generateText: jest.fn(),
14
+ tool: jest.fn((config) => ({
15
+ name: config.name,
16
+ description: config.description,
17
+ inputSchema: config.inputSchema,
18
+ execute: config.execute
19
+ }))
20
+ }));
21
+
22
+ // Import ProbeAgent
23
+ import { ProbeAgent } from '../../src/agent/ProbeAgent.js';
24
+
25
+ describe('Bash Tool ProbeAgent Integration', () => {
26
+ describe('ProbeAgent Configuration', () => {
27
+ test('should create ProbeAgent with bash disabled by default', () => {
28
+ const agent = new ProbeAgent({
29
+ debug: false
30
+ });
31
+
32
+ expect(agent.enableBash).toBe(false);
33
+ expect(agent.bashConfig).toEqual({});
34
+ expect(agent.toolImplementations.bash).toBeUndefined();
35
+ });
36
+
37
+ test('should create ProbeAgent with bash enabled', () => {
38
+ const agent = new ProbeAgent({
39
+ enableBash: true,
40
+ debug: false
41
+ });
42
+
43
+ expect(agent.enableBash).toBe(true);
44
+ expect(agent.bashConfig).toEqual({});
45
+
46
+ // Should have bash tool in implementations
47
+ expect(agent.toolImplementations.bash).toBeDefined();
48
+ });
49
+
50
+ test('should create ProbeAgent with custom bash config', () => {
51
+ const bashConfig = {
52
+ allow: ['docker:ps', 'make:help'],
53
+ deny: ['git:push'],
54
+ timeout: 60000,
55
+ workingDirectory: '/test'
56
+ };
57
+
58
+ const agent = new ProbeAgent({
59
+ enableBash: true,
60
+ bashConfig: bashConfig,
61
+ debug: false
62
+ });
63
+
64
+ expect(agent.enableBash).toBe(true);
65
+ expect(agent.bashConfig).toEqual(bashConfig);
66
+ expect(agent.toolImplementations.bash).toBeDefined();
67
+ });
68
+
69
+ test('should pass configuration to tools properly', () => {
70
+ const bashConfig = {
71
+ allow: ['custom:command'],
72
+ timeout: 30000
73
+ };
74
+
75
+ const agent = new ProbeAgent({
76
+ enableBash: true,
77
+ bashConfig: bashConfig,
78
+ allowedFolders: ['/home/test'],
79
+ debug: false
80
+ });
81
+
82
+ expect(agent.enableBash).toBe(true);
83
+ expect(agent.bashConfig).toEqual(bashConfig);
84
+ expect(agent.allowedFolders).toEqual(['/home/test']);
85
+ });
86
+ });
87
+
88
+ describe('Tool Implementation Availability', () => {
89
+ test('should not have bash tool when disabled', () => {
90
+ const agent = new ProbeAgent({
91
+ enableBash: false,
92
+ debug: false
93
+ });
94
+
95
+ expect(agent.toolImplementations.bash).toBeUndefined();
96
+
97
+ // Should have other tools
98
+ expect(agent.toolImplementations.search).toBeDefined();
99
+ expect(agent.toolImplementations.query).toBeDefined();
100
+ expect(agent.toolImplementations.extract).toBeDefined();
101
+ });
102
+
103
+ test('should have bash tool when enabled', () => {
104
+ const agent = new ProbeAgent({
105
+ enableBash: true,
106
+ debug: false
107
+ });
108
+
109
+ expect(agent.toolImplementations.bash).toBeDefined();
110
+
111
+ // Should also have other tools
112
+ expect(agent.toolImplementations.search).toBeDefined();
113
+ expect(agent.toolImplementations.query).toBeDefined();
114
+ expect(agent.toolImplementations.extract).toBeDefined();
115
+ });
116
+
117
+ test('should have executable bash tool', () => {
118
+ const agent = new ProbeAgent({
119
+ enableBash: true,
120
+ debug: false
121
+ });
122
+
123
+ const bashTool = agent.toolImplementations.bash;
124
+ expect(bashTool).toBeDefined();
125
+ expect(typeof bashTool.execute).toBe('function');
126
+ });
127
+ });
128
+
129
+ describe('Configuration Edge Cases', () => {
130
+ test('should handle empty bash config', () => {
131
+ const agent = new ProbeAgent({
132
+ enableBash: true,
133
+ bashConfig: {},
134
+ debug: false
135
+ });
136
+
137
+ expect(agent.enableBash).toBe(true);
138
+ expect(agent.bashConfig).toEqual({});
139
+ expect(agent.toolImplementations.bash).toBeDefined();
140
+ });
141
+
142
+ test('should handle null bash config', () => {
143
+ const agent = new ProbeAgent({
144
+ enableBash: true,
145
+ bashConfig: null,
146
+ debug: false
147
+ });
148
+
149
+ expect(agent.enableBash).toBe(true);
150
+ expect(agent.bashConfig).toEqual({});
151
+ expect(agent.toolImplementations.bash).toBeDefined();
152
+ });
153
+
154
+ test('should handle undefined bash config', () => {
155
+ const agent = new ProbeAgent({
156
+ enableBash: true,
157
+ debug: false
158
+ });
159
+
160
+ expect(agent.enableBash).toBe(true);
161
+ expect(agent.bashConfig).toEqual({});
162
+ expect(agent.toolImplementations.bash).toBeDefined();
163
+ });
164
+
165
+ test('should handle complex bash configuration', () => {
166
+ const complexConfig = {
167
+ allow: ['docker:*', 'npm:run:*', 'make:*'],
168
+ deny: ['docker:rm:*', 'npm:install:*'],
169
+ disableDefaultAllow: false,
170
+ disableDefaultDeny: false,
171
+ timeout: 120000,
172
+ workingDirectory: '/app',
173
+ env: {
174
+ NODE_ENV: 'test',
175
+ DEBUG: '1'
176
+ },
177
+ maxBuffer: 10 * 1024 * 1024
178
+ };
179
+
180
+ const agent = new ProbeAgent({
181
+ enableBash: true,
182
+ bashConfig: complexConfig,
183
+ debug: false
184
+ });
185
+
186
+ expect(agent.bashConfig).toEqual(complexConfig);
187
+ expect(agent.toolImplementations.bash).toBeDefined();
188
+ });
189
+ });
190
+
191
+ describe('Working Directory Integration', () => {
192
+ test('should use allowedFolders as default working directory', () => {
193
+ const agent = new ProbeAgent({
194
+ enableBash: true,
195
+ allowedFolders: ['/project', '/tmp'],
196
+ debug: false
197
+ });
198
+
199
+ expect(agent.allowedFolders).toEqual(['/project', '/tmp']);
200
+ expect(agent.toolImplementations.bash).toBeDefined();
201
+ });
202
+
203
+ test('should handle empty allowedFolders', () => {
204
+ const agent = new ProbeAgent({
205
+ enableBash: true,
206
+ allowedFolders: [],
207
+ debug: false
208
+ });
209
+
210
+ expect(agent.allowedFolders).toEqual([]);
211
+ expect(agent.toolImplementations.bash).toBeDefined();
212
+ });
213
+
214
+ test('should use path parameter as allowedFolders', () => {
215
+ const agent = new ProbeAgent({
216
+ enableBash: true,
217
+ path: '/single/path',
218
+ debug: false
219
+ });
220
+
221
+ expect(agent.allowedFolders).toEqual(['/single/path']);
222
+ expect(agent.toolImplementations.bash).toBeDefined();
223
+ });
224
+ });
225
+
226
+ describe('Debug Mode Integration', () => {
227
+ test('should pass debug flag to bash configuration', () => {
228
+ const agent = new ProbeAgent({
229
+ enableBash: true,
230
+ debug: true
231
+ });
232
+
233
+ expect(agent.debug).toBe(true);
234
+ expect(agent.enableBash).toBe(true);
235
+ expect(agent.toolImplementations.bash).toBeDefined();
236
+ });
237
+
238
+ test('should respect process.env.DEBUG', () => {
239
+ const originalDebug = process.env.DEBUG;
240
+ process.env.DEBUG = '1';
241
+
242
+ const agent = new ProbeAgent({
243
+ enableBash: true
244
+ });
245
+
246
+ expect(agent.debug).toBe(true);
247
+ expect(agent.enableBash).toBe(true);
248
+
249
+ // Restore original value
250
+ if (originalDebug !== undefined) {
251
+ process.env.DEBUG = originalDebug;
252
+ } else {
253
+ delete process.env.DEBUG;
254
+ }
255
+ });
256
+ });
257
+ });
258
+
259
+ describe('Bash Tool Configuration Parsing', () => {
260
+ // These tests simulate what the CLI would do when parsing arguments
261
+ describe('CLI-style Configuration Processing', () => {
262
+ test('should parse comma-separated allow patterns', () => {
263
+ const allowPatterns = 'docker:ps,docker:images,npm:list';
264
+ const parsedPatterns = allowPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
265
+
266
+ expect(parsedPatterns).toEqual(['docker:ps', 'docker:images', 'npm:list']);
267
+
268
+ const agent = new ProbeAgent({
269
+ enableBash: true,
270
+ bashConfig: {
271
+ allow: parsedPatterns
272
+ },
273
+ debug: false
274
+ });
275
+
276
+ expect(agent.bashConfig.allow).toEqual(parsedPatterns);
277
+ });
278
+
279
+ test('should parse comma-separated deny patterns', () => {
280
+ const denyPatterns = 'rm:*,sudo:*,chmod:777';
281
+ const parsedPatterns = denyPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
282
+
283
+ expect(parsedPatterns).toEqual(['rm:*', 'sudo:*', 'chmod:777']);
284
+
285
+ const agent = new ProbeAgent({
286
+ enableBash: true,
287
+ bashConfig: {
288
+ deny: parsedPatterns
289
+ },
290
+ debug: false
291
+ });
292
+
293
+ expect(agent.bashConfig.deny).toEqual(parsedPatterns);
294
+ });
295
+
296
+ test('should handle empty patterns gracefully', () => {
297
+ const allowPatterns = '';
298
+ const parsedPatterns = allowPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
299
+
300
+ expect(parsedPatterns).toEqual([]);
301
+
302
+ const agent = new ProbeAgent({
303
+ enableBash: true,
304
+ bashConfig: {
305
+ allow: parsedPatterns.length > 0 ? parsedPatterns : undefined
306
+ },
307
+ debug: false
308
+ });
309
+
310
+ expect(agent.bashConfig.allow).toBeUndefined();
311
+ });
312
+
313
+ test('should handle patterns with extra whitespace', () => {
314
+ const allowPatterns = ' docker:ps , npm:list , git:status ';
315
+ const parsedPatterns = allowPatterns.split(',').map(p => p.trim()).filter(p => p.length > 0);
316
+
317
+ expect(parsedPatterns).toEqual(['docker:ps', 'npm:list', 'git:status']);
318
+ });
319
+
320
+ test('should parse timeout values', () => {
321
+ const timeoutString = '60000';
322
+ const timeout = parseInt(timeoutString, 10);
323
+
324
+ expect(timeout).toBe(60000);
325
+ expect(isNaN(timeout)).toBe(false);
326
+
327
+ const agent = new ProbeAgent({
328
+ enableBash: true,
329
+ bashConfig: {
330
+ timeout: timeout
331
+ },
332
+ debug: false
333
+ });
334
+
335
+ expect(agent.bashConfig.timeout).toBe(60000);
336
+ });
337
+
338
+ test('should handle invalid timeout values', () => {
339
+ const timeoutString = 'invalid';
340
+ const timeout = parseInt(timeoutString, 10);
341
+
342
+ expect(isNaN(timeout)).toBe(true);
343
+
344
+ // In real CLI, this would cause an error before ProbeAgent creation
345
+ // Here we just test that ProbeAgent doesn't break with invalid values
346
+ const agent = new ProbeAgent({
347
+ enableBash: true,
348
+ bashConfig: {
349
+ timeout: isNaN(timeout) ? undefined : timeout
350
+ },
351
+ debug: false
352
+ });
353
+
354
+ expect(agent.bashConfig.timeout).toBeUndefined();
355
+ });
356
+
357
+ test('should handle disable flags', () => {
358
+ // Simulating --no-default-bash-allow and --no-default-bash-deny
359
+ const defaultBashAllow = false;
360
+ const defaultBashDeny = false;
361
+
362
+ const agent = new ProbeAgent({
363
+ enableBash: true,
364
+ bashConfig: {
365
+ disableDefaultAllow: defaultBashAllow === false,
366
+ disableDefaultDeny: defaultBashDeny === false
367
+ },
368
+ debug: false
369
+ });
370
+
371
+ expect(agent.bashConfig.disableDefaultAllow).toBe(true);
372
+ expect(agent.bashConfig.disableDefaultDeny).toBe(true);
373
+ });
374
+ });
375
+
376
+ describe('Environment Variable Integration', () => {
377
+ test('should not interfere with existing environment handling', () => {
378
+ const agent = new ProbeAgent({
379
+ enableBash: true,
380
+ debug: false
381
+ });
382
+
383
+ // Should still have basic functionality
384
+ expect(agent.sessionId).toBeTruthy();
385
+ expect(typeof agent.sessionId).toBe('string');
386
+ expect(agent.toolImplementations).toBeDefined();
387
+ });
388
+ });
389
+ });
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Tests for simplified bash tool (rejects complex commands for security)
3
+ * @module tests/unit/bash-simple-commands
4
+ */
5
+
6
+ import { jest, describe, test, expect, beforeEach } from '@jest/globals';
7
+ import { parseSimpleCommand, parseCommand, parseCommandForExecution, isComplexCommand } from '../../src/agent/bashCommandUtils.js';
8
+ import { BashPermissionChecker } from '../../src/agent/bashPermissions.js';
9
+
10
+ // Mock the 'ai' package since it may not be available in test environment
11
+ jest.mock('ai', () => ({
12
+ tool: jest.fn((config) => ({
13
+ name: config.name,
14
+ description: config.description,
15
+ inputSchema: config.inputSchema,
16
+ execute: config.execute
17
+ }))
18
+ }));
19
+
20
+ import { bashTool } from '../../src/tools/bash.js';
21
+
22
+ describe('Simple Command Parser', () => {
23
+ describe('parseSimpleCommand', () => {
24
+ test('should parse simple commands correctly', () => {
25
+ const result = parseSimpleCommand('ls -la');
26
+ expect(result.success).toBe(true);
27
+ expect(result.command).toBe('ls');
28
+ expect(result.args).toEqual(['-la']);
29
+ expect(result.isComplex).toBe(false);
30
+ });
31
+
32
+ test('should handle quoted arguments correctly (fix quote bug)', () => {
33
+ const result = parseSimpleCommand('grep "test file" *.txt');
34
+ expect(result.success).toBe(true);
35
+ expect(result.command).toBe('grep');
36
+ expect(result.args).toEqual(['test file', '*.txt']); // Quotes stripped!
37
+ expect(result.fullArgs).toEqual(['grep', 'test file', '*.txt']);
38
+ });
39
+
40
+ test('should handle single quotes correctly', () => {
41
+ const result = parseSimpleCommand("echo 'hello world'");
42
+ expect(result.success).toBe(true);
43
+ expect(result.command).toBe('echo');
44
+ expect(result.args).toEqual(['hello world']); // Single quotes stripped!
45
+ });
46
+
47
+ test('should handle mixed quotes', () => {
48
+ const result = parseSimpleCommand('git commit -m "Fixed bug" --author="John Doe"');
49
+ expect(result.success).toBe(true);
50
+ expect(result.command).toBe('git');
51
+ expect(result.args).toEqual(['commit', '-m', 'Fixed bug', '--author=John Doe']);
52
+ });
53
+
54
+ test('should reject commands with unclosed quotes', () => {
55
+ const result = parseSimpleCommand('echo "unclosed quote');
56
+ expect(result.success).toBe(false);
57
+ expect(result.error).toContain('Unclosed quote');
58
+ });
59
+
60
+ test('should reject empty commands', () => {
61
+ const result = parseSimpleCommand('');
62
+ expect(result.success).toBe(false);
63
+ expect(result.error).toContain('empty');
64
+ });
65
+
66
+ test('should reject null/undefined commands', () => {
67
+ expect(parseSimpleCommand(null).success).toBe(false);
68
+ expect(parseSimpleCommand(undefined).success).toBe(false);
69
+ });
70
+ });
71
+
72
+ describe('Complex Command Detection', () => {
73
+ test('should detect pipes as complex', () => {
74
+ expect(isComplexCommand('ls | grep test')).toBe(true);
75
+ const result = parseSimpleCommand('ls | grep test');
76
+ expect(result.success).toBe(false);
77
+ expect(result.isComplex).toBe(true);
78
+ expect(result.error).toContain('Complex shell commands');
79
+ });
80
+
81
+ test('should detect logical operators as complex', () => {
82
+ expect(isComplexCommand('make && make test')).toBe(true);
83
+ expect(isComplexCommand('make || echo failed')).toBe(true);
84
+ });
85
+
86
+ test('should detect command substitution as complex', () => {
87
+ expect(isComplexCommand('echo $(date)')).toBe(true);
88
+ expect(isComplexCommand('ls `pwd`')).toBe(true);
89
+ });
90
+
91
+ test('should detect redirections as complex', () => {
92
+ expect(isComplexCommand('ls > output.txt')).toBe(true);
93
+ expect(isComplexCommand('cat < input.txt')).toBe(true);
94
+ });
95
+
96
+ test('should detect background execution as complex', () => {
97
+ expect(isComplexCommand('long-task &')).toBe(true);
98
+ });
99
+
100
+ test('should detect command separators as complex', () => {
101
+ expect(isComplexCommand('cd /tmp; ls')).toBe(true);
102
+ });
103
+
104
+ test('should allow simple commands', () => {
105
+ expect(isComplexCommand('ls -la')).toBe(false);
106
+ expect(isComplexCommand('git status')).toBe(false);
107
+ expect(isComplexCommand('npm test')).toBe(false);
108
+ });
109
+ });
110
+
111
+ describe('parseCommandForExecution', () => {
112
+ test('should return array for simple commands', () => {
113
+ const result = parseCommandForExecution('ls -la');
114
+ expect(result).toEqual(['ls', '-la']);
115
+ });
116
+
117
+ test('should return null for complex commands', () => {
118
+ const result = parseCommandForExecution('ls | grep test');
119
+ expect(result).toBeNull();
120
+ });
121
+
122
+ test('should handle quotes correctly for execution', () => {
123
+ const result = parseCommandForExecution('grep "test file" data.txt');
124
+ expect(result).toEqual(['grep', 'test file', 'data.txt']);
125
+ });
126
+ });
127
+ });
128
+
129
+ describe('Simplified Permission Checker', () => {
130
+ let checker;
131
+
132
+ beforeEach(() => {
133
+ checker = new BashPermissionChecker({
134
+ allow: ['test:*', 'echo:hello'],
135
+ deny: ['rm:*', 'dangerous:cmd'],
136
+ debug: false
137
+ });
138
+ });
139
+
140
+ describe('Complex Command Rejection', () => {
141
+ test('should reject piped commands', () => {
142
+ const result = checker.check('ls | grep test');
143
+ expect(result.allowed).toBe(false);
144
+ expect(result.reason).toContain('Complex shell commands');
145
+ expect(result.isComplex).toBe(true);
146
+ });
147
+
148
+ test('should reject commands with logical operators', () => {
149
+ const result = checker.check('make && make test');
150
+ expect(result.allowed).toBe(false);
151
+ expect(result.reason).toContain('Complex shell commands');
152
+ });
153
+
154
+ test('should reject command substitution', () => {
155
+ const result = checker.check('echo $(whoami)');
156
+ expect(result.allowed).toBe(false);
157
+ expect(result.reason).toContain('Complex shell commands');
158
+ });
159
+
160
+ test('should reject redirections', () => {
161
+ const result = checker.check('ls > output.txt');
162
+ expect(result.allowed).toBe(false);
163
+ expect(result.reason).toContain('Complex shell commands');
164
+ });
165
+ });
166
+
167
+ describe('Simple Command Processing', () => {
168
+ test('should allow commands matching allow patterns', () => {
169
+ const result = checker.check('test --version');
170
+ expect(result.allowed).toBe(true);
171
+ expect(result.isComplex).toBe(false);
172
+ });
173
+
174
+ test('should reject commands matching deny patterns', () => {
175
+ const result = checker.check('rm -rf /');
176
+ expect(result.allowed).toBe(false);
177
+ expect(result.reason).toContain('deny pattern');
178
+ });
179
+
180
+ test('should handle quoted arguments in pattern matching', () => {
181
+ // This tests the quote handling fix
182
+ const result = checker.check('echo "hello"');
183
+ expect(result.allowed).toBe(true); // Should match echo:hello pattern
184
+ });
185
+
186
+ test('should reject commands with no matching allow pattern', () => {
187
+ const result = checker.check('unknown-command');
188
+ expect(result.allowed).toBe(false);
189
+ expect(result.reason).toContain('Command not in allow list');
190
+ });
191
+ });
192
+
193
+ describe('Configuration', () => {
194
+ test('should work with empty allow list (allows everything not denied)', () => {
195
+ const permissiveChecker = new BashPermissionChecker({
196
+ allow: [], // Empty allow list
197
+ deny: ['rm:*'],
198
+ disableDefaultAllow: true,
199
+ disableDefaultDeny: true
200
+ });
201
+
202
+ const allowed = permissiveChecker.check('any-command');
203
+ expect(allowed.allowed).toBe(true);
204
+
205
+ const denied = permissiveChecker.check('rm -rf');
206
+ expect(denied.allowed).toBe(false);
207
+ });
208
+
209
+ test('should provide configuration summary', () => {
210
+ const config = checker.getConfig();
211
+ expect(config).toHaveProperty('allowPatterns');
212
+ expect(config).toHaveProperty('denyPatterns');
213
+ expect(config).toHaveProperty('totalPatterns');
214
+ expect(typeof config.allowPatterns).toBe('number');
215
+ expect(typeof config.denyPatterns).toBe('number');
216
+ });
217
+ });
218
+ });
219
+
220
+ describe('Bash Tool Integration with Simplified Architecture', () => {
221
+ test('should create bash tool with working configuration', () => {
222
+ const tool = bashTool({
223
+ enableBash: true,
224
+ bashConfig: {
225
+ allow: ['ls:*', 'echo:*'],
226
+ deny: ['rm:*'],
227
+ timeout: 30000
228
+ }
229
+ });
230
+
231
+ expect(tool.name).toBe('bash');
232
+ expect(tool.description).toContain('Execute bash commands');
233
+ expect(typeof tool.execute).toBe('function');
234
+ });
235
+
236
+ test('should reject complex commands in tool execution', async () => {
237
+ const tool = bashTool({
238
+ enableBash: true,
239
+ bashConfig: { allow: ['ls:*'], deny: [] }
240
+ });
241
+
242
+ const result = await tool.execute({ command: 'ls | grep test' });
243
+ expect(result).toContain('Permission denied');
244
+ expect(result).toContain('Complex shell commands');
245
+ });
246
+
247
+ test('should handle simple commands in tool', async () => {
248
+ const tool = bashTool({
249
+ enableBash: true,
250
+ bashConfig: {
251
+ allow: ['echo:*'],
252
+ deny: [],
253
+ disableDefaultAllow: true,
254
+ disableDefaultDeny: true
255
+ }
256
+ });
257
+
258
+ // This should not throw during permission check
259
+ // (actual execution might fail without proper environment, but permissions should pass)
260
+ let permissionError = null;
261
+ try {
262
+ await tool.execute({ command: 'echo hello' });
263
+ } catch (error) {
264
+ if (error.message.includes('Permission denied')) {
265
+ permissionError = error;
266
+ }
267
+ // Other execution errors (like missing environment) are expected in tests
268
+ }
269
+
270
+ expect(permissionError).toBeNull();
271
+ });
272
+ });
273
+
274
+ describe('Architecture Alignment Tests', () => {
275
+ test('should ensure parser and executor handle same command format', () => {
276
+ const testCommands = [
277
+ 'ls -la',
278
+ 'git status',
279
+ 'echo "hello world"',
280
+ 'npm test',
281
+ 'docker ps',
282
+ 'make clean'
283
+ ];
284
+
285
+ for (const command of testCommands) {
286
+ const parserResult = parseCommandForExecution(command);
287
+ const permissionResult = parseCommand(command);
288
+
289
+ // Both should succeed for simple commands
290
+ expect(parserResult).not.toBeNull();
291
+ expect(permissionResult.error).toBeNull();
292
+
293
+ // Both should parse to same basic structure
294
+ expect(parserResult[0]).toBe(permissionResult.command);
295
+ expect(parserResult.slice(1)).toEqual(permissionResult.args);
296
+ }
297
+ });
298
+
299
+ test('should ensure complex commands are consistently rejected', () => {
300
+ const complexCommands = [
301
+ 'ls | grep test',
302
+ 'make && make test',
303
+ 'echo $(date)',
304
+ 'ls > output.txt',
305
+ 'cmd1 ; cmd2',
306
+ 'background-task &'
307
+ ];
308
+
309
+ for (const command of complexCommands) {
310
+ const parserResult = parseCommandForExecution(command);
311
+ const isComplex = isComplexCommand(command);
312
+
313
+ // Parser should reject complex commands
314
+ expect(parserResult).toBeNull();
315
+ expect(isComplex).toBe(true);
316
+
317
+ // Permission checker should also reject
318
+ const checker = new BashPermissionChecker({ allow: ['*'], deny: [] });
319
+ const permissionResult = checker.check(command);
320
+ expect(permissionResult.allowed).toBe(false);
321
+ expect(permissionResult.reason).toContain('Complex shell commands');
322
+ }
323
+ });
324
+ });