mcp-ticketer 0.1.29__tar.gz → 0.1.30__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 mcp-ticketer might be problematic. Click here for more details.

Files changed (234) hide show
  1. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CHANGELOG.md +15 -0
  2. mcp_ticketer-0.1.30/DIAGNOSTICS_FEATURE.md +301 -0
  3. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/PKG-INFO +1 -1
  4. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/__version__.py +1 -1
  5. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/diagnostics.py +108 -21
  6. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/PKG-INFO +1 -1
  7. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/SOURCES.txt +2 -0
  8. mcp_ticketer-0.1.30/test_diagnostics_mcp.py +155 -0
  9. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/.dependency_cache +0 -0
  10. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/.mpm_deployment_state +0 -0
  11. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/agent-manager.md +0 -0
  12. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/agentic-coder-optimizer.md +0 -0
  13. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/api_qa.md +0 -0
  14. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/clerk-ops.md +0 -0
  15. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/code_analyzer.md +0 -0
  16. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/content-agent.md +0 -0
  17. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/dart_engineer.md +0 -0
  18. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/data_engineer.md +0 -0
  19. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/documentation.md +0 -0
  20. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/engineer.md +0 -0
  21. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/gcp_ops_agent.md +0 -0
  22. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/golang_engineer.md +0 -0
  23. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/imagemagick.md +0 -0
  24. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/java_engineer.md +0 -0
  25. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/local_ops_agent.md +0 -0
  26. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/memory_manager.md +0 -0
  27. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/nextjs_engineer.md +0 -0
  28. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/ops.md +0 -0
  29. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/php-engineer.md +0 -0
  30. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/product_owner.md +0 -0
  31. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/project_organizer.md +0 -0
  32. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/prompt-engineer.md +0 -0
  33. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/python_engineer.md +0 -0
  34. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/qa.md +0 -0
  35. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/react_engineer.md +0 -0
  36. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/refactoring_engineer.md +0 -0
  37. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/research.md +0 -0
  38. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/ruby-engineer.md +0 -0
  39. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/rust_engineer.md +0 -0
  40. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/security.md +0 -0
  41. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/ticketing.md +0 -0
  42. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/typescript_engineer.md +0 -0
  43. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/vercel_ops_agent.md +0 -0
  44. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/version_control.md +0 -0
  45. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/web_qa.md +0 -0
  46. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/agents/web_ui.md +0 -0
  47. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/mcp.json +0 -0
  48. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude/mcp.local.json +0 -0
  49. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/config/project.json +0 -0
  50. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/mcp_auto_config_preference.json +0 -0
  51. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/README.md +0 -0
  52. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
  53. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/documentation_memories.md +0 -0
  54. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/engineer_memories.md +0 -0
  55. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/ops_memories.md +0 -0
  56. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/project_knowledge_memories.md +0 -0
  57. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/qa_memories.md +0 -0
  58. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/research_memories.md +0 -0
  59. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/version-control_memories.md +0 -0
  60. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude-mpm/memories/workflows_memories.md +0 -0
  61. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.claude.json +0 -0
  62. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.coveragerc +0 -0
  63. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.env.example +0 -0
  64. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.github/workflows/docs.yml +0 -0
  65. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.github/workflows/publish.yml +0 -0
  66. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.github/workflows/test.yml +0 -0
  67. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.mcp/config.json +0 -0
  68. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.pre-commit-config.yaml +0 -0
  69. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.python-version +0 -0
  70. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/.readthedocs.yaml +0 -0
  71. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CLAUDE.md +0 -0
  72. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CLAUDE_DESKTOP_SETUP.md +0 -0
  73. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CODEX_INTEGRATION.md +0 -0
  74. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CODE_STRUCTURE.md +0 -0
  75. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CONFIG_RESOLUTION_FIX.md +0 -0
  76. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CONTRIBUTING.md +0 -0
  77. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/CREDENTIAL_VALIDATION_FIX.md +0 -0
  78. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/ENV_DISCOVERY_COMPLETE.md +0 -0
  79. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/FIX_SUMMARY.md +0 -0
  80. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  81. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/IMPLEMENTATION_SUMMARY.md +0 -0
  82. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/JIRA_SETUP.md +0 -0
  83. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/LICENSE +0 -0
  84. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/LINEAR_SETUP.md +0 -0
  85. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/MANIFEST.in +0 -0
  86. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  87. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/Makefile +0 -0
  88. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/OPTIMIZATION_SUMMARY.md +0 -0
  89. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  90. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/QUEUE_SYSTEM.md +0 -0
  91. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/QUICK_START.md +0 -0
  92. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/README.md +0 -0
  93. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/RELEASE.md +0 -0
  94. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/RELEASING.md +0 -0
  95. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/SECURITY_SCAN_REPORT_v0.1.24.md +0 -0
  96. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/TEST_COVERAGE_REPORT.md +0 -0
  97. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/TEST_REPORT.md +0 -0
  98. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/TEST_RESULTS_SUMMARY.md +0 -0
  99. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/VERIFICATION_RESULTS.md +0 -0
  100. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/claude-desktop-config.json +0 -0
  101. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/debug_search.py +0 -0
  102. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/debug_test.py +0 -0
  103. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/ADAPTERS.md +0 -0
  104. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/AI_CLIENT_INTEGRATION.md +0 -0
  105. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/API_REFERENCE.md +0 -0
  106. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/CONFIGURATION.md +0 -0
  107. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  108. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/DEVELOPER_GUIDE.md +0 -0
  109. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/ENV_DISCOVERY.md +0 -0
  110. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/MCP_INTEGRATION.md +0 -0
  111. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/MIGRATION_GUIDE.md +0 -0
  112. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/PROJECT_CONFIG.md +0 -0
  113. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/PR_INTEGRATION.md +0 -0
  114. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/QUICK_START_ENV.md +0 -0
  115. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/USER_GUIDE.md +0 -0
  116. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_archive/README.md +0 -0
  117. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  118. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  119. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  120. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  121. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  122. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  123. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  124. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/adapters/github.md.txt +0 -0
  125. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/adapters.rst.txt +0 -0
  126. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/api.rst.txt +0 -0
  127. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/cli.rst.txt +0 -0
  128. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/development.rst.txt +0 -0
  129. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/examples.rst.txt +0 -0
  130. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/index.rst.txt +0 -0
  131. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/installation.rst.txt +0 -0
  132. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  133. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/adapters/github.md +0 -0
  134. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/adapters.rst +0 -0
  135. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/api.rst +0 -0
  136. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/cli.rst +0 -0
  137. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/conf.py +0 -0
  138. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/development.rst +0 -0
  139. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/examples.rst +0 -0
  140. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/index.rst +0 -0
  141. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/installation.rst +0 -0
  142. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/prd/mcp-ticketer-prd.md +0 -0
  143. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/docs/requirements.txt +0 -0
  144. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/install.sh +0 -0
  145. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/mcp-ticketer +0 -0
  146. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/mcp-ticketer-server +0 -0
  147. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/mcp_server.sh +0 -0
  148. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/pyproject.toml +0 -0
  149. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/pytest.ini +0 -0
  150. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/requirements-dev.txt +0 -0
  151. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/requirements.txt +0 -0
  152. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/scripts/README.md +0 -0
  153. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/scripts/manage_version.py +0 -0
  154. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/setup.cfg +0 -0
  155. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/setup.py +0 -0
  156. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/__init__.py +0 -0
  157. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/adapters/__init__.py +0 -0
  158. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/adapters/aitrackdown.py +0 -0
  159. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/adapters/github.py +0 -0
  160. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/adapters/hybrid.py +0 -0
  161. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/adapters/jira.py +0 -0
  162. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/adapters/linear.py +0 -0
  163. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cache/__init__.py +0 -0
  164. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cache/memory.py +0 -0
  165. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/__init__.py +0 -0
  166. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
  167. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/codex_configure.py +0 -0
  168. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/configure.py +0 -0
  169. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/discover.py +0 -0
  170. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
  171. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/main.py +0 -0
  172. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
  173. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  174. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  175. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/simple_health.py +0 -0
  176. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/cli/utils.py +0 -0
  177. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/__init__.py +0 -0
  178. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/adapter.py +0 -0
  179. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/config.py +0 -0
  180. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/env_discovery.py +0 -0
  181. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/http_client.py +0 -0
  182. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/mappers.py +0 -0
  183. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/models.py +0 -0
  184. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/project_config.py +0 -0
  185. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/core/registry.py +0 -0
  186. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/mcp/__init__.py +0 -0
  187. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/mcp/server.py +0 -0
  188. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/py.typed +0 -0
  189. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/__init__.py +0 -0
  190. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/__main__.py +0 -0
  191. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/health_monitor.py +0 -0
  192. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/manager.py +0 -0
  193. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/queue.py +0 -0
  194. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/run_worker.py +0 -0
  195. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
  196. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer/queue/worker.py +0 -0
  197. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  198. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  199. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  200. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  201. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  202. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test-tickets/tickets/task-20250924002724.json +0 -0
  203. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_all_adapters.py +0 -0
  204. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_api_usage.py +0 -0
  205. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_basic.py +0 -0
  206. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_codex_config.py +0 -0
  207. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_comprehensive.py +0 -0
  208. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_config_resolution.py +0 -0
  209. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_credential_validation.py +0 -0
  210. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_error_handling.py +0 -0
  211. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_github.py +0 -0
  212. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_github_token.py +0 -0
  213. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_jira.py +0 -0
  214. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_linear.py +0 -0
  215. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_linear_native.py +0 -0
  216. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_linear_teams.py +0 -0
  217. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_mcp_server_qa.py +0 -0
  218. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_optimizations.py +0 -0
  219. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_performance.py +0 -0
  220. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_pr_functionality.py +0 -0
  221. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_queue_system.py +0 -0
  222. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_serve_config.py +0 -0
  223. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/test_set_command.sh +0 -0
  224. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/adapters/__init__.py +0 -0
  225. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/adapters/test_aitrackdown.py +0 -0
  226. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/conftest.py +0 -0
  227. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/core/test_env_discovery.py +0 -0
  228. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/e2e/test_complete_workflow.py +0 -0
  229. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/e2e/test_hierarchy_validation.py +0 -0
  230. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/e2e/test_state_transitions.py +0 -0
  231. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/test_base_adapter.py +0 -0
  232. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/test_models.py +0 -0
  233. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tests/test_queue.py +0 -0
  234. {mcp_ticketer-0.1.29 → mcp_ticketer-0.1.30}/tox.ini +0 -0
@@ -6,6 +6,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.1.30] - 2025-10-24
10
+
11
+ ### Fixed
12
+ - **Diagnostics System**: Improved fallback mode handling for missing dependencies
13
+ - Fixed initialization order for warnings/issues lists
14
+ - Enhanced mock object detection for configuration and queue systems
15
+ - Better graceful degradation when PyYAML or other dependencies are missing
16
+ - Improved environment variable detection in fallback mode
17
+ - More informative status reporting for degraded components
18
+
19
+ ### Enhanced
20
+ - **Error Handling**: More robust handling of import failures and missing dependencies
21
+ - **User Experience**: Clearer distinction between critical failures and degraded functionality
22
+ - **Fallback Diagnostics**: Better information gathering even when full system is unavailable
23
+
9
24
  ## [0.1.29] - 2025-10-24
10
25
 
11
26
  ### Added
@@ -0,0 +1,301 @@
1
+ # 🔍 MCP Ticketer Diagnostics & Self-Diagnosis System
2
+
3
+ **Version**: 0.1.28+
4
+ **Status**: ✅ **IMPLEMENTED & DEPLOYED**
5
+ **Date**: 2025-10-24
6
+
7
+ ## 🎯 Overview
8
+
9
+ The MCP Ticketer diagnostics system provides comprehensive health monitoring and self-diagnosis capabilities for both users and AI agents. This addresses the critical need for system visibility when troubleshooting issues like the "60% queue failure rate" problem.
10
+
11
+ ## 🚀 Features Implemented
12
+
13
+ ### 1. **CLI Health Commands**
14
+
15
+ #### Quick Health Check
16
+ ```bash
17
+ mcp-ticketer health
18
+ ```
19
+
20
+ **Output Example:**
21
+ ```
22
+ 🏥 MCP Ticketer Quick Health Check
23
+ ==================================================
24
+ ✅ Python: 3.13.7
25
+ ✅ Configuration: Found .aitrackdown
26
+ ✅ Aitrackdown: Directory exists at .aitrackdown
27
+ ℹ️ Aitrackdown: 46 tickets found
28
+ ✅ Environment: 2 adapter variables configured
29
+ • LINEAR_API_KEY
30
+ • GITHUB_TOKEN
31
+ ✅ Installation: mcp-ticketer 0.1.28 installed
32
+ ⚠️ Queue System: Could not check status - import error
33
+
34
+ 🎉 System appears healthy!
35
+ 💡 For detailed diagnosis, run: mcp-ticketer diagnose
36
+ ```
37
+
38
+ #### Comprehensive Diagnosis
39
+ ```bash
40
+ mcp-ticketer diagnose # Full diagnosis
41
+ mcp-ticketer diagnose --simple # Simple diagnosis (no heavy dependencies)
42
+ mcp-ticketer diagnose --output report.json # Save to file
43
+ mcp-ticketer diagnose --json # JSON output
44
+ ```
45
+
46
+ **Output Example:**
47
+ ```
48
+ 🔍 MCP Ticketer Simple Diagnosis
49
+ ============================================================
50
+
51
+ 📋 Basic System Check
52
+ ✅ Python 3.13.7
53
+ ✅ mcp-ticketer 0.1.28 installed
54
+
55
+ 📋 Configuration Check
56
+ ℹ️ No configuration files (using defaults)
57
+ ✅ 2 adapter environment variables configured
58
+
59
+ ============================================================
60
+ 📋 DIAGNOSIS SUMMARY
61
+ ============================================================
62
+
63
+ 💡 Recommendations:
64
+ ✅ System appears healthy
65
+ ```
66
+
67
+ ### 2. **MCP Diagnostic Tools**
68
+
69
+ Two new MCP tools are available for AI agents:
70
+
71
+ #### `system_health`
72
+ - **Purpose**: Quick system health check
73
+ - **Parameters**: None
74
+ - **Returns**: Configuration status, queue worker status, failure rates
75
+ - **Use Case**: AI agents can quickly check if the system is operational
76
+
77
+ #### `system_diagnose`
78
+ - **Purpose**: Comprehensive system diagnostics
79
+ - **Parameters**:
80
+ - `include_logs` (boolean, optional): Include recent log analysis
81
+ - **Returns**: Detailed analysis of all components with recommendations
82
+ - **Use Case**: Deep troubleshooting when issues are detected
83
+
84
+ ### 3. **Intelligent Fallback System**
85
+
86
+ The diagnostics system includes multiple fallback mechanisms:
87
+
88
+ 1. **Simple Health Check**: Works without heavy dependencies (PyYAML, etc.)
89
+ 2. **Graceful Degradation**: Falls back to simple diagnostics if full system fails
90
+ 3. **Import Protection**: Handles missing dependencies gracefully
91
+ 4. **Error Recovery**: Continues diagnosis even if individual components fail
92
+
93
+ ## 🔧 Technical Implementation
94
+
95
+ ### Architecture
96
+
97
+ ```
98
+ src/mcp_ticketer/cli/
99
+ ├── diagnostics.py # Full diagnostics system
100
+ ├── simple_health.py # Lightweight fallback diagnostics
101
+ └── main.py # CLI command integration
102
+
103
+ src/mcp_ticketer/mcp/
104
+ └── server.py # MCP tool integration
105
+ ```
106
+
107
+ ### Key Components
108
+
109
+ #### 1. **SystemDiagnostics Class** (`diagnostics.py`)
110
+ - Comprehensive system analysis
111
+ - Configuration validation
112
+ - Adapter functionality testing
113
+ - Queue system health monitoring
114
+ - Log analysis
115
+ - Performance metrics
116
+ - Actionable recommendations
117
+
118
+ #### 2. **Simple Health Functions** (`simple_health.py`)
119
+ - Lightweight checks without heavy dependencies
120
+ - Basic configuration detection
121
+ - Environment variable validation
122
+ - Installation verification
123
+ - Fallback for when full diagnostics fail
124
+
125
+ #### 3. **MCP Integration** (`server.py`)
126
+ - Two new MCP tools: `system_health` and `system_diagnose`
127
+ - JSON-RPC compatible responses
128
+ - Error handling and status reporting
129
+ - Integration with existing MCP server
130
+
131
+ ### Diagnostic Categories
132
+
133
+ #### ✅ **Configuration Analysis**
134
+ - Adapter configuration validation
135
+ - Credential verification (where available)
136
+ - Default adapter detection
137
+ - Configuration file discovery
138
+
139
+ #### ⚡ **Queue System Health**
140
+ - Worker process status
141
+ - Queue statistics and failure rates
142
+ - Health score calculation (0-100)
143
+ - Performance metrics
144
+
145
+ #### 🔌 **Adapter Functionality**
146
+ - Adapter initialization testing
147
+ - Basic functionality verification (non-destructive)
148
+ - Credential validation
149
+ - Error reporting
150
+
151
+ #### 📝 **Log Analysis** (Full diagnostics only)
152
+ - Recent error detection
153
+ - Warning pattern analysis
154
+ - Log file discovery
155
+ - Issue correlation
156
+
157
+ #### 📊 **Performance Metrics**
158
+ - Response time measurement
159
+ - Resource usage analysis
160
+ - Throughput assessment
161
+ - Bottleneck identification
162
+
163
+ ## 🎯 Use Cases
164
+
165
+ ### For Users
166
+
167
+ 1. **Quick System Check**
168
+ ```bash
169
+ mcp-ticketer health
170
+ ```
171
+ - Verify installation
172
+ - Check basic configuration
173
+ - Identify obvious issues
174
+
175
+ 2. **Troubleshooting Issues**
176
+ ```bash
177
+ mcp-ticketer diagnose
178
+ ```
179
+ - Comprehensive system analysis
180
+ - Detailed error reporting
181
+ - Actionable recommendations
182
+
183
+ 3. **CI/CD Integration**
184
+ ```bash
185
+ mcp-ticketer health || exit 1
186
+ ```
187
+ - Automated health checks
188
+ - Build pipeline validation
189
+ - Deployment verification
190
+
191
+ ### For AI Agents
192
+
193
+ 1. **System Status Monitoring**
194
+ ```json
195
+ {
196
+ "tool": "system_health",
197
+ "arguments": {}
198
+ }
199
+ ```
200
+ - Quick operational status
201
+ - Failure rate monitoring
202
+ - Component health overview
203
+
204
+ 2. **Issue Investigation**
205
+ ```json
206
+ {
207
+ "tool": "system_diagnose",
208
+ "arguments": {"include_logs": true}
209
+ }
210
+ ```
211
+ - Deep system analysis
212
+ - Root cause identification
213
+ - Comprehensive reporting
214
+
215
+ 3. **Proactive Monitoring**
216
+ - Regular health checks
217
+ - Early issue detection
218
+ - Automated troubleshooting
219
+
220
+ ## 📈 Benefits
221
+
222
+ ### 🔍 **Visibility**
223
+ - Clear system status reporting
224
+ - Component-level health monitoring
225
+ - Performance metrics tracking
226
+ - Issue identification and categorization
227
+
228
+ ### 🚀 **Reliability**
229
+ - Proactive issue detection
230
+ - Automated health monitoring
231
+ - Self-healing recommendations
232
+ - Graceful degradation handling
233
+
234
+ ### 🤖 **AI Agent Integration**
235
+ - Native MCP tool support
236
+ - Structured diagnostic data
237
+ - Actionable recommendations
238
+ - Automated troubleshooting workflows
239
+
240
+ ### 👥 **User Experience**
241
+ - Simple command-line interface
242
+ - Rich, colorized output
243
+ - Multiple output formats (text, JSON)
244
+ - Progressive disclosure (health → diagnose)
245
+
246
+ ## 🔄 Exit Codes
247
+
248
+ The diagnostic commands use standard exit codes for automation:
249
+
250
+ - **0**: System healthy, no issues detected
251
+ - **1**: Critical issues found, immediate attention required
252
+ - **2**: Warnings detected, monitoring recommended
253
+
254
+ ## 🎉 Impact on Original Issue
255
+
256
+ This diagnostics system directly addresses the original problem:
257
+
258
+ > "The mcp-ticketer system itself is experiencing critical issues! This is actually very revealing - the ticketing system has a 60% failure rate"
259
+
260
+ ### Before Diagnostics
261
+ - ❌ No visibility into system health
262
+ - ❌ No way to identify root causes
263
+ - ❌ Manual investigation required
264
+ - ❌ AI agents couldn't self-diagnose
265
+
266
+ ### After Diagnostics
267
+ - ✅ **Instant system health visibility**
268
+ - ✅ **Automated issue detection**
269
+ - ✅ **AI agent self-diagnosis capability**
270
+ - ✅ **Actionable recommendations**
271
+ - ✅ **Proactive monitoring**
272
+
273
+ ### Example Diagnostic Output for Queue Issues
274
+ ```
275
+ ❌ Queue Health: High failure rate 60.0% (12/20)
276
+ ❌ Queue Worker: Not running
277
+
278
+ 💡 Recommendations:
279
+ • Restart queue worker: mcp-ticketer queue worker restart
280
+ • Check queue system logs for error patterns
281
+ • Consider clearing failed queue items: mcp-ticketer queue clear --failed
282
+ ```
283
+
284
+ ## 🚀 Future Enhancements
285
+
286
+ 1. **Metrics Dashboard**: Web-based health monitoring
287
+ 2. **Alert Integration**: Slack/email notifications for critical issues
288
+ 3. **Historical Tracking**: Trend analysis and performance history
289
+ 4. **Auto-Remediation**: Automated fixing of common issues
290
+ 5. **Custom Health Checks**: User-defined diagnostic rules
291
+
292
+ ## 📚 Documentation
293
+
294
+ - **User Guide**: See `mcp-ticketer health --help` and `mcp-ticketer diagnose --help`
295
+ - **MCP Integration**: Tools available as `system_health` and `system_diagnose`
296
+ - **API Reference**: See `src/mcp_ticketer/cli/diagnostics.py` for implementation details
297
+ - **Examples**: See `test_diagnostics_mcp.py` for MCP usage examples
298
+
299
+ ---
300
+
301
+ **The diagnostics system transforms MCP Ticketer from a "black box" into a transparent, self-monitoring system that both users and AI agents can easily understand and troubleshoot.** 🎯
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.1.29
3
+ Version: 0.1.30
4
4
  Summary: Universal ticket management interface for AI agents with MCP support
5
5
  Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
6
6
  Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
@@ -1,6 +1,6 @@
1
1
  """Version information for mcp-ticketer package."""
2
2
 
3
- __version__ = "0.1.29"
3
+ __version__ = "0.1.30"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
@@ -15,22 +15,58 @@ from rich.panel import Panel
15
15
  from rich.table import Table
16
16
  from rich.text import Text
17
17
 
18
- try:
19
- from ..core.config import get_config
20
- except ImportError:
21
- # Fallback for missing dependencies
22
- def get_config():
23
- raise ImportError("Configuration system not available")
24
-
25
- try:
26
- from ..core.registry import AdapterRegistry
27
- except ImportError:
28
- AdapterRegistry = None
29
-
30
- try:
31
- from ..queue.manager import QueueManager
32
- except ImportError:
33
- QueueManager = None
18
+ def safe_import_config():
19
+ """Safely import configuration with fallback."""
20
+ try:
21
+ from ..core.config import get_config
22
+ return get_config
23
+ except ImportError:
24
+ # Create a minimal config fallback
25
+ class MockConfig:
26
+ def get_enabled_adapters(self):
27
+ return {}
28
+
29
+ @property
30
+ def default_adapter(self):
31
+ return "aitrackdown"
32
+
33
+ def get_config():
34
+ return MockConfig()
35
+
36
+ return get_config
37
+
38
+ def safe_import_registry():
39
+ """Safely import adapter registry with fallback."""
40
+ try:
41
+ from ..core.registry import AdapterRegistry
42
+ return AdapterRegistry
43
+ except ImportError:
44
+ class MockRegistry:
45
+ @staticmethod
46
+ def get_adapter(adapter_type):
47
+ raise ImportError(f"Adapter {adapter_type} not available")
48
+
49
+ return MockRegistry
50
+
51
+ def safe_import_queue_manager():
52
+ """Safely import queue manager with fallback."""
53
+ try:
54
+ from ..queue.manager import QueueManager
55
+ return QueueManager
56
+ except ImportError:
57
+ class MockQueueManager:
58
+ def get_worker_status(self):
59
+ return {"running": False, "pid": None}
60
+
61
+ def get_queue_stats(self):
62
+ return {"total": 0, "failed": 0}
63
+
64
+ return MockQueueManager
65
+
66
+ # Initialize with safe imports
67
+ get_config = safe_import_config()
68
+ AdapterRegistry = safe_import_registry()
69
+ QueueManager = safe_import_queue_manager()
34
70
 
35
71
  console = Console()
36
72
  logger = logging.getLogger(__name__)
@@ -40,22 +76,37 @@ class SystemDiagnostics:
40
76
  """Comprehensive system diagnostics and health reporting."""
41
77
 
42
78
  def __init__(self):
79
+ # Initialize lists first
80
+ self.issues = []
81
+ self.warnings = []
82
+ self.successes = []
83
+
43
84
  try:
44
85
  self.config = get_config()
86
+ # Check if this is a mock config
87
+ if hasattr(self.config, '__class__') and 'Mock' in self.config.__class__.__name__:
88
+ self.config_available = False
89
+ self.warnings.append("Configuration system using fallback mode")
90
+ else:
91
+ self.config_available = True
45
92
  except Exception as e:
46
93
  self.config = None
94
+ self.config_available = False
47
95
  console.print(f"⚠️ Could not load configuration: {e}")
48
96
 
49
97
  try:
50
- self.queue_manager = QueueManager() if QueueManager else None
98
+ self.queue_manager = QueueManager()
99
+ # Check if this is a mock queue manager
100
+ if hasattr(self.queue_manager, '__class__') and 'Mock' in self.queue_manager.__class__.__name__:
101
+ self.queue_available = False
102
+ self.warnings.append("Queue system using fallback mode")
103
+ else:
104
+ self.queue_available = True
51
105
  except Exception as e:
52
106
  self.queue_manager = None
107
+ self.queue_available = False
53
108
  console.print(f"⚠️ Could not initialize queue manager: {e}")
54
109
 
55
- self.issues = []
56
- self.warnings = []
57
- self.successes = []
58
-
59
110
  async def run_full_diagnosis(self) -> Dict[str, Any]:
60
111
  """Run complete system diagnosis and return detailed report."""
61
112
  console.print("\n🔍 [bold blue]MCP Ticketer System Diagnosis[/bold blue]")
@@ -112,6 +163,33 @@ class SystemDiagnostics:
112
163
  console.print(f"❌ {issue}")
113
164
  return config_status
114
165
 
166
+ if not self.config_available:
167
+ warning = "Configuration system in fallback mode - limited functionality"
168
+ config_status["issues"].append(warning)
169
+ config_status["status"] = "degraded"
170
+ self.warnings.append(warning)
171
+ console.print(f"⚠️ {warning}")
172
+
173
+ # Try to detect adapters from environment variables
174
+ import os
175
+ env_adapters = []
176
+ if os.getenv("LINEAR_API_KEY"):
177
+ env_adapters.append("linear")
178
+ if os.getenv("GITHUB_TOKEN"):
179
+ env_adapters.append("github")
180
+ if os.getenv("JIRA_SERVER"):
181
+ env_adapters.append("jira")
182
+
183
+ config_status["adapters_configured"] = len(env_adapters)
184
+ config_status["default_adapter"] = "aitrackdown"
185
+
186
+ if env_adapters:
187
+ console.print(f"ℹ️ Detected {len(env_adapters)} adapter(s) from environment: {', '.join(env_adapters)}")
188
+ else:
189
+ console.print("ℹ️ No adapter environment variables detected, using aitrackdown")
190
+
191
+ return config_status
192
+
115
193
  try:
116
194
  # Check adapter configurations
117
195
  adapters = self.config.get_enabled_adapters()
@@ -238,6 +316,15 @@ class SystemDiagnostics:
238
316
  }
239
317
 
240
318
  try:
319
+ if not self.queue_available:
320
+ warning = "Queue system in fallback mode - limited functionality"
321
+ self.warnings.append(warning)
322
+ console.print(f"⚠️ {warning}")
323
+ queue_status["worker_running"] = False
324
+ queue_status["worker_pid"] = None
325
+ queue_status["health_score"] = 50 # Degraded but not critical
326
+ return queue_status
327
+
241
328
  # Check worker status
242
329
  worker_status = self.queue_manager.get_worker_status()
243
330
  queue_status["worker_running"] = worker_status.get("running", False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.1.29
3
+ Version: 0.1.30
4
4
  Summary: Universal ticket management interface for AI agents with MCP support
5
5
  Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
6
6
  Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
@@ -12,6 +12,7 @@ CODE_STRUCTURE.md
12
12
  CONFIG_RESOLUTION_FIX.md
13
13
  CONTRIBUTING.md
14
14
  CREDENTIAL_VALIDATION_FIX.md
15
+ DIAGNOSTICS_FEATURE.md
15
16
  ENV_DISCOVERY_COMPLETE.md
16
17
  FIX_SUMMARY.md
17
18
  HIERARCHY_IMPLEMENTATION_SUMMARY.md
@@ -53,6 +54,7 @@ test_codex_config.py
53
54
  test_comprehensive.py
54
55
  test_config_resolution.py
55
56
  test_credential_validation.py
57
+ test_diagnostics_mcp.py
56
58
  test_error_handling.py
57
59
  test_github.py
58
60
  test_github_token.py
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env python3
2
+ """Test the new diagnostic MCP tools."""
3
+
4
+ import asyncio
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ import time
9
+ from typing import Any, Dict
10
+
11
+
12
+ async def test_mcp_tool(tool_name: str, arguments: Dict[str, Any] = None) -> Dict[str, Any]:
13
+ """Test an MCP tool by sending a JSON-RPC request."""
14
+ if arguments is None:
15
+ arguments = {}
16
+
17
+ request = {
18
+ "jsonrpc": "2.0",
19
+ "id": 1,
20
+ "method": "tools/call",
21
+ "params": {
22
+ "name": tool_name,
23
+ "arguments": arguments
24
+ }
25
+ }
26
+
27
+ # Start MCP server process
28
+ process = subprocess.Popen(
29
+ ["mcp-ticketer", "serve"],
30
+ stdin=subprocess.PIPE,
31
+ stdout=subprocess.PIPE,
32
+ stderr=subprocess.PIPE,
33
+ text=True
34
+ )
35
+
36
+ try:
37
+ # Send request
38
+ request_json = json.dumps(request) + "\n"
39
+ stdout, stderr = process.communicate(input=request_json, timeout=10)
40
+
41
+ if stderr:
42
+ print(f"Server stderr: {stderr}")
43
+
44
+ # Parse response
45
+ if stdout.strip():
46
+ response = json.loads(stdout.strip())
47
+ return response
48
+ else:
49
+ return {"error": "No response from server"}
50
+
51
+ except subprocess.TimeoutExpired:
52
+ process.kill()
53
+ return {"error": "Request timed out"}
54
+ except json.JSONDecodeError as e:
55
+ return {"error": f"Invalid JSON response: {e}"}
56
+ except Exception as e:
57
+ return {"error": f"Request failed: {e}"}
58
+ finally:
59
+ if process.poll() is None:
60
+ process.terminate()
61
+
62
+
63
+ async def main():
64
+ """Test the diagnostic MCP tools."""
65
+ print("🔍 Testing MCP Diagnostic Tools")
66
+ print("=" * 50)
67
+
68
+ # Test system_health tool
69
+ print("\n1. Testing system_health tool...")
70
+ health_response = await test_mcp_tool("system_health")
71
+
72
+ if "error" in health_response:
73
+ print(f"❌ Health check failed: {health_response['error']}")
74
+ else:
75
+ print("✅ Health check completed")
76
+ if "result" in health_response:
77
+ content = health_response["result"].get("content", [])
78
+ if content and len(content) > 0:
79
+ print("📊 Health Status:")
80
+ print(content[0].get("text", "No text content"))
81
+ else:
82
+ print("⚠️ No content in response")
83
+ else:
84
+ print(f"Response: {json.dumps(health_response, indent=2)}")
85
+
86
+ # Test system_diagnose tool
87
+ print("\n2. Testing system_diagnose tool...")
88
+ diagnose_response = await test_mcp_tool("system_diagnose", {"include_logs": False})
89
+
90
+ if "error" in diagnose_response:
91
+ print(f"❌ Diagnosis failed: {diagnose_response['error']}")
92
+ else:
93
+ print("✅ Diagnosis completed")
94
+ if "result" in diagnose_response:
95
+ content = diagnose_response["result"].get("content", [])
96
+ if content and len(content) > 0:
97
+ print("📋 Diagnosis Report:")
98
+ text = content[0].get("text", "No text content")
99
+ # Show first 500 characters
100
+ print(text[:500] + ("..." if len(text) > 500 else ""))
101
+ else:
102
+ print("⚠️ No content in response")
103
+ else:
104
+ print(f"Response: {json.dumps(diagnose_response, indent=2)}")
105
+
106
+ # Test tools/list to verify our tools are registered
107
+ print("\n3. Testing tools/list to verify diagnostic tools are registered...")
108
+ list_request = {
109
+ "jsonrpc": "2.0",
110
+ "id": 1,
111
+ "method": "tools/list",
112
+ "params": {}
113
+ }
114
+
115
+ process = subprocess.Popen(
116
+ ["mcp-ticketer", "serve"],
117
+ stdin=subprocess.PIPE,
118
+ stdout=subprocess.PIPE,
119
+ stderr=subprocess.PIPE,
120
+ text=True
121
+ )
122
+
123
+ try:
124
+ request_json = json.dumps(list_request) + "\n"
125
+ stdout, stderr = process.communicate(input=request_json, timeout=10)
126
+
127
+ if stdout.strip():
128
+ response = json.loads(stdout.strip())
129
+ if "result" in response and "tools" in response["result"]:
130
+ tools = response["result"]["tools"]
131
+ diagnostic_tools = [t for t in tools if t["name"] in ["system_health", "system_diagnose"]]
132
+
133
+ if diagnostic_tools:
134
+ print(f"✅ Found {len(diagnostic_tools)} diagnostic tools:")
135
+ for tool in diagnostic_tools:
136
+ print(f" • {tool['name']}: {tool['description']}")
137
+ else:
138
+ print("❌ No diagnostic tools found in tools list")
139
+ print(f"Available tools: {[t['name'] for t in tools]}")
140
+ else:
141
+ print(f"❌ Unexpected response: {response}")
142
+ else:
143
+ print("❌ No response from tools/list")
144
+
145
+ except Exception as e:
146
+ print(f"❌ Tools list failed: {e}")
147
+ finally:
148
+ if process.poll() is None:
149
+ process.terminate()
150
+
151
+ print("\n🎉 Diagnostic tools testing complete!")
152
+
153
+
154
+ if __name__ == "__main__":
155
+ asyncio.run(main())