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,162 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import shlex
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from acb.console import Console
|
|
6
|
+
from acb.depends import depends
|
|
7
|
+
|
|
8
|
+
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
9
|
+
from crackerjack.models.protocols import OptionsProtocol
|
|
10
|
+
|
|
11
|
+
# Valid semantic commands for crackerjack operations
|
|
12
|
+
VALID_COMMANDS = {"test", "lint", "check", "format", "security", "complexity", "all"}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def validate_command(
|
|
16
|
+
command: str | None, args: str | None = None
|
|
17
|
+
) -> tuple[str, list[str]]:
|
|
18
|
+
"""Validate command and detect common misuse patterns.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
command: Semantic command name (test, lint, check, etc.)
|
|
22
|
+
args: Additional arguments as a string
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
Tuple of (validated_command, cleaned_args_list)
|
|
26
|
+
|
|
27
|
+
Raises:
|
|
28
|
+
ValueError: If command is invalid or misused
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
>>> validate_command("test", "")
|
|
32
|
+
("test", [])
|
|
33
|
+
>>> validate_command("check", "--verbose")
|
|
34
|
+
("check", ["--verbose"])
|
|
35
|
+
>>> validate_command("--ai-fix", "-t")
|
|
36
|
+
Traceback (most recent call last):
|
|
37
|
+
...
|
|
38
|
+
ValueError: Invalid command: '--ai-fix'...
|
|
39
|
+
"""
|
|
40
|
+
# CRITICAL: Check for None command first
|
|
41
|
+
if command is None:
|
|
42
|
+
raise ValueError("Command cannot be None")
|
|
43
|
+
|
|
44
|
+
# Detect if user put flags in command parameter
|
|
45
|
+
if command.startswith("--") or command.startswith("-"):
|
|
46
|
+
raise ValueError(
|
|
47
|
+
f"Invalid command: {command!r}\n"
|
|
48
|
+
f"Commands should be semantic (e.g., 'test', 'lint', 'check')\n"
|
|
49
|
+
f"Use ai_agent_mode=True parameter for auto-fix, not --ai-fix in command"
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Validate against known semantic commands
|
|
53
|
+
if command not in VALID_COMMANDS:
|
|
54
|
+
raise ValueError(
|
|
55
|
+
f"Unknown command: {command!r}\n"
|
|
56
|
+
f"Valid commands: {', '.join(sorted(VALID_COMMANDS))}"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Parse args and detect --ai-fix misuse
|
|
60
|
+
# Handle None gracefully by converting to empty string
|
|
61
|
+
args_str = args if args is not None else ""
|
|
62
|
+
# Use shlex.split for proper shell argument parsing (handles quotes)
|
|
63
|
+
parsed_args = shlex.split(args_str) if args_str else []
|
|
64
|
+
if "--ai-fix" in parsed_args:
|
|
65
|
+
raise ValueError(
|
|
66
|
+
"Do not pass --ai-fix in args parameter\n"
|
|
67
|
+
"Use ai_agent_mode=True parameter instead"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
return command, parsed_args
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class CrackerjackCLIFacade:
|
|
74
|
+
def __init__(
|
|
75
|
+
self,
|
|
76
|
+
console: Console | None = None,
|
|
77
|
+
pkg_path: Path | None = None,
|
|
78
|
+
) -> None:
|
|
79
|
+
self.console = console or depends.get_sync(Console)
|
|
80
|
+
self.pkg_path = pkg_path or Path.cwd()
|
|
81
|
+
self.orchestrator = WorkflowOrchestrator(
|
|
82
|
+
pkg_path=self.pkg_path,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
def process(self, options: OptionsProtocol) -> None:
|
|
86
|
+
try:
|
|
87
|
+
if self._should_handle_special_mode(options):
|
|
88
|
+
self._handle_special_modes(options)
|
|
89
|
+
return
|
|
90
|
+
success = asyncio.run(self.orchestrator.run_complete_workflow(options))
|
|
91
|
+
if not success:
|
|
92
|
+
self.console.print("[red]❌ Workflow completed with errors[/ red]")
|
|
93
|
+
else:
|
|
94
|
+
self.console.print(
|
|
95
|
+
"[green]🎉 Workflow completed successfully ![/ green]"
|
|
96
|
+
)
|
|
97
|
+
except KeyboardInterrupt:
|
|
98
|
+
self.console.print("\n[yellow]⏹️ Operation cancelled by user[/ yellow]")
|
|
99
|
+
raise SystemExit(130)
|
|
100
|
+
except Exception as e:
|
|
101
|
+
self.console.print(f"[red]💥 Unexpected error: {e}[/ red]")
|
|
102
|
+
if options.verbose:
|
|
103
|
+
import traceback
|
|
104
|
+
|
|
105
|
+
self.console.print(f"[dim]{traceback.format_exc()}[/ dim]")
|
|
106
|
+
raise SystemExit(1)
|
|
107
|
+
|
|
108
|
+
async def process_async(self, options: OptionsProtocol) -> None:
|
|
109
|
+
await asyncio.to_thread(self.process, options)
|
|
110
|
+
|
|
111
|
+
def _should_handle_special_mode(self, options: OptionsProtocol) -> bool:
|
|
112
|
+
return (
|
|
113
|
+
getattr(options, "start_mcp_server", False)
|
|
114
|
+
or getattr(options, "advanced_batch", False)
|
|
115
|
+
or getattr(options, "monitor_dashboard", False)
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
def _handle_special_modes(self, options: OptionsProtocol) -> None:
|
|
119
|
+
if getattr(options, "start_mcp_server", False):
|
|
120
|
+
self._start_mcp_server()
|
|
121
|
+
elif getattr(options, "advanced_batch", False):
|
|
122
|
+
self._handle_advanced_batch(options)
|
|
123
|
+
elif getattr(options, "monitor_dashboard", False):
|
|
124
|
+
self._handle_monitor_dashboard(options)
|
|
125
|
+
|
|
126
|
+
def _start_mcp_server(self) -> None:
|
|
127
|
+
try:
|
|
128
|
+
from crackerjack.mcp.server import main as start_mcp_main
|
|
129
|
+
|
|
130
|
+
self.console.print(
|
|
131
|
+
"[bold cyan]🤖 Starting Crackerjack MCP Server...[/ bold cyan]",
|
|
132
|
+
)
|
|
133
|
+
start_mcp_main(str(self.pkg_path))
|
|
134
|
+
except ImportError:
|
|
135
|
+
self.console.print(
|
|
136
|
+
"[red]❌ MCP server requires additional dependencies[/ red]",
|
|
137
|
+
)
|
|
138
|
+
self.console.print("[yellow]Install with: uv sync --group mcp[/ yellow]")
|
|
139
|
+
raise SystemExit(1)
|
|
140
|
+
except Exception as e:
|
|
141
|
+
self.console.print(f"[red]❌ Failed to start MCP server: {e}[/ red]")
|
|
142
|
+
raise SystemExit(1)
|
|
143
|
+
|
|
144
|
+
def _handle_advanced_batch(self, options: OptionsProtocol) -> None:
|
|
145
|
+
self.console.print(
|
|
146
|
+
"[red]❌ Advanced batch processing is not yet implemented[/ red]"
|
|
147
|
+
)
|
|
148
|
+
raise SystemExit(1)
|
|
149
|
+
|
|
150
|
+
def _handle_monitor_dashboard(self, options: OptionsProtocol) -> None:
|
|
151
|
+
self.console.print("[red]❌ Monitoring dashboard is not yet implemented[/ red]")
|
|
152
|
+
raise SystemExit(1)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def create_crackerjack_runner(
|
|
156
|
+
console: Console | None = None,
|
|
157
|
+
pkg_path: Path | None = None,
|
|
158
|
+
) -> CrackerjackCLIFacade:
|
|
159
|
+
return CrackerjackCLIFacade(console=console, pkg_path=pkg_path)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
CrackerjackRunner = CrackerjackCLIFacade
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from crackerjack.config import get_console_width
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def separator(char: str = "-", width: int | None = None) -> str:
|
|
7
|
+
"""Return a horizontal separator string.
|
|
8
|
+
|
|
9
|
+
- char: the character to repeat (default '-')
|
|
10
|
+
- width: explicit width; if None, uses configured console width
|
|
11
|
+
"""
|
|
12
|
+
w = width if isinstance(width, int) and width > 0 else get_console_width()
|
|
13
|
+
return char * w
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""CLI handlers module for Crackerjack.
|
|
2
|
+
|
|
3
|
+
This module contains all the command handlers for the Crackerjack CLI.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# Import specific functions from the modular handlers
|
|
7
|
+
# Import other specific functions from other handlers files
|
|
8
|
+
from . import (
|
|
9
|
+
advanced,
|
|
10
|
+
ai_features,
|
|
11
|
+
analytics,
|
|
12
|
+
changelog,
|
|
13
|
+
config_handlers,
|
|
14
|
+
coverage,
|
|
15
|
+
documentation,
|
|
16
|
+
monitoring,
|
|
17
|
+
)
|
|
18
|
+
from .advanced import *
|
|
19
|
+
from .ai_features import *
|
|
20
|
+
from .analytics import *
|
|
21
|
+
from .changelog import *
|
|
22
|
+
from .config_handlers import *
|
|
23
|
+
from .coverage import *
|
|
24
|
+
from .documentation import *
|
|
25
|
+
|
|
26
|
+
# Import main handler functions that coordinate the core CLI workflows
|
|
27
|
+
from .main_handlers import (
|
|
28
|
+
handle_acb_workflow_mode,
|
|
29
|
+
handle_config_updates,
|
|
30
|
+
handle_interactive_mode,
|
|
31
|
+
handle_orchestrated_mode,
|
|
32
|
+
handle_standard_mode,
|
|
33
|
+
setup_ai_agent_env,
|
|
34
|
+
)
|
|
35
|
+
from .monitoring import (
|
|
36
|
+
handle_dashboard_mode,
|
|
37
|
+
handle_enhanced_monitor_mode,
|
|
38
|
+
handle_mcp_commands,
|
|
39
|
+
handle_mcp_server,
|
|
40
|
+
handle_monitor_mode,
|
|
41
|
+
handle_monitoring_commands,
|
|
42
|
+
handle_restart_mcp_server,
|
|
43
|
+
handle_restart_websocket_server,
|
|
44
|
+
handle_restart_zuban_lsp,
|
|
45
|
+
handle_server_commands,
|
|
46
|
+
handle_start_websocket_server,
|
|
47
|
+
handle_start_zuban_lsp,
|
|
48
|
+
handle_stop_mcp_server,
|
|
49
|
+
handle_stop_websocket_server,
|
|
50
|
+
handle_stop_zuban_lsp,
|
|
51
|
+
handle_unified_dashboard_mode,
|
|
52
|
+
handle_watchdog_mode,
|
|
53
|
+
handle_websocket_commands,
|
|
54
|
+
handle_zuban_lsp_commands,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
__all__ = [
|
|
58
|
+
"handle_interactive_mode",
|
|
59
|
+
"handle_monitor_mode",
|
|
60
|
+
"handle_orchestrated_mode",
|
|
61
|
+
"handle_standard_mode",
|
|
62
|
+
"handle_watchdog_mode",
|
|
63
|
+
"setup_ai_agent_env",
|
|
64
|
+
# Add other functions from the modular handlers
|
|
65
|
+
"handle_dashboard_mode",
|
|
66
|
+
"handle_enhanced_monitor_mode",
|
|
67
|
+
"handle_mcp_server",
|
|
68
|
+
"handle_restart_mcp_server",
|
|
69
|
+
"handle_restart_websocket_server",
|
|
70
|
+
"handle_restart_zuban_lsp",
|
|
71
|
+
"handle_start_websocket_server",
|
|
72
|
+
"handle_start_zuban_lsp",
|
|
73
|
+
"handle_stop_mcp_server",
|
|
74
|
+
"handle_stop_websocket_server",
|
|
75
|
+
"handle_stop_zuban_lsp",
|
|
76
|
+
"handle_unified_dashboard_mode",
|
|
77
|
+
"handle_acb_workflow_mode",
|
|
78
|
+
"handle_config_updates",
|
|
79
|
+
"handle_monitoring_commands",
|
|
80
|
+
"handle_websocket_commands",
|
|
81
|
+
"handle_mcp_commands",
|
|
82
|
+
"handle_zuban_lsp_commands",
|
|
83
|
+
"handle_server_commands",
|
|
84
|
+
# Add other functions as they are moved to modular handlers
|
|
85
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""CLI handlers for advanced optimization features"""
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from acb.console import Console
|
|
7
|
+
from acb.depends import Inject, depends
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@depends.inject # type: ignore[misc]
|
|
11
|
+
def handle_advanced_optimizer(
|
|
12
|
+
advanced_optimizer: bool,
|
|
13
|
+
advanced_profile: str | None,
|
|
14
|
+
advanced_report: str | None,
|
|
15
|
+
console: Inject[Console] = None,
|
|
16
|
+
) -> bool:
|
|
17
|
+
if not advanced_optimizer:
|
|
18
|
+
return True
|
|
19
|
+
|
|
20
|
+
console.print("[cyan]🏢[/cyan] Running advanced-scale optimization analysis...")
|
|
21
|
+
try:
|
|
22
|
+
optimizer = setup_advanced_optimizer(advanced_profile)
|
|
23
|
+
result = run_advanced_optimization(optimizer)
|
|
24
|
+
display_advanced_results(result, advanced_report)
|
|
25
|
+
return False
|
|
26
|
+
|
|
27
|
+
except Exception as e:
|
|
28
|
+
console.print(f"[red]❌[/red] Advanced optimizer error: {e}")
|
|
29
|
+
return False
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def setup_advanced_optimizer(advanced_profile: str | None) -> t.Any:
|
|
33
|
+
import tempfile
|
|
34
|
+
|
|
35
|
+
from crackerjack.services.ai.advanced_optimizer import AdvancedOptimizer
|
|
36
|
+
|
|
37
|
+
config_dir = Path.cwd() / ".crackerjack"
|
|
38
|
+
storage_dir = Path(tempfile.gettempdir()) / "crackerjack_storage"
|
|
39
|
+
optimizer = AdvancedOptimizer(config_dir, storage_dir)
|
|
40
|
+
|
|
41
|
+
if advanced_profile:
|
|
42
|
+
optimizer.performance_profile.optimization_strategy = advanced_profile
|
|
43
|
+
|
|
44
|
+
return optimizer
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@depends.inject # type: ignore[misc]
|
|
48
|
+
def run_advanced_optimization(optimizer: t.Any, console: Inject[Console]) -> t.Any:
|
|
49
|
+
import asyncio
|
|
50
|
+
|
|
51
|
+
console.print("[blue]📊[/blue] Analyzing system resources and performance...")
|
|
52
|
+
return asyncio.run(optimizer.run_optimization_cycle())
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@depends.inject # type: ignore[misc]
|
|
56
|
+
def display_advanced_results(
|
|
57
|
+
result: t.Any, advanced_report: str | None, console: Inject[Console]
|
|
58
|
+
) -> None:
|
|
59
|
+
if result["status"] == "success":
|
|
60
|
+
console.print("[green]✅[/green] Advanced optimization completed successfully")
|
|
61
|
+
display_advanced_metrics(result["metrics"])
|
|
62
|
+
display_advanced_recommendations(result["recommendations"])
|
|
63
|
+
save_advanced_report(result, advanced_report)
|
|
64
|
+
else:
|
|
65
|
+
console.print(
|
|
66
|
+
f"[red]❌[/red] Advanced optimization failed: {result.get('message', 'Unknown error')}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@depends.inject # type: ignore[misc]
|
|
71
|
+
def display_advanced_metrics(metrics: t.Any, console: Inject[Console]) -> None:
|
|
72
|
+
console.print(f"[blue]CPU Usage:[/blue] {metrics['cpu_percent']:.1f}%")
|
|
73
|
+
console.print(f"[blue]Memory Usage:[/blue] {metrics['memory_percent']:.1f}%")
|
|
74
|
+
console.print(f"[blue]Storage Usage:[/blue] {metrics['disk_usage_percent']:.1f}%")
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@depends.inject # type: ignore[misc]
|
|
78
|
+
def display_advanced_recommendations(
|
|
79
|
+
recommendations: t.Any, console: Inject[Console]
|
|
80
|
+
) -> None:
|
|
81
|
+
if recommendations:
|
|
82
|
+
console.print(
|
|
83
|
+
f"\n[yellow]💡[/yellow] Found {len(recommendations)} optimization recommendations:"
|
|
84
|
+
)
|
|
85
|
+
for rec in recommendations[:3]:
|
|
86
|
+
priority_color = {"high": "red", "medium": "yellow", "low": "blue"}[
|
|
87
|
+
rec["priority"]
|
|
88
|
+
]
|
|
89
|
+
console.print(
|
|
90
|
+
f" [{priority_color}]{rec['priority'].upper()}[/{priority_color}]: {rec['title']}"
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@depends.inject # type: ignore[misc]
|
|
95
|
+
def save_advanced_report(
|
|
96
|
+
result: t.Any, advanced_report: str | None, console: Inject[Console]
|
|
97
|
+
) -> None:
|
|
98
|
+
if advanced_report:
|
|
99
|
+
import json
|
|
100
|
+
|
|
101
|
+
with open(advanced_report, "w") as f:
|
|
102
|
+
json.dump(result, f, indent=2)
|
|
103
|
+
console.print(f"[green]📄[/green] Advanced report saved to: {advanced_report}")
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""CLI handlers for AI-powered features (contextual AI assistant)"""
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from acb.console import Console
|
|
7
|
+
from acb.depends import Inject, depends
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@depends.inject # type: ignore[misc]
|
|
11
|
+
def handle_contextual_ai(
|
|
12
|
+
contextual_ai: bool,
|
|
13
|
+
ai_recommendations: int,
|
|
14
|
+
ai_help_query: str | None,
|
|
15
|
+
console: Inject[Console],
|
|
16
|
+
) -> bool:
|
|
17
|
+
if not contextual_ai and not ai_help_query:
|
|
18
|
+
return True
|
|
19
|
+
|
|
20
|
+
from crackerjack.services.ai.contextual_ai_assistant import ContextualAIAssistant
|
|
21
|
+
|
|
22
|
+
console.print("[cyan]🤖[/cyan] Running contextual AI assistant analysis...")
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
|
|
26
|
+
class FileSystemImpl:
|
|
27
|
+
def read_file(self, path: str | t.Any) -> str:
|
|
28
|
+
return Path(path).read_text()
|
|
29
|
+
|
|
30
|
+
def write_file(self, path: str | t.Any, content: str) -> None:
|
|
31
|
+
Path(path).write_text(content)
|
|
32
|
+
|
|
33
|
+
def exists(self, path: str | t.Any) -> bool:
|
|
34
|
+
return Path(path).exists()
|
|
35
|
+
|
|
36
|
+
def mkdir(self, path: str | t.Any, parents: bool = False) -> None:
|
|
37
|
+
Path(path).mkdir(parents=parents, exist_ok=True)
|
|
38
|
+
|
|
39
|
+
filesystem = FileSystemImpl()
|
|
40
|
+
assistant = ContextualAIAssistant(filesystem)
|
|
41
|
+
|
|
42
|
+
if ai_help_query:
|
|
43
|
+
help_response = assistant.get_quick_help(ai_help_query)
|
|
44
|
+
console.print(f"\n[blue]🔍[/blue] AI Help for '{ai_help_query}':")
|
|
45
|
+
console.print(help_response)
|
|
46
|
+
return False
|
|
47
|
+
|
|
48
|
+
console.print(
|
|
49
|
+
"[blue]🧠[/blue] Analyzing project context for AI recommendations..."
|
|
50
|
+
)
|
|
51
|
+
recommendations = assistant.get_contextual_recommendations(ai_recommendations)
|
|
52
|
+
|
|
53
|
+
if recommendations:
|
|
54
|
+
assistant.display_recommendations(recommendations)
|
|
55
|
+
else:
|
|
56
|
+
console.print("[green]✨[/green] Great job! No immediate recommendations")
|
|
57
|
+
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
console.print(f"[red]❌[/red] Contextual AI error: {e}")
|
|
62
|
+
return False
|