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,700 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
import typing as t
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from acb.console import Console
|
|
8
|
+
from acb.depends import Inject, depends
|
|
9
|
+
|
|
10
|
+
from .options import Options
|
|
11
|
+
|
|
12
|
+
if t.TYPE_CHECKING:
|
|
13
|
+
from crackerjack.services.quality.config_template import (
|
|
14
|
+
ConfigTemplateService,
|
|
15
|
+
ConfigUpdateInfo,
|
|
16
|
+
)
|
|
17
|
+
|
|
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:
|
|
23
|
+
if debug_mode:
|
|
24
|
+
os.environ["CRACKERJACK_DEBUG"] = "1"
|
|
25
|
+
|
|
26
|
+
if ai_agent:
|
|
27
|
+
os.environ["AI_AGENT"] = "1"
|
|
28
|
+
|
|
29
|
+
if debug_mode:
|
|
30
|
+
os.environ["AI_AGENT_DEBUG"] = "1"
|
|
31
|
+
os.environ["AI_AGENT_VERBOSE"] = "1"
|
|
32
|
+
|
|
33
|
+
console.print(
|
|
34
|
+
"[bold cyan]๐ AI Agent Debug Mode Configuration: [/ bold cyan]",
|
|
35
|
+
)
|
|
36
|
+
console.print(f" โข AI Agent: {'โ
Enabled' if ai_agent else 'โ Disabled'}")
|
|
37
|
+
console.print(
|
|
38
|
+
f" โข Debug Mode: {'โ
Enabled' if os.environ.get('AI_AGENT_DEBUG') == '1' else 'โ Disabled'}",
|
|
39
|
+
)
|
|
40
|
+
console.print(
|
|
41
|
+
f" โข Verbose Mode: {'โ
Enabled' if os.environ.get('AI_AGENT_VERBOSE') == '1' else 'โ Disabled'}",
|
|
42
|
+
)
|
|
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)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def handle_mcp_server(websocket_port: int | None = None) -> None:
|
|
66
|
+
from crackerjack.mcp.server import main as start_mcp_main
|
|
67
|
+
|
|
68
|
+
project_path = str(Path.cwd())
|
|
69
|
+
|
|
70
|
+
if websocket_port:
|
|
71
|
+
start_mcp_main(project_path, websocket_port)
|
|
72
|
+
else:
|
|
73
|
+
start_mcp_main(project_path)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@depends.inject # type: ignore[misc]
|
|
77
|
+
def handle_monitor_mode(
|
|
78
|
+
dev_mode: bool = False, console: Inject[Console] = None
|
|
79
|
+
) -> None:
|
|
80
|
+
from crackerjack.mcp.progress_monitor import run_progress_monitor
|
|
81
|
+
|
|
82
|
+
console.print("[bold cyan]๐ Starting Multi-Project Progress Monitor[/ bold cyan]")
|
|
83
|
+
console.print(
|
|
84
|
+
"[bold yellow]๐ With integrated Service Watchdog and WebSocket polling[/ bold yellow]",
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
asyncio.run(run_progress_monitor(dev_mode=dev_mode))
|
|
89
|
+
except KeyboardInterrupt:
|
|
90
|
+
console.print("\n[yellow]๐ Monitor stopped[/ yellow]")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@depends.inject # type: ignore[misc]
|
|
94
|
+
def handle_enhanced_monitor_mode(
|
|
95
|
+
dev_mode: bool = False, console: Inject[Console] = None
|
|
96
|
+
) -> None:
|
|
97
|
+
from crackerjack.mcp.enhanced_progress_monitor import run_enhanced_progress_monitor
|
|
98
|
+
|
|
99
|
+
console.print("[bold magenta]โจ Starting Enhanced Progress Monitor[/ bold magenta]")
|
|
100
|
+
console.print(
|
|
101
|
+
"[bold cyan]๐ With advanced MetricCard widgets and modern web UI patterns[/ bold cyan]",
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
try:
|
|
105
|
+
asyncio.run(run_enhanced_progress_monitor(dev_mode=dev_mode))
|
|
106
|
+
except KeyboardInterrupt:
|
|
107
|
+
console.print("\n[yellow]๐ Enhanced Monitor stopped[/ yellow]")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@depends.inject # type: ignore[misc]
|
|
111
|
+
def handle_dashboard_mode(
|
|
112
|
+
dev_mode: bool = False, console: Inject[Console] = None
|
|
113
|
+
) -> None:
|
|
114
|
+
from crackerjack.mcp.dashboard import run_dashboard
|
|
115
|
+
|
|
116
|
+
console.print("[bold green]๐ฏ Starting Comprehensive Dashboard[/ bold green]")
|
|
117
|
+
console.print(
|
|
118
|
+
"[bold cyan]๐ With system metrics, job tracking, and performance monitoring[/ bold cyan]",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
run_dashboard()
|
|
123
|
+
except KeyboardInterrupt:
|
|
124
|
+
console.print("\n[yellow]๐ Dashboard stopped[/ yellow]")
|
|
125
|
+
|
|
126
|
+
|
|
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:
|
|
131
|
+
from crackerjack.monitoring.websocket_server import CrackerjackMonitoringServer
|
|
132
|
+
|
|
133
|
+
console.print("[bold green]๐ Starting Unified Monitoring Dashboard[/bold green]")
|
|
134
|
+
console.print(
|
|
135
|
+
f"[bold cyan]๐ WebSocket server on port {port} with real-time streaming and web UI[/bold cyan]",
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
server = CrackerjackMonitoringServer()
|
|
140
|
+
asyncio.run(server.start_monitoring(port))
|
|
141
|
+
except KeyboardInterrupt:
|
|
142
|
+
console.print("\n[yellow]๐ Unified Dashboard stopped[/yellow]")
|
|
143
|
+
except Exception as e:
|
|
144
|
+
console.print(f"\n[red]โ Unified Dashboard failed: {e}[/red]")
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
@depends.inject # type: ignore[misc]
|
|
148
|
+
def handle_watchdog_mode(console: Inject[Console] = None) -> None:
|
|
149
|
+
from crackerjack.mcp.service_watchdog import main as start_watchdog
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
asyncio.run(start_watchdog())
|
|
153
|
+
except KeyboardInterrupt:
|
|
154
|
+
console.print("\n[yellow]๐ Watchdog stopped[/ yellow]")
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def handle_start_websocket_server(port: int = 8675) -> None:
|
|
158
|
+
from crackerjack.mcp.websocket.server import handle_websocket_server_command
|
|
159
|
+
|
|
160
|
+
handle_websocket_server_command(start=True, port=port)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def handle_stop_websocket_server() -> None:
|
|
164
|
+
from crackerjack.mcp.websocket.server import handle_websocket_server_command
|
|
165
|
+
|
|
166
|
+
handle_websocket_server_command(stop=True)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def handle_restart_websocket_server(port: int = 8675) -> None:
|
|
170
|
+
from crackerjack.mcp.websocket.server import handle_websocket_server_command
|
|
171
|
+
|
|
172
|
+
handle_websocket_server_command(restart=True, port=port)
|
|
173
|
+
|
|
174
|
+
|
|
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
|
+
)
|
|
181
|
+
|
|
182
|
+
console.print("[bold red]๐ Stopping MCP Servers[/ bold red]")
|
|
183
|
+
|
|
184
|
+
list_server_status(console)
|
|
185
|
+
|
|
186
|
+
if stop_all_servers(console):
|
|
187
|
+
console.print("\n[bold green]โ
All servers stopped successfully[/ bold green]")
|
|
188
|
+
else:
|
|
189
|
+
console.print("\n[bold red]โ Some servers failed to stop[/ bold red]")
|
|
190
|
+
raise SystemExit(1)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@depends.inject # type: ignore[misc]
|
|
194
|
+
def handle_restart_mcp_server(
|
|
195
|
+
websocket_port: int | None = None, console: Inject[Console] = None
|
|
196
|
+
) -> None:
|
|
197
|
+
from crackerjack.services.server_manager import restart_mcp_server
|
|
198
|
+
|
|
199
|
+
if restart_mcp_server(websocket_port, console):
|
|
200
|
+
console.print("\n[bold green]โ
MCP server restart completed[/ bold green]")
|
|
201
|
+
else:
|
|
202
|
+
console.print("\n[bold red]โ MCP server restart failed[/ bold red]")
|
|
203
|
+
raise SystemExit(1)
|
|
204
|
+
|
|
205
|
+
|
|
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:
|
|
210
|
+
"""Start Zuban LSP server."""
|
|
211
|
+
from crackerjack.services.zuban_lsp_service import (
|
|
212
|
+
create_zuban_lsp_service,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
console.print("[bold cyan]๐ Starting Zuban LSP Server[/bold cyan]")
|
|
216
|
+
|
|
217
|
+
async def _start() -> None:
|
|
218
|
+
lsp_service = await create_zuban_lsp_service(
|
|
219
|
+
port=port, mode=mode, console=console
|
|
220
|
+
)
|
|
221
|
+
if await lsp_service.start():
|
|
222
|
+
console.print(
|
|
223
|
+
f"[bold green]โ
Zuban LSP server started on port {port} ({mode} mode)[/bold green]"
|
|
224
|
+
)
|
|
225
|
+
else:
|
|
226
|
+
console.print("[bold red]โ Failed to start Zuban LSP server[/bold red]")
|
|
227
|
+
raise SystemExit(1)
|
|
228
|
+
|
|
229
|
+
try:
|
|
230
|
+
asyncio.run(_start())
|
|
231
|
+
except KeyboardInterrupt:
|
|
232
|
+
console.print("\n[yellow]๐ Zuban LSP startup interrupted[/yellow]")
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
@depends.inject # type: ignore[misc]
|
|
236
|
+
def handle_stop_zuban_lsp(console: Inject[Console] = None) -> None:
|
|
237
|
+
"""Stop Zuban LSP server."""
|
|
238
|
+
from crackerjack.services.server_manager import stop_zuban_lsp
|
|
239
|
+
|
|
240
|
+
console.print("[bold red]๐ Stopping Zuban LSP Server[/bold red]")
|
|
241
|
+
|
|
242
|
+
if stop_zuban_lsp(console):
|
|
243
|
+
console.print(
|
|
244
|
+
"\n[bold green]โ
Zuban LSP server stopped successfully[/bold green]"
|
|
245
|
+
)
|
|
246
|
+
else:
|
|
247
|
+
console.print("\n[bold red]โ Failed to stop Zuban LSP server[/bold red]")
|
|
248
|
+
raise SystemExit(1)
|
|
249
|
+
|
|
250
|
+
|
|
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:
|
|
255
|
+
"""Restart Zuban LSP server."""
|
|
256
|
+
from crackerjack.services.server_manager import restart_zuban_lsp
|
|
257
|
+
|
|
258
|
+
if restart_zuban_lsp(console):
|
|
259
|
+
console.print(
|
|
260
|
+
"\n[bold green]โ
Zuban LSP server restart completed[/bold green]"
|
|
261
|
+
)
|
|
262
|
+
else:
|
|
263
|
+
console.print("\n[bold red]โ Zuban LSP server restart failed[/bold red]")
|
|
264
|
+
raise SystemExit(1)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def handle_interactive_mode(options: Options) -> None:
|
|
268
|
+
from crackerjack.cli.version import get_package_version
|
|
269
|
+
|
|
270
|
+
from .interactive import launch_interactive_cli
|
|
271
|
+
|
|
272
|
+
pkg_version = get_package_version()
|
|
273
|
+
launch_interactive_cli(pkg_version, options)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
@depends.inject # type: ignore[misc]
|
|
277
|
+
def handle_standard_mode(
|
|
278
|
+
options: Options,
|
|
279
|
+
async_mode: bool,
|
|
280
|
+
job_id: str | None = None,
|
|
281
|
+
orchestrated: bool = False,
|
|
282
|
+
console: Inject[Console] = None,
|
|
283
|
+
) -> None:
|
|
284
|
+
# Run the async configure method in an isolated event loop
|
|
285
|
+
import asyncio
|
|
286
|
+
|
|
287
|
+
from crackerjack.executors.hook_lock_manager import hook_lock_manager
|
|
288
|
+
|
|
289
|
+
# Call the synchronous method directly
|
|
290
|
+
hook_lock_manager.configure_from_options(options)
|
|
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)
|
|
301
|
+
if orchestrated:
|
|
302
|
+
handle_orchestrated_mode(options, job_id)
|
|
303
|
+
|
|
304
|
+
# Default path: Legacy orchestrator (Phase 4.0 status)
|
|
305
|
+
if not orchestrated:
|
|
306
|
+
from crackerjack.core.async_workflow_orchestrator import (
|
|
307
|
+
AsyncWorkflowOrchestrator,
|
|
308
|
+
)
|
|
309
|
+
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
310
|
+
|
|
311
|
+
pkg_path = Path.cwd()
|
|
312
|
+
|
|
313
|
+
if async_mode:
|
|
314
|
+
async_orchestrator = AsyncWorkflowOrchestrator(
|
|
315
|
+
console=console,
|
|
316
|
+
pkg_path=pkg_path,
|
|
317
|
+
dry_run=getattr(options, "dry_run", False),
|
|
318
|
+
web_job_id=job_id,
|
|
319
|
+
verbose=options.verbose,
|
|
320
|
+
debug=getattr(options, "debug", False),
|
|
321
|
+
changed_only=getattr(options, "changed_only", False),
|
|
322
|
+
)
|
|
323
|
+
success = asyncio.run(
|
|
324
|
+
async_orchestrator.run_complete_workflow_async(options)
|
|
325
|
+
)
|
|
326
|
+
else:
|
|
327
|
+
sync_orchestrator = WorkflowOrchestrator(
|
|
328
|
+
pkg_path=pkg_path,
|
|
329
|
+
dry_run=getattr(options, "dry_run", False),
|
|
330
|
+
web_job_id=job_id,
|
|
331
|
+
verbose=options.verbose,
|
|
332
|
+
debug=getattr(options, "debug", False),
|
|
333
|
+
changed_only=getattr(options, "changed_only", False),
|
|
334
|
+
)
|
|
335
|
+
success = sync_orchestrator.run_complete_workflow_sync(options)
|
|
336
|
+
|
|
337
|
+
if not success:
|
|
338
|
+
raise SystemExit(1)
|
|
339
|
+
|
|
340
|
+
|
|
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]")
|
|
373
|
+
|
|
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:
|
|
479
|
+
console.print("[bold bright_blue]๐ ORCHESTRATED MODE ENABLED[/ bold bright_blue]")
|
|
480
|
+
|
|
481
|
+
# Run the async configure method in an isolated event loop
|
|
482
|
+
import asyncio
|
|
483
|
+
|
|
484
|
+
from crackerjack.executors.hook_lock_manager import hook_lock_manager
|
|
485
|
+
|
|
486
|
+
# Call the synchronous method directly
|
|
487
|
+
hook_lock_manager.configure_from_options(options)
|
|
488
|
+
|
|
489
|
+
try:
|
|
490
|
+
from crackerjack.core.session_coordinator import SessionCoordinator
|
|
491
|
+
from crackerjack.orchestration.advanced_orchestrator import (
|
|
492
|
+
AdvancedWorkflowOrchestrator,
|
|
493
|
+
)
|
|
494
|
+
from crackerjack.orchestration.execution_strategies import (
|
|
495
|
+
AICoordinationMode,
|
|
496
|
+
ExecutionStrategy,
|
|
497
|
+
OrchestrationConfig,
|
|
498
|
+
ProgressLevel,
|
|
499
|
+
)
|
|
500
|
+
except ImportError as e:
|
|
501
|
+
console.print(f"[red]Orchestrated mode not available: {e}[/ red]")
|
|
502
|
+
console.print("[yellow]Falling back to standard mode[/ yellow]")
|
|
503
|
+
handle_standard_mode(options, False, job_id)
|
|
504
|
+
return
|
|
505
|
+
|
|
506
|
+
try:
|
|
507
|
+
strategy = ExecutionStrategy(options.orchestration_strategy)
|
|
508
|
+
except ValueError:
|
|
509
|
+
console.print(
|
|
510
|
+
f"[red]Invalid orchestration strategy: {options.orchestration_strategy}[/ red]",
|
|
511
|
+
)
|
|
512
|
+
strategy = ExecutionStrategy.ADAPTIVE
|
|
513
|
+
|
|
514
|
+
try:
|
|
515
|
+
progress = ProgressLevel(options.orchestration_progress)
|
|
516
|
+
except ValueError:
|
|
517
|
+
console.print(
|
|
518
|
+
f"[red]Invalid progress level: {options.orchestration_progress}[/ red]",
|
|
519
|
+
)
|
|
520
|
+
progress = ProgressLevel.GRANULAR
|
|
521
|
+
|
|
522
|
+
try:
|
|
523
|
+
ai_mode = AICoordinationMode(options.orchestration_ai_mode)
|
|
524
|
+
except ValueError:
|
|
525
|
+
console.print(f"[red]Invalid AI mode: {options.orchestration_ai_mode}[/ red]")
|
|
526
|
+
ai_mode = AICoordinationMode.SINGLE_AGENT
|
|
527
|
+
|
|
528
|
+
config = OrchestrationConfig(
|
|
529
|
+
execution_strategy=strategy,
|
|
530
|
+
progress_level=progress,
|
|
531
|
+
ai_coordination_mode=ai_mode,
|
|
532
|
+
)
|
|
533
|
+
|
|
534
|
+
console.print(f"[cyan]Execution Strategy: [/ cyan] {strategy.value}")
|
|
535
|
+
console.print(f"[cyan]Progress Level: [/ cyan] {progress.value}")
|
|
536
|
+
console.print(f"[cyan]AI Coordination: [/ cyan] {ai_mode.value}")
|
|
537
|
+
|
|
538
|
+
pkg_path = Path.cwd()
|
|
539
|
+
session = SessionCoordinator(console, pkg_path, web_job_id=job_id)
|
|
540
|
+
orchestrator = AdvancedWorkflowOrchestrator(console, pkg_path, session, config)
|
|
541
|
+
|
|
542
|
+
try:
|
|
543
|
+
success = asyncio.run(orchestrator.execute_orchestrated_workflow(options))
|
|
544
|
+
if success:
|
|
545
|
+
console.print(
|
|
546
|
+
"\n[bold green]๐ ORCHESTRATED WORKFLOW COMPLETED SUCCESSFULLY ![/ bold green]",
|
|
547
|
+
)
|
|
548
|
+
else:
|
|
549
|
+
console.print("\n[bold red]โ ORCHESTRATED WORKFLOW FAILED[/ bold red]")
|
|
550
|
+
sys.exit(1)
|
|
551
|
+
except KeyboardInterrupt:
|
|
552
|
+
console.print("\n[yellow]๐ Orchestrated workflow interrupted[/ yellow]")
|
|
553
|
+
sys.exit(130)
|
|
554
|
+
except Exception as e:
|
|
555
|
+
console.print(f"\n[red]๐ฅ Orchestrated workflow error: {e}[/ red]")
|
|
556
|
+
sys.exit(1)
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
@depends.inject # type: ignore[misc]
|
|
560
|
+
def handle_config_updates(options: Options, console: Inject[Console] = None) -> None:
|
|
561
|
+
"""Handle configuration update commands."""
|
|
562
|
+
from crackerjack.services.quality.config_template import ConfigTemplateService
|
|
563
|
+
|
|
564
|
+
pkg_path = Path.cwd()
|
|
565
|
+
config_service = ConfigTemplateService(console, pkg_path)
|
|
566
|
+
|
|
567
|
+
if options.check_config_updates:
|
|
568
|
+
_handle_check_updates(config_service, pkg_path, console)
|
|
569
|
+
elif options.apply_config_updates:
|
|
570
|
+
_handle_apply_updates(
|
|
571
|
+
config_service, pkg_path, options.config_interactive, console
|
|
572
|
+
)
|
|
573
|
+
elif options.diff_config:
|
|
574
|
+
_handle_diff_config(config_service, pkg_path, options.diff_config, console)
|
|
575
|
+
elif options.refresh_cache:
|
|
576
|
+
_handle_refresh_cache(config_service, pkg_path, console)
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
@depends.inject # type: ignore[misc]
|
|
580
|
+
def _handle_check_updates(
|
|
581
|
+
config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
|
|
582
|
+
) -> None:
|
|
583
|
+
"""Handle checking for configuration updates."""
|
|
584
|
+
console.print("[bold cyan]๐ Checking for configuration updates...[/bold cyan]")
|
|
585
|
+
updates = config_service.check_updates(pkg_path)
|
|
586
|
+
|
|
587
|
+
if not updates:
|
|
588
|
+
console.print("[green]โ
No configuration templates available[/green]")
|
|
589
|
+
return
|
|
590
|
+
|
|
591
|
+
has_updates = any(update.needs_update for update in updates.values())
|
|
592
|
+
if not has_updates:
|
|
593
|
+
console.print("[green]โ
All configurations are up to date[/green]")
|
|
594
|
+
return
|
|
595
|
+
|
|
596
|
+
_display_available_updates(updates, console)
|
|
597
|
+
console.print("\nUse --apply-config-updates to apply these updates")
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
@depends.inject # type: ignore[misc]
|
|
601
|
+
def _handle_apply_updates(
|
|
602
|
+
config_service: "ConfigTemplateService",
|
|
603
|
+
pkg_path: Path,
|
|
604
|
+
interactive: bool,
|
|
605
|
+
console: Inject[Console],
|
|
606
|
+
) -> None:
|
|
607
|
+
"""Handle applying configuration updates."""
|
|
608
|
+
console.print("[bold cyan]๐ง Applying configuration updates...[/bold cyan]")
|
|
609
|
+
updates = config_service.check_updates(pkg_path)
|
|
610
|
+
|
|
611
|
+
if not updates:
|
|
612
|
+
console.print("[yellow]โ ๏ธ No configuration templates available[/yellow]")
|
|
613
|
+
return
|
|
614
|
+
|
|
615
|
+
configs_to_update = _get_configs_needing_update(updates)
|
|
616
|
+
if not configs_to_update:
|
|
617
|
+
console.print("[green]โ
All configurations are already up to date[/green]")
|
|
618
|
+
return
|
|
619
|
+
|
|
620
|
+
success_count = _apply_config_updates_batch(
|
|
621
|
+
config_service, configs_to_update, pkg_path, interactive, console
|
|
622
|
+
)
|
|
623
|
+
_report_update_results(success_count, len(configs_to_update), console)
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
@depends.inject # type: ignore[misc]
|
|
627
|
+
def _handle_diff_config(
|
|
628
|
+
config_service: "ConfigTemplateService",
|
|
629
|
+
pkg_path: Path,
|
|
630
|
+
config_type: str,
|
|
631
|
+
console: Inject[Console],
|
|
632
|
+
) -> None:
|
|
633
|
+
"""Handle showing configuration diff."""
|
|
634
|
+
console.print(f"[bold cyan]๐ Showing diff for {config_type}...[/bold cyan]")
|
|
635
|
+
diff_preview = config_service._generate_diff_preview(config_type, pkg_path)
|
|
636
|
+
console.print(f"\nChanges for {config_type}:")
|
|
637
|
+
console.print(diff_preview)
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
@depends.inject # type: ignore[misc]
|
|
641
|
+
def _handle_refresh_cache(
|
|
642
|
+
config_service: "ConfigTemplateService", pkg_path: Path, console: Inject[Console]
|
|
643
|
+
) -> None:
|
|
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]")
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
@depends.inject # type: ignore[misc]
|
|
651
|
+
def _display_available_updates(
|
|
652
|
+
updates: dict[str, "ConfigUpdateInfo"], console: Inject[Console]
|
|
653
|
+
) -> None:
|
|
654
|
+
"""Display available configuration updates."""
|
|
655
|
+
console.print("[yellow]๐ Available updates:[/yellow]")
|
|
656
|
+
for config_type, update_info in updates.items():
|
|
657
|
+
if update_info.needs_update:
|
|
658
|
+
console.print(
|
|
659
|
+
f" โข {config_type}: {update_info.current_version} โ {update_info.latest_version}"
|
|
660
|
+
)
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
def _get_configs_needing_update(updates: dict[str, "ConfigUpdateInfo"]) -> list[str]:
|
|
664
|
+
"""Get list of configurations that need updates."""
|
|
665
|
+
return [
|
|
666
|
+
config_type
|
|
667
|
+
for config_type, update_info in updates.items()
|
|
668
|
+
if update_info.needs_update
|
|
669
|
+
]
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
@depends.inject # type: ignore[misc]
|
|
673
|
+
def _apply_config_updates_batch(
|
|
674
|
+
config_service: "ConfigTemplateService",
|
|
675
|
+
configs: list[str],
|
|
676
|
+
pkg_path: Path,
|
|
677
|
+
interactive: bool,
|
|
678
|
+
console: Inject[Console],
|
|
679
|
+
) -> int:
|
|
680
|
+
"""Apply configuration updates in batch and return success count."""
|
|
681
|
+
success_count = 0
|
|
682
|
+
for config_type in configs:
|
|
683
|
+
if config_service.apply_update(config_type, pkg_path, interactive=interactive):
|
|
684
|
+
success_count += 1
|
|
685
|
+
return success_count
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
@depends.inject # type: ignore[misc]
|
|
689
|
+
def _report_update_results(
|
|
690
|
+
success_count: int, total_count: int, console: Inject[Console]
|
|
691
|
+
) -> None:
|
|
692
|
+
"""Report the results of configuration updates."""
|
|
693
|
+
if success_count == total_count:
|
|
694
|
+
console.print(
|
|
695
|
+
f"[green]โ
Successfully updated {success_count} configurations[/green]"
|
|
696
|
+
)
|
|
697
|
+
else:
|
|
698
|
+
console.print(
|
|
699
|
+
f"[yellow]โ ๏ธ Updated {success_count}/{total_count} configurations[/yellow]"
|
|
700
|
+
)
|