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,392 @@
1
+ """ML-based anomaly detection service for quality metrics analysis."""
2
+
3
+ import logging
4
+ import statistics
5
+ import typing as t
6
+ from collections import defaultdict, deque
7
+ from dataclasses import dataclass, field
8
+ from datetime import datetime
9
+ from pathlib import Path
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ @dataclass
15
+ class MetricPoint:
16
+ """Individual metric data point."""
17
+
18
+ timestamp: datetime
19
+ value: float
20
+ metric_type: str
21
+ metadata: dict[str, t.Any] = field(default_factory=dict[str, t.Any])
22
+
23
+
24
+ @dataclass
25
+ class AnomalyDetection:
26
+ """Anomaly detection result."""
27
+
28
+ timestamp: datetime
29
+ metric_type: str
30
+ value: float
31
+ expected_range: tuple[float, float]
32
+ severity: str # low, medium, high, critical
33
+ confidence: float
34
+ description: str
35
+ metadata: dict[str, t.Any] = field(default_factory=dict[str, t.Any])
36
+
37
+
38
+ @dataclass
39
+ class BaselineModel:
40
+ """Statistical baseline model for a metric."""
41
+
42
+ metric_type: str
43
+ mean: float
44
+ std_dev: float
45
+ min_value: float
46
+ max_value: float
47
+ sample_count: int
48
+ last_updated: datetime
49
+ seasonal_patterns: dict[str, float] = field(default_factory=dict[str, t.Any])
50
+
51
+
52
+ class AnomalyDetector:
53
+ """ML-based anomaly detection system for quality metrics."""
54
+
55
+ def __init__(
56
+ self,
57
+ baseline_window: int = 100,
58
+ sensitivity: float = 2.0,
59
+ min_samples: int = 10,
60
+ ):
61
+ """Initialize anomaly detector.
62
+
63
+ Args:
64
+ baseline_window: Number of recent samples for baseline calculation
65
+ sensitivity: Standard deviation multiplier for anomaly threshold
66
+ min_samples: Minimum samples required before anomaly detection
67
+ """
68
+ self.baseline_window = baseline_window
69
+ self.sensitivity = sensitivity
70
+ self.min_samples = min_samples
71
+
72
+ # Data storage
73
+ self.metric_history: dict[str, deque[MetricPoint]] = defaultdict(
74
+ lambda: deque[MetricPoint](maxlen=baseline_window)
75
+ )
76
+ self.baselines: dict[str, BaselineModel] = {}
77
+ self.anomalies: list[AnomalyDetection] = []
78
+
79
+ # Configuration
80
+ self.metric_configs = {
81
+ "test_pass_rate": {"critical_threshold": 0.8, "direction": "both"},
82
+ "coverage_percentage": {"critical_threshold": 0.7, "direction": "down"},
83
+ "complexity_score": {"critical_threshold": 15.0, "direction": "up"},
84
+ "execution_time": {"critical_threshold": 300.0, "direction": "up"},
85
+ "memory_usage": {"critical_threshold": 1024.0, "direction": "up"},
86
+ "error_count": {"critical_threshold": 5.0, "direction": "up"},
87
+ }
88
+
89
+ def add_metric(
90
+ self,
91
+ metric_type: str,
92
+ value: float,
93
+ timestamp: datetime | None = None,
94
+ metadata: dict[str, t.Any] | None = None,
95
+ ) -> None:
96
+ """Add new metric point and update baseline."""
97
+ if timestamp is None:
98
+ timestamp = datetime.now()
99
+
100
+ point = MetricPoint(
101
+ timestamp=timestamp,
102
+ value=value,
103
+ metric_type=metric_type,
104
+ metadata=metadata or {},
105
+ )
106
+
107
+ self.metric_history[metric_type].append(point)
108
+
109
+ # Update baseline if we have enough samples
110
+ if len(self.metric_history[metric_type]) >= self.min_samples:
111
+ self._update_baseline(metric_type)
112
+
113
+ # Check for anomalies
114
+ anomaly = self._detect_anomaly(point)
115
+ if anomaly:
116
+ self.anomalies.append(anomaly)
117
+ logger.info(f"Anomaly detected: {anomaly.description}")
118
+
119
+ def _update_baseline(self, metric_type: str) -> None:
120
+ """Update statistical baseline for a metric type."""
121
+ history = list[t.Any](self.metric_history[metric_type])
122
+ values = [point.value for point in history]
123
+
124
+ # Calculate basic statistics
125
+ mean = statistics.mean(values)
126
+ std_dev = statistics.stdev(values) if len(values) > 1 else 0
127
+ min_val = min(values)
128
+ max_val = max(values)
129
+
130
+ # Detect seasonal patterns (hourly, daily)
131
+ seasonal_patterns = self._detect_seasonal_patterns(history)
132
+
133
+ self.baselines[metric_type] = BaselineModel(
134
+ metric_type=metric_type,
135
+ mean=mean,
136
+ std_dev=std_dev,
137
+ min_value=min_val,
138
+ max_value=max_val,
139
+ sample_count=len(values),
140
+ last_updated=datetime.now(),
141
+ seasonal_patterns=seasonal_patterns,
142
+ )
143
+
144
+ def _detect_seasonal_patterns(self, history: list[MetricPoint]) -> dict[str, float]:
145
+ """Detect seasonal patterns in metric history."""
146
+ patterns: dict[str, float] = {}
147
+
148
+ if len(history) < 24: # Need at least 24 points for pattern detection
149
+ return patterns
150
+
151
+ # Group by hour of day
152
+ hourly_values = defaultdict(list)
153
+ for point in history:
154
+ hour = point.timestamp.hour
155
+ hourly_values[hour].append(point.value)
156
+
157
+ # Calculate hourly averages
158
+ for hour, values in hourly_values.items():
159
+ if len(values) >= 3: # Need at least 3 samples
160
+ patterns[f"hour_{hour}"] = statistics.mean(values)
161
+
162
+ return patterns
163
+
164
+ def _detect_anomaly(self, point: MetricPoint) -> AnomalyDetection | None:
165
+ """Detect if a metric point is anomalous."""
166
+ metric_type = point.metric_type
167
+ baseline = self.baselines.get(metric_type)
168
+
169
+ if not baseline:
170
+ return None
171
+
172
+ # Calculate expected range
173
+ lower_bound = baseline.mean - (self.sensitivity * baseline.std_dev)
174
+ upper_bound = baseline.mean + (self.sensitivity * baseline.std_dev)
175
+
176
+ # Apply seasonal adjustment if available
177
+ seasonal_adjustment = self._get_seasonal_adjustment(point, baseline)
178
+ if seasonal_adjustment:
179
+ lower_bound += seasonal_adjustment
180
+ upper_bound += seasonal_adjustment
181
+
182
+ # Check for anomaly
183
+ is_anomaly = point.value < lower_bound or point.value > upper_bound
184
+
185
+ if not is_anomaly:
186
+ return None
187
+
188
+ # Determine severity
189
+ severity = self._calculate_severity(point, baseline, lower_bound, upper_bound)
190
+
191
+ # Calculate confidence
192
+ confidence = self._calculate_confidence(point, baseline)
193
+
194
+ # Generate description
195
+ description = self._generate_anomaly_description(
196
+ point, baseline, lower_bound, upper_bound, severity
197
+ )
198
+
199
+ return AnomalyDetection(
200
+ timestamp=point.timestamp,
201
+ metric_type=metric_type,
202
+ value=point.value,
203
+ expected_range=(lower_bound, upper_bound),
204
+ severity=severity,
205
+ confidence=confidence,
206
+ description=description,
207
+ metadata=point.metadata,
208
+ )
209
+
210
+ def _get_seasonal_adjustment(
211
+ self, point: MetricPoint, baseline: BaselineModel
212
+ ) -> float:
213
+ """Get seasonal adjustment for the current time."""
214
+ hour = point.timestamp.hour
215
+ hour_pattern = baseline.seasonal_patterns.get(f"hour_{hour}")
216
+
217
+ if hour_pattern is not None:
218
+ return hour_pattern - baseline.mean
219
+
220
+ return 0.0
221
+
222
+ def _calculate_severity(
223
+ self,
224
+ point: MetricPoint,
225
+ baseline: BaselineModel,
226
+ lower_bound: float,
227
+ upper_bound: float,
228
+ ) -> str:
229
+ """Calculate anomaly severity based on deviation magnitude."""
230
+ if baseline.std_dev == 0:
231
+ return "medium"
232
+
233
+ # Check for critical threshold breaches first
234
+ if self._is_critical_threshold_breached(point):
235
+ return "critical"
236
+
237
+ # Calculate z-score and map to severity
238
+ z_score = self._calculate_z_score(point, baseline, lower_bound, upper_bound)
239
+ return self._severity_from_z_score(z_score)
240
+
241
+ def _is_critical_threshold_breached(self, point: MetricPoint) -> bool:
242
+ """Check if point breaches critical thresholds."""
243
+ config = self.metric_configs.get(point.metric_type, {})
244
+ critical_threshold = config.get("critical_threshold")
245
+
246
+ if not critical_threshold:
247
+ return False
248
+
249
+ direction = config.get("direction", "both")
250
+ threshold_float: float = (
251
+ float(str(critical_threshold)) if critical_threshold is not None else 0.0
252
+ )
253
+ return self._threshold_breached_in_direction(
254
+ point.value, threshold_float, str(direction)
255
+ )
256
+
257
+ def _threshold_breached_in_direction(
258
+ self, value: float, threshold: float, direction: str
259
+ ) -> bool:
260
+ """Check if value breaches threshold in specified direction."""
261
+ if direction == "up":
262
+ return value > threshold
263
+ elif direction == "down":
264
+ return value < threshold
265
+ elif direction == "both":
266
+ return value > threshold or value < -threshold
267
+ return False
268
+
269
+ def _calculate_z_score(
270
+ self,
271
+ point: MetricPoint,
272
+ baseline: BaselineModel,
273
+ lower_bound: float,
274
+ upper_bound: float,
275
+ ) -> float:
276
+ """Calculate z-score for the point."""
277
+ deviation = min(abs(point.value - lower_bound), abs(point.value - upper_bound))
278
+ return deviation / baseline.std_dev
279
+
280
+ def _severity_from_z_score(self, z_score: float) -> str:
281
+ """Map z-score to severity level."""
282
+ if z_score > 4:
283
+ return "critical"
284
+ elif z_score > 3:
285
+ return "high"
286
+ elif z_score > 2:
287
+ return "medium"
288
+ return "low"
289
+
290
+ def _calculate_confidence(
291
+ self, point: MetricPoint, baseline: BaselineModel
292
+ ) -> float:
293
+ """Calculate confidence in anomaly detection."""
294
+ # Base confidence on sample size and consistency
295
+ sample_factor = min(baseline.sample_count / 50, 1.0) # Max at 50 samples
296
+
297
+ # Factor in standard deviation consistency
298
+ if baseline.std_dev == 0:
299
+ std_factor = 0.5 # Low confidence for constant values
300
+ else:
301
+ # Higher confidence for more consistent baselines
302
+ cv = baseline.std_dev / abs(baseline.mean) if baseline.mean != 0 else 1
303
+ std_factor = max(0.1, min(1.0, 1.0 - cv))
304
+
305
+ return sample_factor * std_factor
306
+
307
+ def _generate_anomaly_description(
308
+ self,
309
+ point: MetricPoint,
310
+ baseline: BaselineModel,
311
+ lower_bound: float,
312
+ upper_bound: float,
313
+ severity: str,
314
+ ) -> str:
315
+ """Generate human-readable anomaly description."""
316
+ direction = "above" if point.value > upper_bound else "below"
317
+ expected_range = f"{lower_bound:.2f}-{upper_bound:.2f}"
318
+
319
+ return (
320
+ f"{severity.title()} anomaly in {point.metric_type}: "
321
+ f"value {point.value:.2f} is {direction} expected range "
322
+ f"{expected_range} (baseline: {baseline.mean:.2f})"
323
+ )
324
+
325
+ def get_anomalies(
326
+ self,
327
+ metric_type: str | None = None,
328
+ severity: str | None = None,
329
+ since: datetime | None = None,
330
+ limit: int = 100,
331
+ ) -> list[AnomalyDetection]:
332
+ """Get filtered anomalies."""
333
+ anomalies = self.anomalies
334
+
335
+ # Apply filters
336
+ if metric_type:
337
+ anomalies = [a for a in anomalies if a.metric_type == metric_type]
338
+
339
+ if severity:
340
+ anomalies = [a for a in anomalies if a.severity == severity]
341
+
342
+ if since:
343
+ anomalies = [a for a in anomalies if a.timestamp >= since]
344
+
345
+ # Sort by timestamp (newest first) and limit
346
+ anomalies.sort(key=lambda x: x.timestamp, reverse=True)
347
+ return anomalies[:limit]
348
+
349
+ def get_baseline_summary(self) -> dict[str, dict[str, t.Any]]:
350
+ """Get summary of all baseline models."""
351
+ summary = {}
352
+
353
+ for metric_type, baseline in self.baselines.items():
354
+ summary[metric_type] = {
355
+ "mean": baseline.mean,
356
+ "std_dev": baseline.std_dev,
357
+ "range": (baseline.min_value, baseline.max_value),
358
+ "sample_count": baseline.sample_count,
359
+ "last_updated": baseline.last_updated.isoformat(),
360
+ "seasonal_patterns": len(baseline.seasonal_patterns),
361
+ }
362
+
363
+ return summary
364
+
365
+ def export_model(self, output_path: str | Path) -> None:
366
+ """Export anomaly detection model for persistence."""
367
+ import json
368
+
369
+ model_data = {
370
+ "baselines": {
371
+ metric_type: {
372
+ "metric_type": baseline.metric_type,
373
+ "mean": baseline.mean,
374
+ "std_dev": baseline.std_dev,
375
+ "min_value": baseline.min_value,
376
+ "max_value": baseline.max_value,
377
+ "sample_count": baseline.sample_count,
378
+ "last_updated": baseline.last_updated.isoformat(),
379
+ "seasonal_patterns": baseline.seasonal_patterns,
380
+ }
381
+ for metric_type, baseline in self.baselines.items()
382
+ },
383
+ "config": {
384
+ "baseline_window": self.baseline_window,
385
+ "sensitivity": self.sensitivity,
386
+ "min_samples": self.min_samples,
387
+ },
388
+ "exported_at": datetime.now().isoformat(),
389
+ }
390
+
391
+ with open(output_path, "w", encoding="utf-8") as f:
392
+ json.dump(model_data, f, indent=2)