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,273 @@
|
|
|
1
|
+
"""Codespell adapter for ACB QA framework - spelling error detection.
|
|
2
|
+
|
|
3
|
+
Codespell checks for common spelling errors in code, comments, and documentation.
|
|
4
|
+
It helps maintain professional quality by catching:
|
|
5
|
+
- Typos in comments and docstrings
|
|
6
|
+
- Misspelled variable/function names
|
|
7
|
+
- Documentation errors
|
|
8
|
+
- Common spelling mistakes
|
|
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 output parsing
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import typing as t
|
|
20
|
+
from contextlib import suppress
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from uuid import UUID, uuid4
|
|
23
|
+
|
|
24
|
+
from acb.depends import depends
|
|
25
|
+
from pydantic import Field
|
|
26
|
+
|
|
27
|
+
from crackerjack.adapters._tool_adapter_base import (
|
|
28
|
+
BaseToolAdapter,
|
|
29
|
+
ToolAdapterSettings,
|
|
30
|
+
ToolExecutionResult,
|
|
31
|
+
ToolIssue,
|
|
32
|
+
)
|
|
33
|
+
from crackerjack.models.qa_results import QACheckType
|
|
34
|
+
|
|
35
|
+
if t.TYPE_CHECKING:
|
|
36
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
37
|
+
|
|
38
|
+
# ACB Module Registration (REQUIRED)
|
|
39
|
+
MODULE_ID = uuid4()
|
|
40
|
+
MODULE_STATUS = "stable"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class CodespellSettings(ToolAdapterSettings):
|
|
44
|
+
"""Settings for Codespell adapter."""
|
|
45
|
+
|
|
46
|
+
tool_name: str = "codespell"
|
|
47
|
+
use_json_output: bool = False # Codespell uses text output
|
|
48
|
+
fix_enabled: bool = False # Auto-fix spelling errors
|
|
49
|
+
skip_hidden: bool = True
|
|
50
|
+
ignore_words: list[str] = Field(default_factory=list)
|
|
51
|
+
ignore_words_file: Path | None = None
|
|
52
|
+
check_filenames: bool = False
|
|
53
|
+
quiet_level: int = 2 # Only show errors
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class CodespellAdapter(BaseToolAdapter):
|
|
57
|
+
"""Adapter for Codespell - spelling error checker.
|
|
58
|
+
|
|
59
|
+
Detects and optionally fixes common spelling mistakes:
|
|
60
|
+
- Comments and docstrings
|
|
61
|
+
- String literals
|
|
62
|
+
- Variable and function names (optional)
|
|
63
|
+
- Documentation files
|
|
64
|
+
|
|
65
|
+
Features:
|
|
66
|
+
- Auto-fix support
|
|
67
|
+
- Custom ignore words
|
|
68
|
+
- Configurable scanning scope
|
|
69
|
+
- Multiple file type support
|
|
70
|
+
|
|
71
|
+
Example:
|
|
72
|
+
```python
|
|
73
|
+
settings = CodespellSettings(
|
|
74
|
+
fix_enabled=True,
|
|
75
|
+
ignore_words=["acb", "pydantic"],
|
|
76
|
+
skip_hidden=True,
|
|
77
|
+
)
|
|
78
|
+
adapter = CodespellAdapter(settings=settings)
|
|
79
|
+
await adapter.init()
|
|
80
|
+
result = await adapter.check(files=[Path("src/"), Path("docs/")])
|
|
81
|
+
```
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
settings: CodespellSettings | None = None
|
|
85
|
+
|
|
86
|
+
def __init__(self, settings: CodespellSettings | None = None) -> None:
|
|
87
|
+
"""Initialize Codespell adapter.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
settings: Optional settings override
|
|
91
|
+
"""
|
|
92
|
+
super().__init__(settings=settings)
|
|
93
|
+
|
|
94
|
+
async def init(self) -> None:
|
|
95
|
+
"""Initialize adapter with default settings."""
|
|
96
|
+
if not self.settings:
|
|
97
|
+
self.settings = await CodespellSettings.create_async()
|
|
98
|
+
await super().init()
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def adapter_name(self) -> str:
|
|
102
|
+
"""Human-readable adapter name."""
|
|
103
|
+
return "Codespell (Spelling)"
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def module_id(self) -> UUID:
|
|
107
|
+
"""Reference to module-level MODULE_ID."""
|
|
108
|
+
return MODULE_ID
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def tool_name(self) -> str:
|
|
112
|
+
"""CLI tool name."""
|
|
113
|
+
return "codespell"
|
|
114
|
+
|
|
115
|
+
def build_command(
|
|
116
|
+
self,
|
|
117
|
+
files: list[Path],
|
|
118
|
+
config: QACheckConfig | None = None,
|
|
119
|
+
) -> list[str]:
|
|
120
|
+
"""Build Codespell command.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
files: Files/directories to check
|
|
124
|
+
config: Optional configuration override
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Command as list of strings
|
|
128
|
+
"""
|
|
129
|
+
if not self.settings:
|
|
130
|
+
raise RuntimeError("Settings not initialized")
|
|
131
|
+
|
|
132
|
+
cmd = [self.tool_name]
|
|
133
|
+
|
|
134
|
+
# Auto-fix
|
|
135
|
+
if self.settings.fix_enabled:
|
|
136
|
+
cmd.append("--write-changes")
|
|
137
|
+
|
|
138
|
+
# Skip hidden files
|
|
139
|
+
if self.settings.skip_hidden:
|
|
140
|
+
cmd.append("--skip=.*")
|
|
141
|
+
|
|
142
|
+
# Ignore specific words
|
|
143
|
+
if self.settings.ignore_words:
|
|
144
|
+
cmd.extend(["--ignore-words-list", ",".join(self.settings.ignore_words)])
|
|
145
|
+
|
|
146
|
+
# Ignore words file
|
|
147
|
+
if self.settings.ignore_words_file and self.settings.ignore_words_file.exists():
|
|
148
|
+
cmd.extend(["--ignore-words", str(self.settings.ignore_words_file)])
|
|
149
|
+
|
|
150
|
+
# Check filenames
|
|
151
|
+
if self.settings.check_filenames:
|
|
152
|
+
cmd.append("--check-filenames")
|
|
153
|
+
|
|
154
|
+
# Quiet level
|
|
155
|
+
cmd.extend(["--quiet-level", str(self.settings.quiet_level)])
|
|
156
|
+
|
|
157
|
+
# Add targets
|
|
158
|
+
cmd.extend([str(f) for f in files])
|
|
159
|
+
|
|
160
|
+
return cmd
|
|
161
|
+
|
|
162
|
+
def _parse_codespell_line(
|
|
163
|
+
self, line: str
|
|
164
|
+
) -> tuple[Path | None, int | None, str, str | None] | None:
|
|
165
|
+
"""Parse a single line from codespell output.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
line: A line from codespell output
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
Tuple of (file_path, line_number, message, suggestion) or None if parsing fails
|
|
172
|
+
"""
|
|
173
|
+
# Codespell format: "file.py:10: tyop ==> typo"
|
|
174
|
+
if ":" not in line or "==>" not in line:
|
|
175
|
+
return None
|
|
176
|
+
|
|
177
|
+
parts = line.split(":", maxsplit=2)
|
|
178
|
+
if len(parts) < 2:
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
file_path = Path(parts[0].strip())
|
|
182
|
+
line_number = int(parts[1].strip()) if parts[1].strip().isdigit() else None
|
|
183
|
+
|
|
184
|
+
# Parse error and suggestion
|
|
185
|
+
error_part = parts[2].strip() if len(parts) > 2 else line
|
|
186
|
+
if "==>" in error_part:
|
|
187
|
+
wrong, correct = error_part.split("==>", maxsplit=1)
|
|
188
|
+
wrong = wrong.strip()
|
|
189
|
+
correct = correct.strip()
|
|
190
|
+
|
|
191
|
+
message = f"Spelling: '{wrong}' should be '{correct}'"
|
|
192
|
+
suggestion = f"Replace '{wrong}' with '{correct}'"
|
|
193
|
+
else:
|
|
194
|
+
message = error_part
|
|
195
|
+
suggestion = None
|
|
196
|
+
|
|
197
|
+
return file_path, line_number, message, suggestion
|
|
198
|
+
|
|
199
|
+
async def parse_output(
|
|
200
|
+
self,
|
|
201
|
+
result: ToolExecutionResult,
|
|
202
|
+
) -> list[ToolIssue]:
|
|
203
|
+
"""Parse Codespell text output into standardized issues.
|
|
204
|
+
|
|
205
|
+
Args:
|
|
206
|
+
result: Raw execution result from Codespell
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
List of parsed issues
|
|
210
|
+
"""
|
|
211
|
+
if not result.raw_output:
|
|
212
|
+
return []
|
|
213
|
+
|
|
214
|
+
issues = []
|
|
215
|
+
lines = result.raw_output.strip().split("\n")
|
|
216
|
+
|
|
217
|
+
for line in lines:
|
|
218
|
+
parsed_result = self._parse_codespell_line(line)
|
|
219
|
+
if parsed_result is not None:
|
|
220
|
+
file_path, line_number, message, suggestion = parsed_result
|
|
221
|
+
|
|
222
|
+
issue = ToolIssue(
|
|
223
|
+
file_path=file_path,
|
|
224
|
+
line_number=line_number,
|
|
225
|
+
message=message,
|
|
226
|
+
code="SPELLING",
|
|
227
|
+
severity="warning",
|
|
228
|
+
suggestion=suggestion,
|
|
229
|
+
)
|
|
230
|
+
issues.append(issue)
|
|
231
|
+
|
|
232
|
+
return issues
|
|
233
|
+
|
|
234
|
+
def _get_check_type(self) -> QACheckType:
|
|
235
|
+
"""Return format check type."""
|
|
236
|
+
return QACheckType.FORMAT
|
|
237
|
+
|
|
238
|
+
def get_default_config(self) -> QACheckConfig:
|
|
239
|
+
"""Get default configuration for Codespell adapter.
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
QACheckConfig with sensible defaults
|
|
243
|
+
"""
|
|
244
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
245
|
+
|
|
246
|
+
return QACheckConfig(
|
|
247
|
+
check_id=MODULE_ID,
|
|
248
|
+
check_name=self.adapter_name,
|
|
249
|
+
check_type=QACheckType.FORMAT,
|
|
250
|
+
enabled=True,
|
|
251
|
+
file_patterns=["**/*.py", "**/*.md", "**/*.rst", "**/*.txt"],
|
|
252
|
+
exclude_patterns=[
|
|
253
|
+
"**/.git/**",
|
|
254
|
+
"**/.venv/**",
|
|
255
|
+
"**/node_modules/**",
|
|
256
|
+
"**/__pycache__/**",
|
|
257
|
+
],
|
|
258
|
+
timeout_seconds=60,
|
|
259
|
+
is_formatter=False, # Only checks, doesn't format
|
|
260
|
+
parallel_safe=True,
|
|
261
|
+
stage="fast", # Spelling checks in fast stage
|
|
262
|
+
settings={
|
|
263
|
+
"fix_enabled": False,
|
|
264
|
+
"skip_hidden": True,
|
|
265
|
+
"ignore_words": ["acb", "pydantic", "uuid"],
|
|
266
|
+
"check_filenames": False,
|
|
267
|
+
},
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
# ACB Registration (REQUIRED at module level)
|
|
272
|
+
with suppress(Exception):
|
|
273
|
+
depends.set(CodespellAdapter)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [LSP](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# LSP Adapters
|
|
4
|
+
|
|
5
|
+
Rust-backed tools with Language Server Protocol integration for fast, incremental diagnostics.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
- Shared base (`_base.py`) defines `Issue`/`ToolResult` and adapter protocol
|
|
10
|
+
- Optional LSP paths for low-latency diagnostics, with CLI fallback
|
|
11
|
+
- Useful for continuous analysis in editors and orchestrated runs
|
|
12
|
+
|
|
13
|
+
## Built-in Implementations
|
|
14
|
+
|
|
15
|
+
| Module | Description | LSP | Status |
|
|
16
|
+
| ------ | ----------- | --- | ------ |
|
|
17
|
+
| `zuban.py` | Ultra-fast Python type checking with LSP and CLI fallback | Yes | Stable |
|
|
18
|
+
| `skylos.py` | Dead code detection with JSON/text parsing | N/A | Stable |
|
|
19
|
+
|
|
20
|
+
Support modules:
|
|
21
|
+
|
|
22
|
+
- `_client.py` — Optimized Zuban LSP client wrapper
|
|
23
|
+
- `_manager.py` — LSP process and workspace lifecycle helpers
|
|
24
|
+
- `_base.py` — Common protocol types and base adapter
|
|
25
|
+
|
|
26
|
+
## Zuban (LSP) Usage
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from crackerjack.adapters.lsp.zuban import ZubanAdapter
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def typecheck_with_lsp(ctx) -> None:
|
|
34
|
+
adapter = ZubanAdapter(context=ctx, strict_mode=True, use_lsp=True)
|
|
35
|
+
result = await adapter.check_with_lsp_or_fallback([Path("src/")])
|
|
36
|
+
print("errors:", result.error_count, "warnings:", result.warning_count)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
CLI helpers are available to manage Zuban LSP via `python -m crackerjack` options (start/stop/restart).
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
- LSP improves iteration speed; adapters transparently fall back to CLI
|
|
44
|
+
- Some Zuban builds may have TOML parsing issues; health checks guard usage
|
|
45
|
+
|
|
46
|
+
## Related
|
|
47
|
+
|
|
48
|
+
- [Type](<../type/README.md>) — Non-LSP type checkers and settings
|
|
49
|
+
- [Refactor](<../refactor/README.md>) — Skylos-based dead code detection
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""LSP adapter consolidation for Rust-based analysis tools.
|
|
2
|
+
|
|
3
|
+
This module consolidates all LSP-related adapter functionality:
|
|
4
|
+
- Zuban: Type checking with LSP integration
|
|
5
|
+
- Skylos: Dead code detection
|
|
6
|
+
- Base protocols and tool result structures
|
|
7
|
+
- Manager for coordinating multiple tools
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from ._base import BaseRustToolAdapter, Issue, RustToolAdapter, ToolResult
|
|
11
|
+
from ._client import ZubanLSPClient
|
|
12
|
+
from ._manager import RustToolHookManager
|
|
13
|
+
from .skylos import DeadCodeIssue, SkylosAdapter
|
|
14
|
+
from .zuban import TypeIssue, ZubanAdapter
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"RustToolAdapter",
|
|
18
|
+
"BaseRustToolAdapter",
|
|
19
|
+
"ToolResult",
|
|
20
|
+
"Issue",
|
|
21
|
+
"SkylosAdapter",
|
|
22
|
+
"DeadCodeIssue",
|
|
23
|
+
"ZubanAdapter",
|
|
24
|
+
"TypeIssue",
|
|
25
|
+
"RustToolHookManager",
|
|
26
|
+
"ZubanLSPClient",
|
|
27
|
+
]
|
|
@@ -5,9 +5,9 @@ import time
|
|
|
5
5
|
import typing as t
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
-
from .
|
|
9
|
-
from .
|
|
10
|
-
from .
|
|
8
|
+
from ._base import BaseRustToolAdapter, ToolResult
|
|
9
|
+
from .skylos import SkylosAdapter
|
|
10
|
+
from .zuban import ZubanAdapter
|
|
11
11
|
|
|
12
12
|
if t.TYPE_CHECKING:
|
|
13
13
|
from crackerjack.orchestration.execution_strategies import ExecutionContext
|
|
@@ -4,7 +4,7 @@ import typing as t
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
|
-
from .
|
|
7
|
+
from ._base import BaseRustToolAdapter, Issue, ToolResult
|
|
8
8
|
|
|
9
9
|
if t.TYPE_CHECKING:
|
|
10
10
|
from crackerjack.orchestration.execution_strategies import ExecutionContext
|
|
@@ -38,7 +38,7 @@ class SkylosAdapter(BaseRustToolAdapter):
|
|
|
38
38
|
def __init__(
|
|
39
39
|
self,
|
|
40
40
|
context: "ExecutionContext",
|
|
41
|
-
confidence_threshold: int =
|
|
41
|
+
confidence_threshold: int = 99, # Higher threshold to reduce false positives in DI system
|
|
42
42
|
web_dashboard_port: int = 5090,
|
|
43
43
|
) -> None:
|
|
44
44
|
"""Initialize Skylos adapter."""
|
|
@@ -56,7 +56,14 @@ class SkylosAdapter(BaseRustToolAdapter):
|
|
|
56
56
|
|
|
57
57
|
def get_command_args(self, target_files: list[Path]) -> list[str]:
|
|
58
58
|
"""Get command arguments for Skylos execution."""
|
|
59
|
-
|
|
59
|
+
# Use higher confidence threshold to avoid false positives from DI system
|
|
60
|
+
args = [
|
|
61
|
+
"uv",
|
|
62
|
+
"run",
|
|
63
|
+
"skylos",
|
|
64
|
+
"--confidence",
|
|
65
|
+
str(max(95, self.confidence_threshold)),
|
|
66
|
+
]
|
|
60
67
|
|
|
61
68
|
# Add JSON mode for AI agents
|
|
62
69
|
if self._should_use_json_output():
|
|
@@ -66,14 +73,59 @@ class SkylosAdapter(BaseRustToolAdapter):
|
|
|
66
73
|
if self.context.interactive:
|
|
67
74
|
args.extend(["--web", "--port", str(self.web_dashboard_port)])
|
|
68
75
|
|
|
69
|
-
# Add target files or
|
|
76
|
+
# Add target files or determine the appropriate target directory
|
|
70
77
|
if target_files:
|
|
71
78
|
args.extend(str(f) for f in target_files)
|
|
72
79
|
else:
|
|
73
|
-
|
|
80
|
+
package_target = self._determine_package_target()
|
|
81
|
+
args.append(package_target)
|
|
74
82
|
|
|
75
83
|
return args
|
|
76
84
|
|
|
85
|
+
def _determine_package_target(self) -> str:
|
|
86
|
+
"""Determine the package target directory to scan."""
|
|
87
|
+
from pathlib import Path
|
|
88
|
+
|
|
89
|
+
# Look for package directory in common locations
|
|
90
|
+
cwd = Path.cwd()
|
|
91
|
+
package_name = self._get_package_name_from_pyproject(cwd)
|
|
92
|
+
|
|
93
|
+
if not package_name:
|
|
94
|
+
package_name = self._find_package_directory_with_init(cwd)
|
|
95
|
+
|
|
96
|
+
# Default to 'crackerjack' if nothing found
|
|
97
|
+
if not package_name:
|
|
98
|
+
package_name = "crackerjack"
|
|
99
|
+
|
|
100
|
+
return f"./{package_name}"
|
|
101
|
+
|
|
102
|
+
def _get_package_name_from_pyproject(self, cwd: Path) -> str | None:
|
|
103
|
+
"""Get package name from pyproject.toml."""
|
|
104
|
+
pyproject_path = cwd / "pyproject.toml"
|
|
105
|
+
if not pyproject_path.exists():
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
import tomllib
|
|
109
|
+
from contextlib import suppress
|
|
110
|
+
|
|
111
|
+
with suppress(Exception):
|
|
112
|
+
with pyproject_path.open("rb") as f:
|
|
113
|
+
data = tomllib.load(f)
|
|
114
|
+
project_name = data.get("project", {}).get("name")
|
|
115
|
+
if project_name:
|
|
116
|
+
return project_name.replace("-", "_")
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
def _find_package_directory_with_init(self, cwd: Path) -> str | None:
|
|
120
|
+
"""Find first directory with __init__.py in project root."""
|
|
121
|
+
excluded = {"tests", "docs", ".venv", "venv", "build", "dist"}
|
|
122
|
+
|
|
123
|
+
for item in cwd.iterdir():
|
|
124
|
+
if item.is_dir() and (item / "__init__.py").exists():
|
|
125
|
+
if item.name not in excluded:
|
|
126
|
+
return item.name
|
|
127
|
+
return None
|
|
128
|
+
|
|
77
129
|
def parse_output(self, output: str) -> ToolResult:
|
|
78
130
|
"""Parse Skylos output into standardized result."""
|
|
79
131
|
if self._should_use_json_output():
|
|
@@ -102,7 +154,7 @@ class SkylosAdapter(BaseRustToolAdapter):
|
|
|
102
154
|
for item in data.get("dead_code", [])
|
|
103
155
|
]
|
|
104
156
|
|
|
105
|
-
#
|
|
157
|
+
# For skylos, having dead code issues means the check failed (not success)
|
|
106
158
|
success = len(issues) == 0
|
|
107
159
|
|
|
108
160
|
return ToolResult(
|
|
@@ -141,7 +193,7 @@ class SkylosAdapter(BaseRustToolAdapter):
|
|
|
141
193
|
if issue:
|
|
142
194
|
issues.append(issue)
|
|
143
195
|
|
|
144
|
-
#
|
|
196
|
+
# For skylos, having ANY dead code issues means it failed the check
|
|
145
197
|
success = len(issues) == 0
|
|
146
198
|
|
|
147
199
|
return ToolResult(
|
|
@@ -6,14 +6,14 @@ from contextlib import suppress
|
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
|
-
from .
|
|
9
|
+
from ._base import BaseRustToolAdapter, Issue, ToolResult
|
|
10
10
|
|
|
11
11
|
if t.TYPE_CHECKING:
|
|
12
12
|
from crackerjack.orchestration.execution_strategies import ExecutionContext
|
|
13
13
|
from crackerjack.services.lsp_client import LSPClient
|
|
14
14
|
|
|
15
15
|
# Import the LSP client wrapper
|
|
16
|
-
from .
|
|
16
|
+
from ._client import ZubanLSPClient
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
@dataclass
|
|
@@ -111,12 +111,9 @@ class ZubanAdapter(BaseRustToolAdapter):
|
|
|
111
111
|
|
|
112
112
|
try:
|
|
113
113
|
# Import here to avoid circular imports
|
|
114
|
-
from rich.console import Console
|
|
115
|
-
|
|
116
114
|
from crackerjack.services.lsp_client import LSPClient
|
|
117
115
|
|
|
118
|
-
|
|
119
|
-
self._lsp_client = LSPClient(console=console)
|
|
116
|
+
self._lsp_client = LSPClient()
|
|
120
117
|
self._lsp_available = self._lsp_client.is_server_running()
|
|
121
118
|
|
|
122
119
|
except ImportError:
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../../README.md>) | [Adapters](<../README.md>) | [Refactor](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Refactor Adapters
|
|
4
|
+
|
|
5
|
+
Modernization and dead-code tooling to simplify code and reduce risk.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
- Suggest idiomatic patterns and cleanups (Refurb)
|
|
10
|
+
- Identify unused dependencies (Creosote)
|
|
11
|
+
- Detect dead code for deletion (Skylos)
|
|
12
|
+
|
|
13
|
+
## Built-in Implementations
|
|
14
|
+
|
|
15
|
+
| Module | Description | Status |
|
|
16
|
+
| ------ | ----------- | ------ |
|
|
17
|
+
| `refurb.py` | Refactoring suggestions for modern Python idioms | Stable |
|
|
18
|
+
| `creosote.py` | Detects unused dependencies in `pyproject.toml`/`requirements*.txt` | Stable |
|
|
19
|
+
| `skylos.py` | Dead code detection (text/JSON parsing) | Stable |
|
|
20
|
+
|
|
21
|
+
## Examples
|
|
22
|
+
|
|
23
|
+
Refurb:
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from crackerjack.adapters.refactor.refurb import RefurbAdapter, RefurbSettings
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def suggest_refactors() -> None:
|
|
31
|
+
adapter = RefurbAdapter(settings=RefurbSettings(explain=True))
|
|
32
|
+
await adapter.init()
|
|
33
|
+
result = await adapter.check(files=[Path("src/")])
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Creosote:
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
from crackerjack.adapters.refactor.creosote import CreosoteAdapter, CreosoteSettings
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
async def find_unused_deps() -> None:
|
|
44
|
+
adapter = CreosoteAdapter(
|
|
45
|
+
settings=CreosoteSettings(config_file=Path("pyproject.toml"))
|
|
46
|
+
)
|
|
47
|
+
await adapter.init()
|
|
48
|
+
result = await adapter.check()
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Notes
|
|
52
|
+
|
|
53
|
+
- Treat Refurb suggestions as warnings; human review recommended
|
|
54
|
+
- Exclude dev/build tools in Creosote to avoid false positives
|
|
55
|
+
|
|
56
|
+
## Related
|
|
57
|
+
|
|
58
|
+
- [Complexity](<../complexity/README.md>) — Use complexity reports to target refactors
|
|
59
|
+
- [Format](<../format/README.md>) — Formatting changes often enable simpler refactors
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Refactor adapters for code improvement suggestions.
|
|
2
|
+
|
|
3
|
+
Adapters:
|
|
4
|
+
- refurb: Modern Python best practices and idiom suggestions
|
|
5
|
+
- creosote: Unused dependency detection
|
|
6
|
+
- skylos: Dead code detection (unused imports, functions, classes, variables)
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# ACB will auto-discover these adapters via depends.set() in module files
|
|
10
|
+
# No explicit imports needed here
|
|
11
|
+
|
|
12
|
+
__all__ = []
|