mcp-ticketer 0.1.21__py3-none-any.whl → 0.1.23__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 +7 -7
- mcp_ticketer/__version__.py +4 -2
- mcp_ticketer/adapters/__init__.py +4 -4
- mcp_ticketer/adapters/aitrackdown.py +66 -49
- mcp_ticketer/adapters/github.py +192 -125
- mcp_ticketer/adapters/hybrid.py +99 -53
- mcp_ticketer/adapters/jira.py +161 -151
- mcp_ticketer/adapters/linear.py +396 -246
- mcp_ticketer/cache/__init__.py +1 -1
- mcp_ticketer/cache/memory.py +15 -16
- mcp_ticketer/cli/__init__.py +1 -1
- mcp_ticketer/cli/configure.py +69 -93
- mcp_ticketer/cli/discover.py +43 -35
- mcp_ticketer/cli/main.py +283 -298
- mcp_ticketer/cli/mcp_configure.py +39 -15
- mcp_ticketer/cli/migrate_config.py +11 -13
- mcp_ticketer/cli/queue_commands.py +21 -58
- mcp_ticketer/cli/utils.py +121 -66
- mcp_ticketer/core/__init__.py +2 -2
- mcp_ticketer/core/adapter.py +46 -39
- mcp_ticketer/core/config.py +128 -92
- mcp_ticketer/core/env_discovery.py +69 -37
- mcp_ticketer/core/http_client.py +57 -40
- mcp_ticketer/core/mappers.py +98 -54
- mcp_ticketer/core/models.py +38 -24
- mcp_ticketer/core/project_config.py +145 -80
- mcp_ticketer/core/registry.py +16 -16
- mcp_ticketer/mcp/__init__.py +1 -1
- mcp_ticketer/mcp/server.py +199 -145
- mcp_ticketer/queue/__init__.py +2 -2
- mcp_ticketer/queue/__main__.py +1 -1
- mcp_ticketer/queue/manager.py +30 -26
- mcp_ticketer/queue/queue.py +147 -85
- mcp_ticketer/queue/run_worker.py +2 -3
- mcp_ticketer/queue/worker.py +55 -40
- {mcp_ticketer-0.1.21.dist-info → mcp_ticketer-0.1.23.dist-info}/METADATA +1 -1
- mcp_ticketer-0.1.23.dist-info/RECORD +42 -0
- mcp_ticketer-0.1.21.dist-info/RECORD +0 -42
- {mcp_ticketer-0.1.21.dist-info → mcp_ticketer-0.1.23.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.1.21.dist-info → mcp_ticketer-0.1.23.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.1.21.dist-info → mcp_ticketer-0.1.23.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.1.21.dist-info → mcp_ticketer-0.1.23.dist-info}/top_level.txt +0 -0
mcp_ticketer/queue/worker.py
CHANGED
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
"""Background worker for processing queued ticket operations."""
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
|
-
import json
|
|
5
4
|
import logging
|
|
6
5
|
import signal
|
|
7
|
-
import
|
|
6
|
+
import threading
|
|
8
7
|
import time
|
|
9
|
-
from datetime import datetime
|
|
8
|
+
from datetime import datetime
|
|
10
9
|
from pathlib import Path
|
|
11
|
-
from typing import
|
|
12
|
-
|
|
10
|
+
from typing import Any, Optional
|
|
11
|
+
|
|
13
12
|
from dotenv import load_dotenv
|
|
14
13
|
|
|
15
|
-
from .queue import Queue, QueueItem, QueueStatus
|
|
16
14
|
from ..core import AdapterRegistry, Task
|
|
15
|
+
from .queue import Queue, QueueItem, QueueStatus
|
|
17
16
|
|
|
18
17
|
# Load environment variables from .env.local
|
|
19
18
|
env_path = Path.cwd() / ".env.local"
|
|
@@ -28,11 +27,8 @@ LOG_FILE = LOG_DIR / "worker.log"
|
|
|
28
27
|
|
|
29
28
|
logging.basicConfig(
|
|
30
29
|
level=logging.INFO,
|
|
31
|
-
format=
|
|
32
|
-
handlers=[
|
|
33
|
-
logging.FileHandler(LOG_FILE),
|
|
34
|
-
logging.StreamHandler()
|
|
35
|
-
]
|
|
30
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
31
|
+
handlers=[logging.FileHandler(LOG_FILE), logging.StreamHandler()],
|
|
36
32
|
)
|
|
37
33
|
logger = logging.getLogger(__name__)
|
|
38
34
|
|
|
@@ -45,7 +41,7 @@ class Worker:
|
|
|
45
41
|
"linear": 60,
|
|
46
42
|
"jira": 30,
|
|
47
43
|
"github": 60,
|
|
48
|
-
"aitrackdown": 1000 # Local, no rate limit
|
|
44
|
+
"aitrackdown": 1000, # Local, no rate limit
|
|
49
45
|
}
|
|
50
46
|
|
|
51
47
|
# Retry configuration
|
|
@@ -60,7 +56,7 @@ class Worker:
|
|
|
60
56
|
self,
|
|
61
57
|
queue: Optional[Queue] = None,
|
|
62
58
|
batch_size: int = DEFAULT_BATCH_SIZE,
|
|
63
|
-
max_concurrent: int = DEFAULT_MAX_CONCURRENT
|
|
59
|
+
max_concurrent: int = DEFAULT_MAX_CONCURRENT,
|
|
64
60
|
):
|
|
65
61
|
"""Initialize worker.
|
|
66
62
|
|
|
@@ -68,6 +64,7 @@ class Worker:
|
|
|
68
64
|
queue: Queue instance (creates default if not provided)
|
|
69
65
|
batch_size: Number of items to process in a batch
|
|
70
66
|
max_concurrent: Maximum concurrent operations per adapter
|
|
67
|
+
|
|
71
68
|
"""
|
|
72
69
|
self.queue = queue or Queue()
|
|
73
70
|
self.running = False
|
|
@@ -76,8 +73,8 @@ class Worker:
|
|
|
76
73
|
self.max_concurrent = max_concurrent
|
|
77
74
|
|
|
78
75
|
# Track rate limits per adapter
|
|
79
|
-
self.last_request_times:
|
|
80
|
-
self.adapter_semaphores:
|
|
76
|
+
self.last_request_times: dict[str, datetime] = {}
|
|
77
|
+
self.adapter_semaphores: dict[str, asyncio.Semaphore] = {}
|
|
81
78
|
|
|
82
79
|
# Statistics
|
|
83
80
|
self.stats = {
|
|
@@ -91,7 +88,9 @@ class Worker:
|
|
|
91
88
|
signal.signal(signal.SIGTERM, self._signal_handler)
|
|
92
89
|
signal.signal(signal.SIGINT, self._signal_handler)
|
|
93
90
|
|
|
94
|
-
logger.info(
|
|
91
|
+
logger.info(
|
|
92
|
+
f"Worker initialized with batch_size={batch_size}, max_concurrent={max_concurrent}"
|
|
93
|
+
)
|
|
95
94
|
|
|
96
95
|
def _signal_handler(self, signum, frame):
|
|
97
96
|
"""Handle shutdown signals."""
|
|
@@ -103,6 +102,7 @@ class Worker:
|
|
|
103
102
|
|
|
104
103
|
Args:
|
|
105
104
|
daemon: Run as daemon process
|
|
105
|
+
|
|
106
106
|
"""
|
|
107
107
|
if self.running:
|
|
108
108
|
logger.warning("Worker already running")
|
|
@@ -153,11 +153,12 @@ class Worker:
|
|
|
153
153
|
|
|
154
154
|
logger.info("Worker loop stopped")
|
|
155
155
|
|
|
156
|
-
def _get_batch(self) ->
|
|
156
|
+
def _get_batch(self) -> list[QueueItem]:
|
|
157
157
|
"""Get a batch of pending items from the queue.
|
|
158
158
|
|
|
159
159
|
Returns:
|
|
160
160
|
List of queue items to process
|
|
161
|
+
|
|
161
162
|
"""
|
|
162
163
|
batch = []
|
|
163
164
|
for _ in range(self.batch_size):
|
|
@@ -168,11 +169,12 @@ class Worker:
|
|
|
168
169
|
break
|
|
169
170
|
return batch
|
|
170
171
|
|
|
171
|
-
async def _process_batch(self, batch:
|
|
172
|
+
async def _process_batch(self, batch: list[QueueItem]):
|
|
172
173
|
"""Process a batch of queue items with concurrency control.
|
|
173
174
|
|
|
174
175
|
Args:
|
|
175
176
|
batch: List of queue items to process
|
|
177
|
+
|
|
176
178
|
"""
|
|
177
179
|
logger.info(f"Processing batch of {len(batch)} items")
|
|
178
180
|
|
|
@@ -192,12 +194,13 @@ class Worker:
|
|
|
192
194
|
# Wait for all adapter groups to complete
|
|
193
195
|
await asyncio.gather(*tasks, return_exceptions=True)
|
|
194
196
|
|
|
195
|
-
async def _process_adapter_group(self, adapter: str, items:
|
|
197
|
+
async def _process_adapter_group(self, adapter: str, items: list[QueueItem]):
|
|
196
198
|
"""Process items for a specific adapter with concurrency control.
|
|
197
199
|
|
|
198
200
|
Args:
|
|
199
201
|
adapter: Adapter name
|
|
200
202
|
items: List of items for this adapter
|
|
203
|
+
|
|
201
204
|
"""
|
|
202
205
|
logger.debug(f"Processing {len(items)} items for adapter {adapter}")
|
|
203
206
|
|
|
@@ -223,8 +226,11 @@ class Worker:
|
|
|
223
226
|
|
|
224
227
|
Args:
|
|
225
228
|
item: Queue item to process
|
|
229
|
+
|
|
226
230
|
"""
|
|
227
|
-
logger.info(
|
|
231
|
+
logger.info(
|
|
232
|
+
f"Processing queue item {item.id}: {item.operation} on {item.adapter}"
|
|
233
|
+
)
|
|
228
234
|
|
|
229
235
|
try:
|
|
230
236
|
# Check rate limit
|
|
@@ -239,11 +245,7 @@ class Worker:
|
|
|
239
245
|
result = await self._execute_operation(adapter, item)
|
|
240
246
|
|
|
241
247
|
# Mark as completed
|
|
242
|
-
self.queue.update_status(
|
|
243
|
-
item.id,
|
|
244
|
-
QueueStatus.COMPLETED,
|
|
245
|
-
result=result
|
|
246
|
-
)
|
|
248
|
+
self.queue.update_status(item.id, QueueStatus.COMPLETED, result=result)
|
|
247
249
|
self.stats["items_processed"] += 1
|
|
248
250
|
logger.info(f"Successfully processed {item.id}")
|
|
249
251
|
|
|
@@ -253,8 +255,10 @@ class Worker:
|
|
|
253
255
|
# Check retry count
|
|
254
256
|
if item.retry_count < self.MAX_RETRIES:
|
|
255
257
|
# Retry with exponential backoff
|
|
256
|
-
retry_delay = self.BASE_RETRY_DELAY * (2
|
|
257
|
-
logger.info(
|
|
258
|
+
retry_delay = self.BASE_RETRY_DELAY * (2**item.retry_count)
|
|
259
|
+
logger.info(
|
|
260
|
+
f"Retrying {item.id} after {retry_delay}s (attempt {item.retry_count + 1}/{self.MAX_RETRIES})"
|
|
261
|
+
)
|
|
258
262
|
|
|
259
263
|
# Increment retry count and reset to pending
|
|
260
264
|
self.queue.increment_retry(item.id)
|
|
@@ -264,9 +268,7 @@ class Worker:
|
|
|
264
268
|
else:
|
|
265
269
|
# Max retries exceeded, mark as failed
|
|
266
270
|
self.queue.update_status(
|
|
267
|
-
item.id,
|
|
268
|
-
QueueStatus.FAILED,
|
|
269
|
-
error_message=str(e)
|
|
271
|
+
item.id, QueueStatus.FAILED, error_message=str(e)
|
|
270
272
|
)
|
|
271
273
|
self.stats["items_failed"] += 1
|
|
272
274
|
logger.error(f"Max retries exceeded for {item.id}, marking as failed")
|
|
@@ -276,6 +278,7 @@ class Worker:
|
|
|
276
278
|
|
|
277
279
|
Args:
|
|
278
280
|
adapter: Adapter name
|
|
281
|
+
|
|
279
282
|
"""
|
|
280
283
|
if adapter not in self.RATE_LIMITS:
|
|
281
284
|
return
|
|
@@ -302,11 +305,13 @@ class Worker:
|
|
|
302
305
|
|
|
303
306
|
Returns:
|
|
304
307
|
Adapter instance
|
|
308
|
+
|
|
305
309
|
"""
|
|
306
310
|
# Load configuration from the project directory where the item was created
|
|
307
|
-
from ..cli.main import load_config
|
|
308
|
-
from pathlib import Path
|
|
309
311
|
import os
|
|
312
|
+
from pathlib import Path
|
|
313
|
+
|
|
314
|
+
from ..cli.main import load_config
|
|
310
315
|
|
|
311
316
|
# Use item's project_dir if available, otherwise use current directory
|
|
312
317
|
project_path = Path(item.project_dir) if item.project_dir else None
|
|
@@ -337,7 +342,7 @@ class Worker:
|
|
|
337
342
|
|
|
338
343
|
return AdapterRegistry.get_adapter(item.adapter, adapter_config)
|
|
339
344
|
|
|
340
|
-
async def _execute_operation(self, adapter, item: QueueItem) ->
|
|
345
|
+
async def _execute_operation(self, adapter, item: QueueItem) -> dict[str, Any]:
|
|
341
346
|
"""Execute the queued operation.
|
|
342
347
|
|
|
343
348
|
Args:
|
|
@@ -346,6 +351,7 @@ class Worker:
|
|
|
346
351
|
|
|
347
352
|
Returns:
|
|
348
353
|
Operation result
|
|
354
|
+
|
|
349
355
|
"""
|
|
350
356
|
operation = item.operation
|
|
351
357
|
data = item.ticket_data
|
|
@@ -369,7 +375,11 @@ class Worker:
|
|
|
369
375
|
ticket_id = data.get("ticket_id")
|
|
370
376
|
state = data.get("state")
|
|
371
377
|
result = await adapter.transition_state(ticket_id, state)
|
|
372
|
-
return {
|
|
378
|
+
return {
|
|
379
|
+
"id": result.id if result else None,
|
|
380
|
+
"state": state,
|
|
381
|
+
"success": bool(result),
|
|
382
|
+
}
|
|
373
383
|
|
|
374
384
|
elif operation == "comment":
|
|
375
385
|
ticket_id = data.get("ticket_id")
|
|
@@ -380,11 +390,12 @@ class Worker:
|
|
|
380
390
|
else:
|
|
381
391
|
raise ValueError(f"Unknown operation: {operation}")
|
|
382
392
|
|
|
383
|
-
def get_status(self) ->
|
|
393
|
+
def get_status(self) -> dict[str, Any]:
|
|
384
394
|
"""Get worker status.
|
|
385
395
|
|
|
386
396
|
Returns:
|
|
387
397
|
Status information
|
|
398
|
+
|
|
388
399
|
"""
|
|
389
400
|
queue_stats = self.queue.get_stats()
|
|
390
401
|
|
|
@@ -393,7 +404,9 @@ class Worker:
|
|
|
393
404
|
if self.stats["start_time"]:
|
|
394
405
|
elapsed = (datetime.now() - self.stats["start_time"]).total_seconds()
|
|
395
406
|
if elapsed > 0:
|
|
396
|
-
throughput =
|
|
407
|
+
throughput = (
|
|
408
|
+
self.stats["items_processed"] / elapsed * 60
|
|
409
|
+
) # items per minute
|
|
397
410
|
|
|
398
411
|
return {
|
|
399
412
|
"running": self.running,
|
|
@@ -408,14 +421,15 @@ class Worker:
|
|
|
408
421
|
"throughput_per_minute": throughput,
|
|
409
422
|
"uptime_seconds": (
|
|
410
423
|
(datetime.now() - self.stats["start_time"]).total_seconds()
|
|
411
|
-
if self.stats["start_time"]
|
|
424
|
+
if self.stats["start_time"]
|
|
425
|
+
else 0
|
|
412
426
|
),
|
|
413
427
|
},
|
|
414
428
|
"queue_stats": queue_stats,
|
|
415
429
|
"total_pending": queue_stats.get(QueueStatus.PENDING.value, 0),
|
|
416
430
|
"total_processing": queue_stats.get(QueueStatus.PROCESSING.value, 0),
|
|
417
431
|
"total_completed": queue_stats.get(QueueStatus.COMPLETED.value, 0),
|
|
418
|
-
"total_failed": queue_stats.get(QueueStatus.FAILED.value, 0)
|
|
432
|
+
"total_failed": queue_stats.get(QueueStatus.FAILED.value, 0),
|
|
419
433
|
}
|
|
420
434
|
|
|
421
435
|
@classmethod
|
|
@@ -427,10 +441,11 @@ class Worker:
|
|
|
427
441
|
|
|
428
442
|
Returns:
|
|
429
443
|
Log content
|
|
444
|
+
|
|
430
445
|
"""
|
|
431
446
|
if not LOG_FILE.exists():
|
|
432
447
|
return "No logs available"
|
|
433
448
|
|
|
434
|
-
with open(LOG_FILE
|
|
449
|
+
with open(LOG_FILE) as f:
|
|
435
450
|
all_lines = f.readlines()
|
|
436
|
-
return "".join(all_lines[-lines:])
|
|
451
|
+
return "".join(all_lines[-lines:])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.23
|
|
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>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
mcp_ticketer/__init__.py,sha256=701DkKv4mtXRwbG6GjYhryb-aV8FVmq3RMF-qD_V3I8,497
|
|
2
|
+
mcp_ticketer/__version__.py,sha256=L30Ek80zyhmFK6JeBpHlO8fe-4ZFzdJMtpN64wq35I4,1118
|
|
3
|
+
mcp_ticketer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
mcp_ticketer/adapters/__init__.py,sha256=B5DFllWn23hkhmrLykNO5uMMSdcFuuPHXyLw_jyFzuE,358
|
|
5
|
+
mcp_ticketer/adapters/aitrackdown.py,sha256=24h3UqMj5CltCl271kmqnDFOicCVp9w7yMTKK8s_dTA,16283
|
|
6
|
+
mcp_ticketer/adapters/github.py,sha256=X0lEWBCfy-vztX2vauuVSYsOCa9_ezt9hGa5BsCQTu8,46663
|
|
7
|
+
mcp_ticketer/adapters/hybrid.py,sha256=XFqHtWTLguE61ZGuZ156gxoz-wMr21AxLSADI1QVxcU,19025
|
|
8
|
+
mcp_ticketer/adapters/jira.py,sha256=WcuqHtix2iHz0nMy2QhtQfHYhq4byb_ETfsusiCwocE,30574
|
|
9
|
+
mcp_ticketer/adapters/linear.py,sha256=z39jQt74AVGmrV5HrJQdoRT-j58FoY21hbfAysrsdTc,71460
|
|
10
|
+
mcp_ticketer/cache/__init__.py,sha256=Xcd-cKnt-Cx7jBzvfzUUUPaGkmyXFi5XUFWw3Z4b7d4,138
|
|
11
|
+
mcp_ticketer/cache/memory.py,sha256=2yBqGi9i0SanlUhJoOC7nijWjoMa3_ntPe-V-AV-LfU,5042
|
|
12
|
+
mcp_ticketer/cli/__init__.py,sha256=l9Q8iKmfGkTu0cssHBVqNZTsL4eAtFzOB25AED_0G6g,89
|
|
13
|
+
mcp_ticketer/cli/configure.py,sha256=BsA_pSHQMQS0t1bJO_wMM8LWsd5sWJDASjEPRHvwC18,16198
|
|
14
|
+
mcp_ticketer/cli/discover.py,sha256=AF_qlQc1Oo0UkWayoF5pmRChS5J3fJjH6f2YZzd_k8w,13188
|
|
15
|
+
mcp_ticketer/cli/main.py,sha256=njw45cl8FBtPpaQfmk4jn3D9Dc6UQo0qWxYfPPcmwZg,43115
|
|
16
|
+
mcp_ticketer/cli/mcp_configure.py,sha256=RzV50UjXgOmvMp-9S0zS39psuvjffVByaMrqrUaAGAM,9594
|
|
17
|
+
mcp_ticketer/cli/migrate_config.py,sha256=E-uD9_GTWQzfdiBweFYtCKyXOYtIaRHv7QuyVjV-rbI,5973
|
|
18
|
+
mcp_ticketer/cli/queue_commands.py,sha256=mm-3H6jmkUGJDyU_E46o9iRpek8tvFCm77F19OtHiZI,7884
|
|
19
|
+
mcp_ticketer/cli/utils.py,sha256=2ptUrp2ELZsox0kSxAI5DFrHonOU999qh4MxbLv6VBQ,21155
|
|
20
|
+
mcp_ticketer/core/__init__.py,sha256=eXovsaJymQRP2AwOBuOy6mFtI3I68D7gGenZ5V-IMqo,349
|
|
21
|
+
mcp_ticketer/core/adapter.py,sha256=q64LxOInIno7EIbmuxItf8KEsd-g9grCs__Z4uwZHto,10273
|
|
22
|
+
mcp_ticketer/core/config.py,sha256=QlWMJmxz4HsoZ4e2DZQdgKy0YHlL6UebbDVxw1CD3jI,15117
|
|
23
|
+
mcp_ticketer/core/env_discovery.py,sha256=wKp2Pi5vQMGOTrM1690IBv_eoABly-pD8ah7n1zSWDc,17710
|
|
24
|
+
mcp_ticketer/core/http_client.py,sha256=s5ikMiwEJ8TJjNn73wu3gv3OdAtyBEpAqPnSroRMW2k,13971
|
|
25
|
+
mcp_ticketer/core/mappers.py,sha256=1aG1jFsHTCwmGRVgOlXW-VOSTGzc86gv7qjDfiR1ups,17462
|
|
26
|
+
mcp_ticketer/core/models.py,sha256=DRuJoYbjp9fcPV9GwQfhVcNUB0XmwQB3vuqW8hQWZ_k,6491
|
|
27
|
+
mcp_ticketer/core/project_config.py,sha256=BeBkeCaQC0kZmpIhkdsqOL1zHBeDmkaRbcVUwAk8B0s,23265
|
|
28
|
+
mcp_ticketer/core/registry.py,sha256=ShYLDPE62KFJpB0kj_zFyQzRxSH3LkQEEuo1jaakb1k,3483
|
|
29
|
+
mcp_ticketer/mcp/__init__.py,sha256=Y05eTzsPk0wH8yKNIM-ekpGjgSDO0bQr0EME-vOP4GE,123
|
|
30
|
+
mcp_ticketer/mcp/server.py,sha256=U0bkHYe_DGa7wNPtuawsA8i_llHmpADgtq-OkYMjoBo,37041
|
|
31
|
+
mcp_ticketer/queue/__init__.py,sha256=1YIaCpZpFqPcqvDEQXiEvDLiw94DXRdCJkBaVIFQrms,231
|
|
32
|
+
mcp_ticketer/queue/__main__.py,sha256=gc_tE9NUdK07OJfTZuD4t6KeBD_vxFQIhknGTQUG_jk,109
|
|
33
|
+
mcp_ticketer/queue/manager.py,sha256=qqUqq_JtH8jfg-MDfc-UIgFaa7gYsA1eBaR2KsCw48c,7513
|
|
34
|
+
mcp_ticketer/queue/queue.py,sha256=zD7SRDP7zfGm4gokqzgL0CLuPUPxbBNmddsOqLMCbjQ,13162
|
|
35
|
+
mcp_ticketer/queue/run_worker.py,sha256=_IBezjvhbJJ7gn0evTBIMbSPjvfFZwxEdT-1DLo_bRk,799
|
|
36
|
+
mcp_ticketer/queue/worker.py,sha256=2wusez3Wxmun6qAmup3WsGjBD-vNgtLwxygYviXdECQ,14634
|
|
37
|
+
mcp_ticketer-0.1.23.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
|
|
38
|
+
mcp_ticketer-0.1.23.dist-info/METADATA,sha256=YrPCs8xszAbjFsMBB2CO_7vU6gVAMDUimqDiumqV3uk,11211
|
|
39
|
+
mcp_ticketer-0.1.23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
+
mcp_ticketer-0.1.23.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
|
|
41
|
+
mcp_ticketer-0.1.23.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
|
|
42
|
+
mcp_ticketer-0.1.23.dist-info/RECORD,,
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
mcp_ticketer/__init__.py,sha256=ayPQdFr6msypD06_G96a1H0bdFCT1m1wDtv8MZBpY4I,496
|
|
2
|
-
mcp_ticketer/__version__.py,sha256=sa6fOTLI2QO1PqPR2VQ3nFscVhK59e5MZluGTV9l0S8,1115
|
|
3
|
-
mcp_ticketer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
-
mcp_ticketer/adapters/__init__.py,sha256=K_1egvhHb5F_7yFceUx2YzPGEoc7vX-q8dMVaS4K6gw,356
|
|
5
|
-
mcp_ticketer/adapters/aitrackdown.py,sha256=916SpzQcG6gSdQit5Ptm9AdGOsZFXpt9nNWlRjCReMY,15924
|
|
6
|
-
mcp_ticketer/adapters/github.py,sha256=NdUPaSlOEi4zZN_VBvAjSJANJhp1IBwdOkkF6fGbaKs,45410
|
|
7
|
-
mcp_ticketer/adapters/hybrid.py,sha256=H9B-pfWmDKXO3GgzxB8undEcZTMzLz_1a6zWhj7xfR0,18556
|
|
8
|
-
mcp_ticketer/adapters/jira.py,sha256=jxoQS22wjOl1FhsYiGK-r1pLXOenUmbe5wa0ehD6xDg,30373
|
|
9
|
-
mcp_ticketer/adapters/linear.py,sha256=ewGTpvJmyTBJd73PPQBM6ijwVsacXZ4oRAigh_RAdAA,69315
|
|
10
|
-
mcp_ticketer/cache/__init__.py,sha256=MSi3GLXancfP2-edPC9TFAJk7r0j6H5-XmpMHnkGPbI,137
|
|
11
|
-
mcp_ticketer/cache/memory.py,sha256=gTzv-xF7qGfiYVUjG7lnzo0ZcqgXQajMl4NAYUcaytg,5133
|
|
12
|
-
mcp_ticketer/cli/__init__.py,sha256=YeljyLtv906TqkvRuEPhmKO-Uk0CberQ9I6kx1tx2UA,88
|
|
13
|
-
mcp_ticketer/cli/configure.py,sha256=etFutvc0QpaVDMOsZiiN7wKuaT98Od1Tj9W6lsEWw5A,16351
|
|
14
|
-
mcp_ticketer/cli/discover.py,sha256=putWrGcctUH8K0fOMtr9MZA9VnWoXzbtoe7mXSkDxhg,13156
|
|
15
|
-
mcp_ticketer/cli/main.py,sha256=98lIVFsSPIig5Oz7g9CxyA-u6EIiHT6Ernj7su7NMc8,40988
|
|
16
|
-
mcp_ticketer/cli/mcp_configure.py,sha256=1WbBdF25OvxfAGcjxtYa9xmBOGEPQu-wh_nkefmWjMQ,9352
|
|
17
|
-
mcp_ticketer/cli/migrate_config.py,sha256=iZIstnlr9vkhiW_MlnSyJOkMi4KHQqrZ6Hz1ECD_VUk,6045
|
|
18
|
-
mcp_ticketer/cli/queue_commands.py,sha256=f3pEHKZ43dBHEIoCBvdfvjfMB9_WJltps9ATwTzorY0,8160
|
|
19
|
-
mcp_ticketer/cli/utils.py,sha256=cdP-7GHtELAPZtqInUC24k_SAnRbIRkafIP3T4kMZDM,19509
|
|
20
|
-
mcp_ticketer/core/__init__.py,sha256=qpCZveQMyqU2JvYG9MG_c6X35z_VoSmjWdXGcUZqqmA,348
|
|
21
|
-
mcp_ticketer/core/adapter.py,sha256=W87W-hEmgCxw5BkvaFlCGZtouN49aW2KHND53zgg6-c,10339
|
|
22
|
-
mcp_ticketer/core/config.py,sha256=9a2bksbcFr7KXeHSPY6KoSP5Pzt54utYPCmbM-1QKmk,13932
|
|
23
|
-
mcp_ticketer/core/env_discovery.py,sha256=SPoyq_y5j-3gJG5gYNVjCIIrbdzimOdDbTYySmQWZOA,17536
|
|
24
|
-
mcp_ticketer/core/http_client.py,sha256=RM9CEMNcuRb-FxhAijmM_FeBMgxgh1OII9HIPBdJue0,13855
|
|
25
|
-
mcp_ticketer/core/mappers.py,sha256=8I4jcqDqoQEdWlteDMpVeVF3Wo0fDCkmFPRr8oNv8gA,16933
|
|
26
|
-
mcp_ticketer/core/models.py,sha256=GhuTitY6t_QlqfEUvWT6Q2zvY7qAtx_SQyCMMn8iYkk,6473
|
|
27
|
-
mcp_ticketer/core/project_config.py,sha256=dc_sGE6ds_WYBdwY2s6onWP07umTQ_TZBRmIL_ZrMpI,22446
|
|
28
|
-
mcp_ticketer/core/registry.py,sha256=fwje0fnjp0YKPZ0SrVWk82SMNLs7CD0JlHQmx7SigNo,3537
|
|
29
|
-
mcp_ticketer/mcp/__init__.py,sha256=Bvzof9vBu6VwcXcIZK8RgKv6ycRV9tDlO-9TUmd8zqQ,122
|
|
30
|
-
mcp_ticketer/mcp/server.py,sha256=CC1iaeugUbiVrNvNgOgm2mRb4AW-5e0X2ygLjH8I6mM,34835
|
|
31
|
-
mcp_ticketer/queue/__init__.py,sha256=xHBoUwor8ZdO8bIHc7nP25EsAp5Si5Co4g_8ybb7fes,230
|
|
32
|
-
mcp_ticketer/queue/__main__.py,sha256=kQd6iOCKbbFqpRdbIRavuI4_G7-oE898JE4a0yLEYPE,108
|
|
33
|
-
mcp_ticketer/queue/manager.py,sha256=79AH9oUxdBXH3lmJ3kIlFf2GQkWHL6XB6u5JqVWPq60,7571
|
|
34
|
-
mcp_ticketer/queue/queue.py,sha256=mXCUwlayqEHDB6IN8RvxSQpVdKcrlSww40VS_4i9lj8,12292
|
|
35
|
-
mcp_ticketer/queue/run_worker.py,sha256=HFoykfDpOoz8OUxWbQ2Fka_UlGrYwjPVZ-DEimGFH9o,802
|
|
36
|
-
mcp_ticketer/queue/worker.py,sha256=h0Y3l51Ld5zpWd-HoQ3sPlgcGRJM1kiId3aKSqJSars,14588
|
|
37
|
-
mcp_ticketer-0.1.21.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
|
|
38
|
-
mcp_ticketer-0.1.21.dist-info/METADATA,sha256=lhTocJdk3A5MPRcvBQ_wh1RS0ztojaYRhXJTlyDkLzE,11211
|
|
39
|
-
mcp_ticketer-0.1.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
40
|
-
mcp_ticketer-0.1.21.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
|
|
41
|
-
mcp_ticketer-0.1.21.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
|
|
42
|
-
mcp_ticketer-0.1.21.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|