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,400 @@
|
|
|
1
|
+
"""Security and quality gates for workflow publishing.
|
|
2
|
+
|
|
3
|
+
Ensures security standards are met before allowing publishing operations.
|
|
4
|
+
Extracted from WorkflowPipeline to improve modularity and maintainability.
|
|
5
|
+
|
|
6
|
+
This module handles:
|
|
7
|
+
- Security gate validation for publishing workflows
|
|
8
|
+
- Critical security failure detection (bandit, pyright, gitleaks)
|
|
9
|
+
- AI-assisted security issue resolution
|
|
10
|
+
- Hook result extraction and validation
|
|
11
|
+
- Security audit warnings and recommendations
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import typing as t
|
|
17
|
+
|
|
18
|
+
from acb.console import Console
|
|
19
|
+
from acb.depends import Inject, depends
|
|
20
|
+
|
|
21
|
+
from crackerjack.models.protocols import LoggerProtocol
|
|
22
|
+
|
|
23
|
+
if t.TYPE_CHECKING:
|
|
24
|
+
from crackerjack.core.session_coordinator import SessionCoordinator
|
|
25
|
+
from crackerjack.core.workflow_orchestrator import WorkflowPipeline
|
|
26
|
+
from crackerjack.models.protocols import OptionsProtocol
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class WorkflowSecurityGates:
|
|
30
|
+
"""Manages security and quality gates for workflow operations.
|
|
31
|
+
|
|
32
|
+
This class encapsulates all security-related validation logic for workflow
|
|
33
|
+
publishing, including:
|
|
34
|
+
- Pre-publishing security checks
|
|
35
|
+
- Critical security failure detection
|
|
36
|
+
- AI-assisted security remediation
|
|
37
|
+
- Security audit reporting
|
|
38
|
+
|
|
39
|
+
The class uses protocol-based dependency injection following ACB patterns
|
|
40
|
+
and maintains a reference to the workflow orchestrator for AI fixing callbacks.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
@depends.inject
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
console: Inject[Console],
|
|
47
|
+
logger: Inject[LoggerProtocol],
|
|
48
|
+
pipeline: WorkflowPipeline | None = None,
|
|
49
|
+
) -> None:
|
|
50
|
+
"""Initialize security gates with injected dependencies.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
console: Console for user output
|
|
54
|
+
logger: Logger for diagnostic messages
|
|
55
|
+
pipeline: Workflow orchestrator for AI fixing callbacks (set after init)
|
|
56
|
+
"""
|
|
57
|
+
self.console = console
|
|
58
|
+
self.logger = logger
|
|
59
|
+
self._pipeline = pipeline
|
|
60
|
+
self._last_security_audit: t.Any = None
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def session(self) -> SessionCoordinator:
|
|
64
|
+
"""Get session coordinator from pipeline."""
|
|
65
|
+
if self._pipeline is None:
|
|
66
|
+
raise RuntimeError("Pipeline not set - call set_pipeline() first")
|
|
67
|
+
return self._pipeline.session
|
|
68
|
+
|
|
69
|
+
def set_pipeline(self, pipeline: WorkflowPipeline) -> None:
|
|
70
|
+
"""Set the workflow pipeline reference.
|
|
71
|
+
|
|
72
|
+
This is called after initialization to avoid circular dependencies.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
pipeline: The workflow orchestrator instance
|
|
76
|
+
"""
|
|
77
|
+
self._pipeline = pipeline
|
|
78
|
+
|
|
79
|
+
def _show_partial_success_warning_if_needed(
|
|
80
|
+
self,
|
|
81
|
+
publishing_requested: bool,
|
|
82
|
+
final_success: bool,
|
|
83
|
+
testing_passed: bool,
|
|
84
|
+
comprehensive_passed: bool,
|
|
85
|
+
) -> None:
|
|
86
|
+
"""Show security audit warning if publishing with partial success.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
publishing_requested: Whether publishing was requested
|
|
90
|
+
final_success: Whether the workflow succeeded overall
|
|
91
|
+
testing_passed: Whether tests passed
|
|
92
|
+
comprehensive_passed: Whether comprehensive hooks passed
|
|
93
|
+
"""
|
|
94
|
+
should_show_warning = (
|
|
95
|
+
publishing_requested
|
|
96
|
+
and final_success
|
|
97
|
+
and not (testing_passed and comprehensive_passed)
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
if should_show_warning:
|
|
101
|
+
self._show_security_audit_warning()
|
|
102
|
+
|
|
103
|
+
def _check_security_gates_for_publishing(
|
|
104
|
+
self, options: OptionsProtocol
|
|
105
|
+
) -> tuple[bool, bool]:
|
|
106
|
+
"""Check if security gates allow publishing.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
options: Workflow configuration options
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Tuple of (publishing_requested, security_blocks_publishing)
|
|
113
|
+
"""
|
|
114
|
+
publishing_requested = bool(options.publish or options.all)
|
|
115
|
+
|
|
116
|
+
if not publishing_requested:
|
|
117
|
+
return False, False
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
security_blocks_publishing = self._check_security_critical_failures()
|
|
121
|
+
return publishing_requested, security_blocks_publishing
|
|
122
|
+
except Exception as e:
|
|
123
|
+
self.logger.warning(f"Security check failed: {e} - blocking publishing")
|
|
124
|
+
self.console.print(
|
|
125
|
+
"[red]🔒 SECURITY CHECK FAILED: Unable to verify security status - publishing BLOCKED[/red]"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
return publishing_requested, True
|
|
129
|
+
|
|
130
|
+
async def _handle_security_gate_failure(
|
|
131
|
+
self, options: OptionsProtocol, allow_ai_fixing: bool = False
|
|
132
|
+
) -> bool:
|
|
133
|
+
"""Handle security gate failure with optional AI assistance.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
options: Workflow configuration options
|
|
137
|
+
allow_ai_fixing: Whether to attempt AI-assisted fixing
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
True if security issues were resolved, False otherwise
|
|
141
|
+
"""
|
|
142
|
+
self._display_security_gate_failure_message()
|
|
143
|
+
|
|
144
|
+
if allow_ai_fixing:
|
|
145
|
+
return await self._attempt_ai_assisted_security_fix(options)
|
|
146
|
+
return self._handle_manual_security_fix()
|
|
147
|
+
|
|
148
|
+
def _display_security_gate_failure_message(self) -> None:
|
|
149
|
+
"""Display initial security gate failure message."""
|
|
150
|
+
self.console.print(
|
|
151
|
+
"[red]🔒 SECURITY GATE: Critical security checks failed[/red]"
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
async def _attempt_ai_assisted_security_fix(self, options: OptionsProtocol) -> bool:
|
|
155
|
+
"""Attempt to fix security issues using AI assistance.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
options: Configuration options
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
True if security issues were resolved, False otherwise
|
|
162
|
+
"""
|
|
163
|
+
if self._pipeline is None:
|
|
164
|
+
raise RuntimeError("Pipeline not set - cannot perform AI fixing")
|
|
165
|
+
|
|
166
|
+
self._display_ai_fixing_messages()
|
|
167
|
+
|
|
168
|
+
ai_fix_success = await self._pipeline._run_ai_agent_fixing_phase(options)
|
|
169
|
+
if ai_fix_success:
|
|
170
|
+
return self._verify_security_fix_success()
|
|
171
|
+
|
|
172
|
+
return False
|
|
173
|
+
|
|
174
|
+
def _display_ai_fixing_messages(self) -> None:
|
|
175
|
+
"""Display messages about AI-assisted security fixing."""
|
|
176
|
+
self.console.print(
|
|
177
|
+
"[red]Security-critical hooks (bandit, pyright, gitleaks) must pass before publishing[/red]"
|
|
178
|
+
)
|
|
179
|
+
self.console.print(
|
|
180
|
+
"[yellow]🤖 Attempting AI-assisted security issue resolution...[/yellow]"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
def _verify_security_fix_success(self) -> bool:
|
|
184
|
+
"""Verify that AI fixes resolved the security issues.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
True if security issues were resolved, False otherwise
|
|
188
|
+
"""
|
|
189
|
+
try:
|
|
190
|
+
security_still_blocks = self._check_security_critical_failures()
|
|
191
|
+
if not security_still_blocks:
|
|
192
|
+
self.console.print(
|
|
193
|
+
"[green]✅ AI agents resolved security issues - publishing allowed[/green]"
|
|
194
|
+
)
|
|
195
|
+
return True
|
|
196
|
+
else:
|
|
197
|
+
self.console.print(
|
|
198
|
+
"[red]🔒 Security issues persist after AI fixing - publishing still BLOCKED[/red]"
|
|
199
|
+
)
|
|
200
|
+
return False
|
|
201
|
+
except Exception as e:
|
|
202
|
+
self.logger.warning(f"Security re-check failed: {e} - blocking publishing")
|
|
203
|
+
return False
|
|
204
|
+
|
|
205
|
+
def _handle_manual_security_fix(self) -> bool:
|
|
206
|
+
"""Handle security fix when AI assistance is not allowed.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
Always False since manual intervention is required
|
|
210
|
+
"""
|
|
211
|
+
self.console.print(
|
|
212
|
+
"[red]Security-critical hooks (bandit, pyright, gitleaks) must pass before publishing[/red]"
|
|
213
|
+
)
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
def _check_security_critical_failures(self) -> bool:
|
|
217
|
+
"""Check for critical security failures in hook results.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
True if critical security failures exist, False otherwise
|
|
221
|
+
|
|
222
|
+
Raises:
|
|
223
|
+
Exception: If security audit fails (fail securely)
|
|
224
|
+
"""
|
|
225
|
+
try:
|
|
226
|
+
from crackerjack.security.audit import SecurityAuditor
|
|
227
|
+
|
|
228
|
+
auditor = SecurityAuditor()
|
|
229
|
+
|
|
230
|
+
fast_results = self._get_recent_fast_hook_results()
|
|
231
|
+
comprehensive_results = self._get_recent_comprehensive_hook_results()
|
|
232
|
+
|
|
233
|
+
audit_report = auditor.audit_hook_results(
|
|
234
|
+
fast_results, comprehensive_results
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
self._last_security_audit = audit_report
|
|
238
|
+
|
|
239
|
+
return audit_report.has_critical_failures
|
|
240
|
+
|
|
241
|
+
except Exception as e:
|
|
242
|
+
self.logger.warning(f"Security audit failed: {e} - failing securely")
|
|
243
|
+
|
|
244
|
+
raise
|
|
245
|
+
|
|
246
|
+
def _get_recent_fast_hook_results(self) -> list[t.Any]:
|
|
247
|
+
"""Get recent fast hook results from session.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
List of fast hook results, or mock results if unavailable
|
|
251
|
+
"""
|
|
252
|
+
results = self._extract_hook_results_from_session("fast_hooks")
|
|
253
|
+
|
|
254
|
+
if not results:
|
|
255
|
+
results = self._create_mock_hook_results(["gitleaks"])
|
|
256
|
+
|
|
257
|
+
return results
|
|
258
|
+
|
|
259
|
+
def _extract_hook_results_from_session(self, hook_type: str) -> list[t.Any]:
|
|
260
|
+
"""Extract hook results from session tracker.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
hook_type: Type of hooks to extract (e.g., "fast_hooks", "comprehensive_hooks")
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
List of hook results
|
|
267
|
+
"""
|
|
268
|
+
results: list[t.Any] = []
|
|
269
|
+
|
|
270
|
+
session_tracker = self._get_session_tracker()
|
|
271
|
+
if not session_tracker:
|
|
272
|
+
return results
|
|
273
|
+
|
|
274
|
+
for task_id, task_data in session_tracker.tasks.items():
|
|
275
|
+
if task_id == hook_type and hasattr(task_data, "hook_results"):
|
|
276
|
+
if task_data.hook_results:
|
|
277
|
+
results.extend(task_data.hook_results)
|
|
278
|
+
|
|
279
|
+
return results
|
|
280
|
+
|
|
281
|
+
def _get_session_tracker(self) -> t.Any | None:
|
|
282
|
+
"""Get session tracker from session coordinator.
|
|
283
|
+
|
|
284
|
+
Returns:
|
|
285
|
+
Session tracker if available, None otherwise
|
|
286
|
+
"""
|
|
287
|
+
return (
|
|
288
|
+
getattr(self.session, "session_tracker", None)
|
|
289
|
+
if hasattr(self.session, "session_tracker")
|
|
290
|
+
else None
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
def _create_mock_hook_results(self, critical_hooks: list[str]) -> list[t.Any]:
|
|
294
|
+
"""Create mock hook results for critical hooks.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
critical_hooks: List of critical hook names
|
|
298
|
+
|
|
299
|
+
Returns:
|
|
300
|
+
List of mock hook result objects
|
|
301
|
+
"""
|
|
302
|
+
results: list[t.Any] = []
|
|
303
|
+
|
|
304
|
+
for hook_name in critical_hooks:
|
|
305
|
+
mock_result = self._create_mock_hook_result(hook_name)
|
|
306
|
+
results.append(mock_result)
|
|
307
|
+
|
|
308
|
+
return results
|
|
309
|
+
|
|
310
|
+
def _create_mock_hook_result(self, hook_name: str) -> t.Any:
|
|
311
|
+
"""Create a mock hook result object.
|
|
312
|
+
|
|
313
|
+
Args:
|
|
314
|
+
hook_name: Name of the hook
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Mock result object with name, status, and output attributes
|
|
318
|
+
"""
|
|
319
|
+
return type(
|
|
320
|
+
"MockResult",
|
|
321
|
+
(),
|
|
322
|
+
{
|
|
323
|
+
"name": hook_name,
|
|
324
|
+
"status": "unknown",
|
|
325
|
+
"output": "Unable to determine hook status",
|
|
326
|
+
},
|
|
327
|
+
)()
|
|
328
|
+
|
|
329
|
+
def _get_recent_comprehensive_hook_results(self) -> list[t.Any]:
|
|
330
|
+
"""Get recent comprehensive hook results from session.
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
List of comprehensive hook results, or mock results if unavailable
|
|
334
|
+
"""
|
|
335
|
+
results = self._extract_hook_results_from_session("comprehensive_hooks")
|
|
336
|
+
|
|
337
|
+
if not results:
|
|
338
|
+
results = self._create_mock_hook_results(["bandit", "pyright"])
|
|
339
|
+
|
|
340
|
+
return results
|
|
341
|
+
|
|
342
|
+
def _is_security_critical_failure(self, result: t.Any) -> bool:
|
|
343
|
+
"""Check if a hook result represents a critical security failure.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
result: Hook result object
|
|
347
|
+
|
|
348
|
+
Returns:
|
|
349
|
+
True if result is a critical security failure, False otherwise
|
|
350
|
+
"""
|
|
351
|
+
security_critical_hooks = {
|
|
352
|
+
"bandit",
|
|
353
|
+
"pyright",
|
|
354
|
+
"gitleaks",
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
hook_name = getattr(result, "name", "").lower()
|
|
358
|
+
is_failed = getattr(result, "status", "unknown") in (
|
|
359
|
+
"failed",
|
|
360
|
+
"error",
|
|
361
|
+
"timeout",
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
return hook_name in security_critical_hooks and is_failed
|
|
365
|
+
|
|
366
|
+
def _show_security_audit_warning(self) -> None:
|
|
367
|
+
"""Display security audit warning with recommendations.
|
|
368
|
+
|
|
369
|
+
Shows detailed security warnings and recommendations if an audit
|
|
370
|
+
report is available, otherwise shows generic security status.
|
|
371
|
+
"""
|
|
372
|
+
audit_report = getattr(self, "_last_security_audit", None)
|
|
373
|
+
|
|
374
|
+
if audit_report:
|
|
375
|
+
self.console.print(
|
|
376
|
+
"[yellow]⚠️ SECURITY AUDIT: Proceeding with partial quality success[/yellow]"
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
for warning in audit_report.security_warnings:
|
|
380
|
+
if "CRITICAL" in warning:
|
|
381
|
+
self.console.print(f"[red]{warning}[/red]")
|
|
382
|
+
elif "HIGH" in warning:
|
|
383
|
+
self.console.print(f"[yellow]{warning}[/yellow]")
|
|
384
|
+
else:
|
|
385
|
+
self.console.print(f"[blue]{warning}[/blue]")
|
|
386
|
+
|
|
387
|
+
if audit_report.recommendations:
|
|
388
|
+
self.console.print("[bold]Security Recommendations: [/bold]")
|
|
389
|
+
for rec in audit_report.recommendations[:3]:
|
|
390
|
+
self.console.print(f"[dim]{rec}[/dim]")
|
|
391
|
+
else:
|
|
392
|
+
self.console.print(
|
|
393
|
+
"[yellow]⚠️ SECURITY AUDIT: Proceeding with partial quality success[/yellow]"
|
|
394
|
+
)
|
|
395
|
+
self.console.print(
|
|
396
|
+
"[yellow]✅ Security-critical checks (bandit, pyright, gitleaks) have passed[/yellow]"
|
|
397
|
+
)
|
|
398
|
+
self.console.print(
|
|
399
|
+
"[yellow]⚠️ Some non-critical quality checks failed - consider reviewing before production deployment[/yellow]"
|
|
400
|
+
)
|