crackerjack 0.38.0__tar.gz → 0.38.2__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 (401) hide show
  1. {crackerjack-0.38.0 → crackerjack-0.38.2}/CHANGELOG.md +16 -0
  2. {crackerjack-0.38.0 → crackerjack-0.38.2}/PKG-INFO +3 -2
  3. {crackerjack-0.38.0 → crackerjack-0.38.2}/README.md +2 -1
  4. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/__main__.py +79 -2
  5. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/options.py +2 -2
  6. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/workflow_orchestrator.py +66 -5
  7. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/publish_manager.py +3 -3
  8. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/test_manager.py +118 -9
  9. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/file_monitor.py +12 -2
  10. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/rate_limiter.py +9 -5
  11. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/service_watchdog.py +7 -4
  12. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/intelligence_tools.py +1 -1
  13. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/proactive_tools.py +1 -1
  14. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/orchestration/execution_strategies.py +3 -3
  15. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/plugins/hooks.py +1 -0
  16. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/plugins/loader.py +1 -1
  17. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/dependency_analyzer.py +4 -4
  18. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/error_pattern_analyzer.py +4 -4
  19. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/parallel_executor.py +2 -2
  20. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/performance_benchmarks.py +3 -1
  21. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/performance_cache.py +4 -4
  22. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/quality_intelligence.py +1 -1
  23. {crackerjack-0.38.0 → crackerjack-0.38.2}/pyproject.toml +1 -1
  24. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_large_modules_coverage.py +1 -1
  25. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_modernized_code.py +4 -1
  26. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_unified_api.py +1 -1
  27. {crackerjack-0.38.0 → crackerjack-0.38.2}/uv.lock +110 -85
  28. {crackerjack-0.38.0 → crackerjack-0.38.2}/.codespell-ignore +0 -0
  29. {crackerjack-0.38.0 → crackerjack-0.38.2}/.codespellrc +0 -0
  30. {crackerjack-0.38.0 → crackerjack-0.38.2}/.github/FUNDING.yml +0 -0
  31. {crackerjack-0.38.0 → crackerjack-0.38.2}/.gitignore +0 -0
  32. {crackerjack-0.38.0 → crackerjack-0.38.2}/.pre-commit-config.yaml +0 -0
  33. {crackerjack-0.38.0 → crackerjack-0.38.2}/AGENTS.md +0 -0
  34. {crackerjack-0.38.0 → crackerjack-0.38.2}/CLAUDE.md +0 -0
  35. {crackerjack-0.38.0 → crackerjack-0.38.2}/LICENSE +0 -0
  36. {crackerjack-0.38.0 → crackerjack-0.38.2}/QWEN.md +0 -0
  37. {crackerjack-0.38.0 → crackerjack-0.38.2}/RULES.md +0 -0
  38. {crackerjack-0.38.0 → crackerjack-0.38.2}/SECURITY.md +0 -0
  39. {crackerjack-0.38.0 → crackerjack-0.38.2}/ai/AGENT-CAPABILITIES.json +0 -0
  40. {crackerjack-0.38.0 → crackerjack-0.38.2}/ai/AGENT_SELECTION.md +0 -0
  41. {crackerjack-0.38.0 → crackerjack-0.38.2}/ai/AI-REFERENCE.md +0 -0
  42. {crackerjack-0.38.0 → crackerjack-0.38.2}/ai/ERROR-PATTERNS.yaml +0 -0
  43. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/__init__.py +0 -0
  44. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/adapters/__init__.py +0 -0
  45. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/adapters/lsp_client.py +0 -0
  46. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/adapters/rust_tool_adapter.py +0 -0
  47. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/adapters/rust_tool_manager.py +0 -0
  48. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/adapters/skylos_adapter.py +0 -0
  49. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/adapters/zuban_adapter.py +0 -0
  50. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/__init__.py +0 -0
  51. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/architect_agent.py +0 -0
  52. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/base.py +0 -0
  53. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/coordinator.py +0 -0
  54. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/documentation_agent.py +0 -0
  55. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/dry_agent.py +0 -0
  56. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/formatting_agent.py +0 -0
  57. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/import_optimization_agent.py +0 -0
  58. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/performance_agent.py +0 -0
  59. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/performance_helpers.py +0 -0
  60. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/proactive_agent.py +0 -0
  61. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/refactoring_agent.py +0 -0
  62. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/refactoring_helpers.py +0 -0
  63. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/security_agent.py +0 -0
  64. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/test_creation_agent.py +0 -0
  65. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/test_specialist_agent.py +0 -0
  66. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/agents/tracker.py +0 -0
  67. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/api.py +0 -0
  68. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/__init__.py +0 -0
  69. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/cache_handlers.py +0 -0
  70. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/cache_handlers_enhanced.py +0 -0
  71. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/facade.py +0 -0
  72. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/handlers.py +0 -0
  73. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/interactive.py +0 -0
  74. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/cli/utils.py +0 -0
  75. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/code_cleaner.py +0 -0
  76. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/config/__init__.py +0 -0
  77. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/config/global_lock_config.py +0 -0
  78. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/config/hooks.py +0 -0
  79. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/__init__.py +0 -0
  80. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/async_workflow_orchestrator.py +0 -0
  81. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/autofix_coordinator.py +0 -0
  82. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/container.py +0 -0
  83. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/enhanced_container.py +0 -0
  84. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/file_lifecycle.py +0 -0
  85. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/performance.py +0 -0
  86. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/performance_monitor.py +0 -0
  87. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/phase_coordinator.py +0 -0
  88. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/proactive_workflow.py +0 -0
  89. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/resource_manager.py +0 -0
  90. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/service_watchdog.py +0 -0
  91. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/session_coordinator.py +0 -0
  92. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/timeout_manager.py +0 -0
  93. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/core/websocket_lifecycle.py +0 -0
  94. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/docs/INDEX.md +0 -0
  95. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/docs/generated/api/API_REFERENCE.md +0 -0
  96. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/docs/generated/api/CLI_REFERENCE.md +0 -0
  97. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/docs/generated/api/CROSS_REFERENCES.md +0 -0
  98. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/docs/generated/api/PROTOCOLS.md +0 -0
  99. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/docs/generated/api/SERVICES.md +0 -0
  100. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/documentation/__init__.py +0 -0
  101. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/documentation/ai_templates.py +0 -0
  102. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/documentation/dual_output_generator.py +0 -0
  103. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/documentation/mkdocs_integration.py +0 -0
  104. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/documentation/reference_generator.py +0 -0
  105. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/dynamic_config.py +0 -0
  106. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/errors.py +0 -0
  107. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/__init__.py +0 -0
  108. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/async_hook_executor.py +0 -0
  109. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/cached_hook_executor.py +0 -0
  110. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/hook_executor.py +0 -0
  111. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/hook_lock_manager.py +0 -0
  112. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/individual_hook_executor.py +0 -0
  113. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/lsp_aware_hook_executor.py +0 -0
  114. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/executors/tool_proxy.py +0 -0
  115. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/hooks/lsp_hook.py +0 -0
  116. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/intelligence/__init__.py +0 -0
  117. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/intelligence/adaptive_learning.py +0 -0
  118. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/intelligence/agent_orchestrator.py +0 -0
  119. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/intelligence/agent_registry.py +0 -0
  120. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/intelligence/agent_selector.py +0 -0
  121. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/intelligence/integration.py +0 -0
  122. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/interactive.py +0 -0
  123. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/__init__.py +0 -0
  124. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/async_hook_manager.py +0 -0
  125. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/hook_manager.py +0 -0
  126. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/test_command_builder.py +0 -0
  127. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/test_executor.py +0 -0
  128. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/test_manager_backup.py +0 -0
  129. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/managers/test_progress.py +0 -0
  130. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/__init__.py +0 -0
  131. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/cache.py +0 -0
  132. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/client_runner.py +0 -0
  133. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/context.py +0 -0
  134. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/dashboard.py +0 -0
  135. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/enhanced_progress_monitor.py +0 -0
  136. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/enhanced_progress_monitor.tcss +0 -0
  137. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/progress_components.py +0 -0
  138. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/progress_monitor.py +0 -0
  139. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/progress_monitor.tcss +0 -0
  140. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/server.py +0 -0
  141. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/server_core.py +0 -0
  142. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/state.py +0 -0
  143. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/task_manager.py +0 -0
  144. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/__init__.py +0 -0
  145. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/core_tools.py +0 -0
  146. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/error_analyzer.py +0 -0
  147. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/execution_tools.py +0 -0
  148. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/execution_tools_backup.py +0 -0
  149. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/intelligence_tool_registry.py +0 -0
  150. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/monitoring_tools.py +0 -0
  151. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/monitoring_tools.py.backup +0 -0
  152. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/progress_tools.py +0 -0
  153. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/utility_tools.py +0 -0
  154. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/tools/workflow_executor.py +0 -0
  155. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/__init__.py +0 -0
  156. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/app.py +0 -0
  157. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/endpoints.py +0 -0
  158. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/jobs.py +0 -0
  159. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/monitoring_endpoints.py +0 -0
  160. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/server.py +0 -0
  161. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket/websocket_handler.py +0 -0
  162. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mcp/websocket_server.py +0 -0
  163. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mixins/__init__.py +0 -0
  164. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/mixins/error_handling.py +0 -0
  165. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/models/__init__.py +0 -0
  166. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/models/config.py +0 -0
  167. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/models/config_adapter.py +0 -0
  168. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/models/protocols.py +0 -0
  169. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/models/resource_protocols.py +0 -0
  170. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/models/task.py +0 -0
  171. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/monitoring/__init__.py +0 -0
  172. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/monitoring/ai_agent_watchdog.py +0 -0
  173. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/monitoring/metrics_collector.py +0 -0
  174. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/monitoring/regression_prevention.py +0 -0
  175. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/monitoring/websocket_server.py +0 -0
  176. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/orchestration/__init__.py +0 -0
  177. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/orchestration/advanced_orchestrator.py +0 -0
  178. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/orchestration/coverage_improvement.py +0 -0
  179. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/orchestration/test_progress_streamer.py +0 -0
  180. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/plugins/__init__.py +0 -0
  181. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/plugins/base.py +0 -0
  182. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/plugins/managers.py +0 -0
  183. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/pyproject.toml +0 -0
  184. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/security/__init__.py +0 -0
  185. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/security/audit.py +0 -0
  186. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/__init__.py +0 -0
  187. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/anomaly_detector.py +0 -0
  188. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/api_extractor.py +0 -0
  189. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/backup_service.py +0 -0
  190. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/bounded_status_operations.py +0 -0
  191. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/cache.py +0 -0
  192. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/changelog_automation.py +0 -0
  193. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/config.py +0 -0
  194. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/config_integrity.py +0 -0
  195. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/config_merge.py +0 -0
  196. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/config_template.py +0 -0
  197. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/contextual_ai_assistant.py +0 -0
  198. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/coverage_badge_service.py +0 -0
  199. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/coverage_ratchet.py +0 -0
  200. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/debug.py +0 -0
  201. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/dependency_monitor.py +0 -0
  202. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/documentation_generator.py +0 -0
  203. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/documentation_service.py +0 -0
  204. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/enhanced_filesystem.py +0 -0
  205. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/enterprise_optimizer.py +0 -0
  206. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/file_hasher.py +0 -0
  207. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/filesystem.py +0 -0
  208. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/git.py +0 -0
  209. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/health_metrics.py +0 -0
  210. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/heatmap_generator.py +0 -0
  211. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/initialization.py +0 -0
  212. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/input_validator.py +0 -0
  213. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/intelligent_commit.py +0 -0
  214. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/log_manager.py +0 -0
  215. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/logging.py +0 -0
  216. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/lsp_client.py +0 -0
  217. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/memory_optimizer.py +0 -0
  218. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/metrics.py +0 -0
  219. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/pattern_cache.py +0 -0
  220. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/pattern_detector.py +0 -0
  221. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/performance_monitor.py +0 -0
  222. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/predictive_analytics.py +0 -0
  223. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/quality_baseline.py +0 -0
  224. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/quality_baseline_enhanced.py +0 -0
  225. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/regex_patterns.py +0 -0
  226. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/regex_utils.py +0 -0
  227. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/secure_path_utils.py +0 -0
  228. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/secure_status_formatter.py +0 -0
  229. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/secure_subprocess.py +0 -0
  230. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/security.py +0 -0
  231. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/security_logger.py +0 -0
  232. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/server_manager.py +0 -0
  233. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/smart_scheduling.py +0 -0
  234. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/status_authentication.py +0 -0
  235. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/status_security_manager.py +0 -0
  236. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/terminal_utils.py +0 -0
  237. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/thread_safe_status_collector.py +0 -0
  238. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/tool_version_service.py +0 -0
  239. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/unified_config.py +0 -0
  240. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/validation_rate_limiter.py +0 -0
  241. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/version_analyzer.py +0 -0
  242. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/version_checker.py +0 -0
  243. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/websocket_resource_limiter.py +0 -0
  244. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/services/zuban_lsp_service.py +0 -0
  245. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/slash_commands/__init__.py +0 -0
  246. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/slash_commands/init.md +0 -0
  247. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/slash_commands/run.md +0 -0
  248. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/slash_commands/status.md +0 -0
  249. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/tools/__init__.py +0 -0
  250. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/tools/fix_terminal.sh +0 -0
  251. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/tools/validate_input_validator_patterns.py +0 -0
  252. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/tools/validate_regex_patterns.py +0 -0
  253. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/ui/__init__.py +0 -0
  254. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/ui/server_panels.py +0 -0
  255. {crackerjack-0.38.0 → crackerjack-0.38.2}/crackerjack/uv.lock +0 -0
  256. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/architecture/API_REFERENCE.md +0 -0
  257. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/architecture/ARCHITECTURE.md +0 -0
  258. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/archive/CONFIG_MANAGEMENT_REPLACEMENT_PLAN.md +0 -0
  259. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/archive/CONFIG_MERGE_REMOVAL_PLAN.md +0 -0
  260. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/archive/DOCUMENTATION_REORGANIZATION_PLAN.md +0 -0
  261. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/development/IDE-SETUP.md +0 -0
  262. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/development/RUST_TOOLING_FRAMEWORK.md +0 -0
  263. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/COMPLEXITY_REFACTORING_PLAN.md +0 -0
  264. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/COVERAGE_BADGE_IMPLEMENTATION_PLAN.md +0 -0
  265. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/CURRENT_IMPLEMENTATION_STATUS.md +0 -0
  266. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/DOCUMENTATION_SYSTEM_ARCHITECTURE.md +0 -0
  267. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/EXPERIMENTAL-EVALUATION.md +0 -0
  268. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/FEATURE_IMPLEMENTATION_PLAN.md +0 -0
  269. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/RESILIENT_HOOK_ARCHITECTURE_IMPLEMENTATION_SUMMARY.md +0 -0
  270. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/RESILIENT_HOOK_ARCHITECTURE_PLAN.md +0 -0
  271. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/STAGE_HEADERS_IMPLEMENTATION_PLAN.md +0 -0
  272. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/TIMEOUT_ARCHITECTURE_SOLUTION.md +0 -0
  273. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/TYPE_ANNOTATION_FIXING_PLAN.md +0 -0
  274. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/UVXUSAGE.md +0 -0
  275. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/ZUBAN_LSP_INTEGRATION_PLAN.md +0 -0
  276. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/planning/ZUBAN_TOML_PARSING_BUG_ANALYSIS.md +0 -0
  277. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/security/INPUT_VALIDATOR_SECURITY_AUDIT.md +0 -0
  278. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/security/SECURITY-AUDIT.md +0 -0
  279. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/security/SECURITY_AUDIT_REPORT.md +0 -0
  280. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/security/SECURITY_AUDIT_STATUS_DISCLOSURE.md +0 -0
  281. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/security/SECURITY_HARDENING_REPORT.md +0 -0
  282. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/security/SECURITY_SUBPROCESS_HARDENING_REPORT.md +0 -0
  283. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/systems/BACKUP_SYSTEM.md +0 -0
  284. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/systems/CACHING_SYSTEM.md +0 -0
  285. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/systems/DASHBOARD_ARCHITECTURE.md +0 -0
  286. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/systems/MCP_INTEGRATION.md +0 -0
  287. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/systems/MONITORING_INTEGRATION.md +0 -0
  288. {crackerjack-0.38.0 → crackerjack-0.38.2}/docs/systems/UNIFIED_MONITORING_ARCHITECTURE.md +0 -0
  289. {crackerjack-0.38.0 → crackerjack-0.38.2}/example.mcp.json +0 -0
  290. {crackerjack-0.38.0 → crackerjack-0.38.2}/excalidraw.log +0 -0
  291. {crackerjack-0.38.0 → crackerjack-0.38.2}/mypy.ini +0 -0
  292. {crackerjack-0.38.0 → crackerjack-0.38.2}/scripts/__init__.py +0 -0
  293. {crackerjack-0.38.0 → crackerjack-0.38.2}/scripts/integrate_resource_management.py +0 -0
  294. {crackerjack-0.38.0 → crackerjack-0.38.2}/scripts/performance_benchmark.py +0 -0
  295. {crackerjack-0.38.0 → crackerjack-0.38.2}/templates/api_reference.md.template +0 -0
  296. {crackerjack-0.38.0 → crackerjack-0.38.2}/templates/changelog_entry.md.template +0 -0
  297. {crackerjack-0.38.0 → crackerjack-0.38.2}/templates/user_guide.md.template +0 -0
  298. {crackerjack-0.38.0 → crackerjack-0.38.2}/test_docs_site/site/docs/api-reference.md +0 -0
  299. {crackerjack-0.38.0 → crackerjack-0.38.2}/test_docs_site/site/docs/getting-started.md +0 -0
  300. {crackerjack-0.38.0 → crackerjack-0.38.2}/test_docs_site/site/docs/index.md +0 -0
  301. {crackerjack-0.38.0 → crackerjack-0.38.2}/test_docs_site/site/docs/stylesheets/extra.css +0 -0
  302. {crackerjack-0.38.0 → crackerjack-0.38.2}/test_docs_site/site/mkdocs.yml +0 -0
  303. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/__init__.py +0 -0
  304. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/base_test.py +0 -0
  305. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/conftest.py +0 -0
  306. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/coverage.json +0 -0
  307. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/data/__init__.py +0 -0
  308. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/data/comments_sample.txt +0 -0
  309. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/data/docstrings_sample.txt +0 -0
  310. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/data/expected_comments_sample.txt +0 -0
  311. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/data/init.py +0 -0
  312. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/docs/HEALTH_METRICS_TESTING_SUMMARY.md +0 -0
  313. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/docs/TEST_COVERAGE_PLAN.md +0 -0
  314. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/docs/TEST_IMPLEMENTATION_PLAN.md +0 -0
  315. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/run_tests.py +0 -0
  316. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/scripts/__init__.py +0 -0
  317. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/scripts/agent_audit_report.py +0 -0
  318. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/scripts/run_test_suite.py +0 -0
  319. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test___main__.py +0 -0
  320. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_ai_agent_workflow.py +0 -0
  321. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_ai_optimized_documentation.py +0 -0
  322. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_api.py +0 -0
  323. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_async_hook_executor.py +0 -0
  324. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_changelog_generation.py +0 -0
  325. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_cli/__init__.py +0 -0
  326. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_cli/test_global_lock_options.py +0 -0
  327. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_cli_semantic_naming.py +0 -0
  328. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_coordinator_performance.py +0 -0
  329. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_core_autofix_coordinator.py +0 -0
  330. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_core_comprehensive.py +0 -0
  331. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_core_coverage.py +0 -0
  332. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_core_enhanced_container.py +0 -0
  333. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_core_modules.py +0 -0
  334. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_core_performance.py +0 -0
  335. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_documentation_agent_simple.py +0 -0
  336. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_dynamic_config.py +0 -0
  337. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_dynamic_config_coverage.py +0 -0
  338. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_end_to_end_integration.py +0 -0
  339. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_enhanced_filesystem.py +0 -0
  340. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_enhanced_filesystem_comprehensive.py +0 -0
  341. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_enhanced_filesystem_coverage.py +0 -0
  342. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_execution_speed_optimization.py +0 -0
  343. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_executors/__init__.py +0 -0
  344. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_executors/test_lock_integration.py +0 -0
  345. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_fast_hooks_behavior.py +0 -0
  346. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_filesystem_coverage.py +0 -0
  347. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_final_validation.py +0 -0
  348. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_global_lock_config.py +0 -0
  349. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_hook_lock_manager.py +0 -0
  350. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_hook_manager_simple.py +0 -0
  351. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_import_coverage_consolidated.py +0 -0
  352. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_input_validation.py +0 -0
  353. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_intelligence_system.py +0 -0
  354. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_interactive.py +0 -0
  355. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_main_entry_coverage.py +0 -0
  356. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_main_module.py +0 -0
  357. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_managers_consolidated.py +0 -0
  358. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_mcp_progress_monitor.py +0 -0
  359. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_mcp_server.py +0 -0
  360. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_models_comprehensive.py +0 -0
  361. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_models_config_adapter_coverage.py +0 -0
  362. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_models_focused.py +0 -0
  363. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_models_task_coverage.py +0 -0
  364. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_performance_agent_enhanced.py +0 -0
  365. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_performance_agent_simple.py +0 -0
  366. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_performance_benchmarks_focused.py.bak +0 -0
  367. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_phase_coordinator_simple.py +0 -0
  368. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_plugins_coverage.py +0 -0
  369. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_proactive_agent_system.py +0 -0
  370. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_protocol_compliance.py +0 -0
  371. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_publish_manager_coverage.py +0 -0
  372. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_pytest_features.py +0 -0
  373. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_regex_patterns.py +0 -0
  374. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_resource_cleanup_integration.py +0 -0
  375. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_secure_path_utils.py +0 -0
  376. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_secure_status_formatter.py +0 -0
  377. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_security_audit.py +0 -0
  378. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_security_hardening.py +0 -0
  379. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_security_integration.py +0 -0
  380. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_services_coverage.py +0 -0
  381. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_session_coordinator.py +0 -0
  382. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_session_coordinator_coverage.py +0 -0
  383. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_simple_tool_version_service.py +0 -0
  384. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_simple_workflow.py +0 -0
  385. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_stage_workflow_execution_order.py +0 -0
  386. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_structured_errors.py +0 -0
  387. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_structured_logging.py +0 -0
  388. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_syntax_validation.py +0 -0
  389. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_terminal_restoration.py +0 -0
  390. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_terminal_state.py +0 -0
  391. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_timeout_system.py +0 -0
  392. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_unified_config.py +0 -0
  393. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_unified_monitoring_dashboard.py +0 -0
  394. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_validate_regex_patterns_tool.py +0 -0
  395. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_version_analyzer.py +0 -0
  396. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_version_bump_analyzer.py +0 -0
  397. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_websocket_endpoints.py +0 -0
  398. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_workflow_fast_hooks.py +0 -0
  399. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_workflow_integration.py +0 -0
  400. {crackerjack-0.38.0 → crackerjack-0.38.2}/tests/test_workflow_orchestrator.py +0 -0
  401. {crackerjack-0.38.0 → crackerjack-0.38.2}/tools/validate_regex_patterns_standalone.py +0 -0
@@ -5,6 +5,22 @@ 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.38.2] - 2025-09-18
9
+
10
+ ### Documentation
11
+
12
+ - config: Update 4 files
13
+
14
+ ## [0.38.1] - 2025-09-18
15
+
16
+ ### Changed
17
+
18
+ - Crackerjack (quality: 76/100) - 2025-09-18 03:07:52
19
+
20
+ ### Fixed
21
+
22
+ - crackerjack: Update 8 files
23
+
8
24
  ## [0.38.0] - 2025-09-17
9
25
 
10
26
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crackerjack
3
- Version: 0.38.0
3
+ Version: 0.38.2
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,13 +67,14 @@ Description-Content-Type: text/markdown
67
67
 
68
68
  # Crackerjack: Advanced AI-Driven Python Development Platform
69
69
 
70
+ [![Code style: crackerjack](https://img.shields.io/badge/code%20style-crackerjack-000042)](https://github.com/lesleslie/crackerjack)
70
71
  [![Python: 3.13+](https://img.shields.io/badge/python-3.13%2B-green)](https://www.python.org/downloads/)
71
72
  [![pytest](https://img.shields.io/badge/pytest-coverage%20ratchet-blue)](https://pytest.org)
72
73
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
73
74
  [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
74
75
  [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)
75
76
  [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
76
- ![Coverage](https://img.shields.io/badge/coverage-37.1%25-red)
77
+ ![Coverage](https://img.shields.io/badge/coverage-17.7%25-red)
77
78
 
78
79
  ## 🎯 Purpose
79
80
 
@@ -1,12 +1,13 @@
1
1
  # Crackerjack: Advanced AI-Driven Python Development Platform
2
2
 
3
+ [![Code style: crackerjack](https://img.shields.io/badge/code%20style-crackerjack-000042)](https://github.com/lesleslie/crackerjack)
3
4
  [![Python: 3.13+](https://img.shields.io/badge/python-3.13%2B-green)](https://www.python.org/downloads/)
4
5
  [![pytest](https://img.shields.io/badge/pytest-coverage%20ratchet-blue)](https://pytest.org)
5
6
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
6
7
  [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
7
8
  [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)
8
9
  [![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
9
- ![Coverage](https://img.shields.io/badge/coverage-37.1%25-red)
10
+ ![Coverage](https://img.shields.io/badge/coverage-17.7%25-red)
10
11
 
11
12
  ## 🎯 Purpose
12
13
 
@@ -11,6 +11,7 @@ from crackerjack.services.git import GitService
11
11
 
12
12
  from .cli import (
13
13
  CLI_OPTIONS,
14
+ BumpOption,
14
15
  create_options,
15
16
  handle_interactive_mode,
16
17
  handle_standard_mode,
@@ -1219,9 +1220,9 @@ def main(
1219
1220
  update_precommit: bool = CLI_OPTIONS["update_precommit"],
1220
1221
  verbose: bool = CLI_OPTIONS["verbose"],
1221
1222
  debug: bool = CLI_OPTIONS["debug"],
1222
- publish: str | None = CLI_OPTIONS["publish"],
1223
+ publish: BumpOption | None = CLI_OPTIONS["publish"],
1223
1224
  all: str | None = CLI_OPTIONS["all"],
1224
- bump: str | None = CLI_OPTIONS["bump"],
1225
+ bump: BumpOption | None = CLI_OPTIONS["bump"],
1225
1226
  strip_code: bool = CLI_OPTIONS["strip_code"],
1226
1227
  run_tests: bool = CLI_OPTIONS["run_tests"],
1227
1228
  benchmark: bool = CLI_OPTIONS["benchmark"],
@@ -1466,6 +1467,10 @@ def _process_all_commands(local_vars: t.Any, console: t.Any, options: t.Any) ->
1466
1467
  ):
1467
1468
  return False
1468
1469
 
1470
+ # Handle coverage status command
1471
+ if not _handle_coverage_status(local_vars["coverage_status"], console, options):
1472
+ return False
1473
+
1469
1474
  # Handle documentation and analysis commands
1470
1475
  return _handle_analysis_commands(local_vars, console, options)
1471
1476
 
@@ -1538,6 +1543,78 @@ def _handle_specialized_analytics(local_vars: t.Any, console: t.Any) -> bool:
1538
1543
  return _handle_enterprise_features(local_vars, console)
1539
1544
 
1540
1545
 
1546
+ def _handle_coverage_status(
1547
+ coverage_status: bool, console: t.Any, options: t.Any
1548
+ ) -> bool:
1549
+ """Handle coverage status display command."""
1550
+ if not coverage_status:
1551
+ return True
1552
+
1553
+ try:
1554
+ from pathlib import Path
1555
+
1556
+ from crackerjack.managers.test_manager import TestManager
1557
+
1558
+ # Use current working directory as package path
1559
+ pkg_path = Path.cwd()
1560
+
1561
+ # Create test manager directly
1562
+ test_manager = TestManager(console, pkg_path)
1563
+
1564
+ console.print("[cyan]📊[/cyan] Coverage Status Report")
1565
+ console.print("=" * 50)
1566
+
1567
+ # Get coverage information
1568
+ coverage_info = test_manager.get_coverage()
1569
+ coverage_percent = coverage_info.get("coverage_percent", 0.0)
1570
+ coverage_source = coverage_info.get("source", "unknown")
1571
+
1572
+ if coverage_percent > 0:
1573
+ console.print(
1574
+ f"[green]Current Coverage:[/green] {coverage_percent:.2f}% (from {coverage_source})"
1575
+ )
1576
+ else:
1577
+ console.print(
1578
+ "[yellow]Current Coverage:[/yellow] No coverage data available"
1579
+ )
1580
+
1581
+ # Show status message if available
1582
+ status_message = coverage_info.get("message")
1583
+ if status_message:
1584
+ console.print(f"[dim]{status_message}[/dim]")
1585
+
1586
+ # Try to get more detailed coverage report
1587
+ coverage_report = test_manager.get_coverage_report()
1588
+ if coverage_report:
1589
+ console.print(f"[cyan]Details:[/cyan] {coverage_report}")
1590
+
1591
+ # Show coverage ratchet status if available
1592
+ try:
1593
+ ratchet_status = test_manager.get_coverage_ratchet_status()
1594
+ if ratchet_status:
1595
+ next_milestone = ratchet_status.get("next_milestone")
1596
+ if next_milestone:
1597
+ console.print(f"[cyan]Next Milestone:[/cyan] {next_milestone:.0f}%")
1598
+
1599
+ milestones = ratchet_status.get("milestones_achieved", [])
1600
+ if milestones:
1601
+ console.print(
1602
+ f"[green]Milestones Achieved:[/green] {len(milestones)}"
1603
+ )
1604
+ except Exception:
1605
+ pass # Ignore ratchet status errors
1606
+
1607
+ console.print()
1608
+ return False # Exit after showing status
1609
+
1610
+ except Exception as e:
1611
+ console.print(f"[red]❌[/red] Failed to get coverage status: {e}")
1612
+ import traceback
1613
+
1614
+ console.print(f"[dim]{traceback.format_exc()}[/dim]")
1615
+ return False
1616
+
1617
+
1541
1618
  def _handle_enterprise_features(local_vars: t.Any, console: t.Any) -> bool:
1542
1619
  """Handle enterprise features."""
1543
1620
  # Handle enterprise optimizer
@@ -934,8 +934,8 @@ def create_options(
934
934
  update_precommit: bool,
935
935
  verbose: bool,
936
936
  debug: bool,
937
- publish: str | None,
938
- bump: str | None,
937
+ publish: BumpOption | None,
938
+ bump: BumpOption | None,
939
939
  benchmark: bool,
940
940
  test_workers: int,
941
941
  test_timeout: int,
@@ -66,6 +66,7 @@ class WorkflowPipeline:
66
66
  self._cache = get_performance_cache()
67
67
 
68
68
  # Initialize quality intelligence for advanced decision making
69
+ self._quality_intelligence: QualityIntelligenceService | None
69
70
  try:
70
71
  quality_baseline = EnhancedQualityBaselineService()
71
72
  self._quality_intelligence = QualityIntelligenceService(quality_baseline)
@@ -74,6 +75,7 @@ class WorkflowPipeline:
74
75
  self._quality_intelligence = None
75
76
 
76
77
  # Initialize performance benchmarking for workflow analysis
78
+ self._performance_benchmarks: PerformanceBenchmarkService | None
77
79
  try:
78
80
  self._performance_benchmarks = PerformanceBenchmarkService(
79
81
  console, pkg_path
@@ -241,7 +243,7 @@ class WorkflowPipeline:
241
243
  self.logger.warning(f"Failed to auto-start Zuban LSP server: {e}")
242
244
 
243
245
  def _get_zuban_lsp_config(
244
- self, options: OptionsProtocol, config: any
246
+ self, options: OptionsProtocol, config: t.Any
245
247
  ) -> tuple[int, str]:
246
248
  """Get Zuban LSP configuration values."""
247
249
  if config:
@@ -384,7 +386,7 @@ class WorkflowPipeline:
384
386
 
385
387
  def _gather_performance_metrics(
386
388
  self, workflow_id: str, duration: float, success: bool
387
- ) -> dict:
389
+ ) -> dict[str, t.Any]:
388
390
  """Gather performance metrics from workflow execution."""
389
391
  return {
390
392
  "workflow_id": workflow_id,
@@ -622,7 +624,7 @@ class WorkflowPipeline:
622
624
  comprehensive_passed,
623
625
  ) = await self._run_main_quality_phases_async(options, workflow_id)
624
626
 
625
- return await self._handle_workflow_completion(
627
+ return await self._handle_ai_workflow_completion(
626
628
  options, iteration, testing_passed, comprehensive_passed, workflow_id
627
629
  )
628
630
 
@@ -650,7 +652,7 @@ class WorkflowPipeline:
650
652
  self._mark_code_cleaning_complete()
651
653
  return True
652
654
 
653
- async def _handle_workflow_completion(
655
+ async def _handle_ai_workflow_completion(
654
656
  self,
655
657
  options: OptionsProtocol,
656
658
  iteration: int,
@@ -1871,7 +1873,66 @@ class WorkflowPipeline:
1871
1873
  ) -> bool:
1872
1874
  with phase_monitor(workflow_id, "testing") as monitor:
1873
1875
  monitor.record_sequential_op()
1874
- return self._run_testing_phase(options)
1876
+ test_result = self._run_testing_phase(options)
1877
+
1878
+ # Execute coverage improvement if boost_coverage is enabled and tests passed
1879
+ if test_result and getattr(options, "boost_coverage", False):
1880
+ await self._execute_coverage_improvement(options)
1881
+
1882
+ return test_result
1883
+
1884
+ async def _execute_coverage_improvement(self, options: OptionsProtocol) -> None:
1885
+ """Execute coverage improvement when boost_coverage is enabled."""
1886
+ try:
1887
+ from crackerjack.orchestration.coverage_improvement import (
1888
+ create_coverage_improvement_orchestrator,
1889
+ )
1890
+
1891
+ coverage_orchestrator = await create_coverage_improvement_orchestrator(
1892
+ self.pkg_path, console=self.console
1893
+ )
1894
+
1895
+ should_improve = await coverage_orchestrator.should_improve_coverage()
1896
+ if not should_improve:
1897
+ self.console.print(
1898
+ "[dim]📈 Coverage at 100% - no improvement needed[/dim]"
1899
+ )
1900
+ return
1901
+
1902
+ # Create agent context for coverage improvement
1903
+ from crackerjack.agents.base import AgentContext
1904
+ from crackerjack.services.filesystem_enhanced import FileSystemService
1905
+
1906
+ filesystem_service = FileSystemService(self.pkg_path)
1907
+ agent_context = AgentContext(
1908
+ pkg_path=self.pkg_path,
1909
+ filesystem=filesystem_service,
1910
+ console=self.console,
1911
+ )
1912
+
1913
+ result = await coverage_orchestrator.execute_coverage_improvement(
1914
+ agent_context
1915
+ )
1916
+
1917
+ if result["status"] == "completed":
1918
+ self.console.print(
1919
+ f"[green]📈[/green] Coverage improvement: {len(result.get('fixes_applied', []))} "
1920
+ f"tests created in {len(result.get('files_modified', []))} files"
1921
+ )
1922
+ elif result["status"] == "skipped":
1923
+ self.console.print(
1924
+ f"[dim]📈 Coverage improvement skipped: {result.get('reason', 'Unknown')}[/dim]"
1925
+ )
1926
+ else:
1927
+ self.console.print(
1928
+ "[yellow]⚠️[/yellow] Coverage improvement completed with issues"
1929
+ )
1930
+
1931
+ except Exception as e:
1932
+ self.console.print(
1933
+ f"[yellow]⚠️[/yellow] Coverage improvement failed: {str(e)}"
1934
+ )
1935
+ self.logger.warning(f"Coverage improvement error: {e}")
1875
1936
 
1876
1937
  async def _execute_standard_hooks_workflow_monitored(
1877
1938
  self, options: OptionsProtocol, workflow_id: str
@@ -156,7 +156,7 @@ class PublishManagerImpl:
156
156
  self.console.print(f"[red]❌[/ red] Version bump failed: {e}")
157
157
  raise
158
158
 
159
- def _prompt_for_version_type(self, recommendation=None) -> str:
159
+ def _prompt_for_version_type(self, recommendation: t.Any = None) -> str:
160
160
  try:
161
161
  from rich.prompt import Prompt
162
162
 
@@ -178,7 +178,7 @@ class PublishManagerImpl:
178
178
  )
179
179
  return "patch"
180
180
 
181
- def _get_version_recommendation(self):
181
+ def _get_version_recommendation(self) -> t.Any:
182
182
  """Get AI-powered version bump recommendation based on git history."""
183
183
  try:
184
184
  import asyncio
@@ -217,7 +217,7 @@ class PublishManagerImpl:
217
217
  self.console.print(f"[yellow]⚠️[/yellow] Version analysis failed: {e}")
218
218
  return None
219
219
 
220
- def _display_version_analysis(self, recommendation):
220
+ def _display_version_analysis(self, recommendation: t.Any) -> None:
221
221
  """Display version analysis in a compact format."""
222
222
  if not recommendation:
223
223
  return
@@ -132,21 +132,72 @@ class TestManager:
132
132
  try:
133
133
  status = self.coverage_ratchet.get_status_report()
134
134
 
135
- if status.get("status") == "not_initialized":
135
+ # Check if we have actual coverage data from coverage.json even if ratchet is not initialized
136
+ coverage_json_path = self.pkg_path / "coverage.json"
137
+ direct_coverage = None
138
+
139
+ if coverage_json_path.exists():
140
+ try:
141
+ import json
142
+
143
+ with coverage_json_path.open() as f:
144
+ data = json.load(f)
145
+ # Check for totals field first (newer format)
146
+ direct_coverage = data.get("totals", {}).get("percent_covered")
147
+
148
+ # If no totals, calculate from files data (standard pytest-cov format)
149
+ if direct_coverage is None and "files" in data:
150
+ total_statements = 0
151
+ total_covered = 0
152
+
153
+ for file_data in data["files"].values():
154
+ summary = file_data.get("summary", {})
155
+ statements = summary.get("num_statements", 0)
156
+ covered = summary.get("covered_lines", 0)
157
+ total_statements += statements
158
+ total_covered += covered
159
+
160
+ if total_statements > 0:
161
+ direct_coverage = (
162
+ total_covered / total_statements
163
+ ) * 100
164
+ except (json.JSONDecodeError, KeyError):
165
+ pass # Fall back to ratchet data
166
+
167
+ # If ratchet is not initialized but we have direct coverage data, use it
168
+ if (
169
+ not status or status.get("status") == "not_initialized"
170
+ ) and direct_coverage is not None:
171
+ return {
172
+ "status": "coverage_available",
173
+ "coverage_percent": direct_coverage,
174
+ "message": "Coverage data available from coverage.json",
175
+ "source": "coverage.json",
176
+ }
177
+
178
+ # If ratchet is not initialized and no direct coverage, return not initialized
179
+ if not status or status.get("status") == "not_initialized":
136
180
  return {
137
181
  "status": "not_initialized",
138
182
  "coverage_percent": 0.0,
139
183
  "message": "Coverage ratchet not initialized",
140
184
  }
141
185
 
186
+ # Use ratchet data, but prefer direct coverage if available and different
187
+ ratchet_coverage = status.get("current_coverage", 0.0)
188
+ final_coverage = (
189
+ direct_coverage if direct_coverage is not None else ratchet_coverage
190
+ )
191
+
142
192
  return {
143
193
  "status": "active",
144
- "coverage_percent": status.get("current_coverage", 0.0),
194
+ "coverage_percent": final_coverage,
145
195
  "target_coverage": status.get("target_coverage", 100.0),
146
196
  "next_milestone": status.get("next_milestone"),
147
197
  "progress_percent": status.get("progress_percent", 0.0),
148
198
  "last_updated": status.get("last_updated"),
149
199
  "milestones_achieved": status.get("milestones_achieved", []),
200
+ "source": "coverage.json" if direct_coverage is not None else "ratchet",
150
201
  }
151
202
  except Exception as e:
152
203
  return {
@@ -235,25 +286,83 @@ class TestManager:
235
286
  current_coverage = None
236
287
  coverage_json_path = self.pkg_path / "coverage.json"
237
288
 
289
+ # Primary: Try to extract from coverage.json
238
290
  if coverage_json_path.exists():
239
- with coverage_json_path.open() as f:
240
- data = json.load(f)
241
- current_coverage = data.get("totals", {}).get("percent_covered")
291
+ try:
292
+ with coverage_json_path.open() as f:
293
+ data = json.load(f)
294
+ # Check for totals field first (newer format)
295
+ current_coverage = data.get("totals", {}).get("percent_covered")
296
+
297
+ # If no totals, calculate from files data (standard pytest-cov format)
298
+ if current_coverage is None and "files" in data:
299
+ total_statements = 0
300
+ total_covered = 0
301
+
302
+ for file_data in data["files"].values():
303
+ summary = file_data.get("summary", {})
304
+ statements = summary.get("num_statements", 0)
305
+ covered = summary.get("covered_lines", 0)
306
+ total_statements += statements
307
+ total_covered += covered
308
+
309
+ if total_statements > 0:
310
+ current_coverage = (
311
+ total_covered / total_statements
312
+ ) * 100
313
+
314
+ if current_coverage is not None:
315
+ self.console.print(
316
+ f"[dim]📊 Coverage extracted from coverage.json: {current_coverage:.2f}%[/dim]"
317
+ )
318
+ except (json.JSONDecodeError, KeyError) as e:
319
+ self.console.print(
320
+ f"[yellow]⚠️[/yellow] Failed to parse coverage.json: {e}"
321
+ )
242
322
 
243
- # Fallback to ratchet result if coverage.json not available
323
+ # Secondary: Try ratchet result if coverage.json failed
244
324
  if current_coverage is None:
245
325
  current_coverage = ratchet_result.get("current_coverage")
326
+ if current_coverage is not None:
327
+ self.console.print(
328
+ f"[dim]📊 Coverage from ratchet result: {current_coverage:.2f}%[/dim]"
329
+ )
246
330
 
247
- # Final fallback to coverage service
331
+ # Tertiary: Try coverage service, but only accept non-zero values
248
332
  if current_coverage is None:
249
333
  coverage_info = self.get_coverage()
250
- current_coverage = coverage_info.get("coverage_percent")
334
+ fallback_coverage = coverage_info.get("coverage_percent")
335
+ # Only use fallback if it's meaningful (>0) or if no coverage.json exists
336
+ if fallback_coverage and (
337
+ fallback_coverage > 0 or not coverage_json_path.exists()
338
+ ):
339
+ current_coverage = fallback_coverage
340
+ self.console.print(
341
+ f"[dim]📊 Coverage from service fallback: {current_coverage:.2f}%[/dim]"
342
+ )
343
+ else:
344
+ self.console.print(
345
+ "[yellow]⚠️[/yellow] Skipping 0.0% fallback when coverage.json exists"
346
+ )
251
347
 
252
- if current_coverage is not None:
348
+ # Only update badge if we have valid coverage data
349
+ if current_coverage is not None and current_coverage >= 0:
253
350
  if self._coverage_badge_service.should_update_badge(current_coverage):
254
351
  self._coverage_badge_service.update_readme_coverage_badge(
255
352
  current_coverage
256
353
  )
354
+ self.console.print(
355
+ f"[green]✅[/green] Badge updated to {current_coverage:.2f}%"
356
+ )
357
+ else:
358
+ self.console.print(
359
+ f"[dim]📊 Badge unchanged (current: {current_coverage:.2f}%)[/dim]"
360
+ )
361
+ else:
362
+ self.console.print(
363
+ "[yellow]⚠️[/yellow] No valid coverage data found for badge update"
364
+ )
365
+
257
366
  except Exception as e:
258
367
  # Don't fail the test process if badge update fails
259
368
  self.console.print(f"[yellow]⚠️[/yellow] Badge update failed: {e}")
@@ -5,10 +5,20 @@ import typing as t
5
5
  from collections.abc import Callable
6
6
  from pathlib import Path
7
7
 
8
+ # Type aliases for watchdog types
9
+ FileSystemEvent: t.Any
10
+ FileSystemEventHandler: t.Any
11
+ Observer: t.Any
12
+ WATCHDOG_AVAILABLE: bool
13
+
8
14
  try:
9
- from watchdog.events import FileSystemEvent, FileSystemEventHandler
10
- from watchdog.observers import Observer
15
+ from watchdog.events import FileSystemEvent as WatchdogFileSystemEvent
16
+ from watchdog.events import FileSystemEventHandler as WatchdogFileSystemEventHandler
17
+ from watchdog.observers import Observer as WatchdogObserver
11
18
 
19
+ FileSystemEvent = WatchdogFileSystemEvent
20
+ FileSystemEventHandler = WatchdogFileSystemEventHandler
21
+ Observer = WatchdogObserver
12
22
  WATCHDOG_AVAILABLE = True
13
23
  except ImportError:
14
24
  # Type stubs for when watchdog is not available
@@ -35,14 +35,18 @@ class RateLimiter:
35
35
  self.requests_per_hour = requests_per_hour
36
36
 
37
37
  self.minute_windows: dict[str, deque[float]] = defaultdict(
38
- lambda: deque(maxlen=requests_per_minute), # type: ignore[misc]
38
+ lambda: deque[float](maxlen=requests_per_minute), # type: ignore[arg-type,misc]
39
39
  )
40
40
  self.hour_windows: dict[str, deque[float]] = defaultdict(
41
- lambda: deque(maxlen=requests_per_hour), # type: ignore[misc]
41
+ lambda: deque[float](maxlen=requests_per_hour), # type: ignore[arg-type,misc]
42
42
  )
43
43
 
44
- self.global_minute_window: deque[float] = deque(maxlen=requests_per_minute * 10)
45
- self.global_hour_window: deque[float] = deque(maxlen=requests_per_hour * 10)
44
+ self.global_minute_window: deque[float] = deque[float](
45
+ maxlen=requests_per_minute * 10
46
+ )
47
+ self.global_hour_window: deque[float] = deque[float](
48
+ maxlen=requests_per_hour * 10
49
+ )
46
50
 
47
51
  self._lock = asyncio.Lock()
48
52
 
@@ -126,7 +130,7 @@ class RateLimiter:
126
130
  self._remove_expired_entries(self.global_minute_window, minute_cutoff)
127
131
  self._remove_expired_entries(self.global_hour_window, hour_cutoff)
128
132
 
129
- def _remove_expired_entries(self, window: deque, cutoff: float) -> None:
133
+ def _remove_expired_entries(self, window: deque[float], cutoff: float) -> None:
130
134
  while window and window[0] < cutoff:
131
135
  window.popleft()
132
136
 
@@ -3,6 +3,7 @@ import socket
3
3
  import subprocess
4
4
  import sys
5
5
  import time
6
+ from contextlib import suppress
6
7
  from typing import Any
7
8
 
8
9
  import aiohttp
@@ -34,7 +35,7 @@ class ServiceConfig:
34
35
  self.max_restarts = max_restarts
35
36
  self.restart_window = restart_window
36
37
 
37
- self.process: subprocess.Popen[bytes] | None = None
38
+ self.process: subprocess.Popen[str] | None = None
38
39
  self.restart_count = 0
39
40
  self.restart_timestamps: list[float] = []
40
41
  self.last_health_check = 0.0
@@ -125,7 +126,7 @@ class ServiceWatchdog:
125
126
  return False
126
127
 
127
128
  async def _launch_service_process(self, service: ServiceConfig) -> bool:
128
- service.process = subprocess.Popen(
129
+ service.process = subprocess.Popen[str](
129
130
  service.command,
130
131
  stdout=subprocess.PIPE,
131
132
  stderr=subprocess.PIPE,
@@ -137,6 +138,8 @@ class ServiceWatchdog:
137
138
  return await self._check_process_startup_success(service)
138
139
 
139
140
  async def _check_process_startup_success(self, service: ServiceConfig) -> bool:
141
+ if service.process is None:
142
+ return False
140
143
  exit_code = service.process.poll()
141
144
  if exit_code is not None:
142
145
  return await self._handle_process_died(service, exit_code)
@@ -147,6 +150,8 @@ class ServiceWatchdog:
147
150
  service: ServiceConfig,
148
151
  exit_code: int,
149
152
  ) -> bool:
153
+ if service.process is None:
154
+ return False
150
155
  stdout, stderr = service.process.communicate()
151
156
  error_msg = f"Process died (exit: {exit_code})"
152
157
  if stderr and stderr.strip():
@@ -441,8 +446,6 @@ class ServiceWatchdog:
441
446
  message: str,
442
447
  ) -> None:
443
448
  if self.event_queue:
444
- from contextlib import suppress
445
-
446
449
  with suppress(Exception):
447
450
  event = {
448
451
  "type": event_type,
@@ -147,7 +147,7 @@ async def get_smart_agent_recommendation(
147
147
  context=task_context,
148
148
  )
149
149
 
150
- response = {
150
+ response: dict[str, t.Any] = {
151
151
  "task_description": task_description,
152
152
  "context_type": context_type,
153
153
  }
@@ -119,7 +119,7 @@ def _create_validation_results(file_path: str) -> dict[str, t.Any]:
119
119
 
120
120
 
121
121
  def _create_pattern_suggestions(problem_context: str) -> dict[str, t.Any]:
122
- pattern_suggestions = {
122
+ pattern_suggestions: dict[str, t.Any] = {
123
123
  "context": problem_context,
124
124
  "recommended_patterns": [],
125
125
  "implementation_guidance": [],
@@ -262,10 +262,10 @@ class OrchestrationPlanner:
262
262
  hook_plans=hook_plans,
263
263
  test_plan=test_plan,
264
264
  ai_plan=ai_plan,
265
- estimated_total_duration=sum(
266
- int(plan["estimated_duration"]) for plan in hook_plans
265
+ estimated_total_duration=float(
266
+ sum(int(float(str(plan["estimated_duration"]))) for plan in hook_plans)
267
267
  )
268
- + test_plan["estimated_duration"],
268
+ + float(test_plan["estimated_duration"]),
269
269
  )
270
270
 
271
271
  def _estimate_strategy_duration(self, strategy: HookStrategy) -> float:
@@ -131,6 +131,7 @@ class CustomHookPlugin(HookPluginBase):
131
131
  try:
132
132
  if hook_def.command is None:
133
133
  return HookResult(
134
+ id=f"hook_{hook_def.name}",
134
135
  name=hook_def.name,
135
136
  status="failed",
136
137
  issues_found=["Hook command is None"],
@@ -132,7 +132,7 @@ class PluginLoader:
132
132
 
133
133
  def _try_factory_function(
134
134
  self,
135
- factory: t.Callable,
135
+ factory: t.Callable[..., t.Any],
136
136
  name: str,
137
137
  ) -> PluginBase | None:
138
138
  try: