crackerjack 0.18.2__py3-none-any.whl → 0.45.2__py3-none-any.whl

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 (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  6. crackerjack/adapters/_output_paths.py +167 -0
  7. crackerjack/adapters/_qa_adapter_base.py +309 -0
  8. crackerjack/adapters/_tool_adapter_base.py +706 -0
  9. crackerjack/adapters/ai/README.md +65 -0
  10. crackerjack/adapters/ai/__init__.py +5 -0
  11. crackerjack/adapters/ai/claude.py +853 -0
  12. crackerjack/adapters/complexity/README.md +53 -0
  13. crackerjack/adapters/complexity/__init__.py +10 -0
  14. crackerjack/adapters/complexity/complexipy.py +641 -0
  15. crackerjack/adapters/dependency/__init__.py +22 -0
  16. crackerjack/adapters/dependency/pip_audit.py +418 -0
  17. crackerjack/adapters/format/README.md +72 -0
  18. crackerjack/adapters/format/__init__.py +11 -0
  19. crackerjack/adapters/format/mdformat.py +313 -0
  20. crackerjack/adapters/format/ruff.py +516 -0
  21. crackerjack/adapters/lint/README.md +47 -0
  22. crackerjack/adapters/lint/__init__.py +11 -0
  23. crackerjack/adapters/lint/codespell.py +273 -0
  24. crackerjack/adapters/lsp/README.md +49 -0
  25. crackerjack/adapters/lsp/__init__.py +27 -0
  26. crackerjack/adapters/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,273 @@
1
+ """Codespell adapter for ACB QA framework - spelling error detection.
2
+
3
+ Codespell checks for common spelling errors in code, comments, and documentation.
4
+ It helps maintain professional quality by catching:
5
+ - Typos in comments and docstrings
6
+ - Misspelled variable/function names
7
+ - Documentation errors
8
+ - Common spelling mistakes
9
+
10
+ ACB Patterns:
11
+ - MODULE_ID and MODULE_STATUS at module level
12
+ - depends.set() registration after class definition
13
+ - Extends BaseToolAdapter for tool execution
14
+ - Async execution with output parsing
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import typing as t
20
+ from contextlib import suppress
21
+ from pathlib import Path
22
+ from uuid import UUID, uuid4
23
+
24
+ from acb.depends import depends
25
+ from pydantic import Field
26
+
27
+ from crackerjack.adapters._tool_adapter_base import (
28
+ BaseToolAdapter,
29
+ ToolAdapterSettings,
30
+ ToolExecutionResult,
31
+ ToolIssue,
32
+ )
33
+ from crackerjack.models.qa_results import QACheckType
34
+
35
+ if t.TYPE_CHECKING:
36
+ from crackerjack.models.qa_config import QACheckConfig
37
+
38
+ # ACB Module Registration (REQUIRED)
39
+ MODULE_ID = uuid4()
40
+ MODULE_STATUS = "stable"
41
+
42
+
43
+ class CodespellSettings(ToolAdapterSettings):
44
+ """Settings for Codespell adapter."""
45
+
46
+ tool_name: str = "codespell"
47
+ use_json_output: bool = False # Codespell uses text output
48
+ fix_enabled: bool = False # Auto-fix spelling errors
49
+ skip_hidden: bool = True
50
+ ignore_words: list[str] = Field(default_factory=list)
51
+ ignore_words_file: Path | None = None
52
+ check_filenames: bool = False
53
+ quiet_level: int = 2 # Only show errors
54
+
55
+
56
+ class CodespellAdapter(BaseToolAdapter):
57
+ """Adapter for Codespell - spelling error checker.
58
+
59
+ Detects and optionally fixes common spelling mistakes:
60
+ - Comments and docstrings
61
+ - String literals
62
+ - Variable and function names (optional)
63
+ - Documentation files
64
+
65
+ Features:
66
+ - Auto-fix support
67
+ - Custom ignore words
68
+ - Configurable scanning scope
69
+ - Multiple file type support
70
+
71
+ Example:
72
+ ```python
73
+ settings = CodespellSettings(
74
+ fix_enabled=True,
75
+ ignore_words=["acb", "pydantic"],
76
+ skip_hidden=True,
77
+ )
78
+ adapter = CodespellAdapter(settings=settings)
79
+ await adapter.init()
80
+ result = await adapter.check(files=[Path("src/"), Path("docs/")])
81
+ ```
82
+ """
83
+
84
+ settings: CodespellSettings | None = None
85
+
86
+ def __init__(self, settings: CodespellSettings | None = None) -> None:
87
+ """Initialize Codespell adapter.
88
+
89
+ Args:
90
+ settings: Optional settings override
91
+ """
92
+ super().__init__(settings=settings)
93
+
94
+ async def init(self) -> None:
95
+ """Initialize adapter with default settings."""
96
+ if not self.settings:
97
+ self.settings = await CodespellSettings.create_async()
98
+ await super().init()
99
+
100
+ @property
101
+ def adapter_name(self) -> str:
102
+ """Human-readable adapter name."""
103
+ return "Codespell (Spelling)"
104
+
105
+ @property
106
+ def module_id(self) -> UUID:
107
+ """Reference to module-level MODULE_ID."""
108
+ return MODULE_ID
109
+
110
+ @property
111
+ def tool_name(self) -> str:
112
+ """CLI tool name."""
113
+ return "codespell"
114
+
115
+ def build_command(
116
+ self,
117
+ files: list[Path],
118
+ config: QACheckConfig | None = None,
119
+ ) -> list[str]:
120
+ """Build Codespell command.
121
+
122
+ Args:
123
+ files: Files/directories to check
124
+ config: Optional configuration override
125
+
126
+ Returns:
127
+ Command as list of strings
128
+ """
129
+ if not self.settings:
130
+ raise RuntimeError("Settings not initialized")
131
+
132
+ cmd = [self.tool_name]
133
+
134
+ # Auto-fix
135
+ if self.settings.fix_enabled:
136
+ cmd.append("--write-changes")
137
+
138
+ # Skip hidden files
139
+ if self.settings.skip_hidden:
140
+ cmd.append("--skip=.*")
141
+
142
+ # Ignore specific words
143
+ if self.settings.ignore_words:
144
+ cmd.extend(["--ignore-words-list", ",".join(self.settings.ignore_words)])
145
+
146
+ # Ignore words file
147
+ if self.settings.ignore_words_file and self.settings.ignore_words_file.exists():
148
+ cmd.extend(["--ignore-words", str(self.settings.ignore_words_file)])
149
+
150
+ # Check filenames
151
+ if self.settings.check_filenames:
152
+ cmd.append("--check-filenames")
153
+
154
+ # Quiet level
155
+ cmd.extend(["--quiet-level", str(self.settings.quiet_level)])
156
+
157
+ # Add targets
158
+ cmd.extend([str(f) for f in files])
159
+
160
+ return cmd
161
+
162
+ def _parse_codespell_line(
163
+ self, line: str
164
+ ) -> tuple[Path | None, int | None, str, str | None] | None:
165
+ """Parse a single line from codespell output.
166
+
167
+ Args:
168
+ line: A line from codespell output
169
+
170
+ Returns:
171
+ Tuple of (file_path, line_number, message, suggestion) or None if parsing fails
172
+ """
173
+ # Codespell format: "file.py:10: tyop ==> typo"
174
+ if ":" not in line or "==>" not in line:
175
+ return None
176
+
177
+ parts = line.split(":", maxsplit=2)
178
+ if len(parts) < 2:
179
+ return None
180
+
181
+ file_path = Path(parts[0].strip())
182
+ line_number = int(parts[1].strip()) if parts[1].strip().isdigit() else None
183
+
184
+ # Parse error and suggestion
185
+ error_part = parts[2].strip() if len(parts) > 2 else line
186
+ if "==>" in error_part:
187
+ wrong, correct = error_part.split("==>", maxsplit=1)
188
+ wrong = wrong.strip()
189
+ correct = correct.strip()
190
+
191
+ message = f"Spelling: '{wrong}' should be '{correct}'"
192
+ suggestion = f"Replace '{wrong}' with '{correct}'"
193
+ else:
194
+ message = error_part
195
+ suggestion = None
196
+
197
+ return file_path, line_number, message, suggestion
198
+
199
+ async def parse_output(
200
+ self,
201
+ result: ToolExecutionResult,
202
+ ) -> list[ToolIssue]:
203
+ """Parse Codespell text output into standardized issues.
204
+
205
+ Args:
206
+ result: Raw execution result from Codespell
207
+
208
+ Returns:
209
+ List of parsed issues
210
+ """
211
+ if not result.raw_output:
212
+ return []
213
+
214
+ issues = []
215
+ lines = result.raw_output.strip().split("\n")
216
+
217
+ for line in lines:
218
+ parsed_result = self._parse_codespell_line(line)
219
+ if parsed_result is not None:
220
+ file_path, line_number, message, suggestion = parsed_result
221
+
222
+ issue = ToolIssue(
223
+ file_path=file_path,
224
+ line_number=line_number,
225
+ message=message,
226
+ code="SPELLING",
227
+ severity="warning",
228
+ suggestion=suggestion,
229
+ )
230
+ issues.append(issue)
231
+
232
+ return issues
233
+
234
+ def _get_check_type(self) -> QACheckType:
235
+ """Return format check type."""
236
+ return QACheckType.FORMAT
237
+
238
+ def get_default_config(self) -> QACheckConfig:
239
+ """Get default configuration for Codespell adapter.
240
+
241
+ Returns:
242
+ QACheckConfig with sensible defaults
243
+ """
244
+ from crackerjack.models.qa_config import QACheckConfig
245
+
246
+ return QACheckConfig(
247
+ check_id=MODULE_ID,
248
+ check_name=self.adapter_name,
249
+ check_type=QACheckType.FORMAT,
250
+ enabled=True,
251
+ file_patterns=["**/*.py", "**/*.md", "**/*.rst", "**/*.txt"],
252
+ exclude_patterns=[
253
+ "**/.git/**",
254
+ "**/.venv/**",
255
+ "**/node_modules/**",
256
+ "**/__pycache__/**",
257
+ ],
258
+ timeout_seconds=60,
259
+ is_formatter=False, # Only checks, doesn't format
260
+ parallel_safe=True,
261
+ stage="fast", # Spelling checks in fast stage
262
+ settings={
263
+ "fix_enabled": False,
264
+ "skip_hidden": True,
265
+ "ignore_words": ["acb", "pydantic", "uuid"],
266
+ "check_filenames": False,
267
+ },
268
+ )
269
+
270
+
271
+ # ACB Registration (REQUIRED at module level)
272
+ with suppress(Exception):
273
+ depends.set(CodespellAdapter)
@@ -0,0 +1,49 @@
1
+ > Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [LSP](<./README.md>)
2
+
3
+ # LSP Adapters
4
+
5
+ Rust-backed tools with Language Server Protocol integration for fast, incremental diagnostics.
6
+
7
+ ## Overview
8
+
9
+ - Shared base (`_base.py`) defines `Issue`/`ToolResult` and adapter protocol
10
+ - Optional LSP paths for low-latency diagnostics, with CLI fallback
11
+ - Useful for continuous analysis in editors and orchestrated runs
12
+
13
+ ## Built-in Implementations
14
+
15
+ | Module | Description | LSP | Status |
16
+ | ------ | ----------- | --- | ------ |
17
+ | `zuban.py` | Ultra-fast Python type checking with LSP and CLI fallback | Yes | Stable |
18
+ | `skylos.py` | Dead code detection with JSON/text parsing | N/A | Stable |
19
+
20
+ Support modules:
21
+
22
+ - `_client.py` — Optimized Zuban LSP client wrapper
23
+ - `_manager.py` — LSP process and workspace lifecycle helpers
24
+ - `_base.py` — Common protocol types and base adapter
25
+
26
+ ## Zuban (LSP) Usage
27
+
28
+ ```python
29
+ from pathlib import Path
30
+ from crackerjack.adapters.lsp.zuban import ZubanAdapter
31
+
32
+
33
+ async def typecheck_with_lsp(ctx) -> None:
34
+ adapter = ZubanAdapter(context=ctx, strict_mode=True, use_lsp=True)
35
+ result = await adapter.check_with_lsp_or_fallback([Path("src/")])
36
+ print("errors:", result.error_count, "warnings:", result.warning_count)
37
+ ```
38
+
39
+ CLI helpers are available to manage Zuban LSP via `python -m crackerjack` options (start/stop/restart).
40
+
41
+ ## Notes
42
+
43
+ - LSP improves iteration speed; adapters transparently fall back to CLI
44
+ - Some Zuban builds may have TOML parsing issues; health checks guard usage
45
+
46
+ ## Related
47
+
48
+ - [Type](<../type/README.md>) — Non-LSP type checkers and settings
49
+ - [Refactor](<../refactor/README.md>) — Skylos-based dead code detection
@@ -0,0 +1,27 @@
1
+ """LSP adapter consolidation for Rust-based analysis tools.
2
+
3
+ This module consolidates all LSP-related adapter functionality:
4
+ - Zuban: Type checking with LSP integration
5
+ - Skylos: Dead code detection
6
+ - Base protocols and tool result structures
7
+ - Manager for coordinating multiple tools
8
+ """
9
+
10
+ from ._base import BaseRustToolAdapter, Issue, RustToolAdapter, ToolResult
11
+ from ._client import ZubanLSPClient
12
+ from ._manager import RustToolHookManager
13
+ from .skylos import DeadCodeIssue, SkylosAdapter
14
+ from .zuban import TypeIssue, ZubanAdapter
15
+
16
+ __all__ = [
17
+ "RustToolAdapter",
18
+ "BaseRustToolAdapter",
19
+ "ToolResult",
20
+ "Issue",
21
+ "SkylosAdapter",
22
+ "DeadCodeIssue",
23
+ "ZubanAdapter",
24
+ "TypeIssue",
25
+ "RustToolHookManager",
26
+ "ZubanLSPClient",
27
+ ]
@@ -0,0 +1,194 @@
1
+ """Base protocol and classes for Rust tool integration."""
2
+
3
+ import json
4
+ import typing as t
5
+ from abc import ABC, abstractmethod
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+ from typing import Protocol
9
+
10
+ if t.TYPE_CHECKING:
11
+ from crackerjack.orchestration.execution_strategies import ExecutionContext
12
+
13
+
14
+ @dataclass
15
+ class Issue:
16
+ """Base class for tool issues."""
17
+
18
+ file_path: Path
19
+ line_number: int
20
+ message: str
21
+ severity: str = "error"
22
+
23
+ def to_dict(self) -> dict[str, t.Any]:
24
+ """Convert issue to dictionary."""
25
+ return {
26
+ "file_path": str(self.file_path),
27
+ "line_number": self.line_number,
28
+ "message": self.message,
29
+ "severity": self.severity,
30
+ }
31
+
32
+
33
+ @dataclass
34
+ class ToolResult:
35
+ """Unified result format for all Rust tools."""
36
+
37
+ success: bool
38
+ issues: list[Issue] = field(default_factory=list)
39
+ error: str | None = None
40
+ raw_output: str = ""
41
+ execution_time: float = 0.0
42
+ tool_version: str | None = None
43
+ _execution_mode: str | None = None
44
+
45
+ @property
46
+ def has_errors(self) -> bool:
47
+ """Check if result contains error-level issues."""
48
+ return any(issue.severity == "error" for issue in self.issues)
49
+
50
+ @property
51
+ def error_count(self) -> int:
52
+ """Count of error-level issues."""
53
+ return len([i for i in self.issues if i.severity == "error"])
54
+
55
+ @property
56
+ def warning_count(self) -> int:
57
+ """Count of warning-level issues."""
58
+ return len([i for i in self.issues if i.severity == "warning"])
59
+
60
+ def to_dict(self) -> dict[str, t.Any]:
61
+ """Convert result to dictionary."""
62
+ return {
63
+ "success": self.success,
64
+ "issues": [issue.to_dict() for issue in self.issues],
65
+ "error": self.error,
66
+ "raw_output": self.raw_output,
67
+ "execution_time": self.execution_time,
68
+ "tool_version": self.tool_version,
69
+ "error_count": self.error_count,
70
+ "warning_count": self.warning_count,
71
+ }
72
+
73
+
74
+ class RustToolAdapter(Protocol):
75
+ """Protocol for Rust-based analysis tools."""
76
+
77
+ def __init__(self, context: "ExecutionContext") -> None:
78
+ """Initialize adapter with execution context."""
79
+ ...
80
+
81
+ def get_command_args(self, target_files: list[Path]) -> list[str]:
82
+ """Get command arguments for tool execution."""
83
+ ...
84
+
85
+ def parse_output(self, output: str) -> ToolResult:
86
+ """Parse tool output into standardized result."""
87
+ ...
88
+
89
+ def supports_json_output(self) -> bool:
90
+ """Check if tool supports JSON output mode."""
91
+ ...
92
+
93
+ def get_tool_version(self) -> str | None:
94
+ """Get tool version if available."""
95
+ ...
96
+
97
+ def validate_tool_available(self) -> bool:
98
+ """Validate that the tool is available and executable."""
99
+ ...
100
+
101
+
102
+ class BaseRustToolAdapter(ABC):
103
+ """Abstract base implementation of RustToolAdapter."""
104
+
105
+ def __init__(self, context: "ExecutionContext") -> None:
106
+ """Initialize adapter with execution context."""
107
+ self.context = context
108
+ self._tool_version: str | None = None
109
+
110
+ @abstractmethod
111
+ def get_command_args(self, target_files: list[Path]) -> list[str]:
112
+ """Get command arguments for tool execution."""
113
+ pass
114
+
115
+ @abstractmethod
116
+ def parse_output(self, output: str) -> ToolResult:
117
+ """Parse tool output into standardized result."""
118
+ pass
119
+
120
+ @abstractmethod
121
+ def supports_json_output(self) -> bool:
122
+ """Check if tool supports JSON output mode."""
123
+ pass
124
+
125
+ @abstractmethod
126
+ def get_tool_name(self) -> str:
127
+ """Get the name of the tool."""
128
+ pass
129
+
130
+ def get_tool_version(self) -> str | None:
131
+ """Get tool version if available."""
132
+ if self._tool_version is None:
133
+ self._tool_version = self._fetch_tool_version()
134
+ return self._tool_version
135
+
136
+ def validate_tool_available(self) -> bool:
137
+ """Validate that the tool is available and executable."""
138
+ import subprocess
139
+
140
+ tool_name = self.get_tool_name()
141
+ try:
142
+ result = subprocess.run(
143
+ ["which", tool_name], capture_output=True, text=True, check=False
144
+ )
145
+ return result.returncode == 0
146
+ except (subprocess.SubprocessError, FileNotFoundError):
147
+ return False
148
+
149
+ def _fetch_tool_version(self) -> str | None:
150
+ """Fetch tool version from command line."""
151
+ import subprocess
152
+
153
+ tool_name = self.get_tool_name()
154
+ try:
155
+ result = subprocess.run(
156
+ [tool_name, "--version"],
157
+ capture_output=True,
158
+ text=True,
159
+ check=True,
160
+ timeout=10,
161
+ )
162
+ return result.stdout.strip().split("\\n")[0]
163
+ except (
164
+ subprocess.SubprocessError,
165
+ FileNotFoundError,
166
+ subprocess.TimeoutExpired,
167
+ ):
168
+ return None
169
+
170
+ def _should_use_json_output(self) -> bool:
171
+ """Determine if JSON output should be used based on context."""
172
+ return self.supports_json_output() and (
173
+ self.context.ai_agent_mode or self.context.ai_debug_mode
174
+ )
175
+
176
+ def _parse_json_output_safe(self, output: str) -> dict[str, t.Any] | None:
177
+ """Safely parse JSON output with error handling."""
178
+ try:
179
+ json_result = json.loads(output)
180
+ return t.cast(dict[str, t.Any] | None, json_result)
181
+ except json.JSONDecodeError:
182
+ # Log the error but don't fail completely
183
+ return None
184
+
185
+ def _create_error_result(
186
+ self, error_message: str, raw_output: str = ""
187
+ ) -> ToolResult:
188
+ """Create a ToolResult for error conditions."""
189
+ return ToolResult(
190
+ success=False,
191
+ error=error_message,
192
+ raw_output=raw_output,
193
+ tool_version=self.get_tool_version(),
194
+ )