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/core/config.py
CHANGED
|
@@ -6,7 +6,7 @@ import os
|
|
|
6
6
|
from enum import Enum
|
|
7
7
|
from functools import lru_cache
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any, Optional
|
|
9
|
+
from typing import Any, Optional, cast
|
|
10
10
|
|
|
11
11
|
import yaml
|
|
12
12
|
from pydantic import BaseModel, Field, field_validator, model_validator
|
|
@@ -38,9 +38,9 @@ class GitHubConfig(BaseAdapterConfig):
|
|
|
38
38
|
"""GitHub adapter configuration."""
|
|
39
39
|
|
|
40
40
|
type: AdapterType = AdapterType.GITHUB
|
|
41
|
-
token: str | None = Field(None
|
|
42
|
-
owner: str | None = Field(None
|
|
43
|
-
repo: str | None = Field(None
|
|
41
|
+
token: str | None = Field(default=None)
|
|
42
|
+
owner: str | None = Field(default=None)
|
|
43
|
+
repo: str | None = Field(default=None)
|
|
44
44
|
api_url: str = "https://api.github.com"
|
|
45
45
|
use_projects_v2: bool = False
|
|
46
46
|
custom_priority_scheme: dict[str, list[str]] | None = None
|
|
@@ -53,7 +53,7 @@ class GitHubConfig(BaseAdapterConfig):
|
|
|
53
53
|
v = os.getenv("GITHUB_TOKEN")
|
|
54
54
|
if not v:
|
|
55
55
|
raise ValueError("GitHub token is required")
|
|
56
|
-
return v
|
|
56
|
+
return cast(str, v)
|
|
57
57
|
|
|
58
58
|
@field_validator("owner", mode="before")
|
|
59
59
|
@classmethod
|
|
@@ -63,7 +63,7 @@ class GitHubConfig(BaseAdapterConfig):
|
|
|
63
63
|
v = os.getenv("GITHUB_OWNER")
|
|
64
64
|
if not v:
|
|
65
65
|
raise ValueError("GitHub owner is required")
|
|
66
|
-
return v
|
|
66
|
+
return cast(str, v)
|
|
67
67
|
|
|
68
68
|
@field_validator("repo", mode="before")
|
|
69
69
|
@classmethod
|
|
@@ -73,17 +73,17 @@ class GitHubConfig(BaseAdapterConfig):
|
|
|
73
73
|
v = os.getenv("GITHUB_REPO")
|
|
74
74
|
if not v:
|
|
75
75
|
raise ValueError("GitHub repo is required")
|
|
76
|
-
return v
|
|
76
|
+
return cast(str, v)
|
|
77
77
|
|
|
78
78
|
|
|
79
79
|
class JiraConfig(BaseAdapterConfig):
|
|
80
80
|
"""JIRA adapter configuration."""
|
|
81
81
|
|
|
82
82
|
type: AdapterType = AdapterType.JIRA
|
|
83
|
-
server: str | None = Field(None
|
|
84
|
-
email: str | None = Field(None
|
|
85
|
-
api_token: str | None = Field(None
|
|
86
|
-
project_key: str | None = Field(None
|
|
83
|
+
server: str | None = Field(default=None)
|
|
84
|
+
email: str | None = Field(default=None)
|
|
85
|
+
api_token: str | None = Field(default=None)
|
|
86
|
+
project_key: str | None = Field(default=None)
|
|
87
87
|
cloud: bool = True
|
|
88
88
|
verify_ssl: bool = True
|
|
89
89
|
|
|
@@ -95,7 +95,7 @@ class JiraConfig(BaseAdapterConfig):
|
|
|
95
95
|
v = os.getenv("JIRA_SERVER")
|
|
96
96
|
if not v:
|
|
97
97
|
raise ValueError("JIRA server URL is required")
|
|
98
|
-
return v.rstrip("/")
|
|
98
|
+
return cast(str, v).rstrip("/")
|
|
99
99
|
|
|
100
100
|
@field_validator("email", mode="before")
|
|
101
101
|
@classmethod
|
|
@@ -105,7 +105,7 @@ class JiraConfig(BaseAdapterConfig):
|
|
|
105
105
|
v = os.getenv("JIRA_EMAIL")
|
|
106
106
|
if not v:
|
|
107
107
|
raise ValueError("JIRA email is required")
|
|
108
|
-
return v
|
|
108
|
+
return cast(str, v)
|
|
109
109
|
|
|
110
110
|
@field_validator("api_token", mode="before")
|
|
111
111
|
@classmethod
|
|
@@ -115,14 +115,14 @@ class JiraConfig(BaseAdapterConfig):
|
|
|
115
115
|
v = os.getenv("JIRA_API_TOKEN")
|
|
116
116
|
if not v:
|
|
117
117
|
raise ValueError("JIRA API token is required")
|
|
118
|
-
return v
|
|
118
|
+
return cast(str, v)
|
|
119
119
|
|
|
120
120
|
|
|
121
121
|
class LinearConfig(BaseAdapterConfig):
|
|
122
122
|
"""Linear adapter configuration."""
|
|
123
123
|
|
|
124
124
|
type: AdapterType = AdapterType.LINEAR
|
|
125
|
-
api_key: str | None = Field(None
|
|
125
|
+
api_key: str | None = Field(default=None)
|
|
126
126
|
workspace: str | None = None
|
|
127
127
|
team_key: str | None = None # Short team key like "BTA"
|
|
128
128
|
team_id: str | None = None # UUID team identifier
|
|
@@ -143,7 +143,7 @@ class LinearConfig(BaseAdapterConfig):
|
|
|
143
143
|
v = os.getenv("LINEAR_API_KEY")
|
|
144
144
|
if not v:
|
|
145
145
|
raise ValueError("Linear API key is required")
|
|
146
|
-
return v
|
|
146
|
+
return cast(str, v)
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
class AITrackdownConfig(BaseAdapterConfig):
|
|
@@ -343,16 +343,16 @@ class ConfigurationManager:
|
|
|
343
343
|
try:
|
|
344
344
|
with open(config_path, encoding="utf-8") as file:
|
|
345
345
|
if config_path.suffix.lower() in [".yaml", ".yml"]:
|
|
346
|
-
return yaml.safe_load(file) or {}
|
|
346
|
+
return cast(dict[str, Any], yaml.safe_load(file) or {})
|
|
347
347
|
elif config_path.suffix.lower() == ".json":
|
|
348
|
-
return json.load(file)
|
|
348
|
+
return cast(dict[str, Any], json.load(file))
|
|
349
349
|
else:
|
|
350
350
|
# Try YAML first, then JSON
|
|
351
351
|
content = file.read()
|
|
352
352
|
try:
|
|
353
|
-
return yaml.safe_load(content) or {}
|
|
353
|
+
return cast(dict[str, Any], yaml.safe_load(content) or {})
|
|
354
354
|
except yaml.YAMLError:
|
|
355
|
-
return json.loads(content)
|
|
355
|
+
return cast(dict[str, Any], json.loads(content))
|
|
356
356
|
except Exception as e:
|
|
357
357
|
logger.error(f"Error loading config file {config_path}: {e}")
|
|
358
358
|
return {}
|
|
@@ -382,7 +382,7 @@ class ConfigurationManager:
|
|
|
382
382
|
}
|
|
383
383
|
|
|
384
384
|
# Convert discovered adapters to config format
|
|
385
|
-
config_data = {"adapters": {}, "default_adapter": None}
|
|
385
|
+
config_data: dict[str, Any] = {"adapters": {}, "default_adapter": None}
|
|
386
386
|
|
|
387
387
|
for adapter in discovered.adapters:
|
|
388
388
|
adapter_config = {"type": adapter.adapter_type, "enabled": True}
|
mcp_ticketer/core/exceptions.py
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
"""Exception classes for MCP Ticketer.
|
|
1
|
+
"""Exception classes for MCP Ticketer.
|
|
2
|
+
|
|
3
|
+
Error Severity Classification:
|
|
4
|
+
CRITICAL - System-level issues (auth, config, network) → Always suggest diagnostics
|
|
5
|
+
MEDIUM - Resource issues (not found, permissions) → Suggest diagnostics
|
|
6
|
+
LOW - User input errors (validation, state transitions) → No diagnostics
|
|
7
|
+
"""
|
|
2
8
|
|
|
3
9
|
from __future__ import annotations
|
|
4
10
|
|