crackerjack 0.37.9__py3-none-any.whl → 0.45.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +30 -1
- crackerjack/__main__.py +342 -1263
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +27 -5
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
- crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
- crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +40 -12
- crackerjack/agents/base.py +1 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +49 -53
- crackerjack/agents/dry_agent.py +187 -3
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +6 -8
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/performance_agent.py +121 -1152
- crackerjack/agents/refactoring_agent.py +156 -655
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +19 -1605
- crackerjack/api.py +5 -7
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +1 -1
- crackerjack/cli/cache_handlers.py +23 -18
- crackerjack/cli/cache_handlers_enhanced.py +1 -4
- crackerjack/cli/facade.py +70 -8
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +249 -49
- crackerjack/cli/interactive.py +8 -5
- crackerjack/cli/options.py +203 -110
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +60 -24
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +256 -0
- crackerjack/config/global_lock_config.py +191 -54
- crackerjack/config/hooks.py +188 -16
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/async_workflow_orchestrator.py +79 -53
- crackerjack/core/autofix_coordinator.py +22 -9
- crackerjack/core/container.py +10 -9
- crackerjack/core/enhanced_container.py +9 -9
- crackerjack/core/performance.py +1 -1
- crackerjack/core/performance_monitor.py +5 -3
- crackerjack/core/phase_coordinator.py +1018 -634
- crackerjack/core/proactive_workflow.py +3 -3
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +167 -23
- crackerjack/core/session_coordinator.py +187 -382
- crackerjack/core/timeout_manager.py +161 -44
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +1247 -953
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/ai_templates.py +1 -1
- crackerjack/documentation/dual_output_generator.py +11 -9
- crackerjack/documentation/reference_generator.py +104 -59
- crackerjack/dynamic_config.py +52 -61
- crackerjack/errors.py +1 -1
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +2 -0
- crackerjack/executors/async_hook_executor.py +539 -77
- crackerjack/executors/cached_hook_executor.py +3 -3
- crackerjack/executors/hook_executor.py +967 -102
- crackerjack/executors/hook_lock_manager.py +31 -22
- crackerjack/executors/individual_hook_executor.py +66 -32
- crackerjack/executors/lsp_aware_hook_executor.py +136 -57
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +23 -7
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +8 -9
- crackerjack/intelligence/README.md +557 -0
- crackerjack/interactive.py +37 -10
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/async_hook_manager.py +41 -57
- crackerjack/managers/hook_manager.py +449 -79
- crackerjack/managers/publish_manager.py +81 -36
- crackerjack/managers/test_command_builder.py +290 -12
- crackerjack/managers/test_executor.py +93 -8
- crackerjack/managers/test_manager.py +1082 -75
- crackerjack/managers/test_progress.py +118 -26
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/cache.py +25 -2
- crackerjack/mcp/client_runner.py +35 -18
- crackerjack/mcp/context.py +9 -9
- crackerjack/mcp/dashboard.py +24 -8
- crackerjack/mcp/enhanced_progress_monitor.py +34 -23
- crackerjack/mcp/file_monitor.py +27 -6
- crackerjack/mcp/progress_components.py +45 -34
- crackerjack/mcp/progress_monitor.py +6 -9
- crackerjack/mcp/rate_limiter.py +11 -7
- crackerjack/mcp/server.py +2 -0
- crackerjack/mcp/server_core.py +187 -55
- crackerjack/mcp/service_watchdog.py +12 -9
- crackerjack/mcp/task_manager.py +2 -2
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +2 -0
- crackerjack/mcp/tools/core_tools.py +75 -52
- crackerjack/mcp/tools/execution_tools.py +87 -31
- crackerjack/mcp/tools/intelligence_tools.py +2 -2
- crackerjack/mcp/tools/proactive_tools.py +1 -1
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +180 -132
- crackerjack/mcp/tools/workflow_executor.py +87 -46
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/app.py +11 -1
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +27 -4
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
- crackerjack/mcp/websocket/server.py +1 -3
- crackerjack/mcp/websocket/websocket_handler.py +107 -6
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +10 -1
- crackerjack/models/config.py +639 -22
- crackerjack/models/config_adapter.py +6 -6
- crackerjack/models/protocols.py +1167 -23
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +19 -3
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/ai_agent_watchdog.py +5 -4
- crackerjack/monitoring/metrics_collector.py +4 -3
- crackerjack/monitoring/regression_prevention.py +4 -3
- crackerjack/monitoring/websocket_server.py +4 -241
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +20 -67
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +13 -6
- crackerjack/orchestration/execution_strategies.py +6 -6
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +1 -1
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/hooks.py +3 -2
- crackerjack/plugins/loader.py +3 -3
- crackerjack/plugins/managers.py +1 -1
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +8 -21
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/api_extractor.py +5 -3
- crackerjack/services/bounded_status_operations.py +45 -5
- crackerjack/services/cache.py +249 -318
- crackerjack/services/changelog_automation.py +7 -3
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +83 -39
- crackerjack/services/config_merge.py +9 -6
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +13 -26
- crackerjack/services/coverage_badge_service.py +6 -4
- crackerjack/services/coverage_ratchet.py +53 -27
- crackerjack/services/debug.py +18 -7
- crackerjack/services/dependency_analyzer.py +4 -4
- crackerjack/services/dependency_monitor.py +13 -13
- crackerjack/services/documentation_generator.py +4 -2
- crackerjack/services/documentation_service.py +62 -33
- crackerjack/services/enhanced_filesystem.py +81 -27
- crackerjack/services/enterprise_optimizer.py +1 -1
- crackerjack/services/error_pattern_analyzer.py +10 -10
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +5 -7
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +80 -109
- crackerjack/services/git.py +99 -5
- crackerjack/services/health_metrics.py +4 -6
- crackerjack/services/heatmap_generator.py +12 -3
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +101 -49
- crackerjack/services/log_manager.py +2 -2
- crackerjack/services/logging.py +120 -68
- crackerjack/services/lsp_client.py +12 -12
- crackerjack/services/memory_optimizer.py +27 -22
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
- crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
- crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
- crackerjack/services/parallel_executor.py +166 -55
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +21 -8
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
- crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
- crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
- crackerjack/services/regex_patterns.py +58 -2987
- crackerjack/services/regex_utils.py +55 -29
- crackerjack/services/secure_status_formatter.py +42 -15
- crackerjack/services/secure_subprocess.py +35 -2
- crackerjack/services/security.py +16 -8
- crackerjack/services/server_manager.py +40 -51
- crackerjack/services/smart_scheduling.py +46 -6
- crackerjack/services/status_authentication.py +3 -3
- crackerjack/services/thread_safe_status_collector.py +1 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +9 -5
- crackerjack/services/unified_config.py +43 -351
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +6 -4
- crackerjack/services/version_checker.py +14 -8
- crackerjack/services/zuban_lsp_service.py +5 -4
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/init.md +2 -12
- crackerjack/slash_commands/run.md +84 -50
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_regex_patterns.py +7 -3
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack/managers/test_manager_backup.py +0 -1075
- crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
- crackerjack/mixins/__init__.py +0 -3
- crackerjack/mixins/error_handling.py +0 -145
- crackerjack/services/config.py +0 -358
- crackerjack/ui/server_panels.py +0 -125
- crackerjack-0.37.9.dist-info/RECORD +0 -231
- /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
- /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [Security](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Security Adapters
|
|
4
|
+
|
|
5
|
+
Secret leak prevention and credential detection for git repositories.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Security adapters focus on **preventing credential leaks** by detecting hardcoded secrets, API keys, and tokens before they enter the repository. This complements SAST tools (which analyze code vulnerabilities).
|
|
10
|
+
|
|
11
|
+
## Built-in Implementations
|
|
12
|
+
|
|
13
|
+
| Module | Description | Status |
|
|
14
|
+
| ------ | ----------- | ------ |
|
|
15
|
+
| `gitleaks.py` | Git-aware secrets/credentials detection with redaction | Stable |
|
|
16
|
+
|
|
17
|
+
**Note:** SAST tools (Bandit, Semgrep, Pyscn) have been moved to [crackerjack.adapters.sast](<../sast/README.md>)
|
|
18
|
+
|
|
19
|
+
## Example: Gitleaks
|
|
20
|
+
|
|
21
|
+
Gitleaks runs in **fast stage** as a pre-commit security gate:
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from crackerjack.adapters.security.gitleaks import GitleaksAdapter, GitleaksSettings
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def scan_secrets() -> None:
|
|
29
|
+
adapter = GitleaksAdapter(
|
|
30
|
+
settings=GitleaksSettings(
|
|
31
|
+
scan_mode="protect", # Scan working tree (pre-commit)
|
|
32
|
+
redact=True, # Redact secrets in output
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
await adapter.init()
|
|
36
|
+
result = await adapter.check(files=[Path(".")])
|
|
37
|
+
|
|
38
|
+
for issue in result.issues:
|
|
39
|
+
print(f"🔴 Secret detected: {issue.file_path}:{issue.line_number}")
|
|
40
|
+
print(f" Rule: {issue.code} - {issue.message}")
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
### Gitleaks in Fast Hooks
|
|
46
|
+
|
|
47
|
+
Gitleaks runs early in the workflow to **prevent** secrets from being committed:
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
# crackerjack/config/hooks.py
|
|
51
|
+
HookDefinition(
|
|
52
|
+
name="gitleaks",
|
|
53
|
+
command=[],
|
|
54
|
+
timeout=45,
|
|
55
|
+
stage=HookStage.COMPREHENSIVE, # Critical security check
|
|
56
|
+
manual_stage=True,
|
|
57
|
+
security_level=SecurityLevel.CRITICAL,
|
|
58
|
+
use_precommit_legacy=False,
|
|
59
|
+
)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Scan Modes
|
|
63
|
+
|
|
64
|
+
- **`protect` mode** (recommended): Scans staged files before commit
|
|
65
|
+
- **`detect` mode**: Scans entire git history for existing secrets
|
|
66
|
+
|
|
67
|
+
### Managing False Positives
|
|
68
|
+
|
|
69
|
+
Create `.gitleaks.toml` to allowlist known non-secrets:
|
|
70
|
+
|
|
71
|
+
```toml
|
|
72
|
+
[allowlist]
|
|
73
|
+
description = "Known false positives"
|
|
74
|
+
paths = [
|
|
75
|
+
"tests/fixtures/mock_credentials.py",
|
|
76
|
+
"docs/examples/api_key_template.md",
|
|
77
|
+
]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Comparison: Security vs SAST
|
|
81
|
+
|
|
82
|
+
| Category | Purpose | Tools | Stage | Scope |
|
|
83
|
+
|----------|---------|-------|-------|-------|
|
|
84
|
+
| **Security** | Prevent credential leaks | Gitleaks | Fast | `**/*` |
|
|
85
|
+
| **SAST** | Find code vulnerabilities | Semgrep, Bandit | Comprehensive | `**/*.py` |
|
|
86
|
+
|
|
87
|
+
**Security** = Policy enforcement (no secrets in repo)
|
|
88
|
+
**SAST** = Vulnerability detection (exploitable code patterns)
|
|
89
|
+
|
|
90
|
+
## QACheckType
|
|
91
|
+
|
|
92
|
+
Security adapters use `QACheckType.SECURITY`:
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
from crackerjack.models.qa_results import QACheckType
|
|
96
|
+
|
|
97
|
+
assert adapter._get_check_type() == QACheckType.SECURITY
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Notes
|
|
101
|
+
|
|
102
|
+
- **Universal scope**: Scans all files (`**/*`), not just Python
|
|
103
|
+
- **Git-aware**: Can scan history or working tree
|
|
104
|
+
- **Redaction**: Automatically redacts secrets in reports
|
|
105
|
+
- **Baseline support**: Manage known false positives with baseline files
|
|
106
|
+
|
|
107
|
+
## Related
|
|
108
|
+
|
|
109
|
+
- [SAST](<../sast/README.md>) — Code vulnerability analysis (Semgrep, Bandit)
|
|
110
|
+
- [Type](<../type/README.md>) — Type safety prevents classes of bugs
|
|
111
|
+
- [Lint](<../lint/README.md>) — Code quality supports security
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Security adapters for secret leak prevention.
|
|
2
|
+
|
|
3
|
+
This package contains adapters for detecting hardcoded secrets and credentials
|
|
4
|
+
in code repositories to prevent security breaches.
|
|
5
|
+
|
|
6
|
+
Tools:
|
|
7
|
+
- Gitleaks: Git-aware secrets/credentials detection with redaction
|
|
8
|
+
|
|
9
|
+
Note: SAST tools (Bandit, Semgrep, Pyscn) have been moved to crackerjack.adapters.sast
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from crackerjack.adapters.security.gitleaks import GitleaksAdapter, GitleaksSettings
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"GitleaksAdapter",
|
|
16
|
+
"GitleaksSettings",
|
|
17
|
+
]
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"""Gitleaks adapter for ACB QA framework - secrets and credentials detection.
|
|
2
|
+
|
|
3
|
+
Gitleaks is a SAST tool for detecting hardcoded secrets like passwords, API keys,
|
|
4
|
+
and tokens in git repositories. It scans for:
|
|
5
|
+
- API keys (AWS, Google, Azure, etc.)
|
|
6
|
+
- Private keys (RSA, SSH, etc.)
|
|
7
|
+
- Database credentials
|
|
8
|
+
- OAuth tokens
|
|
9
|
+
- Generic secrets patterns
|
|
10
|
+
|
|
11
|
+
ACB Patterns:
|
|
12
|
+
- MODULE_ID and MODULE_STATUS at module level
|
|
13
|
+
- depends.set() registration after class definition
|
|
14
|
+
- Extends BaseToolAdapter for tool execution
|
|
15
|
+
- Async execution with JSON output parsing
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import logging
|
|
22
|
+
import typing as t
|
|
23
|
+
from contextlib import suppress
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from uuid import UUID
|
|
26
|
+
|
|
27
|
+
from acb.depends import depends
|
|
28
|
+
|
|
29
|
+
from crackerjack.adapters._tool_adapter_base import (
|
|
30
|
+
BaseToolAdapter,
|
|
31
|
+
ToolAdapterSettings,
|
|
32
|
+
ToolExecutionResult,
|
|
33
|
+
ToolIssue,
|
|
34
|
+
)
|
|
35
|
+
from crackerjack.models.qa_results import QACheckType
|
|
36
|
+
|
|
37
|
+
if t.TYPE_CHECKING:
|
|
38
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
39
|
+
|
|
40
|
+
# ACB Module Registration (REQUIRED)
|
|
41
|
+
MODULE_ID = UUID(
|
|
42
|
+
"01937d86-5a1b-7c2d-9e3f-a4b5c6d7e8f9"
|
|
43
|
+
) # Static UUID7 for reproducible module identity
|
|
44
|
+
MODULE_STATUS = "stable"
|
|
45
|
+
|
|
46
|
+
# Module-level logger for structured logging
|
|
47
|
+
logger = logging.getLogger(__name__)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class GitleaksSettings(ToolAdapterSettings):
|
|
51
|
+
"""Settings for Gitleaks adapter."""
|
|
52
|
+
|
|
53
|
+
tool_name: str = "gitleaks"
|
|
54
|
+
use_json_output: bool = True
|
|
55
|
+
scan_mode: str = "detect" # "detect" or "protect"
|
|
56
|
+
config_file: Path | None = None
|
|
57
|
+
baseline_file: Path | None = None
|
|
58
|
+
no_git: bool = False # Scan files without git history
|
|
59
|
+
redact: bool = True # Redact secrets in output
|
|
60
|
+
verbose: bool = False
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class GitleaksAdapter(BaseToolAdapter):
|
|
64
|
+
"""Adapter for Gitleaks - secrets and credentials scanner.
|
|
65
|
+
|
|
66
|
+
Detects hardcoded secrets and credentials in code:
|
|
67
|
+
- API keys (AWS, GCP, Azure, GitHub, Slack, etc.)
|
|
68
|
+
- Private keys (RSA, SSH, PGP, etc.)
|
|
69
|
+
- Database credentials (MySQL, Postgres, MongoDB, etc.)
|
|
70
|
+
- OAuth tokens and refresh tokens
|
|
71
|
+
- Generic high-entropy strings
|
|
72
|
+
- Custom regex patterns
|
|
73
|
+
|
|
74
|
+
Features:
|
|
75
|
+
- JSON output for structured issue reporting
|
|
76
|
+
- Git-aware scanning (detect mode) or file-based (protect mode)
|
|
77
|
+
- Custom configuration support
|
|
78
|
+
- Baseline file for known false positives
|
|
79
|
+
- Secret redaction in output
|
|
80
|
+
|
|
81
|
+
Example:
|
|
82
|
+
```python
|
|
83
|
+
settings = GitleaksSettings(
|
|
84
|
+
scan_mode="protect", # Scan staged files
|
|
85
|
+
redact=True,
|
|
86
|
+
config_file=Path(".gitleaks.toml"),
|
|
87
|
+
)
|
|
88
|
+
adapter = GitleaksAdapter(settings=settings)
|
|
89
|
+
await adapter.init()
|
|
90
|
+
result = await adapter.check(files=[Path("src/")])
|
|
91
|
+
```
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
settings: GitleaksSettings | None = None
|
|
95
|
+
|
|
96
|
+
def __init__(self, settings: GitleaksSettings | None = None) -> None:
|
|
97
|
+
"""Initialize Gitleaks adapter.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
settings: Optional settings override
|
|
101
|
+
"""
|
|
102
|
+
super().__init__(settings=settings)
|
|
103
|
+
logger.debug(
|
|
104
|
+
"GitleaksAdapter initialized", extra={"has_settings": settings is not None}
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
async def init(self) -> None:
|
|
108
|
+
"""Initialize adapter with default settings."""
|
|
109
|
+
if not self.settings:
|
|
110
|
+
self.settings = GitleaksSettings()
|
|
111
|
+
logger.info("Using default GitleaksSettings")
|
|
112
|
+
await super().init()
|
|
113
|
+
logger.debug(
|
|
114
|
+
"GitleaksAdapter initialization complete",
|
|
115
|
+
extra={
|
|
116
|
+
"scan_mode": self.settings.scan_mode,
|
|
117
|
+
"redact": self.settings.redact,
|
|
118
|
+
"no_git": self.settings.no_git,
|
|
119
|
+
"has_config": self.settings.config_file is not None,
|
|
120
|
+
},
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def adapter_name(self) -> str:
|
|
125
|
+
"""Human-readable adapter name."""
|
|
126
|
+
return "Gitleaks (Secrets)"
|
|
127
|
+
|
|
128
|
+
@property
|
|
129
|
+
def module_id(self) -> UUID:
|
|
130
|
+
"""Reference to module-level MODULE_ID."""
|
|
131
|
+
return MODULE_ID
|
|
132
|
+
|
|
133
|
+
@property
|
|
134
|
+
def tool_name(self) -> str:
|
|
135
|
+
"""CLI tool name."""
|
|
136
|
+
return "gitleaks"
|
|
137
|
+
|
|
138
|
+
def build_command(
|
|
139
|
+
self,
|
|
140
|
+
files: list[Path],
|
|
141
|
+
config: QACheckConfig | None = None,
|
|
142
|
+
) -> list[str]:
|
|
143
|
+
"""Build Gitleaks command.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
files: Files/directories to scan
|
|
147
|
+
config: Optional configuration override
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
Command as list of strings
|
|
151
|
+
"""
|
|
152
|
+
if not self.settings:
|
|
153
|
+
raise RuntimeError("Settings not initialized")
|
|
154
|
+
|
|
155
|
+
cmd = [self.tool_name]
|
|
156
|
+
|
|
157
|
+
# Scan mode (detect for git history, protect for current files)
|
|
158
|
+
cmd.append(self.settings.scan_mode)
|
|
159
|
+
|
|
160
|
+
# Source path
|
|
161
|
+
if files:
|
|
162
|
+
# For protect mode, scan specific files
|
|
163
|
+
if self.settings.scan_mode == "protect":
|
|
164
|
+
cmd.extend(["--source", str(files[0].parent if files else Path.cwd())])
|
|
165
|
+
else:
|
|
166
|
+
# For detect mode, scan repository
|
|
167
|
+
cmd.extend(["--source", str(Path.cwd())])
|
|
168
|
+
|
|
169
|
+
# JSON output
|
|
170
|
+
if self.settings.use_json_output:
|
|
171
|
+
cmd.extend(["--report-format", "json"])
|
|
172
|
+
# Write to stdout
|
|
173
|
+
cmd.extend(["--report-path", "/dev/stdout"])
|
|
174
|
+
|
|
175
|
+
# Config file
|
|
176
|
+
if self.settings.config_file and self.settings.config_file.exists():
|
|
177
|
+
cmd.extend(["--config", str(self.settings.config_file)])
|
|
178
|
+
|
|
179
|
+
# Baseline file (known false positives)
|
|
180
|
+
if self.settings.baseline_file and self.settings.baseline_file.exists():
|
|
181
|
+
cmd.extend(["--baseline-path", str(self.settings.baseline_file)])
|
|
182
|
+
|
|
183
|
+
# No git mode (scan files without git)
|
|
184
|
+
if self.settings.no_git:
|
|
185
|
+
cmd.append("--no-git")
|
|
186
|
+
|
|
187
|
+
# Redact secrets in output
|
|
188
|
+
if self.settings.redact:
|
|
189
|
+
cmd.append("--redact")
|
|
190
|
+
|
|
191
|
+
# Verbose output
|
|
192
|
+
if self.settings.verbose:
|
|
193
|
+
cmd.append("--verbose")
|
|
194
|
+
|
|
195
|
+
logger.info(
|
|
196
|
+
"Built Gitleaks command",
|
|
197
|
+
extra={
|
|
198
|
+
"file_count": len(files),
|
|
199
|
+
"scan_mode": self.settings.scan_mode,
|
|
200
|
+
"redact": self.settings.redact,
|
|
201
|
+
"no_git": self.settings.no_git,
|
|
202
|
+
"has_config": self.settings.config_file is not None,
|
|
203
|
+
"has_baseline": self.settings.baseline_file is not None,
|
|
204
|
+
},
|
|
205
|
+
)
|
|
206
|
+
return cmd
|
|
207
|
+
|
|
208
|
+
async def parse_output(
|
|
209
|
+
self,
|
|
210
|
+
result: ToolExecutionResult,
|
|
211
|
+
) -> list[ToolIssue]:
|
|
212
|
+
"""Parse Gitleaks JSON output into standardized issues.
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
result: Raw execution result from Gitleaks
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
List of parsed issues
|
|
219
|
+
"""
|
|
220
|
+
if not result.raw_output:
|
|
221
|
+
logger.debug("No output to parse")
|
|
222
|
+
return []
|
|
223
|
+
|
|
224
|
+
try:
|
|
225
|
+
data = json.loads(result.raw_output)
|
|
226
|
+
findings = data if isinstance(data, list) else [data]
|
|
227
|
+
logger.debug(
|
|
228
|
+
"Parsed Gitleaks JSON output", extra={"findings_count": len(findings)}
|
|
229
|
+
)
|
|
230
|
+
except json.JSONDecodeError as e:
|
|
231
|
+
logger.warning(
|
|
232
|
+
"JSON parse failed",
|
|
233
|
+
extra={"error": str(e), "output_preview": result.raw_output[:200]},
|
|
234
|
+
)
|
|
235
|
+
return []
|
|
236
|
+
|
|
237
|
+
issues = []
|
|
238
|
+
|
|
239
|
+
# Gitleaks JSON format:
|
|
240
|
+
# [
|
|
241
|
+
# {
|
|
242
|
+
# "Description": "AWS Access Key",
|
|
243
|
+
# "StartLine": 10,
|
|
244
|
+
# "EndLine": 10,
|
|
245
|
+
# "StartColumn": 15,
|
|
246
|
+
# "EndColumn": 35,
|
|
247
|
+
# "Match": "AKIAIOSFODNN7EXAMPLE", # Redacted if --redact
|
|
248
|
+
# "Secret": "AKIAIOSFODNN7EXAMPLE", # Redacted if --redact
|
|
249
|
+
# "File": "config/settings.py",
|
|
250
|
+
# "Commit": "abc123...",
|
|
251
|
+
# "Entropy": 3.5,
|
|
252
|
+
# "Author": "user@example.com",
|
|
253
|
+
# "Date": "2024-01-01",
|
|
254
|
+
# "Message": "commit message",
|
|
255
|
+
# "Tags": ["key", "AWS"],
|
|
256
|
+
# "RuleID": "aws-access-token"
|
|
257
|
+
# }
|
|
258
|
+
# ]
|
|
259
|
+
|
|
260
|
+
for finding in findings:
|
|
261
|
+
file_path = Path(finding.get("File", ""))
|
|
262
|
+
|
|
263
|
+
# Build descriptive message
|
|
264
|
+
description = finding.get("Description", "Secret detected")
|
|
265
|
+
rule_id = finding.get("RuleID", "")
|
|
266
|
+
tags = finding.get("Tags", [])
|
|
267
|
+
|
|
268
|
+
message_parts = [description]
|
|
269
|
+
if rule_id:
|
|
270
|
+
message_parts.append(f"(Rule: {rule_id})")
|
|
271
|
+
if tags:
|
|
272
|
+
message_parts.append(f"[{', '.join(tags)}]")
|
|
273
|
+
|
|
274
|
+
message = " ".join(message_parts)
|
|
275
|
+
|
|
276
|
+
# Entropy indicates likelihood of true positive
|
|
277
|
+
entropy = finding.get("Entropy", 0.0)
|
|
278
|
+
severity = "error" if entropy > 4.0 else "warning"
|
|
279
|
+
|
|
280
|
+
issue = ToolIssue(
|
|
281
|
+
file_path=file_path,
|
|
282
|
+
line_number=finding.get("StartLine"),
|
|
283
|
+
column_number=finding.get("StartColumn"),
|
|
284
|
+
message=message,
|
|
285
|
+
code=rule_id,
|
|
286
|
+
severity=severity,
|
|
287
|
+
suggestion=f"Review and remove secret. Entropy: {entropy:.2f}",
|
|
288
|
+
)
|
|
289
|
+
issues.append(issue)
|
|
290
|
+
|
|
291
|
+
logger.info(
|
|
292
|
+
"Parsed Gitleaks output",
|
|
293
|
+
extra={
|
|
294
|
+
"total_issues": len(issues),
|
|
295
|
+
"high_entropy": sum(1 for i in issues if i.severity == "error"),
|
|
296
|
+
"files_affected": len({str(i.file_path) for i in issues}),
|
|
297
|
+
},
|
|
298
|
+
)
|
|
299
|
+
return issues
|
|
300
|
+
|
|
301
|
+
def _get_check_type(self) -> QACheckType:
|
|
302
|
+
"""Return security check type."""
|
|
303
|
+
return QACheckType.SECURITY
|
|
304
|
+
|
|
305
|
+
def get_default_config(self) -> QACheckConfig:
|
|
306
|
+
"""Get default configuration for Gitleaks adapter.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
QACheckConfig with sensible defaults
|
|
310
|
+
"""
|
|
311
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
312
|
+
|
|
313
|
+
return QACheckConfig(
|
|
314
|
+
check_id=MODULE_ID,
|
|
315
|
+
check_name=self.adapter_name,
|
|
316
|
+
check_type=QACheckType.SECURITY,
|
|
317
|
+
enabled=True,
|
|
318
|
+
file_patterns=["**/*"], # Scan all files
|
|
319
|
+
exclude_patterns=[
|
|
320
|
+
"**/.git/**",
|
|
321
|
+
"**/node_modules/**",
|
|
322
|
+
"**/.venv/**",
|
|
323
|
+
"**/venv/**",
|
|
324
|
+
"**/__pycache__/**",
|
|
325
|
+
],
|
|
326
|
+
timeout_seconds=120,
|
|
327
|
+
parallel_safe=True,
|
|
328
|
+
stage="fast", # Fast secrets scan before commit
|
|
329
|
+
settings={
|
|
330
|
+
"scan_mode": "protect", # Scan current files
|
|
331
|
+
"redact": True,
|
|
332
|
+
"no_git": False,
|
|
333
|
+
},
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
# ACB Registration (REQUIRED at module level)
|
|
338
|
+
with suppress(Exception):
|
|
339
|
+
depends.set(GitleaksAdapter)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [Type](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Type Adapters
|
|
4
|
+
|
|
5
|
+
Static type checking with fast Rust-backed options and experimental tools.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
- Ultra-fast checks with Zuban (Rust), supports incremental caching and LSP
|
|
10
|
+
- Additional checkers (Pyrefly, Ty) for experimentation
|
|
11
|
+
- JSON output parsing where available for precise diagnostics
|
|
12
|
+
|
|
13
|
+
## Built-in Implementations
|
|
14
|
+
|
|
15
|
+
| Module | Description | Status |
|
|
16
|
+
| ------ | ----------- | ------ |
|
|
17
|
+
| `zuban.py` | Rust-based type checking, 20–200x faster than traditional tools | Stable |
|
|
18
|
+
| `pyrefly.py` | Python type checker with incremental mode | Experimental |
|
|
19
|
+
| `ty.py` | Python type verification tooling | Experimental |
|
|
20
|
+
|
|
21
|
+
## Zuban Settings
|
|
22
|
+
|
|
23
|
+
Settings class: `ZubanSettings`
|
|
24
|
+
|
|
25
|
+
- `strict_mode` (bool)
|
|
26
|
+
- `ignore_missing_imports` (bool)
|
|
27
|
+
- `follow_imports` ("normal"/"skip"/"silent")
|
|
28
|
+
- `incremental` (bool)
|
|
29
|
+
- `cache_dir` (Path)
|
|
30
|
+
- `warn_unused_ignores` (bool)
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from pathlib import Path
|
|
36
|
+
from crackerjack.adapters.type.zuban import ZubanAdapter, ZubanSettings
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
async def run_zuban() -> None:
|
|
40
|
+
adapter = ZubanAdapter(settings=ZubanSettings(strict_mode=True, incremental=True))
|
|
41
|
+
await adapter.init()
|
|
42
|
+
result = await adapter.check(files=[Path("src/")])
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## LSP Integration
|
|
46
|
+
|
|
47
|
+
For editor-like performance, see [LSP adapters](<../lsp/README.md>) to run Zuban diagnostics via LSP with automatic CLI fallback.
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
- [AI](<../ai/README.md>) — AI-assisted fixes frequently target type issues
|
|
52
|
+
- [Format](<../format/README.md>) — Consistent style improves type readability
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Type checking adapters for static analysis.
|
|
2
|
+
|
|
3
|
+
Adapters:
|
|
4
|
+
- zuban: Ultra-fast Rust-based Python type checker (20-200x faster than pyright)
|
|
5
|
+
- ty: Python type verification tool (experimental)
|
|
6
|
+
- pyrefly: Python type checking tool (experimental)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# ACB will auto-discover these adapters via depends.set() in module files
|
|
10
|
+
# No explicit imports needed here
|
|
11
|
+
|
|
12
|
+
__all__ = []
|