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.

Files changed (417) hide show
  1. crackerjack-0.37.9/.codespell-ignore +2 -0
  2. crackerjack-0.37.9/.codespellrc +5 -0
  3. {crackerjack-0.37.8 → crackerjack-0.37.9}/CHANGELOG.md +6 -0
  4. {crackerjack-0.37.8 → crackerjack-0.37.9}/PKG-INFO +1 -1
  5. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/workflow_orchestrator.py +33 -11
  6. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/reference_generator.py +155 -112
  7. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/dynamic_config.py +4 -8
  8. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/hooks/lsp_hook.py +39 -24
  9. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/interactive.py +6 -17
  10. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/publish_manager.py +1 -1
  11. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/execution_tools_backup.py +34 -36
  12. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config_merge.py +33 -30
  13. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/secure_subprocess.py +43 -25
  14. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/validate_regex_patterns.py +1 -0
  15. {crackerjack-0.37.8 → crackerjack-0.37.9}/pyproject.toml +5 -2
  16. crackerjack-0.37.9/tests/test_api.py +115 -0
  17. crackerjack-0.37.9/tests/test_architect_agent.py +193 -0
  18. crackerjack-0.37.9/tests/test_base.py +791 -0
  19. crackerjack-0.37.9/tests/test_coordinator.py +240 -0
  20. crackerjack-0.37.9/tests/test_documentation_agent.py +157 -0
  21. crackerjack-0.37.9/tests/test_dry_agent.py +157 -0
  22. crackerjack-0.37.9/tests/test_formatting_agent.py +157 -0
  23. crackerjack-0.37.9/tests/test_import_optimization_agent.py +347 -0
  24. crackerjack-0.37.9/tests/test_interactive.py +131 -0
  25. crackerjack-0.37.9/tests/test_lsp_client.py +275 -0
  26. crackerjack-0.37.9/tests/test_performance_agent.py +413 -0
  27. crackerjack-0.37.9/tests/test_performance_helpers.py +356 -0
  28. crackerjack-0.37.9/tests/test_proactive_agent.py +157 -0
  29. crackerjack-0.37.9/tests/test_rust_tool_adapter.py +707 -0
  30. crackerjack-0.37.9/tests/test_rust_tool_manager.py +231 -0
  31. crackerjack-0.37.9/tests/test_skylos_adapter.py +256 -0
  32. crackerjack-0.37.9/tests/test_zuban_adapter.py +390 -0
  33. {crackerjack-0.37.8 → crackerjack-0.37.9}/uv.lock +4 -4
  34. {crackerjack-0.37.8 → crackerjack-0.37.9}/.github/FUNDING.yml +0 -0
  35. {crackerjack-0.37.8 → crackerjack-0.37.9}/.gitignore +0 -0
  36. {crackerjack-0.37.8 → crackerjack-0.37.9}/.pre-commit-config.yaml +0 -0
  37. {crackerjack-0.37.8 → crackerjack-0.37.9}/AGENTS.md +0 -0
  38. {crackerjack-0.37.8 → crackerjack-0.37.9}/CLAUDE.md +0 -0
  39. {crackerjack-0.37.8 → crackerjack-0.37.9}/LICENSE +0 -0
  40. {crackerjack-0.37.8 → crackerjack-0.37.9}/QWEN.md +0 -0
  41. {crackerjack-0.37.8 → crackerjack-0.37.9}/README.md +0 -0
  42. {crackerjack-0.37.8 → crackerjack-0.37.9}/RULES.md +0 -0
  43. {crackerjack-0.37.8 → crackerjack-0.37.9}/SECURITY.md +0 -0
  44. {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/AGENT-CAPABILITIES.json +0 -0
  45. {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/AGENT_SELECTION.md +0 -0
  46. {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/AI-REFERENCE.md +0 -0
  47. {crackerjack-0.37.8 → crackerjack-0.37.9}/ai/ERROR-PATTERNS.yaml +0 -0
  48. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/__init__.py +0 -0
  49. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/__main__.py +0 -0
  50. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/__init__.py +0 -0
  51. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/lsp_client.py +0 -0
  52. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/rust_tool_adapter.py +0 -0
  53. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/rust_tool_manager.py +0 -0
  54. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/skylos_adapter.py +0 -0
  55. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/adapters/zuban_adapter.py +0 -0
  56. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/__init__.py +0 -0
  57. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/architect_agent.py +0 -0
  58. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/base.py +0 -0
  59. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/coordinator.py +0 -0
  60. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/documentation_agent.py +0 -0
  61. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/dry_agent.py +0 -0
  62. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/formatting_agent.py +0 -0
  63. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/import_optimization_agent.py +0 -0
  64. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/performance_agent.py +0 -0
  65. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/performance_helpers.py +0 -0
  66. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/proactive_agent.py +0 -0
  67. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/refactoring_agent.py +0 -0
  68. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/refactoring_helpers.py +0 -0
  69. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/security_agent.py +0 -0
  70. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/test_creation_agent.py +0 -0
  71. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/test_specialist_agent.py +0 -0
  72. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/agents/tracker.py +0 -0
  73. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/api.py +0 -0
  74. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/__init__.py +0 -0
  75. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/cache_handlers.py +0 -0
  76. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/cache_handlers_enhanced.py +0 -0
  77. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/facade.py +0 -0
  78. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/handlers.py +0 -0
  79. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/interactive.py +0 -0
  80. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/options.py +0 -0
  81. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/cli/utils.py +0 -0
  82. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/code_cleaner.py +0 -0
  83. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/config/__init__.py +0 -0
  84. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/config/global_lock_config.py +0 -0
  85. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/config/hooks.py +0 -0
  86. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/__init__.py +0 -0
  87. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/async_workflow_orchestrator.py +0 -0
  88. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/autofix_coordinator.py +0 -0
  89. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/container.py +0 -0
  90. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/enhanced_container.py +0 -0
  91. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/file_lifecycle.py +0 -0
  92. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/performance.py +0 -0
  93. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/performance_monitor.py +0 -0
  94. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/phase_coordinator.py +0 -0
  95. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/proactive_workflow.py +0 -0
  96. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/resource_manager.py +0 -0
  97. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/service_watchdog.py +0 -0
  98. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/session_coordinator.py +0 -0
  99. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/timeout_manager.py +0 -0
  100. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/core/websocket_lifecycle.py +0 -0
  101. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/INDEX.md +0 -0
  102. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/API_REFERENCE.md +0 -0
  103. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/CLI_REFERENCE.md +0 -0
  104. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/CROSS_REFERENCES.md +0 -0
  105. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/PROTOCOLS.md +0 -0
  106. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/docs/generated/api/SERVICES.md +0 -0
  107. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/__init__.py +0 -0
  108. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/ai_templates.py +0 -0
  109. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/dual_output_generator.py +0 -0
  110. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/documentation/mkdocs_integration.py +0 -0
  111. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/errors.py +0 -0
  112. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/__init__.py +0 -0
  113. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/async_hook_executor.py +0 -0
  114. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/cached_hook_executor.py +0 -0
  115. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/hook_executor.py +0 -0
  116. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/hook_lock_manager.py +0 -0
  117. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/individual_hook_executor.py +0 -0
  118. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/lsp_aware_hook_executor.py +0 -0
  119. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/executors/tool_proxy.py +0 -0
  120. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/__init__.py +0 -0
  121. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/adaptive_learning.py +0 -0
  122. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/agent_orchestrator.py +0 -0
  123. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/agent_registry.py +0 -0
  124. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/agent_selector.py +0 -0
  125. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/intelligence/integration.py +0 -0
  126. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/__init__.py +0 -0
  127. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/async_hook_manager.py +0 -0
  128. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/hook_manager.py +0 -0
  129. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_command_builder.py +0 -0
  130. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_executor.py +0 -0
  131. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_manager.py +0 -0
  132. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_manager_backup.py +0 -0
  133. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/managers/test_progress.py +0 -0
  134. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/__init__.py +0 -0
  135. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/cache.py +0 -0
  136. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/client_runner.py +0 -0
  137. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/context.py +0 -0
  138. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/dashboard.py +0 -0
  139. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/enhanced_progress_monitor.py +0 -0
  140. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/enhanced_progress_monitor.tcss +0 -0
  141. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/file_monitor.py +0 -0
  142. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/progress_components.py +0 -0
  143. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/progress_monitor.py +0 -0
  144. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/progress_monitor.tcss +0 -0
  145. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/rate_limiter.py +0 -0
  146. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/server.py +0 -0
  147. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/server_core.py +0 -0
  148. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/service_watchdog.py +0 -0
  149. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/state.py +0 -0
  150. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/task_manager.py +0 -0
  151. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/__init__.py +0 -0
  152. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/core_tools.py +0 -0
  153. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/error_analyzer.py +0 -0
  154. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/execution_tools.py +0 -0
  155. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/intelligence_tool_registry.py +0 -0
  156. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/intelligence_tools.py +0 -0
  157. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/monitoring_tools.py +0 -0
  158. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/monitoring_tools.py.backup +0 -0
  159. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/proactive_tools.py +0 -0
  160. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/progress_tools.py +0 -0
  161. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/utility_tools.py +0 -0
  162. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/tools/workflow_executor.py +0 -0
  163. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/__init__.py +0 -0
  164. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/app.py +0 -0
  165. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/endpoints.py +0 -0
  166. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/jobs.py +0 -0
  167. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/monitoring_endpoints.py +0 -0
  168. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/server.py +0 -0
  169. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket/websocket_handler.py +0 -0
  170. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mcp/websocket_server.py +0 -0
  171. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mixins/__init__.py +0 -0
  172. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/mixins/error_handling.py +0 -0
  173. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/__init__.py +0 -0
  174. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/config.py +0 -0
  175. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/config_adapter.py +0 -0
  176. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/protocols.py +0 -0
  177. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/resource_protocols.py +0 -0
  178. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/models/task.py +0 -0
  179. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/__init__.py +0 -0
  180. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/ai_agent_watchdog.py +0 -0
  181. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/metrics_collector.py +0 -0
  182. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/regression_prevention.py +0 -0
  183. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/monitoring/websocket_server.py +0 -0
  184. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/__init__.py +0 -0
  185. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/advanced_orchestrator.py +0 -0
  186. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/coverage_improvement.py +0 -0
  187. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/execution_strategies.py +0 -0
  188. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/orchestration/test_progress_streamer.py +0 -0
  189. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/__init__.py +0 -0
  190. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/base.py +0 -0
  191. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/hooks.py +0 -0
  192. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/loader.py +0 -0
  193. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/plugins/managers.py +0 -0
  194. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/pyproject.toml +0 -0
  195. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/security/__init__.py +0 -0
  196. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/security/audit.py +0 -0
  197. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/__init__.py +0 -0
  198. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/anomaly_detector.py +0 -0
  199. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/api_extractor.py +0 -0
  200. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/backup_service.py +0 -0
  201. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/bounded_status_operations.py +0 -0
  202. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/cache.py +0 -0
  203. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/changelog_automation.py +0 -0
  204. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config.py +0 -0
  205. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config_integrity.py +0 -0
  206. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/config_template.py +0 -0
  207. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/contextual_ai_assistant.py +0 -0
  208. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/coverage_badge_service.py +0 -0
  209. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/coverage_ratchet.py +0 -0
  210. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/debug.py +0 -0
  211. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/dependency_analyzer.py +0 -0
  212. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/dependency_monitor.py +0 -0
  213. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/documentation_generator.py +0 -0
  214. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/documentation_service.py +0 -0
  215. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/enhanced_filesystem.py +0 -0
  216. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/enterprise_optimizer.py +0 -0
  217. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/error_pattern_analyzer.py +0 -0
  218. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/file_hasher.py +0 -0
  219. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/filesystem.py +0 -0
  220. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/git.py +0 -0
  221. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/health_metrics.py +0 -0
  222. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/heatmap_generator.py +0 -0
  223. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/initialization.py +0 -0
  224. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/input_validator.py +0 -0
  225. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/intelligent_commit.py +0 -0
  226. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/log_manager.py +0 -0
  227. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/logging.py +0 -0
  228. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/lsp_client.py +0 -0
  229. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/memory_optimizer.py +0 -0
  230. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/metrics.py +0 -0
  231. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/parallel_executor.py +0 -0
  232. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/pattern_cache.py +0 -0
  233. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/pattern_detector.py +0 -0
  234. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/performance_benchmarks.py +0 -0
  235. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/performance_cache.py +0 -0
  236. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/performance_monitor.py +0 -0
  237. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/predictive_analytics.py +0 -0
  238. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/quality_baseline.py +0 -0
  239. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/quality_baseline_enhanced.py +0 -0
  240. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/quality_intelligence.py +0 -0
  241. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/regex_patterns.py +0 -0
  242. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/regex_utils.py +0 -0
  243. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/secure_path_utils.py +0 -0
  244. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/secure_status_formatter.py +0 -0
  245. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/security.py +0 -0
  246. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/security_logger.py +0 -0
  247. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/server_manager.py +0 -0
  248. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/smart_scheduling.py +0 -0
  249. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/status_authentication.py +0 -0
  250. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/status_security_manager.py +0 -0
  251. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/terminal_utils.py +0 -0
  252. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/thread_safe_status_collector.py +0 -0
  253. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/tool_version_service.py +0 -0
  254. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/unified_config.py +0 -0
  255. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/validation_rate_limiter.py +0 -0
  256. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/version_analyzer.py +0 -0
  257. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/version_checker.py +0 -0
  258. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/websocket_resource_limiter.py +0 -0
  259. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/services/zuban_lsp_service.py +0 -0
  260. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/__init__.py +0 -0
  261. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/init.md +0 -0
  262. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/run.md +0 -0
  263. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/slash_commands/status.md +0 -0
  264. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/__init__.py +0 -0
  265. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/fix_terminal.sh +0 -0
  266. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/tools/validate_input_validator_patterns.py +0 -0
  267. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/ui/__init__.py +0 -0
  268. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/ui/server_panels.py +0 -0
  269. {crackerjack-0.37.8 → crackerjack-0.37.9}/crackerjack/uv.lock +0 -0
  270. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/architecture/API_REFERENCE.md +0 -0
  271. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/architecture/ARCHITECTURE.md +0 -0
  272. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/archive/CONFIG_MANAGEMENT_REPLACEMENT_PLAN.md +0 -0
  273. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/archive/CONFIG_MERGE_REMOVAL_PLAN.md +0 -0
  274. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/archive/DOCUMENTATION_REORGANIZATION_PLAN.md +0 -0
  275. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/development/IDE-SETUP.md +0 -0
  276. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/development/RUST_TOOLING_FRAMEWORK.md +0 -0
  277. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/COMPLEXITY_REFACTORING_PLAN.md +0 -0
  278. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/COVERAGE_BADGE_IMPLEMENTATION_PLAN.md +0 -0
  279. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/CURRENT_IMPLEMENTATION_STATUS.md +0 -0
  280. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/DOCUMENTATION_SYSTEM_ARCHITECTURE.md +0 -0
  281. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/EXPERIMENTAL-EVALUATION.md +0 -0
  282. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/FEATURE_IMPLEMENTATION_PLAN.md +0 -0
  283. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/RESILIENT_HOOK_ARCHITECTURE_IMPLEMENTATION_SUMMARY.md +0 -0
  284. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/RESILIENT_HOOK_ARCHITECTURE_PLAN.md +0 -0
  285. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/STAGE_HEADERS_IMPLEMENTATION_PLAN.md +0 -0
  286. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/TIMEOUT_ARCHITECTURE_SOLUTION.md +0 -0
  287. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/TYPE_ANNOTATION_FIXING_PLAN.md +0 -0
  288. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/UVXUSAGE.md +0 -0
  289. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/ZUBAN_LSP_INTEGRATION_PLAN.md +0 -0
  290. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/planning/ZUBAN_TOML_PARSING_BUG_ANALYSIS.md +0 -0
  291. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/INPUT_VALIDATOR_SECURITY_AUDIT.md +0 -0
  292. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY-AUDIT.md +0 -0
  293. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_AUDIT_REPORT.md +0 -0
  294. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_AUDIT_STATUS_DISCLOSURE.md +0 -0
  295. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_HARDENING_REPORT.md +0 -0
  296. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/security/SECURITY_SUBPROCESS_HARDENING_REPORT.md +0 -0
  297. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/BACKUP_SYSTEM.md +0 -0
  298. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/CACHING_SYSTEM.md +0 -0
  299. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/DASHBOARD_ARCHITECTURE.md +0 -0
  300. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/MCP_INTEGRATION.md +0 -0
  301. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/MONITORING_INTEGRATION.md +0 -0
  302. {crackerjack-0.37.8 → crackerjack-0.37.9}/docs/systems/UNIFIED_MONITORING_ARCHITECTURE.md +0 -0
  303. {crackerjack-0.37.8 → crackerjack-0.37.9}/example.mcp.json +0 -0
  304. {crackerjack-0.37.8 → crackerjack-0.37.9}/excalidraw.log +0 -0
  305. {crackerjack-0.37.8 → crackerjack-0.37.9}/fix_typing_imports.py +0 -0
  306. {crackerjack-0.37.8 → crackerjack-0.37.9}/mypy.ini +0 -0
  307. {crackerjack-0.37.8 → crackerjack-0.37.9}/scripts/__init__.py +0 -0
  308. {crackerjack-0.37.8 → crackerjack-0.37.9}/scripts/integrate_resource_management.py +0 -0
  309. {crackerjack-0.37.8 → crackerjack-0.37.9}/scripts/performance_benchmark.py +0 -0
  310. {crackerjack-0.37.8 → crackerjack-0.37.9}/templates/api_reference.md.template +0 -0
  311. {crackerjack-0.37.8 → crackerjack-0.37.9}/templates/changelog_entry.md.template +0 -0
  312. {crackerjack-0.37.8 → crackerjack-0.37.9}/templates/user_guide.md.template +0 -0
  313. {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/api-reference.md +0 -0
  314. {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/getting-started.md +0 -0
  315. {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/index.md +0 -0
  316. {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/docs/stylesheets/extra.css +0 -0
  317. {crackerjack-0.37.8 → crackerjack-0.37.9}/test_docs_site/site/mkdocs.yml +0 -0
  318. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/__init__.py +0 -0
  319. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/base_test.py +0 -0
  320. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/conftest.py +0 -0
  321. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/coverage.json +0 -0
  322. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/__init__.py +0 -0
  323. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/comments_sample.txt +0 -0
  324. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/docstrings_sample.txt +0 -0
  325. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/expected_comments_sample.txt +0 -0
  326. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/data/init.py +0 -0
  327. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/docs/HEALTH_METRICS_TESTING_SUMMARY.md +0 -0
  328. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/docs/TEST_COVERAGE_PLAN.md +0 -0
  329. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/docs/TEST_IMPLEMENTATION_PLAN.md +0 -0
  330. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/run_tests.py +0 -0
  331. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/scripts/__init__.py +0 -0
  332. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/scripts/agent_audit_report.py +0 -0
  333. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/scripts/run_test_suite.py +0 -0
  334. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test___main__.py +0 -0
  335. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_ai_agent_workflow.py +0 -0
  336. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_ai_optimized_documentation.py +0 -0
  337. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_async_hook_executor.py +0 -0
  338. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_changelog_generation.py +0 -0
  339. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_cli/__init__.py +0 -0
  340. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_cli/test_global_lock_options.py +0 -0
  341. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_cli_semantic_naming.py +0 -0
  342. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_coordinator_performance.py +0 -0
  343. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_autofix_coordinator.py +0 -0
  344. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_comprehensive.py +0 -0
  345. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_coverage.py +0 -0
  346. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_enhanced_container.py +0 -0
  347. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_modules.py +0 -0
  348. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_core_performance.py +0 -0
  349. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_documentation_agent_simple.py +0 -0
  350. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_dynamic_config.py +0 -0
  351. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_dynamic_config_coverage.py +0 -0
  352. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_end_to_end_integration.py +0 -0
  353. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_enhanced_filesystem.py +0 -0
  354. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_enhanced_filesystem_comprehensive.py +0 -0
  355. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_enhanced_filesystem_coverage.py +0 -0
  356. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_execution_speed_optimization.py +0 -0
  357. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_executors/__init__.py +0 -0
  358. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_executors/test_lock_integration.py +0 -0
  359. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_fast_hooks_behavior.py +0 -0
  360. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_filesystem_coverage.py +0 -0
  361. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_final_validation.py +0 -0
  362. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_global_lock_config.py +0 -0
  363. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_hook_lock_manager.py +0 -0
  364. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_hook_manager_simple.py +0 -0
  365. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_import_coverage_consolidated.py +0 -0
  366. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_input_validation.py +0 -0
  367. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_intelligence_system.py +0 -0
  368. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_large_modules_coverage.py +0 -0
  369. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_main_entry_coverage.py +0 -0
  370. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_main_module.py +0 -0
  371. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_managers_consolidated.py +0 -0
  372. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_mcp_progress_monitor.py +0 -0
  373. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_mcp_server.py +0 -0
  374. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_comprehensive.py +0 -0
  375. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_config_adapter_coverage.py +0 -0
  376. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_focused.py +0 -0
  377. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_models_task_coverage.py +0 -0
  378. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_modernized_code.py +0 -0
  379. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_performance_agent_enhanced.py +0 -0
  380. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_performance_agent_simple.py +0 -0
  381. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_performance_benchmarks_focused.py.bak +0 -0
  382. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_phase_coordinator_simple.py +0 -0
  383. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_plugins_coverage.py +0 -0
  384. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_proactive_agent_system.py +0 -0
  385. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_protocol_compliance.py +0 -0
  386. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_publish_manager_coverage.py +0 -0
  387. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_pytest_features.py +0 -0
  388. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_regex_patterns.py +0 -0
  389. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_resource_cleanup_integration.py +0 -0
  390. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_secure_path_utils.py +0 -0
  391. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_secure_status_formatter.py +0 -0
  392. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_security_audit.py +0 -0
  393. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_security_hardening.py +0 -0
  394. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_security_integration.py +0 -0
  395. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_services_coverage.py +0 -0
  396. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_session_coordinator.py +0 -0
  397. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_session_coordinator_coverage.py +0 -0
  398. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_simple_tool_version_service.py +0 -0
  399. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_simple_workflow.py +0 -0
  400. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_stage_workflow_execution_order.py +0 -0
  401. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_structured_errors.py +0 -0
  402. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_structured_logging.py +0 -0
  403. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_syntax_validation.py +0 -0
  404. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_terminal_restoration.py +0 -0
  405. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_terminal_state.py +0 -0
  406. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_timeout_system.py +0 -0
  407. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_unified_api.py +0 -0
  408. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_unified_config.py +0 -0
  409. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_unified_monitoring_dashboard.py +0 -0
  410. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_validate_regex_patterns_tool.py +0 -0
  411. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_version_analyzer.py +0 -0
  412. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_version_bump_analyzer.py +0 -0
  413. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_websocket_endpoints.py +0 -0
  414. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_workflow_fast_hooks.py +0 -0
  415. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_workflow_integration.py +0 -0
  416. {crackerjack-0.37.8 → crackerjack-0.37.9}/tests/test_workflow_orchestrator.py +0 -0
  417. {crackerjack-0.37.8 → crackerjack-0.37.9}/tools/validate_regex_patterns_standalone.py +0 -0
@@ -0,0 +1,2 @@
1
+ # Project-specific codespell ignore words
2
+ # Add words here that should be ignored by codespell
@@ -0,0 +1,5 @@
1
+ [codespell]
2
+ skip = */data/*,htmlcov/*
3
+ quiet-level = 3
4
+ ignore-words-list = crate,uptodate,nd,nin
5
+ ignore-words = .codespell-ignore
@@ -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.8
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(console, pkg_path)
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
- if not quality_success:
422
- success = False
419
+ success = success and quality_success
423
420
 
424
- if self._is_publishing_workflow(options):
425
- return False
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 = await self._quality_intelligence.detect_anomalies()
508
- patterns = await self._quality_intelligence.identify_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 ["CRITICAL", "HIGH"]
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
- default_index = arg_index - defaults_start
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
- # Generate basic examples
420
- basic_example = f"python -m crackerjack --{command.name}"
421
-
422
- # Add parameter examples
423
- param_examples = []
424
- for param in command.parameters:
425
- if not param.required and param.default_value is not None:
426
- if isinstance(param.default_value, bool):
427
- param_examples.append(f"--{param.name}")
428
- else:
429
- param_examples.append(f"--{param.name} {param.default_value}")
430
-
431
- if param_examples:
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"Basic {command.name} usage",
443
- "command": basic_example,
466
+ "description": f"Using {command.name} with parameters",
467
+ "command": enhanced_example,
444
468
  }
445
469
  )
446
470
 
447
- return commands
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
- category_lines.extend(
646
- [
647
- f"## {category.title()}",
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
- for command_name in command_names:
653
- command = reference.commands[command_name]
654
- category_lines.extend(self._render_command_markdown(command))
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
- lines.extend(self._render_command_parameters_markdown(command.parameters))
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
- lines.extend(self._render_command_examples_markdown(command.examples))
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
- lines.extend(
714
- self._render_command_related_markdown(command.related_commands)
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
- required_str = " (required)" if param.required else ""
737
- default_str = (
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
- html = self._render_html_header(
798
- reference.generated_at.strftime("%Y-%m-%d %H:%M:%S")
799
- )
800
- html += self._render_html_commands(reference)
801
- html += "</body></html>"
802
- return html
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
- html = ""
843
+ html_parts = []
826
844
  for category, command_names in reference.categories.items():
827
- html += f"<h2>{category.title()}</h2>"
828
- html += self._render_html_category_commands(
829
- reference.commands, command_names
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
- html = ""
861
+ html_parts = []
838
862
  for command_name in command_names:
839
863
  command = commands[command_name]
840
- html += '<div class="command">'
841
- html += f"<h3><code>{command.name}</code></h3>"
842
- html += f"<p>{command.description}</p>"
843
- html += self._render_html_command_parameters(command.parameters)
844
- html += "</div>"
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(os.getcwd())
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
- try:
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
- try:
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
- project_path = Path.cwd()
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.print(
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
- cleaning=CleaningConfig(
41
- clean=getattr(args, "clean", False),
42
- ),
43
- testing=TestConfig(
44
- test=getattr(args, "test", False),
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 not in ["interactive"]:
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