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
@@ -0,0 +1,536 @@
1
+ """Code transformation and refactoring logic."""
2
+
3
+ import typing as t
4
+
5
+ from ....services.regex_patterns import SAFE_PATTERNS
6
+ from ...base import AgentContext
7
+
8
+
9
+ class CodeTransformer:
10
+ """Transforms and refactors code to reduce complexity."""
11
+
12
+ def __init__(self, context: AgentContext) -> None:
13
+ """Initialize transformer with agent context.
14
+
15
+ Args:
16
+ context: AgentContext for logging
17
+ """
18
+ self.context = context
19
+
20
+ def refactor_complex_functions(
21
+ self, content: str, complex_functions: list[dict[str, t.Any]]
22
+ ) -> str:
23
+ """Refactor complex functions.
24
+
25
+ Args:
26
+ content: File content
27
+ complex_functions: List of complex functions
28
+
29
+ Returns:
30
+ Refactored content
31
+ """
32
+ lines = content.split("\n")
33
+
34
+ for func_info in complex_functions:
35
+ func_name = func_info.get("name", "unknown")
36
+
37
+ if func_name == "detect_agent_needs":
38
+ refactored = self.refactor_detect_agent_needs_pattern(content)
39
+ if refactored != content:
40
+ return refactored
41
+
42
+ func_content = self._extract_function_content(lines, func_info)
43
+ if func_content:
44
+ extracted_helpers = self._extract_logical_sections(
45
+ func_content, func_info
46
+ )
47
+ if extracted_helpers:
48
+ modified_content = self._apply_function_extraction(
49
+ content, func_info, extracted_helpers
50
+ )
51
+ if modified_content != content:
52
+ return modified_content
53
+
54
+ return content
55
+
56
+ def apply_enhanced_strategies(self, content: str) -> str:
57
+ """Apply enhanced complexity reduction strategies.
58
+
59
+ Args:
60
+ content: File content
61
+
62
+ Returns:
63
+ Refactored content
64
+ """
65
+ enhanced_content = self._apply_enhanced_complexity_patterns(content)
66
+ return enhanced_content
67
+
68
+ def _apply_enhanced_complexity_patterns(self, content: str) -> str:
69
+ """Apply enhanced complexity reduction patterns.
70
+
71
+ Args:
72
+ content: File content
73
+
74
+ Returns:
75
+ Refactored content
76
+ """
77
+ operations = [
78
+ self._extract_nested_conditions,
79
+ self._simplify_boolean_expressions,
80
+ self._extract_validation_patterns,
81
+ self._simplify_data_structures,
82
+ ]
83
+
84
+ modified_content = content
85
+ for operation in operations:
86
+ modified_content = operation(modified_content)
87
+
88
+ return modified_content
89
+
90
+ @staticmethod
91
+ def _extract_nested_conditions(content: str) -> str:
92
+ """Extract nested conditions into helper methods.
93
+
94
+ Args:
95
+ content: File content
96
+
97
+ Returns:
98
+ Transformed content
99
+ """
100
+ lines = content.split("\n")
101
+ modified_lines = []
102
+
103
+ for i, line in enumerate(lines):
104
+ stripped = line.strip()
105
+
106
+ if (
107
+ stripped.startswith("if ")
108
+ and (" and " in stripped or " or " in stripped)
109
+ and len(stripped) > 80
110
+ ):
111
+ indent = " " * (len(line) - len(line.lstrip()))
112
+ helper_name = f"_is_complex_condition_{i}"
113
+ modified_lines.append(f"{indent}if self.{helper_name}():")
114
+ continue
115
+
116
+ modified_lines.append(line)
117
+
118
+ return "\n".join(modified_lines)
119
+
120
+ @staticmethod
121
+ def _simplify_boolean_expressions(content: str) -> str:
122
+ """Simplify complex boolean expressions.
123
+
124
+ Args:
125
+ content: File content
126
+
127
+ Returns:
128
+ Transformed content
129
+ """
130
+ lines = content.split("\n")
131
+ modified_lines = []
132
+
133
+ for line in lines:
134
+ if " and " in line and " or " in line and len(line.strip()) > 100:
135
+ if line.strip().startswith("if "):
136
+ indent = " " * (len(line) - len(line.lstrip()))
137
+ method_name = "_validate_complex_condition"
138
+ modified_lines.append(f"{indent}if self.{method_name}():")
139
+ continue
140
+
141
+ modified_lines.append(line)
142
+
143
+ return "\n".join(modified_lines)
144
+
145
+ @staticmethod
146
+ def _extract_validation_patterns(content: str) -> str:
147
+ """Extract validation patterns.
148
+
149
+ Args:
150
+ content: File content
151
+
152
+ Returns:
153
+ Transformed content
154
+ """
155
+ if "validation_extract" in SAFE_PATTERNS:
156
+ content = SAFE_PATTERNS["validation_extract"].apply(content)
157
+ else:
158
+ pattern_obj = SAFE_PATTERNS["match_validation_patterns"]
159
+ if pattern_obj.test(content):
160
+ matches = len(
161
+ [line for line in content.split("\n") if pattern_obj.test(line)]
162
+ )
163
+ if matches > 2:
164
+ pass
165
+
166
+ return content
167
+
168
+ @staticmethod
169
+ def _simplify_data_structures(content: str) -> str:
170
+ """Simplify complex data structures.
171
+
172
+ Args:
173
+ content: File content
174
+
175
+ Returns:
176
+ Transformed content
177
+ """
178
+ lines = content.split("\n")
179
+ modified_lines = []
180
+
181
+ for line in lines:
182
+ stripped = line.strip()
183
+
184
+ if (
185
+ "[" in stripped
186
+ and "for" in stripped
187
+ and "if" in stripped
188
+ and len(stripped) > 80
189
+ ):
190
+ pass
191
+
192
+ elif stripped.count(": ") > 5 and stripped.count(", ") > 5:
193
+ pass
194
+
195
+ modified_lines.append(line)
196
+
197
+ return "\n".join(modified_lines)
198
+
199
+ @staticmethod
200
+ def refactor_detect_agent_needs_pattern(content: str) -> str:
201
+ """Refactor detect_agent_needs function pattern.
202
+
203
+ Args:
204
+ content: File content
205
+
206
+ Returns:
207
+ Refactored content
208
+ """
209
+ detect_func_start = "async def detect_agent_needs("
210
+ if detect_func_start not in content:
211
+ return content
212
+
213
+ original_pattern = """ recommendations = {
214
+ "urgent_agents": [],
215
+ "suggested_agents": [],
216
+ "workflow_recommendations": [],
217
+ "detection_reasoning": "",
218
+ }
219
+
220
+ if error_context: """
221
+
222
+ replacement_pattern = """ recommendations = {
223
+ "urgent_agents": [],
224
+ "suggested_agents": [],
225
+ "workflow_recommendations": [],
226
+ "detection_reasoning": "",
227
+ }
228
+
229
+ _add_urgent_agents_for_errors(recommendations, error_context)
230
+ _add_python_project_suggestions(recommendations, file_patterns)
231
+ _set_workflow_recommendations(recommendations)
232
+ _generate_detection_reasoning(recommendations)
233
+
234
+ return json.dumps(recommendations, indent=2)"""
235
+
236
+ if original_pattern in content:
237
+ modified_content = content.replace(original_pattern, replacement_pattern)
238
+ if modified_content != content:
239
+ return modified_content
240
+
241
+ return content
242
+
243
+ def _extract_logical_sections(
244
+ self, func_content: str, func_info: dict[str, t.Any]
245
+ ) -> list[dict[str, str]]:
246
+ """Extract logical sections from function.
247
+
248
+ Args:
249
+ func_content: Function content
250
+ func_info: Function info
251
+
252
+ Returns:
253
+ List of sections
254
+ """
255
+ sections: list[dict[str, str]] = []
256
+ lines = func_content.split("\n")
257
+ current_section: list[str] = []
258
+ section_type: str | None = None
259
+
260
+ for line in lines:
261
+ stripped = line.strip()
262
+
263
+ if self._should_start_new_section(stripped, section_type):
264
+ if current_section:
265
+ sections.append(
266
+ self._create_section(
267
+ current_section, section_type, len(sections)
268
+ )
269
+ )
270
+
271
+ current_section, section_type = self._initialize_new_section(
272
+ line, stripped
273
+ )
274
+ else:
275
+ current_section.append(line)
276
+
277
+ if current_section:
278
+ sections.append(
279
+ self._create_section(current_section, section_type, len(sections))
280
+ )
281
+
282
+ return [s for s in sections if len(s["content"].split("\n")) >= 5]
283
+
284
+ @staticmethod
285
+ def _should_start_new_section(
286
+ stripped: str, current_section_type: str | None
287
+ ) -> bool:
288
+ """Check if should start new section.
289
+
290
+ Args:
291
+ stripped: Stripped line
292
+ current_section_type: Current section type
293
+
294
+ Returns:
295
+ True if should start new section
296
+ """
297
+ if stripped.startswith("if ") and len(stripped) > 50:
298
+ return True
299
+ return (
300
+ stripped.startswith(("for ", "while ")) and current_section_type != "loop"
301
+ )
302
+
303
+ @staticmethod
304
+ def _initialize_new_section(line: str, stripped: str) -> tuple[list[str], str]:
305
+ """Initialize new section.
306
+
307
+ Args:
308
+ line: Full line
309
+ stripped: Stripped line
310
+
311
+ Returns:
312
+ Tuple of section lines and type
313
+ """
314
+ if stripped.startswith("if ") and len(stripped) > 50:
315
+ return [line], "conditional"
316
+ elif stripped.startswith(("for ", "while ")):
317
+ return [line], "loop"
318
+ return [line], "general"
319
+
320
+ @staticmethod
321
+ def _create_section(
322
+ current_section: list[str], section_type: str | None, section_count: int
323
+ ) -> dict[str, str]:
324
+ """Create section dict.
325
+
326
+ Args:
327
+ current_section: Section lines
328
+ section_type: Section type
329
+ section_count: Section count
330
+
331
+ Returns:
332
+ Section dict
333
+ """
334
+ effective_type = section_type or "general"
335
+ name_prefix = "handle" if effective_type == "conditional" else "process"
336
+
337
+ return {
338
+ "type": effective_type,
339
+ "content": "\n".join(current_section),
340
+ "name": f"_{name_prefix}_{effective_type}_{section_count + 1}",
341
+ }
342
+
343
+ @staticmethod
344
+ def _extract_function_content(lines: list[str], func_info: dict[str, t.Any]) -> str:
345
+ """Extract function content.
346
+
347
+ Args:
348
+ lines: File lines
349
+ func_info: Function info
350
+
351
+ Returns:
352
+ Function content
353
+ """
354
+ start_line = func_info["line_start"] - 1
355
+ end_line = func_info.get("line_end", len(lines)) - 1
356
+
357
+ if start_line < 0 or end_line >= len(lines):
358
+ return ""
359
+
360
+ return "\n".join(lines[start_line : end_line + 1])
361
+
362
+ @staticmethod
363
+ def _apply_function_extraction(
364
+ content: str,
365
+ func_info: dict[str, t.Any],
366
+ extracted_helpers: list[dict[str, str]],
367
+ ) -> str:
368
+ """Apply function extraction refactoring.
369
+
370
+ Args:
371
+ content: File content
372
+ func_info: Function info
373
+ extracted_helpers: Helper functions
374
+
375
+ Returns:
376
+ Refactored content
377
+ """
378
+ lines = content.split("\n")
379
+
380
+ if not CodeTransformer._is_extraction_valid(
381
+ lines, func_info, extracted_helpers
382
+ ):
383
+ return "\n".join(lines)
384
+
385
+ return CodeTransformer._perform_extraction(lines, func_info, extracted_helpers)
386
+
387
+ @staticmethod
388
+ def _is_extraction_valid(
389
+ lines: list[str],
390
+ func_info: dict[str, t.Any],
391
+ extracted_helpers: list[dict[str, str]],
392
+ ) -> bool:
393
+ """Check if extraction is valid.
394
+
395
+ Args:
396
+ lines: File lines
397
+ func_info: Function info
398
+ extracted_helpers: Helpers
399
+
400
+ Returns:
401
+ True if valid
402
+ """
403
+ start_line = func_info["line_start"] - 1
404
+ end_line = func_info.get("line_end", len(lines)) - 1
405
+
406
+ return bool(extracted_helpers) and start_line >= 0 and end_line < len(lines)
407
+
408
+ @staticmethod
409
+ def _perform_extraction(
410
+ lines: list[str],
411
+ func_info: dict[str, t.Any],
412
+ extracted_helpers: list[dict[str, str]],
413
+ ) -> str:
414
+ """Perform extraction transformation.
415
+
416
+ Args:
417
+ lines: File lines
418
+ func_info: Function info
419
+ extracted_helpers: Helpers
420
+
421
+ Returns:
422
+ Transformed content
423
+ """
424
+ new_lines = CodeTransformer._replace_function_with_calls(
425
+ lines, func_info, extracted_helpers
426
+ )
427
+ return CodeTransformer._add_helper_definitions(
428
+ new_lines, func_info, extracted_helpers
429
+ )
430
+
431
+ @staticmethod
432
+ def _replace_function_with_calls(
433
+ lines: list[str],
434
+ func_info: dict[str, t.Any],
435
+ extracted_helpers: list[dict[str, str]],
436
+ ) -> list[str]:
437
+ """Replace function with helper calls.
438
+
439
+ Args:
440
+ lines: File lines
441
+ func_info: Function info
442
+ extracted_helpers: Helpers
443
+
444
+ Returns:
445
+ Modified lines
446
+ """
447
+ start_line = func_info["line_start"] - 1
448
+ end_line = func_info.get("line_end", len(lines)) - 1
449
+ func_indent = len(lines[start_line]) - len(lines[start_line].lstrip())
450
+ indent = " " * (func_indent + 4)
451
+
452
+ new_func_lines = [lines[start_line]]
453
+ for helper in extracted_helpers:
454
+ new_func_lines.append(f"{indent}self.{helper['name']}()")
455
+
456
+ return lines[:start_line] + new_func_lines + lines[end_line + 1 :]
457
+
458
+ @staticmethod
459
+ def _add_helper_definitions(
460
+ new_lines: list[str],
461
+ func_info: dict[str, t.Any],
462
+ extracted_helpers: list[dict[str, str]],
463
+ ) -> str:
464
+ """Add helper definitions to class.
465
+
466
+ Args:
467
+ new_lines: Modified lines
468
+ func_info: Function info
469
+ extracted_helpers: Helpers
470
+
471
+ Returns:
472
+ Final content
473
+ """
474
+ start_line = func_info["line_start"] - 1
475
+ class_end = CodeTransformer._find_class_end(new_lines, start_line)
476
+
477
+ for helper in extracted_helpers:
478
+ helper_lines = helper["content"].split("\n")
479
+ new_lines = (
480
+ new_lines[:class_end] + [""] + helper_lines + new_lines[class_end:]
481
+ )
482
+ class_end += len(helper_lines) + 1
483
+
484
+ return "\n".join(new_lines)
485
+
486
+ @staticmethod
487
+ def _find_class_end(lines: list[str], func_start: int) -> int:
488
+ """Find end of class.
489
+
490
+ Args:
491
+ lines: File lines
492
+ func_start: Function start
493
+
494
+ Returns:
495
+ Class end line
496
+ """
497
+ class_indent = CodeTransformer._find_class_indent(lines, func_start)
498
+ if class_indent is None:
499
+ return len(lines)
500
+ return CodeTransformer._find_class_end_line(lines, func_start, class_indent)
501
+
502
+ @staticmethod
503
+ def _find_class_indent(lines: list[str], func_start: int) -> int | None:
504
+ """Find class indentation.
505
+
506
+ Args:
507
+ lines: File lines
508
+ func_start: Function start
509
+
510
+ Returns:
511
+ Class indent or None
512
+ """
513
+ for i in range(func_start, -1, -1):
514
+ if lines[i].strip().startswith("class "):
515
+ return len(lines[i]) - len(lines[i].lstrip())
516
+ return None
517
+
518
+ @staticmethod
519
+ def _find_class_end_line(
520
+ lines: list[str], func_start: int, class_indent: int
521
+ ) -> int:
522
+ """Find class end line.
523
+
524
+ Args:
525
+ lines: File lines
526
+ func_start: Function start
527
+ class_indent: Class indent
528
+
529
+ Returns:
530
+ Class end line
531
+ """
532
+ for i in range(func_start + 1, len(lines)):
533
+ line = lines[i]
534
+ if line.strip() and len(line) - len(line.lstrip()) <= class_indent:
535
+ return i
536
+ return len(lines)