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
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
"""ACB workflow definitions for crackerjack.
|
|
2
|
+
|
|
3
|
+
This module defines declarative workflow structures for various execution modes
|
|
4
|
+
using ACB's WorkflowDefinition and WorkflowStep classes.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from acb.workflows import WorkflowDefinition, WorkflowStep
|
|
8
|
+
|
|
9
|
+
from crackerjack.models.protocols import OptionsProtocol
|
|
10
|
+
|
|
11
|
+
# Phase 1 POC: Fast hooks workflow
|
|
12
|
+
# This is the simplest workflow for proof of concept validation
|
|
13
|
+
FAST_HOOKS_WORKFLOW = WorkflowDefinition(
|
|
14
|
+
workflow_id="crackerjack-fast-hooks",
|
|
15
|
+
name="Fast Quality Checks",
|
|
16
|
+
description="Quick formatters, import sorting, and basic static analysis",
|
|
17
|
+
steps=[
|
|
18
|
+
WorkflowStep(
|
|
19
|
+
step_id="config",
|
|
20
|
+
name="Configuration",
|
|
21
|
+
action="run_configuration",
|
|
22
|
+
params={},
|
|
23
|
+
retry_attempts=1, # Config rarely needs retry
|
|
24
|
+
timeout=30.0, # Config is fast
|
|
25
|
+
),
|
|
26
|
+
WorkflowStep(
|
|
27
|
+
step_id="fast_hooks",
|
|
28
|
+
name="Fast Hooks",
|
|
29
|
+
action="run_fast_hooks",
|
|
30
|
+
params={},
|
|
31
|
+
depends_on=["config"], # Runs after config completes
|
|
32
|
+
retry_attempts=1, # No workflow-level retry (hook manager handles retries internally)
|
|
33
|
+
timeout=600.0, # Increased from 5 minutes to 10 minutes for fast hooks
|
|
34
|
+
),
|
|
35
|
+
],
|
|
36
|
+
timeout=1200.0, # Increased from 10 to 20 minutes total workflow timeout
|
|
37
|
+
retry_failed_steps=True,
|
|
38
|
+
continue_on_error=False, # Stop on first failure for POC
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Comprehensive hooks only workflow
|
|
42
|
+
# This workflow runs only comprehensive hooks (no fast hooks)
|
|
43
|
+
COMPREHENSIVE_HOOKS_WORKFLOW = WorkflowDefinition(
|
|
44
|
+
workflow_id="crackerjack-comprehensive-hooks",
|
|
45
|
+
name="Comprehensive Quality Checks",
|
|
46
|
+
description="Type checking, security scanning, and complexity analysis",
|
|
47
|
+
steps=[
|
|
48
|
+
WorkflowStep(
|
|
49
|
+
step_id="config",
|
|
50
|
+
name="Configuration",
|
|
51
|
+
action="run_configuration",
|
|
52
|
+
params={},
|
|
53
|
+
retry_attempts=1,
|
|
54
|
+
timeout=30.0,
|
|
55
|
+
),
|
|
56
|
+
WorkflowStep(
|
|
57
|
+
step_id="comprehensive",
|
|
58
|
+
name="Comprehensive Hooks",
|
|
59
|
+
action="run_comprehensive_hooks",
|
|
60
|
+
params={},
|
|
61
|
+
depends_on=["config"],
|
|
62
|
+
retry_attempts=0, # Comprehensive hooks run once (no automatic retry)
|
|
63
|
+
timeout=1800.0, # Increased from 15 to 30 minutes for comprehensive
|
|
64
|
+
),
|
|
65
|
+
],
|
|
66
|
+
timeout=2400.0, # Increased from 20 to 40 minutes total workflow timeout
|
|
67
|
+
retry_failed_steps=True,
|
|
68
|
+
continue_on_error=False,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# Phase 2: Standard workflow with phase-level parallelization
|
|
72
|
+
# This workflow demonstrates parallel execution of independent phases
|
|
73
|
+
STANDARD_WORKFLOW = WorkflowDefinition(
|
|
74
|
+
workflow_id="crackerjack-standard",
|
|
75
|
+
name="Standard Quality Workflow",
|
|
76
|
+
description="Full quality check workflow with parallel phase execution",
|
|
77
|
+
steps=[
|
|
78
|
+
WorkflowStep(
|
|
79
|
+
step_id="config",
|
|
80
|
+
name="Configuration",
|
|
81
|
+
action="run_configuration",
|
|
82
|
+
params={},
|
|
83
|
+
retry_attempts=1,
|
|
84
|
+
timeout=30.0,
|
|
85
|
+
),
|
|
86
|
+
# Fast hooks and cleaning run in parallel (both depend only on config)
|
|
87
|
+
WorkflowStep(
|
|
88
|
+
step_id="fast_hooks",
|
|
89
|
+
name="Fast Hooks",
|
|
90
|
+
action="run_fast_hooks",
|
|
91
|
+
params={},
|
|
92
|
+
depends_on=["config"],
|
|
93
|
+
retry_attempts=1, # No workflow-level retry (hook manager handles retries internally)
|
|
94
|
+
timeout=600.0,
|
|
95
|
+
parallel=True, # Can run parallel with cleaning
|
|
96
|
+
),
|
|
97
|
+
WorkflowStep(
|
|
98
|
+
step_id="cleaning",
|
|
99
|
+
name="Code Cleaning",
|
|
100
|
+
action="run_code_cleaning",
|
|
101
|
+
params={},
|
|
102
|
+
depends_on=["config"],
|
|
103
|
+
retry_attempts=1,
|
|
104
|
+
timeout=360.0,
|
|
105
|
+
skip_on_failure=True, # Cleaning is optional
|
|
106
|
+
parallel=True, # Can run parallel with fast_hooks
|
|
107
|
+
),
|
|
108
|
+
# Comprehensive hooks wait for both fast_hooks and cleaning
|
|
109
|
+
WorkflowStep(
|
|
110
|
+
step_id="comprehensive",
|
|
111
|
+
name="Comprehensive Hooks",
|
|
112
|
+
action="run_comprehensive_hooks",
|
|
113
|
+
params={},
|
|
114
|
+
depends_on=["fast_hooks", "cleaning"], # Waits for both
|
|
115
|
+
retry_attempts=0, # Comprehensive hooks run once (no automatic retry)
|
|
116
|
+
timeout=1800.0, # 15 minutes for comprehensive
|
|
117
|
+
),
|
|
118
|
+
],
|
|
119
|
+
timeout=3000.0, # 50 minutes total workflow timeout
|
|
120
|
+
retry_failed_steps=True,
|
|
121
|
+
continue_on_error=False,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Phase 2: Test workflow
|
|
125
|
+
# Workflow for --run-tests mode: Full quality workflow WITH tests
|
|
126
|
+
TEST_WORKFLOW = WorkflowDefinition(
|
|
127
|
+
workflow_id="crackerjack-test",
|
|
128
|
+
name="Test Execution Workflow",
|
|
129
|
+
description="Full quality workflow: fast hooks → code cleaning → tests → comprehensive hooks",
|
|
130
|
+
steps=[
|
|
131
|
+
WorkflowStep(
|
|
132
|
+
step_id="config",
|
|
133
|
+
name="Configuration",
|
|
134
|
+
action="run_configuration",
|
|
135
|
+
params={},
|
|
136
|
+
retry_attempts=1,
|
|
137
|
+
timeout=30.0,
|
|
138
|
+
),
|
|
139
|
+
# Fast hooks and cleaning run in parallel (both depend only on config)
|
|
140
|
+
WorkflowStep(
|
|
141
|
+
step_id="fast_hooks",
|
|
142
|
+
name="Fast Hooks",
|
|
143
|
+
action="run_fast_hooks",
|
|
144
|
+
params={},
|
|
145
|
+
depends_on=["config"],
|
|
146
|
+
retry_attempts=1, # No workflow-level retry (hook manager handles retries internally)
|
|
147
|
+
timeout=600.0,
|
|
148
|
+
parallel=True, # Can run parallel with cleaning
|
|
149
|
+
),
|
|
150
|
+
WorkflowStep(
|
|
151
|
+
step_id="cleaning",
|
|
152
|
+
name="Code Cleaning",
|
|
153
|
+
action="run_code_cleaning",
|
|
154
|
+
params={},
|
|
155
|
+
depends_on=["config"],
|
|
156
|
+
retry_attempts=1,
|
|
157
|
+
timeout=360.0,
|
|
158
|
+
skip_on_failure=True, # Cleaning is optional
|
|
159
|
+
parallel=True, # Can run parallel with fast_hooks
|
|
160
|
+
),
|
|
161
|
+
# Tests run after fast hooks and cleaning
|
|
162
|
+
WorkflowStep(
|
|
163
|
+
step_id="test_workflow",
|
|
164
|
+
name="Test Execution",
|
|
165
|
+
action="run_test_workflow",
|
|
166
|
+
params={},
|
|
167
|
+
depends_on=["fast_hooks", "cleaning"], # Waits for both
|
|
168
|
+
retry_attempts=0, # Tests should only retry after AI autofix, not automatically
|
|
169
|
+
timeout=1800.0, # 30 minutes for tests
|
|
170
|
+
),
|
|
171
|
+
# Comprehensive hooks run after tests complete
|
|
172
|
+
WorkflowStep(
|
|
173
|
+
step_id="comprehensive",
|
|
174
|
+
name="Comprehensive Hooks",
|
|
175
|
+
action="run_comprehensive_hooks",
|
|
176
|
+
params={},
|
|
177
|
+
depends_on=["test_workflow"], # Waits for tests
|
|
178
|
+
retry_attempts=0, # Comprehensive hooks run once (no automatic retry)
|
|
179
|
+
timeout=1800.0, # 15 minutes for comprehensive
|
|
180
|
+
),
|
|
181
|
+
],
|
|
182
|
+
timeout=5400.0, # 90 minutes total workflow timeout
|
|
183
|
+
retry_failed_steps=True,
|
|
184
|
+
continue_on_error=False,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
# Phase 3: Comprehensive workflow with hook-level parallelization
|
|
188
|
+
# This workflow runs individual hooks in parallel for maximum performance
|
|
189
|
+
COMPREHENSIVE_PARALLEL_WORKFLOW = WorkflowDefinition(
|
|
190
|
+
workflow_id="crackerjack-comprehensive-parallel",
|
|
191
|
+
name="Comprehensive Quality Checks (Parallel)",
|
|
192
|
+
description="Individual hooks run in parallel for maximum performance",
|
|
193
|
+
steps=[
|
|
194
|
+
WorkflowStep(
|
|
195
|
+
step_id="config",
|
|
196
|
+
name="Configuration",
|
|
197
|
+
action="run_configuration",
|
|
198
|
+
params={},
|
|
199
|
+
retry_attempts=1,
|
|
200
|
+
timeout=30.0,
|
|
201
|
+
),
|
|
202
|
+
# All hooks run in parallel (Phase 3 feature)
|
|
203
|
+
WorkflowStep(
|
|
204
|
+
step_id="zuban",
|
|
205
|
+
name="Type Checking (Zuban)",
|
|
206
|
+
action="run_hook",
|
|
207
|
+
params={"hook_name": "zuban"},
|
|
208
|
+
depends_on=["config"],
|
|
209
|
+
retry_attempts=1,
|
|
210
|
+
timeout=300.0,
|
|
211
|
+
parallel=True,
|
|
212
|
+
),
|
|
213
|
+
WorkflowStep(
|
|
214
|
+
step_id="bandit",
|
|
215
|
+
name="Security Check (Bandit)",
|
|
216
|
+
action="run_hook",
|
|
217
|
+
params={"hook_name": "bandit"},
|
|
218
|
+
depends_on=["config"],
|
|
219
|
+
retry_attempts=1,
|
|
220
|
+
timeout=300.0,
|
|
221
|
+
parallel=True,
|
|
222
|
+
),
|
|
223
|
+
WorkflowStep(
|
|
224
|
+
step_id="gitleaks",
|
|
225
|
+
name="Secret Scanning (Gitleaks)",
|
|
226
|
+
action="run_hook",
|
|
227
|
+
params={"hook_name": "gitleaks"},
|
|
228
|
+
depends_on=["config"],
|
|
229
|
+
retry_attempts=1,
|
|
230
|
+
timeout=300.0,
|
|
231
|
+
parallel=True,
|
|
232
|
+
),
|
|
233
|
+
WorkflowStep(
|
|
234
|
+
step_id="skylos",
|
|
235
|
+
name="Dead Code Detection (Skylos)",
|
|
236
|
+
action="run_hook",
|
|
237
|
+
params={"hook_name": "skylos"},
|
|
238
|
+
depends_on=["config"],
|
|
239
|
+
retry_attempts=1,
|
|
240
|
+
timeout=300.0,
|
|
241
|
+
parallel=True,
|
|
242
|
+
),
|
|
243
|
+
],
|
|
244
|
+
timeout=900.0, # 15 minutes total (much faster than sequential!)
|
|
245
|
+
retry_failed_steps=True,
|
|
246
|
+
continue_on_error=False,
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
# Commit workflow: Standard workflow + commit phase
|
|
250
|
+
# Workflow for --commit mode: Full quality workflow THEN commit
|
|
251
|
+
COMMIT_WORKFLOW = WorkflowDefinition(
|
|
252
|
+
workflow_id="crackerjack-commit",
|
|
253
|
+
name="Commit Workflow",
|
|
254
|
+
description="Full quality workflow with git commit and push",
|
|
255
|
+
steps=[
|
|
256
|
+
WorkflowStep(
|
|
257
|
+
step_id="config",
|
|
258
|
+
name="Configuration",
|
|
259
|
+
action="run_configuration",
|
|
260
|
+
params={},
|
|
261
|
+
retry_attempts=1,
|
|
262
|
+
timeout=30.0,
|
|
263
|
+
),
|
|
264
|
+
# Fast hooks and cleaning run in parallel
|
|
265
|
+
WorkflowStep(
|
|
266
|
+
step_id="fast_hooks",
|
|
267
|
+
name="Fast Hooks",
|
|
268
|
+
action="run_fast_hooks",
|
|
269
|
+
params={},
|
|
270
|
+
depends_on=["config"],
|
|
271
|
+
retry_attempts=1, # No workflow-level retry (hook manager handles retries internally)
|
|
272
|
+
timeout=600.0,
|
|
273
|
+
parallel=True,
|
|
274
|
+
),
|
|
275
|
+
WorkflowStep(
|
|
276
|
+
step_id="cleaning",
|
|
277
|
+
name="Code Cleaning",
|
|
278
|
+
action="run_code_cleaning",
|
|
279
|
+
params={},
|
|
280
|
+
depends_on=["config"],
|
|
281
|
+
retry_attempts=1,
|
|
282
|
+
timeout=360.0,
|
|
283
|
+
skip_on_failure=True,
|
|
284
|
+
parallel=True,
|
|
285
|
+
),
|
|
286
|
+
# Comprehensive hooks wait for both
|
|
287
|
+
WorkflowStep(
|
|
288
|
+
step_id="comprehensive",
|
|
289
|
+
name="Comprehensive Hooks",
|
|
290
|
+
action="run_comprehensive_hooks",
|
|
291
|
+
params={},
|
|
292
|
+
depends_on=["fast_hooks", "cleaning"],
|
|
293
|
+
retry_attempts=0, # Comprehensive hooks run once (no automatic retry)
|
|
294
|
+
timeout=1800.0,
|
|
295
|
+
),
|
|
296
|
+
# Commit runs after all quality checks pass
|
|
297
|
+
WorkflowStep(
|
|
298
|
+
step_id="commit",
|
|
299
|
+
name="Git Commit & Push",
|
|
300
|
+
action="run_commit_phase",
|
|
301
|
+
params={},
|
|
302
|
+
depends_on=["comprehensive"],
|
|
303
|
+
retry_attempts=1,
|
|
304
|
+
timeout=600.0,
|
|
305
|
+
),
|
|
306
|
+
],
|
|
307
|
+
timeout=3600.0, # 60 minutes total
|
|
308
|
+
retry_failed_steps=True,
|
|
309
|
+
continue_on_error=False,
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
# Publish workflow: Test workflow + commit + publish
|
|
313
|
+
# Workflow for --publish/--all mode: Full workflow with tests, commit, and publish
|
|
314
|
+
PUBLISH_WORKFLOW = WorkflowDefinition(
|
|
315
|
+
workflow_id="crackerjack-publish",
|
|
316
|
+
name="Publish Workflow",
|
|
317
|
+
description="Full quality workflow with tests, commit, version bump, and PyPI publish",
|
|
318
|
+
steps=[
|
|
319
|
+
WorkflowStep(
|
|
320
|
+
step_id="config",
|
|
321
|
+
name="Configuration",
|
|
322
|
+
action="run_configuration",
|
|
323
|
+
params={},
|
|
324
|
+
retry_attempts=1,
|
|
325
|
+
timeout=30.0,
|
|
326
|
+
),
|
|
327
|
+
# Fast hooks and cleaning run in parallel
|
|
328
|
+
WorkflowStep(
|
|
329
|
+
step_id="fast_hooks",
|
|
330
|
+
name="Fast Hooks",
|
|
331
|
+
action="run_fast_hooks",
|
|
332
|
+
params={},
|
|
333
|
+
depends_on=["config"],
|
|
334
|
+
retry_attempts=1, # No workflow-level retry (hook manager handles retries internally)
|
|
335
|
+
timeout=600.0,
|
|
336
|
+
parallel=True,
|
|
337
|
+
),
|
|
338
|
+
WorkflowStep(
|
|
339
|
+
step_id="cleaning",
|
|
340
|
+
name="Code Cleaning",
|
|
341
|
+
action="run_code_cleaning",
|
|
342
|
+
params={},
|
|
343
|
+
depends_on=["config"],
|
|
344
|
+
retry_attempts=1,
|
|
345
|
+
timeout=360.0,
|
|
346
|
+
skip_on_failure=True,
|
|
347
|
+
parallel=True,
|
|
348
|
+
),
|
|
349
|
+
# Tests run after fast hooks and cleaning
|
|
350
|
+
WorkflowStep(
|
|
351
|
+
step_id="test_workflow",
|
|
352
|
+
name="Test Execution",
|
|
353
|
+
action="run_test_workflow",
|
|
354
|
+
params={},
|
|
355
|
+
depends_on=["fast_hooks", "cleaning"],
|
|
356
|
+
retry_attempts=0, # Tests should only retry after AI autofix, not automatically
|
|
357
|
+
timeout=1800.0,
|
|
358
|
+
),
|
|
359
|
+
# Comprehensive hooks run after tests
|
|
360
|
+
WorkflowStep(
|
|
361
|
+
step_id="comprehensive",
|
|
362
|
+
name="Comprehensive Hooks",
|
|
363
|
+
action="run_comprehensive_hooks",
|
|
364
|
+
params={},
|
|
365
|
+
depends_on=["test_workflow"],
|
|
366
|
+
retry_attempts=0, # Comprehensive hooks run once (no automatic retry)
|
|
367
|
+
timeout=1800.0,
|
|
368
|
+
),
|
|
369
|
+
# Commit runs after all quality checks pass
|
|
370
|
+
WorkflowStep(
|
|
371
|
+
step_id="commit",
|
|
372
|
+
name="Git Commit & Push",
|
|
373
|
+
action="run_commit_phase",
|
|
374
|
+
params={},
|
|
375
|
+
depends_on=["comprehensive"],
|
|
376
|
+
retry_attempts=1,
|
|
377
|
+
timeout=600.0,
|
|
378
|
+
),
|
|
379
|
+
# Publish runs after successful commit
|
|
380
|
+
WorkflowStep(
|
|
381
|
+
step_id="publish",
|
|
382
|
+
name="Version Bump & PyPI Publish",
|
|
383
|
+
action="run_publish_phase",
|
|
384
|
+
params={},
|
|
385
|
+
depends_on=["commit"],
|
|
386
|
+
retry_attempts=1,
|
|
387
|
+
timeout=1200.0, # Increased from 10 minutes to 20 minutes for publishing
|
|
388
|
+
),
|
|
389
|
+
],
|
|
390
|
+
timeout=7200.0, # 120 minutes total (increased from 80 minutes)
|
|
391
|
+
retry_failed_steps=True,
|
|
392
|
+
continue_on_error=False,
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def select_workflow_for_options(options: OptionsProtocol) -> WorkflowDefinition:
|
|
397
|
+
"""Select appropriate workflow based on CLI options.
|
|
398
|
+
|
|
399
|
+
Args:
|
|
400
|
+
options: CLI options (Options or compatible protocol)
|
|
401
|
+
|
|
402
|
+
Returns:
|
|
403
|
+
WorkflowDefinition matching the requested execution mode
|
|
404
|
+
"""
|
|
405
|
+
# Publishing workflow (--publish, --all, or --bump)
|
|
406
|
+
# This includes tests + commit + publish
|
|
407
|
+
if any(
|
|
408
|
+
[
|
|
409
|
+
getattr(options, "publish", False),
|
|
410
|
+
getattr(options, "all", False),
|
|
411
|
+
getattr(options, "bump", False),
|
|
412
|
+
]
|
|
413
|
+
):
|
|
414
|
+
return PUBLISH_WORKFLOW
|
|
415
|
+
|
|
416
|
+
# Commit workflow (--commit without publish)
|
|
417
|
+
# This includes quality checks + commit
|
|
418
|
+
if getattr(options, "commit", False):
|
|
419
|
+
# If tests are also requested, use test workflow + commit
|
|
420
|
+
if getattr(options, "run_tests", False):
|
|
421
|
+
# Create a modified test workflow with commit step
|
|
422
|
+
# For now, return COMMIT_WORKFLOW and tests will run as part of it
|
|
423
|
+
return PUBLISH_WORKFLOW # Reuse publish workflow (it has tests + commit)
|
|
424
|
+
return COMMIT_WORKFLOW
|
|
425
|
+
|
|
426
|
+
# Test mode (--run-tests without commit/publish)
|
|
427
|
+
if getattr(options, "run_tests", False):
|
|
428
|
+
return TEST_WORKFLOW
|
|
429
|
+
|
|
430
|
+
# Fast mode (fast hooks only)
|
|
431
|
+
if getattr(options, "fast", False):
|
|
432
|
+
return FAST_HOOKS_WORKFLOW
|
|
433
|
+
|
|
434
|
+
# Comprehensive mode (comp hooks only) - Phase 3 uses parallel version
|
|
435
|
+
if getattr(options, "comp", False):
|
|
436
|
+
# Check if parallel execution is enabled (Phase 3 feature)
|
|
437
|
+
if getattr(options, "parallel_hooks", False):
|
|
438
|
+
return COMPREHENSIVE_PARALLEL_WORKFLOW
|
|
439
|
+
# Default: Use comprehensive-only workflow
|
|
440
|
+
return COMPREHENSIVE_HOOKS_WORKFLOW
|
|
441
|
+
|
|
442
|
+
# Default: Standard workflow with phase-level parallelization
|
|
443
|
+
return STANDARD_WORKFLOW
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"""ACB workflow engine integration for crackerjack.
|
|
2
|
+
|
|
3
|
+
This module provides the CrackerjackWorkflowEngine class that extends
|
|
4
|
+
ACB's BasicWorkflowEngine with event bridge support for backward compatibility.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import typing as t
|
|
10
|
+
|
|
11
|
+
from acb.depends import Inject, depends
|
|
12
|
+
from acb.workflows import (
|
|
13
|
+
BasicWorkflowEngine,
|
|
14
|
+
StepResult,
|
|
15
|
+
StepState,
|
|
16
|
+
WorkflowDefinition,
|
|
17
|
+
WorkflowResult,
|
|
18
|
+
WorkflowState,
|
|
19
|
+
WorkflowStep,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
from crackerjack.workflows.event_bridge import EventBridgeAdapter
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class CrackerjackWorkflowEngine(BasicWorkflowEngine):
|
|
26
|
+
"""ACB workflow engine with event bridge for backward compatibility.
|
|
27
|
+
|
|
28
|
+
This engine extends BasicWorkflowEngine to emit crackerjack-specific
|
|
29
|
+
events via EventBridgeAdapter while leveraging ACB's parallel execution
|
|
30
|
+
capabilities.
|
|
31
|
+
|
|
32
|
+
Key Features:
|
|
33
|
+
- Automatic parallel step execution (dependency-based)
|
|
34
|
+
- Event bridge for backward compatibility
|
|
35
|
+
- Built-in retry logic with exponential backoff
|
|
36
|
+
- State management and timing
|
|
37
|
+
- DI-based action handlers
|
|
38
|
+
|
|
39
|
+
Example:
|
|
40
|
+
```python
|
|
41
|
+
@depends.inject
|
|
42
|
+
async def handle_workflow(
|
|
43
|
+
engine: Inject[CrackerjackWorkflowEngine],
|
|
44
|
+
options: Options,
|
|
45
|
+
) -> None:
|
|
46
|
+
workflow = FAST_HOOKS_WORKFLOW
|
|
47
|
+
result = await engine.execute(workflow, context={"options": options})
|
|
48
|
+
if result.state != WorkflowState.COMPLETED:
|
|
49
|
+
raise SystemExit(1)
|
|
50
|
+
```
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
@depends.inject # type: ignore[misc]
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
event_bridge: Inject[EventBridgeAdapter] = None,
|
|
57
|
+
max_concurrent_steps: int = 5,
|
|
58
|
+
) -> None:
|
|
59
|
+
"""Initialize workflow engine with event bridge.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
event_bridge: EventBridge adapter for event translation
|
|
63
|
+
max_concurrent_steps: Maximum number of steps to run in parallel
|
|
64
|
+
|
|
65
|
+
Note:
|
|
66
|
+
Logger is automatically initialized by BasicWorkflowEngine parent class
|
|
67
|
+
"""
|
|
68
|
+
super().__init__(max_concurrent_steps=max_concurrent_steps)
|
|
69
|
+
self.event_bridge = event_bridge
|
|
70
|
+
|
|
71
|
+
async def execute(
|
|
72
|
+
self,
|
|
73
|
+
workflow: WorkflowDefinition,
|
|
74
|
+
context: dict[str, t.Any] | None = None,
|
|
75
|
+
) -> WorkflowResult:
|
|
76
|
+
"""Execute workflow with event bridge notifications.
|
|
77
|
+
|
|
78
|
+
This method wraps ACB's execute() to emit crackerjack-specific events
|
|
79
|
+
for backward compatibility with existing event consumers.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
workflow: Workflow definition to execute
|
|
83
|
+
context: Optional execution context
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
WorkflowResult with state, steps, timing, and errors
|
|
87
|
+
"""
|
|
88
|
+
context = context or {}
|
|
89
|
+
|
|
90
|
+
# Emit workflow started event
|
|
91
|
+
await self.event_bridge.on_workflow_started(
|
|
92
|
+
workflow.workflow_id,
|
|
93
|
+
context,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
# Execute using ACB's parallel execution logic
|
|
98
|
+
result = await super().execute(workflow, context)
|
|
99
|
+
|
|
100
|
+
# Emit workflow completed/failed event
|
|
101
|
+
if result.state == WorkflowState.COMPLETED:
|
|
102
|
+
await self.event_bridge.on_workflow_completed(
|
|
103
|
+
workflow.workflow_id,
|
|
104
|
+
result,
|
|
105
|
+
)
|
|
106
|
+
else:
|
|
107
|
+
error = Exception(f"Workflow failed: {result.error}")
|
|
108
|
+
await self.event_bridge.on_workflow_failed(
|
|
109
|
+
workflow.workflow_id,
|
|
110
|
+
error,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
return result
|
|
114
|
+
|
|
115
|
+
except Exception as e:
|
|
116
|
+
# Emit workflow failed event
|
|
117
|
+
await self.event_bridge.on_workflow_failed(workflow.workflow_id, e)
|
|
118
|
+
raise
|
|
119
|
+
|
|
120
|
+
async def _execute_step_with_retry(
|
|
121
|
+
self,
|
|
122
|
+
step: WorkflowStep,
|
|
123
|
+
context: dict[str, t.Any],
|
|
124
|
+
) -> StepResult:
|
|
125
|
+
"""Execute step with event emissions.
|
|
126
|
+
|
|
127
|
+
This method wraps ACB's _execute_step_with_retry() to emit
|
|
128
|
+
crackerjack-specific step events.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
step: Workflow step to execute
|
|
132
|
+
context: Execution context
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
StepResult with state, output, timing, and errors
|
|
136
|
+
"""
|
|
137
|
+
# Emit step started event
|
|
138
|
+
await self.event_bridge.on_step_started(
|
|
139
|
+
step.step_id,
|
|
140
|
+
step.name,
|
|
141
|
+
context,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
try:
|
|
145
|
+
# Execute step using parent logic (includes retry)
|
|
146
|
+
result = await super()._execute_step_with_retry(step, context)
|
|
147
|
+
|
|
148
|
+
# Emit step completed/failed event
|
|
149
|
+
if result.state == StepState.COMPLETED:
|
|
150
|
+
await self.event_bridge.on_step_completed(
|
|
151
|
+
step.step_id,
|
|
152
|
+
step.name,
|
|
153
|
+
result.output,
|
|
154
|
+
(result.duration_ms or 0)
|
|
155
|
+
/ 1000.0, # Convert milliseconds to seconds
|
|
156
|
+
)
|
|
157
|
+
else:
|
|
158
|
+
error = Exception(result.error or "Step failed")
|
|
159
|
+
await self.event_bridge.on_step_failed(
|
|
160
|
+
step.step_id,
|
|
161
|
+
step.name,
|
|
162
|
+
error,
|
|
163
|
+
(result.duration_ms or 0)
|
|
164
|
+
/ 1000.0, # Convert milliseconds to seconds
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
return result
|
|
168
|
+
|
|
169
|
+
except Exception as e:
|
|
170
|
+
# Emit step failed event
|
|
171
|
+
await self.event_bridge.on_step_failed(
|
|
172
|
+
step.step_id,
|
|
173
|
+
step.name,
|
|
174
|
+
e,
|
|
175
|
+
0.0,
|
|
176
|
+
)
|
|
177
|
+
raise
|