mcp-ticketer 0.3.7__py3-none-any.whl → 0.4.1__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.3.7"
3
+ __version__ = "0.4.1"
4
4
  __version_info__ = tuple(int(part) for part in __version__.split("."))
5
5
 
6
6
  # Package metadata
mcp_ticketer/cli/main.py CHANGED
@@ -24,9 +24,10 @@ from ..queue.ticket_registry import TicketRegistry
24
24
  from .configure import configure_wizard, set_adapter_config, show_current_config
25
25
  from .diagnostics import run_diagnostics
26
26
  from .discover import app as discover_app
27
- from .linear_commands import app as linear_app
28
27
  from .migrate_config import migrate_config_command
28
+ from .platform_commands import app as platform_app
29
29
  from .queue_commands import app as queue_app
30
+ from .ticket_commands import app as ticket_app
30
31
 
31
32
  # Load environment variables from .env files
32
33
  # Priority: .env.local (highest) > .env (base)
@@ -890,7 +891,8 @@ def _show_next_steps(
890
891
  console.print("[dim]Run 'mcp-ticketer --help' for more commands[/dim]")
891
892
 
892
893
 
893
- @app.command()
894
+ # Keep the old install command as deprecated alias to init
895
+ @app.command(deprecated=True, hidden=True)
894
896
  def install(
895
897
  adapter: Optional[str] = typer.Option(
896
898
  None,
@@ -940,26 +942,14 @@ def install(
940
942
  None, "--github-token", help="GitHub Personal Access Token"
941
943
  ),
942
944
  ) -> None:
943
- """Initialize mcp-ticketer for the current project (alias for init).
944
-
945
- This command is synonymous with 'init' and 'setup' - all three provide
946
- identical functionality with interactive prompts to guide you through
947
- configuring MCP Ticketer for your preferred ticket management system.
948
-
949
- Examples:
950
- # Interactive setup (same as 'init' and 'setup')
951
- mcp-ticketer install
952
-
953
- # Force specific adapter
954
- mcp-ticketer install --adapter linear
955
-
956
- # Initialize for different project
957
- mcp-ticketer install --path /path/to/project
945
+ """DEPRECATED: Use 'mcp-ticketer init' instead.
958
946
 
959
- # Save globally (not recommended)
960
- mcp-ticketer install --global
947
+ This command is deprecated. Use 'mcp-ticketer init' for project initialization.
961
948
 
962
949
  """
950
+ console.print(
951
+ "[yellow]⚠️ 'install' is deprecated. Use 'mcp-ticketer init' instead.[/yellow]\n"
952
+ )
963
953
  # Call init with all parameters
964
954
  init(
965
955
  adapter=adapter,
@@ -1142,9 +1132,16 @@ def migrate_config(
1142
1132
  migrate_config_command(dry_run=dry_run)
1143
1133
 
1144
1134
 
1145
- @app.command("status")
1146
- def status_command():
1147
- """Show queue and worker status."""
1135
+ @app.command("queue-status", deprecated=True, hidden=True)
1136
+ def old_queue_status_command():
1137
+ """Show queue and worker status.
1138
+
1139
+ DEPRECATED: Use 'mcp-ticketer queue status' instead.
1140
+ """
1141
+ console.print(
1142
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer queue status' instead.[/yellow]\n"
1143
+ )
1144
+
1148
1145
  queue = Queue()
1149
1146
  manager = WorkerManager()
1150
1147
 
@@ -1169,12 +1166,12 @@ def status_command():
1169
1166
  console.print("\n[red]○ Worker is not running[/red]")
1170
1167
  if pending > 0:
1171
1168
  console.print(
1172
- "[yellow]Note: There are pending items. Start worker with 'mcp-ticketer worker start'[/yellow]"
1169
+ "[yellow]Note: There are pending items. Start worker with 'mcp-ticketer queue worker start'[/yellow]"
1173
1170
  )
1174
1171
 
1175
1172
 
1176
- @app.command()
1177
- def health(
1173
+ @app.command("queue-health", deprecated=True, hidden=True)
1174
+ def old_queue_health_command(
1178
1175
  auto_repair: bool = typer.Option(
1179
1176
  False, "--auto-repair", help="Attempt automatic repair of issues"
1180
1177
  ),
@@ -1182,7 +1179,13 @@ def health(
1182
1179
  False, "--verbose", "-v", help="Show detailed health information"
1183
1180
  ),
1184
1181
  ) -> None:
1185
- """Check queue system health and detect issues immediately."""
1182
+ """Check queue system health and detect issues immediately.
1183
+
1184
+ DEPRECATED: Use 'mcp-ticketer queue health' instead.
1185
+ """
1186
+ console.print(
1187
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer queue health' instead.[/yellow]\n"
1188
+ )
1186
1189
  health_monitor = QueueHealthMonitor()
1187
1190
  health = health_monitor.check_health()
1188
1191
 
@@ -1251,7 +1254,7 @@ def health(
1251
1254
  raise typer.Exit(2)
1252
1255
 
1253
1256
 
1254
- @app.command()
1257
+ @app.command(deprecated=True, hidden=True)
1255
1258
  def create(
1256
1259
  title: str = typer.Argument(..., help="Ticket title"),
1257
1260
  description: Optional[str] = typer.Option(
@@ -1280,7 +1283,14 @@ def create(
1280
1283
  None, "--adapter", help="Override default adapter"
1281
1284
  ),
1282
1285
  ) -> None:
1283
- """Create a new ticket with comprehensive health checks."""
1286
+ """Create a new ticket with comprehensive health checks.
1287
+
1288
+ DEPRECATED: Use 'mcp-ticketer ticket create' instead.
1289
+ """
1290
+ console.print(
1291
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket create' instead.[/yellow]\n"
1292
+ )
1293
+
1284
1294
  # IMMEDIATE HEALTH CHECK - Critical for reliability
1285
1295
  health_monitor = QueueHealthMonitor()
1286
1296
  health = health_monitor.check_health()
@@ -1476,7 +1486,7 @@ def create(
1476
1486
  )
1477
1487
 
1478
1488
 
1479
- @app.command("list")
1489
+ @app.command("list", deprecated=True, hidden=True)
1480
1490
  def list_tickets(
1481
1491
  state: Optional[TicketState] = typer.Option(
1482
1492
  None, "--state", "-s", help="Filter by state"
@@ -1489,7 +1499,13 @@ def list_tickets(
1489
1499
  None, "--adapter", help="Override default adapter"
1490
1500
  ),
1491
1501
  ) -> None:
1492
- """List tickets with optional filters."""
1502
+ """List tickets with optional filters.
1503
+
1504
+ DEPRECATED: Use 'mcp-ticketer ticket list' instead.
1505
+ """
1506
+ console.print(
1507
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket list' instead.[/yellow]\n"
1508
+ )
1493
1509
 
1494
1510
  async def _list():
1495
1511
  adapter_instance = get_adapter(
@@ -1531,7 +1547,7 @@ def list_tickets(
1531
1547
  console.print(table)
1532
1548
 
1533
1549
 
1534
- @app.command()
1550
+ @app.command(deprecated=True, hidden=True)
1535
1551
  def show(
1536
1552
  ticket_id: str = typer.Argument(..., help="Ticket ID"),
1537
1553
  comments: bool = typer.Option(False, "--comments", "-c", help="Show comments"),
@@ -1539,7 +1555,13 @@ def show(
1539
1555
  None, "--adapter", help="Override default adapter"
1540
1556
  ),
1541
1557
  ) -> None:
1542
- """Show detailed ticket information."""
1558
+ """Show detailed ticket information.
1559
+
1560
+ DEPRECATED: Use 'mcp-ticketer ticket show' instead.
1561
+ """
1562
+ console.print(
1563
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket show' instead.[/yellow]\n"
1564
+ )
1543
1565
 
1544
1566
  async def _show():
1545
1567
  adapter_instance = get_adapter(
@@ -1581,7 +1603,7 @@ def show(
1581
1603
  console.print(comment.content)
1582
1604
 
1583
1605
 
1584
- @app.command()
1606
+ @app.command(deprecated=True, hidden=True)
1585
1607
  def comment(
1586
1608
  ticket_id: str = typer.Argument(..., help="Ticket ID"),
1587
1609
  content: str = typer.Argument(..., help="Comment content"),
@@ -1589,7 +1611,13 @@ def comment(
1589
1611
  None, "--adapter", help="Override default adapter"
1590
1612
  ),
1591
1613
  ) -> None:
1592
- """Add a comment to a ticket."""
1614
+ """Add a comment to a ticket.
1615
+
1616
+ DEPRECATED: Use 'mcp-ticketer ticket comment' instead.
1617
+ """
1618
+ console.print(
1619
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket comment' instead.[/yellow]\n"
1620
+ )
1593
1621
 
1594
1622
  async def _comment():
1595
1623
  adapter_instance = get_adapter(
@@ -1617,7 +1645,7 @@ def comment(
1617
1645
  raise typer.Exit(1)
1618
1646
 
1619
1647
 
1620
- @app.command()
1648
+ @app.command(deprecated=True, hidden=True)
1621
1649
  def update(
1622
1650
  ticket_id: str = typer.Argument(..., help="Ticket ID"),
1623
1651
  title: Optional[str] = typer.Option(None, "--title", help="New title"),
@@ -1634,7 +1662,13 @@ def update(
1634
1662
  None, "--adapter", help="Override default adapter"
1635
1663
  ),
1636
1664
  ) -> None:
1637
- """Update ticket fields."""
1665
+ """Update ticket fields.
1666
+
1667
+ DEPRECATED: Use 'mcp-ticketer ticket update' instead.
1668
+ """
1669
+ console.print(
1670
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket update' instead.[/yellow]\n"
1671
+ )
1638
1672
  updates = {}
1639
1673
  if title:
1640
1674
  updates["title"] = title
@@ -1681,7 +1715,7 @@ def update(
1681
1715
  console.print("[dim]Worker started to process request[/dim]")
1682
1716
 
1683
1717
 
1684
- @app.command()
1718
+ @app.command(deprecated=True, hidden=True)
1685
1719
  def transition(
1686
1720
  ticket_id: str = typer.Argument(..., help="Ticket ID"),
1687
1721
  state_positional: Optional[TicketState] = typer.Argument(
@@ -1696,15 +1730,21 @@ def transition(
1696
1730
  ) -> None:
1697
1731
  """Change ticket state with validation.
1698
1732
 
1733
+ DEPRECATED: Use 'mcp-ticketer ticket transition' instead.
1734
+
1699
1735
  Examples:
1700
1736
  # Recommended syntax with flag:
1701
- mcp-ticketer transition BTA-215 --state done
1702
- mcp-ticketer transition BTA-215 -s in_progress
1737
+ mcp-ticketer ticket transition BTA-215 --state done
1738
+ mcp-ticketer ticket transition BTA-215 -s in_progress
1703
1739
 
1704
1740
  # Legacy positional syntax (still supported):
1705
- mcp-ticketer transition BTA-215 done
1741
+ mcp-ticketer ticket transition BTA-215 done
1706
1742
 
1707
1743
  """
1744
+ console.print(
1745
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket transition' instead.[/yellow]\n"
1746
+ )
1747
+
1708
1748
  # Determine which state to use (prefer flag over positional)
1709
1749
  target_state = state if state is not None else state_positional
1710
1750
 
@@ -1747,7 +1787,7 @@ def transition(
1747
1787
  console.print("[dim]Worker started to process request[/dim]")
1748
1788
 
1749
1789
 
1750
- @app.command()
1790
+ @app.command(deprecated=True, hidden=True)
1751
1791
  def search(
1752
1792
  query: Optional[str] = typer.Argument(None, help="Search query"),
1753
1793
  state: Optional[TicketState] = typer.Option(None, "--state", "-s"),
@@ -1758,7 +1798,13 @@ def search(
1758
1798
  None, "--adapter", help="Override default adapter"
1759
1799
  ),
1760
1800
  ) -> None:
1761
- """Search tickets with advanced query."""
1801
+ """Search tickets with advanced query.
1802
+
1803
+ DEPRECATED: Use 'mcp-ticketer ticket search' instead.
1804
+ """
1805
+ console.print(
1806
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket search' instead.[/yellow]\n"
1807
+ )
1762
1808
 
1763
1809
  async def _search():
1764
1810
  adapter_instance = get_adapter(
@@ -1790,6 +1836,12 @@ def search(
1790
1836
  console.print()
1791
1837
 
1792
1838
 
1839
+ # Add ticket command group to main app
1840
+ app.add_typer(ticket_app, name="ticket")
1841
+
1842
+ # Add platform command group to main app
1843
+ app.add_typer(platform_app, name="platform")
1844
+
1793
1845
  # Add queue command to main app
1794
1846
  app.add_typer(queue_app, name="queue")
1795
1847
 
@@ -1798,8 +1850,8 @@ app.add_typer(discover_app, name="discover")
1798
1850
 
1799
1851
 
1800
1852
  # Add diagnostics command
1801
- @app.command()
1802
- def diagnose(
1853
+ @app.command("diagnose")
1854
+ def diagnose_command(
1803
1855
  output_file: Optional[str] = typer.Option(
1804
1856
  None, "--output", "-o", help="Save full report to file"
1805
1857
  ),
@@ -1810,7 +1862,7 @@ def diagnose(
1810
1862
  False, "--simple", help="Use simple diagnostics (no heavy dependencies)"
1811
1863
  ),
1812
1864
  ) -> None:
1813
- """Run comprehensive system diagnostics and health check."""
1865
+ """Run comprehensive system diagnostics and health check (alias: doctor)."""
1814
1866
  if simple:
1815
1867
  from .simple_health import simple_diagnose
1816
1868
 
@@ -1845,9 +1897,36 @@ def diagnose(
1845
1897
  raise typer.Exit(1)
1846
1898
 
1847
1899
 
1848
- @app.command()
1849
- def health() -> None:
1850
- """Quick health check - shows system status summary."""
1900
+ @app.command("doctor")
1901
+ def doctor_alias(
1902
+ output_file: Optional[str] = typer.Option(
1903
+ None, "--output", "-o", help="Save full report to file"
1904
+ ),
1905
+ json_output: bool = typer.Option(
1906
+ False, "--json", help="Output report in JSON format"
1907
+ ),
1908
+ simple: bool = typer.Option(
1909
+ False, "--simple", help="Use simple diagnostics (no heavy dependencies)"
1910
+ ),
1911
+ ) -> None:
1912
+ """Run comprehensive system diagnostics and health check (alias for diagnose)."""
1913
+ # Call the diagnose_command function with the same parameters
1914
+ diagnose_command(output_file=output_file, json_output=json_output, simple=simple)
1915
+
1916
+
1917
+ @app.command("status")
1918
+ def status_command() -> None:
1919
+ """Quick health check - shows system status summary (alias: health)."""
1920
+ from .simple_health import simple_health_check
1921
+
1922
+ result = simple_health_check()
1923
+ if result != 0:
1924
+ raise typer.Exit(result)
1925
+
1926
+
1927
+ @app.command("health")
1928
+ def health_alias() -> None:
1929
+ """Quick health check - shows system status summary (alias for status)."""
1851
1930
  from .simple_health import simple_health_check
1852
1931
 
1853
1932
  result = simple_health_check()
@@ -1862,10 +1941,81 @@ mcp_app = typer.Typer(
1862
1941
  add_completion=False,
1863
1942
  )
1864
1943
 
1944
+ # Create install command group (like kuzu-memory)
1945
+ install_app = typer.Typer(
1946
+ name="install",
1947
+ help="Manage AI system integrations",
1948
+ add_completion=False,
1949
+ )
1865
1950
 
1866
- @app.command()
1951
+
1952
+ @install_app.command(name="add")
1953
+ def install_add(
1954
+ platform: str = typer.Argument(
1955
+ ..., help="Platform to install (claude-code, claude-desktop, etc.)"
1956
+ ),
1957
+ project_path: Optional[str] = typer.Option(
1958
+ None, "--project", help="Project directory"
1959
+ ),
1960
+ dry_run: bool = typer.Option(
1961
+ False, "--dry-run", help="Show what would be done without making changes"
1962
+ ),
1963
+ verbose: bool = typer.Option(False, "--verbose", help="Enable verbose output"),
1964
+ ) -> None:
1965
+ """Install mcp-ticketer integration for an AI platform.
1966
+
1967
+ Each platform gets the right configuration automatically:
1968
+ - claude-code: Project-level MCP server
1969
+ - claude-desktop: Global MCP server
1970
+
1971
+ Examples:
1972
+ # Install for Claude Code (project-level)
1973
+ mcp-ticketer install add claude-code
1974
+
1975
+ # Install for Claude Desktop (global)
1976
+ mcp-ticketer install add claude-desktop
1977
+
1978
+ # Dry run to preview changes
1979
+ mcp-ticketer install add claude-code --dry-run
1980
+
1981
+ """
1982
+ from .mcp_configure import configure_claude_mcp
1983
+
1984
+ # Map platform names to configuration
1985
+ platform_mapping = {
1986
+ "claude-code": {"global": False, "name": "Claude Code"},
1987
+ "claude-desktop": {"global": True, "name": "Claude Desktop"},
1988
+ }
1989
+
1990
+ if platform not in platform_mapping:
1991
+ console.print(f"[red]Unknown platform: {platform}[/red]")
1992
+ console.print("\n[bold]Available platforms:[/bold]")
1993
+ for p in platform_mapping.keys():
1994
+ console.print(f" • {p}")
1995
+ raise typer.Exit(1)
1996
+
1997
+ config = platform_mapping[platform]
1998
+
1999
+ if dry_run:
2000
+ console.print(f"[cyan]DRY RUN - Would install for {config['name']}[/cyan]")
2001
+ return
2002
+
2003
+ try:
2004
+ configure_claude_mcp(global_config=config["global"], force=True)
2005
+ except Exception as e:
2006
+ console.print(f"[red]Installation failed: {e}[/red]")
2007
+ raise typer.Exit(1)
2008
+
2009
+
2010
+ @app.command(deprecated=True, hidden=True)
1867
2011
  def check(queue_id: str = typer.Argument(..., help="Queue ID to check")):
1868
- """Check status of a queued operation."""
2012
+ """Check status of a queued operation.
2013
+
2014
+ DEPRECATED: Use 'mcp-ticketer ticket check' instead.
2015
+ """
2016
+ console.print(
2017
+ "[yellow]⚠️ This command is deprecated. Use 'mcp-ticketer ticket check' instead.[/yellow]\n"
2018
+ )
1869
2019
  queue = Queue()
1870
2020
  item = queue.get_item(queue_id)
1871
2021
 
@@ -1905,8 +2055,8 @@ def check(queue_id: str = typer.Argument(..., help="Queue ID to check")):
1905
2055
  console.print(f"\nRetry Count: {item.retry_count}")
1906
2056
 
1907
2057
 
1908
- @app.command()
1909
- def serve(
2058
+ @mcp_app.command(name="serve")
2059
+ def mcp_serve(
1910
2060
  adapter: Optional[AdapterType] = typer.Option(
1911
2061
  None, "--adapter", "-a", help="Override default adapter type"
1912
2062
  ),
@@ -1917,7 +2067,7 @@ def serve(
1917
2067
  """Start MCP server for JSON-RPC communication over stdio.
1918
2068
 
1919
2069
  This command is used by Claude Code/Desktop when connecting to the MCP server.
1920
- You typically don't need to run this manually - use 'mcp-ticketer mcp' to configure.
2070
+ You typically don't need to run this manually - use 'mcp-ticketer install add' to configure.
1921
2071
 
1922
2072
  Configuration Resolution:
1923
2073
  - When MCP server starts, it uses the current working directory (cwd)
@@ -2141,8 +2291,8 @@ def mcp_auggie(
2141
2291
 
2142
2292
 
2143
2293
  # Add command groups to main app (must be after all subcommands are defined)
2144
- app.add_typer(linear_app, name="linear")
2145
2294
  app.add_typer(mcp_app, name="mcp")
2295
+ app.add_typer(install_app, name="install")
2146
2296
 
2147
2297
 
2148
2298
  def main():
@@ -16,13 +16,21 @@ def find_mcp_ticketer_binary() -> str:
16
16
  """Find the mcp-ticketer binary path.
17
17
 
18
18
  Returns:
19
- Path to mcp-ticketer binary
19
+ Path to mcp-ticketer binary (prefers simple 'mcp-ticketer' if in PATH)
20
20
 
21
21
  Raises:
22
22
  FileNotFoundError: If binary not found
23
23
 
24
24
  """
25
- # Check if running from development environment
25
+ # PRIORITY 1: Check PATH first (like kuzu-memory)
26
+ # This allows the system to resolve the binary location
27
+ which_result = shutil.which("mcp-ticketer")
28
+ if which_result:
29
+ # Return just "mcp-ticketer" for PATH-based installations
30
+ # This is more portable and matches kuzu-memory's approach
31
+ return "mcp-ticketer"
32
+
33
+ # FALLBACK: Check development environment
26
34
  import mcp_ticketer
27
35
 
28
36
  package_path = Path(mcp_ticketer.__file__).parent.parent.parent
@@ -45,11 +53,6 @@ def find_mcp_ticketer_binary() -> str:
45
53
  / "mcp-ticketer",
46
54
  ]
47
55
 
48
- # Check PATH
49
- which_result = shutil.which("mcp-ticketer")
50
- if which_result:
51
- return which_result
52
-
53
56
  # Check possible paths
54
57
  for path in possible_paths:
55
58
  if path.exists():
@@ -183,7 +186,7 @@ def create_mcp_server_config(
183
186
  """
184
187
  config = {
185
188
  "command": binary_path,
186
- "args": ["serve"], # Use 'serve' command to start MCP server
189
+ "args": ["mcp", "serve"], # Use 'mcp serve' command to start MCP server
187
190
  }
188
191
 
189
192
  # Add working directory if provided
@@ -0,0 +1,123 @@
1
+ """Platform-specific command groups."""
2
+
3
+ import typer
4
+
5
+ # Import platform-specific command modules
6
+ from .linear_commands import app as linear_app
7
+
8
+ # Create main platform command group
9
+ app = typer.Typer(
10
+ name="platform",
11
+ help="Platform-specific commands (Linear, JIRA, GitHub, AITrackdown)",
12
+ )
13
+
14
+ # Register Linear commands
15
+ app.add_typer(linear_app, name="linear")
16
+
17
+ # Create placeholder apps for other platforms
18
+
19
+ # JIRA platform commands (placeholder)
20
+ jira_app = typer.Typer(
21
+ name="jira",
22
+ help="JIRA-specific workspace and project management",
23
+ )
24
+
25
+
26
+ @jira_app.command("projects")
27
+ def jira_list_projects():
28
+ """List JIRA projects (placeholder - not yet implemented)."""
29
+ from rich.console import Console
30
+
31
+ console = Console()
32
+ console.print("[yellow]JIRA platform commands are not yet implemented.[/yellow]")
33
+ console.print(
34
+ "Use the generic ticket commands for JIRA operations:\n"
35
+ " mcp-ticketer ticket create 'My ticket'\n"
36
+ " mcp-ticketer ticket list"
37
+ )
38
+
39
+
40
+ @jira_app.command("configure")
41
+ def jira_configure():
42
+ """Configure JIRA adapter (placeholder - not yet implemented)."""
43
+ from rich.console import Console
44
+
45
+ console = Console()
46
+ console.print("[yellow]JIRA platform commands are not yet implemented.[/yellow]")
47
+ console.print("Use 'mcp-ticketer init --adapter jira' to configure JIRA adapter.")
48
+
49
+
50
+ # GitHub platform commands (placeholder)
51
+ github_app = typer.Typer(
52
+ name="github",
53
+ help="GitHub-specific repository and issue management",
54
+ )
55
+
56
+
57
+ @github_app.command("repos")
58
+ def github_list_repos():
59
+ """List GitHub repositories (placeholder - not yet implemented)."""
60
+ from rich.console import Console
61
+
62
+ console = Console()
63
+ console.print("[yellow]GitHub platform commands are not yet implemented.[/yellow]")
64
+ console.print(
65
+ "Use the generic ticket commands for GitHub operations:\n"
66
+ " mcp-ticketer ticket create 'My issue'\n"
67
+ " mcp-ticketer ticket list"
68
+ )
69
+
70
+
71
+ @github_app.command("configure")
72
+ def github_configure():
73
+ """Configure GitHub adapter (placeholder - not yet implemented)."""
74
+ from rich.console import Console
75
+
76
+ console = Console()
77
+ console.print("[yellow]GitHub platform commands are not yet implemented.[/yellow]")
78
+ console.print(
79
+ "Use 'mcp-ticketer init --adapter github' to configure GitHub adapter."
80
+ )
81
+
82
+
83
+ # AITrackdown platform commands (placeholder)
84
+ aitrackdown_app = typer.Typer(
85
+ name="aitrackdown",
86
+ help="AITrackdown-specific local file management",
87
+ )
88
+
89
+
90
+ @aitrackdown_app.command("info")
91
+ def aitrackdown_info():
92
+ """Show AITrackdown storage information (placeholder - not yet implemented)."""
93
+ from rich.console import Console
94
+
95
+ console = Console()
96
+ console.print(
97
+ "[yellow]AITrackdown platform commands are not yet implemented.[/yellow]"
98
+ )
99
+ console.print(
100
+ "Use the generic ticket commands for AITrackdown operations:\n"
101
+ " mcp-ticketer ticket create 'My ticket'\n"
102
+ " mcp-ticketer ticket list"
103
+ )
104
+
105
+
106
+ @aitrackdown_app.command("configure")
107
+ def aitrackdown_configure():
108
+ """Configure AITrackdown adapter (placeholder - not yet implemented)."""
109
+ from rich.console import Console
110
+
111
+ console = Console()
112
+ console.print(
113
+ "[yellow]AITrackdown platform commands are not yet implemented.[/yellow]"
114
+ )
115
+ console.print(
116
+ "Use 'mcp-ticketer init --adapter aitrackdown' to configure AITrackdown adapter."
117
+ )
118
+
119
+
120
+ # Register all platform command groups
121
+ app.add_typer(jira_app, name="jira")
122
+ app.add_typer(github_app, name="github")
123
+ app.add_typer(aitrackdown_app, name="aitrackdown")