mcp-ticketer 0.12.0__py3-none-any.whl → 2.2.13__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 (129) hide show
  1. mcp_ticketer/__init__.py +10 -10
  2. mcp_ticketer/__version__.py +1 -1
  3. mcp_ticketer/_version_scm.py +1 -0
  4. mcp_ticketer/adapters/aitrackdown.py +507 -6
  5. mcp_ticketer/adapters/asana/adapter.py +229 -0
  6. mcp_ticketer/adapters/asana/mappers.py +14 -0
  7. mcp_ticketer/adapters/github/__init__.py +26 -0
  8. mcp_ticketer/adapters/github/adapter.py +3229 -0
  9. mcp_ticketer/adapters/github/client.py +335 -0
  10. mcp_ticketer/adapters/github/mappers.py +797 -0
  11. mcp_ticketer/adapters/github/queries.py +692 -0
  12. mcp_ticketer/adapters/github/types.py +460 -0
  13. mcp_ticketer/adapters/hybrid.py +47 -5
  14. mcp_ticketer/adapters/jira/__init__.py +35 -0
  15. mcp_ticketer/adapters/jira/adapter.py +1351 -0
  16. mcp_ticketer/adapters/jira/client.py +271 -0
  17. mcp_ticketer/adapters/jira/mappers.py +246 -0
  18. mcp_ticketer/adapters/jira/queries.py +216 -0
  19. mcp_ticketer/adapters/jira/types.py +304 -0
  20. mcp_ticketer/adapters/linear/adapter.py +2730 -139
  21. mcp_ticketer/adapters/linear/client.py +175 -3
  22. mcp_ticketer/adapters/linear/mappers.py +203 -8
  23. mcp_ticketer/adapters/linear/queries.py +280 -3
  24. mcp_ticketer/adapters/linear/types.py +120 -4
  25. mcp_ticketer/analysis/__init__.py +56 -0
  26. mcp_ticketer/analysis/dependency_graph.py +255 -0
  27. mcp_ticketer/analysis/health_assessment.py +304 -0
  28. mcp_ticketer/analysis/orphaned.py +218 -0
  29. mcp_ticketer/analysis/project_status.py +594 -0
  30. mcp_ticketer/analysis/similarity.py +224 -0
  31. mcp_ticketer/analysis/staleness.py +266 -0
  32. mcp_ticketer/automation/__init__.py +11 -0
  33. mcp_ticketer/automation/project_updates.py +378 -0
  34. mcp_ticketer/cli/adapter_diagnostics.py +3 -1
  35. mcp_ticketer/cli/auggie_configure.py +17 -5
  36. mcp_ticketer/cli/codex_configure.py +97 -61
  37. mcp_ticketer/cli/configure.py +1288 -105
  38. mcp_ticketer/cli/cursor_configure.py +314 -0
  39. mcp_ticketer/cli/diagnostics.py +13 -12
  40. mcp_ticketer/cli/discover.py +5 -0
  41. mcp_ticketer/cli/gemini_configure.py +17 -5
  42. mcp_ticketer/cli/init_command.py +880 -0
  43. mcp_ticketer/cli/install_mcp_server.py +418 -0
  44. mcp_ticketer/cli/instruction_commands.py +6 -0
  45. mcp_ticketer/cli/main.py +267 -3175
  46. mcp_ticketer/cli/mcp_configure.py +821 -119
  47. mcp_ticketer/cli/mcp_server_commands.py +415 -0
  48. mcp_ticketer/cli/platform_detection.py +77 -12
  49. mcp_ticketer/cli/platform_installer.py +545 -0
  50. mcp_ticketer/cli/project_update_commands.py +350 -0
  51. mcp_ticketer/cli/setup_command.py +795 -0
  52. mcp_ticketer/cli/simple_health.py +12 -10
  53. mcp_ticketer/cli/ticket_commands.py +705 -103
  54. mcp_ticketer/cli/utils.py +113 -0
  55. mcp_ticketer/core/__init__.py +56 -6
  56. mcp_ticketer/core/adapter.py +533 -2
  57. mcp_ticketer/core/config.py +21 -21
  58. mcp_ticketer/core/exceptions.py +7 -1
  59. mcp_ticketer/core/label_manager.py +732 -0
  60. mcp_ticketer/core/mappers.py +31 -19
  61. mcp_ticketer/core/milestone_manager.py +252 -0
  62. mcp_ticketer/core/models.py +480 -0
  63. mcp_ticketer/core/onepassword_secrets.py +1 -1
  64. mcp_ticketer/core/priority_matcher.py +463 -0
  65. mcp_ticketer/core/project_config.py +132 -14
  66. mcp_ticketer/core/project_utils.py +281 -0
  67. mcp_ticketer/core/project_validator.py +376 -0
  68. mcp_ticketer/core/session_state.py +176 -0
  69. mcp_ticketer/core/state_matcher.py +625 -0
  70. mcp_ticketer/core/url_parser.py +425 -0
  71. mcp_ticketer/core/validators.py +69 -0
  72. mcp_ticketer/mcp/server/__main__.py +2 -1
  73. mcp_ticketer/mcp/server/diagnostic_helper.py +175 -0
  74. mcp_ticketer/mcp/server/main.py +106 -25
  75. mcp_ticketer/mcp/server/routing.py +723 -0
  76. mcp_ticketer/mcp/server/server_sdk.py +58 -0
  77. mcp_ticketer/mcp/server/tools/__init__.py +33 -11
  78. mcp_ticketer/mcp/server/tools/analysis_tools.py +854 -0
  79. mcp_ticketer/mcp/server/tools/attachment_tools.py +5 -5
  80. mcp_ticketer/mcp/server/tools/bulk_tools.py +259 -202
  81. mcp_ticketer/mcp/server/tools/comment_tools.py +74 -12
  82. mcp_ticketer/mcp/server/tools/config_tools.py +1391 -145
  83. mcp_ticketer/mcp/server/tools/diagnostic_tools.py +211 -0
  84. mcp_ticketer/mcp/server/tools/hierarchy_tools.py +870 -460
  85. mcp_ticketer/mcp/server/tools/instruction_tools.py +7 -5
  86. mcp_ticketer/mcp/server/tools/label_tools.py +942 -0
  87. mcp_ticketer/mcp/server/tools/milestone_tools.py +338 -0
  88. mcp_ticketer/mcp/server/tools/pr_tools.py +3 -7
  89. mcp_ticketer/mcp/server/tools/project_status_tools.py +158 -0
  90. mcp_ticketer/mcp/server/tools/project_update_tools.py +473 -0
  91. mcp_ticketer/mcp/server/tools/search_tools.py +209 -97
  92. mcp_ticketer/mcp/server/tools/session_tools.py +308 -0
  93. mcp_ticketer/mcp/server/tools/ticket_tools.py +1107 -124
  94. mcp_ticketer/mcp/server/tools/user_ticket_tools.py +218 -236
  95. mcp_ticketer/queue/queue.py +68 -0
  96. mcp_ticketer/queue/worker.py +1 -1
  97. mcp_ticketer/utils/__init__.py +5 -0
  98. mcp_ticketer/utils/token_utils.py +246 -0
  99. mcp_ticketer-2.2.13.dist-info/METADATA +1396 -0
  100. mcp_ticketer-2.2.13.dist-info/RECORD +158 -0
  101. mcp_ticketer-2.2.13.dist-info/top_level.txt +2 -0
  102. py_mcp_installer/examples/phase3_demo.py +178 -0
  103. py_mcp_installer/scripts/manage_version.py +54 -0
  104. py_mcp_installer/setup.py +6 -0
  105. py_mcp_installer/src/py_mcp_installer/__init__.py +153 -0
  106. py_mcp_installer/src/py_mcp_installer/command_builder.py +445 -0
  107. py_mcp_installer/src/py_mcp_installer/config_manager.py +541 -0
  108. py_mcp_installer/src/py_mcp_installer/exceptions.py +243 -0
  109. py_mcp_installer/src/py_mcp_installer/installation_strategy.py +617 -0
  110. py_mcp_installer/src/py_mcp_installer/installer.py +656 -0
  111. py_mcp_installer/src/py_mcp_installer/mcp_inspector.py +750 -0
  112. py_mcp_installer/src/py_mcp_installer/platform_detector.py +451 -0
  113. py_mcp_installer/src/py_mcp_installer/platforms/__init__.py +26 -0
  114. py_mcp_installer/src/py_mcp_installer/platforms/claude_code.py +225 -0
  115. py_mcp_installer/src/py_mcp_installer/platforms/codex.py +181 -0
  116. py_mcp_installer/src/py_mcp_installer/platforms/cursor.py +191 -0
  117. py_mcp_installer/src/py_mcp_installer/types.py +222 -0
  118. py_mcp_installer/src/py_mcp_installer/utils.py +463 -0
  119. py_mcp_installer/tests/__init__.py +0 -0
  120. py_mcp_installer/tests/platforms/__init__.py +0 -0
  121. py_mcp_installer/tests/test_platform_detector.py +17 -0
  122. mcp_ticketer/adapters/github.py +0 -1574
  123. mcp_ticketer/adapters/jira.py +0 -1258
  124. mcp_ticketer-0.12.0.dist-info/METADATA +0 -550
  125. mcp_ticketer-0.12.0.dist-info/RECORD +0 -91
  126. mcp_ticketer-0.12.0.dist-info/top_level.txt +0 -1
  127. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/WHEEL +0 -0
  128. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/entry_points.txt +0 -0
  129. {mcp_ticketer-0.12.0.dist-info → mcp_ticketer-2.2.13.dist-info}/licenses/LICENSE +0 -0
@@ -6,7 +6,7 @@ import os
6
6
  from enum import Enum
7
7
  from functools import lru_cache
8
8
  from pathlib import Path
9
- from typing import Any, Optional
9
+ from typing import Any, Optional, cast
10
10
 
11
11
  import yaml
12
12
  from pydantic import BaseModel, Field, field_validator, model_validator
@@ -38,9 +38,9 @@ class GitHubConfig(BaseAdapterConfig):
38
38
  """GitHub adapter configuration."""
39
39
 
40
40
  type: AdapterType = AdapterType.GITHUB
41
- token: str | None = Field(None, env="GITHUB_TOKEN")
42
- owner: str | None = Field(None, env="GITHUB_OWNER")
43
- repo: str | None = Field(None, env="GITHUB_REPO")
41
+ token: str | None = Field(default=None)
42
+ owner: str | None = Field(default=None)
43
+ repo: str | None = Field(default=None)
44
44
  api_url: str = "https://api.github.com"
45
45
  use_projects_v2: bool = False
46
46
  custom_priority_scheme: dict[str, list[str]] | None = None
@@ -53,7 +53,7 @@ class GitHubConfig(BaseAdapterConfig):
53
53
  v = os.getenv("GITHUB_TOKEN")
54
54
  if not v:
55
55
  raise ValueError("GitHub token is required")
56
- return v
56
+ return cast(str, v)
57
57
 
58
58
  @field_validator("owner", mode="before")
59
59
  @classmethod
@@ -63,7 +63,7 @@ class GitHubConfig(BaseAdapterConfig):
63
63
  v = os.getenv("GITHUB_OWNER")
64
64
  if not v:
65
65
  raise ValueError("GitHub owner is required")
66
- return v
66
+ return cast(str, v)
67
67
 
68
68
  @field_validator("repo", mode="before")
69
69
  @classmethod
@@ -73,17 +73,17 @@ class GitHubConfig(BaseAdapterConfig):
73
73
  v = os.getenv("GITHUB_REPO")
74
74
  if not v:
75
75
  raise ValueError("GitHub repo is required")
76
- return v
76
+ return cast(str, v)
77
77
 
78
78
 
79
79
  class JiraConfig(BaseAdapterConfig):
80
80
  """JIRA adapter configuration."""
81
81
 
82
82
  type: AdapterType = AdapterType.JIRA
83
- server: str | None = Field(None, env="JIRA_SERVER")
84
- email: str | None = Field(None, env="JIRA_EMAIL")
85
- api_token: str | None = Field(None, env="JIRA_API_TOKEN")
86
- project_key: str | None = Field(None, env="JIRA_PROJECT_KEY")
83
+ server: str | None = Field(default=None)
84
+ email: str | None = Field(default=None)
85
+ api_token: str | None = Field(default=None)
86
+ project_key: str | None = Field(default=None)
87
87
  cloud: bool = True
88
88
  verify_ssl: bool = True
89
89
 
@@ -95,7 +95,7 @@ class JiraConfig(BaseAdapterConfig):
95
95
  v = os.getenv("JIRA_SERVER")
96
96
  if not v:
97
97
  raise ValueError("JIRA server URL is required")
98
- return v.rstrip("/")
98
+ return cast(str, v).rstrip("/")
99
99
 
100
100
  @field_validator("email", mode="before")
101
101
  @classmethod
@@ -105,7 +105,7 @@ class JiraConfig(BaseAdapterConfig):
105
105
  v = os.getenv("JIRA_EMAIL")
106
106
  if not v:
107
107
  raise ValueError("JIRA email is required")
108
- return v
108
+ return cast(str, v)
109
109
 
110
110
  @field_validator("api_token", mode="before")
111
111
  @classmethod
@@ -115,14 +115,14 @@ class JiraConfig(BaseAdapterConfig):
115
115
  v = os.getenv("JIRA_API_TOKEN")
116
116
  if not v:
117
117
  raise ValueError("JIRA API token is required")
118
- return v
118
+ return cast(str, v)
119
119
 
120
120
 
121
121
  class LinearConfig(BaseAdapterConfig):
122
122
  """Linear adapter configuration."""
123
123
 
124
124
  type: AdapterType = AdapterType.LINEAR
125
- api_key: str | None = Field(None, env="LINEAR_API_KEY")
125
+ api_key: str | None = Field(default=None)
126
126
  workspace: str | None = None
127
127
  team_key: str | None = None # Short team key like "BTA"
128
128
  team_id: str | None = None # UUID team identifier
@@ -143,7 +143,7 @@ class LinearConfig(BaseAdapterConfig):
143
143
  v = os.getenv("LINEAR_API_KEY")
144
144
  if not v:
145
145
  raise ValueError("Linear API key is required")
146
- return v
146
+ return cast(str, v)
147
147
 
148
148
 
149
149
  class AITrackdownConfig(BaseAdapterConfig):
@@ -343,16 +343,16 @@ class ConfigurationManager:
343
343
  try:
344
344
  with open(config_path, encoding="utf-8") as file:
345
345
  if config_path.suffix.lower() in [".yaml", ".yml"]:
346
- return yaml.safe_load(file) or {}
346
+ return cast(dict[str, Any], yaml.safe_load(file) or {})
347
347
  elif config_path.suffix.lower() == ".json":
348
- return json.load(file)
348
+ return cast(dict[str, Any], json.load(file))
349
349
  else:
350
350
  # Try YAML first, then JSON
351
351
  content = file.read()
352
352
  try:
353
- return yaml.safe_load(content) or {}
353
+ return cast(dict[str, Any], yaml.safe_load(content) or {})
354
354
  except yaml.YAMLError:
355
- return json.loads(content)
355
+ return cast(dict[str, Any], json.loads(content))
356
356
  except Exception as e:
357
357
  logger.error(f"Error loading config file {config_path}: {e}")
358
358
  return {}
@@ -382,7 +382,7 @@ class ConfigurationManager:
382
382
  }
383
383
 
384
384
  # Convert discovered adapters to config format
385
- config_data = {"adapters": {}, "default_adapter": None}
385
+ config_data: dict[str, Any] = {"adapters": {}, "default_adapter": None}
386
386
 
387
387
  for adapter in discovered.adapters:
388
388
  adapter_config = {"type": adapter.adapter_type, "enabled": True}
@@ -1,4 +1,10 @@
1
- """Exception classes for MCP Ticketer."""
1
+ """Exception classes for MCP Ticketer.
2
+
3
+ Error Severity Classification:
4
+ CRITICAL - System-level issues (auth, config, network) → Always suggest diagnostics
5
+ MEDIUM - Resource issues (not found, permissions) → Suggest diagnostics
6
+ LOW - User input errors (validation, state transitions) → No diagnostics
7
+ """
2
8
 
3
9
  from __future__ import annotations
4
10