{"slug": "cli-statusline", "title": "CLI Statusline", "summary": "A developer built a custom Bash statusline for the Antigravity CLI IDE that displays agent state, context window usage, Git VCS branch and status, tool and artifact counts, active background tasks, and current model. The statusline parses JSON input from stdin using a single jq pass for performance, then falls back to direct git commands for VCS information. It includes ANSI color formatting, human-readable token counts, and a shortened path display.", "body_md": "Custom Antigravity Statusline This is a custom Bash statusline for the Antigravity CLI IDE. It displays the agent state, context window usage, Git VCS branch and status, tool and artifact counts, active background tasks, and current model. \n\n``` bash\n#!/bin/bash\nset -euo pipefail\nINPUT_JSON=$(cat)\n\n# ─── ANSI Helpers (Standard 16-color palette only) ───────────────────────────\nR=\"\\033[0m\"         # Reset\nB=\"\\033[1m\"         # Bold\nD=\"\\033[2m\"         # Dim\nI=\"\\033[3m\"         # Italic\n\n# Foreground accents (Standard 16 colors)\nFG_BLACK=\"\\033[30m\"\nFG_RED=\"\\033[31m\"\nFG_GREEN=\"\\033[32m\"\nFG_YELLOW=\"\\033[33m\"\nFG_BLUE=\"\\033[34m\"\nFG_MAGENTA=\"\\033[35m\"\nFG_CYAN=\"\\033[36m\"\nFG_WHITE=\"\\033[37m\"\n\nFG_GRAY=\"\\033[90m\"\nFG_BRIGHT_RED=\"\\033[91m\"\nFG_BRIGHT_GREEN=\"\\033[92m\"\nFG_BRIGHT_YELLOW=\"\\033[93m\"\nFG_BRIGHT_BLUE=\"\\033[94m\"\nFG_BRIGHT_MAGENTA=\"\\033[95m\"\nFG_BRIGHT_CYAN=\"\\033[96m\"\nFG_BRIGHT_WHITE=\"\\033[97m\"\n\n# Number Highlight Color\nNUM_COLOR=\"${FG_BRIGHT_WHITE}${B}\"\n\n# ─── Parse JSON from stdin (Single jq pass for performance) ──────────────────\n{\n  read -r STATE\n  read -r USED_PCT\n  read -r VCS_BRANCH\n  read -r VCS_DIRTY\n  read -r VCS_TYPE\n  read -r VCS_CLIENT\n  read -r SANDBOX\n  read -r SANDBOX_NET\n  read -r ARTIFACTS\n  read -r SUBAGENTS\n  read -r BG_TASKS\n  read -r MODEL_ID\n  read -r MODEL_NAME\n  read -r COLS\n  read -r CWD\n  read -r CONV_ID\n  read -r PRODUCT\n  read -r INPUT_TOKENS\n  read -r OUTPUT_TOKENS\n  read -r CTX_LIMIT\n  read -r CTX_USED\n  read -r REM_PCT\n} <<< \"$(\n  echo \"$INPUT_JSON\" | jq -r '\n    (.agent_state // \"idle\"),\n    (.context_window.used_percentage // 0),\n    (.vcs.branch // \"\"),\n    (.vcs.dirty // false),\n    (.vcs.type // \"\"),\n    (.vcs.client // \"\"),\n    (.sandbox.enabled // false),\n    (.sandbox.allow_network // false),\n    (.artifact_count // 0),\n    (if .subagents | type == \"array\" then (.subagents | length) else 0 end),\n    (.task_count // 0),\n    (.model.id // \"\"),\n    (.model.display_name // \"\"),\n    (.terminal_width // 80),\n    (.cwd // \"\"),\n    (.conversation_id // \"\"),\n    (.product // \"\"),\n    (.context_window.total_input_tokens // 0),\n    (.context_window.total_output_tokens // 0),\n    (.context_window.context_window_size // 0),\n    ((.context_window.total_input_tokens // 0) + (.context_window.total_output_tokens // 0)),\n    (.context_window.remaining_percentage // 100)\n  ' 2>/dev/null || printf \"idle\\n0\\n\\nfalse\\n\\n\\nfalse\\nfalse\\n0\\n0\\n0\\n\\n\\n80\\n\\n\\n\\n0\\n0\\n0\\n0\\n100\\n\"\n)\"\n\n# ─── Separators ──────────────────────────────────────────────────────────────\nDOT=\"${FG_GRAY} | ${R}\"\n\n# ─── VCS directly from git (bypasses JSON parsing entirely) ──────────────────\nGIT_DIR=\"${CWD:-.}\"\nVCS_BRANCH=$(git -C \"$GIT_DIR\" rev-parse --abbrev-ref HEAD 2>/dev/null || echo \"\")\nif [ -n \"$VCS_BRANCH\" ]; then\n  VCS_TYPE=\"git\"\n  if git -C \"$GIT_DIR\" status --porcelain 2>/dev/null | grep -q .; then\n    VCS_DIRTY=\"true\"\n  else\n    VCS_DIRTY=\"false\"\n  fi\nelse\n  VCS_TYPE=\"\"\n  VCS_DIRTY=\"false\"\nfi\n\n# ─── Computed & Formatted Values ─────────────────────────────────────────────\nPCT_FMT=$(LC_NUMERIC=C printf \"%.1f\" \"$USED_PCT\")\nPCT_INT=${USED_PCT%.*}; PCT_INT=${PCT_INT:-0}\n\nhuman_format() {\n  local num=$1\n  if [ -z \"$num\" ] || [ \"$num\" -eq 0 ] 2>/dev/null; then\n    echo \"0\"\n    return\n  fi\n  if [ \"$num\" -ge 1000000 ] 2>/dev/null; then\n    echo \"$((num / 1000000)).$(((num % 1000000) / 100000))M\"\n  elif [ \"$num\" -ge 1000 ] 2>/dev/null; then\n    echo \"$((num / 1000)).$(((num % 1000) / 100))K\"\n  else\n    echo \"$num\"\n  fi\n}\n\nINPUT_TOK_FMT=$(human_format \"$INPUT_TOKENS\")\nOUTPUT_TOK_FMT=$(human_format \"$OUTPUT_TOKENS\")\nCTX_LIMIT_FMT=$(human_format \"$CTX_LIMIT\")\nCTX_USED_FMT=$(human_format \"$CTX_USED\")\n\nshorten_path() {\n  local path=$1\n  if [ -z \"$path\" ]; then\n    echo \"\"\n    return\n  fi\n  path=\"${path/#$HOME/\\~}\"\n  if [ \"${#path}\" -gt 25 ]; then\n    echo \"...$(basename \"$path\")\"\n  else\n    echo \"$path\"\n  fi\n}\nCWD_SHORT=$(shorten_path \"$CWD\")\n\n# ─── Strip ANSI escapes to measure visible length ────────────────────────────\nvisible_len() {\n  # Strips ESC sequences and counts remaining bytes\n  printf '%s' \"$(echo -e \"$1\" | sed 's/\\x1b\\[[0-9;]*m//g')\" | wc -m\n}\n\n# ─── State Indicator ─────────────────────────────────────────────────────────\ncase \"$STATE\" in\n  idle)     S=\"${FG_BRIGHT_GREEN}${B}  READY${R}\" ;;\n  thinking) S=\"${FG_BRIGHT_YELLOW}${B} 󰟷 THINKING${R}\" ;;\n  working)  S=\"${FG_BRIGHT_CYAN}${B}  WORKING${R}\" ;;\n  tool_use) S=\"${FG_BRIGHT_MAGENTA}${B}  TOOL${R}\" ;;\n  *)        S=\"${FG_WHITE}${B}  $(echo \"$STATE\" | tr '[:lower:]' '[:upper:]')${R}\" ;;\nesac\n\n# ─── VCS Branch & Type (fixed: color applied correctly in both branches) ─────\nV=\"\"\nif [ -n \"$VCS_BRANCH\" ]; then\n  VCS_LABEL=\"${VCS_TYPE:-git}\"\n  if [ \"$VCS_DIRTY\" = \"true\" ]; then\n    V=\"${DOT}${R}${FG_BRIGHT_RED} ${VCS_BRANCH}${FG_BRIGHT_YELLOW}*${R}\"\n  else\n    V=\"${DOT}${R}${FG_BRIGHT_BLUE} ${VCS_BRANCH}${R}\"\n  fi\nfi\n\n# ─── Model ───────────────────────────────────────────────────────────────────\nMODEL_DISP=\" ${R}${MODEL_NAME:-$MODEL_ID}\"\nM=\"\"\nif [ -n \"$MODEL_DISP\" ]; then\n  M=\"${FG_GRAY}${DOT}${FG_BRIGHT_MAGENTA}${I}${MODEL_DISP}${R}\"\nfi\n\n# ─── Sandbox Badge ───────────────────────────────────────────────────────────\nif [ \"$SANDBOX\" = \"true\" ]; then\n  if [ \"$SANDBOX_NET\" = \"true\" ]; then\n    SB=\"${FG_GREEN}󰒙 ${FG_BRIGHT_GREEN}${B}ON (net)${R}\"\n  else\n    SB=\"${FG_GREEN}󰴴 ${FG_BRIGHT_GREEN}${B}ON (no-net)${R}\"\n  fi\nelse\n  SB=\"${FG_RED}󰦜 ${FG_BRIGHT_RED}${B}OFF${R}\"\nfi\n\n# ─── Context Bar (20 segments) ───────────────────────────────────────────────\nBAR_LEN=20\nFILLED=$((PCT_INT * BAR_LEN / 100))\nREMAINDER=$(( (PCT_INT * BAR_LEN) % 100 ))\n\nif   [ \"$PCT_INT\" -ge 90 ]; then FILL_COLOR=\"$FG_BRIGHT_RED\"\nelif [ \"$PCT_INT\" -ge 60 ]; then FILL_COLOR=\"$FG_BRIGHT_YELLOW\"\nelse                              FILL_COLOR=\"$FG_YELLOW\"\nfi\n\nBAR=\"\"\nfor ((i = 0; i < BAR_LEN; i++)); do\n  if   [ \"$i\" -lt \"$FILLED\" ]; then\n    BAR=\"${BAR}${FILL_COLOR}█${R}\"\n  elif [ \"$i\" -eq \"$FILLED\" ]; then\n    if   [ \"$REMAINDER\" -ge 75 ]; then BAR=\"${BAR}${FILL_COLOR}▓${R}${FG_GRAY}\"\n    elif [ \"$REMAINDER\" -ge 50 ]; then BAR=\"${BAR}${FILL_COLOR}▒${R}${FG_GRAY}\"\n    else                               BAR=\"${BAR}${FILL_COLOR}░${R}${FG_GRAY}\"\n    fi\n  else BAR=\"${BAR}${FG_GRAY}░${R}\"\n  fi\ndone\n\n# ─── Stats & Metadata formatting ─────────────────────────────────────────────\nCTX_BAR=\"${FG_YELLOW}󱍏  ${R}${BAR} ${NUM_COLOR}${PCT_FMT}%${R}\"\nART_FMT=\"${FG_BLUE} ${NUM_COLOR}${ARTIFACTS}${R}\"\nSUB_FMT=\"${FG_CYAN}󱙺 ${NUM_COLOR}${SUBAGENTS}${R}\"\nBG_FMT=\"${FG_MAGENTA} ${NUM_COLOR}${BG_TASKS}${R}\"\n\nDIR_FMT=\"\"\nif [ -n \"$CWD_SHORT\" ]; then\n  DIR_FMT=\"${FG_GRAY}${DOT}${FG_CYAN} ${R}${CWD_SHORT}${R}\"\nfi\n\nCONV_FMT=\"\"\nif [ -n \"$CONV_ID\" ]; then\n  CONV_FMT=\"${FG_GRAY}${DOT}${FG_GRAY}󰍪 ${CONV_ID:0:8}${R}\"\nfi\n\nTOK_DETAILS=\"\"\nif [ \"$CTX_USED\" -gt 0 ] 2>/dev/null; then\n  TOK_DETAILS=\" (${CTX_USED_FMT}/${CTX_LIMIT_FMT})\"\nfi\n\n# ─── Right-align helper ──────────────────────────────────────────────────────\n# Prints LINE1 left-aligned and LINE2 right-aligned on the same terminal row.\nprint_right_aligned() {\n  local left=\"$1\"\n  local right=\"$2\"\n  local total_cols=\"$3\"\n\n  local left_vis right_vis pad\n  left_vis=$(visible_len \"$left\")\n  right_vis=$(visible_len \"$right\")\n\n  # How many spaces needed between left and right\n  pad=$(( total_cols - left_vis - right_vis ))\n  [ \"$pad\" -lt 1 ] && pad=1\n\n  printf \"%b%*s%b\\n\" \"$left\" \"$pad\" \"\" \"$right\"\n}\n\n# ─── Output Assembly ─────────────────────────────────────────────────────────\nif [ \"$COLS\" -ge 180 ]; then\n  LINE1=\"${S}${M}${DIR_FMT}${V}${CONV_FMT}\"\n\n  if [ \"$CTX_USED\" -gt 0 ] 2>/dev/null; then\n    TOK_DETAILS=\" (${CTX_USED_FMT}/${CTX_LIMIT_FMT})${DOT}${FG_YELLOW} ${R} (${INPUT_TOK_FMT} in/${OUTPUT_TOK_FMT} out)\"\n  fi\n\n  LINE2=\"${ART_FMT}${DOT}${SUB_FMT}${DOT}${BG_FMT}${DOT}${SB}${DOT}${CTX_BAR}${TOK_DETAILS}\"\n  print_right_aligned \"$LINE1\" \"$LINE2\" \"$COLS\"\n\nelif [ \"$COLS\" -ge 90 ]; then\n  # Medium Layout: Two-line layout with border\n  LINE1=\"${S}${M}${DIR_FMT}${V}\"\n  LINE2=\" ${CTX_BAR}${TOK_DETAILS}${DOT}${ART_FMT}${DOT}${SUB_FMT}${DOT}${BG_FMT}${DOT}${SB}\"\n\n  echo -e \"${FG_GRAY}╭─${R}${LINE1}\"\n  echo -e \"${FG_GRAY}╰─${R}${LINE2}\"\n\nelse\n  M_SHORT=\"\"\n  if [ -n \"$MODEL_DISP\" ]; then\n    M_SHORT=\"${FG_GRAY} ╱ ${FG_BRIGHT_MAGENTA}${MODEL_DISP}${R}\"\n  fi\n\n  echo -e \"${S}${M_SHORT}\"\n  echo -e \"${CTX_BAR}${DOT}${BG_FMT}\"\nfi\n```\n\n", "url": "https://wpnews.pro/news/cli-statusline", "canonical_source": "https://gist.github.com/deeppanara/ca115bc7d8891e410b4a836214b28d98", "published_at": "2026-06-06 05:46:06+00:00", "updated_at": "2026-06-06 06:13:49.872522+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "ai-infrastructure"], "entities": ["Antigravity CLI IDE", "Git"], "alternates": {"html": "https://wpnews.pro/news/cli-statusline", "markdown": "https://wpnews.pro/news/cli-statusline.md", "text": "https://wpnews.pro/news/cli-statusline.txt", "jsonld": "https://wpnews.pro/news/cli-statusline.jsonld"}}