Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
| ai:platformy:claude-code:statusline [08.05.2026 21:45] – Zjednodušení: ctx% čteno přímo z used_percentage. Doplněny poznatky z oficiální dokumentace (total_input_tokens zahrnuje cache, used_percentage existuje). Petr Nosek | ai:platformy:claude-code:statusline [09.08.2026 23:18] (aktuální) – Aktualizace subagent status line pro aktuální chování label Petr Nosek | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| ====== Status line pro Claude Code ====== | ====== Status line pro Claude Code ====== | ||
| - | // | + | // |
| - | [[ai: | + | [[ai: |
| ===== Co z toho získám ===== | ===== Co z toho získám ===== | ||
| - | * Aktuální | + | * Hlavní status line ukazuje |
| - | * Použitý model a session ID přímo ve status line. | + | * Subagent status line ukazuje každého subagenta jako vlastní řádek: agent, |
| - | * Využití context window v procentech, čtené přímo | + | * Model subagenta se bere z pole '' |
| - | * 5hodinový a 7denní limit, včetně času resetu, pokud je Claude Code pošle v JSONu. | + | * Popisky subagentů jsou čitelné i při paralelním běhu více agentů. |
| - | * Absolutní spotřebu tokenů context window ve formátu | + | |
| - | * Barevné zvýraznění podle vytížení: | + | |
| ===== Zapojení do konfigurace ===== | ===== Zapojení do konfigurace ===== | ||
| - | V '' | + | V '' |
| <code json> | <code json> | ||
| " | " | ||
| " | " | ||
| - | " | + | " |
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| } | } | ||
| </ | </ | ||
| - | Skript | + | Skripty |
| - | ===== Jak vypadá výstup | + | ===== Hlavní status line ===== |
| - | Když Claude Code neposílá | + | Hlavní '' |
| - | + | ||
| - | < | + | |
| - | ~/scratch │ Sonnet 4.6 | sid:< | + | |
| - | </ | + | |
| - | Když jsou limity v JSONu k dispozici, řádka se rozšíří o 5h a 7d přehled: | + | Výstup hlavní status line vypadá zhruba takto: |
| < | < | ||
| - | ~/project-procesniaudit-website | + | ~/project │ Sonnet 4.6 | sid:< |
| </ | </ | ||
| Řádek 49: | Řádek 47: | ||
| * token counter '' | * token counter '' | ||
| - | ===== Celý skript ===== | + | ==== Skript '' |
| <code bash> | <code bash> | ||
| Řádek 124: | Řádek 122: | ||
| fi | fi | ||
| } | } | ||
| - | |||
| # ── 3) context used ──────────────────────────────────────────────────────────── | # ── 3) context used ──────────────────────────────────────────────────────────── | ||
| Řádek 192: | Řádek 189: | ||
| printf " | printf " | ||
| + | </ | ||
| + | |||
| + | ===== Subagent status line ===== | ||
| + | |||
| + | '' | ||
| + | |||
| + | <code json> | ||
| + | {" | ||
| + | </ | ||
| + | |||
| + | V reálných datech task obsahuje zejména pole '' | ||
| + | |||
| + | Pro název subagenta se používá konvence v '' | ||
| + | |||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | Příklad: | ||
| + | |||
| + | < | ||
| + | elite-prompt-architect · rešerše pricing | ||
| + | </ | ||
| + | |||
| + | Skript model přečte z '' | ||
| + | |||
| + | < | ||
| + | elite-prompt-architect │ haiku │ rešerše pricing │ Reading subagent-statusline.sh │ running │ ctx:2% │ tok:8.1k ▁▄█ 579/s │ 14s | ||
| + | </ | ||
| + | |||
| + | ==== Pravidlo ve skillu '' | ||
| + | |||
| + | Pro pojmenování dispatchů v Claude Code je tato konvence uložená ve skillu '' | ||
| + | |||
| + | <code markdown> | ||
| + | ## `description` naming convention — Claude Code only | ||
| + | |||
| + | In **Claude Code**, format every dispatch `description` as: | ||
| + | |||
| + | ``` | ||
| + | < | ||
| + | ``` | ||
| + | |||
| + | Example: `elite-prompt-architect · rešerše pricing` | ||
| + | |||
| + | Why this exact shape: the task data behind the subagent status-line panel exposes | ||
| + | `model`, `status`, `tokenCount` and timings on its own, but it does **not** expose | ||
| + | `subagent_type` — `type` is just the coarse category `local_agent`. So the agent' | ||
| + | identity reaches the panel only through `description`. That visibility matters most | ||
| + | exactly when several subagents run in parallel and you need to tell them apart at a | ||
| + | glance. | ||
| + | |||
| + | - Separator is a spaced middot ` · ` — the status line splits the label on it. | ||
| + | - The panel' | ||
| + | `progress.summary || description`, | ||
| + | every 30 s with an LLM-generated activity line (" | ||
| + | script must therefore read identity from `description` and treat `label` as live | ||
| + | activity only — never the other way round. | ||
| + | - **Never write the model into `description`.** Claude Code sends the real model in | ||
| + | the task's `model` field and the status line renders it as a colored chip itself. | ||
| + | Writing it by hand is redundant, and when the `model` param is omitted there is | ||
| + | nothing truthful to write — placeholders like `session` or `inherit` used to leak | ||
| + | into the visible label. | ||
| + | - Keep `<short description> | ||
| + | |||
| + | Legacy `< | ||
| + | the status line detects a model-shaped middle segment and drops it in favour of the | ||
| + | real `model` field. No need to rewrite old agent definitions, | ||
| + | dispatches in the two-part form. | ||
| + | |||
| + | This is purely a Claude Code convenience: | ||
| + | setting parsing the ` · ` format. **OpenCode** has no such status line, so use a | ||
| + | plain, natural `description` there — do **not** force this format. | ||
| + | </ | ||
| + | |||
| + | ==== Skript '' | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | # Claude Code subagent status line | ||
| + | # Renders one custom row per active subagent in the agent panel. | ||
| + | # Row: < | ||
| + | # Input (stdin): { cwd, columns, tasks:[ {id, | ||
| + | # Output (stdout): one JSON line per task -> {" | ||
| + | |||
| + | input=$(cat) | ||
| + | |||
| + | # ── DEBUG (volitelne): | ||
| + | if [ -n " | ||
| + | printf ' | ||
| + | fi | ||
| + | |||
| + | # ── ANSI ──────────────────────────────────────────────────────────────────────── | ||
| + | RESET=' | ||
| + | RED=' | ||
| + | |||
| + | now=$(date +%s) | ||
| + | main_cwd=$(echo " | ||
| + | columns=$(echo " | ||
| + | US=$' | ||
| + | |||
| + | status_color() { | ||
| + | case " | ||
| + | running|in_progress|active) echo " | ||
| + | completed|done|success) | ||
| + | failed|error) | ||
| + | pending|queued|waiting) | ||
| + | *) echo " | ||
| + | esac | ||
| + | } | ||
| + | |||
| + | # Rozpozná model v prefixu popisku (konvence "model · popis" / "model | popis" | ||
| + | # Vrací barvu, nebo prázdno když prefix není známý model. | ||
| + | model_color() { | ||
| + | case " | ||
| + | haiku*) | ||
| + | sonnet*) echo " | ||
| + | opus*) | ||
| + | fable*) | ||
| + | *) echo "" | ||
| + | esac | ||
| + | } | ||
| + | |||
| + | # Model z pole `.model` (např. " | ||
| + | # Toto je autoritativní zdroj; konvence v description je jen fallback. | ||
| + | model_family() { | ||
| + | case " | ||
| + | *haiku*) | ||
| + | *sonnet*) echo " | ||
| + | *opus*) | ||
| + | *fable*) | ||
| + | *) echo "" | ||
| + | esac | ||
| + | } | ||
| + | |||
| + | # Segment v description, | ||
| + | # ať neteče do popisu (" | ||
| + | is_model_slot() { | ||
| + | [ -n " | ||
| + | case " | ||
| + | session|inherit|dedeno|zdeděno|zdedeno|default) return 0 ;; | ||
| + | *) return 1 ;; | ||
| + | esac | ||
| + | } | ||
| + | |||
| + | # elapsed seconds from startTime (epoch-s, epoch-ms, or ISO-8601) -> " | ||
| + | elapsed_str() { | ||
| + | local v=" | ||
| + | { [ -z " | ||
| + | if [[ " | ||
| + | if [ " | ||
| + | else | ||
| + | start=$(date -d " | ||
| + | fi | ||
| + | local d=$(( now - start )); [ " | ||
| + | if [ " | ||
| + | elif [ " | ||
| + | else printf " | ||
| + | return | ||
| + | } | ||
| + | elapsed_secs() { | ||
| + | local v=" | ||
| + | { [ -z " | ||
| + | if [[ " | ||
| + | if [ " | ||
| + | else | ||
| + | start=$(date -d " | ||
| + | fi | ||
| + | local d=$(( now - start )); [ " | ||
| + | } | ||
| + | |||
| + | num_fmt() { # 39731 -> 39.7k | ||
| + | local t=" | ||
| + | [ " | ||
| + | } | ||
| + | |||
| + | # sparkline + rate from tokenSamples (defensive: čísla i objekty) | ||
| + | # stdout: "< | ||
| + | spark_and_rate() { | ||
| + | python3 - " | ||
| + | import sys, json | ||
| + | raw = sys.argv[1] if len(sys.argv) > 1 else " | ||
| + | try: | ||
| + | d = json.loads(raw) | ||
| + | except Exception: | ||
| + | print(" | ||
| + | vals, times = [], [] | ||
| + | def num(x): | ||
| + | if isinstance(x, | ||
| + | if isinstance(x, | ||
| + | for k in (' | ||
| + | if isinstance(x.get(k), | ||
| + | return None | ||
| + | def tim(x): | ||
| + | if isinstance(x, | ||
| + | for k in (' | ||
| + | if isinstance(x.get(k), | ||
| + | return None | ||
| + | if isinstance(d, | ||
| + | for x in d: | ||
| + | v = num(x) | ||
| + | if v is not None: | ||
| + | vals.append(v); | ||
| + | spark = "" | ||
| + | if len(vals) >= 2: | ||
| + | blocks = " | ||
| + | w = vals[-14:] | ||
| + | lo, hi = min(w), max(w); rng = (hi - lo) or 1 | ||
| + | spark = "" | ||
| + | rate = "" | ||
| + | if len(vals) >= 2 and all(t is not None for t in times) and (times[-1]-times[0]) > 0: | ||
| + | dt = times[-1]-times[0] | ||
| + | if dt > 10_000_000_000: | ||
| + | r = (vals[-1]-vals[0])/ | ||
| + | if r > 0: | ||
| + | rate = f" | ||
| + | print(f" | ||
| + | PY | ||
| + | } | ||
| + | |||
| + | short_dir() { | ||
| + | local d=" | ||
| + | { [ -z " | ||
| + | if [ " | ||
| + | elif [[ " | ||
| + | else echo " | ||
| + | } | ||
| + | |||
| + | # ── build one row per task ─────────────────────────────────────────────────────── | ||
| + | echo " | ||
| + | id=$(echo " | ||
| + | # Identita agenta se čte VÝHRADNĚ z `description` (konvence | ||
| + | # "< | ||
| + | # POZOR: `label` NENÍ štítek dispatche. Claude Code ho počítá jako | ||
| + | # `progress.summary || description` a pro `type == " | ||
| + | # `progress.summary` průběžně (à 30 s) zapisuje LLM-generované shrnutí | ||
| + | # aktuální činnosti (" | ||
| + | # objeví, `label` přepíše description a jméno agenta by z něj zmizelo. | ||
| + | # Proto: description = identita, label = živá činnost. Nikdy naopak. | ||
| + | descr=$(echo " | ||
| + | label=$(echo " | ||
| + | name=$(echo " | ||
| + | primary=" | ||
| + | activity="" | ||
| + | if [ -n " | ||
| + | activity=" | ||
| + | fi | ||
| + | # Typy bez description (local_bash: | ||
| + | [ -z " | ||
| + | [ -z " | ||
| + | # `type` je hrubá kategorie (" | ||
| + | type=$(echo " | ||
| + | status=$(echo " | ||
| + | tokens=$(echo " | ||
| + | start=$(echo " | ||
| + | tcwd=$(echo " | ||
| + | samples=$(echo " | ||
| + | rawmodel=$(echo " | ||
| + | ctxsize=$(echo " | ||
| + | |||
| + | sc=$(status_color " | ||
| + | |||
| + | # Model: primárně z pole `.model` (Claude Code ho posílá), teprve pak z konvence. | ||
| + | _model=$(model_family " | ||
| + | |||
| + | # Konvence "agent · popis" (historicky i "agent · model · popis"; | ||
| + | # " · " nebo " | "). Model-slot v popisku se zahodí, když model už známe. | ||
| + | agentseg=""; | ||
| + | _tmp=" | ||
| + | IFS=" | ||
| + | _agent=""; | ||
| + | _n=${# | ||
| + | if [ " | ||
| + | _agent=" | ||
| + | # druhý díl je model-slot (" | ||
| + | # ale jen když víme model odjinud nebo je to skutečně platný model | ||
| + | if is_model_slot " | ||
| + | [ -z " | ||
| + | _start=2 | ||
| + | fi | ||
| + | for ((i=_start; i<_n; i++)); do | ||
| + | _popis=" | ||
| + | done | ||
| + | else | ||
| + | _popis=" | ||
| + | fi | ||
| + | # jednodílný popisek, který je sám o sobě model → ber jako model, ne jako agenta | ||
| + | if [ " | ||
| + | _model=$(model_family " | ||
| + | fi | ||
| + | if [ -n " | ||
| + | _mcol=$(model_color " | ||
| + | [ -n " | ||
| + | fi | ||
| + | [ -n " | ||
| + | primary=" | ||
| + | |||
| + | # tokens: count + zaplneni okna + sparkline + rate | ||
| + | # ctx: zaplneni kontextoveho okna subagenta. `tokenCount` je aktualni obsazeni | ||
| + | # okna (ne kumulativni utrata), takze procento je primo pomer k `contextWindowSize`. | ||
| + | # Format i barvy zamerne shodne s hlavni statusLine (ctx:55% / ctx:93%!). | ||
| + | ctxseg=""; | ||
| + | if [ -n " | ||
| + | && | ||
| + | ctxpct=$(( tokens * 100 / ctxsize )) | ||
| + | if [ " | ||
| + | elif [ " | ||
| + | else ctxseg=$(printf " | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | tokseg="" | ||
| + | if [ -n " | ||
| + | disp=$(num_fmt " | ||
| + | # Varovnou roli nese ctx segment; tok zustava neutralni absolutni cislo. | ||
| + | # Bez `contextWindowSize` (starsi Claude Code) plati puvodni pevny prah. | ||
| + | if [ -n " | ||
| + | elif [ " | ||
| + | else tcol=" | ||
| + | IFS=$' | ||
| + | # fallback rate: průměr od startu, když samples nenesou čas | ||
| + | if [ -z " | ||
| + | es=$(elapsed_secs " | ||
| + | [ " | ||
| + | fi | ||
| + | tokseg=$(printf " | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | fi | ||
| + | |||
| + | el=$(elapsed_str " | ||
| + | |||
| + | # cwd jen když se liší od hlavní session | ||
| + | dirseg="" | ||
| + | if [ -n " | ||
| + | dirseg=$(printf " | ||
| + | fi | ||
| + | |||
| + | # ořez popisku a živé činnosti podle columns (heuristika: | ||
| + | # sloupců — status + ctx + tok/ | ||
| + | # přednost (odlišuje paralelní agenty téhož typu), činnost bere zbytek. | ||
| + | if [ " | ||
| + | budget=$(( columns - 55 )); [ " | ||
| + | if [ -n " | ||
| + | pbudget=$(( budget * 2 / 5 )); [ " | ||
| + | else | ||
| + | pbudget=" | ||
| + | fi | ||
| + | if [ -n " | ||
| + | if [ -n " | ||
| + | abudget=$(( budget - ${#primary} - 3 )); [ " | ||
| + | if [ " | ||
| + | fi | ||
| + | fi | ||
| + | actseg="" | ||
| + | [ -n " | ||
| + | |||
| + | # type badge jen když není běžná lokální kategorie | ||
| + | typeseg="" | ||
| + | case " | ||
| + | "" | ||
| + | *) typeseg=$(printf " | ||
| + | esac | ||
| + | |||
| + | parts=() | ||
| + | if [ -n " | ||
| + | parts+=(" | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | else | ||
| + | [ -n " | ||
| + | parts+=(" | ||
| + | fi | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | [ -n " | ||
| + | |||
| + | sep=" | ||
| + | content="" | ||
| + | for p in " | ||
| + | [ -z " | ||
| + | done | ||
| + | |||
| + | content_bytes=$(printf " | ||
| + | jq -cn --arg id " | ||
| + | done | ||
| </ | </ | ||
| ===== Poznámky k chování ===== | ===== Poznámky k chování ===== | ||
| - | * Pole '' | + | * Hlavní |
| - | * Funkce | + | * '' |
| - | * Pro cwd se primárně čte '' | + | * V aktuálním Claude Code je '' |
| - | * Procento využití context window se čte přímo z '' | + | * Starší tříčlenné popisky |
| - | * '' | + | * '' |
| - | * Skript záměrně nepoužívá příznak | + | * '' |
| - | * Když některé pole v JSONu chybí, skript | + | * '' |
| - | * Pořadí polí je pevné: | + | * '' |
| + | * Pro diagnostiku lze nastavit proměnnou prostředí | ||
| + | * Skripty vyžadují | ||
| ===== Zdroje ===== | ===== Zdroje ===== | ||
| * [[https:// | * [[https:// | ||