mcp-ticketer 0.3.3__tar.gz → 0.3.4__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 (310) hide show
  1. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/CHANGELOG.md +26 -0
  2. {mcp_ticketer-0.3.3/src/mcp_ticketer.egg-info → mcp_ticketer-0.3.4}/PKG-INFO +1 -1
  3. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/pyproject.toml +1 -1
  4. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/__version__.py +1 -1
  5. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear/adapter.py +103 -1
  6. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear/mappers.py +2 -3
  7. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/main.py +15 -0
  8. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/models.py +30 -2
  9. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4/src/mcp_ticketer.egg-info}/PKG-INFO +1 -1
  10. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_jira.py +3 -0
  11. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_jira_direct.py +6 -0
  12. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_jira_projects.py +6 -0
  13. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_linear.py +2 -0
  14. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_linear_config.py +3 -0
  15. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_linear_native.py +3 -0
  16. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/comments/comment-20251024141042175430.json +0 -0
  17. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/comments/comment-20251024141042175768.json +0 -0
  18. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/comments/comment-20251024141042175888.json +0 -0
  19. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/comments/comment-20251024141042175987.json +0 -0
  20. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/comments/comment-20251024141042176075.json +0 -0
  21. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/comments/comment-20251024141042176163.json +0 -0
  22. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/tickets/task-20251024141042175062.json +0 -0
  23. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.aitrackdown-test/tickets/task-20251024141042175285.json +0 -0
  24. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/.dependency_cache +0 -0
  25. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/.mpm_deployment_state +0 -0
  26. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/agent-manager.md +0 -0
  27. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/agentic-coder-optimizer.md +0 -0
  28. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/api_qa.md +0 -0
  29. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/clerk-ops.md +0 -0
  30. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/code_analyzer.md +0 -0
  31. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/content-agent.md +0 -0
  32. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/dart_engineer.md +0 -0
  33. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/data_engineer.md +0 -0
  34. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/documentation.md +0 -0
  35. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/engineer.md +0 -0
  36. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/gcp_ops_agent.md +0 -0
  37. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/golang_engineer.md +0 -0
  38. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/imagemagick.md +0 -0
  39. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/java_engineer.md +0 -0
  40. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/local_ops_agent.md +0 -0
  41. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/memory_manager.md +0 -0
  42. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/nextjs_engineer.md +0 -0
  43. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/ops.md +0 -0
  44. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/php-engineer.md +0 -0
  45. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/product_owner.md +0 -0
  46. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/project_organizer.md +0 -0
  47. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/prompt-engineer.md +0 -0
  48. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/python_engineer.md +0 -0
  49. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/qa.md +0 -0
  50. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/react_engineer.md +0 -0
  51. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/refactoring_engineer.md +0 -0
  52. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/research.md +0 -0
  53. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/ruby-engineer.md +0 -0
  54. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/rust_engineer.md +0 -0
  55. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/security.md +0 -0
  56. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/ticketing.md +0 -0
  57. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/typescript_engineer.md +0 -0
  58. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/vercel_ops_agent.md +0 -0
  59. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/version_control.md +0 -0
  60. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/web_qa.md +0 -0
  61. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/agents/web_ui.md +0 -0
  62. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/mcp.json +0 -0
  63. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude/mcp.local.json +0 -0
  64. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/config/project.json +0 -0
  65. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/mcp_auto_config_preference.json +0 -0
  66. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/README.md +0 -0
  67. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/agentic_coder_optimizer_memories.md +0 -0
  68. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/documentation_memories.md +0 -0
  69. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/engineer_memories.md +0 -0
  70. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/ops_memories.md +0 -0
  71. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/project_knowledge_memories.md +0 -0
  72. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/qa_memories.md +0 -0
  73. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/research_memories.md +0 -0
  74. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/version-control_memories.md +0 -0
  75. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude-mpm/memories/workflows_memories.md +0 -0
  76. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.claude.json +0 -0
  77. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.coveragerc +0 -0
  78. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.env.example +0 -0
  79. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.github/workflows/docs.yml +0 -0
  80. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.github/workflows/publish.yml +0 -0
  81. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.github/workflows/test.yml +0 -0
  82. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.mcp/config.json +0 -0
  83. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.pre-commit-config.yaml +0 -0
  84. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.python-version +0 -0
  85. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/.readthedocs.yaml +0 -0
  86. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/CLAUDE.md +0 -0
  87. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/LICENSE +0 -0
  88. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/MANIFEST.in +0 -0
  89. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/Makefile +0 -0
  90. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/README.md +0 -0
  91. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/SECURITY_SCAN_REPORT_v0.1.24.md +0 -0
  92. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/ADAPTERS.md +0 -0
  93. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/AI_CLIENT_INTEGRATION.md +0 -0
  94. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/API_REFERENCE.md +0 -0
  95. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/CONFIGURATION.md +0 -0
  96. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/CONFIG_RESOLUTION_FLOW.md +0 -0
  97. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/DEVELOPER_GUIDE.md +0 -0
  98. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/ENV_DISCOVERY.md +0 -0
  99. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/MCP_INTEGRATION.md +0 -0
  100. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/MIGRATION_GUIDE.md +0 -0
  101. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/PROJECT_CONFIG.md +0 -0
  102. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/PR_INTEGRATION.md +0 -0
  103. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/QUEUE_SYSTEM.md +0 -0
  104. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/QUICK_START.md +0 -0
  105. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/QUICK_START_ENV.md +0 -0
  106. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/README.md +0 -0
  107. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/USER_GUIDE.md +0 -0
  108. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/VERSIONING_AND_BUILD_TRACKING.md +0 -0
  109. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_archive/README.md +0 -0
  110. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/ADAPTERS.md.txt +0 -0
  111. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/API_REFERENCE.md.txt +0 -0
  112. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/CONFIGURATION.md.txt +0 -0
  113. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/DEVELOPER_GUIDE.md.txt +0 -0
  114. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/MCP_INTEGRATION.md.txt +0 -0
  115. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/MIGRATION_GUIDE.md.txt +0 -0
  116. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/USER_GUIDE.md.txt +0 -0
  117. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/adapters/github.md.txt +0 -0
  118. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/adapters.rst.txt +0 -0
  119. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/api.rst.txt +0 -0
  120. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/cli.rst.txt +0 -0
  121. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/development.rst.txt +0 -0
  122. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/examples.rst.txt +0 -0
  123. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/index.rst.txt +0 -0
  124. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/installation.rst.txt +0 -0
  125. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/_build/_sources/prd/mcp-ticketer-prd.md.txt +0 -0
  126. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/adapters/github.md +0 -0
  127. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/adapters.rst +0 -0
  128. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/api.rst +0 -0
  129. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/changelogs/CHANGELOG_v0.2.0.md +0 -0
  130. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/changelogs/CHANGELOG_v0.3.0.md +0 -0
  131. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/changelogs/CHANGELOG_v0.3.1.md +0 -0
  132. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/cli.rst +0 -0
  133. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/conf.py +0 -0
  134. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/development/CODE_STRUCTURE.md +0 -0
  135. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/development/CONTRIBUTING.md +0 -0
  136. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/development/RELEASE.md +0 -0
  137. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/development/RELEASING.md +0 -0
  138. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/development.rst +0 -0
  139. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/examples.rst +0 -0
  140. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/guides/BULLETPROOF_TICKET_CREATION_GUIDE.md +0 -0
  141. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/index.rst +0 -0
  142. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/installation.rst +0 -0
  143. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/prd/mcp-ticketer-prd.md +0 -0
  144. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/releases/PUBLICATION_GUIDE_v0.2.0.md +0 -0
  145. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/releases/PUBLICATION_SUCCESS_v0.2.0.md +0 -0
  146. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/releases/PUBLICATION_SUCCESS_v0.3.0.md +0 -0
  147. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/releases/PUBLICATION_SUCCESS_v0.3.1.md +0 -0
  148. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/releases/RELEASE_v0.1.39_SUMMARY.md +0 -0
  149. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/releases/RELEASE_v0.2.0_SUMMARY.md +0 -0
  150. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/CONFIG_RESOLUTION_FIX.md +0 -0
  151. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/CREDENTIAL_VALIDATION_FIX.md +0 -0
  152. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/DIAGNOSTICS_FEATURE.md +0 -0
  153. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/ENV_DISCOVERY_COMPLETE.md +0 -0
  154. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/FIX_SUMMARY.md +0 -0
  155. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/HIERARCHY_IMPLEMENTATION_SUMMARY.md +0 -0
  156. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/IMPLEMENTATION_SUMMARY.md +0 -0
  157. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/MCP_CONFIGURATION_TEST_REPORT.md +0 -0
  158. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/OPTIMIZATION_SUMMARY.md +0 -0
  159. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/PROJECT_INITIALIZATION_SUMMARY.md +0 -0
  160. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/TEST_COVERAGE_REPORT.md +0 -0
  161. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/TEST_REPORT.md +0 -0
  162. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/TEST_RESULTS_SUMMARY.md +0 -0
  163. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/reports/VERIFICATION_RESULTS.md +0 -0
  164. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/requirements.txt +0 -0
  165. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/setup/CLAUDE_DESKTOP_SETUP.md +0 -0
  166. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/setup/CODEX_INTEGRATION.md +0 -0
  167. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/setup/JIRA_SETUP.md +0 -0
  168. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/setup/LINEAR_SETUP.md +0 -0
  169. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/AUTO_DISCOVERY_BUG_FIX_SUMMARY.md +0 -0
  170. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/BULLETPROOF_IMPROVEMENTS_SUMMARY.md +0 -0
  171. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/COMMAND_SYNONYMS_SUMMARY.md +0 -0
  172. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/COMPREHENSIVE_TESTING_SUMMARY.md +0 -0
  173. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/INTERACTIVE_CLI_SETUP_SUMMARY.md +0 -0
  174. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/LINEAR_ADAPTER_INITIALIZATION_BUG_FIX.md +0 -0
  175. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/MODULE_REFACTORING_ANALYSIS.md +0 -0
  176. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/MODULE_REFACTORING_SUMMARY.md +0 -0
  177. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/PROJECT_CLEANUP_SUMMARY.md +0 -0
  178. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/docs/summaries/REFACTORED_ENV_SOLUTION_SUMMARY.md +0 -0
  179. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/mcp-ticketer +0 -0
  180. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/mcp-ticketer-server +0 -0
  181. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/pytest.ini +0 -0
  182. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/requirements-dev.txt +0 -0
  183. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/requirements.txt +0 -0
  184. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/scripts/README.md +0 -0
  185. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/scripts/install.sh +0 -0
  186. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/scripts/manage_version.py +0 -0
  187. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/scripts/mcp_server.sh +0 -0
  188. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/scripts/test_set_command.sh +0 -0
  189. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/setup.cfg +0 -0
  190. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/setup.py +0 -0
  191. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/__init__.py +0 -0
  192. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/__init__.py +0 -0
  193. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/aitrackdown.py +0 -0
  194. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/github.py +0 -0
  195. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/hybrid.py +0 -0
  196. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/jira.py +0 -0
  197. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear/__init__.py +0 -0
  198. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear/client.py +0 -0
  199. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear/queries.py +0 -0
  200. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear/types.py +0 -0
  201. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/adapters/linear.py +0 -0
  202. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cache/__init__.py +0 -0
  203. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cache/memory.py +0 -0
  204. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/__init__.py +0 -0
  205. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/adapter_diagnostics.py +0 -0
  206. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/auggie_configure.py +0 -0
  207. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/codex_configure.py +0 -0
  208. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/configure.py +0 -0
  209. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/diagnostics.py +0 -0
  210. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/discover.py +0 -0
  211. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/gemini_configure.py +0 -0
  212. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/linear_commands.py +0 -0
  213. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/mcp_configure.py +0 -0
  214. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/migrate_config.py +0 -0
  215. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/queue_commands.py +0 -0
  216. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/simple_health.py +0 -0
  217. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/cli/utils.py +0 -0
  218. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/__init__.py +0 -0
  219. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/adapter.py +0 -0
  220. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/config.py +0 -0
  221. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/env_discovery.py +0 -0
  222. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/env_loader.py +0 -0
  223. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/exceptions.py +0 -0
  224. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/http_client.py +0 -0
  225. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/mappers.py +0 -0
  226. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/project_config.py +0 -0
  227. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/core/registry.py +0 -0
  228. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/mcp/__init__.py +0 -0
  229. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/mcp/constants.py +0 -0
  230. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/mcp/dto.py +0 -0
  231. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/mcp/response_builder.py +0 -0
  232. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/mcp/server.py +0 -0
  233. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/py.typed +0 -0
  234. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/__init__.py +0 -0
  235. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/__main__.py +0 -0
  236. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/health_monitor.py +0 -0
  237. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/manager.py +0 -0
  238. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/queue.py +0 -0
  239. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/run_worker.py +0 -0
  240. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/ticket_registry.py +0 -0
  241. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer/queue/worker.py +0 -0
  242. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer.egg-info/SOURCES.txt +0 -0
  243. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer.egg-info/dependency_links.txt +0 -0
  244. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer.egg-info/entry_points.txt +0 -0
  245. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer.egg-info/not-zip-safe +0 -0
  246. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer.egg-info/requires.txt +0 -0
  247. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/src/mcp_ticketer.egg-info/top_level.txt +0 -0
  248. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/test-tickets/tickets/task-20250924002724.json +0 -0
  249. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/README.md +0 -0
  250. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/__init__.py +0 -0
  251. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/linear/__init__.py +0 -0
  252. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/linear/test_adapter.py +0 -0
  253. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/linear/test_client.py +0 -0
  254. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/linear/test_mappers.py +0 -0
  255. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/linear/test_queries.py +0 -0
  256. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/linear/test_types.py +0 -0
  257. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_aitrackdown.py +0 -0
  258. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_github.py +0 -0
  259. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/adapters/test_github_token.py +0 -0
  260. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/conftest.py +0 -0
  261. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/debug_credential_validation.py +0 -0
  262. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_actual_worker_execution.py +0 -0
  263. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_config_resolution.py +0 -0
  264. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_env_discovery.py +0 -0
  265. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_environment_handoff.py +0 -0
  266. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_queue_processing.py +0 -0
  267. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_queue_system.py +0 -0
  268. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/core/test_unified_env_loading.py +0 -0
  269. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_adapter_cache.py +0 -0
  270. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_cli_config.py +0 -0
  271. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_cli_vs_simulation.py +0 -0
  272. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_linear_teams.py +0 -0
  273. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_search.py +0 -0
  274. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_test.py +0 -0
  275. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_worker_adapter.py +0 -0
  276. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_worker_simulation.py +0 -0
  277. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/debug/debug_worker_subprocess.py +0 -0
  278. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/e2e/test_comments_and_attachments.py +0 -0
  279. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/e2e/test_complete_ticket_workflow.py +0 -0
  280. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/e2e/test_complete_workflow.py +0 -0
  281. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/e2e/test_hierarchy_validation.py +0 -0
  282. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/e2e/test_state_transitions.py +0 -0
  283. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_aitrackdown_commenting.py +0 -0
  284. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_all_adapters.py +0 -0
  285. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_commenting_functionality.py +0 -0
  286. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_comprehensive.py +0 -0
  287. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_hierarchy_and_workflow.py +0 -0
  288. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_jira_github_adapters.py +0 -0
  289. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_mcp_server_qa.py +0 -0
  290. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_pr_functionality.py +0 -0
  291. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_serve_config.py +0 -0
  292. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/integration/test_user_assignment.py +0 -0
  293. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/performance/test_optimizations.py +0 -0
  294. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/performance/test_performance.py +0 -0
  295. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/run_comprehensive_tests.py +0 -0
  296. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_api_usage.py +0 -0
  297. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_base_adapter.py +0 -0
  298. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_basic.py +0 -0
  299. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_codex_config.py +0 -0
  300. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_comprehensive_qa.py +0 -0
  301. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_error_handling.py +0 -0
  302. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_linear_teams.py +0 -0
  303. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_models.py +0 -0
  304. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/test_queue.py +0 -0
  305. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/unit/__init__.py +0 -0
  306. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/unit/test_cache_memory.py +0 -0
  307. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/unit/test_core_exceptions.py +0 -0
  308. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/unit/test_core_models.py +0 -0
  309. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tests/unit/test_core_registry.py +0 -0
  310. {mcp_ticketer-0.3.3 → mcp_ticketer-0.3.4}/tox.ini +0 -0
@@ -6,6 +6,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.4] - 2025-01-25
10
+
11
+ ### Added
12
+ - **Linear Label Resolution**: Automatic label ID resolution with case-insensitive matching
13
+ - Added `_load_team_labels()` method for efficient label caching
14
+ - Added `_resolve_label_ids()` with comprehensive debug logging
15
+ - Labels are now properly included when creating Linear issues
16
+ - **Project Property Synonym**: `project` property added as synonym for `parent_epic` in Task model
17
+ - CLI now supports both `--project` and `--epic` parameters for consistency
18
+
19
+ ### Fixed
20
+ - **Test Reliability**: Added missing `pytest.mark.asyncio` decorators to JIRA adapter tests
21
+ - Fixed `test_jira_jql` function to properly run async tests
22
+ - Fixed `test_jira_adapter` to include async decorator
23
+ - **Linear Adapter**:
24
+ - Fixed default state mapping to use "To-Do" instead of "Backlog"
25
+ - Fixed `build_linear_issue_input()` to properly include labelIds
26
+ - Improved error handling and validation
27
+
28
+ ### Changed
29
+ - **Code Formatting**: Applied comprehensive formatting across entire codebase
30
+ - Applied Black and isort formatting to all source and test files
31
+ - Fixed 136+ import ordering and formatting issues (I001)
32
+ - Reorganized imports for consistency across codebase
33
+ - Moved `test_credential_validation.py` to debug location for better organization
34
+
9
35
  ## [0.3.3] - 2025-01-25
10
36
 
11
37
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.3.3
3
+ Version: 0.3.4
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>
@@ -151,7 +151,7 @@ extend-exclude = '''
151
151
  '''
152
152
 
153
153
  [tool.ruff]
154
- target-version = "0.3.3"
154
+ target-version = "py39"
155
155
  line-length = 88
156
156
 
157
157
  [tool.ruff.lint]
@@ -1,6 +1,6 @@
1
1
  """Version information for mcp-ticketer package."""
2
2
 
3
- __version__ = "0.3.3"
3
+ __version__ = "0.3.4"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
@@ -137,8 +137,9 @@ class LinearAdapter(BaseAdapter[Task]):
137
137
  # Load team data and workflow states concurrently
138
138
  team_id = await self._ensure_team_id()
139
139
 
140
- # Load workflow states for the team
140
+ # Load workflow states and labels for the team
141
141
  await self._load_workflow_states(team_id)
142
+ await self._load_team_labels(team_id)
142
143
 
143
144
  self._initialized = True
144
145
 
@@ -216,6 +217,85 @@ class LinearAdapter(BaseAdapter[Task]):
216
217
  except Exception as e:
217
218
  raise ValueError(f"Failed to load workflow states: {e}")
218
219
 
220
+ async def _load_team_labels(self, team_id: str) -> None:
221
+ """Load and cache labels for the team.
222
+
223
+ Args:
224
+ team_id: Linear team ID
225
+
226
+ """
227
+ query = """
228
+ query GetTeamLabels($teamId: ID!) {
229
+ team(id: $teamId) {
230
+ labels {
231
+ nodes {
232
+ id
233
+ name
234
+ color
235
+ description
236
+ }
237
+ }
238
+ }
239
+ }
240
+ """
241
+
242
+ try:
243
+ result = await self.client.execute_query(query, {"teamId": team_id})
244
+ self._labels_cache = result["team"]["labels"]["nodes"]
245
+ except Exception:
246
+ # Log error but don't fail - labels are optional
247
+ self._labels_cache = []
248
+
249
+ async def _resolve_label_ids(self, label_names: list[str]) -> list[str]:
250
+ """Resolve label names to Linear label IDs.
251
+
252
+ Args:
253
+ label_names: List of label names
254
+
255
+ Returns:
256
+ List of Linear label IDs that exist
257
+
258
+ """
259
+ import logging
260
+
261
+ logger = logging.getLogger(__name__)
262
+
263
+ if not self._labels_cache:
264
+ team_id = await self._ensure_team_id()
265
+ await self._load_team_labels(team_id)
266
+
267
+ if not self._labels_cache:
268
+ logger.warning("No labels found in team cache")
269
+ return []
270
+
271
+ # Create name -> ID mapping (case-insensitive)
272
+ label_map = {label["name"].lower(): label["id"] for label in self._labels_cache}
273
+
274
+ logger.debug(f"Available labels in team: {list(label_map.keys())}")
275
+
276
+ # Resolve label names to IDs
277
+ label_ids = []
278
+ unmatched_labels = []
279
+
280
+ for name in label_names:
281
+ label_id = label_map.get(name.lower())
282
+ if label_id:
283
+ label_ids.append(label_id)
284
+ logger.debug(f"Resolved label '{name}' to ID: {label_id}")
285
+ else:
286
+ unmatched_labels.append(name)
287
+ logger.warning(
288
+ f"Label '{name}' not found in team. Available labels: {list(label_map.keys())}"
289
+ )
290
+
291
+ if unmatched_labels:
292
+ logger.warning(
293
+ f"Could not resolve labels: {unmatched_labels}. "
294
+ f"Create them in Linear first or check spelling."
295
+ )
296
+
297
+ return label_ids
298
+
219
299
  def _get_state_mapping(self) -> dict[TicketState, str]:
220
300
  """Get mapping from universal states to Linear workflow state IDs.
221
301
 
@@ -311,12 +391,28 @@ class LinearAdapter(BaseAdapter[Task]):
311
391
  # Build issue input using mapper
312
392
  issue_input = build_linear_issue_input(task, team_id)
313
393
 
394
+ # Set default state if not provided
395
+ # Map OPEN to "unstarted" state (typically "To-Do" in Linear)
396
+ if task.state == TicketState.OPEN and self._workflow_states:
397
+ state_mapping = self._get_state_mapping()
398
+ if TicketState.OPEN in state_mapping:
399
+ issue_input["stateId"] = state_mapping[TicketState.OPEN]
400
+
314
401
  # Resolve assignee to user ID if provided
315
402
  if task.assignee:
316
403
  user_id = await self._get_user_id(task.assignee)
317
404
  if user_id:
318
405
  issue_input["assigneeId"] = user_id
319
406
 
407
+ # Resolve label names to IDs if provided
408
+ if task.tags:
409
+ label_ids = await self._resolve_label_ids(task.tags)
410
+ if label_ids:
411
+ issue_input["labelIds"] = label_ids
412
+ else:
413
+ # Remove labelIds if no labels resolved
414
+ issue_input.pop("labelIds", None)
415
+
320
416
  try:
321
417
  result = await self.client.execute_mutation(
322
418
  CREATE_ISSUE_MUTATION, {"input": issue_input}
@@ -489,6 +585,12 @@ class LinearAdapter(BaseAdapter[Task]):
489
585
  if user_id:
490
586
  update_input["assigneeId"] = user_id
491
587
 
588
+ # Resolve label names to IDs if provided
589
+ if "tags" in updates and updates["tags"]:
590
+ label_ids = await self._resolve_label_ids(updates["tags"])
591
+ if label_ids:
592
+ update_input["labelIds"] = label_ids
593
+
492
594
  # Execute update
493
595
  result = await self.client.execute_mutation(
494
596
  UPDATE_ISSUE_MUTATION, {"id": linear_id, "input": update_input}
@@ -242,9 +242,8 @@ def build_linear_issue_input(task: Task, team_id: str) -> dict[str, Any]:
242
242
 
243
243
  # Add labels (tags) if provided
244
244
  if task.tags:
245
- # Note: Linear requires label IDs, not names
246
- # This would need to be resolved by the adapter
247
- pass
245
+ # Note: This returns label names, will be resolved to IDs by adapter
246
+ issue_input["labelIds"] = task.tags # Temporary - adapter will resolve
248
247
 
249
248
  # Add Linear-specific metadata
250
249
  if task.metadata and "linear" in task.metadata:
@@ -1266,6 +1266,16 @@ def create(
1266
1266
  assignee: Optional[str] = typer.Option(
1267
1267
  None, "--assignee", "-a", help="Assignee username"
1268
1268
  ),
1269
+ project: Optional[str] = typer.Option(
1270
+ None,
1271
+ "--project",
1272
+ help="Parent project/epic ID (synonym for --epic)",
1273
+ ),
1274
+ epic: Optional[str] = typer.Option(
1275
+ None,
1276
+ "--epic",
1277
+ help="Parent epic/project ID (synonym for --project)",
1278
+ ),
1269
1279
  adapter: Optional[AdapterType] = typer.Option(
1270
1280
  None, "--adapter", help="Override default adapter"
1271
1281
  ),
@@ -1337,6 +1347,9 @@ def create(
1337
1347
  # Priority 4: Default
1338
1348
  adapter_name = "aitrackdown"
1339
1349
 
1350
+ # Resolve project/epic synonym - prefer whichever is provided
1351
+ parent_epic_id = project or epic
1352
+
1340
1353
  # Create task data
1341
1354
  # Import Priority for type checking
1342
1355
  from ..core.models import Priority as PriorityEnum
@@ -1347,6 +1360,7 @@ def create(
1347
1360
  "priority": priority.value if isinstance(priority, PriorityEnum) else priority,
1348
1361
  "tags": tags or [],
1349
1362
  "assignee": assignee,
1363
+ "parent_epic": parent_epic_id,
1350
1364
  }
1351
1365
 
1352
1366
  # WORKAROUND: Use direct operation for Linear adapter to bypass worker subprocess issue
@@ -1377,6 +1391,7 @@ def create(
1377
1391
  ),
1378
1392
  tags=task_data.get("tags", []),
1379
1393
  assignee=task_data.get("assignee"),
1394
+ parent_epic=task_data.get("parent_epic"),
1380
1395
  )
1381
1396
 
1382
1397
  # Create ticket synchronously
@@ -260,13 +260,21 @@ class Epic(BaseTicket):
260
260
 
261
261
 
262
262
  class Task(BaseTicket):
263
- """Task - individual work item (can be ISSUE or TASK type)."""
263
+ """Task - individual work item (can be ISSUE or TASK type).
264
+
265
+ Note: The `project` field is a synonym for `parent_epic` to provide
266
+ flexibility in CLI and API usage. Both fields map to the same underlying
267
+ value (the parent epic/project ID).
268
+ """
264
269
 
265
270
  ticket_type: TicketType = Field(
266
271
  default=TicketType.ISSUE, description="Ticket type in hierarchy"
267
272
  )
268
273
  parent_issue: Optional[str] = Field(None, description="Parent issue ID (for tasks)")
269
- parent_epic: Optional[str] = Field(None, description="Parent epic ID (for issues)")
274
+ parent_epic: Optional[str] = Field(
275
+ None,
276
+ description="Parent epic/project ID (for issues). Synonym: 'project'",
277
+ )
270
278
  assignee: Optional[str] = Field(None, description="Assigned user")
271
279
  children: list[str] = Field(default_factory=list, description="Child task IDs")
272
280
 
@@ -274,6 +282,26 @@ class Task(BaseTicket):
274
282
  estimated_hours: Optional[float] = Field(None, description="Time estimate")
275
283
  actual_hours: Optional[float] = Field(None, description="Actual time spent")
276
284
 
285
+ @property
286
+ def project(self) -> Optional[str]:
287
+ """Synonym for parent_epic.
288
+
289
+ Returns:
290
+ Parent epic/project ID
291
+
292
+ """
293
+ return self.parent_epic
294
+
295
+ @project.setter
296
+ def project(self, value: Optional[str]) -> None:
297
+ """Set parent_epic via project synonym.
298
+
299
+ Args:
300
+ value: Parent epic/project ID
301
+
302
+ """
303
+ self.parent_epic = value
304
+
277
305
  def is_epic(self) -> bool:
278
306
  """Check if this is an epic (should use Epic class instead)."""
279
307
  return self.ticket_type == TicketType.EPIC
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-ticketer
3
- Version: 0.3.3
3
+ Version: 0.3.4
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>
@@ -5,6 +5,7 @@ import asyncio
5
5
  import os
6
6
  from datetime import datetime
7
7
 
8
+ import pytest
8
9
  from dotenv import load_dotenv
9
10
 
10
11
  from mcp_ticketer.adapters.jira import JiraAdapter
@@ -26,6 +27,7 @@ def get_test_config():
26
27
  }
27
28
 
28
29
 
30
+ @pytest.mark.asyncio
29
31
  async def test_jira_adapter():
30
32
  """Test basic JIRA adapter operations."""
31
33
  print("\n=== JIRA Adapter Test ===\n")
@@ -183,6 +185,7 @@ async def test_jira_adapter():
183
185
  await adapter.close()
184
186
 
185
187
 
188
+ @pytest.mark.asyncio
186
189
  async def test_jira_jql():
187
190
  """Test JIRA JQL queries."""
188
191
  print("\n=== JIRA JQL Test ===\n")
@@ -8,6 +8,8 @@ import logging
8
8
  import sys
9
9
  from pathlib import Path
10
10
 
11
+ import pytest
12
+
11
13
  # Add src to path for imports
12
14
  sys.path.insert(0, str(Path(__file__).parent / "src"))
13
15
 
@@ -23,6 +25,8 @@ logging.basicConfig(
23
25
  logger = logging.getLogger(__name__)
24
26
 
25
27
 
28
+ @pytest.mark.skip(reason="Standalone script, not a pytest test - run directly with python")
29
+ @pytest.mark.asyncio
26
30
  async def test_jira_direct():
27
31
  """Test JIRA adapter directly with MT project."""
28
32
  print("🔍 Testing JIRA adapter directly with MT project...")
@@ -100,6 +104,8 @@ async def test_jira_direct():
100
104
  traceback.print_exc()
101
105
 
102
106
 
107
+ @pytest.mark.skip(reason="Standalone script, not a pytest test - run directly with python")
108
+ @pytest.mark.asyncio
103
109
  async def test_jira_commenting(ticket):
104
110
  """Test JIRA commenting functionality."""
105
111
  if not ticket:
@@ -8,6 +8,8 @@ import logging
8
8
  import sys
9
9
  from pathlib import Path
10
10
 
11
+ import pytest
12
+
11
13
  # Add src to path for imports
12
14
  sys.path.insert(0, str(Path(__file__).parent / "src"))
13
15
 
@@ -20,6 +22,8 @@ logging.basicConfig(level=logging.INFO)
20
22
  logger = logging.getLogger(__name__)
21
23
 
22
24
 
25
+ @pytest.mark.skip(reason="Standalone script, not a pytest test - run directly with python")
26
+ @pytest.mark.asyncio
23
27
  async def test_jira_projects():
24
28
  """Test JIRA projects and permissions."""
25
29
  print("🔍 Testing JIRA projects and permissions...")
@@ -95,6 +99,8 @@ async def test_jira_projects():
95
99
  return None
96
100
 
97
101
 
102
+ @pytest.mark.skip(reason="Standalone script helper, not a pytest test - run directly with python")
103
+ @pytest.mark.asyncio
98
104
  async def test_create_issue(client, config, project_key, issue_type):
99
105
  """Test creating an issue in the specified project."""
100
106
  print(f"\n🧪 Testing issue creation in {project_key}...")
@@ -5,6 +5,7 @@ import asyncio
5
5
  import os
6
6
  from datetime import datetime
7
7
 
8
+ import pytest
8
9
  from dotenv import load_dotenv
9
10
 
10
11
  from mcp_ticketer.core import AdapterRegistry, Priority, Task, TicketState
@@ -14,6 +15,7 @@ from mcp_ticketer.core.models import Comment, SearchQuery
14
15
  load_dotenv()
15
16
 
16
17
 
18
+ @pytest.mark.asyncio
17
19
  async def test_linear_adapter():
18
20
  """Test basic Linear adapter operations."""
19
21
 
@@ -6,6 +6,8 @@ import os
6
6
  import sys
7
7
  from pathlib import Path
8
8
 
9
+ import pytest
10
+
9
11
  # Load environment variables from .env.local
10
12
  from dotenv import load_dotenv
11
13
 
@@ -18,6 +20,7 @@ from mcp_ticketer.adapters.linear import LinearAdapter
18
20
  from mcp_ticketer.core.config import ConfigurationManager
19
21
 
20
22
 
23
+ @pytest.mark.asyncio
21
24
  async def test_linear_config():
22
25
  """Test Linear adapter configuration."""
23
26
  print("🔍 Testing Linear adapter configuration...")
@@ -7,12 +7,15 @@ import os
7
7
  import sys
8
8
  from datetime import datetime, timedelta
9
9
 
10
+ import pytest
11
+
10
12
  sys.path.insert(0, "/Users/masa/Projects/managed/mcp-ticketer/src")
11
13
 
12
14
  from mcp_ticketer.adapters.linear import LinearAdapter
13
15
  from mcp_ticketer.core.models import Comment, Priority, SearchQuery, Task, TicketState
14
16
 
15
17
 
18
+ @pytest.mark.asyncio
16
19
  async def test_linear_adapter():
17
20
  """Test the Linear adapter with the 1m-hyperdev workspace."""
18
21
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes