mcp-ticketer 0.4.2__py3-none-any.whl → 0.4.4__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/__version__.py +1 -1
- mcp_ticketer/adapters/aitrackdown.py +254 -11
- mcp_ticketer/adapters/github.py +13 -13
- mcp_ticketer/adapters/hybrid.py +11 -11
- mcp_ticketer/adapters/jira.py +20 -24
- mcp_ticketer/cache/memory.py +6 -5
- mcp_ticketer/cli/codex_configure.py +2 -2
- mcp_ticketer/cli/configure.py +4 -5
- mcp_ticketer/cli/diagnostics.py +2 -2
- mcp_ticketer/cli/discover.py +4 -5
- mcp_ticketer/cli/gemini_configure.py +2 -2
- mcp_ticketer/cli/linear_commands.py +6 -7
- mcp_ticketer/cli/main.py +341 -250
- mcp_ticketer/cli/mcp_configure.py +1 -2
- mcp_ticketer/cli/ticket_commands.py +27 -30
- mcp_ticketer/cli/utils.py +23 -22
- mcp_ticketer/core/__init__.py +2 -1
- mcp_ticketer/core/adapter.py +82 -13
- mcp_ticketer/core/config.py +27 -29
- mcp_ticketer/core/env_discovery.py +10 -10
- mcp_ticketer/core/env_loader.py +8 -8
- mcp_ticketer/core/http_client.py +16 -16
- mcp_ticketer/core/mappers.py +10 -10
- mcp_ticketer/core/models.py +50 -20
- mcp_ticketer/core/project_config.py +40 -34
- mcp_ticketer/core/registry.py +2 -2
- mcp_ticketer/mcp/dto.py +32 -32
- mcp_ticketer/mcp/response_builder.py +2 -2
- mcp_ticketer/mcp/server.py +3 -3
- mcp_ticketer/mcp/server_sdk.py +2 -2
- mcp_ticketer/mcp/tools/attachment_tools.py +3 -4
- mcp_ticketer/mcp/tools/comment_tools.py +2 -2
- mcp_ticketer/mcp/tools/hierarchy_tools.py +8 -8
- mcp_ticketer/mcp/tools/pr_tools.py +2 -2
- mcp_ticketer/mcp/tools/search_tools.py +6 -6
- mcp_ticketer/mcp/tools/ticket_tools.py +12 -12
- mcp_ticketer/queue/health_monitor.py +4 -4
- mcp_ticketer/queue/manager.py +2 -2
- mcp_ticketer/queue/queue.py +16 -16
- mcp_ticketer/queue/ticket_registry.py +7 -7
- mcp_ticketer/queue/worker.py +2 -2
- {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/METADATA +61 -2
- mcp_ticketer-0.4.4.dist-info/RECORD +73 -0
- mcp_ticketer-0.4.2.dist-info/RECORD +0 -73
- {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/top_level.txt +0 -0
mcp_ticketer/cache/memory.py
CHANGED
|
@@ -4,8 +4,9 @@ import asyncio
|
|
|
4
4
|
import hashlib
|
|
5
5
|
import json
|
|
6
6
|
import time
|
|
7
|
+
from collections.abc import Callable
|
|
7
8
|
from functools import wraps
|
|
8
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class CacheEntry:
|
|
@@ -41,7 +42,7 @@ class MemoryCache:
|
|
|
41
42
|
self._default_ttl = default_ttl
|
|
42
43
|
self._lock = asyncio.Lock()
|
|
43
44
|
|
|
44
|
-
async def get(self, key: str) ->
|
|
45
|
+
async def get(self, key: str) -> Any | None:
|
|
45
46
|
"""Get value from cache.
|
|
46
47
|
|
|
47
48
|
Args:
|
|
@@ -60,7 +61,7 @@ class MemoryCache:
|
|
|
60
61
|
del self._cache[key]
|
|
61
62
|
return None
|
|
62
63
|
|
|
63
|
-
async def set(self, key: str, value: Any, ttl:
|
|
64
|
+
async def set(self, key: str, value: Any, ttl: float | None = None) -> None:
|
|
64
65
|
"""Set value in cache.
|
|
65
66
|
|
|
66
67
|
Args:
|
|
@@ -134,9 +135,9 @@ class MemoryCache:
|
|
|
134
135
|
|
|
135
136
|
|
|
136
137
|
def cache_decorator(
|
|
137
|
-
ttl:
|
|
138
|
+
ttl: float | None = None,
|
|
138
139
|
key_prefix: str = "",
|
|
139
|
-
cache_instance:
|
|
140
|
+
cache_instance: MemoryCache | None = None,
|
|
140
141
|
) -> Callable:
|
|
141
142
|
"""Decorator for caching async function results.
|
|
142
143
|
|
|
@@ -6,7 +6,7 @@ Unlike Claude Code and Gemini CLI, there is no project-level configuration suppo
|
|
|
6
6
|
|
|
7
7
|
import sys
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
if sys.version_info >= (3, 11):
|
|
12
12
|
import tomllib
|
|
@@ -78,7 +78,7 @@ def save_codex_config(config_path: Path, config: dict[str, Any]) -> None:
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
def create_codex_server_config(
|
|
81
|
-
binary_path: str, project_config: dict, cwd:
|
|
81
|
+
binary_path: str, project_config: dict, cwd: str | None = None
|
|
82
82
|
) -> dict[str, Any]:
|
|
83
83
|
"""Create Codex MCP server configuration for mcp-ticketer.
|
|
84
84
|
|
mcp_ticketer/cli/configure.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Interactive configuration wizard for MCP Ticketer."""
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
import typer
|
|
7
6
|
from rich.console import Console
|
|
@@ -440,10 +439,10 @@ def show_current_config() -> None:
|
|
|
440
439
|
|
|
441
440
|
|
|
442
441
|
def set_adapter_config(
|
|
443
|
-
adapter:
|
|
444
|
-
api_key:
|
|
445
|
-
project_id:
|
|
446
|
-
team_id:
|
|
442
|
+
adapter: str | None = None,
|
|
443
|
+
api_key: str | None = None,
|
|
444
|
+
project_id: str | None = None,
|
|
445
|
+
team_id: str | None = None,
|
|
447
446
|
global_scope: bool = False,
|
|
448
447
|
**kwargs,
|
|
449
448
|
) -> None:
|
mcp_ticketer/cli/diagnostics.py
CHANGED
|
@@ -5,7 +5,7 @@ import logging
|
|
|
5
5
|
import sys
|
|
6
6
|
from datetime import datetime, timedelta
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any
|
|
8
|
+
from typing import Any
|
|
9
9
|
|
|
10
10
|
import typer
|
|
11
11
|
from rich.console import Console
|
|
@@ -795,7 +795,7 @@ class SystemDiagnostics:
|
|
|
795
795
|
|
|
796
796
|
|
|
797
797
|
async def run_diagnostics(
|
|
798
|
-
output_file:
|
|
798
|
+
output_file: str | None = None,
|
|
799
799
|
json_output: bool = False,
|
|
800
800
|
) -> None:
|
|
801
801
|
"""Run comprehensive system diagnostics."""
|
mcp_ticketer/cli/discover.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""CLI command for auto-discovering configuration from .env files."""
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
import typer
|
|
7
6
|
from rich.console import Console
|
|
@@ -93,7 +92,7 @@ def _display_discovered_adapter(
|
|
|
93
92
|
|
|
94
93
|
@app.command()
|
|
95
94
|
def show(
|
|
96
|
-
project_path:
|
|
95
|
+
project_path: Path | None = typer.Option(
|
|
97
96
|
None,
|
|
98
97
|
"--path",
|
|
99
98
|
"-p",
|
|
@@ -148,7 +147,7 @@ def show(
|
|
|
148
147
|
|
|
149
148
|
@app.command()
|
|
150
149
|
def save(
|
|
151
|
-
adapter:
|
|
150
|
+
adapter: str | None = typer.Option(
|
|
152
151
|
None, "--adapter", "-a", help="Which adapter to save (defaults to recommended)"
|
|
153
152
|
),
|
|
154
153
|
global_config: bool = typer.Option(
|
|
@@ -157,7 +156,7 @@ def save(
|
|
|
157
156
|
dry_run: bool = typer.Option(
|
|
158
157
|
False, "--dry-run", help="Show what would be saved without saving"
|
|
159
158
|
),
|
|
160
|
-
project_path:
|
|
159
|
+
project_path: Path | None = typer.Option(
|
|
161
160
|
None,
|
|
162
161
|
"--path",
|
|
163
162
|
"-p",
|
|
@@ -261,7 +260,7 @@ def save(
|
|
|
261
260
|
|
|
262
261
|
@app.command()
|
|
263
262
|
def interactive(
|
|
264
|
-
project_path:
|
|
263
|
+
project_path: Path | None = typer.Option(
|
|
265
264
|
None,
|
|
266
265
|
"--path",
|
|
267
266
|
"-p",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Literal
|
|
5
|
+
from typing import Literal
|
|
6
6
|
|
|
7
7
|
from rich.console import Console
|
|
8
8
|
|
|
@@ -73,7 +73,7 @@ def save_gemini_config(config_path: Path, config: dict) -> None:
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
def create_gemini_server_config(
|
|
76
|
-
binary_path: str, project_config: dict, cwd:
|
|
76
|
+
binary_path: str, project_config: dict, cwd: str | None = None
|
|
77
77
|
) -> dict:
|
|
78
78
|
"""Create Gemini MCP server configuration for mcp-ticketer.
|
|
79
79
|
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Linear-specific CLI commands for workspace and team management."""
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
import typer
|
|
7
6
|
from gql import Client, gql
|
|
@@ -80,7 +79,7 @@ def list_workspaces():
|
|
|
80
79
|
|
|
81
80
|
@app.command("teams")
|
|
82
81
|
def list_teams(
|
|
83
|
-
workspace:
|
|
82
|
+
workspace: str | None = typer.Option(
|
|
84
83
|
None, "--workspace", "-w", help="Workspace URL key (optional)"
|
|
85
84
|
),
|
|
86
85
|
all_teams: bool = typer.Option(
|
|
@@ -250,11 +249,11 @@ def list_teams(
|
|
|
250
249
|
|
|
251
250
|
@app.command("configure")
|
|
252
251
|
def configure_team(
|
|
253
|
-
team_key:
|
|
252
|
+
team_key: str | None = typer.Option(
|
|
254
253
|
None, "--team-key", "-k", help="Team key (e.g., '1M')"
|
|
255
254
|
),
|
|
256
|
-
team_id:
|
|
257
|
-
workspace:
|
|
255
|
+
team_id: str | None = typer.Option(None, "--team-id", "-i", help="Team UUID"),
|
|
256
|
+
workspace: str | None = typer.Option(
|
|
258
257
|
None, "--workspace", "-w", help="Workspace URL key"
|
|
259
258
|
),
|
|
260
259
|
):
|
|
@@ -382,10 +381,10 @@ def configure_team(
|
|
|
382
381
|
|
|
383
382
|
@app.command("info")
|
|
384
383
|
def show_info(
|
|
385
|
-
team_key:
|
|
384
|
+
team_key: str | None = typer.Option(
|
|
386
385
|
None, "--team-key", "-k", help="Team key to show info for"
|
|
387
386
|
),
|
|
388
|
-
team_id:
|
|
387
|
+
team_id: str | None = typer.Option(
|
|
389
388
|
None, "--team-id", "-i", help="Team UUID to show info for"
|
|
390
389
|
),
|
|
391
390
|
):
|