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,279 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enhanced AgentCoordinator with Claude Code external agent integration.
|
|
3
|
+
|
|
4
|
+
This module extends the base AgentCoordinator to seamlessly integrate with
|
|
5
|
+
Claude Code's external agents while maintaining full compatibility with
|
|
6
|
+
the existing crackerjack agent system.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import typing as t
|
|
10
|
+
|
|
11
|
+
from .base import AgentContext, FixResult, Issue
|
|
12
|
+
from .claude_code_bridge import ClaudeCodeBridge
|
|
13
|
+
from .coordinator import AgentCoordinator
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class EnhancedAgentCoordinator(AgentCoordinator):
|
|
17
|
+
"""
|
|
18
|
+
AgentCoordinator enhanced with Claude Code external agent integration.
|
|
19
|
+
|
|
20
|
+
This coordinator maintains all the functionality of the base AgentCoordinator
|
|
21
|
+
while adding intelligent consultation with external Claude Code agents
|
|
22
|
+
when handling complex issues.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
context: AgentContext,
|
|
28
|
+
cache: t.Any = None,
|
|
29
|
+
enable_external_agents: bool = True,
|
|
30
|
+
) -> None:
|
|
31
|
+
super().__init__(context, cache)
|
|
32
|
+
self.claude_bridge = ClaudeCodeBridge(context)
|
|
33
|
+
self.external_agents_enabled = enable_external_agents
|
|
34
|
+
self._external_consultation_stats: dict[str, int] = {
|
|
35
|
+
"consultations_requested": 0,
|
|
36
|
+
"consultations_successful": 0,
|
|
37
|
+
"improvements_achieved": 0,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
self.logger.info(
|
|
41
|
+
f"Enhanced coordinator initialized with external agents: {enable_external_agents}"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def enable_external_agents(self, enabled: bool = True) -> None:
|
|
45
|
+
"""Enable or disable external Claude Code agent consultation."""
|
|
46
|
+
self.external_agents_enabled = enabled
|
|
47
|
+
self.logger.info(f"External agents {'enabled' if enabled else 'disabled'}")
|
|
48
|
+
|
|
49
|
+
def get_external_consultation_stats(self) -> dict[str, int]:
|
|
50
|
+
"""Get statistics about external agent consultations."""
|
|
51
|
+
return self._external_consultation_stats.copy()
|
|
52
|
+
|
|
53
|
+
async def handle_issues_proactively(self, issues: list[Issue]) -> FixResult:
|
|
54
|
+
"""
|
|
55
|
+
Enhanced proactive handling with external agent consultation.
|
|
56
|
+
|
|
57
|
+
This method extends the base proactive handling to:
|
|
58
|
+
1. Identify issues that would benefit from external consultation
|
|
59
|
+
2. Pre-consult with relevant Claude Code agents for strategic guidance
|
|
60
|
+
3. Apply the combined internal/external strategy
|
|
61
|
+
"""
|
|
62
|
+
if not self.external_agents_enabled:
|
|
63
|
+
return await super().handle_issues_proactively(issues)
|
|
64
|
+
|
|
65
|
+
if not self.agents:
|
|
66
|
+
self.initialize_agents()
|
|
67
|
+
|
|
68
|
+
if not issues:
|
|
69
|
+
return FixResult(success=True, confidence=1.0)
|
|
70
|
+
|
|
71
|
+
self.logger.info(f"Enhanced proactive handling of {len(issues)} issues")
|
|
72
|
+
|
|
73
|
+
# Pre-analyze issues for external consultation opportunities
|
|
74
|
+
strategic_consultations = await self._pre_consult_for_strategy(issues)
|
|
75
|
+
|
|
76
|
+
# Create enhanced architectural plan incorporating external guidance
|
|
77
|
+
architectural_plan = await self._create_enhanced_architectural_plan(
|
|
78
|
+
issues, strategic_consultations
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
# Apply fixes with enhanced strategy
|
|
82
|
+
overall_result = await self._apply_enhanced_fixes_with_plan(
|
|
83
|
+
issues, architectural_plan, strategic_consultations
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# Post-process with external validation if needed
|
|
87
|
+
validated_result = await self._validate_with_external_agents(
|
|
88
|
+
overall_result, architectural_plan
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
self._update_consultation_stats(strategic_consultations, validated_result)
|
|
92
|
+
|
|
93
|
+
return validated_result
|
|
94
|
+
|
|
95
|
+
async def _pre_consult_for_strategy(self, issues: list[Issue]) -> dict[str, t.Any]:
|
|
96
|
+
"""Pre-consult with external agents for strategic guidance."""
|
|
97
|
+
strategic_consultations: dict[str, t.Any] = {
|
|
98
|
+
"crackerjack_architect_guidance": None,
|
|
99
|
+
"specialist_recommendations": {},
|
|
100
|
+
"coordination_strategy": "internal_first",
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Identify complex issues that need architectural guidance
|
|
104
|
+
complex_issues = [
|
|
105
|
+
issue
|
|
106
|
+
for issue in issues
|
|
107
|
+
if self.claude_bridge.should_consult_external_agent(issue, 0.0)
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
if not complex_issues:
|
|
111
|
+
return strategic_consultations
|
|
112
|
+
|
|
113
|
+
# Consult crackerjack-architect for overall strategy if available
|
|
114
|
+
if self.claude_bridge.verify_agent_availability("crackerjack-architect"):
|
|
115
|
+
self._external_consultation_stats["consultations_requested"] += 1
|
|
116
|
+
|
|
117
|
+
# Use the first complex issue as representative for strategic planning
|
|
118
|
+
primary_issue = complex_issues[0]
|
|
119
|
+
architect_consultation = await self.claude_bridge.consult_external_agent(
|
|
120
|
+
primary_issue,
|
|
121
|
+
"crackerjack-architect",
|
|
122
|
+
{"context": "strategic_planning"},
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if architect_consultation.get("status") == "success":
|
|
126
|
+
strategic_consultations["crackerjack_architect_guidance"] = (
|
|
127
|
+
architect_consultation
|
|
128
|
+
)
|
|
129
|
+
strategic_consultations["coordination_strategy"] = "architect_guided"
|
|
130
|
+
self._external_consultation_stats["consultations_successful"] += 1
|
|
131
|
+
|
|
132
|
+
return strategic_consultations
|
|
133
|
+
|
|
134
|
+
async def _create_enhanced_architectural_plan(
|
|
135
|
+
self, issues: list[Issue], strategic_consultations: dict[str, t.Any]
|
|
136
|
+
) -> dict[str, t.Any]:
|
|
137
|
+
"""Create architectural plan enhanced with external agent guidance."""
|
|
138
|
+
# Start with the base architectural plan
|
|
139
|
+
base_plan = await self._create_architectural_plan(issues)
|
|
140
|
+
|
|
141
|
+
# Enhance with external guidance if available
|
|
142
|
+
architect_guidance = strategic_consultations.get(
|
|
143
|
+
"crackerjack_architect_guidance"
|
|
144
|
+
)
|
|
145
|
+
if architect_guidance and architect_guidance.get("status") == "success":
|
|
146
|
+
# Integrate external architectural guidance
|
|
147
|
+
base_plan["external_guidance"] = architect_guidance
|
|
148
|
+
base_plan["enhanced_patterns"] = architect_guidance.get("patterns", [])
|
|
149
|
+
base_plan["external_validation"] = architect_guidance.get(
|
|
150
|
+
"validation_steps", []
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Update strategy based on external guidance
|
|
154
|
+
if "strategy" in architect_guidance:
|
|
155
|
+
base_plan["strategy"] = "external_specialist_guided"
|
|
156
|
+
|
|
157
|
+
return base_plan
|
|
158
|
+
|
|
159
|
+
async def _apply_enhanced_fixes_with_plan(
|
|
160
|
+
self,
|
|
161
|
+
issues: list[Issue],
|
|
162
|
+
plan: dict[str, t.Any],
|
|
163
|
+
strategic_consultations: dict[str, t.Any],
|
|
164
|
+
) -> FixResult:
|
|
165
|
+
"""Apply fixes using enhanced strategy with external guidance."""
|
|
166
|
+
# Use the base implementation but with enhanced plan
|
|
167
|
+
return await self._apply_fixes_with_plan(issues, plan)
|
|
168
|
+
|
|
169
|
+
async def _validate_with_external_agents(
|
|
170
|
+
self, result: FixResult, plan: dict[str, t.Any]
|
|
171
|
+
) -> FixResult:
|
|
172
|
+
"""Post-validate results with external agents if configured."""
|
|
173
|
+
external_validation = plan.get("external_validation", [])
|
|
174
|
+
|
|
175
|
+
if not external_validation or not self.external_agents_enabled:
|
|
176
|
+
return result
|
|
177
|
+
|
|
178
|
+
# Add validation recommendations from external agents
|
|
179
|
+
validation_recommendations = [
|
|
180
|
+
f"External validation: {validation_step}"
|
|
181
|
+
for validation_step in external_validation
|
|
182
|
+
]
|
|
183
|
+
|
|
184
|
+
enhanced_result = FixResult(
|
|
185
|
+
success=result.success,
|
|
186
|
+
confidence=min(
|
|
187
|
+
result.confidence + 0.1, 1.0
|
|
188
|
+
), # Slight confidence boost for external validation
|
|
189
|
+
fixes_applied=result.fixes_applied.copy(),
|
|
190
|
+
remaining_issues=result.remaining_issues.copy(),
|
|
191
|
+
recommendations=result.recommendations + validation_recommendations,
|
|
192
|
+
files_modified=result.files_modified.copy(),
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return enhanced_result
|
|
196
|
+
|
|
197
|
+
def _update_consultation_stats(
|
|
198
|
+
self, strategic_consultations: dict[str, t.Any], result: FixResult
|
|
199
|
+
) -> None:
|
|
200
|
+
"""Update statistics about external consultations."""
|
|
201
|
+
if strategic_consultations.get("crackerjack_architect_guidance"):
|
|
202
|
+
if result.success and result.confidence > 0.8:
|
|
203
|
+
self._external_consultation_stats["improvements_achieved"] += 1
|
|
204
|
+
|
|
205
|
+
async def _handle_with_single_agent_enhanced(
|
|
206
|
+
self, agent: t.Any, issue: Issue
|
|
207
|
+
) -> FixResult:
|
|
208
|
+
"""Enhanced single agent handling with external consultation."""
|
|
209
|
+
# Check if this agent should consult external experts
|
|
210
|
+
internal_result = await super()._handle_with_single_agent(agent, issue)
|
|
211
|
+
|
|
212
|
+
# If the agent is proactive and has external consultation capability, enhance it
|
|
213
|
+
if (
|
|
214
|
+
hasattr(agent, "claude_bridge")
|
|
215
|
+
and self.external_agents_enabled
|
|
216
|
+
and not internal_result.success
|
|
217
|
+
):
|
|
218
|
+
# Try external consultation for failed fixes
|
|
219
|
+
recommended_agents = self.claude_bridge.get_recommended_external_agents(
|
|
220
|
+
issue
|
|
221
|
+
)
|
|
222
|
+
if recommended_agents:
|
|
223
|
+
self._external_consultation_stats["consultations_requested"] += 1
|
|
224
|
+
|
|
225
|
+
# Consult the top recommended external agent
|
|
226
|
+
consultation = await self.claude_bridge.consult_external_agent(
|
|
227
|
+
issue, recommended_agents[0]
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
if consultation.get("status") == "success":
|
|
231
|
+
self._external_consultation_stats["consultations_successful"] += 1
|
|
232
|
+
enhanced_result = self.claude_bridge.create_enhanced_fix_result(
|
|
233
|
+
internal_result, [consultation]
|
|
234
|
+
)
|
|
235
|
+
return enhanced_result
|
|
236
|
+
|
|
237
|
+
return internal_result
|
|
238
|
+
|
|
239
|
+
def get_enhanced_agent_capabilities(self) -> dict[str, dict[str, t.Any]]:
|
|
240
|
+
"""Get capabilities including external agent integration."""
|
|
241
|
+
base_capabilities = self.get_agent_capabilities()
|
|
242
|
+
|
|
243
|
+
# Add information about external agent integration
|
|
244
|
+
enhanced_info = {
|
|
245
|
+
"external_agents_enabled": self.external_agents_enabled,
|
|
246
|
+
"available_external_agents": [
|
|
247
|
+
agent
|
|
248
|
+
for agent in (
|
|
249
|
+
"crackerjack-architect",
|
|
250
|
+
"python-pro",
|
|
251
|
+
"security-auditor",
|
|
252
|
+
"refactoring-specialist",
|
|
253
|
+
"crackerjack-test-specialist",
|
|
254
|
+
)
|
|
255
|
+
if self.claude_bridge.verify_agent_availability(agent)
|
|
256
|
+
],
|
|
257
|
+
"consultation_stats": self.get_external_consultation_stats(),
|
|
258
|
+
"claude_code_bridge": {
|
|
259
|
+
"agent_mapping_coverage": len(self.claude_bridge._get_agent_mapping()),
|
|
260
|
+
"consultation_threshold": self.claude_bridge._get_consultation_threshold(),
|
|
261
|
+
},
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return base_capabilities | {"_enhanced_coordinator_info": enhanced_info}
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def create_enhanced_coordinator(
|
|
268
|
+
context: AgentContext, cache: t.Any = None, enable_external_agents: bool = True
|
|
269
|
+
) -> EnhancedAgentCoordinator:
|
|
270
|
+
"""
|
|
271
|
+
Factory function to create an enhanced coordinator.
|
|
272
|
+
|
|
273
|
+
This function provides a clean interface for creating coordinators
|
|
274
|
+
with external agent integration while maintaining compatibility
|
|
275
|
+
with existing code.
|
|
276
|
+
"""
|
|
277
|
+
return EnhancedAgentCoordinator(
|
|
278
|
+
context=context, cache=cache, enable_external_agents=enable_external_agents
|
|
279
|
+
)
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enhanced proactive agent that integrates Claude Code external agent consultation.
|
|
3
|
+
|
|
4
|
+
This module extends the base ProactiveAgent to consult with Claude Code's external
|
|
5
|
+
agents (like crackerjack-architect, python-pro, security-auditor) when handling
|
|
6
|
+
complex issues that require specialized expertise.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import typing as t
|
|
10
|
+
from abc import abstractmethod
|
|
11
|
+
|
|
12
|
+
from .base import AgentContext, FixResult, Issue
|
|
13
|
+
from .claude_code_bridge import ClaudeCodeBridge
|
|
14
|
+
from .proactive_agent import ProactiveAgent
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class EnhancedProactiveAgent(ProactiveAgent):
|
|
18
|
+
"""
|
|
19
|
+
Proactive agent enhanced with Claude Code external agent consultation.
|
|
20
|
+
|
|
21
|
+
This agent follows the standard crackerjack agent pattern but adds intelligent
|
|
22
|
+
consultation with external Claude Code agents for complex scenarios that
|
|
23
|
+
require specialized expertise.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, context: AgentContext) -> None:
|
|
27
|
+
super().__init__(context)
|
|
28
|
+
self.claude_bridge = ClaudeCodeBridge(context)
|
|
29
|
+
self._external_consultation_enabled = True
|
|
30
|
+
|
|
31
|
+
def enable_external_consultation(self, enabled: bool = True) -> None:
|
|
32
|
+
"""Enable or disable external Claude Code agent consultation."""
|
|
33
|
+
self._external_consultation_enabled = enabled
|
|
34
|
+
|
|
35
|
+
async def _execute_with_plan(
|
|
36
|
+
self, issue: Issue, plan: dict[str, t.Any]
|
|
37
|
+
) -> FixResult:
|
|
38
|
+
"""
|
|
39
|
+
Execute fix with plan, consulting external agents when appropriate.
|
|
40
|
+
|
|
41
|
+
This method enhances the base implementation by:
|
|
42
|
+
1. First attempting the internal fix
|
|
43
|
+
2. Evaluating if external consultation would improve the result
|
|
44
|
+
3. Consulting with relevant Claude Code agents
|
|
45
|
+
4. Combining internal and external guidance for better results
|
|
46
|
+
"""
|
|
47
|
+
# First, get the internal fix result
|
|
48
|
+
internal_result = await self._execute_internal_fix(issue, plan)
|
|
49
|
+
|
|
50
|
+
# Determine if we should consult external agents
|
|
51
|
+
if not self._should_consult_external_agents(issue, internal_result, plan):
|
|
52
|
+
return internal_result
|
|
53
|
+
|
|
54
|
+
# Consult with relevant external agents
|
|
55
|
+
external_consultations = await self._consult_external_agents(issue, plan)
|
|
56
|
+
|
|
57
|
+
# Enhance the result with external guidance
|
|
58
|
+
enhanced_result = self._combine_internal_and_external_results(
|
|
59
|
+
internal_result, external_consultations
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return enhanced_result
|
|
63
|
+
|
|
64
|
+
async def _execute_internal_fix(
|
|
65
|
+
self, issue: Issue, plan: dict[str, t.Any]
|
|
66
|
+
) -> FixResult:
|
|
67
|
+
"""Execute the internal fix using the built-in agent logic."""
|
|
68
|
+
# This calls the concrete agent's analyze_and_fix implementation
|
|
69
|
+
return await self.analyze_and_fix(issue)
|
|
70
|
+
|
|
71
|
+
def _should_consult_external_agents(
|
|
72
|
+
self, issue: Issue, internal_result: FixResult, plan: dict[str, t.Any]
|
|
73
|
+
) -> bool:
|
|
74
|
+
"""Determine if external consultation would be beneficial."""
|
|
75
|
+
if not self._external_consultation_enabled:
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
# Consult external agents if:
|
|
79
|
+
# 1. Internal result has low confidence
|
|
80
|
+
# 2. Issue is complex and requires specialized expertise
|
|
81
|
+
# 3. Plan strategy indicates external specialist guidance
|
|
82
|
+
return (
|
|
83
|
+
self.claude_bridge.should_consult_external_agent(
|
|
84
|
+
issue, internal_result.confidence
|
|
85
|
+
)
|
|
86
|
+
or plan.get("strategy") == "external_specialist_guided"
|
|
87
|
+
or not internal_result.success
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
async def _consult_external_agents(
|
|
91
|
+
self, issue: Issue, plan: dict[str, t.Any]
|
|
92
|
+
) -> list[dict[str, t.Any]]:
|
|
93
|
+
"""Consult with relevant external Claude Code agents."""
|
|
94
|
+
recommended_agents = self.claude_bridge.get_recommended_external_agents(issue)
|
|
95
|
+
consultations = []
|
|
96
|
+
|
|
97
|
+
# Limit to top 2 agents to avoid overwhelming the system
|
|
98
|
+
for agent_name in recommended_agents[:2]:
|
|
99
|
+
if self.claude_bridge.verify_agent_availability(agent_name):
|
|
100
|
+
consultation = await self.claude_bridge.consult_external_agent(
|
|
101
|
+
issue, agent_name, {"plan": plan}
|
|
102
|
+
)
|
|
103
|
+
if consultation.get("status") == "success":
|
|
104
|
+
consultations.append(consultation)
|
|
105
|
+
|
|
106
|
+
return consultations
|
|
107
|
+
|
|
108
|
+
def _combine_internal_and_external_results(
|
|
109
|
+
self, internal_result: FixResult, external_consultations: list[dict[str, t.Any]]
|
|
110
|
+
) -> FixResult:
|
|
111
|
+
"""Combine internal fix result with external agent consultations."""
|
|
112
|
+
if not external_consultations:
|
|
113
|
+
return internal_result
|
|
114
|
+
|
|
115
|
+
# Use the bridge to create an enhanced result
|
|
116
|
+
enhanced_result = self.claude_bridge.create_enhanced_fix_result(
|
|
117
|
+
internal_result, external_consultations
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Add metadata about external consultation
|
|
121
|
+
enhanced_result.recommendations.insert(
|
|
122
|
+
0,
|
|
123
|
+
f"Enhanced with consultation from {len(external_consultations)} Claude Code agents",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
return enhanced_result
|
|
127
|
+
|
|
128
|
+
async def plan_before_action(self, issue: Issue) -> dict[str, t.Any]:
|
|
129
|
+
"""
|
|
130
|
+
Create a plan that considers both internal and external capabilities.
|
|
131
|
+
|
|
132
|
+
This method should be implemented by concrete agents to define their
|
|
133
|
+
specific planning logic while having access to external consultation.
|
|
134
|
+
"""
|
|
135
|
+
# Default implementation - concrete agents should override this
|
|
136
|
+
if self.claude_bridge.should_consult_external_agent(issue, 0.0):
|
|
137
|
+
return {
|
|
138
|
+
"strategy": "external_specialist_guided",
|
|
139
|
+
"approach": "consult_claude_code_experts",
|
|
140
|
+
"patterns": ["external_guidance"],
|
|
141
|
+
"validation": ["verify_with_external_agents"],
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
"strategy": "internal_pattern_based",
|
|
146
|
+
"approach": "apply_internal_logic",
|
|
147
|
+
"patterns": ["standard_patterns"],
|
|
148
|
+
"validation": ["run_internal_checks"],
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@abstractmethod
|
|
152
|
+
async def analyze_and_fix(self, issue: Issue) -> FixResult:
|
|
153
|
+
"""
|
|
154
|
+
Concrete agents must implement their specific fix logic.
|
|
155
|
+
|
|
156
|
+
This method contains the core agent-specific logic for analyzing
|
|
157
|
+
and fixing issues. The enhanced execution framework will automatically
|
|
158
|
+
handle external consultation when appropriate.
|
|
159
|
+
"""
|
|
160
|
+
pass
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# Convenience function to enhance existing agents
|
|
164
|
+
def enhance_agent_with_claude_code_bridge(
|
|
165
|
+
agent_class: type[ProactiveAgent],
|
|
166
|
+
) -> type[EnhancedProactiveAgent]:
|
|
167
|
+
"""
|
|
168
|
+
Enhance an existing ProactiveAgent class with Claude Code external consultation.
|
|
169
|
+
|
|
170
|
+
This function creates a new class that inherits from both the original agent
|
|
171
|
+
and EnhancedProactiveAgent, providing external consultation capabilities
|
|
172
|
+
while preserving the original agent's logic.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
class EnhancedAgent(EnhancedProactiveAgent, agent_class): # type: ignore[misc,valid-type]
|
|
176
|
+
def __init__(self, context: AgentContext) -> None:
|
|
177
|
+
# Initialize both parent classes
|
|
178
|
+
EnhancedProactiveAgent.__init__(self, context)
|
|
179
|
+
agent_class.__init__(self, context)
|
|
180
|
+
|
|
181
|
+
# Preserve the original class name and metadata
|
|
182
|
+
EnhancedAgent.__name__ = f"Enhanced{agent_class.__name__}"
|
|
183
|
+
EnhancedAgent.__qualname__ = f"Enhanced{agent_class.__qualname__}"
|
|
184
|
+
|
|
185
|
+
return EnhancedAgent
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Shared error-handling middleware helpers for agents."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import typing as t
|
|
6
|
+
from functools import wraps
|
|
7
|
+
|
|
8
|
+
from acb.console import Console
|
|
9
|
+
|
|
10
|
+
from crackerjack.agents.base import FixResult, Issue, SubAgent
|
|
11
|
+
|
|
12
|
+
if t.TYPE_CHECKING: # pragma: no cover - typing helpers
|
|
13
|
+
from crackerjack.agents.coordinator import AgentCoordinator
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def agent_error_boundary(
|
|
17
|
+
func: t.Callable[..., t.Awaitable[FixResult]],
|
|
18
|
+
) -> t.Callable[..., t.Awaitable[FixResult]]:
|
|
19
|
+
"""Decorator that centralizes error handling for agent execution.
|
|
20
|
+
|
|
21
|
+
Ensures all agent failures are logged consistently and converted into a
|
|
22
|
+
``FixResult`` that upstream orchestrators can reason about without custom
|
|
23
|
+
``try``/``except`` blocks.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@wraps(func)
|
|
27
|
+
async def wrapper(
|
|
28
|
+
self: AgentCoordinator,
|
|
29
|
+
agent: SubAgent,
|
|
30
|
+
issue: Issue,
|
|
31
|
+
*args: t.Any,
|
|
32
|
+
**kwargs: t.Any,
|
|
33
|
+
) -> FixResult:
|
|
34
|
+
try:
|
|
35
|
+
return await func(self, agent, issue, *args, **kwargs)
|
|
36
|
+
except Exception as exc: # pragma: no cover - exercised via decorator tests
|
|
37
|
+
console: Console | None = getattr(self.context, "console", None)
|
|
38
|
+
message = f"{agent.name} encountered an error while processing issue {issue.id}: {exc}"
|
|
39
|
+
self.logger.exception(message, exc_info=exc)
|
|
40
|
+
if console is not None:
|
|
41
|
+
console.print(f"[red]{message}[/red]")
|
|
42
|
+
|
|
43
|
+
return FixResult(
|
|
44
|
+
success=False,
|
|
45
|
+
confidence=0.0,
|
|
46
|
+
remaining_issues=[message],
|
|
47
|
+
recommendations=[
|
|
48
|
+
"Review agent logs for stack trace",
|
|
49
|
+
"Re-run with --debug to capture additional context",
|
|
50
|
+
],
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
return wrapper
|