mcp-ticketer 0.4.3__py3-none-any.whl → 0.4.5__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 +12 -3
- mcp_ticketer/__version__.py +1 -1
- mcp_ticketer/adapters/aitrackdown.py +16 -5
- mcp_ticketer/adapters/github.py +1 -2
- mcp_ticketer/adapters/jira.py +1 -2
- mcp_ticketer/adapters/linear/adapter.py +21 -9
- mcp_ticketer/adapters/linear/client.py +1 -2
- mcp_ticketer/adapters/linear/mappers.py +1 -2
- mcp_ticketer/cli/adapter_diagnostics.py +2 -4
- mcp_ticketer/cli/auggie_configure.py +35 -15
- mcp_ticketer/cli/codex_configure.py +38 -31
- mcp_ticketer/cli/configure.py +9 -3
- mcp_ticketer/cli/discover.py +6 -2
- mcp_ticketer/cli/gemini_configure.py +38 -25
- mcp_ticketer/cli/main.py +147 -32
- mcp_ticketer/cli/mcp_configure.py +115 -78
- mcp_ticketer/cli/python_detection.py +126 -0
- mcp_ticketer/core/__init__.py +1 -2
- mcp_ticketer/mcp/__init__.py +29 -1
- mcp_ticketer/mcp/__main__.py +60 -0
- mcp_ticketer/mcp/server.py +34 -14
- mcp_ticketer/mcp/tools/__init__.py +9 -7
- mcp_ticketer/queue/__init__.py +3 -1
- mcp_ticketer/queue/manager.py +10 -46
- mcp_ticketer/queue/ticket_registry.py +5 -5
- {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/METADATA +13 -4
- {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/RECORD +31 -29
- {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/top_level.txt +0 -0
mcp_ticketer/mcp/__init__.py
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
"""MCP server implementation for ticket management."""
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .server import MCPTicketServer
|
|
4
7
|
|
|
5
8
|
__all__ = ["MCPTicketServer"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def __dir__():
|
|
12
|
+
"""Return list of available names for dir().
|
|
13
|
+
|
|
14
|
+
This ensures that MCPTicketServer appears in dir() results
|
|
15
|
+
even though it's lazily imported.
|
|
16
|
+
"""
|
|
17
|
+
return __all__
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def __getattr__(name: str):
|
|
21
|
+
"""Lazy import to avoid premature module loading.
|
|
22
|
+
|
|
23
|
+
This prevents the RuntimeWarning when running:
|
|
24
|
+
python -m mcp_ticketer.mcp.server
|
|
25
|
+
|
|
26
|
+
The warning occurred because __init__.py imported server.py before
|
|
27
|
+
runpy could execute it as __main__.
|
|
28
|
+
"""
|
|
29
|
+
if name == "MCPTicketServer":
|
|
30
|
+
from .server import MCPTicketServer
|
|
31
|
+
|
|
32
|
+
return MCPTicketServer
|
|
33
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Main entry point for MCP server module invocation.
|
|
2
|
+
|
|
3
|
+
This module enables running the MCP server via:
|
|
4
|
+
python -m mcp_ticketer.mcp.server [project_path]
|
|
5
|
+
|
|
6
|
+
This is the preferred invocation method for MCP configurations as it:
|
|
7
|
+
- Works reliably across installation methods (pipx, pip, uv)
|
|
8
|
+
- Doesn't depend on binary path detection
|
|
9
|
+
- Follows the proven mcp-vector-search pattern
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from .server import main
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def run_server() -> None:
|
|
20
|
+
"""Run the MCP server with optional project path argument.
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
python -m mcp_ticketer.mcp.server
|
|
24
|
+
python -m mcp_ticketer.mcp.server /path/to/project
|
|
25
|
+
|
|
26
|
+
Arguments:
|
|
27
|
+
project_path (optional): Path to project directory for context
|
|
28
|
+
|
|
29
|
+
"""
|
|
30
|
+
# Check for project path argument
|
|
31
|
+
if len(sys.argv) > 1:
|
|
32
|
+
project_path = Path(sys.argv[1])
|
|
33
|
+
|
|
34
|
+
# Validate project path exists
|
|
35
|
+
if not project_path.exists():
|
|
36
|
+
sys.stderr.write(f"Error: Project path does not exist: {project_path}\n")
|
|
37
|
+
sys.exit(1)
|
|
38
|
+
|
|
39
|
+
# Change to project directory for context
|
|
40
|
+
try:
|
|
41
|
+
import os
|
|
42
|
+
|
|
43
|
+
os.chdir(project_path)
|
|
44
|
+
sys.stderr.write(f"[MCP Server] Working directory: {project_path}\n")
|
|
45
|
+
except OSError as e:
|
|
46
|
+
sys.stderr.write(f"Warning: Could not change to project directory: {e}\n")
|
|
47
|
+
|
|
48
|
+
# Run the async main function
|
|
49
|
+
try:
|
|
50
|
+
asyncio.run(main())
|
|
51
|
+
except KeyboardInterrupt:
|
|
52
|
+
sys.stderr.write("\n[MCP Server] Interrupted by user\n")
|
|
53
|
+
sys.exit(0)
|
|
54
|
+
except Exception as e:
|
|
55
|
+
sys.stderr.write(f"[MCP Server] Fatal error: {e}\n")
|
|
56
|
+
sys.exit(1)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
if __name__ == "__main__":
|
|
60
|
+
run_server()
|
mcp_ticketer/mcp/server.py
CHANGED
|
@@ -12,20 +12,40 @@ from dotenv import load_dotenv
|
|
|
12
12
|
import mcp_ticketer.adapters # noqa: F401
|
|
13
13
|
|
|
14
14
|
from ..core import AdapterRegistry
|
|
15
|
-
from ..core.models import
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
from ..core.models import Comment, Epic, Priority, SearchQuery, Task, TicketState
|
|
16
|
+
from .constants import (
|
|
17
|
+
DEFAULT_BASE_PATH,
|
|
18
|
+
DEFAULT_LIMIT,
|
|
19
|
+
DEFAULT_MAX_DEPTH,
|
|
20
|
+
DEFAULT_OFFSET,
|
|
21
|
+
ERROR_INTERNAL,
|
|
22
|
+
ERROR_METHOD_NOT_FOUND,
|
|
23
|
+
ERROR_PARSE,
|
|
24
|
+
JSONRPC_VERSION,
|
|
25
|
+
MCP_PROTOCOL_VERSION,
|
|
26
|
+
MSG_EPIC_NOT_FOUND,
|
|
27
|
+
MSG_INTERNAL_ERROR,
|
|
28
|
+
MSG_MISSING_TICKET_ID,
|
|
29
|
+
MSG_MISSING_TITLE,
|
|
30
|
+
MSG_NO_TICKETS_PROVIDED,
|
|
31
|
+
MSG_NO_UPDATES_PROVIDED,
|
|
32
|
+
MSG_TICKET_NOT_FOUND,
|
|
33
|
+
MSG_TRANSITION_FAILED,
|
|
34
|
+
MSG_UNKNOWN_METHOD,
|
|
35
|
+
MSG_UNKNOWN_OPERATION,
|
|
36
|
+
MSG_UPDATE_FAILED,
|
|
37
|
+
SERVER_NAME,
|
|
38
|
+
SERVER_VERSION,
|
|
39
|
+
STATUS_COMPLETED,
|
|
40
|
+
STATUS_ERROR,
|
|
41
|
+
)
|
|
42
|
+
from .dto import (
|
|
43
|
+
CreateEpicRequest,
|
|
44
|
+
CreateIssueRequest,
|
|
45
|
+
CreateTaskRequest,
|
|
46
|
+
CreateTicketRequest,
|
|
47
|
+
ReadTicketRequest,
|
|
48
|
+
)
|
|
29
49
|
from .response_builder import ResponseBuilder
|
|
30
50
|
|
|
31
51
|
# Load environment variables early (prioritize .env.local)
|
|
@@ -17,13 +17,15 @@ Modules:
|
|
|
17
17
|
|
|
18
18
|
# Import all tool modules to register them with FastMCP
|
|
19
19
|
# Order matters - import core functionality first
|
|
20
|
-
from . import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
from . import (
|
|
21
|
+
attachment_tools, # noqa: F401
|
|
22
|
+
bulk_tools, # noqa: F401
|
|
23
|
+
comment_tools, # noqa: F401
|
|
24
|
+
hierarchy_tools, # noqa: F401
|
|
25
|
+
pr_tools, # noqa: F401
|
|
26
|
+
search_tools, # noqa: F401
|
|
27
|
+
ticket_tools, # noqa: F401
|
|
28
|
+
)
|
|
27
29
|
|
|
28
30
|
__all__ = [
|
|
29
31
|
"ticket_tools",
|
mcp_ticketer/queue/__init__.py
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"""Async queue system for mcp-ticketer."""
|
|
2
2
|
|
|
3
|
-
from .manager import WorkerManager
|
|
4
3
|
from .queue import Queue, QueueItem, QueueStatus
|
|
5
4
|
from .worker import Worker
|
|
6
5
|
|
|
6
|
+
# Import manager last to avoid circular import
|
|
7
|
+
from .manager import WorkerManager
|
|
8
|
+
|
|
7
9
|
__all__ = ["Queue", "QueueItem", "QueueStatus", "Worker", "WorkerManager"]
|
mcp_ticketer/queue/manager.py
CHANGED
|
@@ -4,14 +4,14 @@ import fcntl
|
|
|
4
4
|
import logging
|
|
5
5
|
import os
|
|
6
6
|
import subprocess
|
|
7
|
-
import sys
|
|
8
7
|
import time
|
|
9
8
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
9
|
+
from typing import TYPE_CHECKING, Any
|
|
11
10
|
|
|
12
11
|
import psutil
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from .queue import Queue
|
|
15
15
|
|
|
16
16
|
logger = logging.getLogger(__name__)
|
|
17
17
|
|
|
@@ -21,6 +21,9 @@ class WorkerManager:
|
|
|
21
21
|
|
|
22
22
|
def __init__(self):
|
|
23
23
|
"""Initialize worker manager."""
|
|
24
|
+
# Lazy import to avoid circular dependency
|
|
25
|
+
from .queue import Queue
|
|
26
|
+
|
|
24
27
|
self.lock_file = Path.home() / ".mcp-ticketer" / "worker.lock"
|
|
25
28
|
self.pid_file = Path.home() / ".mcp-ticketer" / "worker.pid"
|
|
26
29
|
self.lock_file.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -123,7 +126,10 @@ class WorkerManager:
|
|
|
123
126
|
try:
|
|
124
127
|
# Start worker in subprocess using the same Python executable as the CLI
|
|
125
128
|
# This ensures the worker can import mcp_ticketer modules
|
|
126
|
-
|
|
129
|
+
# Lazy import to avoid circular dependency
|
|
130
|
+
from ..cli.python_detection import get_mcp_ticketer_python
|
|
131
|
+
|
|
132
|
+
python_executable = get_mcp_ticketer_python()
|
|
127
133
|
cmd = [python_executable, "-m", "mcp_ticketer.queue.run_worker"]
|
|
128
134
|
|
|
129
135
|
# Prepare environment for subprocess
|
|
@@ -320,48 +326,6 @@ class WorkerManager:
|
|
|
320
326
|
except (OSError, ValueError):
|
|
321
327
|
return None
|
|
322
328
|
|
|
323
|
-
def _get_python_executable(self) -> str:
|
|
324
|
-
"""Get the correct Python executable for the worker subprocess.
|
|
325
|
-
|
|
326
|
-
This ensures the worker uses the same Python environment as the CLI,
|
|
327
|
-
which is critical for module imports to work correctly.
|
|
328
|
-
|
|
329
|
-
Returns:
|
|
330
|
-
Path to Python executable
|
|
331
|
-
|
|
332
|
-
"""
|
|
333
|
-
# First, try to detect if we're running in a pipx environment
|
|
334
|
-
# by checking if the current executable is in a pipx venv
|
|
335
|
-
current_executable = sys.executable
|
|
336
|
-
|
|
337
|
-
# Check if we're in a pipx venv (path contains /pipx/venvs/)
|
|
338
|
-
if "/pipx/venvs/" in current_executable:
|
|
339
|
-
logger.debug(f"Using pipx Python executable: {current_executable}")
|
|
340
|
-
return current_executable
|
|
341
|
-
|
|
342
|
-
# Check if we can find the mcp-ticketer executable and extract its Python
|
|
343
|
-
import shutil
|
|
344
|
-
|
|
345
|
-
mcp_ticketer_path = shutil.which("mcp-ticketer")
|
|
346
|
-
if mcp_ticketer_path:
|
|
347
|
-
try:
|
|
348
|
-
# Read the shebang line to get the Python executable
|
|
349
|
-
with open(mcp_ticketer_path) as f:
|
|
350
|
-
first_line = f.readline().strip()
|
|
351
|
-
if first_line.startswith("#!") and "python" in first_line:
|
|
352
|
-
python_path = first_line[2:].strip()
|
|
353
|
-
if os.path.exists(python_path):
|
|
354
|
-
logger.debug(
|
|
355
|
-
f"Using Python from mcp-ticketer shebang: {python_path}"
|
|
356
|
-
)
|
|
357
|
-
return python_path
|
|
358
|
-
except OSError:
|
|
359
|
-
pass
|
|
360
|
-
|
|
361
|
-
# Fallback to sys.executable
|
|
362
|
-
logger.debug(f"Using sys.executable as fallback: {current_executable}")
|
|
363
|
-
return current_executable
|
|
364
|
-
|
|
365
329
|
def _cleanup(self):
|
|
366
330
|
"""Clean up lock and PID files."""
|
|
367
331
|
self._release_lock()
|
|
@@ -202,7 +202,7 @@ class TicketRegistry:
|
|
|
202
202
|
return None
|
|
203
203
|
|
|
204
204
|
columns = [desc[0] for desc in cursor.description]
|
|
205
|
-
ticket_info = dict(zip(columns, row))
|
|
205
|
+
ticket_info = dict(zip(columns, row, strict=False))
|
|
206
206
|
|
|
207
207
|
# Parse JSON fields
|
|
208
208
|
if ticket_info.get("ticket_data"):
|
|
@@ -236,7 +236,7 @@ class TicketRegistry:
|
|
|
236
236
|
columns = [desc[0] for desc in cursor.description]
|
|
237
237
|
|
|
238
238
|
for row in cursor.fetchall():
|
|
239
|
-
ticket_info = dict(zip(columns, row))
|
|
239
|
+
ticket_info = dict(zip(columns, row, strict=False))
|
|
240
240
|
|
|
241
241
|
# Parse JSON fields
|
|
242
242
|
if ticket_info.get("ticket_data"):
|
|
@@ -273,7 +273,7 @@ class TicketRegistry:
|
|
|
273
273
|
columns = [desc[0] for desc in cursor.description]
|
|
274
274
|
|
|
275
275
|
for row in cursor.fetchall():
|
|
276
|
-
ticket_info = dict(zip(columns, row))
|
|
276
|
+
ticket_info = dict(zip(columns, row, strict=False))
|
|
277
277
|
|
|
278
278
|
# Parse JSON fields
|
|
279
279
|
if ticket_info.get("ticket_data"):
|
|
@@ -306,7 +306,7 @@ class TicketRegistry:
|
|
|
306
306
|
columns = [desc[0] for desc in cursor.description]
|
|
307
307
|
|
|
308
308
|
for row in cursor.fetchall():
|
|
309
|
-
ticket_info = dict(zip(columns, row))
|
|
309
|
+
ticket_info = dict(zip(columns, row, strict=False))
|
|
310
310
|
|
|
311
311
|
# Parse JSON fields
|
|
312
312
|
if ticket_info.get("ticket_data"):
|
|
@@ -436,7 +436,7 @@ class TicketRegistry:
|
|
|
436
436
|
columns = [desc[0] for desc in cursor.description]
|
|
437
437
|
|
|
438
438
|
for row in cursor.fetchall():
|
|
439
|
-
recovery_info = dict(zip(columns, row))
|
|
439
|
+
recovery_info = dict(zip(columns, row, strict=False))
|
|
440
440
|
if recovery_info.get("recovery_data"):
|
|
441
441
|
recovery_info["recovery_data"] = json.loads(
|
|
442
442
|
recovery_info["recovery_data"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Universal ticket management interface for AI agents with MCP support
|
|
5
5
|
Author-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
6
6
|
Maintainer-email: MCP Ticketer Team <support@mcp-ticketer.io>
|
|
@@ -282,16 +282,25 @@ mcp-ticketer uninstall auggie # Alias for remove
|
|
|
282
282
|
{
|
|
283
283
|
"mcpServers": {
|
|
284
284
|
"mcp-ticketer": {
|
|
285
|
-
"command": "/path/to/
|
|
286
|
-
"args": ["
|
|
285
|
+
"command": "/path/to/venv/bin/python",
|
|
286
|
+
"args": ["-m", "mcp_ticketer.mcp.server", "/absolute/path/to/project"],
|
|
287
287
|
"env": {
|
|
288
|
-
"MCP_TICKETER_ADAPTER": "aitrackdown"
|
|
288
|
+
"MCP_TICKETER_ADAPTER": "aitrackdown",
|
|
289
|
+
"PYTHONPATH": "/absolute/path/to/project"
|
|
289
290
|
}
|
|
290
291
|
}
|
|
291
292
|
}
|
|
292
293
|
}
|
|
293
294
|
```
|
|
294
295
|
|
|
296
|
+
**Why this pattern?**
|
|
297
|
+
- **More Reliable**: Uses venv Python directly instead of binary wrapper
|
|
298
|
+
- **Consistent**: Matches proven mcp-vector-search pattern
|
|
299
|
+
- **Universal**: Works across pipx, pip, and uv installations
|
|
300
|
+
- **Better Errors**: Python module invocation provides clearer error messages
|
|
301
|
+
|
|
302
|
+
**Automatic Detection**: The `mcp-ticketer install` commands automatically detect your venv Python and generate the correct configuration.
|
|
303
|
+
|
|
295
304
|
**See [AI Client Integration Guide](docs/AI_CLIENT_INTEGRATION.md) for client-specific details.**
|
|
296
305
|
|
|
297
306
|
## ⚙️ Configuration
|
|
@@ -1,38 +1,39 @@
|
|
|
1
|
-
mcp_ticketer/__init__.py,sha256
|
|
2
|
-
mcp_ticketer/__version__.py,sha256=
|
|
1
|
+
mcp_ticketer/__init__.py,sha256=Xx4WaprO5PXhVPbYi1L6tBmwmJMkYS-lMyG4ieN6QP0,717
|
|
2
|
+
mcp_ticketer/__version__.py,sha256=vioHFC2eLXv3RlmwMaPO8QGtnhB8gou02LbH7LA6A-U,1117
|
|
3
3
|
mcp_ticketer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
mcp_ticketer/adapters/__init__.py,sha256=B5DFllWn23hkhmrLykNO5uMMSdcFuuPHXyLw_jyFzuE,358
|
|
5
|
-
mcp_ticketer/adapters/aitrackdown.py,sha256=
|
|
6
|
-
mcp_ticketer/adapters/github.py,sha256=
|
|
5
|
+
mcp_ticketer/adapters/aitrackdown.py,sha256=qCR53JpOVlOHiR_pdjGF2RYOemgkKxIwDTOlpcYF18E,30320
|
|
6
|
+
mcp_ticketer/adapters/github.py,sha256=QeZefKs204g2nXZ9yDb3j-HwrufbXBPoXB0zLp6bvW0,47338
|
|
7
7
|
mcp_ticketer/adapters/hybrid.py,sha256=7ocRjK7N7FdXSUCeFc23jFevfVwcPvHPIsEPXV_4o1w,18997
|
|
8
|
-
mcp_ticketer/adapters/jira.py,sha256=
|
|
8
|
+
mcp_ticketer/adapters/jira.py,sha256=9OtYAQfUdUQqEYjs61jzYpVrHu23hyP22mm-Bfn5KqA,35204
|
|
9
9
|
mcp_ticketer/adapters/linear.py,sha256=trm6ZhmlUl80sj51WAPAox_R2HQZXZ-h1QXJsrFYDCQ,587
|
|
10
10
|
mcp_ticketer/adapters/linear/__init__.py,sha256=6l0ZoR6ZHSRcytLfps2AZuk5R189Pq1GfR5-YDQt8-Q,731
|
|
11
|
-
mcp_ticketer/adapters/linear/adapter.py,sha256=
|
|
12
|
-
mcp_ticketer/adapters/linear/client.py,sha256=
|
|
13
|
-
mcp_ticketer/adapters/linear/mappers.py,sha256=
|
|
11
|
+
mcp_ticketer/adapters/linear/adapter.py,sha256=ZCj6ZM5RiWbdiGrhA3NsMTgFImvrzaB0jBIr_3ZCcO8,30959
|
|
12
|
+
mcp_ticketer/adapters/linear/client.py,sha256=0UmWlSEcRiwnSMFYKL89KMrPPL8S8uZ5V6rIY_KFOQU,8803
|
|
13
|
+
mcp_ticketer/adapters/linear/mappers.py,sha256=GN1X7bOcU-5dhDW3dAtSEGivinhFBc8hoKYot8c5tCo,9631
|
|
14
14
|
mcp_ticketer/adapters/linear/queries.py,sha256=K8y7xc3iH-q9LEUmg-0YDBhh546LAwLZDvVLkzx3yY4,7223
|
|
15
15
|
mcp_ticketer/adapters/linear/types.py,sha256=ugXtRGLljDw6yoCnEVgdFs0xLR9ErLdnv4ffh9EAUhk,7874
|
|
16
16
|
mcp_ticketer/cache/__init__.py,sha256=Xcd-cKnt-Cx7jBzvfzUUUPaGkmyXFi5XUFWw3Z4b7d4,138
|
|
17
17
|
mcp_ticketer/cache/memory.py,sha256=rWphWZy7XTbHezC7HMRQN9ISUhYo0Pc2OTgLG30vHnI,5047
|
|
18
18
|
mcp_ticketer/cli/__init__.py,sha256=l9Q8iKmfGkTu0cssHBVqNZTsL4eAtFzOB25AED_0G6g,89
|
|
19
|
-
mcp_ticketer/cli/adapter_diagnostics.py,sha256=
|
|
20
|
-
mcp_ticketer/cli/auggie_configure.py,sha256=
|
|
21
|
-
mcp_ticketer/cli/codex_configure.py,sha256=
|
|
22
|
-
mcp_ticketer/cli/configure.py,sha256=
|
|
19
|
+
mcp_ticketer/cli/adapter_diagnostics.py,sha256=pQDdtDgBwSW04wdFEPVzwbul3KgfB9g6ZMS85qpYulY,14988
|
|
20
|
+
mcp_ticketer/cli/auggie_configure.py,sha256=BA31HvOXljPqi3QMKt5eI5jYUWCnnH00sDqwR3y2nSY,11701
|
|
21
|
+
mcp_ticketer/cli/codex_configure.py,sha256=LLGzsFjCNO3irtabSazCpsZ5eUmG6eAjCNn6B5M4aHQ,12249
|
|
22
|
+
mcp_ticketer/cli/configure.py,sha256=T4LczvZIc2FZM-joqICL8NpjCeThAUknEhJkHsmpdc8,16158
|
|
23
23
|
mcp_ticketer/cli/diagnostics.py,sha256=s7P4vDzPpthgiBJfAOXpunlhZ62buHg_BA5W7ghQBqg,29952
|
|
24
|
-
mcp_ticketer/cli/discover.py,sha256=
|
|
25
|
-
mcp_ticketer/cli/gemini_configure.py,sha256=
|
|
24
|
+
mcp_ticketer/cli/discover.py,sha256=paG8zElIFEK6lgVD-tHWoFDTuWQ185LirFp0fVlYgB0,13148
|
|
25
|
+
mcp_ticketer/cli/gemini_configure.py,sha256=GXbQkfZGsmx_2cJKxH_5z3JdcwpMopF0duI_TzbKip8,12644
|
|
26
26
|
mcp_ticketer/cli/linear_commands.py,sha256=YnmqRacAfTdF0CLr4BXOxFs3uwm_hVifbGdTe6t2CfA,17273
|
|
27
|
-
mcp_ticketer/cli/main.py,sha256=
|
|
28
|
-
mcp_ticketer/cli/mcp_configure.py,sha256=
|
|
27
|
+
mcp_ticketer/cli/main.py,sha256=DV05n5-JGIjIX1t4-oR7j5tuE4c2Z0of6KVahUzGiJY,89254
|
|
28
|
+
mcp_ticketer/cli/mcp_configure.py,sha256=dgApMLBApLxU0fvFOyDBkX69GOGVNTXhAKM-hZGw5v8,14142
|
|
29
29
|
mcp_ticketer/cli/migrate_config.py,sha256=MYsr_C5ZxsGg0P13etWTWNrJ_lc6ElRCkzfQADYr3DM,5956
|
|
30
30
|
mcp_ticketer/cli/platform_commands.py,sha256=pTLRT2wot8dAmy1-roJWWOT0Cxu7j-06BlWDnZ9a4jY,3624
|
|
31
|
+
mcp_ticketer/cli/python_detection.py,sha256=qmhi0CIDKH_AUVGkJ9jyY1zBpx1cwiQNv0vnEvMYDFQ,4272
|
|
31
32
|
mcp_ticketer/cli/queue_commands.py,sha256=mm-3H6jmkUGJDyU_E46o9iRpek8tvFCm77F19OtHiZI,7884
|
|
32
33
|
mcp_ticketer/cli/simple_health.py,sha256=GlOLRRFoifCna995NoHuKpb3xmFkLi2b3Ke1hyeDvq4,7950
|
|
33
34
|
mcp_ticketer/cli/ticket_commands.py,sha256=zmtePGhZzhw_r-0xWQMzXSJMo684PlzEN5LYfcR3_dw,26589
|
|
34
35
|
mcp_ticketer/cli/utils.py,sha256=JU2CtdA8pLaH0R5Xpb_Z4-W-PvQfzhbXl9VR04vzMSE,22992
|
|
35
|
-
mcp_ticketer/core/__init__.py,sha256
|
|
36
|
+
mcp_ticketer/core/__init__.py,sha256=aOnzv5YBfxvd6HvZeEnXeajizde53TcFaMWL3PJh5lY,379
|
|
36
37
|
mcp_ticketer/core/adapter.py,sha256=K8bQ9fQRN6Xjaxgl24f6X5u0PVmj9WFof_MOKapDHbU,12136
|
|
37
38
|
mcp_ticketer/core/config.py,sha256=q95coT6zDAVbN6eFFe6HUHXyqBm669z8g8nKWNfL8fs,19251
|
|
38
39
|
mcp_ticketer/core/env_discovery.py,sha256=iZnmtv1RWnmjjih0iFEInOoK9CU9_oNpfNgmiToQ5wk,19934
|
|
@@ -43,13 +44,14 @@ mcp_ticketer/core/mappers.py,sha256=okte6EV_OuPvnM1KXHUcfrpPd7TWnKh44X3_W3HxwiI,
|
|
|
43
44
|
mcp_ticketer/core/models.py,sha256=ABKdyAkEkKtMF_d6D8_qRL-2ujz1DshemHSyqTPUthA,14448
|
|
44
45
|
mcp_ticketer/core/project_config.py,sha256=DmLekuMuOgNtzg-olOU4Utv00DdCH1-CXuoooA-adMs,23609
|
|
45
46
|
mcp_ticketer/core/registry.py,sha256=gBeXcZ3grHl9gYFbyRp-C4IM7SD_KGTeXT_1jG8XrCc,3470
|
|
46
|
-
mcp_ticketer/mcp/__init__.py,sha256=
|
|
47
|
+
mcp_ticketer/mcp/__init__.py,sha256=fWcCqL7MxKcsnq8vUqDV-rsxykOo3J5_98bba1oT1dw,857
|
|
48
|
+
mcp_ticketer/mcp/__main__.py,sha256=Fo_5KJOFako2gi1Z1kk5zEt2sGJW6BX6oXlYp7twYTs,1713
|
|
47
49
|
mcp_ticketer/mcp/constants.py,sha256=EBGsJtBPaTCvAm5rOMknckrXActrNIls7lRklnh1L4s,2072
|
|
48
50
|
mcp_ticketer/mcp/dto.py,sha256=FR_OBtaxrno8AsHynPwUUW715iAoaBkrr7Ud8HZTQW8,7233
|
|
49
51
|
mcp_ticketer/mcp/response_builder.py,sha256=DUfe1e0CcXPlepLq-cGH6b_THqoZEynYfVKkZEeLe0M,4933
|
|
50
|
-
mcp_ticketer/mcp/server.py,sha256=
|
|
52
|
+
mcp_ticketer/mcp/server.py,sha256=XjlajZs4F7g4rXuuDlxvKQ-kml4PqRBAFnpntxgw_Ds,48832
|
|
51
53
|
mcp_ticketer/mcp/server_sdk.py,sha256=orgOTrvrtBn2BeMJt5HWeodvCU9sWH4o5pQIZ_geXao,2552
|
|
52
|
-
mcp_ticketer/mcp/tools/__init__.py,sha256=
|
|
54
|
+
mcp_ticketer/mcp/tools/__init__.py,sha256=6miiC2Cru8u2TCrm9RYF1jxd7vu9SI7BPLUjtzwOxT8,1056
|
|
53
55
|
mcp_ticketer/mcp/tools/attachment_tools.py,sha256=hDeQV1rkSjZwT__FKLkR04FH_AsAF6QysyeP_CKxdiU,5673
|
|
54
56
|
mcp_ticketer/mcp/tools/bulk_tools.py,sha256=UWY1T5DnWhpBJnqMdLMu7Feen515UAlcn_hOjTmDncc,9199
|
|
55
57
|
mcp_ticketer/mcp/tools/comment_tools.py,sha256=fVJZeSg_rr6tVoVAKF8rv5nUooqg5d4S44s1mKFTYM0,2701
|
|
@@ -57,17 +59,17 @@ mcp_ticketer/mcp/tools/hierarchy_tools.py,sha256=08KxOawUKGZK3kYPZ5w9mRk-lVaSFxQ
|
|
|
57
59
|
mcp_ticketer/mcp/tools/pr_tools.py,sha256=SnKJRsvkmmr2eh1qaIqxC0PHD6rVXKg6mkk9Skdpc0Y,4539
|
|
58
60
|
mcp_ticketer/mcp/tools/search_tools.py,sha256=6qwSBRkGx-zO0rxebeQqMcBj006ZovAgfyLGfw3kxig,6951
|
|
59
61
|
mcp_ticketer/mcp/tools/ticket_tools.py,sha256=KYMl2h-nf7hZq-kOi1z4H0TEj7MzMklOsRIl4HaP8WQ,8121
|
|
60
|
-
mcp_ticketer/queue/__init__.py,sha256=
|
|
62
|
+
mcp_ticketer/queue/__init__.py,sha256=yQtdFNHhk1G_BHTuYk-Vlu6ZgEQ6Ik994zMH1IGHwbc,279
|
|
61
63
|
mcp_ticketer/queue/__main__.py,sha256=gc_tE9NUdK07OJfTZuD4t6KeBD_vxFQIhknGTQUG_jk,109
|
|
62
64
|
mcp_ticketer/queue/health_monitor.py,sha256=TDmPnYuZJb3yHNJlGFvE9UU-LfsKTrC4Vapyvdb3fso,12226
|
|
63
|
-
mcp_ticketer/queue/manager.py,sha256=
|
|
65
|
+
mcp_ticketer/queue/manager.py,sha256=UHkI0OSDyspY0EM2UVf5E1PjUTmZIcOcgGNovxtuVYs,10732
|
|
64
66
|
mcp_ticketer/queue/queue.py,sha256=q9HDXgnlwspamMJIeu9og7qONttXHmFZHPSaMtJDPlw,17923
|
|
65
67
|
mcp_ticketer/queue/run_worker.py,sha256=WhoeamL8LKZ66TM8W1PkMPwjF2w_EDFMP-mevs6C1TM,1019
|
|
66
|
-
mcp_ticketer/queue/ticket_registry.py,sha256=
|
|
68
|
+
mcp_ticketer/queue/ticket_registry.py,sha256=xVg3i7Eb5rtQY-4bbw3zYY1h-C6jF1t1NZEGhObzD8g,15491
|
|
67
69
|
mcp_ticketer/queue/worker.py,sha256=AJHtpJZEhGoPuCDPXSMsn9DeODelo5f__0C__3zoN08,20970
|
|
68
|
-
mcp_ticketer-0.4.
|
|
69
|
-
mcp_ticketer-0.4.
|
|
70
|
-
mcp_ticketer-0.4.
|
|
71
|
-
mcp_ticketer-0.4.
|
|
72
|
-
mcp_ticketer-0.4.
|
|
73
|
-
mcp_ticketer-0.4.
|
|
70
|
+
mcp_ticketer-0.4.5.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
|
|
71
|
+
mcp_ticketer-0.4.5.dist-info/METADATA,sha256=l1eDYLelVRQ1aJldM9nXa0_vvelSgQ6o78smdDlCYjo,16020
|
|
72
|
+
mcp_ticketer-0.4.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
73
|
+
mcp_ticketer-0.4.5.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
|
|
74
|
+
mcp_ticketer-0.4.5.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
|
|
75
|
+
mcp_ticketer-0.4.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|