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,297 @@
1
+ from __future__ import annotations
2
+
3
+ import dataclasses
4
+ import os
5
+ from dataclasses import dataclass, field
6
+ from pathlib import Path
7
+ from typing import TYPE_CHECKING, Any
8
+
9
+ if TYPE_CHECKING:
10
+ from typing import Self
11
+ else:
12
+ Self = "OrchestrationConfig"
13
+
14
+ import yaml
15
+ from acb.depends import depends
16
+
17
+ from crackerjack.config.settings import CrackerjackSettings
18
+
19
+
20
+ def _bool_from_env(value: str) -> bool:
21
+ return value.strip().lower() in {"1", "true", "yes", "on"}
22
+
23
+
24
+ def _int_from_env(value: str, default: int) -> int:
25
+ try:
26
+ return int(value)
27
+ except ValueError:
28
+ return default
29
+
30
+
31
+ @dataclass
32
+ class OrchestrationConfig:
33
+ enable_orchestration: bool = True
34
+ orchestration_mode: str = "acb"
35
+ enable_caching: bool = True
36
+ cache_backend: str = "memory"
37
+ cache_ttl: int = 3600
38
+ cache_max_entries: int = 100
39
+ max_parallel_hooks: int = 4
40
+ default_timeout: int = 600
41
+ stop_on_critical_failure: bool = True
42
+ enable_dependency_resolution: bool = True
43
+ log_cache_stats: bool = False
44
+ log_execution_timing: bool = False
45
+ enable_strategy_parallelism: bool = True
46
+ enable_adaptive_execution: bool = True
47
+ max_concurrent_strategies: int = 2
48
+ enable_tool_proxy: bool = True
49
+ use_precommit_legacy: bool = True
50
+ config_file_path: Path | None = field(default=None, repr=False)
51
+
52
+ # --------------------------------------------------------------------- #
53
+ # Construction helpers
54
+ # --------------------------------------------------------------------- #
55
+
56
+ @classmethod
57
+ def from_settings(
58
+ cls,
59
+ settings: CrackerjackSettings | None = None,
60
+ ) -> OrchestrationConfig:
61
+ """Build configuration from CrackerjackSettings via DI."""
62
+ if settings is None:
63
+ try:
64
+ # Use synchronous DI retrieval to avoid coroutine leakage in tests
65
+ settings = depends.get_sync(CrackerjackSettings) # type: ignore[attr-defined]
66
+ except Exception:
67
+ settings = None
68
+
69
+ if settings is None:
70
+ return cls()
71
+
72
+ return cls(
73
+ enable_orchestration=settings.enable_orchestration,
74
+ orchestration_mode=settings.orchestration_mode,
75
+ enable_caching=settings.enable_caching,
76
+ cache_backend=settings.cache_backend,
77
+ cache_ttl=settings.cache_ttl,
78
+ cache_max_entries=settings.cache_max_entries,
79
+ max_parallel_hooks=settings.max_parallel_hooks,
80
+ default_timeout=settings.default_timeout,
81
+ stop_on_critical_failure=settings.stop_on_critical_failure,
82
+ enable_dependency_resolution=settings.enable_dependency_resolution,
83
+ log_cache_stats=settings.log_cache_stats,
84
+ log_execution_timing=settings.log_execution_timing,
85
+ enable_strategy_parallelism=settings.enable_strategy_parallelism,
86
+ enable_adaptive_execution=settings.enable_adaptive_execution,
87
+ max_concurrent_strategies=settings.max_concurrent_strategies,
88
+ enable_tool_proxy=getattr(settings, "enable_tool_proxy", True),
89
+ use_precommit_legacy=settings.use_precommit_legacy,
90
+ )
91
+
92
+ @classmethod
93
+ def from_file(cls, config_path: Path) -> OrchestrationConfig:
94
+ if not config_path.exists():
95
+ msg = f"Config file not found: {config_path}"
96
+ raise FileNotFoundError(msg)
97
+
98
+ try:
99
+ raw = yaml.safe_load(config_path.read_text(encoding="utf-8"))
100
+ data: dict[str, Any] = raw if isinstance(raw, dict) else {}
101
+ except yaml.YAMLError as exc:
102
+ msg = f"Invalid YAML in {config_path}: {exc}"
103
+ raise ValueError(msg) from exc
104
+
105
+ if not isinstance(data, dict):
106
+ msg = f"Invalid config structure in {config_path}"
107
+ raise ValueError(msg)
108
+
109
+ section_any = data.get("orchestration", {})
110
+ section: dict[str, Any] = section_any if isinstance(section_any, dict) else {}
111
+
112
+ config = cls()
113
+ config.config_file_path = config_path
114
+ config._apply_dict(section)
115
+ return config
116
+
117
+ @classmethod
118
+ def _env_overrides(cls) -> dict[str, Any]:
119
+ """Return environment variable overrides."""
120
+ env = os.environ
121
+ overrides: dict[str, Any] = {}
122
+
123
+ mapping: dict[str, str] = {
124
+ "CRACKERJACK_ORCHESTRATION_MODE": "orchestration_mode",
125
+ "CRACKERJACK_CACHE_BACKEND": "cache_backend",
126
+ }
127
+
128
+ for env_key, attr in mapping.items():
129
+ if env_key in env:
130
+ overrides[attr] = env[env_key]
131
+
132
+ bool_vars = {
133
+ "CRACKERJACK_ENABLE_ORCHESTRATION": "enable_orchestration",
134
+ "CRACKERJACK_ENABLE_CACHING": "enable_caching",
135
+ "CRACKERJACK_STOP_ON_CRITICAL_FAILURE": "stop_on_critical_failure",
136
+ "CRACKERJACK_ENABLE_DEPENDENCY_RESOLUTION": "enable_dependency_resolution",
137
+ "CRACKERJACK_LOG_CACHE_STATS": "log_cache_stats",
138
+ "CRACKERJACK_LOG_EXECUTION_TIMING": "log_execution_timing",
139
+ "CRACKERJACK_ENABLE_STRATEGY_PARALLELISM": "enable_strategy_parallelism",
140
+ "CRACKERJACK_ENABLE_ADAPTIVE_EXECUTION": "enable_adaptive_execution",
141
+ "CRACKERJACK_ENABLE_TOOL_PROXY": "enable_tool_proxy",
142
+ "CRACKERJACK_USE_PRECOMMIT_LEGACY": "use_precommit_legacy",
143
+ }
144
+
145
+ for env_key, attr in bool_vars.items():
146
+ if env_key in env:
147
+ overrides[attr] = _bool_from_env(env[env_key])
148
+
149
+ int_vars = {
150
+ "CRACKERJACK_CACHE_TTL": ("cache_ttl", 3600),
151
+ "CRACKERJACK_CACHE_MAX_ENTRIES": ("cache_max_entries", 100),
152
+ "CRACKERJACK_MAX_PARALLEL_HOOKS": ("max_parallel_hooks", 4),
153
+ "CRACKERJACK_DEFAULT_TIMEOUT": ("default_timeout", 600),
154
+ "CRACKERJACK_MAX_CONCURRENT_STRATEGIES": ("max_concurrent_strategies", 2),
155
+ }
156
+
157
+ for env_key, (attr, default) in int_vars.items():
158
+ if env_key in env:
159
+ overrides[attr] = _int_from_env(env[env_key], default)
160
+
161
+ return overrides
162
+
163
+ @classmethod
164
+ def from_env(cls) -> OrchestrationConfig:
165
+ overrides = cls._env_overrides()
166
+ config = cls()
167
+ config._apply_dict(overrides)
168
+ return config
169
+
170
+ @classmethod
171
+ def load(cls, config_path: Path) -> OrchestrationConfig:
172
+ # Start from hard defaults; only override from file/env.
173
+ config = cls()
174
+
175
+ if config_path.exists():
176
+ file_config = cls.from_file(config_path)
177
+ config = config.merge(file_config) # type: ignore[assignment]
178
+
179
+ env_overrides = cls._env_overrides()
180
+ config = config.with_overrides(**env_overrides) # type: ignore[assignment]
181
+
182
+ return config
183
+
184
+ # ------------------------------------------------------------------ #
185
+ # Mutation helpers
186
+ # ------------------------------------------------------------------ #
187
+
188
+ def _apply_dict(self, values: dict[str, Any]) -> None:
189
+ # Accept aliases from YAML where keys are shorter (e.g., enable, mode)
190
+ aliases = {
191
+ "enable": "enable_orchestration",
192
+ "mode": "orchestration_mode",
193
+ }
194
+ for key, value in values.items():
195
+ attr = aliases.get(key, key)
196
+ if not hasattr(self, attr):
197
+ continue
198
+ if isinstance(value, str):
199
+ value = value.strip()
200
+ setattr(self, attr, value)
201
+
202
+ def merge(self, other: OrchestrationConfig) -> OrchestrationConfig:
203
+ data = dataclasses.asdict(self)
204
+ other_data = dataclasses.asdict(other)
205
+ data.update(other_data)
206
+ merged = OrchestrationConfig(**data)
207
+ merged.config_file_path = other.config_file_path or self.config_file_path
208
+ return merged
209
+
210
+ def with_overrides(self, **overrides: Any) -> OrchestrationConfig:
211
+ # Create a shallow copy without using dataclasses.replace to satisfy type checker
212
+ updated = OrchestrationConfig(**dataclasses.asdict(self))
213
+ for key, value in overrides.items():
214
+ if value is not None and hasattr(updated, key):
215
+ setattr(updated, key, value)
216
+ return updated
217
+
218
+ # ------------------------------------------------------------------ #
219
+ # Serialisation
220
+ # ------------------------------------------------------------------ #
221
+
222
+ def to_dict(self) -> dict[str, Any]:
223
+ return {
224
+ "orchestration": {
225
+ "enable": self.enable_orchestration,
226
+ "mode": self.orchestration_mode,
227
+ "enable_caching": self.enable_caching,
228
+ "cache_backend": self.cache_backend,
229
+ "cache_ttl": self.cache_ttl,
230
+ "cache_max_entries": self.cache_max_entries,
231
+ "max_parallel_hooks": self.max_parallel_hooks,
232
+ "default_timeout": self.default_timeout,
233
+ "stop_on_critical_failure": self.stop_on_critical_failure,
234
+ "enable_dependency_resolution": self.enable_dependency_resolution,
235
+ "log_cache_stats": self.log_cache_stats,
236
+ "log_execution_timing": self.log_execution_timing,
237
+ "enable_strategy_parallelism": self.enable_strategy_parallelism,
238
+ "enable_adaptive_execution": self.enable_adaptive_execution,
239
+ "max_concurrent_strategies": self.max_concurrent_strategies,
240
+ "enable_tool_proxy": self.enable_tool_proxy,
241
+ "use_precommit_legacy": self.use_precommit_legacy,
242
+ }
243
+ }
244
+
245
+ def save(self, config_path: Path) -> None:
246
+ config_path.write_text(
247
+ yaml.safe_dump(self.to_dict(), sort_keys=True),
248
+ encoding="utf-8",
249
+ )
250
+
251
+ # ------------------------------------------------------------------ #
252
+ # Validation / Conversion
253
+ # ------------------------------------------------------------------ #
254
+
255
+ def validate(self) -> list[str]:
256
+ errors: list[str] = []
257
+
258
+ if self.orchestration_mode not in {"acb", "legacy"}:
259
+ errors.append("Invalid orchestration_mode; expected 'acb' or 'legacy'")
260
+
261
+ if self.cache_backend not in {"memory", "tool_proxy", "redis"}:
262
+ errors.append(
263
+ "Invalid cache_backend; expected 'memory', 'tool_proxy', or 'redis'"
264
+ )
265
+
266
+ if self.cache_ttl <= 0:
267
+ errors.append("cache_ttl must be positive")
268
+ if self.cache_max_entries <= 0:
269
+ errors.append("cache_max_entries must be positive")
270
+ if self.max_parallel_hooks <= 0:
271
+ errors.append("max_parallel_hooks must be positive")
272
+ if self.default_timeout <= 0:
273
+ errors.append("default_timeout must be positive")
274
+ if self.max_concurrent_strategies <= 0:
275
+ errors.append("max_concurrent_strategies must be positive")
276
+
277
+ return errors
278
+
279
+ def to_orchestrator_settings(self) -> Any:
280
+ from crackerjack.orchestration.hook_orchestrator import HookOrchestratorSettings
281
+
282
+ execution_mode = self.orchestration_mode
283
+ if not self.enable_orchestration:
284
+ execution_mode = "legacy"
285
+
286
+ return HookOrchestratorSettings(
287
+ execution_mode=execution_mode,
288
+ enable_caching=self.enable_caching,
289
+ cache_backend=self.cache_backend,
290
+ max_parallel_hooks=self.max_parallel_hooks,
291
+ default_timeout=self.default_timeout,
292
+ enable_adaptive_execution=self.enable_adaptive_execution,
293
+ )
294
+
295
+
296
+ # Convenience re-export for legacy imports
297
+ __all__ = ["OrchestrationConfig"]
@@ -2,17 +2,21 @@ import logging
2
2
  import typing as t
3
3
  from pathlib import Path
4
4
 
5
+ from acb.console import Console
6
+ from acb.depends import Inject, depends
7
+
5
8
  from crackerjack.agents.base import Issue, IssueType, Priority
6
9
  from crackerjack.agents.test_creation_agent import TestCreationAgent
7
10
  from crackerjack.services.coverage_ratchet import CoverageRatchetService
8
11
 
9
12
 
10
13
  class CoverageImprovementOrchestrator:
11
- def __init__(self, project_path: Path, console: t.Any = None) -> None:
14
+ @depends.inject # type: ignore[misc]
15
+ def __init__(self, project_path: Path, console: Inject[Console]) -> None:
12
16
  self.project_path = project_path
13
17
  self.logger = logging.getLogger(__name__)
14
18
  self.console = console
15
- self.coverage_service = CoverageRatchetService(project_path, console)
19
+ self.coverage_service = CoverageRatchetService(project_path)
16
20
  self.min_coverage_improvement = 2.0
17
21
 
18
22
  async def should_improve_coverage(
@@ -123,10 +127,13 @@ class CoverageImprovementOrchestrator:
123
127
  f"tests created in {len(fix_result.files_modified)} files"
124
128
  )
125
129
  else:
126
- self.logger.warning("Coverage improvement failed")
130
+ # Log at debug level rather than warning since this is normal behavior
131
+ self.logger.debug(
132
+ "Test creation for coverage improvement was not successful"
133
+ )
127
134
  if self.console:
128
135
  self.console.print(
129
- "[yellow]⚠️[/ yellow] Coverage improvement attempt completed with issues"
136
+ "[dim]📈 Coverage improvement: no new tests created[/dim]"
130
137
  )
131
138
 
132
139
  def _create_error_result(self, error: Exception) -> dict[str, t.Any]:
@@ -168,6 +175,6 @@ class CoverageImprovementOrchestrator:
168
175
 
169
176
 
170
177
  async def create_coverage_improvement_orchestrator(
171
- project_path: Path, console: t.Any = None
178
+ project_path: Path,
172
179
  ) -> CoverageImprovementOrchestrator:
173
- return CoverageImprovementOrchestrator(project_path, console)
180
+ return CoverageImprovementOrchestrator(project_path)
@@ -3,7 +3,7 @@ from dataclasses import dataclass
3
3
  from enum import Enum
4
4
  from pathlib import Path
5
5
 
6
- from rich.console import Console
6
+ from acb.console import Console
7
7
 
8
8
  from crackerjack.config.hooks import HookStrategy
9
9
  from crackerjack.models.protocols import OptionsProtocol
@@ -44,7 +44,7 @@ class AIIntelligence(str, Enum):
44
44
  @dataclass
45
45
  class OrchestrationConfig:
46
46
  execution_strategy: ExecutionStrategy = ExecutionStrategy.BATCH
47
- progress_level: ProgressLevel = ProgressLevel.DETAILED
47
+ progress_level: ProgressLevel = ProgressLevel.BASIC
48
48
  streaming_mode: StreamingMode = StreamingMode.WEBSOCKET
49
49
  ai_coordination_mode: AICoordinationMode = AICoordinationMode.SINGLE_AGENT
50
50
  ai_intelligence: AIIntelligence = AIIntelligence.BASIC
@@ -198,7 +198,7 @@ class StrategySelector:
198
198
  if "test" in str(file_path):
199
199
  priority_hooks.update(["pytest", "coverage"])
200
200
  if str(file_path).endswith(("setup.py", "pyproject.toml")):
201
- priority_hooks.update(["bandit", "creosote", "detect-secrets"])
201
+ priority_hooks.update(["bandit", "creosote", "gitleaks"])
202
202
 
203
203
  selected_hooks = [
204
204
  hook for hook in strategy.hooks if hook.name in priority_hooks
@@ -262,10 +262,10 @@ class OrchestrationPlanner:
262
262
  hook_plans=hook_plans,
263
263
  test_plan=test_plan,
264
264
  ai_plan=ai_plan,
265
- estimated_total_duration=sum(
266
- int(plan["estimated_duration"]) for plan in hook_plans
265
+ estimated_total_duration=float(
266
+ sum(int(float(str(plan["estimated_duration"]))) for plan in hook_plans)
267
267
  )
268
- + test_plan["estimated_duration"],
268
+ + float(test_plan["estimated_duration"]),
269
269
  )
270
270
 
271
271
  def _estimate_strategy_duration(self, strategy: HookStrategy) -> float: