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.

Files changed (48) hide show
  1. mcp_ticketer/__version__.py +1 -1
  2. mcp_ticketer/adapters/aitrackdown.py +254 -11
  3. mcp_ticketer/adapters/github.py +13 -13
  4. mcp_ticketer/adapters/hybrid.py +11 -11
  5. mcp_ticketer/adapters/jira.py +20 -24
  6. mcp_ticketer/cache/memory.py +6 -5
  7. mcp_ticketer/cli/codex_configure.py +2 -2
  8. mcp_ticketer/cli/configure.py +4 -5
  9. mcp_ticketer/cli/diagnostics.py +2 -2
  10. mcp_ticketer/cli/discover.py +4 -5
  11. mcp_ticketer/cli/gemini_configure.py +2 -2
  12. mcp_ticketer/cli/linear_commands.py +6 -7
  13. mcp_ticketer/cli/main.py +341 -250
  14. mcp_ticketer/cli/mcp_configure.py +1 -2
  15. mcp_ticketer/cli/ticket_commands.py +27 -30
  16. mcp_ticketer/cli/utils.py +23 -22
  17. mcp_ticketer/core/__init__.py +2 -1
  18. mcp_ticketer/core/adapter.py +82 -13
  19. mcp_ticketer/core/config.py +27 -29
  20. mcp_ticketer/core/env_discovery.py +10 -10
  21. mcp_ticketer/core/env_loader.py +8 -8
  22. mcp_ticketer/core/http_client.py +16 -16
  23. mcp_ticketer/core/mappers.py +10 -10
  24. mcp_ticketer/core/models.py +50 -20
  25. mcp_ticketer/core/project_config.py +40 -34
  26. mcp_ticketer/core/registry.py +2 -2
  27. mcp_ticketer/mcp/dto.py +32 -32
  28. mcp_ticketer/mcp/response_builder.py +2 -2
  29. mcp_ticketer/mcp/server.py +3 -3
  30. mcp_ticketer/mcp/server_sdk.py +2 -2
  31. mcp_ticketer/mcp/tools/attachment_tools.py +3 -4
  32. mcp_ticketer/mcp/tools/comment_tools.py +2 -2
  33. mcp_ticketer/mcp/tools/hierarchy_tools.py +8 -8
  34. mcp_ticketer/mcp/tools/pr_tools.py +2 -2
  35. mcp_ticketer/mcp/tools/search_tools.py +6 -6
  36. mcp_ticketer/mcp/tools/ticket_tools.py +12 -12
  37. mcp_ticketer/queue/health_monitor.py +4 -4
  38. mcp_ticketer/queue/manager.py +2 -2
  39. mcp_ticketer/queue/queue.py +16 -16
  40. mcp_ticketer/queue/ticket_registry.py +7 -7
  41. mcp_ticketer/queue/worker.py +2 -2
  42. {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/METADATA +61 -2
  43. mcp_ticketer-0.4.4.dist-info/RECORD +73 -0
  44. mcp_ticketer-0.4.2.dist-info/RECORD +0 -73
  45. {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/WHEEL +0 -0
  46. {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/entry_points.txt +0 -0
  47. {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/licenses/LICENSE +0 -0
  48. {mcp_ticketer-0.4.2.dist-info → mcp_ticketer-0.4.4.dist-info}/top_level.txt +0 -0
@@ -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, Callable, Optional
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) -> Optional[Any]:
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: Optional[float] = None) -> None:
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: Optional[float] = None,
138
+ ttl: float | None = None,
138
139
  key_prefix: str = "",
139
- cache_instance: Optional[MemoryCache] = None,
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, Optional
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: Optional[str] = None
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
 
@@ -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: Optional[str] = None,
444
- api_key: Optional[str] = None,
445
- project_id: Optional[str] = None,
446
- team_id: Optional[str] = None,
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:
@@ -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, Optional
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: Optional[str] = None,
798
+ output_file: str | None = None,
799
799
  json_output: bool = False,
800
800
  ) -> None:
801
801
  """Run comprehensive system diagnostics."""
@@ -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: Optional[Path] = typer.Option(
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: Optional[str] = typer.Option(
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: Optional[Path] = typer.Option(
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: Optional[Path] = typer.Option(
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, Optional
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: Optional[str] = None
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: Optional[str] = typer.Option(
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: Optional[str] = typer.Option(
252
+ team_key: str | None = typer.Option(
254
253
  None, "--team-key", "-k", help="Team key (e.g., '1M')"
255
254
  ),
256
- team_id: Optional[str] = typer.Option(None, "--team-id", "-i", help="Team UUID"),
257
- workspace: Optional[str] = typer.Option(
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: Optional[str] = typer.Option(
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: Optional[str] = typer.Option(
387
+ team_id: str | None = typer.Option(
389
388
  None, "--team-id", "-i", help="Team UUID to show info for"
390
389
  ),
391
390
  ):