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,590 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | Workflows
|
|
2
|
+
|
|
3
|
+
# Workflows
|
|
4
|
+
|
|
5
|
+
Declarative workflow orchestration combining agents, services, and executors with ACB workflow engine integration.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The workflows package provides high-level workflow definitions and execution engines that coordinate multiple components (hooks, tests, agents) to accomplish complex tasks. Built on ACB's workflow engine, it supports automatic parallelization, event-driven coordination, and declarative workflow definitions.
|
|
10
|
+
|
|
11
|
+
## Core Components
|
|
12
|
+
|
|
13
|
+
### CrackerjackWorkflowEngine (`engine.py`)
|
|
14
|
+
|
|
15
|
+
ACB workflow engine with event bridge for backward compatibility:
|
|
16
|
+
|
|
17
|
+
**Features:**
|
|
18
|
+
|
|
19
|
+
- **Automatic Parallel Execution** - Dependency-based parallel step execution
|
|
20
|
+
- **Event Bridge** - Emits crackerjack-specific events for backward compatibility
|
|
21
|
+
- **Built-in Retry Logic** - Exponential backoff for transient failures
|
|
22
|
+
- **State Management** - Tracks workflow and step states
|
|
23
|
+
- **DI-Based Actions** - Dependency injection for action handlers
|
|
24
|
+
- **Timing & Metrics** - Automatic execution time tracking
|
|
25
|
+
|
|
26
|
+
**Key Capabilities:**
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
class CrackerjackWorkflowEngine(BasicWorkflowEngine):
|
|
30
|
+
async def execute(
|
|
31
|
+
self, workflow: WorkflowDefinition, context: dict | None = None
|
|
32
|
+
) -> WorkflowResult:
|
|
33
|
+
"""Execute workflow with parallel step execution."""
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Workflow Definitions (`definitions.py`)
|
|
37
|
+
|
|
38
|
+
Declarative workflow structures using ACB's WorkflowDefinition:
|
|
39
|
+
|
|
40
|
+
**Available Workflows:**
|
|
41
|
+
|
|
42
|
+
1. **FAST_HOOKS_WORKFLOW** - Quick formatters and basic checks (~5s)
|
|
43
|
+
1. **COMPREHENSIVE_HOOKS_WORKFLOW** - Type checking, security, complexity (~30s)
|
|
44
|
+
1. **STANDARD_WORKFLOW** - Full quality checks with parallel phases
|
|
45
|
+
1. **TEST_WORKFLOW** - Test execution with coverage reporting
|
|
46
|
+
1. **COMMIT_WORKFLOW** - Pre-commit validation workflow
|
|
47
|
+
1. **PUBLISH_WORKFLOW** - PyPI publishing workflow
|
|
48
|
+
1. **COMPREHENSIVE_PARALLEL_WORKFLOW** - Maximum parallelization
|
|
49
|
+
|
|
50
|
+
**Workflow Selection:**
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
def select_workflow_for_options(options: OptionsProtocol) -> WorkflowDefinition:
|
|
54
|
+
"""Select appropriate workflow based on CLI options."""
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Action Registry (`actions.py`)
|
|
58
|
+
|
|
59
|
+
Registry of workflow action handlers:
|
|
60
|
+
|
|
61
|
+
**Features:**
|
|
62
|
+
|
|
63
|
+
- **Action Registration** - Register custom action handlers
|
|
64
|
+
- **DI Integration** - Actions automatically get dependencies injected
|
|
65
|
+
- **Error Handling** - Standardized error handling for actions
|
|
66
|
+
- **Context Passing** - Pass state between workflow steps
|
|
67
|
+
|
|
68
|
+
**Built-in Actions:**
|
|
69
|
+
|
|
70
|
+
- `run_configuration` - Configure project settings
|
|
71
|
+
- `run_fast_hooks` - Execute fast quality hooks
|
|
72
|
+
- `run_comprehensive_hooks` - Execute comprehensive hooks
|
|
73
|
+
- `run_tests` - Run test suite with pytest
|
|
74
|
+
- `run_code_cleaning` - Code cleaning and optimization
|
|
75
|
+
- `run_ai_fixing` - AI-powered automatic fixing
|
|
76
|
+
- `run_commit` - Git commit with validation
|
|
77
|
+
- `run_publish` - PyPI package publishing
|
|
78
|
+
|
|
79
|
+
### Event Bridge (`event_bridge.py`)
|
|
80
|
+
|
|
81
|
+
Adapter translating ACB workflow events to crackerjack events:
|
|
82
|
+
|
|
83
|
+
**Features:**
|
|
84
|
+
|
|
85
|
+
- **Backward Compatibility** - Maintains compatibility with existing event consumers
|
|
86
|
+
- **Event Translation** - Maps WorkflowStep to crackerjack events
|
|
87
|
+
- **State Mapping** - Translates workflow states to step events
|
|
88
|
+
- **Progress Tracking** - Emits progress events for UI updates
|
|
89
|
+
|
|
90
|
+
### Container Builder (`container_builder.py`)
|
|
91
|
+
|
|
92
|
+
Builds DI containers for workflow execution:
|
|
93
|
+
|
|
94
|
+
**Features:**
|
|
95
|
+
|
|
96
|
+
- **Dependency Registration** - Registers all workflow dependencies
|
|
97
|
+
- **Service Configuration** - Configures services based on options
|
|
98
|
+
- **Lifecycle Management** - Manages service initialization/cleanup
|
|
99
|
+
- **Context Isolation** - Isolates workflow execution contexts
|
|
100
|
+
|
|
101
|
+
### AutoFixWorkflow (`auto_fix.py`)
|
|
102
|
+
|
|
103
|
+
Legacy iterative auto-fix workflow (pre-ACB integration):
|
|
104
|
+
|
|
105
|
+
**Features:**
|
|
106
|
+
|
|
107
|
+
- **Iterative Fixing** - Multiple fix iterations until success
|
|
108
|
+
- **Pattern Learning** - Learns from successful fixes
|
|
109
|
+
- **Quality Gates** - Validates fixes meet quality standards
|
|
110
|
+
- **Rollback Support** - Can rollback failed iterations
|
|
111
|
+
|
|
112
|
+
## Workflow Definitions
|
|
113
|
+
|
|
114
|
+
### Fast Hooks Workflow
|
|
115
|
+
|
|
116
|
+
Quick quality checks for rapid feedback (~5s):
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
FAST_HOOKS_WORKFLOW = WorkflowDefinition(
|
|
120
|
+
workflow_id="crackerjack-fast-hooks",
|
|
121
|
+
name="Fast Quality Checks",
|
|
122
|
+
description="Quick formatters, import sorting, and basic static analysis",
|
|
123
|
+
steps=[
|
|
124
|
+
WorkflowStep(
|
|
125
|
+
step_id="config",
|
|
126
|
+
name="Configuration",
|
|
127
|
+
action="run_configuration",
|
|
128
|
+
retry_attempts=1,
|
|
129
|
+
timeout=30.0,
|
|
130
|
+
),
|
|
131
|
+
WorkflowStep(
|
|
132
|
+
step_id="fast_hooks",
|
|
133
|
+
name="Fast Hooks",
|
|
134
|
+
action="run_fast_hooks",
|
|
135
|
+
depends_on=["config"],
|
|
136
|
+
retry_attempts=1,
|
|
137
|
+
timeout=300.0,
|
|
138
|
+
),
|
|
139
|
+
],
|
|
140
|
+
timeout=600.0,
|
|
141
|
+
retry_failed_steps=True,
|
|
142
|
+
continue_on_error=False,
|
|
143
|
+
)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Standard Workflow
|
|
147
|
+
|
|
148
|
+
Full quality checks with phase-level parallelization:
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
STANDARD_WORKFLOW = WorkflowDefinition(
|
|
152
|
+
workflow_id="crackerjack-standard",
|
|
153
|
+
name="Standard Quality Workflow",
|
|
154
|
+
steps=[
|
|
155
|
+
WorkflowStep(step_id="config", action="run_configuration"),
|
|
156
|
+
# These run in parallel (both depend only on config)
|
|
157
|
+
WorkflowStep(
|
|
158
|
+
step_id="fast_hooks",
|
|
159
|
+
action="run_fast_hooks",
|
|
160
|
+
depends_on=["config"],
|
|
161
|
+
parallel=True,
|
|
162
|
+
),
|
|
163
|
+
WorkflowStep(
|
|
164
|
+
step_id="cleaning",
|
|
165
|
+
action="run_code_cleaning",
|
|
166
|
+
depends_on=["config"],
|
|
167
|
+
parallel=True,
|
|
168
|
+
),
|
|
169
|
+
# Tests run after both complete
|
|
170
|
+
WorkflowStep(
|
|
171
|
+
step_id="tests",
|
|
172
|
+
action="run_tests",
|
|
173
|
+
depends_on=["fast_hooks", "cleaning"],
|
|
174
|
+
),
|
|
175
|
+
# Comprehensive hooks run after tests
|
|
176
|
+
WorkflowStep(
|
|
177
|
+
step_id="comprehensive",
|
|
178
|
+
action="run_comprehensive_hooks",
|
|
179
|
+
depends_on=["tests"],
|
|
180
|
+
),
|
|
181
|
+
],
|
|
182
|
+
timeout=1800.0,
|
|
183
|
+
)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Test Workflow
|
|
187
|
+
|
|
188
|
+
Focused on test execution with coverage reporting:
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
TEST_WORKFLOW = WorkflowDefinition(
|
|
192
|
+
workflow_id="crackerjack-test",
|
|
193
|
+
name="Test Execution",
|
|
194
|
+
steps=[
|
|
195
|
+
WorkflowStep(step_id="config", action="run_configuration"),
|
|
196
|
+
WorkflowStep(
|
|
197
|
+
step_id="tests",
|
|
198
|
+
action="run_tests",
|
|
199
|
+
depends_on=["config"],
|
|
200
|
+
timeout=900.0,
|
|
201
|
+
),
|
|
202
|
+
WorkflowStep(
|
|
203
|
+
step_id="coverage_report",
|
|
204
|
+
action="generate_coverage_report",
|
|
205
|
+
depends_on=["tests"],
|
|
206
|
+
),
|
|
207
|
+
],
|
|
208
|
+
)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Comprehensive Parallel Workflow
|
|
212
|
+
|
|
213
|
+
Maximum parallelization for speed:
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
COMPREHENSIVE_PARALLEL_WORKFLOW = WorkflowDefinition(
|
|
217
|
+
workflow_id="crackerjack-comprehensive-parallel",
|
|
218
|
+
name="Comprehensive Parallel Workflow",
|
|
219
|
+
steps=[
|
|
220
|
+
WorkflowStep(step_id="config", action="run_configuration"),
|
|
221
|
+
# All quality checks run in parallel
|
|
222
|
+
WorkflowStep(
|
|
223
|
+
step_id="fast_hooks",
|
|
224
|
+
action="run_fast_hooks",
|
|
225
|
+
depends_on=["config"],
|
|
226
|
+
parallel=True,
|
|
227
|
+
),
|
|
228
|
+
WorkflowStep(
|
|
229
|
+
step_id="comprehensive",
|
|
230
|
+
action="run_comprehensive_hooks",
|
|
231
|
+
depends_on=["config"],
|
|
232
|
+
parallel=True,
|
|
233
|
+
),
|
|
234
|
+
WorkflowStep(
|
|
235
|
+
step_id="tests",
|
|
236
|
+
action="run_tests",
|
|
237
|
+
depends_on=["config"],
|
|
238
|
+
parallel=True,
|
|
239
|
+
),
|
|
240
|
+
# AI fixing runs after all checks complete
|
|
241
|
+
WorkflowStep(
|
|
242
|
+
step_id="ai_fix",
|
|
243
|
+
action="run_ai_fixing",
|
|
244
|
+
depends_on=["fast_hooks", "comprehensive", "tests"],
|
|
245
|
+
),
|
|
246
|
+
],
|
|
247
|
+
)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Usage Examples
|
|
251
|
+
|
|
252
|
+
### Basic Workflow Execution
|
|
253
|
+
|
|
254
|
+
```python
|
|
255
|
+
from crackerjack.workflows import CrackerjackWorkflowEngine, FAST_HOOKS_WORKFLOW
|
|
256
|
+
from acb.depends import depends
|
|
257
|
+
|
|
258
|
+
engine = depends.get(CrackerjackWorkflowEngine)
|
|
259
|
+
|
|
260
|
+
# Execute workflow
|
|
261
|
+
result = await engine.execute(
|
|
262
|
+
workflow=FAST_HOOKS_WORKFLOW, context={"options": options}
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
# Check result
|
|
266
|
+
if result.state == WorkflowState.COMPLETED:
|
|
267
|
+
print(f"✅ Workflow completed in {result.duration:.1f}s")
|
|
268
|
+
print(f"Steps executed: {len(result.steps)}")
|
|
269
|
+
else:
|
|
270
|
+
print(f"❌ Workflow failed: {result.error}")
|
|
271
|
+
for step in result.steps:
|
|
272
|
+
if step.state == StepState.FAILED:
|
|
273
|
+
print(f" Failed step: {step.step_id}")
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Custom Workflow Definition
|
|
277
|
+
|
|
278
|
+
```python
|
|
279
|
+
from acb.workflows import WorkflowDefinition, WorkflowStep
|
|
280
|
+
|
|
281
|
+
custom_workflow = WorkflowDefinition(
|
|
282
|
+
workflow_id="my-custom-workflow",
|
|
283
|
+
name="Custom Quality Workflow",
|
|
284
|
+
description="My project-specific quality checks",
|
|
285
|
+
steps=[
|
|
286
|
+
WorkflowStep(
|
|
287
|
+
step_id="config",
|
|
288
|
+
name="Configuration",
|
|
289
|
+
action="run_configuration",
|
|
290
|
+
),
|
|
291
|
+
WorkflowStep(
|
|
292
|
+
step_id="custom_check",
|
|
293
|
+
name="Custom Quality Check",
|
|
294
|
+
action="run_custom_check",
|
|
295
|
+
depends_on=["config"],
|
|
296
|
+
timeout=120.0,
|
|
297
|
+
retry_attempts=1,
|
|
298
|
+
),
|
|
299
|
+
WorkflowStep(
|
|
300
|
+
step_id="tests",
|
|
301
|
+
name="Run Tests",
|
|
302
|
+
action="run_tests",
|
|
303
|
+
depends_on=["custom_check"],
|
|
304
|
+
),
|
|
305
|
+
],
|
|
306
|
+
timeout=600.0,
|
|
307
|
+
retry_failed_steps=True,
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
# Execute custom workflow
|
|
311
|
+
result = await engine.execute(custom_workflow, context={})
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Registering Custom Actions
|
|
315
|
+
|
|
316
|
+
```python
|
|
317
|
+
from crackerjack.workflows import ACTION_REGISTRY
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
@ACTION_REGISTRY.register("run_custom_check")
|
|
321
|
+
async def run_custom_check(context: dict) -> dict:
|
|
322
|
+
"""Custom quality check action."""
|
|
323
|
+
options = context.get("options")
|
|
324
|
+
|
|
325
|
+
# Perform custom checks
|
|
326
|
+
results = await perform_custom_checks(options.pkg_path)
|
|
327
|
+
|
|
328
|
+
return {
|
|
329
|
+
"success": results.passed,
|
|
330
|
+
"issues": results.issues,
|
|
331
|
+
"duration": results.duration,
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Workflow with Event Handling
|
|
336
|
+
|
|
337
|
+
```python
|
|
338
|
+
from crackerjack.workflows import CrackerjackWorkflowEngine
|
|
339
|
+
from crackerjack.workflows.event_bridge import EventBridgeAdapter
|
|
340
|
+
|
|
341
|
+
engine = CrackerjackWorkflowEngine()
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
# Register event handlers
|
|
345
|
+
@engine.event_bridge.on_step_started
|
|
346
|
+
async def handle_step_started(step_id: str, context: dict):
|
|
347
|
+
print(f"Starting step: {step_id}")
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
@engine.event_bridge.on_step_completed
|
|
351
|
+
async def handle_step_completed(step_id: str, result: dict):
|
|
352
|
+
print(f"Completed step: {step_id} - {result.get('success')}")
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
# Execute workflow with event handling
|
|
356
|
+
result = await engine.execute(STANDARD_WORKFLOW)
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Workflow Selection Based on Options
|
|
360
|
+
|
|
361
|
+
```python
|
|
362
|
+
from crackerjack.workflows import select_workflow_for_options
|
|
363
|
+
|
|
364
|
+
# Select appropriate workflow based on CLI options
|
|
365
|
+
workflow = select_workflow_for_options(options)
|
|
366
|
+
|
|
367
|
+
# Execute selected workflow
|
|
368
|
+
result = await engine.execute(workflow, context={"options": options})
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### Parallel Step Execution
|
|
372
|
+
|
|
373
|
+
```python
|
|
374
|
+
from acb.workflows import WorkflowDefinition, WorkflowStep
|
|
375
|
+
|
|
376
|
+
# Define workflow with parallel steps
|
|
377
|
+
parallel_workflow = WorkflowDefinition(
|
|
378
|
+
workflow_id="parallel-checks",
|
|
379
|
+
name="Parallel Quality Checks",
|
|
380
|
+
steps=[
|
|
381
|
+
WorkflowStep(step_id="config", action="run_configuration"),
|
|
382
|
+
# These three steps run in parallel
|
|
383
|
+
WorkflowStep(
|
|
384
|
+
step_id="linting",
|
|
385
|
+
action="run_linting",
|
|
386
|
+
depends_on=["config"],
|
|
387
|
+
parallel=True,
|
|
388
|
+
),
|
|
389
|
+
WorkflowStep(
|
|
390
|
+
step_id="type_check",
|
|
391
|
+
action="run_type_checking",
|
|
392
|
+
depends_on=["config"],
|
|
393
|
+
parallel=True,
|
|
394
|
+
),
|
|
395
|
+
WorkflowStep(
|
|
396
|
+
step_id="security",
|
|
397
|
+
action="run_security_scan",
|
|
398
|
+
depends_on=["config"],
|
|
399
|
+
parallel=True,
|
|
400
|
+
),
|
|
401
|
+
# This runs after all parallel steps complete
|
|
402
|
+
WorkflowStep(
|
|
403
|
+
step_id="report",
|
|
404
|
+
action="generate_report",
|
|
405
|
+
depends_on=["linting", "type_check", "security"],
|
|
406
|
+
),
|
|
407
|
+
],
|
|
408
|
+
)
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## WorkflowResult Structure
|
|
412
|
+
|
|
413
|
+
```python
|
|
414
|
+
@dataclass
|
|
415
|
+
class WorkflowResult:
|
|
416
|
+
state: WorkflowState # COMPLETED, FAILED, CANCELLED
|
|
417
|
+
steps: list[StepResult] # Results from each step
|
|
418
|
+
duration: float # Total execution time (seconds)
|
|
419
|
+
error: str | None # Error message if failed
|
|
420
|
+
context: dict # Final execution context
|
|
421
|
+
|
|
422
|
+
@property
|
|
423
|
+
def success(self) -> bool:
|
|
424
|
+
"""Whether workflow completed successfully."""
|
|
425
|
+
return self.state == WorkflowState.COMPLETED
|
|
426
|
+
|
|
427
|
+
@property
|
|
428
|
+
def failed_steps(self) -> list[StepResult]:
|
|
429
|
+
"""List of failed steps."""
|
|
430
|
+
return [s for s in self.steps if s.state == StepState.FAILED]
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Workflow States
|
|
434
|
+
|
|
435
|
+
```python
|
|
436
|
+
class WorkflowState(Enum):
|
|
437
|
+
PENDING = "pending" # Not yet started
|
|
438
|
+
RUNNING = "running" # Currently executing
|
|
439
|
+
COMPLETED = "completed" # Successfully completed
|
|
440
|
+
FAILED = "failed" # Failed with errors
|
|
441
|
+
CANCELLED = "cancelled" # Cancelled by user
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
## Step States
|
|
445
|
+
|
|
446
|
+
```python
|
|
447
|
+
class StepState(Enum):
|
|
448
|
+
PENDING = "pending" # Waiting for dependencies
|
|
449
|
+
RUNNING = "running" # Currently executing
|
|
450
|
+
COMPLETED = "completed" # Successfully completed
|
|
451
|
+
FAILED = "failed" # Failed with error
|
|
452
|
+
SKIPPED = "skipped" # Skipped due to conditions
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
## Configuration
|
|
456
|
+
|
|
457
|
+
Workflow configuration through ACB Settings:
|
|
458
|
+
|
|
459
|
+
```yaml
|
|
460
|
+
# settings/crackerjack.yaml
|
|
461
|
+
|
|
462
|
+
# Workflow engine
|
|
463
|
+
workflow_engine_enabled: true
|
|
464
|
+
max_concurrent_steps: 5 # Max parallel workflow steps
|
|
465
|
+
workflow_timeout: 1800 # Global workflow timeout (seconds)
|
|
466
|
+
|
|
467
|
+
# Workflow selection
|
|
468
|
+
default_workflow: "standard" # fast_hooks, standard, comprehensive
|
|
469
|
+
auto_select_workflow: true # Auto-select based on options
|
|
470
|
+
|
|
471
|
+
# Step configuration
|
|
472
|
+
step_retry_enabled: true
|
|
473
|
+
step_retry_attempts: 1
|
|
474
|
+
step_retry_delay: 5 # Seconds between retries
|
|
475
|
+
step_timeout: 300 # Default step timeout
|
|
476
|
+
|
|
477
|
+
# Event bridge
|
|
478
|
+
event_bridge_enabled: true
|
|
479
|
+
emit_progress_events: true
|
|
480
|
+
progress_update_interval: 1.0 # Seconds
|
|
481
|
+
|
|
482
|
+
# Parallelization
|
|
483
|
+
enable_parallel_execution: true
|
|
484
|
+
parallel_fast_and_cleaning: true
|
|
485
|
+
parallel_all_checks: false # Experimental: all checks in parallel
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## Integration Examples
|
|
489
|
+
|
|
490
|
+
### With Agent System
|
|
491
|
+
|
|
492
|
+
```python
|
|
493
|
+
from crackerjack.workflows import CrackerjackWorkflowEngine
|
|
494
|
+
from crackerjack.intelligence import get_agent_orchestrator
|
|
495
|
+
|
|
496
|
+
engine = CrackerjackWorkflowEngine()
|
|
497
|
+
agent_orchestrator = get_agent_orchestrator()
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
# Register AI fixing action
|
|
501
|
+
@ACTION_REGISTRY.register("run_ai_fixing")
|
|
502
|
+
async def run_ai_fixing(context: dict) -> dict:
|
|
503
|
+
errors = context.get("errors", [])
|
|
504
|
+
fixed_count = 0
|
|
505
|
+
|
|
506
|
+
for error in errors:
|
|
507
|
+
result = await agent_orchestrator.fix_error(error)
|
|
508
|
+
if result.success:
|
|
509
|
+
fixed_count += 1
|
|
510
|
+
|
|
511
|
+
return {"fixed_count": fixed_count, "total_errors": len(errors)}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### With Hook Executors
|
|
515
|
+
|
|
516
|
+
```python
|
|
517
|
+
from crackerjack.executors import CachedHookExecutor
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
@ACTION_REGISTRY.register("run_fast_hooks")
|
|
521
|
+
async def run_fast_hooks(context: dict) -> dict:
|
|
522
|
+
options = context["options"]
|
|
523
|
+
executor = CachedHookExecutor(console=console, pkg_path=options.pkg_path)
|
|
524
|
+
|
|
525
|
+
result = executor.execute_strategy("fast_hooks")
|
|
526
|
+
|
|
527
|
+
return {
|
|
528
|
+
"success": result.success,
|
|
529
|
+
"duration": result.total_duration,
|
|
530
|
+
"cache_hit_rate": result.cache_hit_rate,
|
|
531
|
+
}
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
## Best Practices
|
|
535
|
+
|
|
536
|
+
1. **Use Declarative Definitions** - Define workflows declaratively for clarity
|
|
537
|
+
1. **Enable Parallelization** - Mark independent steps as parallel for speed
|
|
538
|
+
1. **Set Appropriate Timeouts** - Configure realistic timeouts for each step
|
|
539
|
+
1. **Handle Failures Gracefully** - Use retry logic for transient failures
|
|
540
|
+
1. **Minimize Dependencies** - Only declare necessary dependencies for max parallelism
|
|
541
|
+
1. **Use Event Bridge** - Leverage event system for progress tracking
|
|
542
|
+
1. **Context Passing** - Use context to share state between steps
|
|
543
|
+
1. **Workflow Selection** - Auto-select workflows based on CLI options
|
|
544
|
+
1. **Monitor Performance** - Track workflow execution metrics
|
|
545
|
+
1. **Test Custom Actions** - Thoroughly test custom action handlers
|
|
546
|
+
|
|
547
|
+
## Performance Considerations
|
|
548
|
+
|
|
549
|
+
### Execution Time Comparison
|
|
550
|
+
|
|
551
|
+
```
|
|
552
|
+
Sequential execution (no parallelization):
|
|
553
|
+
Standard workflow: ~120s
|
|
554
|
+
Comprehensive workflow: ~180s
|
|
555
|
+
|
|
556
|
+
Parallel execution (phase-level):
|
|
557
|
+
Standard workflow: ~60s (2x faster)
|
|
558
|
+
Comprehensive workflow: ~90s (2x faster)
|
|
559
|
+
|
|
560
|
+
Maximum parallelization:
|
|
561
|
+
Standard workflow: ~40s (3x faster)
|
|
562
|
+
Comprehensive workflow: ~60s (3x faster)
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
### Resource Usage
|
|
566
|
+
|
|
567
|
+
```
|
|
568
|
+
Base workflow engine: ~50MB
|
|
569
|
+
Event bridge overhead: ~5MB
|
|
570
|
+
Per workflow instance: ~10MB
|
|
571
|
+
Per concurrent step: ~20-50MB (depends on step type)
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## Related
|
|
575
|
+
|
|
576
|
+
- [Executors](<../executors/README.md>) - Hook execution engines
|
|
577
|
+
- [Intelligence](<../intelligence/README.md>) - Agent orchestration
|
|
578
|
+
- [Hooks](<../hooks/README.md>) - Hook system integration
|
|
579
|
+
- [CLAUDE.md](../../docs/guides/CLAUDE.md) - Workflow architecture overview
|
|
580
|
+
|
|
581
|
+
## Future Enhancements
|
|
582
|
+
|
|
583
|
+
- [ ] DAG visualization for workflow dependencies
|
|
584
|
+
- [ ] Workflow composition (combine multiple workflows)
|
|
585
|
+
- [ ] Conditional step execution based on context
|
|
586
|
+
- [ ] Dynamic workflow generation from project analysis
|
|
587
|
+
- [ ] Workflow templates for common patterns
|
|
588
|
+
- [ ] Distributed workflow execution across machines
|
|
589
|
+
- [ ] Real-time workflow monitoring dashboard
|
|
590
|
+
- [ ] Workflow versioning and rollback
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Workflow orchestration for crackerjack.
|
|
3
|
+
|
|
4
|
+
This module provides high-level workflows that coordinate multiple
|
|
5
|
+
agents and services to accomplish complex tasks like iterative auto-fixing.
|
|
6
|
+
|
|
7
|
+
It also provides ACB workflow integration for declarative workflow execution
|
|
8
|
+
with automatic parallelization and event-driven coordination.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from .actions import ACTION_REGISTRY, register_actions
|
|
12
|
+
from .auto_fix import AutoFixWorkflow, FixIteration
|
|
13
|
+
from .container_builder import WorkflowContainerBuilder
|
|
14
|
+
from .definitions import (
|
|
15
|
+
COMMIT_WORKFLOW,
|
|
16
|
+
COMPREHENSIVE_PARALLEL_WORKFLOW,
|
|
17
|
+
FAST_HOOKS_WORKFLOW,
|
|
18
|
+
PUBLISH_WORKFLOW,
|
|
19
|
+
STANDARD_WORKFLOW,
|
|
20
|
+
TEST_WORKFLOW,
|
|
21
|
+
select_workflow_for_options,
|
|
22
|
+
)
|
|
23
|
+
from .engine import CrackerjackWorkflowEngine
|
|
24
|
+
from .event_bridge import EventBridgeAdapter, StepEventMapping
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
# Legacy auto-fix workflow
|
|
28
|
+
"AutoFixWorkflow",
|
|
29
|
+
"FixIteration",
|
|
30
|
+
# ACB workflow integration
|
|
31
|
+
"CrackerjackWorkflowEngine",
|
|
32
|
+
"EventBridgeAdapter",
|
|
33
|
+
"StepEventMapping",
|
|
34
|
+
"WorkflowContainerBuilder",
|
|
35
|
+
# Workflow definitions
|
|
36
|
+
"FAST_HOOKS_WORKFLOW",
|
|
37
|
+
"STANDARD_WORKFLOW",
|
|
38
|
+
"TEST_WORKFLOW",
|
|
39
|
+
"COMMIT_WORKFLOW",
|
|
40
|
+
"PUBLISH_WORKFLOW",
|
|
41
|
+
"COMPREHENSIVE_PARALLEL_WORKFLOW",
|
|
42
|
+
"select_workflow_for_options",
|
|
43
|
+
# Action handlers
|
|
44
|
+
"ACTION_REGISTRY",
|
|
45
|
+
"register_actions",
|
|
46
|
+
]
|