diff --git a/src/mcpm/cli.py b/src/mcpm/cli.py index df2f9d0..49f2367 100644 --- a/src/mcpm/cli.py +++ b/src/mcpm/cli.py @@ -7,6 +7,7 @@ from rich.console import Console from rich.traceback import Traceback +from rich.traceback import install as install_rich_traceback from mcpm.clients.client_config import ClientConfigManager from mcpm.commands import ( @@ -31,12 +32,17 @@ from mcpm.utils.logging_config import setup_logging from mcpm.utils.rich_click_config import click, get_header_text -console = Console() +console = Console() # stdout for regular CLI output +err_console = Console(stderr=True) # stderr for errors/tracebacks client_config_manager = ClientConfigManager() # Setup Rich logging early - this runs when the module is imported setup_logging() +# Install Rich's global exception handler to use stderr instead of stdout +# This prevents Rich/rich-gradient from routing tracebacks to stdout +install_rich_traceback(console=err_console, show_locals=True) + # Custom context settings to handle main command help specially CONTEXT_SETTINGS: Dict[str, Any] = dict(help_option_names=[]) @@ -53,9 +59,9 @@ def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception: - console.print(Traceback(show_locals=True)) - console.print("[bold red]An unexpected error occurred.[/bold red]") - console.print( + err_console.print(Traceback(show_locals=True)) + err_console.print("[bold red]An unexpected error occurred.[/bold red]") + err_console.print( "Please report this issue on our GitHub repository: " "[link=https://github.com/pathintegral-institute/mcpm.sh/issues]https://github.com/pathintegral-institute/mcpm.sh/issues[/link]" )