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,5 +1,8 @@
1
1
  import typing as t
2
2
 
3
+ from acb.depends import depends
4
+
5
+ from crackerjack.config import CrackerjackSettings
3
6
  from crackerjack.mcp.context import MCPServerContext, get_context
4
7
  from crackerjack.mcp.rate_limiter import RateLimitMiddleware
5
8
  from crackerjack.services.input_validator import (
@@ -9,7 +12,6 @@ from crackerjack.services.input_validator import (
9
12
 
10
13
  if t.TYPE_CHECKING:
11
14
  from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
12
- from crackerjack.models.config import WorkflowOptions
13
15
 
14
16
 
15
17
  async def create_task_with_subagent(
@@ -141,26 +143,38 @@ def _validate_kwargs_argument(
141
143
  return extra_kwargs
142
144
 
143
145
 
144
- def _configure_stage_options(stage: str) -> "WorkflowOptions":
145
- from crackerjack.models.config import WorkflowOptions
146
+ def _configure_stage_options(stage: str) -> CrackerjackSettings:
147
+ """Configure settings for a specific stage using ACB dependency injection.
148
+
149
+ Note: Returns a copy of global settings with stage-specific overrides.
150
+ The global settings remain unchanged.
151
+ """
152
+ # Get base settings from DI
153
+ base_settings = depends.get_sync(CrackerjackSettings)
154
+
155
+ # Create a new settings instance with stage-specific values
156
+ # We copy the base settings and override specific fields
157
+ settings_dict = base_settings.model_dump()
146
158
 
147
- options = WorkflowOptions()
148
159
  if stage in {"fast", "comprehensive"}:
149
- options.hooks.skip_hooks = False
160
+ settings_dict["skip_hooks"] = False
150
161
  elif stage == "tests":
151
- options.testing.test = True
162
+ settings_dict["run_tests"] = (
163
+ True # Note: field renamed from 'test' to 'run_tests'
164
+ )
152
165
  elif stage == "cleaning":
153
- options.cleaning.clean = True
166
+ settings_dict["clean"] = True
154
167
  elif stage == "init":
155
- options.hooks.skip_hooks = True
156
- return options
168
+ settings_dict["skip_hooks"] = True
169
+
170
+ return CrackerjackSettings(**settings_dict)
157
171
 
158
172
 
159
173
  def _execute_stage(
160
- orchestrator: "WorkflowOrchestrator", stage: str, options: "WorkflowOptions"
174
+ orchestrator: "WorkflowOrchestrator", stage: str, settings: CrackerjackSettings
161
175
  ) -> bool:
162
- # Convert WorkflowOptions to OptionsProtocol
163
- adapted_options = _adapt_workflow_options_to_protocol(options)
176
+ # Convert CrackerjackSettings to OptionsProtocol
177
+ adapted_options = _adapt_settings_to_protocol(settings)
164
178
 
165
179
  if stage == "fast":
166
180
  return orchestrator.run_fast_hooks_only(adapted_options)
@@ -173,122 +187,126 @@ def _execute_stage(
173
187
  return False
174
188
 
175
189
 
176
- def _adapt_workflow_options_to_protocol(options: "WorkflowOptions") -> t.Any:
177
- """Adapt WorkflowOptions to match OptionsProtocol."""
178
- return _AdaptedOptions(options) # type: ignore
190
+ def _adapt_settings_to_protocol(settings: CrackerjackSettings) -> t.Any:
191
+ """Adapt CrackerjackSettings to match OptionsProtocol."""
192
+ return _AdaptedOptions(settings) # type: ignore
179
193
 
180
194
 
181
195
  class _AdaptedOptions:
182
- """Adapter class to convert WorkflowOptions to OptionsProtocol."""
196
+ """Adapter class to convert CrackerjackSettings to OptionsProtocol.
197
+
198
+ Since CrackerjackSettings uses flat field structure, this adapter
199
+ is much simpler than the old nested WorkflowOptions version.
200
+ """
183
201
 
184
- def __init__(self, opts: "WorkflowOptions"):
185
- self.opts = opts
202
+ def __init__(self, settings: CrackerjackSettings):
203
+ self.settings = settings
186
204
 
187
205
  # Git properties
188
206
  @property
189
207
  def commit(self) -> bool:
190
- return getattr(self.opts.git, "commit", False)
208
+ return self.settings.commit
191
209
 
192
210
  @property
193
211
  def create_pr(self) -> bool:
194
- return getattr(self.opts.git, "create_pr", False)
212
+ return self.settings.create_pr
195
213
 
196
214
  # Execution properties
197
215
  @property
198
216
  def interactive(self) -> bool:
199
- return getattr(self.opts.execution, "interactive", False)
217
+ return self.settings.interactive
200
218
 
201
219
  @property
202
220
  def no_config_updates(self) -> bool:
203
- return getattr(self.opts.execution, "no_config_updates", False)
221
+ return self.settings.no_config_updates
204
222
 
205
223
  @property
206
224
  def verbose(self) -> bool:
207
- return getattr(self.opts.execution, "verbose", False)
225
+ return self.settings.verbose
208
226
 
209
227
  @property
210
228
  def async_mode(self) -> bool:
211
- return getattr(self.opts.execution, "async_mode", False)
229
+ return self.settings.async_mode
212
230
 
213
231
  # Testing properties
214
232
  @property
215
233
  def test(self) -> bool:
216
- return getattr(self.opts.testing, "test", False)
234
+ return self.settings.run_tests # Note: Field renamed in CrackerjackSettings
217
235
 
218
236
  @property
219
237
  def benchmark(self) -> bool:
220
- return getattr(self.opts.testing, "benchmark", False)
238
+ return self.settings.benchmark
221
239
 
222
240
  @property
223
241
  def test_workers(self) -> int:
224
- return getattr(self.opts.testing, "test_workers", 0)
242
+ return self.settings.test_workers
225
243
 
226
244
  @property
227
245
  def test_timeout(self) -> int:
228
- return getattr(self.opts.testing, "test_timeout", 0)
246
+ return self.settings.test_timeout
229
247
 
230
248
  # Publishing properties
231
249
  @property
232
250
  def publish(self) -> t.Any | None:
233
- return getattr(self.opts.publishing, "publish", None)
251
+ return self.settings.publish_version
234
252
 
235
253
  @property
236
254
  def bump(self) -> t.Any | None:
237
- return getattr(self.opts.publishing, "bump", None)
255
+ return self.settings.bump_version
238
256
 
239
257
  @property
240
258
  def all(self) -> t.Any | None:
241
- return getattr(self.opts.publishing, "all", None)
259
+ return self.settings.all_workflow
242
260
 
243
261
  @property
244
262
  def no_git_tags(self) -> bool:
245
- return getattr(self.opts.publishing, "no_git_tags", False)
263
+ return self.settings.no_git_tags
246
264
 
247
265
  @property
248
266
  def skip_version_check(self) -> bool:
249
- return getattr(self.opts.publishing, "skip_version_check", False)
267
+ return self.settings.skip_version_check
250
268
 
251
269
  # AI properties
252
270
  @property
253
271
  def ai_agent(self) -> bool:
254
- return getattr(self.opts.ai, "ai_agent", False)
272
+ return self.settings.ai_agent
255
273
 
256
274
  @property
257
275
  def start_mcp_server(self) -> bool:
258
- return getattr(self.opts.ai, "start_mcp_server", False)
276
+ return self.settings.start_mcp_server
259
277
 
260
278
  # Hook properties
261
279
  @property
262
280
  def skip_hooks(self) -> bool:
263
- return getattr(self.opts.hooks, "skip_hooks", False)
281
+ return self.settings.skip_hooks
264
282
 
265
283
  @property
266
284
  def update_precommit(self) -> bool:
267
- return getattr(self.opts.hooks, "update_precommit", False)
285
+ return self.settings.update_precommit
268
286
 
269
287
  @property
270
288
  def experimental_hooks(self) -> bool:
271
- return getattr(self.opts.hooks, "experimental_hooks", False)
289
+ return self.settings.experimental_hooks
272
290
 
273
291
  @property
274
292
  def enable_pyrefly(self) -> bool:
275
- return getattr(self.opts.hooks, "enable_pyrefly", False)
293
+ return self.settings.enable_pyrefly
276
294
 
277
295
  @property
278
296
  def enable_ty(self) -> bool:
279
- return getattr(self.opts.hooks, "enable_ty", False)
297
+ return self.settings.enable_ty
280
298
 
281
299
  # Cleaning properties
282
300
  @property
283
301
  def clean(self) -> bool:
284
- return getattr(self.opts.cleaning, "clean", False)
302
+ return self.settings.clean
285
303
 
286
304
  # Progress properties
287
305
  @property
288
306
  def track_progress(self) -> bool:
289
- return getattr(self.opts.progress, "track_progress", False)
307
+ return self.settings.progress_enabled
290
308
 
291
- # Default/static properties
309
+ # Default/static properties (not in settings, keep defaults)
292
310
  @property
293
311
  def cleanup(self) -> t.Any | None:
294
312
  return None
@@ -299,7 +317,7 @@ class _AdaptedOptions:
299
317
 
300
318
  @property
301
319
  def coverage(self) -> bool:
302
- return False
320
+ return self.settings.coverage_enabled
303
321
 
304
322
  @property
305
323
  def keep_releases(self) -> int:
@@ -310,21 +328,26 @@ class _AdaptedOptions:
310
328
  return False
311
329
 
312
330
 
313
- def _execute_init_stage(orchestrator: "WorkflowOrchestrator") -> bool:
331
+ from acb.console import Console
332
+ from acb.depends import Inject
333
+
334
+ from crackerjack.services.filesystem import FileSystemService
335
+ from crackerjack.services.git import GitService
336
+ from crackerjack.services.initialization import InitializationService
337
+
338
+
339
+ def _execute_init_stage(
340
+ orchestrator: "WorkflowOrchestrator", console: Inject[Console]
341
+ ) -> bool:
314
342
  try:
315
343
  from pathlib import Path
316
344
 
317
- from crackerjack.services.filesystem import FileSystemService
318
- from crackerjack.services.git import GitService
319
- from crackerjack.services.initialization import InitializationService
320
-
321
- console = orchestrator.console
322
345
  pkg_path = orchestrator.pkg_path
323
346
 
324
347
  filesystem = FileSystemService()
325
- git_service = GitService(console, pkg_path)
348
+ git_service = GitService(pkg_path)
326
349
 
327
- init_service = InitializationService(console, filesystem, git_service, pkg_path)
350
+ init_service = InitializationService(filesystem, git_service, pkg_path)
328
351
 
329
352
  results = init_service.initialize_project_full(target_path=Path.cwd())
330
353
 
@@ -17,37 +17,91 @@ def register_execution_tools(mcp_app: t.Any) -> None:
17
17
  def _register_execute_crackerjack_tool(mcp_app: t.Any) -> None:
18
18
  @mcp_app.tool() # type: ignore[misc]
19
19
  async def execute_crackerjack(args: str, kwargs: str) -> str:
20
- context = get_context()
21
-
22
- validation_error = await _validate_context_and_rate_limit(context)
23
- if validation_error:
24
- return validation_error
25
-
26
- kwargs_result = _parse_kwargs(kwargs)
27
- if "error" in kwargs_result:
28
- return json.dumps(kwargs_result)
29
-
30
- extra_kwargs = kwargs_result["kwargs"]
20
+ try:
21
+ context = get_context()
22
+ validation_error = await _handle_context_validation(context)
23
+ if validation_error:
24
+ return validation_error
31
25
 
32
- if "execution_timeout" not in extra_kwargs:
33
- if extra_kwargs.get("test", False) or extra_kwargs.get("testing", False):
34
- extra_kwargs["execution_timeout"] = 1200
35
- else:
36
- extra_kwargs["execution_timeout"] = 900
26
+ kwargs_result = _parse_kwargs(kwargs)
27
+ if "error" in kwargs_result:
28
+ return json.dumps(kwargs_result)
37
29
 
38
- try:
30
+ extra_kwargs = _prepare_execution_kwargs(kwargs_result["kwargs"])
39
31
  result = await execute_crackerjack_workflow(args, extra_kwargs)
40
32
  return json.dumps(result, indent=2)
33
+ except TypeError as e:
34
+ return _handle_type_error(e)
41
35
  except Exception as e:
36
+ return _handle_general_error(e)
37
+
38
+
39
+ async def _handle_context_validation(context: t.Any) -> str | None:
40
+ """Handle context validation with proper error handling."""
41
+ from datetime import datetime
42
+
43
+ try:
44
+ validation_error = await _validate_context_and_rate_limit(context)
45
+ if validation_error:
46
+ return validation_error
47
+ return None
48
+ except TypeError as e:
49
+ if "NoneType" in str(e) and "await" in str(e):
42
50
  return json.dumps(
43
51
  {
44
52
  "status": "failed",
45
- "error": f"Execution failed: {e}",
46
- "timestamp": context.get_current_time()
47
- if hasattr(context, "get_current_time")
48
- else None,
53
+ "error": "Context validation failed: rate limiter returned None. "
54
+ "MCP server may not be properly initialized.",
55
+ "timestamp": datetime.now().isoformat(),
56
+ "details": str(e),
49
57
  }
50
58
  )
59
+ raise
60
+
61
+
62
+ def _prepare_execution_kwargs(kwargs: dict[str, t.Any]) -> dict[str, t.Any]:
63
+ """Prepare execution kwargs with appropriate timeout defaults."""
64
+ if "execution_timeout" not in kwargs:
65
+ if kwargs.get("test", False) or kwargs.get("testing", False):
66
+ kwargs["execution_timeout"] = 1200
67
+ else:
68
+ kwargs["execution_timeout"] = 900
69
+ return kwargs
70
+
71
+
72
+ def _handle_type_error(error: TypeError) -> str:
73
+ """Handle TypeError with specific async execution error details."""
74
+ import traceback
75
+ from datetime import datetime
76
+
77
+ if "NoneType" in str(error) and "await" in str(error):
78
+ return json.dumps(
79
+ {
80
+ "status": "failed",
81
+ "error": f"Async execution error: A function returned None instead of an awaitable. {error}",
82
+ "traceback": traceback.format_exc(),
83
+ "timestamp": datetime.now().isoformat(),
84
+ }
85
+ )
86
+ raise error
87
+
88
+
89
+ def _handle_general_error(error: Exception) -> str:
90
+ """Handle general execution errors with traceback."""
91
+ import traceback
92
+ from datetime import datetime
93
+
94
+ context = get_context()
95
+ return json.dumps(
96
+ {
97
+ "status": "failed",
98
+ "error": f"Execution failed: {error}",
99
+ "traceback": traceback.format_exc(),
100
+ "timestamp": context.get_current_time()
101
+ if context and hasattr(context, "get_current_time")
102
+ else datetime.now().isoformat(),
103
+ }
104
+ )
51
105
 
52
106
 
53
107
  def _register_smart_error_analysis_tool(mcp_app: t.Any) -> None:
@@ -153,20 +207,22 @@ def _parse_init_arguments(args: str, kwargs: str) -> tuple[t.Any, bool, str | No
153
207
 
154
208
 
155
209
  def _execute_initialization(target_path: t.Any, force: bool) -> dict[str, t.Any]:
156
- from rich.console import Console
157
-
158
- from crackerjack.services.initialization import InitializationService
159
-
160
- console = Console()
210
+ from acb.console import Console
211
+ from acb.depends import Inject, depends
161
212
 
162
213
  from crackerjack.services.filesystem import FileSystemService
163
214
  from crackerjack.services.git import GitService
215
+ from crackerjack.services.initialization import InitializationService
164
216
 
165
- filesystem = FileSystemService()
166
- git_service = GitService(console)
167
- return InitializationService(
168
- console, filesystem, git_service, target_path
169
- ).initialize_project_full(force=force)
217
+ @depends.inject
218
+ def _execute_initialization(
219
+ target_path: t.Any, force: bool, console: Inject[Console]
220
+ ) -> dict[str, t.Any]:
221
+ filesystem = FileSystemService()
222
+ git_service = GitService(target_path)
223
+ return InitializationService(
224
+ filesystem, git_service, target_path
225
+ ).initialize_project_full(force=force)
170
226
 
171
227
 
172
228
  def _create_init_error_response(message: str) -> str:
@@ -147,7 +147,7 @@ async def get_smart_agent_recommendation(
147
147
  context=task_context,
148
148
  )
149
149
 
150
- response = {
150
+ response: dict[str, t.Any] = {
151
151
  "task_description": task_description,
152
152
  "context_type": context_type,
153
153
  }
@@ -181,7 +181,7 @@ async def get_smart_agent_recommendation(
181
181
  {"error": str(e)}, indent=2
182
182
  )
183
183
 
184
- logger.debug(f"Generated recommendation for task: {task_description[:50]}...")
184
+ logger.debug(f"Generated recommendation for task: {task_description[:50]}")
185
185
  return response
186
186
 
187
187
  except Exception as e:
@@ -119,7 +119,7 @@ def _create_validation_results(file_path: str) -> dict[str, t.Any]:
119
119
 
120
120
 
121
121
  def _create_pattern_suggestions(problem_context: str) -> dict[str, t.Any]:
122
- pattern_suggestions = {
122
+ pattern_suggestions: dict[str, t.Any] = {
123
123
  "context": problem_context,
124
124
  "recommended_patterns": [],
125
125
  "implementation_guidance": [],