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,479 @@
1
+ """CLI handlers for analytics features (heatmap, anomaly detection, predictive analytics)."""
2
+
3
+ import typing as t
4
+ from pathlib import Path
5
+
6
+ from acb.console import Console
7
+ from acb.depends import Inject, depends
8
+
9
+ # =============================================================================
10
+ # Heatmap Generation
11
+ # =============================================================================
12
+
13
+
14
+ def _generate_heatmap_by_type(
15
+ generator: t.Any, heatmap_type: str, project_root: Path, console: t.Any
16
+ ) -> t.Any | None:
17
+ """Generate heatmap data based on the specified type.
18
+
19
+ Args:
20
+ generator: HeatMapGenerator instance
21
+ heatmap_type: Type of heatmap to generate
22
+ project_root: Project root directory
23
+ console: Console for output
24
+
25
+ Returns:
26
+ Heatmap data or None if type is unknown
27
+ """
28
+ if heatmap_type == "error_frequency":
29
+ return generator.generate_error_frequency_heatmap()
30
+ if heatmap_type == "complexity":
31
+ return generator.generate_code_complexity_heatmap(project_root)
32
+ if heatmap_type == "quality_metrics":
33
+ return generator.generate_quality_metrics_heatmap()
34
+ if heatmap_type == "test_failures":
35
+ return generator.generate_test_failure_heatmap()
36
+
37
+ console.print(f"[red]❌[/red] Unknown heat map type: {heatmap_type}")
38
+ return None
39
+
40
+
41
+ def _save_heatmap_output(
42
+ generator: t.Any,
43
+ heatmap_data: t.Any,
44
+ heatmap_output: str | None,
45
+ heatmap_type: str,
46
+ console: t.Any,
47
+ ) -> bool:
48
+ """Save heatmap output to file.
49
+
50
+ Args:
51
+ generator: HeatMapGenerator instance
52
+ heatmap_data: Generated heatmap data
53
+ heatmap_output: Optional output path
54
+ heatmap_type: Type of heatmap
55
+ console: Console for output
56
+
57
+ Returns:
58
+ True if saved successfully, False otherwise
59
+ """
60
+ if heatmap_output:
61
+ output_path = Path(heatmap_output)
62
+ if output_path.suffix.lower() == ".html":
63
+ html_content = generator.generate_html_visualization(heatmap_data)
64
+ output_path.write_text(html_content, encoding="utf-8")
65
+ console.print(f"[green]✅[/green] Heat map HTML saved to: {output_path}")
66
+ return True
67
+ if output_path.suffix.lower() in (".json", ".csv"):
68
+ format_type = output_path.suffix[1:]
69
+ generator.export_heatmap_data(heatmap_data, output_path, format_type)
70
+ console.print(f"[green]✅[/green] Heat map data saved to: {output_path}")
71
+ return True
72
+
73
+ console.print(f"[red]❌[/red] Unsupported output format: {output_path.suffix}")
74
+ return False
75
+
76
+ # Default: save as HTML
77
+ default_filename = f"heatmap_{heatmap_type}.html"
78
+ html_content = generator.generate_html_visualization(heatmap_data)
79
+ Path(default_filename).write_text(html_content, encoding="utf-8")
80
+ console.print(f"[green]✅[/green] Heat map HTML saved to: {default_filename}")
81
+ return True
82
+
83
+
84
+ @depends.inject # type: ignore[misc]
85
+ def handle_heatmap_generation(
86
+ heatmap: bool,
87
+ heatmap_type: str,
88
+ heatmap_output: str | None,
89
+ console: Inject[Console],
90
+ ) -> bool:
91
+ if not heatmap:
92
+ return True
93
+
94
+ from crackerjack.services.heatmap_generator import HeatMapGenerator
95
+
96
+ console.print("[cyan]🔥[/cyan] Generating heat map visualization...")
97
+
98
+ try:
99
+ generator = HeatMapGenerator()
100
+ project_root = Path.cwd()
101
+
102
+ heatmap_data = _generate_heatmap_by_type(
103
+ generator, heatmap_type, project_root, console
104
+ )
105
+ if not heatmap_data:
106
+ return False
107
+
108
+ if not _save_heatmap_output(
109
+ generator, heatmap_data, heatmap_output, heatmap_type, console
110
+ ):
111
+ return False
112
+
113
+ console.print(
114
+ f"[cyan]📊[/cyan] Heat map '{heatmap_data.title}' generated successfully"
115
+ )
116
+ console.print(f"[dim] • Cells: {len(heatmap_data.cells)}")
117
+ console.print(f"[dim] • X Labels: {len(heatmap_data.x_labels)}")
118
+ console.print(f"[dim] • Y Labels: {len(heatmap_data.y_labels)}")
119
+
120
+ return False
121
+
122
+ except Exception as e:
123
+ console.print(f"[red]❌[/red] Heat map generation failed: {e}")
124
+ return False
125
+
126
+
127
+ # =============================================================================
128
+ # Anomaly Detection
129
+ # =============================================================================
130
+
131
+
132
+ @depends.inject # type: ignore[misc]
133
+ def generate_anomaly_sample_data(detector: t.Any, console: Inject[Console]) -> None:
134
+ from datetime import datetime, timedelta
135
+
136
+ base_time = datetime.now() - timedelta(hours=24)
137
+
138
+ metric_types = [
139
+ "test_pass_rate",
140
+ "coverage_percentage",
141
+ "complexity_score",
142
+ "execution_time",
143
+ "error_count",
144
+ ]
145
+
146
+ console.print("[dim] • Collecting quality metrics from recent runs...")
147
+
148
+ for i in range(50):
149
+ timestamp = base_time + timedelta(minutes=i * 30)
150
+
151
+ for metric_type in metric_types:
152
+ value = get_sample_metric_value(metric_type)
153
+
154
+ detector.add_metric(metric_type, value, timestamp)
155
+
156
+
157
+ def get_sample_metric_value(metric_type: str) -> float:
158
+ """Generate sample metric values for demo/visualization purposes.
159
+
160
+ Note: Uses standard random (not cryptographic) as this is ONLY for
161
+ generating fake demo data, not for any security-sensitive purposes.
162
+ """
163
+ import random
164
+
165
+ # Demo data generation - cryptographic randomness not required
166
+ is_anomaly = random.random() <= 0.1 # nosec B311
167
+
168
+ if metric_type == "test_pass_rate":
169
+ return random.uniform(0.3, 0.7) if is_anomaly else random.uniform(0.85, 0.98) # nosec B311
170
+
171
+ elif metric_type == "coverage_percentage":
172
+ return random.uniform(40, 60) if is_anomaly else random.uniform(75, 95) # nosec B311
173
+
174
+ elif metric_type == "complexity_score":
175
+ return random.uniform(20, 35) if is_anomaly else random.uniform(8, 15) # nosec B311
176
+
177
+ elif metric_type == "execution_time":
178
+ return random.uniform(300, 600) if is_anomaly else random.uniform(30, 120) # nosec B311
179
+
180
+ return random.uniform(8, 15) if is_anomaly else random.uniform(0, 3) # nosec B311
181
+
182
+
183
+ @depends.inject # type: ignore[misc]
184
+ def display_anomaly_results(
185
+ anomalies: list[t.Any], baselines: dict[str, t.Any], console: Inject[Console]
186
+ ) -> None:
187
+ console.print("[cyan]📊[/cyan] Analysis complete:")
188
+
189
+ console.print(f"[dim] • Baselines established for {len(baselines)} metrics")
190
+
191
+ console.print(f"[dim] • {len(anomalies)} anomalies detected")
192
+
193
+ if anomalies:
194
+ console.print("\n[yellow]⚠️[/yellow] Detected anomalies:")
195
+
196
+ for anomaly in anomalies[:5]:
197
+ severity_color = {
198
+ "low": "yellow",
199
+ "medium": "orange",
200
+ "high": "red",
201
+ "critical": "bright_red",
202
+ }.get(anomaly.severity, "white")
203
+
204
+ console.print(
205
+ f" • [{severity_color}]{anomaly.severity.upper()}[/{severity_color}] "
206
+ f"{anomaly.metric_type}: {anomaly.description}"
207
+ )
208
+
209
+
210
+ @depends.inject # type: ignore[misc]
211
+ def save_anomaly_report(
212
+ anomalies: list[t.Any],
213
+ baselines: dict[str, t.Any],
214
+ anomaly_sensitivity: float,
215
+ anomaly_report: str,
216
+ console: Inject[Console],
217
+ ) -> None:
218
+ import json
219
+ from datetime import datetime
220
+
221
+ report_data = {
222
+ "timestamp": datetime.now().isoformat(),
223
+ "summary": {
224
+ "total_anomalies": len(anomalies),
225
+ "baselines_count": len(baselines),
226
+ "sensitivity": anomaly_sensitivity,
227
+ },
228
+ "anomalies": [
229
+ {
230
+ "timestamp": a.timestamp.isoformat(),
231
+ "metric_type": a.metric_type,
232
+ "value": a.value,
233
+ "expected_range": a.expected_range,
234
+ "severity": a.severity,
235
+ "confidence": a.confidence,
236
+ "description": a.description,
237
+ }
238
+ for a in anomalies
239
+ ],
240
+ "baselines": baselines,
241
+ }
242
+
243
+ report_path = Path(anomaly_report)
244
+
245
+ report_path.write_text(json.dumps(report_data, indent=2), encoding="utf-8")
246
+
247
+ console.print(f"[green]✅[/green] Anomaly detection report saved to: {report_path}")
248
+
249
+
250
+ @depends.inject # type: ignore[misc]
251
+ def handle_anomaly_detection(
252
+ anomaly_detection: bool,
253
+ anomaly_sensitivity: float,
254
+ anomaly_report: str | None,
255
+ console: Inject[Console],
256
+ ) -> bool:
257
+ if not anomaly_detection:
258
+ return True
259
+
260
+ from crackerjack.services.quality.anomaly_detector import AnomalyDetector
261
+
262
+ console.print("[cyan]🔍[/cyan] Running ML-based anomaly detection...")
263
+
264
+ try:
265
+ detector = AnomalyDetector(sensitivity=anomaly_sensitivity)
266
+
267
+ generate_anomaly_sample_data(detector)
268
+
269
+ anomalies = detector.get_anomalies()
270
+
271
+ baselines = detector.get_baseline_summary()
272
+
273
+ display_anomaly_results(anomalies, baselines)
274
+
275
+ if anomaly_report:
276
+ save_anomaly_report(
277
+ anomalies, baselines, anomaly_sensitivity, anomaly_report
278
+ )
279
+
280
+ return False
281
+
282
+ except Exception as e:
283
+ console.print(f"[red]❌[/red] Anomaly detection failed: {e}")
284
+
285
+ return False
286
+
287
+
288
+ # =============================================================================
289
+ # Predictive Analytics
290
+ # =============================================================================
291
+
292
+
293
+ def generate_predictive_sample_data(engine: t.Any) -> list[str]:
294
+ """Generate sample data for predictive monitoring demo/visualization.
295
+
296
+ Note: Uses standard random (not cryptographic) as this is ONLY for
297
+ generating fake demo data, not for any security-sensitive purposes.
298
+ """
299
+ import random
300
+ from datetime import datetime, timedelta
301
+
302
+ base_time = datetime.now() - timedelta(hours=72)
303
+
304
+ metric_types = [
305
+ "test_pass_rate",
306
+ "coverage_percentage",
307
+ "execution_time",
308
+ "memory_usage",
309
+ "complexity_score",
310
+ ]
311
+
312
+ base_values = {
313
+ "test_pass_rate": 0.95,
314
+ "coverage_percentage": 0.85,
315
+ "execution_time": 120.0,
316
+ "memory_usage": 512.0,
317
+ "complexity_score": 10.0,
318
+ }
319
+
320
+ for metric_type in metric_types:
321
+ base_value = base_values[metric_type]
322
+
323
+ for i in range(48):
324
+ timestamp = base_time + timedelta(hours=i)
325
+
326
+ trend_factor = 1.0 + (i * 0.001)
327
+
328
+ # Demo data generation - cryptographic randomness not required
329
+ noise = random.uniform(0.9, 1.1) # nosec B311
330
+
331
+ value = base_value * trend_factor * noise
332
+
333
+ engine.add_metric(metric_type, value, timestamp)
334
+
335
+ return metric_types
336
+
337
+
338
+ def generate_predictions_summary(
339
+ engine: t.Any, metric_types: list[str], prediction_periods: int
340
+ ) -> dict[str, t.Any]:
341
+ predictions_summary = {}
342
+
343
+ trend_summary = engine.get_trend_summary()
344
+
345
+ for metric_type in metric_types:
346
+ predictions = engine.predict_metric(metric_type, prediction_periods)
347
+
348
+ if predictions:
349
+ predictions_summary[metric_type] = {
350
+ "trend": trend_summary.get(metric_type, {}),
351
+ "predictions": [
352
+ {
353
+ "predicted_for": p.predicted_for.isoformat(),
354
+ "predicted_value": round(p.predicted_value, 3),
355
+ "confidence_interval": [
356
+ round(p.confidence_interval[0], 3),
357
+ round(p.confidence_interval[1], 3),
358
+ ],
359
+ "model_accuracy": round(p.model_accuracy, 3),
360
+ }
361
+ for p in predictions[:5]
362
+ ],
363
+ }
364
+
365
+ return predictions_summary
366
+
367
+
368
+ @depends.inject # type: ignore[misc]
369
+ def display_trend_analysis(
370
+ predictions_summary: dict[str, t.Any], console: Inject[Console]
371
+ ) -> None:
372
+ console.print("\n[green]📈[/green] Trend Analysis Summary:")
373
+
374
+ for metric_type, data in predictions_summary.items():
375
+ trend_info = data.get("trend", {})
376
+
377
+ direction = trend_info.get("trend_direction", "unknown")
378
+
379
+ strength = trend_info.get("trend_strength", 0)
380
+
381
+ direction_color = {
382
+ "increasing": "green",
383
+ "decreasing": "red",
384
+ "stable": "blue",
385
+ "volatile": "yellow",
386
+ }.get(direction, "white")
387
+
388
+ console.print(
389
+ f" • {metric_type}: [{direction_color}]{direction}[/{direction_color}] "
390
+ f"(strength: {strength:.2f})"
391
+ )
392
+
393
+ if data["predictions"]:
394
+ next_pred = data["predictions"][0]
395
+
396
+ console.print(
397
+ f" Next prediction: {next_pred['predicted_value']} "
398
+ f"(confidence: {next_pred['model_accuracy']:.2f})"
399
+ )
400
+
401
+
402
+ @depends.inject # type: ignore[misc]
403
+ def save_analytics_dashboard(
404
+ predictions_summary: dict[str, t.Any],
405
+ trend_summary: dict[str, t.Any],
406
+ metric_types: list[str],
407
+ prediction_periods: int,
408
+ analytics_dashboard: str,
409
+ console: Inject[Console],
410
+ ) -> None:
411
+ import json
412
+ from datetime import datetime
413
+
414
+ dashboard_data = {
415
+ "timestamp": datetime.now().isoformat(),
416
+ "summary": {
417
+ "prediction_periods": prediction_periods,
418
+ "metrics_analyzed": len(metric_types),
419
+ "total_predictions": sum(
420
+ len(data["predictions"]) for data in predictions_summary.values()
421
+ ),
422
+ },
423
+ "trends": trend_summary,
424
+ "predictions": predictions_summary,
425
+ }
426
+
427
+ dashboard_path = Path(analytics_dashboard)
428
+
429
+ dashboard_path.write_text(json.dumps(dashboard_data, indent=2), encoding="utf-8")
430
+
431
+ console.print(f"[green]✅[/green] Analytics dashboard saved to: {dashboard_path}")
432
+
433
+
434
+ @depends.inject # type: ignore[misc]
435
+ def handle_predictive_analytics(
436
+ predictive_analytics: bool,
437
+ prediction_periods: int,
438
+ analytics_dashboard: str | None,
439
+ console: Inject[Console],
440
+ ) -> bool:
441
+ if not predictive_analytics:
442
+ return True
443
+
444
+ from crackerjack.services.ai.predictive_analytics import PredictiveAnalyticsEngine
445
+
446
+ console.print(
447
+ "[cyan]📊[/cyan] Running predictive analytics and trend forecasting..."
448
+ )
449
+
450
+ try:
451
+ engine = PredictiveAnalyticsEngine()
452
+
453
+ metric_types = generate_predictive_sample_data(engine)
454
+
455
+ console.print(
456
+ f"[blue]🔮[/blue] Generating {prediction_periods} period predictions..."
457
+ )
458
+
459
+ predictions_summary = generate_predictions_summary(
460
+ engine, metric_types, prediction_periods
461
+ )
462
+ trend_summary = engine.get_trend_summary()
463
+
464
+ display_trend_analysis(predictions_summary)
465
+
466
+ if analytics_dashboard:
467
+ save_analytics_dashboard(
468
+ predictions_summary,
469
+ trend_summary,
470
+ metric_types,
471
+ prediction_periods,
472
+ analytics_dashboard,
473
+ )
474
+
475
+ return False
476
+
477
+ except Exception as e:
478
+ console.print(f"[red]❌[/red] Predictive analytics failed: {e}")
479
+ return False