crackerjack 0.31.4__tar.gz → 0.31.7__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.
- {crackerjack-0.31.4/crackerjack → crackerjack-0.31.7}/.pre-commit-config.yaml +2 -2
- {crackerjack-0.31.4 → crackerjack-0.31.7}/CHANGELOG.md +100 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/PKG-INFO +1 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7/crackerjack}/.pre-commit-config.yaml +2 -2
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/__main__.py +2 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/base.py +1 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/test_creation_agent.py +5 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/cli/options.py +8 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/phase_coordinator.py +25 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/workflow_orchestrator.py +264 -78
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/dynamic_config.py +3 -3
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/publish_manager.py +22 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/test_executor.py +13 -5
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/test_progress.py +31 -61
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/context.py +6 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/execution_tools.py +4 -2
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/progress_tools.py +95 -19
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/workflow_executor.py +224 -19
- crackerjack-0.31.7/crackerjack/orchestration/coverage_improvement.py +223 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/pyproject.toml +1 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/config.py +12 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/coverage_ratchet.py +9 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/filesystem.py +26 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/git.py +12 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/initialization.py +38 -12
- {crackerjack-0.31.4 → crackerjack-0.31.7/crackerjack}/uv.lock +2 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7}/pyproject.toml +1 -1
- {crackerjack-0.31.4/crackerjack → crackerjack-0.31.7}/uv.lock +13 -1
- {crackerjack-0.31.4 → crackerjack-0.31.7}/.github/FUNDING.yml +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/.gitignore +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/.mcp.json.bak +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/AGENTS.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/AI-AGENT-RULES.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/CLAUDE.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/LICENSE +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/README-AI-AGENT.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/README.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/RULES.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/UVXUSAGE.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/.gitignore +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/.mcp.json.bak +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/CLAUDE.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/RULES.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/architect_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/coordinator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/documentation_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/dry_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/formatting_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/import_optimization_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/performance_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/proactive_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/refactoring_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/security_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/test_specialist_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/agents/tracker.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/api.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/cli/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/cli/facade.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/cli/handlers.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/cli/interactive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/cli/utils.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/code_cleaner.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/config/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/config/hooks.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/async_workflow_orchestrator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/autofix_coordinator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/container.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/enhanced_container.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/performance.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/proactive_workflow.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/core/session_coordinator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/errors.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/executors/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/executors/async_hook_executor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/executors/cached_hook_executor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/executors/hook_executor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/executors/individual_hook_executor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/intelligence/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/intelligence/adaptive_learning.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/intelligence/agent_orchestrator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/intelligence/agent_registry.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/intelligence/agent_selector.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/intelligence/integration.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/interactive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/async_hook_manager.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/hook_manager.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/test_command_builder.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/test_manager.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/managers/test_manager_backup.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/cache.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/client_runner.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/dashboard.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/enhanced_progress_monitor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/enhanced_progress_monitor.tcss +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/file_monitor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/progress_components.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/progress_monitor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/progress_monitor.tcss +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/rate_limiter.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/server.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/server_core.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/service_watchdog.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/state.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/task_manager.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/core_tools.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/error_analyzer.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/execution_tools_backup.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/intelligence_tool_registry.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/intelligence_tools.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/monitoring_tools.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/monitoring_tools.py.backup +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/proactive_tools.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/tools/utility_tools.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket/app.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket/endpoints.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket/jobs.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket/server.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket/websocket_handler.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/mcp/websocket_server.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/models/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/models/config.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/models/config_adapter.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/models/protocols.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/models/task.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/monitoring/ai_agent_watchdog.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/monitoring/regression_prevention.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/orchestration/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/orchestration/advanced_orchestrator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/orchestration/execution_strategies.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/orchestration/test_progress_streamer.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/plugins/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/plugins/base.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/plugins/hooks.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/plugins/loader.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/plugins/managers.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/py313.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/cache.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/config_integrity.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/contextual_ai_assistant.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/debug.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/dependency_monitor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/enhanced_filesystem.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/file_hasher.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/health_metrics.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/log_manager.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/logging.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/metrics.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/pattern_cache.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/pattern_detector.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/performance_benchmarks.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/security.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/server_manager.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/smart_scheduling.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/tool_version_service.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/unified_config.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/services/version_checker.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/slash_commands/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/slash_commands/init.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/slash_commands/run.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/crackerjack/slash_commands/status.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/AI_AGENT_DEBUGGING.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/API_REFERENCE.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/ARCHITECTURE.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/FUTURE-ENHANCEMENTS.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/SUB_AGENT_MONITORING_DESIGN.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/VERIFICATION_WORKFLOW.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/docs/WORKFLOW_KNOWLEDGE_BASE.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/example.mcp.json +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/excalidraw.log +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/fix_terminal.sh +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/requirements.txt +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/.coverage +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/HEALTH_METRICS_TESTING_SUMMARY.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/TESTING.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/TEST_COVERAGE_PLAN.md +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/conftest.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/coverage.json +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/data/comments_sample.txt +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/data/docstrings_sample.txt +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/data/expected_comments_sample.txt +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/data/init.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/scripts/__init__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/scripts/agent_audit_report.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/scripts/run_test_suite.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test___main__.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_advanced_orchestrator_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_ai_agent_comprehensive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_ai_agent_workflow.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_async_hook_executor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_cli_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_code_cleaner.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_contextual_ai_assistant_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_additional_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_autofix_coordinator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_comprehensive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_enhanced_container.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_modules.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_performance.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_strategic_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_core_workflow_orchestration_deep_quality.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_dependency_monitor_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_documentation_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_documentation_agent_simple.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_dynamic_config.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_dynamic_config_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_enhanced_filesystem.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_enhanced_filesystem_comprehensive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_enhanced_filesystem_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_enhanced_filesystem_integration.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_enhanced_filesystem_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_filesystem_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_health_metrics_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_hook_manager_simple.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_import_coverage_consolidated.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_import_optimization_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_intelligence_system.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_large_modules_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_main_entry_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_main_module.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_managers_consolidated.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_managers_strategic_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_additional_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_core_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_progress_monitor.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_progress_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_server.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_mcp_websocket_lifecycle_deep_quality.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_models_comprehensive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_models_config_adapter_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_models_focused.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_models_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_models_task_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_modernized_code.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_orchestration_advanced_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_orchestration_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_performance_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_performance_agent_simple.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_performance_benchmarks_focused.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_performance_benchmarks_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_phase_coordinator_simple.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_plugins_base_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_plugins_comprehensive.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_plugins_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_plugins_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_plugins_system_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_proactive_agent_system.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_protocol_compliance.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_publish_manager_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_py313_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_pytest_features.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_refactoring_agent.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_server_manager_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_services_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_services_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_session_coordinator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_session_coordinator_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_simple_tool_version_service.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_structured_errors.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_structured_logging.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_terminal_restoration.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_terminal_state.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_advanced.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_business_logic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_deep_coverage.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_functional.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_simple_working.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_tool_version_service_strategic.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_unified_api.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_unified_config.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_workflow_integration.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/tests/test_workflow_orchestrator.py +0 -0
- {crackerjack-0.31.4 → crackerjack-0.31.7}/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.
|
|
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.
|
|
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.
|
|
3
|
+
Version: 0.31.7
|
|
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.
|
|
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.
|
|
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:
|
|
@@ -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
|
-
|
|
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("
|
|
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
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
378
|
+
agent_context = AgentContext(
|
|
379
|
+
project_path=self.pkg_path,
|
|
380
|
+
session_id=getattr(self.session, "session_id", None),
|
|
381
|
+
)
|
|
366
382
|
|
|
367
|
-
|
|
368
|
-
|
|
383
|
+
agent_coordinator = AgentCoordinator(agent_context)
|
|
384
|
+
agent_coordinator.initialize_agents()
|
|
385
|
+
return agent_coordinator
|
|
369
386
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
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
|
-
|
|
378
|
-
|
|
400
|
+
if success:
|
|
401
|
+
self._handle_successful_fixes(fix_result)
|
|
402
|
+
else:
|
|
403
|
+
self._handle_failed_fixes(fix_result, verification_success)
|
|
379
404
|
|
|
380
|
-
|
|
381
|
-
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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
|
-
|
|
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
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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=
|
|
490
|
-
stage=
|
|
651
|
+
message="Code quality issues detected by refurb",
|
|
652
|
+
stage="comprehensive",
|
|
491
653
|
)
|
|
492
|
-
|
|
654
|
+
)
|
|
493
655
|
|
|
494
|
-
|
|
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
|