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,394 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | [CLI](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# CLI
|
|
4
|
+
|
|
5
|
+
Command-line interface handlers and option processing for the Crackerjack CLI using Click and Typer frameworks.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The CLI package provides the primary user interface for Crackerjack, handling command-line arguments, option validation, and routing to appropriate backend handlers. It follows a modular handler-based architecture with 90% ACB compliance, using protocol-based dependency injection for most components.
|
|
10
|
+
|
|
11
|
+
## Architecture
|
|
12
|
+
|
|
13
|
+
### Entry Point Flow
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
python -m crackerjack [options]
|
|
17
|
+
ā
|
|
18
|
+
__main__.py
|
|
19
|
+
ā
|
|
20
|
+
options.py (Option parsing & validation)
|
|
21
|
+
ā
|
|
22
|
+
handlers/ (Specialized command handlers)
|
|
23
|
+
ā
|
|
24
|
+
Managers/Orchestration (Backend coordination)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Core Components
|
|
28
|
+
|
|
29
|
+
- **options.py**: CLI option definitions, validation, and parsing using Pydantic models
|
|
30
|
+
- **handlers.py**: Main command handlers for quality workflows
|
|
31
|
+
- **facade.py**: CLI facade for simplified command routing
|
|
32
|
+
- **interactive.py**: Interactive mode for guided workflows
|
|
33
|
+
- **utils.py**: CLI utility functions
|
|
34
|
+
|
|
35
|
+
### Handler Modules
|
|
36
|
+
|
|
37
|
+
**handlers/** ā Specialized command handlers by feature:
|
|
38
|
+
|
|
39
|
+
- **main_handlers.py**: Core quality workflow execution (fast, comprehensive, tests)
|
|
40
|
+
- **analytics.py**: Coverage analytics, metrics, and reporting
|
|
41
|
+
- **monitoring.py**: Health monitoring, watchdog, and status checks
|
|
42
|
+
- **documentation.py**: Documentation generation and changelog automation
|
|
43
|
+
- **changelog.py**: Changelog management and versioning
|
|
44
|
+
- **coverage.py**: Coverage ratchet and improvement workflows
|
|
45
|
+
- **ai_features.py**: AI agent integration and auto-fixing
|
|
46
|
+
- **advanced.py**: Advanced features and experimental workflows
|
|
47
|
+
- **config_handlers.py**: Configuration management and initialization
|
|
48
|
+
|
|
49
|
+
### Cache Handlers
|
|
50
|
+
|
|
51
|
+
- **cache_handlers.py**: Basic cache management operations
|
|
52
|
+
- **cache_handlers_enhanced.py**: Advanced cache operations with pattern analysis
|
|
53
|
+
- **semantic_handlers.py**: Semantic search and code comprehension handlers
|
|
54
|
+
|
|
55
|
+
## Command Categories
|
|
56
|
+
|
|
57
|
+
### Quality Workflows
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Fast hooks (~5s)
|
|
61
|
+
python -m crackerjack --fast
|
|
62
|
+
|
|
63
|
+
# Comprehensive hooks (~30s)
|
|
64
|
+
python -m crackerjack --comp
|
|
65
|
+
|
|
66
|
+
# Full quality + tests
|
|
67
|
+
python -m crackerjack --run-tests
|
|
68
|
+
|
|
69
|
+
# AI-powered auto-fixing
|
|
70
|
+
python -m crackerjack --ai-fix --run-tests
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Publishing & Versioning
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Interactive versioning
|
|
77
|
+
python -m crackerjack --publish interactive
|
|
78
|
+
|
|
79
|
+
# Automated bump
|
|
80
|
+
python -m crackerjack --publish patch # or minor, major, auto
|
|
81
|
+
|
|
82
|
+
# Full release workflow
|
|
83
|
+
python -m crackerjack --all patch
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### MCP Server Management
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Start MCP server
|
|
90
|
+
python -m crackerjack --start-mcp-server
|
|
91
|
+
|
|
92
|
+
# Restart server
|
|
93
|
+
python -m crackerjack --restart-mcp-server
|
|
94
|
+
|
|
95
|
+
# Health monitoring
|
|
96
|
+
python -m crackerjack --watchdog
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Coverage & Analytics
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Coverage report
|
|
103
|
+
python -m crackerjack --coverage-report
|
|
104
|
+
|
|
105
|
+
# Analytics dashboard
|
|
106
|
+
python -m crackerjack --analytics
|
|
107
|
+
|
|
108
|
+
# Benchmark performance
|
|
109
|
+
python -m crackerjack --benchmark
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Development Modes
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Fast iteration (skip comprehensive hooks)
|
|
116
|
+
python -m crackerjack --fast-iteration
|
|
117
|
+
|
|
118
|
+
# Run specific tool only
|
|
119
|
+
python -m crackerjack --tool ruff
|
|
120
|
+
|
|
121
|
+
# Changed files only
|
|
122
|
+
python -m crackerjack --changed-only
|
|
123
|
+
|
|
124
|
+
# Debug mode
|
|
125
|
+
python -m crackerjack --debug --verbose
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Option Processing
|
|
129
|
+
|
|
130
|
+
### Option Validation
|
|
131
|
+
|
|
132
|
+
The `Options` Pydantic model provides type-safe option parsing with validation:
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
from crackerjack.cli.options import Options, BumpOption
|
|
136
|
+
|
|
137
|
+
# Parse and validate options
|
|
138
|
+
options = Options(run_tests=True, ai_fix=True, test_workers=4, publish=BumpOption.patch)
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Bump Options
|
|
142
|
+
|
|
143
|
+
Versioning options with enum validation:
|
|
144
|
+
|
|
145
|
+
- **patch**: 1.0.0 ā 1.0.1 (bug fixes)
|
|
146
|
+
- **minor**: 1.0.0 ā 1.1.0 (new features)
|
|
147
|
+
- **major**: 1.0.0 ā 2.0.0 (breaking changes)
|
|
148
|
+
- **interactive**: Guided version selection
|
|
149
|
+
- **auto**: AI-powered version recommendation
|
|
150
|
+
|
|
151
|
+
### Test Workers
|
|
152
|
+
|
|
153
|
+
Parallel test execution configuration:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
--test-workers 0 # Auto-detect (default, recommended)
|
|
157
|
+
--test-workers 4 # Explicit worker count
|
|
158
|
+
--test-workers 1 # Sequential execution (debugging)
|
|
159
|
+
--test-workers -2 # Fractional (half cores)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Handler Architecture
|
|
163
|
+
|
|
164
|
+
### Protocol-Based Dependency Injection
|
|
165
|
+
|
|
166
|
+
Most handlers use ACB dependency injection (90% compliance):
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from acb.depends import depends, Inject
|
|
170
|
+
from crackerjack.models.protocols import Console, CrackerjackCache
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@depends.inject
|
|
174
|
+
def handle_quality_check(
|
|
175
|
+
console: Inject[Console] = None,
|
|
176
|
+
cache: Inject[CrackerjackCache] = None,
|
|
177
|
+
) -> None:
|
|
178
|
+
console.print("[green]Running quality checks...[/green]")
|
|
179
|
+
# ... handler logic
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Handler Routing
|
|
183
|
+
|
|
184
|
+
Handlers are organized by feature domain for maintainability:
|
|
185
|
+
|
|
186
|
+
```python
|
|
187
|
+
# Main quality workflows
|
|
188
|
+
from crackerjack.cli.handlers.main_handlers import (
|
|
189
|
+
handle_fast_hooks,
|
|
190
|
+
handle_comprehensive_hooks,
|
|
191
|
+
handle_tests,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# Analytics and reporting
|
|
195
|
+
from crackerjack.cli.handlers.analytics import (
|
|
196
|
+
handle_coverage_report,
|
|
197
|
+
handle_analytics_dashboard,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# MCP server management
|
|
201
|
+
from crackerjack.cli.handlers.monitoring import (
|
|
202
|
+
handle_start_mcp_server,
|
|
203
|
+
handle_watchdog,
|
|
204
|
+
)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Interactive Mode
|
|
208
|
+
|
|
209
|
+
Guided workflows with prompts and validation:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
python -m crackerjack --interactive
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Features:**
|
|
216
|
+
|
|
217
|
+
- Step-by-step guidance
|
|
218
|
+
- Option validation with helpful errors
|
|
219
|
+
- Confirmation prompts for destructive actions
|
|
220
|
+
- Progress indicators for long operations
|
|
221
|
+
|
|
222
|
+
## Facade Pattern
|
|
223
|
+
|
|
224
|
+
The `CrackerjackCLIFacade` provides simplified command routing:
|
|
225
|
+
|
|
226
|
+
```python
|
|
227
|
+
from crackerjack.cli.facade import CrackerjackCLIFacade
|
|
228
|
+
|
|
229
|
+
facade = CrackerjackCLIFacade()
|
|
230
|
+
result = await facade.run_quality_workflow(fast=True, ai_fix=True, verbose=True)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**Note:** Facade needs DI integration (currently manual instantiation).
|
|
234
|
+
|
|
235
|
+
## Usage Examples
|
|
236
|
+
|
|
237
|
+
### Adding a New CLI Option
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
# 1. Add to Options model (options.py)
|
|
241
|
+
class Options(BaseModel):
|
|
242
|
+
my_new_option: bool = False
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
# 2. Add Click/Typer parameter (__main__.py)
|
|
246
|
+
@click.option("--my-new-option", is_flag=True, help="Enable new feature")
|
|
247
|
+
# 3. Create handler (handlers/my_feature.py)
|
|
248
|
+
@depends.inject
|
|
249
|
+
def handle_my_feature(console: Inject[Console] = None) -> None:
|
|
250
|
+
console.print("[cyan]Running new feature...[/cyan]")
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
# 4. Route in main (__main__.py)
|
|
254
|
+
if options.my_new_option:
|
|
255
|
+
handle_my_feature()
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Adding a New Handler Module
|
|
259
|
+
|
|
260
|
+
```python
|
|
261
|
+
# handlers/my_handlers.py
|
|
262
|
+
from acb.depends import depends, Inject
|
|
263
|
+
from crackerjack.models.protocols import Console
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
@depends.inject
|
|
267
|
+
async def handle_my_command(
|
|
268
|
+
arg1: str,
|
|
269
|
+
console: Inject[Console] = None,
|
|
270
|
+
) -> bool:
|
|
271
|
+
"""Handler for my custom command."""
|
|
272
|
+
console.print(f"Processing: {arg1}")
|
|
273
|
+
# ... implementation
|
|
274
|
+
return True
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Best Practices
|
|
278
|
+
|
|
279
|
+
1. **Use Protocol-Based DI**: Import from `models/protocols.py`, not concrete classes
|
|
280
|
+
1. **Validate Options Early**: Use Pydantic validators in the `Options` model
|
|
281
|
+
1. **Keep Handlers Focused**: Single responsibility per handler
|
|
282
|
+
1. **Provide User Feedback**: Use rich console for progress and status
|
|
283
|
+
1. **Handle Errors Gracefully**: Catch exceptions and provide helpful error messages
|
|
284
|
+
1. **Support --verbose**: Add verbose logging for troubleshooting
|
|
285
|
+
1. **Document Options**: Clear help text for all CLI options
|
|
286
|
+
1. **Test Interactive Flows**: Verify prompts and validation work correctly
|
|
287
|
+
|
|
288
|
+
## Anti-Patterns to Avoid
|
|
289
|
+
|
|
290
|
+
```python
|
|
291
|
+
# ā Direct console instantiation
|
|
292
|
+
from rich.console import Console
|
|
293
|
+
console = Console()
|
|
294
|
+
|
|
295
|
+
# ā
Use dependency injection
|
|
296
|
+
@depends.inject
|
|
297
|
+
def handler(console: Inject[Console] = None):
|
|
298
|
+
console.print("...")
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
# ā Complex logic in option parsing
|
|
302
|
+
@click.option("--complex")
|
|
303
|
+
def command(complex):
|
|
304
|
+
if complex:
|
|
305
|
+
# 50 lines of logic here
|
|
306
|
+
|
|
307
|
+
# ā
Delegate to handlers
|
|
308
|
+
@click.option("--complex")
|
|
309
|
+
def command(complex):
|
|
310
|
+
if complex:
|
|
311
|
+
handle_complex_workflow()
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
# ā Silent failures
|
|
315
|
+
def handler():
|
|
316
|
+
try:
|
|
317
|
+
risky_operation()
|
|
318
|
+
except Exception:
|
|
319
|
+
pass # Don't do this!
|
|
320
|
+
|
|
321
|
+
# ā
Inform the user
|
|
322
|
+
def handler():
|
|
323
|
+
try:
|
|
324
|
+
risky_operation()
|
|
325
|
+
except Exception as e:
|
|
326
|
+
console.print(f"[red]Error: {e}[/red]")
|
|
327
|
+
raise
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Configuration
|
|
331
|
+
|
|
332
|
+
CLI behavior can be customized via `settings/crackerjack.yaml`:
|
|
333
|
+
|
|
334
|
+
```yaml
|
|
335
|
+
# CLI defaults
|
|
336
|
+
verbose: false
|
|
337
|
+
interactive: false
|
|
338
|
+
test_workers: 0 # Auto-detect
|
|
339
|
+
debug: false
|
|
340
|
+
ai_debug: false
|
|
341
|
+
|
|
342
|
+
# Feature flags
|
|
343
|
+
experimental_hooks: false
|
|
344
|
+
async_mode: true
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
## Troubleshooting
|
|
348
|
+
|
|
349
|
+
### Option Parsing Issues
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Enable debug mode for detailed output
|
|
353
|
+
python -m crackerjack --debug --verbose
|
|
354
|
+
|
|
355
|
+
# Check option values
|
|
356
|
+
python -m crackerjack --help
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Handler Failures
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
# Use verbose mode for detailed logs
|
|
363
|
+
python -m crackerjack --verbose --run-tests
|
|
364
|
+
|
|
365
|
+
# Enable AI debugging for agent issues
|
|
366
|
+
python -m crackerjack --ai-debug --ai-fix
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Test Worker Configuration
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
# Sequential execution for debugging flaky tests
|
|
373
|
+
python -m crackerjack --run-tests --test-workers 1
|
|
374
|
+
|
|
375
|
+
# Disable auto-detection globally
|
|
376
|
+
export CRACKERJACK_DISABLE_AUTO_WORKERS=1
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Related
|
|
380
|
+
|
|
381
|
+
- [Managers](<../managers/README.md>) ā Backend managers called by CLI handlers
|
|
382
|
+
- [Orchestration](<../orchestration/README.md>) ā Workflow orchestration layer
|
|
383
|
+
- [Options](<./options.py>) ā Full list of CLI options
|
|
384
|
+
- [Main README](<../../README.md>) ā Command examples and workflows
|
|
385
|
+
- [CLAUDE.md](../../docs/guides/CLAUDE.md) ā Essential commands reference
|
|
386
|
+
|
|
387
|
+
## Future Enhancements
|
|
388
|
+
|
|
389
|
+
- [ ] Complete DI integration for CrackerjackCLIFacade
|
|
390
|
+
- [ ] Plugin system for custom commands
|
|
391
|
+
- [ ] Command auto-completion (shell integration)
|
|
392
|
+
- [ ] Configuration profiles (dev, ci, production)
|
|
393
|
+
- [ ] Command aliasing and shortcuts
|
|
394
|
+
- [ ] Enhanced interactive mode with TUI
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from .handlers import (
|
|
2
|
+
handle_interactive_mode,
|
|
3
|
+
handle_monitor_mode,
|
|
4
|
+
handle_orchestrated_mode,
|
|
5
|
+
handle_standard_mode,
|
|
6
|
+
handle_watchdog_mode,
|
|
7
|
+
setup_ai_agent_env,
|
|
8
|
+
)
|
|
9
|
+
from .options import CLI_OPTIONS, BumpOption, Options, create_options
|
|
10
|
+
from .version import get_package_version
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"CLI_OPTIONS",
|
|
14
|
+
"BumpOption",
|
|
15
|
+
"Options",
|
|
16
|
+
"create_options",
|
|
17
|
+
"get_package_version",
|
|
18
|
+
"handle_interactive_mode",
|
|
19
|
+
"handle_monitor_mode",
|
|
20
|
+
"handle_orchestrated_mode",
|
|
21
|
+
"handle_standard_mode",
|
|
22
|
+
"handle_watchdog_mode",
|
|
23
|
+
"setup_ai_agent_env",
|
|
24
|
+
]
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import typing as t
|
|
2
|
+
|
|
3
|
+
from acb.console import Console
|
|
4
|
+
from acb.depends import Inject, depends
|
|
5
|
+
from rich.panel import Panel
|
|
6
|
+
from rich.table import Table
|
|
7
|
+
from rich.text import Text
|
|
8
|
+
|
|
9
|
+
from crackerjack.services.cache import CrackerjackCache
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@depends.inject # type: ignore[misc]
|
|
13
|
+
def handle_clear_cache(console: Inject[Console]) -> None:
|
|
14
|
+
"""Clear all caches and display results."""
|
|
15
|
+
try:
|
|
16
|
+
cache = CrackerjackCache()
|
|
17
|
+
|
|
18
|
+
# Clear memory caches and get cleanup stats
|
|
19
|
+
cleanup_results = cache.cleanup_all()
|
|
20
|
+
|
|
21
|
+
# Note:CrackerjackCache uses memory-only caching (no disk cache to clear)
|
|
22
|
+
|
|
23
|
+
# Calculate total items cleared
|
|
24
|
+
total_cleared = sum(cleanup_results.values())
|
|
25
|
+
|
|
26
|
+
# Create results table
|
|
27
|
+
table = Table(
|
|
28
|
+
title="Cache Cleared", show_header=True, header_style="bold green"
|
|
29
|
+
)
|
|
30
|
+
table.add_column("Cache Type", style="cyan", no_wrap=True)
|
|
31
|
+
table.add_column("Items Cleared", justify="right", style="yellow")
|
|
32
|
+
|
|
33
|
+
for cache_type, count in cleanup_results.items():
|
|
34
|
+
table.add_row(cache_type.replace("_", " ").title(), str(count))
|
|
35
|
+
|
|
36
|
+
table.add_row("", "", end_section=True)
|
|
37
|
+
table.add_row("Total", str(total_cleared), style="bold green")
|
|
38
|
+
|
|
39
|
+
console.print()
|
|
40
|
+
console.print(Panel(table, title="Cache Cleared", border_style="green"))
|
|
41
|
+
console.print(f"\nā
Successfully cleared {total_cleared} cache entries")
|
|
42
|
+
|
|
43
|
+
except Exception as e:
|
|
44
|
+
console.print(f"\nā Error clearing cache: {e}", style="bold red")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@depends.inject # type: ignore[misc]
|
|
48
|
+
def handle_cache_stats(console: Inject[Console]) -> None:
|
|
49
|
+
"""Display detailed cache statistics."""
|
|
50
|
+
try:
|
|
51
|
+
cache = CrackerjackCache()
|
|
52
|
+
stats = cache.get_cache_stats()
|
|
53
|
+
|
|
54
|
+
main_table = _create_cache_stats_table()
|
|
55
|
+
totals = _populate_cache_stats_table(main_table, stats)
|
|
56
|
+
_add_cache_totals_row(main_table, totals)
|
|
57
|
+
|
|
58
|
+
console.print()
|
|
59
|
+
console.print(Panel(main_table, border_style="blue"))
|
|
60
|
+
|
|
61
|
+
_display_performance_insights(totals)
|
|
62
|
+
_display_cache_directory_info(cache)
|
|
63
|
+
|
|
64
|
+
except Exception as e:
|
|
65
|
+
console.print(f"\nā Error retrieving cache stats: {e}", style="bold red")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _create_cache_stats_table() -> Table:
|
|
69
|
+
"""Create and configure the main cache statistics table."""
|
|
70
|
+
table = Table(title="Cache Statistics", show_header=True, header_style="bold blue")
|
|
71
|
+
table.add_column("Cache Layer", style="cyan", no_wrap=True)
|
|
72
|
+
table.add_column("Hit Rate %", justify="right", style="green")
|
|
73
|
+
table.add_column("Hits", justify="right", style="yellow")
|
|
74
|
+
table.add_column("Misses", justify="right", style="red")
|
|
75
|
+
table.add_column("Entries", justify="right", style="magenta")
|
|
76
|
+
table.add_column("Size (MB)", justify="right", style="blue")
|
|
77
|
+
return table
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _populate_cache_stats_table(
|
|
81
|
+
table: Table, stats: dict[str, t.Any]
|
|
82
|
+
) -> dict[str, t.Any]:
|
|
83
|
+
"""Populate table with cache statistics and return totals."""
|
|
84
|
+
totals = {"hits": 0, "misses": 0, "entries": 0, "size": 0.0}
|
|
85
|
+
|
|
86
|
+
for cache_name, cache_stats in stats.items():
|
|
87
|
+
hit_rate = cache_stats.get("hit_rate_percent", 0.0)
|
|
88
|
+
hits = cache_stats.get("hits", 0)
|
|
89
|
+
misses = cache_stats.get("misses", 0)
|
|
90
|
+
entries = cache_stats.get("total_entries", 0)
|
|
91
|
+
size_mb = cache_stats.get("total_size_mb", 0.0)
|
|
92
|
+
|
|
93
|
+
hit_rate_style = _get_hit_rate_style(hit_rate)
|
|
94
|
+
|
|
95
|
+
table.add_row(
|
|
96
|
+
cache_name.replace("_", " ").title(),
|
|
97
|
+
Text(f"{hit_rate:.1f}", style=hit_rate_style),
|
|
98
|
+
str(hits),
|
|
99
|
+
str(misses),
|
|
100
|
+
str(entries),
|
|
101
|
+
f"{size_mb:.2f}",
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
totals["hits"] += hits
|
|
105
|
+
totals["misses"] += misses
|
|
106
|
+
totals["entries"] += entries
|
|
107
|
+
totals["size"] += size_mb
|
|
108
|
+
|
|
109
|
+
return totals
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _get_hit_rate_style(hit_rate: float) -> str:
|
|
113
|
+
"""Get color style for hit rate based on performance."""
|
|
114
|
+
return "green" if hit_rate > 70 else "yellow" if hit_rate > 40 else "red"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _add_cache_totals_row(table: Table, totals: dict[str, t.Any]) -> None:
|
|
118
|
+
"""Add totals row to cache statistics table."""
|
|
119
|
+
overall_hit_rate = (
|
|
120
|
+
(totals["hits"] / (totals["hits"] + totals["misses"]) * 100)
|
|
121
|
+
if (totals["hits"] + totals["misses"]) > 0
|
|
122
|
+
else 0
|
|
123
|
+
)
|
|
124
|
+
overall_style = _get_hit_rate_style(overall_hit_rate)
|
|
125
|
+
|
|
126
|
+
table.add_row("", "", "", "", "", "", end_section=True)
|
|
127
|
+
table.add_row(
|
|
128
|
+
"Overall",
|
|
129
|
+
Text(f"{overall_hit_rate:.1f}", style=f"bold {overall_style}"),
|
|
130
|
+
str(totals["hits"]),
|
|
131
|
+
str(totals["misses"]),
|
|
132
|
+
str(totals["entries"]),
|
|
133
|
+
f"{totals['size']:.2f}",
|
|
134
|
+
style="bold",
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
@depends.inject # type: ignore[misc]
|
|
139
|
+
def _display_performance_insights(
|
|
140
|
+
totals: dict[str, t.Any], console: Inject[Console]
|
|
141
|
+
) -> None:
|
|
142
|
+
"""Display performance insights panel based on cache statistics."""
|
|
143
|
+
overall_hit_rate = (
|
|
144
|
+
(totals["hits"] / (totals["hits"] + totals["misses"]) * 100)
|
|
145
|
+
if (totals["hits"] + totals["misses"]) > 0
|
|
146
|
+
else 0
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
insights = _generate_performance_insights(overall_hit_rate, totals["size"])
|
|
150
|
+
|
|
151
|
+
if insights:
|
|
152
|
+
insights_text = "\n".join(insights)
|
|
153
|
+
insights_panel = Panel(
|
|
154
|
+
insights_text,
|
|
155
|
+
title="Performance Insights",
|
|
156
|
+
border_style="blue",
|
|
157
|
+
padding=(1, 2),
|
|
158
|
+
)
|
|
159
|
+
console.print()
|
|
160
|
+
console.print(insights_panel)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _generate_performance_insights(hit_rate: float, total_size: float) -> list[str]:
|
|
164
|
+
"""Generate performance insights based on cache metrics."""
|
|
165
|
+
insights = []
|
|
166
|
+
|
|
167
|
+
if hit_rate > 80:
|
|
168
|
+
insights.append("š Excellent cache performance!")
|
|
169
|
+
elif hit_rate > 60:
|
|
170
|
+
insights.append("ā
Good cache performance")
|
|
171
|
+
elif hit_rate > 30:
|
|
172
|
+
insights.append("ā ļø Moderate cache performance - consider cache warming")
|
|
173
|
+
else:
|
|
174
|
+
insights.append("ā Poor cache performance - check cache configuration")
|
|
175
|
+
|
|
176
|
+
if total_size > 100:
|
|
177
|
+
insights.append(f"š¾ Large cache size ({total_size:.1f}MB) - consider cleanup")
|
|
178
|
+
|
|
179
|
+
return insights
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@depends.inject # type: ignore[misc]
|
|
183
|
+
def _display_cache_directory_info(
|
|
184
|
+
cache: CrackerjackCache, console: Inject[Console]
|
|
185
|
+
) -> None:
|
|
186
|
+
"""Display cache directory information."""
|
|
187
|
+
if not (cache.enable_disk_cache and cache.cache_dir):
|
|
188
|
+
return
|
|
189
|
+
|
|
190
|
+
cache_dir_info = f"š Cache Directory: {cache.cache_dir}"
|
|
191
|
+
if cache.cache_dir.exists():
|
|
192
|
+
disk_files = len(list(cache.cache_dir.rglob("*.cache")))
|
|
193
|
+
cache_dir_info += f" ({disk_files} files)"
|
|
194
|
+
|
|
195
|
+
console.print()
|
|
196
|
+
console.print(cache_dir_info)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _handle_cache_commands(clear_cache: bool, cache_stats: bool) -> bool:
|
|
200
|
+
"""Handle cache management commands. Returns True if a cache command was executed."""
|
|
201
|
+
if clear_cache:
|
|
202
|
+
handle_clear_cache()
|
|
203
|
+
return True
|
|
204
|
+
|
|
205
|
+
if cache_stats:
|
|
206
|
+
handle_cache_stats()
|
|
207
|
+
return True
|
|
208
|
+
|
|
209
|
+
return False
|