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,99 +1,145 @@
1
- import logging
2
- import sys
1
+ """Crackerjack logging compatibility layer using ACB's logger.
2
+
3
+ This module provides backward compatibility with Crackerjack's logging API
4
+ while delegating to ACB's logger system. It maintains the same public API
5
+ for LoggingContext, get_logger(), and other utilities.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
3
10
  import time
4
- import typing as t
5
11
  import uuid
12
+ from collections.abc import Callable
6
13
  from contextvars import ContextVar
7
14
  from pathlib import Path
8
15
  from types import TracebackType
9
16
  from typing import Any
10
17
 
11
- import structlog
12
- from structlog.types import EventDict, Processor
18
+ # Use ACB's Logger instead of loguru directly
19
+ from acb.logger import Logger
13
20
 
14
- correlation_id: ContextVar[str | None] = ContextVar("correlation_id", default=None)
21
+ _correlation_id_var: ContextVar[str | None] = ContextVar(
22
+ "crackerjack_correlation_id",
23
+ default=None,
24
+ )
15
25
 
26
+ _logger_cache: dict[str, Any] = {}
16
27
 
17
- def set_correlation_id(cid: str) -> None:
18
- correlation_id.set(cid)
19
28
 
29
+ def _get_acb_logger() -> Logger:
30
+ """Get ACB logger instance from dependency injection."""
31
+ # Create a new logger instance directly
32
+ # ACB's Logger class is already properly initialized
33
+ try:
34
+ # Attempt to get logger via ACB's dependency injection
35
+ logger = Logger()
36
+ # If Logger is a tuple (dependency injection marker), we need to handle it differently
37
+ if isinstance(logger, tuple):
38
+ # For now, fall back to a basic logger configuration
39
+ # In a proper ACB setup, this would be handled by the dependency system
20
40
 
21
- def get_correlation_id() -> str:
22
- cid = correlation_id.get()
23
- if cid is None:
24
- cid = str(uuid.uuid4())[:8]
25
- correlation_id.set(cid)
26
- return cid
41
+ from loguru import logger as loguru_logger
42
+
43
+ return loguru_logger.opt(depth=1)
44
+ return logger
45
+ except Exception:
46
+ # If there's an issue with ACB logger, fall back to loguru
47
+ from loguru import logger as loguru_logger
27
48
 
49
+ return loguru_logger.opt(depth=1)
28
50
 
29
- def add_correlation_id(_: Any, __: Any, event_dict: EventDict) -> EventDict:
30
- event_dict["correlation_id"] = get_correlation_id()
31
- return event_dict
32
51
 
52
+ def _generate_correlation_id() -> str:
53
+ """Generate a unique correlation ID."""
54
+ return uuid.uuid4().hex[:8]
33
55
 
34
- def add_timestamp(_: Any, __: Any, event_dict: EventDict) -> EventDict:
35
- event_dict["timestamp"] = time.strftime("%Y-%m-%dT%H: %M: %S.%f")[:-3] + "Z"
36
- return event_dict
56
+
57
+ def get_correlation_id() -> str:
58
+ """Get or create correlation ID for current context."""
59
+ correlation = _correlation_id_var.get()
60
+ if correlation is None:
61
+ correlation = _generate_correlation_id()
62
+ _correlation_id_var.set(correlation)
63
+ return correlation
64
+
65
+
66
+ def set_correlation_id(correlation_id: str) -> None:
67
+ """Set correlation ID for current context."""
68
+ _correlation_id_var.set(correlation_id)
37
69
 
38
70
 
39
71
  def setup_structured_logging(
72
+ *,
40
73
  level: str = "INFO",
41
- json_output: bool = True,
74
+ json_output: bool = False,
42
75
  log_file: Path | None = None,
43
76
  ) -> None:
44
- processors: list[Processor] = [
45
- structlog.stdlib.filter_by_level,
46
- add_timestamp,
47
- add_correlation_id,
48
- structlog.stdlib.add_logger_name,
49
- structlog.stdlib.add_log_level,
50
- structlog.stdlib.PositionalArgumentsFormatter(),
51
- structlog.processors.StackInfoRenderer(),
52
- structlog.processors.format_exc_info,
53
- ]
54
-
55
- if json_output:
56
- processors.append(structlog.processors.JSONRenderer())
77
+ """Setup structured logging using ACB's logger.
78
+
79
+ This function is maintained for backward compatibility but now uses
80
+ ACB's logger configuration system.
81
+ """
82
+ # ACB logger is already configured via adapters
83
+ # This function is kept for API compatibility but delegates to ACB
84
+ _get_acb_logger()
85
+
86
+ # ACB's logger is already configured, but we can adjust settings if needed
87
+ # The actual configuration is handled by ACB's adapter system
88
+ pass
89
+
90
+
91
+ def get_logger(name: str) -> Any:
92
+ """Get a logger bound to a specific name using ACB's logger.
93
+
94
+ This function provides backward compatibility with Crackerjack's
95
+ logging API while using ACB's logger internally.
96
+ """
97
+ # Check cache first for performance
98
+ if name in _logger_cache:
99
+ return _logger_cache[name]
100
+
101
+ # Get ACB logger and bind with context
102
+ acb_logger = _get_acb_logger()
103
+
104
+ # Check if the logger has a bind method (ACB logger) or if it's a loguru logger
105
+ if hasattr(acb_logger, "bind"):
106
+ logger_with_context = acb_logger.bind(logger=name)
107
+
108
+ # Add correlation ID if available
109
+ correlation_id = get_correlation_id()
110
+ if correlation_id:
111
+ logger_with_context = logger_with_context.bind(
112
+ correlation_id=correlation_id
113
+ )
57
114
  else:
58
- processors.append(structlog.dev.ConsoleRenderer(colors=True))
59
-
60
- structlog.configure(
61
- processors=processors,
62
- wrapper_class=structlog.stdlib.BoundLogger,
63
- logger_factory=structlog.stdlib.LoggerFactory(),
64
- cache_logger_on_first_use=True,
65
- )
66
-
67
- log_level = getattr(logging, level.upper())
68
-
69
- console_handler = logging.StreamHandler(sys.stdout)
70
- console_handler.setLevel(log_level)
71
-
72
- handlers: list[logging.Handler] = [console_handler]
73
-
74
- if log_file:
75
- log_file.parent.mkdir(parents=True, exist_ok=True)
76
- file_handler = logging.FileHandler(log_file)
77
- file_handler.setLevel(log_level)
78
- handlers.append(file_handler)
115
+ # For loguru logger, we can add context via patch or extra
116
+ logger_with_context = acb_logger
117
+ # Add logger name to extra so it shows up in logs
118
+ import loguru
119
+
120
+ if isinstance(logger_with_context, loguru.Logger):
121
+ logger_with_context = acb_logger.patch(
122
+ lambda record: record["extra"].update({"logger": name})
123
+ )
124
+ else:
125
+ # If it's not even a loguru logger, just return as is
126
+ logger_with_context = acb_logger
79
127
 
80
- logging.basicConfig(
81
- level=log_level,
82
- handlers=handlers,
83
- format="%(message)s",
84
- )
128
+ # Cache the logger for reuse
129
+ _logger_cache[name] = logger_with_context
130
+ return logger_with_context
85
131
 
86
132
 
87
- def get_logger(name: str) -> structlog.BoundLogger:
88
- logger: structlog.BoundLogger = structlog.get_logger(name)
89
- return logger
133
+ class LoggingContext:
134
+ """Context manager for operation logging with correlation IDs.
90
135
 
136
+ Uses ACB's logger internally while maintaining Crackerjack's API.
137
+ """
91
138
 
92
- class LoggingContext:
93
139
  def __init__(self, operation: str, **kwargs: Any) -> None:
94
140
  self.operation = operation
95
141
  self.kwargs = kwargs
96
- self.correlation_id = str(uuid.uuid4())[:8]
142
+ self.correlation_id = _generate_correlation_id()
97
143
  self.logger = get_logger("crackerjack.context")
98
144
  self.start_time = time.time()
99
145
 
@@ -131,9 +177,14 @@ class LoggingContext:
131
177
  def log_performance(
132
178
  operation: str,
133
179
  **kwargs: Any,
134
- ) -> t.Callable[[t.Callable[..., t.Any]], t.Callable[..., t.Any]]:
135
- def decorator(func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]:
136
- def wrapper(*args: t.Any, **func_kwargs: t.Any) -> t.Any:
180
+ ) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
181
+ """Decorator for performance logging using ACB's logger.
182
+
183
+ Maintains Crackerjack's API while delegating to ACB's logger.
184
+ """
185
+
186
+ def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
187
+ def wrapper(*args: Any, **func_kwargs: Any) -> Any:
137
188
  logger = get_logger(f"crackerjack.perf.{func.__name__}")
138
189
  start_time = time.time()
139
190
 
@@ -168,6 +219,7 @@ def log_performance(
168
219
  return decorator
169
220
 
170
221
 
222
+ # Module-level logger instances using ACB's logger
171
223
  hook_logger = get_logger("crackerjack.hooks")
172
224
  test_logger = get_logger("crackerjack.tests")
173
225
  config_logger = get_logger("crackerjack.config")
@@ -1,10 +1,12 @@
1
1
  import asyncio
2
+ import concurrent.futures
2
3
  import subprocess
3
4
  import typing as t
4
5
  from pathlib import Path
5
6
  from typing import Protocol
6
7
 
7
- from rich.console import Console
8
+ from acb.console import Console
9
+ from acb.depends import Inject, depends
8
10
  from rich.progress import (
9
11
  BarColumn,
10
12
  Progress,
@@ -36,8 +38,9 @@ class ProgressCallback(Protocol):
36
38
  class RealTimeTypingFeedback:
37
39
  """Provides real-time feedback during type checking operations."""
38
40
 
39
- def __init__(self, console: Console | None = None) -> None:
40
- self.console = console or Console()
41
+ @depends.inject
42
+ def __init__(self, console: Inject[Console]) -> None:
43
+ self.console = console
41
44
  self._total_errors = 0
42
45
  self._files_checked = 0
43
46
 
@@ -143,8 +146,9 @@ class JSONRPCClient:
143
146
  class LSPClient:
144
147
  """Client for communicating with Zuban LSP server."""
145
148
 
146
- def __init__(self, console: Console | None = None) -> None:
147
- self.console = console or Console()
149
+ @depends.inject
150
+ def __init__(self, console: Inject[Console]) -> None:
151
+ self.console = console
148
152
  self._server_port: int | None = None
149
153
  self._server_host: str = "127.0.0.1"
150
154
  self._lsp_service: ZubanLSPService | None = None
@@ -243,7 +247,7 @@ class LSPClient:
243
247
  ) -> dict[str, list[dict[str, t.Any]]]:
244
248
  """Check files with progress display."""
245
249
  diagnostics = {}
246
- feedback = RealTimeTypingFeedback(self.console)
250
+ feedback = RealTimeTypingFeedback()
247
251
 
248
252
  with feedback.create_progress_display() as progress:
249
253
  task = progress.add_task("Type checking files...", total=total_files)
@@ -300,8 +304,6 @@ class LSPClient:
300
304
  try:
301
305
  asyncio.get_running_loop()
302
306
  # We're already in an async context, use a thread pool
303
- import concurrent.futures
304
-
305
307
  with concurrent.futures.ThreadPoolExecutor() as executor:
306
308
  future = executor.submit(
307
309
  self._run_async_lsp_check,
@@ -409,7 +411,7 @@ class LSPClient:
409
411
  ) -> dict[str, list[dict[str, t.Any]]]:
410
412
  """Process files with progress display."""
411
413
  diagnostics = {}
412
- feedback = RealTimeTypingFeedback(self.console)
414
+ feedback = RealTimeTypingFeedback()
413
415
 
414
416
  with feedback.create_progress_display() as progress:
415
417
  task = progress.add_task("LSP type checking files...", total=total_files)
@@ -508,8 +510,6 @@ class LSPClient:
508
510
 
509
511
  def _execute_zuban_check(self, file_path: str) -> subprocess.CompletedProcess[str]:
510
512
  """Execute zuban check command for a file."""
511
- import subprocess
512
-
513
513
  return subprocess.run(
514
514
  ["zuban", "check", file_path],
515
515
  capture_output=True,
@@ -610,7 +610,7 @@ class LSPClient:
610
610
  if not python_files:
611
611
  return {}, "📁 No Python files found to check"
612
612
 
613
- feedback = RealTimeTypingFeedback(self.console)
613
+ feedback = RealTimeTypingFeedback()
614
614
 
615
615
  self.console.print(
616
616
  f"🔍 Starting type check of {len(python_files)} files...", style="bold blue"
@@ -1,6 +1,8 @@
1
1
  import gc
2
+ import os
2
3
  import sys
3
4
  import time
5
+ import tracemalloc
4
6
  import typing as t
5
7
  from collections.abc import Callable
6
8
  from dataclasses import dataclass
@@ -9,7 +11,9 @@ from threading import Lock
9
11
  from typing import Any
10
12
  from weakref import WeakSet
11
13
 
12
- from crackerjack.services.logging import get_logger
14
+ import psutil
15
+ from acb.depends import Inject, depends
16
+ from acb.logger import Logger
13
17
 
14
18
 
15
19
  @dataclass
@@ -27,6 +31,7 @@ class LazyLoader:
27
31
  def __init__(
28
32
  self,
29
33
  factory: Callable[[], Any],
34
+ logger: Logger,
30
35
  name: str = "unnamed",
31
36
  auto_dispose: bool = True,
32
37
  ):
@@ -37,8 +42,7 @@ class LazyLoader:
37
42
  self._loaded = False
38
43
  self._lock = Lock()
39
44
  self._access_count = 0
40
- self._last_access = time.time()
41
- self._logger = get_logger(f"crackerjack.lazy_loader.{name}")
45
+ self._logger = logger
42
46
 
43
47
  MemoryOptimizer.get_instance().register_lazy_object(self)
44
48
 
@@ -102,6 +106,7 @@ class ResourcePool:
102
106
  def __init__(
103
107
  self,
104
108
  factory: Callable[[], Any],
109
+ logger: Logger,
105
110
  max_size: int = 5,
106
111
  name: str = "unnamed",
107
112
  ):
@@ -113,7 +118,7 @@ class ResourcePool:
113
118
  self._lock = Lock()
114
119
  self._created_count = 0
115
120
  self._reused_count = 0
116
- self._logger = get_logger(f"crackerjack.resource_pool.{name}")
121
+ self._logger = logger
117
122
 
118
123
  def acquire(self) -> Any:
119
124
  with self._lock:
@@ -177,11 +182,11 @@ class ResourcePool:
177
182
 
178
183
 
179
184
  class MemoryProfiler:
180
- def __init__(self) -> None:
185
+ def __init__(self, logger: Logger) -> None:
181
186
  self._start_memory = 0.0
182
187
  self._peak_memory = 0.0
183
188
  self._measurements: list[tuple[float, float]] = []
184
- self._logger = get_logger("crackerjack.memory_profiler")
189
+ self._logger = logger
185
190
 
186
191
  def start_profiling(self) -> None:
187
192
  self._start_memory = self._get_memory_usage()
@@ -218,16 +223,10 @@ class MemoryProfiler:
218
223
 
219
224
  def _get_memory_usage(self) -> float:
220
225
  try:
221
- import os
222
-
223
- import psutil
224
-
225
226
  process = psutil.Process(os.getpid())
226
227
  memory_mb: float = process.memory_info().rss / 1024 / 1024
227
228
  return memory_mb
228
229
  except ImportError:
229
- import tracemalloc
230
-
231
230
  if tracemalloc.is_tracing():
232
231
  current, _peak = tracemalloc.get_traced_memory()
233
232
  return current / 1024 / 1024
@@ -239,16 +238,20 @@ class MemoryOptimizer:
239
238
  _instance: t.Optional["MemoryOptimizer"] = None
240
239
  _lock = Lock()
241
240
 
242
- def __init__(self) -> None:
241
+ @depends.inject
242
+ def __init__(
243
+ self,
244
+ logger: Inject[Logger],
245
+ ) -> None:
243
246
  self._lazy_objects: WeakSet[t.Any] = WeakSet()
244
247
  self._resource_pools: dict[str, ResourcePool] = {}
245
- self._profiler = MemoryProfiler()
248
+ self._profiler = MemoryProfiler(logger=logger)
246
249
  self._stats_lock = Lock()
247
250
  self._lazy_created_count = 0
248
251
  self._lazy_loaded_count = 0
249
252
  self._gc_threshold = 100
250
253
  self._auto_gc = True
251
- self._logger = get_logger("crackerjack.memory_optimizer")
254
+ self._logger = logger
252
255
 
253
256
  @classmethod
254
257
  def get_instance(cls) -> "MemoryOptimizer":
@@ -356,7 +359,9 @@ def lazy_property(factory: t.Callable[[], t.Any]) -> property:
356
359
  attr_name = f"_lazy_{factory.__name__}"
357
360
 
358
361
  if not hasattr(self, attr_name):
359
- loader = LazyLoader(factory, factory.__name__)
362
+ # Get logger from DI instead of MemoryOptimizer to avoid circular dependency
363
+ logger = depends.get_sync(Logger)
364
+ loader = LazyLoader(factory, logger=logger, name=factory.__name__)
360
365
  setattr(self, attr_name, loader)
361
366
 
362
367
  return getattr(self, attr_name).get()
@@ -391,12 +396,10 @@ def memory_optimized(func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]:
391
396
  return wrapper
392
397
 
393
398
 
394
- def get_memory_optimizer() -> MemoryOptimizer:
395
- return MemoryOptimizer.get_instance()
396
-
397
-
398
399
  def create_lazy_service(factory: Callable[[], Any], name: str) -> LazyLoader:
399
- return LazyLoader(factory, name)
400
+ # Get logger from DI instead of MemoryOptimizer to avoid circular dependency
401
+ logger = depends.get_sync(Logger)
402
+ return LazyLoader(factory, logger=logger, name=name)
400
403
 
401
404
 
402
405
  def create_resource_pool(
@@ -404,6 +407,8 @@ def create_resource_pool(
404
407
  max_size: int = 5,
405
408
  name: str = "unnamed",
406
409
  ) -> ResourcePool:
407
- pool = ResourcePool(factory, max_size, name)
410
+ # Get logger from DI instead of MemoryOptimizer to avoid circular dependency
411
+ logger = depends.get_sync(Logger)
412
+ pool = ResourcePool(factory, logger=logger, max_size=max_size, name=name)
408
413
  MemoryOptimizer.get_instance().register_resource_pool(name, pool)
409
414
  return pool
@@ -0,0 +1,30 @@
1
+ # Monitoring Services
2
+
3
+ System health, performance metrics, and error pattern analysis services.
4
+
5
+ ## Services
6
+
7
+ - **`health_metrics.py`** - System health monitoring and metric collection
8
+ - **`metrics.py`** - Performance metrics aggregation and reporting
9
+ - **`dependency_monitor.py`** - Dependency health tracking and version monitoring
10
+ - **`error_pattern_analyzer.py`** - Error pattern detection and analysis
11
+ - **`performance_benchmarks.py`** - Performance baseline tracking and regression detection
12
+
13
+ ## Features
14
+
15
+ - **Health Checks** - Real-time system health status
16
+ - **Performance Tracking** - Benchmark execution times and resource usage
17
+ - **Error Analysis** - Pattern detection in test failures and build errors
18
+ - **Dependency Monitoring** - Track outdated or vulnerable dependencies
19
+ - **Metric Aggregation** - Collect and report quality metrics
20
+
21
+ ## Integration
22
+
23
+ These services are used throughout Crackerjack for:
24
+
25
+ - MCP server health endpoints
26
+ - Test execution monitoring
27
+ - Quality trend analysis
28
+ - Performance regression detection
29
+
30
+ See parent `services/README.md` for service architecture details.
@@ -0,0 +1,9 @@
1
+ """Monitoring and telemetry services."""
2
+
3
+ from .dependency_monitor import * # noqa: F401,F403
4
+ from .error_pattern_analyzer import * # noqa: F401,F403
5
+ from .health_metrics import * # noqa: F401,F403
6
+ from .metrics import * # noqa: F401,F403
7
+ from .performance_benchmarks import * # noqa: F401,F403
8
+ from .performance_cache import * # noqa: F401,F403
9
+ from .performance_monitor import * # noqa: F401,F403