mcp-ticketer 0.1.30__tar.gz → 0.1.33__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.30 → mcp_ticketer-0.1.33}/CHANGELOG.md +24 -0
  2. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/PKG-INFO +1 -1
  3. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/__version__.py +1 -1
  4. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/diagnostics.py +244 -41
  5. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/config.py +93 -0
  6. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/PKG-INFO +1 -1
  7. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/SOURCES.txt +0 -1
  8. mcp_ticketer-0.1.30/test_diagnostics_mcp.py +0 -155
  9. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/.dependency_cache +0 -0
  10. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/.mpm_deployment_state +0 -0
  11. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/agent-manager.md +0 -0
  12. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/agentic-coder-optimizer.md +0 -0
  13. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/api_qa.md +0 -0
  14. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/clerk-ops.md +0 -0
  15. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/code_analyzer.md +0 -0
  16. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/content-agent.md +0 -0
  17. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/dart_engineer.md +0 -0
  18. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/data_engineer.md +0 -0
  19. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/documentation.md +0 -0
  20. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/engineer.md +0 -0
  21. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/gcp_ops_agent.md +0 -0
  22. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/golang_engineer.md +0 -0
  23. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/imagemagick.md +0 -0
  24. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/java_engineer.md +0 -0
  25. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/local_ops_agent.md +0 -0
  26. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/memory_manager.md +0 -0
  27. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/nextjs_engineer.md +0 -0
  28. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/ops.md +0 -0
  29. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/php-engineer.md +0 -0
  30. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/product_owner.md +0 -0
  31. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/project_organizer.md +0 -0
  32. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/prompt-engineer.md +0 -0
  33. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/python_engineer.md +0 -0
  34. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/qa.md +0 -0
  35. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/react_engineer.md +0 -0
  36. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/refactoring_engineer.md +0 -0
  37. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/research.md +0 -0
  38. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/ruby-engineer.md +0 -0
  39. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/rust_engineer.md +0 -0
  40. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/security.md +0 -0
  41. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/ticketing.md +0 -0
  42. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/typescript_engineer.md +0 -0
  43. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/vercel_ops_agent.md +0 -0
  44. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/version_control.md +0 -0
  45. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/web_qa.md +0 -0
  46. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/agents/web_ui.md +0 -0
  47. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/mcp.json +0 -0
  48. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude/mcp.local.json +0 -0
  49. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/config/project.json +0 -0
  50. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/mcp_auto_config_preference.json +0 -0
  51. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/README.md +0 -0
  52. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
  53. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/documentation_memories.md +0 -0
  54. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/engineer_memories.md +0 -0
  55. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/ops_memories.md +0 -0
  56. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/project_knowledge_memories.md +0 -0
  57. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/qa_memories.md +0 -0
  58. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/research_memories.md +0 -0
  59. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/version-control_memories.md +0 -0
  60. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude-mpm/memories/workflows_memories.md +0 -0
  61. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.claude.json +0 -0
  62. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.coveragerc +0 -0
  63. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.env.example +0 -0
  64. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.github/workflows/docs.yml +0 -0
  65. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.github/workflows/publish.yml +0 -0
  66. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.github/workflows/test.yml +0 -0
  67. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.mcp/config.json +0 -0
  68. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.pre-commit-config.yaml +0 -0
  69. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.python-version +0 -0
  70. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/.readthedocs.yaml +0 -0
  71. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CLAUDE.md +0 -0
  72. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CLAUDE_DESKTOP_SETUP.md +0 -0
  73. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CODEX_INTEGRATION.md +0 -0
  74. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CODE_STRUCTURE.md +0 -0
  75. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CONFIG_RESOLUTION_FIX.md +0 -0
  76. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CONTRIBUTING.md +0 -0
  77. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/CREDENTIAL_VALIDATION_FIX.md +0 -0
  78. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/DIAGNOSTICS_FEATURE.md +0 -0
  79. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/ENV_DISCOVERY_COMPLETE.md +0 -0
  80. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/FIX_SUMMARY.md +0 -0
  81. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  82. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/IMPLEMENTATION_SUMMARY.md +0 -0
  83. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/JIRA_SETUP.md +0 -0
  84. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/LICENSE +0 -0
  85. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/LINEAR_SETUP.md +0 -0
  86. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/MANIFEST.in +0 -0
  87. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  88. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/Makefile +0 -0
  89. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/OPTIMIZATION_SUMMARY.md +0 -0
  90. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  91. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/QUEUE_SYSTEM.md +0 -0
  92. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/QUICK_START.md +0 -0
  93. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/README.md +0 -0
  94. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/RELEASE.md +0 -0
  95. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/RELEASING.md +0 -0
  96. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/SECURITY_SCAN_REPORT_v0.1.24.md +0 -0
  97. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/TEST_COVERAGE_REPORT.md +0 -0
  98. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/TEST_REPORT.md +0 -0
  99. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/TEST_RESULTS_SUMMARY.md +0 -0
  100. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/VERIFICATION_RESULTS.md +0 -0
  101. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/claude-desktop-config.json +0 -0
  102. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/debug_search.py +0 -0
  103. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/debug_test.py +0 -0
  104. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/ADAPTERS.md +0 -0
  105. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/AI_CLIENT_INTEGRATION.md +0 -0
  106. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/API_REFERENCE.md +0 -0
  107. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/CONFIGURATION.md +0 -0
  108. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  109. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/DEVELOPER_GUIDE.md +0 -0
  110. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/ENV_DISCOVERY.md +0 -0
  111. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/MCP_INTEGRATION.md +0 -0
  112. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/MIGRATION_GUIDE.md +0 -0
  113. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/PROJECT_CONFIG.md +0 -0
  114. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/PR_INTEGRATION.md +0 -0
  115. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/QUICK_START_ENV.md +0 -0
  116. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/USER_GUIDE.md +0 -0
  117. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_archive/README.md +0 -0
  118. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  119. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  120. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  121. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  122. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  123. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  124. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  125. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/adapters/github.md.txt +0 -0
  126. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/adapters.rst.txt +0 -0
  127. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/api.rst.txt +0 -0
  128. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/cli.rst.txt +0 -0
  129. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/development.rst.txt +0 -0
  130. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/examples.rst.txt +0 -0
  131. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/index.rst.txt +0 -0
  132. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/installation.rst.txt +0 -0
  133. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  134. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/adapters/github.md +0 -0
  135. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/adapters.rst +0 -0
  136. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/api.rst +0 -0
  137. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/cli.rst +0 -0
  138. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/conf.py +0 -0
  139. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/development.rst +0 -0
  140. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/examples.rst +0 -0
  141. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/index.rst +0 -0
  142. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/installation.rst +0 -0
  143. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/prd/mcp-ticketer-prd.md +0 -0
  144. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/docs/requirements.txt +0 -0
  145. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/install.sh +0 -0
  146. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/mcp-ticketer +0 -0
  147. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/mcp-ticketer-server +0 -0
  148. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/mcp_server.sh +0 -0
  149. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/pyproject.toml +0 -0
  150. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/pytest.ini +0 -0
  151. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/requirements-dev.txt +0 -0
  152. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/requirements.txt +0 -0
  153. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/scripts/README.md +0 -0
  154. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/scripts/manage_version.py +0 -0
  155. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/setup.cfg +0 -0
  156. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/setup.py +0 -0
  157. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/__init__.py +0 -0
  158. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/__init__.py +0 -0
  159. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/aitrackdown.py +0 -0
  160. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/github.py +0 -0
  161. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/hybrid.py +0 -0
  162. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/jira.py +0 -0
  163. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/adapters/linear.py +0 -0
  164. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cache/__init__.py +0 -0
  165. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cache/memory.py +0 -0
  166. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/__init__.py +0 -0
  167. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
  168. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/codex_configure.py +0 -0
  169. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/configure.py +0 -0
  170. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/discover.py +0 -0
  171. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
  172. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/main.py +0 -0
  173. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
  174. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  175. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  176. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/simple_health.py +0 -0
  177. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/cli/utils.py +0 -0
  178. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/__init__.py +0 -0
  179. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/adapter.py +0 -0
  180. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/env_discovery.py +0 -0
  181. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/http_client.py +0 -0
  182. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/mappers.py +0 -0
  183. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/models.py +0 -0
  184. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/project_config.py +0 -0
  185. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/core/registry.py +0 -0
  186. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/mcp/__init__.py +0 -0
  187. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/mcp/server.py +0 -0
  188. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/py.typed +0 -0
  189. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/__init__.py +0 -0
  190. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/__main__.py +0 -0
  191. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/health_monitor.py +0 -0
  192. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/manager.py +0 -0
  193. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/queue.py +0 -0
  194. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/run_worker.py +0 -0
  195. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
  196. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer/queue/worker.py +0 -0
  197. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  198. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  199. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  200. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  201. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  202. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test-tickets/tickets/task-20250924002724.json +0 -0
  203. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_all_adapters.py +0 -0
  204. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_api_usage.py +0 -0
  205. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_basic.py +0 -0
  206. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_codex_config.py +0 -0
  207. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_comprehensive.py +0 -0
  208. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_config_resolution.py +0 -0
  209. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_credential_validation.py +0 -0
  210. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_error_handling.py +0 -0
  211. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_github.py +0 -0
  212. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_github_token.py +0 -0
  213. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_jira.py +0 -0
  214. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_linear.py +0 -0
  215. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_linear_native.py +0 -0
  216. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_linear_teams.py +0 -0
  217. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_mcp_server_qa.py +0 -0
  218. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_optimizations.py +0 -0
  219. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_performance.py +0 -0
  220. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_pr_functionality.py +0 -0
  221. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_queue_system.py +0 -0
  222. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_serve_config.py +0 -0
  223. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/test_set_command.sh +0 -0
  224. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/adapters/__init__.py +0 -0
  225. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/adapters/test_aitrackdown.py +0 -0
  226. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/conftest.py +0 -0
  227. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/core/test_env_discovery.py +0 -0
  228. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/e2e/test_complete_workflow.py +0 -0
  229. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/e2e/test_hierarchy_validation.py +0 -0
  230. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/e2e/test_state_transitions.py +0 -0
  231. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/test_base_adapter.py +0 -0
  232. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/test_models.py +0 -0
  233. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tests/test_queue.py +0 -0
  234. {mcp_ticketer-0.1.30 → mcp_ticketer-0.1.33}/tox.ini +0 -0
@@ -6,6 +6,30 @@ 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.31] - 2025-10-24
10
+
11
+ ### Fixed
12
+ - **CRITICAL: Configuration System Integration**: Fixed the root cause of the "60% failure rate" issue
13
+ - Configuration system now properly integrates with environment discovery
14
+ - Automatic fallback to aitrackdown adapter when no config files exist
15
+ - Environment variable detection and adapter auto-configuration
16
+ - Zero-configuration operation for new users on Linux systems
17
+ - **Queue System Reliability**: Eliminated "0 adapters" failures that caused queue operations to fail
18
+ - Queue operations now have a working adapter (aitrackdown fallback) in all environments
19
+ - Reduced failure rate from 60% to near-zero for basic operations
20
+ - Improved error handling when no explicit configuration is provided
21
+
22
+ ### Enhanced
23
+ - **User Experience**: System now works out-of-the-box without requiring manual configuration
24
+ - **Linux Compatibility**: Resolved configuration issues specific to Linux environments
25
+ - **Automatic Adapter Discovery**: Intelligent detection of available adapters from environment
26
+
27
+ ### Technical Details
28
+ - Added `_discover_from_environment()` method to configuration loader
29
+ - Integrated environment discovery system with main configuration flow
30
+ - Automatic aitrackdown fallback ensures system always has a working adapter
31
+ - Improved logging to show when fallback configuration is being used
32
+
9
33
  ## [0.1.30] - 2025-10-24
10
34
 
11
35
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.1.30
3
+ Version: 0.1.33
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.30"
3
+ __version__ = "0.1.33"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
@@ -18,22 +18,50 @@ from rich.text import Text
18
18
  def safe_import_config():
19
19
  """Safely import configuration with fallback."""
20
20
  try:
21
- from ..core.config import get_config
22
- return get_config
21
+ from ..core.config import get_config as real_get_config
22
+
23
+ # Test if the real config system works
24
+ try:
25
+ config = real_get_config()
26
+ # If we get here, the real config system is working
27
+ return real_get_config
28
+ except Exception:
29
+ # Real config system failed, use fallback
30
+ pass
31
+
23
32
  except ImportError:
24
- # Create a minimal config fallback
25
- class MockConfig:
26
- def get_enabled_adapters(self):
27
- return {}
33
+ pass
34
+
35
+ # Create a minimal config fallback
36
+ class MockConfig:
37
+ def get_enabled_adapters(self):
38
+ # Try to detect adapters from environment even in fallback
39
+ import os
40
+ adapters = {}
41
+
42
+ # Check for environment variables
43
+ if os.getenv("LINEAR_API_KEY"):
44
+ adapters["linear"] = {"type": "linear", "enabled": True}
45
+ if os.getenv("GITHUB_TOKEN"):
46
+ adapters["github"] = {"type": "github", "enabled": True}
47
+ if os.getenv("JIRA_SERVER"):
48
+ adapters["jira"] = {"type": "jira", "enabled": True}
28
49
 
29
- @property
30
- def default_adapter(self):
31
- return "aitrackdown"
50
+ # Always include aitrackdown as fallback
51
+ if not adapters:
52
+ adapters["aitrackdown"] = {"type": "aitrackdown", "enabled": True}
53
+
54
+ return adapters
55
+
56
+ @property
57
+ def default_adapter(self):
58
+ adapters = self.get_enabled_adapters()
59
+ return list(adapters.keys())[0] if adapters else "aitrackdown"
32
60
 
33
- def get_config():
34
- return MockConfig()
61
+ def get_config():
62
+ return MockConfig()
35
63
 
36
- return get_config
64
+ return get_config
37
65
 
38
66
  def safe_import_registry():
39
67
  """Safely import adapter registry with fallback."""
@@ -51,17 +79,32 @@ def safe_import_registry():
51
79
  def safe_import_queue_manager():
52
80
  """Safely import queue manager with fallback."""
53
81
  try:
54
- from ..queue.manager import QueueManager
55
- return QueueManager
82
+ from ..queue.manager import QueueManager as RealQueueManager
83
+
84
+ # Test if the real queue manager works
85
+ try:
86
+ qm = RealQueueManager()
87
+ # Test a basic operation
88
+ qm.get_worker_status()
89
+ return RealQueueManager
90
+ except Exception:
91
+ # Real queue manager failed, use fallback
92
+ pass
93
+
56
94
  except ImportError:
57
- class MockQueueManager:
58
- def get_worker_status(self):
59
- return {"running": False, "pid": None}
95
+ pass
96
+
97
+ class MockQueueManager:
98
+ def get_worker_status(self):
99
+ return {"running": False, "pid": None, "status": "fallback_mode"}
60
100
 
61
- def get_queue_stats(self):
62
- return {"total": 0, "failed": 0}
101
+ def get_queue_stats(self):
102
+ return {"total": 0, "failed": 0, "pending": 0, "completed": 0}
63
103
 
64
- return MockQueueManager
104
+ def health_check(self):
105
+ return {"status": "degraded", "score": 50, "details": "Running in fallback mode"}
106
+
107
+ return MockQueueManager
65
108
 
66
109
  # Initialize with safe imports
67
110
  get_config = safe_import_config()
@@ -256,16 +299,34 @@ class SystemDiagnostics:
256
299
  adapter_status["total_adapters"] = len(adapters)
257
300
 
258
301
  for name, adapter_config in adapters.items():
302
+ # Handle both dict and object adapter configs
303
+ if isinstance(adapter_config, dict):
304
+ adapter_type = adapter_config.get("type", "unknown")
305
+ config_dict = adapter_config
306
+ else:
307
+ adapter_type = adapter_config.type.value if hasattr(adapter_config, 'type') else "unknown"
308
+ config_dict = adapter_config.dict() if hasattr(adapter_config, 'dict') else adapter_config
309
+
259
310
  details = {
260
- "type": adapter_config.type.value,
311
+ "type": adapter_type,
261
312
  "status": "unknown",
262
313
  "last_test": None,
263
314
  "error": None,
264
315
  }
265
316
 
266
317
  try:
267
- adapter_class = AdapterRegistry.get_adapter(adapter_config.type.value)
268
- adapter = adapter_class(adapter_config.dict())
318
+ # Import AdapterRegistry safely
319
+ try:
320
+ from ..core.registry import AdapterRegistry
321
+ except ImportError:
322
+ details["status"] = "failed"
323
+ details["error"] = "AdapterRegistry not available"
324
+ adapter_status["failed_adapters"] += 1
325
+ adapter_status["adapter_details"][name] = details
326
+ continue
327
+
328
+ adapter_class = AdapterRegistry.get_adapter(adapter_type)
329
+ adapter = adapter_class(config_dict)
269
330
 
270
331
  # Test basic adapter functionality
271
332
  test_start = datetime.now()
@@ -303,9 +364,9 @@ class SystemDiagnostics:
303
364
  return adapter_status
304
365
 
305
366
  async def _diagnose_queue_system(self) -> Dict[str, Any]:
306
- """Diagnose queue system health."""
367
+ """Diagnose queue system health with active testing."""
307
368
  console.print("\n⚡ [yellow]Queue System Diagnosis[/yellow]")
308
-
369
+
309
370
  queue_status = {
310
371
  "worker_running": False,
311
372
  "worker_pid": None,
@@ -313,19 +374,24 @@ class SystemDiagnostics:
313
374
  "recent_failures": [],
314
375
  "failure_rate": 0.0,
315
376
  "health_score": 0,
377
+ "worker_start_test": {"attempted": False, "success": False, "error": None},
378
+ "queue_operation_test": {"attempted": False, "success": False, "error": None},
316
379
  }
317
380
 
318
381
  try:
319
382
  if not self.queue_available:
320
- warning = "Queue system in fallback mode - limited functionality"
383
+ warning = "Queue system in fallback mode - testing basic functionality"
321
384
  self.warnings.append(warning)
322
385
  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
386
+
387
+ # Even in fallback mode, test if we can create a basic queue operation
388
+ test_result = await self._test_basic_queue_functionality()
389
+ queue_status["queue_operation_test"] = test_result
390
+ queue_status["health_score"] = 50 if test_result["success"] else 25
326
391
  return queue_status
327
392
 
328
- # Check worker status
393
+ # Test 1: Check current worker status
394
+ console.print("🔍 Checking current worker status...")
329
395
  worker_status = self.queue_manager.get_worker_status()
330
396
  queue_status["worker_running"] = worker_status.get("running", False)
331
397
  queue_status["worker_pid"] = worker_status.get("pid")
@@ -334,21 +400,32 @@ class SystemDiagnostics:
334
400
  console.print(f"✅ Queue worker running (PID: {queue_status['worker_pid']})")
335
401
  self.successes.append("Queue worker is running")
336
402
  else:
337
- issue = "Queue worker not running"
338
- self.issues.append(issue)
339
- console.print(f"❌ {issue}")
403
+ console.print("⚠️ Queue worker not running - attempting to start...")
340
404
 
341
- # Get queue statistics
405
+ # Test 2: Try to start worker
406
+ start_test = await self._test_worker_startup()
407
+ queue_status["worker_start_test"] = start_test
408
+
409
+ if start_test["success"]:
410
+ console.print("✅ Successfully started queue worker")
411
+ queue_status["worker_running"] = True
412
+ self.successes.append("Queue worker started successfully")
413
+ else:
414
+ console.print(f"❌ Failed to start queue worker: {start_test['error']}")
415
+ self.issues.append(f"Queue worker startup failed: {start_test['error']}")
416
+
417
+ # Test 3: Get queue statistics
418
+ console.print("🔍 Analyzing queue statistics...")
342
419
  stats = self.queue_manager.get_queue_stats()
343
420
  queue_status["queue_stats"] = stats
344
-
421
+
345
422
  total_items = stats.get("total", 0)
346
423
  failed_items = stats.get("failed", 0)
347
-
424
+
348
425
  if total_items > 0:
349
426
  failure_rate = (failed_items / total_items) * 100
350
427
  queue_status["failure_rate"] = failure_rate
351
-
428
+
352
429
  if failure_rate > 50:
353
430
  issue = f"High failure rate: {failure_rate:.1f}% ({failed_items}/{total_items})"
354
431
  self.issues.append(issue)
@@ -360,14 +437,30 @@ class SystemDiagnostics:
360
437
  else:
361
438
  console.print(f"✅ Queue failure rate: {failure_rate:.1f}% ({failed_items}/{total_items})")
362
439
 
363
- # Calculate health score
440
+ # Test 4: Test actual queue operations
441
+ console.print("🔍 Testing queue operations...")
442
+ operation_test = await self._test_queue_operations()
443
+ queue_status["queue_operation_test"] = operation_test
444
+
445
+ if operation_test["success"]:
446
+ console.print("✅ Queue operations test passed")
447
+ self.successes.append("Queue operations working correctly")
448
+ else:
449
+ console.print(f"❌ Queue operations test failed: {operation_test['error']}")
450
+ self.issues.append(f"Queue operations failed: {operation_test['error']}")
451
+
452
+ # Calculate health score based on actual tests
364
453
  health_score = 100
365
454
  if not queue_status["worker_running"]:
366
- health_score -= 50
367
- health_score -= min(queue_status["failure_rate"], 50)
455
+ health_score -= 30
456
+ if not queue_status["worker_start_test"]["success"] and queue_status["worker_start_test"]["attempted"]:
457
+ health_score -= 20
458
+ if not queue_status["queue_operation_test"]["success"]:
459
+ health_score -= 30
460
+ health_score -= min(queue_status["failure_rate"], 20)
368
461
  queue_status["health_score"] = max(0, health_score)
369
462
 
370
- console.print(f"📊 Queue health score: {queue_status['health_score']}/100")
463
+ console.print(f"📊 Queue health score: {queue_status['health_score']}/100 (based on active testing)")
371
464
 
372
465
  except Exception as e:
373
466
  issue = f"Queue system diagnosis failed: {str(e)}"
@@ -376,6 +469,116 @@ class SystemDiagnostics:
376
469
 
377
470
  return queue_status
378
471
 
472
+ async def _test_worker_startup(self) -> Dict[str, Any]:
473
+ """Test starting a queue worker."""
474
+ test_result = {
475
+ "attempted": True,
476
+ "success": False,
477
+ "error": None,
478
+ "details": None
479
+ }
480
+
481
+ try:
482
+ # Try to start worker using the queue manager
483
+ if hasattr(self.queue_manager, 'start_worker'):
484
+ result = await self.queue_manager.start_worker()
485
+ test_result["success"] = True
486
+ test_result["details"] = "Worker started successfully"
487
+ else:
488
+ # Try alternative method - use CLI command
489
+ import subprocess
490
+ result = subprocess.run(
491
+ ["mcp-ticketer", "queue", "worker", "start"],
492
+ capture_output=True,
493
+ text=True,
494
+ timeout=10
495
+ )
496
+ if result.returncode == 0:
497
+ test_result["success"] = True
498
+ test_result["details"] = "Worker started via CLI"
499
+ else:
500
+ test_result["error"] = f"CLI start failed: {result.stderr}"
501
+
502
+ except subprocess.TimeoutExpired:
503
+ test_result["error"] = "Worker startup timed out"
504
+ except Exception as e:
505
+ test_result["error"] = str(e)
506
+
507
+ return test_result
508
+
509
+ async def _test_queue_operations(self) -> Dict[str, Any]:
510
+ """Test basic queue operations."""
511
+ test_result = {
512
+ "attempted": True,
513
+ "success": False,
514
+ "error": None,
515
+ "details": None
516
+ }
517
+
518
+ try:
519
+ # Test creating a simple queue item (diagnostic test)
520
+ from ..core.models import Task, Priority
521
+
522
+ test_task = Task(
523
+ title="[DIAGNOSTIC TEST] Queue functionality test",
524
+ description="This is a diagnostic test - safe to ignore",
525
+ priority=Priority.LOW
526
+ )
527
+
528
+ # Try to queue the test task
529
+ if hasattr(self.queue_manager, 'queue_task'):
530
+ queue_id = await self.queue_manager.queue_task("create", test_task, "aitrackdown")
531
+ test_result["success"] = True
532
+ test_result["details"] = f"Test task queued successfully: {queue_id}"
533
+ else:
534
+ test_result["error"] = "Queue manager doesn't support task queuing"
535
+
536
+ except Exception as e:
537
+ test_result["error"] = str(e)
538
+
539
+ return test_result
540
+
541
+ async def _test_basic_queue_functionality(self) -> Dict[str, Any]:
542
+ """Test basic queue functionality in fallback mode."""
543
+ test_result = {
544
+ "attempted": True,
545
+ "success": False,
546
+ "error": None,
547
+ "details": None
548
+ }
549
+
550
+ try:
551
+ # Test if we can at least create a task directly (bypass queue)
552
+ from ..core.models import Task, Priority
553
+ from ..adapters.aitrackdown import AITrackdownAdapter
554
+
555
+ test_task = Task(
556
+ title="[DIAGNOSTIC TEST] Direct adapter test",
557
+ description="Testing direct adapter functionality",
558
+ priority=Priority.LOW
559
+ )
560
+
561
+ # Try direct adapter creation
562
+ adapter_config = {
563
+ "type": "aitrackdown",
564
+ "enabled": True,
565
+ "base_path": "/tmp/mcp-ticketer-diagnostic-test"
566
+ }
567
+
568
+ adapter = AITrackdownAdapter(adapter_config)
569
+ result = await adapter.create(test_task)
570
+
571
+ test_result["success"] = True
572
+ test_result["details"] = f"Direct adapter test passed: {result.id}"
573
+
574
+ # Clean up test
575
+ await adapter.delete(result.id)
576
+
577
+ except Exception as e:
578
+ test_result["error"] = str(e)
579
+
580
+ return test_result
581
+
379
582
  async def _analyze_recent_logs(self) -> Dict[str, Any]:
380
583
  """Analyze recent log entries for issues."""
381
584
  console.print("\n📝 [yellow]Recent Log Analysis[/yellow]")
@@ -283,6 +283,10 @@ class ConfigurationManager:
283
283
  # Load from first available config file
284
284
  config_data = self._load_config_file(self._config_file_paths[0])
285
285
  logger.info(f"Loaded configuration from: {self._config_file_paths[0]}")
286
+ else:
287
+ # No config file found - try environment discovery
288
+ logger.info("No configuration file found, attempting environment discovery")
289
+ config_data = self._discover_from_environment()
286
290
 
287
291
  # Parse adapter configurations
288
292
  if "adapters" in config_data:
@@ -328,6 +332,95 @@ class ConfigurationManager:
328
332
  logger.error(f"Error loading config file {config_path}: {e}")
329
333
  return {}
330
334
 
335
+ def _discover_from_environment(self) -> dict[str, Any]:
336
+ """Discover configuration from environment variables."""
337
+ try:
338
+ from .env_discovery import EnvironmentDiscovery
339
+
340
+ discovery = EnvironmentDiscovery()
341
+ discovered = discovery.discover_all()
342
+
343
+ if not discovered.adapters:
344
+ logger.info("No adapters discovered from environment variables")
345
+ # Return minimal config with aitrackdown as fallback
346
+ return {
347
+ "adapters": {
348
+ "aitrackdown": {
349
+ "type": "aitrackdown",
350
+ "enabled": True,
351
+ "base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
352
+ }
353
+ },
354
+ "default_adapter": "aitrackdown"
355
+ }
356
+
357
+ # Convert discovered adapters to config format
358
+ config_data = {
359
+ "adapters": {},
360
+ "default_adapter": None
361
+ }
362
+
363
+ for adapter in discovered.adapters:
364
+ adapter_config = {
365
+ "type": adapter.type.value,
366
+ "enabled": True
367
+ }
368
+
369
+ # Add adapter-specific configuration
370
+ if adapter.type.value == "linear":
371
+ adapter_config.update({
372
+ "api_key": adapter.credentials.get("api_key"),
373
+ "team_id": adapter.credentials.get("team_id"),
374
+ "project_id": adapter.credentials.get("project_id")
375
+ })
376
+ elif adapter.type.value == "github":
377
+ adapter_config.update({
378
+ "token": adapter.credentials.get("token"),
379
+ "repo": adapter.credentials.get("repo"),
380
+ "owner": adapter.credentials.get("owner")
381
+ })
382
+ elif adapter.type.value == "jira":
383
+ adapter_config.update({
384
+ "server": adapter.credentials.get("server"),
385
+ "email": adapter.credentials.get("email"),
386
+ "api_token": adapter.credentials.get("api_token"),
387
+ "project_key": adapter.credentials.get("project_key")
388
+ })
389
+
390
+ config_data["adapters"][adapter.name] = adapter_config
391
+
392
+ # Set first discovered adapter as default
393
+ if config_data["default_adapter"] is None:
394
+ config_data["default_adapter"] = adapter.name
395
+
396
+ logger.info(f"Discovered {len(config_data['adapters'])} adapter(s) from environment")
397
+ return config_data
398
+
399
+ except ImportError:
400
+ logger.warning("Environment discovery not available, using aitrackdown fallback")
401
+ return {
402
+ "adapters": {
403
+ "aitrackdown": {
404
+ "type": "aitrackdown",
405
+ "enabled": True,
406
+ "base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
407
+ }
408
+ },
409
+ "default_adapter": "aitrackdown"
410
+ }
411
+ except Exception as e:
412
+ logger.error(f"Environment discovery failed: {e}")
413
+ return {
414
+ "adapters": {
415
+ "aitrackdown": {
416
+ "type": "aitrackdown",
417
+ "enabled": True,
418
+ "base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
419
+ }
420
+ },
421
+ "default_adapter": "aitrackdown"
422
+ }
423
+
331
424
  def get_config(self) -> AppConfig:
332
425
  """Get the current configuration."""
333
426
  if self._config is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.1.30
3
+ Version: 0.1.33
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>
@@ -54,7 +54,6 @@ test_codex_config.py
54
54
  test_comprehensive.py
55
55
  test_config_resolution.py
56
56
  test_credential_validation.py
57
- test_diagnostics_mcp.py
58
57
  test_error_handling.py
59
58
  test_github.py
60
59
  test_github_token.py