# Tasks — Layout do TUI estilo OpenCode

## Rastreabilidade
- Orquestração: Precisamos que o layout em si do TUI tenha uma experiência similar à do OpenCode
- Slug: `precisamos-que-o-layout-em-si-do-tui-tenha-uma-experiencia-similar-a-do-opencode`
- Documento: Backlog técnico (tasks)
- Risco: **medium** (`00-risk-classification.md`, fator `external_dependency`)
- Etapa anterior: `03-techspec.md` (aprovado)
- Estado: draft — **Refinement obrigatório (risco medium) antes da Execução**

## Backlog
Tarefas atômicas, verticais e verificáveis, mapeadas às 6 fases da Tech Spec. Cada uma deve compilar e manter `cargo test` verde.

### Fase 1 — Tema base
- **T-01 · Criar `theme.rs` com tokens e detecção de capacidade**
  - Arquivos: `src/tui/theme.rs` (novo), `src/tui/mod.rs` (registrar `pub mod theme;`).
  - Escopo: `struct Theme`, tokens semânticos (primary, on_primary, text_strong, text_muted, success, warning, error, overlay_dim, section_header); `enum ColorDepth`; `fn detect(colorterm, term) -> ColorDepth`; `fn theme(depth) -> Theme` com fallback 16-cores.
  - Ownership: backend/core TUI.
- **T-02 · Helpers de estilo do tema**
  - Arquivos: `src/tui/theme.rs`.
  - Escopo: `selection_bar`, `section_header`, `label_value`, `footer`, `centered_rect`, `overlay_dim`, `figlet_banner` (com versão curta para largura pequena). Funções puras.
  - Depende de: T-01.
- **T-03 · Migrar casco (header/footer) para o tema**
  - Arquivos: `src/tui/ui.rs` (`render_header`, `render_footer`).
  - Escopo: substituir cores literais por tokens; footer = hint à esquerda + rota à direita via helper.
  - Depende de: T-02.

### Fase 2 — Borderless + barra de seleção
- **T-04 · Remover `Borders::ALL` de moldura de conteúdo**
  - Arquivos: `src/tui/ui.rs` (todas as telas).
  - Escopo: trocar molduras por espaçamento/títulos sutis; manter borda só em input e contorno fino de overlay (futuro).
  - Depende de: T-03.
- **T-05 · Barra de seleção full-width nas listas**
  - Arquivos: `src/tui/ui.rs` (`render_list`, `render_board`, `render_provider_list`).
  - Escopo: substituir `highlight_symbol("▸"/"▶")` por faixa full-width no acento primário.
  - Depende de: T-02.

### Fase 3 — Home/launcher
- **T-06 · `render_home` com figlet + comandos + input**
  - Arquivos: `src/tui/ui.rs` (`render_home`), `src/tui/app.rs` (decisão de landing quando sem orquestração ativa).
  - Escopo: banner `figlet_banner`, versão, lista de comandos em colunas (comando·descrição·atalho), input `>`, footer de rota.
  - Depende de: T-02, T-04.

### Fase 4 — Command palette
- **T-07 · `palette.rs`: Command, COMMANDS, filter**
  - Arquivos: `src/tui/palette.rs` (novo), `src/tui/mod.rs`.
  - Escopo: `struct Command`, `const COMMANDS`, `fn filter(commands, query) -> Vec<usize>` (fuzzy por subsequência), `available_in` por comando.
  - Ownership: backend/core TUI.
- **T-08 · Estado `Overlay` + `CommandPalette` em `app.rs`**
  - Arquivos: `src/tui/app.rs`.
  - Escopo: `enum Overlay { None, CommandPalette, Telemetry }`, campo `overlay`, `palette: CommandPalette`, reducers do palette, `text_mode()` true quando palette aberto, interceptação no topo de `update`.
  - Depende de: T-07.
- **T-09 · Bindings e `Action` do palette**
  - Arquivos: `src/tui/event.rs`.
  - Escopo: `Action::OpenPalette`; `Ctrl+K` global, `/` fora de text_mode; reuso de Char/Backspace/Confirm/Up/Down/Back para operar o palette. Sem remover bindings existentes.
  - Depende de: T-08.
- **T-10 · `render_command_palette` (modal flutuante)**
  - Arquivos: `src/tui/ui.rs`.
  - Escopo: `overlay_dim` + modal centralizado (título à esquerda, `esc` à direita, busca, lista filtrada com barra de seleção, atalho por item).
  - Depende de: T-08, T-02.

### Fase 5 — Telemetria sob demanda
- **T-11 · `render_telemetry` + `Action::Telemetry`**
  - Arquivos: `src/tui/ui.rs`, `src/tui/event.rs` (`t`), `src/tui/app.rs` (`Overlay::Telemetry`).
  - Escopo: overlay com uso de tokens, roteamento por etapa, limites, budget (reusa dados existentes).
  - Depende de: T-08.
- **T-12 · Enxugar default denso de board/checkpoint/running**
  - Arquivos: `src/tui/ui.rs` (`render_board`, `render_checkpoint`, `render_running`).
  - Escopo: remover telemetria do default; manter info crítica de decisão (RN-03); hint de descoberta no footer.
  - Depende de: T-11.

### Fase 6 — Seletor agrupado + polimento
- **T-13 · Seletor de provider como modal agrupado**
  - Arquivos: `src/tui/ui.rs` (`render_provider_setup`, `render_provider_list`, `render_provider_picker`).
  - Escopo: agrupar por seção com cabeçalho colorido, tags à direita (auth/budget), marcador no ativo.
  - Depende de: T-04, T-05.
- **T-14 · Observabilidade dos overlays**
  - Arquivos: `src/tui/app.rs` (`SideEffects`), `src/tui/mod.rs` (`process_side_effects`).
  - Escopo: eventos `palette_opened`, `command_executed` (command_id), `telemetry_toggled` em `tui-events.jsonl`.
  - Depende de: T-08, T-11.
- **T-15 · Testes de render dos overlays + guardrail de estética**
  - Arquivos: `src/tui/ui.rs` (tests), CI/grep.
  - Escopo: estender `renders_all_screens_no_panic` para home, palette e telemetria em 40/80/120; checagem de ausência de `Borders::ALL` como moldura padrão (M-1).
  - Depende de: T-06, T-10, T-11.
- **T-16 · Degradação graciosa + `visual-review`**
  - Arquivos: `src/tui/theme.rs`, `src/tui/ui.rs`.
  - Escopo: validar 16-cores e larguras pequenas; revisão visual contra referências do OpenCode (home e seletor).
  - Depende de: T-13, T-15.

## Dependências
```mermaid
flowchart LR
    T01 --> T02 --> T03 --> T04
    T02 --> T05
    T04 --> T06
    T02 --> T06
    T07 --> T08 --> T09
    T08 --> T10
    T02 --> T10
    T08 --> T11 --> T12
    T04 --> T13
    T05 --> T13
    T08 --> T14
    T11 --> T14
    T06 --> T15
    T10 --> T15
    T11 --> T15
    T13 --> T16
    T15 --> T16
```
Paralelizável: o ramo do tema (T-01→T-05) e o ramo do palette (T-07→T-10) são independentes até convergirem em T-15; bons candidatos a Agent Team na Execução.

## Critérios de aceite
Gherkin por tarefa-chave (ver skill `bdd-gherkin`); complementam os critérios do PRD.

```gherkin
Funcionalidade: Tema central e detecção de capacidade (T-01, T-02)

  Cenário: Fallback em terminal de 16 cores
    Dado TERM sem suporte a truecolor e sem COLORTERM
    Quando theme(detect(...)) é resolvido
    Então cada token recebe uma cor válida no espaço de 16 cores
    E nenhuma função de desenho referencia cor literal fora do tema

  Cenário: Detecção de truecolor
    Dado COLORTERM=truecolor
    Quando detect é chamado
    Então retorna ColorDepth::TrueColor
```

```gherkin
Funcionalidade: Borderless e seleção full-width (T-04, T-05)

  Cenário: Sem molduras densas
    Dado qualquer tela renderizada com TestBackend
    Então não há Block com Borders::ALL como moldura de conteúdo
    E o item selecionado em uma lista aparece como barra de largura total no acento primário
```

```gherkin
Funcionalidade: Home/launcher (T-06)

  Cenário: Landing sem orquestração ativa
    Dado que não há orquestração ativa
    Quando a home é renderizada em 80 colunas
    Então vejo o banner figlet, a versão e a lista de comandos em colunas
    E vejo o input iniciado por ">"

  Cenário: Largura pequena
    Dado 40 colunas
    Então o banner usa a versão curta e não há panic
```

```gherkin
Funcionalidade: Command palette (T-07, T-08, T-09, T-10)

  Cenário: Filtro fuzzy
    Dada a lista de comandos e a query "nov"
    Quando filter(comandos, "nov") é chamado
    Então "Nova orquestração" está entre os resultados ordenados

  Cenário: Abrir, selecionar e executar
    Dado que pressiono Ctrl+K em qualquer tela
    Então o overlay abre com o fundo escurecido e a busca focada
    Quando seleciono um comando disponível e pressiono Enter
    Então o palette fecha e a Action correspondente é despachada pelo reducer

  Cenário: Comando indisponível no contexto
    Dado que a etapa atual não tem artefato
    Então "Aprovar checkpoint" aparece desabilitado/oculto
    E não é executável pelo palette
```

```gherkin
Funcionalidade: Telemetria sob demanda (T-11, T-12)

  Cenário: Default minimalista
    Dado o StageBoard renderizado
    Então não há tabela de roteamento, limites ou uso de tokens por padrão
    E a informação crítica de decisão permanece visível

  Cenário: Overlay de telemetria
    Quando aciono "t" ou o comando "Telemetria"
    Então um overlay exibe tokens, roteamento, limites e budget
    E ao fechar volto ao default minimalista
```

```gherkin
Funcionalidade: Sem regressão (T-15)

  Cenário: Testes de render verdes
    Dado as larguras 40, 80 e 120
    Quando executo "cargo test"
    Então todas as telas e overlays renderizam sem panic
    E o fluxo Ideia→Memória e os checkpoints permanecem funcionais
```

## Ordem sugerida
1. **T-01 → T-02 → T-03** (tema base + casco)
2. **T-04, T-05** (borderless + seleção) — paralelizável com início de T-07
3. **T-06** (home)
4. **T-07 → T-08 → T-09 → T-10** (palette)
5. **T-11 → T-12** (telemetria sob demanda)
6. **T-13, T-14** (seletor agrupado + observabilidade)
7. **T-15 → T-16** (testes/guardrail + degradação + visual-review)

Próxima etapa: **Refinement (Etapa 5, obrigatório)** condensando este backlog em plano acionável, com DoD, pontos de observação e flags. **Checkpoint humano após o Refinement.**
