crackerjack 0.37.9__py3-none-any.whl → 0.45.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +30 -1
- crackerjack/__main__.py +342 -1263
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +27 -5
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
- crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
- crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +40 -12
- crackerjack/agents/base.py +1 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +49 -53
- crackerjack/agents/dry_agent.py +187 -3
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +6 -8
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/performance_agent.py +121 -1152
- crackerjack/agents/refactoring_agent.py +156 -655
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +19 -1605
- crackerjack/api.py +5 -7
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +1 -1
- crackerjack/cli/cache_handlers.py +23 -18
- crackerjack/cli/cache_handlers_enhanced.py +1 -4
- crackerjack/cli/facade.py +70 -8
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +249 -49
- crackerjack/cli/interactive.py +8 -5
- crackerjack/cli/options.py +203 -110
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +60 -24
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +256 -0
- crackerjack/config/global_lock_config.py +191 -54
- crackerjack/config/hooks.py +188 -16
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/async_workflow_orchestrator.py +79 -53
- crackerjack/core/autofix_coordinator.py +22 -9
- crackerjack/core/container.py +10 -9
- crackerjack/core/enhanced_container.py +9 -9
- crackerjack/core/performance.py +1 -1
- crackerjack/core/performance_monitor.py +5 -3
- crackerjack/core/phase_coordinator.py +1018 -634
- crackerjack/core/proactive_workflow.py +3 -3
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +167 -23
- crackerjack/core/session_coordinator.py +187 -382
- crackerjack/core/timeout_manager.py +161 -44
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +1247 -953
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/ai_templates.py +1 -1
- crackerjack/documentation/dual_output_generator.py +11 -9
- crackerjack/documentation/reference_generator.py +104 -59
- crackerjack/dynamic_config.py +52 -61
- crackerjack/errors.py +1 -1
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +2 -0
- crackerjack/executors/async_hook_executor.py +539 -77
- crackerjack/executors/cached_hook_executor.py +3 -3
- crackerjack/executors/hook_executor.py +967 -102
- crackerjack/executors/hook_lock_manager.py +31 -22
- crackerjack/executors/individual_hook_executor.py +66 -32
- crackerjack/executors/lsp_aware_hook_executor.py +136 -57
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +23 -7
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +8 -9
- crackerjack/intelligence/README.md +557 -0
- crackerjack/interactive.py +37 -10
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/async_hook_manager.py +41 -57
- crackerjack/managers/hook_manager.py +449 -79
- crackerjack/managers/publish_manager.py +81 -36
- crackerjack/managers/test_command_builder.py +290 -12
- crackerjack/managers/test_executor.py +93 -8
- crackerjack/managers/test_manager.py +1082 -75
- crackerjack/managers/test_progress.py +118 -26
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/cache.py +25 -2
- crackerjack/mcp/client_runner.py +35 -18
- crackerjack/mcp/context.py +9 -9
- crackerjack/mcp/dashboard.py +24 -8
- crackerjack/mcp/enhanced_progress_monitor.py +34 -23
- crackerjack/mcp/file_monitor.py +27 -6
- crackerjack/mcp/progress_components.py +45 -34
- crackerjack/mcp/progress_monitor.py +6 -9
- crackerjack/mcp/rate_limiter.py +11 -7
- crackerjack/mcp/server.py +2 -0
- crackerjack/mcp/server_core.py +187 -55
- crackerjack/mcp/service_watchdog.py +12 -9
- crackerjack/mcp/task_manager.py +2 -2
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +2 -0
- crackerjack/mcp/tools/core_tools.py +75 -52
- crackerjack/mcp/tools/execution_tools.py +87 -31
- crackerjack/mcp/tools/intelligence_tools.py +2 -2
- crackerjack/mcp/tools/proactive_tools.py +1 -1
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +180 -132
- crackerjack/mcp/tools/workflow_executor.py +87 -46
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/app.py +11 -1
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +27 -4
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
- crackerjack/mcp/websocket/server.py +1 -3
- crackerjack/mcp/websocket/websocket_handler.py +107 -6
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +10 -1
- crackerjack/models/config.py +639 -22
- crackerjack/models/config_adapter.py +6 -6
- crackerjack/models/protocols.py +1167 -23
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +19 -3
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/ai_agent_watchdog.py +5 -4
- crackerjack/monitoring/metrics_collector.py +4 -3
- crackerjack/monitoring/regression_prevention.py +4 -3
- crackerjack/monitoring/websocket_server.py +4 -241
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +20 -67
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +13 -6
- crackerjack/orchestration/execution_strategies.py +6 -6
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +1 -1
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/hooks.py +3 -2
- crackerjack/plugins/loader.py +3 -3
- crackerjack/plugins/managers.py +1 -1
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +8 -21
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/api_extractor.py +5 -3
- crackerjack/services/bounded_status_operations.py +45 -5
- crackerjack/services/cache.py +249 -318
- crackerjack/services/changelog_automation.py +7 -3
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +83 -39
- crackerjack/services/config_merge.py +9 -6
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +13 -26
- crackerjack/services/coverage_badge_service.py +6 -4
- crackerjack/services/coverage_ratchet.py +53 -27
- crackerjack/services/debug.py +18 -7
- crackerjack/services/dependency_analyzer.py +4 -4
- crackerjack/services/dependency_monitor.py +13 -13
- crackerjack/services/documentation_generator.py +4 -2
- crackerjack/services/documentation_service.py +62 -33
- crackerjack/services/enhanced_filesystem.py +81 -27
- crackerjack/services/enterprise_optimizer.py +1 -1
- crackerjack/services/error_pattern_analyzer.py +10 -10
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +5 -7
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +80 -109
- crackerjack/services/git.py +99 -5
- crackerjack/services/health_metrics.py +4 -6
- crackerjack/services/heatmap_generator.py +12 -3
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +101 -49
- crackerjack/services/log_manager.py +2 -2
- crackerjack/services/logging.py +120 -68
- crackerjack/services/lsp_client.py +12 -12
- crackerjack/services/memory_optimizer.py +27 -22
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
- crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
- crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
- crackerjack/services/parallel_executor.py +166 -55
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +21 -8
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
- crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
- crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
- crackerjack/services/regex_patterns.py +58 -2987
- crackerjack/services/regex_utils.py +55 -29
- crackerjack/services/secure_status_formatter.py +42 -15
- crackerjack/services/secure_subprocess.py +35 -2
- crackerjack/services/security.py +16 -8
- crackerjack/services/server_manager.py +40 -51
- crackerjack/services/smart_scheduling.py +46 -6
- crackerjack/services/status_authentication.py +3 -3
- crackerjack/services/thread_safe_status_collector.py +1 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +9 -5
- crackerjack/services/unified_config.py +43 -351
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +6 -4
- crackerjack/services/version_checker.py +14 -8
- crackerjack/services/zuban_lsp_service.py +5 -4
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/init.md +2 -12
- crackerjack/slash_commands/run.md +84 -50
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_regex_patterns.py +7 -3
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack/managers/test_manager_backup.py +0 -1075
- crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
- crackerjack/mixins/__init__.py +0 -3
- crackerjack/mixins/error_handling.py +0 -145
- crackerjack/services/config.py +0 -358
- crackerjack/ui/server_panels.py +0 -125
- crackerjack-0.37.9.dist-info/RECORD +0 -231
- /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
- /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
crackerjack/api.py
CHANGED
|
@@ -3,13 +3,13 @@ import typing as t
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
-
from
|
|
6
|
+
from acb.console import Console
|
|
7
|
+
from acb.depends import depends
|
|
7
8
|
|
|
8
9
|
from .code_cleaner import CleaningResult, CodeCleaner, PackageCleaningResult
|
|
9
10
|
from .core.workflow_orchestrator import WorkflowOrchestrator
|
|
10
11
|
from .errors import CrackerjackError, ErrorCode
|
|
11
|
-
from .interactive import InteractiveCLI
|
|
12
|
-
from .interactive import WorkflowOptions as InteractiveWorkflowOptions
|
|
12
|
+
from .interactive import InteractiveCLI, InteractiveWorkflowOptions
|
|
13
13
|
from .models.config import WorkflowOptions
|
|
14
14
|
from .services.regex_patterns import SAFE_PATTERNS
|
|
15
15
|
|
|
@@ -50,16 +50,15 @@ class CrackerjackAPI:
|
|
|
50
50
|
verbose: bool = False,
|
|
51
51
|
) -> None:
|
|
52
52
|
self.project_path = project_path or Path.cwd()
|
|
53
|
-
self.console = console or Console
|
|
53
|
+
self.console = console or depends.get_sync(Console)
|
|
54
54
|
self.verbose = verbose
|
|
55
55
|
|
|
56
56
|
self.orchestrator = WorkflowOrchestrator(
|
|
57
|
-
console=self.console,
|
|
58
57
|
pkg_path=self.project_path,
|
|
59
58
|
verbose=self.verbose,
|
|
60
59
|
)
|
|
61
60
|
|
|
62
|
-
self.container = self.orchestrator
|
|
61
|
+
self.container = t.cast(t.Any, getattr(self.orchestrator, "container", None))
|
|
63
62
|
|
|
64
63
|
self._code_cleaner: CodeCleaner | None = None
|
|
65
64
|
self._interactive_cli: InteractiveCLI | None = None
|
|
@@ -601,7 +600,6 @@ class CrackerjackAPI:
|
|
|
601
600
|
return None
|
|
602
601
|
|
|
603
602
|
def _find_fallback_package_directory(self) -> Path | None:
|
|
604
|
-
# Only check project directory name, not src
|
|
605
603
|
package_dir = self.project_path / self.project_path.name
|
|
606
604
|
if self._is_valid_python_package_directory(package_dir):
|
|
607
605
|
return package_dir
|
|
@@ -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
|
crackerjack/cli/__init__.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import typing as t
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from acb.console import Console
|
|
4
|
+
from acb.depends import Inject, depends
|
|
4
5
|
from rich.panel import Panel
|
|
5
6
|
from rich.table import Table
|
|
6
7
|
from rich.text import Text
|
|
@@ -8,7 +9,8 @@ from rich.text import Text
|
|
|
8
9
|
from crackerjack.services.cache import CrackerjackCache
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
@depends.inject # type: ignore[misc]
|
|
13
|
+
def handle_clear_cache(console: Inject[Console]) -> None:
|
|
12
14
|
"""Clear all caches and display results."""
|
|
13
15
|
try:
|
|
14
16
|
cache = CrackerjackCache()
|
|
@@ -16,9 +18,7 @@ def handle_clear_cache(console: Console) -> None:
|
|
|
16
18
|
# Clear memory caches and get cleanup stats
|
|
17
19
|
cleanup_results = cache.cleanup_all()
|
|
18
20
|
|
|
19
|
-
#
|
|
20
|
-
if cache.enable_disk_cache and cache.cache_dir:
|
|
21
|
-
cache.disk_cache.clear()
|
|
21
|
+
# Note:CrackerjackCache uses memory-only caching (no disk cache to clear)
|
|
22
22
|
|
|
23
23
|
# Calculate total items cleared
|
|
24
24
|
total_cleared = sum(cleanup_results.values())
|
|
@@ -37,14 +37,15 @@ def handle_clear_cache(console: Console) -> None:
|
|
|
37
37
|
table.add_row("Total", str(total_cleared), style="bold green")
|
|
38
38
|
|
|
39
39
|
console.print()
|
|
40
|
-
console.print(table)
|
|
40
|
+
console.print(Panel(table, title="Cache Cleared", border_style="green"))
|
|
41
41
|
console.print(f"\n✅ Successfully cleared {total_cleared} cache entries")
|
|
42
42
|
|
|
43
43
|
except Exception as e:
|
|
44
44
|
console.print(f"\n❌ Error clearing cache: {e}", style="bold red")
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
@depends.inject # type: ignore[misc]
|
|
48
|
+
def handle_cache_stats(console: Inject[Console]) -> None:
|
|
48
49
|
"""Display detailed cache statistics."""
|
|
49
50
|
try:
|
|
50
51
|
cache = CrackerjackCache()
|
|
@@ -55,10 +56,10 @@ def handle_cache_stats(console: Console) -> None:
|
|
|
55
56
|
_add_cache_totals_row(main_table, totals)
|
|
56
57
|
|
|
57
58
|
console.print()
|
|
58
|
-
console.print(main_table)
|
|
59
|
+
console.print(Panel(main_table, border_style="blue"))
|
|
59
60
|
|
|
60
|
-
_display_performance_insights(
|
|
61
|
-
_display_cache_directory_info(
|
|
61
|
+
_display_performance_insights(totals)
|
|
62
|
+
_display_cache_directory_info(cache)
|
|
62
63
|
|
|
63
64
|
except Exception as e:
|
|
64
65
|
console.print(f"\n❌ Error retrieving cache stats: {e}", style="bold red")
|
|
@@ -134,7 +135,10 @@ def _add_cache_totals_row(table: Table, totals: dict[str, t.Any]) -> None:
|
|
|
134
135
|
)
|
|
135
136
|
|
|
136
137
|
|
|
137
|
-
|
|
138
|
+
@depends.inject # type: ignore[misc]
|
|
139
|
+
def _display_performance_insights(
|
|
140
|
+
totals: dict[str, t.Any], console: Inject[Console]
|
|
141
|
+
) -> None:
|
|
138
142
|
"""Display performance insights panel based on cache statistics."""
|
|
139
143
|
overall_hit_rate = (
|
|
140
144
|
(totals["hits"] / (totals["hits"] + totals["misses"]) * 100)
|
|
@@ -175,30 +179,31 @@ def _generate_performance_insights(hit_rate: float, total_size: float) -> list[s
|
|
|
175
179
|
return insights
|
|
176
180
|
|
|
177
181
|
|
|
178
|
-
|
|
182
|
+
@depends.inject # type: ignore[misc]
|
|
183
|
+
def _display_cache_directory_info(
|
|
184
|
+
cache: CrackerjackCache, console: Inject[Console]
|
|
185
|
+
) -> None:
|
|
179
186
|
"""Display cache directory information."""
|
|
180
187
|
if not (cache.enable_disk_cache and cache.cache_dir):
|
|
181
188
|
return
|
|
182
189
|
|
|
183
190
|
cache_dir_info = f"📁 Cache Directory: {cache.cache_dir}"
|
|
184
191
|
if cache.cache_dir.exists():
|
|
185
|
-
disk_files = len(list
|
|
192
|
+
disk_files = len(list(cache.cache_dir.rglob("*.cache")))
|
|
186
193
|
cache_dir_info += f" ({disk_files} files)"
|
|
187
194
|
|
|
188
195
|
console.print()
|
|
189
196
|
console.print(cache_dir_info)
|
|
190
197
|
|
|
191
198
|
|
|
192
|
-
def _handle_cache_commands(
|
|
193
|
-
clear_cache: bool, cache_stats: bool, console: Console
|
|
194
|
-
) -> bool:
|
|
199
|
+
def _handle_cache_commands(clear_cache: bool, cache_stats: bool) -> bool:
|
|
195
200
|
"""Handle cache management commands. Returns True if a cache command was executed."""
|
|
196
201
|
if clear_cache:
|
|
197
|
-
handle_clear_cache(
|
|
202
|
+
handle_clear_cache()
|
|
198
203
|
return True
|
|
199
204
|
|
|
200
205
|
if cache_stats:
|
|
201
|
-
handle_cache_stats(
|
|
206
|
+
handle_cache_stats()
|
|
202
207
|
return True
|
|
203
208
|
|
|
204
209
|
return False
|
|
@@ -61,12 +61,9 @@ class EnhancedCacheHandlers:
|
|
|
61
61
|
pre_clear_stats = self.cache.get_cache_stats()
|
|
62
62
|
|
|
63
63
|
# Clear memory caches and get cleanup stats
|
|
64
|
+
# Note: cleanup_all() already handles all cache types (memory + disk)
|
|
64
65
|
cleanup_results = self.cache.cleanup_all()
|
|
65
66
|
|
|
66
|
-
# Clear disk cache completely
|
|
67
|
-
if self.cache.enable_disk_cache and self.cache.cache_dir:
|
|
68
|
-
self.cache.disk_cache.clear()
|
|
69
|
-
|
|
70
67
|
# Calculate total items cleared
|
|
71
68
|
total_cleared = sum(cleanup_results.values())
|
|
72
69
|
|
crackerjack/cli/facade.py
CHANGED
|
@@ -1,11 +1,74 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import shlex
|
|
2
3
|
from pathlib import Path
|
|
3
4
|
|
|
4
|
-
from
|
|
5
|
+
from acb.console import Console
|
|
6
|
+
from acb.depends import depends
|
|
5
7
|
|
|
6
8
|
from crackerjack.core.workflow_orchestrator import WorkflowOrchestrator
|
|
7
9
|
from crackerjack.models.protocols import OptionsProtocol
|
|
8
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
|
+
|
|
9
72
|
|
|
10
73
|
class CrackerjackCLIFacade:
|
|
11
74
|
def __init__(
|
|
@@ -13,10 +76,9 @@ class CrackerjackCLIFacade:
|
|
|
13
76
|
console: Console | None = None,
|
|
14
77
|
pkg_path: Path | None = None,
|
|
15
78
|
) -> None:
|
|
16
|
-
self.console = console or Console
|
|
79
|
+
self.console = console or depends.get_sync(Console)
|
|
17
80
|
self.pkg_path = pkg_path or Path.cwd()
|
|
18
81
|
self.orchestrator = WorkflowOrchestrator(
|
|
19
|
-
console=self.console,
|
|
20
82
|
pkg_path=self.pkg_path,
|
|
21
83
|
)
|
|
22
84
|
|
|
@@ -49,15 +111,15 @@ class CrackerjackCLIFacade:
|
|
|
49
111
|
def _should_handle_special_mode(self, options: OptionsProtocol) -> bool:
|
|
50
112
|
return (
|
|
51
113
|
getattr(options, "start_mcp_server", False)
|
|
52
|
-
or getattr(options, "
|
|
114
|
+
or getattr(options, "advanced_batch", False)
|
|
53
115
|
or getattr(options, "monitor_dashboard", False)
|
|
54
116
|
)
|
|
55
117
|
|
|
56
118
|
def _handle_special_modes(self, options: OptionsProtocol) -> None:
|
|
57
119
|
if getattr(options, "start_mcp_server", False):
|
|
58
120
|
self._start_mcp_server()
|
|
59
|
-
elif getattr(options, "
|
|
60
|
-
self.
|
|
121
|
+
elif getattr(options, "advanced_batch", False):
|
|
122
|
+
self._handle_advanced_batch(options)
|
|
61
123
|
elif getattr(options, "monitor_dashboard", False):
|
|
62
124
|
self._handle_monitor_dashboard(options)
|
|
63
125
|
|
|
@@ -79,9 +141,9 @@ class CrackerjackCLIFacade:
|
|
|
79
141
|
self.console.print(f"[red]❌ Failed to start MCP server: {e}[/ red]")
|
|
80
142
|
raise SystemExit(1)
|
|
81
143
|
|
|
82
|
-
def
|
|
144
|
+
def _handle_advanced_batch(self, options: OptionsProtocol) -> None:
|
|
83
145
|
self.console.print(
|
|
84
|
-
"[red]❌
|
|
146
|
+
"[red]❌ Advanced batch processing is not yet implemented[/ red]"
|
|
85
147
|
)
|
|
86
148
|
raise SystemExit(1)
|
|
87
149
|
|
|
@@ -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
|