mcp-ticketer 0.1.29__py3-none-any.whl → 0.1.31__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/cli/diagnostics.py +108 -21
- mcp_ticketer/core/config.py +93 -0
- {mcp_ticketer-0.1.29.dist-info → mcp_ticketer-0.1.31.dist-info}/METADATA +1 -1
- {mcp_ticketer-0.1.29.dist-info → mcp_ticketer-0.1.31.dist-info}/RECORD +9 -9
- {mcp_ticketer-0.1.29.dist-info → mcp_ticketer-0.1.31.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.1.29.dist-info → mcp_ticketer-0.1.31.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.1.29.dist-info → mcp_ticketer-0.1.31.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.1.29.dist-info → mcp_ticketer-0.1.31.dist-info}/top_level.txt +0 -0
mcp_ticketer/__version__.py
CHANGED
mcp_ticketer/cli/diagnostics.py
CHANGED
|
@@ -15,22 +15,58 @@ from rich.panel import Panel
|
|
|
15
15
|
from rich.table import Table
|
|
16
16
|
from rich.text import Text
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
18
|
+
def safe_import_config():
|
|
19
|
+
"""Safely import configuration with fallback."""
|
|
20
|
+
try:
|
|
21
|
+
from ..core.config import get_config
|
|
22
|
+
return get_config
|
|
23
|
+
except ImportError:
|
|
24
|
+
# Create a minimal config fallback
|
|
25
|
+
class MockConfig:
|
|
26
|
+
def get_enabled_adapters(self):
|
|
27
|
+
return {}
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def default_adapter(self):
|
|
31
|
+
return "aitrackdown"
|
|
32
|
+
|
|
33
|
+
def get_config():
|
|
34
|
+
return MockConfig()
|
|
35
|
+
|
|
36
|
+
return get_config
|
|
37
|
+
|
|
38
|
+
def safe_import_registry():
|
|
39
|
+
"""Safely import adapter registry with fallback."""
|
|
40
|
+
try:
|
|
41
|
+
from ..core.registry import AdapterRegistry
|
|
42
|
+
return AdapterRegistry
|
|
43
|
+
except ImportError:
|
|
44
|
+
class MockRegistry:
|
|
45
|
+
@staticmethod
|
|
46
|
+
def get_adapter(adapter_type):
|
|
47
|
+
raise ImportError(f"Adapter {adapter_type} not available")
|
|
48
|
+
|
|
49
|
+
return MockRegistry
|
|
50
|
+
|
|
51
|
+
def safe_import_queue_manager():
|
|
52
|
+
"""Safely import queue manager with fallback."""
|
|
53
|
+
try:
|
|
54
|
+
from ..queue.manager import QueueManager
|
|
55
|
+
return QueueManager
|
|
56
|
+
except ImportError:
|
|
57
|
+
class MockQueueManager:
|
|
58
|
+
def get_worker_status(self):
|
|
59
|
+
return {"running": False, "pid": None}
|
|
60
|
+
|
|
61
|
+
def get_queue_stats(self):
|
|
62
|
+
return {"total": 0, "failed": 0}
|
|
63
|
+
|
|
64
|
+
return MockQueueManager
|
|
65
|
+
|
|
66
|
+
# Initialize with safe imports
|
|
67
|
+
get_config = safe_import_config()
|
|
68
|
+
AdapterRegistry = safe_import_registry()
|
|
69
|
+
QueueManager = safe_import_queue_manager()
|
|
34
70
|
|
|
35
71
|
console = Console()
|
|
36
72
|
logger = logging.getLogger(__name__)
|
|
@@ -40,22 +76,37 @@ class SystemDiagnostics:
|
|
|
40
76
|
"""Comprehensive system diagnostics and health reporting."""
|
|
41
77
|
|
|
42
78
|
def __init__(self):
|
|
79
|
+
# Initialize lists first
|
|
80
|
+
self.issues = []
|
|
81
|
+
self.warnings = []
|
|
82
|
+
self.successes = []
|
|
83
|
+
|
|
43
84
|
try:
|
|
44
85
|
self.config = get_config()
|
|
86
|
+
# Check if this is a mock config
|
|
87
|
+
if hasattr(self.config, '__class__') and 'Mock' in self.config.__class__.__name__:
|
|
88
|
+
self.config_available = False
|
|
89
|
+
self.warnings.append("Configuration system using fallback mode")
|
|
90
|
+
else:
|
|
91
|
+
self.config_available = True
|
|
45
92
|
except Exception as e:
|
|
46
93
|
self.config = None
|
|
94
|
+
self.config_available = False
|
|
47
95
|
console.print(f"⚠️ Could not load configuration: {e}")
|
|
48
96
|
|
|
49
97
|
try:
|
|
50
|
-
self.queue_manager = QueueManager()
|
|
98
|
+
self.queue_manager = QueueManager()
|
|
99
|
+
# Check if this is a mock queue manager
|
|
100
|
+
if hasattr(self.queue_manager, '__class__') and 'Mock' in self.queue_manager.__class__.__name__:
|
|
101
|
+
self.queue_available = False
|
|
102
|
+
self.warnings.append("Queue system using fallback mode")
|
|
103
|
+
else:
|
|
104
|
+
self.queue_available = True
|
|
51
105
|
except Exception as e:
|
|
52
106
|
self.queue_manager = None
|
|
107
|
+
self.queue_available = False
|
|
53
108
|
console.print(f"⚠️ Could not initialize queue manager: {e}")
|
|
54
109
|
|
|
55
|
-
self.issues = []
|
|
56
|
-
self.warnings = []
|
|
57
|
-
self.successes = []
|
|
58
|
-
|
|
59
110
|
async def run_full_diagnosis(self) -> Dict[str, Any]:
|
|
60
111
|
"""Run complete system diagnosis and return detailed report."""
|
|
61
112
|
console.print("\n🔍 [bold blue]MCP Ticketer System Diagnosis[/bold blue]")
|
|
@@ -112,6 +163,33 @@ class SystemDiagnostics:
|
|
|
112
163
|
console.print(f"❌ {issue}")
|
|
113
164
|
return config_status
|
|
114
165
|
|
|
166
|
+
if not self.config_available:
|
|
167
|
+
warning = "Configuration system in fallback mode - limited functionality"
|
|
168
|
+
config_status["issues"].append(warning)
|
|
169
|
+
config_status["status"] = "degraded"
|
|
170
|
+
self.warnings.append(warning)
|
|
171
|
+
console.print(f"⚠️ {warning}")
|
|
172
|
+
|
|
173
|
+
# Try to detect adapters from environment variables
|
|
174
|
+
import os
|
|
175
|
+
env_adapters = []
|
|
176
|
+
if os.getenv("LINEAR_API_KEY"):
|
|
177
|
+
env_adapters.append("linear")
|
|
178
|
+
if os.getenv("GITHUB_TOKEN"):
|
|
179
|
+
env_adapters.append("github")
|
|
180
|
+
if os.getenv("JIRA_SERVER"):
|
|
181
|
+
env_adapters.append("jira")
|
|
182
|
+
|
|
183
|
+
config_status["adapters_configured"] = len(env_adapters)
|
|
184
|
+
config_status["default_adapter"] = "aitrackdown"
|
|
185
|
+
|
|
186
|
+
if env_adapters:
|
|
187
|
+
console.print(f"ℹ️ Detected {len(env_adapters)} adapter(s) from environment: {', '.join(env_adapters)}")
|
|
188
|
+
else:
|
|
189
|
+
console.print("ℹ️ No adapter environment variables detected, using aitrackdown")
|
|
190
|
+
|
|
191
|
+
return config_status
|
|
192
|
+
|
|
115
193
|
try:
|
|
116
194
|
# Check adapter configurations
|
|
117
195
|
adapters = self.config.get_enabled_adapters()
|
|
@@ -238,6 +316,15 @@ class SystemDiagnostics:
|
|
|
238
316
|
}
|
|
239
317
|
|
|
240
318
|
try:
|
|
319
|
+
if not self.queue_available:
|
|
320
|
+
warning = "Queue system in fallback mode - limited functionality"
|
|
321
|
+
self.warnings.append(warning)
|
|
322
|
+
console.print(f"⚠️ {warning}")
|
|
323
|
+
queue_status["worker_running"] = False
|
|
324
|
+
queue_status["worker_pid"] = None
|
|
325
|
+
queue_status["health_score"] = 50 # Degraded but not critical
|
|
326
|
+
return queue_status
|
|
327
|
+
|
|
241
328
|
# Check worker status
|
|
242
329
|
worker_status = self.queue_manager.get_worker_status()
|
|
243
330
|
queue_status["worker_running"] = worker_status.get("running", False)
|
mcp_ticketer/core/config.py
CHANGED
|
@@ -283,6 +283,10 @@ class ConfigurationManager:
|
|
|
283
283
|
# Load from first available config file
|
|
284
284
|
config_data = self._load_config_file(self._config_file_paths[0])
|
|
285
285
|
logger.info(f"Loaded configuration from: {self._config_file_paths[0]}")
|
|
286
|
+
else:
|
|
287
|
+
# No config file found - try environment discovery
|
|
288
|
+
logger.info("No configuration file found, attempting environment discovery")
|
|
289
|
+
config_data = self._discover_from_environment()
|
|
286
290
|
|
|
287
291
|
# Parse adapter configurations
|
|
288
292
|
if "adapters" in config_data:
|
|
@@ -328,6 +332,95 @@ class ConfigurationManager:
|
|
|
328
332
|
logger.error(f"Error loading config file {config_path}: {e}")
|
|
329
333
|
return {}
|
|
330
334
|
|
|
335
|
+
def _discover_from_environment(self) -> dict[str, Any]:
|
|
336
|
+
"""Discover configuration from environment variables."""
|
|
337
|
+
try:
|
|
338
|
+
from .env_discovery import EnvironmentDiscovery
|
|
339
|
+
|
|
340
|
+
discovery = EnvironmentDiscovery()
|
|
341
|
+
discovered = discovery.discover_all()
|
|
342
|
+
|
|
343
|
+
if not discovered.adapters:
|
|
344
|
+
logger.info("No adapters discovered from environment variables")
|
|
345
|
+
# Return minimal config with aitrackdown as fallback
|
|
346
|
+
return {
|
|
347
|
+
"adapters": {
|
|
348
|
+
"aitrackdown": {
|
|
349
|
+
"type": "aitrackdown",
|
|
350
|
+
"enabled": True,
|
|
351
|
+
"base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"default_adapter": "aitrackdown"
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
# Convert discovered adapters to config format
|
|
358
|
+
config_data = {
|
|
359
|
+
"adapters": {},
|
|
360
|
+
"default_adapter": None
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
for adapter in discovered.adapters:
|
|
364
|
+
adapter_config = {
|
|
365
|
+
"type": adapter.type.value,
|
|
366
|
+
"enabled": True
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
# Add adapter-specific configuration
|
|
370
|
+
if adapter.type.value == "linear":
|
|
371
|
+
adapter_config.update({
|
|
372
|
+
"api_key": adapter.credentials.get("api_key"),
|
|
373
|
+
"team_id": adapter.credentials.get("team_id"),
|
|
374
|
+
"project_id": adapter.credentials.get("project_id")
|
|
375
|
+
})
|
|
376
|
+
elif adapter.type.value == "github":
|
|
377
|
+
adapter_config.update({
|
|
378
|
+
"token": adapter.credentials.get("token"),
|
|
379
|
+
"repo": adapter.credentials.get("repo"),
|
|
380
|
+
"owner": adapter.credentials.get("owner")
|
|
381
|
+
})
|
|
382
|
+
elif adapter.type.value == "jira":
|
|
383
|
+
adapter_config.update({
|
|
384
|
+
"server": adapter.credentials.get("server"),
|
|
385
|
+
"email": adapter.credentials.get("email"),
|
|
386
|
+
"api_token": adapter.credentials.get("api_token"),
|
|
387
|
+
"project_key": adapter.credentials.get("project_key")
|
|
388
|
+
})
|
|
389
|
+
|
|
390
|
+
config_data["adapters"][adapter.name] = adapter_config
|
|
391
|
+
|
|
392
|
+
# Set first discovered adapter as default
|
|
393
|
+
if config_data["default_adapter"] is None:
|
|
394
|
+
config_data["default_adapter"] = adapter.name
|
|
395
|
+
|
|
396
|
+
logger.info(f"Discovered {len(config_data['adapters'])} adapter(s) from environment")
|
|
397
|
+
return config_data
|
|
398
|
+
|
|
399
|
+
except ImportError:
|
|
400
|
+
logger.warning("Environment discovery not available, using aitrackdown fallback")
|
|
401
|
+
return {
|
|
402
|
+
"adapters": {
|
|
403
|
+
"aitrackdown": {
|
|
404
|
+
"type": "aitrackdown",
|
|
405
|
+
"enabled": True,
|
|
406
|
+
"base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
|
|
407
|
+
}
|
|
408
|
+
},
|
|
409
|
+
"default_adapter": "aitrackdown"
|
|
410
|
+
}
|
|
411
|
+
except Exception as e:
|
|
412
|
+
logger.error(f"Environment discovery failed: {e}")
|
|
413
|
+
return {
|
|
414
|
+
"adapters": {
|
|
415
|
+
"aitrackdown": {
|
|
416
|
+
"type": "aitrackdown",
|
|
417
|
+
"enabled": True,
|
|
418
|
+
"base_path": str(Path.home() / ".mcp-ticketer" / ".aitrackdown")
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
"default_adapter": "aitrackdown"
|
|
422
|
+
}
|
|
423
|
+
|
|
331
424
|
def get_config(self) -> AppConfig:
|
|
332
425
|
"""Get the current configuration."""
|
|
333
426
|
if self._config is None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcp-ticketer
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.31
|
|
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>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
mcp_ticketer/__init__.py,sha256=Xx4WaprO5PXhVPbYi1L6tBmwmJMkYS-lMyG4ieN6QP0,717
|
|
2
|
-
mcp_ticketer/__version__.py,sha256=
|
|
2
|
+
mcp_ticketer/__version__.py,sha256=FF4HV-lsroMPtYJb5y6GRAhnAUrJmzbKonXKGSwOiL4,1118
|
|
3
3
|
mcp_ticketer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
4
|
mcp_ticketer/adapters/__init__.py,sha256=B5DFllWn23hkhmrLykNO5uMMSdcFuuPHXyLw_jyFzuE,358
|
|
5
5
|
mcp_ticketer/adapters/aitrackdown.py,sha256=stlbge8K6w-EyQkw_vEQNSXQgCOWN5tOlQUgGWZQNMQ,17936
|
|
@@ -13,7 +13,7 @@ mcp_ticketer/cli/__init__.py,sha256=l9Q8iKmfGkTu0cssHBVqNZTsL4eAtFzOB25AED_0G6g,
|
|
|
13
13
|
mcp_ticketer/cli/auggie_configure.py,sha256=MXKzLtqe3K_UTQ2GacHAWbvf_B0779KL325smiAKE0Q,8212
|
|
14
14
|
mcp_ticketer/cli/codex_configure.py,sha256=xDppHouT6_-cYXswyAggoPX5bSlRXMvCoM_x9PQ-42A,9086
|
|
15
15
|
mcp_ticketer/cli/configure.py,sha256=BsA_pSHQMQS0t1bJO_wMM8LWsd5sWJDASjEPRHvwC18,16198
|
|
16
|
-
mcp_ticketer/cli/diagnostics.py,sha256=
|
|
16
|
+
mcp_ticketer/cli/diagnostics.py,sha256=edTmM0OEDNiMYTvQ56HK304EUNUBtYejMaKmpJTpomY,22821
|
|
17
17
|
mcp_ticketer/cli/discover.py,sha256=AF_qlQc1Oo0UkWayoF5pmRChS5J3fJjH6f2YZzd_k8w,13188
|
|
18
18
|
mcp_ticketer/cli/gemini_configure.py,sha256=ZNSA1lBW-itVToza-JxW95Po7daVXKiZAh7lp6pmXMU,9343
|
|
19
19
|
mcp_ticketer/cli/main.py,sha256=TxhCdmEi97rrDkCd0nT4KYRtZSboTfPSrw7SL607goA,54970
|
|
@@ -24,7 +24,7 @@ mcp_ticketer/cli/simple_health.py,sha256=FIMHbrSNHpNJHXx7wtH8HzQXmPlcF9HQE9ngxTb
|
|
|
24
24
|
mcp_ticketer/cli/utils.py,sha256=2ptUrp2ELZsox0kSxAI5DFrHonOU999qh4MxbLv6VBQ,21155
|
|
25
25
|
mcp_ticketer/core/__init__.py,sha256=eXovsaJymQRP2AwOBuOy6mFtI3I68D7gGenZ5V-IMqo,349
|
|
26
26
|
mcp_ticketer/core/adapter.py,sha256=q64LxOInIno7EIbmuxItf8KEsd-g9grCs__Z4uwZHto,10273
|
|
27
|
-
mcp_ticketer/core/config.py,sha256=
|
|
27
|
+
mcp_ticketer/core/config.py,sha256=A3K2JXn65qwpI80_J05oA-6DRjcONi6ZqemU02O4L8U,19120
|
|
28
28
|
mcp_ticketer/core/env_discovery.py,sha256=wKp2Pi5vQMGOTrM1690IBv_eoABly-pD8ah7n1zSWDc,17710
|
|
29
29
|
mcp_ticketer/core/http_client.py,sha256=s5ikMiwEJ8TJjNn73wu3gv3OdAtyBEpAqPnSroRMW2k,13971
|
|
30
30
|
mcp_ticketer/core/mappers.py,sha256=1aG1jFsHTCwmGRVgOlXW-VOSTGzc86gv7qjDfiR1ups,17462
|
|
@@ -41,9 +41,9 @@ mcp_ticketer/queue/queue.py,sha256=jSAkYNEIbNH1cbYuF8s6eFuZmXqn8WHXx3mbfMU2Ud8,1
|
|
|
41
41
|
mcp_ticketer/queue/run_worker.py,sha256=_IBezjvhbJJ7gn0evTBIMbSPjvfFZwxEdT-1DLo_bRk,799
|
|
42
42
|
mcp_ticketer/queue/ticket_registry.py,sha256=k8FYg2cFYsI4POb94-o-fTrIVr-ttfi60r0O5YhJYck,15321
|
|
43
43
|
mcp_ticketer/queue/worker.py,sha256=TLXXXTAQT1k9Oiw2WjSd8bzT3rr8TQ8NLt9JBovGQEA,18679
|
|
44
|
-
mcp_ticketer-0.1.
|
|
45
|
-
mcp_ticketer-0.1.
|
|
46
|
-
mcp_ticketer-0.1.
|
|
47
|
-
mcp_ticketer-0.1.
|
|
48
|
-
mcp_ticketer-0.1.
|
|
49
|
-
mcp_ticketer-0.1.
|
|
44
|
+
mcp_ticketer-0.1.31.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
|
|
45
|
+
mcp_ticketer-0.1.31.dist-info/METADATA,sha256=JR2x-cFldb4sWX5lKGGD3sLTWFriAV2LXjboPR9tKUY,13191
|
|
46
|
+
mcp_ticketer-0.1.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
47
|
+
mcp_ticketer-0.1.31.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
|
|
48
|
+
mcp_ticketer-0.1.31.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
|
|
49
|
+
mcp_ticketer-0.1.31.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|