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,485 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [CLAUDE.md](../../docs/guides/CLAUDE.md) | Hooks
|
|
2
|
+
|
|
3
|
+
# Hooks
|
|
4
|
+
|
|
5
|
+
Hook integrations and lifecycle extensions that plug into the runtime for intelligent, LSP-aware quality enforcement.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
The hooks system provides intelligent integration with quality tools through both traditional pre-commit hooks and modern LSP-based type checking. Hooks are executed in two stages (fast and comprehensive) with automatic retry logic and parallel execution support.
|
|
10
|
+
|
|
11
|
+
## Hook System Architecture
|
|
12
|
+
|
|
13
|
+
### Two-Stage Execution Model
|
|
14
|
+
|
|
15
|
+
Crackerjack uses a two-stage hook execution model for optimal performance:
|
|
16
|
+
|
|
17
|
+
1. **Fast Hooks** (~5s) - Quick formatters and basic checks with automatic retry
|
|
18
|
+
|
|
19
|
+
- Formatting tools (Ruff, trailing whitespace, end-of-file fixer)
|
|
20
|
+
- Import sorting
|
|
21
|
+
- Basic static analysis
|
|
22
|
+
- **Retry Policy**: Automatically retry once if failed
|
|
23
|
+
|
|
24
|
+
1. **Comprehensive Hooks** (~30s) - Thorough analysis without retry
|
|
25
|
+
|
|
26
|
+
- Type checking (Zuban/mypy via LSP)
|
|
27
|
+
- Security scanning (Bandit)
|
|
28
|
+
- Complexity analysis
|
|
29
|
+
- Dead code detection (Skylos)
|
|
30
|
+
- **Retry Policy**: Run once, collect all issues
|
|
31
|
+
|
|
32
|
+
### Hook Lifecycle
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
36
|
+
│ Crackerjack Workflow │
|
|
37
|
+
└─────────────────────────────────────────────────────────────┘
|
|
38
|
+
│
|
|
39
|
+
▼
|
|
40
|
+
┌──────────────────────────────────┐
|
|
41
|
+
│ Phase 1: Fast Hooks (~5s) │
|
|
42
|
+
│ • Formatters (Ruff, etc.) │
|
|
43
|
+
│ • Import sorting │
|
|
44
|
+
│ • Retry once on failure │
|
|
45
|
+
└──────────────────────────────────┘
|
|
46
|
+
│
|
|
47
|
+
▼
|
|
48
|
+
┌────────────────┐
|
|
49
|
+
│ Formatting Fix? │
|
|
50
|
+
└────────────────┘
|
|
51
|
+
│ │
|
|
52
|
+
Yes No
|
|
53
|
+
│ │
|
|
54
|
+
▼ ▼
|
|
55
|
+
┌──────────┐ ┌──────────┐
|
|
56
|
+
│ Retry │ │ Continue │
|
|
57
|
+
│ Fast │ │ │
|
|
58
|
+
│ Hooks │ │ │
|
|
59
|
+
└──────────┘ └──────────┘
|
|
60
|
+
│ │
|
|
61
|
+
└─────┬──────┘
|
|
62
|
+
▼
|
|
63
|
+
┌──────────────────────────────────┐
|
|
64
|
+
│ Phase 2: Test Suite │
|
|
65
|
+
│ • Collect ALL failures │
|
|
66
|
+
│ • Don't stop on first error │
|
|
67
|
+
│ • Parallel execution (xdist) │
|
|
68
|
+
└──────────────────────────────────┘
|
|
69
|
+
│
|
|
70
|
+
▼
|
|
71
|
+
┌──────────────────────────────────┐
|
|
72
|
+
│ Phase 3: Comprehensive Hooks │
|
|
73
|
+
│ • Type checking (LSP) │
|
|
74
|
+
│ • Security scanning │
|
|
75
|
+
│ • Complexity analysis │
|
|
76
|
+
│ • Collect ALL issues │
|
|
77
|
+
└──────────────────────────────────┘
|
|
78
|
+
│
|
|
79
|
+
▼
|
|
80
|
+
┌──────────────────┐
|
|
81
|
+
│ All Issues Found? │
|
|
82
|
+
└──────────────────┘
|
|
83
|
+
│ │
|
|
84
|
+
Yes No
|
|
85
|
+
│ │
|
|
86
|
+
▼ ▼
|
|
87
|
+
┌──────────┐ ┌──────────┐
|
|
88
|
+
│ AI Batch │ │ Success! │
|
|
89
|
+
│ Fixing │ │ │
|
|
90
|
+
│ (if │ │ │
|
|
91
|
+
│ enabled) │ │ │
|
|
92
|
+
└──────────┘ └──────────┘
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Hook Implementations
|
|
96
|
+
|
|
97
|
+
### LSP Hook (`lsp_hook.py`)
|
|
98
|
+
|
|
99
|
+
LSP-aware type checking hook that communicates with running Zuban LSP server:
|
|
100
|
+
|
|
101
|
+
**Features:**
|
|
102
|
+
|
|
103
|
+
- **Fast Type Checking** - Uses running LSP server (no process spawn overhead)
|
|
104
|
+
- **Incremental Analysis** - Checks only modified files when possible
|
|
105
|
+
- **Fallback Support** - Falls back to direct Zuban execution if LSP unavailable
|
|
106
|
+
- **Smart Caching** - Leverages LSP server's incremental compilation cache
|
|
107
|
+
|
|
108
|
+
**Benefits:**
|
|
109
|
+
|
|
110
|
+
- 10-20x faster than spawning separate type checker process
|
|
111
|
+
- Real-time feedback during development
|
|
112
|
+
- Shared analysis state with IDE
|
|
113
|
+
- Reduced memory usage (single server process)
|
|
114
|
+
|
|
115
|
+
**Usage:**
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
from crackerjack.hooks.lsp_hook import main as lsp_hook_main
|
|
119
|
+
|
|
120
|
+
# Run LSP-aware type checking
|
|
121
|
+
exit_code = lsp_hook_main(console=console)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Hook Definitions
|
|
125
|
+
|
|
126
|
+
Hooks are defined in `/home/user/crackerjack/crackerjack/config/hooks.py`:
|
|
127
|
+
|
|
128
|
+
### HookDefinition Attributes
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
@dataclass
|
|
132
|
+
class HookDefinition:
|
|
133
|
+
name: str # Hook identifier
|
|
134
|
+
command: list[str] # Command to execute
|
|
135
|
+
timeout: int = 60 # Execution timeout (seconds)
|
|
136
|
+
stage: HookStage = FAST # FAST or COMPREHENSIVE
|
|
137
|
+
description: str | None # Human-readable description
|
|
138
|
+
retry_on_failure: bool # Auto-retry if failed
|
|
139
|
+
is_formatting: bool # Is this a formatter?
|
|
140
|
+
manual_stage: bool # Manual pre-commit stage
|
|
141
|
+
config_path: Path | None # Custom config file path
|
|
142
|
+
security_level: SecurityLevel # CRITICAL, HIGH, MEDIUM, LOW
|
|
143
|
+
use_precommit_legacy: bool # Use pre-commit wrapper
|
|
144
|
+
accepts_file_paths: bool # Accepts individual file paths
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### HookStrategy
|
|
148
|
+
|
|
149
|
+
Groups hooks with execution strategy:
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
@dataclass
|
|
153
|
+
class HookStrategy:
|
|
154
|
+
name: str # Strategy name
|
|
155
|
+
hooks: list[HookDefinition] # Hooks to execute
|
|
156
|
+
timeout: int = 300 # Total timeout
|
|
157
|
+
retry_policy: RetryPolicy = NONE # Retry behavior
|
|
158
|
+
parallel: bool = False # Parallel execution
|
|
159
|
+
max_workers: int = 3 # Max parallel workers
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Hook Stages
|
|
163
|
+
|
|
164
|
+
```python
|
|
165
|
+
class HookStage(Enum):
|
|
166
|
+
FAST = "fast" # Fast hooks (~5s)
|
|
167
|
+
COMPREHENSIVE = "comprehensive" # Comprehensive hooks (~30s)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Retry Policies
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
class RetryPolicy(Enum):
|
|
174
|
+
NONE = "none" # No retry
|
|
175
|
+
FORMATTING_ONLY = "formatting_only" # Retry formatters only
|
|
176
|
+
ALL_HOOKS = "all_hooks" # Retry all hooks
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Security Levels
|
|
180
|
+
|
|
181
|
+
```python
|
|
182
|
+
class SecurityLevel(Enum):
|
|
183
|
+
CRITICAL = "critical" # Security-critical hooks
|
|
184
|
+
HIGH = "high" # High-priority checks
|
|
185
|
+
MEDIUM = "medium" # Standard checks
|
|
186
|
+
LOW = "low" # Low-priority checks
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Creating Custom Hooks
|
|
190
|
+
|
|
191
|
+
### Method 1: Add to Hook Definitions
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
# In crackerjack/config/hooks.py
|
|
195
|
+
from crackerjack.config.hooks import HookDefinition, HookStage, SecurityLevel
|
|
196
|
+
|
|
197
|
+
CUSTOM_HOOK = HookDefinition(
|
|
198
|
+
name="my-custom-check",
|
|
199
|
+
command=["python", "-m", "my_tool", "check"],
|
|
200
|
+
timeout=120,
|
|
201
|
+
stage=HookStage.COMPREHENSIVE,
|
|
202
|
+
description="Custom quality check",
|
|
203
|
+
retry_on_failure=False,
|
|
204
|
+
security_level=SecurityLevel.MEDIUM,
|
|
205
|
+
use_precommit_legacy=False, # Direct invocation
|
|
206
|
+
accepts_file_paths=True, # Can process individual files
|
|
207
|
+
)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Method 2: LSP-Aware Hook
|
|
211
|
+
|
|
212
|
+
For tools with LSP support:
|
|
213
|
+
|
|
214
|
+
```python
|
|
215
|
+
#!/usr/bin/env python3
|
|
216
|
+
"""LSP-aware hook for custom tool."""
|
|
217
|
+
|
|
218
|
+
import sys
|
|
219
|
+
from pathlib import Path
|
|
220
|
+
from acb.console import Console
|
|
221
|
+
from crackerjack.services.lsp_client import LSPClient
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def main(console: Console | None = None) -> int:
|
|
225
|
+
console = console or Console()
|
|
226
|
+
files_to_check = sys.argv[1:] if len(sys.argv) > 1 else []
|
|
227
|
+
|
|
228
|
+
lsp_client = LSPClient()
|
|
229
|
+
|
|
230
|
+
if not lsp_client.is_server_running():
|
|
231
|
+
# Fallback to direct tool execution
|
|
232
|
+
return run_tool_directly(files_to_check)
|
|
233
|
+
|
|
234
|
+
# Use LSP server for checking
|
|
235
|
+
diagnostics = lsp_client.get_diagnostics(files_to_check)
|
|
236
|
+
|
|
237
|
+
if diagnostics:
|
|
238
|
+
for diag in diagnostics:
|
|
239
|
+
console.print(f"[red]✗[/red] {diag.file}:{diag.line}: {diag.message}")
|
|
240
|
+
return 1
|
|
241
|
+
|
|
242
|
+
console.print("[green]✓[/green] All checks passed")
|
|
243
|
+
return 0
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
if __name__ == "__main__":
|
|
247
|
+
sys.exit(main())
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Method 3: Pre-commit Integration
|
|
251
|
+
|
|
252
|
+
Add to `.pre-commit-config.yaml`:
|
|
253
|
+
|
|
254
|
+
```yaml
|
|
255
|
+
repos:
|
|
256
|
+
- repo: local
|
|
257
|
+
hooks:
|
|
258
|
+
- id: my-custom-check
|
|
259
|
+
name: My Custom Check
|
|
260
|
+
entry: python -m my_tool check
|
|
261
|
+
language: system
|
|
262
|
+
types: [python]
|
|
263
|
+
pass_filenames: true
|
|
264
|
+
stages: [manual] # For comprehensive stage
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Hook Execution Patterns
|
|
268
|
+
|
|
269
|
+
### Sequential Execution
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
from crackerjack.executors import HookExecutor
|
|
273
|
+
from acb.depends import depends
|
|
274
|
+
|
|
275
|
+
executor = depends.get(HookExecutor)
|
|
276
|
+
|
|
277
|
+
# Execute hooks sequentially
|
|
278
|
+
result = await executor.execute_strategy(strategy_name="fast_hooks", parallel=False)
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Parallel Execution
|
|
282
|
+
|
|
283
|
+
```python
|
|
284
|
+
# Execute compatible hooks in parallel
|
|
285
|
+
result = await executor.execute_strategy(
|
|
286
|
+
strategy_name="comprehensive_hooks", parallel=True, max_workers=4
|
|
287
|
+
)
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Selective Execution
|
|
291
|
+
|
|
292
|
+
```python
|
|
293
|
+
# Execute specific hooks
|
|
294
|
+
result = await executor.execute_hooks(
|
|
295
|
+
hooks=["ruff-format", "ruff-check"], stage=HookStage.FAST
|
|
296
|
+
)
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Incremental Execution (File-Targeted)
|
|
300
|
+
|
|
301
|
+
```python
|
|
302
|
+
from pathlib import Path
|
|
303
|
+
|
|
304
|
+
# Only check modified files
|
|
305
|
+
modified_files = [Path("src/main.py"), Path("tests/test_main.py")]
|
|
306
|
+
|
|
307
|
+
result = await executor.execute_hooks_on_files(
|
|
308
|
+
hooks=["ruff-check", "mypy"], files=modified_files
|
|
309
|
+
)
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Configuration
|
|
313
|
+
|
|
314
|
+
Hooks are configured through ACB Settings:
|
|
315
|
+
|
|
316
|
+
```yaml
|
|
317
|
+
# settings/crackerjack.yaml
|
|
318
|
+
|
|
319
|
+
# Hook execution
|
|
320
|
+
skip_hooks: false # Skip all hooks
|
|
321
|
+
hooks_parallel: true # Parallel hook execution
|
|
322
|
+
max_parallel_hooks: 4 # Max parallel workers
|
|
323
|
+
hook_timeout: 300 # Global hook timeout (seconds)
|
|
324
|
+
|
|
325
|
+
# Fast hooks configuration
|
|
326
|
+
fast_hooks_enabled: true
|
|
327
|
+
fast_hooks_timeout: 60
|
|
328
|
+
fast_hooks_retry: true # Auto-retry on failure
|
|
329
|
+
|
|
330
|
+
# Comprehensive hooks configuration
|
|
331
|
+
comprehensive_hooks_enabled: true
|
|
332
|
+
comprehensive_hooks_timeout: 180
|
|
333
|
+
comprehensive_hooks_retry: false # Don't retry (collect all issues)
|
|
334
|
+
|
|
335
|
+
# LSP integration
|
|
336
|
+
lsp_enabled: true
|
|
337
|
+
lsp_fallback: true # Fallback to direct execution
|
|
338
|
+
lsp_server_startup_timeout: 30
|
|
339
|
+
|
|
340
|
+
# Hook-specific overrides
|
|
341
|
+
hook_overrides:
|
|
342
|
+
ruff-format:
|
|
343
|
+
timeout: 120
|
|
344
|
+
zuban-lsp:
|
|
345
|
+
use_lsp: true
|
|
346
|
+
fallback_command: ["zuban", "check", "src"]
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Usage Examples
|
|
350
|
+
|
|
351
|
+
### Basic Hook Execution
|
|
352
|
+
|
|
353
|
+
```python
|
|
354
|
+
from crackerjack.executors import HookExecutor
|
|
355
|
+
from pathlib import Path
|
|
356
|
+
|
|
357
|
+
# Initialize executor
|
|
358
|
+
executor = HookExecutor(console=console, pkg_path=Path.cwd(), verbose=True)
|
|
359
|
+
|
|
360
|
+
# Run fast hooks
|
|
361
|
+
fast_result = await executor.execute_strategy("fast_hooks")
|
|
362
|
+
|
|
363
|
+
if fast_result.success:
|
|
364
|
+
print("✅ Fast hooks passed")
|
|
365
|
+
else:
|
|
366
|
+
print(f"❌ {fast_result.failed_count} fast hooks failed")
|
|
367
|
+
|
|
368
|
+
# Run comprehensive hooks
|
|
369
|
+
comp_result = await executor.execute_strategy("comprehensive_hooks")
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### LSP-Aware Type Checking
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
# Command-line usage
|
|
376
|
+
python -m crackerjack.hooks.lsp_hook src/main.py tests/test_main.py
|
|
377
|
+
|
|
378
|
+
# Or check all project files
|
|
379
|
+
python -m crackerjack.hooks.lsp_hook
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Custom Hook Strategy
|
|
383
|
+
|
|
384
|
+
```python
|
|
385
|
+
from crackerjack.config.hooks import HookStrategy, HookDefinition, RetryPolicy
|
|
386
|
+
|
|
387
|
+
custom_strategy = HookStrategy(
|
|
388
|
+
name="security-audit",
|
|
389
|
+
hooks=[
|
|
390
|
+
HookDefinition(
|
|
391
|
+
name="bandit",
|
|
392
|
+
command=["bandit", "-r", "src"],
|
|
393
|
+
timeout=180,
|
|
394
|
+
security_level=SecurityLevel.CRITICAL,
|
|
395
|
+
),
|
|
396
|
+
HookDefinition(
|
|
397
|
+
name="safety",
|
|
398
|
+
command=["safety", "check"],
|
|
399
|
+
timeout=60,
|
|
400
|
+
security_level=SecurityLevel.HIGH,
|
|
401
|
+
),
|
|
402
|
+
],
|
|
403
|
+
timeout=300,
|
|
404
|
+
retry_policy=RetryPolicy.NONE,
|
|
405
|
+
parallel=True,
|
|
406
|
+
max_workers=2,
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
# Execute custom strategy
|
|
410
|
+
result = await executor.execute_custom_strategy(custom_strategy)
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
## Integration with Executors
|
|
414
|
+
|
|
415
|
+
Hooks are executed by specialized executors (see [Executors](<../executors/README.md>)):
|
|
416
|
+
|
|
417
|
+
- **HookExecutor** - Base executor with sequential execution
|
|
418
|
+
- **AsyncHookExecutor** - Asynchronous hook execution
|
|
419
|
+
- **CachedHookExecutor** - Caching for repeated executions
|
|
420
|
+
- **ProgressHookExecutor** - Progress tracking and reporting
|
|
421
|
+
- **LSPAwareHookExecutor** - LSP-aware execution optimization
|
|
422
|
+
|
|
423
|
+
## Best Practices
|
|
424
|
+
|
|
425
|
+
1. **Use Two-Stage Model** - Separate fast and comprehensive hooks for optimal workflow
|
|
426
|
+
1. **Enable LSP** - Use LSP integration for 10-20x faster type checking
|
|
427
|
+
1. **Retry Formatters** - Enable auto-retry for formatting hooks only
|
|
428
|
+
1. **Collect All Issues** - Don't fail fast in comprehensive stage
|
|
429
|
+
1. **Parallel Execution** - Enable parallel execution for independent hooks
|
|
430
|
+
1. **Set Appropriate Timeouts** - Configure per-hook timeouts based on codebase size
|
|
431
|
+
1. **Use Incremental Execution** - Target only modified files when possible
|
|
432
|
+
1. **Security Levels** - Assign appropriate security levels for prioritization
|
|
433
|
+
1. **Cache Results** - Use CachedHookExecutor for repeated runs
|
|
434
|
+
1. **Monitor Performance** - Track hook execution times and optimize slow hooks
|
|
435
|
+
|
|
436
|
+
## Performance Optimization
|
|
437
|
+
|
|
438
|
+
### LSP vs Direct Execution
|
|
439
|
+
|
|
440
|
+
```
|
|
441
|
+
Traditional (direct tool invocation):
|
|
442
|
+
Type checking: ~30-60s per run
|
|
443
|
+
Memory: ~500MB per process
|
|
444
|
+
Startup overhead: ~2-5s
|
|
445
|
+
|
|
446
|
+
LSP-aware (persistent server):
|
|
447
|
+
Type checking: ~2-5s per run (10-20x faster)
|
|
448
|
+
Memory: ~500MB shared across all checks
|
|
449
|
+
Startup overhead: ~0s (server already running)
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Caching Strategy
|
|
453
|
+
|
|
454
|
+
```python
|
|
455
|
+
from crackerjack.executors import CachedHookExecutor
|
|
456
|
+
|
|
457
|
+
cached_executor = CachedHookExecutor(
|
|
458
|
+
console=console,
|
|
459
|
+
pkg_path=pkg_path,
|
|
460
|
+
cache_ttl=3600, # 1 hour cache
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
# First run: Full execution
|
|
464
|
+
result1 = await cached_executor.execute_strategy("fast_hooks")
|
|
465
|
+
|
|
466
|
+
# Subsequent runs: Cached results for unchanged files
|
|
467
|
+
result2 = await cached_executor.execute_strategy("fast_hooks")
|
|
468
|
+
print(f"Cache hit rate: {result2.cache_hit_rate:.1%}")
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
## Related
|
|
472
|
+
|
|
473
|
+
- [Executors](<../executors/README.md>) - Hook execution engines
|
|
474
|
+
- [Config](<../config/README.md>) - Hook configuration and definitions
|
|
475
|
+
- [Workflows](<../workflows/README.md>) - Workflow integration
|
|
476
|
+
- [CLAUDE.md](../../docs/guides/CLAUDE.md) - Two-stage quality process documentation
|
|
477
|
+
|
|
478
|
+
## Future Enhancements
|
|
479
|
+
|
|
480
|
+
- [ ] DAG-based hook dependency resolution
|
|
481
|
+
- [ ] Real-time hook execution monitoring dashboard
|
|
482
|
+
- [ ] Machine learning for hook execution optimization
|
|
483
|
+
- [ ] Distributed hook execution across multiple machines
|
|
484
|
+
- [ ] Hook execution profiling and bottleneck detection
|
|
485
|
+
- [ ] Custom hook plugin system with discovery
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
LSP-aware type checking hook for crackerjack.
|
|
4
|
+
|
|
5
|
+
This hook communicates with a running Zuban LSP server to perform type checking
|
|
6
|
+
instead of spawning a separate zuban process, providing faster and more efficient
|
|
7
|
+
type checking during pre-commit hooks.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from acb.console import Console
|
|
14
|
+
|
|
15
|
+
from crackerjack.services.lsp_client import LSPClient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def main(console: Console | None = None) -> int:
|
|
19
|
+
"""Main entry point for LSP hook."""
|
|
20
|
+
console = console or Console()
|
|
21
|
+
# Get files to check from command line arguments
|
|
22
|
+
files_to_check = sys.argv[1:] if len(sys.argv) > 1 else []
|
|
23
|
+
|
|
24
|
+
# If no files specified, check project files
|
|
25
|
+
if not files_to_check:
|
|
26
|
+
files_to_check = _get_project_files()
|
|
27
|
+
|
|
28
|
+
if not files_to_check:
|
|
29
|
+
console.print("🔍 No Python files to check")
|
|
30
|
+
return 0
|
|
31
|
+
|
|
32
|
+
lsp_client = LSPClient()
|
|
33
|
+
|
|
34
|
+
# Check if LSP server is running
|
|
35
|
+
if not lsp_client.is_server_running():
|
|
36
|
+
return _fallback_to_zuban_check(console, files_to_check)
|
|
37
|
+
|
|
38
|
+
# Use LSP server for type checking
|
|
39
|
+
return _check_files_with_lsp(console, lsp_client, files_to_check)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _get_project_files() -> list[str]:
|
|
43
|
+
"""Get project files to check."""
|
|
44
|
+
project_path = Path.cwd()
|
|
45
|
+
lsp_client = LSPClient()
|
|
46
|
+
return lsp_client.get_project_files(project_path)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _fallback_to_zuban_check(console: Console, files_to_check: list[str]) -> int:
|
|
50
|
+
"""Fall back to regular zuban execution when LSP server is not running."""
|
|
51
|
+
console.print("⚠️ Zuban LSP server not running, falling back to direct zuban check")
|
|
52
|
+
# Fall back to regular zuban execution
|
|
53
|
+
import subprocess
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
result = subprocess.run(
|
|
57
|
+
["zuban", "check"] + files_to_check,
|
|
58
|
+
capture_output=True,
|
|
59
|
+
text=True,
|
|
60
|
+
timeout=120,
|
|
61
|
+
)
|
|
62
|
+
if result.stdout:
|
|
63
|
+
console.print(result.stdout)
|
|
64
|
+
if result.stderr:
|
|
65
|
+
console.print(result.stderr, style="red")
|
|
66
|
+
return result.returncode
|
|
67
|
+
except (subprocess.TimeoutExpired, FileNotFoundError) as e:
|
|
68
|
+
console.print(f"❌ Error running zuban: {e}", style="red")
|
|
69
|
+
return 1
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _check_files_with_lsp(
|
|
73
|
+
console: Console, lsp_client: LSPClient, files_to_check: list[str]
|
|
74
|
+
) -> int:
|
|
75
|
+
"""Check files using LSP server."""
|
|
76
|
+
server_info = lsp_client.get_server_info()
|
|
77
|
+
if server_info:
|
|
78
|
+
console.print(f"🔍 Using Zuban LSP server (PID: {server_info['pid']})")
|
|
79
|
+
|
|
80
|
+
# Check files via LSP
|
|
81
|
+
diagnostics = lsp_client.check_files(files_to_check)
|
|
82
|
+
|
|
83
|
+
# Display results
|
|
84
|
+
output = lsp_client.format_diagnostics(diagnostics)
|
|
85
|
+
console.print(output)
|
|
86
|
+
|
|
87
|
+
# Return appropriate exit code
|
|
88
|
+
has_errors = any(diags for diags in diagnostics.values())
|
|
89
|
+
return 1 if has_errors else 0
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
if __name__ == "__main__":
|
|
93
|
+
sys.exit(main())
|