{"id":48698477,"url":"https://github.com/cativo23/lumira","last_synced_at":"2026-06-14T08:02:00.401Z","repository":{"id":350165060,"uuid":"1205196566","full_name":"cativo23/lumira","owner":"cativo23","description":"Real-time statusline HUD for Claude Code and Qwen Code. Includes session analytics CLI, API latency overhead widget, 7d quota projection, auto-compact proximity warnings, themes, and powerline. Zero deps.","archived":false,"fork":false,"pushed_at":"2026-06-14T05:05:55.000Z","size":2215,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T05:20:00.176Z","etag":null,"topics":["ai-tools","anthropic","anthropic-claude","claude","claude-code","claude-code-statusline","cli","developer-tools","hud","nerd-font","node","prompt-caching","qwen","qwen-code","statusline","terminal","typescript","zero-dependencies"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/lumira","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cativo23.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-08T18:20:49.000Z","updated_at":"2026-06-14T05:05:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cativo23/lumira","commit_stats":null,"previous_names":["cativo23/claude-cc","cativo23/ccpulse","cativo23/lumira"],"tags_count":43,"template":false,"template_full_name":null,"purl":"pkg:github/cativo23/lumira","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cativo23%2Flumira","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cativo23%2Flumira/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cativo23%2Flumira/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cativo23%2Flumira/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cativo23","download_url":"https://codeload.github.com/cativo23/lumira/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cativo23%2Flumira/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34313515,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-tools","anthropic","anthropic-claude","claude","claude-code","claude-code-statusline","cli","developer-tools","hud","nerd-font","node","prompt-caching","qwen","qwen-code","statusline","terminal","typescript","zero-dependencies"],"created_at":"2026-04-11T09:01:21.667Z","updated_at":"2026-06-14T08:02:00.394Z","avatar_url":"https://github.com/cativo23.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# lumira\n\nReal-time statusline plugin for [Claude Code](https://code.claude.com) and Qwen Code.\n\n![lumira statusline — tokyo-night theme](assets/showcase/hero-5-2.png)\n\n[![asciicast — context bar filling, tools active, GSD widget](https://asciinema.org/a/apvjkloigO9hrdVA.svg)](https://asciinema.org/a/apvjkloigO9hrdVA)\n\n## Quick start\n\n**Via Claude Code plugin (recommended):**\n\n```\n/plugin marketplace add cativo23/lumira\n/lumira:setup\n```\n\nNo npm required. The `/lumira:setup` skill writes `statusLine.command` automatically. Restart Claude Code when done.\n\n**Via npm:**\n\n```bash\nnpx lumira install\n```\n\nInteractive wizard — preset, theme, icons — previewed live before write.\n\n[![npm version](https://img.shields.io/npm/v/lumira?color=cb3837\u0026logo=npm)](https://www.npmjs.com/package/lumira)\n[![npm downloads](https://img.shields.io/npm/dw/lumira?color=cb3837\u0026logo=npm\u0026label=downloads%2Fweek)](https://www.npmjs.com/package/lumira)\n[![License: MIT](https://img.shields.io/npm/l/lumira?color=blue)](LICENSE)\n![Node](https://img.shields.io/node/v/lumira)\n![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue)\n![Dependencies](https://img.shields.io/badge/runtime%20deps-0-brightgreen)\n[![CI](https://github.com/cativo23/lumira/actions/workflows/ci.yml/badge.svg)](https://github.com/cativo23/lumira/actions/workflows/ci.yml)\n![Claude Code](https://img.shields.io/badge/Claude_Code-compatible-2d3748?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCI+PHBhdGggZD0iTTY0IDEyOEMzNS44IDEyOCAxMyAxMDUuMiAxMyA3N0MxMyA0OC44IDM1LjggMjYgNjQgMjZjMjguMiAwIDUxIDIyLjggNTEgNTFzLTIyLjggNTEtNTEgNTF6IiBmaWxsPSIjMjQyNTJGIi8+PC9zdmc+)\n![Qwen Code](https://img.shields.io/badge/Qwen_Code-compatible-6156FF)\n\n\u003e **What's new in v1.9.0:** lumira is now a **Claude Code plugin** — install with `/plugin marketplace add cativo23/lumira`, no npm required. Run `/lumira:setup` to activate. v1.8.2 made the installer write a fast per-render command (~10× faster). v1.8.1 brought the GSD widget to parity with GSD 1.42.3. Earlier: compaction counter `⊙ N` (v1.8.0), added-dirs badge + worktree breadcrumb (v1.7.0), [`lumira stats` CLI](#stats-cli) (v1.5), `API N%` latency widget (v1.4.0), 7-day quota projection (v1.3.0).\n\n## Table of contents\n\n- [Why lumira?](#why-lumira)\n- [How lumira compares](#how-lumira-compares)\n- [Requirements](#requirements)\n- [Features](#features)\n- [Install](#install)\n- [Display modes](#display)\n- [Themes](#themes)\n- [Stats CLI](#stats-cli)\n- [Powerline](#powerline)\n- [Configuration](#configuration)\n- [Architecture](#architecture)\n- [Development](#development)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Why lumira?\n\nClaude Code's default statusline shows the model name and current directory. That's it. Lumira surfaces what actually changes during a session and what you'd want to react to:\n\n- **Context-window pressure** — color-coded bar from green to blinking red, with a `/compact?` hint at high fill so you act before hitting the wall.\n- **Burn rate** — `$/h` next to total cost, so a runaway agent shows up immediately.\n- **Rate-limit battery** — 5h/7d usage shows as a Nerd Font battery glyph (or 🔋/🪫 in emoji mode) that fills as you consume quota, with a reset countdown above 70%. Hidden below 50% to keep the line uncluttered when you have margin.\n- **Active tools, agents, and todo progress** — parsed from the live transcript, updated every render.\n- **Cross-platform** — same config drives Claude Code and Qwen Code; Qwen sessions auto-collapse to single-line.\n\nInspired by [GSD's](https://github.com/open-gsd/gsd-core) statusline; takes its own stance on opt-in powerline rendering, theme contrast guarantees, and Qwen Code compatibility.\n\n## How lumira compares\n\nThe Claude Code statusline space has several good tools. Here's an honest head-to-head on **features** against the other true statuslines (feature claims checked against each tool's current README, 2026-06-14):\n\n| Tool | Runtime / deps | Distribution | Platforms | Config UX | Powerline + themes | Session-intel widgets |\n|---|---|---|---|---|---|---|\n| **lumira** | TS / **0 runtime deps** | npm + npx + plugin (+ Qwen skill) | **Claude Code + Qwen Code** | Wizard + JSON + CLI flags | Yes (7 styles) + 7 themes, **WCAG-AA guard** | **Quota projection, pace delta, API-latency, auto-compact glyph + counter, cache, agents, MCP, todos, tools** + `stats` CLI |\n| ccstatusline | TS / bundled | npm + npx | Claude Code | **Ink TUI** (live preview) | Yes + themes | Context, cost, usage %, block timer, compaction count, git; no quota/pace/latency |\n| claude-hud | JS / Node 18+ | Plugin marketplace | Claude Code (v1.0.80+) | Guided `/configure` + JSON | No / no themes | Context, 5h/7d usage, cost, git, tools, agents, todos, cache TTL; no quota ETA/pace/latency |\n| CCometixLine | Rust binary | npm + binary + source | Claude Code | TUI (TOML) | Yes + themes | Model, dir, git, context %, usage, cost, time, output-style |\n| claude-pace | Bash + jq | curl + plugin + npx | Claude Code 2.1.80+ | JSON block | No / no | 5h+7d %, pace delta, reset countdown, git diff; ~10ms (lightest) |\n| cship | Rust binary | binary / script / cargo | Claude Code | TOML (Starship-style) | Yes (Starship) + themes | Cost, context bar, usage limits, model, effort, agent, session, peak-time |\n| starship-claude | Shell / needs Starship | Plugin + manual | Claude Code (no tmux) | Wizard + TOML | Via Starship + palettes | Context bar, model, session |\n\n**Where lumira leads:** breadth of session-intelligence widgets — sole owner of an API-latency widget, a 7-day quota *projection ETA*, an MCP-server count, and a bundled `stats` analytics CLI, on top of the full pace / agents / todos / cache set. Plus zero runtime deps, dual-platform (Claude Code **and** Qwen Code), and WCAG-AA contrast enforced in CI on every theme. **Where it doesn't:** no Ink-style interactive widget builder — config is a wizard + JSON, not a live drag-and-drop TUI.\n\nSee [`docs/competitive-comparison.md`](docs/competitive-comparison.md) for the full per-widget matrix, config-UX detail, and distribution breakdown across every tool.\n\n## Requirements\n\n- **Node ≥18**\n- **Nerd Font** (recommended) — for branch, folder, model, and spinner icons. Falls back to plain glyphs via `icons: emoji` or `icons: none`.\n- **Truecolor terminal** (for themes / powerline) — auto-detected via `COLORTERM=truecolor`. 256-color terminals get a nearest-index projection; named-ANSI terminals fall back to default colors silently.\n\n## Features\n\n- **Context bar with thresholds** — green → yellow → orange → blinking red, plus an actionable `/compact?` hint when fill is high.\n- **Session intelligence** — pace delta (🐢/🏎️) shows whether you're burning quota faster than the time window allows, with ETA when ahead of pace. Live agent count and cache hit rate round it out.\n- **Powerline mode** + 7 separator presets (`arrow`, `flame`, `slant`, `round`, `diamond`, `compatible`, `plain`) across 3 lines.\n- **OSC 8 hyperlinks** — clickable directory and version tag on iTerm2, WezTerm, Kitty, VS Code, Alacritty.\n- **7 hand-curated themes** — `dracula`, `nord`, `tokyo-night`, `catppuccin`, `monokai`, `gruvbox`, `solarized`. WCAG AA contrast guaranteed in CI.\n- **Token + cost metrics** — input/output counts, speed (tok/s), $ total + burn rate ($/h), cache hit rate.\n- **Auto-fits at \u003c70 cols** — switches from 3-line custom mode to single-line minimal automatically.\n- **Zero runtime dependencies** — Node 18+ only.\n- **Dual-platform** — Claude Code and Qwen Code share the same config.\n\n\u003cdetails\u003e\n\u003csummary\u003eEverything else lumira shows\u003c/summary\u003e\n\n- **Git status** — branch + staged/modified/untracked counts, 5s TTL cache. Branch turns red on dirty repos in powerline mode.\n- **Rate limits** — 5h/7d usage as a battery glyph (Nerd Font level fill, or 🔋/🪫 in emoji mode) with color tier and reset countdown. Threshold-gated at 50% to stay invisible while you have margin.\n- **Pace delta** — `usedPct − elapsedPct` of the 5h window. Turtle when behind pace (healthy), car with time-to-exhaustion when ahead. Color escalates green → yellow → orange → blinkRed. Toggle independently via `display.paceDelta`.\n- **7d quota projection** — when the current burn rate would exhaust the 7d quota before the window resets, the 7d segment grows a warning: `⚠ ~24h`, `⚠ ~2d`, `⚠ Tue`, or `🔥 ~8h` (critical icon under 12h). Default on. Toggle via `display.quotaProjection`; off in the `minimal` preset. Different from pace delta — pace looks backwards at the 5h window's actual vs proportional burn, projection looks forwards at the 7d window's exhaustion ETA.\n- **Active agents** — live count of running subagents (`⚡N agents`) plus types parsed from the transcript. Toggle via `display.agents`.\n- **Cache hit rate** — prompt cache efficiency for the current turn (`87%⚡`). Alarm-mode: hidden while ≥90% (Anthropic's prompt cache pins this near 99% in healthy steady state, so an always-on number is wallpaper, not signal). Surfaces as yellow/orange/blinkRed only when the cache is actually degrading. Same hide-when-healthy pattern as rate-limits and agent count.\n- **GSD integration** — current task and update notifications (opt-in).\n- **Config health widget** — surfaces silent fallbacks (theme/powerline degrading in named-ANSI, missing GSD STATE.md). Opt-in.\n- **Memory usage** — process RSS percentage.\n- **MCP server detection** — count of attached MCP servers per session.\n- **Vim-mode hint, thinking effort, worktree, output style, session name, added-dirs badge, worktree origin-branch breadcrumb** — all togglable per-field via `display.*`.\n- **3-tier color system** — named ANSI / 256-color / truecolor, auto-detected.\n- **Config-driven** — every feature toggleable via JSON config + CLI flags.\n\n\u003c/details\u003e\n\n## Install\n\n### Option 1 — Claude Code plugin (recommended)\n\nNo npm required. Works with the Claude Code plugin marketplace:\n\n```\n/plugin marketplace add cativo23/lumira\n/lumira:setup\n```\n\n`/lumira:setup` finds the cached binary, writes `statusLine.command` to `~/.claude/settings.json`, and creates a default config. Restart Claude Code when done. To customize afterward: `/lumira:lumira`.\n\n### Option 2 — npm\n\n```bash\nnpx lumira install\n```\n\nThe installer walks you through **preset** (`full` / `balanced` / `minimal`), **theme**, and **icons** — showing a live preview at each step. Press `Esc` to abort without writing anything. In non-interactive shells (piped stdin, CI), the installer skips the wizard and writes sensible defaults (`preset: balanced`, `icons: nerd`). If Qwen Code is detected (`~/.qwen/` exists), the `/lumira` skill is installed for both CLIs.\n\nFor the fastest statusline (the command runs on **every** render), the installer offers to install lumira globally so it can invoke the compiled binary directly (`lumira`, ~60ms) instead of `npx` (~10× slower). It also migrates older `npx lumira@latest` setups to the faster form automatically.\n\nOr install globally:\n\n```bash\nnpm install -g lumira\nlumira install\n```\n\nTo uninstall:\n\n```bash\nnpx lumira uninstall\n```\n\nYour preferences are saved to `~/.config/lumira/config.json` — hand-edited keys (e.g. custom `display` toggles) are preserved on re-install.\n\n### Manual setup\n\nThe `statusLine.command` runs on every render, so prefer the **direct binary**. Install globally (`npm install -g lumira`), then add to `~/.claude/settings.json`:\n\n```json\n{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"lumira\",\n    \"padding\": 0\n  }\n}\n```\n\nIf installed from source, point at the compiled entry:\n\n```json\n{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"node /path/to/lumira/dist/index.js\",\n    \"padding\": 0\n  }\n}\n```\n\n\u003e Without a global install you can use `\"command\": \"npx lumira\"` — it works, but resolves through npx on every render (~10× slower). Avoid `npx lumira@latest`: the `@latest` hits the npm registry on every render.\n\n## Display\n\n### Custom Mode (default, \u003e=70 columns)\n\n![custom mode — 3 lines: model + git + dir + version, context bar + tokens + cost + time, tools + todos](assets/showcase/mode-custom.png)\n\n### Minimal Mode (\u003c70 columns or `--minimal`)\n\n![minimal mode — single line: dir + branch + model + bar + tokens + cost](assets/showcase/mode-minimal.png)\n\n### Powerline Mode (opt-in via `style: \"powerline\"`)\n\n![powerline mode — same content with arrow separators and per-segment backgrounds](assets/showcase/mode-powerline.png)\n\nEach segment renders with a distinct background color drawn from the active theme; segments are separated by a Nerd Font glyph (default ``). On dirty git repos the branch segment turns red. Falls back to classic mode silently in named-ANSI terminals (powerline needs RGB backgrounds). See [Powerline](#powerline) below for the 7 separator styles.\n\n## Themes\n\nSeven hand-curated themes, every one tested for WCAG AA contrast against white foreground in CI. Themes apply to both classic and powerline modes:\n\n`dracula` · `nord` · `tokyo-night` · `catppuccin` · `monokai` · `gruvbox` · `solarized`\n\n**Classic mode** — pipe-separated layout, theme colors applied to text:\n\n![all 7 themes in classic mode](assets/showcase/themes-gallery-classic.png)\n\n**Powerline mode** — colored segment backgrounds with arrow separators:\n\n![all 7 themes in powerline mode](assets/showcase/themes-gallery-powerline.png)\n\nThemes apply in truecolor and 256-color terminals; named-ANSI terminals fall back to default colors (8 base hues can't represent arbitrary palettes).\n\n### Browse from the CLI\n\nTry a theme without touching your config:\n\n```bash\nlumira themes                                # list all themes\nlumira themes preview tokyo-night            # render a sample\nlumira themes preview nord --powerline       # same in powerline (default arrow separator)\nlumira themes preview gruvbox --style=flame  # powerline with flame separator\nlumira themes preview --all                  # render every theme in sequence\nlumira themes preview --all --powerline      # the powerline grid (great for screenshots)\n```\n\n### Want your favorite theme?\n\nAdding a theme is a single new file plus a one-line registration. Every PR runs the **WCAG AA contrast guard** — if any powerline cell drops below 4.5:1 against the foreground, CI rejects it. See [CONTRIBUTING.md → Adding a theme](CONTRIBUTING.md#adding-a-theme) for the walkthrough.\n\n## Stats CLI\n\n`lumira stats` reads a Claude Code or Qwen Code transcript `.jsonl` and prints a one-shot analytics summary — session duration, total cost, token totals, cache hit rate, tool call frequency, and burn rate (`$/h`). Useful for post-session review, scripting, and CI dashboards.\n\n```bash\n# Just works — auto-discovers the newest transcript for the current cwd.\nlumira stats\n# Session: 2h 15m — $4.23 — 156k tokens — 87% cache\n# Tools: Bash×45 Read×32 Write×18 Edit×12 Agent×8\n# Burn: $1.88/h\n```\n\n**Auto-discovery:** with no flags, `lumira stats` derives the Claude Code project slug from `cwd` (`/home/me/proj` → `-home-me-proj`) and reads the newest `.jsonl` under `~/.claude/projects/\u003cslug\u003e/`. If the current directory has no matching project dir, it falls back to the globally most-recently-modified transcript under `~/.claude/projects/` and prints a notice to stderr (\"reading most recent session from …\") so JSON pipelines on stdout stay clean.\n\n**Flags:**\n\n- `--session-id \u003cpath-or-uuid\u003e` — override auto-discovery. A path (anything containing `/` or ending in `.jsonl`) is used as-is. A bare uuid is resolved first under `~/.claude/projects/\u003ccwd-slug\u003e/\u003cuuid\u003e.jsonl`, then by scanning every project dir for that filename.\n- `--no-color` — strip ANSI escapes (also honored when the `NO_COLOR` env var is set, per [no-color.org](https://no-color.org)).\n- `--json` — emit the raw `SessionStats` object as pretty-printed JSON for `jq` / CI composability.\n\n**Qwen Code sessions** are parsed the same way, but cost and burn-rate lines are suppressed when the transcript lacks usage blocks (`hasCostData: false` in the JSON output) — no misleading `$0.00`.\n\n## Powerline\n\n`style: \"powerline\"` (or `--powerline`) renders the statusline with colored segment backgrounds and glyph separators inspired by powerline-go / oh-my-posh. Available separator presets via `powerline.style` (or `--powerline-style=\u003cname\u003e`):\n\n| Style | Look |\n|---|---|\n| `arrow` | classic right-pointing triangle separator (default) |\n| `flame` | wavy flame-shaped separator |\n| `slant` | forward-slanting separator |\n| `round` | rounded caps at line ends + thin internal separators |\n| `diamond` | each segment isolated as its own pill with rounded caps |\n| `compatible` | unicode `▶` separator (no Nerd Font required) |\n| `plain` | no separator glyphs — just colored blocks |\n| `auto` | picks `arrow` if Nerd Font icons are configured, else `compatible` |\n\n### Hyperlinks (OSC 8)\n\nThe directory on line 1 becomes a clickable `file://` link, and the version tag links to its npm release page on terminals that support [OSC 8](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda) (iTerm2, WezTerm, Kitty, Alacritty, VS Code terminal, tmux ≥3.4 with passthrough). Other terminals show plain text. Auto-disabled in `Apple_Terminal` (which leaks markers) and `TERM=dumb`.\n\n```bash\nNO_HYPERLINKS=1 claude    # disable\nFORCE_HYPERLINK=1 claude  # force-enable (overrides denylist)\n```\n\n### Qwen Code\n\nLumira auto-detects the platform. In Qwen Code sessions, the renderer automatically switches to single-line output regardless of your configured layout — Qwen only displays the first statusline row, so lumira fits everything (model, branch, context bar, cost, cached tokens, thoughts) into one line. **No configuration needed:** the same `config.json` serves both Claude Code and Qwen Code.\n\n## Configuration\n\nCreate `~/.config/lumira/config.json`:\n\n```json\n{\n  \"preset\": \"balanced\",\n  \"theme\": \"tokyo-night\",\n  \"icons\": \"nerd\",\n  \"style\": \"classic\",\n  \"powerline\": { \"style\": \"auto\" },\n  \"gsd\": false,\n  \"colors\": { \"mode\": \"auto\" },\n  \"display\": {\n    \"model\": true,\n    \"branch\": true,\n    \"gitChanges\": true,\n    \"directory\": true,\n    \"contextBar\": true,\n    \"contextTokens\": true,\n    \"tokens\": true,\n    \"cacheMetrics\": true,\n    \"cost\": true,\n    \"burnRate\": true,\n    \"duration\": true,\n    \"tokenSpeed\": true,\n    \"apiLatency\": true,\n    \"rateLimits\": true,\n    \"paceDelta\": true,\n    \"quotaProjection\": true,\n    \"tools\": true,\n    \"todos\": true,\n    \"mcp\": true,\n    \"vim\": true,\n    \"effort\": true,\n    \"worktree\": true,\n    \"addedDirs\": true,\n    \"worktreeBreadcrumb\": true,\n    \"agent\": true,\n    \"sessionName\": true,\n    \"style\": true,\n    \"version\": true,\n    \"linesChanged\": true,\n    \"memory\": true,\n    \"agents\": true,\n    \"compactionCount\": true,\n    \"health\": false,\n    \"contextWarningThreshold\": 70,\n    \"contextCriticalThreshold\": 85\n  }\n}\n```\n\nAll fields are optional — defaults are shown above. `display.health` defaults to `false` (opt-in widget).\n\n**Context bar thresholds** — `contextWarningThreshold` (default 70) and `contextCriticalThreshold` (default 85) control when the bar transitions through yellow/orange/red. Both are clamped to `[0, 100]` and `warning \u003c critical` is required (invalid pairs fall back to defaults with a one-shot stderr warning). Lower them for earlier warnings, raise them if your workflow tolerates fuller buffers.\n\n\u003e **Migration note (post-0.7.1):** default color transitions shifted from `50/65/80` to `50/70/85`. The bar now stays yellow up to 70% (was 65%) and orange up to 85% (was 80%) before flashing red. To restore the previous behavior, set `\"contextWarningThreshold\": 65, \"contextCriticalThreshold\": 80` in your config.\n\n### CLI Flags\n\n```bash\nlumira --minimal                    # Force single-line mode\nlumira --balanced                   # Force balanced preset\nlumira --full                       # Force full multi-line preset\nlumira --gsd                        # Enable GSD integration\nlumira --powerline                  # Enable powerline visual style\nlumira --classic                    # Force classic (pipe-separated) line 1\nlumira --powerline-style=arrow      # Pick separator: arrow|flame|slant|round|diamond|compatible|plain|auto\nlumira --icons=nerd|emoji|none      # Override icon set\nlumira --preset=full|balanced|minimal\n```\n\n## Custom Commands\n\nUser-defined shell commands rendered as statusline segments on any of the 4 lines. Disabled by default.\n\n### Enable\n\n```bash\nlumira custom enable\n```\n\n### Configure\n\nAdd a `customCommands` block to `~/.config/lumira/config.json`:\n\n```json\n{\n  \"customCommands\": {\n    \"enabled\": true,\n    \"commands\": [\n      {\n        \"id\": \"git-status\",\n        \"command\": [\"git\", \"status\", \"--short\"],\n        \"label\": \"\",\n        \"line\": 1,\n        \"refreshMs\": 5000,\n        \"onError\": \"hide\"\n      }\n    ]\n  }\n}\n```\n\n**Key fields:**\n\n| Field | Description |\n|---|---|\n| `id` | Unique identifier for the command |\n| `command` | Argv array — no shell expansion, pipes, or redirects |\n| `line` | Statusline line to render on (`1`–`4`) |\n| `refreshMs` | Refresh interval in milliseconds (default: `5000`) |\n| `label` | Optional prefix shown before the command output |\n| `color` | Optional color override for the segment |\n| `onError` | What to show on non-zero exit: `hide` (default), `placeholder`, `output`, or `stale` |\n| `onTimeout` | What to show on timeout: same options as `onError`, defaults to `hide` |\n| `timeoutMs` | Max execution time in ms (clamped to 2000) |\n| `maxBytes` | Max stdout bytes captured (clamped to 4096) |\n| `ansi` | Set `true` to pass through ANSI escape sequences from the command |\n\n`command` must be an argv array (`[\"git\", \"status\", \"--short\"]`). Shell strings with pipes or redirects are not supported — wrap them in a script if needed.\n\nOutput is cached with a TTL and refreshed in the background, so the hot render path never blocks on subprocess execution.\n\n### CLI subcommands\n\n```bash\nlumira custom list          # list configured commands and their status\nlumira custom enable        # enable the custom commands feature\nlumira custom disable       # disable the custom commands feature\nlumira custom test \u003cid\u003e     # run a command immediately and print its output\nlumira custom logs          # show recent execution logs\n```\n\n## Architecture\n\n```text\nstdin (JSON from Claude Code or Qwen Code)\n  → normalize() — unifies both platform payloads\n  → parsers (git, transcript, token-speed, memory, gsd)\n  → RenderContext\n  → render (line1-4 or minimal)\n  → stdout\n```\n\n- **Dependency injection** for testability\n- **File caching** — TTL-based (git, speed) and mtime-based (transcript)\n- **Progressive truncation** — adapts to terminal width\n\n## Development\n\n```bash\nnpm run dev          # Watch mode (tsc --watch)\nnpm test             # Run tests\nnpm run test:watch   # Watch mode\nnpm run test:coverage # With coverage\nnpm run lint         # Type check\nnpm run build        # Compile to dist/\n```\n\n### Debugging\n\nSet `LUMIRA_DEBUG=1` to trace parser decisions on stderr — cache hits, GSD state-file resolution, MCP server loads. Useful when investigating \"why doesn't X show up?\" reports. Stdout stays clean so it doesn't corrupt the statusline.\n\n```bash\nLUMIRA_DEBUG=1 claude    # or export LUMIRA_DEBUG=1\n```\n\n## Contributing\n\nPRs welcome — particularly for new themes (one of the most common contribution paths). See [CONTRIBUTING.md](CONTRIBUTING.md) for the branching model, theme submission walkthrough, and the contrast-guard CI step that runs on every theme PR.\n\n### What's next\n\n- **v1.0** — soak window on v0.7.x, then tagging stable. CLI flags, preset names, and config schema are considered frozen from this point.\n- **Themes** — community theme contributions welcome via the theme PR template.\n- **Backlog** — incremental transcript parsing for very large sessions (deferred; full re-parse stays under budget for real-world transcripts).\n\nFor security issues, see [SECURITY.md](SECURITY.md).\n\n## Credits\n\nMigrated from [claude-setup](https://github.com/cativo23/claude-setup) statusline.\n\nTheme palettes drawn from upstream specs: [Dracula](https://draculatheme.com), [Nord](https://www.nordtheme.com), [Tokyo Night](https://github.com/folke/tokyonight.nvim), [Catppuccin](https://catppuccin.com), [Monokai](https://monokai.pro), [Gruvbox](https://github.com/morhetz/gruvbox), [Solarized](https://ethanschoonover.com/solarized).\n\n## License\n\nMIT © [Carlos Cativo](https://github.com/cativo23) — see [LICENSE](LICENSE) for the full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcativo23%2Flumira","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcativo23%2Flumira","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcativo23%2Flumira/lists"}