mcp-ticketer 0.1.21__tar.gz → 0.1.22__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 (217) hide show
  1. mcp_ticketer-0.1.22/.mcp/config.json +12 -0
  2. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/PKG-INFO +1 -1
  3. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/pyproject.toml +1 -1
  4. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/__init__.py +7 -7
  5. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/__version__.py +4 -2
  6. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/__init__.py +4 -4
  7. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/aitrackdown.py +54 -38
  8. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/github.py +175 -109
  9. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/hybrid.py +90 -45
  10. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/jira.py +139 -130
  11. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/adapters/linear.py +374 -225
  12. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cache/__init__.py +1 -1
  13. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cache/memory.py +14 -15
  14. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/__init__.py +1 -1
  15. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/configure.py +69 -93
  16. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/discover.py +43 -35
  17. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/main.py +250 -293
  18. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/mcp_configure.py +39 -15
  19. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/migrate_config.py +10 -12
  20. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/queue_commands.py +21 -58
  21. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/cli/utils.py +115 -60
  22. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/__init__.py +2 -2
  23. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/adapter.py +36 -30
  24. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/config.py +113 -77
  25. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/env_discovery.py +51 -19
  26. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/http_client.py +46 -29
  27. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/mappers.py +79 -35
  28. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/models.py +29 -15
  29. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/project_config.py +131 -66
  30. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/core/registry.py +12 -12
  31. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/mcp/__init__.py +1 -1
  32. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/mcp/server.py +183 -129
  33. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/__init__.py +2 -2
  34. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/__main__.py +1 -1
  35. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/manager.py +29 -25
  36. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/queue.py +144 -82
  37. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/run_worker.py +2 -3
  38. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/queue/worker.py +48 -33
  39. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/PKG-INFO +1 -1
  40. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/SOURCES.txt +3 -2
  41. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/adapters/test_aitrackdown.py +42 -13
  42. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/conftest.py +8 -5
  43. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/core/test_env_discovery.py +11 -8
  44. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/test_base_adapter.py +10 -5
  45. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/test_queue.py +1 -4
  46. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/.dependency_cache +0 -0
  47. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/.mpm_deployment_state +0 -0
  48. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/agent-manager.md +0 -0
  49. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/agentic-coder-optimizer.md +0 -0
  50. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/api_qa.md +0 -0
  51. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/clerk-ops.md +0 -0
  52. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/code_analyzer.md +0 -0
  53. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/content-agent.md +0 -0
  54. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/dart_engineer.md +0 -0
  55. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/data_engineer.md +0 -0
  56. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/documentation.md +0 -0
  57. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/engineer.md +0 -0
  58. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/gcp_ops_agent.md +0 -0
  59. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/golang_engineer.md +0 -0
  60. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/imagemagick.md +0 -0
  61. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/java_engineer.md +0 -0
  62. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/local_ops_agent.md +0 -0
  63. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/memory_manager.md +0 -0
  64. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/nextjs_engineer.md +0 -0
  65. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/ops.md +0 -0
  66. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/php-engineer.md +0 -0
  67. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/product_owner.md +0 -0
  68. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/project_organizer.md +0 -0
  69. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/prompt-engineer.md +0 -0
  70. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/python_engineer.md +0 -0
  71. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/qa.md +0 -0
  72. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/react_engineer.md +0 -0
  73. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/refactoring_engineer.md +0 -0
  74. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/research.md +0 -0
  75. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/ruby-engineer.md +0 -0
  76. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/rust_engineer.md +0 -0
  77. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/security.md +0 -0
  78. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/ticketing.md +0 -0
  79. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/typescript_engineer.md +0 -0
  80. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/vercel_ops_agent.md +0 -0
  81. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/version_control.md +0 -0
  82. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/web_qa.md +0 -0
  83. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/agents/web_ui.md +0 -0
  84. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude/mcp.json +0 -0
  85. mcp_ticketer-0.1.21/.mcp/config.json → mcp_ticketer-0.1.22/.claude/mcp.local.json +0 -0
  86. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/config/project.json +0 -0
  87. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/mcp_auto_config_preference.json +0 -0
  88. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/README.md +0 -0
  89. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
  90. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/documentation_memories.md +0 -0
  91. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/engineer_memories.md +0 -0
  92. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/ops_memories.md +0 -0
  93. mcp_ticketer-0.1.21/.claude-mpm/memories/project_knowledge.md → mcp_ticketer-0.1.22/.claude-mpm/memories/project_knowledge_memories.md +0 -0
  94. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/qa_memories.md +0 -0
  95. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/research_memories.md +0 -0
  96. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude-mpm/memories/version-control_memories.md +0 -0
  97. mcp_ticketer-0.1.21/.claude-mpm/memories/workflows.md → mcp_ticketer-0.1.22/.claude-mpm/memories/workflows_memories.md +0 -0
  98. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.claude.json +0 -0
  99. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.coveragerc +0 -0
  100. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.env.example +0 -0
  101. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.github/workflows/docs.yml +0 -0
  102. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.github/workflows/publish.yml +0 -0
  103. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.github/workflows/test.yml +0 -0
  104. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.pre-commit-config.yaml +0 -0
  105. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.python-version +0 -0
  106. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/.readthedocs.yaml +0 -0
  107. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CHANGELOG.md +0 -0
  108. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CLAUDE.md +0 -0
  109. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CLAUDE_DESKTOP_SETUP.md +0 -0
  110. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CODE_STRUCTURE.md +0 -0
  111. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CONFIG_RESOLUTION_FIX.md +0 -0
  112. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CONTRIBUTING.md +0 -0
  113. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/CREDENTIAL_VALIDATION_FIX.md +0 -0
  114. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/ENV_DISCOVERY_COMPLETE.md +0 -0
  115. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/FIX_SUMMARY.md +0 -0
  116. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  117. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/IMPLEMENTATION_SUMMARY.md +0 -0
  118. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/JIRA_SETUP.md +0 -0
  119. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/LICENSE +0 -0
  120. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/LINEAR_SETUP.md +0 -0
  121. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/MANIFEST.in +0 -0
  122. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/Makefile +0 -0
  123. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/OPTIMIZATION_SUMMARY.md +0 -0
  124. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  125. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/QUEUE_SYSTEM.md +0 -0
  126. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/QUICK_START.md +0 -0
  127. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/README.md +0 -0
  128. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/RELEASE.md +0 -0
  129. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/RELEASING.md +0 -0
  130. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/TEST_COVERAGE_REPORT.md +0 -0
  131. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/TEST_REPORT.md +0 -0
  132. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/TEST_RESULTS_SUMMARY.md +0 -0
  133. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/VERIFICATION_RESULTS.md +0 -0
  134. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/claude-desktop-config.json +0 -0
  135. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/debug_search.py +0 -0
  136. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/debug_test.py +0 -0
  137. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/ADAPTERS.md +0 -0
  138. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/API_REFERENCE.md +0 -0
  139. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/CONFIGURATION.md +0 -0
  140. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  141. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/DEVELOPER_GUIDE.md +0 -0
  142. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/ENV_DISCOVERY.md +0 -0
  143. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/MCP_INTEGRATION.md +0 -0
  144. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/MIGRATION_GUIDE.md +0 -0
  145. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/PROJECT_CONFIG.md +0 -0
  146. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/PR_INTEGRATION.md +0 -0
  147. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/QUICK_START_ENV.md +0 -0
  148. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/USER_GUIDE.md +0 -0
  149. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_archive/README.md +0 -0
  150. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  151. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  152. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  153. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  154. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  155. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  156. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  157. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/adapters/github.md.txt +0 -0
  158. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/adapters.rst.txt +0 -0
  159. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/api.rst.txt +0 -0
  160. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/cli.rst.txt +0 -0
  161. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/development.rst.txt +0 -0
  162. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/examples.rst.txt +0 -0
  163. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/index.rst.txt +0 -0
  164. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/installation.rst.txt +0 -0
  165. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  166. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/adapters/github.md +0 -0
  167. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/adapters.rst +0 -0
  168. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/api.rst +0 -0
  169. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/cli.rst +0 -0
  170. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/conf.py +0 -0
  171. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/development.rst +0 -0
  172. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/examples.rst +0 -0
  173. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/index.rst +0 -0
  174. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/installation.rst +0 -0
  175. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/prd/mcp-ticketer-prd.md +0 -0
  176. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/docs/requirements.txt +0 -0
  177. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/install.sh +0 -0
  178. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/mcp-ticketer +0 -0
  179. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/mcp-ticketer-server +0 -0
  180. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/mcp_server.sh +0 -0
  181. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/pytest.ini +0 -0
  182. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/requirements-dev.txt +0 -0
  183. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/requirements.txt +0 -0
  184. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/scripts/README.md +0 -0
  185. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/scripts/manage_version.py +0 -0
  186. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/setup.cfg +0 -0
  187. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/setup.py +0 -0
  188. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer/py.typed +0 -0
  189. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  190. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  191. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  192. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  193. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  194. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test-tickets/tickets/task-20250924002724.json +0 -0
  195. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_all_adapters.py +0 -0
  196. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_api_usage.py +0 -0
  197. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_basic.py +0 -0
  198. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_comprehensive.py +0 -0
  199. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_config_resolution.py +0 -0
  200. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_credential_validation.py +0 -0
  201. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_error_handling.py +0 -0
  202. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_github.py +0 -0
  203. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_github_token.py +0 -0
  204. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_jira.py +0 -0
  205. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_linear.py +0 -0
  206. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_linear_native.py +0 -0
  207. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_linear_teams.py +0 -0
  208. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_mcp_server_qa.py +0 -0
  209. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_optimizations.py +0 -0
  210. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_performance.py +0 -0
  211. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_pr_functionality.py +0 -0
  212. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_queue_system.py +0 -0
  213. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_serve_config.py +0 -0
  214. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/test_set_command.sh +0 -0
  215. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/adapters/__init__.py +0 -0
  216. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tests/test_models.py +3 -3
  217. {mcp_ticketer-0.1.21 → mcp_ticketer-0.1.22}/tox.ini +0 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "mcp-ticketer": {
4
+ "command": "/Users/masa/Projects/mcp-ticketer/.venv/bin/mcp-ticketer",
5
+ "args": ["serve"],
6
+ "cwd": "/Users/masa/Projects/mcp-ticketer",
7
+ "env": {
8
+ "PYTHONPATH": "/Users/masa/Projects/mcp-ticketer/src"
9
+ }
10
+ }
11
+ }
12
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.1.21
3
+ Version: 0.1.22
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>
@@ -148,7 +148,7 @@ extend-exclude = '''
148
148
  '''
149
149
 
150
150
  [tool.ruff]
151
- target-version = "0.1.21"
151
+ target-version = "0.1.22"
152
152
  line-length = 88
153
153
 
154
154
  [tool.ruff.lint]
@@ -1,16 +1,16 @@
1
1
  """MCP Ticketer - Universal ticket management interface."""
2
2
 
3
3
  from .__version__ import (
4
- __version__,
5
- __version_info__,
6
- __title__,
7
- __description__,
8
4
  __author__,
9
5
  __author_email__,
10
- __license__,
11
6
  __copyright__,
12
- get_version,
7
+ __description__,
8
+ __license__,
9
+ __title__,
10
+ __version__,
11
+ __version_info__,
13
12
  get_user_agent,
13
+ get_version,
14
14
  )
15
15
 
16
16
  __all__ = [
@@ -24,4 +24,4 @@ __all__ = [
24
24
  "__copyright__",
25
25
  "get_version",
26
26
  "get_user_agent",
27
- ]
27
+ ]
@@ -1,6 +1,6 @@
1
1
  """Version information for mcp-ticketer package."""
2
2
 
3
- __version__ = "0.1.21"
3
+ __version__ = "0.1.22"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
@@ -26,6 +26,7 @@ __features__ = {
26
26
  "queue_system": True,
27
27
  }
28
28
 
29
+
29
30
  def get_version():
30
31
  """Return the full version string with build metadata if available."""
31
32
  version = __version__
@@ -35,6 +36,7 @@ def get_version():
35
36
  version += f".{__commit__[:7]}"
36
37
  return version
37
38
 
39
+
38
40
  def get_user_agent():
39
41
  """Return a user agent string for API requests."""
40
- return f"{__title__}/{__version__}"
42
+ return f"{__title__}/{__version__}"
@@ -1,15 +1,15 @@
1
1
  """Adapter implementations for various ticket systems."""
2
2
 
3
3
  from .aitrackdown import AITrackdownAdapter
4
- from .linear import LinearAdapter
5
- from .jira import JiraAdapter
6
4
  from .github import GitHubAdapter
7
5
  from .hybrid import HybridAdapter
6
+ from .jira import JiraAdapter
7
+ from .linear import LinearAdapter
8
8
 
9
9
  __all__ = [
10
10
  "AITrackdownAdapter",
11
11
  "LinearAdapter",
12
12
  "JiraAdapter",
13
13
  "GitHubAdapter",
14
- "HybridAdapter"
15
- ]
14
+ "HybridAdapter",
15
+ ]
@@ -1,17 +1,19 @@
1
1
  """AI-Trackdown adapter implementation."""
2
2
 
3
3
  import json
4
- from pathlib import Path
5
- from typing import List, Optional, Dict, Any, Union
6
4
  from datetime import datetime
5
+ from pathlib import Path
6
+ from typing import Any, Dict, List, Optional, Union
7
7
 
8
8
  from ..core.adapter import BaseAdapter
9
- from ..core.models import Epic, Task, Comment, SearchQuery, TicketState, Priority
9
+ from ..core.models import Comment, Epic, Priority, SearchQuery, Task, TicketState
10
10
  from ..core.registry import AdapterRegistry
11
11
 
12
12
  # Import ai-trackdown-pytools when available
13
13
  try:
14
- from ai_trackdown_pytools import AITrackdown, Ticket as AITicket
14
+ from ai_trackdown_pytools import AITrackdown
15
+ from ai_trackdown_pytools import Ticket as AITicket
16
+
15
17
  HAS_AITRACKDOWN = True
16
18
  except ImportError:
17
19
  HAS_AITRACKDOWN = False
@@ -27,6 +29,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
27
29
 
28
30
  Args:
29
31
  config: Configuration with 'base_path' for tickets directory
32
+
30
33
  """
31
34
  super().__init__(config)
32
35
  self.base_path = Path(config.get("base_path", ".aitrackdown"))
@@ -47,6 +50,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
47
50
 
48
51
  Returns:
49
52
  (is_valid, error_message) - Always returns (True, "") for AITrackdown
53
+
50
54
  """
51
55
  # AITrackdown is file-based and doesn't require API credentials
52
56
  # Just verify the base_path is accessible
@@ -92,10 +96,16 @@ class AITrackdownAdapter(BaseAdapter[Task]):
92
96
  parent_issue=ai_ticket.get("parent_issue"),
93
97
  parent_epic=ai_ticket.get("parent_epic"),
94
98
  assignee=ai_ticket.get("assignee"),
95
- created_at=datetime.fromisoformat(ai_ticket["created_at"])
96
- if "created_at" in ai_ticket else None,
97
- updated_at=datetime.fromisoformat(ai_ticket["updated_at"])
98
- if "updated_at" in ai_ticket else None,
99
+ created_at=(
100
+ datetime.fromisoformat(ai_ticket["created_at"])
101
+ if "created_at" in ai_ticket
102
+ else None
103
+ ),
104
+ updated_at=(
105
+ datetime.fromisoformat(ai_ticket["updated_at"])
106
+ if "updated_at" in ai_ticket
107
+ else None
108
+ ),
99
109
  metadata={"ai_trackdown": ai_ticket},
100
110
  )
101
111
 
@@ -109,10 +119,16 @@ class AITrackdownAdapter(BaseAdapter[Task]):
109
119
  priority=self._priority_from_ai(ai_ticket.get("priority", "medium")),
110
120
  tags=ai_ticket.get("tags", []),
111
121
  child_issues=ai_ticket.get("child_issues", []),
112
- created_at=datetime.fromisoformat(ai_ticket["created_at"])
113
- if "created_at" in ai_ticket and ai_ticket["created_at"] else None,
114
- updated_at=datetime.fromisoformat(ai_ticket["updated_at"])
115
- if "updated_at" in ai_ticket and ai_ticket["updated_at"] else None,
122
+ created_at=(
123
+ datetime.fromisoformat(ai_ticket["created_at"])
124
+ if "created_at" in ai_ticket and ai_ticket["created_at"]
125
+ else None
126
+ ),
127
+ updated_at=(
128
+ datetime.fromisoformat(ai_ticket["updated_at"])
129
+ if "updated_at" in ai_ticket and ai_ticket["updated_at"]
130
+ else None
131
+ ),
116
132
  metadata={"ai_trackdown": ai_ticket},
117
133
  )
118
134
 
@@ -124,7 +140,9 @@ class AITrackdownAdapter(BaseAdapter[Task]):
124
140
  state_value = self._get_state_mapping()[task.state]
125
141
  elif isinstance(task.state, str):
126
142
  # Already a string, map to AI-Trackdown format if needed
127
- state_value = task.state.replace('_', '-') # Convert snake_case to kebab-case
143
+ state_value = task.state.replace(
144
+ "_", "-"
145
+ ) # Convert snake_case to kebab-case
128
146
 
129
147
  return {
130
148
  "id": task.id,
@@ -149,7 +167,9 @@ class AITrackdownAdapter(BaseAdapter[Task]):
149
167
  state_value = self._get_state_mapping()[epic.state]
150
168
  elif isinstance(epic.state, str):
151
169
  # Already a string, map to AI-Trackdown format if needed
152
- state_value = epic.state.replace('_', '-') # Convert snake_case to kebab-case
170
+ state_value = epic.state.replace(
171
+ "_", "-"
172
+ ) # Convert snake_case to kebab-case
153
173
 
154
174
  return {
155
175
  "id": epic.id,
@@ -168,7 +188,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
168
188
  """Read ticket from file system."""
169
189
  ticket_file = self.tickets_dir / f"{ticket_id}.json"
170
190
  if ticket_file.exists():
171
- with open(ticket_file, "r") as f:
191
+ with open(ticket_file) as f:
172
192
  return json.load(f)
173
193
  return None
174
194
 
@@ -230,9 +250,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
230
250
  return None
231
251
 
232
252
  async def update(
233
- self,
234
- ticket_id: str,
235
- updates: Union[Dict[str, Any], Task]
253
+ self, ticket_id: str, updates: Union[Dict[str, Any], Task]
236
254
  ) -> Optional[Task]:
237
255
  """Update a task."""
238
256
  # Read existing ticket
@@ -244,7 +262,11 @@ class AITrackdownAdapter(BaseAdapter[Task]):
244
262
  if isinstance(updates, Task):
245
263
  # If updates is a Task object, copy all fields except frozen ones
246
264
  for field in updates.__fields__:
247
- if field not in ['ticket_type'] and hasattr(updates, field) and getattr(updates, field) is not None:
265
+ if (
266
+ field not in ["ticket_type"]
267
+ and hasattr(updates, field)
268
+ and getattr(updates, field) is not None
269
+ ):
248
270
  setattr(existing, field, getattr(updates, field))
249
271
  else:
250
272
  # If updates is a dictionary
@@ -275,10 +297,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
275
297
  return False
276
298
 
277
299
  async def list(
278
- self,
279
- limit: int = 10,
280
- offset: int = 0,
281
- filters: Optional[Dict[str, Any]] = None
300
+ self, limit: int = 10, offset: int = 0, filters: Optional[Dict[str, Any]] = None
282
301
  ) -> List[Task]:
283
302
  """List tasks with pagination."""
284
303
  tasks = []
@@ -295,7 +314,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
295
314
  # Direct file operation - read all files, filter, then paginate
296
315
  ticket_files = sorted(self.tickets_dir.glob("*.json"))
297
316
  for ticket_file in ticket_files:
298
- with open(ticket_file, "r") as f:
317
+ with open(ticket_file) as f:
299
318
  ai_ticket = json.load(f)
300
319
  task = self._task_from_ai_ticket(ai_ticket)
301
320
 
@@ -319,7 +338,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
319
338
  tasks.append(task)
320
339
 
321
340
  # Apply pagination after filtering
322
- tasks = tasks[offset:offset + limit]
341
+ tasks = tasks[offset : offset + limit]
323
342
 
324
343
  return tasks
325
344
 
@@ -340,8 +359,10 @@ class AITrackdownAdapter(BaseAdapter[Task]):
340
359
  # Text search in title and description
341
360
  if query.query:
342
361
  search_text = query.query.lower()
343
- if (search_text not in (task.title or "").lower() and
344
- search_text not in (task.description or "").lower()):
362
+ if (
363
+ search_text not in (task.title or "").lower()
364
+ and search_text not in (task.description or "").lower()
365
+ ):
345
366
  continue
346
367
 
347
368
  # Tag filtering
@@ -356,12 +377,10 @@ class AITrackdownAdapter(BaseAdapter[Task]):
356
377
  results.append(task)
357
378
 
358
379
  # Apply pagination
359
- return results[query.offset:query.offset + query.limit]
380
+ return results[query.offset : query.offset + query.limit]
360
381
 
361
382
  async def transition_state(
362
- self,
363
- ticket_id: str,
364
- target_state: TicketState
383
+ self, ticket_id: str, target_state: TicketState
365
384
  ) -> Optional[Task]:
366
385
  """Transition task to new state."""
367
386
  # Validate transition
@@ -390,10 +409,7 @@ class AITrackdownAdapter(BaseAdapter[Task]):
390
409
  return comment
391
410
 
392
411
  async def get_comments(
393
- self,
394
- ticket_id: str,
395
- limit: int = 10,
396
- offset: int = 0
412
+ self, ticket_id: str, limit: int = 10, offset: int = 0
397
413
  ) -> List[Comment]:
398
414
  """Get comments for a task."""
399
415
  comments = []
@@ -401,8 +417,8 @@ class AITrackdownAdapter(BaseAdapter[Task]):
401
417
 
402
418
  if comments_dir.exists():
403
419
  comment_files = sorted(comments_dir.glob("*.json"))
404
- for comment_file in comment_files[offset:offset + limit]:
405
- with open(comment_file, "r") as f:
420
+ for comment_file in comment_files[offset : offset + limit]:
421
+ with open(comment_file) as f:
406
422
  data = json.load(f)
407
423
  if data.get("ticket_id") == ticket_id:
408
424
  comments.append(Comment(**data))
@@ -411,4 +427,4 @@ class AITrackdownAdapter(BaseAdapter[Task]):
411
427
 
412
428
 
413
429
  # Register the adapter
414
- AdapterRegistry.register("aitrackdown", AITrackdownAdapter)
430
+ AdapterRegistry.register("aitrackdown", AITrackdownAdapter)