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,271 @@
|
|
|
1
|
+
"""CLI handlers for changelog generation and version analysis.
|
|
2
|
+
|
|
3
|
+
This module contains handlers for:
|
|
4
|
+
- Changelog generation from git commits
|
|
5
|
+
- Changelog dry-run previews
|
|
6
|
+
- Automated version analysis and recommendations
|
|
7
|
+
- Debug/verbose flag setup
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import typing as t
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from acb.console import Console
|
|
14
|
+
from acb.depends import Inject, depends
|
|
15
|
+
|
|
16
|
+
if t.TYPE_CHECKING:
|
|
17
|
+
from crackerjack.services.changelog_automation import ChangelogGenerator
|
|
18
|
+
from crackerjack.services.git import GitService
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def setup_changelog_services() -> dict[str, t.Any]:
|
|
22
|
+
"""Set up changelog generation services (git, generator, path)."""
|
|
23
|
+
from crackerjack.services.changelog_automation import ChangelogGenerator
|
|
24
|
+
from crackerjack.services.git import GitService
|
|
25
|
+
|
|
26
|
+
pkg_path = Path()
|
|
27
|
+
git_service = GitService()
|
|
28
|
+
changelog_generator = ChangelogGenerator()
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
"pkg_path": pkg_path,
|
|
32
|
+
"git_service": git_service,
|
|
33
|
+
"generator": changelog_generator,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@depends.inject # type: ignore[misc]
|
|
38
|
+
def handle_changelog_dry_run(
|
|
39
|
+
generator: "ChangelogGenerator",
|
|
40
|
+
changelog_since: str | None,
|
|
41
|
+
options: t.Any,
|
|
42
|
+
console: Inject[Console],
|
|
43
|
+
) -> bool:
|
|
44
|
+
"""Handle changelog dry-run (preview without writing)."""
|
|
45
|
+
console.print("🔍 [bold blue]Previewing changelog generation...[/bold blue]")
|
|
46
|
+
entries = generator.generate_changelog_entries(changelog_since)
|
|
47
|
+
if entries:
|
|
48
|
+
generator._display_changelog_preview(entries)
|
|
49
|
+
console.print("✅ [bold green]Changelog preview completed![/bold green]")
|
|
50
|
+
else:
|
|
51
|
+
console.print("⚠️ No new changelog entries to generate")
|
|
52
|
+
|
|
53
|
+
return should_continue_after_changelog(options)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@depends.inject # type: ignore[misc]
|
|
57
|
+
def handle_changelog_generation(
|
|
58
|
+
services: dict[str, t.Any],
|
|
59
|
+
changelog_path: Path,
|
|
60
|
+
changelog_version: str | None,
|
|
61
|
+
changelog_since: str | None,
|
|
62
|
+
options: t.Any,
|
|
63
|
+
console: Inject[Console],
|
|
64
|
+
) -> bool:
|
|
65
|
+
"""Handle changelog generation and write to file."""
|
|
66
|
+
console.print("📝 [bold blue]Generating changelog...[/bold blue]")
|
|
67
|
+
|
|
68
|
+
version = determine_changelog_version(
|
|
69
|
+
services["git_service"], changelog_version, changelog_since, options
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
success = services["generator"].generate_changelog_from_commits(
|
|
73
|
+
changelog_path=changelog_path,
|
|
74
|
+
version=version,
|
|
75
|
+
since_version=changelog_since,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if success:
|
|
79
|
+
console.print(
|
|
80
|
+
f"✅ [bold green]Changelog updated for version {version}![/bold green]"
|
|
81
|
+
)
|
|
82
|
+
return should_continue_after_changelog(options)
|
|
83
|
+
console.print("❌ [bold red]Changelog generation failed![/bold red]")
|
|
84
|
+
return False
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@depends.inject # type: ignore[misc]
|
|
88
|
+
def determine_changelog_version(
|
|
89
|
+
git_service: "GitService",
|
|
90
|
+
changelog_version: str | None,
|
|
91
|
+
changelog_since: str | None,
|
|
92
|
+
options: t.Any,
|
|
93
|
+
console: Inject[Console],
|
|
94
|
+
) -> str:
|
|
95
|
+
"""Determine changelog version (auto-detect via AI or use provided version)."""
|
|
96
|
+
if getattr(options, "auto_version", False) and not changelog_version:
|
|
97
|
+
try:
|
|
98
|
+
import asyncio
|
|
99
|
+
|
|
100
|
+
from crackerjack.services.version_analyzer import VersionAnalyzer
|
|
101
|
+
|
|
102
|
+
version_analyzer = VersionAnalyzer(git_service)
|
|
103
|
+
console.print(
|
|
104
|
+
"[cyan]🔍[/cyan] Analyzing version changes for intelligent changelog..."
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
recommendation = asyncio.run(
|
|
108
|
+
version_analyzer.recommend_version_bump(changelog_since)
|
|
109
|
+
)
|
|
110
|
+
version = recommendation.recommended_version
|
|
111
|
+
console.print(f"[green]✨[/green] Using AI-recommended version: {version}")
|
|
112
|
+
return version
|
|
113
|
+
except Exception as e:
|
|
114
|
+
console.print(f"[yellow]⚠️[/yellow] Version analysis failed: {e}")
|
|
115
|
+
return changelog_version or "Unreleased"
|
|
116
|
+
|
|
117
|
+
return changelog_version or "Unreleased"
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def should_continue_after_changelog(options: t.Any) -> bool:
|
|
121
|
+
"""Check if workflow should continue after changelog commands."""
|
|
122
|
+
return any(
|
|
123
|
+
[
|
|
124
|
+
options.run_tests,
|
|
125
|
+
options.strip_code,
|
|
126
|
+
options.all,
|
|
127
|
+
options.publish,
|
|
128
|
+
options.comp,
|
|
129
|
+
]
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def handle_changelog_commands(
|
|
134
|
+
generate_changelog: bool,
|
|
135
|
+
changelog_dry_run: bool,
|
|
136
|
+
changelog_version: str | None,
|
|
137
|
+
changelog_since: str | None,
|
|
138
|
+
options: t.Any,
|
|
139
|
+
) -> bool:
|
|
140
|
+
"""Handle all changelog-related commands (generation, dry-run, versioning).
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
generate_changelog: Whether to generate changelog
|
|
144
|
+
changelog_dry_run: Whether to preview changelog without writing
|
|
145
|
+
changelog_version: Explicit version to use (or None for auto/unreleased)
|
|
146
|
+
changelog_since: Git reference to generate changelog since
|
|
147
|
+
options: CLI options object
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
True if execution should continue to other workflows
|
|
151
|
+
"""
|
|
152
|
+
if not (generate_changelog or changelog_dry_run):
|
|
153
|
+
return True
|
|
154
|
+
|
|
155
|
+
services = setup_changelog_services()
|
|
156
|
+
changelog_path = services["pkg_path"] / "CHANGELOG.md"
|
|
157
|
+
|
|
158
|
+
if changelog_dry_run:
|
|
159
|
+
return handle_changelog_dry_run(services["generator"], changelog_since, options)
|
|
160
|
+
|
|
161
|
+
if generate_changelog:
|
|
162
|
+
return handle_changelog_generation(
|
|
163
|
+
services, changelog_path, changelog_version, changelog_since, options
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
return should_continue_after_changelog(options)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
# === Version Analysis Handler ===
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
@depends.inject # type: ignore[misc]
|
|
173
|
+
def handle_version_analysis(
|
|
174
|
+
auto_version: bool,
|
|
175
|
+
version_since: str | None,
|
|
176
|
+
accept_version: bool,
|
|
177
|
+
options: t.Any,
|
|
178
|
+
console: Inject[Console],
|
|
179
|
+
) -> bool:
|
|
180
|
+
"""Handle automated version analysis and recommendations.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
auto_version: Whether to perform automated version analysis
|
|
184
|
+
version_since: Git reference to analyze changes since
|
|
185
|
+
accept_version: Whether to auto-accept the recommendation
|
|
186
|
+
options: CLI options object
|
|
187
|
+
console: Rich console for output
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
True if execution should continue to other workflows
|
|
191
|
+
"""
|
|
192
|
+
if not auto_version:
|
|
193
|
+
return True
|
|
194
|
+
|
|
195
|
+
from rich.prompt import Confirm
|
|
196
|
+
|
|
197
|
+
from crackerjack.services.git import GitService
|
|
198
|
+
from crackerjack.services.version_analyzer import VersionAnalyzer
|
|
199
|
+
|
|
200
|
+
Path()
|
|
201
|
+
git_service = GitService()
|
|
202
|
+
version_analyzer = VersionAnalyzer(git_service)
|
|
203
|
+
|
|
204
|
+
try:
|
|
205
|
+
import asyncio
|
|
206
|
+
|
|
207
|
+
recommendation = asyncio.run(
|
|
208
|
+
version_analyzer.recommend_version_bump(version_since)
|
|
209
|
+
)
|
|
210
|
+
version_analyzer.display_recommendation(recommendation)
|
|
211
|
+
|
|
212
|
+
if accept_version or Confirm.ask(
|
|
213
|
+
f"\nAccept recommendation ({recommendation.bump_type.value})",
|
|
214
|
+
default=True,
|
|
215
|
+
):
|
|
216
|
+
console.print(
|
|
217
|
+
f"[green]✅ Version bump accepted: {recommendation.current_version} → {recommendation.recommended_version}[/green]"
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
else:
|
|
221
|
+
console.print("[yellow]❌ Version bump declined[/yellow]")
|
|
222
|
+
|
|
223
|
+
except Exception as e:
|
|
224
|
+
console.print(f"[red]❌ Version analysis failed: {e}[/red]")
|
|
225
|
+
|
|
226
|
+
return any(
|
|
227
|
+
[
|
|
228
|
+
options.run_tests,
|
|
229
|
+
options.strip_code,
|
|
230
|
+
options.all,
|
|
231
|
+
options.publish,
|
|
232
|
+
options.comp,
|
|
233
|
+
]
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# === Debug/Verbose Setup ===
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def setup_debug_and_verbose_flags(
|
|
241
|
+
ai_fix: bool, ai_debug: bool, debug: bool, verbose: bool, options: t.Any
|
|
242
|
+
) -> tuple[bool, bool]:
|
|
243
|
+
"""Set up debug and verbose flags for AI and general operations.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
ai_fix: Whether AI fixing is enabled
|
|
247
|
+
ai_debug: Whether AI debug mode is enabled
|
|
248
|
+
debug: Whether general debug mode is enabled
|
|
249
|
+
verbose: Whether verbose output is enabled
|
|
250
|
+
options: CLI options object to update
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
Tuple of (ai_fix, verbose) flags after processing
|
|
254
|
+
"""
|
|
255
|
+
if ai_debug:
|
|
256
|
+
ai_fix = True
|
|
257
|
+
verbose = True
|
|
258
|
+
options.verbose = True
|
|
259
|
+
options.ai_debug = True # Set ai_debug on options for downstream checks
|
|
260
|
+
|
|
261
|
+
if debug:
|
|
262
|
+
verbose = True
|
|
263
|
+
options.verbose = True
|
|
264
|
+
|
|
265
|
+
# Set up structured logging for AI-related operations if needed
|
|
266
|
+
if ai_fix or ai_debug:
|
|
267
|
+
from crackerjack.services.logging import setup_structured_logging
|
|
268
|
+
|
|
269
|
+
setup_structured_logging(level="DEBUG", json_output=True)
|
|
270
|
+
|
|
271
|
+
return ai_fix, verbose
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Config-related handlers for the CLI."""
|
|
2
|
+
|
|
3
|
+
# This is a placeholder - in a proper refactoring, these functions would be moved
|
|
4
|
+
# from the original handlers.py file to the appropriate module
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def handle_config_updates(options, console=None):
|
|
8
|
+
"""Handle configuration update commands."""
|
|
9
|
+
# This function would be implemented based on the original in handlers.py
|
|
10
|
+
# For now, we'll just raise an error to indicate this needs to be implemented
|
|
11
|
+
raise NotImplementedError(
|
|
12
|
+
"handle_config_updates needs to be properly implemented in the modular structure"
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = ["handle_config_updates"]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""CLI handlers for test coverage reporting and status"""
|
|
2
|
+
|
|
3
|
+
import typing as t
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from acb.console import Console
|
|
7
|
+
from acb.depends import Inject, depends
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@depends.inject # type: ignore[misc]
|
|
11
|
+
def display_coverage_info(
|
|
12
|
+
coverage_info: dict[str, t.Any], console: Inject[Console]
|
|
13
|
+
) -> None:
|
|
14
|
+
coverage_percent = coverage_info.get("coverage_percent", 0.0)
|
|
15
|
+
coverage_source = coverage_info.get("source", "unknown")
|
|
16
|
+
|
|
17
|
+
if coverage_percent > 0:
|
|
18
|
+
console.print(
|
|
19
|
+
f"[green]Current Coverage:[/green] {coverage_percent:.2f}% (from {coverage_source})"
|
|
20
|
+
)
|
|
21
|
+
else:
|
|
22
|
+
console.print("[yellow]Current Coverage:[/yellow] No coverage data available")
|
|
23
|
+
|
|
24
|
+
status_message = coverage_info.get("message")
|
|
25
|
+
if status_message:
|
|
26
|
+
console.print(f"[dim]{status_message}[/dim]")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@depends.inject # type: ignore[misc]
|
|
30
|
+
def display_coverage_report(test_manager: t.Any, console: Inject[Console]) -> None:
|
|
31
|
+
coverage_report = test_manager.get_coverage_report()
|
|
32
|
+
if coverage_report:
|
|
33
|
+
console.print(f"[cyan]Details:[/cyan] {coverage_report}")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@depends.inject # type: ignore[misc]
|
|
37
|
+
def display_ratchet_status(test_manager: t.Any, console: Inject[Console]) -> None:
|
|
38
|
+
from contextlib import suppress
|
|
39
|
+
|
|
40
|
+
with suppress(Exception):
|
|
41
|
+
ratchet_status = test_manager.get_coverage_ratchet_status()
|
|
42
|
+
if ratchet_status:
|
|
43
|
+
next_milestone = ratchet_status.get("next_milestone")
|
|
44
|
+
if next_milestone:
|
|
45
|
+
console.print(f"[cyan]Next Milestone:[/cyan] {next_milestone:.0f}%")
|
|
46
|
+
|
|
47
|
+
milestones = ratchet_status.get("milestones_achieved", [])
|
|
48
|
+
if milestones:
|
|
49
|
+
console.print(f"[green]Milestones Achieved:[/green] {len(milestones)}")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@depends.inject # type: ignore[misc]
|
|
53
|
+
def handle_coverage_status(
|
|
54
|
+
coverage_status: bool, options: t.Any, console: Inject[Console]
|
|
55
|
+
) -> bool:
|
|
56
|
+
if not coverage_status:
|
|
57
|
+
return True
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
from crackerjack.managers.test_manager import TestManager
|
|
61
|
+
|
|
62
|
+
pkg_path = Path.cwd()
|
|
63
|
+
|
|
64
|
+
test_manager = TestManager(pkg_path)
|
|
65
|
+
|
|
66
|
+
console.print("[cyan]📊[/cyan] Coverage Status Report")
|
|
67
|
+
console.print("=" * 50)
|
|
68
|
+
|
|
69
|
+
coverage_info = test_manager.get_coverage()
|
|
70
|
+
display_coverage_info(coverage_info)
|
|
71
|
+
|
|
72
|
+
display_coverage_report(test_manager)
|
|
73
|
+
|
|
74
|
+
display_ratchet_status(test_manager)
|
|
75
|
+
|
|
76
|
+
console.print()
|
|
77
|
+
return False
|
|
78
|
+
|
|
79
|
+
except Exception as e:
|
|
80
|
+
console.print(f"[red]❌[/red] Failed to get coverage status: {e}")
|
|
81
|
+
import traceback
|
|
82
|
+
|
|
83
|
+
console.print(f"[dim]{traceback.format_exc()}[/dim]")
|
|
84
|
+
return False
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"""CLI handlers for documentation generation and validation.
|
|
2
|
+
|
|
3
|
+
This module contains handlers for:
|
|
4
|
+
- API documentation generation
|
|
5
|
+
- Documentation validation
|
|
6
|
+
- MkDocs integration and site building
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import typing as t
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from acb.console import Console
|
|
13
|
+
from acb.depends import Inject, depends
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@depends.inject # type: ignore[misc]
|
|
17
|
+
def generate_documentation(doc_service: t.Any, console: Inject[Console]) -> bool:
|
|
18
|
+
"""Generate API documentation using documentation service."""
|
|
19
|
+
console.print("📖 [bold blue]Generating API documentation...[/bold blue]")
|
|
20
|
+
success = doc_service.generate_full_api_documentation()
|
|
21
|
+
if success:
|
|
22
|
+
console.print(
|
|
23
|
+
"✅ [bold green]Documentation generated successfully![/bold green]"
|
|
24
|
+
)
|
|
25
|
+
return True
|
|
26
|
+
console.print("❌ [bold red]Documentation generation failed![/bold red]")
|
|
27
|
+
return False
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@depends.inject # type: ignore[misc]
|
|
31
|
+
def validate_documentation_files(doc_service: t.Any, console: Inject[Console]) -> None:
|
|
32
|
+
"""Validate existing documentation files for consistency."""
|
|
33
|
+
console.print("🔍 [bold blue]Validating documentation...[/bold blue]")
|
|
34
|
+
doc_paths = [Path("docs"), Path("README.md"), Path("CHANGELOG.md")]
|
|
35
|
+
existing_docs = [p for p in doc_paths if p.exists()]
|
|
36
|
+
|
|
37
|
+
if existing_docs:
|
|
38
|
+
issues = doc_service.validate_documentation(existing_docs)
|
|
39
|
+
if issues:
|
|
40
|
+
console.print(f"⚠️ Found {len(issues)} documentation issues:")
|
|
41
|
+
for issue in issues:
|
|
42
|
+
file_path = issue.get("path", issue.get("file", "unknown"))
|
|
43
|
+
console.print(f" - {file_path}: {issue['message']}")
|
|
44
|
+
else:
|
|
45
|
+
console.print(
|
|
46
|
+
"✅ [bold green]Documentation validation passed![/bold green]"
|
|
47
|
+
)
|
|
48
|
+
else:
|
|
49
|
+
console.print("⚠️ No documentation files found to validate")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def handle_documentation_commands(
|
|
53
|
+
generate_docs: bool, validate_docs: bool, options: t.Any
|
|
54
|
+
) -> bool:
|
|
55
|
+
"""Handle documentation generation and validation commands.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
generate_docs: Whether to generate API documentation
|
|
59
|
+
validate_docs: Whether to validate existing documentation
|
|
60
|
+
options: CLI options object with run_tests, strip_code, all, publish, comp flags
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
True if execution should continue to other workflows
|
|
64
|
+
"""
|
|
65
|
+
if not (generate_docs or validate_docs):
|
|
66
|
+
return True
|
|
67
|
+
|
|
68
|
+
from crackerjack.services.documentation_service import DocumentationServiceImpl
|
|
69
|
+
|
|
70
|
+
# Use current working directory instead of hardcoded "crackerjack"
|
|
71
|
+
pkg_path = Path.cwd()
|
|
72
|
+
doc_service = DocumentationServiceImpl(pkg_path=pkg_path)
|
|
73
|
+
|
|
74
|
+
if generate_docs:
|
|
75
|
+
if not generate_documentation(doc_service):
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
if validate_docs:
|
|
79
|
+
validate_documentation_files(doc_service)
|
|
80
|
+
|
|
81
|
+
return any(
|
|
82
|
+
[
|
|
83
|
+
options.run_tests,
|
|
84
|
+
options.strip_code,
|
|
85
|
+
options.all,
|
|
86
|
+
options.publish,
|
|
87
|
+
options.comp,
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# === MkDocs Integration Handlers ===
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def create_sync_filesystem_service() -> t.Any:
|
|
96
|
+
"""Create synchronous filesystem service for MkDocs integration."""
|
|
97
|
+
|
|
98
|
+
class SyncFileSystemService:
|
|
99
|
+
def read_file(self, path: str | Path) -> str:
|
|
100
|
+
return Path(path).read_text()
|
|
101
|
+
|
|
102
|
+
def write_file(self, path: str | Path, content: str) -> None:
|
|
103
|
+
Path(path).write_text(content)
|
|
104
|
+
|
|
105
|
+
def exists(self, path: str | Path) -> bool:
|
|
106
|
+
return Path(path).exists()
|
|
107
|
+
|
|
108
|
+
def mkdir(self, path: str | Path, parents: bool = False) -> None:
|
|
109
|
+
Path(path).mkdir(parents=parents, exist_ok=True)
|
|
110
|
+
|
|
111
|
+
def ensure_directory(self, path: str | Path) -> None:
|
|
112
|
+
Path(path).mkdir(parents=True, exist_ok=True)
|
|
113
|
+
|
|
114
|
+
return SyncFileSystemService()
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def create_config_manager() -> t.Any:
|
|
118
|
+
"""Create configuration manager for MkDocs integration."""
|
|
119
|
+
|
|
120
|
+
class ConfigManager:
|
|
121
|
+
def __init__(self) -> None:
|
|
122
|
+
self._config: dict[str, t.Any] = {}
|
|
123
|
+
|
|
124
|
+
def get(self, key: str, default: t.Any = None) -> t.Any:
|
|
125
|
+
return self._config.get(key, default)
|
|
126
|
+
|
|
127
|
+
def set(self, key: str, value: t.Any) -> None:
|
|
128
|
+
self._config[key] = value
|
|
129
|
+
|
|
130
|
+
def save(self) -> bool:
|
|
131
|
+
return True
|
|
132
|
+
|
|
133
|
+
def load(self) -> bool:
|
|
134
|
+
return True
|
|
135
|
+
|
|
136
|
+
return ConfigManager()
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def create_logger_adapter(logger: t.Any) -> t.Any:
|
|
140
|
+
"""Create logger adapter for MkDocs integration."""
|
|
141
|
+
|
|
142
|
+
class LoggerAdapter:
|
|
143
|
+
def __init__(self, logger: t.Any) -> None:
|
|
144
|
+
self._logger = logger
|
|
145
|
+
|
|
146
|
+
def debug(self, message: str, **kwargs: t.Any) -> None:
|
|
147
|
+
self._logger.debug(message)
|
|
148
|
+
|
|
149
|
+
def info(self, message: str, **kwargs: t.Any) -> None:
|
|
150
|
+
self._logger.info(message)
|
|
151
|
+
|
|
152
|
+
def warning(self, message: str, **kwargs: t.Any) -> None:
|
|
153
|
+
self._logger.warning(message)
|
|
154
|
+
|
|
155
|
+
def error(self, message: str, **kwargs: t.Any) -> None:
|
|
156
|
+
self._logger.error(message)
|
|
157
|
+
|
|
158
|
+
return LoggerAdapter(logger)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def create_mkdocs_services() -> dict[str, t.Any]:
|
|
162
|
+
"""Create MkDocs service instances (integration, builder, filesystem, config)."""
|
|
163
|
+
from logging import getLogger
|
|
164
|
+
|
|
165
|
+
from crackerjack.documentation.mkdocs_integration import (
|
|
166
|
+
MkDocsIntegrationService,
|
|
167
|
+
MkDocsSiteBuilder,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
filesystem = create_sync_filesystem_service()
|
|
171
|
+
config_manager = create_config_manager()
|
|
172
|
+
logger = getLogger(__name__)
|
|
173
|
+
logger_adapter = create_logger_adapter(logger)
|
|
174
|
+
|
|
175
|
+
integration_service = MkDocsIntegrationService(
|
|
176
|
+
config_manager, filesystem, logger_adapter
|
|
177
|
+
)
|
|
178
|
+
builder = MkDocsSiteBuilder(integration_service)
|
|
179
|
+
|
|
180
|
+
return {"builder": builder, "filesystem": filesystem, "config": config_manager}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def determine_mkdocs_output_dir(mkdocs_output: str | None) -> Path:
|
|
184
|
+
"""Determine output directory for MkDocs site."""
|
|
185
|
+
return Path(mkdocs_output) if mkdocs_output else Path.cwd() / "docs_site"
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def create_sample_docs_content() -> dict[str, str]:
|
|
189
|
+
"""Create sample documentation content for MkDocs site."""
|
|
190
|
+
return {
|
|
191
|
+
"index.md": "# Project Documentation\n\nWelcome to the project documentation.",
|
|
192
|
+
"getting-started.md": "# Getting Started\n\nQuick start guide for the project.",
|
|
193
|
+
"api-reference.md": "# API Reference\n\nAPI documentation and examples.",
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def build_mkdocs_site(
|
|
198
|
+
builder: t.Any, docs_content: dict[str, str], output_dir: Path, serve: bool
|
|
199
|
+
) -> None:
|
|
200
|
+
"""Build MkDocs documentation site asynchronously."""
|
|
201
|
+
import asyncio
|
|
202
|
+
|
|
203
|
+
asyncio.run(
|
|
204
|
+
builder.build_documentation_site(
|
|
205
|
+
project_name="Project Documentation",
|
|
206
|
+
project_description="Comprehensive project documentation",
|
|
207
|
+
author="Crackerjack",
|
|
208
|
+
documentation_content=docs_content,
|
|
209
|
+
output_dir=output_dir,
|
|
210
|
+
serve=serve,
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
@depends.inject # type: ignore[misc]
|
|
216
|
+
def handle_mkdocs_build_result(
|
|
217
|
+
site: t.Any, mkdocs_serve: bool, console: Inject[Console] = None
|
|
218
|
+
) -> None:
|
|
219
|
+
"""Display MkDocs build results to console."""
|
|
220
|
+
if site:
|
|
221
|
+
console.print(
|
|
222
|
+
f"[green]✅[/green] MkDocs site generated successfully at: {site.build_path}"
|
|
223
|
+
)
|
|
224
|
+
console.print(
|
|
225
|
+
f"[blue]📄[/blue] Generated {len(site.pages)} documentation pages"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
if mkdocs_serve:
|
|
229
|
+
console.print(
|
|
230
|
+
"[blue]🌐[/blue] MkDocs development server started at http://127.0.0.1:8000"
|
|
231
|
+
)
|
|
232
|
+
console.print("[yellow]Press Ctrl+C to stop the server[/yellow]")
|
|
233
|
+
else:
|
|
234
|
+
console.print("[red]❌[/red] Failed to generate MkDocs site")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
@depends.inject # type: ignore[misc]
|
|
238
|
+
def handle_mkdocs_integration(
|
|
239
|
+
mkdocs_integration: bool,
|
|
240
|
+
mkdocs_serve: bool,
|
|
241
|
+
mkdocs_theme: str,
|
|
242
|
+
mkdocs_output: str | None,
|
|
243
|
+
console: Inject[Console],
|
|
244
|
+
) -> bool:
|
|
245
|
+
"""Handle MkDocs integration command for documentation site generation.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
mkdocs_integration: Whether MkDocs integration is requested
|
|
249
|
+
mkdocs_serve: Whether to serve the site locally
|
|
250
|
+
mkdocs_theme: Theme to use for MkDocs site
|
|
251
|
+
mkdocs_output: Output directory for site
|
|
252
|
+
console: Rich console for output
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
True if execution should continue, False otherwise
|
|
256
|
+
"""
|
|
257
|
+
if not mkdocs_integration:
|
|
258
|
+
return True
|
|
259
|
+
|
|
260
|
+
console.print("[cyan]📚[/cyan] Generating MkDocs documentation site...")
|
|
261
|
+
|
|
262
|
+
try:
|
|
263
|
+
services = create_mkdocs_services()
|
|
264
|
+
builder = services["builder"]
|
|
265
|
+
output_dir = determine_mkdocs_output_dir(mkdocs_output)
|
|
266
|
+
docs_content = create_sample_docs_content()
|
|
267
|
+
|
|
268
|
+
console.print(
|
|
269
|
+
f"[blue]🏗️[/blue] Building documentation site with {mkdocs_theme} theme..."
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
build_mkdocs_site(builder, docs_content, output_dir, mkdocs_serve)
|
|
273
|
+
site = None
|
|
274
|
+
handle_mkdocs_build_result(site, mkdocs_serve)
|
|
275
|
+
|
|
276
|
+
return False
|
|
277
|
+
|
|
278
|
+
except Exception as e:
|
|
279
|
+
console.print(f"[red]❌[/red] MkDocs integration error: {e}")
|
|
280
|
+
return False
|