mcp-ticketer 0.3.0__py3-none-any.whl → 2.2.9__py3-none-any.whl

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.
Files changed (160) hide show
  1. mcp_ticketer/__init__.py +10 -10
  2. mcp_ticketer/__version__.py +3 -3
  3. mcp_ticketer/_version_scm.py +1 -0
  4. mcp_ticketer/adapters/__init__.py +2 -0
  5. mcp_ticketer/adapters/aitrackdown.py +930 -52
  6. mcp_ticketer/adapters/asana/__init__.py +15 -0
  7. mcp_ticketer/adapters/asana/adapter.py +1537 -0
  8. mcp_ticketer/adapters/asana/client.py +292 -0
  9. mcp_ticketer/adapters/asana/mappers.py +348 -0
  10. mcp_ticketer/adapters/asana/types.py +146 -0
  11. mcp_ticketer/adapters/github/__init__.py +26 -0
  12. mcp_ticketer/adapters/github/adapter.py +3229 -0
  13. mcp_ticketer/adapters/github/client.py +335 -0
  14. mcp_ticketer/adapters/github/mappers.py +797 -0
  15. mcp_ticketer/adapters/github/queries.py +692 -0
  16. mcp_ticketer/adapters/github/types.py +460 -0
  17. mcp_ticketer/adapters/hybrid.py +58 -16
  18. mcp_ticketer/adapters/jira/__init__.py +35 -0
  19. mcp_ticketer/adapters/jira/adapter.py +1351 -0
  20. mcp_ticketer/adapters/jira/client.py +271 -0
  21. mcp_ticketer/adapters/jira/mappers.py +246 -0
  22. mcp_ticketer/adapters/jira/queries.py +216 -0
  23. mcp_ticketer/adapters/jira/types.py +304 -0
  24. mcp_ticketer/adapters/linear/__init__.py +1 -1
  25. mcp_ticketer/adapters/linear/adapter.py +3810 -462
  26. mcp_ticketer/adapters/linear/client.py +312 -69
  27. mcp_ticketer/adapters/linear/mappers.py +305 -85
  28. mcp_ticketer/adapters/linear/queries.py +317 -17
  29. mcp_ticketer/adapters/linear/types.py +187 -64
  30. mcp_ticketer/adapters/linear.py +2 -2
  31. mcp_ticketer/analysis/__init__.py +56 -0
  32. mcp_ticketer/analysis/dependency_graph.py +255 -0
  33. mcp_ticketer/analysis/health_assessment.py +304 -0
  34. mcp_ticketer/analysis/orphaned.py +218 -0
  35. mcp_ticketer/analysis/project_status.py +594 -0
  36. mcp_ticketer/analysis/similarity.py +224 -0
  37. mcp_ticketer/analysis/staleness.py +266 -0
  38. mcp_ticketer/automation/__init__.py +11 -0
  39. mcp_ticketer/automation/project_updates.py +378 -0
  40. mcp_ticketer/cache/memory.py +9 -8
  41. mcp_ticketer/cli/adapter_diagnostics.py +91 -54
  42. mcp_ticketer/cli/auggie_configure.py +116 -15
  43. mcp_ticketer/cli/codex_configure.py +274 -82
  44. mcp_ticketer/cli/configure.py +1323 -151
  45. mcp_ticketer/cli/cursor_configure.py +314 -0
  46. mcp_ticketer/cli/diagnostics.py +209 -114
  47. mcp_ticketer/cli/discover.py +297 -26
  48. mcp_ticketer/cli/gemini_configure.py +119 -26
  49. mcp_ticketer/cli/init_command.py +880 -0
  50. mcp_ticketer/cli/install_mcp_server.py +418 -0
  51. mcp_ticketer/cli/instruction_commands.py +435 -0
  52. mcp_ticketer/cli/linear_commands.py +256 -130
  53. mcp_ticketer/cli/main.py +140 -1544
  54. mcp_ticketer/cli/mcp_configure.py +1013 -100
  55. mcp_ticketer/cli/mcp_server_commands.py +415 -0
  56. mcp_ticketer/cli/migrate_config.py +12 -8
  57. mcp_ticketer/cli/platform_commands.py +123 -0
  58. mcp_ticketer/cli/platform_detection.py +477 -0
  59. mcp_ticketer/cli/platform_installer.py +545 -0
  60. mcp_ticketer/cli/project_update_commands.py +350 -0
  61. mcp_ticketer/cli/python_detection.py +126 -0
  62. mcp_ticketer/cli/queue_commands.py +15 -15
  63. mcp_ticketer/cli/setup_command.py +794 -0
  64. mcp_ticketer/cli/simple_health.py +84 -59
  65. mcp_ticketer/cli/ticket_commands.py +1375 -0
  66. mcp_ticketer/cli/update_checker.py +313 -0
  67. mcp_ticketer/cli/utils.py +195 -72
  68. mcp_ticketer/core/__init__.py +64 -1
  69. mcp_ticketer/core/adapter.py +618 -18
  70. mcp_ticketer/core/config.py +77 -68
  71. mcp_ticketer/core/env_discovery.py +75 -16
  72. mcp_ticketer/core/env_loader.py +121 -97
  73. mcp_ticketer/core/exceptions.py +32 -24
  74. mcp_ticketer/core/http_client.py +26 -26
  75. mcp_ticketer/core/instructions.py +405 -0
  76. mcp_ticketer/core/label_manager.py +732 -0
  77. mcp_ticketer/core/mappers.py +42 -30
  78. mcp_ticketer/core/milestone_manager.py +252 -0
  79. mcp_ticketer/core/models.py +566 -19
  80. mcp_ticketer/core/onepassword_secrets.py +379 -0
  81. mcp_ticketer/core/priority_matcher.py +463 -0
  82. mcp_ticketer/core/project_config.py +189 -49
  83. mcp_ticketer/core/project_utils.py +281 -0
  84. mcp_ticketer/core/project_validator.py +376 -0
  85. mcp_ticketer/core/registry.py +3 -3
  86. mcp_ticketer/core/session_state.py +176 -0
  87. mcp_ticketer/core/state_matcher.py +592 -0
  88. mcp_ticketer/core/url_parser.py +425 -0
  89. mcp_ticketer/core/validators.py +69 -0
  90. mcp_ticketer/defaults/ticket_instructions.md +644 -0
  91. mcp_ticketer/mcp/__init__.py +29 -1
  92. mcp_ticketer/mcp/__main__.py +60 -0
  93. mcp_ticketer/mcp/server/__init__.py +25 -0
  94. mcp_ticketer/mcp/server/__main__.py +60 -0
  95. mcp_ticketer/mcp/server/constants.py +58 -0
  96. mcp_ticketer/mcp/server/diagnostic_helper.py +175 -0
  97. mcp_ticketer/mcp/server/dto.py +195 -0
  98. mcp_ticketer/mcp/server/main.py +1343 -0
  99. mcp_ticketer/mcp/server/response_builder.py +206 -0
  100. mcp_ticketer/mcp/server/routing.py +723 -0
  101. mcp_ticketer/mcp/server/server_sdk.py +151 -0
  102. mcp_ticketer/mcp/server/tools/__init__.py +69 -0
  103. mcp_ticketer/mcp/server/tools/analysis_tools.py +854 -0
  104. mcp_ticketer/mcp/server/tools/attachment_tools.py +224 -0
  105. mcp_ticketer/mcp/server/tools/bulk_tools.py +330 -0
  106. mcp_ticketer/mcp/server/tools/comment_tools.py +152 -0
  107. mcp_ticketer/mcp/server/tools/config_tools.py +1564 -0
  108. mcp_ticketer/mcp/server/tools/diagnostic_tools.py +211 -0
  109. mcp_ticketer/mcp/server/tools/hierarchy_tools.py +942 -0
  110. mcp_ticketer/mcp/server/tools/instruction_tools.py +295 -0
  111. mcp_ticketer/mcp/server/tools/label_tools.py +942 -0
  112. mcp_ticketer/mcp/server/tools/milestone_tools.py +338 -0
  113. mcp_ticketer/mcp/server/tools/pr_tools.py +150 -0
  114. mcp_ticketer/mcp/server/tools/project_status_tools.py +158 -0
  115. mcp_ticketer/mcp/server/tools/project_update_tools.py +473 -0
  116. mcp_ticketer/mcp/server/tools/search_tools.py +318 -0
  117. mcp_ticketer/mcp/server/tools/session_tools.py +308 -0
  118. mcp_ticketer/mcp/server/tools/ticket_tools.py +1413 -0
  119. mcp_ticketer/mcp/server/tools/user_ticket_tools.py +364 -0
  120. mcp_ticketer/queue/__init__.py +1 -0
  121. mcp_ticketer/queue/health_monitor.py +168 -136
  122. mcp_ticketer/queue/manager.py +78 -63
  123. mcp_ticketer/queue/queue.py +108 -21
  124. mcp_ticketer/queue/run_worker.py +2 -2
  125. mcp_ticketer/queue/ticket_registry.py +213 -155
  126. mcp_ticketer/queue/worker.py +96 -58
  127. mcp_ticketer/utils/__init__.py +5 -0
  128. mcp_ticketer/utils/token_utils.py +246 -0
  129. mcp_ticketer-2.2.9.dist-info/METADATA +1396 -0
  130. mcp_ticketer-2.2.9.dist-info/RECORD +158 -0
  131. mcp_ticketer-2.2.9.dist-info/top_level.txt +2 -0
  132. py_mcp_installer/examples/phase3_demo.py +178 -0
  133. py_mcp_installer/scripts/manage_version.py +54 -0
  134. py_mcp_installer/setup.py +6 -0
  135. py_mcp_installer/src/py_mcp_installer/__init__.py +153 -0
  136. py_mcp_installer/src/py_mcp_installer/command_builder.py +445 -0
  137. py_mcp_installer/src/py_mcp_installer/config_manager.py +541 -0
  138. py_mcp_installer/src/py_mcp_installer/exceptions.py +243 -0
  139. py_mcp_installer/src/py_mcp_installer/installation_strategy.py +617 -0
  140. py_mcp_installer/src/py_mcp_installer/installer.py +656 -0
  141. py_mcp_installer/src/py_mcp_installer/mcp_inspector.py +750 -0
  142. py_mcp_installer/src/py_mcp_installer/platform_detector.py +451 -0
  143. py_mcp_installer/src/py_mcp_installer/platforms/__init__.py +26 -0
  144. py_mcp_installer/src/py_mcp_installer/platforms/claude_code.py +225 -0
  145. py_mcp_installer/src/py_mcp_installer/platforms/codex.py +181 -0
  146. py_mcp_installer/src/py_mcp_installer/platforms/cursor.py +191 -0
  147. py_mcp_installer/src/py_mcp_installer/types.py +222 -0
  148. py_mcp_installer/src/py_mcp_installer/utils.py +463 -0
  149. py_mcp_installer/tests/__init__.py +0 -0
  150. py_mcp_installer/tests/platforms/__init__.py +0 -0
  151. py_mcp_installer/tests/test_platform_detector.py +17 -0
  152. mcp_ticketer/adapters/github.py +0 -1354
  153. mcp_ticketer/adapters/jira.py +0 -1011
  154. mcp_ticketer/mcp/server.py +0 -2030
  155. mcp_ticketer-0.3.0.dist-info/METADATA +0 -414
  156. mcp_ticketer-0.3.0.dist-info/RECORD +0 -59
  157. mcp_ticketer-0.3.0.dist-info/top_level.txt +0 -1
  158. {mcp_ticketer-0.3.0.dist-info → mcp_ticketer-2.2.9.dist-info}/WHEEL +0 -0
  159. {mcp_ticketer-0.3.0.dist-info → mcp_ticketer-2.2.9.dist-info}/entry_points.txt +0 -0
  160. {mcp_ticketer-0.3.0.dist-info → mcp_ticketer-2.2.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,146 @@
1
+ """Asana-specific types, constants, and state mappings."""
2
+
3
+ from enum import Enum
4
+
5
+ from ...core.models import Priority, TicketState
6
+
7
+
8
+ class AsanaCustomFieldType(str, Enum):
9
+ """Asana custom field types."""
10
+
11
+ TEXT = "text"
12
+ NUMBER = "number"
13
+ ENUM = "enum"
14
+ MULTI_ENUM = "multi_enum"
15
+ DATE = "date"
16
+ PEOPLE = "people"
17
+
18
+
19
+ class AsanaStateMapping:
20
+ """Mapping between universal TicketState and Asana states.
21
+
22
+ Asana doesn't have built-in workflow states like Linear or JIRA.
23
+ Instead, we use:
24
+ - completed boolean field (true/false)
25
+ - Custom field for extended states (if configured)
26
+
27
+ For now, we'll use a simple completed boolean mapping:
28
+ - DONE, CLOSED → completed = true
29
+ - All others → completed = false
30
+ """
31
+
32
+ TO_ASANA = {
33
+ TicketState.OPEN: False,
34
+ TicketState.IN_PROGRESS: False,
35
+ TicketState.READY: False,
36
+ TicketState.TESTED: False,
37
+ TicketState.DONE: True,
38
+ TicketState.WAITING: False,
39
+ TicketState.BLOCKED: False,
40
+ TicketState.CLOSED: True,
41
+ }
42
+
43
+ FROM_ASANA = {
44
+ True: TicketState.DONE, # completed = true
45
+ False: TicketState.OPEN, # completed = false (default to OPEN)
46
+ }
47
+
48
+
49
+ class AsanaPriorityMapping:
50
+ """Mapping between universal Priority and Asana custom field values.
51
+
52
+ Asana doesn't have built-in priority field. We'll use custom enum field.
53
+ If no custom field exists, we store priority in tags.
54
+ """
55
+
56
+ TO_ASANA = {
57
+ Priority.LOW: "Low",
58
+ Priority.MEDIUM: "Medium",
59
+ Priority.HIGH: "High",
60
+ Priority.CRITICAL: "Critical",
61
+ }
62
+
63
+ FROM_ASANA = {
64
+ "low": Priority.LOW,
65
+ "medium": Priority.MEDIUM,
66
+ "high": Priority.HIGH,
67
+ "critical": Priority.CRITICAL,
68
+ "urgent": Priority.CRITICAL, # Map "urgent" to critical
69
+ }
70
+
71
+
72
+ def map_priority_to_asana(priority: Priority) -> str:
73
+ """Map universal priority to Asana custom field value.
74
+
75
+ Args:
76
+ priority: Universal priority level
77
+
78
+ Returns:
79
+ Asana priority string
80
+
81
+ """
82
+ return AsanaPriorityMapping.TO_ASANA.get(priority, "Medium")
83
+
84
+
85
+ def map_priority_from_asana(asana_priority: str | None) -> Priority:
86
+ """Map Asana custom field value to universal priority.
87
+
88
+ Args:
89
+ asana_priority: Asana priority string (can be None)
90
+
91
+ Returns:
92
+ Universal priority level
93
+
94
+ """
95
+ if not asana_priority:
96
+ return Priority.MEDIUM
97
+
98
+ return AsanaPriorityMapping.FROM_ASANA.get(asana_priority.lower(), Priority.MEDIUM)
99
+
100
+
101
+ def map_state_to_asana(state: TicketState) -> bool:
102
+ """Map universal state to Asana completed boolean.
103
+
104
+ Args:
105
+ state: Universal ticket state
106
+
107
+ Returns:
108
+ True if completed, False otherwise
109
+
110
+ """
111
+ return AsanaStateMapping.TO_ASANA.get(state, False)
112
+
113
+
114
+ def map_state_from_asana(
115
+ completed: bool, custom_state: str | None = None
116
+ ) -> TicketState:
117
+ """Map Asana completed boolean to universal state.
118
+
119
+ Args:
120
+ completed: Asana completed boolean
121
+ custom_state: Optional custom field state value
122
+
123
+ Returns:
124
+ Universal ticket state
125
+
126
+ """
127
+ # If custom state provided, try to map it
128
+ if custom_state:
129
+ state_lower = custom_state.lower()
130
+ if "progress" in state_lower or "started" in state_lower:
131
+ return TicketState.IN_PROGRESS
132
+ if "ready" in state_lower or "review" in state_lower:
133
+ return TicketState.READY
134
+ if "test" in state_lower:
135
+ return TicketState.TESTED
136
+ if "wait" in state_lower:
137
+ return TicketState.WAITING
138
+ if "block" in state_lower:
139
+ return TicketState.BLOCKED
140
+ if "done" in state_lower or "complete" in state_lower:
141
+ return TicketState.DONE
142
+ if "closed" in state_lower or "cancel" in state_lower:
143
+ return TicketState.CLOSED
144
+
145
+ # Fallback to simple completed boolean mapping
146
+ return AsanaStateMapping.FROM_ASANA.get(completed, TicketState.OPEN)
@@ -0,0 +1,26 @@
1
+ """GitHub adapter for MCP Ticketer.
2
+
3
+ This module provides integration with GitHub's REST and GraphQL APIs for universal ticket management.
4
+ The adapter is split into multiple modules for better organization:
5
+
6
+ - adapter.py: Main GitHubAdapter class with core functionality
7
+ - queries.py: GraphQL queries and fragments
8
+ - types.py: GitHub-specific types and mappings
9
+ - client.py: HTTP/GraphQL client management
10
+ - mappers.py: Data transformation between GitHub and universal models
11
+
12
+ Usage:
13
+ from mcp_ticketer.adapters.github import GitHubAdapter
14
+
15
+ config = {
16
+ "token": "your_github_token",
17
+ "owner": "repository_owner",
18
+ "repo": "repository_name"
19
+ }
20
+ adapter = GitHubAdapter(config)
21
+ """
22
+
23
+ from .adapter import GitHubAdapter
24
+ from .types import GitHubStateMapping
25
+
26
+ __all__ = ["GitHubAdapter", "GitHubStateMapping"]