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
|
@@ -8,7 +8,10 @@ from enum import Enum
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
10
|
from crackerjack.services.cache import CrackerjackCache
|
|
11
|
-
from crackerjack.services.quality_baseline import
|
|
11
|
+
from crackerjack.services.quality.quality_baseline import (
|
|
12
|
+
QualityBaselineService,
|
|
13
|
+
QualityMetrics,
|
|
14
|
+
)
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
class TrendDirection(str, Enum):
|
|
@@ -10,7 +10,9 @@ from pathlib import Path
|
|
|
10
10
|
import numpy as np
|
|
11
11
|
from scipy import stats
|
|
12
12
|
|
|
13
|
-
from crackerjack.
|
|
13
|
+
from crackerjack.models.protocols import QualityIntelligenceProtocol
|
|
14
|
+
|
|
15
|
+
from .quality_baseline_enhanced import (
|
|
14
16
|
AlertSeverity,
|
|
15
17
|
EnhancedQualityBaselineService,
|
|
16
18
|
TrendDirection,
|
|
@@ -152,7 +154,7 @@ class QualityInsights:
|
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
|
|
155
|
-
class QualityIntelligenceService:
|
|
157
|
+
class QualityIntelligenceService(QualityIntelligenceProtocol):
|
|
156
158
|
"""Advanced ML-based quality intelligence service."""
|
|
157
159
|
|
|
158
160
|
def __init__(
|
|
@@ -168,7 +170,7 @@ class QualityIntelligenceService:
|
|
|
168
170
|
def detect_anomalies(
|
|
169
171
|
self, days: int = 30, metrics: list[str] | None = None
|
|
170
172
|
) -> list[QualityAnomaly]:
|
|
171
|
-
"""Detect anomalies in quality metrics using statistical analysis."""
|
|
173
|
+
"""Detect anomalies in quality metrics using statistical analysis (sync version)."""
|
|
172
174
|
metrics = self._get_default_metrics() if metrics is None else metrics
|
|
173
175
|
|
|
174
176
|
baselines = self.quality_service.get_recent_baselines(limit=days * 2)
|
|
@@ -182,6 +184,23 @@ class QualityIntelligenceService:
|
|
|
182
184
|
|
|
183
185
|
return anomalies
|
|
184
186
|
|
|
187
|
+
async def detect_anomalies_async(
|
|
188
|
+
self, days: int = 30, metrics: list[str] | None = None
|
|
189
|
+
) -> list[QualityAnomaly]:
|
|
190
|
+
"""Detect anomalies in quality metrics using statistical analysis (async version)."""
|
|
191
|
+
metrics = self._get_default_metrics() if metrics is None else metrics
|
|
192
|
+
|
|
193
|
+
baselines = await self.quality_service.aget_recent_baselines(limit=days * 2)
|
|
194
|
+
if len(baselines) < self.min_data_points:
|
|
195
|
+
return []
|
|
196
|
+
|
|
197
|
+
anomalies = []
|
|
198
|
+
for metric_name in metrics:
|
|
199
|
+
metric_anomalies = self._detect_metric_anomalies(metric_name, baselines)
|
|
200
|
+
anomalies.extend(metric_anomalies)
|
|
201
|
+
|
|
202
|
+
return anomalies
|
|
203
|
+
|
|
185
204
|
def _get_default_metrics(self) -> list[str]:
|
|
186
205
|
"""Get default metrics list[t.Any] for anomaly detection."""
|
|
187
206
|
return [
|
|
@@ -264,7 +283,7 @@ class QualityIntelligenceService:
|
|
|
264
283
|
metric_name: str,
|
|
265
284
|
values: list[float],
|
|
266
285
|
timestamps: list[t.Any],
|
|
267
|
-
stats_data: dict[str,
|
|
286
|
+
stats_data: dict[str, t.Any],
|
|
268
287
|
) -> list[QualityAnomaly]:
|
|
269
288
|
"""Identify outlier anomalies based on z-scores."""
|
|
270
289
|
anomalies = []
|
|
@@ -339,7 +358,7 @@ class QualityIntelligenceService:
|
|
|
339
358
|
return anomaly_type, severity
|
|
340
359
|
|
|
341
360
|
def identify_patterns(self, days: int = 60) -> list[QualityPattern]:
|
|
342
|
-
"""Identify patterns in quality metrics using correlation and trend analysis."""
|
|
361
|
+
"""Identify patterns in quality metrics using correlation and trend analysis (sync version)."""
|
|
343
362
|
baselines = self.quality_service.get_recent_baselines(limit=days * 2)
|
|
344
363
|
if len(baselines) < self.min_data_points:
|
|
345
364
|
return []
|
|
@@ -347,6 +366,15 @@ class QualityIntelligenceService:
|
|
|
347
366
|
metrics_data = self._extract_metrics_data(baselines)
|
|
348
367
|
return self._find_correlation_patterns(metrics_data, days)
|
|
349
368
|
|
|
369
|
+
async def identify_patterns_async(self, days: int = 60) -> list[QualityPattern]:
|
|
370
|
+
"""Identify patterns in quality metrics using correlation and trend analysis (async version)."""
|
|
371
|
+
baselines = await self.quality_service.aget_recent_baselines(limit=days * 2)
|
|
372
|
+
if len(baselines) < self.min_data_points:
|
|
373
|
+
return []
|
|
374
|
+
|
|
375
|
+
metrics_data = self._extract_metrics_data(baselines)
|
|
376
|
+
return self._find_correlation_patterns(metrics_data, days)
|
|
377
|
+
|
|
350
378
|
def _extract_metrics_data(self, baselines: list[t.Any]) -> dict[str, list[float]]:
|
|
351
379
|
"""Extract metric data from baselines for correlation analysis."""
|
|
352
380
|
metrics_data = {
|
|
@@ -399,7 +427,17 @@ class QualityIntelligenceService:
|
|
|
399
427
|
if len(values1) < self.min_data_points:
|
|
400
428
|
return None
|
|
401
429
|
|
|
402
|
-
|
|
430
|
+
# Handle constant input arrays that would cause correlation warnings
|
|
431
|
+
try:
|
|
432
|
+
# Check for constant arrays (all values the same)
|
|
433
|
+
if 0 in (np.var(values1), np.var(values2)):
|
|
434
|
+
# Cannot calculate correlation for constant arrays
|
|
435
|
+
return None
|
|
436
|
+
|
|
437
|
+
correlation, p_value = stats.pearsonr(values1, values2)
|
|
438
|
+
except (ValueError, RuntimeWarning):
|
|
439
|
+
# Handle any other correlation calculation issues
|
|
440
|
+
return None
|
|
403
441
|
|
|
404
442
|
# Strong correlation threshold
|
|
405
443
|
if abs(correlation) > 0.7 and p_value < 0.05:
|
|
@@ -624,16 +662,12 @@ class QualityIntelligenceService:
|
|
|
624
662
|
return "medium"
|
|
625
663
|
return "low"
|
|
626
664
|
|
|
627
|
-
def
|
|
628
|
-
self,
|
|
629
|
-
anomalies: list[QualityAnomaly],
|
|
630
|
-
patterns: list[QualityPattern],
|
|
631
|
-
predictions: list[QualityPrediction],
|
|
665
|
+
def _generate_anomaly_recommendations(
|
|
666
|
+
self, anomalies: list[QualityAnomaly]
|
|
632
667
|
) -> list[str]:
|
|
633
|
-
"""Generate
|
|
668
|
+
"""Generate recommendations based on anomalies."""
|
|
634
669
|
recommendations = []
|
|
635
670
|
|
|
636
|
-
# Anomaly-based recommendations
|
|
637
671
|
critical_anomalies = [
|
|
638
672
|
a for a in anomalies if a.severity == AlertSeverity.CRITICAL
|
|
639
673
|
]
|
|
@@ -652,7 +686,14 @@ class QualityIntelligenceService:
|
|
|
652
686
|
"📉 Quality score drops detected - review recent commits and implement quality gates"
|
|
653
687
|
)
|
|
654
688
|
|
|
655
|
-
|
|
689
|
+
return recommendations
|
|
690
|
+
|
|
691
|
+
def _generate_pattern_recommendations(
|
|
692
|
+
self, patterns: list[QualityPattern]
|
|
693
|
+
) -> list[str]:
|
|
694
|
+
"""Generate recommendations based on patterns."""
|
|
695
|
+
recommendations = []
|
|
696
|
+
|
|
656
697
|
declining_correlations = [
|
|
657
698
|
p for p in patterns if p.trend_direction == TrendDirection.DECLINING
|
|
658
699
|
]
|
|
@@ -667,7 +708,14 @@ class QualityIntelligenceService:
|
|
|
667
708
|
"📊 Strong quality patterns detected - leverage insights for predictive quality management"
|
|
668
709
|
)
|
|
669
710
|
|
|
670
|
-
|
|
711
|
+
return recommendations
|
|
712
|
+
|
|
713
|
+
def _generate_prediction_recommendations(
|
|
714
|
+
self, predictions: list[QualityPrediction]
|
|
715
|
+
) -> list[str]:
|
|
716
|
+
"""Generate recommendations based on predictions."""
|
|
717
|
+
recommendations = []
|
|
718
|
+
|
|
671
719
|
high_risk_predictions = [
|
|
672
720
|
p for p in predictions if p.risk_assessment in ("high", "critical")
|
|
673
721
|
]
|
|
@@ -685,12 +733,35 @@ class QualityIntelligenceService:
|
|
|
685
733
|
"📈 Wide prediction intervals detected - increase data collection frequency for better forecasting"
|
|
686
734
|
)
|
|
687
735
|
|
|
688
|
-
|
|
736
|
+
return recommendations
|
|
737
|
+
|
|
738
|
+
def _generate_general_ml_insights(
|
|
739
|
+
self, anomalies: list[QualityAnomaly]
|
|
740
|
+
) -> list[str]:
|
|
741
|
+
"""Generate general ML insights."""
|
|
742
|
+
recommendations = []
|
|
743
|
+
|
|
689
744
|
if len(anomalies) > 5:
|
|
690
745
|
recommendations.append(
|
|
691
746
|
f"🤖 High anomaly frequency ({len(anomalies)}) suggests systemic quality issues - consider ML-based automated quality monitoring"
|
|
692
747
|
)
|
|
693
748
|
|
|
749
|
+
return recommendations
|
|
750
|
+
|
|
751
|
+
def generate_ml_recommendations(
|
|
752
|
+
self,
|
|
753
|
+
anomalies: list[QualityAnomaly],
|
|
754
|
+
patterns: list[QualityPattern],
|
|
755
|
+
predictions: list[QualityPrediction],
|
|
756
|
+
) -> list[str]:
|
|
757
|
+
"""Generate intelligent recommendations based on ML analysis."""
|
|
758
|
+
recommendations = []
|
|
759
|
+
|
|
760
|
+
recommendations.extend(self._generate_anomaly_recommendations(anomalies))
|
|
761
|
+
recommendations.extend(self._generate_pattern_recommendations(patterns))
|
|
762
|
+
recommendations.extend(self._generate_prediction_recommendations(predictions))
|
|
763
|
+
recommendations.extend(self._generate_general_ml_insights(anomalies))
|
|
764
|
+
|
|
694
765
|
if not recommendations:
|
|
695
766
|
recommendations.append(
|
|
696
767
|
"✅ Quality metrics show stable patterns with no significant anomalies detected - maintain current practices"
|
|
@@ -783,3 +854,96 @@ class QualityIntelligenceService:
|
|
|
783
854
|
"""Export quality insights to JSON file."""
|
|
784
855
|
with output_path.open("w") as f:
|
|
785
856
|
json.dump(insights.to_dict(), f, indent=2, default=str)
|
|
857
|
+
|
|
858
|
+
# Protocol methods required by QualityIntelligenceProtocol
|
|
859
|
+
def analyze_quality_trends(self) -> dict[str, t.Any]:
|
|
860
|
+
"""Analyze quality trends."""
|
|
861
|
+
# Use existing identify_patterns method to analyze trends
|
|
862
|
+
patterns = self.identify_patterns()
|
|
863
|
+
trend_analysis = {
|
|
864
|
+
"total_patterns": len(patterns),
|
|
865
|
+
"patterns_by_type": {
|
|
866
|
+
"cyclic": len(
|
|
867
|
+
[p for p in patterns if p.pattern_type == PatternType.CYCLIC]
|
|
868
|
+
),
|
|
869
|
+
"seasonal": len(
|
|
870
|
+
[p for p in patterns if p.pattern_type == PatternType.SEASONAL]
|
|
871
|
+
),
|
|
872
|
+
"correlation": len(
|
|
873
|
+
[p for p in patterns if p.pattern_type == PatternType.CORRELATION]
|
|
874
|
+
),
|
|
875
|
+
"regression": len(
|
|
876
|
+
[p for p in patterns if p.pattern_type == PatternType.REGRESSION]
|
|
877
|
+
),
|
|
878
|
+
"improvement": len(
|
|
879
|
+
[p for p in patterns if p.pattern_type == PatternType.IMPROVEMENT]
|
|
880
|
+
),
|
|
881
|
+
},
|
|
882
|
+
"trend_directions": {
|
|
883
|
+
"improving": len(
|
|
884
|
+
[
|
|
885
|
+
p
|
|
886
|
+
for p in patterns
|
|
887
|
+
if p.trend_direction == TrendDirection.IMPROVING
|
|
888
|
+
]
|
|
889
|
+
),
|
|
890
|
+
"declining": len(
|
|
891
|
+
[
|
|
892
|
+
p
|
|
893
|
+
for p in patterns
|
|
894
|
+
if p.trend_direction == TrendDirection.DECLINING
|
|
895
|
+
]
|
|
896
|
+
),
|
|
897
|
+
"stable": len(
|
|
898
|
+
[p for p in patterns if p.trend_direction == TrendDirection.STABLE]
|
|
899
|
+
),
|
|
900
|
+
"volatile": len(
|
|
901
|
+
[
|
|
902
|
+
p
|
|
903
|
+
for p in patterns
|
|
904
|
+
if p.trend_direction == TrendDirection.VOLATILE
|
|
905
|
+
]
|
|
906
|
+
),
|
|
907
|
+
},
|
|
908
|
+
"generated_at": datetime.now().isoformat(),
|
|
909
|
+
}
|
|
910
|
+
return trend_analysis
|
|
911
|
+
|
|
912
|
+
def predict_quality_issues(self) -> list[dict[str, t.Any]]:
|
|
913
|
+
"""Predict potential quality issues."""
|
|
914
|
+
predictions = self.generate_advanced_predictions()
|
|
915
|
+
|
|
916
|
+
return [
|
|
917
|
+
{
|
|
918
|
+
"metric": pred.metric_name,
|
|
919
|
+
"predicted_value": pred.predicted_value,
|
|
920
|
+
"risk_level": pred.risk_assessment,
|
|
921
|
+
"confidence_interval": {
|
|
922
|
+
"lower": pred.confidence_lower,
|
|
923
|
+
"upper": pred.confidence_upper,
|
|
924
|
+
},
|
|
925
|
+
"prediction_horizon": pred.prediction_horizon_days,
|
|
926
|
+
"factors": pred.factors,
|
|
927
|
+
}
|
|
928
|
+
for pred in predictions
|
|
929
|
+
if pred.risk_assessment in ("high", "critical")
|
|
930
|
+
]
|
|
931
|
+
|
|
932
|
+
def recommend_improvements(self) -> list[dict[str, t.Any]]:
|
|
933
|
+
"""Recommend quality improvements."""
|
|
934
|
+
# Generate basic analysis to get data for recommendations
|
|
935
|
+
anomalies = self.detect_anomalies()
|
|
936
|
+
patterns = self.identify_patterns()
|
|
937
|
+
predictions = self.generate_advanced_predictions()
|
|
938
|
+
|
|
939
|
+
recommendations = self.generate_ml_recommendations(
|
|
940
|
+
anomalies, patterns, predictions
|
|
941
|
+
)
|
|
942
|
+
|
|
943
|
+
# Convert to required format
|
|
944
|
+
return [{"message": rec} for rec in recommendations]
|
|
945
|
+
|
|
946
|
+
def get_intelligence_report(self) -> dict[str, t.Any]:
|
|
947
|
+
"""Get quality intelligence report."""
|
|
948
|
+
insights = self.generate_comprehensive_insights()
|
|
949
|
+
return insights.to_dict()
|