crackerjack 0.18.2__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 +96 -2
- crackerjack/__main__.py +637 -138
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +39 -0
- 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/lsp/_base.py +194 -0
- crackerjack/adapters/lsp/_client.py +358 -0
- crackerjack/adapters/lsp/_manager.py +193 -0
- crackerjack/adapters/lsp/skylos.py +283 -0
- crackerjack/adapters/lsp/zuban.py +557 -0
- 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 +66 -0
- crackerjack/agents/architect_agent.py +238 -0
- crackerjack/agents/base.py +167 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +600 -0
- crackerjack/agents/documentation_agent.py +520 -0
- crackerjack/agents/dry_agent.py +585 -0
- 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 +230 -0
- 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/import_optimization_agent.py +1181 -0
- crackerjack/agents/performance_agent.py +325 -0
- crackerjack/agents/performance_helpers.py +205 -0
- crackerjack/agents/proactive_agent.py +55 -0
- crackerjack/agents/refactoring_agent.py +511 -0
- crackerjack/agents/refactoring_helpers.py +247 -0
- crackerjack/agents/security_agent.py +793 -0
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +570 -0
- crackerjack/agents/test_specialist_agent.py +526 -0
- crackerjack/agents/tracker.py +110 -0
- crackerjack/api.py +647 -0
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +24 -0
- crackerjack/cli/cache_handlers.py +209 -0
- crackerjack/cli/cache_handlers_enhanced.py +680 -0
- crackerjack/cli/facade.py +162 -0
- 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 +700 -0
- crackerjack/cli/interactive.py +488 -0
- crackerjack/cli/options.py +1216 -0
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/utils.py +19 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +1307 -0
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +275 -0
- crackerjack/config/global_lock_config.py +207 -0
- crackerjack/config/hooks.py +390 -0
- 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/__init__.py +0 -0
- crackerjack/core/async_workflow_orchestrator.py +738 -0
- crackerjack/core/autofix_coordinator.py +282 -0
- crackerjack/core/container.py +105 -0
- crackerjack/core/enhanced_container.py +583 -0
- crackerjack/core/file_lifecycle.py +472 -0
- crackerjack/core/performance.py +244 -0
- crackerjack/core/performance_monitor.py +357 -0
- crackerjack/core/phase_coordinator.py +1227 -0
- crackerjack/core/proactive_workflow.py +267 -0
- crackerjack/core/resource_manager.py +425 -0
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +601 -0
- crackerjack/core/session_coordinator.py +239 -0
- crackerjack/core/timeout_manager.py +563 -0
- crackerjack/core/websocket_lifecycle.py +410 -0
- 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 +2243 -0
- 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/INDEX.md +11 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
- crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
- crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
- crackerjack/docs/generated/api/SERVICES.md +1252 -0
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/__init__.py +31 -0
- crackerjack/documentation/ai_templates.py +756 -0
- crackerjack/documentation/dual_output_generator.py +767 -0
- crackerjack/documentation/mkdocs_integration.py +518 -0
- crackerjack/documentation/reference_generator.py +1065 -0
- crackerjack/dynamic_config.py +678 -0
- crackerjack/errors.py +378 -0
- 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 +13 -0
- crackerjack/executors/async_hook_executor.py +938 -0
- crackerjack/executors/cached_hook_executor.py +316 -0
- crackerjack/executors/hook_executor.py +1295 -0
- crackerjack/executors/hook_lock_manager.py +708 -0
- crackerjack/executors/individual_hook_executor.py +739 -0
- crackerjack/executors/lsp_aware_hook_executor.py +349 -0
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +433 -0
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +93 -0
- crackerjack/intelligence/README.md +557 -0
- crackerjack/intelligence/__init__.py +37 -0
- crackerjack/intelligence/adaptive_learning.py +693 -0
- crackerjack/intelligence/agent_orchestrator.py +485 -0
- crackerjack/intelligence/agent_registry.py +377 -0
- crackerjack/intelligence/agent_selector.py +439 -0
- crackerjack/intelligence/integration.py +250 -0
- crackerjack/interactive.py +719 -0
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/__init__.py +11 -0
- crackerjack/managers/async_hook_manager.py +135 -0
- crackerjack/managers/hook_manager.py +585 -0
- crackerjack/managers/publish_manager.py +631 -0
- crackerjack/managers/test_command_builder.py +391 -0
- crackerjack/managers/test_executor.py +474 -0
- crackerjack/managers/test_manager.py +1357 -0
- crackerjack/managers/test_progress.py +187 -0
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/__init__.py +0 -0
- crackerjack/mcp/cache.py +352 -0
- crackerjack/mcp/client_runner.py +121 -0
- crackerjack/mcp/context.py +802 -0
- crackerjack/mcp/dashboard.py +657 -0
- crackerjack/mcp/enhanced_progress_monitor.py +493 -0
- crackerjack/mcp/file_monitor.py +394 -0
- crackerjack/mcp/progress_components.py +607 -0
- crackerjack/mcp/progress_monitor.py +1016 -0
- crackerjack/mcp/rate_limiter.py +336 -0
- crackerjack/mcp/server.py +24 -0
- crackerjack/mcp/server_core.py +526 -0
- crackerjack/mcp/service_watchdog.py +505 -0
- crackerjack/mcp/state.py +407 -0
- crackerjack/mcp/task_manager.py +259 -0
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +19 -0
- crackerjack/mcp/tools/core_tools.py +469 -0
- crackerjack/mcp/tools/error_analyzer.py +283 -0
- crackerjack/mcp/tools/execution_tools.py +384 -0
- crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
- crackerjack/mcp/tools/intelligence_tools.py +264 -0
- crackerjack/mcp/tools/monitoring_tools.py +628 -0
- crackerjack/mcp/tools/proactive_tools.py +367 -0
- crackerjack/mcp/tools/progress_tools.py +222 -0
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +358 -0
- crackerjack/mcp/tools/workflow_executor.py +699 -0
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/__init__.py +14 -0
- crackerjack/mcp/websocket/app.py +54 -0
- crackerjack/mcp/websocket/endpoints.py +492 -0
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +406 -0
- 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 +21 -0
- crackerjack/mcp/websocket/server.py +174 -0
- crackerjack/mcp/websocket/websocket_handler.py +276 -0
- crackerjack/mcp/websocket_server.py +10 -0
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +40 -0
- crackerjack/models/config.py +730 -0
- crackerjack/models/config_adapter.py +265 -0
- crackerjack/models/protocols.py +1535 -0
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/resource_protocols.py +299 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +173 -0
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/__init__.py +0 -0
- crackerjack/monitoring/ai_agent_watchdog.py +405 -0
- crackerjack/monitoring/metrics_collector.py +427 -0
- crackerjack/monitoring/regression_prevention.py +580 -0
- crackerjack/monitoring/websocket_server.py +406 -0
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +894 -0
- 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 +180 -0
- crackerjack/orchestration/execution_strategies.py +361 -0
- 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 +647 -0
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/__init__.py +15 -0
- crackerjack/plugins/base.py +200 -0
- crackerjack/plugins/hooks.py +254 -0
- crackerjack/plugins/loader.py +335 -0
- crackerjack/plugins/managers.py +264 -0
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/security/__init__.py +0 -0
- crackerjack/security/audit.py +197 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +9 -0
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/ai/contextual_ai_assistant.py +542 -0
- 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/anomaly_detector.py +392 -0
- crackerjack/services/api_extractor.py +617 -0
- crackerjack/services/backup_service.py +467 -0
- crackerjack/services/bounded_status_operations.py +530 -0
- crackerjack/services/cache.py +369 -0
- crackerjack/services/changelog_automation.py +399 -0
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +132 -0
- crackerjack/services/config_merge.py +546 -0
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +493 -0
- crackerjack/services/coverage_badge_service.py +173 -0
- crackerjack/services/coverage_ratchet.py +381 -0
- crackerjack/services/debug.py +733 -0
- crackerjack/services/dependency_analyzer.py +460 -0
- crackerjack/services/dependency_monitor.py +622 -0
- crackerjack/services/documentation_generator.py +493 -0
- crackerjack/services/documentation_service.py +704 -0
- crackerjack/services/enhanced_filesystem.py +497 -0
- crackerjack/services/enterprise_optimizer.py +865 -0
- crackerjack/services/error_pattern_analyzer.py +676 -0
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +149 -0
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +381 -0
- crackerjack/services/git.py +422 -0
- crackerjack/services/health_metrics.py +615 -0
- crackerjack/services/heatmap_generator.py +744 -0
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +823 -0
- crackerjack/services/input_validator.py +668 -0
- crackerjack/services/intelligent_commit.py +327 -0
- crackerjack/services/log_manager.py +289 -0
- crackerjack/services/logging.py +228 -0
- crackerjack/services/lsp_client.py +628 -0
- crackerjack/services/memory_optimizer.py +414 -0
- crackerjack/services/metrics.py +587 -0
- 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/monitoring/performance_benchmarks.py +410 -0
- crackerjack/services/monitoring/performance_cache.py +388 -0
- crackerjack/services/monitoring/performance_monitor.py +569 -0
- crackerjack/services/parallel_executor.py +527 -0
- crackerjack/services/pattern_cache.py +333 -0
- crackerjack/services/pattern_detector.py +478 -0
- 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 +523 -0
- 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/quality_baseline.py +395 -0
- crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
- crackerjack/services/quality/quality_intelligence.py +949 -0
- crackerjack/services/regex_patterns.py +58 -0
- crackerjack/services/regex_utils.py +483 -0
- crackerjack/services/secure_path_utils.py +524 -0
- crackerjack/services/secure_status_formatter.py +450 -0
- crackerjack/services/secure_subprocess.py +635 -0
- crackerjack/services/security.py +239 -0
- crackerjack/services/security_logger.py +495 -0
- crackerjack/services/server_manager.py +411 -0
- crackerjack/services/smart_scheduling.py +167 -0
- crackerjack/services/status_authentication.py +460 -0
- crackerjack/services/status_security_manager.py +315 -0
- crackerjack/services/terminal_utils.py +0 -0
- crackerjack/services/thread_safe_status_collector.py +441 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +43 -0
- crackerjack/services/unified_config.py +115 -0
- crackerjack/services/validation_rate_limiter.py +220 -0
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +461 -0
- crackerjack/services/version_checker.py +223 -0
- crackerjack/services/websocket_resource_limiter.py +438 -0
- crackerjack/services/zuban_lsp_service.py +391 -0
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/__init__.py +59 -0
- crackerjack/slash_commands/init.md +112 -0
- crackerjack/slash_commands/run.md +197 -0
- crackerjack/slash_commands/status.md +127 -0
- 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_input_validator_patterns.py +236 -0
- crackerjack/tools/validate_regex_patterns.py +188 -0
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/__init__.py +1 -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.45.2.dist-info/METADATA +1678 -0
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
- crackerjack/.gitignore +0 -14
- crackerjack/.libcst.codemod.yaml +0 -18
- crackerjack/.pdm.toml +0 -1
- crackerjack/.pre-commit-config.yaml +0 -91
- crackerjack/.pytest_cache/.gitignore +0 -2
- crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
- crackerjack/.pytest_cache/README.md +0 -8
- crackerjack/.pytest_cache/v/cache/nodeids +0 -1
- crackerjack/.pytest_cache/v/cache/stepwise +0 -1
- crackerjack/.ruff_cache/.gitignore +0 -1
- crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
- crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
- crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
- crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
- crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
- crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
- crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
- crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
- crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
- crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
- crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
- crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
- crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
- crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
- crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
- crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
- crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
- crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
- crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
- crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
- crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
- crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
- crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
- crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
- crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
- crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
- crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
- crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
- crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
- crackerjack/crackerjack.py +0 -855
- crackerjack/pyproject.toml +0 -214
- crackerjack-0.18.2.dist-info/METADATA +0 -420
- crackerjack-0.18.2.dist-info/RECORD +0 -59
- crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import typing as t
|
|
3
|
+
from contextlib import suppress
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
from acb import console
|
|
8
|
+
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
|
9
|
+
|
|
10
|
+
from crackerjack.core.timeout_manager import TimeoutStrategy, get_timeout_manager
|
|
11
|
+
|
|
12
|
+
from .jobs import JobManager
|
|
13
|
+
|
|
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
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class WebSocketHandler:
|
|
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:
|
|
79
|
+
self.job_manager = job_manager
|
|
80
|
+
self.progress_dir = progress_dir
|
|
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
|
|
85
|
+
|
|
86
|
+
async def handle_connection(self, websocket: WebSocket, job_id: str) -> None:
|
|
87
|
+
# Phase 9.4: Security validations
|
|
88
|
+
if not self.job_manager.validate_job_id(job_id):
|
|
89
|
+
await websocket.close(code=1008, reason="Invalid job ID")
|
|
90
|
+
return
|
|
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
|
+
|
|
106
|
+
try:
|
|
107
|
+
async with self.timeout_manager.timeout_context(
|
|
108
|
+
"websocket_connection",
|
|
109
|
+
timeout=3600.0,
|
|
110
|
+
strategy=TimeoutStrategy.GRACEFUL_DEGRADATION,
|
|
111
|
+
):
|
|
112
|
+
await self._establish_connection(websocket, job_id)
|
|
113
|
+
await self._send_initial_progress(websocket, job_id)
|
|
114
|
+
await self._handle_message_loop(websocket, job_id)
|
|
115
|
+
|
|
116
|
+
except TimeoutError:
|
|
117
|
+
await self._handle_timeout_error(websocket, job_id)
|
|
118
|
+
except WebSocketDisconnect:
|
|
119
|
+
console.print(f"[yellow]WebSocket disconnected for job: {job_id}[/yellow]")
|
|
120
|
+
except Exception as e:
|
|
121
|
+
await self._handle_connection_error(websocket, job_id, e)
|
|
122
|
+
finally:
|
|
123
|
+
await self._cleanup_connection(job_id, websocket)
|
|
124
|
+
|
|
125
|
+
async def _establish_connection(self, websocket: WebSocket, job_id: str) -> None:
|
|
126
|
+
await websocket.accept()
|
|
127
|
+
self._connection_count += 1 # Phase 9.4: Track concurrent connections
|
|
128
|
+
self.job_manager.add_connection(job_id, websocket)
|
|
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
|
+
)
|
|
137
|
+
|
|
138
|
+
async def _send_initial_progress(self, websocket: WebSocket, job_id: str) -> None:
|
|
139
|
+
try:
|
|
140
|
+
async with self.timeout_manager.timeout_context(
|
|
141
|
+
"websocket_broadcast",
|
|
142
|
+
timeout=5.0,
|
|
143
|
+
strategy=TimeoutStrategy.FAIL_FAST,
|
|
144
|
+
):
|
|
145
|
+
initial_progress = self.job_manager.get_job_progress(job_id)
|
|
146
|
+
if initial_progress:
|
|
147
|
+
await websocket.send_json(initial_progress)
|
|
148
|
+
else:
|
|
149
|
+
await websocket.send_json(
|
|
150
|
+
self._create_initial_progress_message(job_id)
|
|
151
|
+
)
|
|
152
|
+
except Exception as e:
|
|
153
|
+
console.print(
|
|
154
|
+
f"[red]Failed to send initial progress for {job_id}: {e}[/red]"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
def _create_initial_progress_message(self, job_id: str) -> dict[str, t.Any]:
|
|
158
|
+
return {
|
|
159
|
+
"job_id": job_id,
|
|
160
|
+
"status": "waiting",
|
|
161
|
+
"message": "Waiting for job to start...",
|
|
162
|
+
"overall_progress": 0,
|
|
163
|
+
"iteration": 0,
|
|
164
|
+
"max_iterations": 10,
|
|
165
|
+
"current_stage": "Initializing",
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async def _handle_message_loop(self, websocket: WebSocket, job_id: str) -> None:
|
|
169
|
+
message_count = 0
|
|
170
|
+
max_messages = (
|
|
171
|
+
self.security_config.max_messages_per_connection
|
|
172
|
+
) # Phase 9.4: Use config
|
|
173
|
+
|
|
174
|
+
while message_count < max_messages:
|
|
175
|
+
try:
|
|
176
|
+
should_continue = await self._process_single_message(
|
|
177
|
+
websocket, job_id, message_count + 1
|
|
178
|
+
)
|
|
179
|
+
if not should_continue:
|
|
180
|
+
break
|
|
181
|
+
message_count += 1
|
|
182
|
+
except (TimeoutError, WebSocketDisconnect, Exception):
|
|
183
|
+
break
|
|
184
|
+
|
|
185
|
+
if message_count >= max_messages:
|
|
186
|
+
console.print(
|
|
187
|
+
f"[yellow]WebSocket connection limit reached for {job_id}: {max_messages} messages[/yellow]"
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
async def _process_single_message(
|
|
191
|
+
self, websocket: WebSocket, job_id: str, message_count: int
|
|
192
|
+
) -> bool:
|
|
193
|
+
try:
|
|
194
|
+
async with self.timeout_manager.timeout_context(
|
|
195
|
+
"websocket_message",
|
|
196
|
+
timeout=30.0,
|
|
197
|
+
strategy=TimeoutStrategy.FAIL_FAST,
|
|
198
|
+
):
|
|
199
|
+
data = await asyncio.wait_for(
|
|
200
|
+
websocket.receive_text(),
|
|
201
|
+
timeout=25.0,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
console.print(
|
|
205
|
+
f"[blue]Received message {message_count} for {job_id}: {data[:100]}...[/blue]",
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
await asyncio.wait_for(
|
|
209
|
+
websocket.send_json(
|
|
210
|
+
{
|
|
211
|
+
"type": "echo",
|
|
212
|
+
"message": f"Received: {data}",
|
|
213
|
+
"job_id": job_id,
|
|
214
|
+
"message_count": message_count,
|
|
215
|
+
}
|
|
216
|
+
),
|
|
217
|
+
timeout=5.0,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
return True
|
|
221
|
+
|
|
222
|
+
except TimeoutError:
|
|
223
|
+
console.print(
|
|
224
|
+
f"[yellow]Message timeout for {job_id} after {message_count} messages[/yellow]"
|
|
225
|
+
)
|
|
226
|
+
return False
|
|
227
|
+
except WebSocketDisconnect:
|
|
228
|
+
console.print(f"[yellow]WebSocket disconnected for job: {job_id}[/yellow]")
|
|
229
|
+
return False
|
|
230
|
+
except Exception as e:
|
|
231
|
+
console.print(f"[red]WebSocket message error for job {job_id}: {e}[/red]")
|
|
232
|
+
return False
|
|
233
|
+
|
|
234
|
+
async def _handle_timeout_error(self, websocket: WebSocket, job_id: str) -> None:
|
|
235
|
+
console.print(
|
|
236
|
+
f"[yellow]WebSocket connection timeout for job: {job_id}[/yellow]"
|
|
237
|
+
)
|
|
238
|
+
with suppress(Exception):
|
|
239
|
+
await websocket.close(code=1001, reason="Connection timeout")
|
|
240
|
+
|
|
241
|
+
async def _handle_connection_error(
|
|
242
|
+
self, websocket: WebSocket, job_id: str, error: Exception
|
|
243
|
+
) -> None:
|
|
244
|
+
console.print(f"[red]WebSocket error for job {job_id}: {error}[/red]")
|
|
245
|
+
with suppress(Exception):
|
|
246
|
+
await websocket.close(code=1011, reason="Internal error")
|
|
247
|
+
|
|
248
|
+
async def _cleanup_connection(self, job_id: str, websocket: WebSocket) -> None:
|
|
249
|
+
try:
|
|
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
|
+
)
|
|
262
|
+
except Exception as e:
|
|
263
|
+
console.print(f"[red]Error removing connection for {job_id}: {e}[/red]")
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def register_websocket_routes(
|
|
267
|
+
app: FastAPI,
|
|
268
|
+
job_manager: JobManager,
|
|
269
|
+
progress_dir: Path,
|
|
270
|
+
event_bridge: t.Any | None = None, # EventBusWebSocketBridge from DI
|
|
271
|
+
) -> None:
|
|
272
|
+
handler = WebSocketHandler(job_manager, progress_dir, event_bridge=event_bridge)
|
|
273
|
+
|
|
274
|
+
@app.websocket("/ws/progress/{job_id}")
|
|
275
|
+
async def websocket_progress_endpoint(websocket: WebSocket, job_id: str) -> None:
|
|
276
|
+
await handler.handle_connection(websocket, job_id)
|
|
@@ -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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from .config import (
|
|
2
|
+
AIConfig,
|
|
3
|
+
CleaningConfig,
|
|
4
|
+
CleanupConfig,
|
|
5
|
+
ExecutionConfig,
|
|
6
|
+
GitConfig,
|
|
7
|
+
HookConfig,
|
|
8
|
+
ProgressConfig,
|
|
9
|
+
PublishConfig,
|
|
10
|
+
TestConfig,
|
|
11
|
+
WorkflowOptions,
|
|
12
|
+
)
|
|
13
|
+
from .protocols import OptionsProtocol, QAAdapterProtocol, QAOrchestratorProtocol
|
|
14
|
+
from .qa_config import QACheckConfig, QAOrchestratorConfig
|
|
15
|
+
from .qa_results import QACheckType, QAResult, QAResultStatus
|
|
16
|
+
from .task import HookResult, SessionTracker, TaskStatus
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"AIConfig",
|
|
20
|
+
"CleaningConfig",
|
|
21
|
+
"CleanupConfig",
|
|
22
|
+
"ExecutionConfig",
|
|
23
|
+
"GitConfig",
|
|
24
|
+
"HookConfig",
|
|
25
|
+
"HookResult",
|
|
26
|
+
"OptionsProtocol",
|
|
27
|
+
"ProgressConfig",
|
|
28
|
+
"PublishConfig",
|
|
29
|
+
"QAAdapterProtocol",
|
|
30
|
+
"QACheckConfig",
|
|
31
|
+
"QACheckType",
|
|
32
|
+
"QAOrchestratorConfig",
|
|
33
|
+
"QAOrchestratorProtocol",
|
|
34
|
+
"QAResult",
|
|
35
|
+
"QAResultStatus",
|
|
36
|
+
"SessionTracker",
|
|
37
|
+
"TaskStatus",
|
|
38
|
+
"TestConfig",
|
|
39
|
+
"WorkflowOptions",
|
|
40
|
+
]
|