dsh-composer-plus 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.de.md +67 -14
- package/README.es.md +67 -14
- package/README.fr.md +67 -14
- package/README.hi.md +67 -14
- package/README.id.md +67 -14
- package/README.ja.md +67 -14
- package/README.ko.md +67 -14
- package/README.md +67 -14
- package/README.pt-BR.md +67 -14
- package/README.ru.md +67 -14
- package/README.tr.md +67 -14
- package/README.vi.md +67 -14
- package/README.zh.md +67 -14
- package/assets/features/autoBackup.webp +0 -0
- package/assets/features/backup.webp +0 -0
- package/assets/features/branchTree.webp +0 -0
- package/assets/features/changesPanel.webp +0 -0
- package/assets/features/idleSwitch.webp +0 -0
- package/assets/features/projectMemory.webp +0 -0
- package/assets/features/questionFit.webp +0 -0
- package/assets/features/queueEdit.webp +0 -0
- package/assets/features/rescueConsole.webp +0 -0
- package/assets/features/sessionDoctor.webp +0 -0
- package/assets/features/stopSendFirst.webp +0 -0
- package/backup.mjs +1069 -0
- package/client.js +1218 -175
- package/index.js +1573 -36
- package/package.json +3 -2
- package/tether/gateway/server.mjs +1 -1
package/README.es.md
CHANGED
|
@@ -29,7 +29,7 @@ dsh plugin --profile web add dsh-composer-plus
|
|
|
29
29
|
|
|
30
30
|
Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de eso se encarga la app).
|
|
31
31
|
|
|
32
|
-
> El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.
|
|
32
|
+
> El pnpm de dsh omite las versiones publicadas hace menos de 24 horas. Justo después de una versión nueva, añade la versión: `dsh-composer-plus@1.16.0`.
|
|
33
33
|
|
|
34
34
|
## Funciones
|
|
35
35
|
|
|
@@ -37,7 +37,7 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
37
37
|
|
|
38
38
|
| Función | Cómo usarla | Captura |
|
|
39
39
|
|---|---|---|
|
|
40
|
-
| **Panel de cambios** | <a id="feature-changespanel"></a>Barra lateral derecha → `+` → **Cambios**.
|
|
40
|
+
| **Panel de cambios** | <a id="feature-changespanel"></a>Barra lateral derecha → `+` → **Cambios**. La página se abre en **Árbol**: un mapa de ramas del repositorio del chat. Tres tarjetas cuentan las ramas: todas, las fusionadas y las pendientes de fusionar. Haz clic en una tarjeta para mostrar solo esas ramas; haz clic en ella otra vez para mostrarlas todas. Cada rama es un cuadro con su último commit: verde cuando la rama principal tiene su trabajo, naranja cuando no, azul para la rama principal. Una flecha va de cada rama a la rama que la incorporó (✅ **Fusionada**) o a la rama de la que partió (⏳ **Pendiente**, discontinua). Haz clic en un cuadro para ver los commits de la rama y luego en un commit para ver sus archivos y sus diffs. Haz clic en **Fusionada** para ver los archivos del commit de fusión, o en **Pendiente** para ver los archivos que la rama trae a su destino. Una rama remota solo se muestra cuando ninguna rama local tiene el mismo nombre. En el menú de modos, elige **Sin confirmar**, **Sin preparar**, **Preparados** o **Rama** para ver los archivos cambiados con sus contadores `+/-`; haz clic en un archivo para ver su diff. **Último turno** abre la revisión propia de dsh del último turno. **Este chat** muestra solo los archivos que escribieron las herramientas de archivos del chat abierto (write, edit), en todos sus turnos, y su diff total desde su primer mensaje. El botón **␣** oculta los cambios de espacios en blanco (`git diff -w`): no se muestran las líneas que solo cambiaron en la sangría o en los finales de línea. El menú **…** de un archivo → **Chats que cambiaron este archivo** muestra los chats del mismo repositorio cuyas herramientas de escritura o edición cambiaron ese archivo, del más reciente al más antiguo, con la petición que lo hizo; un clic abre ese chat en esa petición. | <a href="assets/features/changesPanel.webp"><img src="assets/features/changesPanel.webp" width="160" alt="Captura: Panel de cambios"></a> |
|
|
41
41
|
| **Ideas de funciones** | <a id="feature-featureideas"></a>Barra lateral derecha → `+` → **Ideas de funciones** → **Sugerir funciones**. El modelo del propio chat lee un breve resumen del proyecto del chat (los archivos del nivel superior, el principio del README y del manifiesto, un esquema del resto del README, los títulos de los commits recientes) y sugiere hasta 8 funciones. Las muestra como un montón de tarjetas en el idioma de la interfaz de dsh. Desliza una tarjeta hacia la derecha (o haz clic en **✓**, o pulsa `→`; en todos los casos la tarjeta sale volando hacia su lado) para iniciar un nuevo chat en el mismo proyecto: empieza en modo plan con la idea como petición, así que nada cambia antes de que apruebes el plan. Para saltarte el plan, haz clic en **▶ Crear ahora** (o pulsa `↑`; la tarjeta sale volando hacia arriba): el nuevo chat empieza enseguida con la idea como una petición normal, y el modelo hace el cambio y ejecuta sus comprobaciones (las aprobaciones se aplican como siempre). Desliza hacia la izquierda (o **✕**, o `←`) para omitirla; **Deshacer** (o `Z`) recupera una tarjeta omitida. Haz clic en **↓** (o pulsa `↓`) para guardar una buena idea para más tarde: va a la lista **Después** del proyecto, que aparece en todos los chats de la misma carpeta de proyecto (también tras un reinicio). **Después (N)** abre la lista; **Planificar** inicia el mismo chat en modo plan para la idea y **Crear ahora**, el chat sin plan; los dos la quitan de la lista. **Planificar todo (N)** inicia un solo chat en modo plan para todas las ideas de la lista, así que las partes comunes se planifican una sola vez. **Quitar de la lista** la elimina. **Copiar como lista de tareas** copia toda la lista al portapapeles como una lista de tareas de Markdown (`- [ ] Title — Summary`, una línea por idea) para un gestor de incidencias o un archivo TODO; no hace ninguna llamada de red. **Abrir issue en GitHub** en una idea abre una issue con su título y su resumen (y por qué importa) en el repositorio de GitHub del proyecto, con tu propia sesión de GitHub CLI (`gh`); después aparece junto a la idea el enlace **Issue #N**, que abre la issue. **Más ideas** añade tarjetas. Para recibir ideas sobre un solo tema, escribe un **Tema de enfoque** corto en el campo junto a **Sugerir funciones** (como máximo 80 caracteres; `Enter` también pide sugerencias), o haz clic en uno de los temas fijos que hay debajo: **Rendimiento**, **Accesibilidad**, **Pruebas**, **Seguridad**, **Usabilidad** o **Documentación** (haz clic otra vez para quitarlo). Entonces el modelo solo sugiere funciones sobre ese tema; un campo vacío significa cualquier función. Las ideas no se sugieren dos veces en un proyecto: cada idea sugerida (omitida, guardada o iniciada) va al **Historial** del proyecto, se le indica al modelo que no vuelva a sugerirlas y se descarta un título repetido. **Historial** las muestra como **Iniciada** o **Sugerida**; **Olvidar** (u **Olvidar todo**) deja que una vuelva a aparecer; una idea que sigue en la lista **Después** queda fuera de las sugerencias hasta que la quitas de allí. El modelo solo se ejecuta cuando haces clic. | <a href="assets/features/featureIdeas.webp"><img src="assets/features/featureIdeas.webp" width="160" alt="Captura: Ideas de funciones"></a> |
|
|
42
42
|
| **Búsqueda en el contenido** | <a id="feature-contentsearch"></a>La búsqueda propia de la barra lateral de dsh (la lupa junto a **Espacios de trabajo**; `Cmd+K` en la app de escritorio, `Cmd+Alt+K` en un navegador) también encuentra chats por las palabras de tus mensajes y de las respuestas, no solo por el título, y muestra el texto que coincide debajo del chat. dsh ya incluye esta búsqueda, pero viene desactivada; esta función la activa con un archivo de índice de búsqueda en tu equipo. El índice se crea en la primera búsqueda después de iniciar dsh (unos 15 s para 250 chats, consulta Límites) y se conserva para los siguientes inicios. Activada de forma predeterminada; un cambio se aplica después de reiniciar dsh. | <a href="assets/features/contentSearch.webp"><img src="assets/features/contentSearch.webp" width="160" alt="Captura: Búsqueda en el contenido"></a> |
|
|
43
43
|
| **Revertir turno** | <a id="feature-turnrollback"></a>Pasa el puntero por encima de uno de tus mensajes y haz clic en **↶** (junto a Copiar). **Solo el chat** quita ese mensaje y todo lo que viene después (respuestas, llamadas a herramientas) del chat y del contexto del modelo, y vuelve a poner el mensaje en el editor: cámbialo y envíalo de nuevo. **Chat y archivos** primero muestra los archivos del proyecto que cambiaron desde ese mensaje y después también los devuelve a su estado anterior, incluidos los cambios hechos por comandos (`bash`), no solo por las herramientas de edición de dsh. Si hay un turno en ejecución, primero se detiene. El registro del chat nunca se reescribe: un marcador oculto esconde la parte retirada, igual que el propio `/compact` de dsh esconde los mensajes antiguos. Si [dsh-rewind-plugin](https://www.npmjs.com/package/dsh-rewind-plugin) está instalado, ese plugin hace este trabajo y Composer Plus no muestra un segundo botón. Después de revertir, aparece una barra **Rehacer** encima del editor: inicia un chat nuevo desde justo antes de revertir (los mismos mensajes y el mismo contexto) y, con **Chat y archivos**, devuelve también los archivos. Un archivo que cambiaste después de revertir aparece en la lista y se conserva, salvo que marques la casilla que lo sobrescribe. | <a href="assets/features/turnRollback.webp"><img src="assets/features/turnRollback.webp" width="160" alt="Captura: Revertir turno"></a> |
|
|
@@ -46,10 +46,12 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
46
46
|
| **Historial de entrada** | <a id="feature-inputhistory"></a>Con el editor vacío, pulsa `↑` / `↓` para recorrer los mensajes que enviaste, como en una terminal. | <a href="assets/features/inputHistory.webp"><img src="assets/features/inputHistory.webp" width="160" alt="Captura: Historial de entrada"></a> |
|
|
47
47
|
| **Modo plan con Shift+Tab** | <a id="feature-plantoggle"></a>`Shift+Tab` añade `/plan ` al principio del borrador (púlsalo otra vez para quitarlo). Si el chat ya está en modo plan, `Shift+Tab` sale de él. | <a href="assets/features/planToggle.webp"><img src="assets/features/planToggle.webp" width="160" alt="Captura: Modo plan con Shift+Tab"></a> |
|
|
48
48
|
| **Mantener el foco en el editor** | <a id="feature-keepfocus"></a>Después de enviar un comando `/` o una skill, el cursor se queda en el editor y puedes volver a escribir enseguida. También funciona con macros de teclado que escriben un comando y pulsan `Enter`. dsh pone el editor en solo lectura mientras resuelve el comando, y entonces el navegador le quita el foco. Esta función le devuelve el foco, salvo que lo tenga un menú, un diálogo u otro campo. | <a href="assets/features/keepFocus.webp"><img src="assets/features/keepFocus.webp" width="160" alt="Captura: Mantener el foco en el editor"></a> |
|
|
49
|
+
| **Ajustar la tarjeta de pregunta a la ventana** | <a id="feature-questionfit"></a>Cuando el agente te hace una pregunta, la pregunta y sus respuestas se desplazan juntas en la tarjeta, y **Omitir** y **Enviar** siguen a la vista abajo. La tarjeta usa la altura de la ventana (menos 200 px para la cabecera del chat y una franja del chat), así que crece y se reduce con la ventana. Sin esta función, dsh limita la tarjeta al 60 % de la ventana (520 px como máximo) y solo se desplazan las respuestas: una pregunta larga puede dejar fuera de la tarjeta su propio final, las respuestas y los botones. | <a href="assets/features/questionFit.webp"><img src="assets/features/questionFit.webp" width="160" alt="Captura: Ajustar la tarjeta de pregunta a la ventana"></a> |
|
|
49
50
|
| **Continuar con un clic** | <a id="feature-continuebutton"></a>Después de un turno detenido, fallido o cortado, el editor vacío muestra **▶**. Un clic reanuda la conversación existente sin escribir en el campo de entrada ni añadir un mensaje visible al chat (el modelo recibe una breve nota oculta de “continúa desde donde te detuviste”, porque algunos proveedores, como Claude, rechazan una petición que termina con una respuesta del asistente). Los mensajes de la cola se quedan en ella: ▶ continúa solo la tarea detenida y después se ejecuta la cola. Un turno completado mantiene el botón normal de enviar. | <a href="assets/features/continueButton.webp"><img src="assets/features/continueButton.webp" width="160" alt="Captura: Continuar con un clic"></a> |
|
|
50
51
|
| **Reanudar tras reiniciar** | <a id="feature-resumeafterrestart"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. Si sales de dsh (o se cierra) mientras un chat está trabajando, ese chat continúa solo cuando vuelves a abrir dsh, con la misma nota oculta que Continuar con un clic. Si había una ronda de un objetivo (`/goal`) en ejecución, el objetivo sigue con su siguiente ronda (dsh pausa los objetivos en cada inicio hasta que los reanudas). Los chats que detuviste, que terminaron o que fallaron no continúan. dsh no tiene ningún ajuste para esto: solo marca ese turno como interrumpido. | <a href="assets/features/resumeAfterRestart.webp"><img src="assets/features/resumeAfterRestart.webp" width="160" alt="Captura: Reanudar tras reiniciar"></a> |
|
|
51
52
|
| **Arrastrar y soltar en la cola** | <a id="feature-queuereorder"></a>Los mensajes en cola tienen un asa (⠿). Arrástrala para reordenar, o pon el foco en el asa y pulsa `↑` / `↓`. `Esc` cancela. | <a href="assets/features/queueReorder.webp"><img src="assets/features/queueReorder.webp" width="160" alt="Captura: Arrastrar y soltar en la cola"></a> |
|
|
52
|
-
| **Editar el mensaje en cola en su sitio** | <a id="feature-queueedit"></a>Haz doble clic en un mensaje en cola
|
|
53
|
+
| **Editar el mensaje en cola en su sitio** | <a id="feature-queueedit"></a>Haz doble clic en un mensaje en cola, o haz clic en su botón Editar (**Editar mensaje en cola**). Se abre un editor en la fila: cambia el texto, quita una imagen o un archivo con su ✕, o añade otros nuevos con el clip (**Añadir imágenes o archivos**) o pegando una imagen. `Enter` guarda, `Esc` cancela y `Shift+Enter` añade una línea. El mensaje conserva su lugar en la cola, y las imágenes y archivos que conservas no cambian. Mientras el editor está abierto, la cola no se puede reordenar. En Tether: menú del mensaje en cola → Edit. | <a href="assets/features/queueEdit.webp"><img src="assets/features/queueEdit.webp" width="160" alt="Captura: Editar el mensaje en cola en su sitio"></a> |
|
|
54
|
+
| **Prioridad al mensaje enviado tras Detener** | <a id="feature-stopsendfirst"></a>Activado de forma predeterminada. Detén un chat mientras hay mensajes en su cola y luego envía un mensaje nuevo: se ejecuta de inmediato y solo. Los mensajes en cola conservan su orden y se ejecutan después, uno por turno. Sin esto, dsh añade el mensaje nuevo al final de la cola y ejecuta en su lugar el primer mensaje en cola, así que el nuevo se ejecuta el último. Un mensaje que envías mientras el chat trabaja sigue esperando al final de la cola. | <a href="assets/features/stopSendFirst.webp"><img src="assets/features/stopSendFirst.webp" width="160" alt="Captura: Prioridad al mensaje enviado tras Detener"></a> |
|
|
53
55
|
| **Copiar enlace de sesión** | <a id="feature-copydeeplink"></a>Haz clic derecho en un chat de la barra lateral → **Copiar enlace de sesión**. Pega el enlace `dsh-session:…` en otro chat para adjuntar ese chat como contexto de solo lectura. dsh 0.2.1 tiene su propia opción **Copiar ID de sesión**, que copia solo el id; esta opción aparece justo después. | <a href="assets/features/copyDeeplink.webp"><img src="assets/features/copyDeeplink.webp" width="160" alt="Captura: Copiar enlace de sesión"></a> |
|
|
54
56
|
| **Copiar enlace del mensaje** | <a id="feature-copymessagelink"></a>Pasa el puntero por encima de un mensaje y haz clic en **🔗** (en su fila de acciones; en una respuesta, junto a la hora). El enlace es el enlace de sesión más el número del mensaje: `dsh-session:…#42`. Pégalo en un mensaje y envíalo: en dsh 0.2.1 y versiones posteriores, el enlace aparece como un chip. Un clic abre ese chat, se desplaza hasta el mensaje y lo resalta durante 2 segundos. Como un enlace de sesión, también adjunta ese chat como contexto de solo lectura. | <a href="assets/features/copyMessageLink.webp"><img src="assets/features/copyMessageLink.webp" width="160" alt="Captura: Copiar enlace del mensaje"></a> |
|
|
55
57
|
| **Exportar chat como Markdown** | <a id="feature-exportmarkdown"></a>Haz clic derecho en un chat de la barra lateral (o abre su menú **…**) → **Exportar como Markdown…**. Un diálogo muestra cuántos mensajes tiene el chat. **Copiar al portapapeles** copia el chat como Markdown y **Guardar archivo .md** lo guarda como `<chat title>.md` mediante la descarga del navegador (en la app de escritorio de dsh: en tu carpeta Descargas o con un diálogo para guardar, según la configuración de tu sistema). El archivo tiene el título del chat, el nombre del proyecto y la fecha, y después una sección `## Tú` o `## Asistente` por cada mensaje. Los bloques de código quedan como están; un bloque de código que un mensaje deja abierto se cierra. | <a href="assets/features/exportMarkdown.webp"><img src="assets/features/exportMarkdown.webp" width="160" alt="Captura: Exportar chat como Markdown"></a> |
|
|
@@ -57,23 +59,30 @@ Después, reinicia dsh. (La CLI no puede instalar en el perfil de escritorio: de
|
|
|
57
59
|
| **Búsqueda de proyectos en un chat nuevo** | <a id="feature-projectpicker"></a>Chat nuevo → el botón de proyecto encima del editor. Los proyectos aparecen en orden A–Z, con un cuadro **Buscar proyectos** arriba. Escribe parte de un nombre (sin distinguir mayúsculas ni acentos) y pulsa `Enter` para elegir la primera coincidencia. Si nada coincide, aparece **Ningún proyecto coincide**. El orden de proyectos guardado de dsh en la barra lateral no cambia. | <a href="assets/features/projectPicker.webp"><img src="assets/features/projectPicker.webp" width="160" alt="Captura: Búsqueda de proyectos en un chat nuevo"></a> |
|
|
58
60
|
| **Espacio de trabajo predeterminado para Nueva sesión** | <a id="feature-defaultworkspace"></a>Configuración → Composer Plus → **Espacio de trabajo predeterminado para Nueva sesión** → **Abrir Nueva sesión en**: elige un proyecto o **Carpeta general (default-workspace)** (la opción predeterminada: la propia carpeta de dsh `Documents/deepseek-harness/default-workspace`, que se crea en el primer uso). Después, **Nueva sesión** en la parte superior de la barra lateral (y su atajo) siempre abre el chat nuevo allí, también mientras está abierto un chat de otro proyecto. El `+` junto a un proyecto sigue abriendo ese proyecto, y el botón de proyecto encima del editor del chat nuevo sigue cambiando el proyecto. | <a href="assets/features/defaultWorkspace.webp"><img src="assets/features/defaultWorkspace.webp" width="160" alt="Captura: Espacio de trabajo predeterminado para Nueva sesión"></a> |
|
|
59
61
|
| **Buscar en el chat** | <a id="feature-findinchat"></a>Pulsa `Cmd+F` en un Mac (`Ctrl+F` en Windows y Linux) en un chat: se abre un cuadro de búsqueda sobre él. Escribe una palabra: se resaltan todas las coincidencias en los mensajes y respuestas que hay en pantalla, la actual con un color más intenso, y el cuadro muestra n / total. `Enter` o `↓` va a la coincidencia siguiente y `Shift+Enter` o `↑` a la anterior (también los botones de flecha); el chat desplaza la coincidencia hasta el centro. No importan las mayúsculas, los acentos ni la ı sin punto del turco. `Esc` cierra el cuadro y devuelve el cursor a donde estaba. La búsqueda sigue el chat mientras llega una respuesta. | <a href="assets/features/findInChat.webp"><img src="assets/features/findInChat.webp" width="160" alt="Captura: Buscar en el chat"></a> |
|
|
60
|
-
| **Una rama por chat** | <a id="feature-worktreechats"></a>
|
|
62
|
+
| **Una rama por chat** | <a id="feature-worktreechats"></a>En la pantalla de chat nuevo, el botón de rama (icono de rama) entre el botón de proyecto y el botón de modo muestra **Nueva rama** de forma predeterminada. Escribe el primer mensaje y envíalo. Para quedarte en la rama actual, elige «Rama actual (main)» en el mismo botón. El primer mensaje puede llevar imágenes y archivos. En modo plan, el chat nuevo también empieza en modo plan: envía el mensaje como `/plan <mensaje>` (Shift+Tab) o pon primero Chat nuevo en modo plan. La IA nombra la rama (`feat/…`, `fix/…`) a partir de ese mensaje, Composer Plus crea para ella un worktree de git en `<project>/.worktrees/`, copia los archivos ignorados que lista `.worktreeinclude` (por ejemplo `.env` y `node_modules/`) y abre allí un chat nuevo con tu mensaje. La cabecera del chat abierto muestra ⑂ rama · N cambios · ↑ ↓ (o **sin enviar**); haz clic en ella para abrir **Cambios**. El mismo menú lista los worktrees abiertos: elige uno para iniciar un chat en él. Para ver las carpetas de las ramas dentro de su proyecto en la barra lateral, elige en dsh **Opciones de vista** → **Árbol de espacios de trabajo**. | <a href="assets/features/worktreeChats.webp"><img src="assets/features/worktreeChats.webp" width="160" alt="Captura: Una rama por chat"></a> |
|
|
63
|
+
| **Ramas en el árbol de espacios de trabajo** | <a id="feature-branchtree"></a>Configuración → Composer Plus → **Ramas en el árbol de espacios de trabajo** (desactivado por defecto). Cada rama que tiene una carpeta de worktree en `<project>/.worktrees/` aparece entonces como un proyecto dentro de su proyecto; elige **Opciones de vista** → **Árbol de espacios de trabajo** de dsh para verla anidada. Una rama cuya carpeta se borra sale de la lista, y dsh muestra sus chats en **Sin agrupar**. Cuando el agente de un chat en la carpeta del proyecto crea una rama y cambia a ella (`git switch -c`, `git checkout -b`) sin cambios sin confirmar en la carpeta, la carpeta del proyecto vuelve a su rama anterior, la rama recibe su propia carpeta y el chat se mueve allí: una copia se abre en el proyecto de la rama y sigue con la tarea, y el chat anterior se archiva. La lista se revisa al iniciar, cada 30 segundos, después de cada turno y cuando vuelves a la ventana. | <a href="assets/features/branchTree.webp"><img src="assets/features/branchTree.webp" width="160" alt="Captura: Ramas en el árbol de espacios de trabajo"></a> |
|
|
61
64
|
| **Predicción del siguiente mensaje** | <a id="feature-nextprediction"></a>Activada de forma predeterminada; puedes desactivarla en **Configuración → Composer Plus**. Cuando el agente termina un turno (no uno detenido o fallido), el editor vacío muestra en gris una predicción de tu siguiente mensaje, con la indicación **Tab para aceptar**. `Tab` pone el texto en el editor, pero no lo envía. `Esc` la oculta durante ese turno. Si empiezas a escribir, también se oculta, y un turno nuevo la sustituye. El menú **Modelo** bajo el interruptor muestra los modelos propios de dsh (la misma lista que el menú de modelos de dsh). **Predeterminado de dsh** está seleccionado de forma predeterminada y sigue el modelo predeterminado de dsh. Cada turno terminado cuesta una llamada breve al modelo. En Tether, la predicción aparece encima del editor vacío: tócala para ponerla en el campo. | <a href="assets/features/nextPrediction.webp"><img src="assets/features/nextPrediction.webp" width="160" alt="Captura: Predicción del siguiente mensaje"></a> |
|
|
62
65
|
| **Completar al escribir** | <a id="feature-typingcompletion"></a>Desactivado de forma predeterminada; puedes activarlo en **Configuración → Composer Plus**. Mientras escribes, un texto gris justo después del cursor muestra cómo puede seguir tu mensaje. `Tab` lo añade al mensaje, pero no lo envía. `Esc` lo oculta. Solo sugiere tus propias palabras siguientes: nunca una respuesta para ti, ni textos de error o nombres inventados. Si el mensaje parece completo o el modelo no está seguro, no aparece nada. Si escribes las letras siguientes del texto gris, este se mantiene, sin una nueva llamada al modelo. Tiene su propio menú **Modelo** bajo su interruptor. Su primera opción, **Igual que la predicción del siguiente mensaje**, usa el modelo de **Predicción del siguiente mensaje** (es la opción predeterminada); elige otro modelo para usar uno distinto en cada función, por ejemplo un modelo más rápido para las compleciones. Hace una llamada al modelo en cada pausa mientras escribes, así que gasta muchos más tokens que la predicción: elige un modelo rápido y de bajo coste. No se ejecuta con un comando de barra, con un mensaje que tenga un chip de archivo ni cuando el cursor no está al final. En Tether, el resto aparece encima del campo mientras escribes: tócalo para añadirlo. | <a href="assets/features/typingCompletion.webp"><img src="assets/features/typingCompletion.webp" width="160" alt="Captura: Completar al escribir"></a> |
|
|
63
66
|
| **Mejorar prompt** | <a id="feature-promptimprove"></a>Escribe una petición aproximada y luego haz clic en la varita mágica (**Mejorar prompt**) junto al menú de modelos. Una llamada al modelo la reescribe como un prompt más claro: primero el objetivo, pasos numerados cortos cuando hay varias partes y la comprobación que hay que ejecutar. Lee este chat (sin los mensajes revertidos), el README, AGENTS.md y el manifiesto del proyecto, los archivos modificados y los archivos cuyo nombre coincide con tus palabras, y mantiene tu idioma. Nunca inventa nombres de archivo. El texto nuevo sustituye tu borrador, pero no se envía: léelo, edítalo y luego pulsa `Enter`. `Cmd/Ctrl+Z` recupera tu texto en un solo paso, y el botón (**Deshacer mejora**) también. Si escribes mientras trabaja, tu texto nuevo se mantiene. `Esc` o un segundo clic lo cancela. Tiene su propio menú **Modelo** en Configuración (predeterminado: **Igual que el modelo del chat**). No funciona con comandos de barra ni con un mensaje que tenga un chip de archivo. En Tether, la varita está junto al campo. | <a href="assets/features/promptImprove.webp"><img src="assets/features/promptImprove.webp" width="160" alt="Captura: Mejorar prompt"></a> |
|
|
64
67
|
| **Comprobación del objetivo** | <a id="feature-goalcheck"></a>Empieza un objetivo con `/goal`. Cuando el agente marca el objetivo como completado en una ronda automática, el objetivo solo se cierra tras dos comprobaciones. Primero, el comando de prueba del proyecto se ejecuta en la carpeta del chat, con el modo sandbox del chat. El comando es el tuyo o el que se encuentra en `package.json`, `Makefile`, `Cargo.toml`, `go.mod` o pytest. Si el paso más reciente del propio agente fue una ejecución correcta de esa prueba, no se vuelve a ejecutar. Después, una llamada independiente al modelo, sin herramientas, lee el objetivo, este chat, `git status` y el resultado de la prueba. Si una comprobación falla, el objetivo sigue activo y el agente lee el motivo; luego continúa la ronda siguiente. Una fila bajo la barra del objetivo (**Comprobación del objetivo**) muestra la prueba y el último resultado. **Editar** define tu propio comando de prueba y un límite de tiempo o de tokens; al superar el límite, el objetivo queda bloqueado. **Ejecutar ahora** ejecuta la comprobación sin cerrar el objetivo. Tiene su propio menú **Modelo** en Configuración (predeterminado: **Igual que el modelo del chat**). Cuando completas el objetivo tú mismo, no se comprueba nada. | <a href="assets/features/goalCheck.webp"><img src="assets/features/goalCheck.webp" width="160" alt="Captura: Comprobación del objetivo"></a> |
|
|
68
|
+
| **Memoria del proyecto** | <a id="feature-projectmemory"></a>Desactivada de forma predeterminada: actívala en **Configuración → Composer Plus**. Cada carpeta de proyecto tiene su propia memoria, que los chats posteriores de ese proyecto leen, como DS Bot guarda una por Bot. Después de cada turno terminado, una llamada al modelo del chat lee los mensajes nuevos (no los revertidos), guarda tus preferencias, decisiones y datos duraderos como notas breves, y cambia o elimina las antiguas. El agente también puede guardar, eliminar y buscar notas por sí mismo (`memory_remember`, `memory_forget`, `memory_recall`). Una nota también puede ser global: todos los proyectos la leen. Un chat nuevo recibe las notas en su prompt de sistema; una nota guardada después aparece desde el chat siguiente. Los archivos son Markdown en la carpeta de inicio de dsh (`storages/dsh-composer-plus/memory/`), nunca en la carpeta del proyecto. | <a href="assets/features/projectMemory.webp"><img src="assets/features/projectMemory.webp" width="160" alt="Captura: Memoria del proyecto"></a> |
|
|
65
69
|
| **Permitir en este chat** | <a id="feature-allowforchat"></a>Cuando la revisión automática te pregunta, la tarjeta de aprobación muestra **Permitir en este chat**: a partir de entonces, la misma herramienta en el mismo chat queda permitida, con cualquier argumento, hasta que termina el límite de tiempo (1 hora por defecto; elígelo en **Configuración → Composer Plus → Permitir en este chat**). Después, el agente vuelve a preguntar. Un chip en la cabecera muestra los permisos concedidos con su hora de fin y permite revocarlos. Los permisos se mantienen tras un reinicio. | <a href="assets/features/allowForChat.webp"><img src="assets/features/allowForChat.webp" width="160" alt="Captura: Permitir en este chat"></a> |
|
|
66
|
-
| **Estado del proyecto** | <a id="feature-projectstatus"></a>La fila de un proyecto en la barra lateral muestra el mismo indicador de en ejecución / en espera / terminado que sus chats, así que un proyecto contraído también te dice que un chat de dentro está trabajando o te necesita. Primero se muestra un chat que te espera, luego un chat terminado que aún no has abierto (el punto verde, también mientras otro chat sigue en ejecución) y luego el indicador de en ejecución. Pasa el puntero por encima para ver los detalles. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Estado del proyecto"></a> |
|
|
70
|
+
| **Estado del proyecto** | <a id="feature-projectstatus"></a>La fila de un proyecto en la barra lateral muestra el mismo indicador de en ejecución / en espera / terminado que sus chats, así que un proyecto contraído también te dice que un chat de dentro está trabajando o te necesita. Primero se muestra un chat que te espera, luego un chat terminado que aún no has abierto (el punto verde, también mientras otro chat sigue en ejecución) y luego el indicador de en ejecución. Pasa el puntero por encima para ver los detalles. En **Árbol de espacios de trabajo**, la fila de una carpeta superior también muestra los chats de cada proyecto que contiene (por ejemplo, cada carpeta de rama en `.worktrees/`), también cuando está contraída. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Estado del proyecto"></a> |
|
|
67
71
|
| **Rama de Git en las filas de chat** | <a id="feature-sessionbranch"></a>Cada fila de chat de la barra lateral muestra una pequeña etiqueta gris con la rama de git en la que estaba la carpeta del proyecto del chat en su último turno (por ejemplo `main` o `feature/login`; un HEAD separado muestra su id de commit corto entre paréntesis). Dos chats de un mismo proyecto en ramas distintas ya no se ven iguales, y ves enseguida cuándo vas a continuar un chat en la rama equivocada. Pasa el puntero por la etiqueta para ver el nombre completo. La parte Host lee la rama (`git branch --show-current`, solo lectura) cuando un turno empieza y cuando termina; un chat sin turnos desde que instalaste esto, o una carpeta que no es un repositorio git, no muestra etiqueta. Si la fila de proyecto sobre el chat tiene el mismo nombre que la rama (por ejemplo, una carpeta de «Una rama por chat»), la fila del chat no muestra la etiqueta, pero «En una sola lista» sí la muestra. | <a href="assets/features/sessionBranch.webp"><img src="assets/features/sessionBranch.webp" width="160" alt="Captura: Rama de Git en las filas de chat"></a> |
|
|
68
72
|
| **Marcar todo como leído** | <a id="feature-markprojectread"></a>En la barra lateral, haz clic en el botón **…** de un proyecto → **Marcar todo como leído**. Todos los chats de ese proyecto pierden su punto verde de no leído a la vez; los demás proyectos conservan los suyos. La opción aparece en gris (**No hay chats sin leer**) cuando el proyecto no tiene ninguno. | <a href="assets/features/markProjectRead.webp"><img src="assets/features/markProjectRead.webp" width="160" alt="Captura: Marcar todo como leído"></a> |
|
|
69
73
|
| **Proyectos activos primero** | <a id="feature-activeprojectsfirst"></a>Cuando un chat empieza a ejecutarse o te necesita, su proyecto sube al principio de la barra lateral con la animación de filas propia de dsh (el mismo movimiento que al arrastrarlo allí). Los proyectos terminados se quedan donde están; arrástralos a donde quieras, como siempre. Los movimientos se guardan en el orden de proyectos de dsh, así que al desactivar esta función se mantiene el orden actual. | <a href="assets/features/projectStatus.webp"><img src="assets/features/projectStatus.webp" width="160" alt="Captura: Proyectos activos primero"></a> |
|
|
70
|
-
| **Filtro de proyectos recientes** | <a id="feature-recentprojects"></a>Barra lateral → opciones de vista (icono de controles deslizantes) → **Activos en las últimas 2 horas**. Mientras está seleccionado, la barra lateral solo muestra los proyectos con un chat activo en las últimas 2 horas: un chat actualizado en ese tiempo, un chat en ejecución o en espera, el chat abierto o un chat terminado que aún no has abierto (el punto verde de “terminado” de dsh), también después de las 2 horas. Los proyectos sin un chat así se ocultan, también los nuevos y vacíos. Selecciónalo otra vez para mostrar todos los proyectos. La elección se guarda en este dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura: Filtro de proyectos recientes"></a> |
|
|
74
|
+
| **Filtro de proyectos recientes** | <a id="feature-recentprojects"></a>Barra lateral → opciones de vista (icono de controles deslizantes) → **Activos en las últimas 2 horas**. Mientras está seleccionado, la barra lateral solo muestra los proyectos con un chat activo en las últimas 2 horas: un chat actualizado en ese tiempo, un chat en ejecución o en espera, el chat abierto o un chat terminado que aún no has abierto (el punto verde de “terminado” de dsh), también después de las 2 horas. Los proyectos sin un chat así se ocultan, también los nuevos y vacíos. En **Árbol de espacios de trabajo**, una carpeta superior sigue visible mientras un proyecto dentro de ella está activo, y los chats que no estuvieron activos en las últimas 2 horas también se ocultan, así que solo se muestran los chats recientes. Selecciónalo otra vez para mostrar todos los proyectos. La elección se guarda en este dispositivo. | <a href="assets/features/recentProjects.webp"><img src="assets/features/recentProjects.webp" width="160" alt="Captura: Filtro de proyectos recientes"></a> |
|
|
71
75
|
| **Contraer todos los proyectos** | <a id="feature-collapseprojects"></a>Mientras hay un proyecto abierto en la barra lateral, aparece un botón junto a las opciones de vista (icono de controles deslizantes). Haz clic en él para cerrar a la vez todos los proyectos abiertos, por ejemplo 3 proyectos abiertos de 5. El botón se oculta de nuevo cuando no hay ningún proyecto abierto. | <a href="assets/features/collapseProjects.webp"><img src="assets/features/collapseProjects.webp" width="160" alt="Captura: Contraer todos los proyectos"></a> |
|
|
72
76
|
| **Ordenar por estado** | <a id="feature-statusorder"></a>Barra lateral → opciones de vista → **Ordenar por** → **Por estado** (con **En una sola lista**). Primero aparecen los chats terminados (el punto de “terminado” de dsh, que también recibe un turno que acabó con un error), luego los chats en ejecución o en espera, luego los chats con una automatización activa (Tareas automatizadas) y, por último, el resto en el orden de dsh. Al abrir un chat terminado, este baja. Solo cambia la vista: selecciona **Manual** o **Última actualización** para volver. | <a href="assets/features/statusOrder.webp"><img src="assets/features/statusOrder.webp" width="160" alt="Captura: Ordenar por estado"></a> |
|
|
73
77
|
| **Notificaciones en segundo plano** | <a id="feature-notifications"></a>Mientras dsh está en segundo plano, recibes una notificación cuando un turno termina (la primera línea de la respuesta) o cuando un chat de verdad te espera: una aprobación (el nombre de la herramienta), una respuesta (la pregunta) o la revisión de un plan. Una solicitud tiene que seguir abierta 1,5 s después, así que las aprobaciones que se responden automáticamente (permisos de la revisión automática, otros plugins) no generan ningún aviso, y una notificación se retira en cuanto se responde su solicitud. La insignia del Dock o de la barra de tareas cuenta los chats en espera. Al hacer clic se abre ese chat. | <a href="assets/features/notifications.webp"><img src="assets/features/notifications.webp" width="160" alt="Captura: Notificaciones en segundo plano"></a> |
|
|
78
|
+
| **Abrir el chat en espera si estás inactivo** | <a id="feature-idleswitch"></a>Cuando un chat hace una pregunta o espera una aprobación o una revisión del plan (el punto naranja) y no usas dsh durante 30 segundos, dsh abre ese chat. Si esperan varios chats, primero se abre el que lleva más tiempo esperando; el siguiente se abre tras otros 30 segundos sin uso. Una tecla, un clic, un movimiento del ratón, la rueda de desplazamiento o un toque reinician los 30 segundos. Texto en el campo con el foco, texto seleccionado o un menú o diálogo abierto también detienen el cambio. Mientras un chat en espera está en pantalla, nada cambia. Si sales de un chat en espera sin responder, puede volver a abrirse tras los siguientes 30 segundos sin uso. También funciona con dsh en segundo plano, pero dsh no pasa al frente. | <a href="assets/features/idleSwitch.webp"><img src="assets/features/idleSwitch.webp" width="160" alt="Captura: Abrir el chat en espera si estás inactivo"></a> |
|
|
74
79
|
| **Idioma de la aplicación** | <a id="feature-language"></a>Configuración → Composer Plus → **Idioma de la aplicación** cambia toda la interfaz de dsh a Türkçe, Español, Português (Brasil), Français, Deutsch, Русский, 日本語, 한국어, Bahasa Indonesia, Tiếng Việt o हिन्दी (consulta más abajo). | <a href="assets/features/language.webp"><img src="assets/features/language.webp" width="160" alt="Captura: Idioma de la aplicación"></a> |
|
|
75
80
|
| **Conexión móvil (iPhone)** | <a id="feature-mobileconnect"></a>Usa dsh desde tu iPhone con la app [Tether](tether/), en la misma red Wi-Fi o a través de [Tailscale](https://tailscale.com). Actívala en **Configuración → Composer Plus** (está desactivada de forma predeterminada, porque abre un puerto de red en este Mac). Después haz clic en **Conexión móvil**, abajo a la izquierda de la barra lateral: escanea el código QR con la Cámara del iPhone (toca **Open in Tether**) o con **Scan code** en Tether, toca **Connect** y haz clic en **Approve**. Primero instala Tether: sin la app, la Cámara no puede abrir el código. El teléfono muestra tus chats, envía mensajes (con fotos: el **+** del editor → Camera, Photos o Paste image), responde aprobaciones y preguntas, y cambia de modelo y de agente. Empareja todos los Mac que quieras: el nombre del Mac, arriba a la izquierda en la app, te permite cambiar entre ellos. El panel **Conexión móvil** muestra los iPhone emparejados con su última conexión: **Remove** desconecta uno al instante. “Tailscale only” rechaza la red local (para una red Wi-Fi compartida), y el registro de accesos muestra quién intentó conectarse. En Tether, “Settings → Privacy” bloquea la app con Face ID. | <a href="assets/features/mobileConnect.webp"><img src="assets/features/mobileConnect.webp" width="160" alt="Captura: Conexión móvil (iPhone)"></a> |
|
|
76
81
|
| **Actualizaciones automáticas** | <a id="feature-autoupdate"></a>Al iniciar dsh, el plugin consulta la [última versión publicada en GitHub](https://github.com/furkancak1r/dsh-composer-plus/releases/latest). Si es más reciente y ya está en npm, instala esa versión exacta con el gestor de plugins propio de dsh (el mismo camino que Configuración → Plugins) y te avisa. Reinicia dsh para cargarla. **Configuración → Composer Plus → Actualizaciones de Composer Plus** muestra la versión y tiene los botones **Buscar actualizaciones** / **Actualizar ahora**. La primera vez que dsh se inicia con la nueva versión, una ventana **Novedades de Composer Plus N** muestra una vez las notas de esa versión (de la misma comprobación de actualizaciones, sin otra llamada de red); **Cerrar** o `Esc` la cierra. | <a href="assets/features/autoUpdate.webp"><img src="assets/features/autoUpdate.webp" width="160" alt="Captura: Actualizaciones automáticas"></a> |
|
|
82
|
+
| **Copia de seguridad** | <a id="feature-backup"></a>Configuración → Composer Plus → **Copia de seguridad** → **Hacer copia ahora** guarda todo tu directorio home de dsh (chats, ajustes, plugins, MCP, skills) en un único archivo comprimido en `~/Desktop/dsh-backups`, con una suma de comprobación. Los secretos se ocultan en el archivo comprimido: los archivos de credenciales, los archivos de claves (`.pem`, `.key`) y los valores token, secret y password de los ajustes yml se quedan solo en este equipo, en el `vault` de la carpeta. `cache/`, `dsh-runtimes/` y `node_modules` no entran en el archivo comprimido (dsh los vuelve a crear). Cada copia de seguridad de la lista tiene **Comprobar** (la lee completa), **Para otro equipo** (una carpeta para copiar al equipo nuevo, con la consola de rescate) y **Eliminar**. Los archivos comprimidos de dsh-backup en la misma carpeta también aparecen y funcionan. Para restaurar, sal de dsh y usa la consola de rescate. | <a href="assets/features/backup.webp"><img src="assets/features/backup.webp" width="160" alt="Captura: Copia de seguridad"></a> |
|
|
83
|
+
| **Copia de seguridad automática** | <a id="feature-autobackup"></a>Activa **Copia de seguridad automática** (desactivada de forma predeterminada: cada copia ocupa más o menos lo mismo que tu directorio home de dsh sin su caché). Elige la frecuencia (**Cada**: de 6 horas a 7 días, 24 horas de forma predeterminada) y cuántas copias de seguridad se conservan (**Conservar**: de 3 a 14, 7 de forma predeterminada). La hora de la próxima copia aparece bajo el interruptor; una copia fallida también aparece allí y se vuelve a intentar 30 minutos después. Cuando dsh o Composer Plus se inicia con una versión nueva, se toma una instantánea poco después del inicio, antes de que la versión nueva haya usado tus datos mucho tiempo (se conservan las dos más recientes, marcadas como **Antes de una actualización**). | <a href="assets/features/autoBackup.webp"><img src="assets/features/autoBackup.webp" width="160" alt="Captura: Copia de seguridad automática"></a> |
|
|
84
|
+
| **Comprobación de registros de sesión** | <a id="feature-sessiondoctor"></a>**Comprobar registros de sesión** lee el registro de cada chat y muestra los que dsh no puede abrir (un bloque roto, una entrada cortada, un número de secuencia incorrecto). Un final incompleto no aparece en la lista: dsh lo repara por sí mismo. **Reparar desde copias de seguridad** vuelve a poner la copia de la copia de seguridad más reciente que tenga una versión sana y guarda el archivo dañado a su lado (`.corrupt-<hora>`). Los mensajes escritos después de esa copia de seguridad no están en la copia. Un chat abierto en este dsh no se repara aquí: sal de dsh y repáralo en la consola de rescate. | <a href="assets/features/sessionDoctor.webp"><img src="assets/features/sessionDoctor.webp" width="160" alt="Captura: Comprobación de registros de sesión"></a> |
|
|
85
|
+
| **Consola de rescate** | <a id="feature-rescueconsole"></a>Cada copia de seguridad también pone una consola de rescate en la carpeta de copias de seguridad. Cuando dsh está cerrado o no se inicia, abre `Composer Plus Rescue` en esa carpeta (macOS: `Composer Plus Rescue.command`): un menú en una ventana de terminal muestra, comprueba y restaura copias de seguridad, y comprueba y repara registros de sesión. No abre ningún puerto de red. Una restauración te pide escribir `RESTORE`, conserva tu directorio home de dsh actual como `.dsh.pre-restore-<hora>`, vuelve a poner los secretos ocultos desde el vault y trae `cache/`, `dsh-runtimes/` y `node_modules` del directorio anterior. Funciona sin dsh: usa Node.js o la propia app DeepSeek Harness. En un equipo nuevo, copia la carpeta de **Para otro equipo** y abre `Composer Plus Rescue` allí. | <a href="assets/features/rescueConsole.webp"><img src="assets/features/rescueConsole.webp" width="160" alt="Captura: Consola de rescate"></a> |
|
|
77
86
|
|
|
78
87
|
<!-- END GENERATED FEATURES -->
|
|
79
88
|
|
|
@@ -117,7 +126,7 @@ Cada paquete tiene 3280 textos: todos los textos de la interfaz de dsh `0.2.0-rc
|
|
|
117
126
|
| `Esc` | editor vacío con una predicción | ocultar la predicción |
|
|
118
127
|
| `Cmd/Ctrl+Z` | editor, después de **Mejorar prompt** | recuperar el texto que escribiste |
|
|
119
128
|
| `Esc` | editor, mientras **Mejorar prompt** trabaja | cancelar la mejora |
|
|
120
|
-
| `Enter` / `Esc` | mensaje en cola
|
|
129
|
+
| `Enter` / `Esc` | editor del mensaje en cola | guardar / cancelar la edición |
|
|
121
130
|
| `Cmd+F` en un Mac, `Ctrl+F` en Windows y Linux | chat abierto | abrir **Buscar en el chat** |
|
|
122
131
|
| `Enter` / `Shift+Enter`, `↓` / `↑` | cuadro de **Buscar en el chat** | coincidencia siguiente / anterior |
|
|
123
132
|
| `Esc` | cuadro de **Buscar en el chat** | cerrar el cuadro |
|
|
@@ -151,6 +160,9 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
151
160
|
- **Completar al escribir:** desactivado hasta que lo actives. Mientras está activado, en cada pausa mientras escribes, la parte Host envía el texto que llevas escrito y tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto ni razonamiento), como máximo unos 3.000 caracteres del chat, al modelo elegido en **Completar al escribir** (de forma predeterminada, el modelo de **Predicción del siguiente mensaje**). Una pausa más reciente detiene la petición anterior. No se guarda nada en el chat. El interruptor está en `$DSH_HOME/storages/dsh-composer-plus/complete.json` (archivo solo para el propietario).
|
|
152
161
|
- **Mejorar prompt:** no se ejecuta nada hasta que haces clic en la varita mágica. Entonces la parte Host envía tu borrador, tus propios mensajes del chat y las respuestas de texto del agente (sin salida de herramientas, sin contexto oculto, sin razonamiento ni mensajes revertidos; como máximo unos 6.000 caracteres, la parte más reciente), el mismo resumen del proyecto que **Ideas de funciones** (con las mismas reglas de archivos: sin `.env*` ni archivos de claves, sin enlaces simbólicos que salgan de la carpeta, sin FIFO), las rutas que `git status` muestra como modificadas y hasta 30 rutas con seguimiento o sin seguimiento (no ignoradas) cuyos nombres comparten palabras con tu borrador, al modelo elegido en **Mejorar prompt** (de forma predeterminada, el modelo del propio chat), en una sola petición. No se envía el contenido de ningún archivo aparte de ese resumen. No se escribe nada en el chat ni en el proyecto: la respuesta solo sustituye tu borrador en el editor, y tú decides si lo envías. El modelo elegido está en `$DSH_HOME/storages/dsh-composer-plus/improve.json` (archivo solo para el propietario).
|
|
153
162
|
- **Comprobación del objetivo:** solo se ejecuta cuando el agente marca un `/goal` como completado en una ronda automática (o cuando haces clic en **Ejecutar ahora**). La parte Host ejecuta el comando de prueba en la carpeta del chat con el modo sandbox del chat (como la propia herramienta `bash` de dsh: la misma política de acceso a archivos; si ese sandbox no puede iniciarse, la prueba no se ejecuta y la comprobación falla). Para encontrar el comando solo lee `package.json`, `Makefile`, `Cargo.toml`, `go.mod`, `pyproject.toml` y `pytest.ini`, como archivos normales dentro de la carpeta (sin enlaces simbólicos que salgan de ella, sin FIFO). Después envía el objetivo, el chat desde que empezó el objetivo (tus mensajes, las respuestas del agente, las llamadas a herramientas recortadas a 1.000 caracteres y los últimos 2.000 caracteres de cada resultado de herramienta; sin razonamiento ni pasos revertidos; como máximo unos 60.000 caracteres, la parte más reciente), `git status --short` y el final de la salida de la prueba al modelo elegido en **Comprobación del objetivo** (de forma predeterminada, el modelo del propio chat), en una sola petición sin herramientas. La salida de las herramientas puede contener lo que leyó el agente, así que esta petición puede incluir partes de tus archivos, igual que el propio chat. No se escribe nada en el chat ni en el proyecto. Tu comando de prueba, los límites, el último resultado (con el final de su salida) y el modelo elegido están en `$DSH_HOME/storages/dsh-composer-plus/goal-check.json` (archivo solo para el propietario, los 500 chats más recientes).
|
|
163
|
+
- **Memoria del proyecto:** desactivada hasta que la actives. Mientras está activada, después de cada turno terminado de un chat de nivel superior, la parte Host envía los mensajes nuevos del propio chat desde la última revisión (tus mensajes y las respuestas de texto del agente; sin salida de herramientas, sin razonamiento, sin contexto oculto, sin mensajes revertidos; la copia del chat padre en un chat bifurcado queda fuera; como máximo unos 16.000 caracteres) y las notas guardadas al modelo del propio chat, como una sola petición sin herramientas. Las notas son archivos Markdown en `$DSH_HOME/storages/dsh-composer-plus/memory/` (archivos solo para el propietario): `projects/<id>/` para cada carpeta de proyecto (`<id>` es un hash de la ruta real de la carpeta; `project.json` nombra la carpeta), `global/`, `journal.jsonl` (cada cambio con la línea anterior y la posterior) y `reviewed.json` (hasta dónde se leyó cada chat). No se escribe nada en la carpeta del proyecto. Se rechazan las notas que parecen una clave, un token, una contraseña o un número de identificación. Las notas de un proyecto entran en el prompt de sistema de cada chat nuevo en esa carpeta, así que llegan al modelo con cada petición de ese chat. El interruptor está en `memory.json`, en la misma carpeta.
|
|
164
|
+
- **Copia de seguridad:** nada sale de tu equipo. Los archivos comprimidos van a `~/Desktop/dsh-backups` (archivos solo para el propietario). Los secretos no están en un archivo comprimido: los archivos de credenciales (`.credentials.yaml`, `.env`), los archivos de claves (`.pem`, `.key`, `.p12`, `.pfx`) y los valores de los ajustes token, secret, password y API key de los archivos yml se ocultan; sus copias reales se quedan en `composer-plus-vault/<archive>/`, en la misma carpeta (solo para el propietario), solo en este equipo. **Para otro equipo** no copia ningún vault: vuelve a introducir esos secretos allí. Tus registros de chat, tus ajustes y el resto del directorio home de dsh están tal cual en el archivo comprimido: mantén la carpeta privada, igual que el propio `$DSH_HOME`. La copia de seguridad lee los archivos con `O_NOFOLLOW | O_NONBLOCK`; un enlace simbólico se guarda como enlace (nunca se sigue) y un FIFO o un dispositivo se omite. El interruptor y los ajustes de la copia de seguridad automática están en `$DSH_HOME/storages/dsh-composer-plus/auto-backup.json`, el interruptor de la consola de rescate en `rescue-console.json` y, mientras dsh se ejecuta, `running/host-<pid>.json` nombra cada proceso de dsh (la consola de rescate los lee para rechazar una restauración).
|
|
165
|
+
- **Consola de rescate:** un menú de terminal; no abre ningún puerto de red. Una restauración solo escribe en una carpeta nueva junto al directorio home de dsh (archivos con `O_EXCL | O_NOFOLLOW`, enlaces simbólicos al final y nunca seguidos) y rechaza un archivo comprimido con un nombre inseguro (`..`, una ruta absoluta), un dispositivo o FIFO, más de una carpeta superior o una entrada bajo un enlace.
|
|
154
166
|
|
|
155
167
|
## Solución de problemas
|
|
156
168
|
|
|
@@ -165,11 +177,15 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
165
177
|
- **Eliminar dice que otro dsh tiene abierto este chat:** un segundo dsh que usa el mismo directorio home de dsh tiene el bloqueo del chat. Cierra esa ventana o ese dsh y vuelve a eliminarlo. Mientras tanto, el chat sigue archivado.
|
|
166
178
|
- **Mi iPhone no puede conectarse después de activar «Tailscale only»:** Tailscale debe estar activado en el Mac y en el iPhone. El panel Conexión móvil avisa cuando está desactivado en el Mac. El registro de accesos muestra cada intento rechazado con su motivo.
|
|
167
179
|
- **Un chat no continuó tras un reinicio:** Reanudar tras reiniciar estaba desactivado cuando dsh se cerró, detuviste tú mismo ese turno, el turno ya había terminado (completado o fallido), el chat estaba archivado, o había más de 20 chats en ejecución (continúan los 20 más recientes).
|
|
180
|
+
- **La cola está vacía tras un reinicio:** el propio dsh vacía la cola al cerrarse. Reanudar tras reiniciar solo la devuelve en un chat que continúa; en los demás chats, envía los mensajes de nuevo. Un mensaje que quitaste justo antes del cierre puede volver: quítalo de nuevo.
|
|
168
181
|
- **Abrir issue en GitHub dice «gh could not open the issue»:** el mensaje es la primera línea del propio `gh`. Ejecuta `gh auth status` en una terminal e inicia sesión con `gh auth login`; la carpeta del chat debe tener un remoto de GitHub (`git remote -v`). «not installed or not on the PATH of dsh» significa que dsh no encontró `gh`: instálalo o inicia dsh desde una terminal donde `gh` funcione.
|
|
169
182
|
- **No hay etiqueta de rama en una fila de chat:** el chat no tuvo ningún turno desde que instalaste esta versión, su carpeta no es un repositorio git o **Rama de Git en las filas de chat** está desactivada. Después de una actualización, reinicia dsh (la parte Host registra la rama).
|
|
170
183
|
- **Comprobación del objetivo dice que la prueba terminó con el código 127 o «not found»:** dsh iniciado desde el Finder o el Dock puede tener un PATH más corto que tu terminal, así que no encuentra `npm`, `pnpm` ni `cargo`. Inicia dsh desde una terminal, o define tu propio comando de prueba con la ruta completa en **Comprobación del objetivo** → **Editar**. **Ejecutar ahora** muestra el resultado al momento.
|
|
171
184
|
- **El objetivo no se cierra y el agente sigue trabajando:** **Comprobación del objetivo** encontró una prueba fallida o trabajo pendiente; la fila bajo el objetivo muestra el motivo (pasa el puntero por el resultado para ver los detalles). Corrige la causa o el comando de prueba, o completa el objetivo tú mismo con `/goal` o con la barra del objetivo (eso no se comprueba).
|
|
172
|
-
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.
|
|
185
|
+
- **La instalación falla justo después de una versión nueva:** añade la versión (`dsh-composer-plus@1.16.0`); consulta la nota de instalación de más arriba.
|
|
186
|
+
- **Hacer copia ahora dice «Ya hay otra acción de copia de seguridad en curso»:** hay una acción en marcha en otra ventana de dsh o en la consola de rescate (comparten un archivo de bloqueo, `.composer-plus.lock`, en la carpeta de copias de seguridad). Espera a que termine. Si no hay ninguna acción en marcha, el siguiente clic toma el bloqueo de un proceso cerrado.
|
|
187
|
+
- **La consola de rescate dice «dsh is running»:** primero sal de dsh. Si dsh está realmente cerrado, el archivo que nombra el mensaje quedó de un cierre inesperado: elimínalo y vuelve a intentarlo.
|
|
188
|
+
- **Después de una restauración, dsh no se inicia o falta un plugin:** hay que volver a instalar los paquetes de plugins de un perfil. La consola de rescate lo ofrece después de una restauración; o ejecuta `pnpm install` en cada carpeta de `$DSH_HOME/profiles/` que indique. Los secretos que no estaban en el vault (otro equipo) hay que introducirlos de nuevo: la consola los enumera.
|
|
173
189
|
|
|
174
190
|
## Límites
|
|
175
191
|
|
|
@@ -177,6 +193,7 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
177
193
|
- **Ideas de funciones** guarda las tarjetas en memoria para cada chat hasta que dsh o la página se recargan; después, **Sugerir funciones** vuelve a preguntar al modelo. Las tarjetas llegan en el idioma de la interfaz que tiene dsh cuando haces clic; si cambias el idioma, las tarjetas que ya están en el montón conservan el suyo y **Más ideas** usa el nuevo. El modelo solo ve el breve resumen del proyecto, no el código, así que una idea puede repetir algo que el proyecto ya tiene: omítela. El nuevo chat solo se ejecuta en modo plan cuando el perfil tiene el comando `/plan` de dsh; si no, la idea se envía como un primer mensaje normal. La lista **Después** pertenece a la ruta de la carpeta del chat: la misma carpeta abierta a través de un enlace simbólico tiene su propia lista. Guarda como máximo 50 ideas por proyecto (quita una para añadir más) y cada título solo una vez. Arrastrar una tarjeta solo decide entre izquierda y derecha; usa **↓** para guardarla y **▶** para crearla ahora. Una repetición se detecta solo por su título: el modelo aún puede sugerir una idea anterior con otro nombre; omítela. Cuando el modelo responde solo con ideas anteriores, no aparece nada nuevo: vuelve a hacer clic. Un tema de enfoque muy concreto hace que esto pase más a menudo; usa un tema más amplio o quítalo. El tema de enfoque se queda en el campo de cada chat hasta que dsh o la página se recargan.
|
|
178
194
|
- **Exportar chat como Markdown** incluye solo tus propios mensajes y las respuestas de texto del asistente: se quedan fuera las llamadas a herramientas y su salida, el razonamiento, las imágenes (una línea `[image]` las marca), el contexto oculto y los mensajes que Revertir turno o dsh-rewind-plugin quitaron. Las respuestas de un mismo turno se unen en una sola sección. Una exportación incluye como máximo unos 4 millones de caracteres; de un chat más largo se exporta su primera parte y una nota.
|
|
179
195
|
- **Reanudar tras reiniciar** continúa el turno; no lo repite. Una llamada a herramienta que estaba en ejecución al cerrar termina con el resultado “outcome unknown” de dsh, y se le indica al modelo que no repita el trabajo terminado, pero un comando que no es seguro ejecutar dos veces puede volver a ejecutarse. Los subagentes, las aprobaciones y las preguntas que estaban abiertos no se restauran: su chat padre continúa y vuelve a preguntar. Como máximo continúan 20 chats en cada inicio.
|
|
196
|
+
- **Reanudar tras reiniciar** y la cola: dsh vacía la cola de un chat al cerrarse. El plugin devuelve tus mensajes en cola a partir del registro del chat, con su orden, sus ediciones, imágenes y archivos; se ejecutan después del turno reanudado. Solo los chats que continúan recuperan su cola (interruptor activado y cierre durante el turno). dsh registra igual que quites tú los últimos mensajes de la cola: si los quitas y dsh se cierra antes de que empiece el paso siguiente, vuelven.
|
|
180
197
|
|
|
181
198
|
- **Búsqueda en el contenido** es la búsqueda propia de dsh, así que tiene los límites de dsh. Solo busca en los mensajes del usuario y del asistente: no busca en la salida de las herramientas (comandos, contenido de archivos, resultados) ni en el razonamiento, y no tiene ningún filtro por mensajes del usuario, del asistente o de herramientas. Coincide con palabras completas, no con partes de una palabra (`deploy` no encuentra `deployment`); las letras con acento coinciden sin él (`seker` encuentra `şeker`). Muestra una fila por chat, con el fragmento de 240 caracteres de dsh, y como máximo 20 filas.
|
|
182
199
|
- **Búsqueda en el contenido**: coste medido en una copia de 247 registros de chat reales (159 MB, dsh 0.2.1-rc.2, Apple Silicon, 32 GB). La primera búsqueda tras un inicio crea el índice en unos 15 s. Durante ese tiempo, el Host de dsh no responde a nada durante unos 7 s, así que los demás chats dejan de transmitir en ese momento (la página en sí no se congela). La memoria del Host crece en torno a 1,1 GB en el pico; un minuto después sigue unos 0,5–0,6 GB por encima del inicio, hasta que dsh se cierra. El archivo de índice ocupa unos 165 MB. Las búsquedas posteriores tardan unos 0,5 s. Tras un reinicio, la primera búsqueda tarda aproximadamente 1 s (solo se añaden los chats nuevos o cambiados) y añade unos 70 MB. Desactívala si tu equipo tiene poca memoria.
|
|
@@ -187,19 +204,25 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
187
204
|
- dsh 0.2.1 carga una actualización de inmediato cuando la nueva versión no cambia ningún ajuste de dsh; en caso contrario, y en dsh 0.2.0, reinicia dsh para cargarla. El plugin nunca reinicia dsh por ti. Los perfiles web/CLI sin el gestor de plugins de dsh solo avisan de que hay una versión nueva.
|
|
188
205
|
- **Permitir en este chat** cuenta el límite de tiempo desde el momento en que se concede el permiso. Un nuevo límite de tiempo se aplica al instante a los permisos vigentes, así que uno más corto puede terminarlos al instante. Los permisos de la versión 1.12 y anteriores no tienen hora: después de la actualización, el agente vuelve a preguntar una vez por esas herramientas.
|
|
189
206
|
- **Mantener el foco en el editor** solo devuelve el foco después de un comando `/` o una skill. Mientras dsh resuelve el comando, el editor queda en solo lectura unos milisegundos, así que las teclas que pulses en ese tiempo se pierden. Si el menú `/` de dsh sigue abierto, `Enter` elige la fila resaltada y no envía.
|
|
190
|
-
- **
|
|
207
|
+
- **Ajustar la tarjeta de pregunta a la ventana** cambia solo la tarjeta de pregunta de dsh, no la tarjeta de revisión del plan. Encuentra la tarjeta por el marcado de dsh (`data-question-key`, `data-question-scroll`); si una actualización de dsh cambia ese marcado, la tarjeta se ve como la dibuja dsh. La altura de la tarjeta sigue a la ventana, no al chat: en un chat dentro de un panel lateral estrecho, una tarjeta alta puede sobresalir por encima del chat.
|
|
208
|
+
- **Conexión móvil** solo funciona en macOS (usa `en0`, `openssl`, `swift` y `dns-sd`). Usa los puertos fijos 19390 y 19391, así que solo un dsh por Mac puede ejecutarla a la vez (cada Mac es una entrada en la lista de Mac del teléfono). El teléfono solo recibe notificaciones mientras Tether está abierta o acaba de pasar a segundo plano (no hay servicio push). Tether solo las envía después de que actives «Settings → Notifications → Send notifications» en Tether. Esta opción está desactivada de forma predeterminada, e iOS pide el permiso cuando la activas. La app de iOS aún no está en la App Store: compílala desde `tether/ios` con Xcode. «Tailscale only» sigue necesitando una dirección Wi-Fi o Ethernet en el Mac (la pasarela solo se inicia con una). El registro de accesos es propio de cada Mac y solo guarda los 200 intentos más recientes; un intento repetido en menos de un minuto suma uno a la misma fila. El bloqueo de la app Tether no oculta las vistas previas de las notificaciones en la pantalla bloqueada del iPhone: desactívalas en Ajustes de iOS. Los puntos verdes de Tether siguen al Mac: un chat que abres en dsh también pierde su punto en el teléfono. Un chat que abres en Tether pierde su punto solo en los teléfonos. El punto propio de dsh en el Mac se queda hasta que abres el chat allí.
|
|
191
209
|
- Un enlace de sesión funciona dentro de los chats; hacer clic en él no abre el chat. Un enlace creado con **Copiar enlace del mensaje** abre su mensaje solo en dsh 0.2.1 y posteriores, y solo desde un mensaje de un chat (dsh 0.2.0 no tiene reglas de texto de usuario, así que allí el enlace se copia, pero se muestra como texto normal). Un mensaje que una reversión quitó, o que la compactación eliminó del historial que carga dsh, no se puede mostrar: el enlace lo indica. Los botones 🔗 se enganchan a las filas de mensajes de dsh; si una actualización de dsh cambia ese marcado, no aparecen.
|
|
192
210
|
- **Marcar todo como leído** cambia los puntos de no leído propios de dsh mediante una parte de dsh que no es una API pública (la lista `completionUnread` del estado de sesión de dsh). Si una actualización de dsh le cambia el nombre, el elemento no aparece. El elemento va en el menú «…» del proyecto de dsh, que no tiene un espacio para plugins; si dsh cambia ese menú, el elemento tampoco aparece.
|
|
193
|
-
- **Editar el mensaje en cola en su sitio**
|
|
211
|
+
- **Editar el mensaje en cola en su sitio** no cambia un mensaje que empezó a enviarse mientras tanto ni sobrescribe un mensaje que cambió mientras tanto (por ejemplo, en Tether en el iPhone): un aviso lo indica. Una imagen nueva necesita un modelo que acepte imágenes (se aplican los límites de imagen propios de dsh), y un archivo nuevo debe terminar de subirse antes de que puedas guardar. Solo se pueden editar tus propios mensajes en cola: una ronda de un objetivo o una respuesta a una pregunta en la cola, no. Tras una actualización del plugin, solo las ediciones de texto funcionan al momento: reinicia dsh antes de guardar un mensaje con imágenes o archivos (la parte Host se carga al iniciar).
|
|
194
212
|
- **Rehacer** nunca cambia el chat revertido: inicia un chat nuevo desde justo antes de la reversión (la bifurcación propia de dsh, el mismo contexto del modelo), así que el chat nuevo tiene otro id y otro título. Solo se puede rehacer la reversión más reciente de un chat, una vez, y solo mientras no haya nada después (un mensaje nuevo quita la opción). Un archivo que cambiaste después de la reversión se conserva, salvo que marques la casilla que lo sobrescribe. Rehacer necesita la instantánea que guardó la reversión (la misma ventana de 50 entradas); una reversión hecha antes de esta versión, o con **Solo el chat**, solo recupera los mensajes.
|
|
213
|
+
- El mapa de ramas de **Árbol** adivina adónde va cada flecha, porque git no guarda en qué rama se fusiona una rama. Una rama fusionada apunta a la rama cuyo commit de fusión la incorporó primero. Una rama pendiente apunta a la rama más cercana de la que partió (primero la rama principal); cuando dos ramas partieron del mismo commit, el mapa puede elegir la equivocada. Una rama que avanzó con un fast-forward no tiene commit de fusión, así que su etiqueta **Fusionada** no abre nada. La rama principal es la rama predeterminada de `origin`; si no, `main` o `master`; si no, la rama abierta. El mapa lee los 20.000 commits más recientes y muestra como máximo 60 ramas; en un historial más largo, avisa de que algunas flechas pueden estar mal. Una rama fusionada con squash o rebase (por ejemplo, en GitHub) aparece como **Pendiente**: git no guarda ningún vínculo con sus commits.
|
|
195
214
|
- **Este chat** solo cuenta los archivos que escribieron las herramientas de archivos de dsh (`write`, `edit`, `str_replace_editor`). Los archivos que cambió un comando (`bash`) no están en esta vista; aparecen en **Sin confirmar**. Sin una instantánea de Revertir turno del chat (Revertir turno desactivado, dsh-rewind-plugin instalado o un chat anterior al plugin), la vista compara con el último commit y lo indica. Revertir turno guarda las 50 instantáneas más recientes de un chat: en un chat más largo, la vista compara con la más antigua que se guardó, indica desde qué mensaje y no cuenta los cambios anteriores. **Ocultar cambios de espacios en blanco** es `git diff -w`: también se oculta una línea que solo cambió en los espacios de su interior.
|
|
196
215
|
- **Abrir issue en GitHub** necesita GitHub CLI (`gh`) en el PATH de dsh y un remoto de GitHub en la carpeta del chat. Se ejecuta como máximo 60 s; si `gh` tarda más, la issue puede existir en GitHub sin su enlace en la lista (antes de volver a hacer clic, mira en GitHub: la lista solo lee el enlace de una ejecución terminada, así que otro clic puede abrir una segunda issue). Una carpeta con más de un remoto de GitHub usa el valor predeterminado del propio `gh` (`gh repo set-default`).
|
|
197
216
|
- **Chats que cambiaron este archivo** solo conoce las herramientas de archivos de dsh (`write`, `edit`, `str_replace_editor`), como **Este chat**: un cambio hecho por un comando (`bash`) no aparece. Lee los 300 chats más recientes del repositorio (según cuándo se crearon) y lo indica cuando hay más; muestra como máximo 100 filas. Un archivo renombrado aparece con el nombre que escribió la herramienta. No cuenta un chat cuya carpeta está fuera del repositorio (tampoco a través de otra ruta a los mismos archivos). La primera vez que se abre después de iniciar dsh, lee todos los registros de chat del repositorio (unos 4 s para 275 chats); las siguientes veces solo lee los chats que cambiaron desde entonces.
|
|
198
217
|
- **Rama de Git en las filas de chat** muestra la rama de la carpeta del chat cuando su último turno empezó o terminó, no la rama actual: un cambio de rama fuera de un turno aparece después del siguiente turno. Los chats de antes de esta versión no muestran etiqueta hasta su siguiente turno. La etiqueta va en el marcado de las filas de chat de dsh (dsh no tiene un espacio ahí); si una actualización de dsh cambia ese marcado, no aparece ninguna etiqueta. Si la fila de proyecto sobre el chat tiene el mismo nombre que la rama (por ejemplo, una carpeta de «Una rama por chat»), la fila del chat no muestra la etiqueta, pero «En una sola lista» sí la muestra.
|
|
218
|
+
- **Una rama por chat** en modo plan: dsh envía `/plan <mensaje>` como un comando, no como un mensaje, así que Composer Plus intercepta el envío del comando en el editor de dsh (no es una API pública). Si una actualización de dsh lo cambia, `/plan <mensaje>` con **Nueva rama** elegida se ejecuta en el Chat nuevo abierto como comando propio de dsh. Cuando el Host no puede activar el modo plan en el chat nuevo, la carpeta de la rama se queda y el mensaje no se envía, así que el chat nuevo no cambia archivos en el modo predeterminado.
|
|
219
|
+
- **Una rama por chat**: cuando se elimina la carpeta de la rama de un chat (`<project>/.worktrees/<name>`), por ejemplo cuando el propio agente del chat quita el worktree y elimina la rama, el siguiente paso del chat lo saca de esa carpeta. El proyecto de la carpeta de la rama desaparece de la barra lateral, y el chat aparece en Sin agrupar y sigue abierto. En dsh 0.2.1 y posteriores, el chat continúa en la carpeta principal del proyecto, y el modelo recibe una nota sobre la nueva carpeta. En dsh 0.2.0, el chat conserva la carpeta eliminada: un comando allí falla hasta que empieces un chat nuevo. El cambio ocurre solo en el siguiente paso del chat, así que el proyecto de una rama eliminada que ningún chat usa se queda en la barra lateral: quítalo con el menú de proyecto de dsh. Mientras un chat se mueve, **Nueva rama** en el mismo repositorio responde «inténtalo de nuevo». Con el interruptor apagado, vuelve a aparecer el error propio de dsh («working-directory: directory does not exist»).
|
|
220
|
+
- **Ramas en el árbol de espacios de trabajo** escribe en git sin un clic: cuando mueve un chat, devuelve la carpeta del proyecto a su rama anterior (`git switch`) y añade un worktree (`git worktree add`). Nunca borra una rama, un worktree ni un archivo. dsh no puede cambiar la carpeta de un chat, así que un chat movido es una copia (la bifurcación propia de dsh, con un id nuevo) y el chat anterior se archiva. La copia sigue con la tarea detenida; una llamada a herramienta que se ejecutaba cuando apareció la rama termina con un rechazo, y el agente la vuelve a ejecutar en la carpeta nueva. Un objetivo del chat anterior no se mueve con él. Solo se mueve un chat cuya carpeta es la carpeta principal del repositorio, y solo por una rama que creó y a la que cambió en ese turno (`git switch -c`, `git checkout -b`): una rama hecha solo con `git branch`, una carpeta con cambios sin confirmar, un worktree vinculado o una subcarpeta no mueven nada. En el árbol solo aparecen los worktrees que están directamente en `<project>/.worktrees/` y tienen una rama; un worktree separado (detached) o uno en otro lugar no aparece. La copia se abre sola solo cuando su chat era el abierto (el plugin lo lee de la fila de la barra lateral de dsh); si no, está en el proyecto de la rama.
|
|
199
221
|
- **Buscar en el chat** solo busca en lo que muestra la página: los mensajes y respuestas cargados (desplázate hacia arriba o haz clic en **Cargar anteriores** para ver los más antiguos), no en los pasos de herramientas cerrados ni en el texto plegado dentro de la salida de una herramienta. Cuenta como máximo 2.000 coincidencias (después, «2000+»). Usa la API de resaltado del navegador (Chromium 105 y posteriores; la app de escritorio la tiene): en un navegador más antiguo, el recuento y los saltos funcionan sin el color. `Cmd+F` en un Mac (`Ctrl+F` en Windows y Linux) solo lo abre mientras hay un chat en pantalla; en otros lugares, la búsqueda propia del navegador funciona como antes. En un Mac, `Ctrl+F` mantiene su uso de macOS en los campos de texto (el cursor avanza un carácter).
|
|
222
|
+
- **Abrir el chat en espera si estás inactivo** solo conoce lo que ve la ventana de dsh: el trabajo en otra app no cuenta, así que con dsh en segundo plano puede abrir un chat en espera a los 30 segundos. No trae dsh al frente. Leer sin pulsar una tecla, hacer clic ni mover el ratón cuenta como inactividad. Solo mira los chats con el punto naranja de dsh (una pregunta, una aprobación o una revisión del plan); la solicitud de un subagente se muestra en su chat principal. Mientras un chat en espera está en pantalla, no se abre otro; un chat que dejaste sin responder puede volver a abrirse tras los siguientes 30 segundos sin uso. Los 30 segundos no se pueden cambiar.
|
|
200
223
|
- Al hacer clic en una notificación enviada antes de un reinicio, solo se trae dsh al frente.
|
|
201
224
|
- Los proyectos activos se mueven con el orden de proyectos guardado de dsh, así que el nuevo orden se mantiene tras un reinicio. Los chats que no pertenecen a ningún proyecto («Sin agrupar») no se pueden mover; dsh siempre los muestra al final.
|
|
202
|
-
- dsh no tiene un punto de extensión en el menú de opciones de vista de la barra lateral, así que la opción de proyectos recientes se añade al menú propio de dsh. Si una actualización de dsh cambia ese menú, la opción no aparece y todos los proyectos siguen visibles. El filtro funciona sobre las filas de proyecto, así que **En una sola lista** no se filtra.
|
|
225
|
+
- dsh no tiene un punto de extensión en el menú de opciones de vista de la barra lateral, así que la opción de proyectos recientes se añade al menú propio de dsh. Si una actualización de dsh cambia ese menú, la opción no aparece y todos los proyectos siguen visibles. El filtro funciona sobre las filas de proyecto, así que **En una sola lista** no se filtra. En **Árbol de espacios de trabajo**, una carpeta padre sigue visible mientras un proyecto que contiene está activo, y también se ocultan las filas de chat que no estuvieron activas en las últimas 2 horas; en **Espacio de trabajo** solo se filtran las filas de proyecto. El filtro lee qué vista muestra dsh desde el ajuste de vista que dsh guarda (no es una API pública); si una actualización de dsh le cambia el nombre, **Árbol de espacios de trabajo** se filtra como **Espacio de trabajo**. La función Estado del proyecto lee el mismo ajuste: en **Árbol de espacios de trabajo**, la fila de una carpeta padre también cuenta los chats de los proyectos que contiene; si dsh cambia el nombre del ajuste, cada fila muestra solo sus propios chats. **Por estado** tiene el mismo tipo de límite: dsh no tiene un espacio para el orden, así que la opción y el orden de las filas se enganchan al marcado del menú y de la lista de dsh.
|
|
203
226
|
- dsh tampoco tiene un menú de fila de proyecto ni un espacio en la cabecera de Espacios de trabajo. **Copiar ruta** encuentra la fila del proyecto por el marcado de filas de dsh, y **Contraer todos los proyectos** se coloca en la cabecera de dsh y cierra cada proyecto abierto con el mismo clic que la fila del proyecto. Si una actualización de dsh cambia ese marcado, el clic derecho muestra el menú del navegador y el botón no aparece.
|
|
204
227
|
- dsh tampoco tiene un punto de extensión en el menú de proyectos de un chat nuevo, así que el cuadro **Buscar proyectos** y el orden A–Z se enganchan al marcado del menú de dsh. Si una actualización de dsh cambia ese marcado, el menú aparece tal como lo dibuja dsh: en el orden guardado y sin el cuadro. El orden A–Z es solo una vista: no cambia el orden de proyectos guardado de dsh.
|
|
205
228
|
- dsh tampoco tiene un punto de extensión que elija dónde se abre **Nueva sesión**. **Espacio de trabajo predeterminado para Nueva sesión** envuelve un método de dsh que no es una API pública (`startSession` del servicio de espacios de trabajo de dsh). Si una actualización de dsh le cambia el nombre, **Nueva sesión** se abre donde elija dsh (el proyecto abierto o el más reciente). Toda llamada que no indica un proyecto usa el predeterminado: el botón de la barra lateral, su atajo, el logotipo y también **Nueva** en la página **Tareas automatizadas**. dsh sigue abriendo el último chat al iniciar. La carpeta general se crea y se añade a tus proyectos en el primer uso; en Windows o Linux con la carpeta Documents movida puede ser otra carpeta distinta de la de dsh.
|
|
@@ -207,6 +230,12 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
207
230
|
- **Completar al escribir** muestra su texto mediante la indicación propia del editor de dsh (el estilo `--dsh-composer-hint` que dsh usa para la indicación del argumento de un comando de barra). No se ejecuta con un comando de barra, con un mensaje que tenga un chip de archivo o de símbolo ni cuando el cursor no está al final del mensaje. Si una actualización de dsh cambia ese estilo, no aparece ninguna compleción. Cada pausa mientras escribes cuesta una llamada al modelo.
|
|
208
231
|
- **Mejorar prompt** solo ve un breve resumen del proyecto, las rutas modificadas y las rutas cuyos nombres coinciden con tus palabras: no el código en sí. Por eso puede pasar por alto el archivo correcto, y solo nombra rutas que recibió. Lee el texto nuevo antes de enviarlo. No se ejecuta con un comando de barra ni con un mensaje que tenga un chip de archivo o de símbolo (el texto nuevo es texto plano, así que perdería el chip), y un mensaje puede tener como máximo 8.000 caracteres. Las imágenes siguen adjuntas: solo cambia el texto. Cada clic cuesta una llamada al modelo; un modelo potente puede tardar un minuto (`Esc` lo cancela).
|
|
209
232
|
- **Comprobación del objetivo** solo comprueba una finalización que el agente hace en una ronda automática del objetivo: una finalización que pides en el chat, `/goal` y la barra del objetivo no se comprueban. El agente puede cambiar las pruebas o los archivos del comando de prueba por sí mismo; el verificador lee el chat y puede verlo, pero puede equivocarse en ambos sentidos (un «no terminado» erróneo cuesta una ronda más; un «terminado» erróneo cierra el objetivo). El verificador ve el chat y `git status`, no el código en sí. Una ejecución de prueba solo se reutiliza cuando el paso más reciente del agente que puede cambiar archivos fue su propia ejecución correcta de `bash` con exactamente el mismo comando en la misma carpeta; un comando con una tubería (`| tail`) o `&&` no se reutiliza. El presupuesto se mide cuando termina un turno, así que un turno puede superarlo. Solo cuentan las llamadas al modelo del propio chat (no las de sus subagentes). `update_goal` espera mientras se ejecuta la comprobación (la prueba como máximo 15 minutos, el verificador como máximo 3 minutos). Una bifurcación recibe un nuevo id de chat, así que empieza sin el comando de prueba ni los límites propios del chat original. Cada finalización que llega al verificador cuesta una llamada al modelo.
|
|
233
|
+
- **Prioridad al mensaje enviado tras Detener** solo actúa después de que detienes el chat (o tras un turno que falló, o al abrir un chat que aún tiene cola): un mensaje que envías mientras un turno se ejecuta sigue esperando al final de la cola. Solo pasa por delante de tus propios mensajes en cola: si en la cola espera una ronda de un objetivo o una respuesta a una pregunta, se mantiene el orden de dsh. Lee una parte de dsh que no es una API pública (si el turno detenido aún está terminando); si una actualización de dsh le cambia el nombre, el mensaje pasa delante solo cuando ese turno ha terminado. Los chats de subagentes mantienen el orden de dsh.
|
|
234
|
+
- **Memoria del proyecto** pertenece a la primera carpeta del chat (la carpeta de proyecto de dsh): un chat que cambia de carpeta con `cd` conserva la memoria de su primer proyecto, y la misma carpeta abierta por otra ruta a los mismos archivos la comparte. Un chat congela su sección de memoria al empezar, así que una nota guardada después aparece desde el chat siguiente (`memory_recall` la encuentra al momento). La revisión solo guarda lo que el modelo decide guardar: puede pasar por alto un dato o guardar uno erróneo; abre los archivos para comprobarlos y edítalos o bórralos a mano con dsh cerrado. Cada turno terminado con un mensaje tuyo cuesta una llamada al modelo; una llamada fallida vuelve a leer los mismos mensajes después del turno siguiente. Los chats de subagentes no se revisan. La idea y el formato de archivo vienen de [DS Bot](https://github.com/Fei2411/DS-Bot) (Apache-2.0); Composer Plus no usa su código y nunca lee ni escribe la memoria propia de DS Bot.
|
|
235
|
+
- **Copia de seguridad** usa una sola carpeta fija, `~/Desktop/dsh-backups` (la predeterminada de dsh-backup, para que sus archivos comprimidos sigan sirviendo); no hay ningún ajuste para otra carpeta. Un archivo comprimido ocupa más o menos lo mismo que el directorio home de dsh sin `cache/` ni `dsh-runtimes/` (medido: 1,6 GB de archivos dieron un archivo comprimido de 830 MB en unos 30 s en Apple Silicon; dsh siguió respondiendo). Un archivo que cambia mientras se lee se guarda tal como estaba cuando la copia de seguridad lo abrió, así que el registro de un chat abierto puede terminar en una entrada cortada, que dsh repara en su siguiente escritura. El ocultamiento encuentra un secreto en un archivo yml por el nombre de su clave en una línea (`token:`, `apiKey:`, …); un secreto en un mapa de flujo (`{token: x}`), en una lista bajo una de esas claves, en un archivo JSON (por ejemplo, la `apiKey` de un servidor MCP en un archivo `.json`) o con otro nombre se queda en el archivo comprimido. Los archivos comprimidos por tipo de dsh-backup (`dsh-t-…`) no aparecen en la lista. **Para otro equipo** copia el archivo comprimido (un clon en APFS: sin espacio adicional); el vault no va con él. **Hacer copia ahora** no elimina ninguna copia de seguridad. Una copia de seguridad automática conserva las copias más recientes que hizo Composer Plus (el ajuste **Conservar** de **Copia de seguridad automática**) y elimina sus copias más antiguas; las instantáneas anteriores a una actualización se cuentan aparte (se quedan las 2 más recientes). Los archivos comprimidos de dsh-backup nunca se eliminan: quítalos con **Eliminar**. Mientras dsh-backup siga instalado, cuenta los archivos comprimidos de Composer Plus en su propio número de copias que conserva y puede eliminarlos.
|
|
236
|
+
- **Restaurar** solo funciona en la consola de rescate, con dsh cerrado: sustituye todo el directorio home de dsh. El anterior se queda a su lado como `.dsh.pre-restore-<time>` hasta que lo elimines, así que el disco necesita espacio para los dos. Los chats conservan las rutas de sus proyectos: en otro equipo, un proyecto en otra ruta aparece como ausente hasta que vuelvas a añadirlo. Los enlaces simbólicos que apuntan fuera del directorio home de dsh (por ejemplo, skills enlazadas desde otra carpeta) vuelven como enlaces; sus destinos deben existir en ese equipo.
|
|
237
|
+
- **Comprobación de registros de sesión** lee el registro más reciente de cada chat con las propias reglas de dsh sobre lo que se abre: una línea que no es JSON o que está fuera de orden solo cuenta como daño cuando después viene un final de turno (si no, dsh abre el chat sin las líneas desde ese punto, así que no aparece en la lista). No comprueba los eventos de un registro con las reglas de eventos del propio dsh, así que un registro que considera sano puede no abrirse después de una actualización de dsh. Una reparación toma la copia de una copia de seguridad: los mensajes posteriores a esa copia de seguridad se pierden en ese chat (el archivo dañado se queda a su lado). Un chat abierto en este dsh no se repara en Configuración: dsh lo tiene retenido.
|
|
238
|
+
- **Copia de seguridad automática** solo se ejecuta mientras dsh está en marcha: una copia de seguridad que tocaba mientras dsh estaba cerrado se ejecuta unos 45 s después del siguiente inicio. La instantánea para una versión nueva se toma después de ese inicio, no antes de la actualización.
|
|
210
239
|
- Se ha pedido soporte integrado en el proyecto original: `move` para la cola en [#773](https://github.com/deepseek-ai/deepseek-harness/discussions/773) y un estado de Continuar en [#9269](https://github.com/deepseek-ai/deepseek-harness/discussions/9269).
|
|
211
240
|
|
|
212
241
|
## Preguntas frecuentes
|
|
@@ -235,9 +264,19 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
235
264
|
|
|
236
265
|
**¿Puede el agente dejar de dar por terminado su propio trabajo, como en los bucles de verificación de la loop engineering?** Sí, con **Comprobación del objetivo** (activada de forma predeterminada): empieza un objetivo con `/goal`. Cuando el agente dice que el objetivo está completado, se ejecutan las pruebas del proyecto y una llamada independiente al modelo comprueba el objetivo frente al chat; si alguna falla, el objetivo sigue abierto y el agente lee el motivo. Define tu propio comando de prueba, un límite de tiempo o un límite de tokens con **Editar** en la fila **Comprobación del objetivo** bajo el objetivo.
|
|
237
266
|
|
|
267
|
+
**¿Puede el agente recordar mis preferencias entre chats, como la memoria de DS Bot?** Sí, con **Memoria del proyecto** (desactivada de forma predeterminada): actívala en **Configuración → Composer Plus**. Después de cada turno, tus preferencias y decisiones duraderas se guardan como notas breves para el proyecto del chat, y cada chat nuevo de ese proyecto las lee. Pide al agente que recuerde algo y lo guarda al momento.
|
|
268
|
+
|
|
269
|
+
**¿Puede dsh hacer copias de seguridad de mis chats y ajustes, como dsh-backup?** Sí: **Configuración → Composer Plus → Copia de seguridad → Hacer copia ahora**. Escribe el mismo formato de archivo comprimido en la misma carpeta (`~/Desktop/dsh-backups`), así que los archivos comprimidos de dsh-backup también aparecen y se pueden restaurar, y puedes desinstalar dsh-backup. Activa **Copia de seguridad automática** para hacer copias según un horario.
|
|
270
|
+
|
|
271
|
+
**dsh ya no se inicia. ¿Cómo restauro una copia de seguridad?** Abre la carpeta de copias de seguridad (`~/Desktop/dsh-backups`) y haz doble clic en `Composer Plus Rescue.command` (Linux: `composer-plus-rescue.sh`, Windows: `Composer Plus Rescue.cmd`). Elige `3) Restore a backup`, selecciona una y escribe `RESTORE`. Funciona sin dsh.
|
|
272
|
+
|
|
273
|
+
**¿Cómo muevo dsh a un equipo nuevo?** En el antiguo: **Copia de seguridad** → **Para otro equipo** junto a una copia de seguridad. Copia esa carpeta al equipo nuevo, instala dsh allí, ciérralo, abre `Composer Plus Rescue` en la carpeta copiada y restaura. Vuelve a introducir tus claves de API (se quedan en el equipo antiguo).
|
|
274
|
+
|
|
275
|
+
**Un chat no se abre después de un cierre inesperado. ¿Puedo repararlo?** **Configuración → Composer Plus → Comprobación de registros de sesión → Comprobar registros de sesión**. Un chat dañado vuelve desde la copia de seguridad más reciente con **Reparar desde copias de seguridad** (se pierden los mensajes posteriores a esa copia de seguridad).
|
|
276
|
+
|
|
238
277
|
**¿Cómo reordeno los mensajes en cola en dsh?** Arrastra el asa ⠿ de un mensaje en cola, o pon el foco en ella y pulsa `↑` / `↓`.
|
|
239
278
|
|
|
240
|
-
**¿Cómo corrijo una errata en un mensaje en cola?** Haz doble clic en el mensaje en la cola, cambia el texto y pulsa `Enter` (`Esc` cancela). El mensaje mantiene su lugar en la cola.
|
|
279
|
+
**¿Cómo corrijo una errata en un mensaje en cola?** Haz doble clic en el mensaje en la cola, cambia el texto y pulsa `Enter` (`Esc` cancela). El mensaje mantiene su lugar en la cola. Ahí también puedes quitar sus imágenes y archivos, o añadir otros nuevos.
|
|
241
280
|
|
|
242
281
|
**¿Cómo quito a la vez todos los puntos de no leído de un proyecto?** Barra lateral → botón **…** del proyecto → **Marcar todo como leído**.
|
|
243
282
|
|
|
@@ -265,13 +304,17 @@ Probado en dsh `0.2.0-rc.2` (escritorio y web) y `0.2.1-rc.2` (web). La CI ejecu
|
|
|
265
304
|
|
|
266
305
|
**¿Cómo recibo notificaciones de macOS / Windows cuando una tarea de dsh termina o necesita aprobación?** Deja activada **Notificaciones en segundo plano** (lo está de forma predeterminada) y permite las notificaciones de DeepSeek Harness en los ajustes del sistema operativo.
|
|
267
306
|
|
|
307
|
+
**¿Puede dsh abrir por sí solo el chat que me hace una pregunta?** Sí, con **Abrir el chat en espera si estás inactivo** (activado por defecto): cuando un chat espera una respuesta, una aprobación o una revisión del plan y no usas dsh durante 30 segundos, dsh lo abre. Mientras escribes, te desplazas o mueves el ratón, espera.
|
|
308
|
+
|
|
268
309
|
**¿Cómo cambio la interfaz de DeepSeek Harness a turco, español, japonés…?** Configuración → Composer Plus → **Idioma de la aplicación**.
|
|
269
310
|
|
|
270
311
|
**¿Cómo uso dsh desde mi iPhone?** Compila la app Tether desde `tether/ios` (Xcode), activa **Configuración → Composer Plus → Conexión móvil (iPhone)**, haz clic en **Conexión móvil** abajo a la izquierda, escanea el código QR (con la Cámara del iPhone o con **Scan code** en Tether), toca **Connect** y haz clic en **Approve**. Fuera de casa, usa Tailscale en los dos dispositivos.
|
|
271
312
|
|
|
272
313
|
**¿Cómo hago que Nueva sesión se abra siempre en el mismo proyecto?** Configuración → Composer Plus → **Espacio de trabajo predeterminado para Nueva sesión** → **Abrir Nueva sesión en** → elige el proyecto. El `+` junto a otro proyecto sigue abriendo ese proyecto.
|
|
273
314
|
|
|
274
|
-
**¿Cómo trabajo en varias funciones de un proyecto a la vez, cada una en su propia rama?** Con **Una rama por chat**:
|
|
315
|
+
**¿Cómo trabajo en varias funciones de un proyecto a la vez, cada una en su propia rama?** Con **Una rama por chat**: en la pantalla de chat nuevo, el botón de rama muestra **Nueva rama** de forma predeterminada: envía el primer mensaje. Cada chat tiene su propia rama y su carpeta de worktree, con tu `.env` y tu `node_modules` cuando `.worktreeinclude` los lista. La cabecera del chat muestra en qué rama estás.
|
|
316
|
+
|
|
317
|
+
**¿Puede la barra lateral mostrar cada rama de un proyecto y mover mi chat cuando el agente crea una rama?** Sí, con **Ramas en el árbol de espacios de trabajo** (desactivado por defecto): actívalo en Configuración → Composer Plus y elige **Opciones de vista** → **Árbol de espacios de trabajo** de dsh. Cada rama con un worktree en `<project>/.worktrees/` aparece dentro de su proyecto. Cuando pides al agente de la carpeta del proyecto que cree una rama y trabaje allí, y la carpeta no tiene cambios sin confirmar, el chat se mueve solo a la rama. Si borras la carpeta de la rama, sale de la lista; sus chats pasan a **Sin agrupar**.
|
|
275
318
|
|
|
276
319
|
**¿Puedo enviar una foto desde mi iPhone?** Sí. En un chat de Tether, toca **+** junto al campo de mensaje → Camera, Photos (hasta 4) o Paste image. Las fotos llegan al chat del Mac como adjuntos de tu mensaje, así que el modelo las ve.
|
|
277
320
|
|
|
@@ -287,6 +330,7 @@ PLAYWRIGHT=/path/to/playwright node scripts/capture-screenshots.mjs /path/to/dsh
|
|
|
287
330
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-sidebar-projects.mjs /path/to/dsh/lib/bin.js
|
|
288
331
|
# recent filter + a finished chat older than 2 hours (fake model): the project stays until you open the chat
|
|
289
332
|
PLAYWRIGHT=/path/to/playwright node test/browser-recent-finished.mjs /path/to/dsh/lib/bin.js
|
|
333
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-recent-tree.mjs /path/to/dsh/lib/bin.js
|
|
290
334
|
# Order by status (fake model + Schedule): real-app test + its thumbnail
|
|
291
335
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-status-order.mjs /path/to/dsh/lib/bin.js
|
|
292
336
|
# every Settings feature row shows a loading screenshot and a ? link to its README row
|
|
@@ -297,10 +341,14 @@ PLAYWRIGHT=/path/to/playwright node test/browser-whats-new.mjs /path/to/dsh/lib/
|
|
|
297
341
|
PLAYWRIGHT=/path/to/playwright node test/browser-readme-anchors.mjs
|
|
298
342
|
# Keep composer focus (fake model + demo skill): typing goes on after a / command + its thumbnail
|
|
299
343
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-keep-focus.mjs /path/to/dsh/lib/bin.js
|
|
344
|
+
# Fit question card to window (fake model asks a long question at 1280 × 820): question, answers, Skip and Submit readable, height follows the window + its thumbnail
|
|
345
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-question-fit.mjs /path/to/dsh/lib/bin.js
|
|
300
346
|
# Mobile connect: switch on, QR popover, a fake iPhone pairs and calls dsh through the gateway, switch off + its thumbnail
|
|
301
347
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-mobile-connect.mjs /path/to/dsh/lib/bin.js
|
|
302
348
|
# Resume after restart (fake slow model, real quit and start): a running chat and a goal continue, a stopped chat does not
|
|
303
349
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-resume-restart.mjs /path/to/dsh/lib/bin.js
|
|
350
|
+
# Resume after restart with a queue (fake model, real quit and start): text, image, file, a drag and an edit come back in order
|
|
351
|
+
PLAYWRIGHT=/path/to/playwright node test/browser-resume-queue.mjs /path/to/dsh/lib/bin.js
|
|
304
352
|
# Feature ideas (fake model, made-up project): suggest, drag left, Undo, ✓ starts a new chat in plan mode, ▶ Build now one without, Plan all one for the Later list, a focus topic chip, Copy as checklist + its thumbnail
|
|
305
353
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-feature-ideas.mjs /path/to/dsh/lib/bin.js
|
|
306
354
|
# Export chat as Markdown (fake model, made-up project): right-click → Export as Markdown…, copy and save keep the code blocks, switch off + its thumbnail
|
|
@@ -315,8 +363,10 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-prompt-improve.mjs /path
|
|
|
315
363
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-goal-check.mjs /path/to/dsh/lib/bin.js
|
|
316
364
|
# Mark all as read, Copy message link, Edit queued message in place, Redo, Changes → This chat and Hide whitespace (fake model, made-up git projects) + their thumbnails
|
|
317
365
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-six-features.mjs /path/to/dsh/lib/bin.js
|
|
318
|
-
# Changes Tree (fake model, made-up git history): branch
|
|
366
|
+
# Changes Tree (fake model, made-up git history): the branch map (counts, colors, arrows), a branch's commits, commit files and diffs, Merged and Waiting files, back marks the box + its thumbnail
|
|
319
367
|
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-changes-tree.mjs /path/to/dsh/lib/bin.js
|
|
368
|
+
# Branches in the workspace tree (fake model, made-up git project): a worktree becomes a project, the agent's new branch moves the chat, a deleted folder leaves the tree + its thumbnail
|
|
369
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-branch-tree.mjs /path/to/dsh/lib/bin.js
|
|
320
370
|
# Allow for this chat with a time limit (fake model that is also the Auto Review reviewer): the grant ends after 1 hour
|
|
321
371
|
PLAYWRIGHT=/path/to/playwright node test/browser-grant-ttl.mjs /path/to/dsh/lib/bin.js
|
|
322
372
|
# Next message prediction and Complete while typing (fake models): calls, Tab, Esc, model choice + their thumbnails
|
|
@@ -327,6 +377,9 @@ SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-project-picker.mjs /path
|
|
|
327
377
|
# Queue drag-and-drop and Continue with a queued message (slow fake model)
|
|
328
378
|
PLAYWRIGHT=/path/to/playwright node test/browser-queue-drag.mjs /path/to/dsh/lib/bin.js
|
|
329
379
|
PLAYWRIGHT=/path/to/playwright node test/browser-continue-queue.mjs /path/to/dsh/lib/bin.js
|
|
380
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-stop-send.mjs /path/to/dsh/lib/bin.js
|
|
381
|
+
# Edit queued message in place with images and files (slow fake model) + its thumbnail
|
|
382
|
+
SHOT=1 PLAYWRIGHT=/path/to/playwright node test/browser-queue-edit.mjs /path/to/dsh/lib/bin.js
|
|
330
383
|
```
|
|
331
384
|
|
|
332
385
|
```sh
|