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,341 +1,40 @@
1
- import os
2
1
  import typing as t
3
- from contextlib import suppress
4
2
  from pathlib import Path
5
- from typing import Any
6
3
 
7
- from pydantic import BaseModel, Field, field_validator
8
- from rich.console import Console
4
+ from acb.console import Console
5
+ from acb.depends import Inject, depends
6
+ from acb.logger import Logger
9
7
 
8
+ from crackerjack.config.settings import CrackerjackSettings
10
9
  from crackerjack.errors import ValidationError
11
10
  from crackerjack.models.protocols import OptionsProtocol
12
- from crackerjack.services.logging import LoggingContext, get_logger
13
-
14
-
15
- class CrackerjackConfig(BaseModel):
16
- package_path: Path = Field(default_factory=Path.cwd)
17
- cache_enabled: bool = True
18
- cache_size: int = 1000
19
- cache_ttl: float = 300.0
20
-
21
- hook_batch_size: int = 10
22
- hook_timeout: int = 300
23
- max_concurrent_hooks: int = 4
24
- enable_async_hooks: bool = True
25
-
26
- test_timeout: int = 300
27
- test_workers: int = Field(default_factory=lambda: os.cpu_count() or 1)
28
- min_coverage: float = 10.0
29
-
30
- log_level: str = "INFO"
31
- log_json: bool = False
32
- log_file: Path | None = None
33
- enable_correlation_ids: bool = True
34
-
35
- autofix: bool = True
36
- skip_hooks: bool = False
37
- experimental_hooks: bool = False
38
-
39
- batch_file_operations: bool = True
40
- file_operation_batch_size: int = 10
41
-
42
- precommit_mode: str = "comprehensive"
43
-
44
- @field_validator("package_path", mode="before")
45
- @classmethod
46
- def validate_package_path(cls, v: Any) -> Path:
47
- if isinstance(v, str):
48
- v = Path(v)
49
- resolved_path: Path = v.resolve()
50
- return resolved_path
51
-
52
- @field_validator("log_file", mode="before")
53
- @classmethod
54
- def validate_log_file(cls, v: Any) -> Path | None:
55
- if v is None:
56
- return v
57
- if isinstance(v, str):
58
- path_v: Path = Path(v)
59
- return path_v
60
- validated_v: Path = t.cast(Path, v)
61
- return validated_v
62
-
63
- @field_validator("test_workers")
64
- @classmethod
65
- def validate_test_workers(cls, v: int) -> int:
66
- return max(1, min(v, 16))
67
-
68
- @field_validator("min_coverage")
69
- @classmethod
70
- def validate_min_coverage(cls, v: float) -> float:
71
- return max(0.0, min(v, 100.0))
72
-
73
- @field_validator("log_level")
74
- @classmethod
75
- def validate_log_level(cls, v: str) -> str:
76
- valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
77
- if v.upper() not in valid_levels:
78
- msg = f"Invalid log level: {v}. Must be one of {valid_levels}"
79
- raise ValueError(msg)
80
- return v.upper()
81
-
82
- class Config:
83
- extra = "allow"
84
-
85
- use_enum_values = True
86
-
87
-
88
- class ConfigSource:
89
- def __init__(self, priority: int = 0) -> None:
90
- self.priority = priority
91
- self.logger = get_logger("crackerjack.config.source")
92
-
93
- def load(self) -> dict[str, t.Any]:
94
- raise NotImplementedError
95
-
96
- def is_available(self) -> bool:
97
- return True
98
-
99
-
100
- class EnvironmentConfigSource(ConfigSource):
101
- ENV_PREFIX = "CRACKERJACK_"
102
-
103
- def __init__(self, priority: int = 100) -> None:
104
- super().__init__(priority)
105
-
106
- def load(self) -> dict[str, t.Any]:
107
- config: dict[str, t.Any] = {}
108
-
109
- for key, value in os.environ.items():
110
- if key.startswith(self.ENV_PREFIX):
111
- config_key = key[len(self.ENV_PREFIX) :].lower()
112
-
113
- config[config_key] = self._convert_value(value)
114
-
115
- return config
116
-
117
- def _convert_value(self, value: str) -> t.Any:
118
- if value.lower() in ("true", "1", "yes", "on"):
119
- return True
120
- if value.lower() in ("false", "0", "no", "off"):
121
- return False
122
-
123
- cleaned_value = value.replace(" ", "")
124
-
125
- with suppress(ValueError):
126
- return int(cleaned_value)
127
-
128
- with suppress(ValueError):
129
- return float(cleaned_value)
130
-
131
- return value
132
-
133
-
134
- class FileConfigSource(ConfigSource):
135
- def __init__(self, config_path: Path, priority: int = 50) -> None:
136
- super().__init__(priority)
137
- self.config_path = config_path
138
-
139
- def is_available(self) -> bool:
140
- return self.config_path.exists() and self.config_path.is_file()
141
-
142
- def load(self) -> dict[str, t.Any]:
143
- if not self.is_available():
144
- return {}
145
-
146
- try:
147
- with self.config_path.open("r") as f:
148
- if self.config_path.suffix in (".yaml", ".yml"):
149
- import yaml
150
-
151
- result = yaml.safe_load(f)
152
- return result if isinstance(result, dict) else {}
153
- elif self.config_path.suffix == ".json":
154
- import json
155
-
156
- result = json.load(f)
157
- return result if isinstance(result, dict) else {}
158
- else:
159
- self.logger.warning(
160
- f"Unsupported config file format: {self.config_path.suffix}"
161
- )
162
- return {}
163
- except Exception as e:
164
- self.logger.exception(
165
- f"Failed to load config from file: {self.config_path}",
166
- error=str(e),
167
- )
168
- return {}
169
-
170
-
171
- class PyprojectConfigSource(ConfigSource):
172
- def __init__(self, pyproject_path: Path, priority: int = 25) -> None:
173
- super().__init__(priority)
174
- self.pyproject_path = pyproject_path
175
-
176
- def is_available(self) -> bool:
177
- return self.pyproject_path.exists() and self.pyproject_path.is_file()
178
-
179
- def load(self) -> dict[str, t.Any]:
180
- if not self.is_available():
181
- return {}
182
-
183
- try:
184
- import tomllib
185
-
186
- with self.pyproject_path.open("rb") as f:
187
- pyproject_data = tomllib.load(f)
188
-
189
- config: dict[str, t.Any] = pyproject_data.get("tool", {}).get(
190
- "crackerjack", {}
191
- )
192
-
193
- self.logger.debug(
194
- "Loaded pyproject config", keys=list[t.Any](config.keys())
195
- )
196
- return config
197
-
198
- except ImportError:
199
- try:
200
- import tomllib
201
-
202
- with self.pyproject_path.open("rb") as f:
203
- pyproject_data = tomllib.load(f)
204
- config_data: dict[str, t.Any] = pyproject_data.get("tool", {}).get(
205
- "crackerjack", {}
206
- )
207
- self.logger.debug(
208
- "Loaded pyproject config", keys=list[t.Any](config_data.keys())
209
- )
210
- return config_data
211
- except ImportError:
212
- self.logger.warning(
213
- "No TOML library available for pyproject.toml parsing",
214
- )
215
- return {}
216
- except Exception as e:
217
- self.logger.exception("Failed to load pyproject.toml", error=str(e))
218
- return {}
219
-
220
-
221
- class OptionsConfigSource(ConfigSource):
222
- def __init__(self, options: OptionsProtocol, priority: int = 200) -> None:
223
- super().__init__(priority)
224
- self.options = options
225
-
226
- def load(self) -> dict[str, t.Any]:
227
- config: dict[str, t.Any] = {}
228
-
229
- option_mappings = {
230
- "testing": "test_mode",
231
- "autofix": "autofix",
232
- "skip_hooks": "skip_hooks",
233
- "experimental_hooks": "experimental_hooks",
234
- "test_timeout": "test_timeout",
235
- "test_workers": "test_workers",
236
- "benchmark": "benchmark_mode",
237
- "publish": "publish_enabled",
238
- "log_level": "log_level",
239
- }
240
-
241
- for option_attr, config_key in option_mappings.items():
242
- if hasattr(self.options, option_attr):
243
- value = getattr(self.options, option_attr)
244
- if value is not None:
245
- config[config_key] = value
246
-
247
- self.logger.debug("Loaded options config", keys=list[t.Any](config.keys()))
248
- return config
249
11
 
250
12
 
251
13
  class UnifiedConfigurationService:
14
+ @depends.inject
252
15
  def __init__(
253
16
  self,
254
- console: Console,
17
+ console: Inject[Console],
18
+ logger: Inject[Logger],
255
19
  pkg_path: Path,
256
20
  options: OptionsProtocol | None = None,
257
21
  ) -> None:
258
22
  self.console = console
259
23
  self.pkg_path = pkg_path
260
- self.logger = get_logger("crackerjack.config.unified")
261
-
262
- self.sources: list[ConfigSource] = []
263
-
264
- pyproject_path = pkg_path / "pyproject.toml"
265
- self.sources.extend(
266
- (
267
- self._create_default_source(),
268
- PyprojectConfigSource(pyproject_path),
269
- ),
270
- )
271
-
272
- self.sources.append(EnvironmentConfigSource())
273
-
274
- if options:
275
- self.sources.append(OptionsConfigSource(options))
24
+ self.logger = logger
25
+ self._config: CrackerjackSettings | None = None
276
26
 
277
- self._config: CrackerjackConfig | None = None
278
-
279
- def _create_default_source(self) -> ConfigSource:
280
- pkg_path = self.pkg_path
281
-
282
- class DefaultConfigSource(ConfigSource):
283
- def load(self) -> dict[str, t.Any]:
284
- return {
285
- "package_path": pkg_path,
286
- "cache_enabled": True,
287
- "autofix": True,
288
- "log_level": "INFO",
289
- }
290
-
291
- return DefaultConfigSource(priority=0)
292
-
293
- def get_config(self, reload: bool = False) -> CrackerjackConfig:
27
+ def get_config(self, reload: bool = False) -> CrackerjackSettings:
294
28
  if self._config is None or reload:
295
- with LoggingContext("load_unified_config", source_count=len(self.sources)):
296
- self._config = self._load_unified_config()
29
+ self._config = self._load_unified_config()
297
30
 
298
31
  return self._config
299
32
 
300
- def _load_unified_config(self) -> CrackerjackConfig:
301
- merged_config: dict[str, Any] = {}
302
-
303
- sorted_sources = sorted(self.sources, key=lambda s: s.priority)
304
-
305
- for source in sorted_sources:
306
- if source.is_available():
307
- try:
308
- source_config = source.load()
309
- if source_config:
310
- merged_config.update(source_config)
311
- self.logger.debug(
312
- "Merged config from source",
313
- source_type=type(source).__name__,
314
- priority=source.priority,
315
- keys=list[t.Any](source_config.keys()),
316
- )
317
- except Exception as e:
318
- self.logger.exception(
319
- "Failed to load config from source",
320
- source_type=type(source).__name__,
321
- error=str(e),
322
- )
323
-
33
+ def _load_unified_config(self) -> CrackerjackSettings:
324
34
  try:
325
- config = CrackerjackConfig(**merged_config)
326
-
327
- self.logger.info(
328
- "Unified configuration loaded",
329
- package_path=str(config.package_path),
330
- cache_enabled=config.cache_enabled,
331
- autofix=config.autofix,
332
- async_hooks=config.enable_async_hooks,
333
- test_workers=config.test_workers,
334
- log_level=config.log_level,
335
- )
336
-
337
- return config
338
-
35
+ settings = depends.get_sync(CrackerjackSettings)
36
+ self.logger.info("Unified configuration loaded from acb")
37
+ return settings
339
38
  except Exception as e:
340
39
  self.logger.exception("Configuration validation failed", error=str(e))
341
40
  raise ValidationError(
@@ -347,52 +46,51 @@ class UnifiedConfigurationService:
347
46
  def get_precommit_config_mode(self) -> str:
348
47
  config = self.get_config()
349
48
 
350
- if config.experimental_hooks:
49
+ if config.hooks.experimental_hooks:
351
50
  return "experimental"
352
- if hasattr(config, "test") and getattr(config, "test", False):
51
+ if hasattr(config.testing, "test") and getattr(config.testing, "test", False):
353
52
  return "comprehensive"
354
- return config.precommit_mode
53
+ return "comprehensive"
355
54
 
356
- def get_logging_config(self) -> dict[str, Any]:
357
- config = self.get_config()
55
+ def get_logging_config(self) -> dict[str, t.Any]:
56
+ self.get_config()
358
57
 
359
58
  return {
360
- "level": config.log_level,
361
- "json_output": config.log_json,
362
- "log_file": config.log_file,
363
- "enable_correlation_ids": config.enable_correlation_ids,
59
+ "level": "INFO",
60
+ "json_output": False,
61
+ "log_file": None,
62
+ "enable_correlation_ids": True,
364
63
  }
365
64
 
366
- def get_hook_execution_config(self) -> dict[str, Any]:
65
+ def get_hook_execution_config(self) -> dict[str, t.Any]:
367
66
  config = self.get_config()
368
67
 
369
68
  return {
370
- "batch_size": config.hook_batch_size,
371
- "timeout": config.hook_timeout,
372
- "max_concurrent": config.max_concurrent_hooks,
373
- "enable_async": config.enable_async_hooks,
374
- "autofix": config.autofix,
375
- "skip_hooks": config.skip_hooks,
69
+ "batch_size": 10,
70
+ "timeout": 300,
71
+ "max_concurrent": 4,
72
+ "enable_async": True,
73
+ "autofix": config.ai.autofix,
74
+ "skip_hooks": config.hooks.skip_hooks,
376
75
  }
377
76
 
378
- def get_testing_config(self) -> dict[str, Any]:
77
+ def get_testing_config(self) -> dict[str, t.Any]:
379
78
  config = self.get_config()
380
79
 
381
80
  return {
382
- "timeout": config.test_timeout,
383
- "workers": config.test_workers,
384
- "min_coverage": config.min_coverage,
81
+ "timeout": config.testing.test_timeout,
82
+ "workers": config.testing.test_workers,
83
+ "min_coverage": 10.0,
385
84
  }
386
85
 
387
- def get_cache_config(self) -> dict[str, Any]:
388
- config = self.get_config()
389
-
86
+ @staticmethod
87
+ def get_cache_config() -> dict[str, t.Any]:
390
88
  return {
391
- "enabled": config.cache_enabled,
392
- "size": config.cache_size,
393
- "ttl": config.cache_ttl,
394
- "batch_operations": config.batch_file_operations,
395
- "batch_size": config.file_operation_batch_size,
89
+ "enabled": True,
90
+ "size": 1000,
91
+ "ttl": 300.0,
92
+ "batch_operations": True,
93
+ "batch_size": 10,
396
94
  }
397
95
 
398
96
  def validate_current_config(self) -> bool:
@@ -401,15 +99,9 @@ class UnifiedConfigurationService:
401
99
 
402
100
  validation_errors: list[str] = []
403
101
 
404
- if config.test_workers <= 0:
102
+ if config.testing.test_workers <= 0:
405
103
  validation_errors.append("test_workers must be positive")
406
104
 
407
- if config.min_coverage < 0 or config.min_coverage > 100:
408
- validation_errors.append("min_coverage must be between 0 and 100")
409
-
410
- if config.cache_size <= 0:
411
- validation_errors.append("cache_size must be positive")
412
-
413
105
  if validation_errors:
414
106
  for error in validation_errors:
415
107
  self.logger.error("Configuration validation error", error=error)