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
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
import logging
|
|
3
2
|
import time
|
|
4
3
|
import typing as t
|
|
4
|
+
from contextlib import suppress
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
|
+
from acb.depends import Inject, depends
|
|
8
|
+
from acb.logger import Logger
|
|
7
9
|
from rich.console import Console
|
|
8
10
|
|
|
9
11
|
from crackerjack.agents.base import FixResult, Issue, IssueType, Priority
|
|
@@ -15,9 +17,11 @@ from .timeout_manager import TimeoutStrategy, get_timeout_manager
|
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
class AsyncWorkflowPipeline:
|
|
20
|
+
@depends.inject
|
|
18
21
|
def __init__(
|
|
19
22
|
self,
|
|
20
|
-
|
|
23
|
+
logger: Inject[Logger],
|
|
24
|
+
console: Inject[Console],
|
|
21
25
|
pkg_path: Path,
|
|
22
26
|
session: SessionCoordinator,
|
|
23
27
|
phases: PhaseCoordinator,
|
|
@@ -26,7 +30,7 @@ class AsyncWorkflowPipeline:
|
|
|
26
30
|
self.pkg_path = pkg_path
|
|
27
31
|
self.session = session
|
|
28
32
|
self.phases = phases
|
|
29
|
-
self.logger =
|
|
33
|
+
self.logger = logger
|
|
30
34
|
self.timeout_manager = get_timeout_manager()
|
|
31
35
|
self._active_tasks: list[asyncio.Task[t.Any]] = []
|
|
32
36
|
self.resource_context: t.Any | None = None
|
|
@@ -60,7 +64,7 @@ class AsyncWorkflowPipeline:
|
|
|
60
64
|
async def _execute_workflow_phases_async(self, options: OptionsProtocol) -> bool:
|
|
61
65
|
success = True
|
|
62
66
|
|
|
63
|
-
self.phases.run_configuration_phase(options)
|
|
67
|
+
self.phases.run_configuration_phase(options) # type: ignore[arg-type]
|
|
64
68
|
|
|
65
69
|
if not await self._execute_cleaning_phase_async(options):
|
|
66
70
|
success = False
|
|
@@ -73,12 +77,12 @@ class AsyncWorkflowPipeline:
|
|
|
73
77
|
|
|
74
78
|
return False
|
|
75
79
|
|
|
76
|
-
if not self.phases.run_publishing_phase(options):
|
|
80
|
+
if not self.phases.run_publishing_phase(options): # type: ignore[arg-type]
|
|
77
81
|
success = False
|
|
78
82
|
self.session.fail_task("workflow", "Publishing failed")
|
|
79
83
|
return False
|
|
80
84
|
|
|
81
|
-
if not self.phases.run_commit_phase(options):
|
|
85
|
+
if not self.phases.run_commit_phase(options): # type: ignore[arg-type]
|
|
82
86
|
success = False
|
|
83
87
|
|
|
84
88
|
return success
|
|
@@ -113,7 +117,7 @@ class AsyncWorkflowPipeline:
|
|
|
113
117
|
asyncio.to_thread(self.phases.run_cleaning_phase, options), # type: ignore[arg-type]
|
|
114
118
|
strategy=TimeoutStrategy.RETRY_WITH_BACKOFF,
|
|
115
119
|
)
|
|
116
|
-
return bool(result)
|
|
120
|
+
return bool(result) # type: ignore[return-value]
|
|
117
121
|
|
|
118
122
|
async def _execute_quality_phase_async(self, options: OptionsProtocol) -> bool:
|
|
119
123
|
if hasattr(options, "fast") and options.fast:
|
|
@@ -188,13 +192,12 @@ class AsyncWorkflowPipeline:
|
|
|
188
192
|
|
|
189
193
|
return done, pending
|
|
190
194
|
|
|
191
|
-
|
|
195
|
+
@staticmethod
|
|
196
|
+
async def _cleanup_pending_tasks(pending: set[asyncio.Task[t.Any]]) -> None:
|
|
192
197
|
for task in pending:
|
|
193
198
|
task.cancel()
|
|
194
|
-
|
|
199
|
+
with suppress(asyncio.CancelledError):
|
|
195
200
|
await task
|
|
196
|
-
except asyncio.CancelledError:
|
|
197
|
-
pass
|
|
198
201
|
|
|
199
202
|
async def _process_task_results(
|
|
200
203
|
self,
|
|
@@ -265,7 +268,7 @@ class AsyncWorkflowPipeline:
|
|
|
265
268
|
asyncio.to_thread(self.phases.run_fast_hooks_only, options), # type: ignore[arg-type]
|
|
266
269
|
strategy=TimeoutStrategy.RETRY_WITH_BACKOFF,
|
|
267
270
|
)
|
|
268
|
-
return bool(result)
|
|
271
|
+
return bool(result) # type: ignore[return-value]
|
|
269
272
|
|
|
270
273
|
async def _run_comprehensive_hooks_async(self, options: OptionsProtocol) -> bool:
|
|
271
274
|
result = await self.timeout_manager.with_timeout(
|
|
@@ -273,7 +276,7 @@ class AsyncWorkflowPipeline:
|
|
|
273
276
|
asyncio.to_thread(self.phases.run_comprehensive_hooks_only, options), # type: ignore[arg-type]
|
|
274
277
|
strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
|
|
275
278
|
)
|
|
276
|
-
return bool(result)
|
|
279
|
+
return bool(result) # type: ignore[return-value]
|
|
277
280
|
|
|
278
281
|
async def _run_hooks_phase_async(self, options: OptionsProtocol) -> bool:
|
|
279
282
|
result = await self.timeout_manager.with_timeout(
|
|
@@ -281,7 +284,7 @@ class AsyncWorkflowPipeline:
|
|
|
281
284
|
asyncio.to_thread(self.phases.run_hooks_phase, options), # type: ignore[arg-type]
|
|
282
285
|
strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
|
|
283
286
|
)
|
|
284
|
-
return bool(result)
|
|
287
|
+
return bool(result) # type: ignore[return-value]
|
|
285
288
|
|
|
286
289
|
async def _run_testing_phase_async(self, options: OptionsProtocol) -> bool:
|
|
287
290
|
result = await self.timeout_manager.with_timeout(
|
|
@@ -289,7 +292,7 @@ class AsyncWorkflowPipeline:
|
|
|
289
292
|
asyncio.to_thread(self.phases.run_testing_phase, options), # type: ignore[arg-type]
|
|
290
293
|
strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
|
|
291
294
|
)
|
|
292
|
-
return bool(result)
|
|
295
|
+
return bool(result) # type: ignore[return-value]
|
|
293
296
|
|
|
294
297
|
async def _execute_ai_agent_workflow_async(
|
|
295
298
|
self, options: OptionsProtocol, max_iterations: int = 10
|
|
@@ -298,7 +301,7 @@ class AsyncWorkflowPipeline:
|
|
|
298
301
|
f"🤖 Starting AI Agent workflow (max {max_iterations} iterations)"
|
|
299
302
|
)
|
|
300
303
|
|
|
301
|
-
self.phases.run_configuration_phase(options)
|
|
304
|
+
self.phases.run_configuration_phase(options) # type: ignore[arg-type]
|
|
302
305
|
|
|
303
306
|
if not await self._execute_cleaning_phase_async(options):
|
|
304
307
|
self.session.fail_task("workflow", "Cleaning phase failed")
|
|
@@ -431,7 +434,8 @@ class AsyncWorkflowPipeline:
|
|
|
431
434
|
issue, IssueType.FORMATTING, Priority.MEDIUM, "refurb"
|
|
432
435
|
)
|
|
433
436
|
|
|
434
|
-
|
|
437
|
+
@staticmethod
|
|
438
|
+
def _parse_single_test_issue(issue: str) -> Issue:
|
|
435
439
|
import uuid
|
|
436
440
|
|
|
437
441
|
from crackerjack.agents.base import Issue, IssueType, Priority
|
|
@@ -450,8 +454,9 @@ class AsyncWorkflowPipeline:
|
|
|
450
454
|
stage="test",
|
|
451
455
|
)
|
|
452
456
|
|
|
457
|
+
@staticmethod
|
|
453
458
|
def _create_generic_issue(
|
|
454
|
-
|
|
459
|
+
issue: str, issue_type: IssueType, priority: Priority, stage: str
|
|
455
460
|
) -> Issue:
|
|
456
461
|
import uuid
|
|
457
462
|
|
|
@@ -467,18 +472,18 @@ class AsyncWorkflowPipeline:
|
|
|
467
472
|
)
|
|
468
473
|
|
|
469
474
|
async def _run_final_workflow_phases(self, options: OptionsProtocol) -> bool:
|
|
470
|
-
if not self.phases.run_publishing_phase(options):
|
|
475
|
+
if not self.phases.run_publishing_phase(options): # type: ignore[arg-type]
|
|
471
476
|
self.session.fail_task("workflow", "Publishing failed")
|
|
472
477
|
return False
|
|
473
478
|
|
|
474
|
-
if not self.phases.run_commit_phase(options):
|
|
479
|
+
if not self.phases.run_commit_phase(options): # type: ignore[arg-type]
|
|
475
480
|
self.session.fail_task("workflow", "Commit failed")
|
|
476
481
|
return False
|
|
477
482
|
|
|
478
483
|
return True
|
|
479
484
|
|
|
480
485
|
async def _run_fast_hooks_with_retry_async(self, options: OptionsProtocol) -> bool:
|
|
481
|
-
return await asyncio.to_thread(self.phases.run_fast_hooks_only, options)
|
|
486
|
+
return await asyncio.to_thread(self.phases.run_fast_hooks_only, options) # type: ignore[arg-type]
|
|
482
487
|
|
|
483
488
|
async def _collect_test_issues_async(self, options: OptionsProtocol) -> list[str]:
|
|
484
489
|
if not options.test:
|
|
@@ -573,10 +578,11 @@ class AsyncWorkflowPipeline:
|
|
|
573
578
|
|
|
574
579
|
def _create_agent_coordinator(self) -> t.Any:
|
|
575
580
|
from crackerjack.agents.base import AgentContext
|
|
576
|
-
from crackerjack.agents.
|
|
581
|
+
from crackerjack.agents.enhanced_coordinator import create_enhanced_coordinator
|
|
577
582
|
|
|
578
583
|
context = AgentContext(project_path=self.pkg_path)
|
|
579
|
-
|
|
584
|
+
# Use enhanced coordinator with Claude Code agent integration
|
|
585
|
+
return create_enhanced_coordinator(context=context, enable_external_agents=True)
|
|
580
586
|
|
|
581
587
|
def _report_fix_results(self, fix_result: FixResult, iteration: int) -> None:
|
|
582
588
|
if fix_result.success:
|
|
@@ -602,24 +608,34 @@ class AsyncWorkflowPipeline:
|
|
|
602
608
|
|
|
603
609
|
|
|
604
610
|
class AsyncWorkflowOrchestrator:
|
|
611
|
+
@depends.inject
|
|
605
612
|
def __init__(
|
|
606
613
|
self,
|
|
607
|
-
|
|
614
|
+
logger: Inject[Logger],
|
|
615
|
+
console: Inject[Console],
|
|
608
616
|
pkg_path: Path | None = None,
|
|
609
617
|
dry_run: bool = False,
|
|
610
618
|
web_job_id: str | None = None,
|
|
611
619
|
verbose: bool = False,
|
|
612
620
|
debug: bool = False,
|
|
621
|
+
changed_only: bool = False,
|
|
613
622
|
) -> None:
|
|
614
|
-
|
|
623
|
+
# Initialize console and pkg_path first
|
|
624
|
+
self.console = console
|
|
615
625
|
self.pkg_path = pkg_path or Path.cwd()
|
|
616
626
|
self.dry_run = dry_run
|
|
617
627
|
self.web_job_id = web_job_id
|
|
618
628
|
self.verbose = verbose
|
|
619
629
|
self.debug = debug
|
|
630
|
+
self.changed_only = changed_only
|
|
620
631
|
|
|
621
|
-
|
|
632
|
+
# Configure ACB dependency injection using native patterns
|
|
633
|
+
from acb.depends import depends
|
|
634
|
+
|
|
635
|
+
# Register core dependencies directly with ACB
|
|
636
|
+
depends.set(Path, self.pkg_path)
|
|
622
637
|
|
|
638
|
+
# Import protocols for retrieving dependencies via ACB
|
|
623
639
|
from crackerjack.models.protocols import (
|
|
624
640
|
ConfigMergeServiceProtocol,
|
|
625
641
|
FileSystemInterface,
|
|
@@ -629,48 +645,50 @@ class AsyncWorkflowOrchestrator:
|
|
|
629
645
|
TestManagerProtocol,
|
|
630
646
|
)
|
|
631
647
|
|
|
632
|
-
|
|
648
|
+
# Setup services with ACB DI (reuse from WorkflowOrchestrator)
|
|
649
|
+
from .workflow_orchestrator import WorkflowOrchestrator
|
|
633
650
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
651
|
+
# Use a temporary orchestrator instance just for service setup
|
|
652
|
+
temp_orch = WorkflowOrchestrator.__new__(WorkflowOrchestrator)
|
|
653
|
+
temp_orch.console = self.console
|
|
654
|
+
temp_orch.pkg_path = self.pkg_path
|
|
655
|
+
temp_orch.verbose = self.verbose
|
|
656
|
+
temp_orch._setup_acb_services()
|
|
657
|
+
|
|
658
|
+
self._initialize_logging()
|
|
659
|
+
|
|
660
|
+
self.logger = logger
|
|
639
661
|
|
|
662
|
+
# Create coordinators - dependencies retrieved via ACB's depends.get_sync()
|
|
640
663
|
self.session = SessionCoordinator(self.console, self.pkg_path, self.web_job_id)
|
|
641
664
|
self.phases = PhaseCoordinator(
|
|
642
665
|
console=self.console,
|
|
643
666
|
pkg_path=self.pkg_path,
|
|
644
667
|
session=self.session,
|
|
645
|
-
filesystem=
|
|
646
|
-
git_service=
|
|
647
|
-
hook_manager=
|
|
648
|
-
test_manager=
|
|
649
|
-
publish_manager=
|
|
650
|
-
config_merge_service=
|
|
668
|
+
filesystem=depends.get_sync(FileSystemInterface),
|
|
669
|
+
git_service=depends.get_sync(GitInterface),
|
|
670
|
+
hook_manager=depends.get_sync(HookManager),
|
|
671
|
+
test_manager=depends.get_sync(TestManagerProtocol),
|
|
672
|
+
publish_manager=depends.get_sync(PublishManager),
|
|
673
|
+
config_merge_service=depends.get_sync(ConfigMergeServiceProtocol),
|
|
651
674
|
)
|
|
652
675
|
|
|
653
676
|
self.async_pipeline = AsyncWorkflowPipeline(
|
|
654
|
-
console=self.console,
|
|
655
677
|
pkg_path=self.pkg_path,
|
|
656
678
|
session=self.session,
|
|
657
679
|
phases=self.phases,
|
|
658
680
|
)
|
|
659
681
|
|
|
660
|
-
self.logger = logging.getLogger("crackerjack.async_orchestrator")
|
|
661
|
-
|
|
662
682
|
def _initialize_logging(self) -> None:
|
|
663
683
|
from crackerjack.services.log_manager import get_log_manager
|
|
664
|
-
from crackerjack.services.logging import setup_structured_logging
|
|
665
684
|
|
|
666
685
|
log_manager = get_log_manager()
|
|
667
686
|
session_id = getattr(self, "web_job_id", None) or str(int(time.time()))[:8]
|
|
668
687
|
debug_log_file = log_manager.create_debug_log_file(session_id)
|
|
669
688
|
|
|
670
689
|
log_level = "DEBUG" if self.debug else "INFO"
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
)
|
|
690
|
+
self.logger.set_level(log_level)
|
|
691
|
+
self.logger.add_file_handler(debug_log_file)
|
|
674
692
|
|
|
675
693
|
async def run_complete_workflow_async(self, options: OptionsProtocol) -> bool:
|
|
676
694
|
return await self.async_pipeline.run_complete_workflow_async(options)
|
|
@@ -679,28 +697,36 @@ class AsyncWorkflowOrchestrator:
|
|
|
679
697
|
return asyncio.run(self.run_complete_workflow_async(options))
|
|
680
698
|
|
|
681
699
|
def run_cleaning_phase(self, options: OptionsProtocol) -> bool:
|
|
682
|
-
|
|
700
|
+
result = self.phases.run_cleaning_phase(options) # type: ignore[arg-type]
|
|
701
|
+
return bool(result)
|
|
683
702
|
|
|
684
703
|
def run_fast_hooks_only(self, options: OptionsProtocol) -> bool:
|
|
685
|
-
|
|
704
|
+
result = self.phases.run_fast_hooks_only(options) # type: ignore[arg-type]
|
|
705
|
+
return bool(result)
|
|
686
706
|
|
|
687
707
|
def run_comprehensive_hooks_only(self, options: OptionsProtocol) -> bool:
|
|
688
|
-
|
|
708
|
+
result = self.phases.run_comprehensive_hooks_only(options) # type: ignore[arg-type]
|
|
709
|
+
return bool(result)
|
|
689
710
|
|
|
690
711
|
def run_hooks_phase(self, options: OptionsProtocol) -> bool:
|
|
691
|
-
|
|
712
|
+
result = self.phases.run_hooks_phase(options) # type: ignore[arg-type]
|
|
713
|
+
return bool(result)
|
|
692
714
|
|
|
693
715
|
def run_testing_phase(self, options: OptionsProtocol) -> bool:
|
|
694
|
-
|
|
716
|
+
result = self.phases.run_testing_phase(options) # type: ignore[arg-type]
|
|
717
|
+
return bool(result)
|
|
695
718
|
|
|
696
719
|
def run_publishing_phase(self, options: OptionsProtocol) -> bool:
|
|
697
|
-
|
|
720
|
+
result = self.phases.run_publishing_phase(options) # type: ignore[arg-type]
|
|
721
|
+
return bool(result)
|
|
698
722
|
|
|
699
723
|
def run_commit_phase(self, options: OptionsProtocol) -> bool:
|
|
700
|
-
|
|
724
|
+
result = self.phases.run_commit_phase(options) # type: ignore[arg-type]
|
|
725
|
+
return bool(result)
|
|
701
726
|
|
|
702
727
|
def run_configuration_phase(self, options: OptionsProtocol) -> bool:
|
|
703
|
-
|
|
728
|
+
result = self.phases.run_configuration_phase(options) # type: ignore[arg-type]
|
|
729
|
+
return bool(result)
|
|
704
730
|
|
|
705
731
|
def _cleanup_resources(self) -> None:
|
|
706
732
|
self.session.cleanup_resources()
|
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
import subprocess
|
|
2
|
+
from contextlib import suppress
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
|
|
4
|
-
from
|
|
5
|
-
|
|
6
|
-
from
|
|
5
|
+
from acb.console import Console
|
|
6
|
+
from acb.depends import depends
|
|
7
|
+
from acb.logger import Logger
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class AutofixCoordinator:
|
|
10
|
-
def __init__(
|
|
11
|
-
self
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
console: object | None = None,
|
|
14
|
+
pkg_path: Path | None = None,
|
|
15
|
+
logger: object | None = None,
|
|
16
|
+
) -> None:
|
|
17
|
+
# Allow explicit injection from tests; fall back to DI when not provided
|
|
18
|
+
self.console = console or depends.get_sync(Console)
|
|
19
|
+
self.pkg_path = pkg_path or Path.cwd()
|
|
20
|
+
# Bind logger context with name for tracing
|
|
21
|
+
_logger = logger or depends.get_sync(Logger)
|
|
22
|
+
if hasattr(_logger, "bind"):
|
|
23
|
+
self.logger = _logger.bind(logger="crackerjack.autofix")
|
|
24
|
+
else:
|
|
25
|
+
self.logger = _logger
|
|
26
|
+
if not hasattr(self.logger, "name"):
|
|
27
|
+
with suppress(Exception):
|
|
28
|
+
setattr(self.logger, "name", "crackerjack.autofix")
|
|
16
29
|
|
|
17
30
|
def apply_autofix_for_hooks(self, mode: str, hook_results: list[object]) -> bool:
|
|
18
31
|
try:
|
crackerjack/core/container.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import typing as t
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
|
-
from
|
|
4
|
+
from acb import console as acb_console
|
|
5
|
+
from acb.console import Console
|
|
5
6
|
|
|
6
7
|
from crackerjack.models.protocols import (
|
|
7
8
|
FileSystemInterface,
|
|
@@ -44,7 +45,7 @@ class DependencyContainer:
|
|
|
44
45
|
verbose: bool = False,
|
|
45
46
|
) -> "DependencyContainer":
|
|
46
47
|
if console is None:
|
|
47
|
-
console =
|
|
48
|
+
console = acb_console
|
|
48
49
|
|
|
49
50
|
if pkg_path is None:
|
|
50
51
|
pkg_path = Path.cwd()
|
|
@@ -57,7 +58,7 @@ class DependencyContainer:
|
|
|
57
58
|
|
|
58
59
|
self.register_transient(
|
|
59
60
|
GitInterface,
|
|
60
|
-
lambda: GitService(
|
|
61
|
+
lambda: GitService(pkg_path=pkg_path),
|
|
61
62
|
)
|
|
62
63
|
|
|
63
64
|
from crackerjack.managers.hook_manager import HookManagerImpl
|
|
@@ -78,24 +79,24 @@ class DependencyContainer:
|
|
|
78
79
|
|
|
79
80
|
from crackerjack.managers.publish_manager import PublishManagerImpl
|
|
80
81
|
|
|
82
|
+
# Use factory without parameters to trigger @depends.inject decorator
|
|
83
|
+
# The decorator will inject all dependencies from the DI container
|
|
81
84
|
self.register_transient(
|
|
82
85
|
PublishManager,
|
|
83
|
-
|
|
84
|
-
console=console,
|
|
85
|
-
pkg_path=pkg_path,
|
|
86
|
-
dry_run=dry_run,
|
|
87
|
-
),
|
|
86
|
+
PublishManagerImpl,
|
|
88
87
|
)
|
|
89
88
|
|
|
90
89
|
return self
|
|
91
90
|
|
|
92
91
|
|
|
93
92
|
def create_container(
|
|
94
|
-
console: Console | None = None,
|
|
93
|
+
console: Console | None = None, # defaults to acb_console if None
|
|
95
94
|
pkg_path: Path | None = None,
|
|
96
95
|
dry_run: bool = False,
|
|
97
96
|
verbose: bool = False,
|
|
98
97
|
) -> DependencyContainer:
|
|
98
|
+
if console is None:
|
|
99
|
+
console = acb_console
|
|
99
100
|
return DependencyContainer().create_default_container(
|
|
100
101
|
console=console,
|
|
101
102
|
pkg_path=pkg_path,
|
|
@@ -44,7 +44,7 @@ class ServiceDescriptor:
|
|
|
44
44
|
created_count: int = 0
|
|
45
45
|
dependencies: list[type] = field(default_factory=list)
|
|
46
46
|
|
|
47
|
-
def __post_init__(self)
|
|
47
|
+
def __post_init__(self):
|
|
48
48
|
if self.implementation is self.factory is self.instance is None:
|
|
49
49
|
msg = "Must provide either implementation, factory, or instance"
|
|
50
50
|
raise ValueError(msg)
|
|
@@ -300,7 +300,7 @@ class EnhancedDependencyContainer:
|
|
|
300
300
|
self._current_scope = scope
|
|
301
301
|
|
|
302
302
|
def get_service_info(self) -> dict[str, Any]:
|
|
303
|
-
info
|
|
303
|
+
info = {}
|
|
304
304
|
|
|
305
305
|
with self._lock:
|
|
306
306
|
for key, descriptor in self._services.items():
|
|
@@ -391,7 +391,7 @@ class EnhancedDependencyContainer:
|
|
|
391
391
|
def _get_service_key(self, interface: type) -> str:
|
|
392
392
|
return f"{interface.__module__}.{interface.__name__}"
|
|
393
393
|
|
|
394
|
-
def __enter__(self)
|
|
394
|
+
def __enter__(self):
|
|
395
395
|
return self
|
|
396
396
|
|
|
397
397
|
def __exit__(
|
|
@@ -463,13 +463,11 @@ class ServiceCollectionBuilder:
|
|
|
463
463
|
|
|
464
464
|
from crackerjack.managers.publish_manager import PublishManagerImpl
|
|
465
465
|
|
|
466
|
+
# Use factory without parameters to trigger @depends.inject decorator
|
|
467
|
+
# The decorator will inject all dependencies from the DI container
|
|
466
468
|
self.container.register_transient(
|
|
467
469
|
PublishManager,
|
|
468
|
-
factory=
|
|
469
|
-
console=console,
|
|
470
|
-
pkg_path=pkg_path,
|
|
471
|
-
dry_run=self.dry_run,
|
|
472
|
-
),
|
|
470
|
+
factory=PublishManagerImpl,
|
|
473
471
|
)
|
|
474
472
|
|
|
475
473
|
return self
|
|
@@ -515,7 +513,9 @@ class ServiceCollectionBuilder:
|
|
|
515
513
|
|
|
516
514
|
filesystem = FileSystemService()
|
|
517
515
|
git_service = GitService(console, pkg_path)
|
|
518
|
-
|
|
516
|
+
service = InitializationService(console, filesystem, git_service, pkg_path)
|
|
517
|
+
# Cast to protocol type to ensure correct typing
|
|
518
|
+
return t.cast(InitializationServiceProtocol, service)
|
|
519
519
|
|
|
520
520
|
self.container.register_transient(
|
|
521
521
|
InitializationServiceProtocol,
|
crackerjack/core/performance.py
CHANGED
|
@@ -7,7 +7,9 @@ from dataclasses import dataclass, field
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from threading import Lock
|
|
9
9
|
|
|
10
|
-
from
|
|
10
|
+
from acb.console import Console
|
|
11
|
+
from acb.depends import depends
|
|
12
|
+
from rich.panel import Panel
|
|
11
13
|
from rich.table import Table
|
|
12
14
|
|
|
13
15
|
logger = logging.getLogger("crackerjack.performance_monitor")
|
|
@@ -285,7 +287,7 @@ class AsyncPerformanceMonitor:
|
|
|
285
287
|
|
|
286
288
|
def print_performance_report(self, console: Console | None = None) -> None:
|
|
287
289
|
if console is None:
|
|
288
|
-
console = Console
|
|
290
|
+
console = depends.get_sync(Console)
|
|
289
291
|
|
|
290
292
|
console.print("\n[bold blue]🔍 Async Performance Monitor Report[/bold blue]")
|
|
291
293
|
console.print("=" * 60)
|
|
@@ -318,7 +320,7 @@ class AsyncPerformanceMonitor:
|
|
|
318
320
|
str(metrics.timeout_calls),
|
|
319
321
|
)
|
|
320
322
|
|
|
321
|
-
console.print(table)
|
|
323
|
+
console.print(Panel(table, title="Operation Metrics", border_style="cyan"))
|
|
322
324
|
|
|
323
325
|
alerts = self.get_performance_alerts()
|
|
324
326
|
if alerts:
|