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,497 @@
1
+ """Main CLI handlers that were originally in the monolithic handlers.py file.
2
+
3
+ This module contains the core handler functions that coordinate the main CLI
4
+ workflows and need to be separated from monitoring-specific handlers.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import asyncio
10
+ import os
11
+ import sys
12
+ from pathlib import Path
13
+
14
+ from acb.console import Console
15
+ from acb.depends import Inject, depends
16
+
17
+ from ..options import Options
18
+
19
+
20
+ @depends.inject # type: ignore[misc]
21
+ def setup_ai_agent_env(
22
+ ai_agent: bool, debug_mode: bool = False, console: Inject[Console] = None
23
+ ) -> None:
24
+ if debug_mode:
25
+ os.environ["CRACKERJACK_DEBUG"] = "1"
26
+
27
+ if ai_agent:
28
+ os.environ["AI_AGENT"] = "1"
29
+
30
+ if debug_mode:
31
+ os.environ["AI_AGENT_DEBUG"] = "1"
32
+ os.environ["AI_AGENT_VERBOSE"] = "1"
33
+
34
+ console.print(
35
+ "[bold cyan]🐛 AI Agent Debug Mode Configuration: [/ bold cyan]",
36
+ )
37
+ console.print(f" • AI Agent: {'✅ Enabled' if ai_agent else '❌ Disabled'}")
38
+ console.print(
39
+ f" • Debug Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else '❌ Disabled'}",
40
+ )
41
+ console.print(
42
+ f" • Verbose Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else '❌ Disabled'}",
43
+ )
44
+ console.print(" • Enhanced logging will be available during execution")
45
+ elif debug_mode: # Handle debug mode without AI agent
46
+ os.environ["AI_AGENT_DEBUG"] = "1"
47
+ os.environ["AI_AGENT_VERBOSE"] = "1"
48
+ console.print(
49
+ "[bold cyan]🐛 AI Debug Mode Configuration: [/ bold cyan]",
50
+ )
51
+ console.print(
52
+ f" • Debug Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else '❌ Disabled'}",
53
+ )
54
+ console.print(
55
+ f" • Verbose Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else '❌ Disabled'}",
56
+ )
57
+ console.print(" • Structured logging enabled for debugging")
58
+
59
+ # Set up structured logging if debug or ai_agent is enabled
60
+ if ai_agent or debug_mode:
61
+ from crackerjack.services.logging import setup_structured_logging
62
+
63
+ setup_structured_logging(level="DEBUG", json_output=True)
64
+
65
+
66
+ @depends.inject # type: ignore[misc]
67
+ def handle_interactive_mode(options: Options, console: Inject[Console] = None) -> None:
68
+ from crackerjack.cli.version import get_package_version
69
+
70
+ from ..interactive import launch_interactive_cli
71
+
72
+ pkg_version = get_package_version()
73
+ launch_interactive_cli(pkg_version, options)
74
+
75
+
76
+ @depends.inject # type: ignore[misc]
77
+ def handle_standard_mode(
78
+ options: Options,
79
+ async_mode: bool,
80
+ job_id: str | None = None,
81
+ orchestrated: bool = False,
82
+ console: Inject[Console] = None,
83
+ ) -> None:
84
+ # Run the async configure method in an isolated event loop
85
+
86
+ from crackerjack.executors.hook_lock_manager import hook_lock_manager
87
+
88
+ # Call the synchronous method directly
89
+ hook_lock_manager.configure_from_options(options)
90
+
91
+ # Phase 4.2 COMPLETE: ACB workflows are now the default
92
+ # Use --use-legacy-orchestrator to opt out and use the old orchestration system
93
+ if not getattr(options, "use_legacy_orchestrator", False):
94
+ # Default path: ACB workflow engine (Phase 4.2 complete)
95
+ # Only skip if user explicitly opted out with --use-legacy-orchestrator
96
+ handle_acb_workflow_mode(options, job_id, console)
97
+ return
98
+
99
+ # Legacy orchestrator path (only if use_legacy_orchestrator=True)
100
+ if orchestrated:
101
+ handle_orchestrated_mode(options, job_id)
102
+
103
+ # Default path: Legacy orchestrator (Phase 4.0 status)
104
+ if not orchestrated:
105
+ from crackerjack.core.async_workflow_orchestrator import (
106
+ AsyncWorkflowOrchestrator,
107
+ )
108
+ from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
109
+
110
+ pkg_path = Path.cwd()
111
+
112
+ if async_mode:
113
+ async_orchestrator = AsyncWorkflowOrchestrator(
114
+ console=console,
115
+ pkg_path=pkg_path,
116
+ dry_run=getattr(options, "dry_run", False),
117
+ web_job_id=job_id,
118
+ verbose=options.verbose,
119
+ debug=getattr(options, "debug", False),
120
+ changed_only=getattr(options, "changed_only", False),
121
+ )
122
+ success = asyncio.run(
123
+ async_orchestrator.run_complete_workflow_async(options)
124
+ )
125
+ else:
126
+ sync_orchestrator = WorkflowOrchestrator(
127
+ pkg_path=pkg_path,
128
+ dry_run=getattr(options, "dry_run", False),
129
+ web_job_id=job_id,
130
+ verbose=options.verbose,
131
+ debug=getattr(options, "debug", False),
132
+ changed_only=getattr(options, "changed_only", False),
133
+ )
134
+ success = sync_orchestrator.run_complete_workflow_sync(options)
135
+
136
+ if not success:
137
+ raise SystemExit(1)
138
+
139
+
140
+ @depends.inject # type: ignore[misc]
141
+ def handle_acb_workflow_mode(
142
+ options: Options,
143
+ job_id: str | None = None,
144
+ console: Inject[Console] = None,
145
+ ) -> None:
146
+ """Execute workflow using ACB workflow engine (Phase 3 Production).
147
+
148
+ This handler routes execution to the CrackerjackWorkflowEngine using
149
+ the WorkflowContainerBuilder to set up the full DI container with all
150
+ 28 services across 7 levels. Action handlers use WorkflowPipeline from
151
+ the container for production-quality workflow execution.
152
+
153
+ Args:
154
+ options: CLI options with use_acb_workflows=True
155
+ job_id: Optional WebSocket job ID for progress tracking
156
+ console: Rich console for output
157
+ """
158
+
159
+ from acb.depends import depends
160
+
161
+ from crackerjack.events.workflow_bus import WorkflowEventBus
162
+ from crackerjack.workflows import (
163
+ CrackerjackWorkflowEngine,
164
+ EventBridgeAdapter,
165
+ WorkflowContainerBuilder,
166
+ register_actions,
167
+ select_workflow_for_options,
168
+ )
169
+
170
+ console.print("[bold cyan]🚀 Crackerjack Workflow Engine (ACB-Powered)[/bold cyan]")
171
+
172
+ try:
173
+ # Phase 4: ACB workflows are now the default!
174
+ console.print(
175
+ "[dim]Building DI container (28 services across 7 levels)...[/dim]"
176
+ )
177
+ builder = WorkflowContainerBuilder(options, console=console)
178
+ builder.build()
179
+
180
+ # Validate all services are available
181
+ health = builder.health_check()
182
+ if not health["all_available"]:
183
+ missing = ", ".join(health["missing"])
184
+ console.print(f"[yellow]⚠️ Missing services: {missing}[/yellow]")
185
+ console.print(
186
+ "[yellow]Container health check failed, continuing with available services[/yellow]"
187
+ )
188
+
189
+ console.print("[dim]✓ DI container ready with WorkflowPipeline[/dim]")
190
+
191
+ # Register ACB Logger explicitly (needed for BasicWorkflowEngine)
192
+ from acb.logger import Logger
193
+
194
+ try:
195
+ logger = depends.get_sync(Logger)
196
+ except Exception:
197
+ # ACB Logger not available, this shouldn't happen but handle gracefully
198
+ import logging
199
+
200
+ logger = logging.getLogger("crackerjack")
201
+ depends.set(Logger, logger)
202
+
203
+ # Register WorkflowEventBus with DI container
204
+ event_bus = WorkflowEventBus()
205
+ depends.set(WorkflowEventBus, event_bus)
206
+
207
+ # Register EventBridgeAdapter BEFORE creating engine (engine needs it for DI!)
208
+ event_bridge = EventBridgeAdapter()
209
+ depends.set(EventBridgeAdapter, event_bridge)
210
+
211
+ # Initialize engine (EventBridgeAdapter will be injected)
212
+ engine = CrackerjackWorkflowEngine()
213
+
214
+ # Register action handlers with engine
215
+ register_actions(engine)
216
+
217
+ # Select workflow based on options (fast/comp/test/standard)
218
+ workflow = select_workflow_for_options(options)
219
+
220
+ console.print(f"[dim]Selected workflow: {workflow.name}[/dim]")
221
+
222
+ # Show orchestration status
223
+ from crackerjack.config import CrackerjackSettings
224
+
225
+ settings = depends.get_sync(CrackerjackSettings)
226
+ if settings.enable_orchestration:
227
+ mode_info = f" ({settings.orchestration_mode} mode)"
228
+ console.print(
229
+ f"[dim]Orchestration: [cyan]⚡ enabled[/cyan]{mode_info} - async hooks with caching[/dim]"
230
+ )
231
+
232
+ # Phase 4.1: Retrieve WorkflowPipeline from DI container (synchronous context)
233
+ # and pass it explicitly in workflow context to avoid async DI scope issues
234
+ from crackerjack.core.workflow_orchestrator import WorkflowPipeline
235
+
236
+ pipeline = depends.get_sync(WorkflowPipeline)
237
+
238
+ # Phase 4.2: All dependencies now use Inject[] instead of deprecated depends()
239
+ # This ensures they are properly resolved when retrieved from DI container
240
+
241
+ # Execute workflow with options and pipeline in context
242
+ result = asyncio.run(
243
+ engine.execute(
244
+ workflow,
245
+ context={
246
+ "options": options,
247
+ "pipeline": pipeline, # Pass pipeline with all dependencies properly resolved
248
+ },
249
+ )
250
+ )
251
+
252
+ # Check result and exit with appropriate code
253
+ from acb.workflows import WorkflowState
254
+
255
+ if result.state != WorkflowState.COMPLETED:
256
+ console.print(f"[red]Workflow failed: {result.error}[/red]")
257
+ raise SystemExit(1)
258
+
259
+ console.print("[bold green]✓ Workflow completed successfully[/bold green]")
260
+
261
+ except Exception as e:
262
+ import traceback
263
+
264
+ console.print(f"[red]ACB workflow execution failed: {e}[/red]")
265
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
266
+ console.print("[yellow]Falling back to legacy orchestrator[/yellow]")
267
+ # Enable legacy orchestrator flag and retry
268
+ options.use_legacy_orchestrator = True
269
+ options.use_acb_workflows = False
270
+ handle_standard_mode(options, False, job_id, False, console)
271
+
272
+
273
+ @depends.inject # type: ignore[misc]
274
+ def handle_orchestrated_mode(
275
+ options: Options, job_id: str | None = None, console: Inject[Console] = None
276
+ ) -> None:
277
+ console.print("[bold bright_blue]🚀 ORCHESTRATED MODE ENABLED[/ bold bright_blue]")
278
+
279
+ # Run the async configure method in an isolated event loop
280
+
281
+ from crackerjack.executors.hook_lock_manager import hook_lock_manager
282
+
283
+ # Call the synchronous method directly
284
+ hook_lock_manager.configure_from_options(options)
285
+
286
+ try:
287
+ from crackerjack.core.session_coordinator import SessionCoordinator
288
+ from crackerjack.orchestration.advanced_orchestrator import (
289
+ AdvancedWorkflowOrchestrator,
290
+ )
291
+ from crackerjack.orchestration.execution_strategies import (
292
+ AICoordinationMode,
293
+ ExecutionStrategy,
294
+ OrchestrationConfig,
295
+ ProgressLevel,
296
+ )
297
+ except ImportError as e:
298
+ console.print(f"[red]Orchestrated mode not available: {e}[/ red]")
299
+ console.print("[yellow]Falling back to standard mode[/ yellow]")
300
+ handle_standard_mode(options, False, job_id)
301
+ return
302
+
303
+ try:
304
+ strategy = ExecutionStrategy(options.orchestration_strategy)
305
+ except ValueError:
306
+ console.print(
307
+ f"[red]Invalid orchestration strategy: {options.orchestration_strategy}[/ red]",
308
+ )
309
+ strategy = ExecutionStrategy.ADAPTIVE
310
+
311
+ try:
312
+ progress = ProgressLevel(options.orchestration_progress)
313
+ except ValueError:
314
+ console.print(
315
+ f"[red]Invalid progress level: {options.orchestration_progress}[/ red]",
316
+ )
317
+ progress = ProgressLevel.GRANULAR
318
+
319
+ try:
320
+ ai_mode = AICoordinationMode(options.orchestration_ai_mode)
321
+ except ValueError:
322
+ console.print(f"[red]Invalid AI mode: {options.orchestration_ai_mode}[/ red]")
323
+ ai_mode = AICoordinationMode.SINGLE_AGENT
324
+
325
+ config = OrchestrationConfig(
326
+ execution_strategy=strategy,
327
+ progress_level=progress,
328
+ ai_coordination_mode=ai_mode,
329
+ )
330
+
331
+ console.print(f"[cyan]Execution Strategy: [/ cyan] {strategy.value}")
332
+ console.print(f"[cyan]Progress Level: [/ cyan] {progress.value}")
333
+ console.print(f"[cyan]AI Coordination: [/ cyan] {ai_mode.value}")
334
+
335
+ pkg_path = Path.cwd()
336
+ session = SessionCoordinator(console, pkg_path, web_job_id=job_id)
337
+ orchestrator = AdvancedWorkflowOrchestrator(console, pkg_path, session, config)
338
+
339
+ try:
340
+ success = asyncio.run(orchestrator.execute_orchestrated_workflow(options))
341
+ if success:
342
+ console.print(
343
+ "\n[bold green]🎉 ORCHESTRATED WORKFLOW COMPLETED SUCCESSFULLY ![/ bold green]",
344
+ )
345
+ else:
346
+ console.print("\n[bold red]❌ ORCHESTRATED WORKFLOW FAILED[/ bold red]")
347
+ sys.exit(1)
348
+ except KeyboardInterrupt:
349
+ console.print("\n[yellow]🛑 Orchestrated workflow interrupted[/ yellow]")
350
+ sys.exit(130)
351
+ except Exception as e:
352
+ console.print(f"\n[red]💥 Orchestrated workflow error: {e}[/ red]")
353
+ sys.exit(1)
354
+
355
+
356
+ @depends.inject # type: ignore[misc]
357
+ def handle_config_updates(options: Options, console: Inject[Console] = None) -> None:
358
+ """Handle configuration update commands."""
359
+ from crackerjack.services.quality.config_template import ConfigTemplateService
360
+
361
+ pkg_path = Path.cwd()
362
+ config_service = ConfigTemplateService(console, pkg_path)
363
+
364
+ if options.check_config_updates:
365
+ _handle_check_updates(config_service, pkg_path, console)
366
+ elif options.apply_config_updates:
367
+ _handle_apply_updates(
368
+ config_service, pkg_path, options.config_interactive, console
369
+ )
370
+ elif options.diff_config:
371
+ _handle_diff_config(config_service, pkg_path, options.diff_config, console)
372
+ elif options.refresh_cache:
373
+ _handle_refresh_cache(config_service, pkg_path, console)
374
+
375
+
376
+ @depends.inject # type: ignore[misc]
377
+ def _handle_check_updates(
378
+ config_service: ConfigTemplateService, pkg_path: Path, console: Inject[Console]
379
+ ) -> None:
380
+ """Handle checking for configuration updates."""
381
+ console.print("[bold cyan]🔍 Checking for configuration updates...[/bold cyan]")
382
+ updates = config_service.check_updates(pkg_path)
383
+
384
+ if not updates:
385
+ console.print("[green]✅ No configuration templates available[/green]")
386
+ return
387
+
388
+ has_updates = any(update.needs_update for update in updates.values())
389
+ if not has_updates:
390
+ console.print("[green]✅ All configurations are up to date[/green]")
391
+ return
392
+
393
+ _display_available_updates(updates, console)
394
+ console.print("\nUse --apply-config-updates to apply these updates")
395
+
396
+
397
+ @depends.inject # type: ignore[misc]
398
+ def _handle_apply_updates(
399
+ config_service: ConfigTemplateService,
400
+ pkg_path: Path,
401
+ interactive: bool,
402
+ console: Inject[Console],
403
+ ) -> None:
404
+ """Handle applying configuration updates."""
405
+ console.print("[bold cyan]🔧 Applying configuration updates...[/bold cyan]")
406
+ updates = config_service.check_updates(pkg_path)
407
+
408
+ if not updates:
409
+ console.print("[yellow]⚠️ No configuration templates available[/yellow]")
410
+ return
411
+
412
+ configs_to_update = _get_configs_needing_update(updates)
413
+ if not configs_to_update:
414
+ console.print("[green]✅ All configurations are already up to date[/green]")
415
+ return
416
+
417
+ success_count = _apply_config_updates_batch(
418
+ config_service, configs_to_update, pkg_path, interactive, console
419
+ )
420
+ _report_update_results(success_count, len(configs_to_update), console)
421
+
422
+
423
+ @depends.inject # type: ignore[misc]
424
+ def _handle_diff_config(
425
+ config_service: ConfigTemplateService,
426
+ pkg_path: Path,
427
+ config_type: str,
428
+ console: Inject[Console],
429
+ ) -> None:
430
+ """Handle showing configuration diff."""
431
+ console.print(f"[bold cyan]📊 Showing diff for {config_type}...[/bold cyan]")
432
+ diff_preview = config_service._generate_diff_preview(config_type, pkg_path)
433
+ console.print(f"\nChanges for {config_type}:")
434
+ console.print(diff_preview)
435
+
436
+
437
+ @depends.inject # type: ignore[misc]
438
+ def _handle_refresh_cache(
439
+ config_service: ConfigTemplateService, pkg_path: Path, console: Inject[Console]
440
+ ) -> None:
441
+ """Handle refreshing cache."""
442
+ console.print("[bold cyan]🧹 Refreshing cache...[/bold cyan]")
443
+ config_service._invalidate_cache(pkg_path)
444
+ console.print("[green]✅ Cache refreshed[/green]")
445
+
446
+
447
+ @depends.inject # type: ignore[misc]
448
+ def _display_available_updates(
449
+ updates: dict[str, ConfigUpdateInfo], console: Inject[Console]
450
+ ) -> None:
451
+ """Display available configuration updates."""
452
+ console.print("[yellow]📋 Available updates:[/yellow]")
453
+ for config_type, update_info in updates.items():
454
+ if update_info.needs_update:
455
+ console.print(
456
+ f" • {config_type}: {update_info.current_version} → {update_info.latest_version}"
457
+ )
458
+
459
+
460
+ def _get_configs_needing_update(updates: dict[str, ConfigUpdateInfo]) -> list[str]:
461
+ """Get list of configurations that need updates."""
462
+ return [
463
+ config_type
464
+ for config_type, update_info in updates.items()
465
+ if update_info.needs_update
466
+ ]
467
+
468
+
469
+ @depends.inject # type: ignore[misc]
470
+ def _apply_config_updates_batch(
471
+ config_service: ConfigTemplateService,
472
+ configs: list[str],
473
+ pkg_path: Path,
474
+ interactive: bool,
475
+ console: Inject[Console],
476
+ ) -> int:
477
+ """Apply configuration updates in batch and return success count."""
478
+ success_count = 0
479
+ for config_type in configs:
480
+ if config_service.apply_update(config_type, pkg_path, interactive=interactive):
481
+ success_count += 1
482
+ return success_count
483
+
484
+
485
+ @depends.inject # type: ignore[misc]
486
+ def _report_update_results(
487
+ success_count: int, total_count: int, console: Inject[Console]
488
+ ) -> None:
489
+ """Report the results of configuration updates."""
490
+ if success_count == total_count:
491
+ console.print(
492
+ f"[green]✅ Successfully updated {success_count} configurations[/green]"
493
+ )
494
+ else:
495
+ console.print(
496
+ f"[yellow]⚠️ Updated {success_count}/{total_count} configurations[/yellow]"
497
+ )