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,282 @@
|
|
|
1
|
+
"""Enhanced hook executor with rich progress indicators.
|
|
2
|
+
|
|
3
|
+
Extends base HookExecutor with real-time progress feedback using rich library.
|
|
4
|
+
Part of Phase 10.2.2: Development Velocity Improvements.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import time
|
|
8
|
+
import typing as t
|
|
9
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from acb.console import Console
|
|
13
|
+
from rich.progress import (
|
|
14
|
+
BarColumn,
|
|
15
|
+
MofNCompleteColumn,
|
|
16
|
+
Progress,
|
|
17
|
+
SpinnerColumn,
|
|
18
|
+
TaskProgressColumn,
|
|
19
|
+
TextColumn,
|
|
20
|
+
TimeElapsedColumn,
|
|
21
|
+
TimeRemainingColumn,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
from crackerjack.config.hooks import HookStrategy, RetryPolicy
|
|
25
|
+
from crackerjack.executors.hook_executor import HookExecutionResult, HookExecutor
|
|
26
|
+
from crackerjack.models.task import HookResult
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ProgressHookExecutor(HookExecutor):
|
|
30
|
+
"""Hook executor with enhanced progress indicators.
|
|
31
|
+
|
|
32
|
+
Provides real-time feedback during hook execution using rich progress bars,
|
|
33
|
+
improving developer experience during long-running quality checks.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
console: Console,
|
|
39
|
+
pkg_path: Path,
|
|
40
|
+
verbose: bool = False,
|
|
41
|
+
quiet: bool = False,
|
|
42
|
+
show_progress: bool = True,
|
|
43
|
+
debug: bool = False,
|
|
44
|
+
use_incremental: bool = False,
|
|
45
|
+
git_service: t.Any | None = None,
|
|
46
|
+
) -> None:
|
|
47
|
+
"""Initialize progress-enhanced hook executor.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
console: Rich console for output
|
|
51
|
+
pkg_path: Project root path
|
|
52
|
+
verbose: Show detailed output
|
|
53
|
+
quiet: Suppress output
|
|
54
|
+
show_progress: Enable progress bars (disable for CI/testing)
|
|
55
|
+
debug: Enable debug output
|
|
56
|
+
use_incremental: Run hooks only on changed files
|
|
57
|
+
git_service: GitService instance for incremental execution
|
|
58
|
+
"""
|
|
59
|
+
super().__init__(
|
|
60
|
+
console, pkg_path, verbose, quiet, debug, use_incremental, git_service
|
|
61
|
+
)
|
|
62
|
+
self.show_progress = show_progress and not quiet
|
|
63
|
+
self.debug = debug
|
|
64
|
+
|
|
65
|
+
def execute_strategy(self, strategy: HookStrategy) -> HookExecutionResult:
|
|
66
|
+
"""Execute hook strategy with progress indicators.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
strategy: Hook strategy to execute
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Execution result with timing and status information
|
|
73
|
+
"""
|
|
74
|
+
start_time = time.time()
|
|
75
|
+
|
|
76
|
+
self._print_strategy_header(strategy)
|
|
77
|
+
|
|
78
|
+
if not self.show_progress:
|
|
79
|
+
# Fall back to base implementation without progress bars
|
|
80
|
+
return super().execute_strategy(strategy)
|
|
81
|
+
|
|
82
|
+
# Create progress bar context
|
|
83
|
+
with self._create_progress_bar() as progress:
|
|
84
|
+
# Add main task for overall progress
|
|
85
|
+
main_task = progress.add_task(
|
|
86
|
+
f"[cyan]Running {len(strategy.hooks)} hooks...",
|
|
87
|
+
total=len(strategy.hooks),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
if strategy.parallel and len(strategy.hooks) > 1:
|
|
91
|
+
results = self._execute_parallel_with_progress(
|
|
92
|
+
strategy, progress, main_task
|
|
93
|
+
)
|
|
94
|
+
else:
|
|
95
|
+
results = self._execute_sequential_with_progress(
|
|
96
|
+
strategy, progress, main_task
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Handle retries (without progress bar to avoid confusion)
|
|
100
|
+
if strategy.retry_policy != RetryPolicy.NONE:
|
|
101
|
+
if not self.quiet:
|
|
102
|
+
self.console.print("\n[yellow]Retrying failed hooks...[/yellow]")
|
|
103
|
+
results = self._handle_retries(strategy, results)
|
|
104
|
+
|
|
105
|
+
total_duration = time.time() - start_time
|
|
106
|
+
success = all(r.status == "passed" for r in results)
|
|
107
|
+
|
|
108
|
+
# Calculate performance gain for the summary
|
|
109
|
+
performance_gain = 0.0 # Default value for progress executor
|
|
110
|
+
if not self.quiet:
|
|
111
|
+
self._print_summary(strategy, results, success, performance_gain)
|
|
112
|
+
|
|
113
|
+
return HookExecutionResult(
|
|
114
|
+
strategy_name=strategy.name,
|
|
115
|
+
results=results,
|
|
116
|
+
total_duration=total_duration,
|
|
117
|
+
success=success,
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
def _create_progress_bar(self) -> Progress:
|
|
121
|
+
"""Create configured progress bar with appropriate columns.
|
|
122
|
+
|
|
123
|
+
Progress bar width is constrained to respect console width by limiting
|
|
124
|
+
description text and using compact time format.
|
|
125
|
+
|
|
126
|
+
Logger output is suppressed at the source (logging level) to prevent
|
|
127
|
+
interference with progress bar updates.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Configured Progress instance
|
|
131
|
+
"""
|
|
132
|
+
return Progress(
|
|
133
|
+
SpinnerColumn(spinner_name="dots"),
|
|
134
|
+
TextColumn("[progress.description]{task.description}", justify="left"),
|
|
135
|
+
BarColumn(bar_width=20), # Fixed narrow bar to prevent overflow
|
|
136
|
+
TaskProgressColumn(),
|
|
137
|
+
MofNCompleteColumn(),
|
|
138
|
+
TimeElapsedColumn(),
|
|
139
|
+
TimeRemainingColumn(),
|
|
140
|
+
console=self.console,
|
|
141
|
+
transient=True, # Clear progress bar after completion (consistent with test progress)
|
|
142
|
+
refresh_per_second=10, # Smooth single-line updates
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def _execute_sequential_with_progress(
|
|
146
|
+
self,
|
|
147
|
+
strategy: HookStrategy,
|
|
148
|
+
progress: Progress,
|
|
149
|
+
main_task: t.Any,
|
|
150
|
+
) -> list[HookResult]:
|
|
151
|
+
"""Execute hooks sequentially with progress updates.
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
strategy: Hook strategy to execute
|
|
155
|
+
progress: Progress bar context
|
|
156
|
+
main_task: Main progress task ID
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
List of hook execution results
|
|
160
|
+
"""
|
|
161
|
+
results: list[HookResult] = []
|
|
162
|
+
|
|
163
|
+
for hook in strategy.hooks:
|
|
164
|
+
# Update description to show current hook
|
|
165
|
+
progress.update(
|
|
166
|
+
main_task,
|
|
167
|
+
description=f"[cyan]Running {hook.name}...",
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
result = self.execute_single_hook(hook)
|
|
171
|
+
results.append(result)
|
|
172
|
+
|
|
173
|
+
# Update progress with completion
|
|
174
|
+
status_icon = "✅" if result.status == "passed" else "❌"
|
|
175
|
+
progress.update(
|
|
176
|
+
main_task,
|
|
177
|
+
advance=1,
|
|
178
|
+
description=f"[cyan]Completed {hook.name} {status_icon}",
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
return results
|
|
182
|
+
|
|
183
|
+
def _execute_parallel_with_progress(
|
|
184
|
+
self,
|
|
185
|
+
strategy: HookStrategy,
|
|
186
|
+
progress: Progress,
|
|
187
|
+
main_task: t.Any,
|
|
188
|
+
) -> list[HookResult]:
|
|
189
|
+
"""Execute hooks in parallel with progress updates.
|
|
190
|
+
|
|
191
|
+
Formatting hooks run sequentially first, then analysis hooks run in parallel.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
strategy: Hook strategy to execute
|
|
195
|
+
progress: Progress bar context
|
|
196
|
+
main_task: Main progress task ID
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
List of hook execution results
|
|
200
|
+
"""
|
|
201
|
+
results: list[HookResult] = []
|
|
202
|
+
|
|
203
|
+
# Separate formatting hooks (must run sequentially)
|
|
204
|
+
formatting_hooks = [h for h in strategy.hooks if h.is_formatting]
|
|
205
|
+
other_hooks = [h for h in strategy.hooks if not h.is_formatting]
|
|
206
|
+
|
|
207
|
+
# Execute formatting hooks sequentially
|
|
208
|
+
for hook in formatting_hooks:
|
|
209
|
+
progress.update(
|
|
210
|
+
main_task,
|
|
211
|
+
description=f"[cyan]Running {hook.name}...",
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
result = self.execute_single_hook(hook)
|
|
215
|
+
results.append(result)
|
|
216
|
+
|
|
217
|
+
status_icon = "✅" if result.status == "passed" else "❌"
|
|
218
|
+
progress.update(
|
|
219
|
+
main_task,
|
|
220
|
+
advance=1,
|
|
221
|
+
description=f"[cyan]Completed {hook.name} {status_icon}",
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Execute analysis hooks in parallel
|
|
225
|
+
if other_hooks:
|
|
226
|
+
progress.update(
|
|
227
|
+
main_task,
|
|
228
|
+
description=f"[cyan]Running {len(other_hooks)} hooks in parallel...",
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
with ThreadPoolExecutor(max_workers=strategy.max_workers) as executor:
|
|
232
|
+
future_to_hook = {
|
|
233
|
+
executor.submit(self.execute_single_hook, hook): hook
|
|
234
|
+
for hook in other_hooks
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
for future in as_completed(future_to_hook):
|
|
238
|
+
try:
|
|
239
|
+
result = future.result()
|
|
240
|
+
results.append(result)
|
|
241
|
+
|
|
242
|
+
status_icon = "✅" if result.status == "passed" else "❌"
|
|
243
|
+
progress.update(
|
|
244
|
+
main_task,
|
|
245
|
+
advance=1,
|
|
246
|
+
description=f"[cyan]Completed {result.name} {status_icon}",
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
except Exception as e:
|
|
250
|
+
hook = future_to_hook[future]
|
|
251
|
+
error_result = HookResult(
|
|
252
|
+
id=hook.name,
|
|
253
|
+
name=hook.name,
|
|
254
|
+
status="error",
|
|
255
|
+
duration=0.0,
|
|
256
|
+
issues_found=[str(e)],
|
|
257
|
+
issues_count=1, # Error counts as 1 issue
|
|
258
|
+
stage=hook.stage.value,
|
|
259
|
+
)
|
|
260
|
+
results.append(error_result)
|
|
261
|
+
|
|
262
|
+
progress.update(
|
|
263
|
+
main_task,
|
|
264
|
+
advance=1,
|
|
265
|
+
description=f"[cyan]Failed {hook.name} ❌",
|
|
266
|
+
)
|
|
267
|
+
|
|
268
|
+
return results
|
|
269
|
+
|
|
270
|
+
def _display_hook_result(self, result: HookResult) -> None:
|
|
271
|
+
"""Display hook result with emoji status.
|
|
272
|
+
|
|
273
|
+
When progress bars are disabled, always show inline hook status.
|
|
274
|
+
When progress bars are enabled, suppress inline output (progress bar shows it).
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
result: Hook execution result
|
|
278
|
+
"""
|
|
279
|
+
# Always show inline status when progress bars are disabled
|
|
280
|
+
# Skip inline output when progress bars are enabled (they show the status)
|
|
281
|
+
if not self.show_progress:
|
|
282
|
+
super()._display_hook_result(result)
|
|
@@ -8,7 +8,8 @@ import typing as t
|
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
|
|
11
|
-
from
|
|
11
|
+
from acb.console import Console
|
|
12
|
+
from acb.depends import depends
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
@dataclass
|
|
@@ -63,7 +64,7 @@ class ToolProxy:
|
|
|
63
64
|
"""Proxy that routes tool calls through adapters with health checks."""
|
|
64
65
|
|
|
65
66
|
def __init__(self, console: Console | None = None):
|
|
66
|
-
self.console = console or Console
|
|
67
|
+
self.console = console or depends.get_sync(Console)
|
|
67
68
|
self.health_status: dict[str, ToolHealthStatus] = {}
|
|
68
69
|
self.circuit_breakers: dict[str, CircuitBreakerState] = {}
|
|
69
70
|
|
|
@@ -344,12 +345,19 @@ class ToolProxy:
|
|
|
344
345
|
def _create_zuban_adapter(self) -> t.Any | None:
|
|
345
346
|
"""Create Zuban adapter instance."""
|
|
346
347
|
try:
|
|
348
|
+
from acb.depends import depends
|
|
349
|
+
|
|
347
350
|
from crackerjack.adapters.zuban_adapter import ZubanAdapter
|
|
348
|
-
from crackerjack.
|
|
351
|
+
from crackerjack.config import CrackerjackSettings
|
|
349
352
|
from crackerjack.orchestration.execution_strategies import ExecutionContext
|
|
350
353
|
|
|
351
|
-
# Create minimal context for adapter
|
|
352
|
-
|
|
354
|
+
# Create minimal context for adapter using ACB settings
|
|
355
|
+
settings = depends.get_sync(CrackerjackSettings)
|
|
356
|
+
|
|
357
|
+
# Import adapter from core_tools that converts settings to OptionsProtocol
|
|
358
|
+
from crackerjack.mcp.tools.core_tools import _adapt_settings_to_protocol
|
|
359
|
+
|
|
360
|
+
options = _adapt_settings_to_protocol(settings)
|
|
353
361
|
context = ExecutionContext(pkg_path=Path.cwd(), options=options)
|
|
354
362
|
return ZubanAdapter(context)
|
|
355
363
|
except (ImportError, Exception):
|
|
@@ -358,11 +366,19 @@ class ToolProxy:
|
|
|
358
366
|
def _create_skylos_adapter(self) -> t.Any | None:
|
|
359
367
|
"""Create Skylos adapter instance."""
|
|
360
368
|
try:
|
|
369
|
+
from acb.depends import depends
|
|
370
|
+
|
|
361
371
|
from crackerjack.adapters.skylos_adapter import SkylosAdapter
|
|
362
|
-
from crackerjack.
|
|
372
|
+
from crackerjack.config import CrackerjackSettings
|
|
363
373
|
from crackerjack.orchestration.execution_strategies import ExecutionContext
|
|
364
374
|
|
|
365
|
-
|
|
375
|
+
# Create minimal context for adapter using ACB settings
|
|
376
|
+
settings = depends.get_sync(CrackerjackSettings)
|
|
377
|
+
|
|
378
|
+
# Import adapter from core_tools that converts settings to OptionsProtocol
|
|
379
|
+
from crackerjack.mcp.tools.core_tools import _adapt_settings_to_protocol
|
|
380
|
+
|
|
381
|
+
options = _adapt_settings_to_protocol(settings)
|
|
366
382
|
context = ExecutionContext(pkg_path=Path.cwd(), options=options)
|
|
367
383
|
return SkylosAdapter(context)
|
|
368
384
|
except (ImportError, Exception):
|