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,5 +1,8 @@
|
|
|
1
1
|
import typing as t
|
|
2
2
|
|
|
3
|
+
from acb.depends import depends
|
|
4
|
+
|
|
5
|
+
from crackerjack.config import CrackerjackSettings
|
|
3
6
|
from crackerjack.mcp.context import MCPServerContext, get_context
|
|
4
7
|
from crackerjack.mcp.rate_limiter import RateLimitMiddleware
|
|
5
8
|
from crackerjack.services.input_validator import (
|
|
@@ -9,7 +12,6 @@ from crackerjack.services.input_validator import (
|
|
|
9
12
|
|
|
10
13
|
if t.TYPE_CHECKING:
|
|
11
14
|
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
12
|
-
from crackerjack.models.config import WorkflowOptions
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
async def create_task_with_subagent(
|
|
@@ -141,26 +143,38 @@ def _validate_kwargs_argument(
|
|
|
141
143
|
return extra_kwargs
|
|
142
144
|
|
|
143
145
|
|
|
144
|
-
def _configure_stage_options(stage: str) ->
|
|
145
|
-
|
|
146
|
+
def _configure_stage_options(stage: str) -> CrackerjackSettings:
|
|
147
|
+
"""Configure settings for a specific stage using ACB dependency injection.
|
|
148
|
+
|
|
149
|
+
Note: Returns a copy of global settings with stage-specific overrides.
|
|
150
|
+
The global settings remain unchanged.
|
|
151
|
+
"""
|
|
152
|
+
# Get base settings from DI
|
|
153
|
+
base_settings = depends.get_sync(CrackerjackSettings)
|
|
154
|
+
|
|
155
|
+
# Create a new settings instance with stage-specific values
|
|
156
|
+
# We copy the base settings and override specific fields
|
|
157
|
+
settings_dict = base_settings.model_dump()
|
|
146
158
|
|
|
147
|
-
options = WorkflowOptions()
|
|
148
159
|
if stage in {"fast", "comprehensive"}:
|
|
149
|
-
|
|
160
|
+
settings_dict["skip_hooks"] = False
|
|
150
161
|
elif stage == "tests":
|
|
151
|
-
|
|
162
|
+
settings_dict["run_tests"] = (
|
|
163
|
+
True # Note: field renamed from 'test' to 'run_tests'
|
|
164
|
+
)
|
|
152
165
|
elif stage == "cleaning":
|
|
153
|
-
|
|
166
|
+
settings_dict["clean"] = True
|
|
154
167
|
elif stage == "init":
|
|
155
|
-
|
|
156
|
-
|
|
168
|
+
settings_dict["skip_hooks"] = True
|
|
169
|
+
|
|
170
|
+
return CrackerjackSettings(**settings_dict)
|
|
157
171
|
|
|
158
172
|
|
|
159
173
|
def _execute_stage(
|
|
160
|
-
orchestrator: "WorkflowOrchestrator", stage: str,
|
|
174
|
+
orchestrator: "WorkflowOrchestrator", stage: str, settings: CrackerjackSettings
|
|
161
175
|
) -> bool:
|
|
162
|
-
# Convert
|
|
163
|
-
adapted_options =
|
|
176
|
+
# Convert CrackerjackSettings to OptionsProtocol
|
|
177
|
+
adapted_options = _adapt_settings_to_protocol(settings)
|
|
164
178
|
|
|
165
179
|
if stage == "fast":
|
|
166
180
|
return orchestrator.run_fast_hooks_only(adapted_options)
|
|
@@ -173,122 +187,126 @@ def _execute_stage(
|
|
|
173
187
|
return False
|
|
174
188
|
|
|
175
189
|
|
|
176
|
-
def
|
|
177
|
-
"""Adapt
|
|
178
|
-
return _AdaptedOptions(
|
|
190
|
+
def _adapt_settings_to_protocol(settings: CrackerjackSettings) -> t.Any:
|
|
191
|
+
"""Adapt CrackerjackSettings to match OptionsProtocol."""
|
|
192
|
+
return _AdaptedOptions(settings) # type: ignore
|
|
179
193
|
|
|
180
194
|
|
|
181
195
|
class _AdaptedOptions:
|
|
182
|
-
"""Adapter class to convert
|
|
196
|
+
"""Adapter class to convert CrackerjackSettings to OptionsProtocol.
|
|
197
|
+
|
|
198
|
+
Since CrackerjackSettings uses flat field structure, this adapter
|
|
199
|
+
is much simpler than the old nested WorkflowOptions version.
|
|
200
|
+
"""
|
|
183
201
|
|
|
184
|
-
def __init__(self,
|
|
185
|
-
self.
|
|
202
|
+
def __init__(self, settings: CrackerjackSettings):
|
|
203
|
+
self.settings = settings
|
|
186
204
|
|
|
187
205
|
# Git properties
|
|
188
206
|
@property
|
|
189
207
|
def commit(self) -> bool:
|
|
190
|
-
return
|
|
208
|
+
return self.settings.commit
|
|
191
209
|
|
|
192
210
|
@property
|
|
193
211
|
def create_pr(self) -> bool:
|
|
194
|
-
return
|
|
212
|
+
return self.settings.create_pr
|
|
195
213
|
|
|
196
214
|
# Execution properties
|
|
197
215
|
@property
|
|
198
216
|
def interactive(self) -> bool:
|
|
199
|
-
return
|
|
217
|
+
return self.settings.interactive
|
|
200
218
|
|
|
201
219
|
@property
|
|
202
220
|
def no_config_updates(self) -> bool:
|
|
203
|
-
return
|
|
221
|
+
return self.settings.no_config_updates
|
|
204
222
|
|
|
205
223
|
@property
|
|
206
224
|
def verbose(self) -> bool:
|
|
207
|
-
return
|
|
225
|
+
return self.settings.verbose
|
|
208
226
|
|
|
209
227
|
@property
|
|
210
228
|
def async_mode(self) -> bool:
|
|
211
|
-
return
|
|
229
|
+
return self.settings.async_mode
|
|
212
230
|
|
|
213
231
|
# Testing properties
|
|
214
232
|
@property
|
|
215
233
|
def test(self) -> bool:
|
|
216
|
-
return
|
|
234
|
+
return self.settings.run_tests # Note: Field renamed in CrackerjackSettings
|
|
217
235
|
|
|
218
236
|
@property
|
|
219
237
|
def benchmark(self) -> bool:
|
|
220
|
-
return
|
|
238
|
+
return self.settings.benchmark
|
|
221
239
|
|
|
222
240
|
@property
|
|
223
241
|
def test_workers(self) -> int:
|
|
224
|
-
return
|
|
242
|
+
return self.settings.test_workers
|
|
225
243
|
|
|
226
244
|
@property
|
|
227
245
|
def test_timeout(self) -> int:
|
|
228
|
-
return
|
|
246
|
+
return self.settings.test_timeout
|
|
229
247
|
|
|
230
248
|
# Publishing properties
|
|
231
249
|
@property
|
|
232
250
|
def publish(self) -> t.Any | None:
|
|
233
|
-
return
|
|
251
|
+
return self.settings.publish_version
|
|
234
252
|
|
|
235
253
|
@property
|
|
236
254
|
def bump(self) -> t.Any | None:
|
|
237
|
-
return
|
|
255
|
+
return self.settings.bump_version
|
|
238
256
|
|
|
239
257
|
@property
|
|
240
258
|
def all(self) -> t.Any | None:
|
|
241
|
-
return
|
|
259
|
+
return self.settings.all_workflow
|
|
242
260
|
|
|
243
261
|
@property
|
|
244
262
|
def no_git_tags(self) -> bool:
|
|
245
|
-
return
|
|
263
|
+
return self.settings.no_git_tags
|
|
246
264
|
|
|
247
265
|
@property
|
|
248
266
|
def skip_version_check(self) -> bool:
|
|
249
|
-
return
|
|
267
|
+
return self.settings.skip_version_check
|
|
250
268
|
|
|
251
269
|
# AI properties
|
|
252
270
|
@property
|
|
253
271
|
def ai_agent(self) -> bool:
|
|
254
|
-
return
|
|
272
|
+
return self.settings.ai_agent
|
|
255
273
|
|
|
256
274
|
@property
|
|
257
275
|
def start_mcp_server(self) -> bool:
|
|
258
|
-
return
|
|
276
|
+
return self.settings.start_mcp_server
|
|
259
277
|
|
|
260
278
|
# Hook properties
|
|
261
279
|
@property
|
|
262
280
|
def skip_hooks(self) -> bool:
|
|
263
|
-
return
|
|
281
|
+
return self.settings.skip_hooks
|
|
264
282
|
|
|
265
283
|
@property
|
|
266
284
|
def update_precommit(self) -> bool:
|
|
267
|
-
return
|
|
285
|
+
return self.settings.update_precommit
|
|
268
286
|
|
|
269
287
|
@property
|
|
270
288
|
def experimental_hooks(self) -> bool:
|
|
271
|
-
return
|
|
289
|
+
return self.settings.experimental_hooks
|
|
272
290
|
|
|
273
291
|
@property
|
|
274
292
|
def enable_pyrefly(self) -> bool:
|
|
275
|
-
return
|
|
293
|
+
return self.settings.enable_pyrefly
|
|
276
294
|
|
|
277
295
|
@property
|
|
278
296
|
def enable_ty(self) -> bool:
|
|
279
|
-
return
|
|
297
|
+
return self.settings.enable_ty
|
|
280
298
|
|
|
281
299
|
# Cleaning properties
|
|
282
300
|
@property
|
|
283
301
|
def clean(self) -> bool:
|
|
284
|
-
return
|
|
302
|
+
return self.settings.clean
|
|
285
303
|
|
|
286
304
|
# Progress properties
|
|
287
305
|
@property
|
|
288
306
|
def track_progress(self) -> bool:
|
|
289
|
-
return
|
|
307
|
+
return self.settings.progress_enabled
|
|
290
308
|
|
|
291
|
-
# Default/static properties
|
|
309
|
+
# Default/static properties (not in settings, keep defaults)
|
|
292
310
|
@property
|
|
293
311
|
def cleanup(self) -> t.Any | None:
|
|
294
312
|
return None
|
|
@@ -299,7 +317,7 @@ class _AdaptedOptions:
|
|
|
299
317
|
|
|
300
318
|
@property
|
|
301
319
|
def coverage(self) -> bool:
|
|
302
|
-
return
|
|
320
|
+
return self.settings.coverage_enabled
|
|
303
321
|
|
|
304
322
|
@property
|
|
305
323
|
def keep_releases(self) -> int:
|
|
@@ -310,21 +328,26 @@ class _AdaptedOptions:
|
|
|
310
328
|
return False
|
|
311
329
|
|
|
312
330
|
|
|
313
|
-
|
|
331
|
+
from acb.console import Console
|
|
332
|
+
from acb.depends import Inject
|
|
333
|
+
|
|
334
|
+
from crackerjack.services.filesystem import FileSystemService
|
|
335
|
+
from crackerjack.services.git import GitService
|
|
336
|
+
from crackerjack.services.initialization import InitializationService
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def _execute_init_stage(
|
|
340
|
+
orchestrator: "WorkflowOrchestrator", console: Inject[Console]
|
|
341
|
+
) -> bool:
|
|
314
342
|
try:
|
|
315
343
|
from pathlib import Path
|
|
316
344
|
|
|
317
|
-
from crackerjack.services.filesystem import FileSystemService
|
|
318
|
-
from crackerjack.services.git import GitService
|
|
319
|
-
from crackerjack.services.initialization import InitializationService
|
|
320
|
-
|
|
321
|
-
console = orchestrator.console
|
|
322
345
|
pkg_path = orchestrator.pkg_path
|
|
323
346
|
|
|
324
347
|
filesystem = FileSystemService()
|
|
325
|
-
git_service = GitService(
|
|
348
|
+
git_service = GitService(pkg_path)
|
|
326
349
|
|
|
327
|
-
init_service = InitializationService(
|
|
350
|
+
init_service = InitializationService(filesystem, git_service, pkg_path)
|
|
328
351
|
|
|
329
352
|
results = init_service.initialize_project_full(target_path=Path.cwd())
|
|
330
353
|
|
|
@@ -17,37 +17,91 @@ def register_execution_tools(mcp_app: t.Any) -> None:
|
|
|
17
17
|
def _register_execute_crackerjack_tool(mcp_app: t.Any) -> None:
|
|
18
18
|
@mcp_app.tool() # type: ignore[misc]
|
|
19
19
|
async def execute_crackerjack(args: str, kwargs: str) -> str:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
kwargs_result = _parse_kwargs(kwargs)
|
|
27
|
-
if "error" in kwargs_result:
|
|
28
|
-
return json.dumps(kwargs_result)
|
|
29
|
-
|
|
30
|
-
extra_kwargs = kwargs_result["kwargs"]
|
|
20
|
+
try:
|
|
21
|
+
context = get_context()
|
|
22
|
+
validation_error = await _handle_context_validation(context)
|
|
23
|
+
if validation_error:
|
|
24
|
+
return validation_error
|
|
31
25
|
|
|
32
|
-
|
|
33
|
-
if
|
|
34
|
-
|
|
35
|
-
else:
|
|
36
|
-
extra_kwargs["execution_timeout"] = 900
|
|
26
|
+
kwargs_result = _parse_kwargs(kwargs)
|
|
27
|
+
if "error" in kwargs_result:
|
|
28
|
+
return json.dumps(kwargs_result)
|
|
37
29
|
|
|
38
|
-
|
|
30
|
+
extra_kwargs = _prepare_execution_kwargs(kwargs_result["kwargs"])
|
|
39
31
|
result = await execute_crackerjack_workflow(args, extra_kwargs)
|
|
40
32
|
return json.dumps(result, indent=2)
|
|
33
|
+
except TypeError as e:
|
|
34
|
+
return _handle_type_error(e)
|
|
41
35
|
except Exception as e:
|
|
36
|
+
return _handle_general_error(e)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
async def _handle_context_validation(context: t.Any) -> str | None:
|
|
40
|
+
"""Handle context validation with proper error handling."""
|
|
41
|
+
from datetime import datetime
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
validation_error = await _validate_context_and_rate_limit(context)
|
|
45
|
+
if validation_error:
|
|
46
|
+
return validation_error
|
|
47
|
+
return None
|
|
48
|
+
except TypeError as e:
|
|
49
|
+
if "NoneType" in str(e) and "await" in str(e):
|
|
42
50
|
return json.dumps(
|
|
43
51
|
{
|
|
44
52
|
"status": "failed",
|
|
45
|
-
"error":
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
"error": "Context validation failed: rate limiter returned None. "
|
|
54
|
+
"MCP server may not be properly initialized.",
|
|
55
|
+
"timestamp": datetime.now().isoformat(),
|
|
56
|
+
"details": str(e),
|
|
49
57
|
}
|
|
50
58
|
)
|
|
59
|
+
raise
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _prepare_execution_kwargs(kwargs: dict[str, t.Any]) -> dict[str, t.Any]:
|
|
63
|
+
"""Prepare execution kwargs with appropriate timeout defaults."""
|
|
64
|
+
if "execution_timeout" not in kwargs:
|
|
65
|
+
if kwargs.get("test", False) or kwargs.get("testing", False):
|
|
66
|
+
kwargs["execution_timeout"] = 1200
|
|
67
|
+
else:
|
|
68
|
+
kwargs["execution_timeout"] = 900
|
|
69
|
+
return kwargs
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _handle_type_error(error: TypeError) -> str:
|
|
73
|
+
"""Handle TypeError with specific async execution error details."""
|
|
74
|
+
import traceback
|
|
75
|
+
from datetime import datetime
|
|
76
|
+
|
|
77
|
+
if "NoneType" in str(error) and "await" in str(error):
|
|
78
|
+
return json.dumps(
|
|
79
|
+
{
|
|
80
|
+
"status": "failed",
|
|
81
|
+
"error": f"Async execution error: A function returned None instead of an awaitable. {error}",
|
|
82
|
+
"traceback": traceback.format_exc(),
|
|
83
|
+
"timestamp": datetime.now().isoformat(),
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
raise error
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _handle_general_error(error: Exception) -> str:
|
|
90
|
+
"""Handle general execution errors with traceback."""
|
|
91
|
+
import traceback
|
|
92
|
+
from datetime import datetime
|
|
93
|
+
|
|
94
|
+
context = get_context()
|
|
95
|
+
return json.dumps(
|
|
96
|
+
{
|
|
97
|
+
"status": "failed",
|
|
98
|
+
"error": f"Execution failed: {error}",
|
|
99
|
+
"traceback": traceback.format_exc(),
|
|
100
|
+
"timestamp": context.get_current_time()
|
|
101
|
+
if context and hasattr(context, "get_current_time")
|
|
102
|
+
else datetime.now().isoformat(),
|
|
103
|
+
}
|
|
104
|
+
)
|
|
51
105
|
|
|
52
106
|
|
|
53
107
|
def _register_smart_error_analysis_tool(mcp_app: t.Any) -> None:
|
|
@@ -153,20 +207,22 @@ def _parse_init_arguments(args: str, kwargs: str) -> tuple[t.Any, bool, str | No
|
|
|
153
207
|
|
|
154
208
|
|
|
155
209
|
def _execute_initialization(target_path: t.Any, force: bool) -> dict[str, t.Any]:
|
|
156
|
-
from
|
|
157
|
-
|
|
158
|
-
from crackerjack.services.initialization import InitializationService
|
|
159
|
-
|
|
160
|
-
console = Console()
|
|
210
|
+
from acb.console import Console
|
|
211
|
+
from acb.depends import Inject, depends
|
|
161
212
|
|
|
162
213
|
from crackerjack.services.filesystem import FileSystemService
|
|
163
214
|
from crackerjack.services.git import GitService
|
|
215
|
+
from crackerjack.services.initialization import InitializationService
|
|
164
216
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
217
|
+
@depends.inject
|
|
218
|
+
def _execute_initialization(
|
|
219
|
+
target_path: t.Any, force: bool, console: Inject[Console]
|
|
220
|
+
) -> dict[str, t.Any]:
|
|
221
|
+
filesystem = FileSystemService()
|
|
222
|
+
git_service = GitService(target_path)
|
|
223
|
+
return InitializationService(
|
|
224
|
+
filesystem, git_service, target_path
|
|
225
|
+
).initialize_project_full(force=force)
|
|
170
226
|
|
|
171
227
|
|
|
172
228
|
def _create_init_error_response(message: str) -> str:
|
|
@@ -147,7 +147,7 @@ async def get_smart_agent_recommendation(
|
|
|
147
147
|
context=task_context,
|
|
148
148
|
)
|
|
149
149
|
|
|
150
|
-
response = {
|
|
150
|
+
response: dict[str, t.Any] = {
|
|
151
151
|
"task_description": task_description,
|
|
152
152
|
"context_type": context_type,
|
|
153
153
|
}
|
|
@@ -181,7 +181,7 @@ async def get_smart_agent_recommendation(
|
|
|
181
181
|
{"error": str(e)}, indent=2
|
|
182
182
|
)
|
|
183
183
|
|
|
184
|
-
logger.debug(f"Generated recommendation for task: {task_description[:50]}
|
|
184
|
+
logger.debug(f"Generated recommendation for task: {task_description[:50]}")
|
|
185
185
|
return response
|
|
186
186
|
|
|
187
187
|
except Exception as e:
|
|
@@ -119,7 +119,7 @@ def _create_validation_results(file_path: str) -> dict[str, t.Any]:
|
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
def _create_pattern_suggestions(problem_context: str) -> dict[str, t.Any]:
|
|
122
|
-
pattern_suggestions = {
|
|
122
|
+
pattern_suggestions: dict[str, t.Any] = {
|
|
123
123
|
"context": problem_context,
|
|
124
124
|
"recommended_patterns": [],
|
|
125
125
|
"implementation_guidance": [],
|