dsh-composer-plus 1.9.1 → 1.10.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.
@@ -0,0 +1,236 @@
1
+ # dsh-composer-plus — Composer Plus para DeepSeek Harness
2
+
3
+ [![npm](https://img.shields.io/npm/v/dsh-composer-plus)](https://www.npmjs.com/package/dsh-composer-plus)
4
+ [![test](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml/badge.svg)](https://github.com/furkancak1r/dsh-composer-plus/actions/workflows/test.yml)
5
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
6
+
7
+ [English](README.md) · [中文](README.zh.md) · [Türkçe](README.tr.md) · [Español](README.es.md) · **Português (Brasil)** · [Français](README.fr.md) · [Deutsch](README.de.md) · [Русский](README.ru.md) · [日本語](README.ja.md) · [한국어](README.ko.md) · [Bahasa Indonesia](README.id.md) · [Tiếng Việt](README.vi.md) · [हिन्दी](README.hi.md)
8
+
9
+ Esta é uma tradução. A versão de referência é o [README.md](README.md) em inglês.
10
+
11
+ Recursos práticos no estilo do Codex para a interface desktop e web do [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh): um painel de alterações, ideias de recursos em cartões para deslizar, pesquisa na barra lateral pelo texto das mensagens, reversão de turnos com restauração de arquivos, exclusão de chats para o Lixo, o nome do projeto abaixo do editor de mensagens, status do projeto na barra lateral, histórico de entrada, um atalho para o modo de plano, Continuar com um clique, retomada dos chats em execução depois de reiniciar, arrastar e soltar na fila, deeplinks de sessão, autorizações da Revisão automática por chat, notificações em segundo plano, acesso pelo iPhone com o app Tether e atualizações automáticas.
12
+
13
+ **Em uma linha:** um único plugin do DeepSeek Harness (npm `dsh-composer-plus`, exibido como **Composer Plus** em Configurações → Plugins) que adiciona um painel de alterações do git, cartões de ideias de recursos no estilo Tinder, pesquisa na barra lateral que também encontra palavras nas mensagens, ↶ Reverter turno (apenas o chat, ou chat e arquivos), Excluir chat, o nome do projeto abaixo do editor de mensagens, histórico de entrada com ↑/↓, alternância de `/plan` com Shift+Tab, ▶ Continuar com um clique, Retomar após reiniciar, reordenação da fila com arrastar e soltar, Copiar link da sessão, “Permitir neste chat” na Revisão automática, notificações em segundo plano, acesso pelo iPhone (Conexão móvel, app Tether), 11 idiomas extras na interface e atualizações automáticas.
14
+
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
+
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**. **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
+
19
+ ## Instalação
20
+
21
+ **App desktop:** Configurações → Plugins → **Adicionar plugin** → digite `dsh-composer-plus` → **Ativar agora**.
22
+ Você também pode colar `https://github.com/furkancak1r/dsh-composer-plus` em vez do nome do npm.
23
+
24
+ **Perfil web / CLI:**
25
+
26
+ ```sh
27
+ dsh plugin --profile web add dsh-composer-plus
28
+ ```
29
+
30
+ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem gerencia esse perfil é o app.)
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.10.0`.
33
+
34
+ ## Recursos
35
+
36
+ | Recurso | Como usar | Captura de tela |
37
+ |---|---|---|
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. **Mais ideias** adiciona cartões. 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). 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
+ | **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> |
52
+ | **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> |
53
+ | **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> |
54
+ | **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> |
55
+ | **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> |
56
+ | **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> |
57
+ | **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> |
58
+ | **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> |
59
+ | **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> |
60
+ | **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 no Tether e clique em **Approve**. 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> |
61
+ | **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> |
62
+
63
+ Botões, dicas, avisos e notificações seguem o idioma selecionado no dsh (veja Idioma do aplicativo abaixo).
64
+
65
+ ## Configurações
66
+
67
+ 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** e **Retomar após reiniciar**. O Host do dsh guarda as chaves desses dois recursos e também de **Pesquisa no conteúdo** e **Reverter turno**, então elas valem para todas as janelas e continuam depois de reiniciar. **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.**
68
+
69
+ <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>
70
+
71
+ ### Idioma do aplicativo
72
+
73
+ Abra **Configurações → Composer Plus → Idioma do aplicativo** e escolha **Idioma do sistema** ou um dos 13 idiomas:
74
+
75
+ English · 中文 · Türkçe · Español · Português (Brasil) · Français · Deutsch · Русский · 日本語 · 한국어 · Bahasa Indonesia · Tiếng Việt · हिन्दी
76
+
77
+ <p align="center"><img src="docs/images/language-tr.webp" width="720" alt="Interface do DeepSeek Harness em Türkçe"></p>
78
+
79
+ O app inteiro muda na hora. A escolha é a própria `locale.preference` salva do dsh (a mesma de Geral → Idioma), então ela continua depois de reiniciar. **Idioma do sistema** limpa essa escolha: o app desktop segue o idioma do sistema operacional, a interface web segue o idioma do navegador, e um idioma sem suporte volta para o inglês. Instalar o plugin nunca substitui um idioma que você já escolheu.
80
+
81
+ Cada pacote tem 3.143 textos: todos os textos da interface do dsh `0.2.0-rc.2` e `0.2.1-rc.2` (chats, barra lateral, configurações, aprovações, agendamentos, prévias de arquivos, gerenciador de plugins, mercado de plugins), os controles do próprio plugin e o popular plugin [dsh-rewind](https://github.com/SiriLee/dsh-rewind). Não são traduzidos: suas mensagens, a saída do modelo, o código, os nomes dos comandos de barra (`/plan`, `/compact`), rótulos definidos pelo provedor, como o esforço de raciocínio `High`, os textos de outros plugins e os menus nativos e caixas de diálogo de atualização do app desktop (o dsh só os oferece em inglês e chinês). Textos adicionados por uma versão mais nova do dsh aparecem em inglês até que os pacotes sejam atualizados. Se outro plugin já fornece um idioma, esse plugin continua com ele.
82
+
83
+ ## Atalhos de teclado
84
+
85
+ | Tecla | Onde | Ação |
86
+ |---|---|---|
87
+ | `↑` / `↓` | editor de mensagens vazio | mensagem enviada anterior / seguinte |
88
+ | `Shift+Tab` | editor de mensagens | adicionar/remover `/plan `, ou sair do modo de plano |
89
+ | `↑` / `↓` | alça da fila com foco | mover a mensagem na fila |
90
+ | `Esc` | ao arrastar | cancelar a movimentação |
91
+ | `→` / `←` | página Ideias de recursos | criar / pular o cartão do topo |
92
+ | `↓` | página Ideias de recursos | salvar o cartão do topo na lista Depois do projeto |
93
+ | `↑` | página Ideias de recursos | criar agora o cartão do topo, sem plano |
94
+ | `Z` | página Ideias de recursos | trazer de volta o último cartão pulado |
95
+
96
+ Um menu `/` ou `@` aberto fica com essas teclas para ele.
97
+
98
+ ## Compatibilidade
99
+
100
+ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa os testes a cada push.
101
+
102
+ ## Privacidade e segurança
103
+
104
+ - **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.
105
+ - **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.
106
+
107
+ - **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.
108
+ - **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.
109
+ - **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`.
110
+ - **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`.
111
+ - **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.
112
+ - **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.
113
+ - A Revisão automática continua sendo executada em toda chamada; falhas de revisão nunca são permitidas automaticamente.
114
+ - **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).
115
+ - **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.
116
+
117
+ ## Solução de problemas
118
+
119
+ - **Sem notificações no macOS:** Ajustes do Sistema → Notificações → DeepSeek Harness → permita. Escolha **Alertas** para que elas fiquem na tela.
120
+ - **▶, as alças da fila, o status do projeto, a opção de projetos recentes, Recolher todos os projetos, Copiar caminho, 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).
121
+ - **"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.
122
+ - **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.
123
+ - **Conexão móvel, Retomar após reiniciar ou Pesquisa no conteúdo diz "Reinicie o dsh":** o plugin foi atualizado enquanto o dsh estava em execução (ou, no caso da Pesquisa no conteúdo, você mudou a chave); o novo estado é carregado depois de reiniciar.
124
+ - **A pesquisa só encontra títulos:** a Pesquisa no conteúdo está desativada, o dsh não foi reiniciado desde que você a ativou ou instalou o plugin, ou a palavra só aparece na saída de uma ferramenta (veja Limites).
125
+ - **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.
126
+ - **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.
127
+ - **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.
128
+ - **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).
129
+ - **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.10.0`); veja a nota de instalação acima.
130
+
131
+ ## Limites
132
+
133
+ - O Continuar sem mensagem depende do ciclo de vida `agent/pre-step` → `agent/request` do dsh. Verifique de novo a compatibilidade ao atualizar o dsh.
134
+ - **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.
135
+ - **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.
136
+
137
+ - **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.
138
+ - 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.
139
+ - **Pesquisa no conteúdo** só vale depois de reiniciar o dsh, e o arquivo de índice é compartilhado por todo dsh que usa o mesmo dsh home: execute só um desses dsh por vez (o dsh permite um único dono por arquivo de índice).
140
+ - **Reverter turno** só restaura arquivos em um repositório git, e só na pasta do chat. Ele guarda os 50 snapshots mais novos por chat. Arquivos ignorados (`.gitignore`, `info/exclude`, seu arquivo global de ignore), pastas vazias, symlinks e submódulos não são restaurados; um arquivo que estava ignorado quando o snapshot foi feito nunca é excluído, mesmo quando o turno mudou as regras de ignore. Um arquivo que o git não consegue ler fica fora do snapshot. Cada mensagem sua executa um `git add --all` da pasta do chat no armazenamento privado: em uma pasta muito grande, com muitos arquivos não rastreados, isso pode levar alguns segundos, e a próxima chamada de ferramenta espera por ele (no máximo 10 s; depois disso, o snapshot termina em segundo plano). Se o `git gc` do seu repositório remover um objeto de que um snapshot antigo precisa, esse arquivo aparece na lista como não restaurado. Só o texto da mensagem volta para o editor de mensagens: adicione de novo as imagens ou os arquivos dela. Chats de subagente não têm ↶ (as alterações de arquivos de um subagente contam como alterações do chat que o iniciou). O chat exportado (`/export`) ainda contém as mensagens removidas. A ideia de um marcador oculto que remove parte de um chat vem do [dsh-rewind-plugin](https://github.com/SiriLee/dsh-rewind), de SiriLee (MIT); o Composer Plus não usa nenhum código dele.
141
+ - **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.
142
+ - A fila do dsh não tem uma ação `move`, então uma reordenação reescreve o texto das linhas afetadas. Se o agente pegar uma linha no meio da movimentação, a movimentação é desfeita e nada se perde. Mensagens com imagens ou arquivos não podem ser movidas.
143
+ - 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.
144
+ - **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.
145
+ - **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.
146
+ - Um link de sessão funciona dentro dos chats; clicar nele não abre o chat.
147
+ - Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
148
+ - 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.
149
+ - 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.
150
+ - 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.
151
+ - 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).
152
+
153
+ ## Perguntas frequentes
154
+
155
+ **Como adiciono um painel de alterações / git diff ao DeepSeek Harness?** Instale `dsh-composer-plus` e depois use barra lateral direita → `+` → **Alterações**.
156
+
157
+ **O dsh pode sugerir recursos para o meu projeto, como ao deslizar cartões no Tinder?** Sim: barra lateral direita → `+` → **Ideias de recursos** → **Sugerir recursos**. Deslize para a direita para iniciar um novo chat que planeja o recurso; clique em **▶ Criar agora** para iniciar um chat que o cria na hora, sem plano; deslize para a esquerda para pular.
158
+
159
+ **A pesquisa da barra lateral do dsh consegue encontrar um chat por uma palavra das mensagens, e não só pelo título?** Sim, com **Pesquisa no conteúdo** (ativada por padrão): reinicie o dsh uma vez depois de instalar o plugin e use a lupa ao lado de **Workspaces**. Os chats encontrados mostram o texto ao redor da palavra.
160
+
161
+ **Posso desfazer um turno e editar meu prompt, como no OpenCode ou no Claude Code?** Sim, com **Reverter turno**: clique em **↶** na mensagem, escolha **Chat e arquivos**, edite o texto que volta para o editor de mensagens e envie.
162
+
163
+ **Posso excluir um chat em vez de arquivá-lo?** Sim, com **Excluir chat**: **…** → **Excluir…**. O histórico vai para o Lixo, então um erro pode ser desfeito.
164
+
165
+ **Como vejo a qual projeto um chat pertence?** Olhe a linha abaixo do editor de mensagens: com **Nome do projeto no compositor** (ativado por padrão), ela começa com o nome do projeto. Passe o mouse sobre ele para ver o caminho da pasta.
166
+
167
+ **Como tenho histórico de mensagens com ↑/↓ no editor de mensagens do dsh?** Instale este plugin; com o editor de mensagens vazio, `↑` / `↓` percorrem as mensagens que você enviou.
168
+
169
+ **Como continuo um turno interrompido ou com falha no dsh sem digitar "continue"?** Com este plugin, o botão de enviar vira **▶** depois de um turno interrompido, com falha ou cortado; um clique retoma o turno.
170
+
171
+ **O dsh continua os chats em execução depois que eu fecho e abro o app de novo?** Não por conta própria: o dsh marca esse turno como interrompido e espera (uma meta também espera por `/goal resume`). Ative **Configurações → Composer Plus → Retomar após reiniciar**: assim, os chats que estavam trabalhando quando o dsh fechou continuam sozinhos na próxima inicialização.
172
+
173
+ **Como reordeno as mensagens na fila do dsh?** Arraste a alça ⠿ de uma mensagem na fila, ou coloque o foco nela e pressione `↑` / `↓`.
174
+
175
+ **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.
176
+
177
+ **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.
178
+
179
+ **Como copio o caminho da pasta de um projeto no dsh?** Clique com o botão direito no projeto na barra lateral → **Copiar caminho**.
180
+
181
+ **Como recolho todos os projetos da barra lateral do dsh de uma vez?** Clique no botão de recolher ao lado das opções de exibição (ícone de controles deslizantes). Ele aparece enquanto pelo menos um projeto estiver aberto.
182
+
183
+ **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.
184
+
185
+ **Como mudo a interface do DeepSeek Harness para turco, espanhol, japonês…?** Configurações → Composer Plus → **Idioma do aplicativo**.
186
+
187
+ **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 no Tether e clique em **Approve**. Longe de casa, use o Tailscale nos dois aparelhos.
188
+
189
+ **Funciona com o app desktop?** Sim: Configurações → Plugins → **Adicionar plugin** → `dsh-composer-plus`. Testado no dsh 0.2.0-rc.2 (desktop e web) e 0.2.1-rc.2 (web).
190
+
191
+ ## Desenvolvimento
192
+
193
+ As capturas de tela são geradas de novo a partir de um dsh descartável, com um modelo falso e projetos de demonstração inventados (`acme-web`, `weather-cli`, `docs-site`), então não contêm dados reais. As miniaturas dos recursos vão para `assets/features/` (incluídas no pacote e exibidas nas Configurações); as imagens usadas só no README vão para `docs/images/` (fora do pacote npm):
194
+
195
+ ```sh
196
+ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh/lib/bin.js
197
+ # sidebar project features (recent filter, Copy path, Collapse all): real-app test + their thumbnails
198
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
199
+ # recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
200
+ PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
201
+ # Order by status (fake model + Schedule): real-app test + its thumbnail
202
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
203
+ # every Settings feature row shows a loading screenshot
204
+ PLAYWRIGHT=/path/to/playwright node test/browser-settings-shots.mjs /path/to/dsh/lib/bin.js
205
+ # Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
206
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
207
+ # Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
208
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
209
+ # Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
210
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
211
+ # 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 + its thumbnail
212
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
213
+ # Content search (fake model, made-up chats): a message-only word finds its chat with the snippet, switch off + restart = titles only + its thumbnail
214
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path/to/dsh/lib/bin.js
215
+ # Turn rollback + Delete chat (fake model, made-up git project): bash edit → ↶ Chat and files → files back, .git unchanged; Delete… → Trash + its thumbnails
216
+ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
217
+ ```
218
+
219
+ ```sh
220
+ npm run build:locales # after editing locales/<id>.json
221
+ npm test
222
+ ```
223
+
224
+ **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).
225
+
226
+ 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`.
227
+
228
+ Os pacotes de idioma são arquivos JSON só com dados em `locales/<id>.json`, embutidos na entrada única do cliente por `npm run build:locales` (sem serviço de tradução nem download em tempo de execução). `npm test` verifica em cada pacote a cobertura completa das chaves, os placeholders e as quebras de linha idênticos, e o comportamento de idioma do sistema/substituição. Para verificações isoladas no app real com um Playwright instalado localmente:
229
+
230
+ ```sh
231
+ PLAYWRIGHT=/path/to/playwright node test/browser-language.mjs /path/to/dsh/lib/bin.js
232
+ ```
233
+
234
+ ## License
235
+
236
+ MIT