mcp-ticketer 0.12.0__py3-none-any.whl → 2.2.13__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.

Potentially problematic release.


This version of mcp-ticketer might be problematic. Click here for more details.

Files changed (129) hide show
  1. mcp_ticketer/__init__.py +10 -10
  2. mcp_ticketer/__version__.py +1 -1
  3. mcp_ticketer/_version_scm.py +1 -0
  4. mcp_ticketer/adapters/aitrackdown.py +507 -6
  5. mcp_ticketer/adapters/asana/adapter.py +229 -0
  6. mcp_ticketer/adapters/asana/mappers.py +14 -0
  7. mcp_ticketer/adapters/github/__init__.py +26 -0
  8. mcp_ticketer/adapters/github/adapter.py +3229 -0
  9. mcp_ticketer/adapters/github/client.py +335 -0
  10. mcp_ticketer/adapters/github/mappers.py +797 -0
  11. mcp_ticketer/adapters/github/queries.py +692 -0
  12. mcp_ticketer/adapters/github/types.py +460 -0
  13. mcp_ticketer/adapters/hybrid.py +47 -5
  14. mcp_ticketer/adapters/jira/__init__.py +35 -0
  15. mcp_ticketer/adapters/jira/adapter.py +1351 -0
  16. mcp_ticketer/adapters/jira/client.py +271 -0
  17. mcp_ticketer/adapters/jira/mappers.py +246 -0
  18. mcp_ticketer/adapters/jira/queries.py +216 -0
  19. mcp_ticketer/adapters/jira/types.py +304 -0
  20. mcp_ticketer/adapters/linear/adapter.py +2730 -139
  21. mcp_ticketer/adapters/linear/client.py +175 -3
  22. mcp_ticketer/adapters/linear/mappers.py +203 -8
  23. mcp_ticketer/adapters/linear/queries.py +280 -3
  24. mcp_ticketer/adapters/linear/types.py +120 -4
  25. mcp_ticketer/analysis/__init__.py +56 -0
  26. mcp_ticketer/analysis/dependency_graph.py +255 -0
  27. mcp_ticketer/analysis/health_assessment.py +304 -0
  28. mcp_ticketer/analysis/orphaned.py +218 -0
  29. mcp_ticketer/analysis/project_status.py +594 -0
  30. mcp_ticketer/analysis/similarity.py +224 -0
  31. mcp_ticketer/analysis/staleness.py +266 -0
  32. mcp_ticketer/automation/__init__.py +11 -0
  33. mcp_ticketer/automation/project_updates.py +378 -0
  34. mcp_ticketer/cli/adapter_diagnostics.py +3 -1
  35. mcp_ticketer/cli/auggie_configure.py +17 -5
  36. mcp_ticketer/cli/codex_configure.py +97 -61
  37. mcp_ticketer/cli/configure.py +1288 -105
  38. mcp_ticketer/cli/cursor_configure.py +314 -0
  39. mcp_ticketer/cli/diagnostics.py +13 -12
  40. mcp_ticketer/cli/discover.py +5 -0
  41. mcp_ticketer/cli/gemini_configure.py +17 -5
  42. mcp_ticketer/cli/init_command.py +880 -0
  43. mcp_ticketer/cli/install_mcp_server.py +418 -0
  44. mcp_ticketer/cli/instruction_commands.py +6 -0
  45. mcp_ticketer/cli/main.py +267 -3175
  46. mcp_ticketer/cli/mcp_configure.py +821 -119
  47. mcp_ticketer/cli/mcp_server_commands.py +415 -0
  48. mcp_ticketer/cli/platform_detection.py +77 -12
  49. mcp_ticketer/cli/platform_installer.py +545 -0
  50. mcp_ticketer/cli/project_update_commands.py +350 -0
  51. mcp_ticketer/cli/setup_command.py +795 -0
  52. mcp_ticketer/cli/simple_health.py +12 -10
  53. mcp_ticketer/cli/ticket_commands.py +705 -103
  54. mcp_ticketer/cli/utils.py +113 -0
  55. mcp_ticketer/core/__init__.py +56 -6
  56. mcp_ticketer/core/adapter.py +533 -2
  57. mcp_ticketer/core/config.py +21 -21
  58. mcp_ticketer/core/exceptions.py +7 -1
  59. mcp_ticketer/core/label_manager.py +732 -0
  60. mcp_ticketer/core/mappers.py +31 -19
  61. mcp_ticketer/core/milestone_manager.py +252 -0
  62. mcp_ticketer/core/models.py +480 -0
  63. mcp_ticketer/core/onepassword_secrets.py +1 -1
  64. mcp_ticketer/core/priority_matcher.py +463 -0
  65. mcp_ticketer/core/project_config.py +132 -14
  66. mcp_ticketer/core/project_utils.py +281 -0
  67. mcp_ticketer/core/project_validator.py +376 -0
  68. mcp_ticketer/core/session_state.py +176 -0
  69. mcp_ticketer/core/state_matcher.py +625 -0
  70. mcp_ticketer/core/url_parser.py +425 -0
  71. mcp_ticketer/core/validators.py +69 -0
  72. mcp_ticketer/mcp/server/__main__.py +2 -1
  73. mcp_ticketer/mcp/server/diagnostic_helper.py +175 -0
  74. mcp_ticketer/mcp/server/main.py +106 -25
  75. mcp_ticketer/mcp/server/routing.py +723 -0
  76. mcp_ticketer/mcp/server/server_sdk.py +58 -0
  77. mcp_ticketer/mcp/server/tools/__init__.py +33 -11
  78. mcp_ticketer/mcp/server/tools/analysis_tools.py +854 -0
  79. mcp_ticketer/mcp/server/tools/attachment_tools.py +5 -5
  80. mcp_ticketer/mcp/server/tools/bulk_tools.py +259 -202
  81. mcp_ticketer/mcp/server/tools/comment_tools.py +74 -12
  82. mcp_ticketer/mcp/server/tools/config_tools.py +1391 -145
  83. mcp_ticketer/mcp/server/tools/diagnostic_tools.py +211 -0
  84. mcp_ticketer/mcp/server/tools/hierarchy_tools.py +870 -460
  85. mcp_ticketer/mcp/server/tools/instruction_tools.py +7 -5
  86. mcp_ticketer/mcp/server/tools/label_tools.py +942 -0
  87. mcp_ticketer/mcp/server/tools/milestone_tools.py +338 -0
  88. mcp_ticketer/mcp/server/tools/pr_tools.py +3 -7
  89. mcp_ticketer/mcp/server/tools/project_status_tools.py +158 -0
  90. mcp_ticketer/mcp/server/tools/project_update_tools.py +473 -0
  91. mcp_ticketer/mcp/server/tools/search_tools.py +209 -97
  92. mcp_ticketer/mcp/server/tools/session_tools.py +308 -0
  93. mcp_ticketer/mcp/server/tools/ticket_tools.py +1107 -124
  94. mcp_ticketer/mcp/server/tools/user_ticket_tools.py +218 -236
  95. mcp_ticketer/queue/queue.py +68 -0
  96. mcp_ticketer/queue/worker.py +1 -1
  97. mcp_ticketer/utils/__init__.py +5 -0
  98. mcp_ticketer/utils/token_utils.py +246 -0
  99. mcp_ticketer-2.2.13.dist-info/METADATA +1396 -0
  100. mcp_ticketer-2.2.13.dist-info/RECORD +158 -0
  101. mcp_ticketer-2.2.13.dist-info/top_level.txt +2 -0
  102. py_mcp_installer/examples/phase3_demo.py +178 -0
  103. py_mcp_installer/scripts/manage_version.py +54 -0
  104. py_mcp_installer/setup.py +6 -0
  105. py_mcp_installer/src/py_mcp_installer/__init__.py +153 -0
  106. py_mcp_installer/src/py_mcp_installer/command_builder.py +445 -0
  107. py_mcp_installer/src/py_mcp_installer/config_manager.py +541 -0
  108. py_mcp_installer/src/py_mcp_installer/exceptions.py +243 -0
  109. py_mcp_installer/src/py_mcp_installer/installation_strategy.py +617 -0
  110. py_mcp_installer/src/py_mcp_installer/installer.py +656 -0
  111. py_mcp_installer/src/py_mcp_installer/mcp_inspector.py +750 -0
  112. py_mcp_installer/src/py_mcp_installer/platform_detector.py +451 -0
  113. py_mcp_installer/src/py_mcp_installer/platforms/__init__.py +26 -0
  114. py_mcp_installer/src/py_mcp_installer/platforms/claude_code.py +225 -0
  115. py_mcp_installer/src/py_mcp_installer/platforms/codex.py +181 -0
  116. py_mcp_installer/src/py_mcp_installer/platforms/cursor.py +191 -0
  117. py_mcp_installer/src/py_mcp_installer/types.py +222 -0
  118. py_mcp_installer/src/py_mcp_installer/utils.py +463 -0
  119. py_mcp_installer/tests/__init__.py +0 -0
  120. py_mcp_installer/tests/platforms/__init__.py +0 -0
  121. py_mcp_installer/tests/test_platform_detector.py +17 -0
  122. mcp_ticketer/adapters/github.py +0 -1574
  123. mcp_ticketer/adapters/jira.py +0 -1258
  124. mcp_ticketer-0.12.0.dist-info/METADATA +0 -550
  125. mcp_ticketer-0.12.0.dist-info/RECORD +0 -91
  126. mcp_ticketer-0.12.0.dist-info/top_level.txt +0 -1
  127. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/WHEEL +0 -0
  128. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/entry_points.txt +0 -0
  129. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/licenses/LICENSE +0 -0
mcp_ticketer/cli/utils.py CHANGED
@@ -5,6 +5,7 @@ import json
5
5
  import logging
6
6
  import os
7
7
  from collections.abc import Callable
8
+ from datetime import datetime
8
9
  from functools import wraps
9
10
  from pathlib import Path
10
11
  from typing import Any, TypeVar
@@ -23,6 +24,118 @@ T = TypeVar("T")
23
24
  console = Console()
24
25
  logger = logging.getLogger(__name__)
25
26
 
27
+ # Get version from package
28
+ try:
29
+ from importlib.metadata import version
30
+
31
+ __version__ = version("mcp-ticketer")
32
+ except Exception:
33
+ __version__ = "2.2.2" # Fallback to known version
34
+
35
+
36
+ def format_json_response(status: str, data: Any, message: str | None = None) -> str:
37
+ """Format response as JSON with standard structure.
38
+
39
+ Args:
40
+ status: Response status - "success" or "error"
41
+ data: Response data (dict, list, or any JSON-serializable type)
42
+ message: Optional human-readable message
43
+
44
+ Returns:
45
+ JSON string with standard format
46
+
47
+ Example:
48
+ >>> format_json_response("success", {"id": "1M-123", "title": "Fix bug"})
49
+ {
50
+ "status": "success",
51
+ "data": {"id": "1M-123", "title": "Fix bug"},
52
+ "metadata": {
53
+ "timestamp": "2025-12-05T10:30:00Z",
54
+ "version": "2.2.2"
55
+ }
56
+ }
57
+ """
58
+ response = {
59
+ "status": status,
60
+ "data": data,
61
+ "metadata": {
62
+ "timestamp": datetime.utcnow().isoformat() + "Z",
63
+ "version": __version__,
64
+ },
65
+ }
66
+ if message:
67
+ response["message"] = message
68
+ return json.dumps(response, indent=2, default=str)
69
+
70
+
71
+ def format_error_json(error: str | Exception, ticket_id: str | None = None) -> str:
72
+ """Format error response as JSON.
73
+
74
+ Args:
75
+ error: Error message or exception
76
+ ticket_id: Optional ticket ID that caused the error
77
+
78
+ Returns:
79
+ JSON error response
80
+ """
81
+ error_msg = str(error)
82
+ data = {"error": error_msg}
83
+ if ticket_id:
84
+ data["ticket_id"] = ticket_id
85
+ return format_json_response("error", data, message=error_msg)
86
+
87
+
88
+ def serialize_task(task: Task) -> dict[str, Any]:
89
+ """Serialize Task object to JSON-compatible dict.
90
+
91
+ Args:
92
+ task: Task object to serialize
93
+
94
+ Returns:
95
+ Dictionary with task fields
96
+ """
97
+ task_dict = {
98
+ "id": task.id,
99
+ "title": task.title,
100
+ "state": task.state,
101
+ "priority": task.priority,
102
+ "description": task.description,
103
+ "tags": task.tags or [],
104
+ "assignee": task.assignee,
105
+ }
106
+
107
+ # Add timestamps if available
108
+ if task.created_at:
109
+ task_dict["created_at"] = (
110
+ task.created_at.isoformat()
111
+ if hasattr(task.created_at, "isoformat")
112
+ else str(task.created_at)
113
+ )
114
+ if task.updated_at:
115
+ task_dict["updated_at"] = (
116
+ task.updated_at.isoformat()
117
+ if hasattr(task.updated_at, "isoformat")
118
+ else str(task.updated_at)
119
+ )
120
+
121
+ # Add parent relationships
122
+ if hasattr(task, "parent_epic") and task.parent_epic:
123
+ task_dict["parent_epic"] = task.parent_epic
124
+ if hasattr(task, "parent_issue") and task.parent_issue:
125
+ task_dict["parent_issue"] = task.parent_issue
126
+
127
+ # Add URL from metadata if available
128
+ if task.metadata:
129
+ if isinstance(task.metadata, dict):
130
+ # Linear metadata structure
131
+ if "linear" in task.metadata and "url" in task.metadata["linear"]:
132
+ task_dict["url"] = task.metadata["linear"]["url"]
133
+ # Generic url field
134
+ elif "url" in task.metadata:
135
+ task_dict["url"] = task.metadata["url"]
136
+
137
+ return task_dict
138
+
26
139
 
27
140
  class CommonPatterns:
28
141
  """Common CLI patterns and utilities."""
@@ -2,28 +2,78 @@
2
2
 
3
3
  from .adapter import BaseAdapter
4
4
  from .instructions import (
5
- InstructionsError,
6
- InstructionsNotFoundError,
7
- InstructionsValidationError,
8
- TicketInstructionsManager,
9
- get_instructions,
5
+ InstructionsError,
6
+ InstructionsNotFoundError,
7
+ InstructionsValidationError,
8
+ TicketInstructionsManager,
9
+ get_instructions,
10
+ )
11
+ from .milestone_manager import MilestoneManager
12
+ from .models import (
13
+ Attachment,
14
+ Comment,
15
+ Epic,
16
+ Milestone,
17
+ Priority,
18
+ Project,
19
+ ProjectScope,
20
+ ProjectState,
21
+ ProjectStatistics,
22
+ ProjectUpdate,
23
+ ProjectUpdateHealth,
24
+ ProjectVisibility,
25
+ Task,
26
+ TicketState,
27
+ TicketType,
28
+ )
29
+ from .project_utils import (
30
+ epic_to_project,
31
+ project_to_epic,
10
32
  )
11
- from .models import Attachment, Comment, Epic, Priority, Task, TicketState, TicketType
12
33
  from .registry import AdapterRegistry
34
+ from .state_matcher import (
35
+ SemanticStateMatcher,
36
+ StateMatchResult,
37
+ ValidationResult,
38
+ get_state_matcher,
39
+ )
13
40
 
14
41
  __all__ = [
42
+ # Core ticket models
15
43
  "Epic",
16
44
  "Task",
17
45
  "Comment",
18
46
  "Attachment",
47
+ "Milestone",
48
+ # Project models
49
+ "Project",
50
+ "ProjectScope",
51
+ "ProjectState",
52
+ "ProjectStatistics",
53
+ "ProjectVisibility",
54
+ "ProjectUpdate",
55
+ "ProjectUpdateHealth",
56
+ # Project utilities
57
+ "epic_to_project",
58
+ "project_to_epic",
59
+ # Enums
19
60
  "TicketState",
20
61
  "Priority",
21
62
  "TicketType",
63
+ # Adapters
22
64
  "BaseAdapter",
23
65
  "AdapterRegistry",
66
+ # Managers
67
+ "MilestoneManager",
24
68
  "TicketInstructionsManager",
69
+ # Instructions
25
70
  "InstructionsError",
26
71
  "InstructionsNotFoundError",
27
72
  "InstructionsValidationError",
28
73
  "get_instructions",
74
+ # State matching
75
+ "SemanticStateMatcher",
76
+ "StateMatchResult",
77
+ "ValidationResult",
78
+ "get_state_matcher",
29
79
  ]