crackerjack 0.37.9__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 (425) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +30 -1
  3. crackerjack/__main__.py +342 -1263
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +27 -5
  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/{rust_tool_manager.py → lsp/_manager.py} +3 -3
  27. crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
  28. crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
  29. crackerjack/adapters/refactor/README.md +59 -0
  30. crackerjack/adapters/refactor/__init__.py +12 -0
  31. crackerjack/adapters/refactor/creosote.py +318 -0
  32. crackerjack/adapters/refactor/refurb.py +406 -0
  33. crackerjack/adapters/refactor/skylos.py +494 -0
  34. crackerjack/adapters/sast/README.md +132 -0
  35. crackerjack/adapters/sast/__init__.py +32 -0
  36. crackerjack/adapters/sast/_base.py +201 -0
  37. crackerjack/adapters/sast/bandit.py +423 -0
  38. crackerjack/adapters/sast/pyscn.py +405 -0
  39. crackerjack/adapters/sast/semgrep.py +241 -0
  40. crackerjack/adapters/security/README.md +111 -0
  41. crackerjack/adapters/security/__init__.py +17 -0
  42. crackerjack/adapters/security/gitleaks.py +339 -0
  43. crackerjack/adapters/type/README.md +52 -0
  44. crackerjack/adapters/type/__init__.py +12 -0
  45. crackerjack/adapters/type/pyrefly.py +402 -0
  46. crackerjack/adapters/type/ty.py +402 -0
  47. crackerjack/adapters/type/zuban.py +522 -0
  48. crackerjack/adapters/utility/README.md +51 -0
  49. crackerjack/adapters/utility/__init__.py +10 -0
  50. crackerjack/adapters/utility/checks.py +884 -0
  51. crackerjack/agents/README.md +264 -0
  52. crackerjack/agents/__init__.py +40 -12
  53. crackerjack/agents/base.py +1 -0
  54. crackerjack/agents/claude_code_bridge.py +641 -0
  55. crackerjack/agents/coordinator.py +49 -53
  56. crackerjack/agents/dry_agent.py +187 -3
  57. crackerjack/agents/enhanced_coordinator.py +279 -0
  58. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  59. crackerjack/agents/error_middleware.py +53 -0
  60. crackerjack/agents/formatting_agent.py +6 -8
  61. crackerjack/agents/helpers/__init__.py +9 -0
  62. crackerjack/agents/helpers/performance/__init__.py +22 -0
  63. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  64. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  65. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  66. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  67. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  68. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  69. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  70. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  71. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  72. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  73. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  74. crackerjack/agents/performance_agent.py +121 -1152
  75. crackerjack/agents/refactoring_agent.py +156 -655
  76. crackerjack/agents/semantic_agent.py +479 -0
  77. crackerjack/agents/semantic_helpers.py +356 -0
  78. crackerjack/agents/test_creation_agent.py +19 -1605
  79. crackerjack/api.py +5 -7
  80. crackerjack/cli/README.md +394 -0
  81. crackerjack/cli/__init__.py +1 -1
  82. crackerjack/cli/cache_handlers.py +23 -18
  83. crackerjack/cli/cache_handlers_enhanced.py +1 -4
  84. crackerjack/cli/facade.py +70 -8
  85. crackerjack/cli/formatting.py +13 -0
  86. crackerjack/cli/handlers/__init__.py +85 -0
  87. crackerjack/cli/handlers/advanced.py +103 -0
  88. crackerjack/cli/handlers/ai_features.py +62 -0
  89. crackerjack/cli/handlers/analytics.py +479 -0
  90. crackerjack/cli/handlers/changelog.py +271 -0
  91. crackerjack/cli/handlers/config_handlers.py +16 -0
  92. crackerjack/cli/handlers/coverage.py +84 -0
  93. crackerjack/cli/handlers/documentation.py +280 -0
  94. crackerjack/cli/handlers/main_handlers.py +497 -0
  95. crackerjack/cli/handlers/monitoring.py +371 -0
  96. crackerjack/cli/handlers.py +249 -49
  97. crackerjack/cli/interactive.py +8 -5
  98. crackerjack/cli/options.py +203 -110
  99. crackerjack/cli/semantic_handlers.py +292 -0
  100. crackerjack/cli/version.py +19 -0
  101. crackerjack/code_cleaner.py +60 -24
  102. crackerjack/config/README.md +472 -0
  103. crackerjack/config/__init__.py +256 -0
  104. crackerjack/config/global_lock_config.py +191 -54
  105. crackerjack/config/hooks.py +188 -16
  106. crackerjack/config/loader.py +239 -0
  107. crackerjack/config/settings.py +141 -0
  108. crackerjack/config/tool_commands.py +331 -0
  109. crackerjack/core/README.md +393 -0
  110. crackerjack/core/async_workflow_orchestrator.py +79 -53
  111. crackerjack/core/autofix_coordinator.py +22 -9
  112. crackerjack/core/container.py +10 -9
  113. crackerjack/core/enhanced_container.py +9 -9
  114. crackerjack/core/performance.py +1 -1
  115. crackerjack/core/performance_monitor.py +5 -3
  116. crackerjack/core/phase_coordinator.py +1018 -634
  117. crackerjack/core/proactive_workflow.py +3 -3
  118. crackerjack/core/retry.py +275 -0
  119. crackerjack/core/service_watchdog.py +167 -23
  120. crackerjack/core/session_coordinator.py +187 -382
  121. crackerjack/core/timeout_manager.py +161 -44
  122. crackerjack/core/workflow/__init__.py +21 -0
  123. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  124. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  125. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  126. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  127. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  128. crackerjack/core/workflow_orchestrator.py +1247 -953
  129. crackerjack/data/README.md +11 -0
  130. crackerjack/data/__init__.py +8 -0
  131. crackerjack/data/models.py +79 -0
  132. crackerjack/data/repository.py +210 -0
  133. crackerjack/decorators/README.md +180 -0
  134. crackerjack/decorators/__init__.py +35 -0
  135. crackerjack/decorators/error_handling.py +649 -0
  136. crackerjack/decorators/error_handling_decorators.py +334 -0
  137. crackerjack/decorators/helpers.py +58 -0
  138. crackerjack/decorators/patterns.py +281 -0
  139. crackerjack/decorators/utils.py +58 -0
  140. crackerjack/docs/README.md +11 -0
  141. crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
  142. crackerjack/documentation/README.md +11 -0
  143. crackerjack/documentation/ai_templates.py +1 -1
  144. crackerjack/documentation/dual_output_generator.py +11 -9
  145. crackerjack/documentation/reference_generator.py +104 -59
  146. crackerjack/dynamic_config.py +52 -61
  147. crackerjack/errors.py +1 -1
  148. crackerjack/events/README.md +11 -0
  149. crackerjack/events/__init__.py +16 -0
  150. crackerjack/events/telemetry.py +175 -0
  151. crackerjack/events/workflow_bus.py +346 -0
  152. crackerjack/exceptions/README.md +301 -0
  153. crackerjack/exceptions/__init__.py +5 -0
  154. crackerjack/exceptions/config.py +4 -0
  155. crackerjack/exceptions/tool_execution_error.py +245 -0
  156. crackerjack/executors/README.md +591 -0
  157. crackerjack/executors/__init__.py +2 -0
  158. crackerjack/executors/async_hook_executor.py +539 -77
  159. crackerjack/executors/cached_hook_executor.py +3 -3
  160. crackerjack/executors/hook_executor.py +967 -102
  161. crackerjack/executors/hook_lock_manager.py +31 -22
  162. crackerjack/executors/individual_hook_executor.py +66 -32
  163. crackerjack/executors/lsp_aware_hook_executor.py +136 -57
  164. crackerjack/executors/progress_hook_executor.py +282 -0
  165. crackerjack/executors/tool_proxy.py +23 -7
  166. crackerjack/hooks/README.md +485 -0
  167. crackerjack/hooks/lsp_hook.py +8 -9
  168. crackerjack/intelligence/README.md +557 -0
  169. crackerjack/interactive.py +37 -10
  170. crackerjack/managers/README.md +369 -0
  171. crackerjack/managers/async_hook_manager.py +41 -57
  172. crackerjack/managers/hook_manager.py +449 -79
  173. crackerjack/managers/publish_manager.py +81 -36
  174. crackerjack/managers/test_command_builder.py +290 -12
  175. crackerjack/managers/test_executor.py +93 -8
  176. crackerjack/managers/test_manager.py +1082 -75
  177. crackerjack/managers/test_progress.py +118 -26
  178. crackerjack/mcp/README.md +374 -0
  179. crackerjack/mcp/cache.py +25 -2
  180. crackerjack/mcp/client_runner.py +35 -18
  181. crackerjack/mcp/context.py +9 -9
  182. crackerjack/mcp/dashboard.py +24 -8
  183. crackerjack/mcp/enhanced_progress_monitor.py +34 -23
  184. crackerjack/mcp/file_monitor.py +27 -6
  185. crackerjack/mcp/progress_components.py +45 -34
  186. crackerjack/mcp/progress_monitor.py +6 -9
  187. crackerjack/mcp/rate_limiter.py +11 -7
  188. crackerjack/mcp/server.py +2 -0
  189. crackerjack/mcp/server_core.py +187 -55
  190. crackerjack/mcp/service_watchdog.py +12 -9
  191. crackerjack/mcp/task_manager.py +2 -2
  192. crackerjack/mcp/tools/README.md +27 -0
  193. crackerjack/mcp/tools/__init__.py +2 -0
  194. crackerjack/mcp/tools/core_tools.py +75 -52
  195. crackerjack/mcp/tools/execution_tools.py +87 -31
  196. crackerjack/mcp/tools/intelligence_tools.py +2 -2
  197. crackerjack/mcp/tools/proactive_tools.py +1 -1
  198. crackerjack/mcp/tools/semantic_tools.py +584 -0
  199. crackerjack/mcp/tools/utility_tools.py +180 -132
  200. crackerjack/mcp/tools/workflow_executor.py +87 -46
  201. crackerjack/mcp/websocket/README.md +31 -0
  202. crackerjack/mcp/websocket/app.py +11 -1
  203. crackerjack/mcp/websocket/event_bridge.py +188 -0
  204. crackerjack/mcp/websocket/jobs.py +27 -4
  205. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  206. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  207. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  208. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  209. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  210. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  211. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  212. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  213. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  214. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  215. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  216. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  217. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  218. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  219. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  220. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  221. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  222. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  223. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  224. crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
  225. crackerjack/mcp/websocket/server.py +1 -3
  226. crackerjack/mcp/websocket/websocket_handler.py +107 -6
  227. crackerjack/models/README.md +308 -0
  228. crackerjack/models/__init__.py +10 -1
  229. crackerjack/models/config.py +639 -22
  230. crackerjack/models/config_adapter.py +6 -6
  231. crackerjack/models/protocols.py +1167 -23
  232. crackerjack/models/pydantic_models.py +320 -0
  233. crackerjack/models/qa_config.py +145 -0
  234. crackerjack/models/qa_results.py +134 -0
  235. crackerjack/models/results.py +35 -0
  236. crackerjack/models/semantic_models.py +258 -0
  237. crackerjack/models/task.py +19 -3
  238. crackerjack/models/test_models.py +60 -0
  239. crackerjack/monitoring/README.md +11 -0
  240. crackerjack/monitoring/ai_agent_watchdog.py +5 -4
  241. crackerjack/monitoring/metrics_collector.py +4 -3
  242. crackerjack/monitoring/regression_prevention.py +4 -3
  243. crackerjack/monitoring/websocket_server.py +4 -241
  244. crackerjack/orchestration/README.md +340 -0
  245. crackerjack/orchestration/__init__.py +43 -0
  246. crackerjack/orchestration/advanced_orchestrator.py +20 -67
  247. crackerjack/orchestration/cache/README.md +312 -0
  248. crackerjack/orchestration/cache/__init__.py +37 -0
  249. crackerjack/orchestration/cache/memory_cache.py +338 -0
  250. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  251. crackerjack/orchestration/config.py +297 -0
  252. crackerjack/orchestration/coverage_improvement.py +13 -6
  253. crackerjack/orchestration/execution_strategies.py +6 -6
  254. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  255. crackerjack/orchestration/strategies/README.md +401 -0
  256. crackerjack/orchestration/strategies/__init__.py +39 -0
  257. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  258. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  259. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  260. crackerjack/orchestration/test_progress_streamer.py +1 -1
  261. crackerjack/plugins/README.md +11 -0
  262. crackerjack/plugins/hooks.py +3 -2
  263. crackerjack/plugins/loader.py +3 -3
  264. crackerjack/plugins/managers.py +1 -1
  265. crackerjack/py313.py +191 -0
  266. crackerjack/security/README.md +11 -0
  267. crackerjack/services/README.md +374 -0
  268. crackerjack/services/__init__.py +8 -21
  269. crackerjack/services/ai/README.md +295 -0
  270. crackerjack/services/ai/__init__.py +7 -0
  271. crackerjack/services/ai/advanced_optimizer.py +878 -0
  272. crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
  273. crackerjack/services/ai/embeddings.py +444 -0
  274. crackerjack/services/ai/intelligent_commit.py +328 -0
  275. crackerjack/services/ai/predictive_analytics.py +510 -0
  276. crackerjack/services/api_extractor.py +5 -3
  277. crackerjack/services/bounded_status_operations.py +45 -5
  278. crackerjack/services/cache.py +249 -318
  279. crackerjack/services/changelog_automation.py +7 -3
  280. crackerjack/services/command_execution_service.py +305 -0
  281. crackerjack/services/config_integrity.py +83 -39
  282. crackerjack/services/config_merge.py +9 -6
  283. crackerjack/services/config_service.py +198 -0
  284. crackerjack/services/config_template.py +13 -26
  285. crackerjack/services/coverage_badge_service.py +6 -4
  286. crackerjack/services/coverage_ratchet.py +53 -27
  287. crackerjack/services/debug.py +18 -7
  288. crackerjack/services/dependency_analyzer.py +4 -4
  289. crackerjack/services/dependency_monitor.py +13 -13
  290. crackerjack/services/documentation_generator.py +4 -2
  291. crackerjack/services/documentation_service.py +62 -33
  292. crackerjack/services/enhanced_filesystem.py +81 -27
  293. crackerjack/services/enterprise_optimizer.py +1 -1
  294. crackerjack/services/error_pattern_analyzer.py +10 -10
  295. crackerjack/services/file_filter.py +221 -0
  296. crackerjack/services/file_hasher.py +5 -7
  297. crackerjack/services/file_io_service.py +361 -0
  298. crackerjack/services/file_modifier.py +615 -0
  299. crackerjack/services/filesystem.py +80 -109
  300. crackerjack/services/git.py +99 -5
  301. crackerjack/services/health_metrics.py +4 -6
  302. crackerjack/services/heatmap_generator.py +12 -3
  303. crackerjack/services/incremental_executor.py +380 -0
  304. crackerjack/services/initialization.py +101 -49
  305. crackerjack/services/log_manager.py +2 -2
  306. crackerjack/services/logging.py +120 -68
  307. crackerjack/services/lsp_client.py +12 -12
  308. crackerjack/services/memory_optimizer.py +27 -22
  309. crackerjack/services/monitoring/README.md +30 -0
  310. crackerjack/services/monitoring/__init__.py +9 -0
  311. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  312. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  313. crackerjack/services/monitoring/health_metrics.py +716 -0
  314. crackerjack/services/monitoring/metrics.py +587 -0
  315. crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
  316. crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
  317. crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
  318. crackerjack/services/parallel_executor.py +166 -55
  319. crackerjack/services/patterns/__init__.py +142 -0
  320. crackerjack/services/patterns/agents.py +107 -0
  321. crackerjack/services/patterns/code/__init__.py +15 -0
  322. crackerjack/services/patterns/code/detection.py +118 -0
  323. crackerjack/services/patterns/code/imports.py +107 -0
  324. crackerjack/services/patterns/code/paths.py +159 -0
  325. crackerjack/services/patterns/code/performance.py +119 -0
  326. crackerjack/services/patterns/code/replacement.py +36 -0
  327. crackerjack/services/patterns/core.py +212 -0
  328. crackerjack/services/patterns/documentation/__init__.py +14 -0
  329. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  330. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  331. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  332. crackerjack/services/patterns/formatting.py +226 -0
  333. crackerjack/services/patterns/operations.py +339 -0
  334. crackerjack/services/patterns/security/__init__.py +23 -0
  335. crackerjack/services/patterns/security/code_injection.py +122 -0
  336. crackerjack/services/patterns/security/credentials.py +190 -0
  337. crackerjack/services/patterns/security/path_traversal.py +221 -0
  338. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  339. crackerjack/services/patterns/templates.py +62 -0
  340. crackerjack/services/patterns/testing/__init__.py +18 -0
  341. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  342. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  343. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  344. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  345. crackerjack/services/patterns/tool_output/other.py +97 -0
  346. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  347. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  348. crackerjack/services/patterns/url_sanitization.py +114 -0
  349. crackerjack/services/patterns/utilities.py +42 -0
  350. crackerjack/services/patterns/utils.py +339 -0
  351. crackerjack/services/patterns/validation.py +46 -0
  352. crackerjack/services/patterns/versioning.py +62 -0
  353. crackerjack/services/predictive_analytics.py +21 -8
  354. crackerjack/services/profiler.py +280 -0
  355. crackerjack/services/quality/README.md +415 -0
  356. crackerjack/services/quality/__init__.py +11 -0
  357. crackerjack/services/quality/anomaly_detector.py +392 -0
  358. crackerjack/services/quality/pattern_cache.py +333 -0
  359. crackerjack/services/quality/pattern_detector.py +479 -0
  360. crackerjack/services/quality/qa_orchestrator.py +491 -0
  361. crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
  362. crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
  363. crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
  364. crackerjack/services/regex_patterns.py +58 -2987
  365. crackerjack/services/regex_utils.py +55 -29
  366. crackerjack/services/secure_status_formatter.py +42 -15
  367. crackerjack/services/secure_subprocess.py +35 -2
  368. crackerjack/services/security.py +16 -8
  369. crackerjack/services/server_manager.py +40 -51
  370. crackerjack/services/smart_scheduling.py +46 -6
  371. crackerjack/services/status_authentication.py +3 -3
  372. crackerjack/services/thread_safe_status_collector.py +1 -0
  373. crackerjack/services/tool_filter.py +368 -0
  374. crackerjack/services/tool_version_service.py +9 -5
  375. crackerjack/services/unified_config.py +43 -351
  376. crackerjack/services/vector_store.py +689 -0
  377. crackerjack/services/version_analyzer.py +6 -4
  378. crackerjack/services/version_checker.py +14 -8
  379. crackerjack/services/zuban_lsp_service.py +5 -4
  380. crackerjack/slash_commands/README.md +11 -0
  381. crackerjack/slash_commands/init.md +2 -12
  382. crackerjack/slash_commands/run.md +84 -50
  383. crackerjack/tools/README.md +11 -0
  384. crackerjack/tools/__init__.py +30 -0
  385. crackerjack/tools/_git_utils.py +105 -0
  386. crackerjack/tools/check_added_large_files.py +139 -0
  387. crackerjack/tools/check_ast.py +105 -0
  388. crackerjack/tools/check_json.py +103 -0
  389. crackerjack/tools/check_jsonschema.py +297 -0
  390. crackerjack/tools/check_toml.py +103 -0
  391. crackerjack/tools/check_yaml.py +110 -0
  392. crackerjack/tools/codespell_wrapper.py +72 -0
  393. crackerjack/tools/end_of_file_fixer.py +202 -0
  394. crackerjack/tools/format_json.py +128 -0
  395. crackerjack/tools/mdformat_wrapper.py +114 -0
  396. crackerjack/tools/trailing_whitespace.py +198 -0
  397. crackerjack/tools/validate_regex_patterns.py +7 -3
  398. crackerjack/ui/README.md +11 -0
  399. crackerjack/ui/dashboard_renderer.py +28 -0
  400. crackerjack/ui/templates/README.md +11 -0
  401. crackerjack/utils/console_utils.py +13 -0
  402. crackerjack/utils/dependency_guard.py +230 -0
  403. crackerjack/utils/retry_utils.py +275 -0
  404. crackerjack/workflows/README.md +590 -0
  405. crackerjack/workflows/__init__.py +46 -0
  406. crackerjack/workflows/actions.py +811 -0
  407. crackerjack/workflows/auto_fix.py +444 -0
  408. crackerjack/workflows/container_builder.py +499 -0
  409. crackerjack/workflows/definitions.py +443 -0
  410. crackerjack/workflows/engine.py +177 -0
  411. crackerjack/workflows/event_bridge.py +242 -0
  412. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
  413. crackerjack-0.45.2.dist-info/RECORD +478 -0
  414. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  415. crackerjack/managers/test_manager_backup.py +0 -1075
  416. crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
  417. crackerjack/mixins/__init__.py +0 -3
  418. crackerjack/mixins/error_handling.py +0 -145
  419. crackerjack/services/config.py +0 -358
  420. crackerjack/ui/server_panels.py +0 -125
  421. crackerjack-0.37.9.dist-info/RECORD +0 -231
  422. /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
  423. /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
  424. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
  425. {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,176 @@
1
+ """WebSocket endpoints for error heatmap visualization.
2
+
3
+ This module handles real-time error heatmap streaming for
4
+ file-based, temporal, and function-based error analysis.
5
+ """
6
+
7
+ import asyncio
8
+ import json
9
+ import typing as t
10
+ from datetime import datetime
11
+
12
+ from fastapi import FastAPI, WebSocket, WebSocketDisconnect
13
+
14
+ from crackerjack.services.monitoring.error_pattern_analyzer import (
15
+ ErrorPatternAnalyzer,
16
+ )
17
+
18
+
19
+ def register_heatmap_websockets(
20
+ app: FastAPI, error_analyzer: ErrorPatternAnalyzer
21
+ ) -> None:
22
+ """Register heatmap-related WebSocket endpoints."""
23
+
24
+ @app.websocket("/ws/heatmap/errors")
25
+ async def websocket_error_heatmap(websocket: WebSocket) -> None:
26
+ """WebSocket endpoint for real-time error heat map streaming."""
27
+ await _handle_error_heatmap_websocket(websocket, error_analyzer)
28
+
29
+
30
+ async def _handle_error_heatmap_websocket(
31
+ websocket: WebSocket, error_analyzer: ErrorPatternAnalyzer
32
+ ) -> None:
33
+ """Handle error heatmap WebSocket connection."""
34
+ await websocket.accept()
35
+
36
+ try:
37
+ # Analyze error patterns and send initial data
38
+ error_patterns = error_analyzer.analyze_error_patterns(days=30)
39
+ await _send_initial_heatmap_data(websocket, error_analyzer, error_patterns)
40
+
41
+ # Handle client messages
42
+ while True:
43
+ try:
44
+ message = await asyncio.wait_for(websocket.receive_text(), timeout=30.0)
45
+ data = json.loads(message)
46
+
47
+ await _handle_heatmap_request(websocket, error_analyzer, data)
48
+
49
+ except TimeoutError:
50
+ await websocket.send_text(
51
+ json.dumps(
52
+ {
53
+ "type": "heartbeat",
54
+ "timestamp": datetime.now().isoformat(),
55
+ }
56
+ )
57
+ )
58
+
59
+ except WebSocketDisconnect:
60
+ pass
61
+ except Exception as e:
62
+ await websocket.send_text(
63
+ json.dumps(
64
+ {
65
+ "type": "error",
66
+ "message": str(e),
67
+ "timestamp": datetime.now().isoformat(),
68
+ }
69
+ )
70
+ )
71
+
72
+
73
+ async def _send_initial_heatmap_data(
74
+ websocket: WebSocket,
75
+ error_analyzer: ErrorPatternAnalyzer,
76
+ error_patterns: list[t.Any],
77
+ ) -> None:
78
+ """Send initial heatmap data to client."""
79
+ # Send file-based heat map
80
+ file_heatmap = error_analyzer.generate_file_error_heatmap()
81
+ await websocket.send_text(
82
+ json.dumps(
83
+ {
84
+ "type": "file_heatmap",
85
+ "data": file_heatmap.to_dict(),
86
+ "timestamp": datetime.now().isoformat(),
87
+ }
88
+ )
89
+ )
90
+
91
+ # Send temporal heat map
92
+ temporal_heatmap = error_analyzer.generate_temporal_heatmap()
93
+ await websocket.send_text(
94
+ json.dumps(
95
+ {
96
+ "type": "temporal_heatmap",
97
+ "data": temporal_heatmap.to_dict(),
98
+ "timestamp": datetime.now().isoformat(),
99
+ }
100
+ )
101
+ )
102
+
103
+ # Send function-based heat map
104
+ function_heatmap = error_analyzer.generate_function_error_heatmap()
105
+ await websocket.send_text(
106
+ json.dumps(
107
+ {
108
+ "type": "function_heatmap",
109
+ "data": function_heatmap.to_dict(),
110
+ "timestamp": datetime.now().isoformat(),
111
+ }
112
+ )
113
+ )
114
+
115
+ # Send error patterns summary
116
+ patterns_data = [pattern.to_dict() for pattern in error_patterns]
117
+ await websocket.send_text(
118
+ json.dumps(
119
+ {
120
+ "type": "error_patterns",
121
+ "data": patterns_data,
122
+ "timestamp": datetime.now().isoformat(),
123
+ }
124
+ )
125
+ )
126
+
127
+
128
+ async def _handle_heatmap_request(
129
+ websocket: WebSocket,
130
+ error_analyzer: ErrorPatternAnalyzer,
131
+ data: dict[str, t.Any],
132
+ ) -> None:
133
+ """Handle heatmap request from client."""
134
+ if data.get("type") == "refresh_heatmap":
135
+ await _handle_heatmap_refresh(websocket, error_analyzer, data)
136
+ elif data.get("type") == "keepalive":
137
+ await websocket.send_text(
138
+ json.dumps(
139
+ {
140
+ "type": "pong",
141
+ "timestamp": datetime.now().isoformat(),
142
+ }
143
+ )
144
+ )
145
+
146
+
147
+ async def _handle_heatmap_refresh(
148
+ websocket: WebSocket,
149
+ error_analyzer: ErrorPatternAnalyzer,
150
+ data: dict[str, t.Any],
151
+ ) -> None:
152
+ """Handle heatmap refresh request."""
153
+ error_analyzer.analyze_error_patterns(days=data.get("days", 30))
154
+
155
+ heatmap_type = data.get("heatmap_type", "file")
156
+
157
+ if heatmap_type == "file":
158
+ heatmap = error_analyzer.generate_file_error_heatmap()
159
+ elif heatmap_type == "temporal":
160
+ heatmap = error_analyzer.generate_temporal_heatmap(
161
+ time_buckets=data.get("time_buckets", 24)
162
+ )
163
+ elif heatmap_type == "function":
164
+ heatmap = error_analyzer.generate_function_error_heatmap()
165
+ else:
166
+ return
167
+
168
+ await websocket.send_text(
169
+ json.dumps(
170
+ {
171
+ "type": f"{heatmap_type}_heatmap_refresh",
172
+ "data": heatmap.to_dict(),
173
+ "timestamp": datetime.now().isoformat(),
174
+ }
175
+ )
176
+ )
@@ -0,0 +1,291 @@
1
+ """WebSocket endpoints for intelligence features.
2
+
3
+ This module handles real-time anomaly detection, predictions,
4
+ and pattern analysis WebSocket connections.
5
+ """
6
+
7
+ import asyncio
8
+ import json
9
+ import typing as t
10
+ from datetime import datetime
11
+
12
+ from fastapi import FastAPI, WebSocket, WebSocketDisconnect
13
+
14
+ from crackerjack.services.quality.quality_intelligence import (
15
+ QualityIntelligenceService,
16
+ )
17
+
18
+ from ..websocket_manager import MonitoringWebSocketManager
19
+
20
+
21
+ def register_intelligence_websockets(
22
+ app: FastAPI,
23
+ ws_manager: MonitoringWebSocketManager,
24
+ intelligence_service: QualityIntelligenceService,
25
+ ) -> None:
26
+ """Register intelligence-related WebSocket endpoints."""
27
+
28
+ @app.websocket("/ws/intelligence/anomalies")
29
+ async def websocket_anomaly_detection(websocket: WebSocket) -> None:
30
+ """WebSocket endpoint for real-time anomaly detection."""
31
+ await _handle_anomaly_detection_websocket(
32
+ websocket, ws_manager, intelligence_service
33
+ )
34
+
35
+ @app.websocket("/ws/intelligence/predictions")
36
+ async def websocket_predictions(websocket: WebSocket) -> None:
37
+ """WebSocket endpoint for quality predictions."""
38
+ await _handle_predictions_websocket(websocket, ws_manager, intelligence_service)
39
+
40
+ @app.websocket("/ws/intelligence/patterns")
41
+ async def websocket_pattern_analysis(websocket: WebSocket) -> None:
42
+ """WebSocket endpoint for pattern recognition and correlation analysis."""
43
+ await _handle_pattern_analysis_websocket(
44
+ websocket, ws_manager, intelligence_service
45
+ )
46
+
47
+
48
+ async def _handle_anomaly_detection_websocket(
49
+ websocket: WebSocket,
50
+ ws_manager: MonitoringWebSocketManager,
51
+ intelligence_service: QualityIntelligenceService,
52
+ ) -> None:
53
+ """Handle anomaly detection WebSocket connection."""
54
+ client_id = f"anomalies_{datetime.now().timestamp()}"
55
+ await ws_manager.connect_metrics(websocket, client_id)
56
+
57
+ try:
58
+ # Send initial anomaly analysis
59
+ anomalies = intelligence_service.detect_anomalies(days=7)
60
+ await websocket.send_text(
61
+ json.dumps(
62
+ {
63
+ "type": "anomalies_initial",
64
+ "data": [anomaly.to_dict() for anomaly in anomalies],
65
+ "timestamp": datetime.now().isoformat(),
66
+ }
67
+ )
68
+ )
69
+
70
+ # Stream ongoing anomaly detection
71
+ while True:
72
+ try:
73
+ message = await asyncio.wait_for(websocket.receive_text(), timeout=60.0)
74
+ data = json.loads(message)
75
+
76
+ if data.get("type") == "request_analysis":
77
+ await _handle_anomaly_request(websocket, intelligence_service, data)
78
+
79
+ except TimeoutError:
80
+ await _send_periodic_anomaly_check(websocket, intelligence_service)
81
+
82
+ except WebSocketDisconnect:
83
+ ws_manager.disconnect(websocket, client_id)
84
+
85
+
86
+ async def _handle_anomaly_request(
87
+ websocket: WebSocket,
88
+ intelligence_service: QualityIntelligenceService,
89
+ data: dict[str, t.Any],
90
+ ) -> None:
91
+ """Handle anomaly analysis request."""
92
+ days = data.get("days", 7)
93
+ metrics_filter = data.get("metrics")
94
+
95
+ anomalies = intelligence_service.detect_anomalies(days=days, metrics=metrics_filter)
96
+ await websocket.send_text(
97
+ json.dumps(
98
+ {
99
+ "type": "anomalies_update",
100
+ "data": [anomaly.to_dict() for anomaly in anomalies],
101
+ "timestamp": datetime.now().isoformat(),
102
+ }
103
+ )
104
+ )
105
+
106
+
107
+ async def _send_periodic_anomaly_check(
108
+ websocket: WebSocket, intelligence_service: QualityIntelligenceService
109
+ ) -> None:
110
+ """Send periodic anomaly check."""
111
+ anomalies = intelligence_service.detect_anomalies(days=1)
112
+ if anomalies:
113
+ await websocket.send_text(
114
+ json.dumps(
115
+ {
116
+ "type": "anomalies_alert",
117
+ "data": [anomaly.to_dict() for anomaly in anomalies],
118
+ "timestamp": datetime.now().isoformat(),
119
+ }
120
+ )
121
+ )
122
+
123
+
124
+ async def _handle_predictions_websocket(
125
+ websocket: WebSocket,
126
+ ws_manager: MonitoringWebSocketManager,
127
+ intelligence_service: QualityIntelligenceService,
128
+ ) -> None:
129
+ """Handle predictions WebSocket connection."""
130
+ client_id = f"predictions_{datetime.now().timestamp()}"
131
+ await ws_manager.connect_metrics(websocket, client_id)
132
+
133
+ try:
134
+ # Send initial predictions
135
+ insights = intelligence_service.generate_comprehensive_insights(days=30)
136
+ await websocket.send_text(
137
+ json.dumps(
138
+ {
139
+ "type": "predictions_initial",
140
+ "data": insights.to_dict(),
141
+ "timestamp": datetime.now().isoformat(),
142
+ }
143
+ )
144
+ )
145
+
146
+ # Stream prediction updates
147
+ while True:
148
+ try:
149
+ message = await asyncio.wait_for(
150
+ websocket.receive_text(), timeout=300.0
151
+ )
152
+ data = json.loads(message)
153
+
154
+ if data.get("type") == "request_predictions":
155
+ await _handle_prediction_request(
156
+ websocket, intelligence_service, data
157
+ )
158
+
159
+ except TimeoutError:
160
+ await _send_periodic_prediction_update(websocket, intelligence_service)
161
+
162
+ except WebSocketDisconnect:
163
+ ws_manager.disconnect(websocket, client_id)
164
+
165
+
166
+ async def _handle_prediction_request(
167
+ websocket: WebSocket,
168
+ intelligence_service: QualityIntelligenceService,
169
+ data: dict[str, t.Any],
170
+ ) -> None:
171
+ """Handle prediction request."""
172
+ days = data.get("days", 30)
173
+ horizon = data.get("horizon", 7)
174
+
175
+ insights = intelligence_service.generate_comprehensive_insights(days=days)
176
+
177
+ # Generate specific predictions for requested horizon
178
+ predictions = {}
179
+ all_predictions = intelligence_service.generate_advanced_predictions(
180
+ horizon_days=horizon
181
+ )
182
+ for metric in ("quality_score", "test_coverage", "hook_duration"):
183
+ # Find the prediction for this specific metric
184
+ pred = next((p for p in all_predictions if p.metric_name == metric), None)
185
+ if pred:
186
+ predictions[metric] = pred.to_dict()
187
+
188
+ await websocket.send_text(
189
+ json.dumps(
190
+ {
191
+ "type": "predictions_update",
192
+ "data": {
193
+ "insights": insights.to_dict(),
194
+ "predictions": predictions,
195
+ },
196
+ "timestamp": datetime.now().isoformat(),
197
+ }
198
+ )
199
+ )
200
+
201
+
202
+ async def _send_periodic_prediction_update(
203
+ websocket: WebSocket, intelligence_service: QualityIntelligenceService
204
+ ) -> None:
205
+ """Send periodic predictions update."""
206
+ insights = intelligence_service.generate_comprehensive_insights(days=7)
207
+ await websocket.send_text(
208
+ json.dumps(
209
+ {
210
+ "type": "predictions_periodic",
211
+ "data": insights.to_dict(),
212
+ "timestamp": datetime.now().isoformat(),
213
+ }
214
+ )
215
+ )
216
+
217
+
218
+ async def _handle_pattern_analysis_websocket(
219
+ websocket: WebSocket,
220
+ ws_manager: MonitoringWebSocketManager,
221
+ intelligence_service: QualityIntelligenceService,
222
+ ) -> None:
223
+ """Handle pattern analysis WebSocket connection."""
224
+ client_id = f"patterns_{datetime.now().timestamp()}"
225
+ await ws_manager.connect_metrics(websocket, client_id)
226
+
227
+ try:
228
+ # Send initial pattern analysis
229
+ patterns = intelligence_service.identify_patterns(days=30)
230
+ await websocket.send_text(
231
+ json.dumps(
232
+ {
233
+ "type": "patterns_initial",
234
+ "data": patterns,
235
+ "timestamp": datetime.now().isoformat(),
236
+ }
237
+ )
238
+ )
239
+
240
+ # Stream pattern updates
241
+ while True:
242
+ try:
243
+ message = await asyncio.wait_for(
244
+ websocket.receive_text(), timeout=180.0
245
+ )
246
+ data = json.loads(message)
247
+
248
+ if data.get("type") == "request_patterns":
249
+ await _handle_pattern_request(websocket, intelligence_service, data)
250
+
251
+ except TimeoutError:
252
+ await _send_periodic_pattern_update(websocket, intelligence_service)
253
+
254
+ except WebSocketDisconnect:
255
+ ws_manager.disconnect(websocket, client_id)
256
+
257
+
258
+ async def _handle_pattern_request(
259
+ websocket: WebSocket,
260
+ intelligence_service: QualityIntelligenceService,
261
+ data: dict[str, t.Any],
262
+ ) -> None:
263
+ """Handle pattern analysis request."""
264
+ days = data.get("days", 30)
265
+ patterns = intelligence_service.identify_patterns(days=days)
266
+
267
+ await websocket.send_text(
268
+ json.dumps(
269
+ {
270
+ "type": "patterns_update",
271
+ "data": patterns,
272
+ "timestamp": datetime.now().isoformat(),
273
+ }
274
+ )
275
+ )
276
+
277
+
278
+ async def _send_periodic_pattern_update(
279
+ websocket: WebSocket, intelligence_service: QualityIntelligenceService
280
+ ) -> None:
281
+ """Send periodic pattern analysis update."""
282
+ patterns = intelligence_service.identify_patterns(days=7)
283
+ await websocket.send_text(
284
+ json.dumps(
285
+ {
286
+ "type": "patterns_periodic",
287
+ "data": patterns,
288
+ "timestamp": datetime.now().isoformat(),
289
+ }
290
+ )
291
+ )