mcp-ticketer 0.4.5__tar.gz → 0.4.8__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 (290) hide show
  1. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/Makefile +16 -2
  2. {mcp_ticketer-0.4.5/src/mcp_ticketer.egg-info → mcp_ticketer-0.4.8}/PKG-INFO +1 -1
  3. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/pyproject.toml +1 -1
  4. mcp_ticketer-0.4.8/src/mcp_ticketer/__init__.py +18 -0
  5. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/__version__.py +1 -1
  6. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/aitrackdown.py +2 -9
  7. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/github.py +2 -1
  8. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/jira.py +2 -1
  9. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/adapter.py +28 -25
  10. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/client.py +2 -1
  11. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/mappers.py +2 -1
  12. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/adapter_diagnostics.py +4 -2
  13. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/configure.py +3 -9
  14. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/discover.py +2 -6
  15. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/main.py +4 -3
  16. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/__init__.py +2 -1
  17. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/mcp/__init__.py +3 -3
  18. mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/__init__.py +21 -0
  19. mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/__main__.py +60 -0
  20. mcp_ticketer-0.4.5/src/mcp_ticketer/mcp/server.py → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/main.py +15 -35
  21. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/__init__.py +7 -9
  22. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/__init__.py +2 -3
  23. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/manager.py +1 -1
  24. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8/src/mcp_ticketer.egg-info}/PKG-INFO +1 -1
  25. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/SOURCES.txt +16 -13
  26. mcp_ticketer-0.4.8/tests/adapters/linear/test_adapter_validation.py +183 -0
  27. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_client.py +2 -5
  28. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_mappers.py +3 -7
  29. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_queries.py +8 -24
  30. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_types.py +9 -11
  31. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_aitrackdown.py +2 -8
  32. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_github.py +2 -1
  33. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_jira_direct.py +2 -1
  34. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_linear_config.py +0 -1
  35. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_linear_native.py +2 -2
  36. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/cli/test_python_detection.py +3 -5
  37. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/conftest.py +2 -8
  38. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_env_discovery.py +3 -6
  39. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_unified_env_loading.py +2 -5
  40. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_complete_ticket_workflow.py +2 -8
  41. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_all_adapters.py +4 -9
  42. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_commenting_functionality.py +2 -1
  43. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_comprehensive.py +2 -8
  44. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_hierarchy_and_workflow.py +2 -8
  45. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_api_usage.py +2 -1
  46. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_codex_config.py +0 -1
  47. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_models.py +2 -8
  48. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_cache_memory.py +2 -6
  49. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_core_exceptions.py +6 -14
  50. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_core_models.py +2 -9
  51. mcp_ticketer-0.4.5/src/mcp_ticketer/__init__.py +0 -27
  52. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
  53. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
  54. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
  55. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
  56. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
  57. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
  58. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
  59. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
  60. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.claude.json +0 -0
  61. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.coveragerc +0 -0
  62. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.cursor/mcp.json +0 -0
  63. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.env.example +0 -0
  64. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.github/workflows/docs.yml +0 -0
  65. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.github/workflows/publish.yml +0 -0
  66. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.github/workflows/test.yml +0 -0
  67. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.mcp/config.json +0 -0
  68. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.pre-commit-config.yaml +0 -0
  69. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.python-version +0 -0
  70. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/.readthedocs.yaml +0 -0
  71. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CHANGELOG.md +0 -0
  72. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CLAUDE.md +0 -0
  73. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CLI_RESTRUCTURE_REPORT.md +0 -0
  74. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/CLI_RESTRUCTURE_TEST_REPORT.md +0 -0
  75. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/LICENSE +0 -0
  76. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/MANIFEST.in +0 -0
  77. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/PATH_TRAVERSAL_SECURITY_TEST_REPORT.md +0 -0
  78. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/README.md +0 -0
  79. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/SECURITY_RESCAN_REPORT.md +0 -0
  80. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/VERIFICATION_v0.4.3.md +0 -0
  81. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/debug_epic_creation.py +0 -0
  82. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/debug_full_flow.py +0 -0
  83. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/debug_worker_epic.py +0 -0
  84. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/ADAPTERS.md +0 -0
  85. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/AI_CLIENT_INTEGRATION.md +0 -0
  86. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/API_REFERENCE.md +0 -0
  87. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/ATTACHMENTS.md +0 -0
  88. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/CONFIGURATION.md +0 -0
  89. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  90. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/DEVELOPER_GUIDE.md +0 -0
  91. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/ENV_DISCOVERY.md +0 -0
  92. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/MCP_INTEGRATION.md +0 -0
  93. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/MIGRATION_GUIDE.md +0 -0
  94. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/PROJECT_CONFIG.md +0 -0
  95. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/PR_INTEGRATION.md +0 -0
  96. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/QUEUE_SYSTEM.md +0 -0
  97. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/QUICK_START.md +0 -0
  98. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/QUICK_START_ENV.md +0 -0
  99. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/README.md +0 -0
  100. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/USER_GUIDE.md +0 -0
  101. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
  102. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_archive/README.md +0 -0
  103. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  104. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  105. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  106. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  107. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  108. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  109. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  110. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/adapters/github.md.txt +0 -0
  111. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/adapters.rst.txt +0 -0
  112. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/api.rst.txt +0 -0
  113. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/cli.rst.txt +0 -0
  114. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/development.rst.txt +0 -0
  115. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/examples.rst.txt +0 -0
  116. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/index.rst.txt +0 -0
  117. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/installation.rst.txt +0 -0
  118. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  119. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/adapters/github.md +0 -0
  120. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/adapters.rst +0 -0
  121. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/api.rst +0 -0
  122. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
  123. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
  124. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
  125. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/cli.rst +0 -0
  126. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/conf.py +0 -0
  127. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/CODE_STRUCTURE.md +0 -0
  128. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/CONTRIBUTING.md +0 -0
  129. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/RELEASE.md +0 -0
  130. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development/RELEASING.md +0 -0
  131. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/development.rst +0 -0
  132. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/examples.rst +0 -0
  133. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +0 -0
  134. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/index.rst +0 -0
  135. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/installation.rst +0 -0
  136. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/prd/mcp-ticketer-prd.md +0 -0
  137. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
  138. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
  139. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
  140. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
  141. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
  142. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
  143. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
  144. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
  145. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
  146. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
  147. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
  148. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
  149. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/FIX_SUMMARY.md +0 -0
  150. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  151. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
  152. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  153. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
  154. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  155. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
  156. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/TEST_REPORT.md +0 -0
  157. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
  158. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/reports/VERIFICATION_RESULTS.md +0 -0
  159. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/requirements.txt +0 -0
  160. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
  161. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/CODEX_INTEGRATION.md +0 -0
  162. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/JIRA_SETUP.md +0 -0
  163. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/setup/LINEAR_SETUP.md +0 -0
  164. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
  165. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
  166. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
  167. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
  168. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +0 -0
  169. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
  170. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
  171. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
  172. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
  173. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
  174. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/mcp-ticketer +0 -0
  175. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/mcp-ticketer-server +0 -0
  176. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/pytest.ini +0 -0
  177. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/requirements-dev.txt +0 -0
  178. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/requirements.txt +0 -0
  179. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/README.md +0 -0
  180. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/install.sh +0 -0
  181. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/manage_version.py +0 -0
  182. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/mcp_server.sh +0 -0
  183. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/scripts/test_set_command.sh +0 -0
  184. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/setup.cfg +0 -0
  185. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/setup.py +0 -0
  186. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/__init__.py +0 -0
  187. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/hybrid.py +0 -0
  188. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
  189. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
  190. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/types.py +0 -0
  191. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear.py +0 -0
  192. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cache/__init__.py +0 -0
  193. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cache/memory.py +0 -0
  194. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/__init__.py +0 -0
  195. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
  196. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/codex_configure.py +0 -0
  197. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/diagnostics.py +0 -0
  198. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
  199. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/linear_commands.py +0 -0
  200. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
  201. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  202. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/platform_commands.py +0 -0
  203. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/python_detection.py +0 -0
  204. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  205. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/simple_health.py +0 -0
  206. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/ticket_commands.py +0 -0
  207. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/utils.py +0 -0
  208. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/adapter.py +0 -0
  209. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/config.py +0 -0
  210. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/env_discovery.py +0 -0
  211. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/env_loader.py +0 -0
  212. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/exceptions.py +0 -0
  213. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/http_client.py +0 -0
  214. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/mappers.py +0 -0
  215. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/models.py +0 -0
  216. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/project_config.py +0 -0
  217. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/registry.py +0 -0
  218. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/mcp/__main__.py +0 -0
  219. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/constants.py +0 -0
  220. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/dto.py +0 -0
  221. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/response_builder.py +0 -0
  222. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/server_sdk.py +0 -0
  223. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/attachment_tools.py +0 -0
  224. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/bulk_tools.py +0 -0
  225. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/comment_tools.py +0 -0
  226. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/hierarchy_tools.py +0 -0
  227. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/pr_tools.py +0 -0
  228. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/search_tools.py +0 -0
  229. {mcp_ticketer-0.4.5/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/ticket_tools.py +0 -0
  230. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/py.typed +0 -0
  231. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/__main__.py +0 -0
  232. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/health_monitor.py +0 -0
  233. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/queue.py +0 -0
  234. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/run_worker.py +0 -0
  235. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
  236. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/worker.py +0 -0
  237. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  238. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  239. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  240. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  241. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  242. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/test-tickets/tickets/task-20250924002724.json +0 -0
  243. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/test_linear_fixes.py +0 -0
  244. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/test_worker_persistence.py +0 -0
  245. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/README.md +0 -0
  246. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/__init__.py +0 -0
  247. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/__init__.py +0 -0
  248. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_adapter.py +0 -0
  249. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_aitrackdown_security.py +0 -0
  250. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_github_token.py +0 -0
  251. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_jira.py +0 -0
  252. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_jira_projects.py +0 -0
  253. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/adapters/test_linear.py +0 -0
  254. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/debug_credential_validation.py +0 -0
  255. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_actual_worker_execution.py +0 -0
  256. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_config_resolution.py +0 -0
  257. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_environment_handoff.py +0 -0
  258. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_queue_processing.py +0 -0
  259. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/core/test_queue_system.py +0 -0
  260. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_adapter_cache.py +0 -0
  261. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_cli_config.py +0 -0
  262. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_cli_vs_simulation.py +0 -0
  263. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_linear_teams.py +0 -0
  264. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_search.py +0 -0
  265. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_test.py +0 -0
  266. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_adapter.py +0 -0
  267. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_simulation.py +0 -0
  268. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_subprocess.py +0 -0
  269. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_comments_and_attachments.py +0 -0
  270. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_complete_workflow.py +0 -0
  271. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_hierarchy_validation.py +0 -0
  272. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/e2e/test_state_transitions.py +0 -0
  273. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_aitrackdown_commenting.py +0 -0
  274. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_jira_github_adapters.py +0 -0
  275. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_mcp_server_qa.py +0 -0
  276. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_pr_functionality.py +0 -0
  277. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_serve_config.py +0 -0
  278. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/integration/test_user_assignment.py +0 -0
  279. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/performance/test_optimizations.py +0 -0
  280. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/performance/test_performance.py +0 -0
  281. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/run_comprehensive_tests.py +0 -0
  282. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_base_adapter.py +0 -0
  283. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_basic.py +0 -0
  284. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_comprehensive_qa.py +0 -0
  285. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_error_handling.py +0 -0
  286. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_linear_teams.py +0 -0
  287. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/test_queue.py +0 -0
  288. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/__init__.py +0 -0
  289. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tests/unit/test_core_registry.py +0 -0
  290. {mcp_ticketer-0.4.5 → mcp_ticketer-0.4.8}/tox.ini +0 -0
@@ -118,12 +118,26 @@ build: clean-build ## Build distribution packages
118
118
 
119
119
  publish-test: check-release format lint test test-e2e build ## Build and publish to TestPyPI
120
120
  @echo "Publishing to TestPyPI..."
121
- twine upload --repository testpypi dist/*
121
+ @if [ -f .env.local ]; then \
122
+ echo "Loading PyPI credentials from .env.local..."; \
123
+ export $$(grep -E '^(TWINE_USERNAME|TWINE_PASSWORD)=' .env.local | xargs) && \
124
+ twine upload --repository testpypi dist/*; \
125
+ else \
126
+ echo "No .env.local found, using default credentials (~/.pypirc or environment)..."; \
127
+ twine upload --repository testpypi dist/*; \
128
+ fi
122
129
  @echo "Published to TestPyPI!"
123
130
 
124
131
  publish-prod: check-release format lint test test-e2e build ## Build and publish to PyPI
125
132
  @echo "Publishing to PyPI..."
126
- twine upload dist/*
133
+ @if [ -f .env.local ]; then \
134
+ echo "Loading PyPI credentials from .env.local..."; \
135
+ export $$(grep -E '^(TWINE_USERNAME|TWINE_PASSWORD)=' .env.local | xargs) && \
136
+ twine upload dist/*; \
137
+ else \
138
+ echo "No .env.local found, using default credentials (~/.pypirc or environment)..."; \
139
+ twine upload dist/*; \
140
+ fi
127
141
  @echo "Published successfully!"
128
142
 
129
143
  publish: publish-prod ## Alias for publish-prod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.4.5
3
+ Version: 0.4.8
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>
@@ -152,7 +152,7 @@ extend-exclude = '''
152
152
  '''
153
153
 
154
154
  [tool.ruff]
155
- target-version = "0.4.5"
155
+ target-version = "0.4.8"
156
156
  line-length = 88
157
157
 
158
158
  [tool.ruff.lint]
@@ -0,0 +1,18 @@
1
+ """MCP Ticketer - Universal ticket management interface."""
2
+
3
+ from .__version__ import (__author__, __author_email__, __copyright__,
4
+ __description__, __license__, __title__, __version__,
5
+ __version_info__, get_user_agent, get_version)
6
+
7
+ __all__ = [
8
+ "__version__",
9
+ "__version_info__",
10
+ "__title__",
11
+ "__description__",
12
+ "__author__",
13
+ "__author_email__",
14
+ "__license__",
15
+ "__copyright__",
16
+ "get_version",
17
+ "get_user_agent",
18
+ ]
@@ -1,6 +1,6 @@
1
1
  """Version information for mcp-ticketer package."""
2
2
 
3
- __version__ = "0.4.5"
3
+ __version__ = "0.4.8"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
@@ -10,15 +10,8 @@ from typing import Any
10
10
  from ..core.adapter import BaseAdapter
11
11
 
12
12
  logger = logging.getLogger(__name__)
13
- from ..core.models import (
14
- Attachment,
15
- Comment,
16
- Epic,
17
- Priority,
18
- SearchQuery,
19
- Task,
20
- TicketState,
21
- )
13
+ from ..core.models import (Attachment, Comment, Epic, Priority, SearchQuery,
14
+ Task, TicketState)
22
15
  from ..core.registry import AdapterRegistry
23
16
 
24
17
  # Import ai-trackdown-pytools when available
@@ -9,7 +9,8 @@ import httpx
9
9
 
10
10
  from ..core.adapter import BaseAdapter
11
11
  from ..core.env_loader import load_adapter_config, validate_adapter_config
12
- from ..core.models import Comment, Epic, Priority, SearchQuery, Task, TicketState
12
+ from ..core.models import (Comment, Epic, Priority, SearchQuery, Task,
13
+ TicketState)
13
14
  from ..core.registry import AdapterRegistry
14
15
 
15
16
 
@@ -13,7 +13,8 @@ from httpx import AsyncClient, HTTPStatusError, TimeoutException
13
13
 
14
14
  from ..core.adapter import BaseAdapter
15
15
  from ..core.env_loader import load_adapter_config, validate_adapter_config
16
- from ..core.models import Comment, Epic, Priority, SearchQuery, Task, TicketState
16
+ from ..core.models import (Comment, Epic, Priority, SearchQuery, Task,
17
+ TicketState)
17
18
  from ..core.registry import AdapterRegistry
18
19
 
19
20
  logger = logging.getLogger(__name__)
@@ -20,27 +20,15 @@ from ...core.adapter import BaseAdapter
20
20
  from ...core.models import Comment, Epic, SearchQuery, Task, TicketState
21
21
  from ...core.registry import AdapterRegistry
22
22
  from .client import LinearGraphQLClient
23
- from .mappers import (
24
- build_linear_issue_input,
25
- build_linear_issue_update_input,
26
- map_linear_comment_to_comment,
27
- map_linear_issue_to_task,
28
- map_linear_project_to_epic,
29
- )
30
- from .queries import (
31
- ALL_FRAGMENTS,
32
- CREATE_ISSUE_MUTATION,
33
- LIST_ISSUES_QUERY,
34
- SEARCH_ISSUES_QUERY,
35
- UPDATE_ISSUE_MUTATION,
36
- WORKFLOW_STATES_QUERY,
37
- )
38
- from .types import (
39
- LinearStateMapping,
40
- build_issue_filter,
41
- get_linear_priority,
42
- get_linear_state_type,
43
- )
23
+ from .mappers import (build_linear_issue_input,
24
+ build_linear_issue_update_input,
25
+ map_linear_comment_to_comment, map_linear_issue_to_task,
26
+ map_linear_project_to_epic)
27
+ from .queries import (ALL_FRAGMENTS, CREATE_ISSUE_MUTATION, LIST_ISSUES_QUERY,
28
+ SEARCH_ISSUES_QUERY, UPDATE_ISSUE_MUTATION,
29
+ WORKFLOW_STATES_QUERY)
30
+ from .types import (LinearStateMapping, build_issue_filter,
31
+ get_linear_priority, get_linear_state_type)
44
32
 
45
33
 
46
34
  class LinearAdapter(BaseAdapter[Task]):
@@ -94,10 +82,25 @@ class LinearAdapter(BaseAdapter[Task]):
94
82
  "Linear API key is required (api_key or LINEAR_API_KEY env var)"
95
83
  )
96
84
 
97
- # Clean API key - remove Bearer prefix if accidentally included in config
98
- # (The client will add it back when making requests)
99
- if self.api_key.startswith("Bearer "):
100
- self.api_key = self.api_key.replace("Bearer ", "")
85
+ # Clean API key - remove common prefixes if accidentally included in config
86
+ # (The client will add Bearer back when making requests)
87
+ if isinstance(self.api_key, str):
88
+ # Remove Bearer prefix
89
+ if self.api_key.startswith("Bearer "):
90
+ self.api_key = self.api_key.replace("Bearer ", "")
91
+ # Remove environment variable name prefix (e.g., "LINEAR_API_KEY=")
92
+ if "=" in self.api_key:
93
+ parts = self.api_key.split("=", 1)
94
+ if len(parts) == 2 and parts[0].upper() in ("LINEAR_API_KEY", "API_KEY"):
95
+ self.api_key = parts[1]
96
+
97
+ # Validate API key format (Linear keys start with "lin_api_")
98
+ if not self.api_key.startswith("lin_api_"):
99
+ raise ValueError(
100
+ f"Invalid Linear API key format. Expected key starting with 'lin_api_', "
101
+ f"got: {self.api_key[:15]}... "
102
+ f"Please check your configuration and ensure the API key is correct."
103
+ )
101
104
 
102
105
  self.workspace = config.get("workspace", "")
103
106
  self.team_key = config.get("team_key")
@@ -16,7 +16,8 @@ except ImportError:
16
16
  HTTPXAsyncTransport = None
17
17
  TransportError = Exception
18
18
 
19
- from ...core.exceptions import AdapterError, AuthenticationError, RateLimitError
19
+ from ...core.exceptions import (AdapterError, AuthenticationError,
20
+ RateLimitError)
20
21
 
21
22
 
22
23
  class LinearGraphQLClient:
@@ -6,7 +6,8 @@ from datetime import datetime
6
6
  from typing import Any
7
7
 
8
8
  from ...core.models import Comment, Epic, Priority, Task, TicketState
9
- from .types import extract_linear_metadata, get_universal_priority, get_universal_state
9
+ from .types import (extract_linear_metadata, get_universal_priority,
10
+ get_universal_state)
10
11
 
11
12
 
12
13
  def map_linear_issue_to_task(issue_data: dict[str, Any]) -> Task:
@@ -197,7 +197,8 @@ def _test_adapter_instantiation(console: Console) -> None:
197
197
  if primary:
198
198
  adapter_type = primary.adapter_type
199
199
  # Build config from discovery
200
- from ..mcp.server import _build_adapter_config_from_env_vars
200
+ from ..mcp.server import \
201
+ _build_adapter_config_from_env_vars
201
202
 
202
203
  config = _build_adapter_config_from_env_vars(adapter_type, {})
203
204
  else:
@@ -384,7 +385,8 @@ def get_adapter_status() -> dict[str, Any]:
384
385
  adapter_type = primary.adapter_type
385
386
  status["configuration_source"] = primary.found_in
386
387
  # Build basic config
387
- from ..mcp.server import _build_adapter_config_from_env_vars
388
+ from ..mcp.server import \
389
+ _build_adapter_config_from_env_vars
388
390
 
389
391
  config = _build_adapter_config_from_env_vars(adapter_type, {})
390
392
  else:
@@ -8,15 +8,9 @@ from rich.panel import Panel
8
8
  from rich.prompt import Confirm, Prompt
9
9
  from rich.table import Table
10
10
 
11
- from ..core.project_config import (
12
- AdapterConfig,
13
- AdapterType,
14
- ConfigResolver,
15
- ConfigValidator,
16
- HybridConfig,
17
- SyncStrategy,
18
- TicketerConfig,
19
- )
11
+ from ..core.project_config import (AdapterConfig, AdapterType, ConfigResolver,
12
+ ConfigValidator, HybridConfig, SyncStrategy,
13
+ TicketerConfig)
20
14
 
21
15
  console = Console()
22
16
 
@@ -6,12 +6,8 @@ import typer
6
6
  from rich.console import Console
7
7
 
8
8
  from ..core.env_discovery import DiscoveredAdapter, EnvDiscovery
9
- from ..core.project_config import (
10
- AdapterConfig,
11
- ConfigResolver,
12
- ConfigValidator,
13
- TicketerConfig,
14
- )
9
+ from ..core.project_config import (AdapterConfig, ConfigResolver,
10
+ ConfigValidator, TicketerConfig)
15
11
 
16
12
  console = Console()
17
13
  app = typer.Typer(help="Auto-discover configuration from .env files")
@@ -20,7 +20,8 @@ from ..core.models import Comment, SearchQuery
20
20
  from ..queue import Queue, QueueStatus, WorkerManager
21
21
  from ..queue.health_monitor import HealthStatus, QueueHealthMonitor
22
22
  from ..queue.ticket_registry import TicketRegistry
23
- from .configure import configure_wizard, set_adapter_config, show_current_config
23
+ from .configure import (configure_wizard, set_adapter_config,
24
+ show_current_config)
24
25
  from .diagnostics import run_diagnostics
25
26
  from .discover import app as discover_app
26
27
  from .migrate_config import migrate_config_command
@@ -575,7 +576,7 @@ def init(
575
576
  )
576
577
 
577
578
  # First try our improved .env configuration loader
578
- from ..mcp.server import _load_env_configuration
579
+ from ..mcp.server.main import _load_env_configuration
579
580
 
580
581
  env_config = _load_env_configuration()
581
582
 
@@ -2225,7 +2226,7 @@ def mcp_serve(
2225
2226
  adapter_config = adapters_config.get(adapter_type, {})
2226
2227
  else:
2227
2228
  # Priority 2: .env files
2228
- from ..mcp.server import _load_env_configuration
2229
+ from ..mcp.server.main import _load_env_configuration
2229
2230
 
2230
2231
  env_config = _load_env_configuration()
2231
2232
  if env_config:
@@ -1,7 +1,8 @@
1
1
  """Core models and abstractions for MCP Ticketer."""
2
2
 
3
3
  from .adapter import BaseAdapter
4
- from .models import Attachment, Comment, Epic, Priority, Task, TicketState, TicketType
4
+ from .models import (Attachment, Comment, Epic, Priority, Task, TicketState,
5
+ TicketType)
5
6
  from .registry import AdapterRegistry
6
7
 
7
8
  __all__ = [
@@ -3,7 +3,7 @@
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  if TYPE_CHECKING:
6
- from .server import MCPTicketServer
6
+ from .server.main import MCPTicketServer
7
7
 
8
8
  __all__ = ["MCPTicketServer"]
9
9
 
@@ -23,11 +23,11 @@ def __getattr__(name: str):
23
23
  This prevents the RuntimeWarning when running:
24
24
  python -m mcp_ticketer.mcp.server
25
25
 
26
- The warning occurred because __init__.py imported server.py before
26
+ The warning occurred because __init__.py imported server before
27
27
  runpy could execute it as __main__.
28
28
  """
29
29
  if name == "MCPTicketServer":
30
- from .server import MCPTicketServer
30
+ from .server.main import MCPTicketServer
31
31
 
32
32
  return MCPTicketServer
33
33
  raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
@@ -0,0 +1,21 @@
1
+ """MCP Server package for mcp-ticketer.
2
+
3
+ This package provides the FastMCP server implementation for ticket management
4
+ operations via the Model Context Protocol (MCP).
5
+ """
6
+
7
+ from typing import TYPE_CHECKING
8
+
9
+ if TYPE_CHECKING:
10
+ from .main import main
11
+
12
+ __all__ = ["main"]
13
+
14
+
15
+ def __getattr__(name: str):
16
+ """Lazy import to avoid premature module loading."""
17
+ if name == "main":
18
+ from .main import main
19
+
20
+ return main
21
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
@@ -0,0 +1,60 @@
1
+ """Main entry point for MCP server module invocation.
2
+
3
+ This module enables running the MCP server via:
4
+ python -m mcp_ticketer.mcp.server [project_path]
5
+
6
+ This is the preferred invocation method for MCP configurations as it:
7
+ - Works reliably across installation methods (pipx, pip, uv)
8
+ - Doesn't depend on binary path detection
9
+ - Follows the proven mcp-vector-search pattern
10
+ """
11
+
12
+ import asyncio
13
+ import sys
14
+ from pathlib import Path
15
+
16
+ from .main import main
17
+
18
+
19
+ def run_server() -> None:
20
+ """Run the MCP server with optional project path argument.
21
+
22
+ Usage:
23
+ python -m mcp_ticketer.mcp.server
24
+ python -m mcp_ticketer.mcp.server /path/to/project
25
+
26
+ Arguments:
27
+ project_path (optional): Path to project directory for context
28
+
29
+ """
30
+ # Check for project path argument
31
+ if len(sys.argv) > 1:
32
+ project_path = Path(sys.argv[1])
33
+
34
+ # Validate project path exists
35
+ if not project_path.exists():
36
+ sys.stderr.write(f"Error: Project path does not exist: {project_path}\n")
37
+ sys.exit(1)
38
+
39
+ # Change to project directory for context
40
+ try:
41
+ import os
42
+
43
+ os.chdir(project_path)
44
+ sys.stderr.write(f"[MCP Server] Working directory: {project_path}\n")
45
+ except OSError as e:
46
+ sys.stderr.write(f"Warning: Could not change to project directory: {e}\n")
47
+
48
+ # Run the async main function
49
+ try:
50
+ asyncio.run(main())
51
+ except KeyboardInterrupt:
52
+ sys.stderr.write("\n[MCP Server] Interrupted by user\n")
53
+ sys.exit(0)
54
+ except Exception as e:
55
+ sys.stderr.write(f"[MCP Server] Fatal error: {e}\n")
56
+ sys.exit(1)
57
+
58
+
59
+ if __name__ == "__main__":
60
+ run_server()
@@ -11,41 +11,21 @@ from dotenv import load_dotenv
11
11
  # Import adapters module to trigger registration
12
12
  import mcp_ticketer.adapters # noqa: F401
13
13
 
14
- from ..core import AdapterRegistry
15
- from ..core.models import Comment, Epic, Priority, SearchQuery, Task, TicketState
16
- from .constants import (
17
- DEFAULT_BASE_PATH,
18
- DEFAULT_LIMIT,
19
- DEFAULT_MAX_DEPTH,
20
- DEFAULT_OFFSET,
21
- ERROR_INTERNAL,
22
- ERROR_METHOD_NOT_FOUND,
23
- ERROR_PARSE,
24
- JSONRPC_VERSION,
25
- MCP_PROTOCOL_VERSION,
26
- MSG_EPIC_NOT_FOUND,
27
- MSG_INTERNAL_ERROR,
28
- MSG_MISSING_TICKET_ID,
29
- MSG_MISSING_TITLE,
30
- MSG_NO_TICKETS_PROVIDED,
31
- MSG_NO_UPDATES_PROVIDED,
32
- MSG_TICKET_NOT_FOUND,
33
- MSG_TRANSITION_FAILED,
34
- MSG_UNKNOWN_METHOD,
35
- MSG_UNKNOWN_OPERATION,
36
- MSG_UPDATE_FAILED,
37
- SERVER_NAME,
38
- SERVER_VERSION,
39
- STATUS_COMPLETED,
40
- STATUS_ERROR,
41
- )
42
- from .dto import (
43
- CreateEpicRequest,
44
- CreateIssueRequest,
45
- CreateTaskRequest,
46
- CreateTicketRequest,
47
- ReadTicketRequest,
48
- )
14
+ from ...core import AdapterRegistry
15
+ from ...core.models import (Comment, Epic, Priority, SearchQuery, Task,
16
+ TicketState)
17
+ from .constants import (DEFAULT_BASE_PATH, DEFAULT_LIMIT, DEFAULT_MAX_DEPTH,
18
+ DEFAULT_OFFSET, ERROR_INTERNAL, ERROR_METHOD_NOT_FOUND,
19
+ ERROR_PARSE, JSONRPC_VERSION, MCP_PROTOCOL_VERSION,
20
+ MSG_EPIC_NOT_FOUND, MSG_INTERNAL_ERROR,
21
+ MSG_MISSING_TICKET_ID, MSG_MISSING_TITLE,
22
+ MSG_NO_TICKETS_PROVIDED, MSG_NO_UPDATES_PROVIDED,
23
+ MSG_TICKET_NOT_FOUND, MSG_TRANSITION_FAILED,
24
+ MSG_UNKNOWN_METHOD, MSG_UNKNOWN_OPERATION,
25
+ MSG_UPDATE_FAILED, SERVER_NAME, SERVER_VERSION,
26
+ STATUS_COMPLETED, STATUS_ERROR)
27
+ from .dto import (CreateEpicRequest, CreateIssueRequest, CreateTaskRequest,
28
+ CreateTicketRequest, ReadTicketRequest)
49
29
  from .response_builder import ResponseBuilder
50
30
 
51
31
  # Load environment variables early (prioritize .env.local)
@@ -17,15 +17,13 @@ Modules:
17
17
 
18
18
  # Import all tool modules to register them with FastMCP
19
19
  # Order matters - import core functionality first
20
- from . import (
21
- attachment_tools, # noqa: F401
22
- bulk_tools, # noqa: F401
23
- comment_tools, # noqa: F401
24
- hierarchy_tools, # noqa: F401
25
- pr_tools, # noqa: F401
26
- search_tools, # noqa: F401
27
- ticket_tools, # noqa: F401
28
- )
20
+ from . import attachment_tools # noqa: F401
21
+ from . import bulk_tools # noqa: F401
22
+ from . import comment_tools # noqa: F401
23
+ from . import hierarchy_tools # noqa: F401
24
+ from . import pr_tools # noqa: F401
25
+ from . import search_tools # noqa: F401
26
+ from . import ticket_tools # noqa: F401
29
27
 
30
28
  __all__ = [
31
29
  "ticket_tools",
@@ -1,9 +1,8 @@
1
1
  """Async queue system for mcp-ticketer."""
2
2
 
3
- from .queue import Queue, QueueItem, QueueStatus
4
- from .worker import Worker
5
-
6
3
  # Import manager last to avoid circular import
7
4
  from .manager import WorkerManager
5
+ from .queue import Queue, QueueItem, QueueStatus
6
+ from .worker import Worker
8
7
 
9
8
  __all__ = ["Queue", "QueueItem", "QueueStatus", "Worker", "WorkerManager"]
@@ -11,7 +11,7 @@ from typing import TYPE_CHECKING, Any
11
11
  import psutil
12
12
 
13
13
  if TYPE_CHECKING:
14
- from .queue import Queue
14
+ pass
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.4.5
3
+ Version: 0.4.8
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>
@@ -191,19 +191,21 @@ src/mcp_ticketer/core/project_config.py
191
191
  src/mcp_ticketer/core/registry.py
192
192
  src/mcp_ticketer/mcp/__init__.py
193
193
  src/mcp_ticketer/mcp/__main__.py
194
- src/mcp_ticketer/mcp/constants.py
195
- src/mcp_ticketer/mcp/dto.py
196
- src/mcp_ticketer/mcp/response_builder.py
197
- src/mcp_ticketer/mcp/server.py
198
- src/mcp_ticketer/mcp/server_sdk.py
199
- src/mcp_ticketer/mcp/tools/__init__.py
200
- src/mcp_ticketer/mcp/tools/attachment_tools.py
201
- src/mcp_ticketer/mcp/tools/bulk_tools.py
202
- src/mcp_ticketer/mcp/tools/comment_tools.py
203
- src/mcp_ticketer/mcp/tools/hierarchy_tools.py
204
- src/mcp_ticketer/mcp/tools/pr_tools.py
205
- src/mcp_ticketer/mcp/tools/search_tools.py
206
- src/mcp_ticketer/mcp/tools/ticket_tools.py
194
+ src/mcp_ticketer/mcp/server/__init__.py
195
+ src/mcp_ticketer/mcp/server/__main__.py
196
+ src/mcp_ticketer/mcp/server/constants.py
197
+ src/mcp_ticketer/mcp/server/dto.py
198
+ src/mcp_ticketer/mcp/server/main.py
199
+ src/mcp_ticketer/mcp/server/response_builder.py
200
+ src/mcp_ticketer/mcp/server/server_sdk.py
201
+ src/mcp_ticketer/mcp/server/tools/__init__.py
202
+ src/mcp_ticketer/mcp/server/tools/attachment_tools.py
203
+ src/mcp_ticketer/mcp/server/tools/bulk_tools.py
204
+ src/mcp_ticketer/mcp/server/tools/comment_tools.py
205
+ src/mcp_ticketer/mcp/server/tools/hierarchy_tools.py
206
+ src/mcp_ticketer/mcp/server/tools/pr_tools.py
207
+ src/mcp_ticketer/mcp/server/tools/search_tools.py
208
+ src/mcp_ticketer/mcp/server/tools/ticket_tools.py
207
209
  src/mcp_ticketer/queue/__init__.py
208
210
  src/mcp_ticketer/queue/__main__.py
209
211
  src/mcp_ticketer/queue/health_monitor.py
@@ -238,6 +240,7 @@ tests/adapters/test_linear_config.py
238
240
  tests/adapters/test_linear_native.py
239
241
  tests/adapters/linear/__init__.py
240
242
  tests/adapters/linear/test_adapter.py
243
+ tests/adapters/linear/test_adapter_validation.py
241
244
  tests/adapters/linear/test_client.py
242
245
  tests/adapters/linear/test_mappers.py
243
246
  tests/adapters/linear/test_queries.py