crackerjack 0.18.2__py3-none-any.whl → 0.45.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +96 -2
- crackerjack/__main__.py +637 -138
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +39 -0
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/lsp/_base.py +194 -0
- crackerjack/adapters/lsp/_client.py +358 -0
- crackerjack/adapters/lsp/_manager.py +193 -0
- crackerjack/adapters/lsp/skylos.py +283 -0
- crackerjack/adapters/lsp/zuban.py +557 -0
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +66 -0
- crackerjack/agents/architect_agent.py +238 -0
- crackerjack/agents/base.py +167 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +600 -0
- crackerjack/agents/documentation_agent.py +520 -0
- crackerjack/agents/dry_agent.py +585 -0
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +230 -0
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/import_optimization_agent.py +1181 -0
- crackerjack/agents/performance_agent.py +325 -0
- crackerjack/agents/performance_helpers.py +205 -0
- crackerjack/agents/proactive_agent.py +55 -0
- crackerjack/agents/refactoring_agent.py +511 -0
- crackerjack/agents/refactoring_helpers.py +247 -0
- crackerjack/agents/security_agent.py +793 -0
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +570 -0
- crackerjack/agents/test_specialist_agent.py +526 -0
- crackerjack/agents/tracker.py +110 -0
- crackerjack/api.py +647 -0
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +24 -0
- crackerjack/cli/cache_handlers.py +209 -0
- crackerjack/cli/cache_handlers_enhanced.py +680 -0
- crackerjack/cli/facade.py +162 -0
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +700 -0
- crackerjack/cli/interactive.py +488 -0
- crackerjack/cli/options.py +1216 -0
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/utils.py +19 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +1307 -0
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +275 -0
- crackerjack/config/global_lock_config.py +207 -0
- crackerjack/config/hooks.py +390 -0
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/__init__.py +0 -0
- crackerjack/core/async_workflow_orchestrator.py +738 -0
- crackerjack/core/autofix_coordinator.py +282 -0
- crackerjack/core/container.py +105 -0
- crackerjack/core/enhanced_container.py +583 -0
- crackerjack/core/file_lifecycle.py +472 -0
- crackerjack/core/performance.py +244 -0
- crackerjack/core/performance_monitor.py +357 -0
- crackerjack/core/phase_coordinator.py +1227 -0
- crackerjack/core/proactive_workflow.py +267 -0
- crackerjack/core/resource_manager.py +425 -0
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +601 -0
- crackerjack/core/session_coordinator.py +239 -0
- crackerjack/core/timeout_manager.py +563 -0
- crackerjack/core/websocket_lifecycle.py +410 -0
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +2243 -0
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/INDEX.md +11 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/API_REFERENCE.md +10895 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +109 -0
- crackerjack/docs/generated/api/CROSS_REFERENCES.md +1755 -0
- crackerjack/docs/generated/api/PROTOCOLS.md +3 -0
- crackerjack/docs/generated/api/SERVICES.md +1252 -0
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/__init__.py +31 -0
- crackerjack/documentation/ai_templates.py +756 -0
- crackerjack/documentation/dual_output_generator.py +767 -0
- crackerjack/documentation/mkdocs_integration.py +518 -0
- crackerjack/documentation/reference_generator.py +1065 -0
- crackerjack/dynamic_config.py +678 -0
- crackerjack/errors.py +378 -0
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +13 -0
- crackerjack/executors/async_hook_executor.py +938 -0
- crackerjack/executors/cached_hook_executor.py +316 -0
- crackerjack/executors/hook_executor.py +1295 -0
- crackerjack/executors/hook_lock_manager.py +708 -0
- crackerjack/executors/individual_hook_executor.py +739 -0
- crackerjack/executors/lsp_aware_hook_executor.py +349 -0
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +433 -0
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +93 -0
- crackerjack/intelligence/README.md +557 -0
- crackerjack/intelligence/__init__.py +37 -0
- crackerjack/intelligence/adaptive_learning.py +693 -0
- crackerjack/intelligence/agent_orchestrator.py +485 -0
- crackerjack/intelligence/agent_registry.py +377 -0
- crackerjack/intelligence/agent_selector.py +439 -0
- crackerjack/intelligence/integration.py +250 -0
- crackerjack/interactive.py +719 -0
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/__init__.py +11 -0
- crackerjack/managers/async_hook_manager.py +135 -0
- crackerjack/managers/hook_manager.py +585 -0
- crackerjack/managers/publish_manager.py +631 -0
- crackerjack/managers/test_command_builder.py +391 -0
- crackerjack/managers/test_executor.py +474 -0
- crackerjack/managers/test_manager.py +1357 -0
- crackerjack/managers/test_progress.py +187 -0
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/__init__.py +0 -0
- crackerjack/mcp/cache.py +352 -0
- crackerjack/mcp/client_runner.py +121 -0
- crackerjack/mcp/context.py +802 -0
- crackerjack/mcp/dashboard.py +657 -0
- crackerjack/mcp/enhanced_progress_monitor.py +493 -0
- crackerjack/mcp/file_monitor.py +394 -0
- crackerjack/mcp/progress_components.py +607 -0
- crackerjack/mcp/progress_monitor.py +1016 -0
- crackerjack/mcp/rate_limiter.py +336 -0
- crackerjack/mcp/server.py +24 -0
- crackerjack/mcp/server_core.py +526 -0
- crackerjack/mcp/service_watchdog.py +505 -0
- crackerjack/mcp/state.py +407 -0
- crackerjack/mcp/task_manager.py +259 -0
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +19 -0
- crackerjack/mcp/tools/core_tools.py +469 -0
- crackerjack/mcp/tools/error_analyzer.py +283 -0
- crackerjack/mcp/tools/execution_tools.py +384 -0
- crackerjack/mcp/tools/intelligence_tool_registry.py +46 -0
- crackerjack/mcp/tools/intelligence_tools.py +264 -0
- crackerjack/mcp/tools/monitoring_tools.py +628 -0
- crackerjack/mcp/tools/proactive_tools.py +367 -0
- crackerjack/mcp/tools/progress_tools.py +222 -0
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +358 -0
- crackerjack/mcp/tools/workflow_executor.py +699 -0
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/__init__.py +14 -0
- crackerjack/mcp/websocket/app.py +54 -0
- crackerjack/mcp/websocket/endpoints.py +492 -0
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +406 -0
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +21 -0
- crackerjack/mcp/websocket/server.py +174 -0
- crackerjack/mcp/websocket/websocket_handler.py +276 -0
- crackerjack/mcp/websocket_server.py +10 -0
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +40 -0
- crackerjack/models/config.py +730 -0
- crackerjack/models/config_adapter.py +265 -0
- crackerjack/models/protocols.py +1535 -0
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/resource_protocols.py +299 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +173 -0
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/__init__.py +0 -0
- crackerjack/monitoring/ai_agent_watchdog.py +405 -0
- crackerjack/monitoring/metrics_collector.py +427 -0
- crackerjack/monitoring/regression_prevention.py +580 -0
- crackerjack/monitoring/websocket_server.py +406 -0
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +894 -0
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +180 -0
- crackerjack/orchestration/execution_strategies.py +361 -0
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +647 -0
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/__init__.py +15 -0
- crackerjack/plugins/base.py +200 -0
- crackerjack/plugins/hooks.py +254 -0
- crackerjack/plugins/loader.py +335 -0
- crackerjack/plugins/managers.py +264 -0
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/security/__init__.py +0 -0
- crackerjack/security/audit.py +197 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +9 -0
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/ai/contextual_ai_assistant.py +542 -0
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/anomaly_detector.py +392 -0
- crackerjack/services/api_extractor.py +617 -0
- crackerjack/services/backup_service.py +467 -0
- crackerjack/services/bounded_status_operations.py +530 -0
- crackerjack/services/cache.py +369 -0
- crackerjack/services/changelog_automation.py +399 -0
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +132 -0
- crackerjack/services/config_merge.py +546 -0
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +493 -0
- crackerjack/services/coverage_badge_service.py +173 -0
- crackerjack/services/coverage_ratchet.py +381 -0
- crackerjack/services/debug.py +733 -0
- crackerjack/services/dependency_analyzer.py +460 -0
- crackerjack/services/dependency_monitor.py +622 -0
- crackerjack/services/documentation_generator.py +493 -0
- crackerjack/services/documentation_service.py +704 -0
- crackerjack/services/enhanced_filesystem.py +497 -0
- crackerjack/services/enterprise_optimizer.py +865 -0
- crackerjack/services/error_pattern_analyzer.py +676 -0
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +149 -0
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +381 -0
- crackerjack/services/git.py +422 -0
- crackerjack/services/health_metrics.py +615 -0
- crackerjack/services/heatmap_generator.py +744 -0
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +823 -0
- crackerjack/services/input_validator.py +668 -0
- crackerjack/services/intelligent_commit.py +327 -0
- crackerjack/services/log_manager.py +289 -0
- crackerjack/services/logging.py +228 -0
- crackerjack/services/lsp_client.py +628 -0
- crackerjack/services/memory_optimizer.py +414 -0
- crackerjack/services/metrics.py +587 -0
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/monitoring/performance_benchmarks.py +410 -0
- crackerjack/services/monitoring/performance_cache.py +388 -0
- crackerjack/services/monitoring/performance_monitor.py +569 -0
- crackerjack/services/parallel_executor.py +527 -0
- crackerjack/services/pattern_cache.py +333 -0
- crackerjack/services/pattern_detector.py +478 -0
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +523 -0
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/quality/quality_baseline.py +395 -0
- crackerjack/services/quality/quality_baseline_enhanced.py +649 -0
- crackerjack/services/quality/quality_intelligence.py +949 -0
- crackerjack/services/regex_patterns.py +58 -0
- crackerjack/services/regex_utils.py +483 -0
- crackerjack/services/secure_path_utils.py +524 -0
- crackerjack/services/secure_status_formatter.py +450 -0
- crackerjack/services/secure_subprocess.py +635 -0
- crackerjack/services/security.py +239 -0
- crackerjack/services/security_logger.py +495 -0
- crackerjack/services/server_manager.py +411 -0
- crackerjack/services/smart_scheduling.py +167 -0
- crackerjack/services/status_authentication.py +460 -0
- crackerjack/services/status_security_manager.py +315 -0
- crackerjack/services/terminal_utils.py +0 -0
- crackerjack/services/thread_safe_status_collector.py +441 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +43 -0
- crackerjack/services/unified_config.py +115 -0
- crackerjack/services/validation_rate_limiter.py +220 -0
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +461 -0
- crackerjack/services/version_checker.py +223 -0
- crackerjack/services/websocket_resource_limiter.py +438 -0
- crackerjack/services/zuban_lsp_service.py +391 -0
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/__init__.py +59 -0
- crackerjack/slash_commands/init.md +112 -0
- crackerjack/slash_commands/run.md +197 -0
- crackerjack/slash_commands/status.md +127 -0
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_input_validator_patterns.py +236 -0
- crackerjack/tools/validate_regex_patterns.py +188 -0
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/__init__.py +1 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- crackerjack-0.45.2.dist-info/METADATA +1678 -0
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack-0.45.2.dist-info/entry_points.txt +2 -0
- crackerjack/.gitignore +0 -14
- crackerjack/.libcst.codemod.yaml +0 -18
- crackerjack/.pdm.toml +0 -1
- crackerjack/.pre-commit-config.yaml +0 -91
- crackerjack/.pytest_cache/.gitignore +0 -2
- crackerjack/.pytest_cache/CACHEDIR.TAG +0 -4
- crackerjack/.pytest_cache/README.md +0 -8
- crackerjack/.pytest_cache/v/cache/nodeids +0 -1
- crackerjack/.pytest_cache/v/cache/stepwise +0 -1
- crackerjack/.ruff_cache/.gitignore +0 -1
- crackerjack/.ruff_cache/0.1.11/3256171999636029978 +0 -0
- crackerjack/.ruff_cache/0.1.14/602324811142551221 +0 -0
- crackerjack/.ruff_cache/0.1.4/10355199064880463147 +0 -0
- crackerjack/.ruff_cache/0.1.6/15140459877605758699 +0 -0
- crackerjack/.ruff_cache/0.1.7/1790508110482614856 +0 -0
- crackerjack/.ruff_cache/0.1.9/17041001205004563469 +0 -0
- crackerjack/.ruff_cache/0.11.2/4070660268492669020 +0 -0
- crackerjack/.ruff_cache/0.11.3/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.4/9818742842212983150 +0 -0
- crackerjack/.ruff_cache/0.11.6/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.7/10386934055395314831 +0 -0
- crackerjack/.ruff_cache/0.11.7/3557596832929915217 +0 -0
- crackerjack/.ruff_cache/0.11.8/530407680854991027 +0 -0
- crackerjack/.ruff_cache/0.2.0/10047773857155985907 +0 -0
- crackerjack/.ruff_cache/0.2.1/8522267973936635051 +0 -0
- crackerjack/.ruff_cache/0.2.2/18053836298936336950 +0 -0
- crackerjack/.ruff_cache/0.3.0/12548816621480535786 +0 -0
- crackerjack/.ruff_cache/0.3.3/11081883392474770722 +0 -0
- crackerjack/.ruff_cache/0.3.4/676973378459347183 +0 -0
- crackerjack/.ruff_cache/0.3.5/16311176246009842383 +0 -0
- crackerjack/.ruff_cache/0.5.7/1493622539551733492 +0 -0
- crackerjack/.ruff_cache/0.5.7/6231957614044513175 +0 -0
- crackerjack/.ruff_cache/0.5.7/9932762556785938009 +0 -0
- crackerjack/.ruff_cache/0.6.0/11982804814124138945 +0 -0
- crackerjack/.ruff_cache/0.6.0/12055761203849489982 +0 -0
- crackerjack/.ruff_cache/0.6.2/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.4/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.5/1206147804896221174 +0 -0
- crackerjack/.ruff_cache/0.6.7/3657366982708166874 +0 -0
- crackerjack/.ruff_cache/0.6.9/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.1/1024065805990144819 +0 -0
- crackerjack/.ruff_cache/0.7.1/285614542852677309 +0 -0
- crackerjack/.ruff_cache/0.7.3/16061516852537040135 +0 -0
- crackerjack/.ruff_cache/0.8.4/16354268377385700367 +0 -0
- crackerjack/.ruff_cache/0.9.10/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.10/923908772239632759 +0 -0
- crackerjack/.ruff_cache/0.9.3/13948373885254993391 +0 -0
- crackerjack/.ruff_cache/0.9.9/12813592349865671909 +0 -0
- crackerjack/.ruff_cache/0.9.9/8843823720003377982 +0 -0
- crackerjack/.ruff_cache/CACHEDIR.TAG +0 -1
- crackerjack/crackerjack.py +0 -855
- crackerjack/pyproject.toml +0 -214
- crackerjack-0.18.2.dist-info/METADATA +0 -420
- crackerjack-0.18.2.dist-info/RECORD +0 -59
- crackerjack-0.18.2.dist-info/entry_points.txt +0 -4
- {crackerjack-0.18.2.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from .core_tools import register_core_tools
|
|
2
|
+
from .execution_tools import register_execution_tools
|
|
3
|
+
from .intelligence_tool_registry import register_intelligence_tools
|
|
4
|
+
from .monitoring_tools import register_monitoring_tools
|
|
5
|
+
from .proactive_tools import register_proactive_tools
|
|
6
|
+
from .progress_tools import register_progress_tools
|
|
7
|
+
from .semantic_tools import register_semantic_tools
|
|
8
|
+
from .utility_tools import register_utility_tools
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"register_core_tools",
|
|
12
|
+
"register_execution_tools",
|
|
13
|
+
"register_intelligence_tools",
|
|
14
|
+
"register_monitoring_tools",
|
|
15
|
+
"register_progress_tools",
|
|
16
|
+
"register_proactive_tools",
|
|
17
|
+
"register_semantic_tools",
|
|
18
|
+
"register_utility_tools",
|
|
19
|
+
]
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import typing as t
|
|
2
|
+
|
|
3
|
+
from acb.depends import depends
|
|
4
|
+
|
|
5
|
+
from crackerjack.config import CrackerjackSettings
|
|
6
|
+
from crackerjack.mcp.context import MCPServerContext, get_context
|
|
7
|
+
from crackerjack.mcp.rate_limiter import RateLimitMiddleware
|
|
8
|
+
from crackerjack.services.input_validator import (
|
|
9
|
+
SecureInputValidator,
|
|
10
|
+
get_input_validator,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
if t.TYPE_CHECKING:
|
|
14
|
+
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def create_task_with_subagent(
|
|
18
|
+
description: str,
|
|
19
|
+
prompt: str,
|
|
20
|
+
subagent_type: str,
|
|
21
|
+
) -> dict[str, t.Any]:
|
|
22
|
+
try:
|
|
23
|
+
validator = get_input_validator()
|
|
24
|
+
|
|
25
|
+
desc_result = validator.validate_command_args(description)
|
|
26
|
+
if not desc_result.valid:
|
|
27
|
+
return {
|
|
28
|
+
"success": False,
|
|
29
|
+
"error": f"Invalid description: {desc_result.error_message}",
|
|
30
|
+
"validation_type": desc_result.validation_type,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
prompt_result = validator.validate_command_args(prompt)
|
|
34
|
+
if not prompt_result.valid:
|
|
35
|
+
return {
|
|
36
|
+
"success": False,
|
|
37
|
+
"error": f"Invalid prompt: {prompt_result.error_message}",
|
|
38
|
+
"validation_type": prompt_result.validation_type,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
subagent_result = validator.sanitizer.sanitize_string(
|
|
42
|
+
subagent_type, max_length=100, strict_alphanumeric=True
|
|
43
|
+
)
|
|
44
|
+
if not subagent_result.valid:
|
|
45
|
+
return {
|
|
46
|
+
"success": False,
|
|
47
|
+
"error": f"Invalid subagent_type: {subagent_result.error_message}",
|
|
48
|
+
"validation_type": subagent_result.validation_type,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
sanitized_description = desc_result.sanitized_value or description
|
|
52
|
+
sanitized_prompt = prompt_result.sanitized_value or prompt
|
|
53
|
+
sanitized_subagent = subagent_result.sanitized_value
|
|
54
|
+
|
|
55
|
+
result = {
|
|
56
|
+
"success": True,
|
|
57
|
+
"description": sanitized_description,
|
|
58
|
+
"prompt": sanitized_prompt,
|
|
59
|
+
"subagent_type": sanitized_subagent,
|
|
60
|
+
"result": f"Task would be executed by {sanitized_subagent}: {sanitized_prompt[:100]}...",
|
|
61
|
+
"agent_type": "user"
|
|
62
|
+
if sanitized_subagent
|
|
63
|
+
not in ("general-purpose", "statusline-setup", "output-style-setup")
|
|
64
|
+
else "system",
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return result
|
|
68
|
+
|
|
69
|
+
except Exception as e:
|
|
70
|
+
return {
|
|
71
|
+
"success": False,
|
|
72
|
+
"error": f"Task creation failed: {e}",
|
|
73
|
+
"description": description,
|
|
74
|
+
"subagent_type": subagent_type,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
async def _validate_stage_request(
|
|
79
|
+
context: MCPServerContext | None, rate_limiter: RateLimitMiddleware | None
|
|
80
|
+
) -> str | None:
|
|
81
|
+
if not context:
|
|
82
|
+
return '{"error": "Server context not available", "success": false}'
|
|
83
|
+
|
|
84
|
+
if rate_limiter and hasattr(rate_limiter, "check_request_allowed"):
|
|
85
|
+
allowed, details = await rate_limiter.check_request_allowed()
|
|
86
|
+
if not allowed:
|
|
87
|
+
return f'{{"error": "Rate limit exceeded: {details.get("reason", "unknown")}", "success": false}}'
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _parse_stage_args(args: str, kwargs: str) -> tuple[str, dict[str, t.Any]] | str:
|
|
92
|
+
try:
|
|
93
|
+
validator = get_input_validator()
|
|
94
|
+
|
|
95
|
+
stage_validation = _validate_stage_argument(validator, args)
|
|
96
|
+
if isinstance(stage_validation, str):
|
|
97
|
+
return stage_validation
|
|
98
|
+
stage = stage_validation
|
|
99
|
+
|
|
100
|
+
kwargs_validation = _validate_kwargs_argument(validator, kwargs)
|
|
101
|
+
if isinstance(kwargs_validation, str):
|
|
102
|
+
return kwargs_validation
|
|
103
|
+
extra_kwargs = kwargs_validation
|
|
104
|
+
|
|
105
|
+
return stage, extra_kwargs
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
return f'{{"error": "Stage argument parsing failed: {e}", "success": false}}'
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _validate_stage_argument(validator: SecureInputValidator, args: str) -> str:
|
|
112
|
+
stage_result = validator.sanitizer.sanitize_string(
|
|
113
|
+
args.strip(), max_length=50, strict_alphanumeric=True
|
|
114
|
+
)
|
|
115
|
+
if not stage_result.valid:
|
|
116
|
+
return f'{{"error": "Invalid stage argument: {stage_result.error_message}", "success": false}}'
|
|
117
|
+
|
|
118
|
+
stage: str = str(stage_result.sanitized_value).lower()
|
|
119
|
+
valid_stages = {"fast", "comprehensive", "tests", "cleaning", "init"}
|
|
120
|
+
|
|
121
|
+
if stage not in valid_stages:
|
|
122
|
+
return f'{{"error": "Invalid stage: {stage}. Valid stages: {valid_stages}", "success": false}}'
|
|
123
|
+
|
|
124
|
+
return stage
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _validate_kwargs_argument(
|
|
128
|
+
validator: SecureInputValidator, kwargs: str
|
|
129
|
+
) -> dict[str, t.Any] | str:
|
|
130
|
+
extra_kwargs: dict[str, t.Any] = {}
|
|
131
|
+
if not kwargs.strip():
|
|
132
|
+
return extra_kwargs
|
|
133
|
+
|
|
134
|
+
kwargs_result = validator.validate_json_payload(kwargs.strip())
|
|
135
|
+
if not kwargs_result.valid:
|
|
136
|
+
return f'{{"error": "Invalid JSON in kwargs: {kwargs_result.error_message}", "success": false}}'
|
|
137
|
+
|
|
138
|
+
extra_kwargs = kwargs_result.sanitized_value
|
|
139
|
+
|
|
140
|
+
if not isinstance(extra_kwargs, dict):
|
|
141
|
+
return f'{{"error": "kwargs must be a JSON object, got {type(extra_kwargs).__name__}", "success": false}}'
|
|
142
|
+
|
|
143
|
+
return extra_kwargs
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _configure_stage_options(stage: str) -> CrackerjackSettings:
|
|
147
|
+
"""Configure settings for a specific stage using ACB dependency injection.
|
|
148
|
+
|
|
149
|
+
Note: Returns a copy of global settings with stage-specific overrides.
|
|
150
|
+
The global settings remain unchanged.
|
|
151
|
+
"""
|
|
152
|
+
# Get base settings from DI
|
|
153
|
+
base_settings = depends.get_sync(CrackerjackSettings)
|
|
154
|
+
|
|
155
|
+
# Create a new settings instance with stage-specific values
|
|
156
|
+
# We copy the base settings and override specific fields
|
|
157
|
+
settings_dict = base_settings.model_dump()
|
|
158
|
+
|
|
159
|
+
if stage in {"fast", "comprehensive"}:
|
|
160
|
+
settings_dict["skip_hooks"] = False
|
|
161
|
+
elif stage == "tests":
|
|
162
|
+
settings_dict["run_tests"] = (
|
|
163
|
+
True # Note: field renamed from 'test' to 'run_tests'
|
|
164
|
+
)
|
|
165
|
+
elif stage == "cleaning":
|
|
166
|
+
settings_dict["clean"] = True
|
|
167
|
+
elif stage == "init":
|
|
168
|
+
settings_dict["skip_hooks"] = True
|
|
169
|
+
|
|
170
|
+
return CrackerjackSettings(**settings_dict)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def _execute_stage(
|
|
174
|
+
orchestrator: "WorkflowOrchestrator", stage: str, settings: CrackerjackSettings
|
|
175
|
+
) -> bool:
|
|
176
|
+
# Convert CrackerjackSettings to OptionsProtocol
|
|
177
|
+
adapted_options = _adapt_settings_to_protocol(settings)
|
|
178
|
+
|
|
179
|
+
if stage == "fast":
|
|
180
|
+
return orchestrator.run_fast_hooks_only(adapted_options)
|
|
181
|
+
if stage == "comprehensive":
|
|
182
|
+
return orchestrator.run_comprehensive_hooks_only(adapted_options)
|
|
183
|
+
if stage == "tests":
|
|
184
|
+
return orchestrator.run_testing_phase(adapted_options)
|
|
185
|
+
if stage == "cleaning":
|
|
186
|
+
return orchestrator.run_cleaning_phase(adapted_options)
|
|
187
|
+
return False
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _adapt_settings_to_protocol(settings: CrackerjackSettings) -> t.Any:
|
|
191
|
+
"""Adapt CrackerjackSettings to match OptionsProtocol."""
|
|
192
|
+
return _AdaptedOptions(settings) # type: ignore
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class _AdaptedOptions:
|
|
196
|
+
"""Adapter class to convert CrackerjackSettings to OptionsProtocol.
|
|
197
|
+
|
|
198
|
+
Since CrackerjackSettings uses flat field structure, this adapter
|
|
199
|
+
is much simpler than the old nested WorkflowOptions version.
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
def __init__(self, settings: CrackerjackSettings):
|
|
203
|
+
self.settings = settings
|
|
204
|
+
|
|
205
|
+
# Git properties
|
|
206
|
+
@property
|
|
207
|
+
def commit(self) -> bool:
|
|
208
|
+
return self.settings.commit
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def create_pr(self) -> bool:
|
|
212
|
+
return self.settings.create_pr
|
|
213
|
+
|
|
214
|
+
# Execution properties
|
|
215
|
+
@property
|
|
216
|
+
def interactive(self) -> bool:
|
|
217
|
+
return self.settings.interactive
|
|
218
|
+
|
|
219
|
+
@property
|
|
220
|
+
def no_config_updates(self) -> bool:
|
|
221
|
+
return self.settings.no_config_updates
|
|
222
|
+
|
|
223
|
+
@property
|
|
224
|
+
def verbose(self) -> bool:
|
|
225
|
+
return self.settings.verbose
|
|
226
|
+
|
|
227
|
+
@property
|
|
228
|
+
def async_mode(self) -> bool:
|
|
229
|
+
return self.settings.async_mode
|
|
230
|
+
|
|
231
|
+
# Testing properties
|
|
232
|
+
@property
|
|
233
|
+
def test(self) -> bool:
|
|
234
|
+
return self.settings.run_tests # Note: Field renamed in CrackerjackSettings
|
|
235
|
+
|
|
236
|
+
@property
|
|
237
|
+
def benchmark(self) -> bool:
|
|
238
|
+
return self.settings.benchmark
|
|
239
|
+
|
|
240
|
+
@property
|
|
241
|
+
def test_workers(self) -> int:
|
|
242
|
+
return self.settings.test_workers
|
|
243
|
+
|
|
244
|
+
@property
|
|
245
|
+
def test_timeout(self) -> int:
|
|
246
|
+
return self.settings.test_timeout
|
|
247
|
+
|
|
248
|
+
# Publishing properties
|
|
249
|
+
@property
|
|
250
|
+
def publish(self) -> t.Any | None:
|
|
251
|
+
return self.settings.publish_version
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def bump(self) -> t.Any | None:
|
|
255
|
+
return self.settings.bump_version
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def all(self) -> t.Any | None:
|
|
259
|
+
return self.settings.all_workflow
|
|
260
|
+
|
|
261
|
+
@property
|
|
262
|
+
def no_git_tags(self) -> bool:
|
|
263
|
+
return self.settings.no_git_tags
|
|
264
|
+
|
|
265
|
+
@property
|
|
266
|
+
def skip_version_check(self) -> bool:
|
|
267
|
+
return self.settings.skip_version_check
|
|
268
|
+
|
|
269
|
+
# AI properties
|
|
270
|
+
@property
|
|
271
|
+
def ai_agent(self) -> bool:
|
|
272
|
+
return self.settings.ai_agent
|
|
273
|
+
|
|
274
|
+
@property
|
|
275
|
+
def start_mcp_server(self) -> bool:
|
|
276
|
+
return self.settings.start_mcp_server
|
|
277
|
+
|
|
278
|
+
# Hook properties
|
|
279
|
+
@property
|
|
280
|
+
def skip_hooks(self) -> bool:
|
|
281
|
+
return self.settings.skip_hooks
|
|
282
|
+
|
|
283
|
+
@property
|
|
284
|
+
def update_precommit(self) -> bool:
|
|
285
|
+
return self.settings.update_precommit
|
|
286
|
+
|
|
287
|
+
@property
|
|
288
|
+
def experimental_hooks(self) -> bool:
|
|
289
|
+
return self.settings.experimental_hooks
|
|
290
|
+
|
|
291
|
+
@property
|
|
292
|
+
def enable_pyrefly(self) -> bool:
|
|
293
|
+
return self.settings.enable_pyrefly
|
|
294
|
+
|
|
295
|
+
@property
|
|
296
|
+
def enable_ty(self) -> bool:
|
|
297
|
+
return self.settings.enable_ty
|
|
298
|
+
|
|
299
|
+
# Cleaning properties
|
|
300
|
+
@property
|
|
301
|
+
def clean(self) -> bool:
|
|
302
|
+
return self.settings.clean
|
|
303
|
+
|
|
304
|
+
# Progress properties
|
|
305
|
+
@property
|
|
306
|
+
def track_progress(self) -> bool:
|
|
307
|
+
return self.settings.progress_enabled
|
|
308
|
+
|
|
309
|
+
# Default/static properties (not in settings, keep defaults)
|
|
310
|
+
@property
|
|
311
|
+
def cleanup(self) -> t.Any | None:
|
|
312
|
+
return None
|
|
313
|
+
|
|
314
|
+
@property
|
|
315
|
+
def cleanup_pypi(self) -> bool:
|
|
316
|
+
return False
|
|
317
|
+
|
|
318
|
+
@property
|
|
319
|
+
def coverage(self) -> bool:
|
|
320
|
+
return self.settings.coverage_enabled
|
|
321
|
+
|
|
322
|
+
@property
|
|
323
|
+
def keep_releases(self) -> int:
|
|
324
|
+
return 10
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def fast(self) -> bool:
|
|
328
|
+
return False
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
from acb.console import Console
|
|
332
|
+
from acb.depends import Inject
|
|
333
|
+
|
|
334
|
+
from crackerjack.services.filesystem import FileSystemService
|
|
335
|
+
from crackerjack.services.git import GitService
|
|
336
|
+
from crackerjack.services.initialization import InitializationService
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def _execute_init_stage(
|
|
340
|
+
orchestrator: "WorkflowOrchestrator", console: Inject[Console]
|
|
341
|
+
) -> bool:
|
|
342
|
+
try:
|
|
343
|
+
from pathlib import Path
|
|
344
|
+
|
|
345
|
+
pkg_path = orchestrator.pkg_path
|
|
346
|
+
|
|
347
|
+
filesystem = FileSystemService()
|
|
348
|
+
git_service = GitService(pkg_path)
|
|
349
|
+
|
|
350
|
+
init_service = InitializationService(filesystem, git_service, pkg_path)
|
|
351
|
+
|
|
352
|
+
results = init_service.initialize_project_full(target_path=Path.cwd())
|
|
353
|
+
|
|
354
|
+
success_result: bool = bool(results.get("success", False))
|
|
355
|
+
return success_result
|
|
356
|
+
|
|
357
|
+
except Exception as e:
|
|
358
|
+
if hasattr(orchestrator, "console"):
|
|
359
|
+
orchestrator.console.print(f"[red]❌[/ red] Initialization failed: {e}")
|
|
360
|
+
return False
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def register_core_tools(mcp_app: t.Any) -> None:
|
|
364
|
+
@mcp_app.tool() # type: ignore[misc]
|
|
365
|
+
async def run_crackerjack_stage(args: str, kwargs: str) -> str:
|
|
366
|
+
context = get_context()
|
|
367
|
+
rate_limiter = context.rate_limiter if context else None
|
|
368
|
+
|
|
369
|
+
validation_error = await _validate_stage_request(context, rate_limiter)
|
|
370
|
+
if validation_error:
|
|
371
|
+
return validation_error
|
|
372
|
+
|
|
373
|
+
try:
|
|
374
|
+
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
375
|
+
|
|
376
|
+
parse_result = _parse_stage_args(args, kwargs)
|
|
377
|
+
if isinstance(parse_result, str):
|
|
378
|
+
return parse_result
|
|
379
|
+
|
|
380
|
+
stage, extra_kwargs = parse_result
|
|
381
|
+
|
|
382
|
+
orchestrator = WorkflowOrchestrator(
|
|
383
|
+
console=context.console,
|
|
384
|
+
pkg_path=context.config.project_path,
|
|
385
|
+
dry_run=extra_kwargs.get("dry_run", False),
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
options = _configure_stage_options(stage)
|
|
389
|
+
success = _execute_stage(orchestrator, stage, options)
|
|
390
|
+
|
|
391
|
+
return f'{{"success": {str(success).lower()}, "stage": "{stage}"}}'
|
|
392
|
+
|
|
393
|
+
except Exception as e:
|
|
394
|
+
context.safe_print(f"Error executing stage {args}: {e}")
|
|
395
|
+
return f'{{"error": "Stage execution failed: {e}", "success": false}}'
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def _get_error_patterns() -> list[tuple[str, str]]:
|
|
399
|
+
return [
|
|
400
|
+
("type_error", r"TypeError: | type object .* has no attribute"),
|
|
401
|
+
("import_error", r"ImportError: | ModuleNotFoundError: "),
|
|
402
|
+
("attribute_error", r"AttributeError: "),
|
|
403
|
+
("syntax_error", r"SyntaxError: | invalid syntax"),
|
|
404
|
+
("test_failure", r"FAILED | AssertionError: "),
|
|
405
|
+
("hook_failure", r"hook .* failed"),
|
|
406
|
+
]
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
def _get_error_suggestion(error_type: str) -> str:
|
|
410
|
+
suggestions = {
|
|
411
|
+
"type_error": "Check type annotations and ensure proper imports",
|
|
412
|
+
"import_error": "Verify module exists and is properly installed",
|
|
413
|
+
"test_failure": "Review test assertions and expected behavior",
|
|
414
|
+
"hook_failure": "Run hooks individually to identify specific failures",
|
|
415
|
+
}
|
|
416
|
+
return suggestions.get(error_type) or "No specific suggestion available"
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def _detect_errors_and_suggestions(
|
|
420
|
+
text: str,
|
|
421
|
+
include_suggestions: bool,
|
|
422
|
+
) -> tuple[list[str], list[str]]:
|
|
423
|
+
import re
|
|
424
|
+
|
|
425
|
+
detected_errors: list[str] = []
|
|
426
|
+
suggestions: list[str] = []
|
|
427
|
+
|
|
428
|
+
for error_type, pattern in _get_error_patterns():
|
|
429
|
+
if re.search(pattern, text, re.IGNORECASE):
|
|
430
|
+
detected_errors.append(error_type)
|
|
431
|
+
if include_suggestions:
|
|
432
|
+
suggestions.append(_get_error_suggestion(error_type))
|
|
433
|
+
|
|
434
|
+
return detected_errors, suggestions
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def register_analyze_errors_tool(mcp_app: t.Any) -> None:
|
|
438
|
+
@mcp_app.tool() # type: ignore[misc]
|
|
439
|
+
async def analyze_errors(output: str = "", include_suggestions: bool = True) -> str:
|
|
440
|
+
context = get_context()
|
|
441
|
+
if not context:
|
|
442
|
+
return '{"error": "Server context not available"}'
|
|
443
|
+
|
|
444
|
+
try:
|
|
445
|
+
from crackerjack.services.debug import get_ai_agent_debugger
|
|
446
|
+
|
|
447
|
+
debugger = get_ai_agent_debugger()
|
|
448
|
+
if not debugger.enabled:
|
|
449
|
+
return '{"analysis": "Debugging not enabled", "suggestions": []}'
|
|
450
|
+
|
|
451
|
+
analysis_text = output or "No specific output provided"
|
|
452
|
+
detected_errors, suggestions = _detect_errors_and_suggestions(
|
|
453
|
+
analysis_text,
|
|
454
|
+
include_suggestions,
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
result = {
|
|
458
|
+
"analysis": f"Detected {len(detected_errors)} error types",
|
|
459
|
+
"error_types": detected_errors,
|
|
460
|
+
"suggestions": suggestions if include_suggestions else [],
|
|
461
|
+
"raw_output_length": len(analysis_text),
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
import json
|
|
465
|
+
|
|
466
|
+
return json.dumps(result, indent=2)
|
|
467
|
+
|
|
468
|
+
except Exception as e:
|
|
469
|
+
return f'{{"error": "Error analysis failed: {e}"}}'
|