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.

Files changed (31) hide show
  1. mcp_ticketer/__init__.py +12 -3
  2. mcp_ticketer/__version__.py +1 -1
  3. mcp_ticketer/adapters/aitrackdown.py +16 -5
  4. mcp_ticketer/adapters/github.py +1 -2
  5. mcp_ticketer/adapters/jira.py +1 -2
  6. mcp_ticketer/adapters/linear/adapter.py +21 -9
  7. mcp_ticketer/adapters/linear/client.py +1 -2
  8. mcp_ticketer/adapters/linear/mappers.py +1 -2
  9. mcp_ticketer/cli/adapter_diagnostics.py +2 -4
  10. mcp_ticketer/cli/auggie_configure.py +35 -15
  11. mcp_ticketer/cli/codex_configure.py +38 -31
  12. mcp_ticketer/cli/configure.py +9 -3
  13. mcp_ticketer/cli/discover.py +6 -2
  14. mcp_ticketer/cli/gemini_configure.py +38 -25
  15. mcp_ticketer/cli/main.py +147 -32
  16. mcp_ticketer/cli/mcp_configure.py +115 -78
  17. mcp_ticketer/cli/python_detection.py +126 -0
  18. mcp_ticketer/core/__init__.py +1 -2
  19. mcp_ticketer/mcp/__init__.py +29 -1
  20. mcp_ticketer/mcp/__main__.py +60 -0
  21. mcp_ticketer/mcp/server.py +34 -14
  22. mcp_ticketer/mcp/tools/__init__.py +9 -7
  23. mcp_ticketer/queue/__init__.py +3 -1
  24. mcp_ticketer/queue/manager.py +10 -46
  25. mcp_ticketer/queue/ticket_registry.py +5 -5
  26. {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/METADATA +13 -4
  27. {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/RECORD +31 -29
  28. {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/WHEEL +0 -0
  29. {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/entry_points.txt +0 -0
  30. {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/licenses/LICENSE +0 -0
  31. {mcp_ticketer-0.4.3.dist-info → mcp_ticketer-0.4.5.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,33 @@
1
1
  """MCP server implementation for ticket management."""
2
2
 
3
- from .server import MCPTicketServer
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()
@@ -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 (Comment, Epic, Priority, SearchQuery, Task,
16
- TicketState)
17
- from .constants import (DEFAULT_BASE_PATH, DEFAULT_LIMIT, DEFAULT_MAX_DEPTH,
18
- DEFAULT_OFFSET, ERROR_INTERNAL, ERROR_METHOD_NOT_FOUND,
19
- ERROR_PARSE, JSONRPC_VERSION, MCP_PROTOCOL_VERSION,
20
- MSG_EPIC_NOT_FOUND, MSG_INTERNAL_ERROR,
21
- MSG_MISSING_TICKET_ID, MSG_MISSING_TITLE,
22
- MSG_NO_TICKETS_PROVIDED, MSG_NO_UPDATES_PROVIDED,
23
- MSG_TICKET_NOT_FOUND, MSG_TRANSITION_FAILED,
24
- MSG_UNKNOWN_METHOD, MSG_UNKNOWN_OPERATION,
25
- MSG_UPDATE_FAILED, SERVER_NAME, SERVER_VERSION,
26
- STATUS_COMPLETED, STATUS_ERROR)
27
- from .dto import (CreateEpicRequest, CreateIssueRequest, CreateTaskRequest,
28
- CreateTicketRequest, ReadTicketRequest)
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 attachment_tools # noqa: F401
21
- from . import bulk_tools # noqa: F401
22
- from . import comment_tools # noqa: F401
23
- from . import hierarchy_tools # noqa: F401
24
- from . import pr_tools # noqa: F401
25
- from . import search_tools # noqa: F401
26
- from . import ticket_tools # noqa: F401
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",
@@ -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"]
@@ -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
- from .queue import Queue
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
- python_executable = self._get_python_executable()
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
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/mcp-ticketer",
286
- "args": ["serve"],
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=-8ko5W0ZFF5rWaiSCyTAiK6XLomlwnAWGfG9ntQHV5o,506
2
- mcp_ticketer/__version__.py,sha256=XCigyYqiMiYIHm9x4mCFmdBJ_ZnQIBrr9QBu9xunjUQ,1117
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=uY8R-ZgUH-mUdzZWR1DLdu7uXvqagysfoGrppAt1L28,30259
6
- mcp_ticketer/adapters/github.py,sha256=tsMPeF-qwkul0WEPrXx9T-DjTx0O--aAIePqJ3hqCt8,47367
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=VR1Xnlhp6EI1XmQbinFn9lch3G7MFUvDYnPg4kv1lUk,35233
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=vE5TR2iDCp-F_bHysPYtY3KZb1Mb3i4_qHFyybCNig0,31020
12
- mcp_ticketer/adapters/linear/client.py,sha256=KcLDTVOgUnOaSJS4domu0dmkslBipNfG5pPoVJ3M0a0,8837
13
- mcp_ticketer/adapters/linear/mappers.py,sha256=76UbR2GvkVuAcT4T7EAQSFfagcGOQcLKElwVAXsFQ10,9653
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=k7RBEbDx5_hiv8IqcJIDjvktmlDFO8mOqRW8JkZqUZ0,15040
20
- mcp_ticketer/cli/auggie_configure.py,sha256=Kd28n16s-X3_KtNfi2fXKij6iK-SnZRHrpgDns3Kq7g,10808
21
- mcp_ticketer/cli/codex_configure.py,sha256=9BoO8E_OypW7fs7UTRu76FMnU68E_HrbbkD696cgH58,11764
22
- mcp_ticketer/cli/configure.py,sha256=nO1G7E0y0GN5AcCRhBnU23j7kTLxF0GkQukLIYyB_0E,16197
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=CcQo5w2ISYMM1VDp34SHgyCMNazZ8w6DYkzCk49OU3Q,13164
25
- mcp_ticketer/cli/gemini_configure.py,sha256=72lXywYJKdGqAhtJpC6fPVYY1T_w7_ND07AfmhumGUc,12010
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=61xQfX5ALd27UZYMF58d5L_nbn2ZS2fyE6-XnWsplCQ,84806
28
- mcp_ticketer/cli/mcp_configure.py,sha256=lozgV_VZmOyZfPesg0oan8p_f93kGWyTDhE1byCbv4k,12324
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=-G2Pn9sXdC1XxdFXfxTWV5QS3vC0HvqCGxPM1MtC6lE,402
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=Y05eTzsPk0wH8yKNIM-ekpGjgSDO0bQr0EME-vOP4GE,123
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=6CkTTob3AUy1j7ye6uVTkcLu225tPfihxDWv5UjZqjg,48973
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=uXViWZoVOkU3MqvnNvuMRMD4BNcbruwvMQstFr_cLh4,1101
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=1YIaCpZpFqPcqvDEQXiEvDLiw94DXRdCJkBaVIFQrms,231
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=9CO15ORLeedXkUtnU3pn2JQqZDS3flE7Rq1OdkJFl6g,12233
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=8pHAx1H83CzjcaIzi_Tq3DtbDBDcDJIPUS9ofusTuWA,15421
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.3.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
69
- mcp_ticketer-0.4.3.dist-info/METADATA,sha256=E2S4KvN36OVS9HYVjasFOc2G9n0t4hITA4ISMvgXW2Y,15478
70
- mcp_ticketer-0.4.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
71
- mcp_ticketer-0.4.3.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
72
- mcp_ticketer-0.4.3.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
73
- mcp_ticketer-0.4.3.dist-info/RECORD,,
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,,