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
crackerjack/services/logging.py
CHANGED
|
@@ -1,99 +1,145 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"""Crackerjack logging compatibility layer using ACB's logger.
|
|
2
|
+
|
|
3
|
+
This module provides backward compatibility with Crackerjack's logging API
|
|
4
|
+
while delegating to ACB's logger system. It maintains the same public API
|
|
5
|
+
for LoggingContext, get_logger(), and other utilities.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
3
10
|
import time
|
|
4
|
-
import typing as t
|
|
5
11
|
import uuid
|
|
12
|
+
from collections.abc import Callable
|
|
6
13
|
from contextvars import ContextVar
|
|
7
14
|
from pathlib import Path
|
|
8
15
|
from types import TracebackType
|
|
9
16
|
from typing import Any
|
|
10
17
|
|
|
11
|
-
|
|
12
|
-
from
|
|
18
|
+
# Use ACB's Logger instead of loguru directly
|
|
19
|
+
from acb.logger import Logger
|
|
13
20
|
|
|
14
|
-
|
|
21
|
+
_correlation_id_var: ContextVar[str | None] = ContextVar(
|
|
22
|
+
"crackerjack_correlation_id",
|
|
23
|
+
default=None,
|
|
24
|
+
)
|
|
15
25
|
|
|
26
|
+
_logger_cache: dict[str, Any] = {}
|
|
16
27
|
|
|
17
|
-
def set_correlation_id(cid: str) -> None:
|
|
18
|
-
correlation_id.set(cid)
|
|
19
28
|
|
|
29
|
+
def _get_acb_logger() -> Logger:
|
|
30
|
+
"""Get ACB logger instance from dependency injection."""
|
|
31
|
+
# Create a new logger instance directly
|
|
32
|
+
# ACB's Logger class is already properly initialized
|
|
33
|
+
try:
|
|
34
|
+
# Attempt to get logger via ACB's dependency injection
|
|
35
|
+
logger = Logger()
|
|
36
|
+
# If Logger is a tuple (dependency injection marker), we need to handle it differently
|
|
37
|
+
if isinstance(logger, tuple):
|
|
38
|
+
# For now, fall back to a basic logger configuration
|
|
39
|
+
# In a proper ACB setup, this would be handled by the dependency system
|
|
20
40
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
41
|
+
from loguru import logger as loguru_logger
|
|
42
|
+
|
|
43
|
+
return loguru_logger.opt(depth=1)
|
|
44
|
+
return logger
|
|
45
|
+
except Exception:
|
|
46
|
+
# If there's an issue with ACB logger, fall back to loguru
|
|
47
|
+
from loguru import logger as loguru_logger
|
|
27
48
|
|
|
49
|
+
return loguru_logger.opt(depth=1)
|
|
28
50
|
|
|
29
|
-
def add_correlation_id(_: Any, __: Any, event_dict: EventDict) -> EventDict:
|
|
30
|
-
event_dict["correlation_id"] = get_correlation_id()
|
|
31
|
-
return event_dict
|
|
32
51
|
|
|
52
|
+
def _generate_correlation_id() -> str:
|
|
53
|
+
"""Generate a unique correlation ID."""
|
|
54
|
+
return uuid.uuid4().hex[:8]
|
|
33
55
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
56
|
+
|
|
57
|
+
def get_correlation_id() -> str:
|
|
58
|
+
"""Get or create correlation ID for current context."""
|
|
59
|
+
correlation = _correlation_id_var.get()
|
|
60
|
+
if correlation is None:
|
|
61
|
+
correlation = _generate_correlation_id()
|
|
62
|
+
_correlation_id_var.set(correlation)
|
|
63
|
+
return correlation
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def set_correlation_id(correlation_id: str) -> None:
|
|
67
|
+
"""Set correlation ID for current context."""
|
|
68
|
+
_correlation_id_var.set(correlation_id)
|
|
37
69
|
|
|
38
70
|
|
|
39
71
|
def setup_structured_logging(
|
|
72
|
+
*,
|
|
40
73
|
level: str = "INFO",
|
|
41
|
-
json_output: bool =
|
|
74
|
+
json_output: bool = False,
|
|
42
75
|
log_file: Path | None = None,
|
|
43
76
|
) -> None:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
77
|
+
"""Setup structured logging using ACB's logger.
|
|
78
|
+
|
|
79
|
+
This function is maintained for backward compatibility but now uses
|
|
80
|
+
ACB's logger configuration system.
|
|
81
|
+
"""
|
|
82
|
+
# ACB logger is already configured via adapters
|
|
83
|
+
# This function is kept for API compatibility but delegates to ACB
|
|
84
|
+
_get_acb_logger()
|
|
85
|
+
|
|
86
|
+
# ACB's logger is already configured, but we can adjust settings if needed
|
|
87
|
+
# The actual configuration is handled by ACB's adapter system
|
|
88
|
+
pass
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def get_logger(name: str) -> Any:
|
|
92
|
+
"""Get a logger bound to a specific name using ACB's logger.
|
|
93
|
+
|
|
94
|
+
This function provides backward compatibility with Crackerjack's
|
|
95
|
+
logging API while using ACB's logger internally.
|
|
96
|
+
"""
|
|
97
|
+
# Check cache first for performance
|
|
98
|
+
if name in _logger_cache:
|
|
99
|
+
return _logger_cache[name]
|
|
100
|
+
|
|
101
|
+
# Get ACB logger and bind with context
|
|
102
|
+
acb_logger = _get_acb_logger()
|
|
103
|
+
|
|
104
|
+
# Check if the logger has a bind method (ACB logger) or if it's a loguru logger
|
|
105
|
+
if hasattr(acb_logger, "bind"):
|
|
106
|
+
logger_with_context = acb_logger.bind(logger=name)
|
|
107
|
+
|
|
108
|
+
# Add correlation ID if available
|
|
109
|
+
correlation_id = get_correlation_id()
|
|
110
|
+
if correlation_id:
|
|
111
|
+
logger_with_context = logger_with_context.bind(
|
|
112
|
+
correlation_id=correlation_id
|
|
113
|
+
)
|
|
57
114
|
else:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
console_handler.setLevel(log_level)
|
|
71
|
-
|
|
72
|
-
handlers: list[logging.Handler] = [console_handler]
|
|
73
|
-
|
|
74
|
-
if log_file:
|
|
75
|
-
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
76
|
-
file_handler = logging.FileHandler(log_file)
|
|
77
|
-
file_handler.setLevel(log_level)
|
|
78
|
-
handlers.append(file_handler)
|
|
115
|
+
# For loguru logger, we can add context via patch or extra
|
|
116
|
+
logger_with_context = acb_logger
|
|
117
|
+
# Add logger name to extra so it shows up in logs
|
|
118
|
+
import loguru
|
|
119
|
+
|
|
120
|
+
if isinstance(logger_with_context, loguru.Logger):
|
|
121
|
+
logger_with_context = acb_logger.patch(
|
|
122
|
+
lambda record: record["extra"].update({"logger": name})
|
|
123
|
+
)
|
|
124
|
+
else:
|
|
125
|
+
# If it's not even a loguru logger, just return as is
|
|
126
|
+
logger_with_context = acb_logger
|
|
79
127
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
format="%(message)s",
|
|
84
|
-
)
|
|
128
|
+
# Cache the logger for reuse
|
|
129
|
+
_logger_cache[name] = logger_with_context
|
|
130
|
+
return logger_with_context
|
|
85
131
|
|
|
86
132
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return logger
|
|
133
|
+
class LoggingContext:
|
|
134
|
+
"""Context manager for operation logging with correlation IDs.
|
|
90
135
|
|
|
136
|
+
Uses ACB's logger internally while maintaining Crackerjack's API.
|
|
137
|
+
"""
|
|
91
138
|
|
|
92
|
-
class LoggingContext:
|
|
93
139
|
def __init__(self, operation: str, **kwargs: Any) -> None:
|
|
94
140
|
self.operation = operation
|
|
95
141
|
self.kwargs = kwargs
|
|
96
|
-
self.correlation_id =
|
|
142
|
+
self.correlation_id = _generate_correlation_id()
|
|
97
143
|
self.logger = get_logger("crackerjack.context")
|
|
98
144
|
self.start_time = time.time()
|
|
99
145
|
|
|
@@ -131,9 +177,14 @@ class LoggingContext:
|
|
|
131
177
|
def log_performance(
|
|
132
178
|
operation: str,
|
|
133
179
|
**kwargs: Any,
|
|
134
|
-
) ->
|
|
135
|
-
|
|
136
|
-
|
|
180
|
+
) -> Callable[[Callable[..., Any]], Callable[..., Any]]:
|
|
181
|
+
"""Decorator for performance logging using ACB's logger.
|
|
182
|
+
|
|
183
|
+
Maintains Crackerjack's API while delegating to ACB's logger.
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
def decorator(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
187
|
+
def wrapper(*args: Any, **func_kwargs: Any) -> Any:
|
|
137
188
|
logger = get_logger(f"crackerjack.perf.{func.__name__}")
|
|
138
189
|
start_time = time.time()
|
|
139
190
|
|
|
@@ -168,6 +219,7 @@ def log_performance(
|
|
|
168
219
|
return decorator
|
|
169
220
|
|
|
170
221
|
|
|
222
|
+
# Module-level logger instances using ACB's logger
|
|
171
223
|
hook_logger = get_logger("crackerjack.hooks")
|
|
172
224
|
test_logger = get_logger("crackerjack.tests")
|
|
173
225
|
config_logger = get_logger("crackerjack.config")
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import concurrent.futures
|
|
2
3
|
import subprocess
|
|
3
4
|
import typing as t
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
from typing import Protocol
|
|
6
7
|
|
|
7
|
-
from
|
|
8
|
+
from acb.console import Console
|
|
9
|
+
from acb.depends import Inject, depends
|
|
8
10
|
from rich.progress import (
|
|
9
11
|
BarColumn,
|
|
10
12
|
Progress,
|
|
@@ -36,8 +38,9 @@ class ProgressCallback(Protocol):
|
|
|
36
38
|
class RealTimeTypingFeedback:
|
|
37
39
|
"""Provides real-time feedback during type checking operations."""
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
@depends.inject
|
|
42
|
+
def __init__(self, console: Inject[Console]) -> None:
|
|
43
|
+
self.console = console
|
|
41
44
|
self._total_errors = 0
|
|
42
45
|
self._files_checked = 0
|
|
43
46
|
|
|
@@ -143,8 +146,9 @@ class JSONRPCClient:
|
|
|
143
146
|
class LSPClient:
|
|
144
147
|
"""Client for communicating with Zuban LSP server."""
|
|
145
148
|
|
|
146
|
-
|
|
147
|
-
|
|
149
|
+
@depends.inject
|
|
150
|
+
def __init__(self, console: Inject[Console]) -> None:
|
|
151
|
+
self.console = console
|
|
148
152
|
self._server_port: int | None = None
|
|
149
153
|
self._server_host: str = "127.0.0.1"
|
|
150
154
|
self._lsp_service: ZubanLSPService | None = None
|
|
@@ -243,7 +247,7 @@ class LSPClient:
|
|
|
243
247
|
) -> dict[str, list[dict[str, t.Any]]]:
|
|
244
248
|
"""Check files with progress display."""
|
|
245
249
|
diagnostics = {}
|
|
246
|
-
feedback = RealTimeTypingFeedback(
|
|
250
|
+
feedback = RealTimeTypingFeedback()
|
|
247
251
|
|
|
248
252
|
with feedback.create_progress_display() as progress:
|
|
249
253
|
task = progress.add_task("Type checking files...", total=total_files)
|
|
@@ -300,8 +304,6 @@ class LSPClient:
|
|
|
300
304
|
try:
|
|
301
305
|
asyncio.get_running_loop()
|
|
302
306
|
# We're already in an async context, use a thread pool
|
|
303
|
-
import concurrent.futures
|
|
304
|
-
|
|
305
307
|
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
306
308
|
future = executor.submit(
|
|
307
309
|
self._run_async_lsp_check,
|
|
@@ -409,7 +411,7 @@ class LSPClient:
|
|
|
409
411
|
) -> dict[str, list[dict[str, t.Any]]]:
|
|
410
412
|
"""Process files with progress display."""
|
|
411
413
|
diagnostics = {}
|
|
412
|
-
feedback = RealTimeTypingFeedback(
|
|
414
|
+
feedback = RealTimeTypingFeedback()
|
|
413
415
|
|
|
414
416
|
with feedback.create_progress_display() as progress:
|
|
415
417
|
task = progress.add_task("LSP type checking files...", total=total_files)
|
|
@@ -508,8 +510,6 @@ class LSPClient:
|
|
|
508
510
|
|
|
509
511
|
def _execute_zuban_check(self, file_path: str) -> subprocess.CompletedProcess[str]:
|
|
510
512
|
"""Execute zuban check command for a file."""
|
|
511
|
-
import subprocess
|
|
512
|
-
|
|
513
513
|
return subprocess.run(
|
|
514
514
|
["zuban", "check", file_path],
|
|
515
515
|
capture_output=True,
|
|
@@ -610,7 +610,7 @@ class LSPClient:
|
|
|
610
610
|
if not python_files:
|
|
611
611
|
return {}, "📁 No Python files found to check"
|
|
612
612
|
|
|
613
|
-
feedback = RealTimeTypingFeedback(
|
|
613
|
+
feedback = RealTimeTypingFeedback()
|
|
614
614
|
|
|
615
615
|
self.console.print(
|
|
616
616
|
f"🔍 Starting type check of {len(python_files)} files...", style="bold blue"
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import gc
|
|
2
|
+
import os
|
|
2
3
|
import sys
|
|
3
4
|
import time
|
|
5
|
+
import tracemalloc
|
|
4
6
|
import typing as t
|
|
5
7
|
from collections.abc import Callable
|
|
6
8
|
from dataclasses import dataclass
|
|
@@ -9,7 +11,9 @@ from threading import Lock
|
|
|
9
11
|
from typing import Any
|
|
10
12
|
from weakref import WeakSet
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
import psutil
|
|
15
|
+
from acb.depends import Inject, depends
|
|
16
|
+
from acb.logger import Logger
|
|
13
17
|
|
|
14
18
|
|
|
15
19
|
@dataclass
|
|
@@ -27,6 +31,7 @@ class LazyLoader:
|
|
|
27
31
|
def __init__(
|
|
28
32
|
self,
|
|
29
33
|
factory: Callable[[], Any],
|
|
34
|
+
logger: Logger,
|
|
30
35
|
name: str = "unnamed",
|
|
31
36
|
auto_dispose: bool = True,
|
|
32
37
|
):
|
|
@@ -37,8 +42,7 @@ class LazyLoader:
|
|
|
37
42
|
self._loaded = False
|
|
38
43
|
self._lock = Lock()
|
|
39
44
|
self._access_count = 0
|
|
40
|
-
self.
|
|
41
|
-
self._logger = get_logger(f"crackerjack.lazy_loader.{name}")
|
|
45
|
+
self._logger = logger
|
|
42
46
|
|
|
43
47
|
MemoryOptimizer.get_instance().register_lazy_object(self)
|
|
44
48
|
|
|
@@ -102,6 +106,7 @@ class ResourcePool:
|
|
|
102
106
|
def __init__(
|
|
103
107
|
self,
|
|
104
108
|
factory: Callable[[], Any],
|
|
109
|
+
logger: Logger,
|
|
105
110
|
max_size: int = 5,
|
|
106
111
|
name: str = "unnamed",
|
|
107
112
|
):
|
|
@@ -113,7 +118,7 @@ class ResourcePool:
|
|
|
113
118
|
self._lock = Lock()
|
|
114
119
|
self._created_count = 0
|
|
115
120
|
self._reused_count = 0
|
|
116
|
-
self._logger =
|
|
121
|
+
self._logger = logger
|
|
117
122
|
|
|
118
123
|
def acquire(self) -> Any:
|
|
119
124
|
with self._lock:
|
|
@@ -177,11 +182,11 @@ class ResourcePool:
|
|
|
177
182
|
|
|
178
183
|
|
|
179
184
|
class MemoryProfiler:
|
|
180
|
-
def __init__(self) -> None:
|
|
185
|
+
def __init__(self, logger: Logger) -> None:
|
|
181
186
|
self._start_memory = 0.0
|
|
182
187
|
self._peak_memory = 0.0
|
|
183
188
|
self._measurements: list[tuple[float, float]] = []
|
|
184
|
-
self._logger =
|
|
189
|
+
self._logger = logger
|
|
185
190
|
|
|
186
191
|
def start_profiling(self) -> None:
|
|
187
192
|
self._start_memory = self._get_memory_usage()
|
|
@@ -218,16 +223,10 @@ class MemoryProfiler:
|
|
|
218
223
|
|
|
219
224
|
def _get_memory_usage(self) -> float:
|
|
220
225
|
try:
|
|
221
|
-
import os
|
|
222
|
-
|
|
223
|
-
import psutil
|
|
224
|
-
|
|
225
226
|
process = psutil.Process(os.getpid())
|
|
226
227
|
memory_mb: float = process.memory_info().rss / 1024 / 1024
|
|
227
228
|
return memory_mb
|
|
228
229
|
except ImportError:
|
|
229
|
-
import tracemalloc
|
|
230
|
-
|
|
231
230
|
if tracemalloc.is_tracing():
|
|
232
231
|
current, _peak = tracemalloc.get_traced_memory()
|
|
233
232
|
return current / 1024 / 1024
|
|
@@ -239,16 +238,20 @@ class MemoryOptimizer:
|
|
|
239
238
|
_instance: t.Optional["MemoryOptimizer"] = None
|
|
240
239
|
_lock = Lock()
|
|
241
240
|
|
|
242
|
-
|
|
241
|
+
@depends.inject
|
|
242
|
+
def __init__(
|
|
243
|
+
self,
|
|
244
|
+
logger: Inject[Logger],
|
|
245
|
+
) -> None:
|
|
243
246
|
self._lazy_objects: WeakSet[t.Any] = WeakSet()
|
|
244
247
|
self._resource_pools: dict[str, ResourcePool] = {}
|
|
245
|
-
self._profiler = MemoryProfiler()
|
|
248
|
+
self._profiler = MemoryProfiler(logger=logger)
|
|
246
249
|
self._stats_lock = Lock()
|
|
247
250
|
self._lazy_created_count = 0
|
|
248
251
|
self._lazy_loaded_count = 0
|
|
249
252
|
self._gc_threshold = 100
|
|
250
253
|
self._auto_gc = True
|
|
251
|
-
self._logger =
|
|
254
|
+
self._logger = logger
|
|
252
255
|
|
|
253
256
|
@classmethod
|
|
254
257
|
def get_instance(cls) -> "MemoryOptimizer":
|
|
@@ -356,7 +359,9 @@ def lazy_property(factory: t.Callable[[], t.Any]) -> property:
|
|
|
356
359
|
attr_name = f"_lazy_{factory.__name__}"
|
|
357
360
|
|
|
358
361
|
if not hasattr(self, attr_name):
|
|
359
|
-
|
|
362
|
+
# Get logger from DI instead of MemoryOptimizer to avoid circular dependency
|
|
363
|
+
logger = depends.get_sync(Logger)
|
|
364
|
+
loader = LazyLoader(factory, logger=logger, name=factory.__name__)
|
|
360
365
|
setattr(self, attr_name, loader)
|
|
361
366
|
|
|
362
367
|
return getattr(self, attr_name).get()
|
|
@@ -391,12 +396,10 @@ def memory_optimized(func: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]:
|
|
|
391
396
|
return wrapper
|
|
392
397
|
|
|
393
398
|
|
|
394
|
-
def get_memory_optimizer() -> MemoryOptimizer:
|
|
395
|
-
return MemoryOptimizer.get_instance()
|
|
396
|
-
|
|
397
|
-
|
|
398
399
|
def create_lazy_service(factory: Callable[[], Any], name: str) -> LazyLoader:
|
|
399
|
-
|
|
400
|
+
# Get logger from DI instead of MemoryOptimizer to avoid circular dependency
|
|
401
|
+
logger = depends.get_sync(Logger)
|
|
402
|
+
return LazyLoader(factory, logger=logger, name=name)
|
|
400
403
|
|
|
401
404
|
|
|
402
405
|
def create_resource_pool(
|
|
@@ -404,6 +407,8 @@ def create_resource_pool(
|
|
|
404
407
|
max_size: int = 5,
|
|
405
408
|
name: str = "unnamed",
|
|
406
409
|
) -> ResourcePool:
|
|
407
|
-
|
|
410
|
+
# Get logger from DI instead of MemoryOptimizer to avoid circular dependency
|
|
411
|
+
logger = depends.get_sync(Logger)
|
|
412
|
+
pool = ResourcePool(factory, logger=logger, max_size=max_size, name=name)
|
|
408
413
|
MemoryOptimizer.get_instance().register_resource_pool(name, pool)
|
|
409
414
|
return pool
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Monitoring Services
|
|
2
|
+
|
|
3
|
+
System health, performance metrics, and error pattern analysis services.
|
|
4
|
+
|
|
5
|
+
## Services
|
|
6
|
+
|
|
7
|
+
- **`health_metrics.py`** - System health monitoring and metric collection
|
|
8
|
+
- **`metrics.py`** - Performance metrics aggregation and reporting
|
|
9
|
+
- **`dependency_monitor.py`** - Dependency health tracking and version monitoring
|
|
10
|
+
- **`error_pattern_analyzer.py`** - Error pattern detection and analysis
|
|
11
|
+
- **`performance_benchmarks.py`** - Performance baseline tracking and regression detection
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **Health Checks** - Real-time system health status
|
|
16
|
+
- **Performance Tracking** - Benchmark execution times and resource usage
|
|
17
|
+
- **Error Analysis** - Pattern detection in test failures and build errors
|
|
18
|
+
- **Dependency Monitoring** - Track outdated or vulnerable dependencies
|
|
19
|
+
- **Metric Aggregation** - Collect and report quality metrics
|
|
20
|
+
|
|
21
|
+
## Integration
|
|
22
|
+
|
|
23
|
+
These services are used throughout Crackerjack for:
|
|
24
|
+
|
|
25
|
+
- MCP server health endpoints
|
|
26
|
+
- Test execution monitoring
|
|
27
|
+
- Quality trend analysis
|
|
28
|
+
- Performance regression detection
|
|
29
|
+
|
|
30
|
+
See parent `services/README.md` for service architecture details.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Monitoring and telemetry services."""
|
|
2
|
+
|
|
3
|
+
from .dependency_monitor import * # noqa: F401,F403
|
|
4
|
+
from .error_pattern_analyzer import * # noqa: F401,F403
|
|
5
|
+
from .health_metrics import * # noqa: F401,F403
|
|
6
|
+
from .metrics import * # noqa: F401,F403
|
|
7
|
+
from .performance_benchmarks import * # noqa: F401,F403
|
|
8
|
+
from .performance_cache import * # noqa: F401,F403
|
|
9
|
+
from .performance_monitor import * # noqa: F401,F403
|