| Obě strany předchozí revize Předchozí verze | |
| ai:platformy:claude-code:statusline [04.08.2026 14:30] – Aktualizace subagent status line po změně dat Claude Code 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 |
|---|
| |
| * Hlavní status line ukazuje pracovní adresář, model, session ID, využití context window, 5h a 7d limity a absolutní spotřebu tokenů. | * Hlavní status line ukazuje pracovní adresář, model, session ID, využití context window, 5h a 7d limity a absolutní spotřebu tokenů. |
| * Subagent status line ukazuje každého subagenta jako vlastní řádek: agent, model, krátký popis, stav, zaplnění jeho context window, tokeny, trend tokenů, rychlost tokenů za sekundu, běh od startu a případně pracovní adresář. | * Subagent status line ukazuje každého subagenta jako vlastní řádek: agent, model, krátký popis dispatche, živou činnost, stav, zaplnění jeho context window, tokeny, trend tokenů, rychlost tokenů za sekundu, běh od startu a případně pracovní adresář. |
| * Model subagenta se bere z pole ''model'', které Claude Code předává do ''subagentStatusLine''. Název ''subagent_type'' v datech samostatně není; pro přehled se proto zapisuje do ''description''. | * Model subagenta se bere z pole ''model'', které Claude Code předává do ''subagentStatusLine''. Název ''subagent_type'' v datech samostatně není; pro přehled se proto zapisuje do ''description''. |
| * Popisky subagentů jsou čitelné i při paralelním běhu více agentů. | * Popisky subagentů jsou čitelné i při paralelním běhu více agentů. |
| |
| <code> | <code> |
| elite-prompt-architect │ haiku │ rešerše pricing │ running │ ctx:2% │ tok:8.1k ▁▄█ 579/s │ 14s | elite-prompt-architect │ haiku │ rešerše pricing │ Reading subagent-statusline.sh │ running │ ctx:2% │ tok:8.1k ▁▄█ 579/s │ 14s |
| </code> | </code> |
| |
| ==== Pravidlo do globálního ''CLAUDE.md'' ==== | ==== Pravidlo ve skillu ''calling-subagents'' ==== |
| |
| Aby byl panel čitelný i v dalších session, je potřeba dát do globálního ''CLAUDE.md'' pravidlo pro pojmenování dispatchů v Claude Code. ''description'' přenáší identitu subagenta, protože ''subagent_type'' není samostatnou součástí dat pro panel. Model se do ''description'' nepíše: Claude Code předává autoritativní hodnotu v poli ''model''. | Pro pojmenování dispatchů v Claude Code je tato konvence uložená ve skillu ''calling-subagents''. ''description'' přenáší identitu subagenta, protože ''subagent_type'' není samostatnou součástí dat pro panel. Model se do ''description'' nepíše: Claude Code předává autoritativní hodnotu v poli ''model''. |
| |
| <code markdown> | <code markdown> |
| |
| - Separator is a spaced middot ` · ` — the status line splits the label on it. | - Separator is a spaced middot ` · ` — the status line splits the label on it. |
| | - The panel's `label` field is **not** the dispatch label. Claude Code computes it as |
| | `progress.summary || description`, and for `local_agent` it fills `progress.summary` |
| | every 30 s with an LLM-generated activity line ("Reading runAgent.ts"). A status-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 | - **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. | the task's `model` field and the status line renders it as a colored chip itself. |
| # Renders one custom row per active subagent in the agent panel. | # Renders one custom row per active subagent in the agent panel. |
| # Row: <type> │ <status> │ tok:<n> <sparkline> <rate> │ <elapsed> │ [cwd] │ <label|desc> | # Row: <type> │ <status> │ tok:<n> <sparkline> <rate> │ <elapsed> │ [cwd] │ <label|desc> |
| # Input (stdin): { cwd, columns, tasks:[ ... ] } | # Input (stdin): { cwd, columns, tasks:[ {id,name,type,status,description,label,startTime,tokenCount,tokenSamples,cwd}, ... ] } |
| # Output (stdout): one JSON line per task -> {"id":"<id>","content":"<row w/ ANSI>"} | # Output (stdout): one JSON line per task -> {"id":"<id>","content":"<row w/ ANSI>"} |
| |
| echo "$input" | jq -c '.tasks[]?' | while read -r task; do | echo "$input" | jq -c '.tasks[]?' | while read -r task; do |
| id=$(echo "$task" | jq -r '.id // empty'); [ -z "$id" ] && continue | id=$(echo "$task" | jq -r '.id // empty'); [ -z "$id" ] && continue |
| # Primární štítek = label|description (subagent_type ve schématu NENÍ). | # Identita agenta se čte VÝHRADNĚ z `description` (konvence |
| primary=$(echo "$task" | jq -r '(.label // "") as $l | (.description // "") as $d | (.name // "") as $n | # "<subagent_type> · <popis>"); `subagent_type` ve schématu není. |
| | if ($l|length)>0 then $l elif ($d|length)>0 then $d elif ($n|length)>0 then $n else "agent" end') | # POZOR: `label` NENÍ štítek dispatche. Claude Code ho počítá jako |
| | # `progress.summary || description` a pro `type == "local_agent"` do |
| | # `progress.summary` průběžně (à 30 s) zapisuje LLM-generované shrnutí |
| | # aktuální činnosti ("Reading runAgent.ts"). Jakmile se první shrnutí |
| | # 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 "$task" | jq -r '.description // ""') |
| | label=$(echo "$task" | jq -r '.label // ""') |
| | name=$(echo "$task" | jq -r '.name // ""') |
| | primary="$descr"; [ -z "$primary" ] && primary="$name" |
| | activity="" |
| | if [ -n "$label" ] && [ "$label" != "$descr" ] && [ "$label" != "$name" ]; then |
| | activity="$label" |
| | fi |
| | # Typy bez description (local_bash: label = příkaz) → label slouží jako štítek. |
| | [ -z "$primary" ] && { primary="$activity"; activity=""; } |
| | [ -z "$primary" ] && primary="agent" |
| # `type` je hrubá kategorie ("local_agent"); ukázat jen když nese info. | # `type` je hrubá kategorie ("local_agent"); ukázat jen když nese info. |
| type=$(echo "$task" | jq -r '.type // ""') | type=$(echo "$task" | jq -r '.type // ""') |
| fi | fi |
| |
| # ořez primárního štítku podle columns (heuristika: fixní část ~ 55 sloupců | # ořez popisku a živé činnosti podle columns (heuristika: fixní část ~ 55 |
| # — status + ctx + tok/sparkline/rate + elapsed) | # sloupců — status + ctx + tok/sparkline/rate + elapsed). Popis dispatche má |
| if [ -n "$primary" ] && [ "$columns" -gt 0 ] 2>/dev/null; then | # přednost (odlišuje paralelní agenty téhož typu), činnost bere zbytek. |
| | if [ "$columns" -gt 0 ] 2>/dev/null; then |
| budget=$(( columns - 55 )); [ "$budget" -lt 12 ] && budget=12 | budget=$(( columns - 55 )); [ "$budget" -lt 12 ] && budget=12 |
| if [ "${#primary}" -gt "$budget" ]; then primary="${primary:0:$((budget-1))}…"; fi | if [ -n "$activity" ]; then |
| | pbudget=$(( budget * 2 / 5 )); [ "$pbudget" -lt 10 ] && pbudget=10 |
| | else |
| | pbudget="$budget" |
| | fi |
| | if [ -n "$primary" ] && [ "${#primary}" -gt "$pbudget" ]; then primary="${primary:0:$((pbudget-1))}…"; fi |
| | if [ -n "$activity" ]; then |
| | abudget=$(( budget - ${#primary} - 3 )); [ "$abudget" -lt 8 ] && abudget=8 |
| | if [ "${#activity}" -gt "$abudget" ]; then activity="${activity:0:$((abudget-1))}…"; fi |
| | fi |
| fi | fi |
| | actseg="" |
| | [ -n "$activity" ] && actseg=$(printf "%b%s%b" "$WHITE" "$activity" "$RESET") |
| |
| # type badge jen když není běžná lokální kategorie | # type badge jen když není běžná lokální kategorie |
| parts+=("$(printf "%b%b%s%b" "$MAGENTA" "$BOLD" "$primary" "$RESET")") | parts+=("$(printf "%b%b%s%b" "$MAGENTA" "$BOLD" "$primary" "$RESET")") |
| fi | fi |
| | [ -n "$actseg" ] && parts+=("$actseg") |
| [ -n "$status" ] && parts+=("$(printf "%b%s%b" "$sc" "$status" "$RESET")") | [ -n "$status" ] && parts+=("$(printf "%b%s%b" "$sc" "$status" "$RESET")") |
| [ -n "$ctxseg" ] && parts+=("$ctxseg") | [ -n "$ctxseg" ] && parts+=("$ctxseg") |
| * Hlavní ''statusLine'' a ''subagentStatusLine'' jsou oddělené. Hlavní řádek zůstává pro top-level session, subagenti se zobrazují v agent panelu. | * Hlavní ''statusLine'' a ''subagentStatusLine'' jsou oddělené. Hlavní řádek zůstává pro top-level session, subagenti se zobrazují v agent panelu. |
| * ''subagentStatusLine'' dostává skutečný model v poli ''model'', ale nedostává ''subagent_type''. Proto ''description'' používá dvoudílný tvar ''<subagent_type> · <short description>''. | * ''subagentStatusLine'' dostává skutečný model v poli ''model'', ale nedostává ''subagent_type''. Proto ''description'' používá dvoudílný tvar ''<subagent_type> · <short description>''. |
| | * V aktuálním Claude Code je ''label'' pro ''local_agent'' živá činnost, ne identita dispatche: odpovídá ''progress.summary || description''. ''AgentSummary'' přibližně každých 30 sekund zapisuje do ''progress.summary'' krátké LLM-generované shrnutí činnosti. Identita se proto vždy čte z ''description'', zatímco ''label'' se vypisuje jen jako samostatný sloupec s činností. |
| * Starší tříčlenné popisky ''<subagent_type> · <model> · <description>'' zůstávají podporované. Prostřední modelový segment se ignoruje ve prospěch hodnoty z ''model''; nově se ale zapisuje dvoudílný tvar. | * Starší tříčlenné popisky ''<subagent_type> · <model> · <description>'' zůstávají podporované. Prostřední modelový segment se ignoruje ve prospěch hodnoty z ''model''; nově se ale zapisuje dvoudílný tvar. |
| * ''contextWindowSize'' spolu s ''tokenCount'' určuje ''ctx'' — procento obsazení context window subagenta. Pod 70 % je zelené, od 70 % žluté a od 90 % červené. ''tokenCount'' je aktuální obsazení okna, ne kumulativní spotřeba. | * ''contextWindowSize'' spolu s ''tokenCount'' určuje ''ctx'' — procento obsazení context window subagenta. Pod 70 % je zelené, od 70 % žluté a od 90 % červené. ''tokenCount'' je aktuální obsazení okna, ne kumulativní spotřeba. |