crackerjack 0.18.2__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 (533) hide show
  1. crackerjack/README.md +19 -0
  2. crackerjack/__init__.py +96 -2
  3. crackerjack/__main__.py +637 -138
  4. crackerjack/adapters/README.md +18 -0
  5. crackerjack/adapters/__init__.py +39 -0
  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/lsp/_base.py +194 -0
  27. crackerjack/adapters/lsp/_client.py +358 -0
  28. crackerjack/adapters/lsp/_manager.py +193 -0
  29. crackerjack/adapters/lsp/skylos.py +283 -0
  30. crackerjack/adapters/lsp/zuban.py +557 -0
  31. crackerjack/adapters/refactor/README.md +59 -0
  32. crackerjack/adapters/refactor/__init__.py +12 -0
  33. crackerjack/adapters/refactor/creosote.py +318 -0
  34. crackerjack/adapters/refactor/refurb.py +406 -0
  35. crackerjack/adapters/refactor/skylos.py +494 -0
  36. crackerjack/adapters/sast/README.md +132 -0
  37. crackerjack/adapters/sast/__init__.py +32 -0
  38. crackerjack/adapters/sast/_base.py +201 -0
  39. crackerjack/adapters/sast/bandit.py +423 -0
  40. crackerjack/adapters/sast/pyscn.py +405 -0
  41. crackerjack/adapters/sast/semgrep.py +241 -0
  42. crackerjack/adapters/security/README.md +111 -0
  43. crackerjack/adapters/security/__init__.py +17 -0
  44. crackerjack/adapters/security/gitleaks.py +339 -0
  45. crackerjack/adapters/type/README.md +52 -0
  46. crackerjack/adapters/type/__init__.py +12 -0
  47. crackerjack/adapters/type/pyrefly.py +402 -0
  48. crackerjack/adapters/type/ty.py +402 -0
  49. crackerjack/adapters/type/zuban.py +522 -0
  50. crackerjack/adapters/utility/README.md +51 -0
  51. crackerjack/adapters/utility/__init__.py +10 -0
  52. crackerjack/adapters/utility/checks.py +884 -0
  53. crackerjack/agents/README.md +264 -0
  54. crackerjack/agents/__init__.py +66 -0
  55. crackerjack/agents/architect_agent.py +238 -0
  56. crackerjack/agents/base.py +167 -0
  57. crackerjack/agents/claude_code_bridge.py +641 -0
  58. crackerjack/agents/coordinator.py +600 -0
  59. crackerjack/agents/documentation_agent.py +520 -0
  60. crackerjack/agents/dry_agent.py +585 -0
  61. crackerjack/agents/enhanced_coordinator.py +279 -0
  62. crackerjack/agents/enhanced_proactive_agent.py +185 -0
  63. crackerjack/agents/error_middleware.py +53 -0
  64. crackerjack/agents/formatting_agent.py +230 -0
  65. crackerjack/agents/helpers/__init__.py +9 -0
  66. crackerjack/agents/helpers/performance/__init__.py +22 -0
  67. crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
  68. crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
  69. crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
  70. crackerjack/agents/helpers/refactoring/__init__.py +22 -0
  71. crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
  72. crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
  73. crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
  74. crackerjack/agents/helpers/test_creation/__init__.py +19 -0
  75. crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
  76. crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
  77. crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
  78. crackerjack/agents/import_optimization_agent.py +1181 -0
  79. crackerjack/agents/performance_agent.py +325 -0
  80. crackerjack/agents/performance_helpers.py +205 -0
  81. crackerjack/agents/proactive_agent.py +55 -0
  82. crackerjack/agents/refactoring_agent.py +511 -0
  83. crackerjack/agents/refactoring_helpers.py +247 -0
  84. crackerjack/agents/security_agent.py +793 -0
  85. crackerjack/agents/semantic_agent.py +479 -0
  86. crackerjack/agents/semantic_helpers.py +356 -0
  87. crackerjack/agents/test_creation_agent.py +570 -0
  88. crackerjack/agents/test_specialist_agent.py +526 -0
  89. crackerjack/agents/tracker.py +110 -0
  90. crackerjack/api.py +647 -0
  91. crackerjack/cli/README.md +394 -0
  92. crackerjack/cli/__init__.py +24 -0
  93. crackerjack/cli/cache_handlers.py +209 -0
  94. crackerjack/cli/cache_handlers_enhanced.py +680 -0
  95. crackerjack/cli/facade.py +162 -0
  96. crackerjack/cli/formatting.py +13 -0
  97. crackerjack/cli/handlers/__init__.py +85 -0
  98. crackerjack/cli/handlers/advanced.py +103 -0
  99. crackerjack/cli/handlers/ai_features.py +62 -0
  100. crackerjack/cli/handlers/analytics.py +479 -0
  101. crackerjack/cli/handlers/changelog.py +271 -0
  102. crackerjack/cli/handlers/config_handlers.py +16 -0
  103. crackerjack/cli/handlers/coverage.py +84 -0
  104. crackerjack/cli/handlers/documentation.py +280 -0
  105. crackerjack/cli/handlers/main_handlers.py +497 -0
  106. crackerjack/cli/handlers/monitoring.py +371 -0
  107. crackerjack/cli/handlers.py +700 -0
  108. crackerjack/cli/interactive.py +488 -0
  109. crackerjack/cli/options.py +1216 -0
  110. crackerjack/cli/semantic_handlers.py +292 -0
  111. crackerjack/cli/utils.py +19 -0
  112. crackerjack/cli/version.py +19 -0
  113. crackerjack/code_cleaner.py +1307 -0
  114. crackerjack/config/README.md +472 -0
  115. crackerjack/config/__init__.py +275 -0
  116. crackerjack/config/global_lock_config.py +207 -0
  117. crackerjack/config/hooks.py +390 -0
  118. crackerjack/config/loader.py +239 -0
  119. crackerjack/config/settings.py +141 -0
  120. crackerjack/config/tool_commands.py +331 -0
  121. crackerjack/core/README.md +393 -0
  122. crackerjack/core/__init__.py +0 -0
  123. crackerjack/core/async_workflow_orchestrator.py +738 -0
  124. crackerjack/core/autofix_coordinator.py +282 -0
  125. crackerjack/core/container.py +105 -0
  126. crackerjack/core/enhanced_container.py +583 -0
  127. crackerjack/core/file_lifecycle.py +472 -0
  128. crackerjack/core/performance.py +244 -0
  129. crackerjack/core/performance_monitor.py +357 -0
  130. crackerjack/core/phase_coordinator.py +1227 -0
  131. crackerjack/core/proactive_workflow.py +267 -0
  132. crackerjack/core/resource_manager.py +425 -0
  133. crackerjack/core/retry.py +275 -0
  134. crackerjack/core/service_watchdog.py +601 -0
  135. crackerjack/core/session_coordinator.py +239 -0
  136. crackerjack/core/timeout_manager.py +563 -0
  137. crackerjack/core/websocket_lifecycle.py +410 -0
  138. crackerjack/core/workflow/__init__.py +21 -0
  139. crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
  140. crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
  141. crackerjack/core/workflow/workflow_issue_parser.py +714 -0
  142. crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
  143. crackerjack/core/workflow/workflow_security_gates.py +400 -0
  144. crackerjack/core/workflow_orchestrator.py +2243 -0
  145. crackerjack/data/README.md +11 -0
  146. crackerjack/data/__init__.py +8 -0
  147. crackerjack/data/models.py +79 -0
  148. crackerjack/data/repository.py +210 -0
  149. crackerjack/decorators/README.md +180 -0
  150. crackerjack/decorators/__init__.py +35 -0
  151. crackerjack/decorators/error_handling.py +649 -0
  152. crackerjack/decorators/error_handling_decorators.py +334 -0
  153. crackerjack/decorators/helpers.py +58 -0
  154. crackerjack/decorators/patterns.py +281 -0
  155. crackerjack/decorators/utils.py +58 -0
  156. crackerjack/docs/INDEX.md +11 -0
  157. crackerjack/docs/README.md +11 -0
  158. crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
  159. crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
  160. crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
  161. crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
  162. crackerjack/docs/generated/api/SERVICES.md +1252 -0
  163. crackerjack/documentation/README.md +11 -0
  164. crackerjack/documentation/__init__.py +31 -0
  165. crackerjack/documentation/ai_templates.py +756 -0
  166. crackerjack/documentation/dual_output_generator.py +767 -0
  167. crackerjack/documentation/mkdocs_integration.py +518 -0
  168. crackerjack/documentation/reference_generator.py +1065 -0
  169. crackerjack/dynamic_config.py +678 -0
  170. crackerjack/errors.py +378 -0
  171. crackerjack/events/README.md +11 -0
  172. crackerjack/events/__init__.py +16 -0
  173. crackerjack/events/telemetry.py +175 -0
  174. crackerjack/events/workflow_bus.py +346 -0
  175. crackerjack/exceptions/README.md +301 -0
  176. crackerjack/exceptions/__init__.py +5 -0
  177. crackerjack/exceptions/config.py +4 -0
  178. crackerjack/exceptions/tool_execution_error.py +245 -0
  179. crackerjack/executors/README.md +591 -0
  180. crackerjack/executors/__init__.py +13 -0
  181. crackerjack/executors/async_hook_executor.py +938 -0
  182. crackerjack/executors/cached_hook_executor.py +316 -0
  183. crackerjack/executors/hook_executor.py +1295 -0
  184. crackerjack/executors/hook_lock_manager.py +708 -0
  185. crackerjack/executors/individual_hook_executor.py +739 -0
  186. crackerjack/executors/lsp_aware_hook_executor.py +349 -0
  187. crackerjack/executors/progress_hook_executor.py +282 -0
  188. crackerjack/executors/tool_proxy.py +433 -0
  189. crackerjack/hooks/README.md +485 -0
  190. crackerjack/hooks/lsp_hook.py +93 -0
  191. crackerjack/intelligence/README.md +557 -0
  192. crackerjack/intelligence/__init__.py +37 -0
  193. crackerjack/intelligence/adaptive_learning.py +693 -0
  194. crackerjack/intelligence/agent_orchestrator.py +485 -0
  195. crackerjack/intelligence/agent_registry.py +377 -0
  196. crackerjack/intelligence/agent_selector.py +439 -0
  197. crackerjack/intelligence/integration.py +250 -0
  198. crackerjack/interactive.py +719 -0
  199. crackerjack/managers/README.md +369 -0
  200. crackerjack/managers/__init__.py +11 -0
  201. crackerjack/managers/async_hook_manager.py +135 -0
  202. crackerjack/managers/hook_manager.py +585 -0
  203. crackerjack/managers/publish_manager.py +631 -0
  204. crackerjack/managers/test_command_builder.py +391 -0
  205. crackerjack/managers/test_executor.py +474 -0
  206. crackerjack/managers/test_manager.py +1357 -0
  207. crackerjack/managers/test_progress.py +187 -0
  208. crackerjack/mcp/README.md +374 -0
  209. crackerjack/mcp/__init__.py +0 -0
  210. crackerjack/mcp/cache.py +352 -0
  211. crackerjack/mcp/client_runner.py +121 -0
  212. crackerjack/mcp/context.py +802 -0
  213. crackerjack/mcp/dashboard.py +657 -0
  214. crackerjack/mcp/enhanced_progress_monitor.py +493 -0
  215. crackerjack/mcp/file_monitor.py +394 -0
  216. crackerjack/mcp/progress_components.py +607 -0
  217. crackerjack/mcp/progress_monitor.py +1016 -0
  218. crackerjack/mcp/rate_limiter.py +336 -0
  219. crackerjack/mcp/server.py +24 -0
  220. crackerjack/mcp/server_core.py +526 -0
  221. crackerjack/mcp/service_watchdog.py +505 -0
  222. crackerjack/mcp/state.py +407 -0
  223. crackerjack/mcp/task_manager.py +259 -0
  224. crackerjack/mcp/tools/README.md +27 -0
  225. crackerjack/mcp/tools/__init__.py +19 -0
  226. crackerjack/mcp/tools/core_tools.py +469 -0
  227. crackerjack/mcp/tools/error_analyzer.py +283 -0
  228. crackerjack/mcp/tools/execution_tools.py +384 -0
  229. crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
  230. crackerjack/mcp/tools/intelligence_tools.py +264 -0
  231. crackerjack/mcp/tools/monitoring_tools.py +628 -0
  232. crackerjack/mcp/tools/proactive_tools.py +367 -0
  233. crackerjack/mcp/tools/progress_tools.py +222 -0
  234. crackerjack/mcp/tools/semantic_tools.py +584 -0
  235. crackerjack/mcp/tools/utility_tools.py +358 -0
  236. crackerjack/mcp/tools/workflow_executor.py +699 -0
  237. crackerjack/mcp/websocket/README.md +31 -0
  238. crackerjack/mcp/websocket/__init__.py +14 -0
  239. crackerjack/mcp/websocket/app.py +54 -0
  240. crackerjack/mcp/websocket/endpoints.py +492 -0
  241. crackerjack/mcp/websocket/event_bridge.py +188 -0
  242. crackerjack/mcp/websocket/jobs.py +406 -0
  243. crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
  244. crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
  245. crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
  246. crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
  247. crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
  248. crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
  249. crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
  250. crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
  251. crackerjack/mcp/websocket/monitoring/factory.py +109 -0
  252. crackerjack/mcp/websocket/monitoring/filters.py +10 -0
  253. crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
  254. crackerjack/mcp/websocket/monitoring/models.py +90 -0
  255. crackerjack/mcp/websocket/monitoring/utils.py +171 -0
  256. crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
  257. crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
  258. crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
  259. crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
  260. crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
  261. crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
  262. crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
  263. crackerjack/mcp/websocket/server.py +174 -0
  264. crackerjack/mcp/websocket/websocket_handler.py +276 -0
  265. crackerjack/mcp/websocket_server.py +10 -0
  266. crackerjack/models/README.md +308 -0
  267. crackerjack/models/__init__.py +40 -0
  268. crackerjack/models/config.py +730 -0
  269. crackerjack/models/config_adapter.py +265 -0
  270. crackerjack/models/protocols.py +1535 -0
  271. crackerjack/models/pydantic_models.py +320 -0
  272. crackerjack/models/qa_config.py +145 -0
  273. crackerjack/models/qa_results.py +134 -0
  274. crackerjack/models/resource_protocols.py +299 -0
  275. crackerjack/models/results.py +35 -0
  276. crackerjack/models/semantic_models.py +258 -0
  277. crackerjack/models/task.py +173 -0
  278. crackerjack/models/test_models.py +60 -0
  279. crackerjack/monitoring/README.md +11 -0
  280. crackerjack/monitoring/__init__.py +0 -0
  281. crackerjack/monitoring/ai_agent_watchdog.py +405 -0
  282. crackerjack/monitoring/metrics_collector.py +427 -0
  283. crackerjack/monitoring/regression_prevention.py +580 -0
  284. crackerjack/monitoring/websocket_server.py +406 -0
  285. crackerjack/orchestration/README.md +340 -0
  286. crackerjack/orchestration/__init__.py +43 -0
  287. crackerjack/orchestration/advanced_orchestrator.py +894 -0
  288. crackerjack/orchestration/cache/README.md +312 -0
  289. crackerjack/orchestration/cache/__init__.py +37 -0
  290. crackerjack/orchestration/cache/memory_cache.py +338 -0
  291. crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
  292. crackerjack/orchestration/config.py +297 -0
  293. crackerjack/orchestration/coverage_improvement.py +180 -0
  294. crackerjack/orchestration/execution_strategies.py +361 -0
  295. crackerjack/orchestration/hook_orchestrator.py +1398 -0
  296. crackerjack/orchestration/strategies/README.md +401 -0
  297. crackerjack/orchestration/strategies/__init__.py +39 -0
  298. crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
  299. crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
  300. crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
  301. crackerjack/orchestration/test_progress_streamer.py +647 -0
  302. crackerjack/plugins/README.md +11 -0
  303. crackerjack/plugins/__init__.py +15 -0
  304. crackerjack/plugins/base.py +200 -0
  305. crackerjack/plugins/hooks.py +254 -0
  306. crackerjack/plugins/loader.py +335 -0
  307. crackerjack/plugins/managers.py +264 -0
  308. crackerjack/py313.py +191 -0
  309. crackerjack/security/README.md +11 -0
  310. crackerjack/security/__init__.py +0 -0
  311. crackerjack/security/audit.py +197 -0
  312. crackerjack/services/README.md +374 -0
  313. crackerjack/services/__init__.py +9 -0
  314. crackerjack/services/ai/README.md +295 -0
  315. crackerjack/services/ai/__init__.py +7 -0
  316. crackerjack/services/ai/advanced_optimizer.py +878 -0
  317. crackerjack/services/ai/contextual_ai_assistant.py +542 -0
  318. crackerjack/services/ai/embeddings.py +444 -0
  319. crackerjack/services/ai/intelligent_commit.py +328 -0
  320. crackerjack/services/ai/predictive_analytics.py +510 -0
  321. crackerjack/services/anomaly_detector.py +392 -0
  322. crackerjack/services/api_extractor.py +617 -0
  323. crackerjack/services/backup_service.py +467 -0
  324. crackerjack/services/bounded_status_operations.py +530 -0
  325. crackerjack/services/cache.py +369 -0
  326. crackerjack/services/changelog_automation.py +399 -0
  327. crackerjack/services/command_execution_service.py +305 -0
  328. crackerjack/services/config_integrity.py +132 -0
  329. crackerjack/services/config_merge.py +546 -0
  330. crackerjack/services/config_service.py +198 -0
  331. crackerjack/services/config_template.py +493 -0
  332. crackerjack/services/coverage_badge_service.py +173 -0
  333. crackerjack/services/coverage_ratchet.py +381 -0
  334. crackerjack/services/debug.py +733 -0
  335. crackerjack/services/dependency_analyzer.py +460 -0
  336. crackerjack/services/dependency_monitor.py +622 -0
  337. crackerjack/services/documentation_generator.py +493 -0
  338. crackerjack/services/documentation_service.py +704 -0
  339. crackerjack/services/enhanced_filesystem.py +497 -0
  340. crackerjack/services/enterprise_optimizer.py +865 -0
  341. crackerjack/services/error_pattern_analyzer.py +676 -0
  342. crackerjack/services/file_filter.py +221 -0
  343. crackerjack/services/file_hasher.py +149 -0
  344. crackerjack/services/file_io_service.py +361 -0
  345. crackerjack/services/file_modifier.py +615 -0
  346. crackerjack/services/filesystem.py +381 -0
  347. crackerjack/services/git.py +422 -0
  348. crackerjack/services/health_metrics.py +615 -0
  349. crackerjack/services/heatmap_generator.py +744 -0
  350. crackerjack/services/incremental_executor.py +380 -0
  351. crackerjack/services/initialization.py +823 -0
  352. crackerjack/services/input_validator.py +668 -0
  353. crackerjack/services/intelligent_commit.py +327 -0
  354. crackerjack/services/log_manager.py +289 -0
  355. crackerjack/services/logging.py +228 -0
  356. crackerjack/services/lsp_client.py +628 -0
  357. crackerjack/services/memory_optimizer.py +414 -0
  358. crackerjack/services/metrics.py +587 -0
  359. crackerjack/services/monitoring/README.md +30 -0
  360. crackerjack/services/monitoring/__init__.py +9 -0
  361. crackerjack/services/monitoring/dependency_monitor.py +678 -0
  362. crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
  363. crackerjack/services/monitoring/health_metrics.py +716 -0
  364. crackerjack/services/monitoring/metrics.py +587 -0
  365. crackerjack/services/monitoring/performance_benchmarks.py +410 -0
  366. crackerjack/services/monitoring/performance_cache.py +388 -0
  367. crackerjack/services/monitoring/performance_monitor.py +569 -0
  368. crackerjack/services/parallel_executor.py +527 -0
  369. crackerjack/services/pattern_cache.py +333 -0
  370. crackerjack/services/pattern_detector.py +478 -0
  371. crackerjack/services/patterns/__init__.py +142 -0
  372. crackerjack/services/patterns/agents.py +107 -0
  373. crackerjack/services/patterns/code/__init__.py +15 -0
  374. crackerjack/services/patterns/code/detection.py +118 -0
  375. crackerjack/services/patterns/code/imports.py +107 -0
  376. crackerjack/services/patterns/code/paths.py +159 -0
  377. crackerjack/services/patterns/code/performance.py +119 -0
  378. crackerjack/services/patterns/code/replacement.py +36 -0
  379. crackerjack/services/patterns/core.py +212 -0
  380. crackerjack/services/patterns/documentation/__init__.py +14 -0
  381. crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
  382. crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
  383. crackerjack/services/patterns/documentation/docstrings.py +89 -0
  384. crackerjack/services/patterns/formatting.py +226 -0
  385. crackerjack/services/patterns/operations.py +339 -0
  386. crackerjack/services/patterns/security/__init__.py +23 -0
  387. crackerjack/services/patterns/security/code_injection.py +122 -0
  388. crackerjack/services/patterns/security/credentials.py +190 -0
  389. crackerjack/services/patterns/security/path_traversal.py +221 -0
  390. crackerjack/services/patterns/security/unsafe_operations.py +216 -0
  391. crackerjack/services/patterns/templates.py +62 -0
  392. crackerjack/services/patterns/testing/__init__.py +18 -0
  393. crackerjack/services/patterns/testing/error_patterns.py +107 -0
  394. crackerjack/services/patterns/testing/pytest_output.py +126 -0
  395. crackerjack/services/patterns/tool_output/__init__.py +16 -0
  396. crackerjack/services/patterns/tool_output/bandit.py +72 -0
  397. crackerjack/services/patterns/tool_output/other.py +97 -0
  398. crackerjack/services/patterns/tool_output/pyright.py +67 -0
  399. crackerjack/services/patterns/tool_output/ruff.py +44 -0
  400. crackerjack/services/patterns/url_sanitization.py +114 -0
  401. crackerjack/services/patterns/utilities.py +42 -0
  402. crackerjack/services/patterns/utils.py +339 -0
  403. crackerjack/services/patterns/validation.py +46 -0
  404. crackerjack/services/patterns/versioning.py +62 -0
  405. crackerjack/services/predictive_analytics.py +523 -0
  406. crackerjack/services/profiler.py +280 -0
  407. crackerjack/services/quality/README.md +415 -0
  408. crackerjack/services/quality/__init__.py +11 -0
  409. crackerjack/services/quality/anomaly_detector.py +392 -0
  410. crackerjack/services/quality/pattern_cache.py +333 -0
  411. crackerjack/services/quality/pattern_detector.py +479 -0
  412. crackerjack/services/quality/qa_orchestrator.py +491 -0
  413. crackerjack/services/quality/quality_baseline.py +395 -0
  414. crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
  415. crackerjack/services/quality/quality_intelligence.py +949 -0
  416. crackerjack/services/regex_patterns.py +58 -0
  417. crackerjack/services/regex_utils.py +483 -0
  418. crackerjack/services/secure_path_utils.py +524 -0
  419. crackerjack/services/secure_status_formatter.py +450 -0
  420. crackerjack/services/secure_subprocess.py +635 -0
  421. crackerjack/services/security.py +239 -0
  422. crackerjack/services/security_logger.py +495 -0
  423. crackerjack/services/server_manager.py +411 -0
  424. crackerjack/services/smart_scheduling.py +167 -0
  425. crackerjack/services/status_authentication.py +460 -0
  426. crackerjack/services/status_security_manager.py +315 -0
  427. crackerjack/services/terminal_utils.py +0 -0
  428. crackerjack/services/thread_safe_status_collector.py +441 -0
  429. crackerjack/services/tool_filter.py +368 -0
  430. crackerjack/services/tool_version_service.py +43 -0
  431. crackerjack/services/unified_config.py +115 -0
  432. crackerjack/services/validation_rate_limiter.py +220 -0
  433. crackerjack/services/vector_store.py +689 -0
  434. crackerjack/services/version_analyzer.py +461 -0
  435. crackerjack/services/version_checker.py +223 -0
  436. crackerjack/services/websocket_resource_limiter.py +438 -0
  437. crackerjack/services/zuban_lsp_service.py +391 -0
  438. crackerjack/slash_commands/README.md +11 -0
  439. crackerjack/slash_commands/__init__.py +59 -0
  440. crackerjack/slash_commands/init.md +112 -0
  441. crackerjack/slash_commands/run.md +197 -0
  442. crackerjack/slash_commands/status.md +127 -0
  443. crackerjack/tools/README.md +11 -0
  444. crackerjack/tools/__init__.py +30 -0
  445. crackerjack/tools/_git_utils.py +105 -0
  446. crackerjack/tools/check_added_large_files.py +139 -0
  447. crackerjack/tools/check_ast.py +105 -0
  448. crackerjack/tools/check_json.py +103 -0
  449. crackerjack/tools/check_jsonschema.py +297 -0
  450. crackerjack/tools/check_toml.py +103 -0
  451. crackerjack/tools/check_yaml.py +110 -0
  452. crackerjack/tools/codespell_wrapper.py +72 -0
  453. crackerjack/tools/end_of_file_fixer.py +202 -0
  454. crackerjack/tools/format_json.py +128 -0
  455. crackerjack/tools/mdformat_wrapper.py +114 -0
  456. crackerjack/tools/trailing_whitespace.py +198 -0
  457. crackerjack/tools/validate_input_validator_patterns.py +236 -0
  458. crackerjack/tools/validate_regex_patterns.py +188 -0
  459. crackerjack/ui/README.md +11 -0
  460. crackerjack/ui/__init__.py +1 -0
  461. crackerjack/ui/dashboard_renderer.py +28 -0
  462. crackerjack/ui/templates/README.md +11 -0
  463. crackerjack/utils/console_utils.py +13 -0
  464. crackerjack/utils/dependency_guard.py +230 -0
  465. crackerjack/utils/retry_utils.py +275 -0
  466. crackerjack/workflows/README.md +590 -0
  467. crackerjack/workflows/__init__.py +46 -0
  468. crackerjack/workflows/actions.py +811 -0
  469. crackerjack/workflows/auto_fix.py +444 -0
  470. crackerjack/workflows/container_builder.py +499 -0
  471. crackerjack/workflows/definitions.py +443 -0
  472. crackerjack/workflows/engine.py +177 -0
  473. crackerjack/workflows/event_bridge.py +242 -0
  474. crackerjack-0.45.2.dist-info/METADATA +1678 -0
  475. crackerjack-0.45.2.dist-info/RECORD +478 -0
  476. {crackerjack-0.18.2.dist-info โ†’ crackerjack-0.45.2.dist-info}/WHEEL +1 -1
  477. crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
  478. crackerjack/.gitignore +0 -14
  479. crackerjack/.libcst.codemod.yaml +0 -18
  480. crackerjack/.pdm.toml +0 -1
  481. crackerjack/.pre-commit-config.yaml +0 -91
  482. crackerjack/.pytest_cache/.gitignore +0 -2
  483. crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
  484. crackerjack/.pytest_cache/README.md +0 -8
  485. crackerjack/.pytest_cache/v/cache/nodeids +0 -1
  486. crackerjack/.pytest_cache/v/cache/stepwise +0 -1
  487. crackerjack/.ruff_cache/.gitignore +0 -1
  488. crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
  489. crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
  490. crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
  491. crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
  492. crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
  493. crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
  494. crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
  495. crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
  496. crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
  497. crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
  498. crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
  499. crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
  500. crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
  501. crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
  502. crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
  503. crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
  504. crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
  505. crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
  506. crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
  507. crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
  508. crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
  509. crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
  510. crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
  511. crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
  512. crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
  513. crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
  514. crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
  515. crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
  516. crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
  517. crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
  518. crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
  519. crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
  520. crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
  521. crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
  522. crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
  523. crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
  524. crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
  525. crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
  526. crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
  527. crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
  528. crackerjack/crackerjack.py +0 -855
  529. crackerjack/pyproject.toml +0 -214
  530. crackerjack-0.18.2.dist-info/METADATA +0 -420
  531. crackerjack-0.18.2.dist-info/RECORD +0 -59
  532. crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
  533. {crackerjack-0.18.2.dist-info โ†’ crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,700 @@
1
+ import asyncio
2
+ import os
3
+ import sys
4
+ import typing as t
5
+ from pathlib import Path
6
+
7
+ from acb.console import Console
8
+ from acb.depends import Inject, depends
9
+
10
+ from .options import Options
11
+
12
+ if t.TYPE_CHECKING:
13
+ from crackerjack.services.quality.config_template import (
14
+ ConfigTemplateService,
15
+ ConfigUpdateInfo,
16
+ )
17
+
18
+
19
+ @depends.inject # type: ignore[misc]
20
+ def setup_ai_agent_env(
21
+ ai_agent: bool, debug_mode: bool = False, console: Inject[Console] = None
22
+ ) -> None:
23
+ if debug_mode:
24
+ os.environ["CRACKERJACK_DEBUG"] = "1"
25
+
26
+ if ai_agent:
27
+ os.environ["AI_AGENT"] = "1"
28
+
29
+ if debug_mode:
30
+ os.environ["AI_AGENT_DEBUG"] = "1"
31
+ os.environ["AI_AGENT_VERBOSE"] = "1"
32
+
33
+ console.print(
34
+ "[bold cyan]๐Ÿ› AI Agent Debug Mode Configuration: [/ bold cyan]",
35
+ )
36
+ console.print(f" โ€ข AI Agent: {'โœ… Enabled' if ai_agent else 'โŒ Disabled'}")
37
+ console.print(
38
+ f" โ€ข Debug Mode: {'โœ… Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else 'โŒ Disabled'}",
39
+ )
40
+ console.print(
41
+ f" โ€ข Verbose Mode: {'โœ… Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else 'โŒ Disabled'}",
42
+ )
43
+ console.print(" โ€ข Enhanced logging will be available during execution")
44
+ elif debug_mode: # Handle debug mode without AI agent
45
+ os.environ["AI_AGENT_DEBUG"] = "1"
46
+ os.environ["AI_AGENT_VERBOSE"] = "1"
47
+ console.print(
48
+ "[bold cyan]๐Ÿ› AI Debug Mode Configuration: [/ bold cyan]",
49
+ )
50
+ console.print(
51
+ f" โ€ข Debug Mode: {'โœ… Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else 'โŒ Disabled'}",
52
+ )
53
+ console.print(
54
+ f" โ€ข Verbose Mode: {'โœ… Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else 'โŒ Disabled'}",
55
+ )
56
+ console.print(" โ€ข Structured logging enabled for debugging")
57
+
58
+ # Set up structured logging if debug or ai_agent is enabled
59
+ if ai_agent or debug_mode:
60
+ from crackerjack.services.logging import setup_structured_logging
61
+
62
+ setup_structured_logging(level="DEBUG", json_output=True)
63
+
64
+
65
+ def handle_mcp_server(websocket_port: int | None = None) -> None:
66
+ from crackerjack.mcp.server import main as start_mcp_main
67
+
68
+ project_path = str(Path.cwd())
69
+
70
+ if websocket_port:
71
+ start_mcp_main(project_path, websocket_port)
72
+ else:
73
+ start_mcp_main(project_path)
74
+
75
+
76
+ @depends.inject # type: ignore[misc]
77
+ def handle_monitor_mode(
78
+ dev_mode: bool = False, console: Inject[Console] = None
79
+ ) -> None:
80
+ from crackerjack.mcp.progress_monitor import run_progress_monitor
81
+
82
+ console.print("[bold cyan]๐ŸŒŸ Starting Multi-Project Progress Monitor[/ bold cyan]")
83
+ console.print(
84
+ "[bold yellow]๐Ÿ• With integrated Service Watchdog and WebSocket polling[/ bold yellow]",
85
+ )
86
+
87
+ try:
88
+ asyncio.run(run_progress_monitor(dev_mode=dev_mode))
89
+ except KeyboardInterrupt:
90
+ console.print("\n[yellow]๐Ÿ›‘ Monitor stopped[/ yellow]")
91
+
92
+
93
+ @depends.inject # type: ignore[misc]
94
+ def handle_enhanced_monitor_mode(
95
+ dev_mode: bool = False, console: Inject[Console] = None
96
+ ) -> None:
97
+ from crackerjack.mcp.enhanced_progress_monitor import run_enhanced_progress_monitor
98
+
99
+ console.print("[bold magenta]โœจ Starting Enhanced Progress Monitor[/ bold magenta]")
100
+ console.print(
101
+ "[bold cyan]๐Ÿ“Š With advanced MetricCard widgets and modern web UI patterns[/ bold cyan]",
102
+ )
103
+
104
+ try:
105
+ asyncio.run(run_enhanced_progress_monitor(dev_mode=dev_mode))
106
+ except KeyboardInterrupt:
107
+ console.print("\n[yellow]๐Ÿ›‘ Enhanced Monitor stopped[/ yellow]")
108
+
109
+
110
+ @depends.inject # type: ignore[misc]
111
+ def handle_dashboard_mode(
112
+ dev_mode: bool = False, console: Inject[Console] = None
113
+ ) -> None:
114
+ from crackerjack.mcp.dashboard import run_dashboard
115
+
116
+ console.print("[bold green]๐ŸŽฏ Starting Comprehensive Dashboard[/ bold green]")
117
+ console.print(
118
+ "[bold cyan]๐Ÿ“ˆ With system metrics, job tracking, and performance monitoring[/ bold cyan]",
119
+ )
120
+
121
+ try:
122
+ run_dashboard()
123
+ except KeyboardInterrupt:
124
+ console.print("\n[yellow]๐Ÿ›‘ Dashboard stopped[/ yellow]")
125
+
126
+
127
+ @depends.inject # type: ignore[misc]
128
+ def handle_unified_dashboard_mode(
129
+ port: int = 8675, dev_mode: bool = False, console: Inject[Console] = None
130
+ ) -> None:
131
+ from crackerjack.monitoring.websocket_server import CrackerjackMonitoringServer
132
+
133
+ console.print("[bold green]๐Ÿš€ Starting Unified Monitoring Dashboard[/bold green]")
134
+ console.print(
135
+ f"[bold cyan]๐ŸŒ WebSocket server on port {port} with real-time streaming and web UI[/bold cyan]",
136
+ )
137
+
138
+ try:
139
+ server = CrackerjackMonitoringServer()
140
+ asyncio.run(server.start_monitoring(port))
141
+ except KeyboardInterrupt:
142
+ console.print("\n[yellow]๐Ÿ›‘ Unified Dashboard stopped[/yellow]")
143
+ except Exception as e:
144
+ console.print(f"\n[red]โŒ Unified Dashboard failed: {e}[/red]")
145
+
146
+
147
+ @depends.inject # type: ignore[misc]
148
+ def handle_watchdog_mode(console: Inject[Console] = None) -> None:
149
+ from crackerjack.mcp.service_watchdog import main as start_watchdog
150
+
151
+ try:
152
+ asyncio.run(start_watchdog())
153
+ except KeyboardInterrupt:
154
+ console.print("\n[yellow]๐Ÿ›‘ Watchdog stopped[/ yellow]")
155
+
156
+
157
+ def handle_start_websocket_server(port: int = 8675) -> None:
158
+ from crackerjack.mcp.websocket.server import handle_websocket_server_command
159
+
160
+ handle_websocket_server_command(start=True, port=port)
161
+
162
+
163
+ def handle_stop_websocket_server() -> None:
164
+ from crackerjack.mcp.websocket.server import handle_websocket_server_command
165
+
166
+ handle_websocket_server_command(stop=True)
167
+
168
+
169
+ def handle_restart_websocket_server(port: int = 8675) -> None:
170
+ from crackerjack.mcp.websocket.server import handle_websocket_server_command
171
+
172
+ handle_websocket_server_command(restart=True, port=port)
173
+
174
+
175
+ @depends.inject # type: ignore[misc]
176
+ def handle_stop_mcp_server(console: Inject[Console] = None) -> None:
177
+ from crackerjack.services.server_manager import (
178
+ list_server_status,
179
+ stop_all_servers,
180
+ )
181
+
182
+ console.print("[bold red]๐Ÿ›‘ Stopping MCP Servers[/ bold red]")
183
+
184
+ list_server_status(console)
185
+
186
+ if stop_all_servers(console):
187
+ console.print("\n[bold green]โœ… All servers stopped successfully[/ bold green]")
188
+ else:
189
+ console.print("\n[bold red]โŒ Some servers failed to stop[/ bold red]")
190
+ raise SystemExit(1)
191
+
192
+
193
+ @depends.inject # type: ignore[misc]
194
+ def handle_restart_mcp_server(
195
+ websocket_port: int | None = None, console: Inject[Console] = None
196
+ ) -> None:
197
+ from crackerjack.services.server_manager import restart_mcp_server
198
+
199
+ if restart_mcp_server(websocket_port, console):
200
+ console.print("\n[bold green]โœ… MCP server restart completed[/ bold green]")
201
+ else:
202
+ console.print("\n[bold red]โŒ MCP server restart failed[/ bold red]")
203
+ raise SystemExit(1)
204
+
205
+
206
+ @depends.inject # type: ignore[misc]
207
+ def handle_start_zuban_lsp(
208
+ port: int = 8677, mode: str = "tcp", console: Inject[Console] = None
209
+ ) -> None:
210
+ """Start Zuban LSP server."""
211
+ from crackerjack.services.zuban_lsp_service import (
212
+ create_zuban_lsp_service,
213
+ )
214
+
215
+ console.print("[bold cyan]๐Ÿš€ Starting Zuban LSP Server[/bold cyan]")
216
+
217
+ async def _start() -> None:
218
+ lsp_service = await create_zuban_lsp_service(
219
+ port=port, mode=mode, console=console
220
+ )
221
+ if await lsp_service.start():
222
+ console.print(
223
+ f"[bold green]โœ… Zuban LSP server started on port {port} ({mode} mode)[/bold green]"
224
+ )
225
+ else:
226
+ console.print("[bold red]โŒ Failed to start Zuban LSP server[/bold red]")
227
+ raise SystemExit(1)
228
+
229
+ try:
230
+ asyncio.run(_start())
231
+ except KeyboardInterrupt:
232
+ console.print("\n[yellow]๐Ÿ›‘ Zuban LSP startup interrupted[/yellow]")
233
+
234
+
235
+ @depends.inject # type: ignore[misc]
236
+ def handle_stop_zuban_lsp(console: Inject[Console] = None) -> None:
237
+ """Stop Zuban LSP server."""
238
+ from crackerjack.services.server_manager import stop_zuban_lsp
239
+
240
+ console.print("[bold red]๐Ÿ›‘ Stopping Zuban LSP Server[/bold red]")
241
+
242
+ if stop_zuban_lsp(console):
243
+ console.print(
244
+ "\n[bold green]โœ… Zuban LSP server stopped successfully[/bold green]"
245
+ )
246
+ else:
247
+ console.print("\n[bold red]โŒ Failed to stop Zuban LSP server[/bold red]")
248
+ raise SystemExit(1)
249
+
250
+
251
+ @depends.inject # type: ignore[misc]
252
+ def handle_restart_zuban_lsp(
253
+ port: int = 8677, mode: str = "tcp", console: Inject[Console] = None
254
+ ) -> None:
255
+ """Restart Zuban LSP server."""
256
+ from crackerjack.services.server_manager import restart_zuban_lsp
257
+
258
+ if restart_zuban_lsp(console):
259
+ console.print(
260
+ "\n[bold green]โœ… Zuban LSP server restart completed[/bold green]"
261
+ )
262
+ else:
263
+ console.print("\n[bold red]โŒ Zuban LSP server restart failed[/bold red]")
264
+ raise SystemExit(1)
265
+
266
+
267
+ def handle_interactive_mode(options: Options) -> None:
268
+ from crackerjack.cli.version import get_package_version
269
+
270
+ from .interactive import launch_interactive_cli
271
+
272
+ pkg_version = get_package_version()
273
+ launch_interactive_cli(pkg_version, options)
274
+
275
+
276
+ @depends.inject # type: ignore[misc]
277
+ def handle_standard_mode(
278
+ options: Options,
279
+ async_mode: bool,
280
+ job_id: str | None = None,
281
+ orchestrated: bool = False,
282
+ console: Inject[Console] = None,
283
+ ) -> None:
284
+ # Run the async configure method in an isolated event loop
285
+ import asyncio
286
+
287
+ from crackerjack.executors.hook_lock_manager import hook_lock_manager
288
+
289
+ # Call the synchronous method directly
290
+ hook_lock_manager.configure_from_options(options)
291
+
292
+ # Phase 4.2 COMPLETE: ACB workflows are now the default
293
+ # Use --use-legacy-orchestrator to opt out and use the old orchestration system
294
+ if not getattr(options, "use_legacy_orchestrator", False):
295
+ # Default path: ACB workflow engine (Phase 4.2 complete)
296
+ # Only skip if user explicitly opted out with --use-legacy-orchestrator
297
+ handle_acb_workflow_mode(options, job_id, console)
298
+ return
299
+
300
+ # Legacy orchestrator path (only if use_legacy_orchestrator=True)
301
+ if orchestrated:
302
+ handle_orchestrated_mode(options, job_id)
303
+
304
+ # Default path: Legacy orchestrator (Phase 4.0 status)
305
+ if not orchestrated:
306
+ from crackerjack.core.async_workflow_orchestrator import (
307
+ AsyncWorkflowOrchestrator,
308
+ )
309
+ from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
310
+
311
+ pkg_path = Path.cwd()
312
+
313
+ if async_mode:
314
+ async_orchestrator = AsyncWorkflowOrchestrator(
315
+ console=console,
316
+ pkg_path=pkg_path,
317
+ dry_run=getattr(options, "dry_run", False),
318
+ web_job_id=job_id,
319
+ verbose=options.verbose,
320
+ debug=getattr(options, "debug", False),
321
+ changed_only=getattr(options, "changed_only", False),
322
+ )
323
+ success = asyncio.run(
324
+ async_orchestrator.run_complete_workflow_async(options)
325
+ )
326
+ else:
327
+ sync_orchestrator = WorkflowOrchestrator(
328
+ pkg_path=pkg_path,
329
+ dry_run=getattr(options, "dry_run", False),
330
+ web_job_id=job_id,
331
+ verbose=options.verbose,
332
+ debug=getattr(options, "debug", False),
333
+ changed_only=getattr(options, "changed_only", False),
334
+ )
335
+ success = sync_orchestrator.run_complete_workflow_sync(options)
336
+
337
+ if not success:
338
+ raise SystemExit(1)
339
+
340
+
341
+ @depends.inject # type: ignore[misc]
342
+ def handle_acb_workflow_mode(
343
+ options: Options,
344
+ job_id: str | None = None,
345
+ console: Inject[Console] = None,
346
+ ) -> None:
347
+ """Execute workflow using ACB workflow engine (Phase 3 Production).
348
+
349
+ This handler routes execution to the CrackerjackWorkflowEngine using
350
+ the WorkflowContainerBuilder to set up the full DI container with all
351
+ 28 services across 7 levels. Action handlers use WorkflowPipeline from
352
+ the container for production-quality workflow execution.
353
+
354
+ Args:
355
+ options: CLI options with use_acb_workflows=True
356
+ job_id: Optional WebSocket job ID for progress tracking
357
+ console: Rich console for output
358
+ """
359
+ import asyncio
360
+
361
+ from acb.depends import depends
362
+
363
+ from crackerjack.events.workflow_bus import WorkflowEventBus
364
+ from crackerjack.workflows import (
365
+ CrackerjackWorkflowEngine,
366
+ EventBridgeAdapter,
367
+ WorkflowContainerBuilder,
368
+ register_actions,
369
+ select_workflow_for_options,
370
+ )
371
+
372
+ console.print("[bold cyan]๐Ÿš€ Crackerjack Workflow Engine (ACB-Powered)[/bold cyan]")
373
+
374
+ try:
375
+ # Phase 4: ACB workflows are now the default!
376
+ console.print(
377
+ "[dim]Building DI container (28 services across 7 levels)...[/dim]"
378
+ )
379
+ builder = WorkflowContainerBuilder(options, console=console)
380
+ builder.build()
381
+
382
+ # Validate all services are available
383
+ health = builder.health_check()
384
+ if not health["all_available"]:
385
+ missing = ", ".join(health["missing"])
386
+ console.print(f"[yellow]โš ๏ธ Missing services: {missing}[/yellow]")
387
+ console.print(
388
+ "[yellow]Container health check failed, continuing with available services[/yellow]"
389
+ )
390
+
391
+ console.print("[dim]โœ“ DI container ready with WorkflowPipeline[/dim]")
392
+
393
+ # Register ACB Logger explicitly (needed for BasicWorkflowEngine)
394
+ from acb.logger import Logger
395
+
396
+ try:
397
+ logger = depends.get_sync(Logger)
398
+ except Exception:
399
+ # ACB Logger not available, this shouldn't happen but handle gracefully
400
+ import logging
401
+
402
+ logger = logging.getLogger("crackerjack")
403
+ depends.set(Logger, logger)
404
+
405
+ # Register WorkflowEventBus with DI container
406
+ event_bus = WorkflowEventBus()
407
+ depends.set(WorkflowEventBus, event_bus)
408
+
409
+ # Register EventBridgeAdapter BEFORE creating engine (engine needs it for DI!)
410
+ event_bridge = EventBridgeAdapter()
411
+ depends.set(EventBridgeAdapter, event_bridge)
412
+
413
+ # Initialize engine (EventBridgeAdapter will be injected)
414
+ engine = CrackerjackWorkflowEngine()
415
+
416
+ # Register action handlers with engine
417
+ register_actions(engine)
418
+
419
+ # Select workflow based on options (fast/comp/test/standard)
420
+ workflow = select_workflow_for_options(options)
421
+
422
+ console.print(f"[dim]Selected workflow: {workflow.name}[/dim]")
423
+
424
+ # Show orchestration status
425
+ from crackerjack.config import CrackerjackSettings
426
+
427
+ settings = depends.get_sync(CrackerjackSettings)
428
+ if settings.enable_orchestration:
429
+ mode_info = f" ({settings.orchestration_mode} mode)"
430
+ console.print(
431
+ f"[dim]Orchestration: [cyan]โšก enabled[/cyan]{mode_info} - async hooks with caching[/dim]"
432
+ )
433
+
434
+ # Phase 4.1: Retrieve WorkflowPipeline from DI container (synchronous context)
435
+ # and pass it explicitly in workflow context to avoid async DI scope issues
436
+ from crackerjack.core.workflow_orchestrator import WorkflowPipeline
437
+
438
+ pipeline = depends.get_sync(WorkflowPipeline)
439
+
440
+ # Phase 4.2: All dependencies now use Inject[] instead of deprecated depends()
441
+ # This ensures they are properly resolved when retrieved from DI container
442
+
443
+ # Execute workflow with options and pipeline in context
444
+ result = asyncio.run(
445
+ engine.execute(
446
+ workflow,
447
+ context={
448
+ "options": options,
449
+ "pipeline": pipeline, # Pass pipeline with all dependencies properly resolved
450
+ },
451
+ )
452
+ )
453
+
454
+ # Check result and exit with appropriate code
455
+ from acb.workflows import WorkflowState
456
+
457
+ if result.state != WorkflowState.COMPLETED:
458
+ console.print(f"[red]Workflow failed: {result.error}[/red]")
459
+ raise SystemExit(1)
460
+
461
+ console.print("[bold green]โœ“ Workflow completed successfully[/bold green]")
462
+
463
+ except Exception as e:
464
+ import traceback
465
+
466
+ console.print(f"[red]ACB workflow execution failed: {e}[/red]")
467
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
468
+ console.print("[yellow]Falling back to legacy orchestrator[/yellow]")
469
+ # Enable legacy orchestrator flag and retry
470
+ options.use_legacy_orchestrator = True
471
+ options.use_acb_workflows = False
472
+ handle_standard_mode(options, False, job_id, False, console)
473
+
474
+
475
+ @depends.inject # type: ignore[misc]
476
+ def handle_orchestrated_mode(
477
+ options: Options, job_id: str | None = None, console: Inject[Console] = None
478
+ ) -> None:
479
+ console.print("[bold bright_blue]๐Ÿš€ ORCHESTRATED MODE ENABLED[/ bold bright_blue]")
480
+
481
+ # Run the async configure method in an isolated event loop
482
+ import asyncio
483
+
484
+ from crackerjack.executors.hook_lock_manager import hook_lock_manager
485
+
486
+ # Call the synchronous method directly
487
+ hook_lock_manager.configure_from_options(options)
488
+
489
+ try:
490
+ from crackerjack.core.session_coordinator import SessionCoordinator
491
+ from crackerjack.orchestration.advanced_orchestrator import (
492
+ AdvancedWorkflowOrchestrator,
493
+ )
494
+ from crackerjack.orchestration.execution_strategies import (
495
+ AICoordinationMode,
496
+ ExecutionStrategy,
497
+ OrchestrationConfig,
498
+ ProgressLevel,
499
+ )
500
+ except ImportError as e:
501
+ console.print(f"[red]Orchestrated mode not available: {e}[/ red]")
502
+ console.print("[yellow]Falling back to standard mode[/ yellow]")
503
+ handle_standard_mode(options, False, job_id)
504
+ return
505
+
506
+ try:
507
+ strategy = ExecutionStrategy(options.orchestration_strategy)
508
+ except ValueError:
509
+ console.print(
510
+ f"[red]Invalid orchestration strategy: {options.orchestration_strategy}[/ red]",
511
+ )
512
+ strategy = ExecutionStrategy.ADAPTIVE
513
+
514
+ try:
515
+ progress = ProgressLevel(options.orchestration_progress)
516
+ except ValueError:
517
+ console.print(
518
+ f"[red]Invalid progress level: {options.orchestration_progress}[/ red]",
519
+ )
520
+ progress = ProgressLevel.GRANULAR
521
+
522
+ try:
523
+ ai_mode = AICoordinationMode(options.orchestration_ai_mode)
524
+ except ValueError:
525
+ console.print(f"[red]Invalid AI mode: {options.orchestration_ai_mode}[/ red]")
526
+ ai_mode = AICoordinationMode.SINGLE_AGENT
527
+
528
+ config = OrchestrationConfig(
529
+ execution_strategy=strategy,
530
+ progress_level=progress,
531
+ ai_coordination_mode=ai_mode,
532
+ )
533
+
534
+ console.print(f"[cyan]Execution Strategy: [/ cyan] {strategy.value}")
535
+ console.print(f"[cyan]Progress Level: [/ cyan] {progress.value}")
536
+ console.print(f"[cyan]AI Coordination: [/ cyan] {ai_mode.value}")
537
+
538
+ pkg_path = Path.cwd()
539
+ session = SessionCoordinator(console, pkg_path, web_job_id=job_id)
540
+ orchestrator = AdvancedWorkflowOrchestrator(console, pkg_path, session, config)
541
+
542
+ try:
543
+ success = asyncio.run(orchestrator.execute_orchestrated_workflow(options))
544
+ if success:
545
+ console.print(
546
+ "\n[bold green]๐ŸŽ‰ ORCHESTRATED WORKFLOW COMPLETED SUCCESSFULLY ![/ bold green]",
547
+ )
548
+ else:
549
+ console.print("\n[bold red]โŒ ORCHESTRATED WORKFLOW FAILED[/ bold red]")
550
+ sys.exit(1)
551
+ except KeyboardInterrupt:
552
+ console.print("\n[yellow]๐Ÿ›‘ Orchestrated workflow interrupted[/ yellow]")
553
+ sys.exit(130)
554
+ except Exception as e:
555
+ console.print(f"\n[red]๐Ÿ’ฅ Orchestrated workflow error: {e}[/ red]")
556
+ sys.exit(1)
557
+
558
+
559
+ @depends.inject # type: ignore[misc]
560
+ def handle_config_updates(options: Options, console: Inject[Console] = None) -> None:
561
+ """Handle configuration update commands."""
562
+ from crackerjack.services.quality.config_template import ConfigTemplateService
563
+
564
+ pkg_path = Path.cwd()
565
+ config_service = ConfigTemplateService(console, pkg_path)
566
+
567
+ if options.check_config_updates:
568
+ _handle_check_updates(config_service, pkg_path, console)
569
+ elif options.apply_config_updates:
570
+ _handle_apply_updates(
571
+ config_service, pkg_path, options.config_interactive, console
572
+ )
573
+ elif options.diff_config:
574
+ _handle_diff_config(config_service, pkg_path, options.diff_config, console)
575
+ elif options.refresh_cache:
576
+ _handle_refresh_cache(config_service, pkg_path, console)
577
+
578
+
579
+ @depends.inject # type: ignore[misc]
580
+ def _handle_check_updates(
581
+ config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
582
+ ) -> None:
583
+ """Handle checking for configuration updates."""
584
+ console.print("[bold cyan]๐Ÿ” Checking for configuration updates...[/bold cyan]")
585
+ updates = config_service.check_updates(pkg_path)
586
+
587
+ if not updates:
588
+ console.print("[green]โœ… No configuration templates available[/green]")
589
+ return
590
+
591
+ has_updates = any(update.needs_update for update in updates.values())
592
+ if not has_updates:
593
+ console.print("[green]โœ… All configurations are up to date[/green]")
594
+ return
595
+
596
+ _display_available_updates(updates, console)
597
+ console.print("\nUse --apply-config-updates to apply these updates")
598
+
599
+
600
+ @depends.inject # type: ignore[misc]
601
+ def _handle_apply_updates(
602
+ config_service: "ConfigTemplateService",
603
+ pkg_path: Path,
604
+ interactive: bool,
605
+ console: Inject[Console],
606
+ ) -> None:
607
+ """Handle applying configuration updates."""
608
+ console.print("[bold cyan]๐Ÿ”ง Applying configuration updates...[/bold cyan]")
609
+ updates = config_service.check_updates(pkg_path)
610
+
611
+ if not updates:
612
+ console.print("[yellow]โš ๏ธ No configuration templates available[/yellow]")
613
+ return
614
+
615
+ configs_to_update = _get_configs_needing_update(updates)
616
+ if not configs_to_update:
617
+ console.print("[green]โœ… All configurations are already up to date[/green]")
618
+ return
619
+
620
+ success_count = _apply_config_updates_batch(
621
+ config_service, configs_to_update, pkg_path, interactive, console
622
+ )
623
+ _report_update_results(success_count, len(configs_to_update), console)
624
+
625
+
626
+ @depends.inject # type: ignore[misc]
627
+ def _handle_diff_config(
628
+ config_service: "ConfigTemplateService",
629
+ pkg_path: Path,
630
+ config_type: str,
631
+ console: Inject[Console],
632
+ ) -> None:
633
+ """Handle showing configuration diff."""
634
+ console.print(f"[bold cyan]๐Ÿ“Š Showing diff for {config_type}...[/bold cyan]")
635
+ diff_preview = config_service._generate_diff_preview(config_type, pkg_path)
636
+ console.print(f"\nChanges for {config_type}:")
637
+ console.print(diff_preview)
638
+
639
+
640
+ @depends.inject # type: ignore[misc]
641
+ def _handle_refresh_cache(
642
+ config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
643
+ ) -> None:
644
+ """Handle refreshing cache."""
645
+ console.print("[bold cyan]๐Ÿงน Refreshing cache...[/bold cyan]")
646
+ config_service._invalidate_cache(pkg_path)
647
+ console.print("[green]โœ… Cache refreshed[/green]")
648
+
649
+
650
+ @depends.inject # type: ignore[misc]
651
+ def _display_available_updates(
652
+ updates: dict[str, "ConfigUpdateInfo"], console: Inject[Console]
653
+ ) -> None:
654
+ """Display available configuration updates."""
655
+ console.print("[yellow]๐Ÿ“‹ Available updates:[/yellow]")
656
+ for config_type, update_info in updates.items():
657
+ if update_info.needs_update:
658
+ console.print(
659
+ f" โ€ข {config_type}: {update_info.current_version} โ†’ {update_info.latest_version}"
660
+ )
661
+
662
+
663
+ def _get_configs_needing_update(updates: dict[str, "ConfigUpdateInfo"]) -> list[str]:
664
+ """Get list of configurations that need updates."""
665
+ return [
666
+ config_type
667
+ for config_type, update_info in updates.items()
668
+ if update_info.needs_update
669
+ ]
670
+
671
+
672
+ @depends.inject # type: ignore[misc]
673
+ def _apply_config_updates_batch(
674
+ config_service: "ConfigTemplateService",
675
+ configs: list[str],
676
+ pkg_path: Path,
677
+ interactive: bool,
678
+ console: Inject[Console],
679
+ ) -> int:
680
+ """Apply configuration updates in batch and return success count."""
681
+ success_count = 0
682
+ for config_type in configs:
683
+ if config_service.apply_update(config_type, pkg_path, interactive=interactive):
684
+ success_count += 1
685
+ return success_count
686
+
687
+
688
+ @depends.inject # type: ignore[misc]
689
+ def _report_update_results(
690
+ success_count: int, total_count: int, console: Inject[Console]
691
+ ) -> None:
692
+ """Report the results of configuration updates."""
693
+ if success_count == total_count:
694
+ console.print(
695
+ f"[green]โœ… Successfully updated {success_count} configurations[/green]"
696
+ )
697
+ else:
698
+ console.print(
699
+ f"[yellow]โš ๏ธ Updated {success_count}/{total_count} configurations[/yellow]"
700
+ )