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,401 @@
|
|
|
1
|
+
# Orchestration Strategies
|
|
2
|
+
|
|
3
|
+
> Crackerjack Docs: [Main](<../../../README.md>) | [CLAUDE.md](../../../docs/guides/CLAUDE.md) | [Orchestration](<../README.md>) | [Strategies](<./README.md>)
|
|
4
|
+
|
|
5
|
+
Execution strategy implementations for hook orchestration with parallel, sequential, and adaptive approaches.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Orchestration strategies define how hooks are executed during quality assurance workflows. Crackerjack provides three core strategies optimized for different scenarios: **Sequential** (dependencies, debugging), **Parallel** (independent hooks, maximum throughput), and **Adaptive** (dependency-aware batching, optimal parallelism).
|
|
10
|
+
|
|
11
|
+
## Strategy Pattern
|
|
12
|
+
|
|
13
|
+
All strategies implement the `ExecutionStrategyProtocol`:
|
|
14
|
+
|
|
15
|
+
```python
|
|
16
|
+
@runtime_checkable
|
|
17
|
+
class ExecutionStrategyProtocol(Protocol):
|
|
18
|
+
"""Protocol for hook execution strategies."""
|
|
19
|
+
|
|
20
|
+
async def execute(
|
|
21
|
+
self,
|
|
22
|
+
hooks: list[HookDefinition],
|
|
23
|
+
max_parallel: int = 3,
|
|
24
|
+
timeout: int = 300,
|
|
25
|
+
executor_callable: Callable[[HookDefinition], Awaitable[HookResult]]
|
|
26
|
+
| None = None,
|
|
27
|
+
) -> list[HookResult]:
|
|
28
|
+
"""Execute hooks according to strategy."""
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
def get_execution_order(
|
|
32
|
+
self,
|
|
33
|
+
hooks: list[HookDefinition],
|
|
34
|
+
) -> list[list[HookDefinition]]:
|
|
35
|
+
"""Return batches of hooks for execution."""
|
|
36
|
+
...
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Available Strategies
|
|
40
|
+
|
|
41
|
+
### 1. SequentialExecutionStrategy - One-at-a-Time Execution
|
|
42
|
+
|
|
43
|
+
**File:** `sequential_strategy.py`
|
|
44
|
+
|
|
45
|
+
**Features:**
|
|
46
|
+
|
|
47
|
+
- One hook executes at a time (respects dependencies)
|
|
48
|
+
- Early exit on critical security failures
|
|
49
|
+
- Per-hook timeout handling with `asyncio.wait_for()`
|
|
50
|
+
- Comprehensive logging for debugging
|
|
51
|
+
- Predictable execution order
|
|
52
|
+
|
|
53
|
+
**Use Cases:**
|
|
54
|
+
|
|
55
|
+
- Hooks have dependencies (e.g., gitleaks → bandit)
|
|
56
|
+
- Resource constraints require sequential execution
|
|
57
|
+
- Debugging requires isolated execution
|
|
58
|
+
- Critical failures should stop the pipeline immediately
|
|
59
|
+
|
|
60
|
+
**Example:**
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from crackerjack.orchestration.strategies import SequentialExecutionStrategy
|
|
64
|
+
|
|
65
|
+
strategy = SequentialExecutionStrategy(
|
|
66
|
+
default_timeout=300,
|
|
67
|
+
stop_on_critical_failure=True,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
results = await strategy.execute(
|
|
71
|
+
hooks=[hook1, hook2, hook3],
|
|
72
|
+
timeout=300,
|
|
73
|
+
executor_callable=execute_single_hook,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Execution order: hook1 → hook2 → hook3 (one at a time)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Execution Flow:**
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
Time →
|
|
83
|
+
[========hook1========] (3s)
|
|
84
|
+
[========hook2========] (2s)
|
|
85
|
+
[========hook3========] (4s)
|
|
86
|
+
|
|
87
|
+
Total time: 9s (sequential)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Configuration:**
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
SequentialExecutionStrategy(
|
|
94
|
+
default_timeout=300, # Default timeout per hook (seconds)
|
|
95
|
+
stop_on_critical_failure=True, # Stop if critical hook fails
|
|
96
|
+
)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 2. ParallelExecutionStrategy - Concurrent Execution
|
|
100
|
+
|
|
101
|
+
**File:** `parallel_strategy.py`
|
|
102
|
+
|
|
103
|
+
**Features:**
|
|
104
|
+
|
|
105
|
+
- Concurrent execution using `asyncio.gather()`
|
|
106
|
+
- Semaphore-based resource limiting (`asyncio.Semaphore`)
|
|
107
|
+
- Per-hook timeout handling
|
|
108
|
+
- Exception isolation (one failure doesn't stop others)
|
|
109
|
+
- Maximum throughput for independent hooks
|
|
110
|
+
|
|
111
|
+
**Use Cases:**
|
|
112
|
+
|
|
113
|
+
- Hooks are independent (no dependencies)
|
|
114
|
+
- Want to maximize throughput
|
|
115
|
+
- System has sufficient resources (CPU, memory)
|
|
116
|
+
- All hooks should complete regardless of individual failures
|
|
117
|
+
|
|
118
|
+
**Example:**
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
from crackerjack.orchestration.strategies import ParallelExecutionStrategy
|
|
122
|
+
|
|
123
|
+
strategy = ParallelExecutionStrategy(
|
|
124
|
+
max_parallel=4,
|
|
125
|
+
default_timeout=300,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
results = await strategy.execute(
|
|
129
|
+
hooks=[hook1, hook2, hook3, hook4, hook5],
|
|
130
|
+
max_parallel=4, # Run up to 4 hooks concurrently
|
|
131
|
+
timeout=300,
|
|
132
|
+
executor_callable=execute_single_hook,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# Execution: hook1-4 run concurrently, then hook5
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Execution Flow:**
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
Time →
|
|
142
|
+
[====hook1====] (3s)
|
|
143
|
+
[====hook2====] (2s)
|
|
144
|
+
[====hook3====] (4s)
|
|
145
|
+
[====hook4====] (3s)
|
|
146
|
+
[====hook5====] (2s)
|
|
147
|
+
|
|
148
|
+
Total time: 6s (parallel with max_parallel=4)
|
|
149
|
+
Speedup: 1.5x faster than sequential (9s)
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Configuration:**
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
ParallelExecutionStrategy(
|
|
156
|
+
max_parallel=4, # Maximum concurrent executions
|
|
157
|
+
default_timeout=300, # Default timeout per hook (seconds)
|
|
158
|
+
)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 3. AdaptiveExecutionStrategy - Dependency-Aware Batching
|
|
162
|
+
|
|
163
|
+
**File:** `adaptive_strategy.py`
|
|
164
|
+
|
|
165
|
+
**Features:**
|
|
166
|
+
|
|
167
|
+
- Topological sort for dependency-aware wave computation
|
|
168
|
+
- Parallel execution within each wave (independent hooks)
|
|
169
|
+
- Sequential execution between waves (respects dependencies)
|
|
170
|
+
- Early exit on critical security failures
|
|
171
|
+
- Optimal parallelism for mixed workloads
|
|
172
|
+
|
|
173
|
+
**Algorithm:**
|
|
174
|
+
|
|
175
|
+
1. Compute execution waves using topological sort
|
|
176
|
+
1. Wave 1: All hooks with zero dependencies (execute in parallel)
|
|
177
|
+
1. Wave 2: Hooks whose dependencies completed (execute in parallel)
|
|
178
|
+
1. Wave N: Repeat until all hooks executed
|
|
179
|
+
1. Stop early if critical hook fails
|
|
180
|
+
|
|
181
|
+
**Use Cases:**
|
|
182
|
+
|
|
183
|
+
- Mixed workload with some dependencies
|
|
184
|
+
- Want maximum parallelism while respecting dependencies
|
|
185
|
+
- Critical failures should stop dependent hooks
|
|
186
|
+
- Optimal strategy for most real-world scenarios
|
|
187
|
+
|
|
188
|
+
**Example:**
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
from crackerjack.orchestration.strategies import AdaptiveExecutionStrategy
|
|
192
|
+
|
|
193
|
+
# Define dependency graph: dependent → [prerequisites]
|
|
194
|
+
dependency_graph = {
|
|
195
|
+
"bandit": ["gitleaks"], # bandit depends on gitleaks
|
|
196
|
+
"refurb": ["zuban"], # refurb depends on zuban
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
strategy = AdaptiveExecutionStrategy(
|
|
200
|
+
dependency_graph=dependency_graph,
|
|
201
|
+
max_parallel=4,
|
|
202
|
+
default_timeout=300,
|
|
203
|
+
stop_on_critical_failure=True,
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
results = await strategy.execute(
|
|
207
|
+
hooks=[gitleaks, zuban, ruff_format, bandit, refurb],
|
|
208
|
+
executor_callable=execute_single_hook,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
# Wave 1 (parallel): gitleaks, zuban, ruff-format (no dependencies)
|
|
212
|
+
# Wave 2 (parallel): bandit, refurb (dependencies completed)
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Execution Flow:**
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
Dependency Graph:
|
|
219
|
+
gitleaks → bandit
|
|
220
|
+
zuban → refurb
|
|
221
|
+
ruff-format (independent)
|
|
222
|
+
|
|
223
|
+
Time →
|
|
224
|
+
Wave 1 (parallel):
|
|
225
|
+
[====gitleaks====] (3s)
|
|
226
|
+
[====zuban====] (2s)
|
|
227
|
+
[====ruff-format====] (1s)
|
|
228
|
+
|
|
229
|
+
Wave 2 (parallel):
|
|
230
|
+
[====bandit====] (3s)
|
|
231
|
+
[====refurb====] (2s)
|
|
232
|
+
|
|
233
|
+
Total time: 6s (adaptive batching)
|
|
234
|
+
Speedup: 1.5x faster than sequential (11s)
|
|
235
|
+
Optimal parallelism while respecting dependencies
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**Configuration:**
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
AdaptiveExecutionStrategy(
|
|
242
|
+
dependency_graph={
|
|
243
|
+
"bandit": ["gitleaks"],
|
|
244
|
+
"refurb": ["zuban"],
|
|
245
|
+
},
|
|
246
|
+
max_parallel=4, # Maximum concurrent executions per wave
|
|
247
|
+
default_timeout=300, # Default timeout per hook (seconds)
|
|
248
|
+
stop_on_critical_failure=True, # Stop if critical hook fails
|
|
249
|
+
)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## When to Use Each Strategy
|
|
253
|
+
|
|
254
|
+
| Scenario | Recommended Strategy | Reason |
|
|
255
|
+
|----------|---------------------|---------|
|
|
256
|
+
| Hooks have dependencies | Sequential or Adaptive | Respects execution order |
|
|
257
|
+
| All hooks independent | Parallel | Maximum throughput |
|
|
258
|
+
| Mixed dependencies | Adaptive | Optimal parallelism |
|
|
259
|
+
| Debugging flaky hooks | Sequential | Isolated execution |
|
|
260
|
+
| Resource constrained | Sequential | Controlled resource usage |
|
|
261
|
+
| Critical security gates | Sequential or Adaptive | Early exit on failure |
|
|
262
|
+
| Maximum speed | Parallel | All hooks run concurrently |
|
|
263
|
+
|
|
264
|
+
## Creating Custom Strategies
|
|
265
|
+
|
|
266
|
+
Implement the `ExecutionStrategyProtocol`:
|
|
267
|
+
|
|
268
|
+
```python
|
|
269
|
+
import asyncio
|
|
270
|
+
from crackerjack.config.hooks import HookDefinition
|
|
271
|
+
from crackerjack.models.task import HookResult
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
class CustomExecutionStrategy:
|
|
275
|
+
"""Custom execution strategy."""
|
|
276
|
+
|
|
277
|
+
async def execute(
|
|
278
|
+
self,
|
|
279
|
+
hooks: list[HookDefinition],
|
|
280
|
+
max_parallel: int = 3,
|
|
281
|
+
timeout: int = 300,
|
|
282
|
+
executor_callable: Callable[[HookDefinition], Awaitable[HookResult]]
|
|
283
|
+
| None = None,
|
|
284
|
+
) -> list[HookResult]:
|
|
285
|
+
"""Custom execution logic."""
|
|
286
|
+
results = []
|
|
287
|
+
|
|
288
|
+
# Your custom execution logic here
|
|
289
|
+
for hook in hooks:
|
|
290
|
+
if executor_callable:
|
|
291
|
+
result = await executor_callable(hook)
|
|
292
|
+
else:
|
|
293
|
+
result = self._placeholder_result(hook)
|
|
294
|
+
results.append(result)
|
|
295
|
+
|
|
296
|
+
return results
|
|
297
|
+
|
|
298
|
+
def get_execution_order(
|
|
299
|
+
self,
|
|
300
|
+
hooks: list[HookDefinition],
|
|
301
|
+
) -> list[list[HookDefinition]]:
|
|
302
|
+
"""Define execution batches."""
|
|
303
|
+
# Return custom batching logic
|
|
304
|
+
return [[hook] for hook in hooks]
|
|
305
|
+
|
|
306
|
+
def _placeholder_result(self, hook: HookDefinition) -> HookResult:
|
|
307
|
+
"""Placeholder when no executor provided."""
|
|
308
|
+
return HookResult(
|
|
309
|
+
id=hook.name,
|
|
310
|
+
name=hook.name,
|
|
311
|
+
status="passed",
|
|
312
|
+
duration=0.0,
|
|
313
|
+
)
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Integration with Hook Orchestration
|
|
317
|
+
|
|
318
|
+
Strategies are used by the hook orchestrator:
|
|
319
|
+
|
|
320
|
+
```python
|
|
321
|
+
from acb.depends import depends
|
|
322
|
+
from crackerjack.orchestration.strategies import AdaptiveExecutionStrategy
|
|
323
|
+
from crackerjack.models.protocols import HookOrchestratorProtocol
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
@depends.inject
|
|
327
|
+
async def run_hooks_with_strategy(
|
|
328
|
+
orchestrator: HookOrchestratorProtocol = depends(),
|
|
329
|
+
) -> list[HookResult]:
|
|
330
|
+
"""Execute hooks using adaptive strategy."""
|
|
331
|
+
# Define strategy
|
|
332
|
+
strategy = AdaptiveExecutionStrategy(
|
|
333
|
+
dependency_graph={"bandit": ["gitleaks"]},
|
|
334
|
+
max_parallel=4,
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
# Execute via orchestrator
|
|
338
|
+
results = await orchestrator.execute_strategy(
|
|
339
|
+
strategy=strategy,
|
|
340
|
+
execution_mode="acb", # Direct adapter invocation
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
return results
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Performance Comparison
|
|
347
|
+
|
|
348
|
+
**Test scenario:** 10 hooks, 3 seconds each, 4 cores available
|
|
349
|
+
|
|
350
|
+
| Strategy | Execution Time | Speedup | Resource Usage |
|
|
351
|
+
|----------|----------------|---------|----------------|
|
|
352
|
+
| Sequential | 30s (10 × 3s) | 1x baseline | Low (1 core) |
|
|
353
|
+
| Parallel (max=4) | 9s (⌈10/4⌉ × 3s) | 3.3x faster | High (4 cores) |
|
|
354
|
+
| Adaptive (2 waves) | 15s (2 waves × 3s) | 2x faster | Medium (2-4 cores) |
|
|
355
|
+
|
|
356
|
+
**Recommendation:** Use Adaptive strategy for best balance of speed and resource efficiency.
|
|
357
|
+
|
|
358
|
+
## Best Practices
|
|
359
|
+
|
|
360
|
+
1. **Choose Strategy Appropriately**: Match strategy to workload characteristics
|
|
361
|
+
1. **Configure max_parallel**: Set based on available CPU cores and memory
|
|
362
|
+
1. **Set Reasonable Timeouts**: Hook timeouts should account for worst-case scenarios
|
|
363
|
+
1. **Handle Critical Failures**: Use `stop_on_critical_failure` for security hooks
|
|
364
|
+
1. **Monitor Performance**: Track execution times and adjust strategies
|
|
365
|
+
1. **Log Structured Data**: Strategies provide comprehensive logging for debugging
|
|
366
|
+
1. **Test Strategies**: Verify strategy behavior with test suites
|
|
367
|
+
|
|
368
|
+
## Configuration via Settings
|
|
369
|
+
|
|
370
|
+
```yaml
|
|
371
|
+
# settings/crackerjack.yaml
|
|
372
|
+
hook_execution:
|
|
373
|
+
strategy: adaptive # sequential, parallel, or adaptive
|
|
374
|
+
max_parallel_hooks: 4
|
|
375
|
+
default_timeout: 300
|
|
376
|
+
stop_on_critical_failure: true
|
|
377
|
+
|
|
378
|
+
# Dependency graph for adaptive strategy
|
|
379
|
+
dependencies:
|
|
380
|
+
bandit:
|
|
381
|
+
- gitleaks
|
|
382
|
+
refurb:
|
|
383
|
+
- zuban
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Related Documentation
|
|
387
|
+
|
|
388
|
+
- [Orchestration Cache](<../cache/README.md>) - Caching for hook results
|
|
389
|
+
- [Hook Orchestration](<../README.md>) - Overall orchestration architecture
|
|
390
|
+
- [Models](<../../models/README.md>) - ExecutionStrategyProtocol definition
|
|
391
|
+
- [Core](<../../core/README.md>) - Workflow coordinators
|
|
392
|
+
- [CLAUDE.md](../../../docs/guides/CLAUDE.md) - Architecture patterns
|
|
393
|
+
|
|
394
|
+
## Future Enhancements
|
|
395
|
+
|
|
396
|
+
- Dynamic strategy selection based on workload analysis
|
|
397
|
+
- Resource-aware scheduling (CPU, memory constraints)
|
|
398
|
+
- Priority-based execution (critical hooks first)
|
|
399
|
+
- Distributed execution across multiple machines
|
|
400
|
+
- Machine learning-based dependency detection
|
|
401
|
+
- Real-time strategy adaptation based on performance metrics
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Execution strategies for hook orchestration.
|
|
2
|
+
|
|
3
|
+
This package provides different execution strategies for running hooks:
|
|
4
|
+
- ParallelExecutionStrategy: Concurrent execution with resource limits
|
|
5
|
+
- SequentialExecutionStrategy: One-at-a-time execution for dependent hooks
|
|
6
|
+
|
|
7
|
+
Strategies implement ExecutionStrategyProtocol and handle:
|
|
8
|
+
- Timeout management per hook
|
|
9
|
+
- Exception isolation
|
|
10
|
+
- Resource limiting (semaphores for parallel)
|
|
11
|
+
- Early exit on critical failures (sequential)
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"ParallelExecutionStrategy",
|
|
18
|
+
"SequentialExecutionStrategy",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# Lazy imports
|
|
23
|
+
from typing import Any
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def __getattr__(name: str) -> Any:
|
|
27
|
+
if name == "ParallelExecutionStrategy":
|
|
28
|
+
from crackerjack.orchestration.strategies.parallel_strategy import (
|
|
29
|
+
ParallelExecutionStrategy,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
return ParallelExecutionStrategy
|
|
33
|
+
elif name == "SequentialExecutionStrategy":
|
|
34
|
+
from crackerjack.orchestration.strategies.sequential_strategy import (
|
|
35
|
+
SequentialExecutionStrategy,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
return SequentialExecutionStrategy
|
|
39
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|