Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions .specs/features/computer-terminal/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -386,11 +386,11 @@ Nenhuma. Q1–Q13 foram respondidas em 29/10 (D12–D24). Q8, Q9, Q10, Q11 e Q13
| CMP-02 | P0 | CMP-T1 | Verified — termlib 0.3.14/fork e cbssh 0.6.6; 126 componentes com POMs/hashes/licenças e 4/4 catracas; build/lint, 2.709 JVM e 20 instrumentados verdes; limites e riscos na [lição](../../project/licoes/2026-10-30-computador-a.md) |
| CMP-03 | P0 | CMP-T1, CMP-T3 | Verified — JNI do CI com SHA fixado; 3 ABIs no APK, ELF/ZIP 16 KB e hashes conferidos, 6/6 catracas; [lição](../../project/licoes/2026-10-30-computador-a.md) |
| CMP-04 | P0 | CMP-T4 | Verified (2026-10-30) |
| CMP-05 | P1-A | CMP-T5, CMP-T11, CMP-T15 | Parcial — modelo/codec (CMP-T5) verificados; faltam T11 e T15 |
| CMP-05 | P1-A | CMP-T5, CMP-T11, CMP-T15 | Parcial — modelo/codec (T5), persistência (T11) e gravação pelo modal (`EdicaoDeHost`, T15) verificados; faltam a aba ligada na tela (T17) |
| CMP-06 | P1-A | CMP-T5, CMP-T11 | Parcial — migração pura (CMP-T5) verificada; falta T11 |
| CMP-07 | P1-A | CMP-T11, CMP-T15 | Pending |
| CMP-08 | P1-A | CMP-T9, CMP-T15 | Pending |
| CMP-09 | P1-A | CMP-T5, CMP-T15 | Parcial — regra `podeMarcar` (CMP-T5) verificada; falta T15 |
| CMP-07 | P1-A | CMP-T11, CMP-T15 | Verificada (T11 e T15: exclusão com confirmação, aviso de nova impressão ao mudar endereço/porta) |
| CMP-08 | P1-A | CMP-T9, CMP-T15 | Verificada (T9 + `TestadorDeConexao` contra o `SshFixtureServer`; modal mostra impressão, método e latência; sem `delay`) |
| CMP-09 | P1-A | CMP-T5, CMP-T15 | Revisão #96: disponibilidade real de credencial, chave vazia recusada e segredo confirmado antes da permissão (`RegraAgenteTest`, `ValidadorHostTest`, `GravadorDeHostsTest`); aviso/confirmar mantidos. Novos instrumentados compilados e pendentes por ANR do SystemUI |
| CMP-10 | P1-B | CMP-T7, CMP-T8, CMP-T16 | Parcial — geração no Keystore/envelope (CMP-T8) implementada; falta T16 |
| CMP-11 | P1-B | CMP-T2, CMP-T8, CMP-T16 | Parcial — sonda e envelope (CMP-T8); falta T2 e T16 |
| CMP-12 | P1-B | CMP-T7, CMP-T16 | Parcial — importação (CMP-T7) verificada; falta T16 |
Expand All @@ -404,20 +404,20 @@ Nenhuma. Q1–Q13 foram respondidas em 29/10 (D12–D24). Q8, Q9, Q10, Q11 e Q13
| CMP-20 | P1-C | CMP-T9, CMP-T16 | Pending |
| CMP-21 | P1-C | CMP-T9, CMP-T16 | Pending |
| CMP-22 | P1-C | CMP-T10, CMP-T20 | Parcial — reconexão, backoff, biometria e buffer (CMP-T10) verificados; falta a tela |
| CMP-23 | P1-C | CMP-T9, CMP-T13 | Pending |
| CMP-24 | P1-D | CMP-T13, CMP-T17 | Pending |
| CMP-25 | P1-D | CMP-T13 | Pending |
| CMP-26 | P1-D | CMP-T14 | Pending |
| CMP-27 | P1-D | CMP-T14 | Pending |
| CMP-28 | P1-D | CMP-T13 | Pending |
| CMP-29 | P1-D | CMP-T10, CMP-T13 | Parcial — limites 8/3 e ociosidade do agente (CMP-T10) verificados |
| CMP-30 | P1-D | CMP-T13 | Pending |
| CMP-31 | P1-D | CMP-T14, CMP-T17 | Pending |
| CMP-23 | P1-C | CMP-T9, CMP-T13 | Verificada (`window-change` com colunas, linhas e pixels ao girar, `TerminalActivityTest`) |
| CMP-24 | P1-D | CMP-T13, CMP-T17 | Parcial — `TerminalActivity`, abas, barra de estado e Voltar sem fechar sessões verificados (T13); falta a lista de sessões na aba (T17) |
| CMP-25 | P1-D | CMP-T13 | Verificada, salvo mouse (fica para a Fase 2/T27) e tamanho de fonte persistido (termlib sem retorno) |
| CMP-26 | P1-D | CMP-T14 | Mapeamento verificado; revisão #96: FIFO única com texto/IME e `KeyboardOrderingTest` 3/3, mutação revertida. Novos casos de ordem no IME pendentes por ANR do SystemUI antes da instalação |
| CMP-27 | P1-D | CMP-T14 | Verificada com o KeyFlow IME como teclado atual via `InputConnection`; Gboard e toque real: T21 (manual) |
| CMP-28 | P1-D | CMP-T13 | Verificada (colar e ditado com quebra de linha pedem confirmação; `ESC[201~` removido até não sobrar) |
| CMP-29 | P1-D | CMP-T10, CMP-T13 | Verificada (9ª sessão mostra o motivo; `onTrimMemory` não perde o texto) |
| CMP-30 | P1-D | CMP-T13 | Sem `FLAG_SECURE` verificado; fonte JetBrains Mono Nerd mantida pelo Yan. Revisão #96: copyrights e avisos completos dos 14 conjuntos, Nerd Fonts e base, com OFL/MIT/Apache-2.0/CC BY 4.0/Unlicense e aviso Bitstream da origem. Tamanho da fonte ainda não persiste |
| CMP-31 | P1-D | CMP-T14, CMP-T17 | Parcial — alvos de 48 dp e `contentDescription` nas abas e teclas extras, estado por texto (T13/T14); falta T17 |
| CMP-32 | P1-E | CMP-T12, CMP-T20 | Parcial — serviço `specialUse`, notificação só com contagem (CMP-T12) verificados |
| CMP-33 | P1-E | CMP-T12, CMP-T19 | Parcial — manifesto, `property` e checklist da Play (CMP-T12); declaração no Console é [YAN] |
| CMP-34 | P1-E | CMP-T10, CMP-T12 | Parcial — serviço sobe com a 1ª sessão e cai com a última (CMP-T12); falta a tela |
| CMP-35 | P1-F | CMP-T13 | Pending |
| CMP-36 | P1-F | CMP-T10, CMP-T13 | Parcial — buffer só em memória (CMP-T10) verificado; falta o emulador (T13) |
| CMP-35 | P1-F | CMP-T13 | Verificada; revisão #96: números normalizados, C1/S8C1T, C0/DEL, CAN/SUB e limites sem vazamento (`DivergenciasDoParserTest`, fuzz diferencial com o parser C em `ParserLibvtermTest`, mais gravação hostil/fragmentação e `LigacaoEmuladorTest`) |
| CMP-36 | P1-F | CMP-T10, CMP-T13 | Verificada (texto e scrollback só em memória; emulador no registro do processo) |
| CMP-37 | P2-G | CMP-T22 | Pending |
| CMP-38 | P2-G | CMP-T23 | Pending |
| CMP-39 | P2-G | CMP-T23 | Pending |
Expand All @@ -440,7 +440,7 @@ Nenhuma. Q1–Q13 foram respondidas em 29/10 (D12–D24). Q8, Q9, Q10, Q11 e Q13
| CMP-56 | P3-H | CMP-T32, CMP-T35 | Pending |
| CMP-57 | P3-H | CMP-T19, CMP-T33, CMP-T36 | Pending |
| CMP-58 | P3-H | CMP-T31, CMP-T35 | Pending |
| CMP-59 | P2-I | CMP-T15, CMP-T17 | Pending |
| CMP-59 | P2-I | CMP-T15, CMP-T17 | Parcial — seção Hosts pronta (T15), Chaves e Sessões são avisos até T16/T17 |
| CMP-60 | P2-I | CMP-T17 | Pending |
| CMP-61 | P2-I | CMP-T15, CMP-T16, CMP-T33 | Pending |
| CMP-62 | P2-I | CMP-T5, CMP-T31 | Parcial — regra de arquitetura `computador/` (CMP-T5) ativa; falta T31 |
Expand Down
12 changes: 9 additions & 3 deletions .specs/features/computer-terminal/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ para permitir essa verificação sem reescrever a branch; detalhes na [lição](
o `PLAYSTORE_CHECKLIST.md` tem o texto da justificativa; com a opção desligada (padrão) o teste não vê `WakeLock`; com ela ligada, há `PARTIAL_WAKE_LOCK` enquanto a sessão do usuário está aberta e o painel mostra o aviso de bateria. O `ManifestSessoesTest` segue conferindo `specialUse`, a permissão do serviço e a `property`.
- **Tests**: unit + instrumentado. **Gate**: `quick` + `pool instrumentar com.keyflow.computador.app.SessoesServiceTest`. **Commit**: `feat(computador): serviço em primeiro plano para manter as sessões`.

### CMP-T13 — O terminal na tela: `TerminalActivity`, emulador, abas e segurança das sequências — **Status: pendente**
### CMP-T13 — O terminal na tela: `TerminalActivity`, emulador, abas e segurança das sequências — **Status: concluída em 2026-10-31 (ver a lição computador-d: imagens ficam Off até a Fase 2; sem persistir o tamanho da fonte)**
- **What**: `TerminalActivity` (própria, `exported=false`, sem anúncios, `adjustResize`, borda a borda) e `TerminalScreen` (Compose) com o `Terminal` do termlib; `LigacaoEmulador` (bytes do cbssh → `writeInput`; `onKeyboardInput` → `escrever`; `onResize` → `resizeTerminal` com pixels), abas de sessão (`[Terminal 1][Agente 2 ●][+]`), barra de estado da conexão (Conectando… / Reconectando… / Caiu), zoom por pinça, seleção, colar (`pasteText`), links OSC 8 com confirmação;
**segurança**: respostas do emulador limitadas à lista de permitidos (CMP-35), OSC 52 e título tratados, colar com várias linhas pede confirmação sem bracketed paste e remove `ESC[201~`. A activity **não** pede `FLAG_SECURE` e não há opção que ligue (D17); um teste falha se pedir. Fonte com glifos Nerd (D16): licença conferida, OFL aceitável; se não for OFL nem compatível com Apache-2.0, **não entra** e a task registra a monoespaçada do sistema. Scrollback conforme a CMP-T1 (hoje 1 000 linhas no termlib).
- **Where**: `computador/app/{TerminalActivity,LigacaoEmulador,FiltroDeRespostas}.kt`, `ui/terminal/{TerminalScreen,AbasDeSessao,BarraDeEstado}.kt`, fonte em `res/font/` com a licença em `app/licenses/` (ou a monoespaçada do sistema, se a licença não servir); testes `LigacaoEmuladorTest`, `FiltroDeRespostasTest`, `SequenciasHostisTest` (JVM com a gravação "hostil"), `TerminalScreenTest` (instrumentado).
Expand All @@ -241,7 +241,9 @@ para permitir essa verificação sem reescrever a branch; detalhes na [lição](
`Back` sai da activity **sem** fechar as sessões; fechar a aba fecha a sessão; 9ª sessão mostra o motivo; `onTrimMemory` com a activity invisível não perde o scrollback de texto; um teste falha se a activity pedir `FLAG_SECURE`; a fonte embutida tem glifos Nerd e licença OFL ou compatível com Apache-2.0, ou a lição registra a monoespaçada do sistema.
- **Tests**: unit + instrumentado. **Gate**: `quick` + `pool instrumentar com.keyflow.ui.terminal.TerminalScreenTest com.keyflow.computador.app.LigacaoEmuladorTest`. **Commit**: `feat(computador): terminal na tela com abas e proteção contra sequências do servidor`.

### CMP-T14 — Entrada: KeyFlow IME, Gboard, teclado físico, teclas extras e ditado — **Status: pendente**
**Correção da revisão #96 (2026-10-31):** CMP-35 usa tokenização compatível com o parser C fixado, normaliza números, bloqueia S8C1T e filtra respostas C1. Strings são retidas até a decisão; limite de 1 MiB descarta até o final/cancelamento, sem liberar prefixos. Regressões e fuzz contra o libvterm real: 25/25; mutação liberando S8C1T detectada e revertida. Fonte mantida por decisão do Yan, com copyrights e licenças completos em `OFL_JetBrainsMonoNerdFont.txt` (14 conjuntos de glifos e Nerd Fonts/base). Mouse SGR da tela continua pendente em CMP-25/T27.

### CMP-T14 — Entrada: KeyFlow IME, Gboard, teclado físico, teclas extras e ditado — **Status: concluída em 2026-10-31 (Gboard e toque real no KeyFlow IME ficam para a T21 manual)**
- **What**: teclas extras (Esc, Tab, Ctrl e Alt "pegajosos", setas, `|`, `~`, `/`, `-`, F1–F12 numa segunda linha) em Compose acima do teclado; mapeamento de teclado físico (Ctrl+letra, Alt, Home/End, PageUp/Down, F-keys); o campo de entrada do terminal conversa com o **KeyFlow IME** sem duplicar caractere nem deixar composição pendurada
(`TYPE_NULL`; ver "bug do Termius" no Bloco 1 do `DEVELOPMENT-ORDER.md`), e o **ditado da orbe** insere o texto transcrito como entrada (nunca acrescenta Enter; quebra de linha ditada segue a regra de colar do CMP-28).
- **Where**: `ui/terminal/{TeclasExtras,MapaTecladoFisico}.kt`, `computador/app/EntradaDoTerminal.kt`, ajustes mínimos em `ime/KeyFlowKeyboardService.kt` **só se a T1 provar defeito** (registrar `SPEC_DEVIATION`); testes `MapaTecladoFisicoTest`, `TeclasExtrasTest`, `EntradaTerminalImeTest` (instrumentado com o KeyFlow IME).
Expand All @@ -251,9 +253,11 @@ para permitir essa verificação sem reescrever a branch; detalhes na [lição](
com o Gboard (se instalado no emulador) o mesmo resultado; alvos ≥ 48 dp; `contentDescription` em toda tecla extra.
- **Tests**: unit + instrumentado. **Gate**: `quick` + `pool instrumentar com.keyflow.computador.app.EntradaTerminalImeTest`. **Commit**: `feat(computador): teclas extras, teclado físico e ditado no terminal`.

**Correção da revisão #96 (2026-10-31):** teclas mapeadas usam `dispatchKeyboardInput` na mesma FIFO do texto/IME, sem atraso de 40 ms. Os três unitários da fila real passaram; mutação emitindo fora da fila derrubou 3/3 e foi revertida. `EntradaTerminalImeTest` agora inclui Esc+i, Backspace+letra e texto+Enter rápidos. Instrumentados pendentes: a verificação prévia detectou ANR ativo do SystemUI e a execução foi suspensa, sem instalar ou reiniciar para contornar.

### Fase 1D — Telas

### CMP-T15 — Painel Hosts: lista, modal, "Testar conexão" real e "pode ser usado pelo agente" — **Status: pendente**
### CMP-T15 — Painel Hosts: lista, modal, "Testar conexão" real e "pode ser usado pelo agente" — **Status: concluída em 2026-10-31**
- **What**: `ComputadorPanel` reescrito com segmentado **Hosts · Chaves · Sessões** (`ComputadorHosts`): cartões de host (nome, `usuário@host:porta`, tipo de auth, chip "Agente: permitido/não", estado da sessão), "+ Novo host", modal do host (campos, escolha da chave/senha, interruptor "Pode ser usado pelo agente" com o aviso e a confirmação do CMP-09, "Testar conexão" **real** pela T9, impressão digital conhecida, esquecer servidor, excluir com confirmação).
Remove o conteúdo antigo (segmentado SSH/Local, o `delay(600)`, a chave colada num campo). Local **some** da interface. A aba ainda **não** sai do "Em breve" (T17).
- **Where**: `ui/config/{ComputadorPanel,ComputadorHosts,ComputadorHostModal}.kt`, `i18n/{en,es}/Computador.kt`, registro em `TranslationsEn/Es`; testes `ComputadorHostsTest`.
Expand All @@ -263,6 +267,8 @@ para permitir essa verificação sem reescrever a branch; detalhes na [lição](
desligar fecha sessões do agente (fake); excluir host pede confirmação; `TranslationsTest` verde; sem `delay` simulado no código (teste de arquitetura: `ComputadorPanel` não importa `kotlinx.coroutines.delay`).
- **Tests**: instrumentado (Compose + servidor de teste). **Gate**: `quick` + `pool instrumentar com.keyflow.ui.config.ComputadorHostsTest`. **Commit**: `feat(computador): painel de hosts com teste de conexão real`.

**Correção da revisão #96 (2026-10-31):** chave vazia/indisponível é recusada; a regra do agente recebe disponibilidade conferida no cofre/registro. `GravadorDeHosts` confirma o segredo antes de publicar a preferência/permissão e restaura a senha anterior se a configuração falhar. O modal desabilita Chave sem chaves e consulta apenas a existência da senha. Unitários de hosts/codec e traduções verdes, mutação de `lembrarSenha` sem credencial detectada/revertida. Os quatro novos casos de `ComputadorHostsTest` compilaram; execução pendente por ANR prévio do SystemUI.

### CMP-T16 — Painel Chaves e os diálogos de confiança, senha e biometria — **Status: pendente**
- **What**: `ComputadorChaves` (lista com tipo, impressão, proteção — "Protegida pelo hardware do aparelho" / "Protegida pelo Keystore (por software)" / "Guardada cifrada no cofre do aparelho" —, biometria, hosts que usam), "Gerar chave" **pergunta o tipo** (Ed25519 ou ECDSA P-256, D13), "Importar" (arquivo pelo seletor do sistema ou colar; passphrase em diálogo), "Copiar chave pública", ligar/desligar biometria com o aviso da nova digital e a janela de 5 minutos (D14), renomear, excluir;
diálogos `ConfirmarServidor` (Nova: host:porta, algoritmo, `SHA256:…`, botões **Confiar e continuar** / **Cancelar**), `ServidorMudou` (alerta, impressão antiga × nova, **Cancelar** em destaque, **Substituir e continuar** em segundo passo), `PedirSenha`, `CodigoDeVerificacao` (keyboard-interactive) e a mensagem de cada `CausaSsh`.
Expand Down
Loading
Loading