crackerjack 0.37.9__py3-none-any.whl → 0.45.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crackerjack/README.md +19 -0
- crackerjack/__init__.py +30 -1
- crackerjack/__main__.py +342 -1263
- crackerjack/adapters/README.md +18 -0
- crackerjack/adapters/__init__.py +27 -5
- crackerjack/adapters/_output_paths.py +167 -0
- crackerjack/adapters/_qa_adapter_base.py +309 -0
- crackerjack/adapters/_tool_adapter_base.py +706 -0
- crackerjack/adapters/ai/README.md +65 -0
- crackerjack/adapters/ai/__init__.py +5 -0
- crackerjack/adapters/ai/claude.py +853 -0
- crackerjack/adapters/complexity/README.md +53 -0
- crackerjack/adapters/complexity/__init__.py +10 -0
- crackerjack/adapters/complexity/complexipy.py +641 -0
- crackerjack/adapters/dependency/__init__.py +22 -0
- crackerjack/adapters/dependency/pip_audit.py +418 -0
- crackerjack/adapters/format/README.md +72 -0
- crackerjack/adapters/format/__init__.py +11 -0
- crackerjack/adapters/format/mdformat.py +313 -0
- crackerjack/adapters/format/ruff.py +516 -0
- crackerjack/adapters/lint/README.md +47 -0
- crackerjack/adapters/lint/__init__.py +11 -0
- crackerjack/adapters/lint/codespell.py +273 -0
- crackerjack/adapters/lsp/README.md +49 -0
- crackerjack/adapters/lsp/__init__.py +27 -0
- crackerjack/adapters/{rust_tool_manager.py → lsp/_manager.py} +3 -3
- crackerjack/adapters/{skylos_adapter.py → lsp/skylos.py} +59 -7
- crackerjack/adapters/{zuban_adapter.py → lsp/zuban.py} +3 -6
- crackerjack/adapters/refactor/README.md +59 -0
- crackerjack/adapters/refactor/__init__.py +12 -0
- crackerjack/adapters/refactor/creosote.py +318 -0
- crackerjack/adapters/refactor/refurb.py +406 -0
- crackerjack/adapters/refactor/skylos.py +494 -0
- crackerjack/adapters/sast/README.md +132 -0
- crackerjack/adapters/sast/__init__.py +32 -0
- crackerjack/adapters/sast/_base.py +201 -0
- crackerjack/adapters/sast/bandit.py +423 -0
- crackerjack/adapters/sast/pyscn.py +405 -0
- crackerjack/adapters/sast/semgrep.py +241 -0
- crackerjack/adapters/security/README.md +111 -0
- crackerjack/adapters/security/__init__.py +17 -0
- crackerjack/adapters/security/gitleaks.py +339 -0
- crackerjack/adapters/type/README.md +52 -0
- crackerjack/adapters/type/__init__.py +12 -0
- crackerjack/adapters/type/pyrefly.py +402 -0
- crackerjack/adapters/type/ty.py +402 -0
- crackerjack/adapters/type/zuban.py +522 -0
- crackerjack/adapters/utility/README.md +51 -0
- crackerjack/adapters/utility/__init__.py +10 -0
- crackerjack/adapters/utility/checks.py +884 -0
- crackerjack/agents/README.md +264 -0
- crackerjack/agents/__init__.py +40 -12
- crackerjack/agents/base.py +1 -0
- crackerjack/agents/claude_code_bridge.py +641 -0
- crackerjack/agents/coordinator.py +49 -53
- crackerjack/agents/dry_agent.py +187 -3
- crackerjack/agents/enhanced_coordinator.py +279 -0
- crackerjack/agents/enhanced_proactive_agent.py +185 -0
- crackerjack/agents/error_middleware.py +53 -0
- crackerjack/agents/formatting_agent.py +6 -8
- crackerjack/agents/helpers/__init__.py +9 -0
- crackerjack/agents/helpers/performance/__init__.py +22 -0
- crackerjack/agents/helpers/performance/performance_ast_analyzer.py +357 -0
- crackerjack/agents/helpers/performance/performance_pattern_detector.py +909 -0
- crackerjack/agents/helpers/performance/performance_recommender.py +572 -0
- crackerjack/agents/helpers/refactoring/__init__.py +22 -0
- crackerjack/agents/helpers/refactoring/code_transformer.py +536 -0
- crackerjack/agents/helpers/refactoring/complexity_analyzer.py +344 -0
- crackerjack/agents/helpers/refactoring/dead_code_detector.py +437 -0
- crackerjack/agents/helpers/test_creation/__init__.py +19 -0
- crackerjack/agents/helpers/test_creation/test_ast_analyzer.py +216 -0
- crackerjack/agents/helpers/test_creation/test_coverage_analyzer.py +643 -0
- crackerjack/agents/helpers/test_creation/test_template_generator.py +1031 -0
- crackerjack/agents/performance_agent.py +121 -1152
- crackerjack/agents/refactoring_agent.py +156 -655
- crackerjack/agents/semantic_agent.py +479 -0
- crackerjack/agents/semantic_helpers.py +356 -0
- crackerjack/agents/test_creation_agent.py +19 -1605
- crackerjack/api.py +5 -7
- crackerjack/cli/README.md +394 -0
- crackerjack/cli/__init__.py +1 -1
- crackerjack/cli/cache_handlers.py +23 -18
- crackerjack/cli/cache_handlers_enhanced.py +1 -4
- crackerjack/cli/facade.py +70 -8
- crackerjack/cli/formatting.py +13 -0
- crackerjack/cli/handlers/__init__.py +85 -0
- crackerjack/cli/handlers/advanced.py +103 -0
- crackerjack/cli/handlers/ai_features.py +62 -0
- crackerjack/cli/handlers/analytics.py +479 -0
- crackerjack/cli/handlers/changelog.py +271 -0
- crackerjack/cli/handlers/config_handlers.py +16 -0
- crackerjack/cli/handlers/coverage.py +84 -0
- crackerjack/cli/handlers/documentation.py +280 -0
- crackerjack/cli/handlers/main_handlers.py +497 -0
- crackerjack/cli/handlers/monitoring.py +371 -0
- crackerjack/cli/handlers.py +249 -49
- crackerjack/cli/interactive.py +8 -5
- crackerjack/cli/options.py +203 -110
- crackerjack/cli/semantic_handlers.py +292 -0
- crackerjack/cli/version.py +19 -0
- crackerjack/code_cleaner.py +60 -24
- crackerjack/config/README.md +472 -0
- crackerjack/config/__init__.py +256 -0
- crackerjack/config/global_lock_config.py +191 -54
- crackerjack/config/hooks.py +188 -16
- crackerjack/config/loader.py +239 -0
- crackerjack/config/settings.py +141 -0
- crackerjack/config/tool_commands.py +331 -0
- crackerjack/core/README.md +393 -0
- crackerjack/core/async_workflow_orchestrator.py +79 -53
- crackerjack/core/autofix_coordinator.py +22 -9
- crackerjack/core/container.py +10 -9
- crackerjack/core/enhanced_container.py +9 -9
- crackerjack/core/performance.py +1 -1
- crackerjack/core/performance_monitor.py +5 -3
- crackerjack/core/phase_coordinator.py +1018 -634
- crackerjack/core/proactive_workflow.py +3 -3
- crackerjack/core/retry.py +275 -0
- crackerjack/core/service_watchdog.py +167 -23
- crackerjack/core/session_coordinator.py +187 -382
- crackerjack/core/timeout_manager.py +161 -44
- crackerjack/core/workflow/__init__.py +21 -0
- crackerjack/core/workflow/workflow_ai_coordinator.py +863 -0
- crackerjack/core/workflow/workflow_event_orchestrator.py +1107 -0
- crackerjack/core/workflow/workflow_issue_parser.py +714 -0
- crackerjack/core/workflow/workflow_phase_executor.py +1158 -0
- crackerjack/core/workflow/workflow_security_gates.py +400 -0
- crackerjack/core/workflow_orchestrator.py +1247 -953
- crackerjack/data/README.md +11 -0
- crackerjack/data/__init__.py +8 -0
- crackerjack/data/models.py +79 -0
- crackerjack/data/repository.py +210 -0
- crackerjack/decorators/README.md +180 -0
- crackerjack/decorators/__init__.py +35 -0
- crackerjack/decorators/error_handling.py +649 -0
- crackerjack/decorators/error_handling_decorators.py +334 -0
- crackerjack/decorators/helpers.py +58 -0
- crackerjack/decorators/patterns.py +281 -0
- crackerjack/decorators/utils.py +58 -0
- crackerjack/docs/README.md +11 -0
- crackerjack/docs/generated/api/CLI_REFERENCE.md +1 -1
- crackerjack/documentation/README.md +11 -0
- crackerjack/documentation/ai_templates.py +1 -1
- crackerjack/documentation/dual_output_generator.py +11 -9
- crackerjack/documentation/reference_generator.py +104 -59
- crackerjack/dynamic_config.py +52 -61
- crackerjack/errors.py +1 -1
- crackerjack/events/README.md +11 -0
- crackerjack/events/__init__.py +16 -0
- crackerjack/events/telemetry.py +175 -0
- crackerjack/events/workflow_bus.py +346 -0
- crackerjack/exceptions/README.md +301 -0
- crackerjack/exceptions/__init__.py +5 -0
- crackerjack/exceptions/config.py +4 -0
- crackerjack/exceptions/tool_execution_error.py +245 -0
- crackerjack/executors/README.md +591 -0
- crackerjack/executors/__init__.py +2 -0
- crackerjack/executors/async_hook_executor.py +539 -77
- crackerjack/executors/cached_hook_executor.py +3 -3
- crackerjack/executors/hook_executor.py +967 -102
- crackerjack/executors/hook_lock_manager.py +31 -22
- crackerjack/executors/individual_hook_executor.py +66 -32
- crackerjack/executors/lsp_aware_hook_executor.py +136 -57
- crackerjack/executors/progress_hook_executor.py +282 -0
- crackerjack/executors/tool_proxy.py +23 -7
- crackerjack/hooks/README.md +485 -0
- crackerjack/hooks/lsp_hook.py +8 -9
- crackerjack/intelligence/README.md +557 -0
- crackerjack/interactive.py +37 -10
- crackerjack/managers/README.md +369 -0
- crackerjack/managers/async_hook_manager.py +41 -57
- crackerjack/managers/hook_manager.py +449 -79
- crackerjack/managers/publish_manager.py +81 -36
- crackerjack/managers/test_command_builder.py +290 -12
- crackerjack/managers/test_executor.py +93 -8
- crackerjack/managers/test_manager.py +1082 -75
- crackerjack/managers/test_progress.py +118 -26
- crackerjack/mcp/README.md +374 -0
- crackerjack/mcp/cache.py +25 -2
- crackerjack/mcp/client_runner.py +35 -18
- crackerjack/mcp/context.py +9 -9
- crackerjack/mcp/dashboard.py +24 -8
- crackerjack/mcp/enhanced_progress_monitor.py +34 -23
- crackerjack/mcp/file_monitor.py +27 -6
- crackerjack/mcp/progress_components.py +45 -34
- crackerjack/mcp/progress_monitor.py +6 -9
- crackerjack/mcp/rate_limiter.py +11 -7
- crackerjack/mcp/server.py +2 -0
- crackerjack/mcp/server_core.py +187 -55
- crackerjack/mcp/service_watchdog.py +12 -9
- crackerjack/mcp/task_manager.py +2 -2
- crackerjack/mcp/tools/README.md +27 -0
- crackerjack/mcp/tools/__init__.py +2 -0
- crackerjack/mcp/tools/core_tools.py +75 -52
- crackerjack/mcp/tools/execution_tools.py +87 -31
- crackerjack/mcp/tools/intelligence_tools.py +2 -2
- crackerjack/mcp/tools/proactive_tools.py +1 -1
- crackerjack/mcp/tools/semantic_tools.py +584 -0
- crackerjack/mcp/tools/utility_tools.py +180 -132
- crackerjack/mcp/tools/workflow_executor.py +87 -46
- crackerjack/mcp/websocket/README.md +31 -0
- crackerjack/mcp/websocket/app.py +11 -1
- crackerjack/mcp/websocket/event_bridge.py +188 -0
- crackerjack/mcp/websocket/jobs.py +27 -4
- crackerjack/mcp/websocket/monitoring/__init__.py +25 -0
- crackerjack/mcp/websocket/monitoring/api/__init__.py +19 -0
- crackerjack/mcp/websocket/monitoring/api/dependencies.py +141 -0
- crackerjack/mcp/websocket/monitoring/api/heatmap.py +154 -0
- crackerjack/mcp/websocket/monitoring/api/intelligence.py +199 -0
- crackerjack/mcp/websocket/monitoring/api/metrics.py +203 -0
- crackerjack/mcp/websocket/monitoring/api/telemetry.py +101 -0
- crackerjack/mcp/websocket/monitoring/dashboard.py +18 -0
- crackerjack/mcp/websocket/monitoring/factory.py +109 -0
- crackerjack/mcp/websocket/monitoring/filters.py +10 -0
- crackerjack/mcp/websocket/monitoring/metrics.py +64 -0
- crackerjack/mcp/websocket/monitoring/models.py +90 -0
- crackerjack/mcp/websocket/monitoring/utils.py +171 -0
- crackerjack/mcp/websocket/monitoring/websocket_manager.py +78 -0
- crackerjack/mcp/websocket/monitoring/websockets/__init__.py +17 -0
- crackerjack/mcp/websocket/monitoring/websockets/dependencies.py +126 -0
- crackerjack/mcp/websocket/monitoring/websockets/heatmap.py +176 -0
- crackerjack/mcp/websocket/monitoring/websockets/intelligence.py +291 -0
- crackerjack/mcp/websocket/monitoring/websockets/metrics.py +291 -0
- crackerjack/mcp/websocket/monitoring_endpoints.py +16 -2930
- crackerjack/mcp/websocket/server.py +1 -3
- crackerjack/mcp/websocket/websocket_handler.py +107 -6
- crackerjack/models/README.md +308 -0
- crackerjack/models/__init__.py +10 -1
- crackerjack/models/config.py +639 -22
- crackerjack/models/config_adapter.py +6 -6
- crackerjack/models/protocols.py +1167 -23
- crackerjack/models/pydantic_models.py +320 -0
- crackerjack/models/qa_config.py +145 -0
- crackerjack/models/qa_results.py +134 -0
- crackerjack/models/results.py +35 -0
- crackerjack/models/semantic_models.py +258 -0
- crackerjack/models/task.py +19 -3
- crackerjack/models/test_models.py +60 -0
- crackerjack/monitoring/README.md +11 -0
- crackerjack/monitoring/ai_agent_watchdog.py +5 -4
- crackerjack/monitoring/metrics_collector.py +4 -3
- crackerjack/monitoring/regression_prevention.py +4 -3
- crackerjack/monitoring/websocket_server.py +4 -241
- crackerjack/orchestration/README.md +340 -0
- crackerjack/orchestration/__init__.py +43 -0
- crackerjack/orchestration/advanced_orchestrator.py +20 -67
- crackerjack/orchestration/cache/README.md +312 -0
- crackerjack/orchestration/cache/__init__.py +37 -0
- crackerjack/orchestration/cache/memory_cache.py +338 -0
- crackerjack/orchestration/cache/tool_proxy_cache.py +340 -0
- crackerjack/orchestration/config.py +297 -0
- crackerjack/orchestration/coverage_improvement.py +13 -6
- crackerjack/orchestration/execution_strategies.py +6 -6
- crackerjack/orchestration/hook_orchestrator.py +1398 -0
- crackerjack/orchestration/strategies/README.md +401 -0
- crackerjack/orchestration/strategies/__init__.py +39 -0
- crackerjack/orchestration/strategies/adaptive_strategy.py +630 -0
- crackerjack/orchestration/strategies/parallel_strategy.py +237 -0
- crackerjack/orchestration/strategies/sequential_strategy.py +299 -0
- crackerjack/orchestration/test_progress_streamer.py +1 -1
- crackerjack/plugins/README.md +11 -0
- crackerjack/plugins/hooks.py +3 -2
- crackerjack/plugins/loader.py +3 -3
- crackerjack/plugins/managers.py +1 -1
- crackerjack/py313.py +191 -0
- crackerjack/security/README.md +11 -0
- crackerjack/services/README.md +374 -0
- crackerjack/services/__init__.py +8 -21
- crackerjack/services/ai/README.md +295 -0
- crackerjack/services/ai/__init__.py +7 -0
- crackerjack/services/ai/advanced_optimizer.py +878 -0
- crackerjack/services/{contextual_ai_assistant.py → ai/contextual_ai_assistant.py} +5 -3
- crackerjack/services/ai/embeddings.py +444 -0
- crackerjack/services/ai/intelligent_commit.py +328 -0
- crackerjack/services/ai/predictive_analytics.py +510 -0
- crackerjack/services/api_extractor.py +5 -3
- crackerjack/services/bounded_status_operations.py +45 -5
- crackerjack/services/cache.py +249 -318
- crackerjack/services/changelog_automation.py +7 -3
- crackerjack/services/command_execution_service.py +305 -0
- crackerjack/services/config_integrity.py +83 -39
- crackerjack/services/config_merge.py +9 -6
- crackerjack/services/config_service.py +198 -0
- crackerjack/services/config_template.py +13 -26
- crackerjack/services/coverage_badge_service.py +6 -4
- crackerjack/services/coverage_ratchet.py +53 -27
- crackerjack/services/debug.py +18 -7
- crackerjack/services/dependency_analyzer.py +4 -4
- crackerjack/services/dependency_monitor.py +13 -13
- crackerjack/services/documentation_generator.py +4 -2
- crackerjack/services/documentation_service.py +62 -33
- crackerjack/services/enhanced_filesystem.py +81 -27
- crackerjack/services/enterprise_optimizer.py +1 -1
- crackerjack/services/error_pattern_analyzer.py +10 -10
- crackerjack/services/file_filter.py +221 -0
- crackerjack/services/file_hasher.py +5 -7
- crackerjack/services/file_io_service.py +361 -0
- crackerjack/services/file_modifier.py +615 -0
- crackerjack/services/filesystem.py +80 -109
- crackerjack/services/git.py +99 -5
- crackerjack/services/health_metrics.py +4 -6
- crackerjack/services/heatmap_generator.py +12 -3
- crackerjack/services/incremental_executor.py +380 -0
- crackerjack/services/initialization.py +101 -49
- crackerjack/services/log_manager.py +2 -2
- crackerjack/services/logging.py +120 -68
- crackerjack/services/lsp_client.py +12 -12
- crackerjack/services/memory_optimizer.py +27 -22
- crackerjack/services/monitoring/README.md +30 -0
- crackerjack/services/monitoring/__init__.py +9 -0
- crackerjack/services/monitoring/dependency_monitor.py +678 -0
- crackerjack/services/monitoring/error_pattern_analyzer.py +676 -0
- crackerjack/services/monitoring/health_metrics.py +716 -0
- crackerjack/services/monitoring/metrics.py +587 -0
- crackerjack/services/{performance_benchmarks.py → monitoring/performance_benchmarks.py} +100 -14
- crackerjack/services/{performance_cache.py → monitoring/performance_cache.py} +21 -15
- crackerjack/services/{performance_monitor.py → monitoring/performance_monitor.py} +10 -6
- crackerjack/services/parallel_executor.py +166 -55
- crackerjack/services/patterns/__init__.py +142 -0
- crackerjack/services/patterns/agents.py +107 -0
- crackerjack/services/patterns/code/__init__.py +15 -0
- crackerjack/services/patterns/code/detection.py +118 -0
- crackerjack/services/patterns/code/imports.py +107 -0
- crackerjack/services/patterns/code/paths.py +159 -0
- crackerjack/services/patterns/code/performance.py +119 -0
- crackerjack/services/patterns/code/replacement.py +36 -0
- crackerjack/services/patterns/core.py +212 -0
- crackerjack/services/patterns/documentation/__init__.py +14 -0
- crackerjack/services/patterns/documentation/badges_markdown.py +96 -0
- crackerjack/services/patterns/documentation/comments_blocks.py +83 -0
- crackerjack/services/patterns/documentation/docstrings.py +89 -0
- crackerjack/services/patterns/formatting.py +226 -0
- crackerjack/services/patterns/operations.py +339 -0
- crackerjack/services/patterns/security/__init__.py +23 -0
- crackerjack/services/patterns/security/code_injection.py +122 -0
- crackerjack/services/patterns/security/credentials.py +190 -0
- crackerjack/services/patterns/security/path_traversal.py +221 -0
- crackerjack/services/patterns/security/unsafe_operations.py +216 -0
- crackerjack/services/patterns/templates.py +62 -0
- crackerjack/services/patterns/testing/__init__.py +18 -0
- crackerjack/services/patterns/testing/error_patterns.py +107 -0
- crackerjack/services/patterns/testing/pytest_output.py +126 -0
- crackerjack/services/patterns/tool_output/__init__.py +16 -0
- crackerjack/services/patterns/tool_output/bandit.py +72 -0
- crackerjack/services/patterns/tool_output/other.py +97 -0
- crackerjack/services/patterns/tool_output/pyright.py +67 -0
- crackerjack/services/patterns/tool_output/ruff.py +44 -0
- crackerjack/services/patterns/url_sanitization.py +114 -0
- crackerjack/services/patterns/utilities.py +42 -0
- crackerjack/services/patterns/utils.py +339 -0
- crackerjack/services/patterns/validation.py +46 -0
- crackerjack/services/patterns/versioning.py +62 -0
- crackerjack/services/predictive_analytics.py +21 -8
- crackerjack/services/profiler.py +280 -0
- crackerjack/services/quality/README.md +415 -0
- crackerjack/services/quality/__init__.py +11 -0
- crackerjack/services/quality/anomaly_detector.py +392 -0
- crackerjack/services/quality/pattern_cache.py +333 -0
- crackerjack/services/quality/pattern_detector.py +479 -0
- crackerjack/services/quality/qa_orchestrator.py +491 -0
- crackerjack/services/{quality_baseline.py → quality/quality_baseline.py} +163 -2
- crackerjack/services/{quality_baseline_enhanced.py → quality/quality_baseline_enhanced.py} +4 -1
- crackerjack/services/{quality_intelligence.py → quality/quality_intelligence.py} +180 -16
- crackerjack/services/regex_patterns.py +58 -2987
- crackerjack/services/regex_utils.py +55 -29
- crackerjack/services/secure_status_formatter.py +42 -15
- crackerjack/services/secure_subprocess.py +35 -2
- crackerjack/services/security.py +16 -8
- crackerjack/services/server_manager.py +40 -51
- crackerjack/services/smart_scheduling.py +46 -6
- crackerjack/services/status_authentication.py +3 -3
- crackerjack/services/thread_safe_status_collector.py +1 -0
- crackerjack/services/tool_filter.py +368 -0
- crackerjack/services/tool_version_service.py +9 -5
- crackerjack/services/unified_config.py +43 -351
- crackerjack/services/vector_store.py +689 -0
- crackerjack/services/version_analyzer.py +6 -4
- crackerjack/services/version_checker.py +14 -8
- crackerjack/services/zuban_lsp_service.py +5 -4
- crackerjack/slash_commands/README.md +11 -0
- crackerjack/slash_commands/init.md +2 -12
- crackerjack/slash_commands/run.md +84 -50
- crackerjack/tools/README.md +11 -0
- crackerjack/tools/__init__.py +30 -0
- crackerjack/tools/_git_utils.py +105 -0
- crackerjack/tools/check_added_large_files.py +139 -0
- crackerjack/tools/check_ast.py +105 -0
- crackerjack/tools/check_json.py +103 -0
- crackerjack/tools/check_jsonschema.py +297 -0
- crackerjack/tools/check_toml.py +103 -0
- crackerjack/tools/check_yaml.py +110 -0
- crackerjack/tools/codespell_wrapper.py +72 -0
- crackerjack/tools/end_of_file_fixer.py +202 -0
- crackerjack/tools/format_json.py +128 -0
- crackerjack/tools/mdformat_wrapper.py +114 -0
- crackerjack/tools/trailing_whitespace.py +198 -0
- crackerjack/tools/validate_regex_patterns.py +7 -3
- crackerjack/ui/README.md +11 -0
- crackerjack/ui/dashboard_renderer.py +28 -0
- crackerjack/ui/templates/README.md +11 -0
- crackerjack/utils/console_utils.py +13 -0
- crackerjack/utils/dependency_guard.py +230 -0
- crackerjack/utils/retry_utils.py +275 -0
- crackerjack/workflows/README.md +590 -0
- crackerjack/workflows/__init__.py +46 -0
- crackerjack/workflows/actions.py +811 -0
- crackerjack/workflows/auto_fix.py +444 -0
- crackerjack/workflows/container_builder.py +499 -0
- crackerjack/workflows/definitions.py +443 -0
- crackerjack/workflows/engine.py +177 -0
- crackerjack/workflows/event_bridge.py +242 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/METADATA +678 -98
- crackerjack-0.45.2.dist-info/RECORD +478 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/WHEEL +1 -1
- crackerjack/managers/test_manager_backup.py +0 -1075
- crackerjack/mcp/tools/execution_tools_backup.py +0 -1011
- crackerjack/mixins/__init__.py +0 -3
- crackerjack/mixins/error_handling.py +0 -145
- crackerjack/services/config.py +0 -358
- crackerjack/ui/server_panels.py +0 -125
- crackerjack-0.37.9.dist-info/RECORD +0 -231
- /crackerjack/adapters/{rust_tool_adapter.py → lsp/_base.py} +0 -0
- /crackerjack/adapters/{lsp_client.py → lsp/_client.py} +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/entry_points.txt +0 -0
- {crackerjack-0.37.9.dist-info → crackerjack-0.45.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,7 +6,8 @@ from enum import Enum
|
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from typing import Any
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from acb.console import Console
|
|
10
|
+
from acb.depends import Inject, depends
|
|
10
11
|
|
|
11
12
|
from .changelog_automation import ChangelogEntry, ChangelogGenerator
|
|
12
13
|
from .git import GitService
|
|
@@ -194,7 +195,8 @@ class ConventionalCommitAnalyzer:
|
|
|
194
195
|
class VersionAnalyzer:
|
|
195
196
|
"""Main service for analyzing changes and recommending version bumps."""
|
|
196
197
|
|
|
197
|
-
|
|
198
|
+
@depends.inject
|
|
199
|
+
def __init__(self, console: Inject[Console], git_service: GitService) -> None:
|
|
198
200
|
self.console = console
|
|
199
201
|
self.git = git_service
|
|
200
202
|
|
|
@@ -203,8 +205,8 @@ class VersionAnalyzer:
|
|
|
203
205
|
self.feature_analyzer = FeatureAnalyzer()
|
|
204
206
|
self.commit_analyzer = ConventionalCommitAnalyzer()
|
|
205
207
|
|
|
206
|
-
# Initialize changelog generator for getting entries
|
|
207
|
-
self.changelog_generator = ChangelogGenerator(
|
|
208
|
+
# Initialize changelog generator for getting entries (ACB DI injects dependencies)
|
|
209
|
+
self.changelog_generator = ChangelogGenerator()
|
|
208
210
|
|
|
209
211
|
def _get_current_version(self) -> str | None:
|
|
210
212
|
"""Get current version from pyproject.toml."""
|
|
@@ -3,7 +3,10 @@ import typing as t
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
4
|
|
|
5
5
|
import aiohttp
|
|
6
|
-
from
|
|
6
|
+
from acb.console import Console
|
|
7
|
+
from acb.depends import Inject, depends
|
|
8
|
+
|
|
9
|
+
from crackerjack.core.retry import retry_api_call
|
|
7
10
|
|
|
8
11
|
|
|
9
12
|
@dataclass
|
|
@@ -16,7 +19,8 @@ class VersionInfo:
|
|
|
16
19
|
|
|
17
20
|
|
|
18
21
|
class VersionChecker:
|
|
19
|
-
|
|
22
|
+
@depends.inject
|
|
23
|
+
def __init__(self, console: Inject[Console]) -> None:
|
|
20
24
|
self.console = console
|
|
21
25
|
self.tools_to_check = {
|
|
22
26
|
"ruff": self._get_ruff_version,
|
|
@@ -115,13 +119,15 @@ class VersionChecker:
|
|
|
115
119
|
pass
|
|
116
120
|
return None
|
|
117
121
|
|
|
122
|
+
@retry_api_call(max_attempts=3, delay=1.0, backoff=2.0, max_delay=30.0)
|
|
118
123
|
async def _fetch_latest_version(self, tool_name: str) -> str | None:
|
|
119
124
|
try:
|
|
125
|
+
# Fix URLs - remove spaces that were added
|
|
120
126
|
pypi_urls = {
|
|
121
|
-
"ruff": "https
|
|
122
|
-
"pyright": "https
|
|
123
|
-
"pre-commit": "https
|
|
124
|
-
"uv": "https
|
|
127
|
+
"ruff": "https://pypi.org/pypi/ruff/json",
|
|
128
|
+
"pyright": "https://pypi.org/pypi/pyright/json",
|
|
129
|
+
"pre-commit": "https://pypi.org/pypi/pre-commit/json",
|
|
130
|
+
"uv": "https://pypi.org/pypi/uv/json",
|
|
125
131
|
}
|
|
126
132
|
|
|
127
133
|
url = pypi_urls.get(tool_name)
|
|
@@ -132,8 +138,8 @@ class VersionChecker:
|
|
|
132
138
|
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
133
139
|
async with session.get(url) as response:
|
|
134
140
|
response.raise_for_status()
|
|
135
|
-
data = await response.json()
|
|
136
|
-
return data.get("info", {}).get("version")
|
|
141
|
+
data: dict[str, t.Any] = await response.json()
|
|
142
|
+
return data.get("info", {}).get("version")
|
|
137
143
|
|
|
138
144
|
except Exception:
|
|
139
145
|
return None
|
|
@@ -9,7 +9,8 @@ import typing as t
|
|
|
9
9
|
from contextlib import suppress
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
-
from
|
|
12
|
+
from acb.console import Console
|
|
13
|
+
from acb.depends import depends
|
|
13
14
|
|
|
14
15
|
from .security_logger import get_security_logger
|
|
15
16
|
|
|
@@ -34,7 +35,7 @@ class ZubanLSPService:
|
|
|
34
35
|
"""
|
|
35
36
|
self.port = port
|
|
36
37
|
self.mode = mode
|
|
37
|
-
self.console = console or Console
|
|
38
|
+
self.console = console or depends.get_sync(Console)
|
|
38
39
|
self.process: subprocess.Popen[bytes] | None = None
|
|
39
40
|
self.start_time: float = 0.0
|
|
40
41
|
self.security_logger = get_security_logger()
|
|
@@ -358,7 +359,7 @@ class ZubanLSPService:
|
|
|
358
359
|
# This is a simplified implementation
|
|
359
360
|
# In a production system, you'd want to use proper async I/O
|
|
360
361
|
loop = asyncio.get_event_loop()
|
|
361
|
-
line = await loop.run_in_executor(None, self.process.stdout.readline)
|
|
362
|
+
line = await loop.run_in_executor(None, self.process.stdout.readline) # type: ignore[call-arg]
|
|
362
363
|
return line.decode("utf-8").rstrip("\r\n")
|
|
363
364
|
|
|
364
365
|
async def _read_bytes_async(self, count: int) -> bytes:
|
|
@@ -367,7 +368,7 @@ class ZubanLSPService:
|
|
|
367
368
|
return b""
|
|
368
369
|
|
|
369
370
|
loop = asyncio.get_event_loop()
|
|
370
|
-
data = await loop.run_in_executor(None, self.process.stdout.read, count)
|
|
371
|
+
data = await loop.run_in_executor(None, self.process.stdout.read, count) # type: ignore[call-arg]
|
|
371
372
|
return data
|
|
372
373
|
|
|
373
374
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Slash Commands](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Slash Commands
|
|
4
|
+
|
|
5
|
+
Slash command handlers and related routing.
|
|
6
|
+
|
|
7
|
+
## Related
|
|
8
|
+
|
|
9
|
+
- [Crackerjack Package](<../README.md>) - Parent package
|
|
10
|
+
- [MCP](<../mcp/README.md>) - MCP server slash command integration
|
|
11
|
+
- [CLI](<../cli/README.md>) - Command-line interface handlers
|
|
@@ -22,11 +22,9 @@ This slash command initializes a new Python project with crackerjack's best prac
|
|
|
22
22
|
1. **Checks Project State**: Verifies which configuration files exist
|
|
23
23
|
1. **Smart Merge Configuration**:
|
|
24
24
|
- `pyproject.toml` - Intelligently merges tool configurations, preserves higher coverage requirements
|
|
25
|
-
- `.pre-commit-config.yaml` - Adds missing repos, preserves existing hooks
|
|
26
25
|
- `CLAUDE.md` - Appends crackerjack guidelines without overwriting existing content
|
|
27
26
|
- `RULES.md` - Copies only if missing, preserves existing coding standards
|
|
28
27
|
1. **Preserves Project Identity**: Never overwrites existing project metadata, dependencies, or configurations
|
|
29
|
-
1. **Installs Pre-commit Hooks**: Sets up git hooks for quality enforcement
|
|
30
28
|
|
|
31
29
|
## When to Use /crackerjack:init
|
|
32
30
|
|
|
@@ -34,9 +32,8 @@ This slash command initializes a new Python project with crackerjack's best prac
|
|
|
34
32
|
|
|
35
33
|
The MCP server can detect when initialization is needed:
|
|
36
34
|
|
|
37
|
-
- **Missing Core Files**: No pyproject.toml
|
|
35
|
+
- **Missing Core Files**: No pyproject.toml
|
|
38
36
|
- **New Project**: Git repository just initialized
|
|
39
|
-
- **Outdated Hooks**: Pre-commit hooks older than 30 days
|
|
40
37
|
- **Manual Request**: User explicitly asks for initialization
|
|
41
38
|
|
|
42
39
|
### Recommended Frequency
|
|
@@ -62,7 +59,6 @@ AI: I'll initialize crackerjack configuration for your project.
|
|
|
62
59
|
|
|
63
60
|
The project has been initialized with:
|
|
64
61
|
✅ pyproject.toml - Project configuration
|
|
65
|
-
✅ .pre-commit-config.yaml - Quality hooks
|
|
66
62
|
✅ CLAUDE.md - AI guidelines
|
|
67
63
|
✅ RULES.md - Coding standards
|
|
68
64
|
|
|
@@ -75,7 +71,7 @@ When connected via MCP, crackerjack can automatically suggest initialization whe
|
|
|
75
71
|
|
|
76
72
|
1. Running `/crackerjack:run` in an uninitialized project
|
|
77
73
|
1. Detecting missing critical configuration files
|
|
78
|
-
1. Finding
|
|
74
|
+
1. Finding configuration files that need updates
|
|
79
75
|
|
|
80
76
|
This ensures projects always have up-to-date quality standards without manual intervention.
|
|
81
77
|
|
|
@@ -97,12 +93,6 @@ This ensures projects always have up-to-date quality standards without manual in
|
|
|
97
93
|
- **Prevents Duplicates**: Skips if crackerjack section already exists
|
|
98
94
|
- **Clear Boundaries**: Uses `<!-- CRACKERJACK_START -->` and `<!-- CRACKERJACK_END -->` markers
|
|
99
95
|
|
|
100
|
-
### .pre-commit-config.yaml Smart Merge
|
|
101
|
-
|
|
102
|
-
- **Adds Missing Repos**: Only adds pre-commit repos that don't already exist
|
|
103
|
-
- **Preserves Existing Hooks**: Never modifies existing hook configurations
|
|
104
|
-
- **Skips if No New Repos**: Intelligent detection prevents unnecessary changes
|
|
105
|
-
|
|
106
96
|
### Universal Compatibility
|
|
107
97
|
|
|
108
98
|
This smart merge approach works with **any Python package**, not just specific projects:
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
______________________________________________________________________
|
|
2
2
|
|
|
3
|
-
## description: Run
|
|
3
|
+
## description: Run crackerjack with AI-powered auto-fixing using intelligent session integration. Automatically tries enhanced session-mgmt execution first, then gracefully falls back to standard crackerjack execution if unavailable. Perfect for comprehensive code quality enforcement with zero configuration required.
|
|
4
4
|
|
|
5
|
-
# /
|
|
5
|
+
# /run
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Intelligent crackerjack runner that tries session-mgmt:crackerjack-run first with fallback to crackerjack:run for optimal integration with session management systems.
|
|
8
8
|
|
|
9
9
|
## Usage
|
|
10
10
|
|
|
11
11
|
```
|
|
12
|
-
/
|
|
12
|
+
/run [--debug]
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
### Arguments
|
|
@@ -22,7 +22,12 @@ Run Crackerjack with advanced orchestrated AI-powered auto-fix mode to automatic
|
|
|
22
22
|
|
|
23
23
|
## Description
|
|
24
24
|
|
|
25
|
-
This slash command
|
|
25
|
+
This slash command provides intelligent crackerjack execution with automatic fallback:
|
|
26
|
+
|
|
27
|
+
1. **Primary**: Attempts `session-mgmt:crackerjack-run` for enhanced session integration
|
|
28
|
+
1. **Fallback**: Uses `crackerjack:run` if session-mgmt is unavailable
|
|
29
|
+
|
|
30
|
+
Both execution paths use AI agent mode for autonomous code quality enforcement:
|
|
26
31
|
|
|
27
32
|
- `--ai-fix`: AI auto-fixing mode for structured error output and intelligent fixing
|
|
28
33
|
- `--test`: Run tests with comprehensive test coverage
|
|
@@ -30,25 +35,46 @@ This slash command runs Crackerjack with AI agent mode for autonomous code quali
|
|
|
30
35
|
|
|
31
36
|
## 💡 Agent Recommendation
|
|
32
37
|
|
|
33
|
-
**For optimal results, use the `crackerjack-architect` agent alongside `/
|
|
38
|
+
**For optimal results, use the `crackerjack-architect` agent alongside `/run`:**
|
|
34
39
|
|
|
35
40
|
```bash
|
|
36
41
|
# 1. Plan with crackerjack-architect first
|
|
37
42
|
Task tool with subagent_type="crackerjack-architect" for feature planning
|
|
38
43
|
|
|
39
44
|
# 2. Run crackerjack for quality enforcement
|
|
40
|
-
/
|
|
45
|
+
/run
|
|
41
46
|
|
|
42
47
|
# 3. Use crackerjack-architect for any remaining issues
|
|
43
48
|
```
|
|
44
49
|
|
|
45
|
-
**Why?** The crackerjack-architect agent ensures code follows crackerjack patterns from the start, reducing the number of iterations needed for `/
|
|
50
|
+
**Why?** The crackerjack-architect agent ensures code follows crackerjack patterns from the start, reducing the number of iterations needed for `/run` to achieve full compliance.
|
|
46
51
|
|
|
47
52
|
## What It Does
|
|
48
53
|
|
|
49
|
-
**
|
|
54
|
+
**Smart Execution Strategy:**
|
|
55
|
+
|
|
56
|
+
### 1. 🧠 **Session-Mgmt Integration (Primary)**
|
|
57
|
+
|
|
58
|
+
When `session-mgmt:crackerjack-run` is available:
|
|
59
|
+
|
|
60
|
+
- **Enhanced Context**: Leverages session history for better AI decisions
|
|
61
|
+
- **Progress Continuity**: Builds on previous session learnings
|
|
62
|
+
- **Memory Integration**: Remembers past error patterns and fixes
|
|
63
|
+
- **Quality Trends**: Uses historical quality metrics for optimization
|
|
64
|
+
|
|
65
|
+
### 2. 🔄 **Standard Execution (Fallback)**
|
|
66
|
+
|
|
67
|
+
When session-mgmt is unavailable, falls back to `crackerjack:run`:
|
|
68
|
+
|
|
69
|
+
- **Full Functionality**: Complete AI auto-fixing capabilities
|
|
70
|
+
- **Zero Degradation**: All quality features remain available
|
|
71
|
+
- **Seamless Transition**: User experience unchanged
|
|
50
72
|
|
|
51
|
-
###
|
|
73
|
+
### 3. ⚡ **Iterative AI-Powered Auto-Fixing Process (up to 10 iterations)**
|
|
74
|
+
|
|
75
|
+
Both execution paths follow the same comprehensive workflow:
|
|
76
|
+
|
|
77
|
+
#### Pre-Execution Safety Checks:
|
|
52
78
|
|
|
53
79
|
0. 🔍 **Comprehensive Status Check** (automatic conflict prevention)
|
|
54
80
|
|
|
@@ -58,7 +84,7 @@ Task tool with subagent_type="crackerjack-architect" for feature planning
|
|
|
58
84
|
- Auto-start missing services if needed
|
|
59
85
|
- Report resource usage and system health
|
|
60
86
|
|
|
61
|
-
|
|
87
|
+
#### Each Iteration Cycle:
|
|
62
88
|
|
|
63
89
|
1. ⚡ **Fast Hooks** (formatting & basic fixes)
|
|
64
90
|
|
|
@@ -90,7 +116,7 @@ Task tool with subagent_type="crackerjack-architect" for feature planning
|
|
|
90
116
|
|
|
91
117
|
1. 🔄 **Next Full Iteration**: Repeat entire cycle until ALL checks pass or max iterations (10) reached
|
|
92
118
|
|
|
93
|
-
|
|
119
|
+
#### Final Result:
|
|
94
120
|
|
|
95
121
|
🎉 **Perfect Code Quality**: All hooks pass, all tests pass, zero manual intervention!
|
|
96
122
|
|
|
@@ -100,64 +126,72 @@ When an AI assistant uses this command:
|
|
|
100
126
|
|
|
101
127
|
```
|
|
102
128
|
User: Can you fix all the code quality issues in this project?
|
|
103
|
-
AI: I'll use the /
|
|
129
|
+
AI: I'll use the /run command to automatically fix all code quality issues with intelligent session integration.
|
|
130
|
+
|
|
131
|
+
/run
|
|
132
|
+
|
|
133
|
+
[AI first tries: session-mgmt:crackerjack-run]
|
|
134
|
+
✅ Session-mgmt available - using enhanced execution mode
|
|
104
135
|
|
|
105
|
-
|
|
136
|
+
[Enhanced execution with session context: python -m crackerjack --ai-fix --test --verbose]
|
|
106
137
|
|
|
107
|
-
|
|
138
|
+
The crackerjack AI agent completed successfully after 2 iterations! Here's what was automatically fixed:
|
|
108
139
|
|
|
109
|
-
|
|
140
|
+
**Session Context Benefits**:
|
|
141
|
+
- Leveraged previous session learnings about this codebase
|
|
142
|
+
- Applied remembered fix patterns from similar issues
|
|
143
|
+
- Optimized execution based on historical performance data
|
|
110
144
|
|
|
111
145
|
**Iteration 1**: Fixed formatting and imports
|
|
112
146
|
- Reformatted 5 files with proper indentation
|
|
113
|
-
- Organized imports in 3 modules
|
|
147
|
+
- Organized imports in 3 modules (using cached preferences)
|
|
114
148
|
- Removed trailing whitespace
|
|
115
149
|
|
|
116
|
-
**Iteration 2**:
|
|
117
|
-
- Added type hints to 7
|
|
118
|
-
-
|
|
119
|
-
- Removed 1 unused variable
|
|
150
|
+
**Iteration 2**: Final quality improvements
|
|
151
|
+
- Added type hints to 4 functions (improved from previous 7 due to session learning)
|
|
152
|
+
- All 42 tests now pass with 47% coverage
|
|
120
153
|
|
|
121
|
-
**
|
|
122
|
-
- Fixed missing test fixture import
|
|
123
|
-
- Updated assertion in test_workflow.py
|
|
124
|
-
- All 42 tests now pass with 45% coverage
|
|
125
|
-
|
|
126
|
-
🎉 **Result**: Perfect code quality achieved with zero manual intervention!
|
|
154
|
+
🎉 **Result**: Perfect code quality achieved with enhanced session integration!
|
|
127
155
|
```
|
|
128
156
|
|
|
129
157
|
## Benefits
|
|
130
158
|
|
|
131
|
-
- **
|
|
132
|
-
- **
|
|
133
|
-
- **
|
|
134
|
-
- **
|
|
159
|
+
- **Smart Integration**: Automatically leverages session-mgmt when available
|
|
160
|
+
- **Graceful Fallback**: No functionality loss when session-mgmt unavailable
|
|
161
|
+
- **Enhanced Learning**: Session context improves AI decision quality
|
|
162
|
+
- **Zero Configuration**: AI doesn't need to remember complex integration logic
|
|
163
|
+
- **Optimal Performance**: Uses best available execution method automatically
|
|
164
|
+
- **Consistent Results**: Same high-quality outcome regardless of execution path
|
|
135
165
|
|
|
136
166
|
## Implementation
|
|
137
167
|
|
|
138
|
-
**CRITICAL**: When an AI assistant encounters `/
|
|
139
|
-
|
|
140
|
-
When an AI assistant encounters `/crackerjack:run`, it calls the MCP server tool directly:
|
|
168
|
+
**CRITICAL**: When an AI assistant encounters `/run`, it MUST implement the intelligent fallback strategy using MCP server tools.
|
|
141
169
|
|
|
142
|
-
|
|
170
|
+
### Execution Strategy
|
|
143
171
|
|
|
144
172
|
```python
|
|
145
|
-
#
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
#
|
|
173
|
+
# 1. Try session-mgmt integration first
|
|
174
|
+
try:
|
|
175
|
+
job_result = session_mgmt_crackerjack_run()
|
|
176
|
+
job_id = job_result["job_id"]
|
|
177
|
+
print("✅ Using session-mgmt enhanced execution")
|
|
178
|
+
except (ConnectionError, ServiceUnavailable, ToolNotFound):
|
|
179
|
+
# 2. Fallback to standard crackerjack execution
|
|
180
|
+
job_result = execute_crackerjack("/crackerjack:run")
|
|
181
|
+
job_id = job_result["job_id"]
|
|
182
|
+
print("⚡ Using standard crackerjack execution")
|
|
183
|
+
|
|
184
|
+
# For debugging, append --debug flag to either execution path:
|
|
185
|
+
# session_mgmt_crackerjack_run("--debug") or execute_crackerjack("/crackerjack:run --debug")
|
|
152
186
|
```
|
|
153
187
|
|
|
154
|
-
|
|
188
|
+
### Key Features
|
|
155
189
|
|
|
156
|
-
- **
|
|
157
|
-
- **
|
|
158
|
-
- **
|
|
159
|
-
- **
|
|
160
|
-
- **
|
|
161
|
-
- **
|
|
190
|
+
- **Automatic Detection**: No manual configuration needed
|
|
191
|
+
- **Seamless Fallback**: User unaware of which execution path used
|
|
192
|
+
- **Progress Tracking**: Real-time progress updates via MCP tools for both paths
|
|
193
|
+
- **Enhanced Context**: Session-mgmt path leverages conversation history
|
|
194
|
+
- **Background Execution**: Both paths run in background, return job_id immediately
|
|
195
|
+
- **Debug Support**: --debug flag works with both execution methods
|
|
162
196
|
|
|
163
|
-
**Note**: This
|
|
197
|
+
**Note**: This command provides the best of both worlds - enhanced session integration when available, with full functionality guaranteed through intelligent fallback.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
> Crackerjack Docs: [Main](<../../README.md>) | [Crackerjack Package](<../README.md>) | [Tools](<./README.md>)
|
|
2
|
+
|
|
3
|
+
# Package Tools
|
|
4
|
+
|
|
5
|
+
Internal helper tools used within the package (distinct from top-level `tools/`).
|
|
6
|
+
|
|
7
|
+
## Related
|
|
8
|
+
|
|
9
|
+
- [Crackerjack Package](<../README.md>) - Parent package
|
|
10
|
+
- [MCP](<../mcp/README.md>) - MCP tool implementations
|
|
11
|
+
- [Services](<../services/README.md>) - Service layer using these tools
|
crackerjack/tools/__init__.py
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Native tool implementations for crackerjack (Phase 8).
|
|
2
|
+
|
|
3
|
+
This package contains Python implementations of quality checking tools,
|
|
4
|
+
providing direct invocation without pre-commit wrapper overhead.
|
|
5
|
+
|
|
6
|
+
Native tools replace pre-commit-hooks utilities with equivalent functionality:
|
|
7
|
+
- trailing_whitespace: Remove trailing whitespace
|
|
8
|
+
- end_of_file_fixer: Ensure files end with newline
|
|
9
|
+
- check_yaml: Validate YAML syntax
|
|
10
|
+
- check_toml: Validate TOML syntax
|
|
11
|
+
- check_json: Validate JSON syntax
|
|
12
|
+
- check_ast: Validate Python AST syntax
|
|
13
|
+
- format_json: Format JSON files
|
|
14
|
+
- check_jsonschema: Validate JSON files against schemas
|
|
15
|
+
- check_added_large_files: Warn on large file additions
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"trailing_whitespace",
|
|
22
|
+
"end_of_file_fixer",
|
|
23
|
+
"check_yaml",
|
|
24
|
+
"check_toml",
|
|
25
|
+
"check_json",
|
|
26
|
+
"check_ast",
|
|
27
|
+
"format_json",
|
|
28
|
+
"check_jsonschema",
|
|
29
|
+
"check_added_large_files",
|
|
30
|
+
]
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Git-aware file discovery utilities for native tools.
|
|
2
|
+
|
|
3
|
+
This module provides utilities for discovering files while respecting .gitignore
|
|
4
|
+
patterns. It uses `git ls-files` to automatically handle gitignore compliance,
|
|
5
|
+
making crackerjack behave identically to pre-commit.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import subprocess
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_git_tracked_files(pattern: str | None = None) -> list[Path]:
|
|
15
|
+
"""Get list of files tracked by git, optionally filtered by pattern.
|
|
16
|
+
|
|
17
|
+
This function uses `git ls-files` which automatically respects .gitignore
|
|
18
|
+
patterns. This is the industry-standard approach used by pre-commit and
|
|
19
|
+
ensures only git-tracked files are processed.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
pattern: Optional glob pattern to filter files (e.g., "*.py", "*.yaml")
|
|
23
|
+
If None, returns all tracked files.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
List of Path objects for git-tracked files matching the pattern.
|
|
27
|
+
Falls back to empty list if not in a git repository.
|
|
28
|
+
|
|
29
|
+
Example:
|
|
30
|
+
>>> # Get all tracked Python files
|
|
31
|
+
>>> python_files = get_git_tracked_files("*.py")
|
|
32
|
+
>>> # Get all tracked YAML files
|
|
33
|
+
>>> yaml_files = get_git_tracked_files("*.yaml")
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
cmd = ["git", "ls-files"]
|
|
37
|
+
if pattern:
|
|
38
|
+
cmd.append(pattern)
|
|
39
|
+
|
|
40
|
+
result = subprocess.run(
|
|
41
|
+
cmd,
|
|
42
|
+
capture_output=True,
|
|
43
|
+
text=True,
|
|
44
|
+
check=True,
|
|
45
|
+
cwd=Path.cwd(),
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
# Filter to only include files that actually exist on disk
|
|
49
|
+
# (git ls-files can include deleted files still in the index)
|
|
50
|
+
return [
|
|
51
|
+
Path(line.strip())
|
|
52
|
+
for line in result.stdout.splitlines()
|
|
53
|
+
if line.strip() and Path(line.strip()).exists()
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
except subprocess.CalledProcessError:
|
|
57
|
+
# Git command failed (not in a git repo, etc.)
|
|
58
|
+
return []
|
|
59
|
+
except FileNotFoundError:
|
|
60
|
+
# Git not available
|
|
61
|
+
return []
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def get_files_by_extension(extensions: list[str], use_git: bool = True) -> list[Path]:
|
|
65
|
+
"""Get files with specified extensions, respecting git if available.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
extensions: List of file extensions to match (e.g., [".py", ".yaml"])
|
|
69
|
+
use_git: If True (default), use git ls-files when in a git repo.
|
|
70
|
+
If False, use Path.rglob() for all files.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
List of Path objects matching the extensions.
|
|
74
|
+
Automatically respects .gitignore when use_git=True.
|
|
75
|
+
|
|
76
|
+
Example:
|
|
77
|
+
>>> # Get Python files (git-aware)
|
|
78
|
+
>>> py_files = get_files_by_extension([".py"])
|
|
79
|
+
>>> # Get YAML files (all files, ignore git)
|
|
80
|
+
>>> yaml_files = get_files_by_extension([".yaml", ".yml"], use_git=False)
|
|
81
|
+
"""
|
|
82
|
+
if not use_git:
|
|
83
|
+
# Fallback to rglob for all files
|
|
84
|
+
files = []
|
|
85
|
+
for ext in extensions:
|
|
86
|
+
files.extend(Path.cwd().rglob(f"*{ext}"))
|
|
87
|
+
return [f for f in files if f.is_file()]
|
|
88
|
+
|
|
89
|
+
# Try git-aware discovery first
|
|
90
|
+
files = []
|
|
91
|
+
for ext in extensions:
|
|
92
|
+
# git ls-files pattern: *.ext
|
|
93
|
+
pattern = f"*{ext}"
|
|
94
|
+
git_files = get_git_tracked_files(pattern)
|
|
95
|
+
if git_files:
|
|
96
|
+
files.extend(git_files)
|
|
97
|
+
|
|
98
|
+
if files:
|
|
99
|
+
return files
|
|
100
|
+
|
|
101
|
+
# Fallback to rglob if git unavailable
|
|
102
|
+
result = []
|
|
103
|
+
for ext in extensions:
|
|
104
|
+
result.extend(Path.cwd().rglob(f"*{ext}"))
|
|
105
|
+
return [f for f in result if f.is_file()]
|