| """Shared ANSI color utilities for Hermes CLI modules.""" | |
| import os | |
| import sys | |
| def should_use_color() -> bool: | |
| """Return True when colored output is appropriate. | |
| Respects the NO_COLOR environment variable (https://no-color.org/) | |
| and TERM=dumb, in addition to the existing TTY check. | |
| """ | |
| if os.environ.get("NO_COLOR") is not None: | |
| return False | |
| if os.environ.get("TERM") == "dumb": | |
| return False | |
| if not sys.stdout.isatty(): | |
| return False | |
| return True | |
| class Colors: | |
| RESET = "\033[0m" | |
| BOLD = "\033[1m" | |
| DIM = "\033[2m" | |
| RED = "\033[31m" | |
| GREEN = "\033[32m" | |
| YELLOW = "\033[33m" | |
| BLUE = "\033[34m" | |
| MAGENTA = "\033[35m" | |
| CYAN = "\033[36m" | |
| def color(text: str, *codes) -> str: | |
| """Apply color codes to text (only when color output is appropriate).""" | |
| if not should_use_color(): | |
| return text | |
| return "".join(codes) + text + Colors.RESET | |