0ef5fcb1c5
Security / Dependency audit (pip-audit) (push) Has been cancelled
Security / CodeQL (javascript-typescript) (push) Has been cancelled
Security / CodeQL (python) (push) Has been cancelled
Security / Secret scan (gitleaks) (push) Has been cancelled
rust / test (ubuntu) (push) Has been cancelled
rust / simulator e2e (macos-latest) (push) Has been cancelled
rust / simulator e2e (ubuntu-latest) (push) Has been cancelled
rust / simulator e2e (windows-latest) (push) Has been cancelled
rust / wheels (aarch64-apple-darwin) (push) Has been cancelled
rust / wheels (x86_64-unknown-linux-gnu) (push) Has been cancelled
rust / wheels (x86_64-apple-darwin) (push) Has been cancelled
rust / audit (push) Has been cancelled
rust / parity (nightly, allowed to fail during Phase 0) (push) Has been cancelled
CI / commitlint (push) Has been skipped
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 0s
Dev Containers / validate (.devcontainer/memory-stack/devcontainer.json, memory-stack) (push) Failing after 0s
Dev Containers / validate-worktree (push) Failing after 0s
CI / changes (push) Failing after 4s
Deploy Documentation / validate (push) Has been skipped
Deploy Documentation / deploy (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 1s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 1s
OpenCode Plugin / typecheck + build + test (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 1s
Release Please / release-please (push) Failing after 1s
Wrap E2E / docker-wrap-e2e (push) Failing after 1s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 1s
Init E2E / docker-init-e2e (push) Failing after 4s
Merge Conflicts / merge-conflicts (push) Failing after 4s
CI / lint (push) Has been cancelled
CI / build-wheel (push) Has been cancelled
CI / build-wheel-windows (push) Has been cancelled
CI / prefetch-model (push) Has been cancelled
CI / test-dashboard-ui (push) Has been cancelled
CI / test (1) (push) Has been cancelled
CI / test (2) (push) Has been cancelled
CI / test (3) (push) Has been cancelled
CI / test (4) (push) Has been cancelled
CI / test-extras (push) Has been cancelled
CI / test-agno (push) Has been cancelled
CI / build (push) Has been cancelled
CI / workflow-validation (push) Has been cancelled
CI / docker-native-e2e (push) Has been cancelled
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / promote-latest (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
143 lines
3.3 KiB
Python
143 lines
3.3 KiB
Python
"""Formatting utilities for CLI output using Rich."""
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from rich.console import Console
|
|
from rich.panel import Panel
|
|
from rich.table import Table
|
|
|
|
# Shared console instance for consistent output
|
|
console = Console()
|
|
|
|
|
|
def print_table(
|
|
headers: list[str],
|
|
rows: list[list[str]],
|
|
title: str | None = None,
|
|
) -> None:
|
|
"""Print a Rich table with headers and rows.
|
|
|
|
Args:
|
|
headers: Column headers for the table.
|
|
rows: List of rows, where each row is a list of cell values.
|
|
title: Optional title to display above the table.
|
|
"""
|
|
table = Table(title=title)
|
|
|
|
for header in headers:
|
|
table.add_column(header)
|
|
|
|
for row in rows:
|
|
table.add_row(*row)
|
|
|
|
console.print(table)
|
|
|
|
|
|
def print_stats(stats: dict[str, Any], title: str = "Statistics") -> None:
|
|
"""Print statistics in a nicely formatted panel.
|
|
|
|
Args:
|
|
stats: Dictionary of stat names to values.
|
|
title: Title for the panel.
|
|
"""
|
|
lines = [f"[bold]{key}:[/bold] {value}" for key, value in stats.items()]
|
|
content = "\n".join(lines)
|
|
console.print(Panel(content, title=title))
|
|
|
|
|
|
def print_error(msg: str) -> None:
|
|
"""Print an error message in red.
|
|
|
|
Args:
|
|
msg: The error message to display.
|
|
"""
|
|
console.print(f"[bold red]Error:[/bold red] {msg}")
|
|
|
|
|
|
def print_success(msg: str) -> None:
|
|
"""Print a success message in green.
|
|
|
|
Args:
|
|
msg: The success message to display.
|
|
"""
|
|
console.print(f"[bold green]Success:[/bold green] {msg}")
|
|
|
|
|
|
def print_warning(msg: str) -> None:
|
|
"""Print a warning message in yellow.
|
|
|
|
Args:
|
|
msg: The warning message to display.
|
|
"""
|
|
console.print(f"[bold yellow]Warning:[/bold yellow] {msg}")
|
|
|
|
|
|
def truncate(text: str, max_len: int = 50) -> str:
|
|
"""Truncate text to a maximum length with ellipsis.
|
|
|
|
Args:
|
|
text: The text to truncate.
|
|
max_len: Maximum length including ellipsis.
|
|
|
|
Returns:
|
|
Truncated text with ellipsis if it exceeded max_len.
|
|
"""
|
|
if len(text) <= max_len:
|
|
return text
|
|
return text[: max_len - 3] + "..."
|
|
|
|
|
|
def format_age(dt: datetime) -> str:
|
|
"""Format a datetime as a human-readable age string.
|
|
|
|
Args:
|
|
dt: The datetime to format.
|
|
|
|
Returns:
|
|
A string like "2d", "5h", "30m" representing time elapsed.
|
|
"""
|
|
now = datetime.now(tz=dt.tzinfo)
|
|
delta = now - dt
|
|
|
|
total_seconds = int(delta.total_seconds())
|
|
|
|
if total_seconds < 0:
|
|
return "now"
|
|
|
|
minutes = total_seconds // 60
|
|
hours = total_seconds // 3600
|
|
days = total_seconds // 86400
|
|
|
|
if days > 0:
|
|
return f"{days}d"
|
|
if hours > 0:
|
|
return f"{hours}h"
|
|
if minutes > 0:
|
|
return f"{minutes}m"
|
|
return "now"
|
|
|
|
|
|
def format_bytes(num_bytes: int) -> str:
|
|
"""Format a byte count as a human-readable string.
|
|
|
|
Args:
|
|
num_bytes: Number of bytes to format.
|
|
|
|
Returns:
|
|
A string like "1.2 MB", "500 KB", "256 B".
|
|
"""
|
|
if num_bytes < 0:
|
|
return "0 B"
|
|
|
|
units = [("GB", 1024**3), ("MB", 1024**2), ("KB", 1024), ("B", 1)]
|
|
|
|
for unit, threshold in units:
|
|
if num_bytes >= threshold:
|
|
value = num_bytes / threshold
|
|
if value >= 10:
|
|
return f"{value:.0f} {unit}"
|
|
return f"{value:.1f} {unit}"
|
|
|
|
return "0 B"
|