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.
- mcp_ticketer/__init__.py +10 -10
- mcp_ticketer/__version__.py +1 -1
- mcp_ticketer/_version_scm.py +1 -0
- mcp_ticketer/adapters/aitrackdown.py +507 -6
- mcp_ticketer/adapters/asana/adapter.py +229 -0
- mcp_ticketer/adapters/asana/mappers.py +14 -0
- mcp_ticketer/adapters/github/__init__.py +26 -0
- mcp_ticketer/adapters/github/adapter.py +3229 -0
- mcp_ticketer/adapters/github/client.py +335 -0
- mcp_ticketer/adapters/github/mappers.py +797 -0
- mcp_ticketer/adapters/github/queries.py +692 -0
- mcp_ticketer/adapters/github/types.py +460 -0
- mcp_ticketer/adapters/hybrid.py +47 -5
- mcp_ticketer/adapters/jira/__init__.py +35 -0
- mcp_ticketer/adapters/jira/adapter.py +1351 -0
- mcp_ticketer/adapters/jira/client.py +271 -0
- mcp_ticketer/adapters/jira/mappers.py +246 -0
- mcp_ticketer/adapters/jira/queries.py +216 -0
- mcp_ticketer/adapters/jira/types.py +304 -0
- mcp_ticketer/adapters/linear/adapter.py +2730 -139
- mcp_ticketer/adapters/linear/client.py +175 -3
- mcp_ticketer/adapters/linear/mappers.py +203 -8
- mcp_ticketer/adapters/linear/queries.py +280 -3
- mcp_ticketer/adapters/linear/types.py +120 -4
- mcp_ticketer/analysis/__init__.py +56 -0
- mcp_ticketer/analysis/dependency_graph.py +255 -0
- mcp_ticketer/analysis/health_assessment.py +304 -0
- mcp_ticketer/analysis/orphaned.py +218 -0
- mcp_ticketer/analysis/project_status.py +594 -0
- mcp_ticketer/analysis/similarity.py +224 -0
- mcp_ticketer/analysis/staleness.py +266 -0
- mcp_ticketer/automation/__init__.py +11 -0
- mcp_ticketer/automation/project_updates.py +378 -0
- mcp_ticketer/cli/adapter_diagnostics.py +3 -1
- mcp_ticketer/cli/auggie_configure.py +17 -5
- mcp_ticketer/cli/codex_configure.py +97 -61
- mcp_ticketer/cli/configure.py +1288 -105
- mcp_ticketer/cli/cursor_configure.py +314 -0
- mcp_ticketer/cli/diagnostics.py +13 -12
- mcp_ticketer/cli/discover.py +5 -0
- mcp_ticketer/cli/gemini_configure.py +17 -5
- mcp_ticketer/cli/init_command.py +880 -0
- mcp_ticketer/cli/install_mcp_server.py +418 -0
- mcp_ticketer/cli/instruction_commands.py +6 -0
- mcp_ticketer/cli/main.py +267 -3175
- mcp_ticketer/cli/mcp_configure.py +821 -119
- mcp_ticketer/cli/mcp_server_commands.py +415 -0
- mcp_ticketer/cli/platform_detection.py +77 -12
- mcp_ticketer/cli/platform_installer.py +545 -0
- mcp_ticketer/cli/project_update_commands.py +350 -0
- mcp_ticketer/cli/setup_command.py +795 -0
- mcp_ticketer/cli/simple_health.py +12 -10
- mcp_ticketer/cli/ticket_commands.py +705 -103
- mcp_ticketer/cli/utils.py +113 -0
- mcp_ticketer/core/__init__.py +56 -6
- mcp_ticketer/core/adapter.py +533 -2
- mcp_ticketer/core/config.py +21 -21
- mcp_ticketer/core/exceptions.py +7 -1
- mcp_ticketer/core/label_manager.py +732 -0
- mcp_ticketer/core/mappers.py +31 -19
- mcp_ticketer/core/milestone_manager.py +252 -0
- mcp_ticketer/core/models.py +480 -0
- mcp_ticketer/core/onepassword_secrets.py +1 -1
- mcp_ticketer/core/priority_matcher.py +463 -0
- mcp_ticketer/core/project_config.py +132 -14
- mcp_ticketer/core/project_utils.py +281 -0
- mcp_ticketer/core/project_validator.py +376 -0
- mcp_ticketer/core/session_state.py +176 -0
- mcp_ticketer/core/state_matcher.py +625 -0
- mcp_ticketer/core/url_parser.py +425 -0
- mcp_ticketer/core/validators.py +69 -0
- mcp_ticketer/mcp/server/__main__.py +2 -1
- mcp_ticketer/mcp/server/diagnostic_helper.py +175 -0
- mcp_ticketer/mcp/server/main.py +106 -25
- mcp_ticketer/mcp/server/routing.py +723 -0
- mcp_ticketer/mcp/server/server_sdk.py +58 -0
- mcp_ticketer/mcp/server/tools/__init__.py +33 -11
- mcp_ticketer/mcp/server/tools/analysis_tools.py +854 -0
- mcp_ticketer/mcp/server/tools/attachment_tools.py +5 -5
- mcp_ticketer/mcp/server/tools/bulk_tools.py +259 -202
- mcp_ticketer/mcp/server/tools/comment_tools.py +74 -12
- mcp_ticketer/mcp/server/tools/config_tools.py +1391 -145
- mcp_ticketer/mcp/server/tools/diagnostic_tools.py +211 -0
- mcp_ticketer/mcp/server/tools/hierarchy_tools.py +870 -460
- mcp_ticketer/mcp/server/tools/instruction_tools.py +7 -5
- mcp_ticketer/mcp/server/tools/label_tools.py +942 -0
- mcp_ticketer/mcp/server/tools/milestone_tools.py +338 -0
- mcp_ticketer/mcp/server/tools/pr_tools.py +3 -7
- mcp_ticketer/mcp/server/tools/project_status_tools.py +158 -0
- mcp_ticketer/mcp/server/tools/project_update_tools.py +473 -0
- mcp_ticketer/mcp/server/tools/search_tools.py +209 -97
- mcp_ticketer/mcp/server/tools/session_tools.py +308 -0
- mcp_ticketer/mcp/server/tools/ticket_tools.py +1107 -124
- mcp_ticketer/mcp/server/tools/user_ticket_tools.py +218 -236
- mcp_ticketer/queue/queue.py +68 -0
- mcp_ticketer/queue/worker.py +1 -1
- mcp_ticketer/utils/__init__.py +5 -0
- mcp_ticketer/utils/token_utils.py +246 -0
- mcp_ticketer-2.2.13.dist-info/METADATA +1396 -0
- mcp_ticketer-2.2.13.dist-info/RECORD +158 -0
- mcp_ticketer-2.2.13.dist-info/top_level.txt +2 -0
- py_mcp_installer/examples/phase3_demo.py +178 -0
- py_mcp_installer/scripts/manage_version.py +54 -0
- py_mcp_installer/setup.py +6 -0
- py_mcp_installer/src/py_mcp_installer/__init__.py +153 -0
- py_mcp_installer/src/py_mcp_installer/command_builder.py +445 -0
- py_mcp_installer/src/py_mcp_installer/config_manager.py +541 -0
- py_mcp_installer/src/py_mcp_installer/exceptions.py +243 -0
- py_mcp_installer/src/py_mcp_installer/installation_strategy.py +617 -0
- py_mcp_installer/src/py_mcp_installer/installer.py +656 -0
- py_mcp_installer/src/py_mcp_installer/mcp_inspector.py +750 -0
- py_mcp_installer/src/py_mcp_installer/platform_detector.py +451 -0
- py_mcp_installer/src/py_mcp_installer/platforms/__init__.py +26 -0
- py_mcp_installer/src/py_mcp_installer/platforms/claude_code.py +225 -0
- py_mcp_installer/src/py_mcp_installer/platforms/codex.py +181 -0
- py_mcp_installer/src/py_mcp_installer/platforms/cursor.py +191 -0
- py_mcp_installer/src/py_mcp_installer/types.py +222 -0
- py_mcp_installer/src/py_mcp_installer/utils.py +463 -0
- py_mcp_installer/tests/__init__.py +0 -0
- py_mcp_installer/tests/platforms/__init__.py +0 -0
- py_mcp_installer/tests/test_platform_detector.py +17 -0
- mcp_ticketer/adapters/github.py +0 -1574
- mcp_ticketer/adapters/jira.py +0 -1258
- mcp_ticketer-0.12.0.dist-info/METADATA +0 -550
- mcp_ticketer-0.12.0.dist-info/RECORD +0 -91
- mcp_ticketer-0.12.0.dist-info/top_level.txt +0 -1
- {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/entry_points.txt +0 -0
- {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."""
|
mcp_ticketer/core/__init__.py
CHANGED
|
@@ -2,28 +2,78 @@
|
|
|
2
2
|
|
|
3
3
|
from .adapter import BaseAdapter
|
|
4
4
|
from .instructions import (
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
]
|