dsh-composer-plus 1.12.0 → 1.14.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.de.md +96 -19
- package/README.es.md +96 -19
- package/README.fr.md +96 -19
- package/README.hi.md +96 -19
- package/README.id.md +96 -19
- package/README.ja.md +96 -19
- package/README.ko.md +96 -19
- package/README.md +96 -19
- package/README.pt-BR.md +96 -19
- package/README.ru.md +96 -19
- package/README.tr.md +96 -19
- package/README.vi.md +96 -19
- package/README.zh.md +96 -19
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/copyMessageLink.webp +0 -0
- package/assets/features/defaultWorkspace.webp +0 -0
- package/assets/features/findInChat.webp +0 -0
- package/assets/features/goalCheck.webp +0 -0
- package/assets/features/markProjectRead.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/assets/features/sessionBranch.webp +0 -0
- package/assets/features/worktreeChats.webp +0 -0
- package/client.js +1983 -199
- package/index.js +1824 -106
- package/package.json +7 -3
- package/tether/gateway/admin.html +47 -3
- package/tether/gateway/server.mjs +100 -29
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. **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.
|
|
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. **Verificação da meta** (ativada por padrão) chama um modelo uma vez cada vez que o agente marca uma `/goal` como concluída em uma rodada automática. **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,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem gerencia esse perfil é o app.)
|
|
31
31
|
|
|
32
|
-
> O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.
|
|
32
|
+
> O pnpm do dsh ignora versões publicadas há menos de 24 horas. Logo depois de uma nova versão, informe a versão: `dsh-composer-plus@1.14.0`.
|
|
33
33
|
|
|
34
34
|
## Recursos
|
|
35
35
|
|
|
@@ -37,10 +37,10 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
|
|
|
37
37
|
|
|
38
38
|
| Recurso | Como usar | Captura de tela |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **Painel de alterações** | <a id="feature-changespanel"></a>Barra lateral direita → `+` → **Alterações**. Escolha **Não confirmadas**, **Não preparadas**, **Preparadas** ou **Branch** para ver os arquivos alterados com as contagens `+/-`; clique em um arquivo para ver o diff dele. **Último turno** abre a revisão do próprio dsh para o turno mais recente. | <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
|
|
40
|
+
| **Painel de alterações** | <a id="feature-changespanel"></a>Barra lateral direita → `+` → **Alterações**. Escolha **Não confirmadas**, **Não preparadas**, **Preparadas** ou **Branch** para ver os arquivos alterados com as contagens `+/-`; clique em um arquivo para ver o diff dele. **Último turno** abre a revisão do próprio dsh para o turno mais recente. Clique no nome do branch (ou escolha **Árvore**) para ver a árvore de branches: clique em um branch acima dela para ir até ele e em um commit para ver os arquivos e os diffs dele. **Este chat** lista só os arquivos que as ferramentas de arquivo do chat aberto (write, edit) escreveram, em todos os turnos dele, e o diff total desde a primeira mensagem. O botão **␣** oculta as alterações de espaço em branco (`git diff -w`): as linhas que mudaram só na indentação ou nas quebras de linha não aparecem. O menu **…** de um arquivo → **Chats que alteraram este arquivo** lista os chats do mesmo repositório cujas ferramentas de escrita ou edição alteraram esse arquivo, do mais recente ao mais antigo, com o pedido que fez a alteração; um clique abre esse chat nesse pedido. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura de tela: Painel de alterações"></a> |
|
|
41
|
+
| **Ideias de recursos** | <a id="feature-featureideas"></a>Barra lateral direita → `+` → **Ideias de recursos** → **Sugerir recursos**. O próprio modelo do chat lê um breve resumo do projeto do chat (arquivos do nível superior, o início do README e do manifesto, um esboço do resto do README, os títulos dos commits recentes) e sugere até 8 recursos, exibidos como uma pilha de cartões no idioma da interface do dsh. Deslize um cartão para a direita (ou clique em **✓**, ou pressione `→`; em todos os casos, o cartão sai voando para aquele lado) para iniciar um novo chat no mesmo projeto: ele começa no modo de plano com a ideia como pedido, então nada muda antes de você aprovar o plano. Para pular o plano, clique em **▶ Criar agora** (ou pressione `↑`; o cartão sai voando para cima): o novo chat começa na hora com a ideia como um pedido comum, e o modelo faz a alteração e executa as verificações (as aprovações valem como de costume). Deslize para a esquerda (ou **✕**, ou `←`) para pular; **Desfazer** (ou `Z`) traz de volta um cartão pulado. Clique em **↓** (ou pressione `↓`) para salvar uma boa ideia para depois: ela vai para a lista **Depois** do projeto, que aparece em todos os chats da mesma pasta de projeto (também depois de reiniciar). **Depois (N)** abre a lista; **Planejar** inicia o mesmo chat no modo de plano para a ideia e **Criar agora** inicia o chat sem plano; os dois a tiram da lista. **Planejar tudo (N)** inicia um único chat no modo de plano para todas as ideias da lista, então as partes em comum são planejadas uma só vez. **Remover da lista** a exclui. **Copiar como lista de tarefas** copia a lista inteira para a área de transferência como uma lista de tarefas em Markdown (`- [ ] Title — Summary`, uma linha por ideia) para um rastreador de issues ou um arquivo TODO; ele não faz nenhuma chamada de rede. **Abrir issue no GitHub** em uma ideia abre uma issue com o título e o resumo dela (e por que ela importa) no repositório do GitHub do projeto, com o seu próprio login do GitHub CLI (`gh`); depois, o link **Issue #N** aparece ao lado da ideia e abre a issue. **Mais ideias** adiciona cartões. Para receber ideias sobre uma única área, digite um **Tema de foco** curto no campo ao lado de **Sugerir recursos** (no máximo 80 caracteres; `Enter` também sugere), ou clique em um dos temas fixos abaixo dele: **Desempenho**, **Acessibilidade**, **Testes**, **Segurança**, **Usabilidade** ou **Documentação** (clique de novo para limpá-lo). O modelo então sugere só recursos sobre esse tema; um campo vazio significa qualquer recurso. Uma ideia não é sugerida duas vezes no mesmo projeto: toda ideia sugerida (pulada, salva ou iniciada) vai para o **Histórico** do projeto, o modelo recebe a instrução de não sugeri-las de novo e um título repetido é descartado. **Histórico** lista as ideias como **Iniciada** ou **Sugerida**; **Esquecer** (ou **Esquecer tudo**) deixa uma delas voltar; uma ideia que ainda está na lista **Depois** fica fora das sugestões até você removê-la de lá. O modelo só é executado quando você clica. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Captura de tela: Ideias de recursos"></a> |
|
|
42
42
|
| **Pesquisa no conteúdo** | <a id="feature-contentsearch"></a>A pesquisa da própria barra lateral do dsh (a lupa ao lado de **Workspaces**; `Cmd+K` no app desktop, `Cmd+Alt+K` no navegador) também encontra chats pelas palavras das suas mensagens e das respostas, não só pelo título, e mostra o texto correspondente abaixo do chat. O dsh já tem essa pesquisa, mas ela vem desativada; este recurso a ativa com um arquivo de índice de pesquisa no seu computador. O índice é criado na primeira pesquisa depois de iniciar (cerca de 15 s para 250 chats, veja Limites) e fica guardado para as próximas inicializações. Ativado por padrão; uma alteração vale depois que você reinicia o dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Captura de tela: Pesquisa no conteúdo"></a> |
|
|
43
|
-
| **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. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Captura de tela: Reverter turno"></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
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
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
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> |
|
|
@@ -49,22 +49,30 @@ Depois, reinicie o dsh. (A CLI não consegue instalar no perfil desktop; quem ge
|
|
|
49
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
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
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> |
|
|
52
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> |
|
|
53
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> |
|
|
54
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> |
|
|
55
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
|
+
| **Espaço de trabalho padrão para Nova sessão** | <a id="feature-defaultworkspace"></a>Configurações → Composer Plus → **Espaço de trabalho padrão para Nova sessão** → **Abrir Nova sessão em**: escolha um projeto ou **Pasta geral (default-workspace)** (o padrão: a própria pasta do dsh `Documents/deepseek-harness/default-workspace`, criada no primeiro uso). Depois disso, **Nova sessão** no topo da barra lateral (e o atalho dela) sempre abre o novo chat ali, também enquanto um chat de outro projeto está aberto. O `+` ao lado de um projeto continua abrindo esse projeto, e o botão de projeto acima do editor de mensagens do novo chat continua mudando o projeto. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Captura de tela: Espaço de trabalho padrão para Nova sessão"></a> |
|
|
59
|
+
| **Buscar no chat** | <a id="feature-findinchat"></a>Pressione `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) em um chat: uma caixa de busca se abre sobre ele. Digite uma palavra: todas as ocorrências nas mensagens e respostas na tela ficam destacadas, a atual com uma cor mais forte, e a caixa mostra n / total. `Enter` ou `↓` vai para a próxima ocorrência e `Shift+Enter` ou `↑` para a anterior (os botões de seta também); o chat rola a ocorrência até o meio. Maiúsculas, acentos e o ı sem ponto do turco não fazem diferença. `Esc` fecha a caixa e devolve o cursor para onde ele estava. A busca acompanha o chat enquanto uma resposta chega. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Captura de tela: Buscar no chat"></a> |
|
|
60
|
+
| **Um branch por chat** | <a id="feature-worktreechats"></a>Novo chat → o botão ⑂ main ao lado do botão de projeto → **Novo branch**; depois digite a primeira mensagem e envie. A IA dá nome ao branch (`feat/…`, `fix/…`) a partir dessa mensagem, o Composer Plus cria um worktree git para ele em `<project>/.worktrees/`, copia os arquivos ignorados que o `.worktreeinclude` lista (por exemplo `.env` e `node_modules/`) e abre ali um novo chat com a sua mensagem. O cabeçalho do chat aberto mostra ⑂ branch · N alterações · ↑ ↓ (ou **não enviado**); clique nele para abrir **Alterações**. O mesmo menu lista os worktrees abertos: escolha um para iniciar um chat nele. Para ver as pastas dos branches dentro do projeto na barra lateral, escolha no dsh **Opções de exibição** → **Árvore de workspaces**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Captura de tela: Um branch por chat"></a> |
|
|
56
61
|
| **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> |
|
|
57
62
|
| **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> |
|
|
58
63
|
| **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> |
|
|
59
|
-
| **
|
|
64
|
+
| **Verificação da meta** | <a id="feature-goalcheck"></a>Comece uma meta com `/goal`. Quando o agente marca a meta como concluída em uma rodada automática, a meta só é fechada depois de duas verificações. Primeiro, o comando de teste do projeto é executado na pasta do chat, no modo sandbox do chat. O comando é o seu próprio ou o encontrado em `package.json`, `Makefile`, `Cargo.toml`, `go.mod` ou pytest. Quando o passo mais recente do próprio agente foi uma execução bem-sucedida desse teste, ele não é executado de novo. Depois, uma chamada independente ao modelo, sem ferramentas, lê a meta, este chat, o `git status` e o resultado do teste. Se uma verificação falhar, a meta continua ativa e o agente lê o motivo; depois, a próxima rodada continua. Uma linha abaixo da barra da meta (**Verificação da meta**) mostra o teste e o último resultado. **Editar** define o seu próprio comando de teste e um limite de tempo ou de tokens; acima do limite, a meta fica bloqueada. **Executar agora** executa a verificação sem fechar a meta. Tem o próprio menu **Modelo** nas Configurações (padrão: **Igual ao modelo do chat**). Quando você mesmo conclui a meta, nada é verificado. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura de tela: Verificação da meta"></a> |
|
|
65
|
+
| **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> |
|
|
60
66
|
| **Status do projeto** | <a id="feature-projectstatus"></a>A linha de um projeto na barra lateral mostra o mesmo indicador de em execução / aguardando / concluído dos chats dele, então um projeto recolhido ainda avisa que um chat dentro dele está trabalhando ou precisa de você. Primeiro aparece um chat que está esperando você, depois um chat concluído que você ainda não abriu (o ponto verde, mesmo enquanto outro chat ainda está em execução) e depois o indicador de em execução. Passe o mouse sobre ele para ver os detalhes. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura de tela: Status do projeto"></a> |
|
|
67
|
+
| **Branch do Git nas linhas de chat** | <a id="feature-sessionbranch"></a>Cada linha de chat na barra lateral mostra uma pequena etiqueta cinza com o branch do git em que a pasta do projeto do chat estava no último turno do chat (por exemplo `main` ou `feature/login`; um HEAD destacado mostra o ID curto do commit entre parênteses). Dois chats de um mesmo projeto em branches diferentes não parecem mais iguais, e você vê na hora quando está prestes a continuar um chat no branch errado. Passe o mouse sobre a etiqueta para ver o nome completo. A parte Host lê o branch (`git branch --show-current`, somente leitura) quando um turno começa e quando termina; um chat sem turno desde que você instalou isto, ou uma pasta que não é um repositório git, não mostra etiqueta. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura de tela: Branch do Git nas linhas de chat"></a> |
|
|
68
|
+
| **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> |
|
|
61
69
|
| **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> |
|
|
62
70
|
| **Filtro de projetos recentes** | <a id="feature-recentprojects"></a>Barra lateral → opções de exibição (ícone de controles deslizantes) → **Ativos nas últimas 2 horas**. Enquanto essa opção está selecionada, a barra lateral mostra só os projetos com um chat ativo nas últimas 2 horas: um chat atualizado nesse período, um chat em execução ou aguardando, o chat aberto, ou um chat concluído que você ainda não abriu (o ponto verde de “concluído” do dsh), mesmo depois das 2 horas. Projetos sem um chat assim ficam ocultos, inclusive os novos e vazios. Selecione a opção de novo para mostrar todos os projetos. A escolha fica salva neste dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura de tela: Filtro de projetos recentes"></a> |
|
|
63
71
|
| **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> |
|
|
64
72
|
| **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> |
|
|
65
73
|
| **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> |
|
|
66
74
|
| **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> |
|
|
67
|
-
| **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. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel (iPhone)"></a> |
|
|
75
|
+
| **Conexão móvel (iPhone)** | <a id="feature-mobileconnect"></a>Use o dsh no seu iPhone com o app [Tether](tether/), na mesma rede Wi-Fi ou pelo [Tailscale](https://tailscale.com). Ative em **Configurações → Composer Plus** (o recurso vem desativado por padrão, porque abre uma porta de rede neste Mac). Depois, clique em **Conexão móvel** no canto inferior esquerdo da barra lateral: leia o código QR com a Câmera do iPhone (toque em **Open in Tether**) ou com **Scan code** no Tether, toque em **Connect** e clique em **Approve**. Instale o Tether antes: sem ele, a Câmera não consegue abrir o código. O celular mostra seus chats, envia mensagens (com fotos: o **+** do editor de mensagens → Camera, Photos ou Paste image), responde a aprovações e perguntas, e troca de modelo e de agente. Pareie quantos Macs quiser: o nome do Mac no canto superior esquerdo do app alterna entre eles. O painel **Conexão móvel** lista os iPhones pareados com a última conexão de cada um: **Remove** desconecta um deles na hora. “Tailscale only” recusa a rede local (para um Wi-Fi compartilhado), e o registro de acesso mostra quem tentou se conectar. No Tether, “Settings → Privacy” bloqueia o app com o Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura de tela: Conexão móvel (iPhone)"></a> |
|
|
68
76
|
| **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> |
|
|
69
77
|
|
|
70
78
|
<!-- END GENERATED FEATURES -->
|
|
@@ -73,7 +81,7 @@ Botões, dicas, avisos e notificações seguem o idioma selecionado no dsh (veja
|
|
|
73
81
|
|
|
74
82
|
## Configurações
|
|
75
83
|
|
|
76
|
-
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
|
|
84
|
+
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**, **Previsão da próxima mensagem** e **Verificação da meta**, 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**), o de **Melhorar prompt**, o de **Verificação da meta** (ambos por padrão **Igual ao modelo do chat**) e o **Limite de tempo** de **Permitir neste chat** (1 hora por padrão). **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.**
|
|
77
85
|
|
|
78
86
|
<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>
|
|
79
87
|
|
|
@@ -87,7 +95,7 @@ English · 中文 · Türkçe · Español · Português (Brasil) · Français ·
|
|
|
87
95
|
|
|
88
96
|
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.
|
|
89
97
|
|
|
90
|
-
Cada pacote tem 3.
|
|
98
|
+
Cada pacote tem 3.280 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.
|
|
91
99
|
|
|
92
100
|
## Atalhos de teclado
|
|
93
101
|
|
|
@@ -107,6 +115,12 @@ Cada pacote tem 3.143 textos: todos os textos da interface do dsh `0.2.0-rc.2` e
|
|
|
107
115
|
| `Tab` | editor de mensagens vazio com uma previsão | colocar a previsão no editor |
|
|
108
116
|
| `Tab` | complemento cinza após o cursor | adicionar o complemento à mensagem |
|
|
109
117
|
| `Esc` | editor de mensagens vazio com uma previsão | esconder a previsão |
|
|
118
|
+
| `Cmd/Ctrl+Z` | editor de mensagens, depois de **Melhorar prompt** | trazer de volta o texto que você digitou |
|
|
119
|
+
| `Esc` | editor de mensagens, enquanto **Melhorar prompt** trabalha | cancelar a melhoria |
|
|
120
|
+
| `Enter` / `Esc` | mensagem na fila em que você clicou duas vezes | salvar / cancelar a edição |
|
|
121
|
+
| `Cmd+F` no Mac, `Ctrl+F` no Windows e no Linux | chat aberto | abrir **Buscar no chat** |
|
|
122
|
+
| `Enter` / `Shift+Enter`, `↓` / `↑` | caixa do **Buscar no chat** | próxima / anterior ocorrência |
|
|
123
|
+
| `Esc` | caixa do **Buscar no chat** | fechar a caixa |
|
|
110
124
|
|
|
111
125
|
Um menu `/` ou `@` aberto fica com essas teclas para ele.
|
|
112
126
|
|
|
@@ -119,19 +133,24 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
|
|
|
119
133
|
- **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.
|
|
120
134
|
- **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.
|
|
121
135
|
|
|
122
|
-
- **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.
|
|
123
|
-
- **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 --
|
|
136
|
+
- **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 lista até 1000 branches locais e remotos e mostra os 300 commits mais recentes de um branch: a linha do primeiro pai, então um commit de merge representa os commits que ele trouxe. Ela nunca troca de branch (checkout). **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.
|
|
137
|
+
- **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`, …), um esboço do resto do README (títulos, linhas de tabela, itens de lista; no máximo 6 kB) e os títulos dos commits mais recentes (`git log --format=%s`, no máximo 6 kB), no máximo 28 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.
|
|
124
138
|
- **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`.
|
|
125
|
-
- **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`.
|
|
139
|
+
- **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).
|
|
140
|
+
- **Abrir issue no GitHub** (Ideias de recursos → lista **Depois**): só é executado quando você clica. A parte Host executa o seu próprio GitHub CLI (`gh issue create`) na pasta do chat, com o título e o resumo salvos da ideia (e por que ela importa); o `gh` usa o próprio login e o remoto do GitHub da pasta, então a issue vai para esse repositório com a sua conta, e o GitHub a mostra para todos que podem ver esse repositório. O dsh remove dos comandos que inicia as variáveis com nome de token; se você deu um token ao `gh` por `GH_TOKEN` ou `GITHUB_TOKEN`, o plugin passa só essas variáveis ao `gh`. O link da issue fica guardado com a ideia em `later.json`.
|
|
141
|
+
- **Chats que alteraram este arquivo** (Alterações, menu "…" de um arquivo): a parte Host lê os registros dos chats cuja pasta está no mesmo repositório, do jeito que o dsh os guarda, e responde com o título de cada chat, o horário e a primeira linha do pedido; ela nunca abre o arquivo em si.
|
|
142
|
+
- **Branch do Git nas linhas de chat:** a parte Host executa `git branch --show-current` (somente leitura) na pasta do chat quando um turno começa e quando termina, e guarda só o ID do chat, o nome do branch e o horário em `$DSH_HOME/storages/dsh-composer-plus/session-branches.json` (arquivo só para o dono, os 2000 chats mais recentes). A chave fica em `branches.json`, ao lado dele.
|
|
143
|
+
- **Buscar no chat** roda só na página: ele lê o texto que a página mostra e não envia nada.
|
|
126
144
|
- **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.
|
|
127
145
|
- **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.
|
|
128
|
-
- **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.
|
|
146
|
+
- **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.
|
|
129
147
|
- A Revisão automática continua sendo executada em toda chamada; falhas de revisão nunca são permitidas automaticamente.
|
|
130
|
-
- **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. Dados: `$DSH_HOME/storages/dsh-composer-plus/mobile
|
|
148
|
+
- **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).
|
|
131
149
|
- **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.
|
|
132
150
|
- **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).
|
|
133
151
|
- **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).
|
|
134
152
|
- **Melhorar prompt:** nada é executado até você clicar na varinha mágica. Então a parte Host envia o seu rascunho, as suas próprias mensagens do chat e as respostas em texto do agente (sem saída de ferramentas, sem contexto oculto, sem raciocínio e sem mensagens revertidas; no máximo cerca de 6.000 caracteres, a parte mais recente), o mesmo resumo do projeto usado em **Ideias de recursos** (com as mesmas regras de arquivos: sem `.env*` nem arquivos de chave, sem symlink para fora da pasta, sem FIFO), os caminhos que o `git status` lista como alterados e até 30 caminhos rastreados ou não rastreados (não ignorados) cujos nomes têm palavras em comum com o seu rascunho, para o modelo escolhido em **Melhorar prompt** (por padrão, o próprio modelo do chat), como uma única solicitação. Nenhum outro conteúdo de arquivo além desse resumo é enviado. Nada é gravado no chat nem no projeto: a resposta só substitui o seu rascunho no editor de mensagens, e você decide se vai enviá-lo. O modelo escolhido fica em `$DSH_HOME/storages/dsh-composer-plus/improve.json` (arquivo só para o dono).
|
|
153
|
+
- **Verificação da meta:** só é executada quando o agente marca uma `/goal` como concluída em uma rodada automática (ou quando você clica em **Executar agora**). A parte Host executa o comando de teste na pasta do chat, no modo sandbox do chat (como a própria ferramenta `bash` do dsh: a mesma política de acesso a arquivos; quando esse sandbox não consegue iniciar, o teste não é executado e a verificação falha). Para encontrar o comando, ela lê só `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` e `pytest.ini`, como arquivos comuns dentro da pasta (sem symlink para fora dela, sem FIFO). Depois envia a meta, o chat desde o início da meta (as suas mensagens, as respostas do agente, as chamadas de ferramentas cortadas em 1.000 caracteres e os últimos 2.000 caracteres de cada resultado de ferramenta; sem raciocínio e sem passos revertidos; no máximo cerca de 60.000 caracteres, a parte mais recente), o `git status --short` e o fim da saída do teste para o modelo escolhido em **Verificação da meta** (por padrão, o próprio modelo do chat), como uma única solicitação sem ferramentas. A saída das ferramentas pode conter o que o agente leu, então essa solicitação pode ter partes dos seus arquivos, como o próprio chat. Nada é gravado no chat nem no projeto. O seu comando de teste, os limites, o último resultado (com o fim da saída) e o modelo escolhido ficam em `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (arquivo só para o dono, os 500 chats mais recentes).
|
|
135
154
|
|
|
136
155
|
## Solução de problemas
|
|
137
156
|
|
|
@@ -144,8 +163,13 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
|
|
|
144
163
|
- **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.
|
|
145
164
|
- **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.
|
|
146
165
|
- **Excluir diz que outro dsh está com este chat aberto:** um segundo dsh no mesmo dsh home está com o bloqueio do chat. Feche essa janela ou esse dsh e exclua de novo. Enquanto isso, o chat continua arquivado.
|
|
166
|
+
- **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.
|
|
147
167
|
- **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).
|
|
148
|
-
- **
|
|
168
|
+
- **Abrir issue no GitHub diz "gh could not open the issue":** a mensagem é a primeira linha do próprio `gh`. Execute `gh auth status` em um terminal e faça login com `gh auth login`; a pasta do chat precisa ter um remoto do GitHub (`git remote -v`). "not installed or not on the PATH of dsh" significa que o dsh não encontrou o `gh`: instale-o ou inicie o dsh a partir de um terminal em que o `gh` funcione.
|
|
169
|
+
- **Nenhuma etiqueta de branch em uma linha de chat:** o chat não teve nenhum turno desde que você instalou esta versão, a pasta dele não é um repositório git, ou **Branch do Git nas linhas de chat** está desativado. Depois de uma atualização, reinicie o dsh (a parte Host registra o branch).
|
|
170
|
+
- **Verificação da meta diz que o teste saiu com o código 127 ou "not found":** o dsh iniciado pelo Finder ou pelo Dock pode ter um PATH mais curto que o do seu terminal, então ele não encontra `npm`, `pnpm` ou `cargo`. Inicie o dsh a partir de um terminal ou defina o seu próprio comando de teste com o caminho completo em **Verificação da meta** → **Editar**. **Executar agora** mostra o resultado na hora.
|
|
171
|
+
- **A meta não fecha e o agente continua trabalhando:** **Verificação da meta** encontrou um teste com falha ou trabalho faltando; a linha abaixo da meta mostra o motivo (passe o mouse sobre o resultado para ver os detalhes). Corrija a causa ou o comando de teste, ou conclua a meta você mesmo com `/goal` ou com a barra da meta (isso não é verificado).
|
|
172
|
+
- **A instalação falha logo depois de uma nova versão:** informe a versão (`dsh-composer-plus@1.14.0`); veja a nota de instalação acima.
|
|
149
173
|
|
|
150
174
|
## Limites
|
|
151
175
|
|
|
@@ -161,17 +185,28 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
|
|
|
161
185
|
- **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.
|
|
162
186
|
- 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.
|
|
163
187
|
- O dsh 0.2.1 carrega uma atualização imediatamente quando a nova versão não muda nenhuma configuração do dsh; caso contrário, e no dsh 0.2.0, reinicie o dsh para carregá-la. O plugin nunca reinicia o dsh por você. Perfis web/CLI sem o gerenciador de plugins do dsh só avisam que há uma nova versão.
|
|
188
|
+
- **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.
|
|
164
189
|
- **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.
|
|
165
|
-
- **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. 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.
|
|
166
|
-
- Um link de sessão funciona dentro dos chats; clicar nele não abre o chat.
|
|
190
|
+
- **Conexão móvel** só funciona no macOS (ela usa `en0`, `openssl`, `swift` e `dns-sd`). Ela usa as portas fixas 19390 e 19391, então só um dsh em cada Mac pode executá-la por vez (cada Mac é uma entrada na lista de Macs do celular). O celular só recebe notificações enquanto o Tether está aberto ou acabou de ir para segundo plano (não há serviço de push). O app iOS ainda não está na App Store: compile-o a partir de `tether/ios` com o Xcode. "Tailscale only" ainda precisa de um endereço de Wi-Fi ou Ethernet no Mac (o gateway só inicia com um). O registro de acesso é de cada Mac e guarda só as 200 tentativas mais recentes; uma tentativa repetida em até um minuto soma um na mesma linha. O bloqueio do app Tether não oculta as prévias das notificações na Tela Bloqueada do iPhone: desative-as nos Ajustes do iOS. Os pontos verdes do Tether seguem o Mac: um chat que você abre no dsh também perde o ponto no celular. Um chat que você abre no Tether perde o ponto só nos celulares. O ponto do próprio dsh no Mac fica até você abrir o chat no Mac.
|
|
191
|
+
- Um link de sessão funciona dentro dos chats; clicar nele não abre o chat. Um link criado com **Copiar link da mensagem** só abre a mensagem no dsh 0.2.1 ou mais recente, e só a partir de uma mensagem em um chat (o dsh 0.2.0 não tem regras de texto do usuário, então ali o link é copiado, mas aparece como texto simples). Uma mensagem que uma reversão removeu, ou que a compactação tirou do histórico que o dsh carrega, não pode ser mostrada: o link avisa isso. Os botões 🔗 se prendem às linhas de mensagem do dsh; se uma atualização do dsh mudar essa marcação, eles não aparecem.
|
|
192
|
+
- **Marcar tudo como lido** muda os pontos de não lido do próprio dsh por uma parte do dsh que não é uma API pública (a lista `completionUnread` do status de sessão do dsh). Se uma atualização do dsh mudar esse nome, o item não aparece. O item fica no menu "…" do projeto no dsh, que não tem espaço para plugins; se o dsh mudar esse menu, o item também não aparece.
|
|
193
|
+
- **Editar mensagem na fila no lugar** abre o editor de fila do próprio dsh, então tem os limites dele: uma mensagem com imagens ou arquivos não pode ser editada, e uma mensagem que começou a ser enviada nesse meio-tempo não é alterada (o dsh mostra o próprio erro).
|
|
194
|
+
- **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.
|
|
195
|
+
- **Este chat** conta só os arquivos que as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`) gravaram. Arquivos que um comando (`bash`) alterou não estão nesta visão; eles aparecem em **Não confirmadas**. Sem um snapshot de Reverter turno do chat (Reverter turno desativado, dsh-rewind-plugin instalado ou um chat mais antigo que o plugin), a visão compara com o último commit e avisa isso. Reverter turno guarda os 50 snapshots mais recentes de um chat: num chat mais longo, a visão compara com o mais antigo guardado, informa a partir de qual mensagem e não conta as alterações anteriores. **Ocultar alterações de espaço em branco** é `git diff -w`: uma linha que mudou só nos espaços dentro dela também fica oculta.
|
|
196
|
+
- **Abrir issue no GitHub** precisa do GitHub CLI (`gh`) no PATH do dsh e de um remoto do GitHub na pasta do chat. Ele roda no máximo 60 s; se o `gh` demorar mais, a issue pode existir no GitHub sem o link dela na lista (antes de clicar de novo, olhe no GitHub: a lista só lê o link de uma execução concluída, então um novo clique pode abrir uma segunda issue). Uma pasta com mais de um remoto do GitHub usa o padrão do próprio `gh` (`gh repo set-default`).
|
|
197
|
+
- **Chats que alteraram este arquivo** só conhece as ferramentas de arquivo do dsh (`write`, `edit`, `str_replace_editor`), como **Este chat**: uma alteração feita por um comando (`bash`) não aparece na lista. Ele lê os 300 chats mais recentes do repositório (pela data de criação) e avisa quando há mais; mostra no máximo 100 linhas. Um arquivo renomeado aparece com o nome que a ferramenta escreveu. Um chat cuja pasta fica fora do repositório (também por outro caminho para os mesmos arquivos) não é contado. A primeira abertura depois de iniciar o dsh lê todos os registros de chat do repositório (cerca de 4 s para 275 chats); as aberturas seguintes leem só os chats que mudaram desde então.
|
|
198
|
+
- **Branch do Git nas linhas de chat** mostra o branch da pasta do chat quando o último turno dele começou ou terminou, não o branch atual: uma troca de branch fora de um turno aparece depois do próximo turno. Chats de antes desta versão não mostram etiqueta até o próximo turno. A etiqueta fica na marcação das linhas de chat do dsh (o dsh não tem um espaço ali); se uma atualização do dsh mudar essa marcação, nenhuma etiqueta aparece.
|
|
199
|
+
- **Buscar no chat** busca só no que a página mostra: as mensagens e respostas carregadas (role para cima ou clique em **Carregar anteriores** para ver as mais antigas), não as etapas de ferramenta fechadas nem o texto recolhido dentro da saída de uma ferramenta. Ele conta no máximo 2.000 ocorrências (depois, "2000+"). Ele usa a API de destaque do navegador (Chromium 105 ou mais recente; o app para desktop tem): em um navegador mais antigo, a contagem e os saltos funcionam sem a cor. `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) só o abre enquanto há um chat na tela; em outros lugares, a busca do próprio navegador funciona como antes. No Mac, `Ctrl+F` mantém seu uso do macOS nos campos de texto (o cursor avança um caractere).
|
|
167
200
|
- Uma notificação enviada antes de reiniciar só traz o dsh para a frente quando você clica nela.
|
|
168
201
|
- 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.
|
|
169
202
|
- O dsh não tem um ponto de extensão no menu de opções de exibição da barra lateral, então a opção de projetos recentes é adicionada ao próprio menu do dsh. Se uma atualização do dsh mudar esse menu, a opção não aparece e todos os projetos continuam visíveis. O filtro funciona nas linhas de projeto, então **Em uma única lista** não é filtrada. Use o filtro com **Workspace**: em **Árvore de workspaces**, uma pasta pai oculta também esconde os projetos ativos dentro dela. **Por status** tem o mesmo tipo de limite: o dsh não tem um espaço para ordenação, então o item e a ordem das linhas se prendem à marcação do menu e da lista do dsh.
|
|
170
203
|
- 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.
|
|
171
204
|
- O dsh também não tem um ponto de extensão no menu de projetos de um novo chat, então a caixa **Buscar projetos** e a ordem A–Z se prendem à marcação do menu do dsh. Se uma atualização do dsh mudar essa marcação, o menu aparece como o dsh o desenha: na ordem salva e sem a caixa. A ordem A–Z é só uma visualização: ela não muda a ordem de projetos salva do dsh.
|
|
205
|
+
- O dsh também não tem um ponto de extensão que escolha onde **Nova sessão** abre. **Espaço de trabalho padrão para Nova sessão** envolve um método do dsh que não é uma API pública (`startSession` do serviço de espaços de trabalho do dsh). Se uma atualização do dsh renomeá-lo, **Nova sessão** abre onde o dsh escolher (o projeto aberto ou o mais recente). Toda chamada que não indica um projeto usa o padrão: o botão da barra lateral, seu atalho, o logotipo e também **Nova** na página **Tarefas de automação**. O dsh ainda abre o último chat ao iniciar. A pasta geral é criada e adicionada aos seus projetos no primeiro uso; no Windows ou Linux com a pasta Documents movida, ela pode ser diferente da pasta do próprio dsh.
|
|
172
206
|
- 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.
|
|
173
207
|
- **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.
|
|
174
208
|
- **Melhorar prompt** vê só um resumo curto do projeto, os caminhos alterados e os caminhos cujos nomes combinam com as suas palavras: não o código em si. Por isso, pode não encontrar o arquivo certo, e só cita caminhos que recebeu. Leia o novo texto antes de enviá-lo. Ele não é executado em um comando de barra nem em uma mensagem com um chip de arquivo ou de símbolo (o novo texto é texto simples, então o chip se perderia), e uma mensagem pode ter no máximo 8.000 caracteres. As imagens continuam anexadas: só o texto muda. Cada clique custa uma chamada ao modelo; um modelo forte pode levar um minuto (`Esc` cancela).
|
|
209
|
+
- **Verificação da meta** verifica só uma conclusão que o agente faz em uma rodada automática da meta: uma conclusão que você pede no chat, `/goal` e a barra da meta não são verificados. O agente pode alterar os testes ou os arquivos do comando de teste por conta própria; o verificador lê o chat e pode ver isso, mas pode errar nos dois sentidos (um "não concluída" errado custa mais uma rodada; um "concluída" errado fecha a meta). O verificador vê o chat e o `git status`, não o código em si. Uma execução de teste só é reaproveitada quando o passo mais recente do agente que pode alterar arquivos foi a sua própria execução bem-sucedida de `bash` com exatamente o mesmo comando na mesma pasta; um comando com pipe (`| tail`) ou `&&` não é reaproveitado. O orçamento é medido quando um turno termina, então um turno pode ultrapassá-lo. Só contam as chamadas ao modelo do próprio chat (não as dos subagentes dele). `update_goal` espera enquanto a verificação é executada (o teste no máximo 15 minutos, o verificador no máximo 3 minutos). Uma bifurcação recebe um novo id de chat, então começa sem o comando de teste e os limites próprios do chat original. Cada conclusão que chega ao verificador custa uma chamada ao modelo.
|
|
175
210
|
- 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).
|
|
176
211
|
|
|
177
212
|
## Perguntas frequentes
|
|
@@ -198,9 +233,29 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
|
|
|
198
233
|
|
|
199
234
|
**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**.
|
|
200
235
|
|
|
236
|
+
**O agente pode parar de marcar o próprio trabalho como concluído, como nos loops de verificação da loop engineering?** Sim, com **Verificação da meta** (ativada por padrão): comece uma meta com `/goal`. Quando o agente diz que a meta foi concluída, os testes do projeto são executados e uma chamada independente ao modelo confere a meta com o chat; se algum dos dois falhar, a meta continua aberta e o agente lê o motivo. Defina o seu próprio comando de teste, um limite de tempo ou um limite de tokens com **Editar** na linha **Verificação da meta** abaixo da meta.
|
|
237
|
+
|
|
201
238
|
**Como reordeno as mensagens na fila do dsh?** Arraste a alça ⠿ de uma mensagem na fila, ou coloque o foco nela e pressione `↑` / `↓`.
|
|
202
239
|
|
|
203
|
-
**Como
|
|
240
|
+
**Como corrijo um erro de digitação em uma mensagem na fila?** Dê um clique duplo na mensagem na fila, altere o texto e pressione `Enter` (`Esc` cancela). Ela mantém o lugar na fila.
|
|
241
|
+
|
|
242
|
+
**Como limpo de uma vez todos os pontos de não lido de um projeto?** Barra lateral → botão **…** do projeto → **Marcar tudo como lido**.
|
|
243
|
+
|
|
244
|
+
**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.
|
|
245
|
+
|
|
246
|
+
**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.
|
|
247
|
+
|
|
248
|
+
**Qual chat alterou este arquivo?** Barra lateral direita → **Alterações** → **…** do arquivo → **Chats que alteraram este arquivo**. Clique em uma linha para abrir esse chat no pedido que fez a alteração.
|
|
249
|
+
|
|
250
|
+
**Posso buscar dentro de um chat longo?** Sim: pressione `Cmd+F` no Mac (`Ctrl+F` no Windows e no Linux) no chat. **Buscar no chat** destaca todas as ocorrências e passa de uma para outra com `Enter` e `Shift+Enter`.
|
|
251
|
+
|
|
252
|
+
**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.
|
|
253
|
+
|
|
254
|
+
**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**.
|
|
255
|
+
|
|
256
|
+
**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.
|
|
257
|
+
|
|
258
|
+
**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.
|
|
204
259
|
|
|
205
260
|
**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.
|
|
206
261
|
|
|
@@ -214,6 +269,12 @@ Testado no dsh `0.2.0-rc.2` (desktop e web) e `0.2.1-rc.2` (web). A CI executa o
|
|
|
214
269
|
|
|
215
270
|
**Como uso o dsh no meu iPhone?** Compile o app Tether a partir de `tether/ios` (Xcode), ative **Configurações → Composer Plus → Conexão móvel (iPhone)**, clique em **Conexão móvel** no canto inferior esquerdo, leia o código QR (com a Câmera do iPhone ou com **Scan code** no Tether), toque em **Connect** e clique em **Approve**. Longe de casa, use o Tailscale nos dois aparelhos.
|
|
216
271
|
|
|
272
|
+
**Como faço Nova sessão abrir sempre no mesmo projeto?** Configurações → Composer Plus → **Espaço de trabalho padrão para Nova sessão** → **Abrir Nova sessão em** → escolha o projeto. O `+` ao lado de outro projeto continua abrindo esse projeto.
|
|
273
|
+
|
|
274
|
+
**Como trabalho em vários recursos de um projeto ao mesmo tempo, cada um no seu próprio branch?** Com **Um branch por chat**: novo chat → o botão ⑂ main → **Novo branch**, depois envie a primeira mensagem. Cada chat ganha o próprio branch e a própria pasta de worktree, com o seu `.env` e o seu `node_modules` quando o `.worktreeinclude` os lista. O cabeçalho do chat mostra em qual branch você está.
|
|
275
|
+
|
|
276
|
+
**Posso enviar uma foto do meu iPhone?** Sim. Em um chat do Tether, toque em **+** ao lado do campo de mensagem → Camera, Photos (até 4) ou Paste image. As fotos vão para o chat no Mac como anexos da sua mensagem, então o modelo as vê.
|
|
277
|
+
|
|
217
278
|
**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).
|
|
218
279
|
|
|
219
280
|
## Desenvolvimento
|
|
@@ -250,6 +311,22 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-content-search.mjs /path
|
|
|
250
311
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-turn-rollback.mjs /path/to/dsh/lib/bin.js
|
|
251
312
|
# 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
|
|
252
313
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path/to/dsh/lib/bin.js
|
|
314
|
+
# Goal check (fake model, made-up project): a failing test and a verifier "not done" keep the goal open, the agent's own test run is reused, a pass closes it, a token budget blocks it + its thumbnail
|
|
315
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
|
+
# Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
|
|
317
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
|
|
318
|
+
# Changes Tree (fake model, made-up git history): branch list, a branch's commits, commit files and diffs, back marks the row + its thumbnail
|
|
319
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
|
+
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
|
+
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
323
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-predict.mjs /path/to/dsh/lib/bin.js
|
|
324
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-complete.mjs /path/to/dsh/lib/bin.js
|
|
325
|
+
# Project search in a new chat: A–Z order, filter, Enter + its thumbnail
|
|
326
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path/to/dsh/lib/bin.js
|
|
327
|
+
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
253
330
|
```
|
|
254
331
|
|
|
255
332
|
```sh
|
|
@@ -260,7 +337,7 @@ npm test
|
|
|
260
337
|
|
|
261
338
|
**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).
|
|
262
339
|
|
|
263
|
-
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`.
|
|
340
|
+
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)). O [docs/ROUTES.md](docs/ROUTES.md) lista cada rota do Host, a requisição dela e se o Tether pode chamá-la. `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`.
|
|
264
341
|
|
|
265
342
|
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:
|
|
266
343
|
|