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
@@ -1,9 +1,11 @@
1
1
  import asyncio
2
- import logging
3
2
  import time
4
3
  import typing as t
4
+ from contextlib import suppress
5
5
  from pathlib import Path
6
6
 
7
+ from acb.depends import Inject, depends
8
+ from acb.logger import Logger
7
9
  from rich.console import Console
8
10
 
9
11
  from crackerjack.agents.base import FixResult, Issue, IssueType, Priority
@@ -15,9 +17,11 @@ from .timeout_manager import TimeoutStrategy, get_timeout_manager
15
17
 
16
18
 
17
19
  class AsyncWorkflowPipeline:
20
+ @depends.inject
18
21
  def __init__(
19
22
  self,
20
- console: Console,
23
+ logger: Inject[Logger],
24
+ console: Inject[Console],
21
25
  pkg_path: Path,
22
26
  session: SessionCoordinator,
23
27
  phases: PhaseCoordinator,
@@ -26,7 +30,7 @@ class AsyncWorkflowPipeline:
26
30
  self.pkg_path = pkg_path
27
31
  self.session = session
28
32
  self.phases = phases
29
- self.logger = logging.getLogger("crackerjack.async_pipeline")
33
+ self.logger = logger
30
34
  self.timeout_manager = get_timeout_manager()
31
35
  self._active_tasks: list[asyncio.Task[t.Any]] = []
32
36
  self.resource_context: t.Any | None = None
@@ -60,7 +64,7 @@ class AsyncWorkflowPipeline:
60
64
  async def _execute_workflow_phases_async(self, options: OptionsProtocol) -> bool:
61
65
  success = True
62
66
 
63
- self.phases.run_configuration_phase(options)
67
+ self.phases.run_configuration_phase(options) # type: ignore[arg-type]
64
68
 
65
69
  if not await self._execute_cleaning_phase_async(options):
66
70
  success = False
@@ -73,12 +77,12 @@ class AsyncWorkflowPipeline:
73
77
 
74
78
  return False
75
79
 
76
- if not self.phases.run_publishing_phase(options):
80
+ if not self.phases.run_publishing_phase(options): # type: ignore[arg-type]
77
81
  success = False
78
82
  self.session.fail_task("workflow", "Publishing failed")
79
83
  return False
80
84
 
81
- if not self.phases.run_commit_phase(options):
85
+ if not self.phases.run_commit_phase(options): # type: ignore[arg-type]
82
86
  success = False
83
87
 
84
88
  return success
@@ -113,7 +117,7 @@ class AsyncWorkflowPipeline:
113
117
  asyncio.to_thread(self.phases.run_cleaning_phase, options), # type: ignore[arg-type]
114
118
  strategy=TimeoutStrategy.RETRY_WITH_BACKOFF,
115
119
  )
116
- return bool(result)
120
+ return bool(result) # type: ignore[return-value]
117
121
 
118
122
  async def _execute_quality_phase_async(self, options: OptionsProtocol) -> bool:
119
123
  if hasattr(options, "fast") and options.fast:
@@ -188,13 +192,12 @@ class AsyncWorkflowPipeline:
188
192
 
189
193
  return done, pending
190
194
 
191
- async def _cleanup_pending_tasks(self, pending: set[asyncio.Task[t.Any]]) -> None:
195
+ @staticmethod
196
+ async def _cleanup_pending_tasks(pending: set[asyncio.Task[t.Any]]) -> None:
192
197
  for task in pending:
193
198
  task.cancel()
194
- try:
199
+ with suppress(asyncio.CancelledError):
195
200
  await task
196
- except asyncio.CancelledError:
197
- pass
198
201
 
199
202
  async def _process_task_results(
200
203
  self,
@@ -265,7 +268,7 @@ class AsyncWorkflowPipeline:
265
268
  asyncio.to_thread(self.phases.run_fast_hooks_only, options), # type: ignore[arg-type]
266
269
  strategy=TimeoutStrategy.RETRY_WITH_BACKOFF,
267
270
  )
268
- return bool(result)
271
+ return bool(result) # type: ignore[return-value]
269
272
 
270
273
  async def _run_comprehensive_hooks_async(self, options: OptionsProtocol) -> bool:
271
274
  result = await self.timeout_manager.with_timeout(
@@ -273,7 +276,7 @@ class AsyncWorkflowPipeline:
273
276
  asyncio.to_thread(self.phases.run_comprehensive_hooks_only, options), # type: ignore[arg-type]
274
277
  strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
275
278
  )
276
- return bool(result)
279
+ return bool(result) # type: ignore[return-value]
277
280
 
278
281
  async def _run_hooks_phase_async(self, options: OptionsProtocol) -> bool:
279
282
  result = await self.timeout_manager.with_timeout(
@@ -281,7 +284,7 @@ class AsyncWorkflowPipeline:
281
284
  asyncio.to_thread(self.phases.run_hooks_phase, options), # type: ignore[arg-type]
282
285
  strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
283
286
  )
284
- return bool(result)
287
+ return bool(result) # type: ignore[return-value]
285
288
 
286
289
  async def _run_testing_phase_async(self, options: OptionsProtocol) -> bool:
287
290
  result = await self.timeout_manager.with_timeout(
@@ -289,7 +292,7 @@ class AsyncWorkflowPipeline:
289
292
  asyncio.to_thread(self.phases.run_testing_phase, options), # type: ignore[arg-type]
290
293
  strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
291
294
  )
292
- return bool(result)
295
+ return bool(result) # type: ignore[return-value]
293
296
 
294
297
  async def _execute_ai_agent_workflow_async(
295
298
  self, options: OptionsProtocol, max_iterations: int = 10
@@ -298,7 +301,7 @@ class AsyncWorkflowPipeline:
298
301
  f"🤖 Starting AI Agent workflow (max {max_iterations} iterations)"
299
302
  )
300
303
 
301
- self.phases.run_configuration_phase(options)
304
+ self.phases.run_configuration_phase(options) # type: ignore[arg-type]
302
305
 
303
306
  if not await self._execute_cleaning_phase_async(options):
304
307
  self.session.fail_task("workflow", "Cleaning phase failed")
@@ -431,7 +434,8 @@ class AsyncWorkflowPipeline:
431
434
  issue, IssueType.FORMATTING, Priority.MEDIUM, "refurb"
432
435
  )
433
436
 
434
- def _parse_single_test_issue(self, issue: str) -> Issue:
437
+ @staticmethod
438
+ def _parse_single_test_issue(issue: str) -> Issue:
435
439
  import uuid
436
440
 
437
441
  from crackerjack.agents.base import Issue, IssueType, Priority
@@ -450,8 +454,9 @@ class AsyncWorkflowPipeline:
450
454
  stage="test",
451
455
  )
452
456
 
457
+ @staticmethod
453
458
  def _create_generic_issue(
454
- self, issue: str, issue_type: IssueType, priority: Priority, stage: str
459
+ issue: str, issue_type: IssueType, priority: Priority, stage: str
455
460
  ) -> Issue:
456
461
  import uuid
457
462
 
@@ -467,18 +472,18 @@ class AsyncWorkflowPipeline:
467
472
  )
468
473
 
469
474
  async def _run_final_workflow_phases(self, options: OptionsProtocol) -> bool:
470
- if not self.phases.run_publishing_phase(options):
475
+ if not self.phases.run_publishing_phase(options): # type: ignore[arg-type]
471
476
  self.session.fail_task("workflow", "Publishing failed")
472
477
  return False
473
478
 
474
- if not self.phases.run_commit_phase(options):
479
+ if not self.phases.run_commit_phase(options): # type: ignore[arg-type]
475
480
  self.session.fail_task("workflow", "Commit failed")
476
481
  return False
477
482
 
478
483
  return True
479
484
 
480
485
  async def _run_fast_hooks_with_retry_async(self, options: OptionsProtocol) -> bool:
481
- return await asyncio.to_thread(self.phases.run_fast_hooks_only, options)
486
+ return await asyncio.to_thread(self.phases.run_fast_hooks_only, options) # type: ignore[arg-type]
482
487
 
483
488
  async def _collect_test_issues_async(self, options: OptionsProtocol) -> list[str]:
484
489
  if not options.test:
@@ -573,10 +578,11 @@ class AsyncWorkflowPipeline:
573
578
 
574
579
  def _create_agent_coordinator(self) -> t.Any:
575
580
  from crackerjack.agents.base import AgentContext
576
- from crackerjack.agents.coordinator import AgentCoordinator
581
+ from crackerjack.agents.enhanced_coordinator import create_enhanced_coordinator
577
582
 
578
583
  context = AgentContext(project_path=self.pkg_path)
579
- return AgentCoordinator(context)
584
+ # Use enhanced coordinator with Claude Code agent integration
585
+ return create_enhanced_coordinator(context=context, enable_external_agents=True)
580
586
 
581
587
  def _report_fix_results(self, fix_result: FixResult, iteration: int) -> None:
582
588
  if fix_result.success:
@@ -602,24 +608,34 @@ class AsyncWorkflowPipeline:
602
608
 
603
609
 
604
610
  class AsyncWorkflowOrchestrator:
611
+ @depends.inject
605
612
  def __init__(
606
613
  self,
607
- console: Console | None = None,
614
+ logger: Inject[Logger],
615
+ console: Inject[Console],
608
616
  pkg_path: Path | None = None,
609
617
  dry_run: bool = False,
610
618
  web_job_id: str | None = None,
611
619
  verbose: bool = False,
612
620
  debug: bool = False,
621
+ changed_only: bool = False,
613
622
  ) -> None:
614
- self.console = console or Console(force_terminal=True)
623
+ # Initialize console and pkg_path first
624
+ self.console = console
615
625
  self.pkg_path = pkg_path or Path.cwd()
616
626
  self.dry_run = dry_run
617
627
  self.web_job_id = web_job_id
618
628
  self.verbose = verbose
619
629
  self.debug = debug
630
+ self.changed_only = changed_only
620
631
 
621
- self._initialize_logging()
632
+ # Configure ACB dependency injection using native patterns
633
+ from acb.depends import depends
634
+
635
+ # Register core dependencies directly with ACB
636
+ depends.set(Path, self.pkg_path)
622
637
 
638
+ # Import protocols for retrieving dependencies via ACB
623
639
  from crackerjack.models.protocols import (
624
640
  ConfigMergeServiceProtocol,
625
641
  FileSystemInterface,
@@ -629,48 +645,50 @@ class AsyncWorkflowOrchestrator:
629
645
  TestManagerProtocol,
630
646
  )
631
647
 
632
- from .enhanced_container import create_enhanced_container
648
+ # Setup services with ACB DI (reuse from WorkflowOrchestrator)
649
+ from .workflow_orchestrator import WorkflowOrchestrator
633
650
 
634
- self.container = create_enhanced_container(
635
- console=self.console,
636
- pkg_path=self.pkg_path,
637
- dry_run=self.dry_run,
638
- )
651
+ # Use a temporary orchestrator instance just for service setup
652
+ temp_orch = WorkflowOrchestrator.__new__(WorkflowOrchestrator)
653
+ temp_orch.console = self.console
654
+ temp_orch.pkg_path = self.pkg_path
655
+ temp_orch.verbose = self.verbose
656
+ temp_orch._setup_acb_services()
657
+
658
+ self._initialize_logging()
659
+
660
+ self.logger = logger
639
661
 
662
+ # Create coordinators - dependencies retrieved via ACB's depends.get_sync()
640
663
  self.session = SessionCoordinator(self.console, self.pkg_path, self.web_job_id)
641
664
  self.phases = PhaseCoordinator(
642
665
  console=self.console,
643
666
  pkg_path=self.pkg_path,
644
667
  session=self.session,
645
- filesystem=self.container.get(FileSystemInterface),
646
- git_service=self.container.get(GitInterface),
647
- hook_manager=self.container.get(HookManager),
648
- test_manager=self.container.get(TestManagerProtocol),
649
- publish_manager=self.container.get(PublishManager),
650
- config_merge_service=self.container.get(ConfigMergeServiceProtocol),
668
+ filesystem=depends.get_sync(FileSystemInterface),
669
+ git_service=depends.get_sync(GitInterface),
670
+ hook_manager=depends.get_sync(HookManager),
671
+ test_manager=depends.get_sync(TestManagerProtocol),
672
+ publish_manager=depends.get_sync(PublishManager),
673
+ config_merge_service=depends.get_sync(ConfigMergeServiceProtocol),
651
674
  )
652
675
 
653
676
  self.async_pipeline = AsyncWorkflowPipeline(
654
- console=self.console,
655
677
  pkg_path=self.pkg_path,
656
678
  session=self.session,
657
679
  phases=self.phases,
658
680
  )
659
681
 
660
- self.logger = logging.getLogger("crackerjack.async_orchestrator")
661
-
662
682
  def _initialize_logging(self) -> None:
663
683
  from crackerjack.services.log_manager import get_log_manager
664
- from crackerjack.services.logging import setup_structured_logging
665
684
 
666
685
  log_manager = get_log_manager()
667
686
  session_id = getattr(self, "web_job_id", None) or str(int(time.time()))[:8]
668
687
  debug_log_file = log_manager.create_debug_log_file(session_id)
669
688
 
670
689
  log_level = "DEBUG" if self.debug else "INFO"
671
- setup_structured_logging(
672
- level=log_level, json_output=False, log_file=debug_log_file
673
- )
690
+ self.logger.set_level(log_level)
691
+ self.logger.add_file_handler(debug_log_file)
674
692
 
675
693
  async def run_complete_workflow_async(self, options: OptionsProtocol) -> bool:
676
694
  return await self.async_pipeline.run_complete_workflow_async(options)
@@ -679,28 +697,36 @@ class AsyncWorkflowOrchestrator:
679
697
  return asyncio.run(self.run_complete_workflow_async(options))
680
698
 
681
699
  def run_cleaning_phase(self, options: OptionsProtocol) -> bool:
682
- return self.phases.run_cleaning_phase(options)
700
+ result = self.phases.run_cleaning_phase(options) # type: ignore[arg-type]
701
+ return bool(result)
683
702
 
684
703
  def run_fast_hooks_only(self, options: OptionsProtocol) -> bool:
685
- return self.phases.run_fast_hooks_only(options)
704
+ result = self.phases.run_fast_hooks_only(options) # type: ignore[arg-type]
705
+ return bool(result)
686
706
 
687
707
  def run_comprehensive_hooks_only(self, options: OptionsProtocol) -> bool:
688
- return self.phases.run_comprehensive_hooks_only(options)
708
+ result = self.phases.run_comprehensive_hooks_only(options) # type: ignore[arg-type]
709
+ return bool(result)
689
710
 
690
711
  def run_hooks_phase(self, options: OptionsProtocol) -> bool:
691
- return self.phases.run_hooks_phase(options)
712
+ result = self.phases.run_hooks_phase(options) # type: ignore[arg-type]
713
+ return bool(result)
692
714
 
693
715
  def run_testing_phase(self, options: OptionsProtocol) -> bool:
694
- return self.phases.run_testing_phase(options)
716
+ result = self.phases.run_testing_phase(options) # type: ignore[arg-type]
717
+ return bool(result)
695
718
 
696
719
  def run_publishing_phase(self, options: OptionsProtocol) -> bool:
697
- return self.phases.run_publishing_phase(options)
720
+ result = self.phases.run_publishing_phase(options) # type: ignore[arg-type]
721
+ return bool(result)
698
722
 
699
723
  def run_commit_phase(self, options: OptionsProtocol) -> bool:
700
- return self.phases.run_commit_phase(options)
724
+ result = self.phases.run_commit_phase(options) # type: ignore[arg-type]
725
+ return bool(result)
701
726
 
702
727
  def run_configuration_phase(self, options: OptionsProtocol) -> bool:
703
- return self.phases.run_configuration_phase(options)
728
+ result = self.phases.run_configuration_phase(options) # type: ignore[arg-type]
729
+ return bool(result)
704
730
 
705
731
  def _cleanup_resources(self) -> None:
706
732
  self.session.cleanup_resources()
@@ -1,18 +1,31 @@
1
1
  import subprocess
2
+ from contextlib import suppress
2
3
  from pathlib import Path
3
4
 
4
- from rich.console import Console
5
-
6
- from crackerjack.services.logging import get_logger
5
+ from acb.console import Console
6
+ from acb.depends import depends
7
+ from acb.logger import Logger
7
8
 
8
9
 
9
10
  class AutofixCoordinator:
10
- def __init__(self, console: Console, pkg_path: Path) -> None:
11
- self.console = console
12
- self.pkg_path = pkg_path
13
- self.logger = get_logger("crackerjack.autofix")
14
-
15
- setattr(self.logger, "name", "crackerjack.autofix")
11
+ def __init__(
12
+ self,
13
+ console: object | None = None,
14
+ pkg_path: Path | None = None,
15
+ logger: object | None = None,
16
+ ) -> None:
17
+ # Allow explicit injection from tests; fall back to DI when not provided
18
+ self.console = console or depends.get_sync(Console)
19
+ self.pkg_path = pkg_path or Path.cwd()
20
+ # Bind logger context with name for tracing
21
+ _logger = logger or depends.get_sync(Logger)
22
+ if hasattr(_logger, "bind"):
23
+ self.logger = _logger.bind(logger="crackerjack.autofix")
24
+ else:
25
+ self.logger = _logger
26
+ if not hasattr(self.logger, "name"):
27
+ with suppress(Exception):
28
+ setattr(self.logger, "name", "crackerjack.autofix")
16
29
 
17
30
  def apply_autofix_for_hooks(self, mode: str, hook_results: list[object]) -> bool:
18
31
  try:
@@ -1,7 +1,8 @@
1
1
  import typing as t
2
2
  from pathlib import Path
3
3
 
4
- from rich.console import Console
4
+ from acb import console as acb_console
5
+ from acb.console import Console
5
6
 
6
7
  from crackerjack.models.protocols import (
7
8
  FileSystemInterface,
@@ -44,7 +45,7 @@ class DependencyContainer:
44
45
  verbose: bool = False,
45
46
  ) -> "DependencyContainer":
46
47
  if console is None:
47
- console = Console(force_terminal=True)
48
+ console = acb_console
48
49
 
49
50
  if pkg_path is None:
50
51
  pkg_path = Path.cwd()
@@ -57,7 +58,7 @@ class DependencyContainer:
57
58
 
58
59
  self.register_transient(
59
60
  GitInterface,
60
- lambda: GitService(console=console, pkg_path=pkg_path),
61
+ lambda: GitService(pkg_path=pkg_path),
61
62
  )
62
63
 
63
64
  from crackerjack.managers.hook_manager import HookManagerImpl
@@ -78,24 +79,24 @@ class DependencyContainer:
78
79
 
79
80
  from crackerjack.managers.publish_manager import PublishManagerImpl
80
81
 
82
+ # Use factory without parameters to trigger @depends.inject decorator
83
+ # The decorator will inject all dependencies from the DI container
81
84
  self.register_transient(
82
85
  PublishManager,
83
- lambda: PublishManagerImpl(
84
- console=console,
85
- pkg_path=pkg_path,
86
- dry_run=dry_run,
87
- ),
86
+ PublishManagerImpl,
88
87
  )
89
88
 
90
89
  return self
91
90
 
92
91
 
93
92
  def create_container(
94
- console: Console | None = None,
93
+ console: Console | None = None, # defaults to acb_console if None
95
94
  pkg_path: Path | None = None,
96
95
  dry_run: bool = False,
97
96
  verbose: bool = False,
98
97
  ) -> DependencyContainer:
98
+ if console is None:
99
+ console = acb_console
99
100
  return DependencyContainer().create_default_container(
100
101
  console=console,
101
102
  pkg_path=pkg_path,
@@ -44,7 +44,7 @@ class ServiceDescriptor:
44
44
  created_count: int = 0
45
45
  dependencies: list[type] = field(default_factory=list)
46
46
 
47
- def __post_init__(self) -> None:
47
+ def __post_init__(self):
48
48
  if self.implementation is self.factory is self.instance is None:
49
49
  msg = "Must provide either implementation, factory, or instance"
50
50
  raise ValueError(msg)
@@ -300,7 +300,7 @@ class EnhancedDependencyContainer:
300
300
  self._current_scope = scope
301
301
 
302
302
  def get_service_info(self) -> dict[str, Any]:
303
- info: dict[str, Any] = {}
303
+ info = {}
304
304
 
305
305
  with self._lock:
306
306
  for key, descriptor in self._services.items():
@@ -391,7 +391,7 @@ class EnhancedDependencyContainer:
391
391
  def _get_service_key(self, interface: type) -> str:
392
392
  return f"{interface.__module__}.{interface.__name__}"
393
393
 
394
- def __enter__(self) -> "EnhancedDependencyContainer":
394
+ def __enter__(self):
395
395
  return self
396
396
 
397
397
  def __exit__(
@@ -463,13 +463,11 @@ class ServiceCollectionBuilder:
463
463
 
464
464
  from crackerjack.managers.publish_manager import PublishManagerImpl
465
465
 
466
+ # Use factory without parameters to trigger @depends.inject decorator
467
+ # The decorator will inject all dependencies from the DI container
466
468
  self.container.register_transient(
467
469
  PublishManager,
468
- factory=lambda: PublishManagerImpl(
469
- console=console,
470
- pkg_path=pkg_path,
471
- dry_run=self.dry_run,
472
- ),
470
+ factory=PublishManagerImpl,
473
471
  )
474
472
 
475
473
  return self
@@ -515,7 +513,9 @@ class ServiceCollectionBuilder:
515
513
 
516
514
  filesystem = FileSystemService()
517
515
  git_service = GitService(console, pkg_path)
518
- return InitializationService(console, filesystem, git_service, pkg_path)
516
+ service = InitializationService(console, filesystem, git_service, pkg_path)
517
+ # Cast to protocol type to ensure correct typing
518
+ return t.cast(InitializationServiceProtocol, service)
519
519
 
520
520
  self.container.register_transient(
521
521
  InitializationServiceProtocol,
@@ -3,7 +3,7 @@ import time
3
3
  import typing as t
4
4
  from pathlib import Path
5
5
 
6
- from rich.console import Console
6
+ from acb.console import Console
7
7
 
8
8
 
9
9
  class FileCache:
@@ -7,7 +7,9 @@ from dataclasses import dataclass, field
7
7
  from pathlib import Path
8
8
  from threading import Lock
9
9
 
10
- from rich.console import Console
10
+ from acb.console import Console
11
+ from acb.depends import depends
12
+ from rich.panel import Panel
11
13
  from rich.table import Table
12
14
 
13
15
  logger = logging.getLogger("crackerjack.performance_monitor")
@@ -285,7 +287,7 @@ class AsyncPerformanceMonitor:
285
287
 
286
288
  def print_performance_report(self, console: Console | None = None) -> None:
287
289
  if console is None:
288
- console = Console()
290
+ console = depends.get_sync(Console)
289
291
 
290
292
  console.print("\n[bold blue]🔍 Async Performance Monitor Report[/bold blue]")
291
293
  console.print("=" * 60)
@@ -318,7 +320,7 @@ class AsyncPerformanceMonitor:
318
320
  str(metrics.timeout_calls),
319
321
  )
320
322
 
321
- console.print(table)
323
+ console.print(Panel(table, title="Operation Metrics", border_style="cyan"))
322
324
 
323
325
  alerts = self.get_performance_alerts()
324
326
  if alerts: