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,15 +8,13 @@ import typing as t
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
|
|
10
10
|
import uvicorn
|
|
11
|
-
from
|
|
11
|
+
from acb import console
|
|
12
12
|
|
|
13
13
|
from crackerjack.core.timeout_manager import get_timeout_manager
|
|
14
14
|
|
|
15
15
|
from .app import create_websocket_app
|
|
16
16
|
from .jobs import JobManager
|
|
17
17
|
|
|
18
|
-
console = Console()
|
|
19
|
-
|
|
20
18
|
|
|
21
19
|
class WebSocketServer:
|
|
22
20
|
def __init__(self, port: int = 8675) -> None:
|
|
@@ -1,29 +1,108 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import typing as t
|
|
3
3
|
from contextlib import suppress
|
|
4
|
+
from dataclasses import dataclass
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
|
|
7
|
+
from acb import console
|
|
6
8
|
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
7
|
-
from rich.console import Console
|
|
8
9
|
|
|
9
10
|
from crackerjack.core.timeout_manager import TimeoutStrategy, get_timeout_manager
|
|
10
11
|
|
|
11
12
|
from .jobs import JobManager
|
|
12
13
|
|
|
13
|
-
console
|
|
14
|
+
# console imported from acb
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Phase 9.4: WebSocket Security Configuration
|
|
18
|
+
@dataclass
|
|
19
|
+
class WebSocketSecurityConfig:
|
|
20
|
+
"""Security configuration for WebSocket connections.
|
|
21
|
+
|
|
22
|
+
Phase 9.4: Enhanced security hardening for MCP WebSocket server.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# Message limits
|
|
26
|
+
max_message_size: int = 1024 * 1024 # 1MB max message size
|
|
27
|
+
max_messages_per_connection: int = 10000 # Max messages before forcing reconnect
|
|
28
|
+
max_concurrent_connections: int = 100 # Limit concurrent WebSocket connections
|
|
29
|
+
|
|
30
|
+
# Origin validation (localhost only for MCP)
|
|
31
|
+
allowed_origins: set[str] | None = None # None = allow all (default for local dev)
|
|
32
|
+
|
|
33
|
+
# Rate limiting
|
|
34
|
+
messages_per_second: int = 100 # Max messages per second per connection
|
|
35
|
+
|
|
36
|
+
def __post_init__(self) -> None:
|
|
37
|
+
"""Initialize allowed origins with secure defaults."""
|
|
38
|
+
if self.allowed_origins is None:
|
|
39
|
+
# Default: only allow localhost connections
|
|
40
|
+
self.allowed_origins = {
|
|
41
|
+
"http://localhost",
|
|
42
|
+
"http://127.0.0.1",
|
|
43
|
+
"https://localhost",
|
|
44
|
+
"https://127.0.0.1",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
def validate_origin(self, origin: str | None) -> bool:
|
|
48
|
+
"""Validate WebSocket origin header.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
origin: Origin header value
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
True if origin is allowed, False otherwise
|
|
55
|
+
"""
|
|
56
|
+
if not origin:
|
|
57
|
+
# Allow connections without origin (local tools)
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
# Check against allowed origins
|
|
61
|
+
for allowed in self.allowed_origins or set():
|
|
62
|
+
if origin.startswith(allowed):
|
|
63
|
+
return True
|
|
64
|
+
|
|
65
|
+
console.print(
|
|
66
|
+
f"[red]Rejected WebSocket connection from unauthorized origin: {origin}[/red]"
|
|
67
|
+
)
|
|
68
|
+
return False
|
|
14
69
|
|
|
15
70
|
|
|
16
71
|
class WebSocketHandler:
|
|
17
|
-
def __init__(
|
|
72
|
+
def __init__(
|
|
73
|
+
self,
|
|
74
|
+
job_manager: JobManager,
|
|
75
|
+
progress_dir: Path,
|
|
76
|
+
security_config: WebSocketSecurityConfig | None = None,
|
|
77
|
+
event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
|
|
78
|
+
) -> None:
|
|
18
79
|
self.job_manager = job_manager
|
|
19
80
|
self.progress_dir = progress_dir
|
|
20
81
|
self.timeout_manager = get_timeout_manager()
|
|
82
|
+
self.security_config = security_config or WebSocketSecurityConfig()
|
|
83
|
+
self.event_bridge = event_bridge
|
|
84
|
+
self._connection_count = 0
|
|
21
85
|
|
|
22
86
|
async def handle_connection(self, websocket: WebSocket, job_id: str) -> None:
|
|
87
|
+
# Phase 9.4: Security validations
|
|
23
88
|
if not self.job_manager.validate_job_id(job_id):
|
|
24
89
|
await websocket.close(code=1008, reason="Invalid job ID")
|
|
25
90
|
return
|
|
26
91
|
|
|
92
|
+
# Check origin header
|
|
93
|
+
origin = websocket.headers.get("origin")
|
|
94
|
+
if not self.security_config.validate_origin(origin):
|
|
95
|
+
await websocket.close(code=1008, reason="Unauthorized origin")
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
# Check connection limit
|
|
99
|
+
if self._connection_count >= self.security_config.max_concurrent_connections:
|
|
100
|
+
await websocket.close(code=1008, reason="Connection limit reached")
|
|
101
|
+
console.print(
|
|
102
|
+
f"[yellow]Connection limit reached: {self._connection_count}[/yellow]"
|
|
103
|
+
)
|
|
104
|
+
return
|
|
105
|
+
|
|
27
106
|
try:
|
|
28
107
|
async with self.timeout_manager.timeout_context(
|
|
29
108
|
"websocket_connection",
|
|
@@ -45,8 +124,16 @@ class WebSocketHandler:
|
|
|
45
124
|
|
|
46
125
|
async def _establish_connection(self, websocket: WebSocket, job_id: str) -> None:
|
|
47
126
|
await websocket.accept()
|
|
127
|
+
self._connection_count += 1 # Phase 9.4: Track concurrent connections
|
|
48
128
|
self.job_manager.add_connection(job_id, websocket)
|
|
49
|
-
|
|
129
|
+
|
|
130
|
+
# Phase 7.3: Register client with event bridge for real-time updates
|
|
131
|
+
if self.event_bridge:
|
|
132
|
+
await self.event_bridge.register_client(job_id, websocket)
|
|
133
|
+
|
|
134
|
+
console.print(
|
|
135
|
+
f"[green]WebSocket connected for job: {job_id} (connections: {self._connection_count})[/green]"
|
|
136
|
+
)
|
|
50
137
|
|
|
51
138
|
async def _send_initial_progress(self, websocket: WebSocket, job_id: str) -> None:
|
|
52
139
|
try:
|
|
@@ -80,7 +167,9 @@ class WebSocketHandler:
|
|
|
80
167
|
|
|
81
168
|
async def _handle_message_loop(self, websocket: WebSocket, job_id: str) -> None:
|
|
82
169
|
message_count = 0
|
|
83
|
-
max_messages =
|
|
170
|
+
max_messages = (
|
|
171
|
+
self.security_config.max_messages_per_connection
|
|
172
|
+
) # Phase 9.4: Use config
|
|
84
173
|
|
|
85
174
|
while message_count < max_messages:
|
|
86
175
|
try:
|
|
@@ -159,6 +248,17 @@ class WebSocketHandler:
|
|
|
159
248
|
async def _cleanup_connection(self, job_id: str, websocket: WebSocket) -> None:
|
|
160
249
|
try:
|
|
161
250
|
self.job_manager.remove_connection(job_id, websocket)
|
|
251
|
+
|
|
252
|
+
# Phase 7.3: Unregister client from event bridge
|
|
253
|
+
if self.event_bridge:
|
|
254
|
+
await self.event_bridge.unregister_client(job_id, websocket)
|
|
255
|
+
|
|
256
|
+
self._connection_count = max(
|
|
257
|
+
0, self._connection_count - 1
|
|
258
|
+
) # Phase 9.4: Decrement count
|
|
259
|
+
console.print(
|
|
260
|
+
f"[yellow]WebSocket disconnected for job: {job_id} (connections: {self._connection_count})[/yellow]"
|
|
261
|
+
)
|
|
162
262
|
except Exception as e:
|
|
163
263
|
console.print(f"[red]Error removing connection for {job_id}: {e}[/red]")
|
|
164
264
|
|
|
@@ -167,8 +267,9 @@ def register_websocket_routes(
|
|
|
167
267
|
app: FastAPI,
|
|
168
268
|
job_manager: JobManager,
|
|
169
269
|
progress_dir: Path,
|
|
270
|
+
event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
|
|
170
271
|
) -> None:
|
|
171
|
-
handler = WebSocketHandler(job_manager, progress_dir)
|
|
272
|
+
handler = WebSocketHandler(job_manager, progress_dir, event_bridge=event_bridge)
|
|
172
273
|
|
|
173
274
|
@app.websocket("/ws/progress/{job_id}")
|
|
174
275
|
async def websocket_progress_endpoint(websocket: WebSocket, job_id: str) -> None:
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
# Models
|
|
2
|
+
|
|
3
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | [Models](<./README.md>)
|
|
4
|
+
|
|
5
|
+
Data models, schemas, and protocol definitions for the Crackerjack architecture.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The models package provides the foundational data structures and protocol-based interfaces that define Crackerjack's architecture. The **protocol-based dependency injection (DI) pattern** is the most critical architectural pattern in Crackerjack, enabling loose coupling, testability, and clean separation of concerns.
|
|
10
|
+
|
|
11
|
+
## Key Components
|
|
12
|
+
|
|
13
|
+
### protocols.py - THE MOST CRITICAL FILE
|
|
14
|
+
|
|
15
|
+
**This is the heart of Crackerjack's architecture.** Always import protocols from here, never concrete classes.
|
|
16
|
+
|
|
17
|
+
**Core Service Protocols:**
|
|
18
|
+
|
|
19
|
+
- `ServiceProtocol` - Base protocol for all ACB services with lifecycle management
|
|
20
|
+
- `Console` (ConsoleInterface) - Rich console output interface
|
|
21
|
+
- `TestManagerProtocol` - Test execution and coverage management
|
|
22
|
+
- `HookManager` / `SecurityAwareHookManager` - Pre-commit hook orchestration
|
|
23
|
+
- `CoverageRatchetProtocol` - Coverage baseline tracking
|
|
24
|
+
- `SecurityServiceProtocol` - Security validation and secret detection
|
|
25
|
+
|
|
26
|
+
**Configuration & File System:**
|
|
27
|
+
|
|
28
|
+
- `UnifiedConfigurationServiceProtocol` - Centralized configuration access
|
|
29
|
+
- `FileSystemServiceProtocol` / `EnhancedFileSystemServiceProtocol` - File operations
|
|
30
|
+
- `GitServiceProtocol` / `GitInterface` - Git repository interactions
|
|
31
|
+
- `SmartFileFilterProtocol` - Intelligent file filtering
|
|
32
|
+
|
|
33
|
+
**Quality Assurance:**
|
|
34
|
+
|
|
35
|
+
- `QAAdapterProtocol` - Base protocol for all QA check adapters
|
|
36
|
+
- `QAOrchestratorProtocol` - QA check coordination and execution
|
|
37
|
+
|
|
38
|
+
**Hook Orchestration (Phase 3):**
|
|
39
|
+
|
|
40
|
+
- `ExecutionStrategyProtocol` - Hook execution strategies (parallel/sequential/adaptive)
|
|
41
|
+
- `CacheStrategyProtocol` - Result caching strategies
|
|
42
|
+
- `HookOrchestratorProtocol` - Hook lifecycle and dependency resolution
|
|
43
|
+
|
|
44
|
+
**Performance & Monitoring:**
|
|
45
|
+
|
|
46
|
+
- `PerformanceMonitorProtocol` - Workflow performance tracking
|
|
47
|
+
- `PerformanceBenchmarkProtocol` / `PerformanceBenchmarkServiceProtocol` - Benchmarking
|
|
48
|
+
- `MemoryOptimizerProtocol` - Memory optimization tracking
|
|
49
|
+
- `PerformanceCacheProtocol` - Performance result caching
|
|
50
|
+
|
|
51
|
+
**Agent System (Phase 4):**
|
|
52
|
+
|
|
53
|
+
- `AgentCoordinatorProtocol` - AI agent coordination and issue routing
|
|
54
|
+
- `AgentTrackerProtocol` - Agent execution metrics tracking
|
|
55
|
+
- `AgentDebuggerProtocol` - Agent debugging and activity logging
|
|
56
|
+
|
|
57
|
+
**Orchestration:**
|
|
58
|
+
|
|
59
|
+
- `ServiceWatchdogProtocol` - Service health monitoring and restart
|
|
60
|
+
- `TimeoutManagerProtocol` - Centralized timeout management
|
|
61
|
+
- `ParallelExecutorProtocol` / `ParallelHookExecutorProtocol` - Parallel task execution
|
|
62
|
+
- `AsyncCommandExecutorProtocol` - Async command execution with caching
|
|
63
|
+
|
|
64
|
+
**Publishing & Documentation:**
|
|
65
|
+
|
|
66
|
+
- `PublishManager` - Package publishing and versioning
|
|
67
|
+
- `DocumentationServiceProtocol` - Automated documentation generation
|
|
68
|
+
- `APIExtractorProtocol` / `DocumentationGeneratorProtocol` / `DocumentationValidatorProtocol` - Doc tooling
|
|
69
|
+
|
|
70
|
+
### Configuration Models
|
|
71
|
+
|
|
72
|
+
**qa_config.py** - Quality assurance configuration:
|
|
73
|
+
|
|
74
|
+
- `QACheckConfig` - Configuration for individual QA checks
|
|
75
|
+
- Check-specific settings (file patterns, timeouts, retries)
|
|
76
|
+
- Pydantic validation for type safety
|
|
77
|
+
|
|
78
|
+
**config.py** - Core configuration models:
|
|
79
|
+
|
|
80
|
+
- Project-wide configuration structures
|
|
81
|
+
- ACB Settings integration
|
|
82
|
+
- Environment-specific overrides
|
|
83
|
+
|
|
84
|
+
**config_adapter.py** - Configuration adapters:
|
|
85
|
+
|
|
86
|
+
- Bridges between different configuration formats
|
|
87
|
+
- Legacy config migration support
|
|
88
|
+
|
|
89
|
+
### Result Models
|
|
90
|
+
|
|
91
|
+
**qa_results.py** - Quality assurance results:
|
|
92
|
+
|
|
93
|
+
- `QAResult` - Individual check results
|
|
94
|
+
- `QACheckType` - Enumeration of check types
|
|
95
|
+
- Result aggregation structures
|
|
96
|
+
|
|
97
|
+
**results.py** - Execution results:
|
|
98
|
+
|
|
99
|
+
- `ExecutionResult` - Individual execution outcomes
|
|
100
|
+
- `ParallelExecutionResult` - Parallel execution aggregation
|
|
101
|
+
- Performance metrics and timing data
|
|
102
|
+
|
|
103
|
+
**task.py** - Task and hook models:
|
|
104
|
+
|
|
105
|
+
- `HookResult` - Pre-commit hook execution results
|
|
106
|
+
- `SessionTracker` - Session metadata and task tracking
|
|
107
|
+
- Task lifecycle management
|
|
108
|
+
|
|
109
|
+
### Specialized Models
|
|
110
|
+
|
|
111
|
+
**semantic_models.py** - Semantic analysis models:
|
|
112
|
+
|
|
113
|
+
- Code comprehension structures
|
|
114
|
+
- Semantic analysis results
|
|
115
|
+
- Intelligent refactoring support
|
|
116
|
+
|
|
117
|
+
**resource_protocols.py** - Resource management protocols:
|
|
118
|
+
|
|
119
|
+
- Resource lifecycle interfaces
|
|
120
|
+
- Resource cleanup coordination
|
|
121
|
+
|
|
122
|
+
## THE MOST CRITICAL PATTERN: Protocol-Based Dependency Injection
|
|
123
|
+
|
|
124
|
+
### Gold Standard Usage
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
# ✅ CORRECT - Always import protocols from models/protocols.py
|
|
128
|
+
from acb.depends import depends, Inject
|
|
129
|
+
from crackerjack.models.protocols import (
|
|
130
|
+
Console,
|
|
131
|
+
TestManagerProtocol,
|
|
132
|
+
SecurityServiceProtocol,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
@depends.inject
|
|
137
|
+
def setup_environment(
|
|
138
|
+
console: Inject[Console] = None,
|
|
139
|
+
test_manager: Inject[TestManagerProtocol] = None,
|
|
140
|
+
security: Inject[SecurityServiceProtocol] = None,
|
|
141
|
+
) -> None:
|
|
142
|
+
"""All functions use @depends.inject with protocol-based dependencies."""
|
|
143
|
+
console.print("[green]Environment configured[/green]")
|
|
144
|
+
test_manager.validate_test_environment()
|
|
145
|
+
security.validate_file_safety("/path/to/file")
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class MyCoordinator:
|
|
149
|
+
@depends.inject
|
|
150
|
+
def __init__(
|
|
151
|
+
self,
|
|
152
|
+
console: Inject[Console],
|
|
153
|
+
test_manager: Inject[TestManagerProtocol],
|
|
154
|
+
) -> None:
|
|
155
|
+
"""Perfect DI integration with protocol-based dependencies."""
|
|
156
|
+
self.console = console
|
|
157
|
+
self.test_manager = test_manager
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Anti-Patterns to Avoid
|
|
161
|
+
|
|
162
|
+
```python
|
|
163
|
+
# ❌ WRONG - Direct class imports (BREAKS ARCHITECTURE)
|
|
164
|
+
from crackerjack.managers.test_manager import TestManager
|
|
165
|
+
from rich.console import Console as RichConsole
|
|
166
|
+
|
|
167
|
+
# ❌ WRONG - Manual fallbacks bypass DI
|
|
168
|
+
self.console = console or Console()
|
|
169
|
+
self.cache = cache or CrackerjackCache()
|
|
170
|
+
|
|
171
|
+
# ❌ WRONG - Factory functions bypass DI
|
|
172
|
+
self.tracker = get_agent_tracker()
|
|
173
|
+
self.timeout_manager = get_timeout_manager()
|
|
174
|
+
|
|
175
|
+
# ❌ WRONG - Direct service instantiation
|
|
176
|
+
self.logger = logging.getLogger(__name__)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Why Protocol-Based DI?
|
|
180
|
+
|
|
181
|
+
1. **Loose Coupling**: Depend on interfaces, not implementations
|
|
182
|
+
1. **Testability**: Easy to mock with protocol implementations
|
|
183
|
+
1. **Flexibility**: Swap implementations without changing dependents
|
|
184
|
+
1. **Type Safety**: Runtime type checking via `@runtime_checkable`
|
|
185
|
+
1. **Clear Contracts**: Protocol defines exact interface requirements
|
|
186
|
+
1. **ACB Integration**: Seamless integration with ACB dependency injection
|
|
187
|
+
|
|
188
|
+
## Usage Examples
|
|
189
|
+
|
|
190
|
+
### Using Protocols for Type Hints
|
|
191
|
+
|
|
192
|
+
```python
|
|
193
|
+
from crackerjack.models.protocols import Console, FileSystemServiceProtocol
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def process_files(
|
|
197
|
+
console: Console,
|
|
198
|
+
fs: FileSystemServiceProtocol,
|
|
199
|
+
paths: list[Path],
|
|
200
|
+
) -> bool:
|
|
201
|
+
"""Process files with protocol-based dependencies."""
|
|
202
|
+
for path in paths:
|
|
203
|
+
if fs.exists(path):
|
|
204
|
+
content = fs.read_file(path)
|
|
205
|
+
console.print(f"Processing {path}")
|
|
206
|
+
return True
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Creating Protocol Implementations
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
import typing as t
|
|
213
|
+
from crackerjack.models.protocols import ServiceProtocol
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
@t.runtime_checkable
|
|
217
|
+
class MyServiceProtocol(ServiceProtocol, t.Protocol):
|
|
218
|
+
"""Custom service protocol extending base ServiceProtocol."""
|
|
219
|
+
|
|
220
|
+
def custom_operation(self, data: str) -> bool:
|
|
221
|
+
"""Custom operation for this service."""
|
|
222
|
+
...
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
class MyService:
|
|
226
|
+
"""Concrete implementation of MyServiceProtocol."""
|
|
227
|
+
|
|
228
|
+
def initialize(self) -> None:
|
|
229
|
+
"""Initialize service."""
|
|
230
|
+
pass
|
|
231
|
+
|
|
232
|
+
def cleanup(self) -> None:
|
|
233
|
+
"""Cleanup resources."""
|
|
234
|
+
pass
|
|
235
|
+
|
|
236
|
+
def health_check(self) -> bool:
|
|
237
|
+
"""Health check."""
|
|
238
|
+
return True
|
|
239
|
+
|
|
240
|
+
# ... implement all ServiceProtocol methods ...
|
|
241
|
+
|
|
242
|
+
def custom_operation(self, data: str) -> bool:
|
|
243
|
+
"""Implementation of custom operation."""
|
|
244
|
+
return True
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Dependency Injection Integration
|
|
248
|
+
|
|
249
|
+
```python
|
|
250
|
+
from acb.depends import depends
|
|
251
|
+
from crackerjack.models.protocols import Console, TestManagerProtocol
|
|
252
|
+
|
|
253
|
+
# Register concrete implementation
|
|
254
|
+
depends.set(Console, MyConsoleImplementation())
|
|
255
|
+
depends.set(TestManagerProtocol, MyTestManager())
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
# Inject in functions/classes
|
|
259
|
+
@depends.inject
|
|
260
|
+
def my_function(
|
|
261
|
+
console: Console = depends(),
|
|
262
|
+
test_manager: TestManagerProtocol = depends(),
|
|
263
|
+
) -> None:
|
|
264
|
+
"""Function with automatic dependency injection."""
|
|
265
|
+
console.print("Running tests...")
|
|
266
|
+
test_manager.run_tests(options)
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Configuration
|
|
270
|
+
|
|
271
|
+
Models use **Pydantic** for validation and type safety:
|
|
272
|
+
|
|
273
|
+
```python
|
|
274
|
+
from pydantic import BaseModel, Field
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class MyConfig(BaseModel):
|
|
278
|
+
"""Example configuration model."""
|
|
279
|
+
|
|
280
|
+
timeout: int = Field(default=300, gt=0, description="Timeout in seconds")
|
|
281
|
+
enabled: bool = Field(default=True, description="Enable feature")
|
|
282
|
+
patterns: list[str] = Field(default_factory=list, description="File patterns")
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Best Practices
|
|
286
|
+
|
|
287
|
+
1. **ALWAYS Import Protocols**: Never import concrete classes for dependencies
|
|
288
|
+
1. **Use @runtime_checkable**: Mark all protocols with `@runtime_checkable`
|
|
289
|
+
1. **Extend ServiceProtocol**: Base all service protocols on `ServiceProtocol`
|
|
290
|
+
1. **Use Inject[T]**: Use `Inject[ProtocolType]` type hints for DI parameters
|
|
291
|
+
1. **Validate with Pydantic**: Use Pydantic models for configuration validation
|
|
292
|
+
1. **Document Protocols**: Add comprehensive docstrings to protocol methods
|
|
293
|
+
1. **Type Annotate Everything**: Use Python 3.13+ type hints (`|` unions)
|
|
294
|
+
|
|
295
|
+
## Related Documentation
|
|
296
|
+
|
|
297
|
+
- [CLAUDE.md](../../docs/guides/CLAUDE.md) - Architecture patterns and DI guidelines
|
|
298
|
+
- [Managers](<../managers/README.md>) - Protocol implementations
|
|
299
|
+
- [Services](<../services/README.md>) - Service layer implementations
|
|
300
|
+
- [Core](<../core/README.md>) - Coordinators and orchestration
|
|
301
|
+
- [COVERAGE_POLICY.md](<../../docs/reference/COVERAGE_POLICY.md>) - Testing requirements
|
|
302
|
+
|
|
303
|
+
## Future Enhancements
|
|
304
|
+
|
|
305
|
+
- Phase 5: Additional agent system protocols
|
|
306
|
+
- Enhanced validation protocols for AI agent fixes
|
|
307
|
+
- Extended performance monitoring protocols
|
|
308
|
+
- Advanced caching strategy protocols
|
crackerjack/models/__init__.py
CHANGED
|
@@ -10,7 +10,9 @@ from .config import (
|
|
|
10
10
|
TestConfig,
|
|
11
11
|
WorkflowOptions,
|
|
12
12
|
)
|
|
13
|
-
from .protocols import OptionsProtocol
|
|
13
|
+
from .protocols import OptionsProtocol, QAAdapterProtocol, QAOrchestratorProtocol
|
|
14
|
+
from .qa_config import QACheckConfig, QAOrchestratorConfig
|
|
15
|
+
from .qa_results import QACheckType, QAResult, QAResultStatus
|
|
14
16
|
from .task import HookResult, SessionTracker, TaskStatus
|
|
15
17
|
|
|
16
18
|
__all__ = [
|
|
@@ -24,6 +26,13 @@ __all__ = [
|
|
|
24
26
|
"OptionsProtocol",
|
|
25
27
|
"ProgressConfig",
|
|
26
28
|
"PublishConfig",
|
|
29
|
+
"QAAdapterProtocol",
|
|
30
|
+
"QACheckConfig",
|
|
31
|
+
"QACheckType",
|
|
32
|
+
"QAOrchestratorConfig",
|
|
33
|
+
"QAOrchestratorProtocol",
|
|
34
|
+
"QAResult",
|
|
35
|
+
"QAResultStatus",
|
|
27
36
|
"SessionTracker",
|
|
28
37
|
"TaskStatus",
|
|
29
38
|
"TestConfig",
|