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.
- mcp_ticketer/__version__.py +1 -1
- mcp_ticketer/cli/main.py +204 -54
- mcp_ticketer/cli/mcp_configure.py +11 -8
- mcp_ticketer/cli/platform_commands.py +123 -0
- mcp_ticketer/cli/ticket_commands.py +775 -0
- {mcp_ticketer-0.3.7.dist-info → mcp_ticketer-0.4.1.dist-info}/METADATA +1 -1
- {mcp_ticketer-0.3.7.dist-info → mcp_ticketer-0.4.1.dist-info}/RECORD +11 -9
- {mcp_ticketer-0.3.7.dist-info → mcp_ticketer-0.4.1.dist-info}/WHEEL +0 -0
- {mcp_ticketer-0.3.7.dist-info → mcp_ticketer-0.4.1.dist-info}/entry_points.txt +0 -0
- {mcp_ticketer-0.3.7.dist-info → mcp_ticketer-0.4.1.dist-info}/licenses/LICENSE +0 -0
- {mcp_ticketer-0.3.7.dist-info → mcp_ticketer-0.4.1.dist-info}/top_level.txt +0 -0
mcp_ticketer/__version__.py
CHANGED
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
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
1850
|
-
|
|
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
|
-
|
|
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
|
-
@
|
|
1909
|
-
def
|
|
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
|
|
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
|
|
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")
|