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,863 @@
1
+ """AI agent coordination and fix verification for workflows.
2
+
3
+ Coordinates AI agent fixing workflow, manages fix execution, and verifies
4
+ that fixes resolve issues. Extracted from WorkflowOrchestrator to improve
5
+ modularity and testability.
6
+
7
+ This module handles:
8
+ - AI agent workflow lifecycle management
9
+ - AI fixing phase execution
10
+ - Fix result processing and verification
11
+ - Integration with EnhancedAgentCoordinator
12
+ - Re-verification of fixes (tests and hooks)
13
+ - Code cleaning preparation for AI fixing
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import typing as t
19
+ from contextlib import suppress
20
+ from pathlib import Path
21
+
22
+ from acb.console import Console
23
+ from acb.depends import Inject, depends
24
+
25
+ from crackerjack.agents.base import AgentContext, Issue
26
+ from crackerjack.agents.enhanced_coordinator import EnhancedAgentCoordinator
27
+ from crackerjack.models.protocols import (
28
+ DebugServiceProtocol,
29
+ LoggerProtocol,
30
+ )
31
+
32
+ if t.TYPE_CHECKING:
33
+ from crackerjack.core.phase_coordinator import PhaseCoordinator
34
+ from crackerjack.core.session_coordinator import SessionCoordinator
35
+ from crackerjack.models.protocols import OptionsProtocol
36
+
37
+ from .workflow_issue_parser import WorkflowIssueParser
38
+ from .workflow_security_gates import WorkflowSecurityGates
39
+
40
+
41
+ class WorkflowAICoordinator:
42
+ """Coordinates AI agent fixing and verifies fixes.
43
+
44
+ This coordinator manages the AI agent workflow lifecycle:
45
+ 1. Determines if AI fixing is needed
46
+ 2. Prepares environment (code cleaning if needed)
47
+ 3. Collects issues from failures via WorkflowIssueParser
48
+ 4. Creates and configures EnhancedAgentCoordinator
49
+ 5. Executes AI fixes
50
+ 6. Verifies fixes by re-running quality checks
51
+ 7. Reports results and updates workflow state
52
+
53
+ Uses protocol-based dependency injection following ACB patterns.
54
+ Delegates issue parsing to WorkflowIssueParser and security
55
+ validation to WorkflowSecurityGates.
56
+ """
57
+
58
+ @depends.inject
59
+ def __init__(
60
+ self,
61
+ console: Inject[Console],
62
+ logger: Inject[LoggerProtocol],
63
+ debugger: Inject[DebugServiceProtocol],
64
+ session: SessionCoordinator,
65
+ phases: PhaseCoordinator,
66
+ pkg_path: Path,
67
+ issue_parser: WorkflowIssueParser,
68
+ security_gates: WorkflowSecurityGates,
69
+ mcp_state_manager: t.Any | None = None,
70
+ ) -> None:
71
+ """Initialize AI coordinator with injected dependencies.
72
+
73
+ Args:
74
+ console: Console for output
75
+ logger: Logger for diagnostic messages
76
+ debugger: Debug service for detailed diagnostics
77
+ session: Session coordinator for workflow state
78
+ phases: Phase coordinator for running quality checks
79
+ pkg_path: Project root path
80
+ issue_parser: Parser for collecting and classifying issues
81
+ security_gates: Security gate validator
82
+ mcp_state_manager: Optional MCP state manager
83
+ """
84
+ self.console = console
85
+ self.logger = logger
86
+ self.debugger = debugger
87
+ self.session = session
88
+ self.phases = phases
89
+ self.pkg_path = pkg_path
90
+ self.issue_parser = issue_parser
91
+ self.security_gates = security_gates
92
+ self._mcp_state_manager = mcp_state_manager
93
+
94
+ # State tracking
95
+ self._code_cleaning_complete = False
96
+
97
+ # ===================================================================
98
+ # Main AI Workflow Coordination
99
+ # ===================================================================
100
+
101
+ async def handle_ai_workflow_completion(
102
+ self,
103
+ options: OptionsProtocol,
104
+ iteration: int,
105
+ testing_passed: bool,
106
+ comprehensive_passed: bool,
107
+ workflow_id: str = "unknown",
108
+ ) -> bool:
109
+ """Handle workflow completion with optional AI fixing.
110
+
111
+ Args:
112
+ options: Configuration options
113
+ iteration: Current workflow iteration
114
+ testing_passed: Whether tests passed
115
+ comprehensive_passed: Whether comprehensive hooks passed
116
+ workflow_id: Workflow identifier
117
+
118
+ Returns:
119
+ True if workflow completed successfully
120
+ """
121
+ if options.ai_agent:
122
+ return await self.handle_ai_agent_workflow(
123
+ options, iteration, testing_passed, comprehensive_passed, workflow_id
124
+ )
125
+
126
+ return await self._handle_standard_workflow(
127
+ options, iteration, testing_passed, comprehensive_passed
128
+ )
129
+
130
+ async def handle_ai_agent_workflow(
131
+ self,
132
+ options: OptionsProtocol,
133
+ iteration: int,
134
+ testing_passed: bool,
135
+ comprehensive_passed: bool,
136
+ workflow_id: str = "unknown",
137
+ ) -> bool:
138
+ """Handle AI agent-enabled workflow with fixing capability.
139
+
140
+ Args:
141
+ options: Configuration options
142
+ iteration: Current workflow iteration
143
+ testing_passed: Whether tests passed
144
+ comprehensive_passed: Whether comprehensive hooks passed
145
+ workflow_id: Workflow identifier
146
+
147
+ Returns:
148
+ True if workflow completed successfully with AI assistance
149
+ """
150
+ if not await self._process_security_gates(options):
151
+ return False
152
+
153
+ needs_ai_fixing = self.determine_ai_fixing_needed(
154
+ testing_passed, comprehensive_passed, bool(options.publish or options.all)
155
+ )
156
+
157
+ if needs_ai_fixing:
158
+ return await self._execute_ai_fixing_workflow(options, iteration)
159
+
160
+ return self.finalize_ai_workflow_success(
161
+ options, iteration, testing_passed, comprehensive_passed
162
+ )
163
+
164
+ async def _handle_standard_workflow(
165
+ self,
166
+ options: OptionsProtocol,
167
+ iteration: int,
168
+ testing_passed: bool,
169
+ comprehensive_passed: bool,
170
+ ) -> bool:
171
+ """Handle standard workflow without AI fixing.
172
+
173
+ Args:
174
+ options: Configuration options
175
+ iteration: Current workflow iteration
176
+ testing_passed: Whether tests passed
177
+ comprehensive_passed: Whether comprehensive hooks passed
178
+
179
+ Returns:
180
+ True if workflow completed successfully
181
+ """
182
+ publishing_requested = bool(options.publish or options.all)
183
+
184
+ final_success = self.determine_workflow_success(
185
+ testing_passed, comprehensive_passed, publishing_requested
186
+ )
187
+
188
+ if self._should_debug():
189
+ self.debugger.log_iteration_end(iteration, final_success)
190
+
191
+ return final_success
192
+
193
+ async def _process_security_gates(self, options: OptionsProtocol) -> bool:
194
+ """Process security gates for publishing workflows.
195
+
196
+ Delegates to WorkflowSecurityGates for validation.
197
+
198
+ Args:
199
+ options: Configuration options
200
+
201
+ Returns:
202
+ True if security gates passed or AI fixed issues
203
+ """
204
+ publishing_requested, security_blocks = (
205
+ self.security_gates.check_security_gates_for_publishing(options)
206
+ )
207
+
208
+ if not (publishing_requested and security_blocks):
209
+ return True
210
+
211
+ security_fix_result = await self._handle_security_gate_failure(
212
+ options, allow_ai_fixing=True
213
+ )
214
+ return security_fix_result
215
+
216
+ async def _handle_security_gate_failure(
217
+ self, options: OptionsProtocol, allow_ai_fixing: bool = False
218
+ ) -> bool:
219
+ """Handle security gate failure with optional AI fixing.
220
+
221
+ Args:
222
+ options: Configuration options
223
+ allow_ai_fixing: Whether to attempt AI-assisted fixing
224
+
225
+ Returns:
226
+ True if security issues were resolved
227
+ """
228
+ self.security_gates.display_security_gate_failure_message()
229
+
230
+ if allow_ai_fixing:
231
+ return await self._attempt_ai_assisted_security_fix(options)
232
+ return self._handle_manual_security_fix()
233
+
234
+ async def _attempt_ai_assisted_security_fix(self, options: OptionsProtocol) -> bool:
235
+ """Attempt to fix security issues using AI assistance.
236
+
237
+ Args:
238
+ options: Configuration options
239
+
240
+ Returns:
241
+ True if security issues were resolved, False otherwise
242
+ """
243
+ self.security_gates.display_ai_fixing_messages()
244
+
245
+ ai_fix_success = await self.run_ai_agent_fixing_phase(options)
246
+ if ai_fix_success:
247
+ return self.security_gates.verify_security_fix_success()
248
+
249
+ return False
250
+
251
+ def _handle_manual_security_fix(self) -> bool:
252
+ """Handle security fix when AI assistance is not allowed.
253
+
254
+ Returns:
255
+ Always False since manual intervention is required
256
+ """
257
+ return self.security_gates.handle_manual_security_fix()
258
+
259
+ async def _execute_ai_fixing_workflow(
260
+ self, options: OptionsProtocol, iteration: int
261
+ ) -> bool:
262
+ """Execute the AI fixing workflow.
263
+
264
+ Args:
265
+ options: Configuration options
266
+ iteration: Current workflow iteration
267
+
268
+ Returns:
269
+ True if AI fixing succeeded
270
+ """
271
+ success = await self.run_ai_agent_fixing_phase(options)
272
+ if self._should_debug():
273
+ self.debugger.log_iteration_end(iteration, success)
274
+ return success
275
+
276
+ def finalize_ai_workflow_success(
277
+ self,
278
+ options: OptionsProtocol,
279
+ iteration: int,
280
+ testing_passed: bool,
281
+ comprehensive_passed: bool,
282
+ ) -> bool:
283
+ """Finalize successful AI workflow completion.
284
+
285
+ Args:
286
+ options: Configuration options
287
+ iteration: Current workflow iteration
288
+ testing_passed: Whether tests passed
289
+ comprehensive_passed: Whether comprehensive hooks passed
290
+
291
+ Returns:
292
+ True if workflow is successful
293
+ """
294
+ publishing_requested = bool(options.publish or options.all)
295
+
296
+ final_success = self.determine_workflow_success(
297
+ testing_passed, comprehensive_passed, publishing_requested
298
+ )
299
+
300
+ self.security_gates.show_partial_success_warning_if_needed(
301
+ publishing_requested, final_success, testing_passed, comprehensive_passed
302
+ )
303
+
304
+ if self._should_debug():
305
+ self.debugger.log_iteration_end(iteration, final_success)
306
+
307
+ return final_success
308
+
309
+ def determine_ai_fixing_needed(
310
+ self,
311
+ testing_passed: bool,
312
+ comprehensive_passed: bool,
313
+ publishing_requested: bool,
314
+ ) -> bool:
315
+ """Determine if AI fixing is needed based on quality results.
316
+
317
+ Args:
318
+ testing_passed: Whether tests passed
319
+ comprehensive_passed: Whether comprehensive hooks passed
320
+ publishing_requested: Whether publishing was requested
321
+
322
+ Returns:
323
+ True if AI fixing should be attempted
324
+ """
325
+ if publishing_requested:
326
+ return not testing_passed or not comprehensive_passed
327
+
328
+ return not testing_passed or not comprehensive_passed
329
+
330
+ def determine_workflow_success(
331
+ self,
332
+ testing_passed: bool,
333
+ comprehensive_passed: bool,
334
+ publishing_requested: bool,
335
+ ) -> bool:
336
+ """Determine overall workflow success.
337
+
338
+ Args:
339
+ testing_passed: Whether tests passed
340
+ comprehensive_passed: Whether comprehensive hooks passed
341
+ publishing_requested: Whether publishing was requested
342
+
343
+ Returns:
344
+ True if workflow is successful
345
+ """
346
+ if publishing_requested:
347
+ return testing_passed and comprehensive_passed
348
+
349
+ return testing_passed and comprehensive_passed
350
+
351
+ # ===================================================================
352
+ # AI Fixing Phase Execution
353
+ # ===================================================================
354
+
355
+ async def run_ai_agent_fixing_phase(self, options: OptionsProtocol) -> bool:
356
+ """Run the AI agent fixing phase.
357
+
358
+ Main entry point for AI-assisted issue resolution. Coordinates:
359
+ 1. Environment preparation (code cleaning if needed)
360
+ 2. Issue collection from test/hook failures
361
+ 3. Agent coordinator setup
362
+ 4. Fix execution
363
+ 5. Fix verification
364
+
365
+ Args:
366
+ options: Configuration options
367
+
368
+ Returns:
369
+ True if fixes were successfully applied and verified
370
+ """
371
+ self._initialize_ai_fixing_phase(options)
372
+
373
+ try:
374
+ self._prepare_ai_fixing_environment(options)
375
+
376
+ agent_coordinator, issues = await self._setup_ai_fixing_workflow()
377
+
378
+ if not issues:
379
+ return self._handle_no_issues_found()
380
+
381
+ return await self._execute_ai_fixes(options, agent_coordinator, issues)
382
+
383
+ except Exception as e:
384
+ return self._handle_fixing_phase_error(e)
385
+
386
+ def _initialize_ai_fixing_phase(self, options: OptionsProtocol) -> None:
387
+ """Initialize the AI fixing phase with logging and status updates.
388
+
389
+ Args:
390
+ options: Configuration options
391
+ """
392
+ self._update_mcp_status("ai_fixing", "running")
393
+ self.logger.info("Starting AI agent fixing phase")
394
+ # Always log this important phase start for AI consumption
395
+ self.logger.info(
396
+ "AI agent fixing phase started",
397
+ ai_agent_fixing=True,
398
+ event_type="ai_fix_init",
399
+ )
400
+ self._log_debug_phase_start()
401
+
402
+ def _prepare_ai_fixing_environment(self, options: OptionsProtocol) -> None:
403
+ """Prepare environment for AI fixing by running code cleaning if needed.
404
+
405
+ Args:
406
+ options: Configuration options
407
+ """
408
+ should_run_cleaning = (
409
+ getattr(options, "clean", False) and not self.has_code_cleaning_run()
410
+ )
411
+
412
+ if not should_run_cleaning:
413
+ return
414
+
415
+ self.console.print(
416
+ "\n[bold yellow]🤖 AI agents recommend running code cleaning first for better results...[/bold yellow]"
417
+ )
418
+
419
+ if self._run_code_cleaning_phase(options):
420
+ self._run_post_cleaning_fast_hooks(options)
421
+ self.mark_code_cleaning_complete()
422
+
423
+ async def _setup_ai_fixing_workflow(
424
+ self,
425
+ ) -> tuple[EnhancedAgentCoordinator, list[Issue]]:
426
+ """Setup agent coordinator and collect issues.
427
+
428
+ Returns:
429
+ Tuple of (agent coordinator, list of issues)
430
+ """
431
+ agent_coordinator = self._setup_agent_coordinator()
432
+ issues = await self._collect_issues_from_failures()
433
+ return agent_coordinator, issues
434
+
435
+ async def _execute_ai_fixes(
436
+ self,
437
+ options: OptionsProtocol,
438
+ agent_coordinator: EnhancedAgentCoordinator,
439
+ issues: list[Issue],
440
+ ) -> bool:
441
+ """Execute AI fixes using the agent coordinator.
442
+
443
+ Args:
444
+ options: Configuration options
445
+ agent_coordinator: Initialized agent coordinator
446
+ issues: List of issues to fix
447
+
448
+ Returns:
449
+ True if fixes were successfully applied and verified
450
+ """
451
+ self.logger.info(f"AI agents will attempt to fix {len(issues)} issues")
452
+ fix_result = await agent_coordinator.handle_issues(issues)
453
+ return await self._process_fix_results(options, fix_result)
454
+
455
+ def _log_debug_phase_start(self) -> None:
456
+ """Log debug information at AI fixing phase start."""
457
+ if self._should_debug():
458
+ self.debugger.log_workflow_phase(
459
+ "ai_agent_fixing",
460
+ "started",
461
+ details={"ai_agent": True},
462
+ )
463
+ # Log structured data to stderr for AI consumption
464
+ self.logger.info(
465
+ "AI agent fixing phase started",
466
+ ai_agent_fixing=True,
467
+ event_type="ai_fix_start",
468
+ )
469
+
470
+ def _setup_agent_coordinator(self) -> EnhancedAgentCoordinator:
471
+ """Create and initialize the enhanced agent coordinator.
472
+
473
+ Returns:
474
+ Initialized EnhancedAgentCoordinator
475
+ """
476
+ from crackerjack.agents.enhanced_coordinator import create_enhanced_coordinator
477
+
478
+ agent_context = AgentContext(
479
+ project_path=self.pkg_path,
480
+ session_id=getattr(self.session, "session_id", None),
481
+ )
482
+
483
+ # Use enhanced coordinator with Claude Code agent integration
484
+ agent_coordinator = create_enhanced_coordinator(
485
+ context=agent_context, enable_external_agents=True
486
+ )
487
+ agent_coordinator.initialize_agents()
488
+ return agent_coordinator
489
+
490
+ def _handle_no_issues_found(self) -> bool:
491
+ """Handle case where no issues were found to fix.
492
+
493
+ Returns:
494
+ True (success since there are no issues)
495
+ """
496
+ self.logger.info("No issues collected for AI agent fixing")
497
+ self._update_mcp_status("ai_fixing", "completed")
498
+ return True
499
+
500
+ async def _process_fix_results(
501
+ self, options: OptionsProtocol, fix_result: t.Any
502
+ ) -> bool:
503
+ """Process the results from AI fixing.
504
+
505
+ Args:
506
+ options: Configuration options
507
+ fix_result: Result object from agent coordinator
508
+
509
+ Returns:
510
+ True if fixes were successful and verified
511
+ """
512
+ verification_success = await self._verify_fixes_applied(options, fix_result)
513
+ success = fix_result.success and verification_success
514
+
515
+ if success:
516
+ self._handle_successful_fixes(fix_result)
517
+ else:
518
+ self._handle_failed_fixes(fix_result, verification_success)
519
+
520
+ self._log_debug_phase_completion(success, fix_result)
521
+ return success
522
+
523
+ def _handle_successful_fixes(self, fix_result: t.Any) -> None:
524
+ """Handle successful fix results.
525
+
526
+ Args:
527
+ fix_result: Result object from agent coordinator
528
+ """
529
+ self.logger.info(
530
+ "AI agents successfully fixed all issues and verification passed"
531
+ )
532
+ self._update_mcp_status("ai_fixing", "completed")
533
+ self._log_fix_counts_if_debugging(fix_result)
534
+
535
+ def _handle_failed_fixes(
536
+ self, fix_result: t.Any, verification_success: bool
537
+ ) -> None:
538
+ """Handle failed fix results.
539
+
540
+ Args:
541
+ fix_result: Result object from agent coordinator
542
+ verification_success: Whether verification passed
543
+ """
544
+ if not verification_success:
545
+ self.logger.warning(
546
+ "AI agent fixes did not pass verification-issues still exist"
547
+ )
548
+ else:
549
+ self.logger.warning(
550
+ f"AI agents could not fix all issues: {fix_result.remaining_issues}",
551
+ )
552
+ self._update_mcp_status("ai_fixing", "failed")
553
+
554
+ def _log_fix_counts_if_debugging(self, fix_result: t.Any) -> None:
555
+ """Log fix counts for debugging purposes.
556
+
557
+ Args:
558
+ fix_result: Result object from agent coordinator
559
+ """
560
+ if not self._should_debug():
561
+ return
562
+
563
+ total_fixes = len(fix_result.fixes_applied)
564
+ test_fixes = len(
565
+ [f for f in fix_result.fixes_applied if "test" in f.lower()],
566
+ )
567
+ hook_fixes = total_fixes - test_fixes
568
+ self.debugger.log_test_fixes(test_fixes)
569
+ self.debugger.log_hook_fixes(hook_fixes)
570
+
571
+ # Log structured data to stderr for AI consumption
572
+ self.logger.info(
573
+ "AI fixes applied",
574
+ ai_agent_fixing=True,
575
+ event_type="ai_fix_counts",
576
+ total_fixes=total_fixes,
577
+ test_fixes=test_fixes,
578
+ hook_fixes=hook_fixes,
579
+ )
580
+
581
+ def _log_debug_phase_completion(self, success: bool, fix_result: t.Any) -> None:
582
+ """Log debug information at AI fixing phase completion.
583
+
584
+ Args:
585
+ success: Whether the phase succeeded
586
+ fix_result: Result object from agent coordinator
587
+ """
588
+ if self._should_debug():
589
+ self.debugger.log_workflow_phase(
590
+ "ai_agent_fixing",
591
+ "completed" if success else "failed",
592
+ details={
593
+ "confidence": fix_result.confidence,
594
+ "fixes_applied": len(fix_result.fixes_applied),
595
+ "remaining_issues": len(fix_result.remaining_issues),
596
+ },
597
+ )
598
+ # Log structured data to stderr for AI consumption
599
+ self.logger.info(
600
+ f"AI agent fixing phase {'completed' if success else 'failed'}",
601
+ ai_agent_fixing=True,
602
+ event_type="ai_fix_completion",
603
+ success=success,
604
+ confidence=fix_result.confidence,
605
+ fixes_applied=len(fix_result.fixes_applied),
606
+ remaining_issues=len(fix_result.remaining_issues),
607
+ )
608
+
609
+ def _handle_fixing_phase_error(self, error: Exception) -> bool:
610
+ """Handle errors during AI fixing phase.
611
+
612
+ Args:
613
+ error: Exception that occurred
614
+
615
+ Returns:
616
+ False (failure)
617
+ """
618
+ self.logger.exception(f"AI agent fixing phase failed: {error}")
619
+ self.session.fail_task("ai_fixing", f"AI agent fixing failed: {error}")
620
+ self._update_mcp_status("ai_fixing", "failed")
621
+
622
+ if self._should_debug():
623
+ self.debugger.log_workflow_phase(
624
+ "ai_agent_fixing",
625
+ "failed",
626
+ details={"error": str(error)},
627
+ )
628
+ # Log structured data to stderr for AI consumption
629
+ self.logger.error(
630
+ "AI agent fixing phase failed",
631
+ ai_agent_fixing=True,
632
+ event_type="ai_fix_error",
633
+ error=str(error),
634
+ error_type=type(error).__name__,
635
+ )
636
+
637
+ return False
638
+
639
+ # ===================================================================
640
+ # Fix Verification
641
+ # ===================================================================
642
+
643
+ async def _verify_fixes_applied(
644
+ self, options: OptionsProtocol, fix_result: t.Any
645
+ ) -> bool:
646
+ """Verify that AI fixes actually resolved issues by re-running checks.
647
+
648
+ Args:
649
+ options: Configuration options
650
+ fix_result: Result object from agent coordinator
651
+
652
+ Returns:
653
+ True if verification passed
654
+ """
655
+ if not fix_result.fixes_applied:
656
+ return True
657
+
658
+ self.logger.info("Verifying AI agent fixes by re-running quality checks")
659
+
660
+ verification_success = True
661
+
662
+ if self._should_verify_test_fixes(fix_result.fixes_applied):
663
+ if not await self._verify_test_fixes(options):
664
+ verification_success = False
665
+
666
+ if self._should_verify_hook_fixes(fix_result.fixes_applied):
667
+ if not await self._verify_hook_fixes(options):
668
+ verification_success = False
669
+
670
+ self._log_verification_result(verification_success)
671
+ return verification_success
672
+
673
+ def _should_verify_test_fixes(self, fixes_applied: list[str]) -> bool:
674
+ """Check if test fixes need verification.
675
+
676
+ Args:
677
+ fixes_applied: List of fixes that were applied
678
+
679
+ Returns:
680
+ True if any test-related fixes were applied
681
+ """
682
+ return any("test" in fix.lower() for fix in fixes_applied)
683
+
684
+ async def _verify_test_fixes(self, options: OptionsProtocol) -> bool:
685
+ """Verify test fixes by re-running tests.
686
+
687
+ Args:
688
+ options: Configuration options
689
+
690
+ Returns:
691
+ True if tests now pass
692
+ """
693
+ self.logger.info("Re-running tests to verify test fixes")
694
+ test_success = self.phases.run_testing_phase(options)
695
+ if not test_success:
696
+ self.logger.warning("Test verification failed-test fixes did not work")
697
+ return test_success
698
+
699
+ def _should_verify_hook_fixes(self, fixes_applied: list[str]) -> bool:
700
+ """Check if hook fixes need verification.
701
+
702
+ Args:
703
+ fixes_applied: List of fixes that were applied
704
+
705
+ Returns:
706
+ True if any hook-related fixes were applied
707
+ """
708
+ hook_fixes = [fix for fix in fixes_applied if self._is_hook_related_fix(fix)]
709
+ return bool(hook_fixes)
710
+
711
+ def _is_hook_related_fix(self, fix: str) -> bool:
712
+ """Check if a fix is related to hooks and should trigger hook verification.
713
+
714
+ Args:
715
+ fix: Description of the fix
716
+
717
+ Returns:
718
+ True if the fix is hook-related
719
+ """
720
+ fix_lower = fix.lower()
721
+ return (
722
+ "hook" not in fix_lower or "complexity" in fix_lower or "type" in fix_lower
723
+ )
724
+
725
+ async def _verify_hook_fixes(self, options: OptionsProtocol) -> bool:
726
+ """Verify hook fixes by re-running comprehensive hooks.
727
+
728
+ Args:
729
+ options: Configuration options
730
+
731
+ Returns:
732
+ True if hooks now pass
733
+ """
734
+ self.logger.info("Re-running comprehensive hooks to verify hook fixes")
735
+ hook_success = self.phases.run_comprehensive_hooks_only(options)
736
+ if not hook_success:
737
+ self.logger.warning("Hook verification failed-hook fixes did not work")
738
+ return hook_success
739
+
740
+ def _log_verification_result(self, verification_success: bool) -> None:
741
+ """Log the result of fix verification.
742
+
743
+ Args:
744
+ verification_success: Whether verification passed
745
+ """
746
+ if verification_success:
747
+ self.logger.info("All AI agent fixes verified successfully")
748
+ else:
749
+ self.logger.error(
750
+ "Verification failed-some fixes did not resolve the issues"
751
+ )
752
+
753
+ # ===================================================================
754
+ # Issue Collection (Delegates to WorkflowIssueParser)
755
+ # ===================================================================
756
+
757
+ async def _collect_issues_from_failures(self) -> list[Issue]:
758
+ """Collect issues from test and hook failures.
759
+
760
+ Delegates to WorkflowIssueParser for issue collection and classification.
761
+
762
+ Returns:
763
+ List of collected issues
764
+ """
765
+ issues: list[Issue] = []
766
+
767
+ test_issues, test_count = self.issue_parser.collect_test_failure_issues(
768
+ self.phases
769
+ )
770
+ hook_issues, hook_count = self.issue_parser.collect_hook_failure_issues(
771
+ self.phases, self.session
772
+ )
773
+
774
+ issues.extend(test_issues)
775
+ issues.extend(hook_issues)
776
+
777
+ self.issue_parser.log_failure_counts_if_debugging(
778
+ test_count, hook_count, self._should_debug()
779
+ )
780
+
781
+ return issues
782
+
783
+ # ===================================================================
784
+ # Helper Methods
785
+ # ===================================================================
786
+
787
+ def _should_debug(self) -> bool:
788
+ """Check if debug mode is enabled.
789
+
790
+ Returns:
791
+ True if AI_AGENT_DEBUG environment variable is set
792
+ """
793
+ import os
794
+
795
+ return os.environ.get("AI_AGENT_DEBUG", "0") == "1"
796
+
797
+ def _update_mcp_status(self, stage: str, status: str) -> None:
798
+ """Update MCP state manager status if available.
799
+
800
+ Args:
801
+ stage: Stage name
802
+ status: Status value
803
+ """
804
+ if hasattr(self, "_mcp_state_manager") and self._mcp_state_manager:
805
+ self._mcp_state_manager.update_stage_status(stage, status)
806
+
807
+ def has_code_cleaning_run(self) -> bool:
808
+ """Check if code cleaning has already run.
809
+
810
+ Returns:
811
+ True if code cleaning has completed
812
+ """
813
+ return self._code_cleaning_complete
814
+
815
+ def mark_code_cleaning_complete(self) -> None:
816
+ """Mark code cleaning as complete."""
817
+ self._code_cleaning_complete = True
818
+
819
+ def _run_code_cleaning_phase(self, options: OptionsProtocol) -> bool:
820
+ """Run the code cleaning phase.
821
+
822
+ Args:
823
+ options: Configuration options
824
+
825
+ Returns:
826
+ True if cleaning succeeded
827
+ """
828
+ self.console.print("\n[bold blue]🧹 Running Code Cleaning Phase...[/bold blue]")
829
+
830
+ success = self.phases.run_cleaning_phase(options)
831
+ if success:
832
+ self.console.print("[green]✅ Code cleaning completed successfully[/green]")
833
+ else:
834
+ self.console.print("[red]❌ Code cleaning failed[/red]")
835
+ self.session.fail_task("workflow", "Code cleaning phase failed")
836
+
837
+ return success
838
+
839
+ def _run_post_cleaning_fast_hooks(self, options: OptionsProtocol) -> bool:
840
+ """Run fast hooks after code cleaning as sanity check.
841
+
842
+ Args:
843
+ options: Configuration options
844
+
845
+ Returns:
846
+ True if fast hooks passed
847
+ """
848
+ self.console.print(
849
+ "\n[bold cyan]🔍 Running Post-Cleaning Fast Hooks Sanity Check...[/bold cyan]"
850
+ )
851
+ # Allow a single re-run after cleaning by resetting the session guard
852
+ with suppress(Exception):
853
+ # Access PhaseCoordinator instance to reset its duplicate guard
854
+ setattr(self.phases, "_fast_hooks_started", False)
855
+
856
+ success = self.phases.run_fast_hooks_phase(options)
857
+ if success:
858
+ self.console.print("[green]✅ Post-cleaning sanity check passed[/green]")
859
+ else:
860
+ self.console.print("[red]❌ Post-cleaning sanity check failed[/red]")
861
+ self.session.fail_task("workflow", "Post-cleaning fast hooks failed")
862
+
863
+ return success