crackerjack 0.31.9__tar.gz → 0.31.10__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 (284) hide show
  1. {crackerjack-0.31.9 → crackerjack-0.31.10}/CHANGELOG.md +120 -0
  2. {crackerjack-0.31.9 → crackerjack-0.31.10}/PKG-INFO +1 -1
  3. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/phase_coordinator.py +1 -1
  4. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/workflow_orchestrator.py +17 -0
  5. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/test_manager.py +41 -5
  6. {crackerjack-0.31.9 → crackerjack-0.31.10/crackerjack}/pyproject.toml +1 -0
  7. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/coverage_ratchet.py +9 -5
  8. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/git.py +12 -2
  9. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/initialization.py +9 -9
  10. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/uv.lock +68 -2
  11. crackerjack-0.31.10/example.mcp.json +16 -0
  12. {crackerjack-0.31.9/crackerjack → crackerjack-0.31.10}/pyproject.toml +2 -1
  13. {crackerjack-0.31.9 → crackerjack-0.31.10}/uv.lock +68 -2
  14. {crackerjack-0.31.9 → crackerjack-0.31.10}/.github/FUNDING.yml +0 -0
  15. {crackerjack-0.31.9 → crackerjack-0.31.10}/.gitignore +0 -0
  16. {crackerjack-0.31.9 → crackerjack-0.31.10}/.pre-commit-config.yaml +0 -0
  17. {crackerjack-0.31.9 → crackerjack-0.31.10}/AGENTS.md +0 -0
  18. {crackerjack-0.31.9 → crackerjack-0.31.10}/AI-AGENT-RULES.md +0 -0
  19. {crackerjack-0.31.9 → crackerjack-0.31.10}/CLAUDE.md +0 -0
  20. {crackerjack-0.31.9 → crackerjack-0.31.10}/LICENSE +0 -0
  21. {crackerjack-0.31.9 → crackerjack-0.31.10}/README-AI-AGENT.md +0 -0
  22. {crackerjack-0.31.9 → crackerjack-0.31.10}/README.md +0 -0
  23. {crackerjack-0.31.9 → crackerjack-0.31.10}/RULES.md +0 -0
  24. {crackerjack-0.31.9 → crackerjack-0.31.10}/UVXUSAGE.md +0 -0
  25. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/.gitignore +0 -0
  26. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/.pre-commit-config.yaml +0 -0
  27. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/CLAUDE.md +0 -0
  28. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/RULES.md +0 -0
  29. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/__init__.py +0 -0
  30. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/__main__.py +0 -0
  31. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/__init__.py +0 -0
  32. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/architect_agent.py +0 -0
  33. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/base.py +0 -0
  34. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/coordinator.py +0 -0
  35. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/documentation_agent.py +0 -0
  36. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/dry_agent.py +0 -0
  37. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/formatting_agent.py +0 -0
  38. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/import_optimization_agent.py +0 -0
  39. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/performance_agent.py +0 -0
  40. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/proactive_agent.py +0 -0
  41. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/refactoring_agent.py +0 -0
  42. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/security_agent.py +0 -0
  43. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/test_creation_agent.py +0 -0
  44. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/test_specialist_agent.py +0 -0
  45. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/agents/tracker.py +0 -0
  46. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/api.py +0 -0
  47. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/cli/__init__.py +0 -0
  48. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/cli/facade.py +0 -0
  49. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/cli/handlers.py +0 -0
  50. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/cli/interactive.py +0 -0
  51. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/cli/options.py +0 -0
  52. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/cli/utils.py +0 -0
  53. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/code_cleaner.py +0 -0
  54. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/config/__init__.py +0 -0
  55. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/config/hooks.py +0 -0
  56. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/__init__.py +0 -0
  57. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/async_workflow_orchestrator.py +0 -0
  58. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/autofix_coordinator.py +0 -0
  59. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/container.py +0 -0
  60. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/enhanced_container.py +0 -0
  61. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/performance.py +0 -0
  62. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/proactive_workflow.py +0 -0
  63. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/core/session_coordinator.py +0 -0
  64. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/dynamic_config.py +0 -0
  65. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/errors.py +0 -0
  66. {crackerjack-0.31.9 → crackerjack-0.31.10/crackerjack}/example.mcp.json +0 -0
  67. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/executors/__init__.py +0 -0
  68. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/executors/async_hook_executor.py +0 -0
  69. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/executors/cached_hook_executor.py +0 -0
  70. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/executors/hook_executor.py +0 -0
  71. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/executors/individual_hook_executor.py +0 -0
  72. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/intelligence/__init__.py +0 -0
  73. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/intelligence/adaptive_learning.py +0 -0
  74. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/intelligence/agent_orchestrator.py +0 -0
  75. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/intelligence/agent_registry.py +0 -0
  76. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/intelligence/agent_selector.py +0 -0
  77. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/intelligence/integration.py +0 -0
  78. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/interactive.py +0 -0
  79. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/__init__.py +0 -0
  80. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/async_hook_manager.py +0 -0
  81. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/hook_manager.py +0 -0
  82. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/publish_manager.py +0 -0
  83. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/test_command_builder.py +0 -0
  84. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/test_executor.py +0 -0
  85. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/test_manager_backup.py +0 -0
  86. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/managers/test_progress.py +0 -0
  87. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/__init__.py +0 -0
  88. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/cache.py +0 -0
  89. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/client_runner.py +0 -0
  90. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/context.py +0 -0
  91. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/dashboard.py +0 -0
  92. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/enhanced_progress_monitor.py +0 -0
  93. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/enhanced_progress_monitor.tcss +0 -0
  94. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/file_monitor.py +0 -0
  95. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/progress_components.py +0 -0
  96. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/progress_monitor.py +0 -0
  97. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/progress_monitor.tcss +0 -0
  98. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/rate_limiter.py +0 -0
  99. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/server.py +0 -0
  100. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/server_core.py +0 -0
  101. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/service_watchdog.py +0 -0
  102. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/state.py +0 -0
  103. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/task_manager.py +0 -0
  104. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/__init__.py +0 -0
  105. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/core_tools.py +0 -0
  106. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/error_analyzer.py +0 -0
  107. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/execution_tools.py +0 -0
  108. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/execution_tools_backup.py +0 -0
  109. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/intelligence_tool_registry.py +0 -0
  110. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/intelligence_tools.py +0 -0
  111. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/monitoring_tools.py +0 -0
  112. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/monitoring_tools.py.backup +0 -0
  113. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/proactive_tools.py +0 -0
  114. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/progress_tools.py +0 -0
  115. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/utility_tools.py +0 -0
  116. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/tools/workflow_executor.py +0 -0
  117. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket/__init__.py +0 -0
  118. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket/app.py +0 -0
  119. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket/endpoints.py +0 -0
  120. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket/jobs.py +0 -0
  121. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket/server.py +0 -0
  122. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket/websocket_handler.py +0 -0
  123. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/mcp/websocket_server.py +0 -0
  124. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/models/__init__.py +0 -0
  125. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/models/config.py +0 -0
  126. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/models/config_adapter.py +0 -0
  127. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/models/protocols.py +0 -0
  128. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/models/task.py +0 -0
  129. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/monitoring/ai_agent_watchdog.py +0 -0
  130. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/monitoring/regression_prevention.py +0 -0
  131. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/orchestration/__init__.py +0 -0
  132. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/orchestration/advanced_orchestrator.py +0 -0
  133. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/orchestration/coverage_improvement.py +0 -0
  134. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/orchestration/execution_strategies.py +0 -0
  135. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/orchestration/test_progress_streamer.py +0 -0
  136. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/plugins/__init__.py +0 -0
  137. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/plugins/base.py +0 -0
  138. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/plugins/hooks.py +0 -0
  139. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/plugins/loader.py +0 -0
  140. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/plugins/managers.py +0 -0
  141. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/py313.py +0 -0
  142. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/__init__.py +0 -0
  143. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/cache.py +0 -0
  144. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/config.py +0 -0
  145. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/config_integrity.py +0 -0
  146. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/contextual_ai_assistant.py +0 -0
  147. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/debug.py +0 -0
  148. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/dependency_monitor.py +0 -0
  149. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/enhanced_filesystem.py +0 -0
  150. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/file_hasher.py +0 -0
  151. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/filesystem.py +0 -0
  152. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/health_metrics.py +0 -0
  153. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/log_manager.py +0 -0
  154. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/logging.py +0 -0
  155. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/metrics.py +0 -0
  156. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/pattern_cache.py +0 -0
  157. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/pattern_detector.py +0 -0
  158. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/performance_benchmarks.py +0 -0
  159. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/security.py +0 -0
  160. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/server_manager.py +0 -0
  161. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/smart_scheduling.py +0 -0
  162. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/tool_version_service.py +0 -0
  163. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/unified_config.py +0 -0
  164. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/services/version_checker.py +0 -0
  165. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/slash_commands/__init__.py +0 -0
  166. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/slash_commands/init.md +0 -0
  167. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/slash_commands/run.md +0 -0
  168. {crackerjack-0.31.9 → crackerjack-0.31.10}/crackerjack/slash_commands/status.md +0 -0
  169. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/AI_AGENT_DEBUGGING.md +0 -0
  170. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/API_REFERENCE.md +0 -0
  171. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/ARCHITECTURE.md +0 -0
  172. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/FUTURE-ENHANCEMENTS.md +0 -0
  173. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/SUB_AGENT_MONITORING_DESIGN.md +0 -0
  174. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/VERIFICATION_WORKFLOW.md +0 -0
  175. {crackerjack-0.31.9 → crackerjack-0.31.10}/docs/WORKFLOW_KNOWLEDGE_BASE.md +0 -0
  176. {crackerjack-0.31.9 → crackerjack-0.31.10}/excalidraw.log +0 -0
  177. {crackerjack-0.31.9 → crackerjack-0.31.10}/fix_terminal.sh +0 -0
  178. {crackerjack-0.31.9 → crackerjack-0.31.10}/requirements.txt +0 -0
  179. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/.coverage +0 -0
  180. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/HEALTH_METRICS_TESTING_SUMMARY.md +0 -0
  181. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/TESTING.md +0 -0
  182. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/TEST_COVERAGE_PLAN.md +0 -0
  183. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/__init__.py +0 -0
  184. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/conftest.py +0 -0
  185. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/coverage.json +0 -0
  186. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/data/comments_sample.txt +0 -0
  187. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/data/docstrings_sample.txt +0 -0
  188. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/data/expected_comments_sample.txt +0 -0
  189. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/data/init.py +0 -0
  190. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/scripts/__init__.py +0 -0
  191. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/scripts/agent_audit_report.py +0 -0
  192. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/scripts/run_test_suite.py +0 -0
  193. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test___main__.py +0 -0
  194. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_advanced_orchestrator_strategic.py +0 -0
  195. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_ai_agent_comprehensive.py +0 -0
  196. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_ai_agent_workflow.py +0 -0
  197. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_async_hook_executor.py +0 -0
  198. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_cli_strategic.py +0 -0
  199. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_code_cleaner.py +0 -0
  200. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_contextual_ai_assistant_strategic.py +0 -0
  201. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_additional_strategic.py +0 -0
  202. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_autofix_coordinator.py +0 -0
  203. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_comprehensive.py +0 -0
  204. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_coverage.py +0 -0
  205. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_enhanced_container.py +0 -0
  206. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_modules.py +0 -0
  207. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_performance.py +0 -0
  208. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_strategic.py +0 -0
  209. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_strategic_coverage.py +0 -0
  210. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_core_workflow_orchestration_deep_quality.py +0 -0
  211. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_dependency_monitor_strategic.py +0 -0
  212. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_documentation_agent.py +0 -0
  213. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_documentation_agent_simple.py +0 -0
  214. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_dynamic_config.py +0 -0
  215. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_dynamic_config_coverage.py +0 -0
  216. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_enhanced_filesystem.py +0 -0
  217. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_enhanced_filesystem_comprehensive.py +0 -0
  218. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_enhanced_filesystem_coverage.py +0 -0
  219. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_enhanced_filesystem_integration.py +0 -0
  220. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_enhanced_filesystem_strategic.py +0 -0
  221. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_filesystem_coverage.py +0 -0
  222. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_health_metrics_strategic.py +0 -0
  223. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_hook_manager_simple.py +0 -0
  224. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_import_coverage_consolidated.py +0 -0
  225. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_import_optimization_agent.py +0 -0
  226. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_intelligence_system.py +0 -0
  227. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_large_modules_coverage.py +0 -0
  228. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_main_entry_coverage.py +0 -0
  229. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_main_module.py +0 -0
  230. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_managers_consolidated.py +0 -0
  231. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_managers_strategic_coverage.py +0 -0
  232. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_additional_strategic.py +0 -0
  233. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_core_strategic.py +0 -0
  234. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_progress_monitor.py +0 -0
  235. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_progress_strategic.py +0 -0
  236. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_server.py +0 -0
  237. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_strategic.py +0 -0
  238. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_mcp_websocket_lifecycle_deep_quality.py +0 -0
  239. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_models_comprehensive.py +0 -0
  240. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_models_config_adapter_coverage.py +0 -0
  241. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_models_focused.py +0 -0
  242. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_models_strategic.py +0 -0
  243. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_models_task_coverage.py +0 -0
  244. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_modernized_code.py +0 -0
  245. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_orchestration_advanced_strategic.py +0 -0
  246. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_orchestration_strategic.py +0 -0
  247. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_performance_agent.py +0 -0
  248. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_performance_agent_simple.py +0 -0
  249. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_performance_benchmarks_focused.py +0 -0
  250. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_performance_benchmarks_strategic.py +0 -0
  251. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_phase_coordinator_simple.py +0 -0
  252. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_plugins_base_strategic.py +0 -0
  253. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_plugins_comprehensive.py +0 -0
  254. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_plugins_coverage.py +0 -0
  255. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_plugins_strategic.py +0 -0
  256. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_plugins_system_strategic.py +0 -0
  257. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_proactive_agent_system.py +0 -0
  258. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_protocol_compliance.py +0 -0
  259. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_publish_manager_coverage.py +0 -0
  260. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_py313_coverage.py +0 -0
  261. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_pytest_features.py +0 -0
  262. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_refactoring_agent.py +0 -0
  263. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_server_manager_strategic.py +0 -0
  264. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_services_coverage.py +0 -0
  265. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_services_strategic.py +0 -0
  266. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_session_coordinator.py +0 -0
  267. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_session_coordinator_coverage.py +0 -0
  268. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_simple_tool_version_service.py +0 -0
  269. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_structured_errors.py +0 -0
  270. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_structured_logging.py +0 -0
  271. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_terminal_restoration.py +0 -0
  272. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_terminal_state.py +0 -0
  273. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_advanced.py +0 -0
  274. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_business_logic.py +0 -0
  275. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_coverage.py +0 -0
  276. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_deep_coverage.py +0 -0
  277. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_functional.py +0 -0
  278. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_simple_working.py +0 -0
  279. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_tool_version_service_strategic.py +0 -0
  280. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_unified_api.py +0 -0
  281. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_unified_config.py +0 -0
  282. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_workflow_integration.py +0 -0
  283. {crackerjack-0.31.9 → crackerjack-0.31.10}/tests/test_workflow_orchestrator.py +0 -0
  284. {crackerjack-0.31.9 → crackerjack-0.31.10}/tools.yaml +0 -0
@@ -5,6 +5,126 @@ 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
+ ## [Unreleased] - 2025-09-02
9
+
10
+ ### Added
11
+
12
+ - feat: add new feature
13
+
14
+ ### Fixed
15
+
16
+ - fix: resolve bug in parser
17
+
18
+ ## [Unreleased] - 2025-09-02
19
+
20
+ ### Added
21
+
22
+ - feat: add new feature
23
+
24
+ ### Fixed
25
+
26
+ - fix: resolve bug in parser
27
+
28
+ ## [Unreleased] - 2025-09-02
29
+
30
+ ### Added
31
+
32
+ - feat: add new feature
33
+
34
+ ### Fixed
35
+
36
+ - fix: resolve bug in parser
37
+
38
+ ## [Unreleased] - 2025-09-02
39
+
40
+ ### Added
41
+
42
+ - feat: add new feature
43
+
44
+ ### Fixed
45
+
46
+ - fix: resolve bug in parser
47
+
48
+ ## [Unreleased] - 2025-09-02
49
+
50
+ ### Added
51
+
52
+ - feat: add new feature
53
+
54
+ ### Fixed
55
+
56
+ - fix: resolve bug in parser
57
+
58
+ ## [Unreleased] - 2025-09-02
59
+
60
+ ### Added
61
+
62
+ - feat: add new feature
63
+
64
+ ### Fixed
65
+
66
+ - fix: resolve bug in parser
67
+
68
+ ## [Unreleased] - 2025-09-02
69
+
70
+ ### Added
71
+
72
+ - feat: add new feature
73
+
74
+ ### Fixed
75
+
76
+ - fix: resolve bug in parser
77
+
78
+ ## [Unreleased] - 2025-09-02
79
+
80
+ ### Added
81
+
82
+ - feat: add new feature
83
+
84
+ ### Fixed
85
+
86
+ - fix: resolve bug in parser
87
+
88
+ ## [Unreleased] - 2025-09-01
89
+
90
+ ### Added
91
+
92
+ - feat: add new feature
93
+
94
+ ### Fixed
95
+
96
+ - fix: resolve bug in parser
97
+
98
+ ## [Unreleased] - 2025-09-01
99
+
100
+ ### Added
101
+
102
+ - feat: add new feature
103
+
104
+ ### Fixed
105
+
106
+ - fix: resolve bug in parser
107
+
108
+ ## [Unreleased] - 2025-09-01
109
+
110
+ ### Added
111
+
112
+ - feat: add new feature
113
+
114
+ ### Fixed
115
+
116
+ - fix: resolve bug in parser
117
+
118
+ ## [Unreleased] - 2025-09-01
119
+
120
+ ### Added
121
+
122
+ - feat: add new feature
123
+
124
+ ### Fixed
125
+
126
+ - fix: resolve bug in parser
127
+
8
128
  ## [Unreleased] - 2025-09-01
9
129
 
10
130
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crackerjack
3
- Version: 0.31.9
3
+ Version: 0.31.10
4
4
  Summary: Opinionated Python project management tool
5
5
  Project-URL: documentation, https://github.com/lesleslie/crackerjack
6
6
  Project-URL: homepage, https://github.com/lesleslie/crackerjack
@@ -157,7 +157,7 @@ class PhaseCoordinator:
157
157
  "CLAUDE.md",
158
158
  "RULES.md",
159
159
  ".gitignore",
160
- "mcp.json",
160
+ "example.mcp.json",
161
161
  "uv.lock",
162
162
  ]
163
163
 
@@ -172,10 +172,12 @@ class WorkflowPipeline:
172
172
  async def _execute_workflow_phases(self, options: OptionsProtocol) -> bool:
173
173
  success = True
174
174
  self.phases.run_configuration_phase(options)
175
+
175
176
  if not self.phases.run_cleaning_phase(options):
176
177
  success = False
177
178
  self.session.fail_task("workflow", "Cleaning phase failed")
178
179
  return False
180
+
179
181
  if not await self._execute_quality_phase(options):
180
182
  success = False
181
183
  return False
@@ -263,6 +265,21 @@ class WorkflowPipeline:
263
265
  ) -> bool:
264
266
  """Handle standard workflow where all phases must pass."""
265
267
  success = testing_passed and comprehensive_passed
268
+
269
+ # Debug information for workflow continuation issues
270
+ if not success and getattr(options, "verbose", False):
271
+ self.console.print(
272
+ f"[yellow]⚠️ Workflow stopped - testing_passed: {testing_passed}, comprehensive_passed: {comprehensive_passed}[/yellow]"
273
+ )
274
+ if not testing_passed:
275
+ self.console.print(
276
+ "[yellow] → Tests reported failure despite appearing successful[/yellow]"
277
+ )
278
+ if not comprehensive_passed:
279
+ self.console.print(
280
+ "[yellow] → Comprehensive hooks reported failure despite appearing successful[/yellow]"
281
+ )
282
+
266
283
  if options.ai_agent and self._should_debug():
267
284
  self.debugger.log_iteration_end(iteration, success)
268
285
  return success
@@ -136,6 +136,36 @@ class TestManager:
136
136
  except Exception:
137
137
  return None
138
138
 
139
+ def get_coverage(self) -> dict[str, t.Any]:
140
+ """Get coverage information as required by TestManagerProtocol."""
141
+ try:
142
+ # Get the ratchet status which includes coverage information
143
+ status = self.coverage_ratchet.get_status_report()
144
+
145
+ if status.get("status") == "not_initialized":
146
+ return {
147
+ "status": "not_initialized",
148
+ "coverage_percent": 0.0,
149
+ "message": "Coverage ratchet not initialized",
150
+ }
151
+
152
+ return {
153
+ "status": "active",
154
+ "coverage_percent": status.get("current_coverage", 0.0),
155
+ "target_coverage": status.get("target_coverage", 100.0),
156
+ "next_milestone": status.get("next_milestone"),
157
+ "progress_percent": status.get("progress_percent", 0.0),
158
+ "last_updated": status.get("last_updated"),
159
+ "milestones_achieved": status.get("milestones_achieved", []),
160
+ }
161
+ except Exception as e:
162
+ return {
163
+ "status": "error",
164
+ "coverage_percent": 0.0,
165
+ "error": str(e),
166
+ "message": "Failed to get coverage information",
167
+ }
168
+
139
169
  def has_tests(self) -> bool:
140
170
  """Check if project has tests."""
141
171
  test_directories = ["tests", "test"]
@@ -219,11 +249,17 @@ class TestManager:
219
249
  self._handle_coverage_improvement(ratchet_result)
220
250
  return True
221
251
  else:
222
- self.console.print(
223
- f"[red]📉[/red] Coverage regression: "
224
- f"{ratchet_result.get('current_coverage', 0):.2f}% < "
225
- f"{ratchet_result.get('previous_coverage', 0):.2f}%"
226
- )
252
+ # Use the message from the ratchet result if available, or construct from available data
253
+ if "message" in ratchet_result:
254
+ self.console.print(f"[red]📉[/red] {ratchet_result['message']}")
255
+ else:
256
+ # Fallback to constructing message from available keys
257
+ current = ratchet_result.get("current_coverage", 0)
258
+ previous = ratchet_result.get("previous_coverage", 0)
259
+ self.console.print(
260
+ f"[red]📉[/red] Coverage regression: "
261
+ f"{current:.2f}% < {previous:.2f}%"
262
+ )
227
263
  return False
228
264
 
229
265
  def _handle_coverage_improvement(self, ratchet_result: dict[str, t.Any]) -> None:
@@ -315,5 +315,6 @@ max_complexity = 15
315
315
 
316
316
  [dependency-groups]
317
317
  dev = [
318
+ "excalidraw-mcp>=0.1.2",
318
319
  "session-mgmt-mcp>=0.1.3",
319
320
  ]
@@ -332,11 +332,13 @@ class CoverageRatchetService:
332
332
  # Look for .coverage file or coverage.json
333
333
  coverage_file = self.pkg_path / "coverage.json"
334
334
  if not coverage_file.exists():
335
- # Look for coverage data in htmlcov/index.html or other standard locations
335
+ # No coverage data - this is acceptable, return success
336
336
  return {
337
- "success": False,
338
- "error": "No coverage data found",
339
- "message": "Run tests with coverage enabled first",
337
+ "success": True,
338
+ "status": "no_coverage_data",
339
+ "message": "No coverage data found - tests passed without coverage",
340
+ "allowed": True,
341
+ "baseline_updated": False,
340
342
  }
341
343
 
342
344
  # Parse coverage data (simplified for now)
@@ -346,7 +348,9 @@ class CoverageRatchetService:
346
348
  )
347
349
 
348
350
  # Update the ratchet
349
- return self.update_coverage(current_coverage)
351
+ result = self.update_coverage(current_coverage)
352
+ result["success"] = result.get("allowed", True)
353
+ return result
350
354
 
351
355
  except Exception as e:
352
356
  return {
@@ -29,18 +29,27 @@ class GitService:
29
29
 
30
30
  def get_changed_files(self) -> list[str]:
31
31
  try:
32
- staged_result = self._run_git_command(["diff", "--cached", "--name-only"])
32
+ # Get staged files excluding deletions
33
+ staged_result = self._run_git_command(
34
+ ["diff", "--cached", "--name-only", "--diff-filter=ACMRT"]
35
+ )
33
36
  staged_files = (
34
37
  staged_result.stdout.strip().split("\n")
35
38
  if staged_result.stdout.strip()
36
39
  else []
37
40
  )
38
- unstaged_result = self._run_git_command(["diff", "--name-only"])
41
+
42
+ # Get unstaged files excluding deletions
43
+ unstaged_result = self._run_git_command(
44
+ ["diff", "--name-only", "--diff-filter=ACMRT"]
45
+ )
39
46
  unstaged_files = (
40
47
  unstaged_result.stdout.strip().split("\n")
41
48
  if unstaged_result.stdout.strip()
42
49
  else []
43
50
  )
51
+
52
+ # Get untracked files
44
53
  untracked_result = self._run_git_command(
45
54
  ["ls-files", "--others", "--exclude-standard"],
46
55
  )
@@ -49,6 +58,7 @@ class GitService:
49
58
  if untracked_result.stdout.strip()
50
59
  else []
51
60
  )
61
+
52
62
  all_files = set(staged_files + unstaged_files + untracked_files)
53
63
  return [f for f in all_files if f]
54
64
  except Exception as e:
@@ -72,7 +72,7 @@ class InitializationService:
72
72
  "pyproject.toml": "smart_merge",
73
73
  "CLAUDE.md": "smart_append",
74
74
  "RULES.md": "replace_if_missing",
75
- "mcp.json": "special", # Special handling: mcp.json -> .mcp.json with merging
75
+ "example.mcp.json": "special", # Special handling: example.mcp.json -> .mcp.json with merging
76
76
  }
77
77
 
78
78
  def _process_config_file(
@@ -84,8 +84,8 @@ class InitializationService:
84
84
  force: bool,
85
85
  results: dict[str, t.Any],
86
86
  ) -> None:
87
- # Special handling for mcp.json -> .mcp.json
88
- if file_name == "mcp.json":
87
+ # Special handling for example.mcp.json -> .mcp.json
88
+ if file_name == "example.mcp.json":
89
89
  self._process_mcp_config(target_path, force, results)
90
90
  return
91
91
 
@@ -248,14 +248,14 @@ class InitializationService:
248
248
  force: bool,
249
249
  results: dict[str, t.Any],
250
250
  ) -> None:
251
- """Handle special processing for mcp.json -> .mcp.json with merging."""
252
- # Source: mcp.json in crackerjack package (contains servers to add to projects)
253
- source_file = self.pkg_path / "mcp.json"
251
+ """Handle special processing for example.mcp.json -> .mcp.json with merging."""
252
+ # Source: example.mcp.json in crackerjack package (contains servers to add to projects)
253
+ source_file = self.pkg_path / "example.mcp.json"
254
254
  # Target: .mcp.json in target project
255
255
  target_file = target_path / ".mcp.json"
256
256
 
257
257
  if not source_file.exists():
258
- self._handle_missing_source_file("mcp.json", results)
258
+ self._handle_missing_source_file("example.mcp.json", results)
259
259
  return
260
260
 
261
261
  try:
@@ -265,8 +265,8 @@ class InitializationService:
265
265
 
266
266
  if not isinstance(source_config.get("mcpServers"), dict):
267
267
  self._handle_file_processing_error(
268
- "mcp.json",
269
- ValueError("Invalid mcp.json format: missing mcpServers"),
268
+ "example.mcp.json",
269
+ ValueError("Invalid example.mcp.json format: missing mcpServers"),
270
270
  results,
271
271
  )
272
272
  return
@@ -332,7 +332,7 @@ wheels = [
332
332
 
333
333
  [[package]]
334
334
  name = "crackerjack"
335
- version = "0.31.8"
335
+ version = "0.31.9"
336
336
  source = { editable = "." }
337
337
  dependencies = [
338
338
  { name = "aiofiles" },
@@ -378,6 +378,7 @@ dependencies = [
378
378
 
379
379
  [package.dev-dependencies]
380
380
  dev = [
381
+ { name = "excalidraw-mcp" },
381
382
  { name = "session-mgmt-mcp" },
382
383
  ]
383
384
 
@@ -425,7 +426,10 @@ requires-dist = [
425
426
  ]
426
427
 
427
428
  [package.metadata.requires-dev]
428
- dev = [{ name = "session-mgmt-mcp", specifier = ">=0.1.3" }]
429
+ dev = [
430
+ { name = "excalidraw-mcp", specifier = ">=0.1.2" },
431
+ { name = "session-mgmt-mcp", specifier = ">=0.1.3" },
432
+ ]
429
433
 
430
434
  [[package]]
431
435
  name = "creosote"
@@ -584,6 +588,23 @@ wheels = [
584
588
  { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" },
585
589
  ]
586
590
 
591
+ [[package]]
592
+ name = "excalidraw-mcp"
593
+ version = "0.1.2"
594
+ source = { registry = "https://pypi.org/simple" }
595
+ dependencies = [
596
+ { name = "cryptography" },
597
+ { name = "fastmcp" },
598
+ { name = "httpx", extra = ["http2"] },
599
+ { name = "psutil" },
600
+ { name = "pydantic" },
601
+ { name = "pyjwt" },
602
+ ]
603
+ sdist = { url = "https://files.pythonhosted.org/packages/1e/84/572e03ccc4f3b6425778653d82c950dcd725d32cd8a10be7c4fb854761c5/excalidraw_mcp-0.1.2.tar.gz", hash = "sha256:d0b016e48462369ce745665c940307a56ff73bd51037660ac7e7b4e8d006b769", size = 181018, upload-time = "2025-09-02T06:38:39.888Z" }
604
+ wheels = [
605
+ { url = "https://files.pythonhosted.org/packages/49/a3/04da808d1ba85cc709abd54086673320a6261659c65eebd265b87cd5fc89/excalidraw_mcp-0.1.2-py3-none-any.whl", hash = "sha256:452db458fe4f3abe9fbb9023c73a981ce1de7639be9e51e1923959f90823a40d", size = 20742, upload-time = "2025-09-02T06:38:38.503Z" },
606
+ ]
607
+
587
608
  [[package]]
588
609
  name = "exceptiongroup"
589
610
  version = "1.3.0"
@@ -709,6 +730,19 @@ wheels = [
709
730
  { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
710
731
  ]
711
732
 
733
+ [[package]]
734
+ name = "h2"
735
+ version = "4.3.0"
736
+ source = { registry = "https://pypi.org/simple" }
737
+ dependencies = [
738
+ { name = "hpack" },
739
+ { name = "hyperframe" },
740
+ ]
741
+ sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" }
742
+ wheels = [
743
+ { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" },
744
+ ]
745
+
712
746
  [[package]]
713
747
  name = "hatchling"
714
748
  version = "1.27.0"
@@ -724,6 +758,15 @@ wheels = [
724
758
  { url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl", hash = "sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b", size = 75794, upload-time = "2024-12-15T17:08:10.364Z" },
725
759
  ]
726
760
 
761
+ [[package]]
762
+ name = "hpack"
763
+ version = "4.1.0"
764
+ source = { registry = "https://pypi.org/simple" }
765
+ sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" }
766
+ wheels = [
767
+ { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" },
768
+ ]
769
+
727
770
  [[package]]
728
771
  name = "httpcore"
729
772
  version = "1.0.9"
@@ -752,6 +795,11 @@ wheels = [
752
795
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
753
796
  ]
754
797
 
798
+ [package.optional-dependencies]
799
+ http2 = [
800
+ { name = "h2" },
801
+ ]
802
+
755
803
  [[package]]
756
804
  name = "httpx-sse"
757
805
  version = "0.4.1"
@@ -761,6 +809,15 @@ wheels = [
761
809
  { url = "https://files.pythonhosted.org/packages/25/0a/6269e3473b09aed2dab8aa1a600c70f31f00ae1349bee30658f7e358a159/httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37", size = 8054, upload-time = "2025-06-24T13:21:04.772Z" },
762
810
  ]
763
811
 
812
+ [[package]]
813
+ name = "hyperframe"
814
+ version = "6.1.0"
815
+ source = { registry = "https://pypi.org/simple" }
816
+ sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" }
817
+ wheels = [
818
+ { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" },
819
+ ]
820
+
764
821
  [[package]]
765
822
  name = "hypothesis"
766
823
  version = "6.138.13"
@@ -1671,6 +1728,15 @@ wheels = [
1671
1728
  { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
1672
1729
  ]
1673
1730
 
1731
+ [[package]]
1732
+ name = "pyjwt"
1733
+ version = "2.10.1"
1734
+ source = { registry = "https://pypi.org/simple" }
1735
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" }
1736
+ wheels = [
1737
+ { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
1738
+ ]
1739
+
1674
1740
  [[package]]
1675
1741
  name = "pyleak"
1676
1742
  version = "0.1.14"
@@ -0,0 +1,16 @@
1
+ {
2
+ "mcpServers": {
3
+ "crackerjack": {
4
+ "command": "python",
5
+ "args": [
6
+ "-m",
7
+ "crackerjack",
8
+ "--start-mcp-server"
9
+ ],
10
+ "env": {
11
+ "UV_KEYRING_PROVIDER": "subprocess",
12
+ "EDITOR": "code --wait"
13
+ }
14
+ }
15
+ }
16
+ }
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "crackerjack"
9
- version = "0.31.8"
9
+ version = "0.31.10"
10
10
  description = "Opinionated Python project management tool"
11
11
  readme = "README.md"
12
12
  authors = [
@@ -315,5 +315,6 @@ max_complexity = 15
315
315
 
316
316
  [dependency-groups]
317
317
  dev = [
318
+ "excalidraw-mcp>=0.1.2",
318
319
  "session-mgmt-mcp>=0.1.3",
319
320
  ]
@@ -332,7 +332,7 @@ wheels = [
332
332
 
333
333
  [[package]]
334
334
  name = "crackerjack"
335
- version = "0.31.8"
335
+ version = "0.31.9"
336
336
  source = { editable = "." }
337
337
  dependencies = [
338
338
  { name = "aiofiles" },
@@ -378,6 +378,7 @@ dependencies = [
378
378
 
379
379
  [package.dev-dependencies]
380
380
  dev = [
381
+ { name = "excalidraw-mcp" },
381
382
  { name = "session-mgmt-mcp" },
382
383
  ]
383
384
 
@@ -425,7 +426,10 @@ requires-dist = [
425
426
  ]
426
427
 
427
428
  [package.metadata.requires-dev]
428
- dev = [{ name = "session-mgmt-mcp", specifier = ">=0.1.3" }]
429
+ dev = [
430
+ { name = "excalidraw-mcp", specifier = ">=0.1.2" },
431
+ { name = "session-mgmt-mcp", specifier = ">=0.1.3" },
432
+ ]
429
433
 
430
434
  [[package]]
431
435
  name = "creosote"
@@ -584,6 +588,23 @@ wheels = [
584
588
  { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" },
585
589
  ]
586
590
 
591
+ [[package]]
592
+ name = "excalidraw-mcp"
593
+ version = "0.1.2"
594
+ source = { registry = "https://pypi.org/simple" }
595
+ dependencies = [
596
+ { name = "cryptography" },
597
+ { name = "fastmcp" },
598
+ { name = "httpx", extra = ["http2"] },
599
+ { name = "psutil" },
600
+ { name = "pydantic" },
601
+ { name = "pyjwt" },
602
+ ]
603
+ sdist = { url = "https://files.pythonhosted.org/packages/1e/84/572e03ccc4f3b6425778653d82c950dcd725d32cd8a10be7c4fb854761c5/excalidraw_mcp-0.1.2.tar.gz", hash = "sha256:d0b016e48462369ce745665c940307a56ff73bd51037660ac7e7b4e8d006b769", size = 181018, upload-time = "2025-09-02T06:38:39.888Z" }
604
+ wheels = [
605
+ { url = "https://files.pythonhosted.org/packages/49/a3/04da808d1ba85cc709abd54086673320a6261659c65eebd265b87cd5fc89/excalidraw_mcp-0.1.2-py3-none-any.whl", hash = "sha256:452db458fe4f3abe9fbb9023c73a981ce1de7639be9e51e1923959f90823a40d", size = 20742, upload-time = "2025-09-02T06:38:38.503Z" },
606
+ ]
607
+
587
608
  [[package]]
588
609
  name = "exceptiongroup"
589
610
  version = "1.3.0"
@@ -709,6 +730,19 @@ wheels = [
709
730
  { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
710
731
  ]
711
732
 
733
+ [[package]]
734
+ name = "h2"
735
+ version = "4.3.0"
736
+ source = { registry = "https://pypi.org/simple" }
737
+ dependencies = [
738
+ { name = "hpack" },
739
+ { name = "hyperframe" },
740
+ ]
741
+ sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" }
742
+ wheels = [
743
+ { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" },
744
+ ]
745
+
712
746
  [[package]]
713
747
  name = "hatchling"
714
748
  version = "1.27.0"
@@ -724,6 +758,15 @@ wheels = [
724
758
  { url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl", hash = "sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b", size = 75794, upload-time = "2024-12-15T17:08:10.364Z" },
725
759
  ]
726
760
 
761
+ [[package]]
762
+ name = "hpack"
763
+ version = "4.1.0"
764
+ source = { registry = "https://pypi.org/simple" }
765
+ sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" }
766
+ wheels = [
767
+ { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" },
768
+ ]
769
+
727
770
  [[package]]
728
771
  name = "httpcore"
729
772
  version = "1.0.9"
@@ -752,6 +795,11 @@ wheels = [
752
795
  { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
753
796
  ]
754
797
 
798
+ [package.optional-dependencies]
799
+ http2 = [
800
+ { name = "h2" },
801
+ ]
802
+
755
803
  [[package]]
756
804
  name = "httpx-sse"
757
805
  version = "0.4.1"
@@ -761,6 +809,15 @@ wheels = [
761
809
  { url = "https://files.pythonhosted.org/packages/25/0a/6269e3473b09aed2dab8aa1a600c70f31f00ae1349bee30658f7e358a159/httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37", size = 8054, upload-time = "2025-06-24T13:21:04.772Z" },
762
810
  ]
763
811
 
812
+ [[package]]
813
+ name = "hyperframe"
814
+ version = "6.1.0"
815
+ source = { registry = "https://pypi.org/simple" }
816
+ sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" }
817
+ wheels = [
818
+ { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" },
819
+ ]
820
+
764
821
  [[package]]
765
822
  name = "hypothesis"
766
823
  version = "6.138.13"
@@ -1671,6 +1728,15 @@ wheels = [
1671
1728
  { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
1672
1729
  ]
1673
1730
 
1731
+ [[package]]
1732
+ name = "pyjwt"
1733
+ version = "2.10.1"
1734
+ source = { registry = "https://pypi.org/simple" }
1735
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" }
1736
+ wheels = [
1737
+ { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
1738
+ ]
1739
+
1674
1740
  [[package]]
1675
1741
  name = "pyleak"
1676
1742
  version = "0.1.14"
File without changes