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,402 @@
|
|
|
1
|
+
"""Pyrefly adapter for ACB QA framework - Python type checking tool.
|
|
2
|
+
|
|
3
|
+
Pyrefly is a Python type checking tool that provides static type analysis
|
|
4
|
+
for Python code. It offers:
|
|
5
|
+
- Static type checking
|
|
6
|
+
- Type inference
|
|
7
|
+
- Generic type validation
|
|
8
|
+
- Protocol compliance checking
|
|
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-6b2c-7d3e-8f4a-b5c6d7e8f9a2"
|
|
42
|
+
) # Static UUID7 for reproducible module identity
|
|
43
|
+
MODULE_STATUS = "experimental"
|
|
44
|
+
|
|
45
|
+
# Module-level logger for structured logging
|
|
46
|
+
logger = logging.getLogger(__name__)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class PyreflySettings(ToolAdapterSettings):
|
|
50
|
+
"""Settings for Pyrefly adapter."""
|
|
51
|
+
|
|
52
|
+
tool_name: str = "pyrefly"
|
|
53
|
+
use_json_output: bool = True
|
|
54
|
+
strict_mode: bool = False
|
|
55
|
+
ignore_missing_imports: bool = False
|
|
56
|
+
follow_imports: str = "normal" # normal, skip, silent
|
|
57
|
+
incremental: bool = True
|
|
58
|
+
warn_unused_ignores: bool = True
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class PyreflyAdapter(BaseToolAdapter):
|
|
62
|
+
"""Adapter for Pyrefly - Python type checking tool.
|
|
63
|
+
|
|
64
|
+
Performs static type analysis with:
|
|
65
|
+
- Type checking for Python code
|
|
66
|
+
- Type inference and validation
|
|
67
|
+
- Generic type support
|
|
68
|
+
- Protocol compliance checking
|
|
69
|
+
|
|
70
|
+
Features:
|
|
71
|
+
- JSON output for structured error reporting
|
|
72
|
+
- Incremental type checking
|
|
73
|
+
- Strict mode for enhanced type safety
|
|
74
|
+
- Import following configuration
|
|
75
|
+
|
|
76
|
+
Example:
|
|
77
|
+
```python
|
|
78
|
+
settings = PyreflySettings(
|
|
79
|
+
strict_mode=True,
|
|
80
|
+
follow_imports="normal",
|
|
81
|
+
incremental=True,
|
|
82
|
+
)
|
|
83
|
+
adapter = PyreflyAdapter(settings=settings)
|
|
84
|
+
await adapter.init()
|
|
85
|
+
result = await adapter.check(files=[Path("src/")])
|
|
86
|
+
```
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
settings: PyreflySettings | None = None
|
|
90
|
+
|
|
91
|
+
def __init__(self, settings: PyreflySettings | None = None) -> None:
|
|
92
|
+
"""Initialize Pyrefly adapter.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
settings: Optional settings override
|
|
96
|
+
"""
|
|
97
|
+
super().__init__(settings=settings)
|
|
98
|
+
logger.debug(
|
|
99
|
+
"PyreflyAdapter initialized", extra={"has_settings": settings is not None}
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
async def init(self) -> None:
|
|
103
|
+
"""Initialize adapter with default settings."""
|
|
104
|
+
if not self.settings:
|
|
105
|
+
self.settings = PyreflySettings()
|
|
106
|
+
logger.info("Using default PyreflySettings")
|
|
107
|
+
await super().init()
|
|
108
|
+
logger.debug(
|
|
109
|
+
"PyreflyAdapter initialization complete",
|
|
110
|
+
extra={
|
|
111
|
+
"strict_mode": self.settings.strict_mode,
|
|
112
|
+
"incremental": self.settings.incremental,
|
|
113
|
+
"follow_imports": self.settings.follow_imports,
|
|
114
|
+
},
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def adapter_name(self) -> str:
|
|
119
|
+
"""Human-readable adapter name."""
|
|
120
|
+
return "Pyrefly (Type Check)"
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def module_id(self) -> UUID:
|
|
124
|
+
"""Reference to module-level MODULE_ID."""
|
|
125
|
+
return MODULE_ID
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def tool_name(self) -> str:
|
|
129
|
+
"""CLI tool name."""
|
|
130
|
+
return "pyrefly"
|
|
131
|
+
|
|
132
|
+
def build_command(
|
|
133
|
+
self,
|
|
134
|
+
files: list[Path],
|
|
135
|
+
config: QACheckConfig | None = None,
|
|
136
|
+
) -> list[str]:
|
|
137
|
+
"""Build Pyrefly command.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
files: Files/directories to type check
|
|
141
|
+
config: Optional configuration override
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Command as list of strings
|
|
145
|
+
"""
|
|
146
|
+
if not self.settings:
|
|
147
|
+
raise RuntimeError("Settings not initialized")
|
|
148
|
+
|
|
149
|
+
cmd = [self.tool_name]
|
|
150
|
+
|
|
151
|
+
# JSON output
|
|
152
|
+
if self.settings.use_json_output:
|
|
153
|
+
cmd.extend(["--format", "json"])
|
|
154
|
+
|
|
155
|
+
# Strict mode
|
|
156
|
+
if self.settings.strict_mode:
|
|
157
|
+
cmd.append("--strict")
|
|
158
|
+
|
|
159
|
+
# Ignore missing imports
|
|
160
|
+
if self.settings.ignore_missing_imports:
|
|
161
|
+
cmd.append("--ignore-missing-imports")
|
|
162
|
+
|
|
163
|
+
# Follow imports
|
|
164
|
+
cmd.extend(["--follow-imports", self.settings.follow_imports])
|
|
165
|
+
|
|
166
|
+
# Incremental checking
|
|
167
|
+
if self.settings.incremental:
|
|
168
|
+
cmd.append("--incremental")
|
|
169
|
+
|
|
170
|
+
# Warn about unused type: ignore comments
|
|
171
|
+
if self.settings.warn_unused_ignores:
|
|
172
|
+
cmd.append("--warn-unused-ignores")
|
|
173
|
+
|
|
174
|
+
# Add targets
|
|
175
|
+
cmd.extend([str(f) for f in files])
|
|
176
|
+
|
|
177
|
+
logger.info(
|
|
178
|
+
"Built Pyrefly command",
|
|
179
|
+
extra={
|
|
180
|
+
"file_count": len(files),
|
|
181
|
+
"strict_mode": self.settings.strict_mode,
|
|
182
|
+
"incremental": self.settings.incremental,
|
|
183
|
+
"follow_imports": self.settings.follow_imports,
|
|
184
|
+
},
|
|
185
|
+
)
|
|
186
|
+
return cmd
|
|
187
|
+
|
|
188
|
+
async def parse_output(
|
|
189
|
+
self,
|
|
190
|
+
result: ToolExecutionResult,
|
|
191
|
+
) -> list[ToolIssue]:
|
|
192
|
+
"""Parse Pyrefly JSON output into standardized issues.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
result: Raw execution result from Pyrefly
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
List of parsed issues
|
|
199
|
+
"""
|
|
200
|
+
if not result.raw_output:
|
|
201
|
+
logger.debug("No output to parse")
|
|
202
|
+
return []
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
data = json.loads(result.raw_output)
|
|
206
|
+
logger.debug(
|
|
207
|
+
"Parsed Pyrefly JSON output",
|
|
208
|
+
extra={"files_count": len(data.get("files", []))},
|
|
209
|
+
)
|
|
210
|
+
except json.JSONDecodeError as e:
|
|
211
|
+
logger.debug(
|
|
212
|
+
"JSON parse failed, falling back to text parsing",
|
|
213
|
+
extra={"error": str(e), "output_preview": result.raw_output[:200]},
|
|
214
|
+
)
|
|
215
|
+
return self._parse_text_output(result.raw_output)
|
|
216
|
+
|
|
217
|
+
issues = []
|
|
218
|
+
|
|
219
|
+
# Pyrefly JSON format (similar to mypy):
|
|
220
|
+
# {
|
|
221
|
+
# "files": [
|
|
222
|
+
# {
|
|
223
|
+
# "path": "path/to/file.py",
|
|
224
|
+
# "errors": [
|
|
225
|
+
# {
|
|
226
|
+
# "line": 42,
|
|
227
|
+
# "column": 10,
|
|
228
|
+
# "message": "Incompatible types...",
|
|
229
|
+
# "severity": "error",
|
|
230
|
+
# "code": "assignment"
|
|
231
|
+
# }
|
|
232
|
+
# ]
|
|
233
|
+
# }
|
|
234
|
+
# ]
|
|
235
|
+
# }
|
|
236
|
+
|
|
237
|
+
for file_data in data.get("files", []):
|
|
238
|
+
file_path = Path(file_data.get("path", ""))
|
|
239
|
+
|
|
240
|
+
for error in file_data.get("errors", []):
|
|
241
|
+
issue = ToolIssue(
|
|
242
|
+
file_path=file_path,
|
|
243
|
+
line_number=error.get("line"),
|
|
244
|
+
column_number=error.get("column"),
|
|
245
|
+
message=error.get("message", ""),
|
|
246
|
+
code=error.get("code"),
|
|
247
|
+
severity=error.get("severity", "error"),
|
|
248
|
+
)
|
|
249
|
+
issues.append(issue)
|
|
250
|
+
|
|
251
|
+
logger.info(
|
|
252
|
+
"Parsed Pyrefly output",
|
|
253
|
+
extra={
|
|
254
|
+
"total_issues": len(issues),
|
|
255
|
+
"errors": sum(1 for i in issues if i.severity == "error"),
|
|
256
|
+
"warnings": sum(1 for i in issues if i.severity == "warning"),
|
|
257
|
+
"files_affected": len({str(i.file_path) for i in issues}),
|
|
258
|
+
},
|
|
259
|
+
)
|
|
260
|
+
return issues
|
|
261
|
+
|
|
262
|
+
def _parse_text_output(self, output: str) -> list[ToolIssue]:
|
|
263
|
+
"""Parse Pyrefly text output (fallback).
|
|
264
|
+
|
|
265
|
+
Args:
|
|
266
|
+
output: Text output from Pyrefly
|
|
267
|
+
|
|
268
|
+
Returns:
|
|
269
|
+
List of ToolIssue objects
|
|
270
|
+
"""
|
|
271
|
+
issues = []
|
|
272
|
+
lines = output.strip().split("\n")
|
|
273
|
+
|
|
274
|
+
for line in lines:
|
|
275
|
+
# Pyrefly text format: "file.py:10:5: error: Incompatible types..."
|
|
276
|
+
if ":" not in line:
|
|
277
|
+
continue
|
|
278
|
+
|
|
279
|
+
issue = self._parse_text_line(line)
|
|
280
|
+
if issue:
|
|
281
|
+
issues.append(issue)
|
|
282
|
+
|
|
283
|
+
logger.info(
|
|
284
|
+
"Parsed Pyrefly text output (fallback)",
|
|
285
|
+
extra={
|
|
286
|
+
"total_issues": len(issues),
|
|
287
|
+
"files_with_issues": len({str(i.file_path) for i in issues}),
|
|
288
|
+
},
|
|
289
|
+
)
|
|
290
|
+
return issues
|
|
291
|
+
|
|
292
|
+
def _parse_text_line(self, line: str) -> ToolIssue | None:
|
|
293
|
+
"""Parse a single text output line.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
line: Line of text output
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
ToolIssue if parsing successful, None otherwise
|
|
300
|
+
"""
|
|
301
|
+
parts = line.split(":", maxsplit=4)
|
|
302
|
+
if len(parts) < 4:
|
|
303
|
+
return None
|
|
304
|
+
|
|
305
|
+
try:
|
|
306
|
+
file_path = Path(parts[0].strip())
|
|
307
|
+
line_number = int(parts[1].strip())
|
|
308
|
+
column_number = (
|
|
309
|
+
int(parts[2].strip()) if parts[2].strip().isdigit() else None
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
severity_and_message = parts[3].strip() if len(parts) > 3 else ""
|
|
313
|
+
message = parts[4].strip() if len(parts) > 4 else ""
|
|
314
|
+
|
|
315
|
+
severity = self._parse_severity(severity_and_message)
|
|
316
|
+
message = self._extract_message(severity_and_message, message, severity)
|
|
317
|
+
|
|
318
|
+
return ToolIssue(
|
|
319
|
+
file_path=file_path,
|
|
320
|
+
line_number=line_number,
|
|
321
|
+
column_number=column_number,
|
|
322
|
+
message=message,
|
|
323
|
+
severity=severity,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
except (ValueError, IndexError):
|
|
327
|
+
return None
|
|
328
|
+
|
|
329
|
+
def _parse_severity(self, severity_and_message: str) -> str:
|
|
330
|
+
"""Parse severity from text line.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
severity_and_message: Part containing severity
|
|
334
|
+
|
|
335
|
+
Returns:
|
|
336
|
+
Severity level (error or warning)
|
|
337
|
+
"""
|
|
338
|
+
if severity_and_message.lower().startswith("warning"):
|
|
339
|
+
return "warning"
|
|
340
|
+
return "error"
|
|
341
|
+
|
|
342
|
+
def _extract_message(
|
|
343
|
+
self, severity_and_message: str, message: str, severity: str
|
|
344
|
+
) -> str:
|
|
345
|
+
"""Extract message from text line.
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
severity_and_message: Part containing severity and possibly message
|
|
349
|
+
message: Explicit message if present
|
|
350
|
+
severity: Parsed severity level
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
Extracted message
|
|
354
|
+
"""
|
|
355
|
+
if message:
|
|
356
|
+
return message
|
|
357
|
+
|
|
358
|
+
# Extract from severity_and_message
|
|
359
|
+
if severity_and_message.lower().startswith(severity):
|
|
360
|
+
return severity_and_message[len(severity) :].strip()
|
|
361
|
+
|
|
362
|
+
return severity_and_message
|
|
363
|
+
|
|
364
|
+
def _get_check_type(self) -> QACheckType:
|
|
365
|
+
"""Return type check type."""
|
|
366
|
+
return QACheckType.TYPE
|
|
367
|
+
|
|
368
|
+
def get_default_config(self) -> QACheckConfig:
|
|
369
|
+
"""Get default configuration for Pyrefly adapter.
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
QACheckConfig with sensible defaults
|
|
373
|
+
"""
|
|
374
|
+
from crackerjack.models.qa_config import QACheckConfig
|
|
375
|
+
|
|
376
|
+
return QACheckConfig(
|
|
377
|
+
check_id=MODULE_ID,
|
|
378
|
+
check_name=self.adapter_name,
|
|
379
|
+
check_type=QACheckType.TYPE,
|
|
380
|
+
enabled=False, # Disabled by default as experimental
|
|
381
|
+
file_patterns=["**/*.py"],
|
|
382
|
+
exclude_patterns=[
|
|
383
|
+
"**/.venv/**",
|
|
384
|
+
"**/venv/**",
|
|
385
|
+
"**/build/**",
|
|
386
|
+
"**/dist/**",
|
|
387
|
+
],
|
|
388
|
+
timeout_seconds=180, # Type checking can be slower
|
|
389
|
+
parallel_safe=True,
|
|
390
|
+
stage="comprehensive", # Type checking in comprehensive stage
|
|
391
|
+
settings={
|
|
392
|
+
"strict_mode": False,
|
|
393
|
+
"incremental": True,
|
|
394
|
+
"follow_imports": "normal",
|
|
395
|
+
"warn_unused_ignores": True,
|
|
396
|
+
},
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
# ACB Registration (REQUIRED at module level)
|
|
401
|
+
with suppress(Exception):
|
|
402
|
+
depends.set(PyreflyAdapter)
|