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.

@@ -1,6 +1,6 @@
1
1
  """Version information for mcp-ticketer package."""
2
2
 
3
- __version__ = "0.1.29"
3
+ __version__ = "0.1.31"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
@@ -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
- try:
19
- from ..core.config import get_config
20
- except ImportError:
21
- # Fallback for missing dependencies
22
- def get_config():
23
- raise ImportError("Configuration system not available")
24
-
25
- try:
26
- from ..core.registry import AdapterRegistry
27
- except ImportError:
28
- AdapterRegistry = None
29
-
30
- try:
31
- from ..queue.manager import QueueManager
32
- except ImportError:
33
- QueueManager = None
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() if QueueManager else None
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)
@@ -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.29
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=I8xIN53wlOPHpYlXb_v9Bev1TsC83fWE_W-7TXrQpUQ,1118
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=mr11oJRx82PIXO7vNv6Jl93E4mH77daz41Ra7NuesW8,19363
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=aC1MAV0nghmkB6BnAEP3aa4DwLob9q6U04eP5xmQx0Y,15181
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.29.dist-info/licenses/LICENSE,sha256=KOVrunjtILSzY-2N8Lqa3-Q8dMaZIG4LrlLTr9UqL08,1073
45
- mcp_ticketer-0.1.29.dist-info/METADATA,sha256=VRepQQpB6aMoS37BF5gdoNlnZBl2uQzks3qC-RyvxKk,13191
46
- mcp_ticketer-0.1.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
47
- mcp_ticketer-0.1.29.dist-info/entry_points.txt,sha256=o1IxVhnHnBNG7FZzbFq-Whcs1Djbofs0qMjiUYBLx2s,60
48
- mcp_ticketer-0.1.29.dist-info/top_level.txt,sha256=WnAG4SOT1Vm9tIwl70AbGG_nA217YyV3aWFhxLH2rxw,13
49
- mcp_ticketer-0.1.29.dist-info/RECORD,,
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,,