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,22 @@
|
|
|
1
|
+
"""Dependency security adapters for Software Composition Analysis (SCA).
|
|
2
|
+
|
|
3
|
+
This module provides adapters for dependency vulnerability scanning tools
|
|
4
|
+
that analyze third-party packages for known security vulnerabilities (CVEs).
|
|
5
|
+
|
|
6
|
+
Available Adapters:
|
|
7
|
+
- PipAuditAdapter: Scans Python dependencies for known vulnerabilities
|
|
8
|
+
|
|
9
|
+
Category: SCA (Software Composition Analysis)
|
|
10
|
+
Purpose: Detect vulnerabilities in project dependencies
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
__all__ = ["PipAuditAdapter"]
|
|
16
|
+
|
|
17
|
+
# Import adapters only if their dependencies are available
|
|
18
|
+
try:
|
|
19
|
+
from .pip_audit import PipAuditAdapter
|
|
20
|
+
except ImportError:
|
|
21
|
+
# pip-audit is an optional dependency (install with: uv sync --extra dependency)
|
|
22
|
+
PipAuditAdapter = None # type: ignore[assignment,misc]
|
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
"""PipAudit adapter for ACB QA framework - Python dependency vulnerability scanner.
|
|
2
|
+
|
|
3
|
+
pip-audit is a tool from the Python Packaging Authority (PyPA) that scans Python
|
|
4
|
+
dependencies for known security vulnerabilities using the OSV database. It provides:
|
|
5
|
+
- CVE detection in installed packages
|
|
6
|
+
- SBOM (Software Bill of Materials) generation
|
|
7
|
+
- PyPI vulnerability database integration
|
|
8
|
+
- Fix version recommendations
|
|
9
|
+
|
|
10
|
+
ACB Patterns:
|
|
11
|
+
- MODULE_ID and MODULE_STATUS at module level
|
|
12
|
+
- depends.set() registration after class definition
|
|
13
|
+
- Extends BaseToolAdapter for tool execution
|
|
14
|
+
- Async execution with JSON output parsing
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import logging
|
|
21
|
+
import typing as t
|
|
22
|
+
from contextlib import suppress
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from uuid import UUID
|
|
25
|
+
|
|
26
|
+
from acb.depends import depends
|
|
27
|
+
|
|
28
|
+
from crackerjack.adapters._tool_adapter_base import (
|
|
29
|
+
BaseToolAdapter,
|
|
30
|
+
ToolAdapterSettings,
|
|
31
|
+
ToolExecutionResult,
|
|
32
|
+
ToolIssue,
|
|
33
|
+
)
|
|
34
|
+
from crackerjack.models.qa_results import QACheckType
|
|
35
|
+
|
|
36
|
+
if t.TYPE_CHECKING:
|
|
37
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
38
|
+
|
|
39
|
+
# ACB Module Registration (REQUIRED)
|
|
40
|
+
MODULE_ID = UUID(
|
|
41
|
+
"01937d86-7a2b-7c3d-8e4f-b5c6d7e8f9a0"
|
|
42
|
+
) # Static UUID7 for reproducible module identity
|
|
43
|
+
MODULE_STATUS = "stable"
|
|
44
|
+
|
|
45
|
+
# Module-level logger for structured logging
|
|
46
|
+
logger = logging.getLogger(__name__)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class PipAuditSettings(ToolAdapterSettings):
|
|
50
|
+
"""Settings for PipAudit adapter."""
|
|
51
|
+
|
|
52
|
+
tool_name: str = "pip-audit"
|
|
53
|
+
use_json_output: bool = True
|
|
54
|
+
require_hashes: bool = False # Require hashes for all packages
|
|
55
|
+
vulnerability_service: str = "osv" # osv or pypi
|
|
56
|
+
skip_editable: bool = True # Skip editable packages in development
|
|
57
|
+
dry_run: bool = False # Report vulnerabilities without fixing
|
|
58
|
+
fix: bool = False # Attempt to fix vulnerabilities automatically
|
|
59
|
+
output_desc: bool = True # Include vulnerability descriptions
|
|
60
|
+
cache_dir: Path | None = None # Custom cache directory for vulnerability data
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class PipAuditAdapter(BaseToolAdapter):
|
|
64
|
+
"""Adapter for pip-audit - Python dependency vulnerability scanner.
|
|
65
|
+
|
|
66
|
+
Performs Software Composition Analysis (SCA) with:
|
|
67
|
+
- CVE detection in Python dependencies
|
|
68
|
+
- OSV database integration for vulnerability data
|
|
69
|
+
- SBOM generation capabilities
|
|
70
|
+
- Automatic fix suggestions with version recommendations
|
|
71
|
+
- Support for requirements.txt and pyproject.toml
|
|
72
|
+
|
|
73
|
+
Features:
|
|
74
|
+
- JSON output for structured vulnerability reporting
|
|
75
|
+
- Multiple vulnerability databases (OSV, PyPI)
|
|
76
|
+
- Hash verification for package integrity
|
|
77
|
+
- Editable package handling
|
|
78
|
+
- Fix suggestions with version constraints
|
|
79
|
+
|
|
80
|
+
Example:
|
|
81
|
+
```python
|
|
82
|
+
settings = PipAuditSettings(
|
|
83
|
+
vulnerability_service="osv",
|
|
84
|
+
output_desc=True,
|
|
85
|
+
skip_editable=True,
|
|
86
|
+
)
|
|
87
|
+
adapter = PipAuditAdapter(settings=settings)
|
|
88
|
+
await adapter.init()
|
|
89
|
+
result = await adapter.check(files=[Path(".")])
|
|
90
|
+
```
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
settings: PipAuditSettings | None = None
|
|
94
|
+
|
|
95
|
+
def __init__(self, settings: PipAuditSettings | None = None) -> None:
|
|
96
|
+
"""Initialize PipAudit adapter.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
settings: Optional settings override
|
|
100
|
+
"""
|
|
101
|
+
super().__init__(settings=settings)
|
|
102
|
+
logger.debug(
|
|
103
|
+
"PipAuditAdapter initialized", extra={"has_settings": settings is not None}
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
async def init(self) -> None:
|
|
107
|
+
"""Initialize adapter with default settings."""
|
|
108
|
+
if not self.settings:
|
|
109
|
+
self.settings = PipAuditSettings()
|
|
110
|
+
logger.info("Using default PipAuditSettings")
|
|
111
|
+
await super().init()
|
|
112
|
+
logger.debug(
|
|
113
|
+
"PipAuditAdapter initialization complete",
|
|
114
|
+
extra={
|
|
115
|
+
"vulnerability_service": self.settings.vulnerability_service,
|
|
116
|
+
"skip_editable": self.settings.skip_editable,
|
|
117
|
+
"fix_enabled": self.settings.fix,
|
|
118
|
+
},
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def adapter_name(self) -> str:
|
|
123
|
+
"""Human-readable adapter name."""
|
|
124
|
+
return "pip-audit (Dependency Vulnerabilities)"
|
|
125
|
+
|
|
126
|
+
@property
|
|
127
|
+
def module_id(self) -> UUID:
|
|
128
|
+
"""Reference to module-level MODULE_ID."""
|
|
129
|
+
return MODULE_ID
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def tool_name(self) -> str:
|
|
133
|
+
"""CLI tool name."""
|
|
134
|
+
return "pip-audit"
|
|
135
|
+
|
|
136
|
+
def build_command(
|
|
137
|
+
self,
|
|
138
|
+
files: list[Path],
|
|
139
|
+
config: QACheckConfig | None = None,
|
|
140
|
+
) -> list[str]:
|
|
141
|
+
"""Build pip-audit command.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
files: Files/directories to scan (typically project root or requirements.txt)
|
|
145
|
+
config: Optional configuration override
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
Command as list of strings
|
|
149
|
+
"""
|
|
150
|
+
if not self.settings:
|
|
151
|
+
raise RuntimeError("Settings not initialized")
|
|
152
|
+
|
|
153
|
+
cmd = [self.tool_name]
|
|
154
|
+
|
|
155
|
+
# JSON output
|
|
156
|
+
if self.settings.use_json_output:
|
|
157
|
+
cmd.extend(["--format", "json"])
|
|
158
|
+
|
|
159
|
+
# Vulnerability service selection
|
|
160
|
+
cmd.extend(["--vulnerability-service", self.settings.vulnerability_service])
|
|
161
|
+
|
|
162
|
+
# Include vulnerability descriptions
|
|
163
|
+
if self.settings.output_desc:
|
|
164
|
+
cmd.append("--desc")
|
|
165
|
+
|
|
166
|
+
# Skip editable packages
|
|
167
|
+
if self.settings.skip_editable:
|
|
168
|
+
cmd.append("--skip-editable")
|
|
169
|
+
|
|
170
|
+
# Require hashes
|
|
171
|
+
if self.settings.require_hashes:
|
|
172
|
+
cmd.append("--require-hashes")
|
|
173
|
+
|
|
174
|
+
# Dry run mode
|
|
175
|
+
if self.settings.dry_run:
|
|
176
|
+
cmd.append("--dry-run")
|
|
177
|
+
|
|
178
|
+
# Fix vulnerabilities automatically
|
|
179
|
+
if self.settings.fix:
|
|
180
|
+
cmd.append("--fix")
|
|
181
|
+
|
|
182
|
+
# Custom cache directory
|
|
183
|
+
if self.settings.cache_dir:
|
|
184
|
+
cmd.extend(["--cache-dir", str(self.settings.cache_dir)])
|
|
185
|
+
|
|
186
|
+
# Scan targets
|
|
187
|
+
# If files contains a requirements file, use it directly
|
|
188
|
+
# Otherwise scan the current environment
|
|
189
|
+
for file_path in files:
|
|
190
|
+
if file_path.name in ("requirements.txt", "pyproject.toml"):
|
|
191
|
+
cmd.extend(["-r", str(file_path)])
|
|
192
|
+
elif file_path.is_dir():
|
|
193
|
+
# Scan installed packages in current environment
|
|
194
|
+
# pip-audit will automatically detect packages
|
|
195
|
+
pass
|
|
196
|
+
|
|
197
|
+
logger.info(
|
|
198
|
+
"Built pip-audit command",
|
|
199
|
+
extra={
|
|
200
|
+
"file_count": len(files),
|
|
201
|
+
"vulnerability_service": self.settings.vulnerability_service,
|
|
202
|
+
"fix_mode": self.settings.fix,
|
|
203
|
+
"skip_editable": self.settings.skip_editable,
|
|
204
|
+
},
|
|
205
|
+
)
|
|
206
|
+
return cmd
|
|
207
|
+
|
|
208
|
+
def _build_vulnerability_message(
|
|
209
|
+
self,
|
|
210
|
+
package_name: str,
|
|
211
|
+
package_version: str,
|
|
212
|
+
vuln_id: str,
|
|
213
|
+
description: str,
|
|
214
|
+
fix_versions: list[str],
|
|
215
|
+
aliases: list[str],
|
|
216
|
+
) -> str:
|
|
217
|
+
"""Build a comprehensive message for a vulnerability."""
|
|
218
|
+
message_parts = [
|
|
219
|
+
f"{package_name}=={package_version}",
|
|
220
|
+
f"vulnerability {vuln_id}",
|
|
221
|
+
]
|
|
222
|
+
|
|
223
|
+
# Add CVE aliases if present
|
|
224
|
+
cve_aliases = [a for a in aliases if a.startswith("CVE-")]
|
|
225
|
+
if cve_aliases:
|
|
226
|
+
message_parts.append(f"({', '.join(cve_aliases)})")
|
|
227
|
+
|
|
228
|
+
# Add description
|
|
229
|
+
if description:
|
|
230
|
+
# Truncate long descriptions
|
|
231
|
+
desc_preview = (
|
|
232
|
+
description[:100] + "..." if len(description) > 100 else description
|
|
233
|
+
)
|
|
234
|
+
message_parts.append(f"- {desc_preview}")
|
|
235
|
+
|
|
236
|
+
# Add fix versions
|
|
237
|
+
if fix_versions:
|
|
238
|
+
message_parts.append(f"Fix available: {', '.join(fix_versions[:3])}")
|
|
239
|
+
|
|
240
|
+
return " ".join(message_parts)
|
|
241
|
+
|
|
242
|
+
def _create_issues_from_dependencies(self, data: dict) -> list[ToolIssue]:
|
|
243
|
+
"""Create ToolIssues from parsed dependencies data."""
|
|
244
|
+
issues = []
|
|
245
|
+
|
|
246
|
+
for dependency in data.get("dependencies", []):
|
|
247
|
+
package_name = dependency.get("name", "unknown")
|
|
248
|
+
package_version = dependency.get("version", "unknown")
|
|
249
|
+
|
|
250
|
+
for vuln in dependency.get("vulns", []):
|
|
251
|
+
vuln_id = vuln.get("id", "unknown")
|
|
252
|
+
description = vuln.get("description", "")
|
|
253
|
+
fix_versions = vuln.get("fix_versions", [])
|
|
254
|
+
aliases = vuln.get("aliases", [])
|
|
255
|
+
|
|
256
|
+
message = self._build_vulnerability_message(
|
|
257
|
+
package_name,
|
|
258
|
+
package_version,
|
|
259
|
+
vuln_id,
|
|
260
|
+
description,
|
|
261
|
+
fix_versions,
|
|
262
|
+
aliases,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
issue = ToolIssue(
|
|
266
|
+
file_path=Path("pyproject.toml"), # Dependencies are in pyproject
|
|
267
|
+
line_number=None, # No line number for dependency issues
|
|
268
|
+
column_number=None,
|
|
269
|
+
message=message,
|
|
270
|
+
code=vuln_id,
|
|
271
|
+
severity="error", # All vulnerabilities are errors
|
|
272
|
+
)
|
|
273
|
+
issues.append(issue)
|
|
274
|
+
|
|
275
|
+
return issues
|
|
276
|
+
|
|
277
|
+
def _count_affected_packages(self, data: dict) -> int:
|
|
278
|
+
"""Count the number of affected packages."""
|
|
279
|
+
return len(
|
|
280
|
+
{
|
|
281
|
+
dep.get("name")
|
|
282
|
+
for dep in data.get("dependencies", [])
|
|
283
|
+
if dep.get("vulns")
|
|
284
|
+
}
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
async def parse_output(
|
|
288
|
+
self,
|
|
289
|
+
result: ToolExecutionResult,
|
|
290
|
+
) -> list[ToolIssue]:
|
|
291
|
+
"""Parse pip-audit JSON output into standardized issues.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
result: Raw execution result from pip-audit
|
|
295
|
+
|
|
296
|
+
Returns:
|
|
297
|
+
List of parsed issues
|
|
298
|
+
"""
|
|
299
|
+
if not result.raw_output:
|
|
300
|
+
logger.debug("No output to parse")
|
|
301
|
+
return []
|
|
302
|
+
|
|
303
|
+
try:
|
|
304
|
+
data = json.loads(result.raw_output)
|
|
305
|
+
logger.debug(
|
|
306
|
+
"Parsed pip-audit JSON output",
|
|
307
|
+
extra={"dependencies_count": len(data.get("dependencies", []))},
|
|
308
|
+
)
|
|
309
|
+
except json.JSONDecodeError as e:
|
|
310
|
+
logger.debug(
|
|
311
|
+
"JSON parse failed, falling back to text parsing",
|
|
312
|
+
extra={"error": str(e), "output_preview": result.raw_output[:200]},
|
|
313
|
+
)
|
|
314
|
+
return self._parse_text_output(result.raw_output)
|
|
315
|
+
|
|
316
|
+
issues = self._create_issues_from_dependencies(data)
|
|
317
|
+
|
|
318
|
+
logger.info(
|
|
319
|
+
"Parsed pip-audit output",
|
|
320
|
+
extra={
|
|
321
|
+
"total_vulnerabilities": len(issues),
|
|
322
|
+
"affected_packages": self._count_affected_packages(data),
|
|
323
|
+
},
|
|
324
|
+
)
|
|
325
|
+
return issues
|
|
326
|
+
|
|
327
|
+
def _parse_text_output(self, output: str) -> list[ToolIssue]:
|
|
328
|
+
"""Parse pip-audit text output (fallback).
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
output: Text output from pip-audit
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
List of ToolIssue objects
|
|
335
|
+
"""
|
|
336
|
+
issues = []
|
|
337
|
+
lines = output.strip().split("\n")
|
|
338
|
+
|
|
339
|
+
for line in lines:
|
|
340
|
+
# pip-audit text format varies, but typically includes package name and CVE
|
|
341
|
+
if "PYSEC-" in line or "CVE-" in line or "vulnerability" in line.lower():
|
|
342
|
+
issue = self._parse_text_line(line)
|
|
343
|
+
if issue:
|
|
344
|
+
issues.append(issue)
|
|
345
|
+
|
|
346
|
+
logger.info(
|
|
347
|
+
"Parsed pip-audit text output (fallback)",
|
|
348
|
+
extra={
|
|
349
|
+
"total_issues": len(issues),
|
|
350
|
+
},
|
|
351
|
+
)
|
|
352
|
+
return issues
|
|
353
|
+
|
|
354
|
+
def _parse_text_line(self, line: str) -> ToolIssue | None:
|
|
355
|
+
"""Parse a single text output line.
|
|
356
|
+
|
|
357
|
+
Args:
|
|
358
|
+
line: Line of text output
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
ToolIssue if parsing successful, None otherwise
|
|
362
|
+
"""
|
|
363
|
+
# Basic text parsing - extract package name and vulnerability info
|
|
364
|
+
# This is a fallback, JSON is preferred
|
|
365
|
+
try:
|
|
366
|
+
return ToolIssue(
|
|
367
|
+
file_path=Path("pyproject.toml"),
|
|
368
|
+
line_number=None,
|
|
369
|
+
column_number=None,
|
|
370
|
+
message=line.strip(),
|
|
371
|
+
severity="error",
|
|
372
|
+
)
|
|
373
|
+
except Exception:
|
|
374
|
+
return None
|
|
375
|
+
|
|
376
|
+
def _get_check_type(self) -> QACheckType:
|
|
377
|
+
"""Return dependency security check type."""
|
|
378
|
+
return QACheckType.SECURITY
|
|
379
|
+
|
|
380
|
+
def get_default_config(self) -> QACheckConfig:
|
|
381
|
+
"""Get default configuration for PipAudit adapter.
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
QACheckConfig with sensible defaults
|
|
385
|
+
"""
|
|
386
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
387
|
+
|
|
388
|
+
return QACheckConfig(
|
|
389
|
+
check_id=MODULE_ID,
|
|
390
|
+
check_name=self.adapter_name,
|
|
391
|
+
check_type=QACheckType.SECURITY,
|
|
392
|
+
enabled=True,
|
|
393
|
+
file_patterns=[
|
|
394
|
+
"pyproject.toml",
|
|
395
|
+
"requirements.txt",
|
|
396
|
+
"requirements-*.txt",
|
|
397
|
+
],
|
|
398
|
+
exclude_patterns=[
|
|
399
|
+
"**/.venv/**",
|
|
400
|
+
"**/venv/**",
|
|
401
|
+
"**/build/**",
|
|
402
|
+
"**/dist/**",
|
|
403
|
+
],
|
|
404
|
+
timeout_seconds=120, # Dependency scanning can take time
|
|
405
|
+
parallel_safe=True,
|
|
406
|
+
stage="comprehensive", # Run in comprehensive stage (not fast hooks)
|
|
407
|
+
settings={
|
|
408
|
+
"vulnerability_service": "osv",
|
|
409
|
+
"skip_editable": True,
|
|
410
|
+
"output_desc": True,
|
|
411
|
+
"fix": False, # Don't auto-fix by default
|
|
412
|
+
},
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
# ACB Registration (REQUIRED at module level)
|
|
417
|
+
with suppress(Exception):
|
|
418
|
+
depends.set(PipAuditAdapter)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [Format](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Format Adapter
|
|
4
|
+
|
|
5
|
+
Formatting for Python and Markdown with fast tooling and structured results. Ruff also supports lint mode; see mode selection below.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
- Unified interface for code and docs formatting
|
|
10
|
+
- Safe check-only modes and optional auto-fix
|
|
11
|
+
- JSON parsing where supported (Ruff check)
|
|
12
|
+
|
|
13
|
+
## Built-in Implementations
|
|
14
|
+
|
|
15
|
+
| Module | Description | Mode(s) | Status |
|
|
16
|
+
| ------ | ----------- | ------- | ------ |
|
|
17
|
+
| `ruff.py` | Fast Python linter/formatter | `check`, `format` | Stable |
|
|
18
|
+
| `mdformat.py` | Opinionated Markdown formatter | check-only or fix | Stable |
|
|
19
|
+
|
|
20
|
+
## Ruff Settings
|
|
21
|
+
|
|
22
|
+
Settings class: `RuffSettings`
|
|
23
|
+
|
|
24
|
+
- `mode` ("check" or "format")
|
|
25
|
+
- `fix_enabled` (bool; auto-fix in check; apply format in format mode)
|
|
26
|
+
- `select_rules` / `ignore_rules` (list[str])
|
|
27
|
+
- `line_length` (int; format mode)
|
|
28
|
+
- `preview` (bool)
|
|
29
|
+
|
|
30
|
+
Example:
|
|
31
|
+
|
|
32
|
+
```python
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
from crackerjack.adapters.format.ruff import RuffAdapter, RuffSettings
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def run_ruff() -> None:
|
|
38
|
+
adapter = RuffAdapter(settings=RuffSettings(mode="check", fix_enabled=True))
|
|
39
|
+
await adapter.init()
|
|
40
|
+
result = await adapter.check(files=[Path("src/")])
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Mdformat Settings
|
|
44
|
+
|
|
45
|
+
Settings class: `MdformatSettings`
|
|
46
|
+
|
|
47
|
+
- `fix_enabled` (bool; write changes)
|
|
48
|
+
- `line_length` (int)
|
|
49
|
+
- `wrap_mode` ("keep", "no", or number)
|
|
50
|
+
|
|
51
|
+
Example:
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from pathlib import Path
|
|
55
|
+
from crackerjack.adapters.format.mdformat import MdformatAdapter, MdformatSettings
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
async def format_md() -> None:
|
|
59
|
+
adapter = MdformatAdapter(settings=MdformatSettings(fix_enabled=False))
|
|
60
|
+
await adapter.init()
|
|
61
|
+
result = await adapter.check(files=[Path("README.md"), Path("docs/")])
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Notes
|
|
65
|
+
|
|
66
|
+
- Ruff lint mode emits JSON for precise diagnostics; format mode reports files needing changes
|
|
67
|
+
- Combine with pre-commit or run via `python -m crackerjack` as part of workflows
|
|
68
|
+
|
|
69
|
+
## Related
|
|
70
|
+
|
|
71
|
+
- [Lint](<../lint/README.md>) — Codespell for spelling and text issues
|
|
72
|
+
- [Type](<../type/README.md>) — Type safety complements style enforcement
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Format adapters for code formatting and style enforcement.
|
|
2
|
+
|
|
3
|
+
Adapters:
|
|
4
|
+
- ruff: Fast Python formatter (replaces Black) with lint capabilities
|
|
5
|
+
- mdformat: Markdown formatting
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# ACB will auto-discover these adapters via depends.set() in module files
|
|
9
|
+
# No explicit imports needed here
|
|
10
|
+
|
|
11
|
+
__all__ = []
|