| """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 |
|
|