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
@@ -4,18 +4,22 @@ import sys
4
4
  import typing as t
5
5
  from pathlib import Path
6
6
 
7
- from rich.console import Console
7
+ from acb.console import Console
8
+ from acb.depends import Inject, depends
8
9
 
9
10
  from .options import Options
10
11
 
11
12
  if t.TYPE_CHECKING:
12
- from crackerjack.services.config_template import (
13
+ from crackerjack.services.quality.config_template import (
13
14
  ConfigTemplateService,
14
15
  ConfigUpdateInfo,
15
16
  )
16
17
 
17
18
 
18
- def setup_ai_agent_env(ai_agent: bool, debug_mode: bool = False) -> None:
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:
19
23
  if debug_mode:
20
24
  os.environ["CRACKERJACK_DEBUG"] = "1"
21
25
 
@@ -26,7 +30,6 @@ def setup_ai_agent_env(ai_agent: bool, debug_mode: bool = False) -> None:
26
30
  os.environ["AI_AGENT_DEBUG"] = "1"
27
31
  os.environ["AI_AGENT_VERBOSE"] = "1"
28
32
 
29
- console = Console()
30
33
  console.print(
31
34
  "[bold cyan]🐛 AI Agent Debug Mode Configuration: [/ bold cyan]",
32
35
  )
@@ -38,6 +41,25 @@ def setup_ai_agent_env(ai_agent: bool, debug_mode: bool = False) -> None:
38
41
  f" • Verbose Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else '❌ Disabled'}",
39
42
  )
40
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)
41
63
 
42
64
 
43
65
  def handle_mcp_server(websocket_port: int | None = None) -> None:
@@ -51,10 +73,12 @@ def handle_mcp_server(websocket_port: int | None = None) -> None:
51
73
  start_mcp_main(project_path)
52
74
 
53
75
 
54
- def handle_monitor_mode(dev_mode: bool = False) -> None:
76
+ @depends.inject # type: ignore[misc]
77
+ def handle_monitor_mode(
78
+ dev_mode: bool = False, console: Inject[Console] = None
79
+ ) -> None:
55
80
  from crackerjack.mcp.progress_monitor import run_progress_monitor
56
81
 
57
- console = Console()
58
82
  console.print("[bold cyan]🌟 Starting Multi-Project Progress Monitor[/ bold cyan]")
59
83
  console.print(
60
84
  "[bold yellow]🐕 With integrated Service Watchdog and WebSocket polling[/ bold yellow]",
@@ -66,10 +90,12 @@ def handle_monitor_mode(dev_mode: bool = False) -> None:
66
90
  console.print("\n[yellow]🛑 Monitor stopped[/ yellow]")
67
91
 
68
92
 
69
- def handle_enhanced_monitor_mode(dev_mode: bool = False) -> None:
93
+ @depends.inject # type: ignore[misc]
94
+ def handle_enhanced_monitor_mode(
95
+ dev_mode: bool = False, console: Inject[Console] = None
96
+ ) -> None:
70
97
  from crackerjack.mcp.enhanced_progress_monitor import run_enhanced_progress_monitor
71
98
 
72
- console = Console()
73
99
  console.print("[bold magenta]✨ Starting Enhanced Progress Monitor[/ bold magenta]")
74
100
  console.print(
75
101
  "[bold cyan]📊 With advanced MetricCard widgets and modern web UI patterns[/ bold cyan]",
@@ -81,10 +107,12 @@ def handle_enhanced_monitor_mode(dev_mode: bool = False) -> None:
81
107
  console.print("\n[yellow]🛑 Enhanced Monitor stopped[/ yellow]")
82
108
 
83
109
 
84
- def handle_dashboard_mode(dev_mode: bool = False) -> None:
110
+ @depends.inject # type: ignore[misc]
111
+ def handle_dashboard_mode(
112
+ dev_mode: bool = False, console: Inject[Console] = None
113
+ ) -> None:
85
114
  from crackerjack.mcp.dashboard import run_dashboard
86
115
 
87
- console = Console()
88
116
  console.print("[bold green]🎯 Starting Comprehensive Dashboard[/ bold green]")
89
117
  console.print(
90
118
  "[bold cyan]📈 With system metrics, job tracking, and performance monitoring[/ bold cyan]",
@@ -96,10 +124,12 @@ def handle_dashboard_mode(dev_mode: bool = False) -> None:
96
124
  console.print("\n[yellow]🛑 Dashboard stopped[/ yellow]")
97
125
 
98
126
 
99
- def handle_unified_dashboard_mode(port: int = 8675, dev_mode: bool = False) -> None:
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:
100
131
  from crackerjack.monitoring.websocket_server import CrackerjackMonitoringServer
101
132
 
102
- console = Console()
103
133
  console.print("[bold green]🚀 Starting Unified Monitoring Dashboard[/bold green]")
104
134
  console.print(
105
135
  f"[bold cyan]🌐 WebSocket server on port {port} with real-time streaming and web UI[/bold cyan]",
@@ -114,10 +144,10 @@ def handle_unified_dashboard_mode(port: int = 8675, dev_mode: bool = False) -> N
114
144
  console.print(f"\n[red]❌ Unified Dashboard failed: {e}[/red]")
115
145
 
116
146
 
117
- def handle_watchdog_mode() -> None:
147
+ @depends.inject # type: ignore[misc]
148
+ def handle_watchdog_mode(console: Inject[Console] = None) -> None:
118
149
  from crackerjack.mcp.service_watchdog import main as start_watchdog
119
150
 
120
- console = Console()
121
151
  try:
122
152
  asyncio.run(start_watchdog())
123
153
  except KeyboardInterrupt:
@@ -142,10 +172,13 @@ def handle_restart_websocket_server(port: int = 8675) -> None:
142
172
  handle_websocket_server_command(restart=True, port=port)
143
173
 
144
174
 
145
- def handle_stop_mcp_server() -> None:
146
- from crackerjack.services.server_manager import list_server_status, stop_all_servers
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
+ )
147
181
 
148
- console = Console()
149
182
  console.print("[bold red]🛑 Stopping MCP Servers[/ bold red]")
150
183
 
151
184
  list_server_status(console)
@@ -157,10 +190,12 @@ def handle_stop_mcp_server() -> None:
157
190
  raise SystemExit(1)
158
191
 
159
192
 
160
- def handle_restart_mcp_server(websocket_port: int | None = None) -> None:
193
+ @depends.inject # type: ignore[misc]
194
+ def handle_restart_mcp_server(
195
+ websocket_port: int | None = None, console: Inject[Console] = None
196
+ ) -> None:
161
197
  from crackerjack.services.server_manager import restart_mcp_server
162
198
 
163
- console = Console()
164
199
  if restart_mcp_server(websocket_port, console):
165
200
  console.print("\n[bold green]✅ MCP server restart completed[/ bold green]")
166
201
  else:
@@ -168,11 +203,15 @@ def handle_restart_mcp_server(websocket_port: int | None = None) -> None:
168
203
  raise SystemExit(1)
169
204
 
170
205
 
171
- def handle_start_zuban_lsp(port: int = 8677, mode: str = "tcp") -> None:
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:
172
210
  """Start Zuban LSP server."""
173
- from crackerjack.services.zuban_lsp_service import create_zuban_lsp_service
211
+ from crackerjack.services.zuban_lsp_service import (
212
+ create_zuban_lsp_service,
213
+ )
174
214
 
175
- console = Console()
176
215
  console.print("[bold cyan]🚀 Starting Zuban LSP Server[/bold cyan]")
177
216
 
178
217
  async def _start() -> None:
@@ -193,11 +232,11 @@ def handle_start_zuban_lsp(port: int = 8677, mode: str = "tcp") -> None:
193
232
  console.print("\n[yellow]🛑 Zuban LSP startup interrupted[/yellow]")
194
233
 
195
234
 
196
- def handle_stop_zuban_lsp() -> None:
235
+ @depends.inject # type: ignore[misc]
236
+ def handle_stop_zuban_lsp(console: Inject[Console] = None) -> None:
197
237
  """Stop Zuban LSP server."""
198
238
  from crackerjack.services.server_manager import stop_zuban_lsp
199
239
 
200
- console = Console()
201
240
  console.print("[bold red]🛑 Stopping Zuban LSP Server[/bold red]")
202
241
 
203
242
  if stop_zuban_lsp(console):
@@ -209,11 +248,13 @@ def handle_stop_zuban_lsp() -> None:
209
248
  raise SystemExit(1)
210
249
 
211
250
 
212
- def handle_restart_zuban_lsp(port: int = 8677, mode: str = "tcp") -> None:
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:
213
255
  """Restart Zuban LSP server."""
214
256
  from crackerjack.services.server_manager import restart_zuban_lsp
215
257
 
216
- console = Console()
217
258
  if restart_zuban_lsp(console):
218
259
  console.print(
219
260
  "\n[bold green]✅ Zuban LSP server restart completed[/bold green]"
@@ -224,7 +265,7 @@ def handle_restart_zuban_lsp(port: int = 8677, mode: str = "tcp") -> None:
224
265
 
225
266
 
226
267
  def handle_interactive_mode(options: Options) -> None:
227
- from crackerjack.cli.utils import get_package_version
268
+ from crackerjack.cli.version import get_package_version
228
269
 
229
270
  from .interactive import launch_interactive_cli
230
271
 
@@ -232,23 +273,36 @@ def handle_interactive_mode(options: Options) -> None:
232
273
  launch_interactive_cli(pkg_version, options)
233
274
 
234
275
 
276
+ @depends.inject # type: ignore[misc]
235
277
  def handle_standard_mode(
236
278
  options: Options,
237
279
  async_mode: bool,
238
280
  job_id: str | None = None,
239
281
  orchestrated: bool = False,
282
+ console: Inject[Console] = None,
240
283
  ) -> None:
241
- from rich.console import Console
242
-
243
- console = Console()
284
+ # Run the async configure method in an isolated event loop
285
+ import asyncio
244
286
 
245
287
  from crackerjack.executors.hook_lock_manager import hook_lock_manager
246
288
 
289
+ # Call the synchronous method directly
247
290
  hook_lock_manager.configure_from_options(options)
248
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)
249
301
  if orchestrated:
250
302
  handle_orchestrated_mode(options, job_id)
251
- else:
303
+
304
+ # Default path: Legacy orchestrator (Phase 4.0 status)
305
+ if not orchestrated:
252
306
  from crackerjack.core.async_workflow_orchestrator import (
253
307
  AsyncWorkflowOrchestrator,
254
308
  )
@@ -264,18 +318,19 @@ def handle_standard_mode(
264
318
  web_job_id=job_id,
265
319
  verbose=options.verbose,
266
320
  debug=getattr(options, "debug", False),
321
+ changed_only=getattr(options, "changed_only", False),
267
322
  )
268
323
  success = asyncio.run(
269
324
  async_orchestrator.run_complete_workflow_async(options)
270
325
  )
271
326
  else:
272
327
  sync_orchestrator = WorkflowOrchestrator(
273
- console=console,
274
328
  pkg_path=pkg_path,
275
329
  dry_run=getattr(options, "dry_run", False),
276
330
  web_job_id=job_id,
277
331
  verbose=options.verbose,
278
332
  debug=getattr(options, "debug", False),
333
+ changed_only=getattr(options, "changed_only", False),
279
334
  )
280
335
  success = sync_orchestrator.run_complete_workflow_sync(options)
281
336
 
@@ -283,14 +338,152 @@ def handle_standard_mode(
283
338
  raise SystemExit(1)
284
339
 
285
340
 
286
- def handle_orchestrated_mode(options: Options, job_id: str | None = None) -> None:
287
- from rich.console import Console
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]")
288
373
 
289
- console = Console()
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:
290
479
  console.print("[bold bright_blue]🚀 ORCHESTRATED MODE ENABLED[/ bold bright_blue]")
291
480
 
481
+ # Run the async configure method in an isolated event loop
482
+ import asyncio
483
+
292
484
  from crackerjack.executors.hook_lock_manager import hook_lock_manager
293
485
 
486
+ # Call the synchronous method directly
294
487
  hook_lock_manager.configure_from_options(options)
295
488
 
296
489
  try:
@@ -363,11 +556,11 @@ def handle_orchestrated_mode(options: Options, job_id: str | None = None) -> Non
363
556
  sys.exit(1)
364
557
 
365
558
 
366
- def handle_config_updates(options: Options) -> None:
559
+ @depends.inject # type: ignore[misc]
560
+ def handle_config_updates(options: Options, console: Inject[Console] = None) -> None:
367
561
  """Handle configuration update commands."""
368
- from crackerjack.services.config_template import ConfigTemplateService
562
+ from crackerjack.services.quality.config_template import ConfigTemplateService
369
563
 
370
- console = Console()
371
564
  pkg_path = Path.cwd()
372
565
  config_service = ConfigTemplateService(console, pkg_path)
373
566
 
@@ -383,8 +576,9 @@ def handle_config_updates(options: Options) -> None:
383
576
  _handle_refresh_cache(config_service, pkg_path, console)
384
577
 
385
578
 
579
+ @depends.inject # type: ignore[misc]
386
580
  def _handle_check_updates(
387
- config_service: "ConfigTemplateService", pkg_path: Path, console: Console
581
+ config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
388
582
  ) -> None:
389
583
  """Handle checking for configuration updates."""
390
584
  console.print("[bold cyan]🔍 Checking for configuration updates...[/bold cyan]")
@@ -403,11 +597,12 @@ def _handle_check_updates(
403
597
  console.print("\nUse --apply-config-updates to apply these updates")
404
598
 
405
599
 
600
+ @depends.inject # type: ignore[misc]
406
601
  def _handle_apply_updates(
407
602
  config_service: "ConfigTemplateService",
408
603
  pkg_path: Path,
409
604
  interactive: bool,
410
- console: Console,
605
+ console: Inject[Console],
411
606
  ) -> None:
412
607
  """Handle applying configuration updates."""
413
608
  console.print("[bold cyan]🔧 Applying configuration updates...[/bold cyan]")
@@ -428,11 +623,12 @@ def _handle_apply_updates(
428
623
  _report_update_results(success_count, len(configs_to_update), console)
429
624
 
430
625
 
626
+ @depends.inject # type: ignore[misc]
431
627
  def _handle_diff_config(
432
628
  config_service: "ConfigTemplateService",
433
629
  pkg_path: Path,
434
630
  config_type: str,
435
- console: Console,
631
+ console: Inject[Console],
436
632
  ) -> None:
437
633
  """Handle showing configuration diff."""
438
634
  console.print(f"[bold cyan]📊 Showing diff for {config_type}...[/bold cyan]")
@@ -441,17 +637,19 @@ def _handle_diff_config(
441
637
  console.print(diff_preview)
442
638
 
443
639
 
640
+ @depends.inject # type: ignore[misc]
444
641
  def _handle_refresh_cache(
445
- config_service: "ConfigTemplateService", pkg_path: Path, console: Console
642
+ config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
446
643
  ) -> None:
447
- """Handle refreshing pre-commit cache."""
448
- console.print("[bold cyan]🧹 Refreshing pre-commit cache...[/bold cyan]")
449
- config_service._invalidate_precommit_cache(pkg_path)
450
- console.print("[green]✅ Pre-commit cache refreshed[/green]")
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]")
451
648
 
452
649
 
650
+ @depends.inject # type: ignore[misc]
453
651
  def _display_available_updates(
454
- updates: dict[str, "ConfigUpdateInfo"], console: Console
652
+ updates: dict[str, "ConfigUpdateInfo"], console: Inject[Console]
455
653
  ) -> None:
456
654
  """Display available configuration updates."""
457
655
  console.print("[yellow]📋 Available updates:[/yellow]")
@@ -471,12 +669,13 @@ def _get_configs_needing_update(updates: dict[str, "ConfigUpdateInfo"]) -> list[
471
669
  ]
472
670
 
473
671
 
672
+ @depends.inject # type: ignore[misc]
474
673
  def _apply_config_updates_batch(
475
674
  config_service: "ConfigTemplateService",
476
675
  configs: list[str],
477
676
  pkg_path: Path,
478
677
  interactive: bool,
479
- console: Console,
678
+ console: Inject[Console],
480
679
  ) -> int:
481
680
  """Apply configuration updates in batch and return success count."""
482
681
  success_count = 0
@@ -486,8 +685,9 @@ def _apply_config_updates_batch(
486
685
  return success_count
487
686
 
488
687
 
688
+ @depends.inject # type: ignore[misc]
489
689
  def _report_update_results(
490
- success_count: int, total_count: int, console: Console
690
+ success_count: int, total_count: int, console: Inject[Console]
491
691
  ) -> None:
492
692
  """Report the results of configuration updates."""
493
693
  if success_count == total_count:
@@ -2,8 +2,9 @@ import time
2
2
  import typing as t
3
3
  from enum import Enum, auto
4
4
 
5
+ from acb.console import Console
6
+ from acb.depends import depends
5
7
  from rich.box import ROUNDED
6
- from rich.console import Console
7
8
  from rich.layout import Layout
8
9
  from rich.live import Live
9
10
  from rich.panel import Panel
@@ -116,7 +117,7 @@ class InteractiveWorkflowManager:
116
117
  deps = ["cleaning"] if options.clean else []
117
118
  self.add_task(
118
119
  "hooks",
119
- "Run pre-commit hooks (fast + comprehensive)",
120
+ "Run quality hooks (fast + comprehensive)",
120
121
  "run_hooks_phase",
121
122
  dependencies=deps,
122
123
  )
@@ -383,8 +384,10 @@ class InteractiveWorkflowManager:
383
384
  duration_text,
384
385
  details,
385
386
  )
387
+ from rich.panel import Panel
388
+
386
389
  self.console.print("\n")
387
- self.console.print(table)
390
+ self.console.print(Panel(table, border_style="magenta"))
388
391
  if failed_count == 0:
389
392
  self.console.print(
390
393
  f"\n[bold green]🎉 Workflow completed ! {success_count} / {len(self.tasks)} tasks successful[/ bold green]",
@@ -398,8 +401,8 @@ class InteractiveWorkflowManager:
398
401
  class InteractiveCLI:
399
402
  def __init__(self, pkg_version: str, console: Console | None = None) -> None:
400
403
  self.pkg_version = pkg_version
401
- self.console = console or Console(force_terminal=True)
402
- self.orchestrator = WorkflowOrchestrator(console=self.console)
404
+ self.console = console or depends.get_sync(Console)
405
+ self.orchestrator = WorkflowOrchestrator()
403
406
  self.workflow_manager = InteractiveWorkflowManager(
404
407
  self.console,
405
408
  self.orchestrator,