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,591 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | Executors
|
|
2
|
+
|
|
3
|
+
# Executors
|
|
4
|
+
|
|
5
|
+
Execution engines and task runners for intelligent hook execution, caching, and progress tracking.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The executors package provides specialized execution engines for running quality hooks with various optimization strategies. Executors handle parallel execution, result caching, progress tracking, LSP integration, and lock management to ensure efficient and reliable quality checks.
|
|
10
|
+
|
|
11
|
+
## Executor Types
|
|
12
|
+
|
|
13
|
+
### Core Executors
|
|
14
|
+
|
|
15
|
+
- **`hook_executor.py`** - Base hook executor with sequential and parallel execution
|
|
16
|
+
- **`async_hook_executor.py`** - Asynchronous hook execution for concurrent workflows
|
|
17
|
+
- **`cached_hook_executor.py`** - Smart caching for repeated hook executions
|
|
18
|
+
- **`progress_hook_executor.py`** - Real-time progress tracking and reporting
|
|
19
|
+
- **`individual_hook_executor.py`** - Single-hook execution with detailed reporting
|
|
20
|
+
|
|
21
|
+
### Specialized Executors
|
|
22
|
+
|
|
23
|
+
- **`lsp_aware_hook_executor.py`** - LSP-optimized execution for type checking
|
|
24
|
+
- **`hook_lock_manager.py`** - Lock management to prevent concurrent execution conflicts
|
|
25
|
+
- **`tool_proxy.py`** - Proxy layer for tool execution with error handling
|
|
26
|
+
|
|
27
|
+
## Core Components
|
|
28
|
+
|
|
29
|
+
### HookExecutor
|
|
30
|
+
|
|
31
|
+
Base executor providing fundamental hook execution capabilities:
|
|
32
|
+
|
|
33
|
+
**Features:**
|
|
34
|
+
|
|
35
|
+
- **Sequential Execution** - Run hooks one after another
|
|
36
|
+
- **Parallel Execution** - Run compatible hooks concurrently
|
|
37
|
+
- **Strategy Execution** - Execute predefined hook strategies (fast/comprehensive)
|
|
38
|
+
- **Retry Logic** - Automatic retry for formatting hooks
|
|
39
|
+
- **Progress Callbacks** - Optional progress tracking hooks
|
|
40
|
+
- **Timeout Management** - Per-hook and global timeout enforcement
|
|
41
|
+
- **Result Aggregation** - Collect and summarize execution results
|
|
42
|
+
|
|
43
|
+
**Usage:**
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
from crackerjack.executors import HookExecutor
|
|
47
|
+
from pathlib import Path
|
|
48
|
+
|
|
49
|
+
executor = HookExecutor(
|
|
50
|
+
console=console,
|
|
51
|
+
pkg_path=Path.cwd(),
|
|
52
|
+
verbose=True,
|
|
53
|
+
quiet=False,
|
|
54
|
+
debug=False,
|
|
55
|
+
use_incremental=True, # Enable incremental execution
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
# Execute strategy
|
|
59
|
+
result = executor.execute_strategy(
|
|
60
|
+
strategy_name="fast_hooks", parallel=True, max_workers=4
|
|
61
|
+
)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### AsyncHookExecutor
|
|
65
|
+
|
|
66
|
+
Asynchronous executor for concurrent workflow integration:
|
|
67
|
+
|
|
68
|
+
**Features:**
|
|
69
|
+
|
|
70
|
+
- **True Async Execution** - Native asyncio support
|
|
71
|
+
- **Concurrent Hook Groups** - Run independent hook groups in parallel
|
|
72
|
+
- **Event Loop Integration** - Works with existing event loops
|
|
73
|
+
- **Async Context Managers** - Proper resource cleanup
|
|
74
|
+
- **Backpressure Handling** - Prevents system overload
|
|
75
|
+
|
|
76
|
+
**Usage:**
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from crackerjack.executors import AsyncHookExecutor
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
async def run_hooks():
|
|
83
|
+
executor = AsyncHookExecutor(console=console, pkg_path=pkg_path)
|
|
84
|
+
|
|
85
|
+
# Run hooks asynchronously
|
|
86
|
+
result = await executor.execute_strategy_async("fast_hooks")
|
|
87
|
+
|
|
88
|
+
return result
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### CachedHookExecutor
|
|
92
|
+
|
|
93
|
+
Smart caching executor with intelligent cache invalidation:
|
|
94
|
+
|
|
95
|
+
**Features:**
|
|
96
|
+
|
|
97
|
+
- **Result Caching** - Cache hook execution results
|
|
98
|
+
- **File-Based Invalidation** - Invalidate cache when files change
|
|
99
|
+
- **Smart Cache Manager** - Intelligent cache key generation
|
|
100
|
+
- **Hit Rate Tracking** - Monitor cache effectiveness
|
|
101
|
+
- **TTL Management** - Time-based cache expiration
|
|
102
|
+
- **Memory Efficient** - LRU eviction for large projects
|
|
103
|
+
|
|
104
|
+
**Cache Strategy:**
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
from crackerjack.executors import CachedHookExecutor, SmartCacheManager
|
|
108
|
+
|
|
109
|
+
cache_manager = SmartCacheManager(
|
|
110
|
+
cache_dir=Path(".crackerjack/cache"),
|
|
111
|
+
ttl_seconds=3600, # 1 hour
|
|
112
|
+
max_cache_size_mb=100,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
executor = CachedHookExecutor(
|
|
116
|
+
console=console, pkg_path=pkg_path, cache_manager=cache_manager
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# First execution - cache miss
|
|
120
|
+
result1 = executor.execute_strategy("fast_hooks")
|
|
121
|
+
print(f"Cache hits: {result1.cache_hits}, misses: {result1.cache_misses}")
|
|
122
|
+
|
|
123
|
+
# Second execution - cache hit (if no files changed)
|
|
124
|
+
result2 = executor.execute_strategy("fast_hooks")
|
|
125
|
+
print(f"Performance gain: {result2.performance_gain:.1%}")
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### ProgressHookExecutor
|
|
129
|
+
|
|
130
|
+
Real-time progress tracking with rich console output:
|
|
131
|
+
|
|
132
|
+
**Features:**
|
|
133
|
+
|
|
134
|
+
- **Live Progress Display** - Real-time progress bars
|
|
135
|
+
- **Task Tracking** - Individual hook progress
|
|
136
|
+
- **Time Estimates** - Remaining time calculations
|
|
137
|
+
- **Success/Failure Visualization** - Color-coded status
|
|
138
|
+
- **Detailed Reporting** - Per-hook execution details
|
|
139
|
+
|
|
140
|
+
**Usage:**
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
from crackerjack.executors import ProgressHookExecutor
|
|
144
|
+
from rich.progress import Progress
|
|
145
|
+
|
|
146
|
+
with Progress() as progress:
|
|
147
|
+
executor = ProgressHookExecutor(
|
|
148
|
+
console=console, pkg_path=pkg_path, progress=progress
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Progress automatically tracked and displayed
|
|
152
|
+
result = executor.execute_strategy("comprehensive_hooks")
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### IndividualHookExecutor
|
|
156
|
+
|
|
157
|
+
Execute single hooks with detailed error reporting:
|
|
158
|
+
|
|
159
|
+
**Features:**
|
|
160
|
+
|
|
161
|
+
- **Single Hook Focus** - Detailed execution of one hook
|
|
162
|
+
- **Enhanced Error Reporting** - Full error context and stack traces
|
|
163
|
+
- **Debugging Support** - Verbose output for troubleshooting
|
|
164
|
+
- **Exit Code Handling** - Proper subprocess exit code interpretation
|
|
165
|
+
- **Output Streaming** - Real-time stdout/stderr streaming
|
|
166
|
+
|
|
167
|
+
**Usage:**
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from crackerjack.executors import IndividualHookExecutor
|
|
171
|
+
|
|
172
|
+
executor = IndividualHookExecutor(
|
|
173
|
+
console=console,
|
|
174
|
+
pkg_path=pkg_path,
|
|
175
|
+
debug=True, # Enable debug output
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# Execute single hook
|
|
179
|
+
result = executor.execute_hook(
|
|
180
|
+
hook_name="ruff-check",
|
|
181
|
+
files=[Path("src/main.py")], # Optional file targeting
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if not result.success:
|
|
185
|
+
print(f"Hook failed with exit code: {result.exit_code}")
|
|
186
|
+
print(f"Error output:\n{result.stderr}")
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### LSPAwareHookExecutor
|
|
190
|
+
|
|
191
|
+
LSP-optimized executor for ultra-fast type checking:
|
|
192
|
+
|
|
193
|
+
**Features:**
|
|
194
|
+
|
|
195
|
+
- **LSP Integration** - Communicates with running LSP servers
|
|
196
|
+
- **Incremental Analysis** - Only check changed files
|
|
197
|
+
- **Fallback Support** - Falls back to direct execution if LSP unavailable
|
|
198
|
+
- **Server Health Checking** - Monitors LSP server status
|
|
199
|
+
- **Shared State** - Leverages LSP server's incremental compilation
|
|
200
|
+
|
|
201
|
+
**Performance:**
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
Traditional execution: ~30-60s
|
|
205
|
+
LSP-aware execution: ~2-5s (10-20x faster)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
**Usage:**
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
from crackerjack.executors import LSPAwareHookExecutor
|
|
212
|
+
|
|
213
|
+
executor = LSPAwareHookExecutor(
|
|
214
|
+
console=console, pkg_path=pkg_path, lsp_enabled=True, fallback_enabled=True
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
# Uses LSP server if available, falls back otherwise
|
|
218
|
+
result = executor.execute_type_checking()
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### HookLockManager
|
|
222
|
+
|
|
223
|
+
Prevents concurrent execution conflicts with file-based locking:
|
|
224
|
+
|
|
225
|
+
**Features:**
|
|
226
|
+
|
|
227
|
+
- **File-Based Locks** - Prevents multiple simultaneous executions
|
|
228
|
+
- **Timeout Support** - Configurable lock acquisition timeout
|
|
229
|
+
- **Deadlock Prevention** - Automatic lock release on timeout
|
|
230
|
+
- **Atomic Operations** - Thread-safe lock management
|
|
231
|
+
- **Context Manager Support** - Automatic lock cleanup
|
|
232
|
+
|
|
233
|
+
**Usage:**
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
from crackerjack.executors import HookLockManager
|
|
237
|
+
|
|
238
|
+
lock_manager = HookLockManager(
|
|
239
|
+
lock_dir=Path(".crackerjack/locks"),
|
|
240
|
+
timeout=60, # seconds
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
with lock_manager.acquire_lock("fast_hooks"):
|
|
244
|
+
# Only one process can execute this block at a time
|
|
245
|
+
result = executor.execute_strategy("fast_hooks")
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### ToolProxy
|
|
249
|
+
|
|
250
|
+
Proxy layer for tool execution with unified error handling:
|
|
251
|
+
|
|
252
|
+
**Features:**
|
|
253
|
+
|
|
254
|
+
- **Unified Interface** - Consistent tool execution API
|
|
255
|
+
- **Error Normalization** - Standardized error reporting
|
|
256
|
+
- **Output Parsing** - Structured output from various tools
|
|
257
|
+
- **Retry Logic** - Configurable retry for transient failures
|
|
258
|
+
- **Timeout Enforcement** - Prevents hung processes
|
|
259
|
+
|
|
260
|
+
**Usage:**
|
|
261
|
+
|
|
262
|
+
```python
|
|
263
|
+
from crackerjack.executors import ToolProxy
|
|
264
|
+
|
|
265
|
+
proxy = ToolProxy(console=console, timeout=120, retries=1)
|
|
266
|
+
|
|
267
|
+
# Execute tool through proxy
|
|
268
|
+
result = proxy.execute_tool(tool_name="ruff", args=["check", "src"], cwd=pkg_path)
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Execution Patterns
|
|
272
|
+
|
|
273
|
+
### Sequential Execution
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
from crackerjack.executors import HookExecutor
|
|
277
|
+
|
|
278
|
+
executor = HookExecutor(console=console, pkg_path=pkg_path)
|
|
279
|
+
|
|
280
|
+
# Execute hooks one by one
|
|
281
|
+
result = executor.execute_strategy(
|
|
282
|
+
strategy_name="fast_hooks",
|
|
283
|
+
parallel=False, # Sequential execution
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
print(f"Total duration: {result.total_duration:.2f}s")
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Parallel Execution
|
|
290
|
+
|
|
291
|
+
```python
|
|
292
|
+
# Execute compatible hooks in parallel
|
|
293
|
+
result = executor.execute_strategy(
|
|
294
|
+
strategy_name="comprehensive_hooks",
|
|
295
|
+
parallel=True,
|
|
296
|
+
max_workers=4, # Number of parallel workers
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
print(f"Concurrent execution: {result.concurrent_execution}")
|
|
300
|
+
print(f"Duration: {result.total_duration:.2f}s")
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Cached Execution
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
from crackerjack.executors import CachedHookExecutor
|
|
307
|
+
|
|
308
|
+
cached_executor = CachedHookExecutor(console=console, pkg_path=pkg_path)
|
|
309
|
+
|
|
310
|
+
# First run - populates cache
|
|
311
|
+
result1 = cached_executor.execute_strategy("fast_hooks")
|
|
312
|
+
|
|
313
|
+
# Second run - uses cache for unchanged files
|
|
314
|
+
result2 = cached_executor.execute_strategy("fast_hooks")
|
|
315
|
+
|
|
316
|
+
print(f"Cache hit rate: {result2.cache_hit_rate:.1%}")
|
|
317
|
+
print(f"Performance gain: {result2.performance_gain:.1%}")
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Async Execution
|
|
321
|
+
|
|
322
|
+
```python
|
|
323
|
+
from crackerjack.executors import AsyncHookExecutor
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
async def run_quality_checks():
|
|
327
|
+
executor = AsyncHookExecutor(console=console, pkg_path=pkg_path)
|
|
328
|
+
|
|
329
|
+
# Run multiple hook strategies concurrently
|
|
330
|
+
fast_result, comp_result = await asyncio.gather(
|
|
331
|
+
executor.execute_strategy_async("fast_hooks"),
|
|
332
|
+
executor.execute_strategy_async("comprehensive_hooks"),
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
return fast_result, comp_result
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Progress Tracking
|
|
339
|
+
|
|
340
|
+
```python
|
|
341
|
+
from crackerjack.executors import ProgressHookExecutor
|
|
342
|
+
from rich.progress import Progress
|
|
343
|
+
|
|
344
|
+
with Progress() as progress:
|
|
345
|
+
executor = ProgressHookExecutor(
|
|
346
|
+
console=console, pkg_path=pkg_path, progress=progress
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
# Progress bars automatically displayed
|
|
350
|
+
result = executor.execute_strategy("comprehensive_hooks")
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## HookExecutionResult
|
|
354
|
+
|
|
355
|
+
All executors return `HookExecutionResult` with comprehensive execution data:
|
|
356
|
+
|
|
357
|
+
```python
|
|
358
|
+
@dataclass
|
|
359
|
+
class HookExecutionResult:
|
|
360
|
+
strategy_name: str # Strategy executed
|
|
361
|
+
results: list[HookResult] # Individual hook results
|
|
362
|
+
total_duration: float # Total execution time
|
|
363
|
+
success: bool # Overall success status
|
|
364
|
+
concurrent_execution: bool # Was execution parallel?
|
|
365
|
+
cache_hits: int # Number of cache hits
|
|
366
|
+
cache_misses: int # Number of cache misses
|
|
367
|
+
performance_gain: float # Performance improvement %
|
|
368
|
+
|
|
369
|
+
@property
|
|
370
|
+
def failed_count(self) -> int:
|
|
371
|
+
"""Number of failed hooks."""
|
|
372
|
+
|
|
373
|
+
@property
|
|
374
|
+
def passed_count(self) -> int:
|
|
375
|
+
"""Number of passed hooks."""
|
|
376
|
+
|
|
377
|
+
@property
|
|
378
|
+
def cache_hit_rate(self) -> float:
|
|
379
|
+
"""Cache hit rate percentage."""
|
|
380
|
+
|
|
381
|
+
@property
|
|
382
|
+
def performance_summary(self) -> dict:
|
|
383
|
+
"""Comprehensive performance metrics."""
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
## Configuration
|
|
387
|
+
|
|
388
|
+
Executors are configured through ACB Settings:
|
|
389
|
+
|
|
390
|
+
```yaml
|
|
391
|
+
# settings/crackerjack.yaml
|
|
392
|
+
|
|
393
|
+
# Executor configuration
|
|
394
|
+
executor_type: "cached" # base, cached, async, progress
|
|
395
|
+
max_parallel_hooks: 4
|
|
396
|
+
hook_timeout: 300
|
|
397
|
+
retry_attempts: 1
|
|
398
|
+
|
|
399
|
+
# Cache configuration
|
|
400
|
+
cache_enabled: true
|
|
401
|
+
cache_ttl: 3600 # 1 hour
|
|
402
|
+
cache_max_size_mb: 100
|
|
403
|
+
cache_dir: ".crackerjack/cache"
|
|
404
|
+
|
|
405
|
+
# LSP configuration
|
|
406
|
+
lsp_executor_enabled: true
|
|
407
|
+
lsp_fallback_enabled: true
|
|
408
|
+
lsp_server_timeout: 30
|
|
409
|
+
|
|
410
|
+
# Progress tracking
|
|
411
|
+
progress_enabled: true
|
|
412
|
+
progress_style: "rich" # rich, simple, none
|
|
413
|
+
|
|
414
|
+
# Lock management
|
|
415
|
+
lock_enabled: true
|
|
416
|
+
lock_timeout: 60
|
|
417
|
+
lock_dir: ".crackerjack/locks"
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
## Usage Examples
|
|
421
|
+
|
|
422
|
+
### Basic Hook Execution
|
|
423
|
+
|
|
424
|
+
```python
|
|
425
|
+
from crackerjack.executors import HookExecutor
|
|
426
|
+
from pathlib import Path
|
|
427
|
+
|
|
428
|
+
executor = HookExecutor(console=console, pkg_path=Path.cwd(), verbose=True)
|
|
429
|
+
|
|
430
|
+
# Execute fast hooks
|
|
431
|
+
result = executor.execute_strategy("fast_hooks")
|
|
432
|
+
|
|
433
|
+
if result.success:
|
|
434
|
+
print(f"✅ All {result.passed_count} hooks passed")
|
|
435
|
+
print(f"Duration: {result.total_duration:.2f}s")
|
|
436
|
+
else:
|
|
437
|
+
print(f"❌ {result.failed_count} hooks failed")
|
|
438
|
+
for hook_result in result.results:
|
|
439
|
+
if hook_result.status == "failed":
|
|
440
|
+
print(f" - {hook_result.name}: {hook_result.message}")
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### Cached Execution with Metrics
|
|
444
|
+
|
|
445
|
+
```python
|
|
446
|
+
from crackerjack.executors import CachedHookExecutor
|
|
447
|
+
|
|
448
|
+
executor = CachedHookExecutor(console=console, pkg_path=pkg_path)
|
|
449
|
+
|
|
450
|
+
# Multiple executions to demonstrate caching
|
|
451
|
+
for i in range(3):
|
|
452
|
+
result = executor.execute_strategy("fast_hooks")
|
|
453
|
+
print(f"Run {i + 1}:")
|
|
454
|
+
print(f" Duration: {result.total_duration:.2f}s")
|
|
455
|
+
print(f" Cache hits: {result.cache_hits}")
|
|
456
|
+
print(f" Cache hit rate: {result.cache_hit_rate:.1%}")
|
|
457
|
+
print(f" Performance gain: {result.performance_gain:.1%}")
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### LSP-Aware Type Checking
|
|
461
|
+
|
|
462
|
+
```python
|
|
463
|
+
from crackerjack.executors import LSPAwareHookExecutor
|
|
464
|
+
|
|
465
|
+
executor = LSPAwareHookExecutor(console=console, pkg_path=pkg_path, lsp_enabled=True)
|
|
466
|
+
|
|
467
|
+
# Fast type checking via LSP
|
|
468
|
+
result = executor.execute_type_checking()
|
|
469
|
+
|
|
470
|
+
print(f"Type checking completed in {result.total_duration:.2f}s")
|
|
471
|
+
print(f"Used LSP: {result.used_lsp}")
|
|
472
|
+
print(f"Speedup: {result.speedup_factor:.1f}x")
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### Progress Tracking with Rich Console
|
|
476
|
+
|
|
477
|
+
```python
|
|
478
|
+
from crackerjack.executors import ProgressHookExecutor
|
|
479
|
+
from rich.progress import Progress
|
|
480
|
+
from rich.console import Console
|
|
481
|
+
|
|
482
|
+
console = Console()
|
|
483
|
+
|
|
484
|
+
with Progress() as progress:
|
|
485
|
+
executor = ProgressHookExecutor(
|
|
486
|
+
console=console, pkg_path=pkg_path, progress=progress
|
|
487
|
+
)
|
|
488
|
+
|
|
489
|
+
# Rich progress bars displayed automatically
|
|
490
|
+
result = executor.execute_strategy("comprehensive_hooks")
|
|
491
|
+
|
|
492
|
+
console.print(f"\n[green]✓[/green] Completed in {result.total_duration:.2f}s")
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### Custom Hook Execution
|
|
496
|
+
|
|
497
|
+
```python
|
|
498
|
+
from crackerjack.config.hooks import HookDefinition, HookStage
|
|
499
|
+
|
|
500
|
+
custom_hook = HookDefinition(
|
|
501
|
+
name="custom-check",
|
|
502
|
+
command=["python", "-m", "my_tool"],
|
|
503
|
+
timeout=120,
|
|
504
|
+
stage=HookStage.COMPREHENSIVE,
|
|
505
|
+
retry_on_failure=False,
|
|
506
|
+
)
|
|
507
|
+
|
|
508
|
+
executor = HookExecutor(console=console, pkg_path=pkg_path)
|
|
509
|
+
|
|
510
|
+
# Execute custom hook
|
|
511
|
+
result = executor.execute_hook(custom_hook)
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
## Integration with Workflows
|
|
515
|
+
|
|
516
|
+
Executors integrate seamlessly with ACB workflows:
|
|
517
|
+
|
|
518
|
+
```python
|
|
519
|
+
from crackerjack.workflows import CrackerjackWorkflowEngine
|
|
520
|
+
from crackerjack.executors import CachedHookExecutor
|
|
521
|
+
|
|
522
|
+
engine = CrackerjackWorkflowEngine()
|
|
523
|
+
executor = CachedHookExecutor(console=console, pkg_path=pkg_path)
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
# Register executor as workflow action
|
|
527
|
+
@engine.register_action("run_fast_hooks")
|
|
528
|
+
async def run_fast_hooks(context):
|
|
529
|
+
result = executor.execute_strategy("fast_hooks")
|
|
530
|
+
return {"success": result.success, "duration": result.total_duration}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
## Best Practices
|
|
534
|
+
|
|
535
|
+
1. **Use Cached Executor** - Enable caching for repeated executions (development workflow)
|
|
536
|
+
1. **Enable Parallelization** - Run independent hooks in parallel when possible
|
|
537
|
+
1. **Configure Timeouts** - Set appropriate timeouts for long-running hooks
|
|
538
|
+
1. **Monitor Cache Performance** - Track cache hit rates and adjust TTL
|
|
539
|
+
1. **Use LSP Executor** - Enable LSP for 10-20x faster type checking
|
|
540
|
+
1. **Handle Lock Timeouts** - Configure lock timeouts to prevent deadlocks
|
|
541
|
+
1. **Track Progress** - Use ProgressHookExecutor for long-running operations
|
|
542
|
+
1. **Retry Formatting Only** - Only retry formatting hooks, not analysis hooks
|
|
543
|
+
1. **Async for Workflows** - Use AsyncHookExecutor for workflow integration
|
|
544
|
+
1. **Monitor Performance** - Track execution metrics and optimize slow hooks
|
|
545
|
+
|
|
546
|
+
## Performance Considerations
|
|
547
|
+
|
|
548
|
+
### Execution Time Comparison
|
|
549
|
+
|
|
550
|
+
```
|
|
551
|
+
Sequential (base executor):
|
|
552
|
+
Fast hooks: ~15s
|
|
553
|
+
Comprehensive hooks: ~45s
|
|
554
|
+
|
|
555
|
+
Parallel (max_workers=4):
|
|
556
|
+
Fast hooks: ~5s (3x faster)
|
|
557
|
+
Comprehensive hooks: ~15s (3x faster)
|
|
558
|
+
|
|
559
|
+
Cached (after warmup):
|
|
560
|
+
Fast hooks: ~1s (15x faster)
|
|
561
|
+
Comprehensive hooks: ~3s (15x faster)
|
|
562
|
+
|
|
563
|
+
LSP-aware (type checking):
|
|
564
|
+
Traditional: ~30s
|
|
565
|
+
LSP-aware: ~2s (15x faster)
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Memory Usage
|
|
569
|
+
|
|
570
|
+
```
|
|
571
|
+
Base executor: ~100MB
|
|
572
|
+
Cached executor: ~150MB (cache overhead)
|
|
573
|
+
Parallel executor: ~100MB + (50MB × workers)
|
|
574
|
+
LSP-aware: ~100MB (shares LSP server memory)
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
## Related
|
|
578
|
+
|
|
579
|
+
- [Hooks](<../hooks/README.md>) - Hook definitions and lifecycle
|
|
580
|
+
- [Workflows](<../workflows/README.md>) - Workflow integration
|
|
581
|
+
- [Config](<../config/README.md>) - Executor configuration
|
|
582
|
+
- [CLAUDE.md](../../docs/guides/CLAUDE.md) - Quality process overview
|
|
583
|
+
|
|
584
|
+
## Future Enhancements
|
|
585
|
+
|
|
586
|
+
- [ ] Distributed execution across multiple machines
|
|
587
|
+
- [ ] GPU-accelerated hook execution for large codebases
|
|
588
|
+
- [ ] Machine learning for optimal parallelization strategy
|
|
589
|
+
- [ ] Real-time execution monitoring dashboard
|
|
590
|
+
- [ ] Execution profiling and bottleneck detection
|
|
591
|
+
- [ ] Smart scheduling based on historical performance data
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from .async_hook_executor import AsyncHookExecutor
|
|
2
2
|
from .cached_hook_executor import CachedHookExecutor, SmartCacheManager
|
|
3
3
|
from .hook_executor import HookExecutionResult, HookExecutor
|
|
4
|
+
from .progress_hook_executor import ProgressHookExecutor
|
|
4
5
|
|
|
5
6
|
__all__ = [
|
|
6
7
|
"AsyncHookExecutor",
|
|
7
8
|
"CachedHookExecutor",
|
|
8
9
|
"HookExecutionResult",
|
|
9
10
|
"HookExecutor",
|
|
11
|
+
"ProgressHookExecutor",
|
|
10
12
|
"SmartCacheManager",
|
|
11
13
|
]
|