mcp-ticketer 0.4.0__tar.gz → 0.6.2__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 (337) hide show
  1. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.env.example +11 -4
  2. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.github/workflows/publish.yml +1 -1
  3. mcp_ticketer-0.6.2/BEFORE_AFTER_COMPARISON.md +271 -0
  4. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/CHANGELOG.md +168 -1
  5. mcp_ticketer-0.6.2/CLI_RESTRUCTURE_REPORT.md +156 -0
  6. mcp_ticketer-0.6.2/CLI_RESTRUCTURE_TEST_REPORT.md +425 -0
  7. mcp_ticketer-0.6.2/ENV_LOADING_FIX.md +134 -0
  8. mcp_ticketer-0.6.2/FINAL_SUMMARY.md +291 -0
  9. mcp_ticketer-0.6.2/FINAL_VERIFICATION_REPORT.md +507 -0
  10. mcp_ticketer-0.6.2/FIXES_v0.4.10.md +282 -0
  11. mcp_ticketer-0.6.2/FIX_DISCOVERED_FLAG_BUG.md +145 -0
  12. mcp_ticketer-0.6.2/FIX_VERIFICATION_CHECKLIST.md +185 -0
  13. mcp_ticketer-0.6.2/IMPLEMENTATION_SUMMARY.md +300 -0
  14. mcp_ticketer-0.6.2/LINEAR_BUG_FIX_SUMMARY_FINAL.md +196 -0
  15. mcp_ticketer-0.6.2/LINEAR_INIT_BUG_FIX.md +202 -0
  16. mcp_ticketer-0.6.2/LINEAR_INIT_FIX_SUMMARY.md +200 -0
  17. mcp_ticketer-0.6.2/MCP_CONFIGURE_FIX.md +227 -0
  18. mcp_ticketer-0.6.2/MCP_INSTALLER_FIX_COMPLETE.md +124 -0
  19. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/Makefile +16 -2
  20. mcp_ticketer-0.6.2/PATH_TRAVERSAL_SECURITY_TEST_REPORT.md +285 -0
  21. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/PKG-INFO +134 -32
  22. mcp_ticketer-0.6.2/QA_REPORT_PLATFORM_DETECTION.md +509 -0
  23. mcp_ticketer-0.6.2/QA_TEST_REPORT.md +481 -0
  24. mcp_ticketer-0.6.2/QUALITY_GATE_REPORT.md +220 -0
  25. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/README.md +130 -28
  26. mcp_ticketer-0.6.2/SECURITY_RESCAN_REPORT.md +421 -0
  27. mcp_ticketer-0.6.2/TEST_RESULTS.txt +149 -0
  28. mcp_ticketer-0.6.2/VERIFICATION_COMPLETE.md +341 -0
  29. mcp_ticketer-0.6.2/VERIFICATION_REPORT.md +469 -0
  30. mcp_ticketer-0.6.2/VERIFICATION_SUMMARY.md +338 -0
  31. mcp_ticketer-0.6.2/VERIFICATION_v0.4.3.md +284 -0
  32. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/AI_CLIENT_INTEGRATION.md +347 -61
  33. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/API_REFERENCE.md +103 -0
  34. mcp_ticketer-0.6.2/docs/ATTACHMENTS.md +564 -0
  35. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/CONFIGURATION.md +31 -1
  36. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/MIGRATION_GUIDE.md +311 -10
  37. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/QUICK_START.md +238 -28
  38. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/USER_GUIDE.md +48 -3
  39. mcp_ticketer-0.6.2/docs/features/AUTOMATIC_VALIDATION.md +184 -0
  40. mcp_ticketer-0.6.2/docs/features/UPDATE_CHECKING.md +223 -0
  41. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +4 -2
  42. mcp_ticketer-0.6.2/docs/linear_parent_issue_fix.md +212 -0
  43. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/CONFIG_RESOLUTION_FIX.md +9 -10
  44. mcp_ticketer-0.6.2/docs/reports/MCP_COMMAND_SIMPLIFICATION_UPDATE.md +253 -0
  45. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/CLAUDE_DESKTOP_SETUP.md +16 -8
  46. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/CODEX_INTEGRATION.md +31 -19
  47. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/LINEAR_SETUP.md +119 -14
  48. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +4 -3
  49. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/pyproject.toml +12 -8
  50. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/pytest.ini +1 -0
  51. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/__version__.py +1 -1
  52. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/aitrackdown.py +254 -11
  53. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/github.py +19 -19
  54. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/hybrid.py +11 -11
  55. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/jira.py +20 -24
  56. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/adapter.py +210 -12
  57. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/mappers.py +8 -2
  58. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cache/memory.py +6 -5
  59. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/adapter_diagnostics.py +1 -1
  60. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/auggie_configure.py +104 -15
  61. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/codex_configure.py +188 -32
  62. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/configure.py +4 -5
  63. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/diagnostics.py +2 -2
  64. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/discover.py +4 -5
  65. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/gemini_configure.py +107 -26
  66. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/linear_commands.py +95 -12
  67. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/main.py +1292 -246
  68. mcp_ticketer-0.6.2/src/mcp_ticketer/cli/mcp_configure.py +516 -0
  69. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/platform_commands.py +5 -15
  70. mcp_ticketer-0.6.2/src/mcp_ticketer/cli/platform_detection.py +412 -0
  71. mcp_ticketer-0.6.2/src/mcp_ticketer/cli/python_detection.py +126 -0
  72. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/ticket_commands.py +41 -34
  73. mcp_ticketer-0.6.2/src/mcp_ticketer/cli/update_checker.py +313 -0
  74. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/utils.py +24 -23
  75. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/__init__.py +2 -1
  76. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/adapter.py +82 -13
  77. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/config.py +27 -29
  78. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/env_discovery.py +10 -10
  79. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/env_loader.py +8 -8
  80. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/http_client.py +16 -16
  81. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/mappers.py +10 -10
  82. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/models.py +50 -20
  83. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/project_config.py +40 -34
  84. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/registry.py +2 -2
  85. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/__init__.py +33 -0
  86. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/__main__.py +60 -0
  87. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/__init__.py +25 -0
  88. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/__main__.py +60 -0
  89. {mcp_ticketer-0.4.0/src/mcp_ticketer/mcp → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server}/dto.py +32 -32
  90. mcp_ticketer-0.4.0/src/mcp_ticketer/mcp/server.py → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/main.py +27 -25
  91. {mcp_ticketer-0.4.0/src/mcp_ticketer/mcp → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server}/response_builder.py +2 -2
  92. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/server_sdk.py +93 -0
  93. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/__init__.py +38 -0
  94. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/attachment_tools.py +179 -0
  95. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/bulk_tools.py +273 -0
  96. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/comment_tools.py +90 -0
  97. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/hierarchy_tools.py +383 -0
  98. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/pr_tools.py +154 -0
  99. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/search_tools.py +206 -0
  100. mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server/tools/ticket_tools.py +277 -0
  101. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/__init__.py +1 -0
  102. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/health_monitor.py +4 -4
  103. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/manager.py +11 -47
  104. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/queue.py +16 -16
  105. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/ticket_registry.py +12 -12
  106. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/worker.py +2 -2
  107. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/PKG-INFO +134 -32
  108. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/SOURCES.txt +60 -16
  109. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/requires.txt +2 -1
  110. mcp_ticketer-0.6.2/test_discovered_fix.py +234 -0
  111. mcp_ticketer-0.6.2/test_mcp_integration.py +312 -0
  112. mcp_ticketer-0.6.2/test_structure_validation.py +140 -0
  113. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_adapter.py +23 -23
  114. mcp_ticketer-0.6.2/tests/adapters/linear/test_adapter_validation.py +183 -0
  115. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_client.py +19 -19
  116. mcp_ticketer-0.6.2/tests/adapters/linear/test_issue_resolution.py +200 -0
  117. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_mappers.py +6 -6
  118. mcp_ticketer-0.6.2/tests/adapters/linear/test_project_resolution.py +295 -0
  119. mcp_ticketer-0.6.2/tests/adapters/test_aitrackdown_security.py +330 -0
  120. mcp_ticketer-0.6.2/tests/cli/test_python_detection.py +147 -0
  121. mcp_ticketer-0.6.2/tests/cli/test_update_checker.py +237 -0
  122. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/conftest.py +24 -0
  123. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_actual_worker_execution.py +3 -0
  124. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_config_resolution.py +21 -47
  125. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_env_discovery.py +24 -8
  126. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_unified_env_loading.py +3 -0
  127. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_complete_workflow.py +1 -0
  128. mcp_ticketer-0.6.2/tests/e2e/test_mcp_jsonrpc.py +548 -0
  129. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_all_adapters.py +5 -0
  130. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_mcp_server_qa.py +2 -2
  131. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_base_adapter.py +4 -0
  132. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_codex_config.py +6 -9
  133. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_core_registry.py +7 -7
  134. mcp_ticketer-0.6.2/verify_fixes.sh +73 -0
  135. mcp_ticketer-0.4.0/CLI_RESTRUCTURING_SUMMARY.md +0 -272
  136. mcp_ticketer-0.4.0/LINEAR_ADAPTER_REVIEW.md +0 -477
  137. mcp_ticketer-0.4.0/LINEAR_FIX_RECOMMENDATION.md +0 -292
  138. mcp_ticketer-0.4.0/LINEAR_GRAPHQL_TYPE_ANALYSIS.md +0 -300
  139. mcp_ticketer-0.4.0/LINEAR_LABEL_FIX_SUMMARY.md +0 -262
  140. mcp_ticketer-0.4.0/LINEAR_PATTERN_COMPARISON.md +0 -441
  141. mcp_ticketer-0.4.0/LINEAR_QUERY_ALTERNATIVE_ANALYSIS.md +0 -278
  142. mcp_ticketer-0.4.0/LINEAR_RESEARCH_SUMMARY.md +0 -423
  143. mcp_ticketer-0.4.0/LINEAR_TAGS_FIX_SUMMARY.md +0 -238
  144. mcp_ticketer-0.4.0/QUICK_WINS_IMPLEMENTATION.md +0 -320
  145. mcp_ticketer-0.4.0/SECURITY_SCAN_REPORT_v0.1.24.md +0 -668
  146. mcp_ticketer-0.4.0/V0.3.2_RELEASE_FIXES_SUMMARY.md +0 -472
  147. mcp_ticketer-0.4.0/src/mcp_ticketer/cli/mcp_configure.py +0 -309
  148. mcp_ticketer-0.4.0/src/mcp_ticketer/mcp/__init__.py +0 -5
  149. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
  150. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
  151. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
  152. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
  153. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
  154. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
  155. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
  156. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
  157. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.claude.json +0 -0
  158. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.coveragerc +0 -0
  159. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.cursor/mcp.json +0 -0
  160. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.github/workflows/docs.yml +0 -0
  161. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.github/workflows/test.yml +0 -0
  162. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.mcp/config.json +0 -0
  163. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.pre-commit-config.yaml +0 -0
  164. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.python-version +0 -0
  165. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/.readthedocs.yaml +0 -0
  166. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/CLAUDE.md +0 -0
  167. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/LICENSE +0 -0
  168. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/MANIFEST.in +0 -0
  169. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/debug_epic_creation.py +0 -0
  170. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/debug_full_flow.py +0 -0
  171. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/debug_worker_epic.py +0 -0
  172. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/ADAPTERS.md +0 -0
  173. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  174. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/DEVELOPER_GUIDE.md +0 -0
  175. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/ENV_DISCOVERY.md +0 -0
  176. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/MCP_INTEGRATION.md +0 -0
  177. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/PROJECT_CONFIG.md +0 -0
  178. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/PR_INTEGRATION.md +0 -0
  179. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/QUEUE_SYSTEM.md +0 -0
  180. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/QUICK_START_ENV.md +0 -0
  181. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/README.md +0 -0
  182. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
  183. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_archive/README.md +0 -0
  184. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  185. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  186. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  187. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  188. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  189. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  190. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  191. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/adapters/github.md.txt +0 -0
  192. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/adapters.rst.txt +0 -0
  193. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/api.rst.txt +0 -0
  194. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/cli.rst.txt +0 -0
  195. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/development.rst.txt +0 -0
  196. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/examples.rst.txt +0 -0
  197. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/index.rst.txt +0 -0
  198. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/installation.rst.txt +0 -0
  199. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  200. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/adapters/github.md +0 -0
  201. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/adapters.rst +0 -0
  202. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/api.rst +0 -0
  203. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
  204. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
  205. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
  206. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/cli.rst +0 -0
  207. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/conf.py +0 -0
  208. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/CODE_STRUCTURE.md +0 -0
  209. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/CONTRIBUTING.md +0 -0
  210. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/RELEASE.md +0 -0
  211. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development/RELEASING.md +0 -0
  212. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/development.rst +0 -0
  213. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/examples.rst +0 -0
  214. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/index.rst +0 -0
  215. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/installation.rst +0 -0
  216. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/prd/mcp-ticketer-prd.md +0 -0
  217. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
  218. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
  219. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
  220. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
  221. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.4.md +0 -0
  222. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/PUBLICATION_SUCCESS_v0.3.5.md +0 -0
  223. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
  224. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
  225. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
  226. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
  227. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
  228. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/FIX_SUMMARY.md +0 -0
  229. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  230. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
  231. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  232. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
  233. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  234. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
  235. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/TEST_REPORT.md +0 -0
  236. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
  237. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/reports/VERIFICATION_RESULTS.md +0 -0
  238. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/requirements.txt +0 -0
  239. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/setup/JIRA_SETUP.md +0 -0
  240. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
  241. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
  242. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
  243. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
  244. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
  245. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
  246. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
  247. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
  248. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
  249. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/mcp-ticketer +0 -0
  250. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/mcp-ticketer-server +0 -0
  251. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/requirements-dev.txt +0 -0
  252. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/requirements.txt +0 -0
  253. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/README.md +0 -0
  254. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/install.sh +0 -0
  255. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/manage_version.py +0 -0
  256. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/mcp_server.sh +0 -0
  257. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/scripts/test_set_command.sh +0 -0
  258. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/setup.cfg +0 -0
  259. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/setup.py +0 -0
  260. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/__init__.py +0 -0
  261. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/__init__.py +0 -0
  262. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
  263. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/client.py +0 -0
  264. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
  265. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear/types.py +0 -0
  266. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/adapters/linear.py +0 -0
  267. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cache/__init__.py +0 -0
  268. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/__init__.py +0 -0
  269. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  270. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  271. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/cli/simple_health.py +0 -0
  272. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/core/exceptions.py +0 -0
  273. {mcp_ticketer-0.4.0/src/mcp_ticketer/mcp → mcp_ticketer-0.6.2/src/mcp_ticketer/mcp/server}/constants.py +0 -0
  274. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/py.typed +0 -0
  275. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/__main__.py +0 -0
  276. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer/queue/run_worker.py +0 -0
  277. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  278. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  279. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  280. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  281. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/test-tickets/tickets/task-20250924002724.json +0 -0
  282. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/test_linear_fixes.py +0 -0
  283. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/test_worker_persistence.py +0 -0
  284. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/README.md +0 -0
  285. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/__init__.py +0 -0
  286. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/__init__.py +0 -0
  287. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_queries.py +0 -0
  288. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/linear/test_types.py +0 -0
  289. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_aitrackdown.py +0 -0
  290. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_github.py +0 -0
  291. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_github_token.py +0 -0
  292. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_jira.py +0 -0
  293. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_jira_direct.py +0 -0
  294. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_jira_projects.py +0 -0
  295. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_linear.py +0 -0
  296. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_linear_config.py +0 -0
  297. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/adapters/test_linear_native.py +0 -0
  298. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/debug_credential_validation.py +0 -0
  299. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_environment_handoff.py +0 -0
  300. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_queue_processing.py +0 -0
  301. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/core/test_queue_system.py +0 -0
  302. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_adapter_cache.py +0 -0
  303. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_cli_config.py +0 -0
  304. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_cli_vs_simulation.py +0 -0
  305. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_linear_teams.py +0 -0
  306. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_search.py +0 -0
  307. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_test.py +0 -0
  308. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_worker_adapter.py +0 -0
  309. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_worker_simulation.py +0 -0
  310. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/debug/debug_worker_subprocess.py +0 -0
  311. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_comments_and_attachments.py +0 -0
  312. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_complete_ticket_workflow.py +0 -0
  313. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_hierarchy_validation.py +0 -0
  314. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/e2e/test_state_transitions.py +0 -0
  315. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_aitrackdown_commenting.py +0 -0
  316. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_commenting_functionality.py +0 -0
  317. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_comprehensive.py +0 -0
  318. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_hierarchy_and_workflow.py +0 -0
  319. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_jira_github_adapters.py +0 -0
  320. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_pr_functionality.py +0 -0
  321. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_serve_config.py +0 -0
  322. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/integration/test_user_assignment.py +0 -0
  323. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/performance/test_optimizations.py +0 -0
  324. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/performance/test_performance.py +0 -0
  325. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/run_comprehensive_tests.py +0 -0
  326. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_api_usage.py +0 -0
  327. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_basic.py +0 -0
  328. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_comprehensive_qa.py +0 -0
  329. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_error_handling.py +0 -0
  330. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_linear_teams.py +0 -0
  331. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_models.py +0 -0
  332. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/test_queue.py +0 -0
  333. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/__init__.py +0 -0
  334. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_cache_memory.py +0 -0
  335. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_core_exceptions.py +0 -0
  336. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/tests/unit/test_core_models.py +0 -0
  337. {mcp_ticketer-0.4.0 → mcp_ticketer-0.6.2}/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
@@ -57,7 +57,7 @@ jobs:
57
57
  strategy:
58
58
  matrix:
59
59
  os: [ubuntu-latest, macos-latest, windows-latest]
60
- python-version: ['3.9', '3.11', '3.13']
60
+ python-version: ['3.10', '3.11', '3.12', '3.13']
61
61
 
62
62
  steps:
63
63
  - uses: actions/checkout@v4
@@ -0,0 +1,271 @@
1
+ # Before/After Code Comparison - Linear Init Fix
2
+
3
+ ## The Bug
4
+
5
+ When running `mcp-ticketer init` and selecting Linear from the interactive menu without environment variables, users would get an error instead of being prompted for credentials.
6
+
7
+ ## Code Changes
8
+
9
+ ### BEFORE (Lines 652-743) - BROKEN
10
+
11
+ ```python
12
+ elif adapter_type == "linear":
13
+ # If not auto-discovered, build from CLI params or prompt
14
+ if adapter_type not in config["adapters"]:
15
+ linear_config = {} # ❌ Build dict too early
16
+
17
+ # API Key
18
+ linear_api_key = api_key or os.getenv("LINEAR_API_KEY")
19
+ if not linear_api_key and not discovered:
20
+ # ... prompt ...
21
+ linear_api_key = typer.prompt("Enter your Linear API key", hide_input=True)
22
+
23
+ if linear_api_key: # ❌ Only add if exists
24
+ linear_config["api_key"] = linear_api_key
25
+
26
+ # Team info collection...
27
+ linear_team_key = os.getenv("LINEAR_TEAM_KEY")
28
+ linear_team_id = team_id or os.getenv("LINEAR_TEAM_ID")
29
+
30
+ if not linear_team_key and not linear_team_id and not discovered:
31
+ # ... prompt ...
32
+ team_input = typer.prompt("Team URL, key, or ID")
33
+ # ... URL derivation logic ...
34
+
35
+ # Save whichever was provided
36
+ if linear_team_key:
37
+ linear_config["team_key"] = linear_team_key
38
+ if linear_team_id:
39
+ linear_config["team_id"] = linear_team_id
40
+
41
+ # ❌ EARLY VALIDATION - This would exit before saving!
42
+ if not linear_config.get("api_key") or (
43
+ not linear_config.get("team_id") and not linear_config.get("team_key")
44
+ ):
45
+ console.print("[red]Error:[/red] Linear requires both API key and team ID/key")
46
+ console.print("Run 'mcp-ticketer init --adapter linear' with proper credentials")
47
+ raise typer.Exit(1)
48
+
49
+ linear_config["type"] = "linear"
50
+ config["adapters"]["linear"] = linear_config # Never reached if validation failed
51
+ ```
52
+
53
+ ### AFTER (Lines 652-741) - FIXED
54
+
55
+ ```python
56
+ elif adapter_type == "linear":
57
+ # If not auto-discovered, build from CLI params or prompt
58
+ if adapter_type not in config["adapters"]:
59
+ # ✅ Collect variables first, no dict yet
60
+
61
+ # API Key
62
+ linear_api_key = api_key or os.getenv("LINEAR_API_KEY")
63
+ if not linear_api_key and not discovered:
64
+ console.print("\n[bold]Linear Configuration[/bold]")
65
+ console.print("You need a Linear API key to connect to Linear.")
66
+ console.print("[dim]Get your API key at: https://linear.app/settings/api[/dim]\n")
67
+
68
+ linear_api_key = typer.prompt("Enter your Linear API key", hide_input=True)
69
+
70
+ # Team ID or Team Key or Team URL
71
+ linear_team_key = os.getenv("LINEAR_TEAM_KEY")
72
+ linear_team_id = team_id or os.getenv("LINEAR_TEAM_ID")
73
+
74
+ if not linear_team_key and not linear_team_id and not discovered:
75
+ console.print("\n[bold]Linear Team Configuration[/bold]")
76
+ console.print("You can provide either:")
77
+ console.print(" 1. Team URL (e.g., https://linear.app/workspace/team/TEAMKEY/active)")
78
+ console.print(" 2. Team key (e.g., 'ENG', 'DESIGN', 'PRODUCT')")
79
+ console.print(" 3. Team ID (UUID)")
80
+ console.print("[dim]Find team URL or key in: Linear → Your Team → Team Issues Page[/dim]\n")
81
+
82
+ team_input = typer.prompt("Team URL, key, or ID")
83
+
84
+ # Check if input is a URL
85
+ if team_input.startswith("https://linear.app/"):
86
+ # ... URL derivation logic (unchanged) ...
87
+ else:
88
+ # Input is team key or ID
89
+ if len(team_input) > 20: # Likely a UUID
90
+ linear_team_id = team_input
91
+ else:
92
+ linear_team_key = team_input
93
+
94
+ # ✅ Validate AFTER collection (JIRA pattern)
95
+ if not linear_api_key:
96
+ console.print("[red]Error:[/red] Linear API key is required")
97
+ raise typer.Exit(1)
98
+
99
+ if not linear_team_id and not linear_team_key:
100
+ console.print("[red]Error:[/red] Linear requires either team ID or team key")
101
+ raise typer.Exit(1)
102
+
103
+ # ✅ Build config dict AFTER validation passes
104
+ linear_config = {
105
+ "api_key": linear_api_key,
106
+ "type": "linear",
107
+ }
108
+
109
+ # Save whichever was provided
110
+ if linear_team_key:
111
+ linear_config["team_key"] = linear_team_key
112
+ if linear_team_id:
113
+ linear_config["team_id"] = linear_team_id
114
+
115
+ # ✅ Save config (only reached if validation passed)
116
+ config["adapters"]["linear"] = linear_config
117
+ ```
118
+
119
+ ## Key Differences
120
+
121
+ | Aspect | BEFORE (Broken) | AFTER (Fixed) |
122
+ |--------|-----------------|---------------|
123
+ | Dict Creation | Created `linear_config = {}` immediately | Created after validation passes |
124
+ | Validation Timing | Validated partial dict (line 731) | Validates collected variables (line 721) |
125
+ | Error Handling | Could exit before prompts completed | Exits only after all prompts run |
126
+ | Config Building | Built incrementally with `if` checks | Built once with all validated values |
127
+ | Pattern Match | Different from JIRA adapter | Matches JIRA adapter pattern |
128
+
129
+ ## Execution Flow Comparison
130
+
131
+ ### BEFORE - Broken Flow
132
+ ```
133
+ 1. User selects Linear from menu
134
+ 2. linear_config = {} (empty dict created)
135
+ 3. Prompt for API key
136
+ → User enters key
137
+ → linear_config["api_key"] = key
138
+ 4. Prompt for team info
139
+ → User enters team
140
+ → linear_config["team_key"] = team
141
+ 5. ❌ Validation checks linear_config
142
+ → If any field missing: EXIT with error
143
+ → Never saves config
144
+ ```
145
+
146
+ **Problem:** Validation happened on a partially-built dict that might be incomplete due to prompt logic.
147
+
148
+ ### AFTER - Fixed Flow
149
+ ```
150
+ 1. User selects Linear from menu
151
+ 2. Collect API key → linear_api_key variable
152
+ 3. Prompt if needed → linear_api_key = "user_input"
153
+ 4. Collect team info → linear_team_id/key variables
154
+ 5. Prompt if needed → linear_team_key = "user_input"
155
+ 6. ✅ Validate collected variables
156
+ → If missing: EXIT with clear error
157
+ → If present: Continue
158
+ 7. Build linear_config dict
159
+ 8. Save config to adapters
160
+ ```
161
+
162
+ **Solution:** Validation happens on collected variables, then config dict is built only if valid.
163
+
164
+ ## Why This Pattern Works
165
+
166
+ The JIRA adapter (lines 745-803) demonstrates the correct pattern:
167
+
168
+ ```python
169
+ # 1. Collect into variables
170
+ server = jira_server or os.getenv("JIRA_SERVER")
171
+ email = jira_email or os.getenv("JIRA_EMAIL")
172
+ token = api_key or os.getenv("JIRA_API_TOKEN")
173
+
174
+ # 2. Prompt for missing values
175
+ if not server and not discovered:
176
+ server = typer.prompt("JIRA server URL")
177
+ if not email and not discovered:
178
+ email = typer.prompt("Your JIRA email address")
179
+
180
+ # 3. Validate collected variables
181
+ if not server:
182
+ console.print("[red]Error:[/red] JIRA server URL is required")
183
+ raise typer.Exit(1)
184
+
185
+ # 4. Build config dict (only if valid)
186
+ jira_config = {
187
+ "server": server,
188
+ "email": email,
189
+ "api_token": token,
190
+ "type": "jira",
191
+ }
192
+
193
+ # 5. Save config
194
+ config["adapters"]["jira"] = jira_config
195
+ ```
196
+
197
+ Linear now follows the same pattern.
198
+
199
+ ## Impact
200
+
201
+ ### User Experience
202
+ - **Before:** Confusing error message immediately after menu selection
203
+ - **After:** Smooth interactive prompting experience
204
+
205
+ ### Code Consistency
206
+ - **Before:** Linear used different pattern than JIRA
207
+ - **After:** All adapters follow the same pattern
208
+
209
+ ### Test Coverage
210
+ - No existing tests for this functionality (manual testing required)
211
+ - Future improvement: Add unit tests for init command
212
+
213
+ ## Testing the Fix
214
+
215
+ ### Manual Test 1: Interactive Selection
216
+ ```bash
217
+ # Clean environment
218
+ unset LINEAR_API_KEY LINEAR_TEAM_KEY LINEAR_TEAM_ID
219
+ rm -rf ~/.mcp_ticketer
220
+
221
+ # Run init
222
+ mcp-ticketer init
223
+
224
+ # Expected:
225
+ # - No adapter detected
226
+ # - Shows menu: "1. Linear, 2. JIRA, 3. AitRackdown"
227
+ # - Select 1 (Linear)
228
+ # - Prompts: "Enter your Linear API key"
229
+ # - Prompts: "Team URL, key, or ID"
230
+ # - Success message
231
+ # - Config saved to ~/.mcp_ticketer/config.json
232
+ ```
233
+
234
+ ### Manual Test 2: Partial Credentials
235
+ ```bash
236
+ # Set only API key
237
+ export LINEAR_API_KEY="test_key_123"
238
+ unset LINEAR_TEAM_KEY LINEAR_TEAM_ID
239
+
240
+ # Run init
241
+ mcp-ticketer init
242
+
243
+ # Expected:
244
+ # - Detects Linear from environment
245
+ # - Prompts ONLY for team info (not API key)
246
+ # - Success
247
+ ```
248
+
249
+ ### Manual Test 3: Validation Works
250
+ ```bash
251
+ # Try to bypass prompts (hit Enter without input)
252
+ # This should fail with clear error message
253
+ ```
254
+
255
+ ## Verification Checklist
256
+
257
+ - [x] Code compiles (Python syntax valid)
258
+ - [x] Follows JIRA adapter pattern
259
+ - [x] Validation moved after collection
260
+ - [x] Config dict built after validation
261
+ - [x] Error messages are clear
262
+ - [x] All features preserved (URL derivation, discovery)
263
+ - [x] No regressions in CLI parameters
264
+ - [ ] Manual testing completed (requires user interaction)
265
+ - [ ] Unit tests added (future work)
266
+
267
+ ## Related Documentation
268
+
269
+ - See `LINEAR_INIT_FIX_SUMMARY.md` for detailed implementation notes
270
+ - See `/src/mcp_ticketer/cli/main.py` lines 652-741 for actual code
271
+ - Compare with JIRA adapter (lines 743-803) for reference pattern
@@ -4,7 +4,174 @@ 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.15] - 2025-11-07
8
+
9
+ ### Fixed
10
+ - **Linear Task Creation with Parent Issues**: Fixed Linear adapter to resolve issue identifiers to UUIDs
11
+ - Task creation with `parent_issue` parameter now works with both issue identifiers (e.g., "ENG-842") and UUIDs
12
+ - Added automatic identifier resolution via GraphQL query
13
+ - Eliminates "Variable '$issueId' of non-null type 'UUID!' must not be null" errors
14
+ - Resolves validation failures when creating tasks under parent issues
15
+
16
+ ### Added
17
+ - **Linear Issue Resolution Method**: Added `_resolve_issue_id()` for automatic identifier resolution
18
+ - Resolves issue identifiers (like "ENG-842") to UUIDs via GraphQL
19
+ - Provides clear error messages when issues cannot be found
20
+ - Enables flexible parent issue specification in task creation
21
+ - Comprehensive test coverage with 13 new tests
22
+
23
+ ### Changed
24
+ - **Code Quality**: Import formatting standardization across codebase
25
+ - Applied consistent import ordering to 38 files
26
+ - Improved code consistency and maintainability
27
+ - No functional changes to core logic
28
+
29
+ ### Testing
30
+ - **Issue Resolution Tests**: Added comprehensive test suite for Linear issue resolution
31
+ - Created `tests/adapters/linear/test_issue_resolution.py` with 13 tests
32
+ - Tests cover identifier resolution, UUID handling, and error cases
33
+ - Validates task creation with parent issues
34
+ - 100% test coverage for new resolution functionality
35
+
36
+ ### Documentation
37
+ - **Linear Parent Issue Fix**: Added detailed documentation in `docs/linear_parent_issue_fix.md`
38
+ - Explains the root cause of the issue
39
+ - Documents the resolution approach
40
+ - Provides examples and testing guidance
41
+
42
+ ## [0.4.11] - 2025-10-28
43
+
44
+ ### Fixed
45
+ - **CRITICAL: MCP Installer Command Structure**: Fixed all MCP installers to use Python module invocation pattern
46
+ - Changed from: `command: {venv}/bin/mcp-ticketer`, `args: ["mcp", project_path]`
47
+ - Changed to: `command: {venv}/bin/python`, `args: ["-m", "mcp_ticketer.mcp.server", project_path]`
48
+ - Affects: Claude Code, Auggie CLI, Gemini CLI, and Codex CLI installers
49
+ - Impact: Installer now works with any Python environment (pip, pipx, editable installs)
50
+ - Matches established pattern from mcp-vector-search and other MCP servers
51
+
52
+ ### Files Modified
53
+ - `src/mcp_ticketer/cli/mcp_configure.py` - Claude Code/Desktop installer
54
+ - `src/mcp_ticketer/cli/auggie_configure.py` - Auggie CLI installer
55
+ - `src/mcp_ticketer/cli/gemini_configure.py` - Gemini CLI installer
56
+ - `src/mcp_ticketer/cli/codex_configure.py` - Codex CLI installer
57
+
58
+ ### Technical Details
59
+ - Uses Python executable directly with `-m` module flag
60
+ - No longer depends on `mcp-ticketer` binary existing in target venv
61
+ - Works across all installation methods and Python environments
62
+ - Provides consistent behavior with other MCP ecosystem tools
63
+
64
+ ## [0.4.10] - 2025-10-28
65
+
66
+ ### Fixed
67
+ - **CRITICAL: MCP Installer Configuration**: Fixed Claude Code MCP installer to write to correct config location
68
+ - Changed config path from `.claude/settings.local.json` to `~/.claude.json`
69
+ - Updated to use project-specific structure: `.projects[path].mcpServers["mcp-ticketer"]`
70
+ - Added backward compatibility with `.claude/mcp.local.json`
71
+ - Enhanced error handling for invalid JSON and empty config files
72
+ - Added `type: "stdio"` field required by Claude Code
73
+ - Uses absolute project paths with `Path.cwd().resolve()`
74
+ - Matches working pattern from mcp-vector-search installation
75
+ - Resolves issue where mcp-ticketer server failed to connect in Claude Code
76
+
77
+ ### Technical Details
78
+ - Updated `find_claude_mcp_config()` to return `~/.claude.json` for Claude Code
79
+ - Enhanced `load_claude_mcp_config()` with platform-specific structure support
80
+ - Refactored `configure_claude_mcp()` to write to both primary and legacy locations
81
+ - Updated `remove_claude_mcp()` to clean up both config locations
82
+ - Added comprehensive JSON parsing and empty file handling
83
+
84
+ ## [0.4.4] - 2025-10-27
85
+
86
+ ### Changed
87
+ - **CLI restructure**: `install <platform>` for platform installation (claude-code, claude-desktop, gemini, codex, auggie)
88
+ - **MCP commands**: Reserved `mcp` namespace for MCP server actions (serve, status, stop)
89
+ - Platform names now positional arguments instead of flags for better UX
90
+
91
+ ### Added
92
+ - **mcp status**: New command showing configuration status for all platforms
93
+ - **mcp stop**: New command with informational message about MCP architecture
94
+
95
+ ### Improved
96
+ - Better command structure (install for platforms, mcp for actions)
97
+ - Clearer error messages with available options
98
+ - Maintained full backward compatibility with legacy commands
99
+
100
+ ### Testing
101
+ - 19/19 CLI tests passed (100% success rate)
102
+
103
+ ## [0.4.3] - 2025-10-27
104
+
105
+ ### Added
106
+ - **LINEAR_TEAM_KEY Environment Variable**: Easier Linear configuration with team keys
107
+ - Added `LINEAR_TEAM_KEY` support as primary configuration option
108
+ - Team key (e.g., "ENG", "DESIGN") now recommended over team ID (UUID)
109
+ - Automatic resolution of team key to team ID in Linear adapter
110
+ - Updated `.env.example` with LINEAR_TEAM_KEY as default option
111
+ - CLI `init` command now prompts for team key by default
112
+ - **Command Synonyms**: Init, install, and setup commands are now fully synonymous
113
+ - `mcp-ticketer init` - Initialize configuration
114
+ - `mcp-ticketer install` - Install and configure (same as init)
115
+ - `mcp-ticketer setup` - Setup (same as init)
116
+ - All three commands accept identical parameters and behave identically
117
+ - **Attachment Model**: Universal file attachment support
118
+ - New `Attachment` model in core models for cross-adapter attachment representation
119
+ - Fields: id, ticket_id, filename, url, content_type, size_bytes, created_at, created_by, description, metadata
120
+ - Full documentation in new `docs/ATTACHMENTS.md` guide
121
+ - **AITrackdown Attachment Support**: Complete file attachment implementation
122
+ - `add_attachment()` - Upload files to local filesystem with security features
123
+ - `get_attachments()` - List all attachments for a ticket
124
+ - `delete_attachment()` - Remove specific attachments
125
+ - Local filesystem storage in `.aitrackdown/attachments/<ticket-id>/` directories
126
+ - Automatic filename sanitization to prevent security issues
127
+ - SHA256 checksumming for file integrity verification
128
+ - MIME type detection based on file extension
129
+ - Size validation with configurable limits (default 100MB)
130
+ - Organized per-ticket storage structure
131
+ - **MCP Attachment Tools**: AI agent attachment support with fallback
132
+ - `ticket_attach` - Add file attachments via MCP
133
+ - `ticket_attachments` - List attachments via MCP
134
+ - `ticket_delete_attachment` - Delete attachments via MCP
135
+ - Automatic fallback to comments for adapters without attachment support
136
+ - Graceful degradation for Linear, Jira, and GitHub adapters
137
+
138
+ ### Changed
139
+ - **Linear Configuration**: LINEAR_TEAM_KEY is now the primary/recommended option
140
+ - Team ID (LINEAR_TEAM_ID) still supported for backward compatibility
141
+ - CLI init flow updated to prompt for team key first
142
+ - Documentation updated across README, QUICK_START, and setup guides
143
+ - **Environment Variable Priority**: LINEAR_TEAM_KEY takes precedence over LINEAR_TEAM_ID
144
+ - When both are present, LINEAR_TEAM_KEY is used
145
+ - Adapter automatically resolves team key to team ID via GraphQL
146
+ - **Documentation Structure**: New comprehensive attachment documentation
147
+ - Created `docs/ATTACHMENTS.md` (400+ lines)
148
+ - Updated README.md with attachment examples and LINEAR_TEAM_KEY info
149
+ - Updated QUICK_START.md with attachment usage and Linear team key setup
150
+ - Updated API_REFERENCE.md with complete Attachment model specification
151
+ - Added configuration section to README with Linear setup details
152
+
153
+ ### Fixed
154
+ - **LINEAR_TEAM_KEY Environment Loading**: Proper loading from .env files
155
+ - Fixed `project_config.py` to check all LINEAR_* environment variables
156
+ - Environment variable discovery now detects LINEAR_TEAM_KEY
157
+ - Resolves issues where LINEAR_TEAM_KEY wasn't being recognized
158
+
159
+ ### Documentation
160
+ - **New Files**:
161
+ - `docs/ATTACHMENTS.md` - Comprehensive attachment guide with examples, security notes, and roadmap
162
+ - **Updated Files**:
163
+ - `README.md` - Added attachment features, LINEAR_TEAM_KEY configuration, and command synonyms
164
+ - `docs/QUICK_START.md` - Added attachment examples and LINEAR_TEAM_KEY setup instructions
165
+ - `docs/API_REFERENCE.md` - Added Attachment model specification and adapter methods
166
+ - `.env.example` - Updated with LINEAR_TEAM_KEY as primary option with clear instructions
167
+
168
+ ### Security
169
+ - **Attachment Security Features**:
170
+ - Filename sanitization prevents path traversal and injection attacks
171
+ - Path resolution validates files stay within allowed directories
172
+ - File size limits prevent disk exhaustion
173
+ - SHA256 checksums enable integrity verification
174
+ - Isolated per-ticket storage prevents cross-ticket access
8
175
 
9
176
  ## [0.3.6] - 2025-01-25
10
177
 
@@ -0,0 +1,156 @@
1
+ # CLI Command Restructure Report
2
+
3
+ ## Summary
4
+ Successfully restructured CLI commands to have clearer separation between platform installation and MCP server operations.
5
+
6
+ ## Changes Made
7
+
8
+ ### 1. Install Command Restructure
9
+ **Old Behavior:**
10
+ ```bash
11
+ # Platform installation via flag
12
+ mcp-ticketer install --platform claude-code
13
+ mcp-ticketer install --platform claude-desktop
14
+
15
+ # Adapter setup (default)
16
+ mcp-ticketer install
17
+ mcp-ticketer install --adapter linear
18
+ ```
19
+
20
+ **New Behavior:**
21
+ ```bash
22
+ # Platform installation via positional argument (NEW)
23
+ mcp-ticketer install claude-code
24
+ mcp-ticketer install claude-desktop
25
+ mcp-ticketer install gemini
26
+ mcp-ticketer install codex
27
+ mcp-ticketer install auggie
28
+
29
+ # Adapter setup (unchanged - backward compatible)
30
+ mcp-ticketer install
31
+ mcp-ticketer install --adapter linear
32
+ ```
33
+
34
+ ### 2. MCP Command Group Enhancement
35
+ **Added Commands:**
36
+ ```bash
37
+ mcp-ticketer mcp status # Check MCP configuration status
38
+ mcp-ticketer mcp stop # Placeholder (explains MCP is on-demand)
39
+ ```
40
+
41
+ **Existing Commands (unchanged):**
42
+ ```bash
43
+ mcp-ticketer mcp serve # Start MCP server
44
+ mcp-ticketer mcp claude # Configure Claude (legacy)
45
+ mcp-ticketer mcp gemini # Configure Gemini (legacy)
46
+ mcp-ticketer mcp codex # Configure Codex (legacy)
47
+ mcp-ticketer mcp auggie # Configure Auggie (legacy)
48
+ ```
49
+
50
+ ## Command Structure Comparison
51
+
52
+ ### Platform Installation
53
+ | Old Syntax | New Syntax (Recommended) | Legacy Support |
54
+ |------------|-------------------------|----------------|
55
+ | `mcp-ticketer install --platform claude-code` | `mcp-ticketer install claude-code` | ✓ (still works) |
56
+ | `mcp-ticketer mcp claude` | `mcp-ticketer install claude-code` | ✓ (still works) |
57
+ | N/A | `mcp-ticketer install claude-desktop` | ✓ (new) |
58
+ | `mcp-ticketer mcp gemini` | `mcp-ticketer install gemini` | ✓ (still works) |
59
+
60
+ ### MCP Server Operations
61
+ | Command | Purpose | Status |
62
+ |---------|---------|--------|
63
+ | `mcp-ticketer mcp serve` | Start MCP server | Existing |
64
+ | `mcp-ticketer mcp status` | Check configuration | **NEW** |
65
+ | `mcp-ticketer mcp stop` | Stop server (placeholder) | **NEW** |
66
+
67
+ ## Test Results
68
+
69
+ ### ✓ Help Text
70
+ ```bash
71
+ $ mcp-ticketer install --help
72
+ # Shows platform as positional argument ✓
73
+
74
+ $ mcp-ticketer mcp --help
75
+ # Shows serve, status, stop, claude, gemini, codex, auggie ✓
76
+ ```
77
+
78
+ ### ✓ Install Command
79
+ ```bash
80
+ $ mcp-ticketer install claude-code --dry-run
81
+ # DRY RUN - Would install for Claude Code ✓
82
+
83
+ $ mcp-ticketer install
84
+ # Runs adapter setup wizard (backward compatible) ✓
85
+ ```
86
+
87
+ ### ✓ MCP Commands
88
+ ```bash
89
+ $ mcp-ticketer mcp status
90
+ # Shows configuration status for all platforms ✓
91
+
92
+ $ mcp-ticketer mcp stop
93
+ # Explains MCP is on-demand (no persistent server) ✓
94
+
95
+ $ mcp-ticketer mcp claude --help
96
+ # Still works for backward compatibility ✓
97
+ ```
98
+
99
+ ## Backward Compatibility
100
+
101
+ ### ✓ Maintained
102
+ 1. `mcp-ticketer install` (no args) - Still runs adapter setup
103
+ 2. `mcp-ticketer install --adapter linear` - Still works
104
+ 3. `mcp-ticketer mcp claude` - Still configures Claude Code
105
+ 4. `mcp-ticketer mcp gemini` - Still configures Gemini
106
+ 5. `mcp-ticketer mcp codex` - Still configures Codex
107
+ 6. `mcp-ticketer mcp auggie` - Still configures Auggie
108
+ 7. `mcp-ticketer mcp serve` - Still starts MCP server
109
+
110
+ ### ✓ Enhanced
111
+ 1. `mcp-ticketer install <platform>` - New, clearer syntax
112
+ 2. `mcp-ticketer mcp status` - New status command
113
+ 3. `mcp-ticketer mcp stop` - New stop command (informational)
114
+
115
+ ## Benefits
116
+
117
+ 1. **Clearer Command Structure**: Platform names as positional arguments make the command more intuitive
118
+ 2. **Better Discoverability**: `mcp-ticketer install --help` now clearly shows available platforms
119
+ 3. **Consistent Patterns**: Follows common CLI patterns (e.g., `git remote add <name>`)
120
+ 4. **Backward Compatible**: All old command paths still work
121
+ 5. **Status Visibility**: New `mcp status` command shows configuration state across all platforms
122
+
123
+ ## Files Modified
124
+ - `/Users/masa/Projects/mcp-ticketer/src/mcp_ticketer/cli/main.py`
125
+ - Modified `install()` command to accept platform as positional argument
126
+ - Added `mcp_status()` command
127
+ - Added `mcp_stop()` command
128
+ - Updated help text in `_show_next_steps()`
129
+
130
+ ## Next Steps
131
+ 1. Update documentation to reflect new command structure
132
+ 2. Add migration guide for users using old syntax
133
+ 3. Consider deprecation warnings for `--platform` flag (optional)
134
+ 4. Update examples in README and docs
135
+
136
+ ## Success Criteria
137
+ - [x] `mcp-ticketer install claude-code` works for platform installation
138
+ - [x] `mcp-ticketer mcp status` shows MCP configuration status
139
+ - [x] `mcp-ticketer mcp serve` works for MCP server
140
+ - [x] Old command paths still work for backward compatibility
141
+ - [x] Help text clearly explains command structure
142
+ - [x] All tests pass
143
+
144
+ ## Migration Path for Users
145
+ ```bash
146
+ # Old way (still works)
147
+ mcp-ticketer install --platform claude-code
148
+ mcp-ticketer mcp claude
149
+
150
+ # New way (recommended)
151
+ mcp-ticketer install claude-code
152
+
153
+ # Check configuration
154
+ mcp-ticketer mcp status
155
+ ```
156
+