@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,146 @@
1
+ use std::fs;
2
+ use std::process::Command;
3
+
4
+ use probe_code::extract::{handle_extract, ExtractOptions};
5
+
6
+ #[test]
7
+ fn test_deduplication_of_nested_extractions() {
8
+ // Create a temporary file with nested structures for testing
9
+ let temp_dir = tempfile::tempdir().unwrap();
10
+ let file_path = temp_dir.path().join("nested_test.rs");
11
+ let content = r#"
12
+ fn outer_function() {
13
+ let x = 10;
14
+
15
+ // This is a nested function that should be deduplicated
16
+ fn inner_function() {
17
+ let y = 20;
18
+ println!("Inner function: {}", y);
19
+ }
20
+
21
+ // Call the inner function
22
+ inner_function();
23
+ println!("Outer function: {}", x);
24
+ }
25
+
26
+ fn standalone_function() {
27
+ println!("This is standalone");
28
+ }
29
+ "#;
30
+ fs::write(&file_path, content).unwrap();
31
+
32
+ // Enable debug mode to see deduplication logs
33
+ std::env::set_var("DEBUG", "1");
34
+
35
+ // Create options with both the outer function and inner function
36
+ let options = ExtractOptions {
37
+ files: vec![
38
+ format!("{}:2", file_path.to_string_lossy()), // outer function
39
+ format!("{}:6", file_path.to_string_lossy()), // inner function (should be deduplicated)
40
+ format!("{}:16", file_path.to_string_lossy()), // standalone function
41
+ ],
42
+ custom_ignores: vec![],
43
+ context_lines: 0,
44
+ format: "plain".to_string(),
45
+ from_clipboard: false,
46
+ input_file: None,
47
+ to_clipboard: false,
48
+ dry_run: true, // Use dry run to avoid actual output
49
+ diff: false,
50
+ allow_tests: true,
51
+ keep_input: false,
52
+ prompt: None,
53
+ instructions: None,
54
+ no_gitignore: false,
55
+ };
56
+
57
+ // Call handle_extract
58
+ handle_extract(options).unwrap();
59
+
60
+ // Clean up environment variable
61
+ std::env::remove_var("DEBUG");
62
+
63
+ // The test passes if it runs without panicking
64
+ // The actual verification is done by manual inspection of the debug output
65
+ // which will show the nested duplicate being removed
66
+ }
67
+
68
+ #[test]
69
+ fn test_deduplication_with_command_line_integration() {
70
+ // Create a temporary file with nested structures for testing
71
+ let temp_dir = tempfile::tempdir().unwrap();
72
+ let file_path = temp_dir.path().join("nested_test.rs");
73
+ let content = r#"
74
+ fn outer_function() {
75
+ let x = 10;
76
+
77
+ // This is a nested function that should be deduplicated
78
+ fn inner_function() {
79
+ let y = 20;
80
+ println!("Inner function: {}", y);
81
+ }
82
+
83
+ // Call the inner function
84
+ inner_function();
85
+ println!("Outer function: {}", x);
86
+ }
87
+
88
+ fn standalone_function() {
89
+ println!("This is standalone");
90
+ }
91
+ "#;
92
+ fs::write(&file_path, content).unwrap();
93
+
94
+ // Get the project root directory (where Cargo.toml is)
95
+ let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
96
+
97
+ // Run the extract command with both the outer function and inner function
98
+ let output = Command::new("cargo")
99
+ .args([
100
+ "run",
101
+ "--manifest-path",
102
+ project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
103
+ "--",
104
+ "extract",
105
+ &format!("{}:2", file_path.to_string_lossy()), // outer function
106
+ &format!("{}:6", file_path.to_string_lossy()), // inner function (should be deduplicated)
107
+ "--allow-tests",
108
+ "--format",
109
+ "json",
110
+ ])
111
+ .env("DEBUG", "1")
112
+ .output()
113
+ .expect("Failed to execute command");
114
+
115
+ // Check that the command executed successfully
116
+ assert!(output.status.success(), "Command failed to execute");
117
+
118
+ // Get the output as a string
119
+ let stdout = String::from_utf8_lossy(&output.stdout);
120
+ let stderr = String::from_utf8_lossy(&output.stderr);
121
+
122
+ // Print the output for debugging
123
+ println!("Command stdout: {stdout}");
124
+ println!("Command stderr: {stderr}");
125
+
126
+ // Check for deduplication logs in stdout (not stderr)
127
+ assert!(
128
+ stdout.contains("Before deduplication:") && stdout.contains("After deduplication:"),
129
+ "Deduplication logs not found in output"
130
+ );
131
+
132
+ // The deduplication is working correctly, as we can see in the logs
133
+ // Let's verify that the output contains only one result
134
+
135
+ // Check that the output contains the outer function but not the inner function as a separate result
136
+ assert!(
137
+ stdout.contains("\"count\": 1"),
138
+ "Should only have one result after deduplication"
139
+ );
140
+ assert!(
141
+ stdout.contains("outer_function"),
142
+ "Output should contain the outer function"
143
+ );
144
+
145
+ // Success! The deduplication is working correctly
146
+ }
@@ -0,0 +1,84 @@
1
+ use std::fs;
2
+ use std::process::Command;
3
+ use tempfile::TempDir;
4
+
5
+ #[test]
6
+ fn test_extract_command_with_input_file() {
7
+ // Create a temporary directory for our test files
8
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
9
+
10
+ // Create a test source file with simple content
11
+ let source_file_path = temp_dir.path().join("test_source.rs");
12
+ let source_content = r#"
13
+ fn main() {
14
+ println!("Hello, world!");
15
+ }
16
+ "#;
17
+ fs::write(&source_file_path, source_content).unwrap();
18
+
19
+ // Create an input file that contains the path to the source file
20
+ let input_file_path = temp_dir.path().join("input.txt");
21
+ fs::write(
22
+ &input_file_path,
23
+ source_file_path.to_string_lossy().as_bytes(),
24
+ )
25
+ .unwrap();
26
+
27
+ // Get the project root directory (where Cargo.toml is)
28
+ let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
29
+
30
+ // Run the extract command with --help to verify the new option exists
31
+ let help_output = Command::new("cargo")
32
+ .args([
33
+ "run",
34
+ "--manifest-path",
35
+ project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
36
+ "--",
37
+ "extract",
38
+ "--help",
39
+ ])
40
+ .output()
41
+ .expect("Failed to execute help command");
42
+
43
+ // Check that the help output includes the new option
44
+ let help_text = String::from_utf8_lossy(&help_output.stdout);
45
+ assert!(
46
+ help_text.contains("-F, --input-file"),
47
+ "Help text should include the new --input-file option"
48
+ );
49
+ }
50
+
51
+ #[test]
52
+ fn test_extract_command_with_nonexistent_input_file() {
53
+ // Get the project root directory (where Cargo.toml is)
54
+ let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
55
+
56
+ // Run the extract command with a nonexistent input file
57
+ let output = Command::new("cargo")
58
+ .args([
59
+ "run",
60
+ "--manifest-path",
61
+ project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
62
+ "--",
63
+ "extract",
64
+ "--input-file",
65
+ "nonexistent_file.txt",
66
+ ])
67
+ .output()
68
+ .expect("Failed to execute command");
69
+
70
+ // The command should fail
71
+ assert!(
72
+ !output.status.success(),
73
+ "Command should fail with nonexistent file"
74
+ );
75
+
76
+ // Get the error output as a string
77
+ let stderr = String::from_utf8_lossy(&output.stderr);
78
+
79
+ // The error should mention the nonexistent file
80
+ assert!(
81
+ stderr.contains("nonexistent_file.txt"),
82
+ "Error should mention the nonexistent file"
83
+ );
84
+ }
@@ -0,0 +1,102 @@
1
+ use std::fs;
2
+ use std::process::Command;
3
+
4
+ #[test]
5
+ fn test_extract_with_prompt_and_instructions() {
6
+ // Create a temporary file for testing
7
+ let temp_dir = tempfile::tempdir().unwrap();
8
+ let file_path = temp_dir.path().join("test_file.rs");
9
+ let content = r#"
10
+ fn test() {
11
+ println!("Hello, world!");
12
+ }
13
+ "#;
14
+ fs::write(&file_path, content).unwrap();
15
+
16
+ // Get the project root directory (where Cargo.toml is)
17
+ let project_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
18
+
19
+ // Run the extract command with prompt and instructions
20
+ let output = Command::new("cargo")
21
+ .args([
22
+ "run",
23
+ "--manifest-path",
24
+ project_dir.join("Cargo.toml").to_string_lossy().as_ref(),
25
+ "--",
26
+ "extract",
27
+ file_path.to_string_lossy().as_ref(),
28
+ "--format",
29
+ "json",
30
+ "--prompt",
31
+ "engineer",
32
+ "--instructions",
33
+ "Explain what this function does",
34
+ "--allow-tests", // Add this flag to ensure test files are included
35
+ ])
36
+ .output()
37
+ .expect("Failed to execute command");
38
+
39
+ // Check that the command executed successfully
40
+ assert!(output.status.success(), "Command failed to execute");
41
+
42
+ // Get the output as a string
43
+ let stdout = String::from_utf8_lossy(&output.stdout);
44
+
45
+ // Helper function to extract JSON from command output
46
+ fn extract_json_from_output(output: &str) -> &str {
47
+ // Find the first occurrence of '{'
48
+ if let Some(start_index) = output.find('{') {
49
+ // Return the substring from the first '{' to the end
50
+ &output[start_index..]
51
+ } else {
52
+ // If no '{' is found, return the original string
53
+ output
54
+ }
55
+ }
56
+
57
+ // Extract and parse the JSON
58
+ let json_str = extract_json_from_output(&stdout);
59
+ let json_value: serde_json::Value =
60
+ serde_json::from_str(json_str).expect("Failed to parse JSON output");
61
+
62
+ // Validate the structure of the JSON output
63
+ assert!(json_value.is_object(), "JSON output should be an object");
64
+ assert!(
65
+ json_value.get("results").is_some(),
66
+ "JSON output should have a 'results' field"
67
+ );
68
+
69
+ // Validate the results array
70
+ let results = json_value.get("results").unwrap().as_array().unwrap();
71
+ assert!(!results.is_empty(), "Results array should not be empty");
72
+
73
+ // Check for system_prompt field at the top level
74
+ assert!(
75
+ json_value.get("system_prompt").is_some(),
76
+ "JSON output should have a 'system_prompt' field"
77
+ );
78
+ let system_prompt = json_value.get("system_prompt").unwrap().as_str().unwrap();
79
+ assert!(
80
+ system_prompt.contains("senior software engineer"),
81
+ "System prompt should contain the engineer template"
82
+ );
83
+
84
+ // Check for user_instructions field at the top level
85
+ assert!(
86
+ json_value.get("user_instructions").is_some(),
87
+ "JSON output should have a 'user_instructions' field"
88
+ );
89
+ let user_instructions = json_value
90
+ .get("user_instructions")
91
+ .unwrap()
92
+ .as_str()
93
+ .unwrap();
94
+ assert_eq!(
95
+ user_instructions, "Explain what this function does",
96
+ "User instructions should match the input"
97
+ );
98
+ assert_eq!(
99
+ user_instructions, "Explain what this function does",
100
+ "User instructions should match the input"
101
+ );
102
+ }
@@ -0,0 +1,96 @@
1
+ use probe_code::search::elastic_query;
2
+ use probe_code::search::filters::SearchFilters;
3
+ use std::path::PathBuf;
4
+
5
+ #[test]
6
+ fn test_filename_directive_extraction() {
7
+ // Test explicit filename: directive
8
+ let query = "filename:\"SWE_TASK.txt\"";
9
+ let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
10
+ let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
11
+
12
+ // Check that filename filter was extracted
13
+ assert_eq!(filters.exact_filenames.len(), 1);
14
+ assert_eq!(filters.exact_filenames[0], "SWE_TASK.txt");
15
+
16
+ // Should have no content search since only filename was specified
17
+ assert!(simplified_ast.is_none());
18
+
19
+ // Test that the filter matches the file
20
+ assert!(filters.matches_file(&PathBuf::from("SWE_TASK.txt")));
21
+ assert!(filters.matches_file(&PathBuf::from("path/to/SWE_TASK.txt")));
22
+ assert!(!filters.matches_file(&PathBuf::from("OTHER_FILE.txt")));
23
+ }
24
+
25
+ #[test]
26
+ fn test_filename_auto_detection() {
27
+ // Test auto-detection of filename-like terms
28
+ let query = "\"config.json\"";
29
+ let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
30
+ let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
31
+
32
+ // Should auto-detect as filename
33
+ assert_eq!(filters.exact_filenames.len(), 1);
34
+ assert_eq!(filters.exact_filenames[0], "config.json");
35
+ assert!(simplified_ast.is_none());
36
+
37
+ // Test that the filter works
38
+ assert!(filters.matches_file(&PathBuf::from("config.json")));
39
+ assert!(filters.matches_file(&PathBuf::from("src/config.json")));
40
+ assert!(!filters.matches_file(&PathBuf::from("data.xml")));
41
+ }
42
+
43
+ #[test]
44
+ fn test_filename_or_query() {
45
+ // Test OR query with multiple filenames
46
+ let query = "\"SWE_TASK.txt\" OR \"swebench_problem.json\"";
47
+ let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
48
+ let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
49
+
50
+ // Both should be detected as filenames
51
+ assert_eq!(filters.exact_filenames.len(), 2);
52
+ assert!(filters
53
+ .exact_filenames
54
+ .contains(&"SWE_TASK.txt".to_string()));
55
+ assert!(filters
56
+ .exact_filenames
57
+ .contains(&"swebench_problem.json".to_string()));
58
+ assert!(simplified_ast.is_none());
59
+
60
+ // Test that filters match both files
61
+ assert!(filters.matches_file(&PathBuf::from("SWE_TASK.txt")));
62
+ assert!(filters.matches_file(&PathBuf::from("swebench_problem.json")));
63
+ assert!(!filters.matches_file(&PathBuf::from("other.md")));
64
+ }
65
+
66
+ #[test]
67
+ fn test_filename_and_content_query() {
68
+ // Test AND query with filename and content search
69
+ let query = "\"task.txt\" AND error";
70
+ let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
71
+ let (filters, simplified_ast) = SearchFilters::extract_and_simplify_with_autodetect(ast);
72
+
73
+ // Filename should be extracted as filter
74
+ assert_eq!(filters.exact_filenames.len(), 1);
75
+ assert_eq!(filters.exact_filenames[0], "task.txt");
76
+
77
+ // "error" should remain in AST for content search
78
+ assert!(simplified_ast.is_some());
79
+
80
+ // Test filter matching
81
+ assert!(filters.matches_file(&PathBuf::from("task.txt")));
82
+ assert!(!filters.matches_file(&PathBuf::from("notes.txt")));
83
+ }
84
+
85
+ #[test]
86
+ fn test_filename_case_insensitive() {
87
+ // Test case-insensitive filename matching
88
+ let query = "filename:\"readme.md\"";
89
+ let ast = elastic_query::parse_query(query, false).expect("Failed to parse query");
90
+ let (filters, _) = SearchFilters::extract_and_simplify_with_autodetect(ast);
91
+
92
+ // Should match regardless of case
93
+ assert!(filters.matches_file(&PathBuf::from("README.md")));
94
+ assert!(filters.matches_file(&PathBuf::from("readme.md")));
95
+ assert!(filters.matches_file(&PathBuf::from("Readme.MD")));
96
+ }
@@ -0,0 +1,3 @@
1
+ // Copyright (c) Microsoft. All rights reserved.
2
+
3
+ [assembly: System.Resources.NeutralResourcesLanguage("en-US")]
@@ -0,0 +1,234 @@
1
+ use std::fs;
2
+ use std::process::Command;
3
+ use tempfile::TempDir;
4
+
5
+ /// Integration tests specifically for the GitHub files extract bug fix.
6
+ ///
7
+ /// This tests the issue where `probe extract` was incorrectly ignoring files
8
+ /// in .github directories due to substring matching on ".git".
9
+
10
+ #[test]
11
+ fn test_extract_github_workflow_file() {
12
+ let temp_dir = TempDir::new().unwrap();
13
+
14
+ // Create .github directory structure
15
+ let github_dir = temp_dir.path().join(".github");
16
+ let workflows_dir = github_dir.join("workflows");
17
+ fs::create_dir_all(&workflows_dir).unwrap();
18
+
19
+ // Create a GitHub workflow file
20
+ let workflow_file = workflows_dir.join("ci.yml");
21
+ let workflow_content = r#"name: CI Pipeline
22
+ on:
23
+ push:
24
+ branches: [ main, develop ]
25
+ pull_request:
26
+ branches: [ main ]
27
+
28
+ jobs:
29
+ test:
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@v2
33
+ - name: Run tests
34
+ run: |
35
+ echo "Running tests"
36
+ cargo test --all
37
+
38
+ - name: Check formatting
39
+ run: cargo fmt --check
40
+
41
+ build:
42
+ needs: test
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - uses: actions/checkout@v2
46
+ - name: Build
47
+ run: cargo build --release
48
+ "#;
49
+ fs::write(&workflow_file, workflow_content).unwrap();
50
+
51
+ // Test extracting the entire file
52
+ let output = Command::new(env!("CARGO_BIN_EXE_probe"))
53
+ .args(["extract", &workflow_file.to_string_lossy()])
54
+ .current_dir(temp_dir.path())
55
+ .output()
56
+ .expect("Failed to execute probe extract");
57
+
58
+ let stdout = String::from_utf8_lossy(&output.stdout);
59
+ let stderr = String::from_utf8_lossy(&output.stderr);
60
+
61
+ assert!(
62
+ output.status.success(),
63
+ "probe extract should succeed for .github files. stderr: {stderr}"
64
+ );
65
+ assert!(
66
+ stdout.contains("CI Pipeline"),
67
+ "Should extract content from GitHub workflow file. stdout: {stdout}"
68
+ );
69
+ assert!(
70
+ !stdout.contains("No results found"),
71
+ "Should not return 'No results found' for .github files"
72
+ );
73
+ }
74
+
75
+ #[test]
76
+ fn test_extract_github_workflow_with_line_range() {
77
+ let temp_dir = TempDir::new().unwrap();
78
+
79
+ // Create .github directory structure
80
+ let github_dir = temp_dir.path().join(".github");
81
+ let workflows_dir = github_dir.join("workflows");
82
+ fs::create_dir_all(&workflows_dir).unwrap();
83
+
84
+ // Create a GitHub workflow file
85
+ let workflow_file = workflows_dir.join("test.yml");
86
+ let workflow_content = r#"name: Test Workflow
87
+ on: [push]
88
+ jobs:
89
+ test:
90
+ runs-on: ubuntu-latest
91
+ steps:
92
+ - name: Checkout
93
+ uses: actions/checkout@v2
94
+ - name: Test
95
+ run: echo "testing"
96
+ "#;
97
+ fs::write(&workflow_file, workflow_content).unwrap();
98
+
99
+ // Test extracting specific lines (lines 3-7)
100
+ let file_with_range = format!("{}:3-7", workflow_file.to_string_lossy());
101
+ let output = Command::new(env!("CARGO_BIN_EXE_probe"))
102
+ .args(["extract", &file_with_range])
103
+ .current_dir(temp_dir.path())
104
+ .output()
105
+ .expect("Failed to execute probe extract with line range");
106
+
107
+ let stdout = String::from_utf8_lossy(&output.stdout);
108
+ let stderr = String::from_utf8_lossy(&output.stderr);
109
+
110
+ assert!(
111
+ output.status.success(),
112
+ "probe extract should succeed for .github files with line ranges. stderr: {stderr}"
113
+ );
114
+ assert!(
115
+ stdout.contains("jobs:"),
116
+ "Should extract the specified line range. stdout: {stdout}"
117
+ );
118
+ assert!(
119
+ stdout.contains("Lines: 3-7"),
120
+ "Should show the correct line range in output. stdout: {stdout}"
121
+ );
122
+ }
123
+
124
+ #[test]
125
+ fn test_git_directory_still_ignored() {
126
+ let temp_dir = TempDir::new().unwrap();
127
+
128
+ // Create a .git directory (should be ignored)
129
+ let git_dir = temp_dir.path().join(".git");
130
+ fs::create_dir_all(&git_dir).unwrap();
131
+ let git_config = git_dir.join("config");
132
+ fs::write(&git_config, "[core]\n repositoryformatversion = 0\n").unwrap();
133
+
134
+ // Test that .git files are still ignored
135
+ let output = Command::new(env!("CARGO_BIN_EXE_probe"))
136
+ .args(["extract", &git_config.to_string_lossy()])
137
+ .current_dir(temp_dir.path())
138
+ .output()
139
+ .expect("Failed to execute probe extract");
140
+
141
+ let stdout = String::from_utf8_lossy(&output.stdout);
142
+
143
+ // .git files should still be ignored (should return "No results found")
144
+ assert!(
145
+ stdout.contains("No results found"),
146
+ ".git directory files should still be ignored. stdout: {stdout}"
147
+ );
148
+ }
149
+
150
+ #[test]
151
+ fn test_gitignore_file_not_ignored() {
152
+ let temp_dir = TempDir::new().unwrap();
153
+
154
+ // Create a .gitignore file (should NOT be ignored)
155
+ let gitignore_file = temp_dir.path().join(".gitignore");
156
+ fs::write(&gitignore_file, "*.log\ntmp/\n*.tmp\n").unwrap();
157
+
158
+ // Test that .gitignore files are NOT ignored
159
+ let output = Command::new(env!("CARGO_BIN_EXE_probe"))
160
+ .args(["extract", &gitignore_file.to_string_lossy()])
161
+ .current_dir(temp_dir.path())
162
+ .output()
163
+ .expect("Failed to execute probe extract");
164
+
165
+ let stdout = String::from_utf8_lossy(&output.stdout);
166
+ let stderr = String::from_utf8_lossy(&output.stderr);
167
+
168
+ assert!(
169
+ output.status.success(),
170
+ "probe extract should succeed for .gitignore files. stderr: {stderr}"
171
+ );
172
+ assert!(
173
+ stdout.contains("*.log"),
174
+ "Should extract content from .gitignore file. stdout: {stdout}"
175
+ );
176
+ assert!(
177
+ !stdout.contains("No results found"),
178
+ "Should not return 'No results found' for .gitignore files"
179
+ );
180
+ }
181
+
182
+ #[test]
183
+ fn test_github_issue_template() {
184
+ let temp_dir = TempDir::new().unwrap();
185
+
186
+ // Create .github directory structure
187
+ let github_dir = temp_dir.path().join(".github");
188
+ fs::create_dir_all(&github_dir).unwrap();
189
+
190
+ // Create a GitHub issue template
191
+ let issue_template = github_dir.join("issue_template.md");
192
+ let template_content = r#"---
193
+ name: Bug report
194
+ about: Create a report to help us improve
195
+ ---
196
+
197
+ **Describe the bug**
198
+ A clear and concise description of what the bug is.
199
+
200
+ **To Reproduce**
201
+ Steps to reproduce the behavior:
202
+ 1. Go to '...'
203
+ 2. Click on '....'
204
+ 3. Scroll down to '....'
205
+ 4. See error
206
+
207
+ **Expected behavior**
208
+ A clear and concise description of what you expected to happen.
209
+ "#;
210
+ fs::write(&issue_template, template_content).unwrap();
211
+
212
+ // Test extracting the issue template
213
+ let output = Command::new(env!("CARGO_BIN_EXE_probe"))
214
+ .args(["extract", &issue_template.to_string_lossy()])
215
+ .current_dir(temp_dir.path())
216
+ .output()
217
+ .expect("Failed to execute probe extract");
218
+
219
+ let stdout = String::from_utf8_lossy(&output.stdout);
220
+ let stderr = String::from_utf8_lossy(&output.stderr);
221
+
222
+ assert!(
223
+ output.status.success(),
224
+ "probe extract should succeed for .github issue templates. stderr: {stderr}"
225
+ );
226
+ assert!(
227
+ stdout.contains("Bug report"),
228
+ "Should extract content from GitHub issue template. stdout: {stdout}"
229
+ );
230
+ assert!(
231
+ stdout.contains("Describe the bug"),
232
+ "Should extract the issue template content. stdout: {stdout}"
233
+ );
234
+ }