mcp-ticketer 0.4.4__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 (291) hide show
  1. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/Makefile +16 -2
  2. {mcp_ticketer-0.4.4/src/mcp_ticketer.egg-info → mcp_ticketer-0.4.8}/PKG-INFO +13 -4
  3. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/README.md +12 -3
  4. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/AI_CLIENT_INTEGRATION.md +63 -21
  5. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/MIGRATION_GUIDE.md +91 -9
  6. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/QUICK_START.md +33 -0
  7. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/pyproject.toml +1 -1
  8. mcp_ticketer-0.4.8/src/mcp_ticketer/__init__.py +18 -0
  9. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/__version__.py +1 -1
  10. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/aitrackdown.py +2 -9
  11. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/github.py +2 -1
  12. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/jira.py +2 -1
  13. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/adapter.py +28 -25
  14. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/client.py +2 -1
  15. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/mappers.py +2 -1
  16. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/adapter_diagnostics.py +4 -2
  17. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/auggie_configure.py +35 -15
  18. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/codex_configure.py +38 -31
  19. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/configure.py +3 -9
  20. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/discover.py +2 -6
  21. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/gemini_configure.py +38 -25
  22. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/main.py +4 -3
  23. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/mcp_configure.py +115 -78
  24. mcp_ticketer-0.4.8/src/mcp_ticketer/cli/python_detection.py +126 -0
  25. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/__init__.py +2 -1
  26. mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/__init__.py +33 -0
  27. mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/__main__.py +60 -0
  28. mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/__init__.py +21 -0
  29. mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/__main__.py +60 -0
  30. mcp_ticketer-0.4.4/src/mcp_ticketer/mcp/server.py → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server/main.py +15 -35
  31. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/__init__.py +7 -9
  32. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/__init__.py +1 -0
  33. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/manager.py +10 -46
  34. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/ticket_registry.py +5 -5
  35. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8/src/mcp_ticketer.egg-info}/PKG-INFO +13 -4
  36. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/SOURCES.txt +19 -13
  37. mcp_ticketer-0.4.8/tests/adapters/linear/test_adapter_validation.py +183 -0
  38. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_client.py +2 -5
  39. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_mappers.py +3 -7
  40. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_queries.py +8 -24
  41. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_types.py +9 -11
  42. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_aitrackdown.py +2 -8
  43. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_github.py +2 -1
  44. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_jira_direct.py +2 -1
  45. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_linear_config.py +0 -1
  46. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_linear_native.py +2 -2
  47. mcp_ticketer-0.4.8/tests/cli/test_python_detection.py +145 -0
  48. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/conftest.py +2 -8
  49. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_actual_worker_execution.py +3 -0
  50. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_env_discovery.py +3 -6
  51. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_unified_env_loading.py +5 -5
  52. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/e2e/test_complete_ticket_workflow.py +2 -8
  53. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_all_adapters.py +9 -9
  54. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_commenting_functionality.py +2 -1
  55. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_comprehensive.py +2 -8
  56. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_hierarchy_and_workflow.py +2 -8
  57. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_api_usage.py +2 -1
  58. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_codex_config.py +2 -10
  59. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_models.py +2 -8
  60. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/unit/test_cache_memory.py +2 -6
  61. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/unit/test_core_exceptions.py +6 -14
  62. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/unit/test_core_models.py +2 -9
  63. mcp_ticketer-0.4.4/src/mcp_ticketer/__init__.py +0 -27
  64. mcp_ticketer-0.4.4/src/mcp_ticketer/mcp/__init__.py +0 -5
  65. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
  66. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
  67. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
  68. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
  69. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
  70. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
  71. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
  72. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
  73. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.claude.json +0 -0
  74. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.coveragerc +0 -0
  75. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.cursor/mcp.json +0 -0
  76. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.env.example +0 -0
  77. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.github/workflows/docs.yml +0 -0
  78. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.github/workflows/publish.yml +0 -0
  79. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.github/workflows/test.yml +0 -0
  80. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.mcp/config.json +0 -0
  81. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.pre-commit-config.yaml +0 -0
  82. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.python-version +0 -0
  83. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/.readthedocs.yaml +0 -0
  84. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/CHANGELOG.md +0 -0
  85. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/CLAUDE.md +0 -0
  86. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/CLI_RESTRUCTURE_REPORT.md +0 -0
  87. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/CLI_RESTRUCTURE_TEST_REPORT.md +0 -0
  88. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/LICENSE +0 -0
  89. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/MANIFEST.in +0 -0
  90. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/PATH_TRAVERSAL_SECURITY_TEST_REPORT.md +0 -0
  91. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/SECURITY_RESCAN_REPORT.md +0 -0
  92. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/VERIFICATION_v0.4.3.md +0 -0
  93. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/debug_epic_creation.py +0 -0
  94. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/debug_full_flow.py +0 -0
  95. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/debug_worker_epic.py +0 -0
  96. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/ADAPTERS.md +0 -0
  97. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/API_REFERENCE.md +0 -0
  98. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/ATTACHMENTS.md +0 -0
  99. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/CONFIGURATION.md +0 -0
  100. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  101. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/DEVELOPER_GUIDE.md +0 -0
  102. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/ENV_DISCOVERY.md +0 -0
  103. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/MCP_INTEGRATION.md +0 -0
  104. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/PROJECT_CONFIG.md +0 -0
  105. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/PR_INTEGRATION.md +0 -0
  106. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/QUEUE_SYSTEM.md +0 -0
  107. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/QUICK_START_ENV.md +0 -0
  108. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/README.md +0 -0
  109. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/USER_GUIDE.md +0 -0
  110. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
  111. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_archive/README.md +0 -0
  112. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  113. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  114. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  115. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  116. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  117. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  118. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  119. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/adapters/github.md.txt +0 -0
  120. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/adapters.rst.txt +0 -0
  121. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/api.rst.txt +0 -0
  122. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/cli.rst.txt +0 -0
  123. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/development.rst.txt +0 -0
  124. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/examples.rst.txt +0 -0
  125. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/index.rst.txt +0 -0
  126. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/installation.rst.txt +0 -0
  127. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  128. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/adapters/github.md +0 -0
  129. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/adapters.rst +0 -0
  130. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/api.rst +0 -0
  131. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
  132. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
  133. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
  134. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/cli.rst +0 -0
  135. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/conf.py +0 -0
  136. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/development/CODE_STRUCTURE.md +0 -0
  137. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/development/CONTRIBUTING.md +0 -0
  138. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/development/RELEASE.md +0 -0
  139. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/development/RELEASING.md +0 -0
  140. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/development.rst +0 -0
  141. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/examples.rst +0 -0
  142. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +0 -0
  143. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/index.rst +0 -0
  144. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/installation.rst +0 -0
  145. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/prd/mcp-ticketer-prd.md +0 -0
  146. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
  147. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
  148. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
  149. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
  150. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
  151. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
  152. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
  153. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
  154. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
  155. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
  156. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
  157. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
  158. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/FIX_SUMMARY.md +0 -0
  159. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  160. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
  161. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  162. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
  163. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  164. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
  165. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/TEST_REPORT.md +0 -0
  166. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
  167. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/reports/VERIFICATION_RESULTS.md +0 -0
  168. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/requirements.txt +0 -0
  169. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
  170. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/setup/CODEX_INTEGRATION.md +0 -0
  171. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/setup/JIRA_SETUP.md +0 -0
  172. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/setup/LINEAR_SETUP.md +0 -0
  173. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
  174. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
  175. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
  176. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
  177. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +0 -0
  178. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
  179. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
  180. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
  181. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
  182. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
  183. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/mcp-ticketer +0 -0
  184. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/mcp-ticketer-server +0 -0
  185. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/pytest.ini +0 -0
  186. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/requirements-dev.txt +0 -0
  187. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/requirements.txt +0 -0
  188. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/scripts/README.md +0 -0
  189. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/scripts/install.sh +0 -0
  190. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/scripts/manage_version.py +0 -0
  191. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/scripts/mcp_server.sh +0 -0
  192. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/scripts/test_set_command.sh +0 -0
  193. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/setup.cfg +0 -0
  194. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/setup.py +0 -0
  195. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/__init__.py +0 -0
  196. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/hybrid.py +0 -0
  197. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
  198. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
  199. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear/types.py +0 -0
  200. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/adapters/linear.py +0 -0
  201. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cache/__init__.py +0 -0
  202. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cache/memory.py +0 -0
  203. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/__init__.py +0 -0
  204. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/diagnostics.py +0 -0
  205. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/linear_commands.py +0 -0
  206. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  207. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/platform_commands.py +0 -0
  208. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  209. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/simple_health.py +0 -0
  210. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/ticket_commands.py +0 -0
  211. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/cli/utils.py +0 -0
  212. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/adapter.py +0 -0
  213. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/config.py +0 -0
  214. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/env_discovery.py +0 -0
  215. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/env_loader.py +0 -0
  216. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/exceptions.py +0 -0
  217. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/http_client.py +0 -0
  218. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/mappers.py +0 -0
  219. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/models.py +0 -0
  220. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/project_config.py +0 -0
  221. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/core/registry.py +0 -0
  222. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/constants.py +0 -0
  223. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/dto.py +0 -0
  224. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/response_builder.py +0 -0
  225. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/server_sdk.py +0 -0
  226. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/attachment_tools.py +0 -0
  227. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/bulk_tools.py +0 -0
  228. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/comment_tools.py +0 -0
  229. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/hierarchy_tools.py +0 -0
  230. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/pr_tools.py +0 -0
  231. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/search_tools.py +0 -0
  232. {mcp_ticketer-0.4.4/src/mcp_ticketer/mcp → mcp_ticketer-0.4.8/src/mcp_ticketer/mcp/server}/tools/ticket_tools.py +0 -0
  233. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/py.typed +0 -0
  234. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/__main__.py +0 -0
  235. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/health_monitor.py +0 -0
  236. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/queue.py +0 -0
  237. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/run_worker.py +0 -0
  238. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer/queue/worker.py +0 -0
  239. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  240. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  241. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  242. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  243. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  244. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/test-tickets/tickets/task-20250924002724.json +0 -0
  245. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/test_linear_fixes.py +0 -0
  246. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/test_worker_persistence.py +0 -0
  247. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/README.md +0 -0
  248. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/__init__.py +0 -0
  249. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/linear/__init__.py +0 -0
  250. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/linear/test_adapter.py +0 -0
  251. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_aitrackdown_security.py +0 -0
  252. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_github_token.py +0 -0
  253. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_jira.py +0 -0
  254. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_jira_projects.py +0 -0
  255. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/adapters/test_linear.py +0 -0
  256. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/debug_credential_validation.py +0 -0
  257. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_config_resolution.py +0 -0
  258. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_environment_handoff.py +0 -0
  259. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_queue_processing.py +0 -0
  260. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/core/test_queue_system.py +0 -0
  261. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_adapter_cache.py +0 -0
  262. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_cli_config.py +0 -0
  263. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_cli_vs_simulation.py +0 -0
  264. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_linear_teams.py +0 -0
  265. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_search.py +0 -0
  266. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_test.py +0 -0
  267. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_adapter.py +0 -0
  268. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_simulation.py +0 -0
  269. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/debug/debug_worker_subprocess.py +0 -0
  270. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/e2e/test_comments_and_attachments.py +0 -0
  271. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/e2e/test_complete_workflow.py +0 -0
  272. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/e2e/test_hierarchy_validation.py +0 -0
  273. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/e2e/test_state_transitions.py +0 -0
  274. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_aitrackdown_commenting.py +0 -0
  275. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_jira_github_adapters.py +0 -0
  276. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_mcp_server_qa.py +0 -0
  277. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_pr_functionality.py +0 -0
  278. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_serve_config.py +0 -0
  279. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/integration/test_user_assignment.py +0 -0
  280. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/performance/test_optimizations.py +0 -0
  281. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/performance/test_performance.py +0 -0
  282. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/run_comprehensive_tests.py +0 -0
  283. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_base_adapter.py +0 -0
  284. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_basic.py +0 -0
  285. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_comprehensive_qa.py +0 -0
  286. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_error_handling.py +0 -0
  287. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_linear_teams.py +0 -0
  288. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/test_queue.py +0 -0
  289. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/unit/__init__.py +0 -0
  290. {mcp_ticketer-0.4.4 → mcp_ticketer-0.4.8}/tests/unit/test_core_registry.py +0 -0
  291. {mcp_ticketer-0.4.4 → 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.4
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>
@@ -282,16 +282,25 @@ mcp-ticketer uninstall auggie # Alias for remove
282
282
  {
283
283
  "mcpServers": {
284
284
  "mcp-ticketer": {
285
- "command": "/path/to/mcp-ticketer",
286
- "args": ["serve"],
285
+ "command": "/path/to/venv/bin/python",
286
+ "args": ["-m", "mcp_ticketer.mcp.server", "/absolute/path/to/project"],
287
287
  "env": {
288
- "MCP_TICKETER_ADAPTER": "aitrackdown"
288
+ "MCP_TICKETER_ADAPTER": "aitrackdown",
289
+ "PYTHONPATH": "/absolute/path/to/project"
289
290
  }
290
291
  }
291
292
  }
292
293
  }
293
294
  ```
294
295
 
296
+ **Why this pattern?**
297
+ - **More Reliable**: Uses venv Python directly instead of binary wrapper
298
+ - **Consistent**: Matches proven mcp-vector-search pattern
299
+ - **Universal**: Works across pipx, pip, and uv installations
300
+ - **Better Errors**: Python module invocation provides clearer error messages
301
+
302
+ **Automatic Detection**: The `mcp-ticketer install` commands automatically detect your venv Python and generate the correct configuration.
303
+
295
304
  **See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
296
305
 
297
306
  ## ⚙️ Configuration
@@ -197,16 +197,25 @@ mcp-ticketer uninstall auggie # Alias for remove
197
197
  {
198
198
  "mcpServers": {
199
199
  "mcp-ticketer": {
200
- "command": "/path/to/mcp-ticketer",
201
- "args": ["serve"],
200
+ "command": "/path/to/venv/bin/python",
201
+ "args": ["-m", "mcp_ticketer.mcp.server", "/absolute/path/to/project"],
202
202
  "env": {
203
- "MCP_TICKETER_ADAPTER": "aitrackdown"
203
+ "MCP_TICKETER_ADAPTER": "aitrackdown",
204
+ "PYTHONPATH": "/absolute/path/to/project"
204
205
  }
205
206
  }
206
207
  }
207
208
  }
208
209
  ```
209
210
 
211
+ **Why this pattern?**
212
+ - **More Reliable**: Uses venv Python directly instead of binary wrapper
213
+ - **Consistent**: Matches proven mcp-vector-search pattern
214
+ - **Universal**: Works across pipx, pip, and uv installations
215
+ - **Better Errors**: Python module invocation provides clearer error messages
216
+
217
+ **Automatic Detection**: The `mcp-ticketer install` commands automatically detect your venv Python and generate the correct configuration.
218
+
210
219
  **See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
211
220
 
212
221
  ## ⚙️ Configuration
@@ -28,6 +28,33 @@ Complete guide to integrating MCP Ticketer with AI clients via the Model Context
28
28
 
29
29
  The **Model Context Protocol (MCP)** is a standardized protocol that enables AI assistants to interact with external tools and services. MCP Ticketer implements MCP to provide universal ticket management capabilities to AI clients.
30
30
 
31
+ ### MCP Server Configuration Pattern
32
+
33
+ **MCP Ticketer uses a reliable venv Python + module invocation pattern:**
34
+
35
+ ```json
36
+ {
37
+ "command": "/path/to/venv/bin/python",
38
+ "args": ["-m", "mcp_ticketer.mcp.server", "/project/path"],
39
+ "env": {
40
+ "PYTHONPATH": "/project/path"
41
+ }
42
+ }
43
+ ```
44
+
45
+ **Why this pattern?**
46
+ 1. **Reliability**: Direct venv Python invocation avoids binary wrapper issues
47
+ 2. **Consistency**: Matches proven mcp-vector-search approach
48
+ 3. **Compatibility**: Works across pipx, pip, and uv installations
49
+ 4. **Error Clarity**: Python module errors are more informative
50
+ 5. **Automatic**: `mcp-ticketer install <platform>` detects paths automatically
51
+
52
+ **How it works:**
53
+ - The `install` commands automatically detect your mcp-ticketer venv Python
54
+ - Module invocation (`-m mcp_ticketer.mcp.server`) is more reliable than binary paths
55
+ - Project path argument enables project-specific configurations
56
+ - PYTHONPATH ensures proper module resolution
57
+
31
58
  ### Supported AI Clients
32
59
 
33
60
  MCP Ticketer supports **4 major AI clients** with varying levels of integration:
@@ -164,18 +191,24 @@ mcp-ticketer install claude-code --dry-run
164
191
  {
165
192
  "mcpServers": {
166
193
  "mcp-ticketer": {
167
- "command": "/usr/local/bin/mcp-ticketer",
168
- "args": ["serve"],
169
- "cwd": "/Users/username/projects/my-project",
194
+ "command": "/path/to/venv/bin/python",
195
+ "args": ["-m", "mcp_ticketer.mcp.server", "/Users/username/projects/my-project"],
170
196
  "env": {
171
197
  "MCP_TICKETER_ADAPTER": "aitrackdown",
172
- "MCP_TICKETER_BASE_PATH": "/Users/username/projects/my-project/.aitrackdown"
198
+ "MCP_TICKETER_BASE_PATH": "/Users/username/projects/my-project/.aitrackdown",
199
+ "PYTHONPATH": "/Users/username/projects/my-project"
173
200
  }
174
201
  }
175
202
  }
176
203
  }
177
204
  ```
178
205
 
206
+ **Configuration Pattern Explained:**
207
+ - **command**: Path to Python in your mcp-ticketer venv (auto-detected by `install` command)
208
+ - **args**: `["-m", "mcp_ticketer.mcp.server", "<project_path>"]` - module invocation pattern
209
+ - **PYTHONPATH**: Project path for proper module resolution
210
+ - **Benefits**: More reliable, better error messages, works across all installation methods
211
+
179
212
  #### Step 5: Use in Claude Code
180
213
 
181
214
  1. Open Claude Code
@@ -193,13 +226,14 @@ mcp-ticketer install claude-code --dry-run
193
226
  {
194
227
  "mcpServers": {
195
228
  "mcp-ticketer": {
196
- "command": "/path/to/mcp-ticketer",
197
- "args": ["serve"],
229
+ "command": "/path/to/venv/bin/python",
230
+ "args": ["-m", "mcp_ticketer.mcp.server", "/project/path"],
198
231
  "env": {
199
232
  "MCP_TICKETER_ADAPTER": "linear",
200
233
  "LINEAR_API_KEY": "your-api-key",
201
234
  "LINEAR_TEAM_ID": "your-team-id",
202
- "MCP_TICKETER_LOG_LEVEL": "DEBUG"
235
+ "MCP_TICKETER_LOG_LEVEL": "DEBUG",
236
+ "PYTHONPATH": "/project/path"
203
237
  }
204
238
  }
205
239
  }
@@ -212,19 +246,21 @@ mcp-ticketer install claude-code --dry-run
212
246
  {
213
247
  "mcpServers": {
214
248
  "mcp-ticketer-jira": {
215
- "command": "/path/to/mcp-ticketer",
216
- "args": ["serve"],
249
+ "command": "/path/to/venv/bin/python",
250
+ "args": ["-m", "mcp_ticketer.mcp.server", "/project/path"],
217
251
  "env": {
218
252
  "MCP_TICKETER_ADAPTER": "jira",
219
- "JIRA_SERVER": "https://company.atlassian.net"
253
+ "JIRA_SERVER": "https://company.atlassian.net",
254
+ "PYTHONPATH": "/project/path"
220
255
  }
221
256
  },
222
257
  "mcp-ticketer-github": {
223
- "command": "/path/to/mcp-ticketer",
224
- "args": ["serve"],
258
+ "command": "/path/to/venv/bin/python",
259
+ "args": ["-m", "mcp_ticketer.mcp.server", "/project/path"],
225
260
  "env": {
226
261
  "MCP_TICKETER_ADAPTER": "github",
227
- "GITHUB_REPO": "owner/repo"
262
+ "GITHUB_REPO": "owner/repo",
263
+ "PYTHONPATH": "/project/path"
228
264
  }
229
265
  }
230
266
  }
@@ -300,10 +336,10 @@ mcp-ticketer install gemini --dry-run
300
336
  {
301
337
  "mcpServers": {
302
338
  "mcp-ticketer": {
303
- "command": "/usr/local/bin/mcp-ticketer",
304
- "args": ["serve"],
339
+ "command": "/path/to/venv/bin/python",
340
+ "args": ["-m", "mcp_ticketer.mcp.server", "/Users/username/projects/my-project"],
305
341
  "env": {
306
- "PYTHONPATH": "/Users/username/projects/my-project/src",
342
+ "PYTHONPATH": "/Users/username/projects/my-project",
307
343
  "MCP_TICKETER_ADAPTER": "aitrackdown",
308
344
  "MCP_TICKETER_BASE_PATH": "/Users/username/projects/my-project/.aitrackdown"
309
345
  },
@@ -314,6 +350,8 @@ mcp-ticketer install gemini --dry-run
314
350
  }
315
351
  ```
316
352
 
353
+ **Note**: The venv Python path is automatically detected by `mcp-ticketer install gemini`.
354
+
317
355
  #### Step 5: Use in Gemini CLI
318
356
 
319
357
  1. Navigate to your project directory
@@ -424,15 +462,17 @@ mcp-ticketer install codex --dry-run
424
462
 
425
463
  ```toml
426
464
  [mcp_servers.mcp-ticketer]
427
- command = "/usr/local/bin/mcp-ticketer"
428
- args = ["serve"]
465
+ command = "/path/to/venv/bin/python"
466
+ args = ["-m", "mcp_ticketer.mcp.server", "/Users/username/projects/my-project"]
429
467
 
430
468
  [mcp_servers.mcp-ticketer.env]
431
- PYTHONPATH = "/Users/username/projects/my-project/src"
469
+ PYTHONPATH = "/Users/username/projects/my-project"
432
470
  MCP_TICKETER_ADAPTER = "aitrackdown"
433
471
  MCP_TICKETER_BASE_PATH = "/Users/username/projects/my-project/.aitrackdown"
434
472
  ```
435
473
 
474
+ **Note**: The venv Python path is automatically detected and configured by `mcp-ticketer install codex`.
475
+
436
476
  #### Step 6: Use in Codex CLI
437
477
 
438
478
  1. Run `codex` from any directory
@@ -525,8 +565,8 @@ mcp-ticketer install auggie --dry-run
525
565
  {
526
566
  "mcpServers": {
527
567
  "mcp-ticketer": {
528
- "command": "/usr/local/bin/mcp-ticketer",
529
- "args": ["serve"],
568
+ "command": "/path/to/venv/bin/python",
569
+ "args": ["-m", "mcp_ticketer.mcp.server"],
530
570
  "env": {
531
571
  "MCP_TICKETER_ADAPTER": "aitrackdown",
532
572
  "MCP_TICKETER_BASE_PATH": "/Users/username/.mcp-ticketer/.aitrackdown"
@@ -536,6 +576,8 @@ mcp-ticketer install auggie --dry-run
536
576
  }
537
577
  ```
538
578
 
579
+ **Note**: The venv Python path is automatically detected by `mcp-ticketer install auggie`. Since Auggie uses global configuration, project path arguments are typically omitted.
580
+
539
581
  #### Step 6: Use in Auggie
540
582
 
541
583
  1. Open Auggie
@@ -51,22 +51,81 @@ mcp-ticketer install
51
51
 
52
52
  #### New Features in v0.5.x
53
53
 
54
- ##### 1. Installation Commands
54
+ ##### 1. Reliable venv Python Pattern
55
+
56
+ Version 0.5.x introduces a new, more reliable MCP server configuration pattern:
57
+
58
+ **Old Pattern (v0.4.x):**
59
+ ```json
60
+ {
61
+ "command": "/usr/local/bin/mcp-ticketer",
62
+ "args": ["serve"],
63
+ "env": {
64
+ "MCP_TICKETER_ADAPTER": "aitrackdown"
65
+ }
66
+ }
67
+ ```
68
+
69
+ **New Pattern (v0.5.x):**
70
+ ```json
71
+ {
72
+ "command": "/path/to/venv/bin/python",
73
+ "args": ["-m", "mcp_ticketer.mcp.server", "/project/path"],
74
+ "env": {
75
+ "MCP_TICKETER_ADAPTER": "aitrackdown",
76
+ "PYTHONPATH": "/project/path"
77
+ }
78
+ }
79
+ ```
80
+
81
+ **Benefits:**
82
+ - ✅ More reliable across installation methods (pipx, pip, uv)
83
+ - ✅ Better error messages from Python module invocation
84
+ - ✅ Consistent with proven mcp-vector-search approach
85
+ - ✅ Automatic detection of venv Python path
86
+ - ✅ Works across different Python versions
87
+
88
+ **Migration:** The `install` commands automatically generate the new pattern. Old configurations continue to work but are deprecated.
89
+
90
+ ##### 2. Installation Commands
55
91
 
56
92
  The `install` command now handles MCP platform configuration:
57
93
  - Simplified syntax without the `mcp` subcommand
58
94
  - Clearer platform names (e.g., `claude-code` vs `claude-desktop`)
59
95
  - Dry-run support to preview changes
96
+ - Automatic venv Python detection
60
97
 
61
98
  ```bash
62
99
  # Install with preview
63
100
  mcp-ticketer install claude-code --dry-run
64
101
 
65
- # Install normally
102
+ # Install normally (automatically uses new pattern)
66
103
  mcp-ticketer install claude-code
67
104
  ```
68
105
 
69
- ##### 2. Removal Commands
106
+ ##### 2. Automatic Python Path Detection
107
+
108
+ The installer now automatically detects the correct Python executable:
109
+
110
+ ```python
111
+ # Detection priority:
112
+ # 1. Current Python if in pipx venv
113
+ # 2. Python from mcp-ticketer binary shebang
114
+ # 3. Current Python executable (fallback)
115
+ ```
116
+
117
+ **Finding your venv Python manually:**
118
+ ```bash
119
+ # For pipx installations
120
+ ls ~/.local/pipx/venvs/mcp-ticketer/bin/python
121
+
122
+ # For pip/uv in project venv
123
+ ls .venv/bin/python
124
+
125
+ # The install command detects this automatically
126
+ ```
127
+
128
+ ##### 3. Removal Commands
70
129
 
71
130
  New commands to remove MCP configurations:
72
131
 
@@ -83,7 +142,7 @@ mcp-ticketer uninstall codex
83
142
  mcp-ticketer remove gemini --dry-run
84
143
  ```
85
144
 
86
- ##### 3. Platform Support
145
+ ##### 4. Platform Support
87
146
 
88
147
  **New platforms:**
89
148
  - `claude-code` - Project-level Claude Code configuration
@@ -124,16 +183,39 @@ Review and update any project documentation that references the old commands:
124
183
  - CI/CD pipelines
125
184
  - Developer onboarding docs
126
185
 
127
- ##### Step 3: Reinstall Configurations (Optional)
186
+ ##### Step 3: Migrate to venv Python Pattern (Recommended)
128
187
 
129
- While old configurations continue to work, you may want to reinstall using the new commands:
188
+ Update your configurations to use the new venv Python pattern:
130
189
 
131
190
  ```bash
132
- # Remove old configuration
191
+ # Option 1: Automatic reinstall (recommended)
133
192
  mcp-ticketer remove claude-code
134
-
135
- # Install with new command
136
193
  mcp-ticketer install claude-code
194
+
195
+ # Option 2: Manual update
196
+ # Edit your configuration file directly:
197
+ # Change: "command": "/usr/local/bin/mcp-ticketer"
198
+ # To: "command": "/path/to/venv/bin/python"
199
+ # Change: "args": ["serve"]
200
+ # To: "args": ["-m", "mcp_ticketer.mcp.server", "/project/path"]
201
+ # Add: "PYTHONPATH": "/project/path" to env
202
+ ```
203
+
204
+ **Why migrate?**
205
+ - ✅ More reliable across different installation methods
206
+ - ✅ Better error messages and debugging
207
+ - ✅ Future-proof pattern matching industry standards
208
+ - ✅ No RuntimeWarning about lazy imports
209
+
210
+ **Verification:**
211
+ ```bash
212
+ # Test the new configuration
213
+ # For Claude Code/Desktop: Try creating a ticket in the AI client
214
+ # The new pattern should work seamlessly
215
+
216
+ # Check Python path manually
217
+ which python
218
+ # Should show your venv Python if installed with pipx/pip
137
219
  ```
138
220
 
139
221
  ##### Step 4: Test Integrations
@@ -453,6 +453,39 @@ mcp-ticketer serve
453
453
  # Press Ctrl+C to stop
454
454
  ```
455
455
 
456
+ **Manual Configuration Pattern:**
457
+
458
+ All AI clients use the same reliable venv Python + module invocation pattern:
459
+
460
+ ```json
461
+ {
462
+ "command": "/path/to/venv/bin/python",
463
+ "args": ["-m", "mcp_ticketer.mcp.server", "/absolute/path/to/project"],
464
+ "env": {
465
+ "MCP_TICKETER_ADAPTER": "aitrackdown",
466
+ "PYTHONPATH": "/absolute/path/to/project"
467
+ }
468
+ }
469
+ ```
470
+
471
+ **Key Points:**
472
+ - **command**: Path to Python in your mcp-ticketer venv (auto-detected by install commands)
473
+ - **args**: Module invocation pattern `["-m", "mcp_ticketer.mcp.server", "<project_path>"]`
474
+ - **PYTHONPATH**: Set to project root for proper module resolution
475
+ - **Benefits**: More reliable than binary paths, works across all installation methods
476
+
477
+ **Finding your venv Python:**
478
+ ```bash
479
+ # For pipx installations
480
+ ls ~/.local/pipx/venvs/mcp-ticketer/bin/python
481
+
482
+ # For pip installations in venv
483
+ ls .venv/bin/python
484
+
485
+ # For uv installations
486
+ ls .venv/bin/python
487
+ ```
488
+
456
489
  **See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for detailed configuration.**
457
490
 
458
491
  ---
@@ -152,7 +152,7 @@ extend-exclude = '''
152
152
  '''
153
153
 
154
154
  [tool.ruff]
155
- target-version = "py311"
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.4"
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: