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,497 @@
|
|
|
1
|
+
"""Main CLI handlers that were originally in the monolithic handlers.py file.
|
|
2
|
+
|
|
3
|
+
This module contains the core handler functions that coordinate the main CLI
|
|
4
|
+
workflows and need to be separated from monitoring-specific handlers.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import os
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
from acb.console import Console
|
|
15
|
+
from acb.depends import Inject, depends
|
|
16
|
+
|
|
17
|
+
from ..options import Options
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@depends.inject # type: ignore[misc]
|
|
21
|
+
def setup_ai_agent_env(
|
|
22
|
+
ai_agent: bool, debug_mode: bool = False, console: Inject[Console] = None
|
|
23
|
+
) -> None:
|
|
24
|
+
if debug_mode:
|
|
25
|
+
os.environ["CRACKERJACK_DEBUG"] = "1"
|
|
26
|
+
|
|
27
|
+
if ai_agent:
|
|
28
|
+
os.environ["AI_AGENT"] = "1"
|
|
29
|
+
|
|
30
|
+
if debug_mode:
|
|
31
|
+
os.environ["AI_AGENT_DEBUG"] = "1"
|
|
32
|
+
os.environ["AI_AGENT_VERBOSE"] = "1"
|
|
33
|
+
|
|
34
|
+
console.print(
|
|
35
|
+
"[bold cyan]๐ AI Agent Debug Mode Configuration: [/ bold cyan]",
|
|
36
|
+
)
|
|
37
|
+
console.print(f" โข AI Agent: {'โ
Enabled' if ai_agent else 'โ Disabled'}")
|
|
38
|
+
console.print(
|
|
39
|
+
f" โข Debug Mode: {'โ
Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else 'โ Disabled'}",
|
|
40
|
+
)
|
|
41
|
+
console.print(
|
|
42
|
+
f" โข Verbose Mode: {'โ
Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else 'โ Disabled'}",
|
|
43
|
+
)
|
|
44
|
+
console.print(" โข Enhanced logging will be available during execution")
|
|
45
|
+
elif debug_mode: # Handle debug mode without AI agent
|
|
46
|
+
os.environ["AI_AGENT_DEBUG"] = "1"
|
|
47
|
+
os.environ["AI_AGENT_VERBOSE"] = "1"
|
|
48
|
+
console.print(
|
|
49
|
+
"[bold cyan]๐ AI Debug Mode Configuration: [/ bold cyan]",
|
|
50
|
+
)
|
|
51
|
+
console.print(
|
|
52
|
+
f" โข Debug Mode: {'โ
Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else 'โ Disabled'}",
|
|
53
|
+
)
|
|
54
|
+
console.print(
|
|
55
|
+
f" โข Verbose Mode: {'โ
Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else 'โ Disabled'}",
|
|
56
|
+
)
|
|
57
|
+
console.print(" โข Structured logging enabled for debugging")
|
|
58
|
+
|
|
59
|
+
# Set up structured logging if debug or ai_agent is enabled
|
|
60
|
+
if ai_agent or debug_mode:
|
|
61
|
+
from crackerjack.services.logging import setup_structured_logging
|
|
62
|
+
|
|
63
|
+
setup_structured_logging(level="DEBUG", json_output=True)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@depends.inject # type: ignore[misc]
|
|
67
|
+
def handle_interactive_mode(options: Options, console: Inject[Console] = None) -> None:
|
|
68
|
+
from crackerjack.cli.version import get_package_version
|
|
69
|
+
|
|
70
|
+
from ..interactive import launch_interactive_cli
|
|
71
|
+
|
|
72
|
+
pkg_version = get_package_version()
|
|
73
|
+
launch_interactive_cli(pkg_version, options)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@depends.inject # type: ignore[misc]
|
|
77
|
+
def handle_standard_mode(
|
|
78
|
+
options: Options,
|
|
79
|
+
async_mode: bool,
|
|
80
|
+
job_id: str | None = None,
|
|
81
|
+
orchestrated: bool = False,
|
|
82
|
+
console: Inject[Console] = None,
|
|
83
|
+
) -> None:
|
|
84
|
+
# Run the async configure method in an isolated event loop
|
|
85
|
+
|
|
86
|
+
from crackerjack.executors.hook_lock_manager import hook_lock_manager
|
|
87
|
+
|
|
88
|
+
# Call the synchronous method directly
|
|
89
|
+
hook_lock_manager.configure_from_options(options)
|
|
90
|
+
|
|
91
|
+
# Phase 4.2 COMPLETE: ACB workflows are now the default
|
|
92
|
+
# Use --use-legacy-orchestrator to opt out and use the old orchestration system
|
|
93
|
+
if not getattr(options, "use_legacy_orchestrator", False):
|
|
94
|
+
# Default path: ACB workflow engine (Phase 4.2 complete)
|
|
95
|
+
# Only skip if user explicitly opted out with --use-legacy-orchestrator
|
|
96
|
+
handle_acb_workflow_mode(options, job_id, console)
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
# Legacy orchestrator path (only if use_legacy_orchestrator=True)
|
|
100
|
+
if orchestrated:
|
|
101
|
+
handle_orchestrated_mode(options, job_id)
|
|
102
|
+
|
|
103
|
+
# Default path: Legacy orchestrator (Phase 4.0 status)
|
|
104
|
+
if not orchestrated:
|
|
105
|
+
from crackerjack.core.async_workflow_orchestrator import (
|
|
106
|
+
AsyncWorkflowOrchestrator,
|
|
107
|
+
)
|
|
108
|
+
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
109
|
+
|
|
110
|
+
pkg_path = Path.cwd()
|
|
111
|
+
|
|
112
|
+
if async_mode:
|
|
113
|
+
async_orchestrator = AsyncWorkflowOrchestrator(
|
|
114
|
+
console=console,
|
|
115
|
+
pkg_path=pkg_path,
|
|
116
|
+
dry_run=getattr(options, "dry_run", False),
|
|
117
|
+
web_job_id=job_id,
|
|
118
|
+
verbose=options.verbose,
|
|
119
|
+
debug=getattr(options, "debug", False),
|
|
120
|
+
changed_only=getattr(options, "changed_only", False),
|
|
121
|
+
)
|
|
122
|
+
success = asyncio.run(
|
|
123
|
+
async_orchestrator.run_complete_workflow_async(options)
|
|
124
|
+
)
|
|
125
|
+
else:
|
|
126
|
+
sync_orchestrator = WorkflowOrchestrator(
|
|
127
|
+
pkg_path=pkg_path,
|
|
128
|
+
dry_run=getattr(options, "dry_run", False),
|
|
129
|
+
web_job_id=job_id,
|
|
130
|
+
verbose=options.verbose,
|
|
131
|
+
debug=getattr(options, "debug", False),
|
|
132
|
+
changed_only=getattr(options, "changed_only", False),
|
|
133
|
+
)
|
|
134
|
+
success = sync_orchestrator.run_complete_workflow_sync(options)
|
|
135
|
+
|
|
136
|
+
if not success:
|
|
137
|
+
raise SystemExit(1)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@depends.inject # type: ignore[misc]
|
|
141
|
+
def handle_acb_workflow_mode(
|
|
142
|
+
options: Options,
|
|
143
|
+
job_id: str | None = None,
|
|
144
|
+
console: Inject[Console] = None,
|
|
145
|
+
) -> None:
|
|
146
|
+
"""Execute workflow using ACB workflow engine (Phase 3 Production).
|
|
147
|
+
|
|
148
|
+
This handler routes execution to the CrackerjackWorkflowEngine using
|
|
149
|
+
the WorkflowContainerBuilder to set up the full DI container with all
|
|
150
|
+
28 services across 7 levels. Action handlers use WorkflowPipeline from
|
|
151
|
+
the container for production-quality workflow execution.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
options: CLI options with use_acb_workflows=True
|
|
155
|
+
job_id: Optional WebSocket job ID for progress tracking
|
|
156
|
+
console: Rich console for output
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
from acb.depends import depends
|
|
160
|
+
|
|
161
|
+
from crackerjack.events.workflow_bus import WorkflowEventBus
|
|
162
|
+
from crackerjack.workflows import (
|
|
163
|
+
CrackerjackWorkflowEngine,
|
|
164
|
+
EventBridgeAdapter,
|
|
165
|
+
WorkflowContainerBuilder,
|
|
166
|
+
register_actions,
|
|
167
|
+
select_workflow_for_options,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
console.print("[bold cyan]๐ Crackerjack Workflow Engine (ACB-Powered)[/bold cyan]")
|
|
171
|
+
|
|
172
|
+
try:
|
|
173
|
+
# Phase 4: ACB workflows are now the default!
|
|
174
|
+
console.print(
|
|
175
|
+
"[dim]Building DI container (28 services across 7 levels)...[/dim]"
|
|
176
|
+
)
|
|
177
|
+
builder = WorkflowContainerBuilder(options, console=console)
|
|
178
|
+
builder.build()
|
|
179
|
+
|
|
180
|
+
# Validate all services are available
|
|
181
|
+
health = builder.health_check()
|
|
182
|
+
if not health["all_available"]:
|
|
183
|
+
missing = ", ".join(health["missing"])
|
|
184
|
+
console.print(f"[yellow]โ ๏ธ Missing services: {missing}[/yellow]")
|
|
185
|
+
console.print(
|
|
186
|
+
"[yellow]Container health check failed, continuing with available services[/yellow]"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
console.print("[dim]โ DI container ready with WorkflowPipeline[/dim]")
|
|
190
|
+
|
|
191
|
+
# Register ACB Logger explicitly (needed for BasicWorkflowEngine)
|
|
192
|
+
from acb.logger import Logger
|
|
193
|
+
|
|
194
|
+
try:
|
|
195
|
+
logger = depends.get_sync(Logger)
|
|
196
|
+
except Exception:
|
|
197
|
+
# ACB Logger not available, this shouldn't happen but handle gracefully
|
|
198
|
+
import logging
|
|
199
|
+
|
|
200
|
+
logger = logging.getLogger("crackerjack")
|
|
201
|
+
depends.set(Logger, logger)
|
|
202
|
+
|
|
203
|
+
# Register WorkflowEventBus with DI container
|
|
204
|
+
event_bus = WorkflowEventBus()
|
|
205
|
+
depends.set(WorkflowEventBus, event_bus)
|
|
206
|
+
|
|
207
|
+
# Register EventBridgeAdapter BEFORE creating engine (engine needs it for DI!)
|
|
208
|
+
event_bridge = EventBridgeAdapter()
|
|
209
|
+
depends.set(EventBridgeAdapter, event_bridge)
|
|
210
|
+
|
|
211
|
+
# Initialize engine (EventBridgeAdapter will be injected)
|
|
212
|
+
engine = CrackerjackWorkflowEngine()
|
|
213
|
+
|
|
214
|
+
# Register action handlers with engine
|
|
215
|
+
register_actions(engine)
|
|
216
|
+
|
|
217
|
+
# Select workflow based on options (fast/comp/test/standard)
|
|
218
|
+
workflow = select_workflow_for_options(options)
|
|
219
|
+
|
|
220
|
+
console.print(f"[dim]Selected workflow: {workflow.name}[/dim]")
|
|
221
|
+
|
|
222
|
+
# Show orchestration status
|
|
223
|
+
from crackerjack.config import CrackerjackSettings
|
|
224
|
+
|
|
225
|
+
settings = depends.get_sync(CrackerjackSettings)
|
|
226
|
+
if settings.enable_orchestration:
|
|
227
|
+
mode_info = f" ({settings.orchestration_mode} mode)"
|
|
228
|
+
console.print(
|
|
229
|
+
f"[dim]Orchestration: [cyan]โก enabled[/cyan]{mode_info} - async hooks with caching[/dim]"
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
# Phase 4.1: Retrieve WorkflowPipeline from DI container (synchronous context)
|
|
233
|
+
# and pass it explicitly in workflow context to avoid async DI scope issues
|
|
234
|
+
from crackerjack.core.workflow_orchestrator import WorkflowPipeline
|
|
235
|
+
|
|
236
|
+
pipeline = depends.get_sync(WorkflowPipeline)
|
|
237
|
+
|
|
238
|
+
# Phase 4.2: All dependencies now use Inject[] instead of deprecated depends()
|
|
239
|
+
# This ensures they are properly resolved when retrieved from DI container
|
|
240
|
+
|
|
241
|
+
# Execute workflow with options and pipeline in context
|
|
242
|
+
result = asyncio.run(
|
|
243
|
+
engine.execute(
|
|
244
|
+
workflow,
|
|
245
|
+
context={
|
|
246
|
+
"options": options,
|
|
247
|
+
"pipeline": pipeline, # Pass pipeline with all dependencies properly resolved
|
|
248
|
+
},
|
|
249
|
+
)
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
# Check result and exit with appropriate code
|
|
253
|
+
from acb.workflows import WorkflowState
|
|
254
|
+
|
|
255
|
+
if result.state != WorkflowState.COMPLETED:
|
|
256
|
+
console.print(f"[red]Workflow failed: {result.error}[/red]")
|
|
257
|
+
raise SystemExit(1)
|
|
258
|
+
|
|
259
|
+
console.print("[bold green]โ Workflow completed successfully[/bold green]")
|
|
260
|
+
|
|
261
|
+
except Exception as e:
|
|
262
|
+
import traceback
|
|
263
|
+
|
|
264
|
+
console.print(f"[red]ACB workflow execution failed: {e}[/red]")
|
|
265
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
266
|
+
console.print("[yellow]Falling back to legacy orchestrator[/yellow]")
|
|
267
|
+
# Enable legacy orchestrator flag and retry
|
|
268
|
+
options.use_legacy_orchestrator = True
|
|
269
|
+
options.use_acb_workflows = False
|
|
270
|
+
handle_standard_mode(options, False, job_id, False, console)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
@depends.inject # type: ignore[misc]
|
|
274
|
+
def handle_orchestrated_mode(
|
|
275
|
+
options: Options, job_id: str | None = None, console: Inject[Console] = None
|
|
276
|
+
) -> None:
|
|
277
|
+
console.print("[bold bright_blue]๐ ORCHESTRATED MODE ENABLED[/ bold bright_blue]")
|
|
278
|
+
|
|
279
|
+
# Run the async configure method in an isolated event loop
|
|
280
|
+
|
|
281
|
+
from crackerjack.executors.hook_lock_manager import hook_lock_manager
|
|
282
|
+
|
|
283
|
+
# Call the synchronous method directly
|
|
284
|
+
hook_lock_manager.configure_from_options(options)
|
|
285
|
+
|
|
286
|
+
try:
|
|
287
|
+
from crackerjack.core.session_coordinator import SessionCoordinator
|
|
288
|
+
from crackerjack.orchestration.advanced_orchestrator import (
|
|
289
|
+
AdvancedWorkflowOrchestrator,
|
|
290
|
+
)
|
|
291
|
+
from crackerjack.orchestration.execution_strategies import (
|
|
292
|
+
AICoordinationMode,
|
|
293
|
+
ExecutionStrategy,
|
|
294
|
+
OrchestrationConfig,
|
|
295
|
+
ProgressLevel,
|
|
296
|
+
)
|
|
297
|
+
except ImportError as e:
|
|
298
|
+
console.print(f"[red]Orchestrated mode not available: {e}[/ red]")
|
|
299
|
+
console.print("[yellow]Falling back to standard mode[/ yellow]")
|
|
300
|
+
handle_standard_mode(options, False, job_id)
|
|
301
|
+
return
|
|
302
|
+
|
|
303
|
+
try:
|
|
304
|
+
strategy = ExecutionStrategy(options.orchestration_strategy)
|
|
305
|
+
except ValueError:
|
|
306
|
+
console.print(
|
|
307
|
+
f"[red]Invalid orchestration strategy: {options.orchestration_strategy}[/ red]",
|
|
308
|
+
)
|
|
309
|
+
strategy = ExecutionStrategy.ADAPTIVE
|
|
310
|
+
|
|
311
|
+
try:
|
|
312
|
+
progress = ProgressLevel(options.orchestration_progress)
|
|
313
|
+
except ValueError:
|
|
314
|
+
console.print(
|
|
315
|
+
f"[red]Invalid progress level: {options.orchestration_progress}[/ red]",
|
|
316
|
+
)
|
|
317
|
+
progress = ProgressLevel.GRANULAR
|
|
318
|
+
|
|
319
|
+
try:
|
|
320
|
+
ai_mode = AICoordinationMode(options.orchestration_ai_mode)
|
|
321
|
+
except ValueError:
|
|
322
|
+
console.print(f"[red]Invalid AI mode: {options.orchestration_ai_mode}[/ red]")
|
|
323
|
+
ai_mode = AICoordinationMode.SINGLE_AGENT
|
|
324
|
+
|
|
325
|
+
config = OrchestrationConfig(
|
|
326
|
+
execution_strategy=strategy,
|
|
327
|
+
progress_level=progress,
|
|
328
|
+
ai_coordination_mode=ai_mode,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
console.print(f"[cyan]Execution Strategy: [/ cyan] {strategy.value}")
|
|
332
|
+
console.print(f"[cyan]Progress Level: [/ cyan] {progress.value}")
|
|
333
|
+
console.print(f"[cyan]AI Coordination: [/ cyan] {ai_mode.value}")
|
|
334
|
+
|
|
335
|
+
pkg_path = Path.cwd()
|
|
336
|
+
session = SessionCoordinator(console, pkg_path, web_job_id=job_id)
|
|
337
|
+
orchestrator = AdvancedWorkflowOrchestrator(console, pkg_path, session, config)
|
|
338
|
+
|
|
339
|
+
try:
|
|
340
|
+
success = asyncio.run(orchestrator.execute_orchestrated_workflow(options))
|
|
341
|
+
if success:
|
|
342
|
+
console.print(
|
|
343
|
+
"\n[bold green]๐ ORCHESTRATED WORKFLOW COMPLETED SUCCESSFULLY ![/ bold green]",
|
|
344
|
+
)
|
|
345
|
+
else:
|
|
346
|
+
console.print("\n[bold red]โ ORCHESTRATED WORKFLOW FAILED[/ bold red]")
|
|
347
|
+
sys.exit(1)
|
|
348
|
+
except KeyboardInterrupt:
|
|
349
|
+
console.print("\n[yellow]๐ Orchestrated workflow interrupted[/ yellow]")
|
|
350
|
+
sys.exit(130)
|
|
351
|
+
except Exception as e:
|
|
352
|
+
console.print(f"\n[red]๐ฅ Orchestrated workflow error: {e}[/ red]")
|
|
353
|
+
sys.exit(1)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
@depends.inject # type: ignore[misc]
|
|
357
|
+
def handle_config_updates(options: Options, console: Inject[Console] = None) -> None:
|
|
358
|
+
"""Handle configuration update commands."""
|
|
359
|
+
from crackerjack.services.quality.config_template import ConfigTemplateService
|
|
360
|
+
|
|
361
|
+
pkg_path = Path.cwd()
|
|
362
|
+
config_service = ConfigTemplateService(console, pkg_path)
|
|
363
|
+
|
|
364
|
+
if options.check_config_updates:
|
|
365
|
+
_handle_check_updates(config_service, pkg_path, console)
|
|
366
|
+
elif options.apply_config_updates:
|
|
367
|
+
_handle_apply_updates(
|
|
368
|
+
config_service, pkg_path, options.config_interactive, console
|
|
369
|
+
)
|
|
370
|
+
elif options.diff_config:
|
|
371
|
+
_handle_diff_config(config_service, pkg_path, options.diff_config, console)
|
|
372
|
+
elif options.refresh_cache:
|
|
373
|
+
_handle_refresh_cache(config_service, pkg_path, console)
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
@depends.inject # type: ignore[misc]
|
|
377
|
+
def _handle_check_updates(
|
|
378
|
+
config_service: ConfigTemplateService, pkg_path: Path, console: Inject[Console]
|
|
379
|
+
) -> None:
|
|
380
|
+
"""Handle checking for configuration updates."""
|
|
381
|
+
console.print("[bold cyan]๐ Checking for configuration updates...[/bold cyan]")
|
|
382
|
+
updates = config_service.check_updates(pkg_path)
|
|
383
|
+
|
|
384
|
+
if not updates:
|
|
385
|
+
console.print("[green]โ
No configuration templates available[/green]")
|
|
386
|
+
return
|
|
387
|
+
|
|
388
|
+
has_updates = any(update.needs_update for update in updates.values())
|
|
389
|
+
if not has_updates:
|
|
390
|
+
console.print("[green]โ
All configurations are up to date[/green]")
|
|
391
|
+
return
|
|
392
|
+
|
|
393
|
+
_display_available_updates(updates, console)
|
|
394
|
+
console.print("\nUse --apply-config-updates to apply these updates")
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
@depends.inject # type: ignore[misc]
|
|
398
|
+
def _handle_apply_updates(
|
|
399
|
+
config_service: ConfigTemplateService,
|
|
400
|
+
pkg_path: Path,
|
|
401
|
+
interactive: bool,
|
|
402
|
+
console: Inject[Console],
|
|
403
|
+
) -> None:
|
|
404
|
+
"""Handle applying configuration updates."""
|
|
405
|
+
console.print("[bold cyan]๐ง Applying configuration updates...[/bold cyan]")
|
|
406
|
+
updates = config_service.check_updates(pkg_path)
|
|
407
|
+
|
|
408
|
+
if not updates:
|
|
409
|
+
console.print("[yellow]โ ๏ธ No configuration templates available[/yellow]")
|
|
410
|
+
return
|
|
411
|
+
|
|
412
|
+
configs_to_update = _get_configs_needing_update(updates)
|
|
413
|
+
if not configs_to_update:
|
|
414
|
+
console.print("[green]โ
All configurations are already up to date[/green]")
|
|
415
|
+
return
|
|
416
|
+
|
|
417
|
+
success_count = _apply_config_updates_batch(
|
|
418
|
+
config_service, configs_to_update, pkg_path, interactive, console
|
|
419
|
+
)
|
|
420
|
+
_report_update_results(success_count, len(configs_to_update), console)
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
@depends.inject # type: ignore[misc]
|
|
424
|
+
def _handle_diff_config(
|
|
425
|
+
config_service: ConfigTemplateService,
|
|
426
|
+
pkg_path: Path,
|
|
427
|
+
config_type: str,
|
|
428
|
+
console: Inject[Console],
|
|
429
|
+
) -> None:
|
|
430
|
+
"""Handle showing configuration diff."""
|
|
431
|
+
console.print(f"[bold cyan]๐ Showing diff for {config_type}...[/bold cyan]")
|
|
432
|
+
diff_preview = config_service._generate_diff_preview(config_type, pkg_path)
|
|
433
|
+
console.print(f"\nChanges for {config_type}:")
|
|
434
|
+
console.print(diff_preview)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
@depends.inject # type: ignore[misc]
|
|
438
|
+
def _handle_refresh_cache(
|
|
439
|
+
config_service: ConfigTemplateService, pkg_path: Path, console: Inject[Console]
|
|
440
|
+
) -> None:
|
|
441
|
+
"""Handle refreshing cache."""
|
|
442
|
+
console.print("[bold cyan]๐งน Refreshing cache...[/bold cyan]")
|
|
443
|
+
config_service._invalidate_cache(pkg_path)
|
|
444
|
+
console.print("[green]โ
Cache refreshed[/green]")
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
@depends.inject # type: ignore[misc]
|
|
448
|
+
def _display_available_updates(
|
|
449
|
+
updates: dict[str, ConfigUpdateInfo], console: Inject[Console]
|
|
450
|
+
) -> None:
|
|
451
|
+
"""Display available configuration updates."""
|
|
452
|
+
console.print("[yellow]๐ Available updates:[/yellow]")
|
|
453
|
+
for config_type, update_info in updates.items():
|
|
454
|
+
if update_info.needs_update:
|
|
455
|
+
console.print(
|
|
456
|
+
f" โข {config_type}: {update_info.current_version} โ {update_info.latest_version}"
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
def _get_configs_needing_update(updates: dict[str, ConfigUpdateInfo]) -> list[str]:
|
|
461
|
+
"""Get list of configurations that need updates."""
|
|
462
|
+
return [
|
|
463
|
+
config_type
|
|
464
|
+
for config_type, update_info in updates.items()
|
|
465
|
+
if update_info.needs_update
|
|
466
|
+
]
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
@depends.inject # type: ignore[misc]
|
|
470
|
+
def _apply_config_updates_batch(
|
|
471
|
+
config_service: ConfigTemplateService,
|
|
472
|
+
configs: list[str],
|
|
473
|
+
pkg_path: Path,
|
|
474
|
+
interactive: bool,
|
|
475
|
+
console: Inject[Console],
|
|
476
|
+
) -> int:
|
|
477
|
+
"""Apply configuration updates in batch and return success count."""
|
|
478
|
+
success_count = 0
|
|
479
|
+
for config_type in configs:
|
|
480
|
+
if config_service.apply_update(config_type, pkg_path, interactive=interactive):
|
|
481
|
+
success_count += 1
|
|
482
|
+
return success_count
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
@depends.inject # type: ignore[misc]
|
|
486
|
+
def _report_update_results(
|
|
487
|
+
success_count: int, total_count: int, console: Inject[Console]
|
|
488
|
+
) -> None:
|
|
489
|
+
"""Report the results of configuration updates."""
|
|
490
|
+
if success_count == total_count:
|
|
491
|
+
console.print(
|
|
492
|
+
f"[green]โ
Successfully updated {success_count} configurations[/green]"
|
|
493
|
+
)
|
|
494
|
+
else:
|
|
495
|
+
console.print(
|
|
496
|
+
f"[yellow]โ ๏ธ Updated {success_count}/{total_count} configurations[/yellow]"
|
|
497
|
+
)
|