mcp-ticketer 0.4.2__tar.gz → 0.4.3__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.2 → mcp_ticketer-0.4.3}/.env.example +11 -4
  2. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/CHANGELOG.md +72 -1
  3. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/PKG-INFO +61 -2
  4. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/README.md +59 -0
  5. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/API_REFERENCE.md +103 -0
  6. mcp_ticketer-0.4.3/docs/ATTACHMENTS.md +564 -0
  7. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/QUICK_START.md +64 -4
  8. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/pyproject.toml +3 -3
  9. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/pytest.ini +1 -0
  10. mcp_ticketer-0.4.3/src/mcp_ticketer/__init__.py +18 -0
  11. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/__version__.py +1 -1
  12. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/aitrackdown.py +243 -11
  13. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/github.py +15 -14
  14. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/hybrid.py +11 -11
  15. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/jira.py +22 -25
  16. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/adapter.py +9 -21
  17. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/client.py +2 -1
  18. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/mappers.py +2 -1
  19. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cache/memory.py +6 -5
  20. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/adapter_diagnostics.py +4 -2
  21. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/codex_configure.py +2 -2
  22. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/configure.py +7 -14
  23. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/diagnostics.py +2 -2
  24. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/discover.py +6 -11
  25. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/gemini_configure.py +2 -2
  26. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/linear_commands.py +6 -7
  27. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/main.py +218 -242
  28. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/mcp_configure.py +1 -2
  29. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/ticket_commands.py +27 -30
  30. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/utils.py +23 -22
  31. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/__init__.py +3 -1
  32. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/adapter.py +82 -13
  33. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/config.py +27 -29
  34. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/env_discovery.py +10 -10
  35. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/env_loader.py +8 -8
  36. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/http_client.py +16 -16
  37. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/mappers.py +10 -10
  38. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/models.py +50 -20
  39. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/project_config.py +40 -34
  40. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/registry.py +2 -2
  41. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/dto.py +32 -32
  42. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/response_builder.py +2 -2
  43. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/server.py +17 -37
  44. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/server_sdk.py +2 -2
  45. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/__init__.py +7 -9
  46. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/attachment_tools.py +3 -4
  47. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/comment_tools.py +2 -2
  48. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/hierarchy_tools.py +8 -8
  49. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/pr_tools.py +2 -2
  50. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/search_tools.py +6 -6
  51. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/ticket_tools.py +12 -12
  52. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/health_monitor.py +4 -4
  53. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/manager.py +2 -2
  54. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/queue.py +16 -16
  55. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/ticket_registry.py +7 -7
  56. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/worker.py +2 -2
  57. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/PKG-INFO +61 -2
  58. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/SOURCES.txt +2 -12
  59. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_client.py +2 -5
  60. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_mappers.py +9 -13
  61. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_queries.py +8 -24
  62. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_types.py +9 -11
  63. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_aitrackdown.py +2 -8
  64. mcp_ticketer-0.4.3/tests/adapters/test_aitrackdown_security.py +338 -0
  65. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_github.py +2 -1
  66. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_jira_direct.py +2 -1
  67. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_linear_config.py +0 -1
  68. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_linear_native.py +2 -2
  69. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/conftest.py +2 -8
  70. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_env_discovery.py +3 -6
  71. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_unified_env_loading.py +2 -5
  72. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_complete_ticket_workflow.py +2 -8
  73. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_all_adapters.py +4 -9
  74. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_commenting_functionality.py +2 -1
  75. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_comprehensive.py +2 -8
  76. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_hierarchy_and_workflow.py +2 -8
  77. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_mcp_server_qa.py +2 -2
  78. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_api_usage.py +2 -1
  79. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_models.py +2 -8
  80. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_cache_memory.py +2 -6
  81. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_core_exceptions.py +6 -14
  82. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_core_models.py +2 -9
  83. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/test_core_registry.py +5 -5
  84. mcp_ticketer-0.4.2/CLI_RESTRUCTURING_SUMMARY.md +0 -272
  85. mcp_ticketer-0.4.2/LINEAR_ADAPTER_REVIEW.md +0 -477
  86. mcp_ticketer-0.4.2/LINEAR_FIX_RECOMMENDATION.md +0 -292
  87. mcp_ticketer-0.4.2/LINEAR_GRAPHQL_TYPE_ANALYSIS.md +0 -300
  88. mcp_ticketer-0.4.2/LINEAR_LABEL_FIX_SUMMARY.md +0 -262
  89. mcp_ticketer-0.4.2/LINEAR_PATTERN_COMPARISON.md +0 -441
  90. mcp_ticketer-0.4.2/LINEAR_QUERY_ALTERNATIVE_ANALYSIS.md +0 -278
  91. mcp_ticketer-0.4.2/LINEAR_RESEARCH_SUMMARY.md +0 -423
  92. mcp_ticketer-0.4.2/LINEAR_TAGS_FIX_SUMMARY.md +0 -238
  93. mcp_ticketer-0.4.2/QUICK_WINS_IMPLEMENTATION.md +0 -320
  94. mcp_ticketer-0.4.2/SECURITY_SCAN_REPORT_v0.1.24.md +0 -668
  95. mcp_ticketer-0.4.2/V0.3.2_RELEASE_FIXES_SUMMARY.md +0 -472
  96. mcp_ticketer-0.4.2/src/mcp_ticketer/__init__.py +0 -27
  97. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
  98. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
  99. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
  100. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
  101. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
  102. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
  103. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
  104. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
  105. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.claude.json +0 -0
  106. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.coveragerc +0 -0
  107. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.cursor/mcp.json +0 -0
  108. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.github/workflows/docs.yml +0 -0
  109. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.github/workflows/publish.yml +0 -0
  110. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.github/workflows/test.yml +0 -0
  111. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.mcp/config.json +0 -0
  112. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.pre-commit-config.yaml +0 -0
  113. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.python-version +0 -0
  114. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/.readthedocs.yaml +0 -0
  115. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/CLAUDE.md +0 -0
  116. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/LICENSE +0 -0
  117. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/MANIFEST.in +0 -0
  118. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/Makefile +0 -0
  119. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/debug_epic_creation.py +0 -0
  120. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/debug_full_flow.py +0 -0
  121. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/debug_worker_epic.py +0 -0
  122. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/ADAPTERS.md +0 -0
  123. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/AI_CLIENT_INTEGRATION.md +0 -0
  124. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/CONFIGURATION.md +0 -0
  125. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  126. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/DEVELOPER_GUIDE.md +0 -0
  127. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/ENV_DISCOVERY.md +0 -0
  128. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/MCP_INTEGRATION.md +0 -0
  129. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/MIGRATION_GUIDE.md +0 -0
  130. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/PROJECT_CONFIG.md +0 -0
  131. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/PR_INTEGRATION.md +0 -0
  132. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/QUEUE_SYSTEM.md +0 -0
  133. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/QUICK_START_ENV.md +0 -0
  134. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/README.md +0 -0
  135. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/USER_GUIDE.md +0 -0
  136. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
  137. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_archive/README.md +0 -0
  138. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  139. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  140. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  141. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  142. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  143. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  144. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  145. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/adapters/github.md.txt +0 -0
  146. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/adapters.rst.txt +0 -0
  147. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/api.rst.txt +0 -0
  148. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/cli.rst.txt +0 -0
  149. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/development.rst.txt +0 -0
  150. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/examples.rst.txt +0 -0
  151. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/index.rst.txt +0 -0
  152. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/installation.rst.txt +0 -0
  153. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  154. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/adapters/github.md +0 -0
  155. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/adapters.rst +0 -0
  156. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/api.rst +0 -0
  157. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
  158. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
  159. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
  160. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/cli.rst +0 -0
  161. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/conf.py +0 -0
  162. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/CODE_STRUCTURE.md +0 -0
  163. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/CONTRIBUTING.md +0 -0
  164. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/RELEASE.md +0 -0
  165. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development/RELEASING.md +0 -0
  166. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/development.rst +0 -0
  167. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/examples.rst +0 -0
  168. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +0 -0
  169. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/index.rst +0 -0
  170. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/installation.rst +0 -0
  171. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/prd/mcp-ticketer-prd.md +0 -0
  172. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
  173. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
  174. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
  175. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
  176. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
  177. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
  178. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
  179. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
  180. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
  181. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
  182. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
  183. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
  184. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/FIX_SUMMARY.md +0 -0
  185. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  186. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
  187. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  188. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
  189. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  190. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
  191. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/TEST_REPORT.md +0 -0
  192. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
  193. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/reports/VERIFICATION_RESULTS.md +0 -0
  194. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/requirements.txt +0 -0
  195. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
  196. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/CODEX_INTEGRATION.md +0 -0
  197. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/JIRA_SETUP.md +0 -0
  198. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/setup/LINEAR_SETUP.md +0 -0
  199. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
  200. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
  201. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
  202. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
  203. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +0 -0
  204. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
  205. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
  206. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
  207. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
  208. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
  209. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/mcp-ticketer +0 -0
  210. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/mcp-ticketer-server +0 -0
  211. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/requirements-dev.txt +0 -0
  212. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/requirements.txt +0 -0
  213. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/README.md +0 -0
  214. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/install.sh +0 -0
  215. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/manage_version.py +0 -0
  216. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/mcp_server.sh +0 -0
  217. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/scripts/test_set_command.sh +0 -0
  218. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/setup.cfg +0 -0
  219. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/setup.py +0 -0
  220. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/__init__.py +0 -0
  221. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
  222. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
  223. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear/types.py +0 -0
  224. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/adapters/linear.py +0 -0
  225. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cache/__init__.py +0 -0
  226. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/__init__.py +0 -0
  227. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
  228. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  229. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/platform_commands.py +0 -0
  230. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  231. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/cli/simple_health.py +0 -0
  232. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/core/exceptions.py +0 -0
  233. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/__init__.py +0 -0
  234. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/constants.py +0 -0
  235. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/mcp/tools/bulk_tools.py +0 -0
  236. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/py.typed +0 -0
  237. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/__init__.py +0 -0
  238. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/__main__.py +0 -0
  239. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer/queue/run_worker.py +0 -0
  240. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  241. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  242. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  243. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  244. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  245. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/test-tickets/tickets/task-20250924002724.json +0 -0
  246. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/test_linear_fixes.py +0 -0
  247. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/test_worker_persistence.py +0 -0
  248. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/README.md +0 -0
  249. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/__init__.py +0 -0
  250. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/__init__.py +0 -0
  251. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/linear/test_adapter.py +0 -0
  252. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_github_token.py +0 -0
  253. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_jira.py +0 -0
  254. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_jira_projects.py +0 -0
  255. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/adapters/test_linear.py +0 -0
  256. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/debug_credential_validation.py +0 -0
  257. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_actual_worker_execution.py +0 -0
  258. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_config_resolution.py +0 -0
  259. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_environment_handoff.py +0 -0
  260. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_queue_processing.py +0 -0
  261. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/core/test_queue_system.py +0 -0
  262. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_adapter_cache.py +0 -0
  263. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_cli_config.py +0 -0
  264. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_cli_vs_simulation.py +0 -0
  265. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_linear_teams.py +0 -0
  266. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_search.py +0 -0
  267. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_test.py +0 -0
  268. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_worker_adapter.py +0 -0
  269. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_worker_simulation.py +0 -0
  270. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/debug/debug_worker_subprocess.py +0 -0
  271. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_comments_and_attachments.py +0 -0
  272. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_complete_workflow.py +0 -0
  273. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_hierarchy_validation.py +0 -0
  274. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/e2e/test_state_transitions.py +0 -0
  275. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_aitrackdown_commenting.py +0 -0
  276. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_jira_github_adapters.py +0 -0
  277. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_pr_functionality.py +0 -0
  278. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_serve_config.py +0 -0
  279. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/integration/test_user_assignment.py +0 -0
  280. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/performance/test_optimizations.py +0 -0
  281. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/performance/test_performance.py +0 -0
  282. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/run_comprehensive_tests.py +0 -0
  283. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_base_adapter.py +0 -0
  284. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_basic.py +0 -0
  285. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_codex_config.py +0 -0
  286. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_comprehensive_qa.py +0 -0
  287. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_error_handling.py +0 -0
  288. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_linear_teams.py +0 -0
  289. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/test_queue.py +0 -0
  290. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tests/unit/__init__.py +0 -0
  291. {mcp_ticketer-0.4.2 → mcp_ticketer-0.4.3}/tox.ini +0 -0
@@ -14,10 +14,17 @@
14
14
  # Get your API key from: https://linear.app/settings/api
15
15
  LINEAR_API_KEY=lin_api_YOUR_KEY_HERE
16
16
 
17
- # Your Linear team ID (recommended for auto-discovery)
18
- # Find it in: Settings Teams Your Team
19
- # Or from the URL when viewing your team: linear.app/YOUR-TEAM-ID/...
20
- LINEAR_TEAM_ID=YOUR-TEAM-ID
17
+ # Linear Team Identification - Choose ONE of the following:
18
+ # Option 1: Team key (recommended - short code like 'ENG', 'DESIGN', 'PRODUCT')
19
+ LINEAR_TEAM_KEY=ENG
20
+
21
+ # Option 2: Team UUID (for advanced use cases)
22
+ # LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
23
+
24
+ # How to find your team key:
25
+ # 1. Go to Linear Settings → Teams
26
+ # 2. Select your team
27
+ # 3. Look for the "Key" field (e.g., "ENG")
21
28
 
22
29
  # Optional: Linear project ID
23
30
  # LINEAR_PROJECT_ID=YOUR-PROJECT-ID
@@ -4,7 +4,78 @@ All notable changes to MCP Ticketer will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [Unreleased]
7
+ ## [0.4.3] - 2025-10-27
8
+
9
+ ### Added
10
+ - **LINEAR_TEAM_KEY Environment Variable**: Easier Linear configuration with team keys
11
+ - Added `LINEAR_TEAM_KEY` support as primary configuration option
12
+ - Team key (e.g., "ENG", "DESIGN") now recommended over team ID (UUID)
13
+ - Automatic resolution of team key to team ID in Linear adapter
14
+ - Updated `.env.example` with LINEAR_TEAM_KEY as default option
15
+ - CLI `init` command now prompts for team key by default
16
+ - **Command Synonyms**: Init, install, and setup commands are now fully synonymous
17
+ - `mcp-ticketer init` - Initialize configuration
18
+ - `mcp-ticketer install` - Install and configure (same as init)
19
+ - `mcp-ticketer setup` - Setup (same as init)
20
+ - All three commands accept identical parameters and behave identically
21
+ - **Attachment Model**: Universal file attachment support
22
+ - New `Attachment` model in core models for cross-adapter attachment representation
23
+ - Fields: id, ticket_id, filename, url, content_type, size_bytes, created_at, created_by, description, metadata
24
+ - Full documentation in new `docs/ATTACHMENTS.md` guide
25
+ - **AITrackdown Attachment Support**: Complete file attachment implementation
26
+ - `add_attachment()` - Upload files to local filesystem with security features
27
+ - `get_attachments()` - List all attachments for a ticket
28
+ - `delete_attachment()` - Remove specific attachments
29
+ - Local filesystem storage in `.aitrackdown/attachments/<ticket-id>/` directories
30
+ - Automatic filename sanitization to prevent security issues
31
+ - SHA256 checksumming for file integrity verification
32
+ - MIME type detection based on file extension
33
+ - Size validation with configurable limits (default 100MB)
34
+ - Organized per-ticket storage structure
35
+ - **MCP Attachment Tools**: AI agent attachment support with fallback
36
+ - `ticket_attach` - Add file attachments via MCP
37
+ - `ticket_attachments` - List attachments via MCP
38
+ - `ticket_delete_attachment` - Delete attachments via MCP
39
+ - Automatic fallback to comments for adapters without attachment support
40
+ - Graceful degradation for Linear, Jira, and GitHub adapters
41
+
42
+ ### Changed
43
+ - **Linear Configuration**: LINEAR_TEAM_KEY is now the primary/recommended option
44
+ - Team ID (LINEAR_TEAM_ID) still supported for backward compatibility
45
+ - CLI init flow updated to prompt for team key first
46
+ - Documentation updated across README, QUICK_START, and setup guides
47
+ - **Environment Variable Priority**: LINEAR_TEAM_KEY takes precedence over LINEAR_TEAM_ID
48
+ - When both are present, LINEAR_TEAM_KEY is used
49
+ - Adapter automatically resolves team key to team ID via GraphQL
50
+ - **Documentation Structure**: New comprehensive attachment documentation
51
+ - Created `docs/ATTACHMENTS.md` (400+ lines)
52
+ - Updated README.md with attachment examples and LINEAR_TEAM_KEY info
53
+ - Updated QUICK_START.md with attachment usage and Linear team key setup
54
+ - Updated API_REFERENCE.md with complete Attachment model specification
55
+ - Added configuration section to README with Linear setup details
56
+
57
+ ### Fixed
58
+ - **LINEAR_TEAM_KEY Environment Loading**: Proper loading from .env files
59
+ - Fixed `project_config.py` to check all LINEAR_* environment variables
60
+ - Environment variable discovery now detects LINEAR_TEAM_KEY
61
+ - Resolves issues where LINEAR_TEAM_KEY wasn't being recognized
62
+
63
+ ### Documentation
64
+ - **New Files**:
65
+ - `docs/ATTACHMENTS.md` - Comprehensive attachment guide with examples, security notes, and roadmap
66
+ - **Updated Files**:
67
+ - `README.md` - Added attachment features, LINEAR_TEAM_KEY configuration, and command synonyms
68
+ - `docs/QUICK_START.md` - Added attachment examples and LINEAR_TEAM_KEY setup instructions
69
+ - `docs/API_REFERENCE.md` - Added Attachment model specification and adapter methods
70
+ - `.env.example` - Updated with LINEAR_TEAM_KEY as primary option with clear instructions
71
+
72
+ ### Security
73
+ - **Attachment Security Features**:
74
+ - Filename sanitization prevents path traversal and injection attacks
75
+ - Path resolution validates files stay within allowed directories
76
+ - File size limits prevent disk exhaustion
77
+ - SHA256 checksums enable integrity verification
78
+ - Isolated per-ticket storage prevents cross-ticket access
8
79
 
9
80
  ## [0.3.6] - 2025-01-25
10
81
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.4.2
3
+ Version: 0.4.3
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>
@@ -30,7 +30,7 @@ Classifier: Topic :: Software Development :: Bug Tracking
30
30
  Classifier: Topic :: System :: Monitoring
31
31
  Classifier: Topic :: Internet :: WWW/HTTP
32
32
  Classifier: Typing :: Typed
33
- Requires-Python: >=3.9
33
+ Requires-Python: >=3.10
34
34
  Description-Content-Type: text/markdown
35
35
  License-File: LICENSE
36
36
  Requires-Dist: gql[httpx]>=3.0.0
@@ -104,6 +104,7 @@ Universal ticket management interface for AI agents with MCP (Model Context Prot
104
104
  - **🎨 Rich CLI**: Beautiful terminal interface with colors and tables
105
105
  - **📊 State Machine**: Built-in state transitions with validation
106
106
  - **🔍 Advanced Search**: Full-text search with multiple filters
107
+ - **📎 File Attachments**: Upload, list, and manage ticket attachments (AITrackdown adapter)
107
108
  - **📦 Easy Installation**: Available on PyPI with simple pip install
108
109
 
109
110
  ## 📦 Installation
@@ -183,6 +184,10 @@ mcp-ticketer install
183
184
  mcp-ticketer init --adapter aitrackdown
184
185
 
185
186
  # For Linear (requires API key)
187
+ # Option 1: Using team key (recommended)
188
+ mcp-ticketer init --adapter linear --team-key ENG
189
+
190
+ # Option 2: Using team ID
186
191
  mcp-ticketer init --adapter linear --team-id YOUR_TEAM_ID
187
192
 
188
193
  # For JIRA (requires server and credentials)
@@ -194,6 +199,11 @@ mcp-ticketer init --adapter jira \
194
199
  mcp-ticketer init --adapter github --repo owner/repo
195
200
  ```
196
201
 
202
+ **Note:** The following commands are synonymous and can be used interchangeably:
203
+ - `mcp-ticketer init` - Initialize configuration
204
+ - `mcp-ticketer install` - Install and configure (same as init)
205
+ - `mcp-ticketer setup` - Setup (same as init)
206
+
197
207
  ### 2. Create Your First Ticket
198
208
 
199
209
  ```bash
@@ -222,6 +232,24 @@ mcp-ticketer transition TICKET-123 in_progress
222
232
  mcp-ticketer search "login bug" --state open
223
233
  ```
224
234
 
235
+ ### 4. Working with Attachments (AITrackdown)
236
+
237
+ ```bash
238
+ # Add attachment via MCP tools
239
+ mcp-ticketer mcp call ticket_attach '{
240
+ "ticket_id": "task-123",
241
+ "file_path": "/path/to/document.pdf",
242
+ "description": "Project specification"
243
+ }'
244
+
245
+ # List attachments
246
+ mcp-ticketer mcp call ticket_attachments '{
247
+ "ticket_id": "task-123"
248
+ }'
249
+ ```
250
+
251
+ For programmatic access, see the [Attachments Guide](docs/ATTACHMENTS.md).
252
+
225
253
  ## 🤖 MCP Server Integration
226
254
 
227
255
  MCP Ticketer provides seamless integration with AI clients through automatic configuration:
@@ -266,6 +294,37 @@ mcp-ticketer uninstall auggie # Alias for remove
266
294
 
267
295
  **See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
268
296
 
297
+ ## ⚙️ Configuration
298
+
299
+ ### Linear Configuration
300
+
301
+ Configure Linear using either a team **key** (recommended) or team **ID**:
302
+
303
+ **Option 1: Team Key** (Recommended)
304
+ ```bash
305
+ # In .env or environment
306
+ LINEAR_API_KEY=lin_api_...
307
+ LINEAR_TEAM_KEY=ENG
308
+ ```
309
+
310
+ **Option 2: Team ID**
311
+ ```bash
312
+ # In .env or environment
313
+ LINEAR_API_KEY=lin_api_...
314
+ LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
315
+ ```
316
+
317
+ **Finding your team key in Linear:**
318
+ 1. Go to Linear Settings → Teams
319
+ 2. Select your team
320
+ 3. Look for the "Key" field (e.g., "ENG", "DESIGN", "PRODUCT")
321
+
322
+ The team key is a short, human-readable identifier that's easier to use than the UUID-based team ID.
323
+
324
+ ### Environment Variables
325
+
326
+ See [.env.example](.env.example) for a complete list of supported environment variables for all adapters.
327
+
269
328
  ## 📚 Documentation
270
329
 
271
330
  Full documentation is available at [https://mcp-ticketerer.readthedocs.io](https://mcp-ticketerer.readthedocs.io)
@@ -19,6 +19,7 @@ Universal ticket management interface for AI agents with MCP (Model Context Prot
19
19
  - **🎨 Rich CLI**: Beautiful terminal interface with colors and tables
20
20
  - **📊 State Machine**: Built-in state transitions with validation
21
21
  - **🔍 Advanced Search**: Full-text search with multiple filters
22
+ - **📎 File Attachments**: Upload, list, and manage ticket attachments (AITrackdown adapter)
22
23
  - **📦 Easy Installation**: Available on PyPI with simple pip install
23
24
 
24
25
  ## 📦 Installation
@@ -98,6 +99,10 @@ mcp-ticketer install
98
99
  mcp-ticketer init --adapter aitrackdown
99
100
 
100
101
  # For Linear (requires API key)
102
+ # Option 1: Using team key (recommended)
103
+ mcp-ticketer init --adapter linear --team-key ENG
104
+
105
+ # Option 2: Using team ID
101
106
  mcp-ticketer init --adapter linear --team-id YOUR_TEAM_ID
102
107
 
103
108
  # For JIRA (requires server and credentials)
@@ -109,6 +114,11 @@ mcp-ticketer init --adapter jira \
109
114
  mcp-ticketer init --adapter github --repo owner/repo
110
115
  ```
111
116
 
117
+ **Note:** The following commands are synonymous and can be used interchangeably:
118
+ - `mcp-ticketer init` - Initialize configuration
119
+ - `mcp-ticketer install` - Install and configure (same as init)
120
+ - `mcp-ticketer setup` - Setup (same as init)
121
+
112
122
  ### 2. Create Your First Ticket
113
123
 
114
124
  ```bash
@@ -137,6 +147,24 @@ mcp-ticketer transition TICKET-123 in_progress
137
147
  mcp-ticketer search "login bug" --state open
138
148
  ```
139
149
 
150
+ ### 4. Working with Attachments (AITrackdown)
151
+
152
+ ```bash
153
+ # Add attachment via MCP tools
154
+ mcp-ticketer mcp call ticket_attach '{
155
+ "ticket_id": "task-123",
156
+ "file_path": "/path/to/document.pdf",
157
+ "description": "Project specification"
158
+ }'
159
+
160
+ # List attachments
161
+ mcp-ticketer mcp call ticket_attachments '{
162
+ "ticket_id": "task-123"
163
+ }'
164
+ ```
165
+
166
+ For programmatic access, see the [Attachments Guide](docs/ATTACHMENTS.md).
167
+
140
168
  ## 🤖 MCP Server Integration
141
169
 
142
170
  MCP Ticketer provides seamless integration with AI clients through automatic configuration:
@@ -181,6 +209,37 @@ mcp-ticketer uninstall auggie # Alias for remove
181
209
 
182
210
  **See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
183
211
 
212
+ ## ⚙️ Configuration
213
+
214
+ ### Linear Configuration
215
+
216
+ Configure Linear using either a team **key** (recommended) or team **ID**:
217
+
218
+ **Option 1: Team Key** (Recommended)
219
+ ```bash
220
+ # In .env or environment
221
+ LINEAR_API_KEY=lin_api_...
222
+ LINEAR_TEAM_KEY=ENG
223
+ ```
224
+
225
+ **Option 2: Team ID**
226
+ ```bash
227
+ # In .env or environment
228
+ LINEAR_API_KEY=lin_api_...
229
+ LINEAR_TEAM_ID=02d15669-7351-4451-9719-807576c16049
230
+ ```
231
+
232
+ **Finding your team key in Linear:**
233
+ 1. Go to Linear Settings → Teams
234
+ 2. Select your team
235
+ 3. Look for the "Key" field (e.g., "ENG", "DESIGN", "PRODUCT")
236
+
237
+ The team key is a short, human-readable identifier that's easier to use than the UUID-based team ID.
238
+
239
+ ### Environment Variables
240
+
241
+ See [.env.example](.env.example) for a complete list of supported environment variables for all adapters.
242
+
184
243
  ## 📚 Documentation
185
244
 
186
245
  Full documentation is available at [https://mcp-ticketerer.readthedocs.io](https://mcp-ticketerer.readthedocs.io)
@@ -166,6 +166,71 @@ comment = Comment(
166
166
  )
167
167
  ```
168
168
 
169
+ ### Attachment
170
+
171
+ File attachments associated with tickets.
172
+
173
+ ```python
174
+ class Attachment(BaseModel):
175
+ """File attachment metadata for tickets."""
176
+
177
+ id: Optional[str] = None
178
+ ticket_id: str
179
+ filename: str
180
+ url: Optional[str] = None
181
+ content_type: Optional[str] = None
182
+ size_bytes: Optional[int] = None
183
+ created_at: Optional[datetime] = None
184
+ created_by: Optional[str] = None
185
+ description: Optional[str] = None
186
+ metadata: Dict[str, Any] = {}
187
+ ```
188
+
189
+ **Fields:**
190
+
191
+ | Field | Type | Default | Description |
192
+ |-------|------|---------|-------------|
193
+ | `id` | `Optional[str]` | `None` | Attachment unique identifier |
194
+ | `ticket_id` | `str` | *Required* | Parent ticket identifier |
195
+ | `filename` | `str` | *Required* | Original filename |
196
+ | `url` | `Optional[str]` | `None` | Download URL or file:// path |
197
+ | `content_type` | `Optional[str]` | `None` | MIME type (e.g., 'application/pdf') |
198
+ | `size_bytes` | `Optional[int]` | `None` | File size in bytes |
199
+ | `created_at` | `Optional[datetime]` | `None` | Upload timestamp |
200
+ | `created_by` | `Optional[str]` | `None` | User who uploaded the attachment |
201
+ | `description` | `Optional[str]` | `None` | Attachment description or notes |
202
+ | `metadata` | `Dict[str, Any]` | `{}` | Adapter-specific attachment metadata |
203
+
204
+ **Example:**
205
+ ```python
206
+ from datetime import datetime
207
+
208
+ attachment = Attachment(
209
+ id='20250127143000-document.pdf',
210
+ ticket_id='task-123',
211
+ filename='document.pdf',
212
+ url='file:///project/.aitrackdown/attachments/task-123/document.pdf',
213
+ content_type='application/pdf',
214
+ size_bytes=1048576,
215
+ created_at=datetime.now(),
216
+ created_by='user@example.com',
217
+ description='Project specification document',
218
+ metadata={
219
+ 'checksum': 'a3c7f8d2e1b4c5f6...',
220
+ 'sanitized_filename': 'document.pdf'
221
+ }
222
+ )
223
+ ```
224
+
225
+ **Adapter Support:**
226
+
227
+ | Adapter | Support | Notes |
228
+ |---------|---------|-------|
229
+ | AITrackdown | ✅ Full | Local filesystem storage with security features |
230
+ | Jira | ❌ Planned | REST API v3 integration coming soon |
231
+ | Linear | ❌ Planned | GraphQL mutation support coming soon |
232
+ | GitHub | ❌ Not supported | GitHub Issues doesn't support direct attachments |
233
+
169
234
  ### SearchQuery
170
235
 
171
236
  Query parameters for searching tickets.
@@ -364,6 +429,44 @@ class BaseAdapter(ABC, Generic[T]):
364
429
  """Get comments for a ticket."""
365
430
  pass
366
431
 
432
+ # Attachment Operations
433
+ async def add_attachment(
434
+ self,
435
+ ticket_id: str,
436
+ file_path: str,
437
+ description: Optional[str] = None
438
+ ) -> Attachment:
439
+ """Add a file attachment to a ticket.
440
+
441
+ Default implementation raises NotImplementedError.
442
+ Adapters should override to provide attachment support.
443
+ """
444
+ raise NotImplementedError(
445
+ f"{self.__class__.__name__} does not support attachments"
446
+ )
447
+
448
+ async def get_attachments(self, ticket_id: str) -> List[Attachment]:
449
+ """Get all attachments for a ticket.
450
+
451
+ Default implementation returns empty list.
452
+ Adapters should override to provide attachment support.
453
+ """
454
+ return []
455
+
456
+ async def delete_attachment(
457
+ self,
458
+ ticket_id: str,
459
+ attachment_id: str
460
+ ) -> bool:
461
+ """Delete a specific attachment.
462
+
463
+ Default implementation raises NotImplementedError.
464
+ Adapters should override to provide attachment support.
465
+ """
466
+ raise NotImplementedError(
467
+ f"{self.__class__.__name__} does not support attachment deletion"
468
+ )
469
+
367
470
  # State Mapping Utilities
368
471
  def map_state_to_system(self, state: TicketState) -> str:
369
472
  """Map universal state to system-specific state."""