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,176 @@
|
|
|
1
|
+
"""WebSocket endpoints for error heatmap visualization.
|
|
2
|
+
|
|
3
|
+
This module handles real-time error heatmap streaming for
|
|
4
|
+
file-based, temporal, and function-based error analysis.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import json
|
|
9
|
+
import typing as t
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
|
|
12
|
+
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
13
|
+
|
|
14
|
+
from crackerjack.services.monitoring.error_pattern_analyzer import (
|
|
15
|
+
ErrorPatternAnalyzer,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def register_heatmap_websockets(
|
|
20
|
+
app: FastAPI, error_analyzer: ErrorPatternAnalyzer
|
|
21
|
+
) -> None:
|
|
22
|
+
"""Register heatmap-related WebSocket endpoints."""
|
|
23
|
+
|
|
24
|
+
@app.websocket("/ws/heatmap/errors")
|
|
25
|
+
async def websocket_error_heatmap(websocket: WebSocket) -> None:
|
|
26
|
+
"""WebSocket endpoint for real-time error heat map streaming."""
|
|
27
|
+
await _handle_error_heatmap_websocket(websocket, error_analyzer)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def _handle_error_heatmap_websocket(
|
|
31
|
+
websocket: WebSocket, error_analyzer: ErrorPatternAnalyzer
|
|
32
|
+
) -> None:
|
|
33
|
+
"""Handle error heatmap WebSocket connection."""
|
|
34
|
+
await websocket.accept()
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
# Analyze error patterns and send initial data
|
|
38
|
+
error_patterns = error_analyzer.analyze_error_patterns(days=30)
|
|
39
|
+
await _send_initial_heatmap_data(websocket, error_analyzer, error_patterns)
|
|
40
|
+
|
|
41
|
+
# Handle client messages
|
|
42
|
+
while True:
|
|
43
|
+
try:
|
|
44
|
+
message = await asyncio.wait_for(websocket.receive_text(), timeout=30.0)
|
|
45
|
+
data = json.loads(message)
|
|
46
|
+
|
|
47
|
+
await _handle_heatmap_request(websocket, error_analyzer, data)
|
|
48
|
+
|
|
49
|
+
except TimeoutError:
|
|
50
|
+
await websocket.send_text(
|
|
51
|
+
json.dumps(
|
|
52
|
+
{
|
|
53
|
+
"type": "heartbeat",
|
|
54
|
+
"timestamp": datetime.now().isoformat(),
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
except WebSocketDisconnect:
|
|
60
|
+
pass
|
|
61
|
+
except Exception as e:
|
|
62
|
+
await websocket.send_text(
|
|
63
|
+
json.dumps(
|
|
64
|
+
{
|
|
65
|
+
"type": "error",
|
|
66
|
+
"message": str(e),
|
|
67
|
+
"timestamp": datetime.now().isoformat(),
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
async def _send_initial_heatmap_data(
|
|
74
|
+
websocket: WebSocket,
|
|
75
|
+
error_analyzer: ErrorPatternAnalyzer,
|
|
76
|
+
error_patterns: list[t.Any],
|
|
77
|
+
) -> None:
|
|
78
|
+
"""Send initial heatmap data to client."""
|
|
79
|
+
# Send file-based heat map
|
|
80
|
+
file_heatmap = error_analyzer.generate_file_error_heatmap()
|
|
81
|
+
await websocket.send_text(
|
|
82
|
+
json.dumps(
|
|
83
|
+
{
|
|
84
|
+
"type": "file_heatmap",
|
|
85
|
+
"data": file_heatmap.to_dict(),
|
|
86
|
+
"timestamp": datetime.now().isoformat(),
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Send temporal heat map
|
|
92
|
+
temporal_heatmap = error_analyzer.generate_temporal_heatmap()
|
|
93
|
+
await websocket.send_text(
|
|
94
|
+
json.dumps(
|
|
95
|
+
{
|
|
96
|
+
"type": "temporal_heatmap",
|
|
97
|
+
"data": temporal_heatmap.to_dict(),
|
|
98
|
+
"timestamp": datetime.now().isoformat(),
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Send function-based heat map
|
|
104
|
+
function_heatmap = error_analyzer.generate_function_error_heatmap()
|
|
105
|
+
await websocket.send_text(
|
|
106
|
+
json.dumps(
|
|
107
|
+
{
|
|
108
|
+
"type": "function_heatmap",
|
|
109
|
+
"data": function_heatmap.to_dict(),
|
|
110
|
+
"timestamp": datetime.now().isoformat(),
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Send error patterns summary
|
|
116
|
+
patterns_data = [pattern.to_dict() for pattern in error_patterns]
|
|
117
|
+
await websocket.send_text(
|
|
118
|
+
json.dumps(
|
|
119
|
+
{
|
|
120
|
+
"type": "error_patterns",
|
|
121
|
+
"data": patterns_data,
|
|
122
|
+
"timestamp": datetime.now().isoformat(),
|
|
123
|
+
}
|
|
124
|
+
)
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
async def _handle_heatmap_request(
|
|
129
|
+
websocket: WebSocket,
|
|
130
|
+
error_analyzer: ErrorPatternAnalyzer,
|
|
131
|
+
data: dict[str, t.Any],
|
|
132
|
+
) -> None:
|
|
133
|
+
"""Handle heatmap request from client."""
|
|
134
|
+
if data.get("type") == "refresh_heatmap":
|
|
135
|
+
await _handle_heatmap_refresh(websocket, error_analyzer, data)
|
|
136
|
+
elif data.get("type") == "keepalive":
|
|
137
|
+
await websocket.send_text(
|
|
138
|
+
json.dumps(
|
|
139
|
+
{
|
|
140
|
+
"type": "pong",
|
|
141
|
+
"timestamp": datetime.now().isoformat(),
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
async def _handle_heatmap_refresh(
|
|
148
|
+
websocket: WebSocket,
|
|
149
|
+
error_analyzer: ErrorPatternAnalyzer,
|
|
150
|
+
data: dict[str, t.Any],
|
|
151
|
+
) -> None:
|
|
152
|
+
"""Handle heatmap refresh request."""
|
|
153
|
+
error_analyzer.analyze_error_patterns(days=data.get("days", 30))
|
|
154
|
+
|
|
155
|
+
heatmap_type = data.get("heatmap_type", "file")
|
|
156
|
+
|
|
157
|
+
if heatmap_type == "file":
|
|
158
|
+
heatmap = error_analyzer.generate_file_error_heatmap()
|
|
159
|
+
elif heatmap_type == "temporal":
|
|
160
|
+
heatmap = error_analyzer.generate_temporal_heatmap(
|
|
161
|
+
time_buckets=data.get("time_buckets", 24)
|
|
162
|
+
)
|
|
163
|
+
elif heatmap_type == "function":
|
|
164
|
+
heatmap = error_analyzer.generate_function_error_heatmap()
|
|
165
|
+
else:
|
|
166
|
+
return
|
|
167
|
+
|
|
168
|
+
await websocket.send_text(
|
|
169
|
+
json.dumps(
|
|
170
|
+
{
|
|
171
|
+
"type": f"{heatmap_type}_heatmap_refresh",
|
|
172
|
+
"data": heatmap.to_dict(),
|
|
173
|
+
"timestamp": datetime.now().isoformat(),
|
|
174
|
+
}
|
|
175
|
+
)
|
|
176
|
+
)
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"""WebSocket endpoints for intelligence features.
|
|
2
|
+
|
|
3
|
+
This module handles real-time anomaly detection, predictions,
|
|
4
|
+
and pattern analysis WebSocket connections.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import json
|
|
9
|
+
import typing as t
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
|
|
12
|
+
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
13
|
+
|
|
14
|
+
from crackerjack.services.quality.quality_intelligence import (
|
|
15
|
+
QualityIntelligenceService,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from ..websocket_manager import MonitoringWebSocketManager
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def register_intelligence_websockets(
|
|
22
|
+
app: FastAPI,
|
|
23
|
+
ws_manager: MonitoringWebSocketManager,
|
|
24
|
+
intelligence_service: QualityIntelligenceService,
|
|
25
|
+
) -> None:
|
|
26
|
+
"""Register intelligence-related WebSocket endpoints."""
|
|
27
|
+
|
|
28
|
+
@app.websocket("/ws/intelligence/anomalies")
|
|
29
|
+
async def websocket_anomaly_detection(websocket: WebSocket) -> None:
|
|
30
|
+
"""WebSocket endpoint for real-time anomaly detection."""
|
|
31
|
+
await _handle_anomaly_detection_websocket(
|
|
32
|
+
websocket, ws_manager, intelligence_service
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
@app.websocket("/ws/intelligence/predictions")
|
|
36
|
+
async def websocket_predictions(websocket: WebSocket) -> None:
|
|
37
|
+
"""WebSocket endpoint for quality predictions."""
|
|
38
|
+
await _handle_predictions_websocket(websocket, ws_manager, intelligence_service)
|
|
39
|
+
|
|
40
|
+
@app.websocket("/ws/intelligence/patterns")
|
|
41
|
+
async def websocket_pattern_analysis(websocket: WebSocket) -> None:
|
|
42
|
+
"""WebSocket endpoint for pattern recognition and correlation analysis."""
|
|
43
|
+
await _handle_pattern_analysis_websocket(
|
|
44
|
+
websocket, ws_manager, intelligence_service
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def _handle_anomaly_detection_websocket(
|
|
49
|
+
websocket: WebSocket,
|
|
50
|
+
ws_manager: MonitoringWebSocketManager,
|
|
51
|
+
intelligence_service: QualityIntelligenceService,
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Handle anomaly detection WebSocket connection."""
|
|
54
|
+
client_id = f"anomalies_{datetime.now().timestamp()}"
|
|
55
|
+
await ws_manager.connect_metrics(websocket, client_id)
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
# Send initial anomaly analysis
|
|
59
|
+
anomalies = intelligence_service.detect_anomalies(days=7)
|
|
60
|
+
await websocket.send_text(
|
|
61
|
+
json.dumps(
|
|
62
|
+
{
|
|
63
|
+
"type": "anomalies_initial",
|
|
64
|
+
"data": [anomaly.to_dict() for anomaly in anomalies],
|
|
65
|
+
"timestamp": datetime.now().isoformat(),
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
# Stream ongoing anomaly detection
|
|
71
|
+
while True:
|
|
72
|
+
try:
|
|
73
|
+
message = await asyncio.wait_for(websocket.receive_text(), timeout=60.0)
|
|
74
|
+
data = json.loads(message)
|
|
75
|
+
|
|
76
|
+
if data.get("type") == "request_analysis":
|
|
77
|
+
await _handle_anomaly_request(websocket, intelligence_service, data)
|
|
78
|
+
|
|
79
|
+
except TimeoutError:
|
|
80
|
+
await _send_periodic_anomaly_check(websocket, intelligence_service)
|
|
81
|
+
|
|
82
|
+
except WebSocketDisconnect:
|
|
83
|
+
ws_manager.disconnect(websocket, client_id)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def _handle_anomaly_request(
|
|
87
|
+
websocket: WebSocket,
|
|
88
|
+
intelligence_service: QualityIntelligenceService,
|
|
89
|
+
data: dict[str, t.Any],
|
|
90
|
+
) -> None:
|
|
91
|
+
"""Handle anomaly analysis request."""
|
|
92
|
+
days = data.get("days", 7)
|
|
93
|
+
metrics_filter = data.get("metrics")
|
|
94
|
+
|
|
95
|
+
anomalies = intelligence_service.detect_anomalies(days=days, metrics=metrics_filter)
|
|
96
|
+
await websocket.send_text(
|
|
97
|
+
json.dumps(
|
|
98
|
+
{
|
|
99
|
+
"type": "anomalies_update",
|
|
100
|
+
"data": [anomaly.to_dict() for anomaly in anomalies],
|
|
101
|
+
"timestamp": datetime.now().isoformat(),
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
async def _send_periodic_anomaly_check(
|
|
108
|
+
websocket: WebSocket, intelligence_service: QualityIntelligenceService
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Send periodic anomaly check."""
|
|
111
|
+
anomalies = intelligence_service.detect_anomalies(days=1)
|
|
112
|
+
if anomalies:
|
|
113
|
+
await websocket.send_text(
|
|
114
|
+
json.dumps(
|
|
115
|
+
{
|
|
116
|
+
"type": "anomalies_alert",
|
|
117
|
+
"data": [anomaly.to_dict() for anomaly in anomalies],
|
|
118
|
+
"timestamp": datetime.now().isoformat(),
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
async def _handle_predictions_websocket(
|
|
125
|
+
websocket: WebSocket,
|
|
126
|
+
ws_manager: MonitoringWebSocketManager,
|
|
127
|
+
intelligence_service: QualityIntelligenceService,
|
|
128
|
+
) -> None:
|
|
129
|
+
"""Handle predictions WebSocket connection."""
|
|
130
|
+
client_id = f"predictions_{datetime.now().timestamp()}"
|
|
131
|
+
await ws_manager.connect_metrics(websocket, client_id)
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
# Send initial predictions
|
|
135
|
+
insights = intelligence_service.generate_comprehensive_insights(days=30)
|
|
136
|
+
await websocket.send_text(
|
|
137
|
+
json.dumps(
|
|
138
|
+
{
|
|
139
|
+
"type": "predictions_initial",
|
|
140
|
+
"data": insights.to_dict(),
|
|
141
|
+
"timestamp": datetime.now().isoformat(),
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Stream prediction updates
|
|
147
|
+
while True:
|
|
148
|
+
try:
|
|
149
|
+
message = await asyncio.wait_for(
|
|
150
|
+
websocket.receive_text(), timeout=300.0
|
|
151
|
+
)
|
|
152
|
+
data = json.loads(message)
|
|
153
|
+
|
|
154
|
+
if data.get("type") == "request_predictions":
|
|
155
|
+
await _handle_prediction_request(
|
|
156
|
+
websocket, intelligence_service, data
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
except TimeoutError:
|
|
160
|
+
await _send_periodic_prediction_update(websocket, intelligence_service)
|
|
161
|
+
|
|
162
|
+
except WebSocketDisconnect:
|
|
163
|
+
ws_manager.disconnect(websocket, client_id)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
async def _handle_prediction_request(
|
|
167
|
+
websocket: WebSocket,
|
|
168
|
+
intelligence_service: QualityIntelligenceService,
|
|
169
|
+
data: dict[str, t.Any],
|
|
170
|
+
) -> None:
|
|
171
|
+
"""Handle prediction request."""
|
|
172
|
+
days = data.get("days", 30)
|
|
173
|
+
horizon = data.get("horizon", 7)
|
|
174
|
+
|
|
175
|
+
insights = intelligence_service.generate_comprehensive_insights(days=days)
|
|
176
|
+
|
|
177
|
+
# Generate specific predictions for requested horizon
|
|
178
|
+
predictions = {}
|
|
179
|
+
all_predictions = intelligence_service.generate_advanced_predictions(
|
|
180
|
+
horizon_days=horizon
|
|
181
|
+
)
|
|
182
|
+
for metric in ("quality_score", "test_coverage", "hook_duration"):
|
|
183
|
+
# Find the prediction for this specific metric
|
|
184
|
+
pred = next((p for p in all_predictions if p.metric_name == metric), None)
|
|
185
|
+
if pred:
|
|
186
|
+
predictions[metric] = pred.to_dict()
|
|
187
|
+
|
|
188
|
+
await websocket.send_text(
|
|
189
|
+
json.dumps(
|
|
190
|
+
{
|
|
191
|
+
"type": "predictions_update",
|
|
192
|
+
"data": {
|
|
193
|
+
"insights": insights.to_dict(),
|
|
194
|
+
"predictions": predictions,
|
|
195
|
+
},
|
|
196
|
+
"timestamp": datetime.now().isoformat(),
|
|
197
|
+
}
|
|
198
|
+
)
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
async def _send_periodic_prediction_update(
|
|
203
|
+
websocket: WebSocket, intelligence_service: QualityIntelligenceService
|
|
204
|
+
) -> None:
|
|
205
|
+
"""Send periodic predictions update."""
|
|
206
|
+
insights = intelligence_service.generate_comprehensive_insights(days=7)
|
|
207
|
+
await websocket.send_text(
|
|
208
|
+
json.dumps(
|
|
209
|
+
{
|
|
210
|
+
"type": "predictions_periodic",
|
|
211
|
+
"data": insights.to_dict(),
|
|
212
|
+
"timestamp": datetime.now().isoformat(),
|
|
213
|
+
}
|
|
214
|
+
)
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
async def _handle_pattern_analysis_websocket(
|
|
219
|
+
websocket: WebSocket,
|
|
220
|
+
ws_manager: MonitoringWebSocketManager,
|
|
221
|
+
intelligence_service: QualityIntelligenceService,
|
|
222
|
+
) -> None:
|
|
223
|
+
"""Handle pattern analysis WebSocket connection."""
|
|
224
|
+
client_id = f"patterns_{datetime.now().timestamp()}"
|
|
225
|
+
await ws_manager.connect_metrics(websocket, client_id)
|
|
226
|
+
|
|
227
|
+
try:
|
|
228
|
+
# Send initial pattern analysis
|
|
229
|
+
patterns = intelligence_service.identify_patterns(days=30)
|
|
230
|
+
await websocket.send_text(
|
|
231
|
+
json.dumps(
|
|
232
|
+
{
|
|
233
|
+
"type": "patterns_initial",
|
|
234
|
+
"data": patterns,
|
|
235
|
+
"timestamp": datetime.now().isoformat(),
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# Stream pattern updates
|
|
241
|
+
while True:
|
|
242
|
+
try:
|
|
243
|
+
message = await asyncio.wait_for(
|
|
244
|
+
websocket.receive_text(), timeout=180.0
|
|
245
|
+
)
|
|
246
|
+
data = json.loads(message)
|
|
247
|
+
|
|
248
|
+
if data.get("type") == "request_patterns":
|
|
249
|
+
await _handle_pattern_request(websocket, intelligence_service, data)
|
|
250
|
+
|
|
251
|
+
except TimeoutError:
|
|
252
|
+
await _send_periodic_pattern_update(websocket, intelligence_service)
|
|
253
|
+
|
|
254
|
+
except WebSocketDisconnect:
|
|
255
|
+
ws_manager.disconnect(websocket, client_id)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
async def _handle_pattern_request(
|
|
259
|
+
websocket: WebSocket,
|
|
260
|
+
intelligence_service: QualityIntelligenceService,
|
|
261
|
+
data: dict[str, t.Any],
|
|
262
|
+
) -> None:
|
|
263
|
+
"""Handle pattern analysis request."""
|
|
264
|
+
days = data.get("days", 30)
|
|
265
|
+
patterns = intelligence_service.identify_patterns(days=days)
|
|
266
|
+
|
|
267
|
+
await websocket.send_text(
|
|
268
|
+
json.dumps(
|
|
269
|
+
{
|
|
270
|
+
"type": "patterns_update",
|
|
271
|
+
"data": patterns,
|
|
272
|
+
"timestamp": datetime.now().isoformat(),
|
|
273
|
+
}
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
async def _send_periodic_pattern_update(
|
|
279
|
+
websocket: WebSocket, intelligence_service: QualityIntelligenceService
|
|
280
|
+
) -> None:
|
|
281
|
+
"""Send periodic pattern analysis update."""
|
|
282
|
+
patterns = intelligence_service.identify_patterns(days=7)
|
|
283
|
+
await websocket.send_text(
|
|
284
|
+
json.dumps(
|
|
285
|
+
{
|
|
286
|
+
"type": "patterns_periodic",
|
|
287
|
+
"data": patterns,
|
|
288
|
+
"timestamp": datetime.now().isoformat(),
|
|
289
|
+
}
|
|
290
|
+
)
|
|
291
|
+
)
|