crackerjack 0.37.9__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 +30 -1
- crackerjack/__main__.py +342 -1263
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +27 -5
- 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/{rust_tool_manager.py → lsp/_manager.py} +3 -3
- crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
- crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
- 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 +40 -12
- crackerjack/agents/base.py +1 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +49 -53
- crackerjack/agents/dry_agent.py +187 -3
- 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 +6 -8
- 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/performance_agent.py +121 -1152
- crackerjack/agents/refactoring_agent.py +156 -655
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +19 -1605
- crackerjack/api.py +5 -7
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +1 -1
- crackerjack/cli/cache_handlers.py +23 -18
- crackerjack/cli/cache_handlers_enhanced.py +1 -4
- crackerjack/cli/facade.py +70 -8
- 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 +249 -49
- crackerjack/cli/interactive.py +8 -5
- crackerjack/cli/options.py +203 -110
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +60 -24
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +256 -0
- crackerjack/config/global_lock_config.py +191 -54
- crackerjack/config/hooks.py +188 -16
- 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/async_workflow_orchestrator.py +79 -53
- crackerjack/core/autofix_coordinator.py +22 -9
- crackerjack/core/container.py +10 -9
- crackerjack/core/enhanced_container.py +9 -9
- crackerjack/core/performance.py +1 -1
- crackerjack/core/performance_monitor.py +5 -3
- crackerjack/core/phase_coordinator.py +1018 -634
- crackerjack/core/proactive_workflow.py +3 -3
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +167 -23
- crackerjack/core/session_coordinator.py +187 -382
- crackerjack/core/timeout_manager.py +161 -44
- 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 +1247 -953
- 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/README.md +11 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/ai_templates.py +1 -1
- crackerjack/documentation/dual_output_generator.py +11 -9
- crackerjack/documentation/reference_generator.py +104 -59
- crackerjack/dynamic_config.py +52 -61
- crackerjack/errors.py +1 -1
- 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 +2 -0
- crackerjack/executors/async_hook_executor.py +539 -77
- crackerjack/executors/cached_hook_executor.py +3 -3
- crackerjack/executors/hook_executor.py +967 -102
- crackerjack/executors/hook_lock_manager.py +31 -22
- crackerjack/executors/individual_hook_executor.py +66 -32
- crackerjack/executors/lsp_aware_hook_executor.py +136 -57
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +23 -7
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +8 -9
- crackerjack/intelligence/README.md +557 -0
- crackerjack/interactive.py +37 -10
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/async_hook_manager.py +41 -57
- crackerjack/managers/hook_manager.py +449 -79
- crackerjack/managers/publish_manager.py +81 -36
- crackerjack/managers/test_command_builder.py +290 -12
- crackerjack/managers/test_executor.py +93 -8
- crackerjack/managers/test_manager.py +1082 -75
- crackerjack/managers/test_progress.py +118 -26
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/cache.py +25 -2
- crackerjack/mcp/client_runner.py +35 -18
- crackerjack/mcp/context.py +9 -9
- crackerjack/mcp/dashboard.py +24 -8
- crackerjack/mcp/enhanced_progress_monitor.py +34 -23
- crackerjack/mcp/file_monitor.py +27 -6
- crackerjack/mcp/progress_components.py +45 -34
- crackerjack/mcp/progress_monitor.py +6 -9
- crackerjack/mcp/rate_limiter.py +11 -7
- crackerjack/mcp/server.py +2 -0
- crackerjack/mcp/server_core.py +187 -55
- crackerjack/mcp/service_watchdog.py +12 -9
- crackerjack/mcp/task_manager.py +2 -2
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +2 -0
- crackerjack/mcp/tools/core_tools.py +75 -52
- crackerjack/mcp/tools/execution_tools.py +87 -31
- crackerjack/mcp/tools/intelligence_tools.py +2 -2
- crackerjack/mcp/tools/proactive_tools.py +1 -1
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +180 -132
- crackerjack/mcp/tools/workflow_executor.py +87 -46
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/app.py +11 -1
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +27 -4
- 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 +16 -2930
- crackerjack/mcp/websocket/server.py +1 -3
- crackerjack/mcp/websocket/websocket_handler.py +107 -6
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +10 -1
- crackerjack/models/config.py +639 -22
- crackerjack/models/config_adapter.py +6 -6
- crackerjack/models/protocols.py +1167 -23
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +19 -3
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/ai_agent_watchdog.py +5 -4
- crackerjack/monitoring/metrics_collector.py +4 -3
- crackerjack/monitoring/regression_prevention.py +4 -3
- crackerjack/monitoring/websocket_server.py +4 -241
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +20 -67
- 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 +13 -6
- crackerjack/orchestration/execution_strategies.py +6 -6
- 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 +1 -1
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/hooks.py +3 -2
- crackerjack/plugins/loader.py +3 -3
- crackerjack/plugins/managers.py +1 -1
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +8 -21
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
- 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/api_extractor.py +5 -3
- crackerjack/services/bounded_status_operations.py +45 -5
- crackerjack/services/cache.py +249 -318
- crackerjack/services/changelog_automation.py +7 -3
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +83 -39
- crackerjack/services/config_merge.py +9 -6
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +13 -26
- crackerjack/services/coverage_badge_service.py +6 -4
- crackerjack/services/coverage_ratchet.py +53 -27
- crackerjack/services/debug.py +18 -7
- crackerjack/services/dependency_analyzer.py +4 -4
- crackerjack/services/dependency_monitor.py +13 -13
- crackerjack/services/documentation_generator.py +4 -2
- crackerjack/services/documentation_service.py +62 -33
- crackerjack/services/enhanced_filesystem.py +81 -27
- crackerjack/services/enterprise_optimizer.py +1 -1
- crackerjack/services/error_pattern_analyzer.py +10 -10
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +5 -7
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +80 -109
- crackerjack/services/git.py +99 -5
- crackerjack/services/health_metrics.py +4 -6
- crackerjack/services/heatmap_generator.py +12 -3
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +101 -49
- crackerjack/services/log_manager.py +2 -2
- crackerjack/services/logging.py +120 -68
- crackerjack/services/lsp_client.py +12 -12
- crackerjack/services/memory_optimizer.py +27 -22
- 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/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
- crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
- crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
- crackerjack/services/parallel_executor.py +166 -55
- 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 +21 -8
- 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_baseline.py → quality/quality_baseline.py} +163 -2
- crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
- crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
- crackerjack/services/regex_patterns.py +58 -2987
- crackerjack/services/regex_utils.py +55 -29
- crackerjack/services/secure_status_formatter.py +42 -15
- crackerjack/services/secure_subprocess.py +35 -2
- crackerjack/services/security.py +16 -8
- crackerjack/services/server_manager.py +40 -51
- crackerjack/services/smart_scheduling.py +46 -6
- crackerjack/services/status_authentication.py +3 -3
- crackerjack/services/thread_safe_status_collector.py +1 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +9 -5
- crackerjack/services/unified_config.py +43 -351
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +6 -4
- crackerjack/services/version_checker.py +14 -8
- crackerjack/services/zuban_lsp_service.py +5 -4
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/init.md +2 -12
- crackerjack/slash_commands/run.md +84 -50
- 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_regex_patterns.py +7 -3
- crackerjack/ui/README.md +11 -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.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack/managers/test_manager_backup.py +0 -1075
- crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
- crackerjack/mixins/__init__.py +0 -3
- crackerjack/mixins/error_handling.py +0 -145
- crackerjack/services/config.py +0 -358
- crackerjack/ui/server_panels.py +0 -125
- crackerjack-0.37.9.dist-info/RECORD +0 -231
- /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
- /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
crackerjack/cli/handlers.py
CHANGED
|
@@ -4,18 +4,22 @@ import sys
|
|
|
4
4
|
import typing as t
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
|
-
from
|
|
7
|
+
from acb.console import Console
|
|
8
|
+
from acb.depends import Inject, depends
|
|
8
9
|
|
|
9
10
|
from .options import Options
|
|
10
11
|
|
|
11
12
|
if t.TYPE_CHECKING:
|
|
12
|
-
from crackerjack.services.config_template import (
|
|
13
|
+
from crackerjack.services.quality.config_template import (
|
|
13
14
|
ConfigTemplateService,
|
|
14
15
|
ConfigUpdateInfo,
|
|
15
16
|
)
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
@depends.inject # type: ignore[misc]
|
|
20
|
+
def setup_ai_agent_env(
|
|
21
|
+
ai_agent: bool, debug_mode: bool = False, console: Inject[Console] = None
|
|
22
|
+
) -> None:
|
|
19
23
|
if debug_mode:
|
|
20
24
|
os.environ["CRACKERJACK_DEBUG"] = "1"
|
|
21
25
|
|
|
@@ -26,7 +30,6 @@ def setup_ai_agent_env(ai_agent: bool, debug_mode: bool = False) -> None:
|
|
|
26
30
|
os.environ["AI_AGENT_DEBUG"] = "1"
|
|
27
31
|
os.environ["AI_AGENT_VERBOSE"] = "1"
|
|
28
32
|
|
|
29
|
-
console = Console()
|
|
30
33
|
console.print(
|
|
31
34
|
"[bold cyan]🐛 AI Agent Debug Mode Configuration: [/ bold cyan]",
|
|
32
35
|
)
|
|
@@ -38,6 +41,25 @@ def setup_ai_agent_env(ai_agent: bool, debug_mode: bool = False) -> None:
|
|
|
38
41
|
f" • Verbose Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else '❌ Disabled'}",
|
|
39
42
|
)
|
|
40
43
|
console.print(" • Enhanced logging will be available during execution")
|
|
44
|
+
elif debug_mode: # Handle debug mode without AI agent
|
|
45
|
+
os.environ["AI_AGENT_DEBUG"] = "1"
|
|
46
|
+
os.environ["AI_AGENT_VERBOSE"] = "1"
|
|
47
|
+
console.print(
|
|
48
|
+
"[bold cyan]🐛 AI Debug Mode Configuration: [/ bold cyan]",
|
|
49
|
+
)
|
|
50
|
+
console.print(
|
|
51
|
+
f" • Debug Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else '❌ Disabled'}",
|
|
52
|
+
)
|
|
53
|
+
console.print(
|
|
54
|
+
f" • Verbose Mode: {'✅ Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else '❌ Disabled'}",
|
|
55
|
+
)
|
|
56
|
+
console.print(" • Structured logging enabled for debugging")
|
|
57
|
+
|
|
58
|
+
# Set up structured logging if debug or ai_agent is enabled
|
|
59
|
+
if ai_agent or debug_mode:
|
|
60
|
+
from crackerjack.services.logging import setup_structured_logging
|
|
61
|
+
|
|
62
|
+
setup_structured_logging(level="DEBUG", json_output=True)
|
|
41
63
|
|
|
42
64
|
|
|
43
65
|
def handle_mcp_server(websocket_port: int | None = None) -> None:
|
|
@@ -51,10 +73,12 @@ def handle_mcp_server(websocket_port: int | None = None) -> None:
|
|
|
51
73
|
start_mcp_main(project_path)
|
|
52
74
|
|
|
53
75
|
|
|
54
|
-
|
|
76
|
+
@depends.inject # type: ignore[misc]
|
|
77
|
+
def handle_monitor_mode(
|
|
78
|
+
dev_mode: bool = False, console: Inject[Console] = None
|
|
79
|
+
) -> None:
|
|
55
80
|
from crackerjack.mcp.progress_monitor import run_progress_monitor
|
|
56
81
|
|
|
57
|
-
console = Console()
|
|
58
82
|
console.print("[bold cyan]🌟 Starting Multi-Project Progress Monitor[/ bold cyan]")
|
|
59
83
|
console.print(
|
|
60
84
|
"[bold yellow]🐕 With integrated Service Watchdog and WebSocket polling[/ bold yellow]",
|
|
@@ -66,10 +90,12 @@ def handle_monitor_mode(dev_mode: bool = False) -> None:
|
|
|
66
90
|
console.print("\n[yellow]🛑 Monitor stopped[/ yellow]")
|
|
67
91
|
|
|
68
92
|
|
|
69
|
-
|
|
93
|
+
@depends.inject # type: ignore[misc]
|
|
94
|
+
def handle_enhanced_monitor_mode(
|
|
95
|
+
dev_mode: bool = False, console: Inject[Console] = None
|
|
96
|
+
) -> None:
|
|
70
97
|
from crackerjack.mcp.enhanced_progress_monitor import run_enhanced_progress_monitor
|
|
71
98
|
|
|
72
|
-
console = Console()
|
|
73
99
|
console.print("[bold magenta]✨ Starting Enhanced Progress Monitor[/ bold magenta]")
|
|
74
100
|
console.print(
|
|
75
101
|
"[bold cyan]📊 With advanced MetricCard widgets and modern web UI patterns[/ bold cyan]",
|
|
@@ -81,10 +107,12 @@ def handle_enhanced_monitor_mode(dev_mode: bool = False) -> None:
|
|
|
81
107
|
console.print("\n[yellow]🛑 Enhanced Monitor stopped[/ yellow]")
|
|
82
108
|
|
|
83
109
|
|
|
84
|
-
|
|
110
|
+
@depends.inject # type: ignore[misc]
|
|
111
|
+
def handle_dashboard_mode(
|
|
112
|
+
dev_mode: bool = False, console: Inject[Console] = None
|
|
113
|
+
) -> None:
|
|
85
114
|
from crackerjack.mcp.dashboard import run_dashboard
|
|
86
115
|
|
|
87
|
-
console = Console()
|
|
88
116
|
console.print("[bold green]🎯 Starting Comprehensive Dashboard[/ bold green]")
|
|
89
117
|
console.print(
|
|
90
118
|
"[bold cyan]📈 With system metrics, job tracking, and performance monitoring[/ bold cyan]",
|
|
@@ -96,10 +124,12 @@ def handle_dashboard_mode(dev_mode: bool = False) -> None:
|
|
|
96
124
|
console.print("\n[yellow]🛑 Dashboard stopped[/ yellow]")
|
|
97
125
|
|
|
98
126
|
|
|
99
|
-
|
|
127
|
+
@depends.inject # type: ignore[misc]
|
|
128
|
+
def handle_unified_dashboard_mode(
|
|
129
|
+
port: int = 8675, dev_mode: bool = False, console: Inject[Console] = None
|
|
130
|
+
) -> None:
|
|
100
131
|
from crackerjack.monitoring.websocket_server import CrackerjackMonitoringServer
|
|
101
132
|
|
|
102
|
-
console = Console()
|
|
103
133
|
console.print("[bold green]🚀 Starting Unified Monitoring Dashboard[/bold green]")
|
|
104
134
|
console.print(
|
|
105
135
|
f"[bold cyan]🌐 WebSocket server on port {port} with real-time streaming and web UI[/bold cyan]",
|
|
@@ -114,10 +144,10 @@ def handle_unified_dashboard_mode(port: int = 8675, dev_mode: bool = False) -> N
|
|
|
114
144
|
console.print(f"\n[red]❌ Unified Dashboard failed: {e}[/red]")
|
|
115
145
|
|
|
116
146
|
|
|
117
|
-
|
|
147
|
+
@depends.inject # type: ignore[misc]
|
|
148
|
+
def handle_watchdog_mode(console: Inject[Console] = None) -> None:
|
|
118
149
|
from crackerjack.mcp.service_watchdog import main as start_watchdog
|
|
119
150
|
|
|
120
|
-
console = Console()
|
|
121
151
|
try:
|
|
122
152
|
asyncio.run(start_watchdog())
|
|
123
153
|
except KeyboardInterrupt:
|
|
@@ -142,10 +172,13 @@ def handle_restart_websocket_server(port: int = 8675) -> None:
|
|
|
142
172
|
handle_websocket_server_command(restart=True, port=port)
|
|
143
173
|
|
|
144
174
|
|
|
145
|
-
|
|
146
|
-
|
|
175
|
+
@depends.inject # type: ignore[misc]
|
|
176
|
+
def handle_stop_mcp_server(console: Inject[Console] = None) -> None:
|
|
177
|
+
from crackerjack.services.server_manager import (
|
|
178
|
+
list_server_status,
|
|
179
|
+
stop_all_servers,
|
|
180
|
+
)
|
|
147
181
|
|
|
148
|
-
console = Console()
|
|
149
182
|
console.print("[bold red]🛑 Stopping MCP Servers[/ bold red]")
|
|
150
183
|
|
|
151
184
|
list_server_status(console)
|
|
@@ -157,10 +190,12 @@ def handle_stop_mcp_server() -> None:
|
|
|
157
190
|
raise SystemExit(1)
|
|
158
191
|
|
|
159
192
|
|
|
160
|
-
|
|
193
|
+
@depends.inject # type: ignore[misc]
|
|
194
|
+
def handle_restart_mcp_server(
|
|
195
|
+
websocket_port: int | None = None, console: Inject[Console] = None
|
|
196
|
+
) -> None:
|
|
161
197
|
from crackerjack.services.server_manager import restart_mcp_server
|
|
162
198
|
|
|
163
|
-
console = Console()
|
|
164
199
|
if restart_mcp_server(websocket_port, console):
|
|
165
200
|
console.print("\n[bold green]✅ MCP server restart completed[/ bold green]")
|
|
166
201
|
else:
|
|
@@ -168,11 +203,15 @@ def handle_restart_mcp_server(websocket_port: int | None = None) -> None:
|
|
|
168
203
|
raise SystemExit(1)
|
|
169
204
|
|
|
170
205
|
|
|
171
|
-
|
|
206
|
+
@depends.inject # type: ignore[misc]
|
|
207
|
+
def handle_start_zuban_lsp(
|
|
208
|
+
port: int = 8677, mode: str = "tcp", console: Inject[Console] = None
|
|
209
|
+
) -> None:
|
|
172
210
|
"""Start Zuban LSP server."""
|
|
173
|
-
from crackerjack.services.zuban_lsp_service import
|
|
211
|
+
from crackerjack.services.zuban_lsp_service import (
|
|
212
|
+
create_zuban_lsp_service,
|
|
213
|
+
)
|
|
174
214
|
|
|
175
|
-
console = Console()
|
|
176
215
|
console.print("[bold cyan]🚀 Starting Zuban LSP Server[/bold cyan]")
|
|
177
216
|
|
|
178
217
|
async def _start() -> None:
|
|
@@ -193,11 +232,11 @@ def handle_start_zuban_lsp(port: int = 8677, mode: str = "tcp") -> None:
|
|
|
193
232
|
console.print("\n[yellow]🛑 Zuban LSP startup interrupted[/yellow]")
|
|
194
233
|
|
|
195
234
|
|
|
196
|
-
|
|
235
|
+
@depends.inject # type: ignore[misc]
|
|
236
|
+
def handle_stop_zuban_lsp(console: Inject[Console] = None) -> None:
|
|
197
237
|
"""Stop Zuban LSP server."""
|
|
198
238
|
from crackerjack.services.server_manager import stop_zuban_lsp
|
|
199
239
|
|
|
200
|
-
console = Console()
|
|
201
240
|
console.print("[bold red]🛑 Stopping Zuban LSP Server[/bold red]")
|
|
202
241
|
|
|
203
242
|
if stop_zuban_lsp(console):
|
|
@@ -209,11 +248,13 @@ def handle_stop_zuban_lsp() -> None:
|
|
|
209
248
|
raise SystemExit(1)
|
|
210
249
|
|
|
211
250
|
|
|
212
|
-
|
|
251
|
+
@depends.inject # type: ignore[misc]
|
|
252
|
+
def handle_restart_zuban_lsp(
|
|
253
|
+
port: int = 8677, mode: str = "tcp", console: Inject[Console] = None
|
|
254
|
+
) -> None:
|
|
213
255
|
"""Restart Zuban LSP server."""
|
|
214
256
|
from crackerjack.services.server_manager import restart_zuban_lsp
|
|
215
257
|
|
|
216
|
-
console = Console()
|
|
217
258
|
if restart_zuban_lsp(console):
|
|
218
259
|
console.print(
|
|
219
260
|
"\n[bold green]✅ Zuban LSP server restart completed[/bold green]"
|
|
@@ -224,7 +265,7 @@ def handle_restart_zuban_lsp(port: int = 8677, mode: str = "tcp") -> None:
|
|
|
224
265
|
|
|
225
266
|
|
|
226
267
|
def handle_interactive_mode(options: Options) -> None:
|
|
227
|
-
from crackerjack.cli.
|
|
268
|
+
from crackerjack.cli.version import get_package_version
|
|
228
269
|
|
|
229
270
|
from .interactive import launch_interactive_cli
|
|
230
271
|
|
|
@@ -232,23 +273,36 @@ def handle_interactive_mode(options: Options) -> None:
|
|
|
232
273
|
launch_interactive_cli(pkg_version, options)
|
|
233
274
|
|
|
234
275
|
|
|
276
|
+
@depends.inject # type: ignore[misc]
|
|
235
277
|
def handle_standard_mode(
|
|
236
278
|
options: Options,
|
|
237
279
|
async_mode: bool,
|
|
238
280
|
job_id: str | None = None,
|
|
239
281
|
orchestrated: bool = False,
|
|
282
|
+
console: Inject[Console] = None,
|
|
240
283
|
) -> None:
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
console = Console()
|
|
284
|
+
# Run the async configure method in an isolated event loop
|
|
285
|
+
import asyncio
|
|
244
286
|
|
|
245
287
|
from crackerjack.executors.hook_lock_manager import hook_lock_manager
|
|
246
288
|
|
|
289
|
+
# Call the synchronous method directly
|
|
247
290
|
hook_lock_manager.configure_from_options(options)
|
|
248
291
|
|
|
292
|
+
# Phase 4.2 COMPLETE: ACB workflows are now the default
|
|
293
|
+
# Use --use-legacy-orchestrator to opt out and use the old orchestration system
|
|
294
|
+
if not getattr(options, "use_legacy_orchestrator", False):
|
|
295
|
+
# Default path: ACB workflow engine (Phase 4.2 complete)
|
|
296
|
+
# Only skip if user explicitly opted out with --use-legacy-orchestrator
|
|
297
|
+
handle_acb_workflow_mode(options, job_id, console)
|
|
298
|
+
return
|
|
299
|
+
|
|
300
|
+
# Legacy orchestrator path (only if use_legacy_orchestrator=True)
|
|
249
301
|
if orchestrated:
|
|
250
302
|
handle_orchestrated_mode(options, job_id)
|
|
251
|
-
|
|
303
|
+
|
|
304
|
+
# Default path: Legacy orchestrator (Phase 4.0 status)
|
|
305
|
+
if not orchestrated:
|
|
252
306
|
from crackerjack.core.async_workflow_orchestrator import (
|
|
253
307
|
AsyncWorkflowOrchestrator,
|
|
254
308
|
)
|
|
@@ -264,18 +318,19 @@ def handle_standard_mode(
|
|
|
264
318
|
web_job_id=job_id,
|
|
265
319
|
verbose=options.verbose,
|
|
266
320
|
debug=getattr(options, "debug", False),
|
|
321
|
+
changed_only=getattr(options, "changed_only", False),
|
|
267
322
|
)
|
|
268
323
|
success = asyncio.run(
|
|
269
324
|
async_orchestrator.run_complete_workflow_async(options)
|
|
270
325
|
)
|
|
271
326
|
else:
|
|
272
327
|
sync_orchestrator = WorkflowOrchestrator(
|
|
273
|
-
console=console,
|
|
274
328
|
pkg_path=pkg_path,
|
|
275
329
|
dry_run=getattr(options, "dry_run", False),
|
|
276
330
|
web_job_id=job_id,
|
|
277
331
|
verbose=options.verbose,
|
|
278
332
|
debug=getattr(options, "debug", False),
|
|
333
|
+
changed_only=getattr(options, "changed_only", False),
|
|
279
334
|
)
|
|
280
335
|
success = sync_orchestrator.run_complete_workflow_sync(options)
|
|
281
336
|
|
|
@@ -283,14 +338,152 @@ def handle_standard_mode(
|
|
|
283
338
|
raise SystemExit(1)
|
|
284
339
|
|
|
285
340
|
|
|
286
|
-
|
|
287
|
-
|
|
341
|
+
@depends.inject # type: ignore[misc]
|
|
342
|
+
def handle_acb_workflow_mode(
|
|
343
|
+
options: Options,
|
|
344
|
+
job_id: str | None = None,
|
|
345
|
+
console: Inject[Console] = None,
|
|
346
|
+
) -> None:
|
|
347
|
+
"""Execute workflow using ACB workflow engine (Phase 3 Production).
|
|
348
|
+
|
|
349
|
+
This handler routes execution to the CrackerjackWorkflowEngine using
|
|
350
|
+
the WorkflowContainerBuilder to set up the full DI container with all
|
|
351
|
+
28 services across 7 levels. Action handlers use WorkflowPipeline from
|
|
352
|
+
the container for production-quality workflow execution.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
options: CLI options with use_acb_workflows=True
|
|
356
|
+
job_id: Optional WebSocket job ID for progress tracking
|
|
357
|
+
console: Rich console for output
|
|
358
|
+
"""
|
|
359
|
+
import asyncio
|
|
360
|
+
|
|
361
|
+
from acb.depends import depends
|
|
362
|
+
|
|
363
|
+
from crackerjack.events.workflow_bus import WorkflowEventBus
|
|
364
|
+
from crackerjack.workflows import (
|
|
365
|
+
CrackerjackWorkflowEngine,
|
|
366
|
+
EventBridgeAdapter,
|
|
367
|
+
WorkflowContainerBuilder,
|
|
368
|
+
register_actions,
|
|
369
|
+
select_workflow_for_options,
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
console.print("[bold cyan]🚀 Crackerjack Workflow Engine (ACB-Powered)[/bold cyan]")
|
|
288
373
|
|
|
289
|
-
|
|
374
|
+
try:
|
|
375
|
+
# Phase 4: ACB workflows are now the default!
|
|
376
|
+
console.print(
|
|
377
|
+
"[dim]Building DI container (28 services across 7 levels)...[/dim]"
|
|
378
|
+
)
|
|
379
|
+
builder = WorkflowContainerBuilder(options, console=console)
|
|
380
|
+
builder.build()
|
|
381
|
+
|
|
382
|
+
# Validate all services are available
|
|
383
|
+
health = builder.health_check()
|
|
384
|
+
if not health["all_available"]:
|
|
385
|
+
missing = ", ".join(health["missing"])
|
|
386
|
+
console.print(f"[yellow]⚠️ Missing services: {missing}[/yellow]")
|
|
387
|
+
console.print(
|
|
388
|
+
"[yellow]Container health check failed, continuing with available services[/yellow]"
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
console.print("[dim]✓ DI container ready with WorkflowPipeline[/dim]")
|
|
392
|
+
|
|
393
|
+
# Register ACB Logger explicitly (needed for BasicWorkflowEngine)
|
|
394
|
+
from acb.logger import Logger
|
|
395
|
+
|
|
396
|
+
try:
|
|
397
|
+
logger = depends.get_sync(Logger)
|
|
398
|
+
except Exception:
|
|
399
|
+
# ACB Logger not available, this shouldn't happen but handle gracefully
|
|
400
|
+
import logging
|
|
401
|
+
|
|
402
|
+
logger = logging.getLogger("crackerjack")
|
|
403
|
+
depends.set(Logger, logger)
|
|
404
|
+
|
|
405
|
+
# Register WorkflowEventBus with DI container
|
|
406
|
+
event_bus = WorkflowEventBus()
|
|
407
|
+
depends.set(WorkflowEventBus, event_bus)
|
|
408
|
+
|
|
409
|
+
# Register EventBridgeAdapter BEFORE creating engine (engine needs it for DI!)
|
|
410
|
+
event_bridge = EventBridgeAdapter()
|
|
411
|
+
depends.set(EventBridgeAdapter, event_bridge)
|
|
412
|
+
|
|
413
|
+
# Initialize engine (EventBridgeAdapter will be injected)
|
|
414
|
+
engine = CrackerjackWorkflowEngine()
|
|
415
|
+
|
|
416
|
+
# Register action handlers with engine
|
|
417
|
+
register_actions(engine)
|
|
418
|
+
|
|
419
|
+
# Select workflow based on options (fast/comp/test/standard)
|
|
420
|
+
workflow = select_workflow_for_options(options)
|
|
421
|
+
|
|
422
|
+
console.print(f"[dim]Selected workflow: {workflow.name}[/dim]")
|
|
423
|
+
|
|
424
|
+
# Show orchestration status
|
|
425
|
+
from crackerjack.config import CrackerjackSettings
|
|
426
|
+
|
|
427
|
+
settings = depends.get_sync(CrackerjackSettings)
|
|
428
|
+
if settings.enable_orchestration:
|
|
429
|
+
mode_info = f" ({settings.orchestration_mode} mode)"
|
|
430
|
+
console.print(
|
|
431
|
+
f"[dim]Orchestration: [cyan]⚡ enabled[/cyan]{mode_info} - async hooks with caching[/dim]"
|
|
432
|
+
)
|
|
433
|
+
|
|
434
|
+
# Phase 4.1: Retrieve WorkflowPipeline from DI container (synchronous context)
|
|
435
|
+
# and pass it explicitly in workflow context to avoid async DI scope issues
|
|
436
|
+
from crackerjack.core.workflow_orchestrator import WorkflowPipeline
|
|
437
|
+
|
|
438
|
+
pipeline = depends.get_sync(WorkflowPipeline)
|
|
439
|
+
|
|
440
|
+
# Phase 4.2: All dependencies now use Inject[] instead of deprecated depends()
|
|
441
|
+
# This ensures they are properly resolved when retrieved from DI container
|
|
442
|
+
|
|
443
|
+
# Execute workflow with options and pipeline in context
|
|
444
|
+
result = asyncio.run(
|
|
445
|
+
engine.execute(
|
|
446
|
+
workflow,
|
|
447
|
+
context={
|
|
448
|
+
"options": options,
|
|
449
|
+
"pipeline": pipeline, # Pass pipeline with all dependencies properly resolved
|
|
450
|
+
},
|
|
451
|
+
)
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
# Check result and exit with appropriate code
|
|
455
|
+
from acb.workflows import WorkflowState
|
|
456
|
+
|
|
457
|
+
if result.state != WorkflowState.COMPLETED:
|
|
458
|
+
console.print(f"[red]Workflow failed: {result.error}[/red]")
|
|
459
|
+
raise SystemExit(1)
|
|
460
|
+
|
|
461
|
+
console.print("[bold green]✓ Workflow completed successfully[/bold green]")
|
|
462
|
+
|
|
463
|
+
except Exception as e:
|
|
464
|
+
import traceback
|
|
465
|
+
|
|
466
|
+
console.print(f"[red]ACB workflow execution failed: {e}[/red]")
|
|
467
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
468
|
+
console.print("[yellow]Falling back to legacy orchestrator[/yellow]")
|
|
469
|
+
# Enable legacy orchestrator flag and retry
|
|
470
|
+
options.use_legacy_orchestrator = True
|
|
471
|
+
options.use_acb_workflows = False
|
|
472
|
+
handle_standard_mode(options, False, job_id, False, console)
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
@depends.inject # type: ignore[misc]
|
|
476
|
+
def handle_orchestrated_mode(
|
|
477
|
+
options: Options, job_id: str | None = None, console: Inject[Console] = None
|
|
478
|
+
) -> None:
|
|
290
479
|
console.print("[bold bright_blue]🚀 ORCHESTRATED MODE ENABLED[/ bold bright_blue]")
|
|
291
480
|
|
|
481
|
+
# Run the async configure method in an isolated event loop
|
|
482
|
+
import asyncio
|
|
483
|
+
|
|
292
484
|
from crackerjack.executors.hook_lock_manager import hook_lock_manager
|
|
293
485
|
|
|
486
|
+
# Call the synchronous method directly
|
|
294
487
|
hook_lock_manager.configure_from_options(options)
|
|
295
488
|
|
|
296
489
|
try:
|
|
@@ -363,11 +556,11 @@ def handle_orchestrated_mode(options: Options, job_id: str | None = None) -> Non
|
|
|
363
556
|
sys.exit(1)
|
|
364
557
|
|
|
365
558
|
|
|
366
|
-
|
|
559
|
+
@depends.inject # type: ignore[misc]
|
|
560
|
+
def handle_config_updates(options: Options, console: Inject[Console] = None) -> None:
|
|
367
561
|
"""Handle configuration update commands."""
|
|
368
|
-
from crackerjack.services.config_template import ConfigTemplateService
|
|
562
|
+
from crackerjack.services.quality.config_template import ConfigTemplateService
|
|
369
563
|
|
|
370
|
-
console = Console()
|
|
371
564
|
pkg_path = Path.cwd()
|
|
372
565
|
config_service = ConfigTemplateService(console, pkg_path)
|
|
373
566
|
|
|
@@ -383,8 +576,9 @@ def handle_config_updates(options: Options) -> None:
|
|
|
383
576
|
_handle_refresh_cache(config_service, pkg_path, console)
|
|
384
577
|
|
|
385
578
|
|
|
579
|
+
@depends.inject # type: ignore[misc]
|
|
386
580
|
def _handle_check_updates(
|
|
387
|
-
config_service: "ConfigTemplateService", pkg_path: Path, console: Console
|
|
581
|
+
config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
|
|
388
582
|
) -> None:
|
|
389
583
|
"""Handle checking for configuration updates."""
|
|
390
584
|
console.print("[bold cyan]🔍 Checking for configuration updates...[/bold cyan]")
|
|
@@ -403,11 +597,12 @@ def _handle_check_updates(
|
|
|
403
597
|
console.print("\nUse --apply-config-updates to apply these updates")
|
|
404
598
|
|
|
405
599
|
|
|
600
|
+
@depends.inject # type: ignore[misc]
|
|
406
601
|
def _handle_apply_updates(
|
|
407
602
|
config_service: "ConfigTemplateService",
|
|
408
603
|
pkg_path: Path,
|
|
409
604
|
interactive: bool,
|
|
410
|
-
console: Console,
|
|
605
|
+
console: Inject[Console],
|
|
411
606
|
) -> None:
|
|
412
607
|
"""Handle applying configuration updates."""
|
|
413
608
|
console.print("[bold cyan]🔧 Applying configuration updates...[/bold cyan]")
|
|
@@ -428,11 +623,12 @@ def _handle_apply_updates(
|
|
|
428
623
|
_report_update_results(success_count, len(configs_to_update), console)
|
|
429
624
|
|
|
430
625
|
|
|
626
|
+
@depends.inject # type: ignore[misc]
|
|
431
627
|
def _handle_diff_config(
|
|
432
628
|
config_service: "ConfigTemplateService",
|
|
433
629
|
pkg_path: Path,
|
|
434
630
|
config_type: str,
|
|
435
|
-
console: Console,
|
|
631
|
+
console: Inject[Console],
|
|
436
632
|
) -> None:
|
|
437
633
|
"""Handle showing configuration diff."""
|
|
438
634
|
console.print(f"[bold cyan]📊 Showing diff for {config_type}...[/bold cyan]")
|
|
@@ -441,17 +637,19 @@ def _handle_diff_config(
|
|
|
441
637
|
console.print(diff_preview)
|
|
442
638
|
|
|
443
639
|
|
|
640
|
+
@depends.inject # type: ignore[misc]
|
|
444
641
|
def _handle_refresh_cache(
|
|
445
|
-
config_service: "ConfigTemplateService", pkg_path: Path, console: Console
|
|
642
|
+
config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
|
|
446
643
|
) -> None:
|
|
447
|
-
"""Handle refreshing
|
|
448
|
-
console.print("[bold cyan]🧹 Refreshing
|
|
449
|
-
config_service.
|
|
450
|
-
console.print("[green]✅
|
|
644
|
+
"""Handle refreshing cache."""
|
|
645
|
+
console.print("[bold cyan]🧹 Refreshing cache...[/bold cyan]")
|
|
646
|
+
config_service._invalidate_cache(pkg_path)
|
|
647
|
+
console.print("[green]✅ Cache refreshed[/green]")
|
|
451
648
|
|
|
452
649
|
|
|
650
|
+
@depends.inject # type: ignore[misc]
|
|
453
651
|
def _display_available_updates(
|
|
454
|
-
updates: dict[str, "ConfigUpdateInfo"], console: Console
|
|
652
|
+
updates: dict[str, "ConfigUpdateInfo"], console: Inject[Console]
|
|
455
653
|
) -> None:
|
|
456
654
|
"""Display available configuration updates."""
|
|
457
655
|
console.print("[yellow]📋 Available updates:[/yellow]")
|
|
@@ -471,12 +669,13 @@ def _get_configs_needing_update(updates: dict[str, "ConfigUpdateInfo"]) -> list[
|
|
|
471
669
|
]
|
|
472
670
|
|
|
473
671
|
|
|
672
|
+
@depends.inject # type: ignore[misc]
|
|
474
673
|
def _apply_config_updates_batch(
|
|
475
674
|
config_service: "ConfigTemplateService",
|
|
476
675
|
configs: list[str],
|
|
477
676
|
pkg_path: Path,
|
|
478
677
|
interactive: bool,
|
|
479
|
-
console: Console,
|
|
678
|
+
console: Inject[Console],
|
|
480
679
|
) -> int:
|
|
481
680
|
"""Apply configuration updates in batch and return success count."""
|
|
482
681
|
success_count = 0
|
|
@@ -486,8 +685,9 @@ def _apply_config_updates_batch(
|
|
|
486
685
|
return success_count
|
|
487
686
|
|
|
488
687
|
|
|
688
|
+
@depends.inject # type: ignore[misc]
|
|
489
689
|
def _report_update_results(
|
|
490
|
-
success_count: int, total_count: int, console: Console
|
|
690
|
+
success_count: int, total_count: int, console: Inject[Console]
|
|
491
691
|
) -> None:
|
|
492
692
|
"""Report the results of configuration updates."""
|
|
493
693
|
if success_count == total_count:
|
crackerjack/cli/interactive.py
CHANGED
|
@@ -2,8 +2,9 @@ import time
|
|
|
2
2
|
import typing as t
|
|
3
3
|
from enum import Enum, auto
|
|
4
4
|
|
|
5
|
+
from acb.console import Console
|
|
6
|
+
from acb.depends import depends
|
|
5
7
|
from rich.box import ROUNDED
|
|
6
|
-
from rich.console import Console
|
|
7
8
|
from rich.layout import Layout
|
|
8
9
|
from rich.live import Live
|
|
9
10
|
from rich.panel import Panel
|
|
@@ -116,7 +117,7 @@ class InteractiveWorkflowManager:
|
|
|
116
117
|
deps = ["cleaning"] if options.clean else []
|
|
117
118
|
self.add_task(
|
|
118
119
|
"hooks",
|
|
119
|
-
"Run
|
|
120
|
+
"Run quality hooks (fast + comprehensive)",
|
|
120
121
|
"run_hooks_phase",
|
|
121
122
|
dependencies=deps,
|
|
122
123
|
)
|
|
@@ -383,8 +384,10 @@ class InteractiveWorkflowManager:
|
|
|
383
384
|
duration_text,
|
|
384
385
|
details,
|
|
385
386
|
)
|
|
387
|
+
from rich.panel import Panel
|
|
388
|
+
|
|
386
389
|
self.console.print("\n")
|
|
387
|
-
self.console.print(table)
|
|
390
|
+
self.console.print(Panel(table, border_style="magenta"))
|
|
388
391
|
if failed_count == 0:
|
|
389
392
|
self.console.print(
|
|
390
393
|
f"\n[bold green]🎉 Workflow completed ! {success_count} / {len(self.tasks)} tasks successful[/ bold green]",
|
|
@@ -398,8 +401,8 @@ class InteractiveWorkflowManager:
|
|
|
398
401
|
class InteractiveCLI:
|
|
399
402
|
def __init__(self, pkg_version: str, console: Console | None = None) -> None:
|
|
400
403
|
self.pkg_version = pkg_version
|
|
401
|
-
self.console = console or Console
|
|
402
|
-
self.orchestrator = WorkflowOrchestrator(
|
|
404
|
+
self.console = console or depends.get_sync(Console)
|
|
405
|
+
self.orchestrator = WorkflowOrchestrator()
|
|
403
406
|
self.workflow_manager = InteractiveWorkflowManager(
|
|
404
407
|
self.console,
|
|
405
408
|
self.orchestrator,
|