crackerjack 0.31.4__tar.gz → 0.31.8__tar.gz

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.

Potentially problematic release.


This version of crackerjack might be problematic. Click here for more details.

Files changed (285) hide show
  1. {crackerjack-0.31.4/crackerjack → crackerjack-0.31.8}/.pre-commit-config.yaml +2 -2
  2. {crackerjack-0.31.4 → crackerjack-0.31.8}/CHANGELOG.md +100 -0
  3. {crackerjack-0.31.4 → crackerjack-0.31.8}/PKG-INFO +1 -1
  4. {crackerjack-0.31.4 → crackerjack-0.31.8/crackerjack}/.pre-commit-config.yaml +2 -2
  5. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/__main__.py +2 -0
  6. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/base.py +1 -0
  7. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/test_creation_agent.py +5 -0
  8. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/cli/options.py +8 -0
  9. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/phase_coordinator.py +25 -1
  10. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/workflow_orchestrator.py +264 -78
  11. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/dynamic_config.py +3 -3
  12. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/publish_manager.py +22 -0
  13. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/test_executor.py +13 -5
  14. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/test_progress.py +31 -61
  15. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/context.py +6 -0
  16. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/execution_tools.py +4 -2
  17. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/progress_tools.py +95 -19
  18. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/workflow_executor.py +224 -19
  19. crackerjack-0.31.8/crackerjack/orchestration/coverage_improvement.py +223 -0
  20. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/pyproject.toml +1 -1
  21. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/config.py +12 -1
  22. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/coverage_ratchet.py +9 -0
  23. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/filesystem.py +26 -0
  24. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/git.py +12 -1
  25. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/initialization.py +38 -12
  26. {crackerjack-0.31.4 → crackerjack-0.31.8/crackerjack}/uv.lock +2 -1
  27. {crackerjack-0.31.4 → crackerjack-0.31.8}/pyproject.toml +1 -1
  28. {crackerjack-0.31.4/crackerjack → crackerjack-0.31.8}/uv.lock +13 -1
  29. {crackerjack-0.31.4 → crackerjack-0.31.8}/.github/FUNDING.yml +0 -0
  30. {crackerjack-0.31.4 → crackerjack-0.31.8}/.gitignore +0 -0
  31. {crackerjack-0.31.4 → crackerjack-0.31.8}/.mcp.json.bak +0 -0
  32. {crackerjack-0.31.4 → crackerjack-0.31.8}/AGENTS.md +0 -0
  33. {crackerjack-0.31.4 → crackerjack-0.31.8}/AI-AGENT-RULES.md +0 -0
  34. {crackerjack-0.31.4 → crackerjack-0.31.8}/CLAUDE.md +0 -0
  35. {crackerjack-0.31.4 → crackerjack-0.31.8}/LICENSE +0 -0
  36. {crackerjack-0.31.4 → crackerjack-0.31.8}/README-AI-AGENT.md +0 -0
  37. {crackerjack-0.31.4 → crackerjack-0.31.8}/README.md +0 -0
  38. {crackerjack-0.31.4 → crackerjack-0.31.8}/RULES.md +0 -0
  39. {crackerjack-0.31.4 → crackerjack-0.31.8}/UVXUSAGE.md +0 -0
  40. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/.gitignore +0 -0
  41. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/.mcp.json.bak +0 -0
  42. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/CLAUDE.md +0 -0
  43. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/RULES.md +0 -0
  44. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/__init__.py +0 -0
  45. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/__init__.py +0 -0
  46. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/architect_agent.py +0 -0
  47. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/coordinator.py +0 -0
  48. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/documentation_agent.py +0 -0
  49. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/dry_agent.py +0 -0
  50. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/formatting_agent.py +0 -0
  51. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/import_optimization_agent.py +0 -0
  52. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/performance_agent.py +0 -0
  53. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/proactive_agent.py +0 -0
  54. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/refactoring_agent.py +0 -0
  55. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/security_agent.py +0 -0
  56. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/test_specialist_agent.py +0 -0
  57. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/agents/tracker.py +0 -0
  58. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/api.py +0 -0
  59. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/cli/__init__.py +0 -0
  60. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/cli/facade.py +0 -0
  61. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/cli/handlers.py +0 -0
  62. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/cli/interactive.py +0 -0
  63. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/cli/utils.py +0 -0
  64. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/code_cleaner.py +0 -0
  65. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/config/__init__.py +0 -0
  66. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/config/hooks.py +0 -0
  67. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/__init__.py +0 -0
  68. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/async_workflow_orchestrator.py +0 -0
  69. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/autofix_coordinator.py +0 -0
  70. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/container.py +0 -0
  71. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/enhanced_container.py +0 -0
  72. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/performance.py +0 -0
  73. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/proactive_workflow.py +0 -0
  74. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/core/session_coordinator.py +0 -0
  75. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/errors.py +0 -0
  76. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/executors/__init__.py +0 -0
  77. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/executors/async_hook_executor.py +0 -0
  78. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/executors/cached_hook_executor.py +0 -0
  79. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/executors/hook_executor.py +0 -0
  80. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/executors/individual_hook_executor.py +0 -0
  81. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/intelligence/__init__.py +0 -0
  82. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/intelligence/adaptive_learning.py +0 -0
  83. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/intelligence/agent_orchestrator.py +0 -0
  84. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/intelligence/agent_registry.py +0 -0
  85. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/intelligence/agent_selector.py +0 -0
  86. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/intelligence/integration.py +0 -0
  87. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/interactive.py +0 -0
  88. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/__init__.py +0 -0
  89. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/async_hook_manager.py +0 -0
  90. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/hook_manager.py +0 -0
  91. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/test_command_builder.py +0 -0
  92. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/test_manager.py +0 -0
  93. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/managers/test_manager_backup.py +0 -0
  94. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/__init__.py +0 -0
  95. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/cache.py +0 -0
  96. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/client_runner.py +0 -0
  97. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/dashboard.py +0 -0
  98. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/enhanced_progress_monitor.py +0 -0
  99. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/enhanced_progress_monitor.tcss +0 -0
  100. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/file_monitor.py +0 -0
  101. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/progress_components.py +0 -0
  102. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/progress_monitor.py +0 -0
  103. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/progress_monitor.tcss +0 -0
  104. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/rate_limiter.py +0 -0
  105. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/server.py +0 -0
  106. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/server_core.py +0 -0
  107. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/service_watchdog.py +0 -0
  108. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/state.py +0 -0
  109. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/task_manager.py +0 -0
  110. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/__init__.py +0 -0
  111. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/core_tools.py +0 -0
  112. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/error_analyzer.py +0 -0
  113. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/execution_tools_backup.py +0 -0
  114. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/intelligence_tool_registry.py +0 -0
  115. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/intelligence_tools.py +0 -0
  116. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/monitoring_tools.py +0 -0
  117. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/monitoring_tools.py.backup +0 -0
  118. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/proactive_tools.py +0 -0
  119. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/tools/utility_tools.py +0 -0
  120. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket/__init__.py +0 -0
  121. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket/app.py +0 -0
  122. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket/endpoints.py +0 -0
  123. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket/jobs.py +0 -0
  124. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket/server.py +0 -0
  125. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket/websocket_handler.py +0 -0
  126. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/mcp/websocket_server.py +0 -0
  127. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/models/__init__.py +0 -0
  128. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/models/config.py +0 -0
  129. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/models/config_adapter.py +0 -0
  130. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/models/protocols.py +0 -0
  131. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/models/task.py +0 -0
  132. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/monitoring/ai_agent_watchdog.py +0 -0
  133. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/monitoring/regression_prevention.py +0 -0
  134. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/orchestration/__init__.py +0 -0
  135. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/orchestration/advanced_orchestrator.py +0 -0
  136. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/orchestration/execution_strategies.py +0 -0
  137. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/orchestration/test_progress_streamer.py +0 -0
  138. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/plugins/__init__.py +0 -0
  139. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/plugins/base.py +0 -0
  140. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/plugins/hooks.py +0 -0
  141. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/plugins/loader.py +0 -0
  142. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/plugins/managers.py +0 -0
  143. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/py313.py +0 -0
  144. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/__init__.py +0 -0
  145. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/cache.py +0 -0
  146. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/config_integrity.py +0 -0
  147. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/contextual_ai_assistant.py +0 -0
  148. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/debug.py +0 -0
  149. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/dependency_monitor.py +0 -0
  150. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/enhanced_filesystem.py +0 -0
  151. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/file_hasher.py +0 -0
  152. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/health_metrics.py +0 -0
  153. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/log_manager.py +0 -0
  154. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/logging.py +0 -0
  155. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/metrics.py +0 -0
  156. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/pattern_cache.py +0 -0
  157. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/pattern_detector.py +0 -0
  158. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/performance_benchmarks.py +0 -0
  159. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/security.py +0 -0
  160. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/server_manager.py +0 -0
  161. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/smart_scheduling.py +0 -0
  162. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/tool_version_service.py +0 -0
  163. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/unified_config.py +0 -0
  164. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/services/version_checker.py +0 -0
  165. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/slash_commands/__init__.py +0 -0
  166. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/slash_commands/init.md +0 -0
  167. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/slash_commands/run.md +0 -0
  168. {crackerjack-0.31.4 → crackerjack-0.31.8}/crackerjack/slash_commands/status.md +0 -0
  169. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/AI_AGENT_DEBUGGING.md +0 -0
  170. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/API_REFERENCE.md +0 -0
  171. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/ARCHITECTURE.md +0 -0
  172. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/FUTURE-ENHANCEMENTS.md +0 -0
  173. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/SUB_AGENT_MONITORING_DESIGN.md +0 -0
  174. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/VERIFICATION_WORKFLOW.md +0 -0
  175. {crackerjack-0.31.4 → crackerjack-0.31.8}/docs/WORKFLOW_KNOWLEDGE_BASE.md +0 -0
  176. {crackerjack-0.31.4 → crackerjack-0.31.8}/example.mcp.json +0 -0
  177. {crackerjack-0.31.4 → crackerjack-0.31.8}/excalidraw.log +0 -0
  178. {crackerjack-0.31.4 → crackerjack-0.31.8}/fix_terminal.sh +0 -0
  179. {crackerjack-0.31.4 → crackerjack-0.31.8}/requirements.txt +0 -0
  180. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/.coverage +0 -0
  181. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/HEALTH_METRICS_TESTING_SUMMARY.md +0 -0
  182. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/TESTING.md +0 -0
  183. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/TEST_COVERAGE_PLAN.md +0 -0
  184. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/__init__.py +0 -0
  185. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/conftest.py +0 -0
  186. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/coverage.json +0 -0
  187. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/data/comments_sample.txt +0 -0
  188. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/data/docstrings_sample.txt +0 -0
  189. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/data/expected_comments_sample.txt +0 -0
  190. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/data/init.py +0 -0
  191. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/scripts/__init__.py +0 -0
  192. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/scripts/agent_audit_report.py +0 -0
  193. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/scripts/run_test_suite.py +0 -0
  194. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test___main__.py +0 -0
  195. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_advanced_orchestrator_strategic.py +0 -0
  196. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_ai_agent_comprehensive.py +0 -0
  197. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_ai_agent_workflow.py +0 -0
  198. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_async_hook_executor.py +0 -0
  199. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_cli_strategic.py +0 -0
  200. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_code_cleaner.py +0 -0
  201. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_contextual_ai_assistant_strategic.py +0 -0
  202. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_additional_strategic.py +0 -0
  203. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_autofix_coordinator.py +0 -0
  204. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_comprehensive.py +0 -0
  205. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_coverage.py +0 -0
  206. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_enhanced_container.py +0 -0
  207. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_modules.py +0 -0
  208. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_performance.py +0 -0
  209. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_strategic.py +0 -0
  210. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_strategic_coverage.py +0 -0
  211. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_core_workflow_orchestration_deep_quality.py +0 -0
  212. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_dependency_monitor_strategic.py +0 -0
  213. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_documentation_agent.py +0 -0
  214. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_documentation_agent_simple.py +0 -0
  215. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_dynamic_config.py +0 -0
  216. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_dynamic_config_coverage.py +0 -0
  217. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_enhanced_filesystem.py +0 -0
  218. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_enhanced_filesystem_comprehensive.py +0 -0
  219. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_enhanced_filesystem_coverage.py +0 -0
  220. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_enhanced_filesystem_integration.py +0 -0
  221. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_enhanced_filesystem_strategic.py +0 -0
  222. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_filesystem_coverage.py +0 -0
  223. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_health_metrics_strategic.py +0 -0
  224. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_hook_manager_simple.py +0 -0
  225. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_import_coverage_consolidated.py +0 -0
  226. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_import_optimization_agent.py +0 -0
  227. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_intelligence_system.py +0 -0
  228. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_large_modules_coverage.py +0 -0
  229. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_main_entry_coverage.py +0 -0
  230. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_main_module.py +0 -0
  231. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_managers_consolidated.py +0 -0
  232. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_managers_strategic_coverage.py +0 -0
  233. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_additional_strategic.py +0 -0
  234. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_core_strategic.py +0 -0
  235. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_progress_monitor.py +0 -0
  236. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_progress_strategic.py +0 -0
  237. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_server.py +0 -0
  238. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_strategic.py +0 -0
  239. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_mcp_websocket_lifecycle_deep_quality.py +0 -0
  240. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_models_comprehensive.py +0 -0
  241. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_models_config_adapter_coverage.py +0 -0
  242. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_models_focused.py +0 -0
  243. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_models_strategic.py +0 -0
  244. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_models_task_coverage.py +0 -0
  245. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_modernized_code.py +0 -0
  246. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_orchestration_advanced_strategic.py +0 -0
  247. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_orchestration_strategic.py +0 -0
  248. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_performance_agent.py +0 -0
  249. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_performance_agent_simple.py +0 -0
  250. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_performance_benchmarks_focused.py +0 -0
  251. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_performance_benchmarks_strategic.py +0 -0
  252. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_phase_coordinator_simple.py +0 -0
  253. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_plugins_base_strategic.py +0 -0
  254. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_plugins_comprehensive.py +0 -0
  255. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_plugins_coverage.py +0 -0
  256. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_plugins_strategic.py +0 -0
  257. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_plugins_system_strategic.py +0 -0
  258. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_proactive_agent_system.py +0 -0
  259. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_protocol_compliance.py +0 -0
  260. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_publish_manager_coverage.py +0 -0
  261. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_py313_coverage.py +0 -0
  262. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_pytest_features.py +0 -0
  263. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_refactoring_agent.py +0 -0
  264. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_server_manager_strategic.py +0 -0
  265. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_services_coverage.py +0 -0
  266. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_services_strategic.py +0 -0
  267. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_session_coordinator.py +0 -0
  268. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_session_coordinator_coverage.py +0 -0
  269. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_simple_tool_version_service.py +0 -0
  270. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_structured_errors.py +0 -0
  271. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_structured_logging.py +0 -0
  272. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_terminal_restoration.py +0 -0
  273. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_terminal_state.py +0 -0
  274. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_advanced.py +0 -0
  275. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_business_logic.py +0 -0
  276. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_coverage.py +0 -0
  277. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_deep_coverage.py +0 -0
  278. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_functional.py +0 -0
  279. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_simple_working.py +0 -0
  280. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_tool_version_service_strategic.py +0 -0
  281. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_unified_api.py +0 -0
  282. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_unified_config.py +0 -0
  283. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_workflow_integration.py +0 -0
  284. {crackerjack-0.31.4 → crackerjack-0.31.8}/tests/test_workflow_orchestrator.py +0 -0
  285. {crackerjack-0.31.4 → crackerjack-0.31.8}/tools.yaml +0 -0
@@ -19,7 +19,7 @@ repos:
19
19
  name: check-added-large-files
20
20
  exclude: ^\.venv/
21
21
  - repo: https://github.com/astral-sh/uv-pre-commit
22
- rev: 0.8.13
22
+ rev: 0.8.14
23
23
  hooks:
24
24
  - id: uv-lock
25
25
  files: ^pyproject\.toml$
@@ -46,7 +46,7 @@ repos:
46
46
  additional_dependencies: ["tomli"]
47
47
  # Code formatting and quality
48
48
  - repo: https://github.com/astral-sh/ruff-pre-commit
49
- rev: v0.12.10
49
+ rev: v0.12.11
50
50
  hooks:
51
51
  - id: ruff-check
52
52
  exclude: ^\.venv/
@@ -25,6 +25,106 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
25
25
 
26
26
  - fix: resolve bug in parser
27
27
 
28
+ ## [Unreleased] - 2025-09-01
29
+
30
+ ### Added
31
+
32
+ - feat: add new feature
33
+
34
+ ### Fixed
35
+
36
+ - fix: resolve bug in parser
37
+
38
+ ## [Unreleased] - 2025-09-01
39
+
40
+ ### Added
41
+
42
+ - feat: add new feature
43
+
44
+ ### Fixed
45
+
46
+ - fix: resolve bug in parser
47
+
48
+ ## [Unreleased] - 2025-09-01
49
+
50
+ ### Added
51
+
52
+ - feat: add new feature
53
+
54
+ ### Fixed
55
+
56
+ - fix: resolve bug in parser
57
+
58
+ ## [Unreleased] - 2025-09-01
59
+
60
+ ### Added
61
+
62
+ - feat: add new feature
63
+
64
+ ### Fixed
65
+
66
+ - fix: resolve bug in parser
67
+
68
+ ## [Unreleased] - 2025-09-01
69
+
70
+ ### Added
71
+
72
+ - feat: add new feature
73
+
74
+ ### Fixed
75
+
76
+ - fix: resolve bug in parser
77
+
78
+ ## [Unreleased] - 2025-09-01
79
+
80
+ ### Added
81
+
82
+ - feat: add new feature
83
+
84
+ ### Fixed
85
+
86
+ - fix: resolve bug in parser
87
+
88
+ ## [Unreleased] - 2025-09-01
89
+
90
+ ### Added
91
+
92
+ - feat: add new feature
93
+
94
+ ### Fixed
95
+
96
+ - fix: resolve bug in parser
97
+
98
+ ## [Unreleased] - 2025-09-01
99
+
100
+ ### Added
101
+
102
+ - feat: add new feature
103
+
104
+ ### Fixed
105
+
106
+ - fix: resolve bug in parser
107
+
108
+ ## [Unreleased] - 2025-09-01
109
+
110
+ ### Added
111
+
112
+ - feat: add new feature
113
+
114
+ ### Fixed
115
+
116
+ - fix: resolve bug in parser
117
+
118
+ ## [Unreleased] - 2025-09-01
119
+
120
+ ### Added
121
+
122
+ - feat: add new feature
123
+
124
+ ### Fixed
125
+
126
+ - fix: resolve bug in parser
127
+
28
128
  ## [Unreleased] - 2025-08-31
29
129
 
30
130
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crackerjack
3
- Version: 0.31.4
3
+ Version: 0.31.8
4
4
  Summary: Opinionated Python project management tool
5
5
  Project-URL: documentation, https://github.com/lesleslie/crackerjack
6
6
  Project-URL: homepage, https://github.com/lesleslie/crackerjack
@@ -19,7 +19,7 @@ repos:
19
19
  name: check-added-large-files
20
20
  exclude: ^\.venv/
21
21
  - repo: https://github.com/astral-sh/uv-pre-commit
22
- rev: 0.8.13
22
+ rev: 0.8.14
23
23
  hooks:
24
24
  - id: uv-lock
25
25
  files: ^pyproject\.toml$
@@ -46,7 +46,7 @@ repos:
46
46
  additional_dependencies: ["tomli"]
47
47
  # Code formatting and quality
48
48
  - repo: https://github.com/astral-sh/ruff-pre-commit
49
- rev: v0.12.10
49
+ rev: v0.12.11
50
50
  hooks:
51
51
  - id: ruff-check
52
52
  exclude: ^\.venv/
@@ -171,6 +171,7 @@ def main(
171
171
  coverage_status: bool = CLI_OPTIONS["coverage_status"],
172
172
  coverage_goal: float | None = CLI_OPTIONS["coverage_goal"],
173
173
  no_coverage_ratchet: bool = CLI_OPTIONS["no_coverage_ratchet"],
174
+ boost_coverage: bool = CLI_OPTIONS["boost_coverage"],
174
175
  ) -> None:
175
176
  options = create_options(
176
177
  commit,
@@ -207,6 +208,7 @@ def main(
207
208
  coverage_status,
208
209
  coverage_goal,
209
210
  no_coverage_ratchet,
211
+ boost_coverage,
210
212
  )
211
213
 
212
214
  if ai_debug:
@@ -26,6 +26,7 @@ class IssueType(Enum):
26
26
  PERFORMANCE = "performance"
27
27
  DOCUMENTATION = "documentation"
28
28
  TEST_ORGANIZATION = "test_organization"
29
+ COVERAGE_IMPROVEMENT = "coverage_improvement"
29
30
 
30
31
 
31
32
  @dataclass
@@ -23,6 +23,7 @@ class TestCreationAgent(SubAgent):
23
23
  IssueType.TEST_FAILURE,
24
24
  IssueType.DEPENDENCY,
25
25
  IssueType.TEST_ORGANIZATION,
26
+ IssueType.COVERAGE_IMPROVEMENT,
26
27
  }
27
28
 
28
29
  async def can_handle(self, issue: Issue) -> float:
@@ -31,6 +32,10 @@ class TestCreationAgent(SubAgent):
31
32
 
32
33
  message_lower = issue.message.lower()
33
34
 
35
+ # Handle coverage improvement requests with perfect confidence
36
+ if issue.type == IssueType.COVERAGE_IMPROVEMENT:
37
+ return 1.0
38
+
34
39
  # Handle test organization issues with high confidence
35
40
  if issue.type == IssueType.TEST_ORGANIZATION:
36
41
  return self._check_test_organization_confidence(message_lower)
@@ -48,6 +48,7 @@ class Options(BaseModel):
48
48
  keep_releases: int = 10
49
49
  track_progress: bool = False
50
50
  orchestrated: bool = False
51
+ boost_coverage: bool = True
51
52
  coverage: bool = False
52
53
  orchestration_strategy: str = "adaptive"
53
54
  orchestration_progress: str = "granular"
@@ -324,6 +325,11 @@ CLI_OPTIONS = {
324
325
  "--no-coverage-ratchet",
325
326
  help="Disable coverage ratchet system temporarily (for experiments).",
326
327
  ),
328
+ "boost_coverage": typer.Option(
329
+ True,
330
+ "--boost-coverage/--no-boost-coverage",
331
+ help="Automatically improve test coverage after successful workflow execution (default: True).",
332
+ ),
327
333
  }
328
334
 
329
335
 
@@ -362,6 +368,7 @@ def create_options(
362
368
  coverage_status: bool,
363
369
  coverage_goal: float | None,
364
370
  no_coverage_ratchet: bool,
371
+ boost_coverage: bool,
365
372
  ) -> Options:
366
373
  return Options(
367
374
  commit=commit,
@@ -398,4 +405,5 @@ def create_options(
398
405
  coverage_status=coverage_status,
399
406
  coverage_goal=coverage_goal,
400
407
  no_coverage_ratchet=no_coverage_ratchet,
408
+ boost_coverage=boost_coverage,
401
409
  )
@@ -501,12 +501,36 @@ class PhaseCoordinator:
501
501
  self.console.print(
502
502
  f"[red]❌[/red] {hook_type.title()} hooks failed: {summary['failed']} failed, {summary['errors']} errors",
503
503
  )
504
+
505
+ # Collect detailed hook failure information for AI agent processing
506
+ detailed_error_msg = self._build_detailed_hook_error_message(results, summary)
507
+
504
508
  self.session.fail_task(
505
509
  f"{hook_type}_hooks",
506
- f"{summary['failed']} failed, {summary['errors']} errors",
510
+ detailed_error_msg,
507
511
  )
508
512
  return False
509
513
 
514
+ def _build_detailed_hook_error_message(
515
+ self, results: list[t.Any], summary: dict[str, t.Any]
516
+ ) -> str:
517
+ """Build detailed error message with specific hook failure information."""
518
+ error_parts = [f"{summary['failed']} failed, {summary['errors']} errors"]
519
+
520
+ # Extract specific hook failures
521
+ failed_hooks = []
522
+ for result in results:
523
+ if hasattr(result, "failed") and result.failed:
524
+ hook_name = getattr(result, "hook_id", "") or getattr(
525
+ result, "name", "unknown"
526
+ )
527
+ failed_hooks.append(hook_name.lower())
528
+
529
+ if failed_hooks:
530
+ error_parts.append(f"Failed hooks: {', '.join(failed_hooks)}")
531
+
532
+ return " | ".join(error_parts)
533
+
510
534
  def _should_retry_fast_hooks(self, results: list[t.Any]) -> bool:
511
535
  formatting_hooks = {
512
536
  "ruff-format",
@@ -259,7 +259,7 @@ class WorkflowPipeline:
259
259
 
260
260
  success = self.phases.run_comprehensive_hooks_only(options)
261
261
  if not success:
262
- self.session.fail_task("workflow", "Comprehensive hooks failed")
262
+ self.session.fail_task("comprehensive_hooks", "Comprehensive hooks failed")
263
263
  self._update_mcp_status("comprehensive", "failed")
264
264
  # In AI agent mode, continue to collect more failures
265
265
  # In non-AI mode, this will be handled by caller
@@ -345,7 +345,25 @@ class WorkflowPipeline:
345
345
  """Run AI agent fixing phase to analyze and fix collected failures."""
346
346
  self._update_mcp_status("ai_fixing", "running")
347
347
  self.logger.info("Starting AI agent fixing phase")
348
+ self._log_debug_phase_start()
348
349
 
350
+ try:
351
+ agent_coordinator = self._setup_agent_coordinator()
352
+ issues = await self._collect_issues_from_failures()
353
+
354
+ if not issues:
355
+ return self._handle_no_issues_found()
356
+
357
+ self.logger.info(f"AI agents will attempt to fix {len(issues)} issues")
358
+ fix_result = await agent_coordinator.handle_issues(issues)
359
+
360
+ return await self._process_fix_results(options, fix_result)
361
+
362
+ except Exception as e:
363
+ return self._handle_fixing_phase_error(e)
364
+
365
+ def _log_debug_phase_start(self) -> None:
366
+ """Log debug information for phase start."""
349
367
  if self._should_debug():
350
368
  self.debugger.log_workflow_phase(
351
369
  "ai_agent_fixing",
@@ -353,77 +371,150 @@ class WorkflowPipeline:
353
371
  details={"ai_agent": True},
354
372
  )
355
373
 
356
- try:
357
- # Create AI agent context
358
- agent_context = AgentContext(
359
- project_path=self.pkg_path,
360
- session_id=getattr(self.session, "session_id", None),
361
- )
374
+ def _setup_agent_coordinator(self) -> AgentCoordinator:
375
+ """Set up agent coordinator with proper context."""
376
+ from crackerjack.agents.coordinator import AgentCoordinator
362
377
 
363
- # Initialize agent coordinator
364
- agent_coordinator = AgentCoordinator(agent_context)
365
- agent_coordinator.initialize_agents()
378
+ agent_context = AgentContext(
379
+ project_path=self.pkg_path,
380
+ session_id=getattr(self.session, "session_id", None),
381
+ )
366
382
 
367
- # Collect issues from failures
368
- issues = await self._collect_issues_from_failures()
383
+ agent_coordinator = AgentCoordinator(agent_context)
384
+ agent_coordinator.initialize_agents()
385
+ return agent_coordinator
369
386
 
370
- if not issues:
371
- self.logger.info("No issues collected for AI agent fixing")
372
- self._update_mcp_status("ai_fixing", "completed")
373
- return True
387
+ def _handle_no_issues_found(self) -> bool:
388
+ """Handle case when no issues are collected."""
389
+ self.logger.info("No issues collected for AI agent fixing")
390
+ self._update_mcp_status("ai_fixing", "completed")
391
+ return True
374
392
 
375
- self.logger.info(f"AI agents will attempt to fix {len(issues)} issues")
393
+ async def _process_fix_results(
394
+ self, options: OptionsProtocol, fix_result: t.Any
395
+ ) -> bool:
396
+ """Process fix results and verify success."""
397
+ verification_success = await self._verify_fixes_applied(options, fix_result)
398
+ success = fix_result.success and verification_success
376
399
 
377
- # Let agents handle the issues
378
- fix_result = await agent_coordinator.handle_issues(issues)
400
+ if success:
401
+ self._handle_successful_fixes(fix_result)
402
+ else:
403
+ self._handle_failed_fixes(fix_result, verification_success)
379
404
 
380
- success = fix_result.success
381
- if success:
382
- self.logger.info("AI agents successfully fixed all issues")
383
- self._update_mcp_status("ai_fixing", "completed")
405
+ self._log_debug_phase_completion(success, fix_result)
406
+ return success
384
407
 
385
- # Log fix counts for debugging
386
- if self._should_debug():
387
- total_fixes = len(fix_result.fixes_applied)
388
- # Estimate test vs hook fixes based on original issue types
389
- test_fixes = len(
390
- [f for f in fix_result.fixes_applied if "test" in f.lower()],
391
- )
392
- hook_fixes = total_fixes - test_fixes
393
- self.debugger.log_test_fixes(test_fixes)
394
- self.debugger.log_hook_fixes(hook_fixes)
395
- else:
396
- self.logger.warning(
397
- f"AI agents could not fix all issues: {fix_result.remaining_issues}",
398
- )
399
- self._update_mcp_status("ai_fixing", "failed")
408
+ def _handle_successful_fixes(self, fix_result: t.Any) -> None:
409
+ """Handle successful fix results."""
410
+ self.logger.info(
411
+ "AI agents successfully fixed all issues and verification passed"
412
+ )
413
+ self._update_mcp_status("ai_fixing", "completed")
414
+ self._log_fix_counts_if_debugging(fix_result)
400
415
 
401
- if self._should_debug():
402
- self.debugger.log_workflow_phase(
403
- "ai_agent_fixing",
404
- "completed" if success else "failed",
405
- details={
406
- "confidence": fix_result.confidence,
407
- "fixes_applied": len(fix_result.fixes_applied),
408
- "remaining_issues": len(fix_result.remaining_issues),
409
- },
410
- )
416
+ def _handle_failed_fixes(
417
+ self, fix_result: t.Any, verification_success: bool
418
+ ) -> None:
419
+ """Handle failed fix results."""
420
+ if not verification_success:
421
+ self.logger.warning(
422
+ "AI agent fixes did not pass verification - issues still exist"
423
+ )
424
+ else:
425
+ self.logger.warning(
426
+ f"AI agents could not fix all issues: {fix_result.remaining_issues}",
427
+ )
428
+ self._update_mcp_status("ai_fixing", "failed")
411
429
 
412
- return success
430
+ def _log_fix_counts_if_debugging(self, fix_result: t.Any) -> None:
431
+ """Log fix counts for debugging if debug mode is enabled."""
432
+ if not self._should_debug():
433
+ return
413
434
 
414
- except Exception as e:
415
- self.logger.exception(f"AI agent fixing phase failed: {e}")
416
- self.session.fail_task("ai_fixing", f"AI agent fixing failed: {e}")
417
- self._update_mcp_status("ai_fixing", "failed")
435
+ total_fixes = len(fix_result.fixes_applied)
436
+ test_fixes = len(
437
+ [f for f in fix_result.fixes_applied if "test" in f.lower()],
438
+ )
439
+ hook_fixes = total_fixes - test_fixes
440
+ self.debugger.log_test_fixes(test_fixes)
441
+ self.debugger.log_hook_fixes(hook_fixes)
418
442
 
419
- if self._should_debug():
420
- self.debugger.log_workflow_phase(
421
- "ai_agent_fixing",
422
- "failed",
423
- details={"error": str(e)},
443
+ def _log_debug_phase_completion(self, success: bool, fix_result: t.Any) -> None:
444
+ """Log debug information for phase completion."""
445
+ if self._should_debug():
446
+ self.debugger.log_workflow_phase(
447
+ "ai_agent_fixing",
448
+ "completed" if success else "failed",
449
+ details={
450
+ "confidence": fix_result.confidence,
451
+ "fixes_applied": len(fix_result.fixes_applied),
452
+ "remaining_issues": len(fix_result.remaining_issues),
453
+ },
454
+ )
455
+
456
+ def _handle_fixing_phase_error(self, error: Exception) -> bool:
457
+ """Handle errors during the fixing phase."""
458
+ self.logger.exception(f"AI agent fixing phase failed: {error}")
459
+ self.session.fail_task("ai_fixing", f"AI agent fixing failed: {error}")
460
+ self._update_mcp_status("ai_fixing", "failed")
461
+
462
+ if self._should_debug():
463
+ self.debugger.log_workflow_phase(
464
+ "ai_agent_fixing",
465
+ "failed",
466
+ details={"error": str(error)},
467
+ )
468
+
469
+ return False
470
+
471
+ async def _verify_fixes_applied(
472
+ self, options: OptionsProtocol, fix_result: t.Any
473
+ ) -> bool:
474
+ """Verify that AI agent fixes actually resolved the issues by re-running checks."""
475
+ if not fix_result.fixes_applied:
476
+ return True # No fixes were applied, nothing to verify
477
+
478
+ self.logger.info("Verifying AI agent fixes by re-running quality checks")
479
+
480
+ # Re-run the phases that previously failed to verify fixes
481
+ verification_success = True
482
+
483
+ # Check if we need to re-run tests
484
+ if any("test" in fix.lower() for fix in fix_result.fixes_applied):
485
+ self.logger.info("Re-running tests to verify test fixes")
486
+ test_success = self.phases.run_testing_phase(options)
487
+ if not test_success:
488
+ self.logger.warning(
489
+ "Test verification failed - test fixes did not work"
490
+ )
491
+ verification_success = False
492
+
493
+ # Check if we need to re-run comprehensive hooks
494
+ hook_fixes = [
495
+ f
496
+ for f in fix_result.fixes_applied
497
+ if "hook" not in f.lower()
498
+ or "complexity" in f.lower()
499
+ or "type" in f.lower()
500
+ ]
501
+ if hook_fixes:
502
+ self.logger.info("Re-running comprehensive hooks to verify hook fixes")
503
+ hook_success = self.phases.run_comprehensive_hooks_only(options)
504
+ if not hook_success:
505
+ self.logger.warning(
506
+ "Hook verification failed - hook fixes did not work"
424
507
  )
508
+ verification_success = False
425
509
 
426
- return False
510
+ if verification_success:
511
+ self.logger.info("All AI agent fixes verified successfully")
512
+ else:
513
+ self.logger.error(
514
+ "Verification failed - some fixes did not resolve the issues"
515
+ )
516
+
517
+ return verification_success
427
518
 
428
519
  async def _collect_issues_from_failures(self) -> list[Issue]:
429
520
  """Collect issues from test and comprehensive hook failures."""
@@ -469,29 +560,124 @@ class WorkflowPipeline:
469
560
  issues: list[Issue] = []
470
561
  hook_count = 0
471
562
 
472
- if self.session.session_tracker:
473
- for task_id, task_data in self.session.session_tracker.tasks.items():
474
- if task_data.status == "failed" and task_id in (
475
- "fast_hooks",
476
- "comprehensive_hooks",
477
- ):
478
- hook_count += 1
479
- issue_type = (
480
- IssueType.FORMATTING
481
- if "fast" in task_id
482
- else IssueType.TYPE_ERROR
563
+ if not self.session.session_tracker:
564
+ return issues, hook_count
565
+
566
+ for task_id, task_data in self.session.session_tracker.tasks.items():
567
+ if self._is_failed_hook_task(task_data, task_id):
568
+ hook_count += 1
569
+ hook_issues = self._process_hook_failure(task_id, task_data)
570
+ issues.extend(hook_issues)
571
+
572
+ return issues, hook_count
573
+
574
+ def _is_failed_hook_task(self, task_data: t.Any, task_id: str) -> bool:
575
+ """Check if a task is a failed hook task."""
576
+ return task_data.status == "failed" and task_id in (
577
+ "fast_hooks",
578
+ "comprehensive_hooks",
579
+ )
580
+
581
+ def _process_hook_failure(self, task_id: str, task_data: t.Any) -> list[Issue]:
582
+ """Process a single hook failure and return corresponding issues."""
583
+ error_msg = getattr(task_data, "error_message", "Unknown error")
584
+ specific_issues = self._parse_hook_error_details(task_id, error_msg)
585
+
586
+ if specific_issues:
587
+ return specific_issues
588
+
589
+ return [self._create_generic_hook_issue(task_id, error_msg)]
590
+
591
+ def _create_generic_hook_issue(self, task_id: str, error_msg: str) -> Issue:
592
+ """Create a generic issue for unspecific hook failures."""
593
+ issue_type = IssueType.FORMATTING if "fast" in task_id else IssueType.TYPE_ERROR
594
+ return Issue(
595
+ id=f"hook_failure_{task_id}",
596
+ type=issue_type,
597
+ severity=Priority.MEDIUM,
598
+ message=error_msg,
599
+ stage=task_id.replace("_hooks", ""),
600
+ )
601
+
602
+ def _parse_hook_error_details(self, task_id: str, error_msg: str) -> list[Issue]:
603
+ """Parse specific hook failure details to create targeted issues."""
604
+ issues: list[Issue] = []
605
+
606
+ # For comprehensive hooks, parse specific tool failures
607
+ if task_id == "comprehensive_hooks":
608
+ # Check for complexipy failures (complexity violations)
609
+ if "complexipy" in error_msg.lower():
610
+ issues.append(
611
+ Issue(
612
+ id="complexipy_violation",
613
+ type=IssueType.COMPLEXITY,
614
+ severity=Priority.HIGH,
615
+ message="Code complexity violation detected by complexipy",
616
+ stage="comprehensive",
617
+ )
618
+ )
619
+
620
+ # Check for pyright failures (type errors)
621
+ if "pyright" in error_msg.lower():
622
+ issues.append(
623
+ Issue(
624
+ id="pyright_type_error",
625
+ type=IssueType.TYPE_ERROR,
626
+ severity=Priority.HIGH,
627
+ message="Type checking errors detected by pyright",
628
+ stage="comprehensive",
629
+ )
630
+ )
631
+
632
+ # Check for bandit failures (security issues)
633
+ if "bandit" in error_msg.lower():
634
+ issues.append(
635
+ Issue(
636
+ id="bandit_security_issue",
637
+ type=IssueType.SECURITY,
638
+ severity=Priority.HIGH,
639
+ message="Security vulnerabilities detected by bandit",
640
+ stage="comprehensive",
483
641
  )
484
- error_msg = getattr(task_data, "error_message", "Unknown error")
485
- issue = Issue(
486
- id=f"hook_failure_{task_id}",
487
- type=issue_type,
642
+ )
643
+
644
+ # Check for refurb failures (code quality issues)
645
+ if "refurb" in error_msg.lower():
646
+ issues.append(
647
+ Issue(
648
+ id="refurb_quality_issue",
649
+ type=IssueType.PERFORMANCE, # Use PERFORMANCE as closest match for refurb issues
488
650
  severity=Priority.MEDIUM,
489
- message=error_msg,
490
- stage=task_id.replace("_hooks", ""),
651
+ message="Code quality issues detected by refurb",
652
+ stage="comprehensive",
491
653
  )
492
- issues.append(issue)
654
+ )
493
655
 
494
- return issues, hook_count
656
+ # Check for vulture failures (dead code)
657
+ if "vulture" in error_msg.lower():
658
+ issues.append(
659
+ Issue(
660
+ id="vulture_dead_code",
661
+ type=IssueType.DEAD_CODE,
662
+ severity=Priority.MEDIUM,
663
+ message="Dead code detected by vulture",
664
+ stage="comprehensive",
665
+ )
666
+ )
667
+
668
+ elif task_id == "fast_hooks":
669
+ # Fast hooks are typically formatting issues
670
+ issues.append(
671
+ Issue(
672
+ id="fast_hooks_formatting",
673
+ type=IssueType.FORMATTING,
674
+ severity=Priority.LOW,
675
+ message="Code formatting issues detected",
676
+ stage="fast",
677
+ )
678
+ )
679
+
680
+ return issues
495
681
 
496
682
  def _log_failure_counts_if_debugging(
497
683
  self, test_count: int, hook_count: int