dsh-composer-plus 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.pt-BR.md CHANGED
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
29
29
 
30
30
  Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem gerencia esse perfil é o app.)
31
31
 
32
- > O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.14.0`.
32
+ > O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.16.0`.
33
33
 
34
34
  ## Recursos
35
35
 
@@ -37,7 +37,7 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
37
37
 
38
38
  | Recurso | Como usar | Captura de tela |
39
39
  |---|---|---|
40
- | **Painel de alterações** | <a id="feature-changespanel"></a>Barra lateral direita → `+` → **Alterações**. Escolha **Não confirmadas**, **Não preparadas**, **Preparadas** ou **Branch** para ver os arquivos alterados com as contagens `+/-`; clique em um arquivo para ver o diff dele. **Último turno** abre a revisão do próprio dsh para o turno mais recente. Clique no nome do branch (ou escolha **Árvore**) para ver a árvore de branches: clique em um branch acima dela para ir até ele e em um commit para ver os arquivos e os diffs dele. **Este chat** lista só os arquivos que as ferramentas de arquivo do chat aberto (write, edit) escreveram, em todos os turnos dele, e o diff total desde a primeira mensagem. O botão **␣** oculta as alterações de espaço em branco (`git diff -w`): as linhas que mudaram só na indentação ou nas quebras de linha não aparecem. O menu **…** de um arquivo → **Chats que alteraram este arquivo** lista os chats do mesmo repositório cujas ferramentas de escrita ou edição alteraram esse arquivo, do mais recente ao mais antigo, com o pedido que fez a alteração; um clique abre esse chat nesse pedido. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
40
+ | **Painel de alterações** | <a id="feature-changespanel"></a>Barra lateral direita → `+` → **Alterações**. A página abre em **Árvore**: um mapa de branches do repositório do chat. Três cartões contam os branches: todos, os mesclados e os que aguardam mesclagem. Clique em um cartão para mostrar só esses branches; clique nele de novo para mostrar todos. Cada branch é uma caixa com o último commit dele: verde quando o branch principal tem o trabalho dele, laranja quando não tem, azul para o branch principal. Uma seta vai de cada branch até o branch que o recebeu (✅ **Mesclado**) ou até o branch de onde ele partiu (⏳ **Aguardando**, tracejada). Clique em uma caixa para ver os commits do branch e depois em um commit para ver os arquivos e os diffs dele. Clique em **Mesclado** para ver os arquivos do commit de mesclagem, ou em **Aguardando** para ver os arquivos que o branch traz para o destino dele. Um branch remoto só aparece quando nenhum branch local tem o mesmo nome. No menu de modos, escolha **Não confirmadas**, **Não preparadas**, **Preparadas** ou **Branch** para ver os arquivos alterados com as contagens `+/-`; clique em um arquivo para ver o diff dele. **Último turno** abre a revisão do próprio dsh para o turno mais recente. **Este chat** lista só os arquivos que as ferramentas de arquivo do chat aberto (write, edit) escreveram, em todos os turnos dele, e o diff total desde a primeira mensagem. O botão **␣** oculta as alterações de espaço em branco (`git diff -w`): as linhas que mudaram só na indentação ou nas quebras de linha não aparecem. O menu **…** de um arquivo → **Chats que alteraram este arquivo** lista os chats do mesmo repositório cujas ferramentas de escrita ou edição alteraram esse arquivo, do mais recente ao mais antigo, com o pedido que fez a alteração; um clique abre esse chat nesse pedido. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
41
41
  | **Ideias de recursos** | <a id="feature-featureideas"></a>Barra lateral direita → `+` → **Ideias de recursos** → **Sugerir recursos**. O próprio modelo do chat lê um breve resumo do projeto do chat (arquivos do nível superior, o início do README e do manifesto, um esboço do resto do README, os títulos dos commits recentes) e sugere até 8 recursos, exibidos como uma pilha de cartões no idioma da interface do dsh. Deslize um cartão para a direita (ou clique em **✓**, ou pressione `→`; em todos os casos, o cartão sai voando para aquele lado) para iniciar um novo chat no mesmo projeto: ele começa no modo de plano com a ideia como pedido, então nada muda antes de você aprovar o plano. Para pular o plano, clique em **▶ Criar agora** (ou pressione `↑`; o cartão sai voando para cima): o novo chat começa na hora com a ideia como um pedido comum, e o modelo faz a alteração e executa as verificações (as aprovações valem como de costume). Deslize para a esquerda (ou **✕**, ou `←`) para pular; **Desfazer** (ou `Z`) traz de volta um cartão pulado. Clique em **↓** (ou pressione `↓`) para salvar uma boa ideia para depois: ela vai para a lista **Depois** do projeto, que aparece em todos os chats da mesma pasta de projeto (também depois de reiniciar). **Depois (N)** abre a lista; **Planejar** inicia o mesmo chat no modo de plano para a ideia e **Criar agora** inicia o chat sem plano; os dois a tiram da lista. **Planejar tudo (N)** inicia um único chat no modo de plano para todas as ideias da lista, então as partes em comum são planejadas uma só vez. **Remover da lista** a exclui. **Copiar como lista de tarefas** copia a lista inteira para a área de transferência como uma lista de tarefas em Markdown (`- [ ] Title — Summary`, uma linha por ideia) para um rastreador de issues ou um arquivo TODO; ele não faz nenhuma chamada de rede. **Abrir issue no GitHub** em uma ideia abre uma issue com o título e o resumo dela (e por que ela importa) no repositório do GitHub do projeto, com o seu próprio login do GitHub CLI (`gh`); depois, o link **Issue #N** aparece ao lado da ideia e abre a issue. **Mais ideias** adiciona cartões. Para receber ideias sobre uma única área, digite um **Tema de foco** curto no campo ao lado de **Sugerir recursos** (no máximo 80 caracteres; `Enter` também sugere), ou clique em um dos temas fixos abaixo dele: **Desempenho**, **Acessibilidade**, **Testes**, **Segurança**, **Usabilidade** ou **Documentação** (clique de novo para limpá-lo). O modelo então sugere só recursos sobre esse tema; um campo vazio significa qualquer recurso. Uma ideia não é sugerida duas vezes no mesmo projeto: toda ideia sugerida (pulada, salva ou iniciada) vai para o **Histórico** do projeto, o modelo recebe a instrução de não sugeri-las de novo e um título repetido é descartado. **Histórico** lista as ideias como **Iniciada** ou **Sugerida**; **Esquecer** (ou **Esquecer tudo**) deixa uma delas voltar; uma ideia que ainda está na lista **Depois** fica fora das sugestões até você removê-la de lá. O modelo só é executado quando você clica. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Captura de tela: Ideias de recursos"></a> |
42
42
  | **Pesquisa no conteúdo** | <a id="feature-contentsearch"></a>A pesquisa da própria barra lateral do dsh (a lupa ao lado de **Workspaces**; `Cmd+K` no app desktop, `Cmd+Alt+K` no navegador) também encontra chats pelas palavras das suas mensagens e das respostas, não só pelo título, e mostra o texto correspondente abaixo do chat. O dsh já tem essa pesquisa, mas ela vem desativada; este recurso a ativa com um arquivo de índice de pesquisa no seu computador. O índice é criado na primeira pesquisa depois de iniciar (cerca de 15 s para 250 chats, veja Limites) e fica guardado para as próximas inicializações. Ativado por padrão; uma alteração vale depois que você reinicia o dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Captura de tela: Pesquisa no conteúdo"></a> |
43
43
  | **Reverter turno** | <a id="feature-turnrollback"></a>Passe o mouse sobre uma das suas mensagens e clique em **↶** (ao lado de Copiar). **Apenas o chat** remove essa mensagem e tudo o que vem depois dela (respostas, chamadas de ferramentas) do chat e do contexto do modelo, e coloca a mensagem de volta no editor de mensagens: altere-a e envie de novo. **Chat e arquivos** primeiro lista os arquivos do projeto que mudaram desde essa mensagem e depois também os deixa como estavam, incluindo as alterações feitas por comandos (`bash`), não só pelas ferramentas de edição do dsh. Um turno em execução é interrompido primeiro. O log do chat nunca é reescrito: um marcador oculto esconde a parte removida, do mesmo jeito que o `/compact` do próprio dsh esconde mensagens antigas. Quando o [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) está instalado, ele faz esse trabalho e o Composer Plus não mostra um segundo botão. Depois de uma reversão, uma barra **Refazer** aparece acima do editor de mensagens: ela inicia um novo chat a partir de logo antes da reversão (as mesmas mensagens e o mesmo contexto) e, com **Chat e arquivos**, traz os arquivos de volta. Um arquivo que você alterou depois da reversão aparece na lista e é mantido, a menos que você marque a caixa que o sobrescreve. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Captura de tela: Reverter turno"></a> |
@@ -46,10 +46,12 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
46
46
  | **Histórico de entrada** | <a id="feature-inputhistory"></a>Com o editor de mensagens vazio, pressione `↑` / `↓` para percorrer as mensagens que você enviou, como em um terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Captura de tela: Histórico de entrada"></a> |
47
47
  | **Modo de plano com Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` adiciona `/plan ` no início do rascunho (pressione de novo para remover). Se o chat já estiver no modo de plano, `Shift+Tab` sai dele. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Captura de tela: Modo de plano com Shift+Tab"></a> |
48
48
  | **Manter o foco no editor** | <a id="feature-keepfocus"></a>Depois que você envia um comando `/` ou uma skill, o cursor continua no editor de mensagens e você pode digitar de novo na hora. Isso também funciona com macros de teclado que digitam um comando e pressionam `Enter`. O dsh deixa o editor de mensagens somente leitura enquanto resolve o comando, e o navegador então tira o foco dele. Este recurso devolve o foco, a menos que um menu, uma caixa de diálogo ou outro campo esteja com ele. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Captura de tela: Manter o foco no editor"></a> |
49
+ | **Ajustar o cartão de pergunta à janela** | <a id="feature-questionfit"></a>Quando o agente faz uma pergunta, a pergunta e as respostas rolam juntas no cartão, e **Pular** e **Enviar** continuam visíveis embaixo. O cartão usa a altura da janela (menos 200 px para o cabeçalho do chat e uma faixa do chat), então cresce e diminui com a janela. Sem este recurso, o dsh limita o cartão a 60% da janela (no máximo 520 px) e só as respostas rolam: uma pergunta longa pode empurrar o próprio final, as respostas e os botões para fora do cartão. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Captura de tela: Ajustar o cartão de pergunta à janela"></a> |
49
50
  | **Continuar com um clique** | <a id="feature-continuebutton"></a>Depois de um turno interrompido, com falha ou cortado, o editor de mensagens vazio mostra **▶**. Um clique retoma a partir da conversa existente, sem escrever no campo de entrada e sem adicionar uma mensagem visível ao chat (o modelo recebe uma breve nota oculta “continue de onde parou”, porque alguns provedores, como o Claude, rejeitam uma solicitação que termina com uma resposta do assistente). As mensagens da fila continuam nela: ▶ retoma só a tarefa interrompida e depois a fila é executada. Um turno concluído mantém o botão de enviar normal. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Captura de tela: Continuar com um clique"></a> |
50
51
  | **Retomar após reiniciar** | <a id="feature-resumeafterrestart"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. Se você sair do dsh (ou ele fechar) enquanto um chat está trabalhando, esse chat continua sozinho quando você abre o dsh de novo, com a mesma nota oculta do Continuar com um clique. Se uma rodada de meta (`/goal`) estava em execução, a meta segue com a próxima rodada (o dsh pausa as metas a cada inicialização até você retomá-las). Chats que você interrompeu, que terminaram ou que falharam não continuam. O próprio dsh não tem uma configuração para isso: ele só marca esse turno como interrompido. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Captura de tela: Retomar após reiniciar"></a> |
51
52
  | **Arrastar e soltar na fila** | <a id="feature-queuereorder"></a>As mensagens na fila ganham uma alça (⠿). Arraste para reordenar, ou coloque o foco na alça e pressione `↑` / `↓`. `Esc` cancela. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Captura de tela: Arrastar e soltar na fila"></a> |
52
- | **Editar mensagem na fila no lugar** | <a id="feature-queueedit"></a>Clique duas vezes em uma mensagem na fila. Ela vira a própria caixa de edição do dsh: altere o texto e pressione `Enter` para salvar ou `Esc` para cancelar. A mensagem mantém o lugar dela na fila. Mensagens com imagens ou arquivos não podem ser editadas assim (a fila do dsh só edita texto). | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Captura de tela: Editar mensagem na fila no lugar"></a> |
53
+ | **Editar mensagem na fila no lugar** | <a id="feature-queueedit"></a>Clique duas vezes em uma mensagem na fila, ou clique no botão Editar dela (**Editar mensagem na fila**). Um editor abre na linha: altere o texto, remova uma imagem ou um arquivo com o ✕ dele, ou adicione novos com o clipe (**Adicionar imagens ou arquivos**) ou colando uma imagem. `Enter` salva, `Esc` cancela e `Shift+Enter` adiciona uma linha. A mensagem mantém o lugar dela na fila, e as imagens e arquivos que você mantém não mudam. Enquanto o editor está aberto, a fila não pode ser reordenada. No Tether: menu da mensagem na fila → Edit. | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Captura de tela: Editar mensagem na fila no lugar"></a> |
54
+ | **Prioridade à mensagem enviada após Parar** | <a id="feature-stopsendfirst"></a>Ativado por padrão. Interrompa um chat enquanto há mensagens na fila e depois envie uma mensagem nova: ela é executada na hora, sozinha. As mensagens na fila mantêm a ordem e são executadas depois dela, uma por turno. Sem isso, o dsh coloca a mensagem nova no fim da fila e executa a primeira mensagem da fila no lugar dela, então a nova é executada por último. Uma mensagem enviada enquanto o chat trabalha continua esperando no fim da fila. | <a href="assets/features/stopSendFirst.webp"><img src="assets/features/stopSendFirst.webp" width="160" alt="Captura de tela: Prioridade à mensagem enviada após Parar"></a> |
53
55
  | **Copiar link da sessão** | <a id="feature-copydeeplink"></a>Clique com o botão direito em um chat na barra lateral → **Copiar link da sessão**. Cole o link `dsh-session:…` em outro chat para anexar aquele chat como contexto somente leitura. O dsh 0.2.1 tem o próprio **Copiar ID da sessão**, que copia só o ID simples; este item aparece logo depois dele. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Captura de tela: Copiar link da sessão"></a> |
54
56
  | **Copiar link da mensagem** | <a id="feature-copymessagelink"></a>Passe o mouse sobre uma mensagem e clique em **🔗** (na linha de ações dela; em uma resposta, ao lado do horário). O link é o link da sessão mais o número da mensagem: `dsh-session:…#42`. Cole-o em uma mensagem e envie: no dsh 0.2.1 e posteriores, o link aparece como um chip. Um clique abre aquele chat, rola até a mensagem e a destaca por 2 segundos. Como um link da sessão, ele também anexa aquele chat como contexto somente leitura. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Captura de tela: Copiar link da mensagem"></a> |
55
57
  | **Exportar chat como Markdown** | <a id="feature-exportmarkdown"></a>Clique com o botão direito em um chat na barra lateral (ou abra o menu **…** dele) → **Exportar como Markdown…**. Uma caixa de diálogo mostra quantas mensagens o chat tem; **Copiar para a área de transferência** copia o chat como Markdown, e **Salvar arquivo .md** o salva como `<chat title>.md` pelo download do navegador (no dsh desktop: na sua pasta Downloads ou por uma caixa de diálogo de salvar, conforme a configuração do seu sistema). O arquivo tem o título do chat, o nome do projeto e a data e, depois, uma seção `## Você` ou `## Assistente` para cada mensagem. Os blocos de código ficam como estão; um bloco de código que uma mensagem deixa aberto é fechado. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Captura de tela: Exportar chat como Markdown"></a> |
@@ -57,23 +59,30 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
57
59
  | **Busca de projetos em um novo chat** | <a id="feature-projectpicker"></a>Novo chat → o botão de projeto acima do editor de mensagens. Os projetos aparecem em ordem A–Z, com uma caixa **Buscar projetos** no topo. Digite parte de um nome (sem diferenciar maiúsculas, minúsculas e acentos) e pressione `Enter` para escolher o primeiro resultado. Quando nada corresponde, aparece **Nenhum projeto corresponde**. A ordem de projetos salva do dsh na barra lateral não muda. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Captura de tela: Busca de projetos em um novo chat"></a> |
58
60
  | **Espaço de trabalho padrão para Nova sessão** | <a id="feature-defaultworkspace"></a>Configurações → Composer Plus → **Espaço de trabalho padrão para Nova sessão** → **Abrir Nova sessão em**: escolha um projeto ou **Pasta geral (default-workspace)** (o padrão: a própria pasta do dsh `Documents/deepseek-harness/default-workspace`, criada no primeiro uso). Depois disso, **Nova sessão** no topo da barra lateral (e o atalho dela) sempre abre o novo chat ali, também enquanto um chat de outro projeto está aberto. O `+` ao lado de um projeto continua abrindo esse projeto, e o botão de projeto acima do editor de mensagens do novo chat continua mudando o projeto. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Captura de tela: Espaço de trabalho padrão para Nova sessão"></a> |
59
61
  | **Buscar no chat** | <a id="feature-findinchat"></a>Pressione `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) em um chat: uma caixa de busca se abre sobre ele. Digite uma palavra: todas as ocorrências nas mensagens e respostas na tela ficam destacadas, a atual com uma cor mais forte, e a caixa mostra n / total. `Enter` ou `↓` vai para a próxima ocorrência e `Shift+Enter` ou `↑` para a anterior (os botões de seta também); o chat rola a ocorrência até o meio. Maiúsculas, acentos e o ı sem ponto do turco não fazem diferença. `Esc` fecha a caixa e devolve o cursor para onde ele estava. A busca acompanha o chat enquanto uma resposta chega. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Captura de tela: Buscar no chat"></a> |
60
- | **Um branch por chat** | <a id="feature-worktreechats"></a>Novo chat → o botão ⑂ main ao lado do botão de projeto → **Novo branch**; depois digite a primeira mensagem e envie. A IA dá nome ao branch (`feat/…`, `fix/…`) a partir dessa mensagem, o Composer Plus cria um worktree git para ele em `<project>/.worktrees/`, copia os arquivos ignorados que o `.worktreeinclude` lista (por exemplo `.env` e `node_modules/`) e abre ali um novo chat com a sua mensagem. O cabeçalho do chat aberto mostra ⑂ branch · N alterações · ↑ ↓ (ou **não enviado**); clique nele para abrir **Alterações**. O mesmo menu lista os worktrees abertos: escolha um para iniciar um chat nele. Para ver as pastas dos branches dentro do projeto na barra lateral, escolha no dsh **Opções de exibição** → **Árvore de workspaces**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Captura de tela: Um branch por chat"></a> |
62
+ | **Um branch por chat** | <a id="feature-worktreechats"></a>Na tela de novo chat, o botão de branch (ícone de branch) entre o botão de projeto e o botão de modo mostra **Novo branch** por padrão. Digite a primeira mensagem e envie. Para ficar no branch atual, escolha “Branch atual (main)” no mesmo botão. A primeira mensagem pode levar imagens e arquivos. No modo de plano, o novo chat também começa no modo de plano: envie a mensagem como `/plan <mensagem>` (Shift+Tab) ou coloque antes o Novo chat no modo de plano. A IA dá nome ao branch (`feat/…`, `fix/…`) a partir dessa mensagem, o Composer Plus cria um worktree git para ele em `<project>/.worktrees/`, copia os arquivos ignorados que o `.worktreeinclude` lista (por exemplo `.env` e `node_modules/`) e abre ali um novo chat com a sua mensagem. O cabeçalho do chat aberto mostra ⑂ branch · N alterações · ↑ ↓ (ou **não enviado**); clique nele para abrir **Alterações**. O mesmo menu lista os worktrees abertos: escolha um para iniciar um chat nele. Para ver as pastas dos branches dentro do projeto na barra lateral, escolha no dsh **Opções de exibição** → **Árvore de workspaces**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Captura de tela: Um branch por chat"></a> |
63
+ | **Branches na árvore de workspaces** | <a id="feature-branchtree"></a>Configurações → Composer Plus → **Branches na árvore de workspaces** (desligado por padrão). Cada branch que tem uma pasta de worktree em `<project>/.worktrees/` aparece como um projeto dentro do seu projeto; escolha **Opções de exibição** → **Árvore de workspaces** do dsh para vê-la aninhada. Um branch cuja pasta é apagada sai da lista, e o dsh mostra os chats dele em **Sem grupo**. Quando o agente de um chat na pasta do projeto cria um branch e muda para ele (`git switch -c`, `git checkout -b`) sem alterações não commitadas na pasta, a pasta do projeto volta ao branch anterior, o branch ganha a própria pasta e o chat vai para lá: uma cópia abre no projeto do branch e continua a tarefa, e o chat antigo é arquivado. A lista é verificada ao iniciar, a cada 30 segundos, depois de cada turno e quando você volta à janela. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Captura de tela: Branches na árvore de workspaces"></a> |
61
64
  | **Previsão da próxima mensagem** | <a id="feature-nextprediction"></a>Ativada por padrão; você pode desativá-la em **Configurações → Composer Plus**. Quando o agente termina um turno (não um turno interrompido ou que falhou), o editor de mensagens vazio mostra em cinza um palpite da sua próxima mensagem, com a dica **Tab para aceitar**. `Tab` coloca o texto no editor, mas não o envia. `Esc` esconde o palpite naquele turno. Começar a digitar também o esconde, e um novo turno o substitui. O menu **Modelo** abaixo da chave lista os próprios modelos do dsh (a mesma lista do menu de modelos do dsh). **Padrão do dsh** vem selecionado por padrão e segue o modelo padrão do dsh. Cada turno concluído custa uma chamada curta ao modelo. No Tether, o palpite aparece acima do editor vazio: toque nele para colocá-lo no campo. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Captura de tela: Previsão da próxima mensagem"></a> |
62
65
  | **Completar ao digitar** | <a id="feature-typingcompletion"></a>Desativado por padrão; você pode ativá-lo em **Configurações → Composer Plus**. Enquanto você digita, um texto cinza logo após o cursor mostra como sua mensagem pode continuar. `Tab` adiciona o texto à mensagem, mas não a envia. `Esc` esconde o texto. Ele sugere só as suas próprias próximas palavras: nunca uma resposta para você, nem textos de erro ou nomes inventados. Se a mensagem parecer completa ou o modelo não tiver certeza, nada aparece. Digitar as próximas letras do texto cinza o mantém, sem nova chamada ao modelo. Tem o próprio menu **Modelo** abaixo da sua chave. A primeira opção, **Igual à previsão da próxima mensagem**, usa o modelo da **Previsão da próxima mensagem** (é o padrão); escolha outro modelo para usar um modelo diferente em cada recurso, por exemplo um modelo mais rápido para os complementos. Faz uma chamada ao modelo a cada pausa enquanto você digita, por isso gasta muito mais tokens que a previsão: escolha um modelo rápido e de baixo custo. Não é executado em um comando de barra, em uma mensagem com um chip de arquivo nem quando o cursor não está no final. No Tether, o restante aparece acima do campo enquanto você digita: toque nele para adicioná-lo. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Captura de tela: Completar ao digitar"></a> |
63
66
  | **Melhorar prompt** | <a id="feature-promptimprove"></a>Digite um pedido aproximado e clique na varinha mágica (**Melhorar prompt**) ao lado do menu de modelos. Uma chamada ao modelo o reescreve como um prompt mais claro: primeiro o objetivo, passos numerados curtos quando há várias partes e a verificação a executar. Ele lê este chat (sem as mensagens revertidas), o README, o AGENTS.md e o manifesto do projeto, os arquivos alterados e os arquivos cujos nomes combinam com as suas palavras, e mantém o seu idioma. Ele nunca inventa nomes de arquivo. O novo texto substitui o seu rascunho, mas não é enviado: leia, edite e depois pressione `Enter`. `Cmd/Ctrl+Z` traz seu texto de volta em um passo, e o botão (**Desfazer melhoria**) também. Se você digitar enquanto ele trabalha, o seu novo texto fica. `Esc` ou um segundo clique cancela. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Não funciona em comandos de barra nem em uma mensagem com um chip de arquivo. No Tether, a varinha fica ao lado do campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura de tela: Melhorar prompt"></a> |
64
67
  | **Verificação da meta** | <a id="feature-goalcheck"></a>Comece uma meta com `/goal`. Quando o agente marca a meta como concluída em uma rodada automática, a meta só é fechada depois de duas verificações. Primeiro, o comando de teste do projeto é executado na pasta do chat, no modo sandbox do chat. O comando é o seu próprio ou o encontrado em `package.json`, `Makefile`, `Cargo.toml`, `go.mod` ou pytest. Quando o passo mais recente do próprio agente foi uma execução bem-sucedida desse teste, ele não é executado de novo. Depois, uma chamada independente ao modelo, sem ferramentas, lê a meta, este chat, o `git status` e o resultado do teste. Se uma verificação falhar, a meta continua ativa e o agente lê o motivo; depois, a próxima rodada continua. Uma linha abaixo da barra da meta (**Verificação da meta**) mostra o teste e o último resultado. **Editar** define o seu próprio comando de teste e um limite de tempo ou de tokens; acima do limite, a meta fica bloqueada. **Executar agora** executa a verificação sem fechar a meta. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Quando você mesmo conclui a meta, nada é verificado. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura de tela: Verificação da meta"></a> |
68
+ | **Memória do projeto** | <a id="feature-projectmemory"></a>Desativado por padrão: ative em **Configurações → Composer Plus**. Cada pasta de projeto tem a própria memória, que os chats seguintes desse projeto leem, como o DS Bot guarda uma por Bot. Depois de cada turno concluído, uma chamada ao modelo do chat lê as mensagens novas (não as revertidas), guarda suas preferências, decisões e fatos duradouros como notas curtas, e muda ou remove as antigas. O agente também pode salvar, remover e buscar notas sozinho (`memory_remember`, `memory_forget`, `memory_recall`). Uma nota também pode ser global: todos os projetos a leem. Um chat novo recebe as notas no prompt de sistema; uma nota salva depois aparece a partir do chat seguinte. Os arquivos são Markdown na pasta inicial do dsh (`storages/dsh-composer-plus/memory/`), nunca na pasta do projeto. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura de tela: Memória do projeto"></a> |
65
69
  | **Permitir neste chat** | <a id="feature-allowforchat"></a>Quando a Revisão automática pergunta, o cartão de aprovação ganha **Permitir neste chat**: a mesma ferramenta no mesmo chat passa a ser permitida daí em diante, com quaisquer argumentos, até o fim do limite de tempo (1 hora por padrão; escolha em **Configurações → Composer Plus → Permitir neste chat**). Depois, o agente pergunta de novo. Um chip no cabeçalho lista as autorizações com o horário de término e as revoga. As autorizações continuam valendo depois de reiniciar. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura de tela: Permitir neste chat"></a> |
66
- | **Status do projeto** | <a id="feature-projectstatus"></a>A linha de um projeto na barra lateral mostra o mesmo indicador de em execução / aguardando / concluído dos chats dele, então um projeto recolhido ainda avisa que um chat dentro dele está trabalhando ou precisa de você. Primeiro aparece um chat que está esperando você, depois um chat concluído que você ainda não abriu (o ponto verde, mesmo enquanto outro chat ainda está em execução) e depois o indicador de em execução. Passe o mouse sobre ele para ver os detalhes. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Status do projeto"></a> |
67
- | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral mostra uma pequena etiqueta cinza com o branch do git em que a pasta do projeto do chat estava no último turno do chat (por exemplo `main` ou `feature/login`; um HEAD destacado mostra o ID curto do commit entre parênteses). Dois chats de um mesmo projeto em branches diferentes não parecem mais iguais, e você vê na hora quando está prestes a continuar um chat no branch errado. Passe o mouse sobre a etiqueta para ver o nome completo. A parte Host lê o branch (`git branch --show-current`, somente leitura) quando um turno começa e quando termina; um chat sem turno desde que você instalou isto, ou uma pasta que não é um repositório git, não mostra etiqueta. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura de tela: Branch do Git nas linhas de chat"></a> |
70
+ | **Status do projeto** | <a id="feature-projectstatus"></a>A linha de um projeto na barra lateral mostra o mesmo indicador de em execução / aguardando / concluído dos chats dele, então um projeto recolhido ainda avisa que um chat dentro dele está trabalhando ou precisa de você. Primeiro aparece um chat que está esperando você, depois um chat concluído que você ainda não abriu (o ponto verde, mesmo enquanto outro chat ainda está em execução) e depois o indicador de em execução. Passe o mouse sobre ele para ver os detalhes. Em **Árvore de workspaces**, a linha de uma pasta pai também mostra os chats de cada projeto dentro dela (por exemplo, cada pasta de branch em `.worktrees/`), mesmo quando ela está recolhida. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Status do projeto"></a> |
71
+ | **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral mostra uma pequena etiqueta cinza com o branch do git em que a pasta do projeto do chat estava no último turno do chat (por exemplo `main` ou `feature/login`; um HEAD destacado mostra o ID curto do commit entre parênteses). Dois chats de um mesmo projeto em branches diferentes não parecem mais iguais, e você vê na hora quando está prestes a continuar um chat no branch errado. Passe o mouse sobre a etiqueta para ver o nome completo. A parte Host lê o branch (`git branch --show-current`, somente leitura) quando um turno começa e quando termina; um chat sem turno desde que você instalou isto, ou uma pasta que não é um repositório git, não mostra etiqueta. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura de tela: Branch do Git nas linhas de chat"></a> |
68
72
  | **Marcar tudo como lido** | <a id="feature-markprojectread"></a>Na barra lateral, clique no botão **…** de um projeto → **Marcar tudo como lido**. Todos os chats desse projeto perdem o ponto verde de não lido de uma vez; os outros projetos mantêm os deles. O item fica cinza (**Nenhum chat não lido**) quando o projeto não tem nenhum. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura de tela: Marcar tudo como lido"></a> |
69
73
  | **Projetos ativos primeiro** | <a id="feature-activeprojectsfirst"></a>Quando um chat começa a ser executado ou precisa de você, o projeto dele vai para o topo da barra lateral com a própria animação de linha do dsh (o mesmo movimento de arrastá-lo até lá). Projetos concluídos ficam onde estão; arraste-os para qualquer lugar, como de costume. As movimentações são salvas na ordem de projetos do dsh, então desativar este recurso mantém a ordem atual. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Projetos ativos primeiro"></a> |
70
- | **Filtro de projetos recentes** | <a id="feature-recentprojects"></a>Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Enquanto essa opção está selecionada, a barra lateral mostra só os projetos com um chat ativo nas últimas 2 horas: um chat atualizado nesse período, um chat em execução ou aguardando, o chat aberto, ou um chat concluído que você ainda não abriu (o ponto verde de “concluído” do dsh), mesmo depois das 2 horas. Projetos sem um chat assim ficam ocultos, inclusive os novos e vazios. Selecione a opção de novo para mostrar todos os projetos. A escolha fica salva neste dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura de tela: Filtro de projetos recentes"></a> |
74
+ | **Filtro de projetos recentes** | <a id="feature-recentprojects"></a>Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Enquanto essa opção está selecionada, a barra lateral mostra só os projetos com um chat ativo nas últimas 2 horas: um chat atualizado nesse período, um chat em execução ou aguardando, o chat aberto, ou um chat concluído que você ainda não abriu (o ponto verde de “concluído” do dsh), mesmo depois das 2 horas. Projetos sem um chat assim ficam ocultos, inclusive os novos e vazios. Em **Árvore de workspaces**, uma pasta pai continua visível enquanto um projeto dentro dela estiver ativo, e os chats que não ficaram ativos nas últimas 2 horas também ficam ocultos, então só aparecem os chats recentes. Selecione a opção de novo para mostrar todos os projetos. A escolha fica salva neste dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura de tela: Filtro de projetos recentes"></a> |
71
75
  | **Recolher todos os projetos** | <a id="feature-collapseprojects"></a>Enquanto um projeto estiver aberto na barra lateral, aparece um botão ao lado das opções de exibição (ícone de controles deslizantes). Clique nele para fechar todos os projetos abertos de uma vez, por exemplo 3 projetos abertos de 5. O botão some de novo quando nenhum projeto está aberto. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Captura de tela: Recolher todos os projetos"></a> |
72
76
  | **Ordenar por status** | <a id="feature-statusorder"></a>Barra lateral → opções de exibição → **Ordenar por** → **Por status** (com **Em uma única lista**). Os chats concluídos vêm primeiro (o ponto de “concluído” do dsh, que um turno que terminou com erro também recebe), depois os chats em execução ou aguardando, depois os chats com uma automação ativa (Tarefas de automação) e, por fim, os demais na ordem do dsh. Abrir um chat concluído o move para baixo. Só a exibição muda: selecione **Manual** ou **Última atualização** para voltar. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Captura de tela: Ordenar por status"></a> |
73
77
  | **Notificações em segundo plano** | <a id="feature-notifications"></a>Enquanto o dsh está em segundo plano, você recebe uma notificação quando um turno termina (a primeira linha da resposta) ou quando um chat realmente espera por você: uma aprovação (o nome da ferramenta), uma resposta (a pergunta) ou uma revisão de plano. Um pedido precisa continuar aberto 1,5 s depois, então as aprovações respondidas automaticamente (autorizações da Revisão automática, outros plugins) não geram aviso, e uma notificação é retirada assim que o pedido dela é respondido. O indicador no Dock/barra de tarefas conta os chats que estão aguardando. Clicar na notificação abre esse chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Captura de tela: Notificações em segundo plano"></a> |
78
+ | **Abrir o chat em espera quando ocioso** | <a id="feature-idleswitch"></a>Quando um chat faz uma pergunta ou aguarda uma aprovação ou uma revisão do plano (o ponto laranja) e você não usa o dsh por 30 segundos, o dsh abre esse chat. Quando vários chats aguardam, o que espera há mais tempo abre primeiro; o próximo abre depois de mais 30 segundos sem uso. Uma tecla, um clique, um movimento do mouse, a roda de rolagem ou um toque reiniciam os 30 segundos. Texto no campo com o foco, texto selecionado ou um menu ou caixa de diálogo aberta também impedem a troca. Enquanto um chat em espera está na tela, nada muda. Se você sair de um chat em espera sem responder, ele pode abrir de novo depois dos próximos 30 segundos sem uso. Também funciona com o dsh em segundo plano, mas o dsh não vem para a frente. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Captura de tela: Abrir o chat em espera quando ocioso"></a> |
74
79
  | **Idioma do aplicativo** | <a id="feature-language"></a>Configurações → Composer Plus → **Idioma do aplicativo** muda toda a interface do dsh para Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt ou हिन्दी (veja abaixo). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Captura de tela: Idioma do aplicativo"></a> |
75
80
  | **Conexão móvel (iPhone)** | <a id="feature-mobileconnect"></a>Use o dsh no seu iPhone com o app [Tether](tether/), na mesma rede Wi-Fi ou pelo [Tailscale](https://tailscale.com). Ative em **Configurações → Composer Plus** (o recurso vem desativado por padrão, porque abre uma porta de rede neste Mac). Depois, clique em **Conexão móvel** no canto inferior esquerdo da barra lateral: leia o código QR com a Câmera do iPhone (toque em **Open in Tether**) ou com **Scan code** no Tether, toque em **Connect** e clique em **Approve**. Instale o Tether antes: sem ele, a Câmera não consegue abrir o código. O celular mostra seus chats, envia mensagens (com fotos: o **+** do editor de mensagens → Camera, Photos ou Paste image), responde a aprovações e perguntas, e troca de modelo e de agente. Pareie quantos Macs quiser: o nome do Mac no canto superior esquerdo do app alterna entre eles. O painel **Conexão móvel** lista os iPhones pareados com a última conexão de cada um: **Remove** desconecta um deles na hora. “Tailscale only” recusa a rede local (para um Wi-Fi compartilhado), e o registro de acesso mostra quem tentou se conectar. No Tether, “Settings → Privacy” bloqueia o app com o Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel (iPhone)"></a> |
76
81
  | **Atualizações automáticas** | <a id="feature-autoupdate"></a>Quando o dsh inicia, o plugin verifica a [versão mais recente no GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Se ela for mais nova e já estiver no npm, o plugin instala exatamente essa versão pelo próprio gerenciador de plugins do dsh (o mesmo caminho de Configurações → Plugins) e avisa você. Reinicie o dsh para carregá-la. **Configurações → Composer Plus → Atualizações do Composer Plus** mostra a versão e tem **Verificar atualizações** / **Atualizar agora**. Na primeira vez que o dsh abre com a nova versão, uma janela **Novidades do Composer Plus N** mostra uma vez as notas dessa versão (da mesma verificação de atualizações, sem outra chamada de rede); **Fechar** ou `Esc` a fecha. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura de tela: Atualizações automáticas"></a> |
82
+ | **Backup** | <a id="feature-backup"></a>Configurações → Composer Plus → **Backup** → **Fazer backup agora** grava toda a sua pasta home do dsh (chats, configurações, plugins, MCP, skills) em um único arquivo compactado em `~/Desktop/dsh-backups`, com checksum. Os segredos ficam mascarados no arquivo compactado: arquivos de credenciais, arquivos de chave (`.pem`, `.key`) e os valores token, secret e password das configurações yml ficam só neste computador, no `vault` da pasta. `cache/`, `dsh-runtimes/` e `node_modules` não entram no arquivo compactado (o dsh os cria de novo). Cada backup da lista tem **Verificar** (lê o backup inteiro), **Para outro computador** (uma pasta para copiar para o novo computador, com o console de resgate) e **Excluir**. Os arquivos compactados do dsh-backup na mesma pasta também aparecem e funcionam. Para restaurar, saia do dsh e use o console de resgate. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Captura de tela: Backup"></a> |
83
+ | **Backup automático** | <a id="feature-autobackup"></a>Ative **Backup automático** (desativado por padrão: cada cópia tem mais ou menos o tamanho da sua pasta home do dsh sem o cache). Escolha a frequência (**A cada**: de 6 horas a 7 dias, 24 horas por padrão) e quantos backups ficam guardados (**Manter**: de 3 a 14, 7 por padrão). O horário do próximo backup aparece abaixo da chave; um backup que falhou também aparece ali e é tentado de novo 30 minutos depois. Quando o dsh ou o Composer Plus inicia com uma nova versão, um snapshot é feito logo após o início, antes que a nova versão use seus dados por muito tempo (os dois mais recentes ficam guardados, marcados como **Antes de uma atualização**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Captura de tela: Backup automático"></a> |
84
+ | **Verificação de logs de sessão** | <a id="feature-sessiondoctor"></a>**Verificar logs de sessão** lê o log de cada chat e lista os que o dsh não consegue abrir (um frame quebrado, um registro cortado, um número de sequência errado). Um final incompleto não entra na lista: o próprio dsh o repara. **Reparar a partir dos backups** coloca de volta a cópia do backup mais recente que tenha uma cópia íntegra e mantém o arquivo danificado ao lado dela (`.corrupt-<hora>`). As mensagens escritas depois desse backup não estão na cópia. Um chat aberto neste dsh não é reparado aqui: saia do dsh e repare-o no console de resgate. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Captura de tela: Verificação de logs de sessão"></a> |
85
+ | **Console de resgate** | <a id="feature-rescueconsole"></a>Cada backup também coloca um console de resgate na pasta de backups. Quando o dsh está fechado ou não inicia, abra `Composer Plus Rescue` nessa pasta (macOS: `Composer Plus Rescue.command`): um menu em uma janela de terminal lista, verifica e restaura backups, e verifica e repara logs de sessão. Ele não abre nenhuma porta de rede. Uma restauração pede que você digite `RESTORE`, mantém sua pasta home do dsh atual como `.dsh.pre-restore-<hora>`, coloca de volta os segredos mascarados a partir do vault e traz `cache/`, `dsh-runtimes/` e `node_modules` da pasta antiga. Ele funciona sem o dsh: usa o Node.js ou o próprio app DeepSeek Harness. Em um computador novo, copie a pasta de **Para outro computador** e abra `Composer Plus Rescue` lá. | <a href="assets/features/rescueConsole.webp"><img src="assets/features/rescueConsole.webp" width="160" alt="Captura de tela: Console de resgate"></a> |
77
86
 
78
87
  <!-- END GENERATED FEATURES -->
79
88
 
@@ -117,7 +126,7 @@ Cada pacote tem 3.280 textos: todos os textos da interface do dsh `0.2.0-rc.2` e
117
126
  | `Esc` | editor de mensagens vazio com uma previsão | esconder a previsão |
118
127
  | `Cmd/Ctrl+Z` | editor de mensagens, depois de **Melhorar prompt** | trazer de volta o texto que você digitou |
119
128
  | `Esc` | editor de mensagens, enquanto **Melhorar prompt** trabalha | cancelar a melhoria |
120
- | `Enter` / `Esc` | mensagem na fila em que você clicou duas vezes | salvar / cancelar a edição |
129
+ | `Enter` / `Esc` | editor da mensagem na fila | salvar / cancelar a edição |
121
130
  | `Cmd+F` no Mac, `Ctrl+F` no Windows e no Linux | chat aberto | abrir **Buscar no chat** |
122
131
  | `Enter` / `Shift+Enter`, `↓` / `↑` | caixa do **Buscar no chat** | próxima / anterior ocorrência |
123
132
  | `Esc` | caixa do **Buscar no chat** | fechar a caixa |
@@ -151,6 +160,9 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
151
160
  - **Completar ao digitar:** fica desativado até você ativar. Enquanto está ativado, a cada pausa enquanto você digita, a parte Host envia o texto que você digitou até ali e as suas próprias mensagens do chat e as respostas em texto do agente (sem saída de ferramentas, sem contexto oculto e sem raciocínio), no máximo cerca de 3.000 caracteres do chat, para o modelo escolhido em **Completar ao digitar** (por padrão, o modelo da **Previsão da próxima mensagem**). Uma pausa mais nova interrompe a solicitação anterior. Nada é salvo no chat. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/complete.json` (arquivo só para o dono).
152
161
  - **Melhorar prompt:** nada é executado até você clicar na varinha mágica. Então a parte Host envia o seu rascunho, as suas próprias mensagens do chat e as respostas em texto do agente (sem saída de ferramentas, sem contexto oculto, sem raciocínio e sem mensagens revertidas; no máximo cerca de 6.000 caracteres, a parte mais recente), o mesmo resumo do projeto usado em **Ideias de recursos** (com as mesmas regras de arquivos: sem `.env*` nem arquivos de chave, sem symlink para fora da pasta, sem FIFO), os caminhos que o `git status` lista como alterados e até 30 caminhos rastreados ou não rastreados (não ignorados) cujos nomes têm palavras em comum com o seu rascunho, para o modelo escolhido em **Melhorar prompt** (por padrão, o próprio modelo do chat), como uma única solicitação. Nenhum outro conteúdo de arquivo além desse resumo é enviado. Nada é gravado no chat nem no projeto: a resposta só substitui o seu rascunho no editor de mensagens, e você decide se vai enviá-lo. O modelo escolhido fica em `$DSH_HOME/storages/dsh-composer-plus/improve.json` (arquivo só para o dono).
153
162
  - **Verificação da meta:** só é executada quando o agente marca uma `/goal` como concluída em uma rodada automática (ou quando você clica em **Executar agora**). A parte Host executa o comando de teste na pasta do chat, no modo sandbox do chat (como a própria ferramenta `bash` do dsh: a mesma política de acesso a arquivos; quando esse sandbox não consegue iniciar, o teste não é executado e a verificação falha). Para encontrar o comando, ela lê só `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` e `pytest.ini`, como arquivos comuns dentro da pasta (sem symlink para fora dela, sem FIFO). Depois envia a meta, o chat desde o início da meta (as suas mensagens, as respostas do agente, as chamadas de ferramentas cortadas em 1.000 caracteres e os últimos 2.000 caracteres de cada resultado de ferramenta; sem raciocínio e sem passos revertidos; no máximo cerca de 60.000 caracteres, a parte mais recente), o `git status --short` e o fim da saída do teste para o modelo escolhido em **Verificação da meta** (por padrão, o próprio modelo do chat), como uma única solicitação sem ferramentas. A saída das ferramentas pode conter o que o agente leu, então essa solicitação pode ter partes dos seus arquivos, como o próprio chat. Nada é gravado no chat nem no projeto. O seu comando de teste, os limites, o último resultado (com o fim da saída) e o modelo escolhido ficam em `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (arquivo só para o dono, os 500 chats mais recentes).
163
+ - **Memória do projeto:** desativada até você ativar. Enquanto está ativada, depois de cada turno concluído de um chat de nível superior, a parte Host envia as mensagens novas do próprio chat desde a última revisão (suas mensagens e as respostas de texto do agente; sem saída de ferramentas, sem raciocínio, sem contexto oculto, sem mensagens revertidas; a cópia do chat pai num chat ramificado fica de fora; no máximo cerca de 16.000 caracteres) e as notas salvas para o modelo do próprio chat, como uma única solicitação sem ferramentas. As notas são arquivos Markdown em `$DSH_HOME/storages/dsh-composer-plus/memory/` (arquivos só do proprietário): `projects/<id>/` para cada pasta de projeto (`<id>` é um hash do caminho real da pasta; `project.json` nomeia a pasta), `global/`, `journal.jsonl` (cada mudança com a linha antes e depois) e `reviewed.json` (até onde cada chat foi lido). Nada é escrito na pasta do projeto. Notas que parecem uma chave, um token, uma senha ou um número de documento são recusadas. As notas de um projeto entram no prompt de sistema de cada chat novo nessa pasta, então chegam ao modelo com cada solicitação desse chat. A chave fica em `memory.json`, na mesma pasta.
164
+ - **Backup:** nada sai do seu computador. Os arquivos compactados vão para `~/Desktop/dsh-backups` (arquivos só para o dono). Os segredos não ficam no arquivo compactado: arquivos de credenciais (`.credentials.yaml`, `.env`), arquivos de chave (`.pem`, `.key`, `.p12`, `.pfx`) e os valores das configurações token, secret, password e API key nos arquivos yml são mascarados; as cópias reais ficam em `composer-plus-vault/<archive>/`, na mesma pasta (só para o dono), só neste computador. **Para outro computador** não copia nenhum vault: informe esses segredos de novo lá. Os seus logs de chat, as suas configurações e o resto do dsh home ficam no arquivo compactado como estão: mantenha a pasta privada, como o próprio `$DSH_HOME`. O backup lê os arquivos com `O_NOFOLLOW | O_NONBLOCK`; um symlink é guardado como link (nunca é seguido) e um FIFO ou dispositivo é ignorado. A chave e as opções do backup automático ficam em `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, a chave do console de resgate em `rescue-console.json` e, enquanto o dsh está em execução, `running/host-<pid>.json` identifica cada processo do dsh (o console de resgate os lê para recusar uma restauração).
165
+ - **Console de resgate:** um menu de terminal; ele não abre nenhuma porta de rede. Uma restauração grava só em uma pasta nova ao lado do dsh home (arquivos com `O_EXCL | O_NOFOLLOW`, symlinks por último e nunca seguidos) e recusa um arquivo compactado com um nome inseguro (`..`, um caminho absoluto), um dispositivo ou FIFO, mais de uma pasta de nível superior ou uma entrada abaixo de um link.
154
166
 
155
167
  ## Solução de problemas
156
168
 
@@ -165,11 +177,15 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
165
177
  - **Excluir diz que outro dsh está com este chat aberto:** um segundo dsh no mesmo dsh home está com o bloqueio do chat. Feche essa janela ou esse dsh e exclua de novo. Enquanto isso, o chat continua arquivado.
166
178
  - **Meu iPhone não consegue se conectar depois que ativei "Tailscale only":** o Tailscale precisa estar ativado no Mac e no iPhone. O painel da Conexão móvel avisa quando ele está desativado no Mac. O registro de acesso mostra cada tentativa recusada com o motivo.
167
179
  - **Um chat não continuou depois de reiniciar:** Retomar após reiniciar estava desativado quando o dsh fechou, você mesmo interrompeu aquele turno, o turno já tinha terminado (concluído ou com falha), o chat foi arquivado, ou mais de 20 chats estavam em execução (os 20 mais novos continuam).
180
+ - **A fila está vazia depois de reiniciar:** o próprio dsh esvazia a fila quando fecha. Retomar após reiniciar só a devolve em um chat que continua; nos outros chats, envie as mensagens de novo. Uma mensagem que você removeu logo antes do fechamento pode voltar: remova-a de novo.
168
181
  - **Abrir issue no GitHub diz "gh could not open the issue":** a mensagem é a primeira linha do próprio `gh`. Execute `gh auth status` em um terminal e faça login com `gh auth login`; a pasta do chat precisa ter um remoto do GitHub (`git remote -v`). "not installed or not on the PATH of dsh" significa que o dsh não encontrou o `gh`: instale-o ou inicie o dsh a partir de um terminal em que o `gh` funcione.
169
182
  - **Nenhuma etiqueta de branch em uma linha de chat:** o chat não teve nenhum turno desde que você instalou esta versão, a pasta dele não é um repositório git, ou **Branch do Git nas linhas de chat** está desativado. Depois de uma atualização, reinicie o dsh (a parte Host registra o branch).
170
183
  - **Verificação da meta diz que o teste saiu com o código 127 ou "not found":** o dsh iniciado pelo Finder ou pelo Dock pode ter um PATH mais curto que o do seu terminal, então ele não encontra `npm`, `pnpm` ou `cargo`. Inicie o dsh a partir de um terminal ou defina o seu próprio comando de teste com o caminho completo em **Verificação da meta** → **Editar**. **Executar agora** mostra o resultado na hora.
171
184
  - **A meta não fecha e o agente continua trabalhando:** **Verificação da meta** encontrou um teste com falha ou trabalho faltando; a linha abaixo da meta mostra o motivo (passe o mouse sobre o resultado para ver os detalhes). Corrija a causa ou o comando de teste, ou conclua a meta você mesmo com `/goal` ou com a barra da meta (isso não é verificado).
172
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.14.0`); veja a nota de instalação acima.
185
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.16.0`); veja a nota de instalação acima.
186
+ - **Fazer backup agora diz "Outra ação de backup está em andamento":** uma ação está em execução em outra janela do dsh ou no console de resgate (eles compartilham um arquivo de bloqueio, `.composer-plus.lock`, na pasta de backups). Aguarde até ela terminar. Se nenhuma ação estiver em execução, o próximo clique assume o bloqueio de um processo encerrado.
187
+ - **O console de resgate diz "dsh is running":** feche o dsh primeiro. Se o dsh estiver mesmo fechado, o arquivo citado na mensagem sobrou de uma falha: remova-o e tente de novo.
188
+ - **Depois de uma restauração, o dsh não inicia ou falta um plugin:** os pacotes de plugin de um perfil precisam ser instalados de novo. O console de resgate oferece isso depois de uma restauração; ou execute `pnpm install` em cada pasta de `$DSH_HOME/profiles/` que ele listar. Os segredos que não estavam no vault (outro computador) precisam ser informados de novo: o console os lista.
173
189
 
174
190
  ## Limites
175
191
 
@@ -177,6 +193,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
177
193
  - **Ideias de recursos** guarda os cartões na memória para cada chat até o dsh ou a página recarregar; depois disso, **Sugerir recursos** pergunta ao modelo de novo. Os cartões vêm no idioma que a interface do dsh tem quando você clica; depois que você muda o idioma, os cartões que já estão na pilha mantêm o idioma deles e **Mais ideias** usa o novo. O modelo vê só o breve resumo do projeto, não o código, então uma ideia pode repetir algo que o projeto já tem: pule essa ideia. O novo chat só roda no modo de plano quando o perfil tem o comando `/plan` do dsh; caso contrário, a ideia vai como uma primeira mensagem comum. A lista **Depois** pertence ao caminho da pasta do chat: a mesma pasta aberta por um symlink tem sua própria lista. Ela guarda no máximo 50 ideias por projeto (remova uma para adicionar mais) e cada título só uma vez. Arrastar um cartão só decide entre esquerda e direita; use **↓** para salvá-lo e **▶** para criá-lo agora. Uma repetição é reconhecida só pelo título: o modelo ainda pode sugerir uma ideia anterior com outro nome; pule essa ideia. Quando o modelo responde só com ideias anteriores, nada novo aparece: clique de novo. Um tema de foco estreito torna isso mais provável; use um tema mais amplo ou limpe o tema. O tema de foco fica no campo para cada chat até o dsh ou a página recarregar.
178
194
  - **Exportar chat como Markdown** tem só as suas próprias mensagens e as respostas em texto do assistente: chamadas de ferramentas e a saída delas, raciocínio, imagens (uma linha `[image]` as marca), contexto oculto e mensagens que o Reverter turno ou o dsh-rewind-plugin removeu ficam de fora. As respostas de um turno se juntam em uma única seção. No máximo cerca de 4 milhões de caracteres entram em uma exportação; um chat mais longo recebe a primeira parte e uma nota.
179
195
  - **Retomar após reiniciar** continua o turno; ele não o repete. Uma chamada de ferramenta que estava em execução no momento do fechamento termina com o resultado “desfecho desconhecido” do dsh, e o modelo é instruído a não repetir trabalho já feito, mas um comando que não é seguro executar duas vezes pode ser executado de novo. Subagentes, aprovações e perguntas que estavam abertos não são restaurados: o chat pai continua e pergunta de novo. No máximo 20 chats continuam em uma inicialização.
196
+ - **Retomar após reiniciar** e a fila: o dsh esvazia a fila de um chat quando fecha. O plugin devolve suas mensagens da fila a partir do registro do chat, com a ordem, as edições, as imagens e os arquivos; elas rodam depois do turno retomado. Só os chats que continuam recebem a fila de volta (chave ligada e fechamento durante o turno). O dsh registra do mesmo jeito quando você mesmo remove as últimas mensagens da fila: se você as remover e o dsh fechar antes de o próximo passo começar, elas voltam.
180
197
 
181
198
  - **Pesquisa no conteúdo** é a pesquisa do próprio dsh, então tem os limites do dsh. Ela só pesquisa mensagens do usuário e do assistente: não a saída das ferramentas (comandos, conteúdo de arquivos, resultados), não o raciocínio, e não tem filtro para mensagens do usuário, do assistente ou de ferramentas. Ela encontra palavras inteiras, não partes de uma palavra (`deploy` não encontra `deployment`); letras com acento correspondem às mesmas letras sem acento (`seker` encontra `şeker`). Uma linha por chat, com o trecho de 240 caracteres do dsh, no máximo 20 linhas.
182
199
  - Custo da **Pesquisa no conteúdo**, medido em uma cópia de 247 logs de chat reais (159 MB, dsh 0.2.1-rc.2, Apple Silicon, 32 GB): a primeira pesquisa depois de iniciar cria o índice em cerca de 15 s. Durante esse tempo, o Host do dsh não responde a nada por cerca de 7 s, então os outros chats param de transmitir nesse momento (a página em si não trava). A memória do Host cresce cerca de 1,1 GB no pico; um minuto depois, ela ainda fica cerca de 0,5–0,6 GB acima do início, até o dsh fechar. O arquivo de índice tem cerca de 165 MB. As pesquisas seguintes levam cerca de 0,5 s. Depois de reiniciar, a primeira pesquisa leva cerca de 1 s (só os chats novos ou alterados são adicionados) e adiciona cerca de 70 MB. Desative o recurso se o seu computador tiver pouca memória.
@@ -187,19 +204,25 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
187
204
  - O dsh 0.2.1 carrega uma atualização imediatamente quando a nova versão não muda nenhuma configuração do dsh; caso contrário, e no dsh 0.2.0, reinicie o dsh para carregá-la. O plugin nunca reinicia o dsh por você. Perfis web/CLI sem o gerenciador de plugins do dsh só avisam que há uma nova versão.
188
205
  - **Permitir neste chat** conta o limite de tempo a partir do momento da autorização. Um novo limite de tempo vale na hora para as autorizações em vigor, então um limite menor pode encerrá-las na hora. As autorizações da versão 1.12 e anteriores não têm horário: depois da atualização, o agente pergunta mais uma vez sobre essas ferramentas.
189
206
  - **Manter o foco no editor** só devolve o foco depois de um comando `/` ou de uma skill. Enquanto o dsh resolve o comando, o editor de mensagens fica somente leitura por alguns milissegundos, então as teclas pressionadas nesse tempo se perdem. Se o menu `/` do dsh ainda estiver aberto, `Enter` escolhe a linha destacada e não envia.
190
- - **Conexão móvel** só funciona no macOS (ela usa `en0`, `openssl`, `swift` e `dns-sd`). Ela usa as portas fixas 19390 e 19391, então só um dsh em cada Mac pode executá-la por vez (cada Mac é uma entrada na lista de Macs do celular). O celular só recebe notificações enquanto o Tether está aberto ou acabou de ir para segundo plano (não há serviço de push). O app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. "Tailscale only" ainda precisa de um endereço de Wi-Fi ou Ethernet no Mac (o gateway só inicia com um). O registro de acesso é de cada Mac e guarda só as 200 tentativas mais recentes; uma tentativa repetida em até um minuto soma um na mesma linha. O bloqueio do app Tether não oculta as prévias das notificações na Tela Bloqueada do iPhone: desative-as nos Ajustes do iOS. Os pontos verdes do Tether seguem o Mac: um chat que você abre no dsh também perde o ponto no celular. Um chat que você abre no Tether perde o ponto só nos celulares. O ponto do próprio dsh no Mac fica até você abrir o chat no Mac.
207
+ - **Ajustar o cartão de pergunta à janela** muda só o cartão de pergunta do dsh, não o cartão de revisão do plano. Ele encontra o cartão pela marcação do dsh (`data-question-key`, `data-question-scroll`); se uma atualização do dsh mudar essa marcação, o cartão aparece como o dsh o desenha. A altura do cartão segue a janela, não o chat: em um chat dentro de um painel lateral estreito, um cartão alto ainda pode passar do topo do chat.
208
+ - **Conexão móvel** só funciona no macOS (ela usa `en0`, `openssl`, `swift` e `dns-sd`). Ela usa as portas fixas 19390 e 19391, então só um dsh em cada Mac pode executá-la por vez (cada Mac é uma entrada na lista de Macs do celular). O celular só recebe notificações enquanto o Tether está aberto ou acabou de ir para segundo plano (não há serviço de push). O Tether só as envia depois que você ativa "Settings → Notifications → Send notifications" no Tether. Essa opção vem desativada por padrão, e o iOS pede a permissão quando você a ativa. O app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. "Tailscale only" ainda precisa de um endereço de Wi-Fi ou Ethernet no Mac (o gateway só inicia com um). O registro de acesso é de cada Mac e guarda só as 200 tentativas mais recentes; uma tentativa repetida em até um minuto soma um na mesma linha. O bloqueio do app Tether não oculta as prévias das notificações na Tela Bloqueada do iPhone: desative-as nos Ajustes do iOS. Os pontos verdes do Tether seguem o Mac: um chat que você abre no dsh também perde o ponto no celular. Um chat que você abre no Tether perde o ponto só nos celulares. O ponto do próprio dsh no Mac fica até você abrir o chat no Mac.
191
209
  - Um link de sessão funciona dentro dos chats; clicar nele não abre o chat. Um link criado com **Copiar link da mensagem** só abre a mensagem no dsh 0.2.1 ou mais recente, e só a partir de uma mensagem em um chat (o dsh 0.2.0 não tem regras de texto do usuário, então ali o link é copiado, mas aparece como texto simples). Uma mensagem que uma reversão removeu, ou que a compactação tirou do histórico que o dsh carrega, não pode ser mostrada: o link avisa isso. Os botões 🔗 se prendem às linhas de mensagem do dsh; se uma atualização do dsh mudar essa marcação, eles não aparecem.
192
210
  - **Marcar tudo como lido** muda os pontos de não lido do próprio dsh por uma parte do dsh que não é uma API pública (a lista `completionUnread` do status de sessão do dsh). Se uma atualização do dsh mudar esse nome, o item não aparece. O item fica no menu "…" do projeto no dsh, que não tem espaço para plugins; se o dsh mudar esse menu, o item também não aparece.
193
- - **Editar mensagem na fila no lugar** abre o editor de fila do próprio dsh, então tem os limites dele: uma mensagem com imagens ou arquivos não pode ser editada, e uma mensagem que começou a ser enviada nesse meio-tempo não é alterada (o dsh mostra o próprio erro).
211
+ - **Editar mensagem na fila no lugar** não altera uma mensagem que começou a ser enviada nesse meio-tempo nem sobrescreve uma mensagem que mudou nesse meio-tempo (por exemplo, no Tether do iPhone): um aviso informa isso. Uma imagem nova precisa de um modelo que aceite imagens (valem os limites de imagem do próprio dsh), e um arquivo novo precisa terminar o upload antes que você possa salvar. Só as suas próprias mensagens na fila podem ser editadas: uma rodada de meta ou uma resposta a uma pergunta na fila, não. Depois de uma atualização do plugin, só as edições de texto funcionam na hora: reinicie o dsh antes de salvar uma mensagem com imagens ou arquivos (a parte Host carrega na inicialização).
194
212
  - **Refazer** nunca altera o chat revertido: ele inicia um novo chat a partir de logo antes da reversão (a bifurcação do próprio dsh, o mesmo contexto do modelo), então o novo chat tem outro id e outro título. Só a reversão mais recente de um chat pode ser refeita, uma vez, e só enquanto nada veio depois dela (uma nova mensagem encerra a oferta). Um arquivo que você alterou depois da reversão é mantido, a menos que você marque a caixa que o sobrescreve. Refazer precisa do snapshot que a reversão guardou (a mesma janela de 50 entradas); uma reversão feita antes desta versão, ou com **Apenas o chat**, só traz de volta as mensagens.
213
+ - O mapa de branches de **Árvore** adivinha para onde vai cada seta, porque o git não guarda em qual branch um branch é mesclado. Um branch mesclado aponta para o branch cujo commit de mesclagem o recebeu primeiro. Um branch que aguarda aponta para o branch mais próximo de onde ele partiu (o branch principal primeiro); quando dois branches partiram do mesmo commit, o mapa pode escolher o errado. Um branch que avançou com um fast-forward não tem commit de mesclagem, então o rótulo **Mesclado** dele não abre nada. O branch principal é o branch padrão de `origin`; se não houver, `main` ou `master`; se também não houver, o branch aberto. O mapa lê os 20.000 commits mais recentes e mostra no máximo 60 branches; em um histórico mais longo, ele avisa que algumas setas podem estar erradas. Um branch mesclado com squash ou rebase (por exemplo, no GitHub) aparece como **Aguardando**: o git não guarda nenhum vínculo com os commits dele.
195
214
  - **Este chat** conta só os arquivos que as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`) gravaram. Arquivos que um comando (`bash`) alterou não estão nesta visão; eles aparecem em **Não confirmadas**. Sem um snapshot de Reverter turno do chat (Reverter turno desativado, dsh-rewind-plugin instalado ou um chat mais antigo que o plugin), a visão compara com o último commit e avisa isso. Reverter turno guarda os 50 snapshots mais recentes de um chat: num chat mais longo, a visão compara com o mais antigo guardado, informa a partir de qual mensagem e não conta as alterações anteriores. **Ocultar alterações de espaço em branco** é `git diff -w`: uma linha que mudou só nos espaços dentro dela também fica oculta.
196
215
  - **Abrir issue no GitHub** precisa do GitHub CLI (`gh`) no PATH do dsh e de um remoto do GitHub na pasta do chat. Ele roda no máximo 60 s; se o `gh` demorar mais, a issue pode existir no GitHub sem o link dela na lista (antes de clicar de novo, olhe no GitHub: a lista só lê o link de uma execução concluída, então um novo clique pode abrir uma segunda issue). Uma pasta com mais de um remoto do GitHub usa o padrão do próprio `gh` (`gh repo set-default`).
197
216
  - **Chats que alteraram este arquivo** só conhece as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`), como **Este chat**: uma alteração feita por um comando (`bash`) não aparece na lista. Ele lê os 300 chats mais recentes do repositório (pela data de criação) e avisa quando há mais; mostra no máximo 100 linhas. Um arquivo renomeado aparece com o nome que a ferramenta escreveu. Um chat cuja pasta fica fora do repositório (também por outro caminho para os mesmos arquivos) não é contado. A primeira abertura depois de iniciar o dsh lê todos os registros de chat do repositório (cerca de 4 s para 275 chats); as aberturas seguintes leem só os chats que mudaram desde então.
198
- - **Branch do Git nas linhas de chat** mostra o branch da pasta do chat quando o último turno dele começou ou terminou, não o branch atual: uma troca de branch fora de um turno aparece depois do próximo turno. Chats de antes desta versão não mostram etiqueta até o próximo turno. A etiqueta fica na marcação das linhas de chat do dsh (o dsh não tem um espaço ali); se uma atualização do dsh mudar essa marcação, nenhuma etiqueta aparece.
217
+ - **Branch do Git nas linhas de chat** mostra o branch da pasta do chat quando o último turno dele começou ou terminou, não o branch atual: uma troca de branch fora de um turno aparece depois do próximo turno. Chats de antes desta versão não mostram etiqueta até o próximo turno. A etiqueta fica na marcação das linhas de chat do dsh (o dsh não tem um espaço ali); se uma atualização do dsh mudar essa marcação, nenhuma etiqueta aparece. Se a linha de projeto acima do chat tem o mesmo nome do branch (por exemplo, uma pasta de “Um branch por chat”), a linha do chat não mostra a etiqueta, mas “Em uma única lista” ainda a mostra.
218
+ - **Um branch por chat** no modo de plano: o dsh envia `/plan <mensagem>` como comando, não como mensagem, então o Composer Plus intercepta o envio do comando no editor de mensagens do dsh (não é uma API pública). Se uma atualização do dsh mudar isso, `/plan <mensagem>` com **Novo branch** escolhido roda no Novo chat aberto como comando do próprio dsh. Quando o Host não consegue ativar o modo de plano no novo chat, a pasta do branch fica e a mensagem não é enviada, então o novo chat não altera arquivos no modo padrão.
219
+ - **Um branch por chat**: quando a pasta do branch de um chat (`<project>/.worktrees/<name>`) é excluída, por exemplo quando o próprio agente do chat remove o worktree e exclui o branch, o próximo passo do chat tira o chat dessa pasta. O projeto da pasta do branch sai da barra lateral, e o chat aparece em Sem grupo e continua aberto. No dsh 0.2.1 e posteriores, o chat continua na pasta principal do projeto, e o modelo recebe uma nota sobre a nova pasta. No dsh 0.2.0, o chat mantém a pasta excluída: um comando nela falha até você começar um novo chat. A mudança acontece só no próximo passo do chat, então o projeto de um branch excluído que nenhum chat usa fica na barra lateral: remova-o com o menu de projeto do próprio dsh. Enquanto um chat é movido, **Novo branch** no mesmo repositório responde "tente de novo". Com a chave desligada, o erro do próprio dsh volta a aparecer ("working-directory: directory does not exist").
220
+ - **Branches na árvore de workspaces** escreve no git sem um clique: quando move um chat, volta a pasta do projeto para o branch anterior (`git switch`) e adiciona um worktree (`git worktree add`). Nunca apaga um branch, um worktree ou um arquivo. O dsh não pode mudar a pasta de um chat, então um chat movido é uma cópia (o fork do próprio dsh, com um id novo) e o chat antigo é arquivado. A cópia continua a tarefa parada; uma chamada de ferramenta que rodava quando o branch apareceu termina com uma recusa, e o agente a roda de novo na pasta nova. Um objetivo do chat antigo não vai junto. Só se move um chat cuja pasta é a pasta principal do repositório, e só por um branch que ele criou e para o qual mudou naquele turno (`git switch -c`, `git checkout -b`): um branch feito só com `git branch`, uma pasta com alterações não commitadas, um worktree vinculado ou uma subpasta não movem nada. Na árvore só aparecem worktrees diretamente em `<project>/.worktrees/` com um branch; um worktree desanexado (detached) ou em outro lugar não aparece. A cópia abre sozinha só quando o chat dela era o aberto (o plugin lê isso da linha da barra lateral do dsh); senão, ela está no projeto do branch.
199
221
  - **Buscar no chat** busca só no que a página mostra: as mensagens e respostas carregadas (role para cima ou clique em **Carregar anteriores** para ver as mais antigas), não as etapas de ferramenta fechadas nem o texto recolhido dentro da saída de uma ferramenta. Ele conta no máximo 2.000 ocorrências (depois, "2000+"). Ele usa a API de destaque do navegador (Chromium 105 ou mais recente; o app para desktop tem): em um navegador mais antigo, a contagem e os saltos funcionam sem a cor. `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) só o abre enquanto há um chat na tela; em outros lugares, a busca do próprio navegador funciona como antes. No Mac, `Ctrl+F` mantém seu uso do macOS nos campos de texto (o cursor avança um caractere).
222
+ - **Abrir o chat em espera quando ocioso** conhece só o que a janela do dsh vê: o trabalho em outro app não conta, então, com o dsh em segundo plano, ele pode abrir um chat em espera após 30 segundos. Ele não traz o dsh para a frente. Ler sem tocar em uma tecla, clicar ou mover o mouse conta como ocioso. Ele olha só os chats com o ponto laranja do dsh (uma pergunta, uma aprovação ou uma revisão do plano); o pedido de um subagente aparece no chat principal dele. Enquanto um chat em espera está na tela, nenhum outro abre; um chat que você deixou sem responder pode abrir de novo depois dos próximos 30 segundos sem uso. Os 30 segundos não podem ser alterados.
200
223
  - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
201
224
  - Os projetos ativos são movidos com a ordem de projetos salva do dsh, então a nova ordem continua depois de reiniciar. Chats fora de qualquer projeto ("Sem grupo") não podem ser movidos; o dsh sempre os lista por último.
202
- - O dsh não tem um ponto de extensão no menu de opções de exibição da barra lateral, então a opção de projetos recentes é adicionada ao próprio menu do dsh. Se uma atualização do dsh mudar esse menu, a opção não aparece e todos os projetos continuam visíveis. O filtro funciona nas linhas de projeto, então **Em uma única lista** não é filtrada. Use o filtro com **Workspace**: em **Árvore de workspaces**, uma pasta pai oculta também esconde os projetos ativos dentro dela. **Por status** tem o mesmo tipo de limite: o dsh não tem um espaço para ordenação, então o item e a ordem das linhas se prendem à marcação do menu e da lista do dsh.
225
+ - O dsh não tem um ponto de extensão no menu de opções de exibição da barra lateral, então a opção de projetos recentes é adicionada ao próprio menu do dsh. Se uma atualização do dsh mudar esse menu, a opção não aparece e todos os projetos continuam visíveis. O filtro funciona nas linhas de projeto, então **Em uma única lista** não é filtrada. Em **Árvore de workspaces**, uma pasta pai continua visível enquanto um projeto dentro dela está ativo, e as linhas de chat que não estiveram ativas nas últimas 2 horas também ficam ocultas; em **Workspace**, só as linhas de projeto são filtradas. O filtro lê qual visualização o dsh mostra a partir da configuração de visualização que o dsh salva (não é uma API pública); se uma atualização do dsh mudar esse nome, **Árvore de workspaces** é filtrada como **Workspace**. O recurso Status do projeto lê a mesma configuração: em **Árvore de workspaces**, a linha de uma pasta pai também conta os chats dos projetos dentro dela; se o dsh mudar o nome da configuração, cada linha mostra só os próprios chats. **Por status** tem o mesmo tipo de limite: o dsh não tem um espaço para ordenação, então o item e a ordem das linhas se prendem à marcação do menu e da lista do dsh.
203
226
  - O dsh também não tem um menu de linha de projeto nem um espaço no cabeçalho de Workspaces. **Copiar caminho** encontra a linha do projeto pela marcação de linha do dsh, e **Recolher todos os projetos** entra no cabeçalho do dsh e fecha cada projeto aberto com o mesmo clique da linha do projeto. Se uma atualização do dsh mudar essa marcação, o clique com o botão direito mostra o menu do navegador e o botão não aparece.
204
227
  - O dsh também não tem um ponto de extensão no menu de projetos de um novo chat, então a caixa **Buscar projetos** e a ordem A–Z se prendem à marcação do menu do dsh. Se uma atualização do dsh mudar essa marcação, o menu aparece como o dsh o desenha: na ordem salva e sem a caixa. A ordem A–Z é só uma visualização: ela não muda a ordem de projetos salva do dsh.
205
228
  - O dsh também não tem um ponto de extensão que escolha onde **Nova sessão** abre. **Espaço de trabalho padrão para Nova sessão** envolve um método do dsh que não é uma API pública (`startSession` do serviço de espaços de trabalho do dsh). Se uma atualização do dsh renomeá-lo, **Nova sessão** abre onde o dsh escolher (o projeto aberto ou o mais recente). Toda chamada que não indica um projeto usa o padrão: o botão da barra lateral, seu atalho, o logotipo e também **Nova** na página **Tarefas de automação**. O dsh ainda abre o último chat ao iniciar. A pasta geral é criada e adicionada aos seus projetos no primeiro uso; no Windows ou Linux com a pasta Documents movida, ela pode ser diferente da pasta do próprio dsh.
@@ -207,6 +230,12 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
207
230
  - **Completar ao digitar** mostra o texto pela própria dica do editor de mensagens do dsh (o estilo `--dsh-composer-hint` que o dsh usa para a dica de argumento de um comando de barra). Ele não é executado em um comando de barra, em uma mensagem com um chip de arquivo ou de símbolo nem quando o cursor não está no final da mensagem. Se uma atualização do dsh mudar esse estilo, nenhum complemento aparece. Cada pausa enquanto você digita custa uma chamada ao modelo.
208
231
  - **Melhorar prompt** vê só um resumo curto do projeto, os caminhos alterados e os caminhos cujos nomes combinam com as suas palavras: não o código em si. Por isso, pode não encontrar o arquivo certo, e só cita caminhos que recebeu. Leia o novo texto antes de enviá-lo. Ele não é executado em um comando de barra nem em uma mensagem com um chip de arquivo ou de símbolo (o novo texto é texto simples, então o chip se perderia), e uma mensagem pode ter no máximo 8.000 caracteres. As imagens continuam anexadas: só o texto muda. Cada clique custa uma chamada ao modelo; um modelo forte pode levar um minuto (`Esc` cancela).
209
232
  - **Verificação da meta** verifica só uma conclusão que o agente faz em uma rodada automática da meta: uma conclusão que você pede no chat, `/goal` e a barra da meta não são verificados. O agente pode alterar os testes ou os arquivos do comando de teste por conta própria; o verificador lê o chat e pode ver isso, mas pode errar nos dois sentidos (um "não concluída" errado custa mais uma rodada; um "concluída" errado fecha a meta). O verificador vê o chat e o `git status`, não o código em si. Uma execução de teste só é reaproveitada quando o passo mais recente do agente que pode alterar arquivos foi a sua própria execução bem-sucedida de `bash` com exatamente o mesmo comando na mesma pasta; um comando com pipe (`| tail`) ou `&&` não é reaproveitado. O orçamento é medido quando um turno termina, então um turno pode ultrapassá-lo. Só contam as chamadas ao modelo do próprio chat (não as dos subagentes dele). `update_goal` espera enquanto a verificação é executada (o teste no máximo 15 minutos, o verificador no máximo 3 minutos). Uma bifurcação recebe um novo id de chat, então começa sem o comando de teste e os limites próprios do chat original. Cada conclusão que chega ao verificador custa uma chamada ao modelo.
233
+ - **Prioridade à mensagem enviada após Parar** só age depois que você interrompe o chat (ou depois de um turno que falhou, ou ao abrir um chat que ainda tem fila): uma mensagem enviada enquanto um turno é executado continua esperando no fim da fila. Ela só passa à frente das suas próprias mensagens na fila: se uma rodada de meta ou uma resposta a uma pergunta espera na fila, a ordem do dsh fica. Ela lê uma parte do dsh que não é uma API pública (se o turno interrompido ainda está terminando); se uma atualização do dsh mudar esse nome, a mensagem só passa à frente depois que esse turno terminar. Chats de subagentes mantêm a ordem do dsh.
234
+ - **Memória do projeto** pertence à primeira pasta do chat (a pasta de projeto do dsh): um chat que muda de pasta com `cd` continua com a memória do primeiro projeto, e a mesma pasta aberta por outro caminho para os mesmos arquivos a compartilha. Um chat congela sua seção de memória quando começa, então uma nota salva depois aparece a partir do chat seguinte (`memory_recall` a encontra na hora). A revisão guarda só o que o modelo decide guardar: pode deixar passar um fato ou guardar um errado; abra os arquivos para conferir e edite ou apague à mão com o dsh fechado. Cada turno concluído com uma mensagem sua custa uma chamada ao modelo; uma chamada com falha lê as mesmas mensagens de novo depois do turno seguinte. Chats de subagentes não são revisados. A ideia e o formato de arquivo vêm do [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); o Composer Plus não usa o código dele e nunca lê nem escreve a memória do próprio DS Bot.
235
+ - **Backup** usa uma única pasta fixa, `~/Desktop/dsh-backups` (o padrão do dsh-backup, para que os arquivos compactados dele continuem utilizáveis); não há opção para outra pasta. Um arquivo compactado tem mais ou menos o tamanho do dsh home sem `cache/` e `dsh-runtimes/` (medido: 1,6 GB de arquivos geraram um arquivo compactado de 830 MB em cerca de 30 s no Apple Silicon; o dsh continuou respondendo). Um arquivo que muda enquanto é lido é guardado como estava quando o backup o abriu, então o log de um chat aberto pode terminar em um registro cortado, que o dsh repara na próxima gravação. O mascaramento encontra um segredo em um arquivo yml pelo nome da chave em uma linha (`token:`, `apiKey:`, …); um segredo em um mapa de fluxo (`{token: x}`), em uma lista sob uma dessas chaves, em um arquivo JSON (por exemplo, a `apiKey` de um servidor MCP em um arquivo `.json`) ou com outro nome fica no arquivo compactado. Os arquivos compactados por tipo do dsh-backup (`dsh-t-…`) não aparecem na lista. **Para outro computador** copia o arquivo compactado (um clone no APFS: sem espaço extra); o vault não vai junto. **Fazer backup agora** não exclui nenhum backup. Um backup automático mantém os backups mais recentes feitos pelo Composer Plus (a opção **Manter** do **Backup automático**) e exclui os backups mais antigos que ele fez; os snapshots de antes de uma atualização são contados à parte (os 2 mais recentes ficam). Os arquivos compactados do dsh-backup nunca são excluídos: remova-os com **Excluir**. Enquanto o dsh-backup ainda estiver instalado, ele conta os arquivos compactados do Composer Plus no próprio limite de cópias mantidas e pode excluí-los.
236
+ - **Restaurar** só funciona no console de resgate, com o dsh fechado: substitui todo o dsh home. O antigo fica ao lado como `.dsh.pre-restore-<time>` até você removê-lo, então o disco precisa de espaço para os dois. Os chats mantêm os caminhos dos projetos: em outro computador, um projeto em outro caminho aparece como ausente até você adicioná-lo de novo. Symlinks que apontam para fora do dsh home (por exemplo, skills vinculadas de outra pasta) voltam como links; os destinos deles precisam existir nesse computador.
237
+ - **Verificação de logs de sessão** lê o log mais recente de cada chat com as próprias regras do dsh sobre o que abre: uma linha que não é JSON ou que está fora de ordem só conta como dano quando um fim de turno vem depois dela (senão o dsh abre o chat sem as linhas a partir dali, então ele não aparece na lista). Ela não confere os eventos de um log com as regras de eventos do próprio dsh, então um log que ela considera íntegro ainda pode não abrir depois de uma atualização do dsh. Um reparo pega a cópia de um backup: as mensagens depois desse backup se perdem nesse chat (o arquivo danificado fica ao lado). Um chat aberto neste dsh não é reparado em Configurações: o dsh o mantém em uso.
238
+ - **Backup automático** só é executado enquanto o dsh está em execução: um backup que venceu com o dsh fechado é executado cerca de 45 s depois da próxima inicialização. O snapshot de uma nova versão é feito depois dessa inicialização, não antes da atualização.
210
239
  - O suporte nativo foi pedido no projeto original: `move` na fila em [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773), um estado de Continuar em [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
211
240
 
212
241
  ## Perguntas frequentes
@@ -235,9 +264,19 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
235
264
 
236
265
  **O agente pode parar de marcar o próprio trabalho como concluído, como nos loops de verificação da loop engineering?** Sim, com **Verificação da meta** (ativada por padrão): comece uma meta com `/goal`. Quando o agente diz que a meta foi concluída, os testes do projeto são executados e uma chamada independente ao modelo confere a meta com o chat; se algum dos dois falhar, a meta continua aberta e o agente lê o motivo. Defina o seu próprio comando de teste, um limite de tempo ou um limite de tokens com **Editar** na linha **Verificação da meta** abaixo da meta.
237
266
 
267
+ **O agente pode lembrar minhas preferências entre chats, como a memória do DS Bot?** Sim, com **Memória do projeto** (desativada por padrão): ative em **Configurações → Composer Plus**. Depois de cada turno, suas preferências e decisões duradouras são guardadas como notas curtas para o projeto do chat, e cada chat novo desse projeto as lê. Peça ao agente para lembrar algo e ele salva na hora.
268
+
269
+ **O dsh consegue fazer backup dos meus chats e configurações, como o dsh-backup?** Sim: **Configurações → Composer Plus → Backup → Fazer backup agora**. Ele grava o mesmo formato de arquivo compactado na mesma pasta (`~/Desktop/dsh-backups`), então os arquivos compactados do dsh-backup também aparecem e podem ser restaurados, e você pode remover o dsh-backup. Ative **Backup automático** para ter backups agendados.
270
+
271
+ **O dsh não inicia mais. Como restauro um backup?** Abra a pasta de backups (`~/Desktop/dsh-backups`) e clique duas vezes em `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Escolha `3) Restore a backup`, selecione um e digite `RESTORE`. Funciona sem o dsh.
272
+
273
+ **Como levo o dsh para um computador novo?** No antigo: **Backup** → **Para outro computador** ao lado de um backup. Copie essa pasta para o computador novo, instale o dsh lá, feche-o, abra `Composer Plus Rescue` na pasta copiada e restaure. Informe as suas chaves de API de novo (elas ficam no computador antigo).
274
+
275
+ **Um chat não abre depois de uma falha. Posso repará-lo?** **Configurações → Composer Plus → Verificação de logs de sessão → Verificar logs de sessão**. Um chat danificado volta do backup mais recente com **Reparar a partir dos backups** (as mensagens depois desse backup se perdem).
276
+
238
277
  **Como reordeno as mensagens na fila do dsh?** Arraste a alça ⠿ de uma mensagem na fila, ou coloque o foco nela e pressione `↑` / `↓`.
239
278
 
240
- **Como corrijo um erro de digitação em uma mensagem na fila?** Dê um clique duplo na mensagem na fila, altere o texto e pressione `Enter` (`Esc` cancela). Ela mantém o lugar na fila.
279
+ **Como corrijo um erro de digitação em uma mensagem na fila?** Dê um clique duplo na mensagem na fila, altere o texto e pressione `Enter` (`Esc` cancela). Ela mantém o lugar na fila. Ali você também pode remover as imagens e os arquivos dela, ou adicionar novos.
241
280
 
242
281
  **Como limpo de uma vez todos os pontos de não lido de um projeto?** Barra lateral → botão **…** do projeto → **Marcar tudo como lido**.
243
282
 
@@ -265,13 +304,17 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
265
304
 
266
305
  **Como recebo notificações do macOS / Windows quando uma tarefa do dsh termina ou precisa de aprovação?** Mantenha **Notificações em segundo plano** ativado (padrão) e permita notificações para o DeepSeek Harness nas configurações do sistema operacional.
267
306
 
307
+ **O dsh pode abrir sozinho o chat que me faz uma pergunta?** Sim, com **Abrir o chat em espera quando ocioso** (ativado por padrão): quando um chat aguarda uma resposta, uma aprovação ou uma revisão do plano e você não usa o dsh por 30 segundos, o dsh o abre. Enquanto você digita, rola a tela ou move o mouse, ele espera.
308
+
268
309
  **Como mudo a interface do DeepSeek Harness para turco, espanhol, japonês…?** Configurações → Composer Plus → **Idioma do aplicativo**.
269
310
 
270
311
  **Como uso o dsh no meu iPhone?** Compile o app Tether a partir de `tether/ios` (Xcode), ative **Configurações → Composer Plus → Conexão móvel (iPhone)**, clique em **Conexão móvel** no canto inferior esquerdo, leia o código QR (com a Câmera do iPhone ou com **Scan code** no Tether), toque em **Connect** e clique em **Approve**. Longe de casa, use o Tailscale nos dois aparelhos.
271
312
 
272
313
  **Como faço Nova sessão abrir sempre no mesmo projeto?** Configurações → Composer Plus → **Espaço de trabalho padrão para Nova sessão** → **Abrir Nova sessão em** → escolha o projeto. O `+` ao lado de outro projeto continua abrindo esse projeto.
273
314
 
274
- **Como trabalho em vários recursos de um projeto ao mesmo tempo, cada um no seu próprio branch?** Com **Um branch por chat**: novo chat → o botão ⑂ main → **Novo branch**, depois envie a primeira mensagem. Cada chat ganha o próprio branch e a própria pasta de worktree, com o seu `.env` e o seu `node_modules` quando o `.worktreeinclude` os lista. O cabeçalho do chat mostra em qual branch você está.
315
+ **Como trabalho em vários recursos de um projeto ao mesmo tempo, cada um no seu próprio branch?** Com **Um branch por chat**: na tela de novo chat, o botão de branch mostra **Novo branch** por padrão: envie a primeira mensagem. Cada chat ganha o próprio branch e a própria pasta de worktree, com o seu `.env` e o seu `node_modules` quando o `.worktreeinclude` os lista. O cabeçalho do chat mostra em qual branch você está.
316
+
317
+ **A barra lateral pode mostrar cada branch de um projeto e mover meu chat quando o agente cria um branch?** Sim, com **Branches na árvore de workspaces** (desligado por padrão): ligue em Configurações → Composer Plus e escolha **Opções de exibição** → **Árvore de workspaces** do dsh. Cada branch com um worktree em `<project>/.worktrees/` aparece dentro do seu projeto. Quando você pede ao agente da pasta do projeto que crie um branch e trabalhe nele, e a pasta não tem alterações não commitadas, o chat vai sozinho para o branch. Apague a pasta do branch e ele sai da lista; os chats dele vão para **Sem grupo**.
275
318
 
276
319
  **Posso enviar uma foto do meu iPhone?** Sim. Em um chat do Tether, toque em **+** ao lado do campo de mensagem → Camera, Photos (até 4) ou Paste image. As fotos vão para o chat no Mac como anexos da sua mensagem, então o modelo as vê.
277
320
 
@@ -287,6 +330,7 @@ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh
287
330
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
288
331
  # recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
289
332
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
333
+ PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
290
334
  # Order by status (fake model + Schedule): real-app test + its thumbnail
291
335
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
292
336
  # every Settings feature row shows a loading screenshot and a ? link to its README row
@@ -297,10 +341,14 @@ PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/
297
341
  PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
298
342
  # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
299
343
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
344
+ # Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
345
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
300
346
  # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
301
347
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
302
348
  # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
303
349
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
350
+ # Resume after restart with a queue (fake model, real quit and start): text, image, file, a drag and an edit come back in order
351
+ PLAYWRIGHT=/path/to/playwright node test/browser-resume-queue.mjs /path/to/dsh/lib/bin.js
304
352
  # Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list, a focus topic chip, Copy as checklist + its thumbnail
305
353
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
306
354
  # Export chat as Markdown (fake model, made-up project): right-click → Export as Markdown…, copy and save keep the code blocks, switch off + its thumbnail
@@ -315,8 +363,10 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path
315
363
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
316
364
  # Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
317
365
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
318
- # Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
366
+ # Changes Tree (fake model, made-up git history): the branch map (counts, colors, arrows), a branch's commits, commit files and diffs, Merged and Waiting files, back marks the box + its thumbnail
319
367
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
368
+ # Branches in the workspace tree (fake model, made-up git project): a worktree becomes a project, the agent's new branch moves the chat, a deleted folder leaves the tree + its thumbnail
369
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-branch-tree.mjs /path/to/dsh/lib/bin.js
320
370
  # Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
321
371
  PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
322
372
  # Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
@@ -327,6 +377,9 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path
327
377
  # Queue drag-and-drop and Continue with a queued message (slow fake model)
328
378
  PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
329
379
  PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
380
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
381
+ # Edit queued message in place with images and files (slow fake model) + its thumbnail
382
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
330
383
  ```
331
384
 
332
385
  ```sh