dsh-composer-plus 1.11.3 → 1.13.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
@@ -14,7 +14,7 @@ Recursos práticos no estilo do Codex para a interface desktop e web do [DeepSee
14
14
 
15
15
  <p align="center"><img src="docs/images/hero.webp" width="820" alt="DeepSeek Harness com o Composer Plus: o projeto em execução mostra um indicador de carregamento na barra lateral e o painel de alterações mostra um diff do git"></p>
16
16
 
17
- Plugin não oficial da comunidade. As únicas chamadas de rede são a verificação de atualizações (releases do GitHub e registro do npm); desative **Atualizações automáticas** para que elas não aconteçam ao iniciar. **Ideias de recursos** chama o próprio modelo do seu chat só quando você clica em **Sugerir recursos**. **Previsão da próxima mensagem** (ativada por padrão) chama o modelo escolhido nas Configurações (o padrão do dsh, a menos que você escolha outro) uma vez após cada turno concluído, sem nenhum clique. Desative-a em **Configurações → Composer Plus** para parar essas chamadas. **Completar ao digitar** (desativado por padrão) chama o modelo escolhido para ele (por padrão, o da previsão) a cada pausa enquanto você digita, depois que você o ativa. **Conexão móvel** (desativada por padrão) só aceita conexões do iPhone vindas da sua rede local ou da sua tailnet depois que você a ativa.
17
+ Plugin não oficial da comunidade. As únicas chamadas de rede são a verificação de atualizações (releases do GitHub e registro do npm); desative **Atualizações automáticas** para que elas não aconteçam ao iniciar. **Ideias de recursos** chama o próprio modelo do seu chat só quando você clica em **Sugerir recursos**. **Previsão da próxima mensagem** (ativada por padrão) chama o modelo escolhido nas Configurações (o padrão do dsh, a menos que você escolha outro) uma vez após cada turno concluído, sem nenhum clique. Desative-a em **Configurações → Composer Plus** para parar essas chamadas. **Completar ao digitar** (desativado por padrão) chama o modelo escolhido para ele (por padrão, o da previsão) a cada pausa enquanto você digita, depois que você o ativa. **Melhorar prompt** só chama um modelo quando você clica na varinha mágica dele. **Conexão móvel** (desativada por padrão) só aceita conexões do iPhone vindas da sua rede local ou da sua tailnet depois que você a ativa.
18
18
 
19
19
  ## Instalação
20
20
 
@@ -29,46 +29,54 @@ 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.11.3`.
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.13.0`.
33
33
 
34
34
  ## Recursos
35
35
 
36
+ <!-- BEGIN GENERATED FEATURES: edit docs/features.json, then run npm run build:readme -->
37
+
36
38
  | Recurso | Como usar | Captura de tela |
37
39
  |---|---|---|
38
- | **Painel de alterações** | 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. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
39
- | **Ideias de recursos** | 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, os últimos 15 commits) 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. **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> |
40
- | **Pesquisa no conteúdo** | 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> |
41
- | **Reverter turno** | 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. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Captura de tela: Reverter turno"></a> |
42
- | **Excluir chat** | Barra lateral → menu **…** de um chat (ou clique com o botão direito) → **Excluir…** → **Excluir**. O próprio dsh só consegue arquivar. O chat é interrompido (o turno, as tarefas em segundo plano, os subagentes e os lembretes, como no arquivamento do próprio dsh) e o histórico salvo, com os chats dos subagentes, vai para o Lixo do macOS (em outros sistemas: `$DSH_HOME/trash`). Para recuperá-lo, coloque a pasta de volta e reinicie o dsh: ele aparece na exibição **Somente arquivadas** da barra lateral. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Captura de tela: Excluir chat"></a> |
43
- | **Nome do projeto no compositor** | A linha abaixo do editor de mensagens (turnos, tokens, acertos de cache, contexto) começa com o nome do projeto do chat, para você sempre saber em qual projeto um chat trabalha. É o título de projeto do próprio dsh, ou o nome da pasta quando o projeto não tem título. Passe o mouse sobre ele para ver o caminho completo da pasta. Clique nele para encontrar o chat na barra lateral, na visualização em lista ou por projeto: a barra lateral e o projeto se abrem (inclusive um projeto recolhido e o **Mostrar mais** dele), a lista rola até o chat e o chat pisca por 5 segundos. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Captura de tela: Nome do projeto no compositor"></a> |
44
- | **Histórico de entrada** | 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> |
45
- | **Atalho do modo de plano** | `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: Atalho do modo de plano"></a> |
46
- | **Manter o foco no editor** | 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> |
47
- | **Continuar com um clique** | 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> |
48
- | **Retomar após reiniciar** | 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> |
49
- | **Arrastar e soltar na fila** | 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> |
50
- | **Copiar link da sessão** | 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> |
51
- | **Exportar chat como Markdown** | 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> |
52
- | **Copiar caminho do projeto** | Clique com o botão direito em um projeto na barra lateral → **Copiar caminho** copia o caminho completo da pasta dele. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Captura de tela: Copiar caminho do projeto"></a> |
53
- | **Busca de projetos em um novo chat** | 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> |
54
- | **Previsão da próxima mensagem** | 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> |
55
- | **Completar ao digitar** | 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> |
56
- | **Permitir neste chat** | 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. Um chip no cabeçalho lista as autorizações 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> |
57
- | **Status do projeto** | 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> |
58
- | **Projetos ativos primeiro** | 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> |
59
- | **Filtro de projetos recentes** | 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> |
60
- | **Recolher todos os projetos** | 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> |
61
- | **Ordenar por status** | 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> |
62
- | **Notificações em segundo plano** | 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> |
63
- | **11 idiomas extras na interface** | 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: 11 idiomas extras na interface"></a> |
64
- | **Conexão móvel (iPhone)** | 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, 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. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel"></a> |
65
- | **Atualizações automáticas** | 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**. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura de tela: Atualizações automáticas"></a> |
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. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
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, os últimos 15 commits) 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. **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
+ | **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
+ | **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> |
44
+ | **Excluir chat** | <a id="feature-deletechat"></a>Barra lateral → menu **…** de um chat (ou clique com o botão direito) → **Excluir…** → **Excluir**. O próprio dsh só consegue arquivar. O chat é interrompido (o turno, as tarefas em segundo plano, os subagentes e os lembretes, como no arquivamento do próprio dsh) e o histórico salvo, com os chats dos subagentes, vai para o Lixo do macOS (em outros sistemas: `$DSH_HOME/trash`). Para recuperá-lo, coloque a pasta de volta e reinicie o dsh: ele aparece na exibição **Somente arquivadas** da barra lateral. | <a href="assets/features/deleteChat.webp"><img src="assets/features/deleteChat.webp" width="160" alt="Captura de tela: Excluir chat"></a> |
45
+ | **Nome do projeto no compositor** | <a id="feature-projectname"></a>A linha abaixo do editor de mensagens (turnos, tokens, acertos de cache, contexto) começa com o nome do projeto do chat, para você sempre saber em qual projeto um chat trabalha. É o título de projeto do próprio dsh, ou o nome da pasta quando o projeto não tem título. Passe o mouse sobre ele para ver o caminho completo da pasta. Clique nele para encontrar o chat na barra lateral, na visualização em lista ou por projeto: a barra lateral e o projeto se abrem (inclusive um projeto recolhido e o **Mostrar mais N sessões** dele), a lista rola até o chat e o chat pisca por 5 segundos. | <a href="assets/features/projectName.webp"><img src="assets/features/projectName.webp" width="160" alt="Captura de tela: Nome do projeto no compositor"></a> |
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
+ | **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
+ | **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
+ | **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
+ | **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
+ | **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
+ | **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
+ | **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
+ | **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> |
56
+ | **Copiar caminho do projeto** | <a id="feature-copyprojectpath"></a>Clique com o botão direito em um projeto na barra lateral → **Copiar caminho** copia o caminho completo da pasta dele. | <a href="assets/features/copyProjectPath.webp"><img src="assets/features/copyProjectPath.webp" width="160" alt="Captura de tela: Copiar caminho do projeto"></a> |
57
+ | **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
+ | **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> |
59
+ | **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> |
60
+ | **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> |
61
+ | **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> |
62
+ | **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> |
63
+ | **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> |
64
+ | **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> |
65
+ | **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> |
66
+ | **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> |
67
+ | **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> |
68
+ | **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> |
69
+ | **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> |
70
+ | **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, 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> |
71
+ | **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> |
72
+
73
+ <!-- END GENERATED FEATURES -->
66
74
 
67
75
  Botões, dicas, avisos e notificações seguem o idioma selecionado no dsh (veja Idioma do aplicativo abaixo).
68
76
 
69
77
  ## Configurações
70
78
 
71
- Cada recurso pode ser ativado ou desativado separadamente em **Configurações → Composer Plus** do dsh. Cada linha tem uma pequena captura de tela: passe o mouse sobre ela para ver uma prévia maior e clique para abri-la em tamanho real (`Esc` fecha). A caixa **Pesquisar recursos** no topo filtra a página por nome ou descrição (em qualquer idioma, sem diferenciar maiúsculas, minúsculas e acentos); `Esc` limpa a caixa. Cada linha tem uma chave e uma breve descrição; as alterações valem na hora, sem reiniciar, e ficam salvas naquele dispositivo. Tudo vem ativado por padrão, exceto **Conexão móvel**, **Retomar após reiniciar** e **Completar ao digitar**. O Host do dsh guarda as chaves desses três recursos e também de **Pesquisa no conteúdo**, **Reverter turno** e **Previsão da próxima mensagem**, então elas valem para todas as janelas e continuam depois de reiniciar. O Host também guarda o **Modelo** escolhido para a **Previsão da próxima mensagem** e o de **Completar ao digitar** (por padrão **Igual à previsão da próxima mensagem**). **Pesquisa no conteúdo** só muda depois de reiniciar o dsh (o dsh lê essa chave ao iniciar); até lá, a linha dela diz **Reinicie o dsh para aplicar esta alteração.**
79
+ Cada recurso pode ser ativado ou desativado separadamente em **Configurações → Composer Plus** do dsh. Cada linha tem uma pequena captura de tela: passe o mouse sobre ela para ver uma prévia maior e clique para abri-la em tamanho real (`Esc` fecha). A caixa **Pesquisar recursos** no topo filtra a página por nome ou descrição (em qualquer idioma, sem diferenciar maiúsculas, minúsculas e acentos); `Esc` limpa a caixa. Cada linha tem uma chave e uma breve descrição; as alterações valem na hora, sem reiniciar, e ficam salvas naquele dispositivo. O pequeno **?** ao lado do nome de uma linha abre a parte deste README que descreve esse recurso, no README do idioma da interface do dsh. Tudo vem ativado por padrão, exceto **Conexão móvel**, **Retomar após reiniciar** e **Completar ao digitar**. O Host do dsh guarda as chaves desses três recursos e também de **Pesquisa no conteúdo**, **Reverter turno** e **Previsão da próxima mensagem**, então elas valem para todas as janelas e continuam depois de reiniciar. O Host também guarda o **Modelo** escolhido para a **Previsão da próxima mensagem**, o de **Completar ao digitar** (por padrão **Igual à previsão da próxima mensagem**) e o de **Melhorar prompt** (por padrão **Igual ao modelo do chat**). **Pesquisa no conteúdo** só muda depois de reiniciar o dsh (o dsh lê essa chave ao iniciar); até lá, a linha dela diz **Reinicie o dsh para aplicar esta alteração.**
72
80
 
73
81
  <p align="center"><img src="docs/images/settings.webp" width="720" alt="Configurações → Composer Plus: pesquisa de recursos, seletor de idioma, linha de atualização e uma chave para cada recurso, com prévia da captura de tela ao passar o mouse"></p>
74
82
 
@@ -114,22 +122,23 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
114
122
  - **Continuar:** o endpoint local autenticado só retoma o último turno interrompido, rejeita pedidos antigos ou duplicados e mantém os hooks de aprovação existentes. Ele não envia uma nova mensagem do usuário.
115
123
  - **Retomar após reiniciar:** fica desativado até você ativar. A parte Host guarda só os IDs dos chats e os horários de início em `$DSH_HOME/storages/dsh-composer-plus/resume.json` (acesso só para o dono), e nada sai do seu computador. Ela só continua um chat quando o próprio log do dsh indica que foi o dsh (e não você) que interrompeu o último turno. As aprovações e a Revisão automática valem para o turno retomado, como de costume.
116
124
 
117
- - **Painel de alterações:** o git roda somente leitura no seu computador, na própria pasta do chat, pelo canal `/api` autenticado do dsh. Ele nunca faz commit, stage ou fetch, e só mostra caminhos que o próprio git listou.
125
+ - **Painel de alterações:** o git roda somente leitura no seu computador, na própria pasta do chat, pelo canal `/api` autenticado do dsh. Ele nunca faz commit, stage ou fetch, e só mostra caminhos que o próprio git listou. A árvore mostra os 300 commits mais recentes dos branches locais e remotos; ela nunca troca de branch (checkout). Em um repositório muito grande sem arquivo commit-graph, a árvore pode levar alguns segundos para abrir. **Este chat** lê o log do próprio chat para achar os arquivos que as ferramentas de arquivo dele gravaram e os compara com o snapshot de Reverter turno do chat em uma pasta temporária que é excluída na hora; ele não grava nada no seu repositório nem no armazenamento de snapshots.
118
126
  - **Ideias de recursos:** nada é executado até você clicar em **Sugerir recursos**. Então a parte Host lê só a própria pasta do chat (o navegador nunca envia um caminho): os nomes das entradas do nível superior, os primeiros 6 kB do README, do AGENTS.md e do manifesto (`package.json`, `pyproject.toml`, `Cargo.toml`, `go.mod`, …) e `git log --oneline -15`, no máximo 16 kB no total. Ela ignora `.env*`, arquivos de chave e pastas como `node_modules`, e só lê arquivos comuns que ficam dentro da pasta: um symlink que aponta para fora da pasta, um FIFO ou um dispositivo é ignorado. Esse resumo vai para o modelo que o chat usa, pelas próprias configurações de provedor do dsh, como uma única solicitação; ele não é adicionado a nenhum chat. Nada no projeto é gravado. Uma ideia deslizada para a direita inicia um novo chat no modo de plano, então as aprovações e a revisão do plano valem como de costume. **Criar agora** inicia o chat sem o modo de plano: o modelo pode alterar arquivos na hora, com as aprovações de costume do chat e a Revisão automática. As ideias salvas para depois (título, resumo, motivo, esforço) ficam guardadas com o caminho da pasta do projeto em `storages/dsh-composer-plus/later.json`, dentro da pasta home do dsh (arquivo só para o dono); nada vai para o projeto. O histórico de ideias sugeridas (título, resumo, motivo, esforço, data, se foi iniciada) fica guardado da mesma forma em `storages/dsh-composer-plus/idea-history.json`, no máximo 200 por projeto (as mais antigas saem primeiro); os títulos dele vão para o modelo no próximo **Sugerir recursos** desse projeto.
119
127
  - **Pesquisa no conteúdo:** nenhum código novo pesquisa seus chats: o plugin só ativa o índice de mensagens do próprio dsh (SQLite FTS5, `dsh-session-query-sqlite`) e dá a ele um arquivo, `$DSH_HOME/cache/composer-plus/session-search.db` (arquivo e pasta só para o dono). O arquivo guarda o texto das suas mensagens e das mensagens do assistente, então é tão privado quanto os logs de chat em `$DSH_HOME/sessions`. Nada sai do seu computador. Ele é uma cópia que o dsh consegue refazer: você pode excluí-lo enquanto o dsh estiver fechado. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/content-search.json`.
120
- - **Reverter turno:** antes de cada mensagem sua, o Host tira um snapshot git da pasta do chat em um armazenamento próprio, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (pasta só para o dono). Ele guarda cópias dos arquivos dessa pasta que o git enxerga (não os arquivos ignorados), então é tão privado quanto o projeto. Ele lê os objetos do seu repositório (sem copiar o que o git já tem) e nunca grava no index, no `HEAD`, nos branches, nas tags, no stash ou na configuração do seu repositório; a única mudança que o git faz ali é atualizar a data e hora dos arquivos de objeto que ele reaproveita (isso adia a limpeza deles pelo `git gc`). Uma reversão com arquivos só grava arquivos comuns dentro da pasta do chat; ela ignora symlinks, pipes e qualquer coisa fora da pasta. Nada sai do seu computador. Você pode excluir o armazenamento enquanto o dsh estiver fechado (aí a reversão só funciona para o chat, até haver novas mensagens). **Excluir chat** também exclui o armazenamento de um chat. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/rollback.json`.
128
+ - **Reverter turno:** antes de cada mensagem sua, o Host tira um snapshot git da pasta do chat em um armazenamento próprio, `$DSH_HOME/cache/composer-plus/rollback/<chat>.git` (pasta só para o dono). Ele guarda cópias dos arquivos dessa pasta que o git enxerga (não os arquivos ignorados), então é tão privado quanto o projeto. Ele lê os objetos do seu repositório (sem copiar o que o git já tem) e nunca grava no index, no `HEAD`, nos branches, nas tags, no stash ou na configuração do seu repositório; a única mudança que o git faz ali é atualizar a data e hora dos arquivos de objeto que ele reaproveita (isso adia a limpeza deles pelo `git gc`). Uma reversão com arquivos só grava arquivos comuns dentro da pasta do chat; ela ignora symlinks, pipes e qualquer coisa fora da pasta. Nada sai do seu computador. Você pode excluir o armazenamento enquanto o dsh estiver fechado (aí a reversão só funciona para o chat, até haver novas mensagens). **Excluir chat** também exclui o armazenamento de um chat. A chave fica em `$DSH_HOME/storages/dsh-composer-plus/rollback.json`. Uma reversão com arquivos também guarda os arquivos como estavam logo antes dela (`refs/r/…` no mesmo armazenamento), para **Refazer**; as reversões refeitas ficam listadas em `$DSH_HOME/storages/dsh-composer-plus/redone.json` (acesso só para o dono).
121
129
  - **Exportar chat como Markdown:** a parte Host lê só o próprio log do chat (as mesmas mensagens que o dsh mostra) e as entrega à página; ela não lê nenhum arquivo do projeto e não envia nada pela rede. O Markdown vai só para a sua área de transferência ou para o arquivo que você salva.
122
130
  - **Excluir chat:** move as pastas de log do próprio chat (`$DSH_HOME/sessions/<project>/<chat>`) para o Lixo. A pasta do projeto não é tocada.
123
- - **Permitir neste chat:** as autorizações ficam guardadas em `$DSH_HOME/storages/dsh-composer-plus/grants.json` (acesso só para o dono). Uma autorização cobre **uma ferramenta exata em um chat**. Se essa ferramenta pode gravar, a autorização também cobre qualquer gravação. Revogue-a pelo chip no cabeçalho.
131
+ - **Permitir neste chat:** as autorizações ficam guardadas, com o horário em que foram dadas, em `$DSH_HOME/storages/dsh-composer-plus/chat-grants.json` (acesso só para o dono). Uma autorização cobre uma ferramenta exata em um chat, até o fim do limite de tempo (1 hora por padrão). Se essa ferramenta pode gravar, a autorização também cobre qualquer gravação. Revogue-a pelo chip no cabeçalho.
124
132
  - A Revisão automática continua sendo executada em toda chamada; falhas de revisão nunca são permitidas automaticamente.
125
- - **Conexão móvel:** fica desativada até você ativar. Enquanto está ativada, a parte Host executa o gateway do Tether: HTTPS na porta 19390, que só aceita a sua sub-rede Wi-Fi e a sua tailnet (100.64.0.0/10), e uma página de pareamento em `127.0.0.1:19391` (só neste Mac). Um celular precisa de um código de uso único do código QR (válido por 5 minutos) e de você clicar em **Approve** no Mac. O celular fixa o certificado do gateway. O Mac guarda só um hash do token de cada celular (30 dias, renovado enquanto estiver em uso); **Revoke** fecha na hora as conexões daquele celular. Os celulares só podem chamar uma lista permitida de métodos do dsh (chats, prompts, anexos, comandos de barra, aprovações, perguntas, modelos, agentes, metas), não configurações, credenciais, o navegador de arquivos ou o terminal. Dados: `$DSH_HOME/storages/dsh-composer-plus/mobile/`. Detalhes: [tether/README.md](tether/README.md).
133
+ - **Conexão móvel:** fica desativada até você ativar. Enquanto está ativada, a parte Host executa o gateway do Tether: HTTPS na porta 19390, que só aceita a sua sub-rede Wi-Fi e a sua tailnet (100.64.0.0/10), e uma página de pareamento em `127.0.0.1:19391` (só neste Mac). Um celular precisa de um código de uso único do código QR (válido por 5 minutos) e de você clicar em **Approve** no Mac. O celular fixa o certificado do gateway. O Mac guarda só um hash do token de cada celular (30 dias, renovado enquanto estiver em uso); **Remove** fecha na hora as conexões daquele celular. Os celulares só podem chamar uma lista permitida de métodos do dsh (chats, prompts, anexos, comandos de barra, aprovações, perguntas, modelos, agentes, metas), não configurações, credenciais, o navegador de arquivos ou o terminal. "Tailscale only" recusa toda conexão vinda da rede local, inclusive as que já estão abertas. O registro de acesso guarda as 200 tentativas de conexão mais recentes (horário, endereço IP, nome do aparelho, permitida ou recusada, e o motivo) em `access.json`; ele nunca guarda um token nem um código de pareamento. Dados: `$DSH_HOME/storages/dsh-composer-plus/mobile/` (arquivos só para o dono). Detalhes: [tether/README.md](tether/README.md).
126
134
  - **Atualizações:** a parte Host pede a `api.github.com` a versão mais recente e a `registry.npmjs.org` exatamente essa versão; nada sobre você ou seus chats é enviado. A instalação usa o gerenciador de plugins do dsh (`pnpm add dsh-composer-plus@<version>`; quando o dsh 0.2.1 recusa isso para um plugin já instalado, `pnpm add https://registry.npmjs.org/dsh-composer-plus/-/dsh-composer-plus-<version>.tgz`, e o perfil passa a listar essa URL como a origem do plugin), então valem as verificações de registro, de scripts e de compatibilidade de versão do próprio dsh. Tags de pré-lançamento e versões mais antigas nunca são instaladas.
127
135
  - **Previsão da próxima mensagem:** vem ativada por padrão; desative-a em **Configurações → Composer Plus** para parar essas chamadas ao modelo. Após cada turno concluído, a parte Host envia 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 6.000 caracteres (a parte mais recente), para o modelo escolhido (o padrão do dsh, a menos que você escolha outro). O envio usa as próprias configurações de provedor do dsh, como uma única solicitação. Nada é salvo no chat: o palpite não entra no histórico do chat. A chave e o modelo escolhido ficam em `$DSH_HOME/storages/dsh-composer-plus/predict.json` (arquivo só para o dono).
128
136
  - **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).
137
+ - **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).
129
138
 
130
139
  ## Solução de problemas
131
140
 
132
- - **Sem notificações no macOS:** Ajustes do Sistema → Notificações → DeepSeek Harness → permita. Escolha **Alertas** para que elas fiquem na tela.
141
+ - **Sem notificações no macOS:** Ajustes do Sistema → Notificações → DeepSeek Harness → permita. Escolha Alertas para que elas fiquem na tela.
133
142
  - **▶, as alças da fila, o status do projeto, a opção de projetos recentes, Recolher todos os projetos, Copiar caminho, a caixa de busca de projetos, a previsão da próxima mensagem, o complemento ao digitar, Permitir neste chat ou o clique com o botão direito sumiram depois de uma atualização do dsh:** esses recursos se prendem ao HTML atual do dsh, porque o dsh ainda não tem um espaço para eles. Se o dsh mudar essa marcação, eles se escondem sozinhos; nada mais quebra. Abra uma [issue](https://github.com/furkancak1r/dsh-composer-plus/issues).
134
143
  - **"Falha na atualização" ou "não foi instalada pelo npm":** uma cópia vinculada a partir de uma pasta local ou renomeada não consegue se atualizar sozinha; reinstale `dsh-composer-plus` em Configurações → Plugins. Nos outros casos, a mensagem mostra a primeira linha do erro do pnpm; **Verificar atualizações** tenta de novo.
135
144
  - **A Conexão móvel diz que o gateway não está em execução:** "no IPv4 address on en0" significa que este Mac não tem endereço de Wi-Fi/Ethernet; "EADDRINUSE" significa que outro dsh (ou outro app) usa a porta 19390 ou 19391. Só um dsh pode executar a Conexão móvel por vez.
@@ -138,8 +147,9 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
138
147
  - **Não há botão ↶ nas minhas mensagens:** Reverter turno está desativado, o chat é um chat de subagente, ou o dsh-rewind-plugin está instalado (use o botão ↶ dele). Depois de uma atualização, reinicie o dsh.
139
148
  - **Chat e arquivos está acinzentado:** o projeto não é um repositório git, não há snapshot de antes daquela mensagem (a mensagem é mais antiga que o plugin, ou um dos 50 snapshots mais novos a substituiu), ou nenhum arquivo mudou.
140
149
  - **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.
150
+ - **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.
141
151
  - **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).
142
- - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.11.3`); veja a nota de instalação acima.
152
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.13.0`); veja a nota de instalação acima.
143
153
 
144
154
  ## Limites
145
155
 
@@ -155,9 +165,14 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
155
165
  - **Excluir chat** precisa do arquivamento do dsh (dsh 0.2.0 ou mais recente). Um chat (ou um dos chats de subagente dele) que não para em 15 s, ou que outro dsh está usando, continua arquivado, e nada é movido. Em sistemas que não são o macOS, a pasta de lixo precisa estar no mesmo disco que o histórico de chats. Um chat aberto que você exclui fica na memória do dsh, arquivado e oculto, até o dsh reiniciar. Esvazie o Lixo você mesmo; o dsh não faz isso.
156
166
  - A fila do dsh não tem uma ação `move`, então a parte Host do plugin move a própria mensagem na fila do dsh (uma única alteração, a mesma mensagem). Mensagens com imagens ou arquivos também são movidas. Só as suas próprias mensagens são movidas: uma rodada de meta ou uma resposta a uma pergunta na fila fica onde está. Se uma mensagem começar a ser enviada enquanto você arrasta, nada é movido e um aviso informa isso.
157
167
  - 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.
168
+ - **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.
158
169
  - **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.
159
- - **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.
160
- - Um link de sessão funciona dentro dos chats; clicar nele não abre o chat.
170
+ - **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.
171
+ - 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.
172
+ - **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.
173
+ - **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).
174
+ - **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.
175
+ - **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.
161
176
  - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
162
177
  - 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.
163
178
  - 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.
@@ -165,6 +180,7 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
165
180
  - 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.
166
181
  - O dsh também não tem um ponto de extensão para uma dica no editor de mensagens, então o texto da **Previsão da próxima mensagem** fica sobre o texto de exemplo do próprio dsh (`[data-composer-placeholder]`). Se uma atualização do dsh mudar essa marcação, nenhuma previsão aparece. Enquanto ela está ativada, cada turno concluído custa uma chamada curta ao modelo.
167
182
  - **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.
183
+ - **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).
168
184
  - 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).
169
185
 
170
186
  ## Perguntas frequentes
@@ -189,9 +205,25 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
189
205
 
190
206
  **Qual modelo escreve a previsão?** O modelo que você escolhe em **Configurações → Composer Plus → Previsão da próxima mensagem → Modelo**. A lista é a própria lista de modelos do dsh. **Padrão do dsh** segue o modelo padrão do dsh. Se o dsh não listar mais o modelo escolhido, a previsão usa o padrão. **Completar ao digitar** tem o próprio menu **Modelo**: **Igual à previsão da próxima mensagem** (o padrão) segue o modelo da previsão; outra escolha é usada só para os complementos. Se o dsh não listar mais esse modelo, os complementos usam o modelo da previsão.
191
207
 
208
+ **O dsh pode melhorar meu prompt antes de eu enviá-lo, como o botão Enhance prompt do Roo Code ou do Augment?** Sim, com **Melhorar prompt** (ativado por padrão): digite um pedido aproximado e clique na varinha mágica ao lado do menu de modelos. Ele reescreve o texto com este chat e o projeto como contexto, no seu idioma, e não o envia. `Cmd/Ctrl+Z` ou **Desfazer melhoria** traz o seu texto de volta. Escolha o modelo dele em **Configurações → Composer Plus → Melhorar prompt → Modelo**.
209
+
192
210
  **Como reordeno as mensagens na fila do dsh?** Arraste a alça ⠿ de uma mensagem na fila, ou coloque o foco nela e pressione `↑` / `↓`.
193
211
 
194
- **Como faço a Revisão automática parar de perguntar sobre a mesma ferramenta em um chat?** Clique em **Permitir neste chat** no cartão de aprovação. Isso cobre só aquela ferramenta exata naquele chat; revogue pelo chip no cabeçalho.
212
+ **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.
213
+
214
+ **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**.
215
+
216
+ **Posso criar um link para uma única mensagem em um chat longo?** Sim: passe o mouse sobre a mensagem e clique em **🔗**. Envie o link em um chat: no dsh 0.2.1 ou mais recente, um clique nele abre o chat naquela mensagem.
217
+
218
+ **Reverti um turno por engano. Posso recuperá-lo?** Sim, com **Refazer** acima do editor de mensagens, logo depois da reversão: ele inicia um novo chat a partir de logo antes da reversão com as mesmas mensagens, e com **Chat e arquivos** também traz os arquivos de volta.
219
+
220
+ **Como vejo só os arquivos que um chat alterou?** Barra lateral direita → **Alterações** → **Este chat**. Clique em **␣** para ocultar alterações que são só espaço em branco.
221
+
222
+ **Como faço a Revisão automática parar de perguntar sobre a mesma ferramenta em um chat?** Clique em **Permitir neste chat** no cartão de aprovação. Isso cobre só aquela ferramenta exata naquele chat, por 1 hora por padrão; revogue pelo chip no cabeçalho. Mude o tempo em **Configurações → Composer Plus → Permitir neste chat**.
223
+
224
+ **Perdi meu iPhone. Como impeço que ele acesse meu Mac?** Clique em **Conexão móvel** no canto inferior esquerdo da barra lateral e clique em **Remove** ao lado desse iPhone. A chave dele para de funcionar na hora; ele só volta com um novo pareamento que você aprove no Mac.
225
+
226
+ **Posso bloquear o Tether com o Face ID?** Sim: no Tether, ative "Settings → Privacy → Lock with Face ID". Depois disso, o Tether pede o Face ID (ou o código) quando abre e quando você volta para ele.
195
227
 
196
228
  **Como mostro na barra lateral do dsh só os projetos que usei hoje?** Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Selecione de novo para mostrar todos os projetos.
197
229
 
@@ -219,8 +251,12 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /pa
219
251
  PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
220
252
  # Order by status (fake model + Schedule): real-app test + its thumbnail
221
253
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
222
- # every Settings feature row shows a loading screenshot
254
+ # every Settings feature row shows a loading screenshot and a ? link to its README row
223
255
  PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
256
+ # What's new after an update: the release notes show once, Esc and Close close them
257
+ PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/bin.js
258
+ # README feature anchors (the ? links) on github.com, headless: each #feature-… shows the start of its row
259
+ PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
224
260
  # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
225
261
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
226
262
  # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
@@ -235,14 +271,17 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-export-markdown.mjs /pat
235
271
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
236
272
  # Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
237
273
  SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
274
+ # Improve prompt (fake model, made-up git project): the wand sends the draft with the chat and the project, the answer replaces the draft, Cmd+Z and Undo bring it back + its thumbnail
275
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
238
276
  ```
239
277
 
240
278
  ```sh
241
279
  npm run build:locales # after editing locales/<id>.json
280
+ npm run build:readme # after editing docs/features.json
242
281
  npm test
243
282
  ```
244
283
 
245
- **Regra para novos recursos:** toda linha de recurso em Configurações → Composer Plus mostra uma captura de tela. Adicione o id do recurso a `SHOT_OF` em `client.js` e a `SHOTS` em `index.js`, e inclua `assets/features/<id>.webp` (feita no dsh de demonstração descartável, com a interface em inglês, com cerca de 60 kB ou menos). Adicione o recurso à tabela do README com a mesma imagem, no `README.md` e em cada `README.<id>.md` traduzido. `test/shots.test.mjs` falha quando um recurso não tem captura de tela, e `test/browser-settings-shots.mjs` verifica a página real de Configurações. A lista de verificação completa para cada alteração está em [AGENTS.md](AGENTS.md).
284
+ **Regra para novos recursos:** toda linha de recurso em Configurações → Composer Plus mostra uma captura de tela. Adicione o id do recurso a `SHOT_OF` em `client.js` e a `SHOTS` em `index.js`, e inclua `assets/features/<id>.webp` (feita no dsh de demonstração descartável, com a interface em inglês, com cerca de 60 kB ou menos). Adicione o recurso, com a mesma imagem, ao `docs/features.json` e execute `npm run build:readme`: ele escreve a tabela de recursos do `README.md` e de cada `README.<id>.md` traduzido, e a lista do `llms.txt`. `test/shots.test.mjs` falha quando um recurso não tem captura de tela, e `test/browser-settings-shots.mjs` verifica a página real de Configurações. A lista de verificação completa para cada alteração está em [AGENTS.md](AGENTS.md).
246
285
 
247
286
  Os testes executam o `client.js` real contra um React/DOM falso e o `index.js` real (parte Host) contra um repositório git temporário. Os testes do gateway do Tether (`test/tether-gateway.test.mjs`) usam um host dsh simulado e um gateway TLS real. O app para iPhone está em `tether/ios` (veja [tether/README.md](tether/README.md) e [tether/AGENTS.md](tether/AGENTS.md)). `node test/browser-history.mjs '<dsh web URL with ?token=…>'` verifica o histórico de entrada em um navegador real, contra um `dsh web` descartável com seu próprio `DSH_HOME`.
248
287