crackerjack 0.18.2__py3-none-any.whl โ 0.45.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +96 -2
- crackerjack/__main__.py +637 -138
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +39 -0
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/lsp/_base.py +194 -0
- crackerjack/adapters/lsp/_client.py +358 -0
- crackerjack/adapters/lsp/_manager.py +193 -0
- crackerjack/adapters/lsp/skylos.py +283 -0
- crackerjack/adapters/lsp/zuban.py +557 -0
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +66 -0
- crackerjack/agents/architect_agent.py +238 -0
- crackerjack/agents/base.py +167 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +600 -0
- crackerjack/agents/documentation_agent.py +520 -0
- crackerjack/agents/dry_agent.py +585 -0
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +230 -0
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/import_optimization_agent.py +1181 -0
- crackerjack/agents/performance_agent.py +325 -0
- crackerjack/agents/performance_helpers.py +205 -0
- crackerjack/agents/proactive_agent.py +55 -0
- crackerjack/agents/refactoring_agent.py +511 -0
- crackerjack/agents/refactoring_helpers.py +247 -0
- crackerjack/agents/security_agent.py +793 -0
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +570 -0
- crackerjack/agents/test_specialist_agent.py +526 -0
- crackerjack/agents/tracker.py +110 -0
- crackerjack/api.py +647 -0
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +24 -0
- crackerjack/cli/cache_handlers.py +209 -0
- crackerjack/cli/cache_handlers_enhanced.py +680 -0
- crackerjack/cli/facade.py +162 -0
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +700 -0
- crackerjack/cli/interactive.py +488 -0
- crackerjack/cli/options.py +1216 -0
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/utils.py +19 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +1307 -0
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +275 -0
- crackerjack/config/global_lock_config.py +207 -0
- crackerjack/config/hooks.py +390 -0
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/__init__.py +0 -0
- crackerjack/core/async_workflow_orchestrator.py +738 -0
- crackerjack/core/autofix_coordinator.py +282 -0
- crackerjack/core/container.py +105 -0
- crackerjack/core/enhanced_container.py +583 -0
- crackerjack/core/file_lifecycle.py +472 -0
- crackerjack/core/performance.py +244 -0
- crackerjack/core/performance_monitor.py +357 -0
- crackerjack/core/phase_coordinator.py +1227 -0
- crackerjack/core/proactive_workflow.py +267 -0
- crackerjack/core/resource_manager.py +425 -0
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +601 -0
- crackerjack/core/session_coordinator.py +239 -0
- crackerjack/core/timeout_manager.py +563 -0
- crackerjack/core/websocket_lifecycle.py +410 -0
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +2243 -0
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/INDEX.md +11 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
- crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
- crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
- crackerjack/docs/generated/api/SERVICES.md +1252 -0
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/__init__.py +31 -0
- crackerjack/documentation/ai_templates.py +756 -0
- crackerjack/documentation/dual_output_generator.py +767 -0
- crackerjack/documentation/mkdocs_integration.py +518 -0
- crackerjack/documentation/reference_generator.py +1065 -0
- crackerjack/dynamic_config.py +678 -0
- crackerjack/errors.py +378 -0
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +13 -0
- crackerjack/executors/async_hook_executor.py +938 -0
- crackerjack/executors/cached_hook_executor.py +316 -0
- crackerjack/executors/hook_executor.py +1295 -0
- crackerjack/executors/hook_lock_manager.py +708 -0
- crackerjack/executors/individual_hook_executor.py +739 -0
- crackerjack/executors/lsp_aware_hook_executor.py +349 -0
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +433 -0
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +93 -0
- crackerjack/intelligence/README.md +557 -0
- crackerjack/intelligence/__init__.py +37 -0
- crackerjack/intelligence/adaptive_learning.py +693 -0
- crackerjack/intelligence/agent_orchestrator.py +485 -0
- crackerjack/intelligence/agent_registry.py +377 -0
- crackerjack/intelligence/agent_selector.py +439 -0
- crackerjack/intelligence/integration.py +250 -0
- crackerjack/interactive.py +719 -0
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/__init__.py +11 -0
- crackerjack/managers/async_hook_manager.py +135 -0
- crackerjack/managers/hook_manager.py +585 -0
- crackerjack/managers/publish_manager.py +631 -0
- crackerjack/managers/test_command_builder.py +391 -0
- crackerjack/managers/test_executor.py +474 -0
- crackerjack/managers/test_manager.py +1357 -0
- crackerjack/managers/test_progress.py +187 -0
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/__init__.py +0 -0
- crackerjack/mcp/cache.py +352 -0
- crackerjack/mcp/client_runner.py +121 -0
- crackerjack/mcp/context.py +802 -0
- crackerjack/mcp/dashboard.py +657 -0
- crackerjack/mcp/enhanced_progress_monitor.py +493 -0
- crackerjack/mcp/file_monitor.py +394 -0
- crackerjack/mcp/progress_components.py +607 -0
- crackerjack/mcp/progress_monitor.py +1016 -0
- crackerjack/mcp/rate_limiter.py +336 -0
- crackerjack/mcp/server.py +24 -0
- crackerjack/mcp/server_core.py +526 -0
- crackerjack/mcp/service_watchdog.py +505 -0
- crackerjack/mcp/state.py +407 -0
- crackerjack/mcp/task_manager.py +259 -0
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +19 -0
- crackerjack/mcp/tools/core_tools.py +469 -0
- crackerjack/mcp/tools/error_analyzer.py +283 -0
- crackerjack/mcp/tools/execution_tools.py +384 -0
- crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
- crackerjack/mcp/tools/intelligence_tools.py +264 -0
- crackerjack/mcp/tools/monitoring_tools.py +628 -0
- crackerjack/mcp/tools/proactive_tools.py +367 -0
- crackerjack/mcp/tools/progress_tools.py +222 -0
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +358 -0
- crackerjack/mcp/tools/workflow_executor.py +699 -0
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/__init__.py +14 -0
- crackerjack/mcp/websocket/app.py +54 -0
- crackerjack/mcp/websocket/endpoints.py +492 -0
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +406 -0
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
- crackerjack/mcp/websocket/server.py +174 -0
- crackerjack/mcp/websocket/websocket_handler.py +276 -0
- crackerjack/mcp/websocket_server.py +10 -0
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +40 -0
- crackerjack/models/config.py +730 -0
- crackerjack/models/config_adapter.py +265 -0
- crackerjack/models/protocols.py +1535 -0
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/resource_protocols.py +299 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +173 -0
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/__init__.py +0 -0
- crackerjack/monitoring/ai_agent_watchdog.py +405 -0
- crackerjack/monitoring/metrics_collector.py +427 -0
- crackerjack/monitoring/regression_prevention.py +580 -0
- crackerjack/monitoring/websocket_server.py +406 -0
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +894 -0
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +180 -0
- crackerjack/orchestration/execution_strategies.py +361 -0
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +647 -0
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/__init__.py +15 -0
- crackerjack/plugins/base.py +200 -0
- crackerjack/plugins/hooks.py +254 -0
- crackerjack/plugins/loader.py +335 -0
- crackerjack/plugins/managers.py +264 -0
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/security/__init__.py +0 -0
- crackerjack/security/audit.py +197 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +9 -0
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/ai/contextual_ai_assistant.py +542 -0
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/anomaly_detector.py +392 -0
- crackerjack/services/api_extractor.py +617 -0
- crackerjack/services/backup_service.py +467 -0
- crackerjack/services/bounded_status_operations.py +530 -0
- crackerjack/services/cache.py +369 -0
- crackerjack/services/changelog_automation.py +399 -0
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +132 -0
- crackerjack/services/config_merge.py +546 -0
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +493 -0
- crackerjack/services/coverage_badge_service.py +173 -0
- crackerjack/services/coverage_ratchet.py +381 -0
- crackerjack/services/debug.py +733 -0
- crackerjack/services/dependency_analyzer.py +460 -0
- crackerjack/services/dependency_monitor.py +622 -0
- crackerjack/services/documentation_generator.py +493 -0
- crackerjack/services/documentation_service.py +704 -0
- crackerjack/services/enhanced_filesystem.py +497 -0
- crackerjack/services/enterprise_optimizer.py +865 -0
- crackerjack/services/error_pattern_analyzer.py +676 -0
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +149 -0
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +381 -0
- crackerjack/services/git.py +422 -0
- crackerjack/services/health_metrics.py +615 -0
- crackerjack/services/heatmap_generator.py +744 -0
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +823 -0
- crackerjack/services/input_validator.py +668 -0
- crackerjack/services/intelligent_commit.py +327 -0
- crackerjack/services/log_manager.py +289 -0
- crackerjack/services/logging.py +228 -0
- crackerjack/services/lsp_client.py +628 -0
- crackerjack/services/memory_optimizer.py +414 -0
- crackerjack/services/metrics.py +587 -0
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/monitoring/performance_benchmarks.py +410 -0
- crackerjack/services/monitoring/performance_cache.py +388 -0
- crackerjack/services/monitoring/performance_monitor.py +569 -0
- crackerjack/services/parallel_executor.py +527 -0
- crackerjack/services/pattern_cache.py +333 -0
- crackerjack/services/pattern_detector.py +478 -0
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +523 -0
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/quality/quality_baseline.py +395 -0
- crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
- crackerjack/services/quality/quality_intelligence.py +949 -0
- crackerjack/services/regex_patterns.py +58 -0
- crackerjack/services/regex_utils.py +483 -0
- crackerjack/services/secure_path_utils.py +524 -0
- crackerjack/services/secure_status_formatter.py +450 -0
- crackerjack/services/secure_subprocess.py +635 -0
- crackerjack/services/security.py +239 -0
- crackerjack/services/security_logger.py +495 -0
- crackerjack/services/server_manager.py +411 -0
- crackerjack/services/smart_scheduling.py +167 -0
- crackerjack/services/status_authentication.py +460 -0
- crackerjack/services/status_security_manager.py +315 -0
- crackerjack/services/terminal_utils.py +0 -0
- crackerjack/services/thread_safe_status_collector.py +441 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +43 -0
- crackerjack/services/unified_config.py +115 -0
- crackerjack/services/validation_rate_limiter.py +220 -0
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +461 -0
- crackerjack/services/version_checker.py +223 -0
- crackerjack/services/websocket_resource_limiter.py +438 -0
- crackerjack/services/zuban_lsp_service.py +391 -0
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/__init__.py +59 -0
- crackerjack/slash_commands/init.md +112 -0
- crackerjack/slash_commands/run.md +197 -0
- crackerjack/slash_commands/status.md +127 -0
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_input_validator_patterns.py +236 -0
- crackerjack/tools/validate_regex_patterns.py +188 -0
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/__init__.py +1 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- crackerjack-0.45.2.dist-info/METADATA +1678 -0
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.18.2.dist-info โ crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
- crackerjack/.gitignore +0 -14
- crackerjack/.libcst.codemod.yaml +0 -18
- crackerjack/.pdm.toml +0 -1
- crackerjack/.pre-commit-config.yaml +0 -91
- crackerjack/.pytest_cache/.gitignore +0 -2
- crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
- crackerjack/.pytest_cache/README.md +0 -8
- crackerjack/.pytest_cache/v/cache/nodeids +0 -1
- crackerjack/.pytest_cache/v/cache/stepwise +0 -1
- crackerjack/.ruff_cache/.gitignore +0 -1
- crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
- crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
- crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
- crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
- crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
- crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
- crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
- crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
- crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
- crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
- crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
- crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
- crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
- crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
- crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
- crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
- crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
- crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
- crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
- crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
- crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
- crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
- crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
- crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
- crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
- crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
- crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
- crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
- crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
- crackerjack/crackerjack.py +0 -855
- crackerjack/pyproject.toml +0 -214
- crackerjack-0.18.2.dist-info/METADATA +0 -420
- crackerjack-0.18.2.dist-info/RECORD +0 -59
- crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
- {crackerjack-0.18.2.dist-info โ crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,863 @@
|
|
|
1
|
+
"""AI agent coordination and fix verification for workflows.
|
|
2
|
+
|
|
3
|
+
Coordinates AI agent fixing workflow, manages fix execution, and verifies
|
|
4
|
+
that fixes resolve issues. Extracted from WorkflowOrchestrator to improve
|
|
5
|
+
modularity and testability.
|
|
6
|
+
|
|
7
|
+
This module handles:
|
|
8
|
+
- AI agent workflow lifecycle management
|
|
9
|
+
- AI fixing phase execution
|
|
10
|
+
- Fix result processing and verification
|
|
11
|
+
- Integration with EnhancedAgentCoordinator
|
|
12
|
+
- Re-verification of fixes (tests and hooks)
|
|
13
|
+
- Code cleaning preparation for AI fixing
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import typing as t
|
|
19
|
+
from contextlib import suppress
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
from acb.console import Console
|
|
23
|
+
from acb.depends import Inject, depends
|
|
24
|
+
|
|
25
|
+
from crackerjack.agents.base import AgentContext, Issue
|
|
26
|
+
from crackerjack.agents.enhanced_coordinator import EnhancedAgentCoordinator
|
|
27
|
+
from crackerjack.models.protocols import (
|
|
28
|
+
DebugServiceProtocol,
|
|
29
|
+
LoggerProtocol,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
if t.TYPE_CHECKING:
|
|
33
|
+
from crackerjack.core.phase_coordinator import PhaseCoordinator
|
|
34
|
+
from crackerjack.core.session_coordinator import SessionCoordinator
|
|
35
|
+
from crackerjack.models.protocols import OptionsProtocol
|
|
36
|
+
|
|
37
|
+
from .workflow_issue_parser import WorkflowIssueParser
|
|
38
|
+
from .workflow_security_gates import WorkflowSecurityGates
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class WorkflowAICoordinator:
|
|
42
|
+
"""Coordinates AI agent fixing and verifies fixes.
|
|
43
|
+
|
|
44
|
+
This coordinator manages the AI agent workflow lifecycle:
|
|
45
|
+
1. Determines if AI fixing is needed
|
|
46
|
+
2. Prepares environment (code cleaning if needed)
|
|
47
|
+
3. Collects issues from failures via WorkflowIssueParser
|
|
48
|
+
4. Creates and configures EnhancedAgentCoordinator
|
|
49
|
+
5. Executes AI fixes
|
|
50
|
+
6. Verifies fixes by re-running quality checks
|
|
51
|
+
7. Reports results and updates workflow state
|
|
52
|
+
|
|
53
|
+
Uses protocol-based dependency injection following ACB patterns.
|
|
54
|
+
Delegates issue parsing to WorkflowIssueParser and security
|
|
55
|
+
validation to WorkflowSecurityGates.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
@depends.inject
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
console: Inject[Console],
|
|
62
|
+
logger: Inject[LoggerProtocol],
|
|
63
|
+
debugger: Inject[DebugServiceProtocol],
|
|
64
|
+
session: SessionCoordinator,
|
|
65
|
+
phases: PhaseCoordinator,
|
|
66
|
+
pkg_path: Path,
|
|
67
|
+
issue_parser: WorkflowIssueParser,
|
|
68
|
+
security_gates: WorkflowSecurityGates,
|
|
69
|
+
mcp_state_manager: t.Any | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
"""Initialize AI coordinator with injected dependencies.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
console: Console for output
|
|
75
|
+
logger: Logger for diagnostic messages
|
|
76
|
+
debugger: Debug service for detailed diagnostics
|
|
77
|
+
session: Session coordinator for workflow state
|
|
78
|
+
phases: Phase coordinator for running quality checks
|
|
79
|
+
pkg_path: Project root path
|
|
80
|
+
issue_parser: Parser for collecting and classifying issues
|
|
81
|
+
security_gates: Security gate validator
|
|
82
|
+
mcp_state_manager: Optional MCP state manager
|
|
83
|
+
"""
|
|
84
|
+
self.console = console
|
|
85
|
+
self.logger = logger
|
|
86
|
+
self.debugger = debugger
|
|
87
|
+
self.session = session
|
|
88
|
+
self.phases = phases
|
|
89
|
+
self.pkg_path = pkg_path
|
|
90
|
+
self.issue_parser = issue_parser
|
|
91
|
+
self.security_gates = security_gates
|
|
92
|
+
self._mcp_state_manager = mcp_state_manager
|
|
93
|
+
|
|
94
|
+
# State tracking
|
|
95
|
+
self._code_cleaning_complete = False
|
|
96
|
+
|
|
97
|
+
# ===================================================================
|
|
98
|
+
# Main AI Workflow Coordination
|
|
99
|
+
# ===================================================================
|
|
100
|
+
|
|
101
|
+
async def handle_ai_workflow_completion(
|
|
102
|
+
self,
|
|
103
|
+
options: OptionsProtocol,
|
|
104
|
+
iteration: int,
|
|
105
|
+
testing_passed: bool,
|
|
106
|
+
comprehensive_passed: bool,
|
|
107
|
+
workflow_id: str = "unknown",
|
|
108
|
+
) -> bool:
|
|
109
|
+
"""Handle workflow completion with optional AI fixing.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
options: Configuration options
|
|
113
|
+
iteration: Current workflow iteration
|
|
114
|
+
testing_passed: Whether tests passed
|
|
115
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
116
|
+
workflow_id: Workflow identifier
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
True if workflow completed successfully
|
|
120
|
+
"""
|
|
121
|
+
if options.ai_agent:
|
|
122
|
+
return await self.handle_ai_agent_workflow(
|
|
123
|
+
options, iteration, testing_passed, comprehensive_passed, workflow_id
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
return await self._handle_standard_workflow(
|
|
127
|
+
options, iteration, testing_passed, comprehensive_passed
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
async def handle_ai_agent_workflow(
|
|
131
|
+
self,
|
|
132
|
+
options: OptionsProtocol,
|
|
133
|
+
iteration: int,
|
|
134
|
+
testing_passed: bool,
|
|
135
|
+
comprehensive_passed: bool,
|
|
136
|
+
workflow_id: str = "unknown",
|
|
137
|
+
) -> bool:
|
|
138
|
+
"""Handle AI agent-enabled workflow with fixing capability.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
options: Configuration options
|
|
142
|
+
iteration: Current workflow iteration
|
|
143
|
+
testing_passed: Whether tests passed
|
|
144
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
145
|
+
workflow_id: Workflow identifier
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
True if workflow completed successfully with AI assistance
|
|
149
|
+
"""
|
|
150
|
+
if not await self._process_security_gates(options):
|
|
151
|
+
return False
|
|
152
|
+
|
|
153
|
+
needs_ai_fixing = self.determine_ai_fixing_needed(
|
|
154
|
+
testing_passed, comprehensive_passed, bool(options.publish or options.all)
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
if needs_ai_fixing:
|
|
158
|
+
return await self._execute_ai_fixing_workflow(options, iteration)
|
|
159
|
+
|
|
160
|
+
return self.finalize_ai_workflow_success(
|
|
161
|
+
options, iteration, testing_passed, comprehensive_passed
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
async def _handle_standard_workflow(
|
|
165
|
+
self,
|
|
166
|
+
options: OptionsProtocol,
|
|
167
|
+
iteration: int,
|
|
168
|
+
testing_passed: bool,
|
|
169
|
+
comprehensive_passed: bool,
|
|
170
|
+
) -> bool:
|
|
171
|
+
"""Handle standard workflow without AI fixing.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
options: Configuration options
|
|
175
|
+
iteration: Current workflow iteration
|
|
176
|
+
testing_passed: Whether tests passed
|
|
177
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
True if workflow completed successfully
|
|
181
|
+
"""
|
|
182
|
+
publishing_requested = bool(options.publish or options.all)
|
|
183
|
+
|
|
184
|
+
final_success = self.determine_workflow_success(
|
|
185
|
+
testing_passed, comprehensive_passed, publishing_requested
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
if self._should_debug():
|
|
189
|
+
self.debugger.log_iteration_end(iteration, final_success)
|
|
190
|
+
|
|
191
|
+
return final_success
|
|
192
|
+
|
|
193
|
+
async def _process_security_gates(self, options: OptionsProtocol) -> bool:
|
|
194
|
+
"""Process security gates for publishing workflows.
|
|
195
|
+
|
|
196
|
+
Delegates to WorkflowSecurityGates for validation.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
options: Configuration options
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
True if security gates passed or AI fixed issues
|
|
203
|
+
"""
|
|
204
|
+
publishing_requested, security_blocks = (
|
|
205
|
+
self.security_gates.check_security_gates_for_publishing(options)
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
if not (publishing_requested and security_blocks):
|
|
209
|
+
return True
|
|
210
|
+
|
|
211
|
+
security_fix_result = await self._handle_security_gate_failure(
|
|
212
|
+
options, allow_ai_fixing=True
|
|
213
|
+
)
|
|
214
|
+
return security_fix_result
|
|
215
|
+
|
|
216
|
+
async def _handle_security_gate_failure(
|
|
217
|
+
self, options: OptionsProtocol, allow_ai_fixing: bool = False
|
|
218
|
+
) -> bool:
|
|
219
|
+
"""Handle security gate failure with optional AI fixing.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
options: Configuration options
|
|
223
|
+
allow_ai_fixing: Whether to attempt AI-assisted fixing
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
True if security issues were resolved
|
|
227
|
+
"""
|
|
228
|
+
self.security_gates.display_security_gate_failure_message()
|
|
229
|
+
|
|
230
|
+
if allow_ai_fixing:
|
|
231
|
+
return await self._attempt_ai_assisted_security_fix(options)
|
|
232
|
+
return self._handle_manual_security_fix()
|
|
233
|
+
|
|
234
|
+
async def _attempt_ai_assisted_security_fix(self, options: OptionsProtocol) -> bool:
|
|
235
|
+
"""Attempt to fix security issues using AI assistance.
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
options: Configuration options
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
True if security issues were resolved, False otherwise
|
|
242
|
+
"""
|
|
243
|
+
self.security_gates.display_ai_fixing_messages()
|
|
244
|
+
|
|
245
|
+
ai_fix_success = await self.run_ai_agent_fixing_phase(options)
|
|
246
|
+
if ai_fix_success:
|
|
247
|
+
return self.security_gates.verify_security_fix_success()
|
|
248
|
+
|
|
249
|
+
return False
|
|
250
|
+
|
|
251
|
+
def _handle_manual_security_fix(self) -> bool:
|
|
252
|
+
"""Handle security fix when AI assistance is not allowed.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
Always False since manual intervention is required
|
|
256
|
+
"""
|
|
257
|
+
return self.security_gates.handle_manual_security_fix()
|
|
258
|
+
|
|
259
|
+
async def _execute_ai_fixing_workflow(
|
|
260
|
+
self, options: OptionsProtocol, iteration: int
|
|
261
|
+
) -> bool:
|
|
262
|
+
"""Execute the AI fixing workflow.
|
|
263
|
+
|
|
264
|
+
Args:
|
|
265
|
+
options: Configuration options
|
|
266
|
+
iteration: Current workflow iteration
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
True if AI fixing succeeded
|
|
270
|
+
"""
|
|
271
|
+
success = await self.run_ai_agent_fixing_phase(options)
|
|
272
|
+
if self._should_debug():
|
|
273
|
+
self.debugger.log_iteration_end(iteration, success)
|
|
274
|
+
return success
|
|
275
|
+
|
|
276
|
+
def finalize_ai_workflow_success(
|
|
277
|
+
self,
|
|
278
|
+
options: OptionsProtocol,
|
|
279
|
+
iteration: int,
|
|
280
|
+
testing_passed: bool,
|
|
281
|
+
comprehensive_passed: bool,
|
|
282
|
+
) -> bool:
|
|
283
|
+
"""Finalize successful AI workflow completion.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
options: Configuration options
|
|
287
|
+
iteration: Current workflow iteration
|
|
288
|
+
testing_passed: Whether tests passed
|
|
289
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
True if workflow is successful
|
|
293
|
+
"""
|
|
294
|
+
publishing_requested = bool(options.publish or options.all)
|
|
295
|
+
|
|
296
|
+
final_success = self.determine_workflow_success(
|
|
297
|
+
testing_passed, comprehensive_passed, publishing_requested
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
self.security_gates.show_partial_success_warning_if_needed(
|
|
301
|
+
publishing_requested, final_success, testing_passed, comprehensive_passed
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
if self._should_debug():
|
|
305
|
+
self.debugger.log_iteration_end(iteration, final_success)
|
|
306
|
+
|
|
307
|
+
return final_success
|
|
308
|
+
|
|
309
|
+
def determine_ai_fixing_needed(
|
|
310
|
+
self,
|
|
311
|
+
testing_passed: bool,
|
|
312
|
+
comprehensive_passed: bool,
|
|
313
|
+
publishing_requested: bool,
|
|
314
|
+
) -> bool:
|
|
315
|
+
"""Determine if AI fixing is needed based on quality results.
|
|
316
|
+
|
|
317
|
+
Args:
|
|
318
|
+
testing_passed: Whether tests passed
|
|
319
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
320
|
+
publishing_requested: Whether publishing was requested
|
|
321
|
+
|
|
322
|
+
Returns:
|
|
323
|
+
True if AI fixing should be attempted
|
|
324
|
+
"""
|
|
325
|
+
if publishing_requested:
|
|
326
|
+
return not testing_passed or not comprehensive_passed
|
|
327
|
+
|
|
328
|
+
return not testing_passed or not comprehensive_passed
|
|
329
|
+
|
|
330
|
+
def determine_workflow_success(
|
|
331
|
+
self,
|
|
332
|
+
testing_passed: bool,
|
|
333
|
+
comprehensive_passed: bool,
|
|
334
|
+
publishing_requested: bool,
|
|
335
|
+
) -> bool:
|
|
336
|
+
"""Determine overall workflow success.
|
|
337
|
+
|
|
338
|
+
Args:
|
|
339
|
+
testing_passed: Whether tests passed
|
|
340
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
341
|
+
publishing_requested: Whether publishing was requested
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
True if workflow is successful
|
|
345
|
+
"""
|
|
346
|
+
if publishing_requested:
|
|
347
|
+
return testing_passed and comprehensive_passed
|
|
348
|
+
|
|
349
|
+
return testing_passed and comprehensive_passed
|
|
350
|
+
|
|
351
|
+
# ===================================================================
|
|
352
|
+
# AI Fixing Phase Execution
|
|
353
|
+
# ===================================================================
|
|
354
|
+
|
|
355
|
+
async def run_ai_agent_fixing_phase(self, options: OptionsProtocol) -> bool:
|
|
356
|
+
"""Run the AI agent fixing phase.
|
|
357
|
+
|
|
358
|
+
Main entry point for AI-assisted issue resolution. Coordinates:
|
|
359
|
+
1. Environment preparation (code cleaning if needed)
|
|
360
|
+
2. Issue collection from test/hook failures
|
|
361
|
+
3. Agent coordinator setup
|
|
362
|
+
4. Fix execution
|
|
363
|
+
5. Fix verification
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
options: Configuration options
|
|
367
|
+
|
|
368
|
+
Returns:
|
|
369
|
+
True if fixes were successfully applied and verified
|
|
370
|
+
"""
|
|
371
|
+
self._initialize_ai_fixing_phase(options)
|
|
372
|
+
|
|
373
|
+
try:
|
|
374
|
+
self._prepare_ai_fixing_environment(options)
|
|
375
|
+
|
|
376
|
+
agent_coordinator, issues = await self._setup_ai_fixing_workflow()
|
|
377
|
+
|
|
378
|
+
if not issues:
|
|
379
|
+
return self._handle_no_issues_found()
|
|
380
|
+
|
|
381
|
+
return await self._execute_ai_fixes(options, agent_coordinator, issues)
|
|
382
|
+
|
|
383
|
+
except Exception as e:
|
|
384
|
+
return self._handle_fixing_phase_error(e)
|
|
385
|
+
|
|
386
|
+
def _initialize_ai_fixing_phase(self, options: OptionsProtocol) -> None:
|
|
387
|
+
"""Initialize the AI fixing phase with logging and status updates.
|
|
388
|
+
|
|
389
|
+
Args:
|
|
390
|
+
options: Configuration options
|
|
391
|
+
"""
|
|
392
|
+
self._update_mcp_status("ai_fixing", "running")
|
|
393
|
+
self.logger.info("Starting AI agent fixing phase")
|
|
394
|
+
# Always log this important phase start for AI consumption
|
|
395
|
+
self.logger.info(
|
|
396
|
+
"AI agent fixing phase started",
|
|
397
|
+
ai_agent_fixing=True,
|
|
398
|
+
event_type="ai_fix_init",
|
|
399
|
+
)
|
|
400
|
+
self._log_debug_phase_start()
|
|
401
|
+
|
|
402
|
+
def _prepare_ai_fixing_environment(self, options: OptionsProtocol) -> None:
|
|
403
|
+
"""Prepare environment for AI fixing by running code cleaning if needed.
|
|
404
|
+
|
|
405
|
+
Args:
|
|
406
|
+
options: Configuration options
|
|
407
|
+
"""
|
|
408
|
+
should_run_cleaning = (
|
|
409
|
+
getattr(options, "clean", False) and not self.has_code_cleaning_run()
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
if not should_run_cleaning:
|
|
413
|
+
return
|
|
414
|
+
|
|
415
|
+
self.console.print(
|
|
416
|
+
"\n[bold yellow]๐ค AI agents recommend running code cleaning first for better results...[/bold yellow]"
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
if self._run_code_cleaning_phase(options):
|
|
420
|
+
self._run_post_cleaning_fast_hooks(options)
|
|
421
|
+
self.mark_code_cleaning_complete()
|
|
422
|
+
|
|
423
|
+
async def _setup_ai_fixing_workflow(
|
|
424
|
+
self,
|
|
425
|
+
) -> tuple[EnhancedAgentCoordinator, list[Issue]]:
|
|
426
|
+
"""Setup agent coordinator and collect issues.
|
|
427
|
+
|
|
428
|
+
Returns:
|
|
429
|
+
Tuple of (agent coordinator, list of issues)
|
|
430
|
+
"""
|
|
431
|
+
agent_coordinator = self._setup_agent_coordinator()
|
|
432
|
+
issues = await self._collect_issues_from_failures()
|
|
433
|
+
return agent_coordinator, issues
|
|
434
|
+
|
|
435
|
+
async def _execute_ai_fixes(
|
|
436
|
+
self,
|
|
437
|
+
options: OptionsProtocol,
|
|
438
|
+
agent_coordinator: EnhancedAgentCoordinator,
|
|
439
|
+
issues: list[Issue],
|
|
440
|
+
) -> bool:
|
|
441
|
+
"""Execute AI fixes using the agent coordinator.
|
|
442
|
+
|
|
443
|
+
Args:
|
|
444
|
+
options: Configuration options
|
|
445
|
+
agent_coordinator: Initialized agent coordinator
|
|
446
|
+
issues: List of issues to fix
|
|
447
|
+
|
|
448
|
+
Returns:
|
|
449
|
+
True if fixes were successfully applied and verified
|
|
450
|
+
"""
|
|
451
|
+
self.logger.info(f"AI agents will attempt to fix {len(issues)} issues")
|
|
452
|
+
fix_result = await agent_coordinator.handle_issues(issues)
|
|
453
|
+
return await self._process_fix_results(options, fix_result)
|
|
454
|
+
|
|
455
|
+
def _log_debug_phase_start(self) -> None:
|
|
456
|
+
"""Log debug information at AI fixing phase start."""
|
|
457
|
+
if self._should_debug():
|
|
458
|
+
self.debugger.log_workflow_phase(
|
|
459
|
+
"ai_agent_fixing",
|
|
460
|
+
"started",
|
|
461
|
+
details={"ai_agent": True},
|
|
462
|
+
)
|
|
463
|
+
# Log structured data to stderr for AI consumption
|
|
464
|
+
self.logger.info(
|
|
465
|
+
"AI agent fixing phase started",
|
|
466
|
+
ai_agent_fixing=True,
|
|
467
|
+
event_type="ai_fix_start",
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
def _setup_agent_coordinator(self) -> EnhancedAgentCoordinator:
|
|
471
|
+
"""Create and initialize the enhanced agent coordinator.
|
|
472
|
+
|
|
473
|
+
Returns:
|
|
474
|
+
Initialized EnhancedAgentCoordinator
|
|
475
|
+
"""
|
|
476
|
+
from crackerjack.agents.enhanced_coordinator import create_enhanced_coordinator
|
|
477
|
+
|
|
478
|
+
agent_context = AgentContext(
|
|
479
|
+
project_path=self.pkg_path,
|
|
480
|
+
session_id=getattr(self.session, "session_id", None),
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
# Use enhanced coordinator with Claude Code agent integration
|
|
484
|
+
agent_coordinator = create_enhanced_coordinator(
|
|
485
|
+
context=agent_context, enable_external_agents=True
|
|
486
|
+
)
|
|
487
|
+
agent_coordinator.initialize_agents()
|
|
488
|
+
return agent_coordinator
|
|
489
|
+
|
|
490
|
+
def _handle_no_issues_found(self) -> bool:
|
|
491
|
+
"""Handle case where no issues were found to fix.
|
|
492
|
+
|
|
493
|
+
Returns:
|
|
494
|
+
True (success since there are no issues)
|
|
495
|
+
"""
|
|
496
|
+
self.logger.info("No issues collected for AI agent fixing")
|
|
497
|
+
self._update_mcp_status("ai_fixing", "completed")
|
|
498
|
+
return True
|
|
499
|
+
|
|
500
|
+
async def _process_fix_results(
|
|
501
|
+
self, options: OptionsProtocol, fix_result: t.Any
|
|
502
|
+
) -> bool:
|
|
503
|
+
"""Process the results from AI fixing.
|
|
504
|
+
|
|
505
|
+
Args:
|
|
506
|
+
options: Configuration options
|
|
507
|
+
fix_result: Result object from agent coordinator
|
|
508
|
+
|
|
509
|
+
Returns:
|
|
510
|
+
True if fixes were successful and verified
|
|
511
|
+
"""
|
|
512
|
+
verification_success = await self._verify_fixes_applied(options, fix_result)
|
|
513
|
+
success = fix_result.success and verification_success
|
|
514
|
+
|
|
515
|
+
if success:
|
|
516
|
+
self._handle_successful_fixes(fix_result)
|
|
517
|
+
else:
|
|
518
|
+
self._handle_failed_fixes(fix_result, verification_success)
|
|
519
|
+
|
|
520
|
+
self._log_debug_phase_completion(success, fix_result)
|
|
521
|
+
return success
|
|
522
|
+
|
|
523
|
+
def _handle_successful_fixes(self, fix_result: t.Any) -> None:
|
|
524
|
+
"""Handle successful fix results.
|
|
525
|
+
|
|
526
|
+
Args:
|
|
527
|
+
fix_result: Result object from agent coordinator
|
|
528
|
+
"""
|
|
529
|
+
self.logger.info(
|
|
530
|
+
"AI agents successfully fixed all issues and verification passed"
|
|
531
|
+
)
|
|
532
|
+
self._update_mcp_status("ai_fixing", "completed")
|
|
533
|
+
self._log_fix_counts_if_debugging(fix_result)
|
|
534
|
+
|
|
535
|
+
def _handle_failed_fixes(
|
|
536
|
+
self, fix_result: t.Any, verification_success: bool
|
|
537
|
+
) -> None:
|
|
538
|
+
"""Handle failed fix results.
|
|
539
|
+
|
|
540
|
+
Args:
|
|
541
|
+
fix_result: Result object from agent coordinator
|
|
542
|
+
verification_success: Whether verification passed
|
|
543
|
+
"""
|
|
544
|
+
if not verification_success:
|
|
545
|
+
self.logger.warning(
|
|
546
|
+
"AI agent fixes did not pass verification-issues still exist"
|
|
547
|
+
)
|
|
548
|
+
else:
|
|
549
|
+
self.logger.warning(
|
|
550
|
+
f"AI agents could not fix all issues: {fix_result.remaining_issues}",
|
|
551
|
+
)
|
|
552
|
+
self._update_mcp_status("ai_fixing", "failed")
|
|
553
|
+
|
|
554
|
+
def _log_fix_counts_if_debugging(self, fix_result: t.Any) -> None:
|
|
555
|
+
"""Log fix counts for debugging purposes.
|
|
556
|
+
|
|
557
|
+
Args:
|
|
558
|
+
fix_result: Result object from agent coordinator
|
|
559
|
+
"""
|
|
560
|
+
if not self._should_debug():
|
|
561
|
+
return
|
|
562
|
+
|
|
563
|
+
total_fixes = len(fix_result.fixes_applied)
|
|
564
|
+
test_fixes = len(
|
|
565
|
+
[f for f in fix_result.fixes_applied if "test" in f.lower()],
|
|
566
|
+
)
|
|
567
|
+
hook_fixes = total_fixes - test_fixes
|
|
568
|
+
self.debugger.log_test_fixes(test_fixes)
|
|
569
|
+
self.debugger.log_hook_fixes(hook_fixes)
|
|
570
|
+
|
|
571
|
+
# Log structured data to stderr for AI consumption
|
|
572
|
+
self.logger.info(
|
|
573
|
+
"AI fixes applied",
|
|
574
|
+
ai_agent_fixing=True,
|
|
575
|
+
event_type="ai_fix_counts",
|
|
576
|
+
total_fixes=total_fixes,
|
|
577
|
+
test_fixes=test_fixes,
|
|
578
|
+
hook_fixes=hook_fixes,
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
def _log_debug_phase_completion(self, success: bool, fix_result: t.Any) -> None:
|
|
582
|
+
"""Log debug information at AI fixing phase completion.
|
|
583
|
+
|
|
584
|
+
Args:
|
|
585
|
+
success: Whether the phase succeeded
|
|
586
|
+
fix_result: Result object from agent coordinator
|
|
587
|
+
"""
|
|
588
|
+
if self._should_debug():
|
|
589
|
+
self.debugger.log_workflow_phase(
|
|
590
|
+
"ai_agent_fixing",
|
|
591
|
+
"completed" if success else "failed",
|
|
592
|
+
details={
|
|
593
|
+
"confidence": fix_result.confidence,
|
|
594
|
+
"fixes_applied": len(fix_result.fixes_applied),
|
|
595
|
+
"remaining_issues": len(fix_result.remaining_issues),
|
|
596
|
+
},
|
|
597
|
+
)
|
|
598
|
+
# Log structured data to stderr for AI consumption
|
|
599
|
+
self.logger.info(
|
|
600
|
+
f"AI agent fixing phase {'completed' if success else 'failed'}",
|
|
601
|
+
ai_agent_fixing=True,
|
|
602
|
+
event_type="ai_fix_completion",
|
|
603
|
+
success=success,
|
|
604
|
+
confidence=fix_result.confidence,
|
|
605
|
+
fixes_applied=len(fix_result.fixes_applied),
|
|
606
|
+
remaining_issues=len(fix_result.remaining_issues),
|
|
607
|
+
)
|
|
608
|
+
|
|
609
|
+
def _handle_fixing_phase_error(self, error: Exception) -> bool:
|
|
610
|
+
"""Handle errors during AI fixing phase.
|
|
611
|
+
|
|
612
|
+
Args:
|
|
613
|
+
error: Exception that occurred
|
|
614
|
+
|
|
615
|
+
Returns:
|
|
616
|
+
False (failure)
|
|
617
|
+
"""
|
|
618
|
+
self.logger.exception(f"AI agent fixing phase failed: {error}")
|
|
619
|
+
self.session.fail_task("ai_fixing", f"AI agent fixing failed: {error}")
|
|
620
|
+
self._update_mcp_status("ai_fixing", "failed")
|
|
621
|
+
|
|
622
|
+
if self._should_debug():
|
|
623
|
+
self.debugger.log_workflow_phase(
|
|
624
|
+
"ai_agent_fixing",
|
|
625
|
+
"failed",
|
|
626
|
+
details={"error": str(error)},
|
|
627
|
+
)
|
|
628
|
+
# Log structured data to stderr for AI consumption
|
|
629
|
+
self.logger.error(
|
|
630
|
+
"AI agent fixing phase failed",
|
|
631
|
+
ai_agent_fixing=True,
|
|
632
|
+
event_type="ai_fix_error",
|
|
633
|
+
error=str(error),
|
|
634
|
+
error_type=type(error).__name__,
|
|
635
|
+
)
|
|
636
|
+
|
|
637
|
+
return False
|
|
638
|
+
|
|
639
|
+
# ===================================================================
|
|
640
|
+
# Fix Verification
|
|
641
|
+
# ===================================================================
|
|
642
|
+
|
|
643
|
+
async def _verify_fixes_applied(
|
|
644
|
+
self, options: OptionsProtocol, fix_result: t.Any
|
|
645
|
+
) -> bool:
|
|
646
|
+
"""Verify that AI fixes actually resolved issues by re-running checks.
|
|
647
|
+
|
|
648
|
+
Args:
|
|
649
|
+
options: Configuration options
|
|
650
|
+
fix_result: Result object from agent coordinator
|
|
651
|
+
|
|
652
|
+
Returns:
|
|
653
|
+
True if verification passed
|
|
654
|
+
"""
|
|
655
|
+
if not fix_result.fixes_applied:
|
|
656
|
+
return True
|
|
657
|
+
|
|
658
|
+
self.logger.info("Verifying AI agent fixes by re-running quality checks")
|
|
659
|
+
|
|
660
|
+
verification_success = True
|
|
661
|
+
|
|
662
|
+
if self._should_verify_test_fixes(fix_result.fixes_applied):
|
|
663
|
+
if not await self._verify_test_fixes(options):
|
|
664
|
+
verification_success = False
|
|
665
|
+
|
|
666
|
+
if self._should_verify_hook_fixes(fix_result.fixes_applied):
|
|
667
|
+
if not await self._verify_hook_fixes(options):
|
|
668
|
+
verification_success = False
|
|
669
|
+
|
|
670
|
+
self._log_verification_result(verification_success)
|
|
671
|
+
return verification_success
|
|
672
|
+
|
|
673
|
+
def _should_verify_test_fixes(self, fixes_applied: list[str]) -> bool:
|
|
674
|
+
"""Check if test fixes need verification.
|
|
675
|
+
|
|
676
|
+
Args:
|
|
677
|
+
fixes_applied: List of fixes that were applied
|
|
678
|
+
|
|
679
|
+
Returns:
|
|
680
|
+
True if any test-related fixes were applied
|
|
681
|
+
"""
|
|
682
|
+
return any("test" in fix.lower() for fix in fixes_applied)
|
|
683
|
+
|
|
684
|
+
async def _verify_test_fixes(self, options: OptionsProtocol) -> bool:
|
|
685
|
+
"""Verify test fixes by re-running tests.
|
|
686
|
+
|
|
687
|
+
Args:
|
|
688
|
+
options: Configuration options
|
|
689
|
+
|
|
690
|
+
Returns:
|
|
691
|
+
True if tests now pass
|
|
692
|
+
"""
|
|
693
|
+
self.logger.info("Re-running tests to verify test fixes")
|
|
694
|
+
test_success = self.phases.run_testing_phase(options)
|
|
695
|
+
if not test_success:
|
|
696
|
+
self.logger.warning("Test verification failed-test fixes did not work")
|
|
697
|
+
return test_success
|
|
698
|
+
|
|
699
|
+
def _should_verify_hook_fixes(self, fixes_applied: list[str]) -> bool:
|
|
700
|
+
"""Check if hook fixes need verification.
|
|
701
|
+
|
|
702
|
+
Args:
|
|
703
|
+
fixes_applied: List of fixes that were applied
|
|
704
|
+
|
|
705
|
+
Returns:
|
|
706
|
+
True if any hook-related fixes were applied
|
|
707
|
+
"""
|
|
708
|
+
hook_fixes = [fix for fix in fixes_applied if self._is_hook_related_fix(fix)]
|
|
709
|
+
return bool(hook_fixes)
|
|
710
|
+
|
|
711
|
+
def _is_hook_related_fix(self, fix: str) -> bool:
|
|
712
|
+
"""Check if a fix is related to hooks and should trigger hook verification.
|
|
713
|
+
|
|
714
|
+
Args:
|
|
715
|
+
fix: Description of the fix
|
|
716
|
+
|
|
717
|
+
Returns:
|
|
718
|
+
True if the fix is hook-related
|
|
719
|
+
"""
|
|
720
|
+
fix_lower = fix.lower()
|
|
721
|
+
return (
|
|
722
|
+
"hook" not in fix_lower or "complexity" in fix_lower or "type" in fix_lower
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
async def _verify_hook_fixes(self, options: OptionsProtocol) -> bool:
|
|
726
|
+
"""Verify hook fixes by re-running comprehensive hooks.
|
|
727
|
+
|
|
728
|
+
Args:
|
|
729
|
+
options: Configuration options
|
|
730
|
+
|
|
731
|
+
Returns:
|
|
732
|
+
True if hooks now pass
|
|
733
|
+
"""
|
|
734
|
+
self.logger.info("Re-running comprehensive hooks to verify hook fixes")
|
|
735
|
+
hook_success = self.phases.run_comprehensive_hooks_only(options)
|
|
736
|
+
if not hook_success:
|
|
737
|
+
self.logger.warning("Hook verification failed-hook fixes did not work")
|
|
738
|
+
return hook_success
|
|
739
|
+
|
|
740
|
+
def _log_verification_result(self, verification_success: bool) -> None:
|
|
741
|
+
"""Log the result of fix verification.
|
|
742
|
+
|
|
743
|
+
Args:
|
|
744
|
+
verification_success: Whether verification passed
|
|
745
|
+
"""
|
|
746
|
+
if verification_success:
|
|
747
|
+
self.logger.info("All AI agent fixes verified successfully")
|
|
748
|
+
else:
|
|
749
|
+
self.logger.error(
|
|
750
|
+
"Verification failed-some fixes did not resolve the issues"
|
|
751
|
+
)
|
|
752
|
+
|
|
753
|
+
# ===================================================================
|
|
754
|
+
# Issue Collection (Delegates to WorkflowIssueParser)
|
|
755
|
+
# ===================================================================
|
|
756
|
+
|
|
757
|
+
async def _collect_issues_from_failures(self) -> list[Issue]:
|
|
758
|
+
"""Collect issues from test and hook failures.
|
|
759
|
+
|
|
760
|
+
Delegates to WorkflowIssueParser for issue collection and classification.
|
|
761
|
+
|
|
762
|
+
Returns:
|
|
763
|
+
List of collected issues
|
|
764
|
+
"""
|
|
765
|
+
issues: list[Issue] = []
|
|
766
|
+
|
|
767
|
+
test_issues, test_count = self.issue_parser.collect_test_failure_issues(
|
|
768
|
+
self.phases
|
|
769
|
+
)
|
|
770
|
+
hook_issues, hook_count = self.issue_parser.collect_hook_failure_issues(
|
|
771
|
+
self.phases, self.session
|
|
772
|
+
)
|
|
773
|
+
|
|
774
|
+
issues.extend(test_issues)
|
|
775
|
+
issues.extend(hook_issues)
|
|
776
|
+
|
|
777
|
+
self.issue_parser.log_failure_counts_if_debugging(
|
|
778
|
+
test_count, hook_count, self._should_debug()
|
|
779
|
+
)
|
|
780
|
+
|
|
781
|
+
return issues
|
|
782
|
+
|
|
783
|
+
# ===================================================================
|
|
784
|
+
# Helper Methods
|
|
785
|
+
# ===================================================================
|
|
786
|
+
|
|
787
|
+
def _should_debug(self) -> bool:
|
|
788
|
+
"""Check if debug mode is enabled.
|
|
789
|
+
|
|
790
|
+
Returns:
|
|
791
|
+
True if AI_AGENT_DEBUG environment variable is set
|
|
792
|
+
"""
|
|
793
|
+
import os
|
|
794
|
+
|
|
795
|
+
return os.environ.get("AI_AGENT_DEBUG", "0") == "1"
|
|
796
|
+
|
|
797
|
+
def _update_mcp_status(self, stage: str, status: str) -> None:
|
|
798
|
+
"""Update MCP state manager status if available.
|
|
799
|
+
|
|
800
|
+
Args:
|
|
801
|
+
stage: Stage name
|
|
802
|
+
status: Status value
|
|
803
|
+
"""
|
|
804
|
+
if hasattr(self, "_mcp_state_manager") and self._mcp_state_manager:
|
|
805
|
+
self._mcp_state_manager.update_stage_status(stage, status)
|
|
806
|
+
|
|
807
|
+
def has_code_cleaning_run(self) -> bool:
|
|
808
|
+
"""Check if code cleaning has already run.
|
|
809
|
+
|
|
810
|
+
Returns:
|
|
811
|
+
True if code cleaning has completed
|
|
812
|
+
"""
|
|
813
|
+
return self._code_cleaning_complete
|
|
814
|
+
|
|
815
|
+
def mark_code_cleaning_complete(self) -> None:
|
|
816
|
+
"""Mark code cleaning as complete."""
|
|
817
|
+
self._code_cleaning_complete = True
|
|
818
|
+
|
|
819
|
+
def _run_code_cleaning_phase(self, options: OptionsProtocol) -> bool:
|
|
820
|
+
"""Run the code cleaning phase.
|
|
821
|
+
|
|
822
|
+
Args:
|
|
823
|
+
options: Configuration options
|
|
824
|
+
|
|
825
|
+
Returns:
|
|
826
|
+
True if cleaning succeeded
|
|
827
|
+
"""
|
|
828
|
+
self.console.print("\n[bold blue]๐งน Running Code Cleaning Phase...[/bold blue]")
|
|
829
|
+
|
|
830
|
+
success = self.phases.run_cleaning_phase(options)
|
|
831
|
+
if success:
|
|
832
|
+
self.console.print("[green]โ
Code cleaning completed successfully[/green]")
|
|
833
|
+
else:
|
|
834
|
+
self.console.print("[red]โ Code cleaning failed[/red]")
|
|
835
|
+
self.session.fail_task("workflow", "Code cleaning phase failed")
|
|
836
|
+
|
|
837
|
+
return success
|
|
838
|
+
|
|
839
|
+
def _run_post_cleaning_fast_hooks(self, options: OptionsProtocol) -> bool:
|
|
840
|
+
"""Run fast hooks after code cleaning as sanity check.
|
|
841
|
+
|
|
842
|
+
Args:
|
|
843
|
+
options: Configuration options
|
|
844
|
+
|
|
845
|
+
Returns:
|
|
846
|
+
True if fast hooks passed
|
|
847
|
+
"""
|
|
848
|
+
self.console.print(
|
|
849
|
+
"\n[bold cyan]๐ Running Post-Cleaning Fast Hooks Sanity Check...[/bold cyan]"
|
|
850
|
+
)
|
|
851
|
+
# Allow a single re-run after cleaning by resetting the session guard
|
|
852
|
+
with suppress(Exception):
|
|
853
|
+
# Access PhaseCoordinator instance to reset its duplicate guard
|
|
854
|
+
setattr(self.phases, "_fast_hooks_started", False)
|
|
855
|
+
|
|
856
|
+
success = self.phases.run_fast_hooks_phase(options)
|
|
857
|
+
if success:
|
|
858
|
+
self.console.print("[green]โ
Post-cleaning sanity check passed[/green]")
|
|
859
|
+
else:
|
|
860
|
+
self.console.print("[red]โ Post-cleaning sanity check failed[/red]")
|
|
861
|
+
self.session.fail_task("workflow", "Post-cleaning fast hooks failed")
|
|
862
|
+
|
|
863
|
+
return success
|