crackerjack 0.37.8__tar.gz → 0.37.9__tar.gz
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.
Potentially problematic release.
This version of crackerjack might be problematic. Click here for more details.
- crackerjack-0.37.9/.codespell-ignore +2 -0
- crackerjack-0.37.9/.codespellrc +5 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/CHANGELOG.md +6 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/PKG-INFO +1 -1
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/workflow_orchestrator.py +33 -11
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/reference_generator.py +155 -112
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/dynamic_config.py +4 -8
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/hooks/lsp_hook.py +39 -24
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/interactive.py +6 -17
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/publish_manager.py +1 -1
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/execution_tools_backup.py +34 -36
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config_merge.py +33 -30
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/secure_subprocess.py +43 -25
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/validate_regex_patterns.py +1 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/pyproject.toml +5 -2
- crackerjack-0.37.9/tests/test_api.py +115 -0
- crackerjack-0.37.9/tests/test_architect_agent.py +193 -0
- crackerjack-0.37.9/tests/test_base.py +791 -0
- crackerjack-0.37.9/tests/test_coordinator.py +240 -0
- crackerjack-0.37.9/tests/test_documentation_agent.py +157 -0
- crackerjack-0.37.9/tests/test_dry_agent.py +157 -0
- crackerjack-0.37.9/tests/test_formatting_agent.py +157 -0
- crackerjack-0.37.9/tests/test_import_optimization_agent.py +347 -0
- crackerjack-0.37.9/tests/test_interactive.py +131 -0
- crackerjack-0.37.9/tests/test_lsp_client.py +275 -0
- crackerjack-0.37.9/tests/test_performance_agent.py +413 -0
- crackerjack-0.37.9/tests/test_performance_helpers.py +356 -0
- crackerjack-0.37.9/tests/test_proactive_agent.py +157 -0
- crackerjack-0.37.9/tests/test_rust_tool_adapter.py +707 -0
- crackerjack-0.37.9/tests/test_rust_tool_manager.py +231 -0
- crackerjack-0.37.9/tests/test_skylos_adapter.py +256 -0
- crackerjack-0.37.9/tests/test_zuban_adapter.py +390 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/uv.lock +4 -4
- {crackerjack-0.37.8 → crackerjack-0.37.9}/.github/FUNDING.yml +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/.gitignore +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/.pre-commit-config.yaml +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/AGENTS.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/CLAUDE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/LICENSE +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/QWEN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/README.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/RULES.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/SECURITY.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/AGENT-CAPABILITIES.json +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/AGENT_SELECTION.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/AI-REFERENCE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/ERROR-PATTERNS.yaml +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/__main__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/lsp_client.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/rust_tool_adapter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/rust_tool_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/skylos_adapter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/zuban_adapter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/architect_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/base.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/coordinator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/documentation_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/dry_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/formatting_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/import_optimization_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/performance_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/performance_helpers.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/proactive_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/refactoring_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/refactoring_helpers.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/security_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/test_creation_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/test_specialist_agent.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/tracker.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/api.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/cache_handlers.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/cache_handlers_enhanced.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/facade.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/handlers.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/interactive.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/options.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/utils.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/code_cleaner.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/config/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/config/global_lock_config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/config/hooks.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/async_workflow_orchestrator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/autofix_coordinator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/container.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/enhanced_container.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/file_lifecycle.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/performance.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/performance_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/phase_coordinator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/proactive_workflow.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/resource_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/service_watchdog.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/session_coordinator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/timeout_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/websocket_lifecycle.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/INDEX.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/API_REFERENCE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/CLI_REFERENCE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/CROSS_REFERENCES.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/PROTOCOLS.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/SERVICES.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/ai_templates.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/dual_output_generator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/mkdocs_integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/errors.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/async_hook_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/cached_hook_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/hook_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/hook_lock_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/individual_hook_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/lsp_aware_hook_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/tool_proxy.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/adaptive_learning.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/agent_orchestrator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/agent_registry.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/agent_selector.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/async_hook_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/hook_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_command_builder.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_manager_backup.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_progress.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/cache.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/client_runner.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/context.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/dashboard.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/enhanced_progress_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/enhanced_progress_monitor.tcss +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/file_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/progress_components.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/progress_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/progress_monitor.tcss +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/rate_limiter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/server.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/server_core.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/service_watchdog.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/state.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/task_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/core_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/error_analyzer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/execution_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/intelligence_tool_registry.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/intelligence_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/monitoring_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/monitoring_tools.py.backup +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/proactive_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/progress_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/utility_tools.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/workflow_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/app.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/endpoints.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/jobs.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/monitoring_endpoints.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/server.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/websocket_handler.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket_server.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mixins/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mixins/error_handling.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/config_adapter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/protocols.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/resource_protocols.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/task.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/ai_agent_watchdog.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/metrics_collector.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/regression_prevention.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/websocket_server.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/advanced_orchestrator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/coverage_improvement.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/execution_strategies.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/test_progress_streamer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/base.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/hooks.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/loader.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/managers.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/pyproject.toml +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/security/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/security/audit.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/anomaly_detector.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/api_extractor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/backup_service.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/bounded_status_operations.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/cache.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/changelog_automation.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config_integrity.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config_template.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/contextual_ai_assistant.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/coverage_badge_service.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/coverage_ratchet.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/debug.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/dependency_analyzer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/dependency_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/documentation_generator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/documentation_service.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/enhanced_filesystem.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/enterprise_optimizer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/error_pattern_analyzer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/file_hasher.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/filesystem.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/git.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/health_metrics.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/heatmap_generator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/initialization.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/input_validator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/intelligent_commit.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/log_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/logging.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/lsp_client.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/memory_optimizer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/metrics.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/parallel_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/pattern_cache.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/pattern_detector.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/performance_benchmarks.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/performance_cache.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/performance_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/predictive_analytics.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/quality_baseline.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/quality_baseline_enhanced.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/quality_intelligence.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/regex_patterns.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/regex_utils.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/secure_path_utils.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/secure_status_formatter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/security.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/security_logger.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/server_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/smart_scheduling.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/status_authentication.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/status_security_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/terminal_utils.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/thread_safe_status_collector.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/tool_version_service.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/unified_config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/validation_rate_limiter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/version_analyzer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/version_checker.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/websocket_resource_limiter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/zuban_lsp_service.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/init.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/run.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/status.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/fix_terminal.sh +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/validate_input_validator_patterns.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/ui/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/ui/server_panels.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/uv.lock +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/architecture/API_REFERENCE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/architecture/ARCHITECTURE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/archive/CONFIG_MANAGEMENT_REPLACEMENT_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/archive/CONFIG_MERGE_REMOVAL_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/archive/DOCUMENTATION_REORGANIZATION_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/development/IDE-SETUP.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/development/RUST_TOOLING_FRAMEWORK.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/COMPLEXITY_REFACTORING_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/COVERAGE_BADGE_IMPLEMENTATION_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/CURRENT_IMPLEMENTATION_STATUS.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/DOCUMENTATION_SYSTEM_ARCHITECTURE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/EXPERIMENTAL-EVALUATION.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/FEATURE_IMPLEMENTATION_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/RESILIENT_HOOK_ARCHITECTURE_IMPLEMENTATION_SUMMARY.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/RESILIENT_HOOK_ARCHITECTURE_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/STAGE_HEADERS_IMPLEMENTATION_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/TIMEOUT_ARCHITECTURE_SOLUTION.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/TYPE_ANNOTATION_FIXING_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/UVXUSAGE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/ZUBAN_LSP_INTEGRATION_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/ZUBAN_TOML_PARSING_BUG_ANALYSIS.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/INPUT_VALIDATOR_SECURITY_AUDIT.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY-AUDIT.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_AUDIT_REPORT.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_AUDIT_STATUS_DISCLOSURE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_HARDENING_REPORT.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_SUBPROCESS_HARDENING_REPORT.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/BACKUP_SYSTEM.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/CACHING_SYSTEM.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/DASHBOARD_ARCHITECTURE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/MCP_INTEGRATION.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/MONITORING_INTEGRATION.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/UNIFIED_MONITORING_ARCHITECTURE.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/example.mcp.json +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/excalidraw.log +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/fix_typing_imports.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/mypy.ini +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/scripts/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/scripts/integrate_resource_management.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/scripts/performance_benchmark.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/templates/api_reference.md.template +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/templates/changelog_entry.md.template +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/templates/user_guide.md.template +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/api-reference.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/getting-started.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/index.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/stylesheets/extra.css +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/mkdocs.yml +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/base_test.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/conftest.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/coverage.json +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/comments_sample.txt +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/docstrings_sample.txt +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/expected_comments_sample.txt +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/init.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/docs/HEALTH_METRICS_TESTING_SUMMARY.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/docs/TEST_COVERAGE_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/docs/TEST_IMPLEMENTATION_PLAN.md +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/run_tests.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/scripts/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/scripts/agent_audit_report.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/scripts/run_test_suite.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test___main__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_ai_agent_workflow.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_ai_optimized_documentation.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_async_hook_executor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_changelog_generation.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_cli/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_cli/test_global_lock_options.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_cli_semantic_naming.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_coordinator_performance.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_autofix_coordinator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_comprehensive.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_enhanced_container.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_modules.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_performance.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_documentation_agent_simple.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_dynamic_config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_dynamic_config_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_end_to_end_integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_enhanced_filesystem.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_enhanced_filesystem_comprehensive.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_enhanced_filesystem_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_execution_speed_optimization.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_executors/__init__.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_executors/test_lock_integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_fast_hooks_behavior.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_filesystem_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_final_validation.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_global_lock_config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_hook_lock_manager.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_hook_manager_simple.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_import_coverage_consolidated.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_input_validation.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_intelligence_system.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_large_modules_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_main_entry_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_main_module.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_managers_consolidated.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_mcp_progress_monitor.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_mcp_server.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_comprehensive.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_config_adapter_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_focused.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_task_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_modernized_code.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_performance_agent_enhanced.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_performance_agent_simple.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_performance_benchmarks_focused.py.bak +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_phase_coordinator_simple.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_plugins_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_proactive_agent_system.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_protocol_compliance.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_publish_manager_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_pytest_features.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_regex_patterns.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_resource_cleanup_integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_secure_path_utils.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_secure_status_formatter.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_security_audit.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_security_hardening.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_security_integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_services_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_session_coordinator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_session_coordinator_coverage.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_simple_tool_version_service.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_simple_workflow.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_stage_workflow_execution_order.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_structured_errors.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_structured_logging.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_syntax_validation.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_terminal_restoration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_terminal_state.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_timeout_system.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_unified_api.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_unified_config.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_unified_monitoring_dashboard.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_validate_regex_patterns_tool.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_version_analyzer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_version_bump_analyzer.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_websocket_endpoints.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_workflow_fast_hooks.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_workflow_integration.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_workflow_orchestrator.py +0 -0
- {crackerjack-0.37.8 → crackerjack-0.37.9}/tools/validate_regex_patterns_standalone.py +0 -0
|
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.37.9] - 2025-09-16
|
|
9
|
+
|
|
10
|
+
### Documentation
|
|
11
|
+
|
|
12
|
+
- core: Update 5 files
|
|
13
|
+
|
|
8
14
|
## [0.37.8] - 2025-09-16
|
|
9
15
|
|
|
10
16
|
### Documentation
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: crackerjack
|
|
3
|
-
Version: 0.37.
|
|
3
|
+
Version: 0.37.9
|
|
4
4
|
Summary: Crackerjack Python project management tool
|
|
5
5
|
Project-URL: documentation, https://github.com/lesleslie/crackerjack
|
|
6
6
|
Project-URL: homepage, https://github.com/lesleslie/crackerjack
|
|
@@ -67,10 +67,8 @@ class WorkflowPipeline:
|
|
|
67
67
|
|
|
68
68
|
# Initialize quality intelligence for advanced decision making
|
|
69
69
|
try:
|
|
70
|
-
quality_baseline = EnhancedQualityBaselineService(
|
|
71
|
-
self._quality_intelligence = QualityIntelligenceService(
|
|
72
|
-
quality_baseline, console
|
|
73
|
-
)
|
|
70
|
+
quality_baseline = EnhancedQualityBaselineService()
|
|
71
|
+
self._quality_intelligence = QualityIntelligenceService(quality_baseline)
|
|
74
72
|
except Exception:
|
|
75
73
|
# Fallback gracefully if quality intelligence is not available
|
|
76
74
|
self._quality_intelligence = None
|
|
@@ -418,11 +416,11 @@ class WorkflowPipeline:
|
|
|
418
416
|
success = success and config_success
|
|
419
417
|
|
|
420
418
|
quality_success = await self._execute_quality_phase(options, workflow_id)
|
|
421
|
-
|
|
422
|
-
success = False
|
|
419
|
+
success = success and quality_success
|
|
423
420
|
|
|
424
|
-
|
|
425
|
-
|
|
421
|
+
# If quality phase failed and we're in publishing mode, stop here
|
|
422
|
+
if not quality_success and self._is_publishing_workflow(options):
|
|
423
|
+
return False
|
|
426
424
|
|
|
427
425
|
# Execute publishing workflow if requested
|
|
428
426
|
publishing_success = await self._execute_publishing_workflow(
|
|
@@ -447,6 +445,30 @@ class WorkflowPipeline:
|
|
|
447
445
|
|
|
448
446
|
return success
|
|
449
447
|
|
|
448
|
+
def _handle_quality_phase_result(
|
|
449
|
+
self, success: bool, quality_success: bool, options: OptionsProtocol
|
|
450
|
+
) -> bool:
|
|
451
|
+
"""Handle the result of the quality phase execution."""
|
|
452
|
+
if not quality_success:
|
|
453
|
+
if self._is_publishing_workflow(options):
|
|
454
|
+
# For publishing workflows, quality failures should stop execution
|
|
455
|
+
return False
|
|
456
|
+
# For non-publishing workflows, we continue but mark as failed
|
|
457
|
+
return False
|
|
458
|
+
return success
|
|
459
|
+
|
|
460
|
+
def _handle_workflow_completion(
|
|
461
|
+
self, success: bool, publishing_success: bool, options: OptionsProtocol
|
|
462
|
+
) -> bool:
|
|
463
|
+
"""Handle workflow completion and determine final success status."""
|
|
464
|
+
# Only fail the overall workflow if publishing was explicitly requested and failed
|
|
465
|
+
if not publishing_success and (options.publish or options.all):
|
|
466
|
+
self.console.print(
|
|
467
|
+
"[red]❌ Publishing failed - overall workflow marked as failed[/red]"
|
|
468
|
+
)
|
|
469
|
+
return False
|
|
470
|
+
return success
|
|
471
|
+
|
|
450
472
|
def _is_publishing_workflow(self, options: OptionsProtocol) -> bool:
|
|
451
473
|
return bool(options.publish or options.all)
|
|
452
474
|
|
|
@@ -504,14 +526,14 @@ class WorkflowPipeline:
|
|
|
504
526
|
return "Quality intelligence not available"
|
|
505
527
|
|
|
506
528
|
# Analyze recent quality trends and anomalies
|
|
507
|
-
anomalies =
|
|
508
|
-
patterns =
|
|
529
|
+
anomalies = self._quality_intelligence.detect_anomalies()
|
|
530
|
+
patterns = self._quality_intelligence.identify_patterns()
|
|
509
531
|
|
|
510
532
|
# Make intelligent recommendations based on current state
|
|
511
533
|
recommendations = []
|
|
512
534
|
if anomalies:
|
|
513
535
|
high_severity_anomalies = [
|
|
514
|
-
a for a in anomalies if a.severity.name in
|
|
536
|
+
a for a in anomalies if a.severity.name in ("CRITICAL", "HIGH")
|
|
515
537
|
]
|
|
516
538
|
if high_severity_anomalies:
|
|
517
539
|
recommendations.append(
|
|
@@ -397,13 +397,29 @@ class ReferenceGenerator:
|
|
|
397
397
|
|
|
398
398
|
arg_index = func_node.args.args.index(arg)
|
|
399
399
|
if arg_index >= defaults_start:
|
|
400
|
-
|
|
401
|
-
default_node = func_node.args.defaults[default_index]
|
|
402
|
-
if isinstance(default_node, ast.Constant):
|
|
403
|
-
return default_node.value, False
|
|
400
|
+
return self._extract_argument_default(arg_index, defaults_start, func_node)
|
|
404
401
|
|
|
405
402
|
return None, True
|
|
406
403
|
|
|
404
|
+
def _extract_argument_default(
|
|
405
|
+
self, arg_index: int, defaults_start: int, func_node: ast.FunctionDef
|
|
406
|
+
) -> tuple[t.Any, bool]:
|
|
407
|
+
"""Extract default value for a specific argument.
|
|
408
|
+
|
|
409
|
+
Args:
|
|
410
|
+
arg_index: Index of the argument
|
|
411
|
+
defaults_start: Index where defaults start
|
|
412
|
+
func_node: Parent function node
|
|
413
|
+
|
|
414
|
+
Returns:
|
|
415
|
+
Tuple of (default_value, required)
|
|
416
|
+
"""
|
|
417
|
+
default_index = arg_index - defaults_start
|
|
418
|
+
default_node = func_node.args.defaults[default_index]
|
|
419
|
+
if isinstance(default_node, ast.Constant):
|
|
420
|
+
return default_node.value, False
|
|
421
|
+
return None, True
|
|
422
|
+
|
|
407
423
|
async def _enhance_with_examples(
|
|
408
424
|
self, commands: dict[str, CommandInfo]
|
|
409
425
|
) -> dict[str, CommandInfo]:
|
|
@@ -416,35 +432,47 @@ class ReferenceGenerator:
|
|
|
416
432
|
Enhanced commands with examples
|
|
417
433
|
"""
|
|
418
434
|
for command in commands.values():
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
enhanced_example = f"{basic_example} {' '.join(param_examples)}"
|
|
433
|
-
command.examples.append(
|
|
434
|
-
{
|
|
435
|
-
"description": f"Using {command.name} with parameters",
|
|
436
|
-
"command": enhanced_example,
|
|
437
|
-
}
|
|
438
|
-
)
|
|
435
|
+
self._add_basic_example(command)
|
|
436
|
+
self._add_parameter_examples(command)
|
|
437
|
+
return commands
|
|
438
|
+
|
|
439
|
+
def _add_basic_example(self, command: CommandInfo) -> None:
|
|
440
|
+
"""Add a basic example for a command."""
|
|
441
|
+
basic_example = f"python -m crackerjack --{command.name}"
|
|
442
|
+
command.examples.append(
|
|
443
|
+
{
|
|
444
|
+
"description": f"Basic {command.name} usage",
|
|
445
|
+
"command": basic_example,
|
|
446
|
+
}
|
|
447
|
+
)
|
|
439
448
|
|
|
449
|
+
def _add_parameter_examples(self, command: CommandInfo) -> None:
|
|
450
|
+
"""Add parameter examples for a command."""
|
|
451
|
+
# Generate basic examples
|
|
452
|
+
basic_example = f"python -m crackerjack --{command.name}"
|
|
453
|
+
|
|
454
|
+
# Add parameter examples
|
|
455
|
+
param_examples = []
|
|
456
|
+
for param in command.parameters:
|
|
457
|
+
if not param.required and param.default_value is not None:
|
|
458
|
+
param_example = self._format_parameter_example(param)
|
|
459
|
+
if param_example:
|
|
460
|
+
param_examples.append(param_example)
|
|
461
|
+
|
|
462
|
+
if param_examples:
|
|
463
|
+
enhanced_example = f"{basic_example} {' '.join(param_examples)}"
|
|
440
464
|
command.examples.append(
|
|
441
465
|
{
|
|
442
|
-
"description": f"
|
|
443
|
-
"command":
|
|
466
|
+
"description": f"Using {command.name} with parameters",
|
|
467
|
+
"command": enhanced_example,
|
|
444
468
|
}
|
|
445
469
|
)
|
|
446
470
|
|
|
447
|
-
|
|
471
|
+
def _format_parameter_example(self, param: ParameterInfo) -> str | None:
|
|
472
|
+
"""Format a parameter example."""
|
|
473
|
+
if isinstance(param.default_value, bool):
|
|
474
|
+
return f"--{param.name}"
|
|
475
|
+
return f"--{param.name} {param.default_value}"
|
|
448
476
|
|
|
449
477
|
async def _enhance_with_workflows(
|
|
450
478
|
self, commands: dict[str, CommandInfo]
|
|
@@ -632,26 +660,26 @@ class ReferenceGenerator:
|
|
|
632
660
|
]
|
|
633
661
|
|
|
634
662
|
def _render_markdown_categories(self, reference: CommandReference) -> list[str]:
|
|
635
|
-
"""Render command categories for markdown.
|
|
636
|
-
|
|
637
|
-
Args:
|
|
638
|
-
reference: Command reference
|
|
639
|
-
|
|
640
|
-
Returns:
|
|
641
|
-
List of category section lines
|
|
642
|
-
"""
|
|
663
|
+
"""Render command categories for markdown."""
|
|
643
664
|
category_lines = []
|
|
644
665
|
for category, command_names in reference.categories.items():
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
"",
|
|
649
|
-
]
|
|
650
|
-
)
|
|
666
|
+
category_section = self._render_markdown_category(category, reference.commands, command_names)
|
|
667
|
+
category_lines.extend(category_section)
|
|
668
|
+
return category_lines
|
|
651
669
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
670
|
+
def _render_markdown_category(
|
|
671
|
+
self, category: str, commands: dict[str, CommandInfo], command_names: list[str]
|
|
672
|
+
) -> list[str]:
|
|
673
|
+
"""Render markdown for a single category."""
|
|
674
|
+
category_lines = [
|
|
675
|
+
f"## {category.title()}",
|
|
676
|
+
"",
|
|
677
|
+
]
|
|
678
|
+
|
|
679
|
+
for command_name in command_names:
|
|
680
|
+
command = commands[command_name]
|
|
681
|
+
command_lines = self._render_command_markdown(command)
|
|
682
|
+
category_lines.extend(command_lines)
|
|
655
683
|
|
|
656
684
|
return category_lines
|
|
657
685
|
|
|
@@ -685,14 +713,7 @@ class ReferenceGenerator:
|
|
|
685
713
|
return workflow_lines
|
|
686
714
|
|
|
687
715
|
def _render_command_markdown(self, command: CommandInfo) -> list[str]:
|
|
688
|
-
"""Render single command as Markdown.
|
|
689
|
-
|
|
690
|
-
Args:
|
|
691
|
-
command: Command to render
|
|
692
|
-
|
|
693
|
-
Returns:
|
|
694
|
-
List of markdown lines
|
|
695
|
-
"""
|
|
716
|
+
"""Render single command as Markdown."""
|
|
696
717
|
lines = [
|
|
697
718
|
f"### `{command.name}`",
|
|
698
719
|
"",
|
|
@@ -702,50 +723,47 @@ class ReferenceGenerator:
|
|
|
702
723
|
|
|
703
724
|
# Add parameters section
|
|
704
725
|
if command.parameters:
|
|
705
|
-
|
|
726
|
+
param_lines = self._render_command_parameters_markdown(command.parameters)
|
|
727
|
+
lines.extend(param_lines)
|
|
706
728
|
|
|
707
729
|
# Add examples section
|
|
708
730
|
if command.examples:
|
|
709
|
-
|
|
731
|
+
example_lines = self._render_command_examples_markdown(command.examples)
|
|
732
|
+
lines.extend(example_lines)
|
|
710
733
|
|
|
711
734
|
# Add related commands section
|
|
712
735
|
if command.related_commands:
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
)
|
|
736
|
+
related_lines = self._render_command_related_markdown(command.related_commands)
|
|
737
|
+
lines.extend(related_lines)
|
|
716
738
|
|
|
717
739
|
return lines
|
|
718
740
|
|
|
719
741
|
def _render_command_parameters_markdown(
|
|
720
742
|
self, parameters: list[ParameterInfo]
|
|
721
743
|
) -> list[str]:
|
|
722
|
-
"""Render command parameters for markdown.
|
|
723
|
-
|
|
724
|
-
Args:
|
|
725
|
-
parameters: List of parameters to render
|
|
726
|
-
|
|
727
|
-
Returns:
|
|
728
|
-
List of parameter section lines
|
|
729
|
-
"""
|
|
744
|
+
"""Render command parameters for markdown."""
|
|
730
745
|
param_lines = [
|
|
731
746
|
"**Parameters:**",
|
|
732
747
|
"",
|
|
733
748
|
]
|
|
734
749
|
|
|
735
750
|
for param in parameters:
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
f" (default: {param.default_value})"
|
|
739
|
-
if param.default_value is not None
|
|
740
|
-
else ""
|
|
741
|
-
)
|
|
742
|
-
param_lines.append(
|
|
743
|
-
f"- `--{param.name}` ({param.type_hint}){required_str}{default_str}: {param.description}"
|
|
744
|
-
)
|
|
751
|
+
param_line = self._format_parameter_line(param)
|
|
752
|
+
param_lines.append(param_line)
|
|
745
753
|
|
|
746
754
|
param_lines.append("")
|
|
747
755
|
return param_lines
|
|
748
756
|
|
|
757
|
+
def _format_parameter_line(self, param: ParameterInfo) -> str:
|
|
758
|
+
"""Format a single parameter line."""
|
|
759
|
+
required_str = " (required)" if param.required else ""
|
|
760
|
+
default_str = (
|
|
761
|
+
f" (default: {param.default_value})"
|
|
762
|
+
if param.default_value is not None
|
|
763
|
+
else ""
|
|
764
|
+
)
|
|
765
|
+
return f"- `--{param.name}` ({param.type_hint}){required_str}{default_str}: {param.description}"
|
|
766
|
+
|
|
749
767
|
def _render_command_examples_markdown(
|
|
750
768
|
self, examples: list[dict[str, str]]
|
|
751
769
|
) -> list[str]:
|
|
@@ -794,12 +812,12 @@ class ReferenceGenerator:
|
|
|
794
812
|
|
|
795
813
|
def _render_html(self, reference: CommandReference) -> str:
|
|
796
814
|
"""Render reference as HTML."""
|
|
797
|
-
|
|
798
|
-
reference.generated_at.strftime("%Y-%m-%d %H:%M:%S")
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
return
|
|
815
|
+
html_parts = [
|
|
816
|
+
self._render_html_header(reference.generated_at.strftime("%Y-%m-%d %H:%M:%S")),
|
|
817
|
+
self._render_html_commands(reference),
|
|
818
|
+
"</body></html>"
|
|
819
|
+
]
|
|
820
|
+
return "".join(html_parts)
|
|
803
821
|
|
|
804
822
|
def _render_html_header(self, generated_at: str) -> str:
|
|
805
823
|
"""Render HTML header with styles and metadata."""
|
|
@@ -822,26 +840,38 @@ class ReferenceGenerator:
|
|
|
822
840
|
|
|
823
841
|
def _render_html_commands(self, reference: CommandReference) -> str:
|
|
824
842
|
"""Render HTML commands by category."""
|
|
825
|
-
|
|
843
|
+
html_parts = []
|
|
826
844
|
for category, command_names in reference.categories.items():
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
845
|
+
category_html = self._render_html_category(category, reference.commands, command_names)
|
|
846
|
+
html_parts.append(category_html)
|
|
847
|
+
return "".join(html_parts)
|
|
848
|
+
|
|
849
|
+
def _render_html_category(
|
|
850
|
+
self, category: str, commands: dict[str, CommandInfo], command_names: list[str]
|
|
851
|
+
) -> str:
|
|
852
|
+
"""Render HTML for a single category."""
|
|
853
|
+
html = f"<h2>{category.title()}</h2>"
|
|
854
|
+
html += self._render_html_category_commands(commands, command_names)
|
|
831
855
|
return html
|
|
832
856
|
|
|
833
857
|
def _render_html_category_commands(
|
|
834
858
|
self, commands: dict[str, CommandInfo], command_names: list[str]
|
|
835
859
|
) -> str:
|
|
836
860
|
"""Render HTML for commands in a category."""
|
|
837
|
-
|
|
861
|
+
html_parts = []
|
|
838
862
|
for command_name in command_names:
|
|
839
863
|
command = commands[command_name]
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
864
|
+
command_html = self._render_single_html_command(command)
|
|
865
|
+
html_parts.append(command_html)
|
|
866
|
+
return "".join(html_parts)
|
|
867
|
+
|
|
868
|
+
def _render_single_html_command(self, command: CommandInfo) -> str:
|
|
869
|
+
"""Render HTML for a single command."""
|
|
870
|
+
html = '<div class="command">'
|
|
871
|
+
html += f"<h3><code>{command.name}</code></h3>"
|
|
872
|
+
html += f"<p>{command.description}</p>"
|
|
873
|
+
html += self._render_html_command_parameters(command.parameters)
|
|
874
|
+
html += "</div>"
|
|
845
875
|
return html
|
|
846
876
|
|
|
847
877
|
def _render_html_command_parameters(self, parameters: list[ParameterInfo]) -> str:
|
|
@@ -864,31 +894,44 @@ class ReferenceGenerator:
|
|
|
864
894
|
"version": reference.version,
|
|
865
895
|
"categories": reference.categories,
|
|
866
896
|
"workflows": reference.workflows,
|
|
867
|
-
"commands":
|
|
897
|
+
"commands": self._serialize_commands(reference.commands),
|
|
868
898
|
}
|
|
869
899
|
|
|
870
|
-
for name, command in reference.commands.items():
|
|
871
|
-
data["commands"][name] = {
|
|
872
|
-
"name": command.name,
|
|
873
|
-
"description": command.description,
|
|
874
|
-
"category": command.category,
|
|
875
|
-
"parameters": [
|
|
876
|
-
{
|
|
877
|
-
"name": param.name,
|
|
878
|
-
"type": param.type_hint,
|
|
879
|
-
"default": param.default_value,
|
|
880
|
-
"description": param.description,
|
|
881
|
-
"required": param.required,
|
|
882
|
-
}
|
|
883
|
-
for param in command.parameters
|
|
884
|
-
],
|
|
885
|
-
"examples": command.examples,
|
|
886
|
-
"related_commands": command.related_commands,
|
|
887
|
-
"aliases": command.aliases,
|
|
888
|
-
}
|
|
889
|
-
|
|
890
900
|
return json.dumps(data, indent=2, default=str)
|
|
891
901
|
|
|
902
|
+
def _serialize_commands(self, commands: dict[str, CommandInfo]) -> dict[str, t.Any]:
|
|
903
|
+
"""Serialize commands for JSON output."""
|
|
904
|
+
serialized_commands = {}
|
|
905
|
+
for name, command in commands.items():
|
|
906
|
+
serialized_commands[name] = self._serialize_command(command)
|
|
907
|
+
return serialized_commands
|
|
908
|
+
|
|
909
|
+
def _serialize_command(self, command: CommandInfo) -> dict[str, t.Any]:
|
|
910
|
+
"""Serialize a single command for JSON output."""
|
|
911
|
+
return {
|
|
912
|
+
"name": command.name,
|
|
913
|
+
"description": command.description,
|
|
914
|
+
"category": command.category,
|
|
915
|
+
"parameters": self._serialize_parameters(command.parameters),
|
|
916
|
+
"examples": command.examples,
|
|
917
|
+
"related_commands": command.related_commands,
|
|
918
|
+
"aliases": command.aliases,
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
def _serialize_parameters(self, parameters: list[ParameterInfo]) -> list[dict[str, t.Any]]:
|
|
922
|
+
"""Serialize parameters for JSON output."""
|
|
923
|
+
return [self._serialize_parameter(param) for param in parameters]
|
|
924
|
+
|
|
925
|
+
def _serialize_parameter(self, param: ParameterInfo) -> dict[str, t.Any]:
|
|
926
|
+
"""Serialize a single parameter for JSON output."""
|
|
927
|
+
return {
|
|
928
|
+
"name": param.name,
|
|
929
|
+
"type": param.type_hint,
|
|
930
|
+
"default": param.default_value,
|
|
931
|
+
"description": param.description,
|
|
932
|
+
"required": param.required,
|
|
933
|
+
}
|
|
934
|
+
|
|
892
935
|
def _render_yaml(self, reference: CommandReference) -> str:
|
|
893
936
|
"""Render reference as YAML."""
|
|
894
937
|
import yaml
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import tempfile
|
|
2
2
|
import typing as t
|
|
3
|
+
from contextlib import suppress
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import jinja2
|
|
@@ -469,29 +470,26 @@ class DynamicConfigGenerator:
|
|
|
469
470
|
|
|
470
471
|
def _detect_package_directory(self) -> str:
|
|
471
472
|
"""Detect the package directory name for the current project."""
|
|
472
|
-
import os
|
|
473
473
|
from pathlib import Path
|
|
474
474
|
|
|
475
475
|
# Check if we're in the crackerjack project itself
|
|
476
|
-
current_dir = Path
|
|
476
|
+
current_dir = Path.cwd()
|
|
477
477
|
if (current_dir / "crackerjack").exists() and (
|
|
478
478
|
current_dir / "pyproject.toml"
|
|
479
479
|
).exists():
|
|
480
480
|
# Check if this is actually the crackerjack project
|
|
481
|
-
|
|
481
|
+
with suppress(Exception):
|
|
482
482
|
import tomllib
|
|
483
483
|
|
|
484
484
|
with (current_dir / "pyproject.toml").open("rb") as f:
|
|
485
485
|
data = tomllib.load(f)
|
|
486
486
|
if data.get("project", {}).get("name") == "crackerjack":
|
|
487
487
|
return "crackerjack"
|
|
488
|
-
except Exception:
|
|
489
|
-
pass
|
|
490
488
|
|
|
491
489
|
# Try to read package name from pyproject.toml
|
|
492
490
|
pyproject_path = current_dir / "pyproject.toml"
|
|
493
491
|
if pyproject_path.exists():
|
|
494
|
-
|
|
492
|
+
with suppress(Exception):
|
|
495
493
|
import tomllib
|
|
496
494
|
|
|
497
495
|
with pyproject_path.open("rb") as f:
|
|
@@ -502,8 +500,6 @@ class DynamicConfigGenerator:
|
|
|
502
500
|
# Check if package directory exists
|
|
503
501
|
if (current_dir / package_name).exists():
|
|
504
502
|
return package_name
|
|
505
|
-
except Exception:
|
|
506
|
-
pass
|
|
507
503
|
|
|
508
504
|
# Fallback to project directory name
|
|
509
505
|
if (current_dir / current_dir.name).exists():
|
|
@@ -23,9 +23,7 @@ def main() -> int:
|
|
|
23
23
|
|
|
24
24
|
# If no files specified, check project files
|
|
25
25
|
if not files_to_check:
|
|
26
|
-
|
|
27
|
-
lsp_client = LSPClient(console)
|
|
28
|
-
files_to_check = lsp_client.get_project_files(project_path)
|
|
26
|
+
files_to_check = _get_project_files(console)
|
|
29
27
|
|
|
30
28
|
if not files_to_check:
|
|
31
29
|
console.print("🔍 No Python files to check")
|
|
@@ -36,29 +34,46 @@ def main() -> int:
|
|
|
36
34
|
|
|
37
35
|
# Check if LSP server is running
|
|
38
36
|
if not lsp_client.is_server_running():
|
|
39
|
-
console
|
|
40
|
-
"⚠️ Zuban LSP server not running, falling back to direct zuban check"
|
|
41
|
-
)
|
|
42
|
-
# Fall back to regular zuban execution
|
|
43
|
-
import subprocess
|
|
44
|
-
|
|
45
|
-
try:
|
|
46
|
-
result = subprocess.run(
|
|
47
|
-
["zuban", "check"] + files_to_check,
|
|
48
|
-
capture_output=True,
|
|
49
|
-
text=True,
|
|
50
|
-
timeout=120,
|
|
51
|
-
)
|
|
52
|
-
if result.stdout:
|
|
53
|
-
console.print(result.stdout)
|
|
54
|
-
if result.stderr:
|
|
55
|
-
console.print(result.stderr, style="red")
|
|
56
|
-
return result.returncode
|
|
57
|
-
except (subprocess.TimeoutExpired, FileNotFoundError) as e:
|
|
58
|
-
console.print(f"❌ Error running zuban: {e}", style="red")
|
|
59
|
-
return 1
|
|
37
|
+
return _fallback_to_zuban_check(console, files_to_check)
|
|
60
38
|
|
|
61
39
|
# Use LSP server for type checking
|
|
40
|
+
return _check_files_with_lsp(console, lsp_client, files_to_check)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _get_project_files(console: Console) -> list[str]:
|
|
44
|
+
"""Get project files to check."""
|
|
45
|
+
project_path = Path.cwd()
|
|
46
|
+
lsp_client = LSPClient(console)
|
|
47
|
+
return lsp_client.get_project_files(project_path)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _fallback_to_zuban_check(console: Console, files_to_check: list[str]) -> int:
|
|
51
|
+
"""Fall back to regular zuban execution when LSP server is not running."""
|
|
52
|
+
console.print("⚠️ Zuban LSP server not running, falling back to direct zuban check")
|
|
53
|
+
# Fall back to regular zuban execution
|
|
54
|
+
import subprocess
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
result = subprocess.run(
|
|
58
|
+
["zuban", "check"] + files_to_check,
|
|
59
|
+
capture_output=True,
|
|
60
|
+
text=True,
|
|
61
|
+
timeout=120,
|
|
62
|
+
)
|
|
63
|
+
if result.stdout:
|
|
64
|
+
console.print(result.stdout)
|
|
65
|
+
if result.stderr:
|
|
66
|
+
console.print(result.stderr, style="red")
|
|
67
|
+
return result.returncode
|
|
68
|
+
except (subprocess.TimeoutExpired, FileNotFoundError) as e:
|
|
69
|
+
console.print(f"❌ Error running zuban: {e}", style="red")
|
|
70
|
+
return 1
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _check_files_with_lsp(
|
|
74
|
+
console: Console, lsp_client: LSPClient, files_to_check: list[str]
|
|
75
|
+
) -> int:
|
|
76
|
+
"""Check files using LSP server."""
|
|
62
77
|
server_info = lsp_client.get_server_info()
|
|
63
78
|
if server_info:
|
|
64
79
|
console.print(f"🔍 Using Zuban LSP server (PID: {server_info['pid']})")
|
|
@@ -37,23 +37,12 @@ class WorkflowOptions:
|
|
|
37
37
|
@classmethod
|
|
38
38
|
def from_args(cls, args: t.Any) -> "WorkflowOptions":
|
|
39
39
|
return cls(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
),
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
),
|
|
46
|
-
publishing=PublishConfig(
|
|
47
|
-
publish=getattr(args, "publish", None),
|
|
48
|
-
bump=getattr(args, "bump", None),
|
|
49
|
-
),
|
|
50
|
-
git=GitConfig(
|
|
51
|
-
commit=getattr(args, "commit", False),
|
|
52
|
-
create_pr=getattr(args, "create_pr", False),
|
|
53
|
-
),
|
|
54
|
-
ai=AIConfig(
|
|
55
|
-
ai_agent=getattr(args, "ai_agent", False),
|
|
56
|
-
),
|
|
40
|
+
clean=getattr(args, "clean", False),
|
|
41
|
+
test=getattr(args, "test", False),
|
|
42
|
+
publish=getattr(args, "publish", None),
|
|
43
|
+
bump=getattr(args, "bump", None),
|
|
44
|
+
commit=getattr(args, "commit", False),
|
|
45
|
+
create_pr=getattr(args, "create_pr", False),
|
|
57
46
|
interactive=getattr(args, "interactive", True),
|
|
58
47
|
dry_run=getattr(args, "dry_run", False),
|
|
59
48
|
)
|
|
@@ -124,7 +124,7 @@ class PublishManagerImpl:
|
|
|
124
124
|
|
|
125
125
|
# Get intelligent version analysis and recommendation
|
|
126
126
|
recommendation = self._get_version_recommendation()
|
|
127
|
-
if recommendation and version_type
|
|
127
|
+
if recommendation and version_type != "interactive":
|
|
128
128
|
self._display_version_analysis(recommendation)
|
|
129
129
|
if version_type == "auto":
|
|
130
130
|
version_type = recommendation.bump_type.value
|